1- import logging
2-
31from bson import ObjectId
4- from flask import Blueprint
2+ from flask import Blueprint , request
3+ import logging
4+ from json import dumps
55
66from app .check_access import check_access
7+ from app .criteria import CRITERIONS
8+ from app .criteria .utils import create_criterion
79from app .criteria_pack import CriteriaPackFactory
810from app .lti_session_passback .auth_checkers import is_admin
9- from app .mongo_odm import TrainingsDBManager
10- from app .utils import check_argument_is_convertible_to_object_id
11+ from app .mongo_models import Criterion
12+ from app .mongo_odm import TrainingsDBManager , CriterionDBManager
13+ from app .root_logger import get_root_logger
14+ from app .utils import check_argument_is_convertible_to_object_id , remove_blank_and_none , try_load_json , check_dict_keys
15+
16+
17+ api_criteria = Blueprint ('api_criteria' , __name__ , url_prefix = "/api/criterion" )
18+ logger = get_root_logger ('web' )
19+
20+
21+ @api_criteria .route ('/create/' , methods = ['POST' ])
22+ def create_new_criterion ():
23+ if not is_admin ():
24+ return {}, 404
25+
26+ return update_criterion ('' )
27+
28+
29+ @api_criteria .route ('/<criterion_name>/' , methods = ['GET' ])
30+ def get_criterion (criterion_name ):
31+ if not check_access ():
32+ return {}, 404
33+ db_criterion = CriterionDBManager ().get_criterion_by_name (criterion_name )
34+ if db_criterion :
35+ return db_criterion .to_dict ()
36+ else :
37+ return {}, 200
38+
39+
40+ @api_criteria .route ('/<criterion_name>/' , methods = ['POST' ])
41+ def update_criterion (criterion_name ):
42+ if not is_admin ():
43+ return {}, 404
44+
45+ criterion_dict , msg = try_load_criterion_dict (
46+ request .form .get ('parameters' ))
47+ if msg :
48+ return {'message' : msg }, 200
49+
50+ base_criterion_name = request .form .get ('base_criterion' , '' )
51+ base_criterion = CRITERIONS .get (base_criterion_name )
52+ if not base_criterion :
53+ return {'message' : f"No such base critetion '{ base_criterion_name } '" }, 200
54+
55+ db_criterion = CriterionDBManager ().get_criterion_by_name (
56+ criterion_dict ['name' ])
57+ if not db_criterion :
58+ db_criterion = Criterion (name = criterion_dict ['name' ], parameters = {},
59+ base_criterion = base_criterion_name )
1160
12- api_criteria = Blueprint ('api_criteria' , __name__ )
13- logger = logging .getLogger ('root_logger' )
61+ instance , msg = check_criterion_dict (base_criterion , criterion_dict )
62+ if msg :
63+ return {'message' : msg }, 200
1464
65+ db_criterion .parameters = instance .dict .get ('parameters' )
66+ db_criterion .base_criterion = base_criterion_name
67+ db_criterion .save ()
68+ logger .info (f"Updated criterion { db_criterion .name } " )
69+ return {
70+ 'message' : 'OK' ,
71+ 'name' : db_criterion .name ,
72+ 'time' : int (db_criterion .last_update .timestamp ()* 1000 )
73+ }, 200
1574
16- @api_criteria .route ('/api/criteria/<training_id>/<criterion_name>/<parameter_name>/' , methods = ['GET' ])
75+
76+ @api_criteria .route ('/<criterion_name>/structure/' , methods = ['GET' ])
77+ def get_criteria_structure (criterion_name ):
78+ if not check_access ():
79+ return {}, 404
80+ criterion = CRITERIONS .get (criterion_name )
81+ if create_criterion :
82+ return criterion .structure ()
83+ else :
84+ return {}, 404
85+
86+ @api_criteria .route ('/list/' , methods = ['GET' ])
87+ def get_all_criterions ():
88+ if not is_admin ():
89+ return {}, 404
90+
91+ criterions = CriterionDBManager ().get_all_criterions ()
92+ return {
93+ 'criterions' : criterions ,
94+ 'message' : 'OK'
95+ }
96+
97+
98+ @api_criteria .route ('/structures' , methods = ['GET' ])
99+ def get_all_criterion_structures ():
100+ if not is_admin ():
101+ return {}, 404
102+
103+ return {name : dumps (criterion .structure (), indent = 3 ) for name , criterion in CRITERIONS .items ()}
104+
105+
106+ @api_criteria .route ('/<training_id>/<criterion_name>/<parameter_name>/' , methods = ['GET' ])
17107def get_criterion_parameter_value (training_id : str , criterion_name , parameter_name ) -> (dict , int ):
18108 """
19109 Endpoint to retrieve criterion parameter value.
@@ -39,3 +129,26 @@ def get_criterion_parameter_value(training_id: str, criterion_name, parameter_na
39129 if parameter_value is None :
40130 return {'message' : 'No parameter with name = {}.' .format (parameter_name )}, 404
41131 return {'parameterName' : parameter_name , 'parameterValue' : parameter_value , 'message' : 'OK' }, 200
132+
133+
134+ def check_criterion_dict (base_criterion , criterion_dict ):
135+ instance , msg = create_criterion (base_criterion , criterion_dict )
136+ # try to get criterion's description
137+ if not instance :
138+ return False , f"Error on creating instance of { base_criterion .__name__ } with params { criterion_dict ['parameters' ]} for new criterion '{ criterion_dict ['name' ]} '.<br>{ msg } "
139+ return instance , ''
140+
141+
142+ def try_load_criterion_dict (json_str ):
143+ criterion_dict , msg = try_load_json (json_str )
144+ if msg :
145+ return False , msg # error on parsing
146+
147+ criterion_dict = remove_blank_and_none (criterion_dict )
148+
149+ msg = check_dict_keys (
150+ criterion_dict , ('name' , 'parameters' ))
151+ if msg :
152+ return False , msg # error with dict keys
153+
154+ return criterion_dict , ''
0 commit comments