Incomplete webapp to aggregate achievements/badges from various sources
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

helloworld.py 5.5KB

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