Incomplete webapp to aggregate achievements/badges from various sources
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

helloworld.py 5.9KB

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