def getStudentProfileForm():
    studentID = ObjectId(request.json['student_id'])
    form_id = ObjectId(request.json['form_id'])

    form_data = FormsDOM.getFormData(ObjectId(form_id))

    blank_form_id = FormsDOM.getBlankFormId(form_id)
    blank_form_data = blankFormsDOM.getFormData(blank_form_id)

    parent_id = FormsDOM.getInfo(form_id, 'parent_id')
    parent_profile = parentsDOM.getParentProfile(parent_id)
    cleaned_parent_profile = {}
    cleaned_parent_profile['first_name'] = parent_profile['first_name']
    cleaned_parent_profile['last_name'] = parent_profile['last_name']
    cleaned_parent_profile['email'] = parent_profile['email']

    form_info = {}
    form_info['name'] = blankFormsDOM.getFormName(blank_form_id)
    form_info['last_updated'] = FormsDOM.getLastUpdated(form_id)
    form_info['completed'] = FormsDOM.isComplete(form_id)

    isAuthorizedBool = isAuthorized(get_token_auth_header(),
                                    ['developer', 'admin'])
    return {
        'form_data': form_data,
        'blank_form_data': blank_form_data,
        'basic_info': studentsDOM.getBasicInfo(studentID),
        'parent_profile': cleaned_parent_profile,
        'form_info': form_info,
        'isAuthorized': isAuthorizedBool,
    }
def getStudentForms():
    student_id = ObjectId(request.json['student_id'])
    curr_link = request.json['parent_key']
    try:
        parentId = parentsDOM.get(currLink=curr_link)
    except AssertionError as e:
        raise AuthError({'wrong link': True}, 401)

    if studentsDOM.isArchived(student_id):
        raise AuthError({'archived': True}, 401)

    if parentsDOM.isExpired(parent_id):
        emailParent(parent_id, '', 'Your updated link is below:')
        raise AuthError({'expired': True}, 426)

    form_ids = studentsDOM.getAllFormIds(student_id)
    form_data = []
    for id in form_ids:
        if parent_id == FormsDOM.getParentId(id):
            blank_form_data = FormsDOM.getBlankFormId(
                id)  # will assert if formid does not exist
            form_data.append({
                'form_id': str(id),
                'form_name': FormsDOM.getFormName(id),
                'last_updated': FormsDOM.getLastUpdated(id),
                'last_viewed': FormsDOM.getLastViewed(id),
                'completed': FormsDOM.isComplete(id)
            })
    return {
        'form_data': form_data,
        'student_info': studentsDOM.getBasicInfo(student_id),
    }
def getStudents():
    blankFormIds = list(
        map(lambda currForm: ObjectId(currForm['id']),
            request.json['blankForms']))
    noBlankFormFilter = len(
        blankFormIds) == 0  # hoping caching will reduce complexity

    students = studentsDOM.getStudents()
    studentsWithForms = []
    for student in students:
        if noBlankFormFilter:
            forms_completed = 0
            for form in student['form_ids']:
                if FormsDOM.isComplete(form):
                    forms_completed += 1
            student['forms_completed'] = str(forms_completed) + "/" + str(
                len(student['form_ids']))
            student['completion_rate'] = forms_completed / len(
                student['form_ids'])
            del student['form_ids']
            studentsWithForms.append(student)

        else:
            forms_completed = 0
            forms_available = 0
            for form in student['form_ids']:
                currFormBlankFormId = FormsDOM.getBlankFormId(form)
                if currFormBlankFormId in blankFormIds:
                    if (FormsDOM.isComplete(form)):
                        forms_completed += 1
                    forms_available += 1

            if forms_available > 0:
                student['forms_completed'] = str(forms_completed) + "/" + str(
                    forms_available)
                student['completion_rate'] = forms_completed / forms_available
                del student['form_ids']
                studentsWithForms.append(student)
    return {
        'students': studentsWithForms,
        'authorized': isAuthorized(get_token_auth_header(),
                                   ['developer', 'admin']),
        'forms': blankFormsDOM.getAll(),
    }
def getStudentProfile():
    studentID = ObjectId(request.json['id'])
    students_forms = studentsDOM.getForms(studentID)
    forms = []
    for formId in students_forms:
        curr_form_data_raw = FormsDOM.getForm(formId)
        formName = blankFormsDOM.getBlankFormName(
            curr_form_data_raw['blank_forms_id'])
        formYear = blankFormsDOM.getFormYear(
            curr_form_data_raw['blank_forms_id'])
        formTag = blankFormsDOM.getFormTag(
            curr_form_data_raw['blank_forms_id'])
        curr_form_data = dict()
        curr_form_data['form_name'] = str(formName)
        curr_form_data['form_year'] = str(formYear)
        curr_form_data['form_tag'] = str(formTag)
        curr_form_data['form_id'] = str(curr_form_data_raw['_id'])
        curr_form_data['blank_forms_id'] = str(
            curr_form_data_raw['blank_forms_id'])
        curr_form_data['last_updated'] = curr_form_data_raw['last_updated']
        curr_form_data['completed'] = FormsDOM.isComplete(formId)
        parent_data = parentsDOM.getParentProfile(
            ObjectId(curr_form_data_raw['parent_id']))
        curr_form_data['p_first_name'] = parent_data['first_name']
        curr_form_data['p_last_name'] = parent_data['last_name']
        curr_form_data['p_email'] = parent_data['email']
        forms.append(curr_form_data)

    parentIds = studentsDOM.getParents(studentID)
    parents = []
    for parentId in parentIds:
        parent = parentsDOM.getParentProfile(parentId)
        studentsOfParent = []
        for currStudentID in parent['student_ids']:
            student = studentsDOM.getFullInfo(currStudentID)
            forms_completed = 0
            for form in student['form_ids']:
                if FormsDOM.isComplete(form):
                    forms_completed += 1
            student['forms_completed'] = str(forms_completed) + "/" + str(
                len(student['form_ids']))
            student['completion_rate'] = forms_completed / len(
                student['form_ids'])
            cleanedStudent = {}
            cleanedStudent['id'] = str(student['_id'])
            cleanedStudent['first_name'] = student['first_name']
            cleanedStudent['middle_name'] = student['middle_name']
            cleanedStudent['last_name'] = student['last_name']
            cleanedStudent['DOB'] = student['DOB']
            cleanedStudent['grade'] = student['grade']
            cleanedStudent['archived'] = student['archived']
            cleanedStudent['forms_completed'] = student['forms_completed']
            cleanedStudent['completion_rate'] = student['completion_rate']
            studentsOfParent.append(cleanedStudent)
        cleanedParent = {}
        cleanedParent['id'] = str(parentId)
        cleanedParent['children'] = studentsOfParent
        cleanedParent['first_name'] = parent['first_name']
        cleanedParent['last_name'] = parent['last_name']
        cleanedParent['email'] = parent['email']
        parents.append(cleanedParent)
    return {
        'forms': forms,
        'basic_info': studentsDOM.getBasicInfo(studentID),
        'blank_forms': blankFormsDOM.getAll(),
        'parents': parents,
        'authorized': isAuthorized(get_token_auth_header(),
                                   ['developer', 'admin']),
        'tags': utilitiesDOM.getTags(),
        'years': utilitiesDOM.getYears(),
    }