Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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)}})
Esempio n. 5
0
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
Esempio n. 6
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)}})
Esempio n. 7
0
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
        }
    })
Esempio n. 8
0
    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 []
Esempio n. 9
0
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 {}
Esempio n. 10
0
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
Esempio n. 11
0
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
Esempio n. 12
0
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)
        }
    })
Esempio n. 13
0
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)
Esempio n. 14
0
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)
Esempio n. 15
0
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),
        }
    })