def collections_endpoint(): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ url = request.path.rstrip('/') resource = config.RESOURCES[url] response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def collections_endpoint(**lookup): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.2 Relying on request.endpoint to retrieve the resource being consumed. .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = _resource() response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource, lookup) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def schedules(): date_from = date(2018, 1, 1) date_to = date.today() + timedelta(weeks=6 * 4) total_days = (date_to - date_from).days + 1 # inclusive 5 days date_range = map(lambda v: (date_from + timedelta(days=v)), range(total_days)) app_config_ori = deepcopy(app.config) app.config['PAGINATION_DEFAULT'] = 999 app.config['DOMAIN']['classes'].update( {'embedded_fields': [ 'branch', 'tutor', 'module', ]}) classes, *_ = get('classes') classes = classes['_items'] user, *_ = getitem('users', **{'id': app.auth.get_request_auth_value()}) def exclude_dummies_non_tester(v): if 'tester' not in user['username']: return 'dummies' not in v['module']['name'] else: return True classes = filter(exclude_dummies_non_tester, classes) classes = list(classes) # classes.sort(key=lambda v: v['start_at_ts']) def date2str(date, time): return datetime.strptime('%sT%s' % (date, time), '%Y-%m-%dT%H:%M') calendars = [] for v in date_range: for v2 in classes: if v.weekday() == dow[v2['day']]: calendars.append({ 'id': v2['id'], 'title': '%s at %s by %s' % (v2['module']['name'].upper(), v2['branch']['name'].upper(), v2['tutor']['name'].upper()), 'allDay': False, 'start': date2str(v, v2['start_at']).strftime("%Y-%m-%d %H:%M:%S"), 'finish': date2str(v, v2['finish_at']).strftime("%Y-%m-%d %H:%M:%S") }) # classes = [] app.config = app_config_ori return jsonify({'_items': calendars, 'meta': {'total': len(calendars)}})
def filter_attendance_students(v, st): r = { '_created': '>=\'%s\'' % st['_created'].strftime('%Y-%m-%d'), 'student_id': v['student']['id'], 'attendance_id': st['attendance']['id'], } attendances_students, *_ = get('attendances_students', **r) attendances_students = attendances_students['_items'] return len(attendances_students) == 0
def students_dormant(): # app_config_ori = deepcopy(app.config) # app.config['PAGINATION_DEFAULT'] = 9999 students, *_ = get('users', **{'role': 'student', 'is_deleted': False}) students = students['_items'] students = filter(dormant_students, students) students = list(students) # app.config = app_config_ori return jsonify({'_items': students, '_meta': {'total': len(students)}})
def schedules(): app_config_ori = deepcopy(app.config) app.config['PAGINATION_DEFAULT'] = 999 app.config['DOMAIN']['classes'].update({'embedded_fields': [ 'branch', 'tutor', 'module', ]}) classes, *_ = get('classes') classes = classes['_items'] classes = map(_get_next_timestamp, classes) user, *_ = getitem('users', **{'id': app.auth.get_request_auth_value()}) def exclude_dummies_non_tester(v): if 'tester' in user['username']: return 'dummies' in v['module']['name'] else: return 'dummies' not in v['module']['name'] classes = filter(lambda v: ( v['finish_at_ts'] + timedelta(hours=2)) > wib_now, classes) classes = filter(lambda v: v['finish_at_ts'].date() < ( wib_now + timedelta(days=5)).date(), classes) classes = filter(exclude_dummies_non_tester, classes) classes = list(classes) classes.sort(key=lambda v: v['start_at_ts']) item_counter = 0 def parse(v): nonlocal item_counter item_counter = item_counter + 1 v.update({'last_attendances': last_attendance(v)}) return v classes = map(parse, classes) classes = filter(exclude_current_user_attendance, classes) classes = filter(exclude_other_user_attendance, classes) classes = groupClass(classes) # classes = [] app.config = app_config_ori return jsonify({ '_items': classes, 'meta': { 'total': len(classes), 'total_item': item_counter } })
def _eve_resources_by_name(cls, resource_name): """ Get Eve-layer for the given resource Taking advantage of all Eve logic (auth, pagination, ...) Args: resource_name (str): The Resource name Returns: list: Items for the given resource """ response, _, _, _, _ = get(resource_name) return response.get('_items') or []
def _user_info(user_id): users, _, _, status, _ = get('users', {'_id': user_id}) if len(users['_items']) > 0: user = users['_items'][0] user['avatar'] = pillar.api.users.avatar.url(user) public_fields = {'full_name', 'username', 'avatar'} for field in list(user.keys()): if field not in public_fields: del user[field] return user return {}
def for_node(node_id): activities, _, _, status, _ =\ get('activities', { '$or': [ {'object_type': 'node', 'object': node_id}, {'context_object_type': 'node', 'context_object': node_id}, ], },) for act in activities['_items']: act['actor_user'] = _user_info(act['actor_user']) return activities
def last_attendance(class_): app.config['DOMAIN']['attendances'].update({'embedded_fields': [ 'attendance_tutors', 'attendance_tutors.tutor', ]}) utc_this = class_['start_at_ts'].astimezone(timezone('UTC')) lookup = { '_created': '>=\'%s\'' % utc_this.strftime('%Y-%m-%d'), 'class_id': class_['id'] } attendances, *_ = get('attendances', **lookup) attendances = attendances['_items'] # attendances = attendances['_items'][0] if len(attendances['_items']) > 0 else [] return attendances
def students(): app_config_ori = deepcopy(app.config) app.config['PAGINATION_DEFAULT'] = 999 # app.config['DOMAIN']['attendances_students'].update({'embedded_fields': [ # 'student' # ]}) app.config['DOMAIN']['attendances_tutors'].update({ 'embedded_fields': [ 'attendance', 'attendance.class_', 'attendance.class_.students', 'attendance.class_.students.student', 'attendance.class_.module', 'attendance.class_.branch', ] }) r = { '_created': '>=\'%s\'' % (utc_now - timedelta(hours=12)).strftime('%Y-%m-%d %H:%M:%S'), 'tutor_id': app.auth.get_request_auth_value() } attendances, *_ = get('attendances_tutors', **r) attendances = attendances['_items'] attendances = map(map_attendances, attendances) attendances = list(attendances) attendances = filter( lambda v: len(v['attendance']['class_']['students']) > 0, attendances) attendances = list(attendances) # attendances = [] app.config = app_config_ori return jsonify({ '_items': attendances, '_meta': { 'total': len(attendances) } })
def collections_endpoint(**lookup): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.3 Pass lookup query down to delete_resource, so it can properly process sub-resources. .. versionchanged:: 0.2 Relying on request.endpoint to retrieve the resource being consumed. .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = _resource() response = None method = request.method if method in ("GET", "HEAD"): response = get(resource, lookup) elif method == "POST": response = post(resource) elif method == "DELETE": response = delete(resource, lookup) elif method == "OPTIONS": send_response(resource, response) else: abort(405) return send_response(resource, response)
def tutor_stats(): app_config_ori = deepcopy(app.config) date_from = date(2018, 3, 10) date_to = date.today() total_days = (date_to - date_from).days + 1 # inclusive 5 days date_range = map(lambda v: (date_from + timedelta(days=v)), range(total_days)) app.config['DOMAIN']['classes'].update({'embedded_fields': [ 'students', ]}) app.config['DOMAIN']['attendances_tutors'].update({ 'embedded_fields': [ 'attendance', 'attendance.class_', # 'students.student' ] }) classes, *_ = get('classes', **{'tutor_id': app.auth.get_request_auth_value()}) classes = classes['_items'] attendances_tutors, *_ = get( 'attendances_tutors', **{'tutor_id': app.auth.get_request_auth_value()}) attendances_tutors = attendances_tutors['_items'] attendances_students_feedback, *_ = get( 'attendances_students', **{ 'tutor_id': app.auth.get_request_auth_value(), 'feedback': "!=\"\"" }) attendances_students_feedback = attendances_students_feedback['_items'] attendances_students_rating, *_ = get( 'attendances_students', **{ 'tutor_id': app.auth.get_request_auth_value(), "rating_interaction": "!=0", "rating_cognition": "!=0", "rating_creativity": "!=0" }) attendances_students_rating = attendances_students_rating['_items'] classes_sum = 0 attendances_students_sum = 0 for v in date_range: for v2 in classes: if v.weekday() == dow[v2['day']]: classes_sum = classes_sum + 1 attendances_students_sum = attendances_students_sum + \ len(v2['students']) hours_sum = 0 for v in attendances_tutors: finish_time = datetime.strptime(v['attendance']['class_']['finish_at'], '%H:%M') start_time = datetime.strptime(v['attendance']['class_']['start_at'], '%H:%M') hours_interval = (finish_time - start_time).total_seconds() / 3600 hours_sum = hours_sum + hours_interval ratings_avg = 0 if attendances_students_sum: ratings_avg = (len(attendances_students_rating) / attendances_students_sum) * 100 reviews_avg = 0 if attendances_students_sum: reviews_avg = (len(attendances_students_feedback) / attendances_students_sum) * 100 attendances_avg = 0 if classes_sum: attendances_avg = (len(attendances_tutors) / classes_sum) * 100 app.config = app_config_ori return jsonify({ '_items': { 'classes_sum': len(attendances_tutors), 'hours_sum': round(hours_sum, 0), 'feedbacks_sum': len(attendances_students_feedback), 'ratings_avg': round(ratings_avg, 2), 'reviews_avg': round(reviews_avg, 2), 'attendances_avg': round(attendances_avg, 2), } })