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.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. def show_sources(self):
  44. self.response.out.write("</table>")
  45. self.response.out.write("""<h2>Add Account</h2>
  46. <form action="/addaccount" method="post">
  47. <label>Type: <select name="type">""")
  48. for source in AchievementSource.all():
  49. self.response.out.write('<option value="')
  50. self.response.out.write(source.key())
  51. self.response.out.write('">')
  52. self.response.out.write(cgi.escape(source.name))
  53. self.response.out.write('</option>')
  54. self.response.out.write("""</select></label>
  55. <label>Credentials: <input type="text" name="credentials"/></label>
  56. <input type="submit" value="Add"/>
  57. </form>""")
  58. class AddSourcePage(webapp.RequestHandler):
  59. def post(self):
  60. if not users.is_current_user_admin():
  61. self.error(403)
  62. return
  63. source = AchievementSource(name=self.request.get('name'),
  64. url=self.request.get('url'))
  65. source.put()
  66. self.redirect('/')
  67. class AddAccountPage(webapp.RequestHandler):
  68. def post(self):
  69. if not users.get_current_user():
  70. self.error(403)
  71. return
  72. source = db.get(db.Key(self.request.get('type')))
  73. account = UserAccount(user=users.get_current_user(),
  74. source=source,
  75. credentials=self.request.get('credentials'))
  76. account.put()
  77. self.redirect('/')
  78. class UpdatePage(webapp.RequestHandler):
  79. def post(self):
  80. account = db.get(db.Key(self.request.get('key')))
  81. res = []
  82. if account.source.name == 'Spore':
  83. res = scraper().scrape_spore(account.credentials)
  84. UpdatePage.merge_achievements(account, res)
  85. @staticmethod
  86. def merge_achievements(account, achievements):
  87. for awarded in achievements:
  88. achievement = UpdatePage.get_achievement(account.source, awarded)
  89. res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
  90. ac=achievement,
  91. user=account.user)
  92. if res.count(1) == 0:
  93. AwardedAchievement(achievement=achievement,
  94. user=account.user,
  95. awarded=awarded['date']).put()
  96. @staticmethod
  97. def get_achievement(source, achievement):
  98. res = Achievement.gql("WHERE name = :name AND source = :source",
  99. name=achievement['title'],
  100. source=source)
  101. if res.count(1) == 0:
  102. res = Achievement(name=achievement['title'],
  103. image=achievement['img'],
  104. description=achievement['desc'],
  105. source=source)
  106. res.put()
  107. else:
  108. res = res.get()
  109. return res
  110. application = webapp.WSGIApplication([('/', MainPage),
  111. ('/admin/addsource', AddSourcePage),
  112. ('/worker/update', UpdatePage),
  113. ('/addaccount', AddAccountPage)],
  114. debug=True)
  115. def main():
  116. run_wsgi_app(application)
  117. if __name__ == "__main__":
  118. main()