Commit a81c224118174dd8bd9d44e82e2a108c5f45b36c
1 parent
fda752eb
Exists in
master
and in
1 other branch
- fix regression with allow_all button
- simplified log messages
Showing
4 changed files
with
39 additions
and
25 deletions
Show diff stats
perguntations/__init__.py
| @@ -32,7 +32,7 @@ proof of submission and for review. | @@ -32,7 +32,7 @@ proof of submission and for review. | ||
| 32 | ''' | 32 | ''' |
| 33 | 33 | ||
| 34 | APP_NAME = 'perguntations' | 34 | APP_NAME = 'perguntations' |
| 35 | -APP_VERSION = '2020.05.dev4' | 35 | +APP_VERSION = '2020.05.dev5' |
| 36 | APP_DESCRIPTION = __doc__ | 36 | APP_DESCRIPTION = __doc__ |
| 37 | 37 | ||
| 38 | __author__ = 'Miguel Barão' | 38 | __author__ = 'Miguel Barão' |
perguntations/app.py
| @@ -85,7 +85,7 @@ class App(): | @@ -85,7 +85,7 @@ class App(): | ||
| 85 | # ------------------------------------------------------------------------ | 85 | # ------------------------------------------------------------------------ |
| 86 | def __init__(self, conf): | 86 | def __init__(self, conf): |
| 87 | self.online = dict() # {uid: {'student':{...}, 'test': {...}}, ...} | 87 | self.online = dict() # {uid: {'student':{...}, 'test': {...}}, ...} |
| 88 | - self.allowed = set([]) # '0' is hardcoded to allowed elsewhere | 88 | + self.allowed = set() # '0' is hardcoded to allowed elsewhere |
| 89 | 89 | ||
| 90 | logger.info('Loading test configuration "%s".', conf["testfile"]) | 90 | logger.info('Loading test configuration "%s".', conf["testfile"]) |
| 91 | try: | 91 | try: |
| @@ -138,7 +138,7 @@ class App(): | @@ -138,7 +138,7 @@ class App(): | ||
| 138 | async def login(self, uid, try_pw): | 138 | async def login(self, uid, try_pw): |
| 139 | '''login authentication''' | 139 | '''login authentication''' |
| 140 | if uid not in self.allowed and uid != '0': # not allowed | 140 | if uid not in self.allowed and uid != '0': # not allowed |
| 141 | - logger.warning('Student %s: not allowed to login.', uid) | 141 | + logger.warning('"%s" not allowed to login.', uid) |
| 142 | return False | 142 | return False |
| 143 | 143 | ||
| 144 | # get name+password from db | 144 | # get name+password from db |
| @@ -157,34 +157,34 @@ class App(): | @@ -157,34 +157,34 @@ class App(): | ||
| 157 | if pw_ok: # success | 157 | if pw_ok: # success |
| 158 | self.allowed.discard(uid) # remove from set of allowed students | 158 | self.allowed.discard(uid) # remove from set of allowed students |
| 159 | if uid in self.online: | 159 | if uid in self.online: |
| 160 | - logger.warning('Student %s: already logged in.', uid) | 160 | + logger.warning('"%s" already logged in.', uid) |
| 161 | else: # make student online | 161 | else: # make student online |
| 162 | self.online[uid] = {'student': {'name': name, 'number': uid}} | 162 | self.online[uid] = {'student': {'name': name, 'number': uid}} |
| 163 | - logger.info('Student %s: logged in.', uid) | 163 | + logger.info('"%s" logged in.', uid) |
| 164 | return True | 164 | return True |
| 165 | # wrong password | 165 | # wrong password |
| 166 | - logger.info('Student %s: wrong password.', uid) | 166 | + logger.info('"%s" wrong password.', uid) |
| 167 | return False | 167 | return False |
| 168 | 168 | ||
| 169 | # ------------------------------------------------------------------------ | 169 | # ------------------------------------------------------------------------ |
| 170 | def logout(self, uid): | 170 | def logout(self, uid): |
| 171 | '''student logout''' | 171 | '''student logout''' |
| 172 | self.online.pop(uid, None) # remove from dict if exists | 172 | self.online.pop(uid, None) # remove from dict if exists |
| 173 | - logger.info('Student %s: logged out.', uid) | 173 | + logger.info('"%s" logged out.', uid) |
| 174 | 174 | ||
| 175 | # ------------------------------------------------------------------------ | 175 | # ------------------------------------------------------------------------ |
| 176 | async def generate_test(self, uid): | 176 | async def generate_test(self, uid): |
| 177 | '''generate a test for a given student''' | 177 | '''generate a test for a given student''' |
| 178 | if uid in self.online: | 178 | if uid in self.online: |
| 179 | - logger.info('Student %s: generating new test.', uid) | 179 | + logger.info('"%s" generating new test.', uid) |
| 180 | student_id = self.online[uid]['student'] # {number, name} | 180 | student_id = self.online[uid]['student'] # {number, name} |
| 181 | test = await self.testfactory.generate(student_id) | 181 | test = await self.testfactory.generate(student_id) |
| 182 | self.online[uid]['test'] = test | 182 | self.online[uid]['test'] = test |
| 183 | - logger.info('Student %s: test is ready.', uid) | 183 | + logger.info('"%s" test is ready.', uid) |
| 184 | return self.online[uid]['test'] | 184 | return self.online[uid]['test'] |
| 185 | 185 | ||
| 186 | # this implies an error in the code. should never be here! | 186 | # this implies an error in the code. should never be here! |
| 187 | - logger.critical('Student %s: offline, cant generate test', uid) | 187 | + logger.critical('"%s" offline, cant generate test', uid) |
| 188 | 188 | ||
| 189 | # ------------------------------------------------------------------------ | 189 | # ------------------------------------------------------------------------ |
| 190 | async def correct_test(self, uid, ans): | 190 | async def correct_test(self, uid, ans): |
| @@ -198,10 +198,10 @@ class App(): | @@ -198,10 +198,10 @@ class App(): | ||
| 198 | 198 | ||
| 199 | # --- submit answers and correct test | 199 | # --- submit answers and correct test |
| 200 | test.update_answers(ans) | 200 | test.update_answers(ans) |
| 201 | - logger.info('Student %s: %d answers submitted.', uid, len(ans)) | 201 | + logger.info('"%s" submitted %d answers.', uid, len(ans)) |
| 202 | 202 | ||
| 203 | grade = await test.correct() | 203 | grade = await test.correct() |
| 204 | - logger.info('Student %s: grade = %g points.', uid, grade) | 204 | + logger.info('"%s" grade = %g points.', uid, grade) |
| 205 | 205 | ||
| 206 | # --- save test in JSON format | 206 | # --- save test in JSON format |
| 207 | fields = (uid, test['ref'], str(test['finish_time'])) | 207 | fields = (uid, test['ref'], str(test['finish_time'])) |
| @@ -210,7 +210,7 @@ class App(): | @@ -210,7 +210,7 @@ class App(): | ||
| 210 | with open(path.expanduser(fpath), 'w') as file: | 210 | with open(path.expanduser(fpath), 'w') as file: |
| 211 | # default=str required for datetime objects | 211 | # default=str required for datetime objects |
| 212 | json.dump(test, file, indent=2, default=str) | 212 | json.dump(test, file, indent=2, default=str) |
| 213 | - logger.info('Student %s: saved JSON.', uid) | 213 | + logger.info('"%s" saved JSON.', uid) |
| 214 | 214 | ||
| 215 | # --- insert test and questions into database | 215 | # --- insert test and questions into database |
| 216 | with self.db_session() as sess: | 216 | with self.db_session() as sess: |
| @@ -233,7 +233,7 @@ class App(): | @@ -233,7 +233,7 @@ class App(): | ||
| 233 | test_id=test['ref']) | 233 | test_id=test['ref']) |
| 234 | for q in test['questions'] if 'grade' in q]) | 234 | for q in test['questions'] if 'grade' in q]) |
| 235 | 235 | ||
| 236 | - logger.info('Student %s: database updated.', uid) | 236 | + logger.info('"%s" database updated.', uid) |
| 237 | return grade | 237 | return grade |
| 238 | 238 | ||
| 239 | # ------------------------------------------------------------------------ | 239 | # ------------------------------------------------------------------------ |
| @@ -261,18 +261,18 @@ class App(): | @@ -261,18 +261,18 @@ class App(): | ||
| 261 | state=test['state'], | 261 | state=test['state'], |
| 262 | comment='')) | 262 | comment='')) |
| 263 | 263 | ||
| 264 | - logger.info('Student %s: gave up.', uid) | 264 | + logger.info('"%s" gave up.', uid) |
| 265 | return test | 265 | return test |
| 266 | 266 | ||
| 267 | # ------------------------------------------------------------------------ | 267 | # ------------------------------------------------------------------------ |
| 268 | def event_test(self, uid, cmd, value): | 268 | def event_test(self, uid, cmd, value): |
| 269 | '''handles browser events the occur during the test''' | 269 | '''handles browser events the occur during the test''' |
| 270 | if cmd == 'focus': | 270 | if cmd == 'focus': |
| 271 | - logger.info('Student %s: focus %s', uid, value) | 271 | + logger.info('"%s": focus %s', uid, value) |
| 272 | elif cmd == 'size': | 272 | elif cmd == 'size': |
| 273 | scr_y, scr_x, win_y, win_x = value | 273 | scr_y, scr_x, win_y, win_x = value |
| 274 | area = win_x * win_y / (scr_x * scr_y) * 100 | 274 | area = win_x * win_y / (scr_x * scr_y) * 100 |
| 275 | - logger.info('Student %s: area=%g%%, window=%dx%d, screen=%dx%d', | 275 | + logger.info('"%s": area=%g%%, window=%dx%d, screen=%dx%d', |
| 276 | uid, area, win_x, win_y, scr_x, scr_y) | 276 | uid, area, win_x, win_y, scr_x, scr_y) |
| 277 | 277 | ||
| 278 | # ------------------------------------------------------------------------ | 278 | # ------------------------------------------------------------------------ |
| @@ -396,12 +396,22 @@ class App(): | @@ -396,12 +396,22 @@ class App(): | ||
| 396 | def allow_student(self, uid): | 396 | def allow_student(self, uid): |
| 397 | '''allow a single student to login''' | 397 | '''allow a single student to login''' |
| 398 | self.allowed.add(uid) | 398 | self.allowed.add(uid) |
| 399 | - logger.info('Student %s: allowed to login.', uid) | 399 | + logger.info('"%s" allowed to login.', uid) |
| 400 | 400 | ||
| 401 | def deny_student(self, uid): | 401 | def deny_student(self, uid): |
| 402 | '''deny a single student to login''' | 402 | '''deny a single student to login''' |
| 403 | self.allowed.discard(uid) | 403 | self.allowed.discard(uid) |
| 404 | - logger.info('Student %s: denied to login', uid) | 404 | + logger.info('"%s" denied to login', uid) |
| 405 | + | ||
| 406 | + def allow_all_students(self): | ||
| 407 | + '''allow all students to login''' | ||
| 408 | + logger.info('Allowing all students...') | ||
| 409 | + self.allowed = set(s[0] for s in self.get_all_students()) | ||
| 410 | + | ||
| 411 | + def deny_all_students(self): | ||
| 412 | + '''deny all students to login''' | ||
| 413 | + logger.info('Denying all students...') | ||
| 414 | + self.allowed = set() | ||
| 405 | 415 | ||
| 406 | async def update_student_password(self, uid, password=''): | 416 | async def update_student_password(self, uid, password=''): |
| 407 | '''change password on the database''' | 417 | '''change password on the database''' |
| @@ -410,7 +420,7 @@ class App(): | @@ -410,7 +420,7 @@ class App(): | ||
| 410 | with self.db_session() as sess: | 420 | with self.db_session() as sess: |
| 411 | student = sess.query(Student).filter_by(id=uid).one() | 421 | student = sess.query(Student).filter_by(id=uid).one() |
| 412 | student.password = password | 422 | student.password = password |
| 413 | - logger.info('Student %s: password updated.', uid) | 423 | + logger.info('"%s" password updated.', uid) |
| 414 | 424 | ||
| 415 | def insert_new_student(self, uid, name): | 425 | def insert_new_student(self, uid, name): |
| 416 | '''insert new student into the database''' | 426 | '''insert new student into the database''' |
| @@ -420,4 +430,4 @@ class App(): | @@ -420,4 +430,4 @@ class App(): | ||
| 420 | except exc.SQLAlchemyError: | 430 | except exc.SQLAlchemyError: |
| 421 | logger.error('Insert failed: student %s already exists?', uid) | 431 | logger.error('Insert failed: student %s already exists?', uid) |
| 422 | else: | 432 | else: |
| 423 | - logger.info('New student inserted: %s, %s', uid, name) | 433 | + logger.info('New student: "%s", "%s"', uid, name) |
perguntations/serve.py
| @@ -241,10 +241,12 @@ class AdminHandler(BaseHandler): | @@ -241,10 +241,12 @@ class AdminHandler(BaseHandler): | ||
| 241 | 241 | ||
| 242 | if cmd == 'allow': | 242 | if cmd == 'allow': |
| 243 | self.testapp.allow_student(value) | 243 | self.testapp.allow_student(value) |
| 244 | - | ||
| 245 | elif cmd == 'deny': | 244 | elif cmd == 'deny': |
| 246 | self.testapp.deny_student(value) | 245 | self.testapp.deny_student(value) |
| 247 | - | 246 | + elif cmd == 'allow_all': |
| 247 | + self.testapp.allow_all_students() | ||
| 248 | + elif cmd == 'deny_all': | ||
| 249 | + self.testapp.deny_all_students() | ||
| 248 | elif cmd == 'reset_password': | 250 | elif cmd == 'reset_password': |
| 249 | await self.testapp.update_student_password(uid=value, password='') | 251 | await self.testapp.update_student_password(uid=value, password='') |
| 250 | 252 |
perguntations/static/js/admin.js
| @@ -15,10 +15,12 @@ $(document).ready(function() { | @@ -15,10 +15,12 @@ $(document).ready(function() { | ||
| 15 | function button_handlers() { | 15 | function button_handlers() { |
| 16 | // button handlers (runs once) | 16 | // button handlers (runs once) |
| 17 | $("#allow_all").click(function() { | 17 | $("#allow_all").click(function() { |
| 18 | - $(":checkbox").prop("checked", true).trigger('change'); | 18 | + $.postJSON("/admin", {"cmd": "allow_all"}); |
| 19 | + // $(":checkbox").prop("checked", true).trigger('change'); | ||
| 19 | }); | 20 | }); |
| 20 | $("#deny_all").click(function() { | 21 | $("#deny_all").click(function() { |
| 21 | - $(":checkbox").prop("checked", false).trigger('change'); | 22 | + $.postJSON("/admin", {"cmd": "deny_all"}); |
| 23 | + // $(":checkbox").prop("checked", false).trigger('change'); | ||
| 22 | }); | 24 | }); |
| 23 | $("#reset_password").click(function () { | 25 | $("#reset_password").click(function () { |
| 24 | $.postJSON("/admin", { | 26 | $.postJSON("/admin", { |