diff --git a/README.md b/README.md index 53c810b..8e33388 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Class : ### Get Attendance Student: -`http --session=./session.json GET "http://127.0.0.1:5000/api/attendance/student?identifier=1&start_time=now&end_time=now"` +`http --session=./session.json GET "http://127.0.0.1:5000/api/attendance/student?identifier=2&start_time=now&end_time=now"` +`http --session=./session.json GET "http://127.0.0.1:5000/api/attendance/student?identifier=3&start_time=now&end_time=now"` Class: `http --session=./session.json GET "http://127.0.0.1:5000/api/attendance/class?identifier=1&start_time=now&end_time=now"` diff --git a/server.py b/server.py index a80c385..518864d 100644 --- a/server.py +++ b/server.py @@ -45,6 +45,10 @@ manager.create_api( preprocessors=verify_logged_id) +json_cont = {'Content-Type': 'application/json'} +resp = lambda val,code: (json.dumps({'status': val}), code, json_cont) +presense_map = {i:str(i).replace('Presence.', '').upper() for i in Presence} + @app.before_first_request def create_test_data(): try: @@ -53,8 +57,9 @@ def create_test_data(): for i in range(3): g_cls = Gradeclass("Class {}".format(i)) db.session.add(g_cls) + db.session.commit() for s in range(5): - stu = Student("TestStudent#{}-Class{}".format(s, i), g_cls.id) + stu = Student("TestStudent#{}-Class{}".format(s,g_cls.id), g_cls.id) db.session.add(stu) user_datastore.create_user( email='user@example.com', password='password') @@ -73,6 +78,27 @@ def parse_time(time_str): return time +def compute_attendance(request_type,object_id, start_time, end_time): + def get_record(req_type,obj_id): + attend = AttendanceUpdate.query.filter( + AttendanceUpdate.update_type == req_type + ).filter( + AttendanceUpdate.value_identifier == obj_id + ).filter( + func.date(AttendanceUpdate.time) >= start_time.date() + ).filter( + func.date(AttendanceUpdate.time) >= end_time.date() + ).first() + return attend + pres_rec = None + if request_type == 'student': + stud_rec = get_record('student',object_id) + stud = Student.query.get(object_id) + pres_rec = stud_rec if stud_rec else get_record('class',stud.gradeclass_id) + if request_type == 'class': + pres_rec = get_record(request_type,object_id) + return presense_map[pres_rec.presence].lower() if pres_rec else 'no_records' + def upsert_attendance(update_type, object_id, attend_time, pres_enum): existing = AttendanceUpdate.query.filter( AttendanceUpdate.update_type == update_type).filter( @@ -99,11 +125,6 @@ def validate_attend(update_type, object_id): return False -json_cont = {'Content-Type': 'application/json'} -resp = lambda val,code: (json.dumps({'status': val}), code, json_cont) -presense_keys = [str(i).replace('Presence.', '').upper() for i in Presence] - - def get_attendance(update_type, request): object_id = request.args.get('identifier', None) start_timestr = request.args.get('start_time', None) @@ -111,7 +132,8 @@ def get_attendance(update_type, request): start_time, end_time = parse_time(start_timestr), parse_time(end_timestr) ret_data = resp('invalid',400) if validate_attend(update_type, object_id) and start_time and end_time: - ret_data = resp('present',200) + pres = compute_attendance(update_type,object_id,start_time,end_time) + ret_data = resp(pres,200) return ret_data @@ -123,7 +145,7 @@ def update_attendance(update_type, request): ret_data = resp('invalid',400) if validate_attend( update_type, object_id - ) and presence and attend_time and presence.upper() in presense_keys: + ) and presence and attend_time and presence.upper() in presense_map.values(): pres_enum = Presence[presence.upper()] upsert_attendance(update_type, object_id, attend_time, pres_enum) ret_data = resp('updated',200)