|
@@ -5,16 +5,12 @@ from google.appengine.api import users
|
5
|
5
|
from google.appengine.ext.webapp.util import run_wsgi_app
|
6
|
6
|
from google.appengine.ext import db
|
7
|
7
|
|
8
|
|
-class User(db.Model):
|
9
|
|
- user = db.UserProperty()
|
10
|
|
- joindate = db.DateTimeProperty(auto_now_add=True)
|
11
|
|
-
|
12
|
8
|
class AchievementSource(db.Model):
|
13
|
9
|
name = db.StringProperty()
|
14
|
10
|
url = db.LinkProperty()
|
15
|
11
|
|
16
|
12
|
class UserAccount(db.Model):
|
17
|
|
- user = db.ReferenceProperty(reference_class=User)
|
|
13
|
+ user = db.UserProperty()
|
18
|
14
|
source = db.ReferenceProperty(reference_class=AchievementSource)
|
19
|
15
|
credentials = db.StringProperty()
|
20
|
16
|
added = db.DateTimeProperty(auto_now_add=True)
|
|
@@ -28,7 +24,7 @@ class Achievement(db.Model):
|
28
|
24
|
|
29
|
25
|
class AwardedAchievement(db.Model):
|
30
|
26
|
achievement = db.ReferenceProperty(reference_class=Achievement)
|
31
|
|
- user = db.ReferenceProperty(reference_class=User)
|
|
27
|
+ user = db.UserProperty()
|
32
|
28
|
awarded = db.DateTimeProperty()
|
33
|
29
|
discovered = db.DateTimeProperty(auto_now_add=True)
|
34
|
30
|
|
|
@@ -45,6 +41,8 @@ class MainPage(webapp.RequestHandler):
|
45
|
41
|
if users.is_current_user_admin():
|
46
|
42
|
self.show_admin_form()
|
47
|
43
|
|
|
44
|
+ self.show_sources()
|
|
45
|
+
|
48
|
46
|
self.show_footer()
|
49
|
47
|
|
50
|
48
|
def show_header(self):
|
|
@@ -62,7 +60,7 @@ class MainPage(webapp.RequestHandler):
|
62
|
60
|
|
63
|
61
|
def show_admin_form(self):
|
64
|
62
|
self.response.out.write("""
|
65
|
|
- <h1>Sources</h1>
|
|
63
|
+ <h1>Admin - Sources</h1>
|
66
|
64
|
<h2>Add</h2>
|
67
|
65
|
<form action="/admin/addsource" method="post">
|
68
|
66
|
<label>Name: <input type="text" name="name"/></label>
|
|
@@ -75,11 +73,42 @@ class MainPage(webapp.RequestHandler):
|
75
|
73
|
""")
|
76
|
74
|
|
77
|
75
|
for source in AchievementSource.all():
|
78
|
|
- self.response.out.write("<tr><td>");
|
|
76
|
+ self.response.out.write("<tr><td>")
|
79
|
77
|
self.response.out.write(cgi.escape(source.name))
|
80
|
|
- self.response.out.write("</td><td>");
|
|
78
|
+ self.response.out.write("</td><td>")
|
81
|
79
|
self.response.out.write(cgi.escape(source.url))
|
82
|
|
- self.response.out.write("</td></tr>");
|
|
80
|
+ self.response.out.write("</td></tr>")
|
|
81
|
+
|
|
82
|
+ self.response.out.write("</table>")
|
|
83
|
+
|
|
84
|
+ def show_sources(self):
|
|
85
|
+ self.response.out.write("<h1>My Accounts</h1>")
|
|
86
|
+ self.response.out.write("<table>")
|
|
87
|
+ self.response.out.write("<tr><th>Source</th><th>Credentials</th></tr>")
|
|
88
|
+
|
|
89
|
+ for account in UserAccount.gql("WHERE user = :user", user=users.get_current_user()):
|
|
90
|
+ self.response.out.write("<tr><td>")
|
|
91
|
+ self.response.out.write(cgi.escape(account.source.name))
|
|
92
|
+ self.response.out.write("</td><td>")
|
|
93
|
+ self.response.out.write(cgi.escape(account.credentials))
|
|
94
|
+ self.response.out.write("</td></tr>")
|
|
95
|
+
|
|
96
|
+ self.response.out.write("</table>")
|
|
97
|
+ self.response.out.write("""<h2>Add Account</h2>
|
|
98
|
+ <form action="/addaccount" method="post">
|
|
99
|
+ <label>Type: <select name="type">""")
|
|
100
|
+
|
|
101
|
+ for source in AchievementSource.all():
|
|
102
|
+ self.response.out.write('<option value="')
|
|
103
|
+ self.response.out.write(source.key())
|
|
104
|
+ self.response.out.write('">')
|
|
105
|
+ self.response.out.write(cgi.escape(source.name))
|
|
106
|
+ self.response.out.write('</option>')
|
|
107
|
+
|
|
108
|
+ self.response.out.write("""</select></label>
|
|
109
|
+ <label>Credentials: <input type="text" name="credentials"/></label>
|
|
110
|
+ <input type="submit" value="Add"/>
|
|
111
|
+ </form>""")
|
83
|
112
|
|
84
|
113
|
class AddSourcePage(webapp.RequestHandler):
|
85
|
114
|
def post(self):
|
|
@@ -94,16 +123,31 @@ class AddSourcePage(webapp.RequestHandler):
|
94
|
123
|
|
95
|
124
|
self.redirect('/')
|
96
|
125
|
|
|
126
|
+class AddAccountPage(webapp.RequestHandler):
|
|
127
|
+ def post(self):
|
|
128
|
+
|
|
129
|
+ if not users.get_current_user():
|
|
130
|
+ self.error(403)
|
|
131
|
+ return
|
|
132
|
+
|
|
133
|
+ source = db.get(db.Key(self.request.get('type')))
|
|
134
|
+
|
|
135
|
+ account = UserAccount(user=users.get_current_user(),
|
|
136
|
+ source=source,
|
|
137
|
+ credentials=self.request.get('credentials'))
|
|
138
|
+ account.put()
|
|
139
|
+
|
|
140
|
+ self.redirect('/')
|
|
141
|
+
|
97
|
142
|
|
98
|
|
-class Guestbook(webapp.RequestHandler):
|
|
143
|
+class UpdatePage(webapp.RequestHandler):
|
99
|
144
|
def post(self):
|
100
|
|
- self.response.out.write('<html><body>You wrote:<pre>')
|
101
|
|
- self.response.out.write(cgi.escape(self.request.get('content')))
|
102
|
|
- self.response.out.write('</pre></body></html>')
|
|
145
|
+ account = db.get(db.Key(self.request.get('key')))
|
103
|
146
|
|
104
|
147
|
application = webapp.WSGIApplication([('/', MainPage),
|
105
|
|
- ('/sign', Guestbook),
|
106
|
|
- ('/admin/addsource', AddSourcePage)],
|
|
148
|
+ ('/admin/addsource', AddSourcePage),
|
|
149
|
+ ('/worker/update', UpdatePage),
|
|
150
|
+ ('/addaccount', AddAccountPage)],
|
107
|
151
|
debug=True)
|
108
|
152
|
|
109
|
153
|
def main():
|