Incomplete webapp to aggregate achievements/badges from various sources
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

helloworld.py 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. class AddSourcePage(webapp.RequestHandler):
  44. def post(self):
  45. if not users.is_current_user_admin():
  46. self.error(403)
  47. return
  48. source = AchievementSource(name=self.request.get('name'),
  49. url=self.request.get('url'))
  50. source.put()
  51. self.redirect('/')
  52. class AddAccountPage(webapp.RequestHandler):
  53. def post(self):
  54. if not users.get_current_user():
  55. self.error(403)
  56. return
  57. source = db.get(db.Key(self.request.get('type')))
  58. account = UserAccount(user=users.get_current_user(),
  59. source=source,
  60. credentials=self.request.get('credentials'))
  61. account.put()
  62. self.redirect('/')
  63. class UpdatePage(webapp.RequestHandler):
  64. def post(self):
  65. account = db.get(db.Key(self.request.get('key')))
  66. res = []
  67. if account.source.name == 'Spore':
  68. res = Scraper.scrape_spore(account.credentials)
  69. UpdatePage.merge_achievements(account, res)
  70. @staticmethod
  71. def merge_achievements(account, achievements):
  72. for awarded in achievements:
  73. achievement = UpdatePage.get_achievement(account.source, awarded)
  74. res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
  75. ac=achievement,
  76. user=account.user)
  77. if res.count(1) == 0:
  78. AwardedAchievement(achievement=achievement,
  79. user=account.user,
  80. awarded=awarded['date']).put()
  81. @staticmethod
  82. def get_achievement(source, achievement):
  83. res = Achievement.gql("WHERE name = :name AND source = :source",
  84. name=achievement['title'],
  85. source=source)
  86. if res.count(1) == 0:
  87. res = Achievement(name=achievement['title'],
  88. image=achievement['img'],
  89. description=achievement['desc'],
  90. source=source)
  91. res.put()
  92. else:
  93. res = res.get()
  94. return res
  95. application = webapp.WSGIApplication([('/', MainPage),
  96. ('/admin/addsource', AddSourcePage),
  97. ('/worker/update', UpdatePage),
  98. ('/addaccount', AddAccountPage)],
  99. debug=True)
  100. def main():
  101. run_wsgi_app(application)
  102. if __name__ == "__main__":
  103. main()