Incomplete webapp to aggregate achievements/badges from various sources
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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