Commit 61aa3d29f03f94d58b91df20714a50651ca6dd7a
1 parent
585e31fa
Exists in
master
and in
1 other branch
- changed handling of files to fix possible errors on downloads.
- fixed some errors when ./serve is run with wrong yaml files.
Showing
3 changed files
with
21 additions
and
20 deletions
Show diff stats
app.py
| ... | ... | @@ -51,17 +51,13 @@ class App(object): |
| 51 | 51 | |
| 52 | 52 | # ------------------------------------------------------------------------ |
| 53 | 53 | def __init__(self, conf={}): |
| 54 | - logger.info('Starting application') | |
| 54 | + logger.info('Starting application.') | |
| 55 | 55 | self.online = dict() # {uid: {'student':{...}, 'test': {...}}, ...} |
| 56 | 56 | self.allowed = set([]) # '0' is hardcoded to allowed elsewhere |
| 57 | 57 | |
| 58 | - # build test configuration dictionary | |
| 59 | - testconf = {} | |
| 60 | - if conf['filename']: | |
| 61 | - logger.info(f'Loading test configuration "{conf["filename"]}".') | |
| 62 | - testconf.update(load_yaml(conf['filename'])) | |
| 63 | - | |
| 64 | - testconf.update(conf) # configuration overrides | |
| 58 | + logger.info(f'Loading test configuration "{conf["filename"]}".') | |
| 59 | + testconf = load_yaml(conf['filename'], default={}) | |
| 60 | + testconf.update(conf) # configuration overrides from command line | |
| 65 | 61 | |
| 66 | 62 | # start test factory |
| 67 | 63 | try: | ... | ... |
serve.py
| ... | ... | @@ -17,7 +17,7 @@ import json |
| 17 | 17 | import tornado.ioloop |
| 18 | 18 | import tornado.web |
| 19 | 19 | import tornado.httpserver |
| 20 | -from tornado import template, gen | |
| 20 | +from tornado import template, gen, websocket | |
| 21 | 21 | import yaml |
| 22 | 22 | |
| 23 | 23 | # this project |
| ... | ... | @@ -48,6 +48,7 @@ class WebApplication(tornado.web.Application): |
| 48 | 48 | (r'/review', ReviewHandler), |
| 49 | 49 | (r'/admin', AdminHandler), |
| 50 | 50 | (r'/file', FileHandler), |
| 51 | + # (r'/ws', SocketHandler), | |
| 51 | 52 | (r'/', RootHandler), # TODO multiple tests |
| 52 | 53 | ] |
| 53 | 54 | |
| ... | ... | @@ -138,6 +139,7 @@ class FileHandler(BaseHandler): |
| 138 | 139 | uid = self.current_user |
| 139 | 140 | ref = self.get_query_argument('ref', None) |
| 140 | 141 | image = self.get_query_argument('image', None) |
| 142 | + content_type, encoding = mimetypes.guess_type(image) | |
| 141 | 143 | |
| 142 | 144 | if uid != '0': |
| 143 | 145 | t = self.testapp.get_student_test(uid) |
| ... | ... | @@ -149,6 +151,7 @@ class FileHandler(BaseHandler): |
| 149 | 151 | raise tornado.web.HTTPError(404) # Not Found |
| 150 | 152 | |
| 151 | 153 | for q in t['questions']: |
| 154 | + # search for the question that contains the image | |
| 152 | 155 | if q['ref'] == ref: |
| 153 | 156 | filepath = path.join(q['path'], 'public', image) |
| 154 | 157 | |
| ... | ... | @@ -159,11 +162,11 @@ class FileHandler(BaseHandler): |
| 159 | 162 | except PermissionError: |
| 160 | 163 | logging.error(f'No permission: {filepath}') |
| 161 | 164 | else: |
| 162 | - content_type = mimetypes.guess_type(image) | |
| 163 | - self.set_header("Content-Type", content_type[0]) | |
| 164 | - with f: | |
| 165 | - self.write(f.read()) | |
| 166 | - await self.flush() | |
| 165 | + data = f.read() | |
| 166 | + f.close() | |
| 167 | + self.set_header("Content-Type", content_type) | |
| 168 | + self.write(data) | |
| 169 | + await self.flush() | |
| 167 | 170 | |
| 168 | 171 | |
| 169 | 172 | |
| ... | ... | @@ -416,6 +419,8 @@ def main(): |
| 416 | 419 | except: |
| 417 | 420 | print('An error ocurred while setting up the logging system.') |
| 418 | 421 | sys.exit(1) |
| 422 | + | |
| 423 | + # start logging | |
| 419 | 424 | logging.info('===============================================') |
| 420 | 425 | |
| 421 | 426 | # --- start application | ... | ... |
test.py
| ... | ... | @@ -44,21 +44,21 @@ class TestFactory(dict): |
| 44 | 44 | self.question_factory.load_files(files=self['files'], questions_dir=self['questions_dir']) |
| 45 | 45 | |
| 46 | 46 | # check if all questions exist ('ref' keys are correct?) |
| 47 | - errors_found = False | |
| 47 | + errors_found = [] | |
| 48 | 48 | for q in self['questions']: |
| 49 | 49 | for r in q['ref']: |
| 50 | - logger.info(f'Checking question "{r}".') | |
| 50 | + logger.info(f' Checking "{r}".') | |
| 51 | 51 | try: |
| 52 | 52 | self.question_factory.generate(r) |
| 53 | 53 | except: |
| 54 | 54 | logger.critical(f'Can\'t generate question "{r}".') |
| 55 | - errors_found = True | |
| 55 | + errors_found.append(r) | |
| 56 | 56 | |
| 57 | 57 | if errors_found: |
| 58 | - logger.critical('Errors found while generating questions.') | |
| 58 | + logger.critical(f'{errors_found} errors found generating questions.') | |
| 59 | 59 | raise TestFactoryException() |
| 60 | - | |
| 61 | - logger.info(f'Test factory ready for "{self["ref"]}".') | |
| 60 | + else: | |
| 61 | + logger.info(f'No errors found. Test factory ready for "{self["ref"]}".') | |
| 62 | 62 | |
| 63 | 63 | |
| 64 | 64 | # ----------------------------------------------------------------------- | ... | ... |