Incomplete webapp to aggregate achievements/badges from various sources
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

helloworld.py 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. created_by = db.SelfReferenceProperty(default=None)
  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().filter('created_by = ', None),
  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. if account.source.name == 'Spore':
  67. UpdatePage.merge_achievements(account, Scraper.scrape_spore(account.credentials))
  68. elif account.source.name == 'Steam':
  69. UpdatePage.merge_sources(account, Scraper.scrape_steam(account.credentials))
  70. self.redirect('/')
  71. @staticmethod
  72. def merge_sources(account, sources):
  73. for user_source in sources:
  74. UpdatePage.get_or_create_source(user_source, account)
  75. @staticmethod
  76. def merge_achievements(account, achievements):
  77. for awarded in achievements:
  78. achievement = UpdatePage.get_achievement(account.source, awarded)
  79. res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
  80. ac=achievement,
  81. user=account.user)
  82. if res.count(1) == 0:
  83. AwardedAchievement(achievement=achievement,
  84. user=account.user,
  85. awarded=awarded['date']).put()
  86. @staticmethod
  87. def get_achievement(source, achievement):
  88. res = Achievement.gql("WHERE name = :name AND source = :source",
  89. name=achievement['title'],
  90. source=source)
  91. if res.count(1) == 0:
  92. res = Achievement(name=achievement['title'],
  93. image=achievement['img'],
  94. description=achievement['desc'],
  95. source=source)
  96. res.put()
  97. else:
  98. res = res.get()
  99. return res
  100. @staticmethod
  101. def get_or_create_source(source_info, account):
  102. source = AchievementSource.gql("WHERE name = :name", name=source_info['name'])
  103. if source.count(1) == 0:
  104. source = AchievementSource(name = source_info['name'],
  105. url = source_info['url'],
  106. created_by = account.source)
  107. source.put()
  108. else:
  109. source = source.get()
  110. res = UserAccount.gql("WHERE source = :source AND user = :user AND "
  111. + "credentials = :creds", source = source,
  112. user = account.user,
  113. creds = account.credentials)
  114. if res.count(1) == 0:
  115. res = UserAccount(user = account.user,
  116. source = source,
  117. credentials = account.credentials)
  118. res.put()
  119. else:
  120. res = res.get()
  121. return res
  122. application = webapp.WSGIApplication([('/', MainPage),
  123. ('/admin/addsource', AddSourcePage),
  124. ('/worker/update', UpdatePage),
  125. ('/addaccount', AddAccountPage)],
  126. debug=True)
  127. def main():
  128. run_wsgi_app(application)
  129. if __name__ == "__main__":
  130. main()