-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdleval.py
More file actions
90 lines (76 loc) · 3.23 KB
/
Copy pathdleval.py
File metadata and controls
90 lines (76 loc) · 3.23 KB
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
# Patch robobrowser use of werkzeug package
import werkzeug
werkzeug.cached_property = werkzeug.utils.cached_property
import logging
import sys
import traceback
import yaml
from argparse import ArgumentParser
from time import time, sleep
from moodle.client import Client
from eval.evaluator import Evaluator
DEFAULT_CONFIG_PATH = 'config.yml'
DEFAULT_INTERVAL = 120
DEFAULT_MOODLE_DATA_PATH = './moodle/data'
DEFAULT_TIMEOUT = 2
DEFAULT_MAX_RETRIES = 2
DEFAULT_EVAL_DATA_PATH = './eval/data'
LOG_LEVELS = {'critical' : logging.CRITICAL,
'error' : logging.ERROR,
'warning' : logging.WARNING,
'info' : logging.INFO,
'debug' : logging.DEBUG}
class DlEval:
def __init__(self, config_path, log_level='info'):
"""
:param str config_path: path to config file
"""
self.__logger = logging.getLogger()
self.__logger.setLevel(LOG_LEVELS[log_level])
ch = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s]: %(message)s ' \
'(%(module)s:%(funcName)s:%(lineno)d)')
ch.setFormatter(formatter)
self.__logger.addHandler(ch)
with open(config_path, 'r') as ymlfile:
self.__cfg = yaml.load(ymlfile, Loader=yaml.FullLoader)
self.__client = Client(
self.__cfg['moodle'].get('data_path', DEFAULT_MOODLE_DATA_PATH),
self.__logger,
self.__cfg['moodle'].get('timeout', DEFAULT_TIMEOUT),
self.__cfg['moodle'].get('max_retries', DEFAULT_MAX_RETRIES))
eval_data_path = DEFAULT_EVAL_DATA_PATH
if 'eval' in self.__cfg and 'data_path' in self.__cfg['eval']:
eval_data_path = self.__cfg['eval']['data_path']
self.__evaluator = Evaluator(eval_data_path, self.__logger)
def run(self):
while True:
try:
ok = self.__client.login(
self.__cfg['moodle']['username'],
self.__cfg['moodle']['password'])
if not ok:
self.__logger.critical('login failed')
else:
allowed_assignments = \
self.__evaluator.get_allowed_assignments()
course_data = self.__client.download_new_course_data(
self.__cfg['moodle']['course_id'],
allowed_assignments)
self.__evaluator.evaluate(course_data)
self.__client.send_feedback(course_data)
except:
tback = ''.join(traceback.format_exception(*sys.exc_info()))
self.__logger.critical('an exception occured!\n' + tback)
sleep(self.__cfg.get('interval', DEFAULT_INTERVAL))
if __name__ == "__main__":
parser = ArgumentParser()
parser.add_argument('--config', default=DEFAULT_CONFIG_PATH,
help='path to config (default=`config.yml\'')
parser.add_argument('--log-level', default='info',
help='`critical\', `error\', `warning\', `info\', `debug\' ' \
'(default=`info\')')
args = parser.parse_args()
dleval = DlEval(args.config, args.log_level)
dleval.run()