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 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. 'accounts': UserAccount.gql("WHERE user = :user", user=user),
  37. 'achievements': AwardedAchievement.gql("WHERE user = :user", user=user)
  38. }
  39. path = os.path.join(os.path.dirname(__file__), 'index.html')
  40. self.response.out.write(template.render(path, template_values))
  41. def show_admin_form(self):
  42. self.response.out.write("""
  43. <h1>Admin - Sources</h1>
  44. <h2>Add</h2>
  45. <form action="/admin/addsource" method="post">
  46. <label>Name: <input type="text" name="name"/></label>
  47. <label>URL: <input type="text" name="url"/></label>
  48. <input type="submit" value="Add"/>
  49. </form>
  50. <h2>View</h2>
  51. <table>
  52. <tr><th>Source</th><th>URL</th></tr>
  53. """)
  54. for source in AchievementSource.all():
  55. self.response.out.write("<tr><td>")
  56. self.response.out.write(cgi.escape(source.name))
  57. self.response.out.write("</td><td>")
  58. self.response.out.write(cgi.escape(source.url))
  59. self.response.out.write("</td></tr>")
  60. self.response.out.write("</table>")
  61. def show_sources(self):
  62. self.response.out.write("</table>")
  63. self.response.out.write("""<h2>Add Account</h2>
  64. <form action="/addaccount" method="post">
  65. <label>Type: <select name="type">""")
  66. for source in AchievementSource.all():
  67. self.response.out.write('<option value="')
  68. self.response.out.write(source.key())
  69. self.response.out.write('">')
  70. self.response.out.write(cgi.escape(source.name))
  71. self.response.out.write('</option>')
  72. self.response.out.write("""</select></label>
  73. <label>Credentials: <input type="text" name="credentials"/></label>
  74. <input type="submit" value="Add"/>
  75. </form>""")
  76. def show_achievements(self):
  77. self.response.out.write("<h1>My Achievements</h1>")
  78. for achievement in AwardedAchievement.gql("WHERE user = :user", user=users.get_current_user()):
  79. self.show_achievement(achievement)
  80. def show_achievement(self, achievement):
  81. self.response.out.write("""
  82. <div class="achievement">
  83. <img src="%s" alt="%s"/>
  84. </div>
  85. """ % (cgi.escape(achievement.achievement.image),
  86. cgi.escape(achievement.achievement.name)))
  87. class AddSourcePage(webapp.RequestHandler):
  88. def post(self):
  89. if not users.is_current_user_admin():
  90. self.error(403)
  91. return
  92. source = AchievementSource(name=self.request.get('name'),
  93. url=self.request.get('url'))
  94. source.put()
  95. self.redirect('/')
  96. class AddAccountPage(webapp.RequestHandler):
  97. def post(self):
  98. if not users.get_current_user():
  99. self.error(403)
  100. return
  101. source = db.get(db.Key(self.request.get('type')))
  102. account = UserAccount(user=users.get_current_user(),
  103. source=source,
  104. credentials=self.request.get('credentials'))
  105. account.put()
  106. self.redirect('/')
  107. class UpdatePage(webapp.RequestHandler):
  108. def post(self):
  109. account = db.get(db.Key(self.request.get('key')))
  110. res = []
  111. if account.source.name == 'Spore':
  112. res = scraper().scrape_spore(account.credentials)
  113. UpdatePage.merge_achievements(account, res)
  114. @staticmethod
  115. def merge_achievements(account, achievements):
  116. for awarded in achievements:
  117. achievement = UpdatePage.get_achievement(account.source, awarded)
  118. res = AwardedAchievement.gql("WHERE achievement = :ac AND user = :user",
  119. ac=achievement,
  120. user=account.user)
  121. if res.count(1) == 0:
  122. AwardedAchievement(achievement=achievement,
  123. user=account.user,
  124. awarded=awarded['date']).put()
  125. @staticmethod
  126. def get_achievement(source, achievement):
  127. res = Achievement.gql("WHERE name = :name AND source = :source",
  128. name=achievement['title'],
  129. source=source)
  130. if res.count(1) == 0:
  131. res = Achievement(name=achievement['title'],
  132. image=achievement['img'],
  133. description=achievement['desc'],
  134. source=source)
  135. res.put()
  136. else:
  137. res = res.get()
  138. return res
  139. application = webapp.WSGIApplication([('/', MainPage),
  140. ('/admin/addsource', AddSourcePage),
  141. ('/worker/update', UpdatePage),
  142. ('/addaccount', AddAccountPage)],
  143. debug=True)
  144. def main():
  145. run_wsgi_app(application)
  146. if __name__ == "__main__":
  147. main()