Incomplete webapp to aggregate achievements/badges from various sources
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

helloworld.py 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import cgi
  2. from Scraper import Scraper
  3. import os
  4. from google.appengine.ext.webapp import template
  5. from google.appengine.ext import webapp
  6. from google.appengine.api import users
  7. from google.appengine.ext.webapp.util import run_wsgi_app
  8. from google.appengine.ext import db
  9. class AchievementSource(db.Model):
  10. name = db.StringProperty()
  11. url = db.LinkProperty()
  12. class UserAccount(db.Model):
  13. user = db.UserProperty()
  14. source = db.ReferenceProperty(reference_class=AchievementSource)
  15. credentials = db.StringProperty()
  16. added = db.DateTimeProperty(auto_now_add=True)
  17. updated = db.DateTimeProperty()
  18. class Achievement(db.Model):
  19. name = db.StringProperty()
  20. image = db.LinkProperty()
  21. description = db.StringProperty()
  22. source = db.ReferenceProperty(reference_class=AchievementSource)
  23. class AwardedAchievement(db.Model):
  24. achievement = db.ReferenceProperty(reference_class=Achievement)
  25. user = db.UserProperty()
  26. awarded = db.DateTimeProperty()
  27. discovered = db.DateTimeProperty(auto_now_add=True)
  28. class MainPage(webapp.RequestHandler):
  29. def get(self):
  30. user = users.get_current_user()
  31. if not user:
  32. self.redirect(users.create_login_url(self.request.uri))
  33. return
  34. template_values = {
  35. 'is_admin': users.is_current_user_admin(),
  36. 'sources': AchievementSource.all(),
  37. 'accounts': UserAccount.gql("WHERE user = :user", user=user),
  38. 'achievements': AwardedAchievement.all().filter('user = ', user)
  39. .order('-awarded')
  40. }
  41. path = os.path.join(os.path.dirname(__file__), 'index.html')
  42. self.response.out.write(template.render(path, template_values))
  43. def show_sources(self):
  44. self.response.out.write("</table>")
  45. self.response.out.write("""<h2>Add Account</h2>
  46. <form action="/addaccount" method="post">
  47. <label>Type: <select name="type">""")
  48. for source in AchievementSource.all():
  49. self.response.out.write('<option value="')
  50. self.response.out.write(source.key())
  51. self.response.out.write('">')
  52. self.response.out.write(cgi.escape(source.name))
  53. self.response.out.write('</option>')
  54. self.response.out.write("""</select></label>
  55. <label>Credentials: <input type="text" name="credentials"/></label>
  56. <input type="submit" value="Add"/>
  57. </form>""")
  58. class AddSourcePage(webapp.RequestHandler):
  59. def post(self):
  60. if not users.is_current_user_admin():
  61. self.error(403)
  62. return
  63. source = AchievementSource(name=self.request.get('name'),
  64. url=self.request.get('url'))
  65. source.put()
  66. self.redirect('/')
  67. class AddAccountPage(webapp.RequestHandler):
  68. def post(self):
  69. if not users.get_current_user():
  70. self.error(403)
  71. return
  72. source = db.get(db.Key(self.request.get('type')))
  73. account = UserAccount(user=users.get_current_user(),
  74. source=source,
  75. credentials=self.request.get('credentials'))
  76. account.put()
  77. self.redirect('/')
  78. class UpdatePage(webapp.RequestHandler):
  79. def post(self):
  80. account = db.get(db.Key(self.request.get('key')))
  81. res = []
  82. if account.source.name == 'Spore':
  83. res = Scraper.scrape_spore(account.credentials)
  84. UpdatePage.merge_achievements(account, res)
  85. @staticmethod
  86. def merge_achievements(account, achievements):
  87. for awarded in achievements:
  88. achievement = UpdatePage.get_achievement(account.source, awarded)
  89. res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
  90. ac=achievement,
  91. user=account.user)
  92. if res.count(1) == 0:
  93. AwardedAchievement(achievement=achievement,
  94. user=account.user,
  95. awarded=awarded['date']).put()
  96. @staticmethod
  97. def get_achievement(source, achievement):
  98. res = Achievement.gql("WHERE name = :name AND source = :source",
  99. name=achievement['title'],
  100. source=source)
  101. if res.count(1) == 0:
  102. res = Achievement(name=achievement['title'],
  103. image=achievement['img'],
  104. description=achievement['desc'],
  105. source=source)
  106. res.put()
  107. else:
  108. res = res.get()
  109. return res
  110. application = webapp.WSGIApplication([('/', MainPage),
  111. ('/admin/addsource', AddSourcePage),
  112. ('/worker/update', UpdatePage),
  113. ('/addaccount', AddAccountPage)],
  114. debug=True)
  115. def main():
  116. run_wsgi_app(application)
  117. if __name__ == "__main__":
  118. main()