/
admin.py
197 lines (128 loc) · 5.44 KB
/
admin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/usr/bin/env python
#
# See LICENSE file
#
__author__ = 'pystart-gae'
"""
This file contains admin routines
"""
import logging
logging.getLogger().setLevel(logging.DEBUG)
# import humanize
# from slack_bot import botMsg
from base_handler import BaseRequestHandler
from google.appengine.api import users
from webapp2_extras.appengine.users import admin_required
# from google.appengine.datastore.datastore_query import Cursor
from utils import decode
from models import AppData
# from dateutil import parser
import datetime
def run_tests():
# TODO - put some test code here.
return True # but for now assume success
class AdminLandingHandler(BaseRequestHandler):
""" Admin Landing Page """
@admin_required
def get(self):
""" /admin """
self.log_access()
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Landing Page', 'results': 'Seats and Tray Tables Up'})
class AdminHandler(BaseRequestHandler):
""" manage the app
these all require admin privs (google appengine admin)
TODO: put commands in a list to make for easier validation
"""
@admin_required
def get(self, command):
self.log_access()
# now that the decorator provided the belt, pull on the suspenders:
if not users.is_current_user_admin():
logging.error('aborting in admin because someone got here without admin privs')
return self.abort(403)
if command == 'a':
""" do a
"""
self.session.add_flash('testing msg - error', level='error')
self.session.add_flash('this is A really - info', level='info')
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Page A', 'results': 'A results'})
elif command == 'b':
""" do b
"""
data = {}
data.update({})
self.session.add_flash('this is B really', level='info')
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Page B', 'results': 'B results'})
elif command == 'test':
# generic admin page for testing etc...
# TODO - change name of page to admin_test for God's sake
self.session.add_flash('Not Implemented', level='warning')
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Testing', 'results': 'Testing Not Implemented'})
else:
# Unknown admin command?
self.session.add_flash('Unknown command %s' % command, level='error')
logging.error('Unknown admin command %s' % command)
self.redirect('/admin')
# ========================================================================================================================
def post(self, command):
logging.debug('admin POST command %s' % command)
self.log_access()
if not users.is_current_user_admin():
logging.error('aborting in admin because someone got to post without admin privs')
return self.abort(403)
elif command == 'showappdata':
FETCH_NUM = 100
app_data = None
app_data = AppData.query().fetch(FETCH_NUM)
return self.render_to_response(
'templates/appdata.html',
{
'app_data': app_data
})
elif command == 'purgeappdata':
""" purge app logs
TODO document/make setting of 30 day default purge period
"""
before_date = datetime.datetime.utcnow() - datetime.timedelta(days=30)
logging.info('Admin Purging App Data before %s' % before_date)
try:
AppData.purge(before=before_date)
except Exception as e:
self.session.add_flash('%s' % e, level='error')
return self.redirect('/admin')
elif command == 'purge_some_app_data':
""" purge some app data
"""
HOW_MANY = 100
count = decode(self.request.get('count'))
if count:
count = int(count)
else:
count = HOW_MANY
logging.info('Admin Purging Some App Data - count: %d' % count)
try:
AppData.purge_some(count=count)
except Exception as e:
self.session.add_flash('%s' % e, level='error')
return self.redirect('/admin')
elif command == 'runtests':
logging.info('Admin Run Tests')
self.session.add_flash('Running Tests', level='info')
try:
result = run_tests()
except Exception as e:
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Testing', 'results': '%s' % e})
return self.render_to_response(
'templates/admin_results.html', {'what_result': 'Testing', 'results': result})
else:
self.session.add_flash('Unknown Admin command %s' % command, level='error')
return self.redirect('/admin')
# We should not get here.
logging.error('We should not get here, falling thru bottom of admin post handler')
self.session.add_flash('Wut? Fell thru Admin...?', level='error')
return self.redirect('/admin')