예제 #1
0
def display_member_management():
    log = logger.new(request=request)
    log.info('Display Member Management')

    username = request.headers.get('x-webauth-user')
    account = ldap_get_member(username)

    if not ldap_is_eval_director(account) and not ldap_is_financial_director(
            account):
        return "must be eval director", 403

    member_list = get_members_info()
    onfloor_list = get_onfloor_members()

    co_op_list = [(ldap_get_member(member.uid).displayName, member.semester, member.uid) \
        for member in CurrentCoops.query.filter(
            CurrentCoops.date_created > start_of_year(),
            CurrentCoops.semester != "Neither")]

    freshmen = FreshmanAccount.query
    freshmen_list = []

    for freshman_user in freshmen:  # pylint: disable=not-an-iterable
        freshmen_list.append({
            "id":
            freshman_user.id,
            "name":
            freshman_user.name,
            "onfloor":
            freshman_user.onfloor_status,
            "room":
            "" if freshman_user.room_number is None else
            freshman_user.room_number,
            "eval_date":
            freshman_user.eval_date
        })

    settings = EvalSettings.query.first()
    if settings:
        lockdown = settings.site_lockdown
        intro_form = settings.intro_form_active
        accept_dues_until = settings.accept_dues_until
    else:
        lockdown = False
        intro_form = False
        accept_dues_until = datetime.now()

    return render_template(request,
                           "member_management.html",
                           username=username,
                           active=member_list,
                           num_current=len(member_list),
                           num_active=len(ldap_get_active_members()),
                           num_fresh=len(freshmen_list),
                           num_onfloor=len(onfloor_list),
                           freshmen=freshmen_list,
                           co_op=co_op_list,
                           site_lockdown=lockdown,
                           accept_dues_until=accept_dues_until,
                           intro_form=intro_form)
예제 #2
0
def get_non_alumni_non_coop(internal=False):
    log = logger.new(user_name=request.headers.get("x-webauth-user"),
                     request_id=str(uuid.uuid4()))
    log.info('api', action='retrieve house meeting attendance list')

    # Only Members Who Have Paid Dues Are Required to
    # go to house meetings
    non_alumni_members = ldap_get_active_members()
    coop_members = [u.username for u in CurrentCoops.query.all()]

    named_members = [{
        'display': f.name,
        'value': f.id,
        'freshman': True
    } for f in FreshmanAccount.query.filter(
        FreshmanAccount.eval_date > datetime.now())]

    for m in non_alumni_members:
        uid = m['uid'][0].decode('utf-8')

        if uid in coop_members:
            continue
        name = "{name} ({uid})".format(name=get_name(m), uid=uid)

        named_members.append({
            'display': name,
            'value': uid,
            'freshman': False
        })

    if internal:
        return named_members
    else:
        return jsonify({'members': named_members}), 200
예제 #3
0
def export_active_list():
    sio = io.StringIO()
    csvw = csv.writer(sio)

    active_list = [["Full Name", "RIT Username", "Amount to Charge"]]
    for member in ldap_get_active_members():
        full_name = member.cn
        # XXX[ljm] this should be renamed in LDAP/IPA schema to be ritUid
        rit_username = member.ritDn
        will_coop = CurrentCoops.query.filter(
            CurrentCoops.date_created > start_of_year(),
            CurrentCoops.uid == member.uid).first()
        dues_per_semester = app.config['DUES_PER_SEMESTER']
        if will_coop:
            dues = dues_per_semester
        else:
            dues = 2 * dues_per_semester
        active_list.append([full_name, rit_username, dues])

    csvw.writerows(active_list)
    output = make_response(sio.getvalue())
    output.headers[
        "Content-Disposition"] = "attachment; filename=csh_active_list.csv"
    output.headers["Content-type"] = "text/csv"
    return output
예제 #4
0
def get_voting_members():

    if datetime.today() < datetime(start_of_year().year, 12, 31):
        semester = 'Fall'
    else:
        semester = 'Spring'

    active_members = set(member.uid for member in ldap_get_active_members())
    intro_members = set(member.uid for member in ldap_get_intro_members())
    on_coop = set(member.uid for member in CurrentCoops.query.filter(
        CurrentCoops.date_created > start_of_year(),
        CurrentCoops.semester == semester).all())

    voting_list = list(active_members - intro_members - on_coop)

    passed_fall = FreshmanEvalData.query.filter(
        FreshmanEvalData.freshman_eval_result == "Passed",
        FreshmanEvalData.eval_date > start_of_year()
    ).distinct()

    for intro_member in passed_fall:
        if intro_member.uid not in voting_list:
            voting_list.append(intro_member.uid)

    return voting_list
예제 #5
0
def display_member_management():
    log = logger.new(user_name=request.headers.get("x-webauth-user"),
                     request_id=str(uuid.uuid4()))
    log.info('frontend', action='display member management')

    user_name = request.headers.get('x-webauth-user')

    if not ldap_is_eval_director(user_name) and not ldap_is_financial_director(
            user_name):
        return "must be eval director", 403

    members = [m['uid'] for m in ldap_get_current_students()]
    member_list, onfloor_number = get_members_info(members)

    freshmen = FreshmanAccount.query
    freshmen_list = []

    for freshman_user in freshmen:
        freshmen_list.append({
            "id":
            freshman_user.id,
            "name":
            freshman_user.name,
            "onfloor":
            freshman_user.onfloor_status,
            "room":
            "" if freshman_user.room_number is None else
            freshman_user.room_number,
            "eval_date":
            freshman_user.eval_date
        })

    settings = EvalSettings.query.first()
    if settings:
        lockdown = settings.site_lockdown
        intro_form = settings.intro_form_active
    else:
        lockdown = False
        intro_form = False

    return render_template(request,
                           "member_management.html",
                           username=user_name,
                           active=member_list,
                           num_current=len(member_list),
                           num_active=len(ldap_get_active_members()),
                           num_fresh=len(freshmen_list),
                           num_onfloor=onfloor_number,
                           freshmen=freshmen_list,
                           site_lockdown=lockdown,
                           intro_form=intro_form)
예제 #6
0
def display_member_management(user_dict=None):
    log = logger.new(request=request, auth_dict=user_dict)
    log.info('Display Member Management')

    if not ldap_is_eval_director(
            user_dict['account']) and not ldap_is_financial_director(
                user_dict['account']):
        return "must be eval director", 403

    member_list = get_members_info()
    onfloor_list = get_onfloor_members()

    freshmen = FreshmanAccount.query
    freshmen_list = []

    for freshman_user in freshmen:  # pylint: disable=not-an-iterable
        freshmen_list.append({
            "id":
            freshman_user.id,
            "name":
            freshman_user.name,
            "onfloor":
            freshman_user.onfloor_status,
            "room":
            "" if freshman_user.room_number is None else
            freshman_user.room_number,
            "eval_date":
            freshman_user.eval_date
        })

    settings = EvalSettings.query.first()
    if settings:
        lockdown = settings.site_lockdown
        intro_form = settings.intro_form_active
        accept_dues_until = settings.accept_dues_until
    else:
        lockdown = False
        intro_form = False
        accept_dues_until = datetime.now()

    return render_template("member_management.html",
                           username=user_dict['username'],
                           active=member_list,
                           num_current=len(member_list),
                           num_active=len(ldap_get_active_members()),
                           num_fresh=len(freshmen_list),
                           num_onfloor=len(onfloor_list),
                           freshmen=freshmen_list,
                           site_lockdown=lockdown,
                           accept_dues_until=accept_dues_until,
                           intro_form=intro_form)
예제 #7
0
def clear_active_members(user_dict=None):
    log = logger.new(request=request, auth_dict=user_dict)

    if not ldap_is_eval_director(user_dict['account']):
        return "must be eval director", 403
    # Get the active group.
    members = ldap_get_active_members()

    # Clear the active group.
    for account in members:
        if account.uid != user_dict['username']:
            log.info('Remove {} from Active Status'.format(account.uid))
            ldap_set_inactive(account)
    return jsonify({"success": True}), 200
예제 #8
0
def clear_active_members():
    log = logger.new(request=request)

    username = request.headers.get('x-webauth-user')
    account = ldap_get_member(username)

    if not ldap_is_eval_director(account):
        return "must be eval director", 403
    # Get the active group.
    members = ldap_get_active_members()

    # Clear the active group.
    for account in members:
        if account.uid != username:
            log.info('Remove {} from Active Status'.format(account.uid))
            ldap_set_inactive(account)
    return jsonify({"success": True}), 200
예제 #9
0
def get_voting_members():
    voting_list = []
    active_members = [x['uid'][0].decode('utf-8') for x
                      in ldap_get_active_members()]
    intro_members = [x['uid'][0].decode('utf-8') for x
                     in ldap_get_intro_members()]
    passed_fall = FreshmanEvalData.query.filter(
        FreshmanEvalData.freshman_eval_result == "Passed"
    ).distinct()

    for intro_member in passed_fall:
        voting_list.append(intro_member.uid)

    for active_member in active_members:
        if active_member not in intro_members:
            voting_list.append(active_member)

    return voting_list
예제 #10
0
def get_non_alumni_non_coop(internal=False, user_dict=None):
    log = logger.new(request=request, auth_dict=user_dict)
    log.info('Retrieve House Meeting Attendance List')

    # Get all active members as a base house meeting attendance.
    active_members = ldap_get_active_members()

    if datetime.today() < datetime(start_of_year().year, 12, 31):
        semester = 'Fall'
    else:
        semester = 'Spring'

    coop_members = [
        u.uid for u in CurrentCoops.query.filter(
            CurrentCoops.date_created > start_of_year(), CurrentCoops.semester
            == semester).all()
    ]

    eligible_members = [{
        'display': f.name,
        'value': f.id,
        'freshman': True
    } for f in FreshmanAccount.query.filter(
        FreshmanAccount.eval_date > datetime.now())]

    for account in active_members:
        if account.uid in coop_members:
            # Members who are on co-op don't need to go to house meeting.
            continue

        eligible_members.append({
            'display': account.displayName,
            'value': account.uid,
            'freshman': False
        })

    if internal:
        return eligible_members

    return jsonify({'members': eligible_members}), 200
예제 #11
0
def display_spring_evals(internal=False):
    log = logger.new(user_name=request.headers.get("x-webauth-user"),
                     request_id=str(uuid.uuid4()))
    log.info('frontend', action='display membership evaluations listing')

    def get_cm_count(member_id):
        return len([a for a in MemberCommitteeAttendance.query.filter(
            MemberCommitteeAttendance.uid == member_id)])

    user_name = None
    if not internal:
        user_name = request.headers.get('x-webauth-user')

    members = [m['uid'] for m in ldap_get_active_members()]

    sp_members = []
    for member_uid in members:
        uid = member_uid[0].decode('utf-8')
        print(uid)
        spring_entry = SpringEval.query.filter(
            SpringEval.uid == uid and
            SpringEval.active).first()

        if spring_entry is None:
            spring_entry = SpringEval(uid)
            db.session.add(spring_entry)
            db.session.flush()
            db.session.commit()
            # something bad happened to get here
            print("User did not have existing spring eval data")
        elif spring_entry.status != "Pending":
            continue

        eval_data = None

        h_meetings = [m.meeting_id for m in
                      MemberHouseMeetingAttendance.query.filter(
                          MemberHouseMeetingAttendance.uid == uid
                      ).filter(
                          MemberHouseMeetingAttendance.attendance_status == "Absent"
                      )]
        member = {
            'name': ldap_get_name(uid),
            'uid': uid,
            'status': spring_entry.status,
            'committee_meetings': get_cm_count(uid),
            'house_meetings_missed':
                [
                    {
                        "date": m.date.strftime("%Y-%m-%d"),
                        "reason":
                            MemberHouseMeetingAttendance.query.filter(
                                MemberHouseMeetingAttendance.uid == uid).filter(
                                MemberHouseMeetingAttendance.meeting_id == m.id).first().excuse
                    }
                    for m in HouseMeeting.query.filter(
                    HouseMeeting.id.in_(h_meetings)
                )
                    ],
            'major_projects': [
                {
                    'name': p.name,
                    'status': p.status,
                    'description': p.description
                } for p in MajorProject.query.filter(
                    MajorProject.uid == uid)]
        }
        member['major_projects_len'] = len(member['major_projects'])
        member['major_project_passed'] = False
        for mp in member['major_projects']:
            if mp['status'] == "Passed":
                member['major_project_passed'] = True
                break

        if internal:
            member['housing_evals'] = eval_data
        sp_members.append(member)

    sp_members.sort(key=lambda x: x['committee_meetings'], reverse=True)
    sp_members.sort(key=lambda x: len(x['house_meetings_missed']))
    sp_members.sort(key=lambda x: len([p for p in x['major_projects'] if p['status'] == "Passed"]), reverse=True)
    # return names in 'first last (username)' format
    if internal:
        return sp_members
    else:
        return render_template(request,
                               'spring_evals.html',
                               username=user_name,
                               members=sp_members)
예제 #12
0
def migrate_models():
    print("BEGIN: freshman evals")
    # ==========

    tech_sems = {}

    freshman_evals = [{
        'username': f.username,
        'evalDate': f.voteDate,
        'projectStatus': f.freshProjPass,
        'signaturesMissed': f.numMissedSigs,
        'socialEvents': f.socEvents,
        'techSems': f.techSems,
        'comments': f.comments,
        'result': f.result
    } for f in zoo_session.query(zoo.FreshmanEval).all()]

    for f in freshman_evals:
        if not f['username'].startswith('f_'):
            # freshman who have completed packet and have a CSH account
            eval_data = models.FreshmanEvalData(f['username'],
                                                f['signaturesMissed'])

            # FIXME: Zookeeper was only pass/fail for freshman project not pending
            if f['projectStatus'] == 1:
                eval_data.freshman_project = 'Passed'

            eval_data.social_events = f['socialEvents']
            eval_data.other_notes = f['comments']
            eval_data.eval_date = f['evalDate']
            # TODO: conditional
            if f['result'] == "pass":
                eval_data.freshman_eval_result = "Passed"
            elif f['result'] == "fail":
                eval_data.freshman_eval_result = "Failed"
            else:
                eval_data.freshman_eval_result = "Pending"

            if f['techSems'] is not None:
                t_sems = f['techSems'].split(',')
                for sem in t_sems:
                    if sem not in tech_sems:
                        tech_sems[sem] = [f['username']]
                    else:
                        tech_sems[sem].append(f['username'])
            db.session.add(eval_data)
        else:
            # freshman not yet done with packet
            # TODO FIXME The FALSE dictates that they are not given onfloor
            # status
            account = models.FreshmanAccount(f['username'], False)
            account.eval_date = f['evalDate']
            if f['techSems'] is not None:
                t_sems = f['techSems'].split(',')
                for sem in t_sems:
                    if sem not in tech_sems:
                        tech_sems[sem] = [f['username']]
                    else:
                        tech_sems[sem].append(f['username'])
            db.session.add(account)

    print("tech sems")
    tech_sems.pop('', None)
    print(tech_sems)

    for t_sem in tech_sems:
        # TODO FIXME: Is there a timestamp we can migrate for seminars?
        from datetime import datetime
        sem = models.TechnicalSeminar(t_sem, datetime.now())
        db.session.add(sem)
        db.session.flush()
        db.session.refresh(sem)
        print(sem.__dict__)
        for m in tech_sems[t_sem]:
            if m.startswith("f_"):
                print(sem.id)
                a = models.FreshmanSeminarAttendance(get_fid(m), sem.id)
                db.session.add(a)
            else:
                a = models.MemberSeminarAttendance(m, sem.id)
                db.session.add(a)

    db.session.flush()

    print("END: freshman evals")
    # ==========

    print("BEGIN: migrate committee meeting attendance")
    # ==========
    c_meetings = [(m.meeting_date, m.committee_id)
                  for m in zoo_session.query(zoo.Attendance).all()]
    c_meetings = list(set(c_meetings))
    c_meetings = list(filter(lambda x: x[0] is not None, c_meetings))
    c_meetings.sort(key=lambda col: col[0])

    com_meetings = []
    for cm in c_meetings:
        m = models.CommitteeMeeting(id_to_committee(cm[1]), cm[0])
        if cm[0] is None:
            # f**k man
            continue
        db.session.add(m)
        db.session.flush()
        db.session.refresh(m)

        com_meetings.append(cm)

    c_meetings = [(m.username, (m.meeting_date, m.committee_id))
                  for m in zoo_session.query(zoo.Attendance).all()]

    for cm in c_meetings:
        if cm[1][0] is None:
            # f**k man
            continue
        if cm[1][1] == 8:
            continue
        if cm[0].startswith('f_'):
            f = models.FreshmanCommitteeAttendance(get_fid(cm[0]),
                                                   com_meetings.index(cm[1]))
            db.session.add(f)
        else:
            m = models.MemberCommitteeAttendance(cm[0],
                                                 com_meetings.index(cm[1]) + 1)
            db.session.add(m)

    db.session.flush()

    print("END: migrate committee meeting attendance")
    # ==========

    print("BEGIN: migrate conditionals")
    # ==========

    condits = [{
        "uid": c.username,
        "desc": c.description,
        "deadline": c.deadline,
        "status": c.status
    } for c in zoo_session.query(zoo.Conditional).all()]

    for c in condits:
        condit = models.Conditional(c['uid'], c['desc'], c['deadline'])
        db.session.add(condit)

    print("END: migrate conditionals")

    # ==========

    print("BEGIN: house meetings")

    h_meetings = [hm.date for hm in zoo_session.query(zoo.HouseMeeting).all()]
    h_meetings = list(set(h_meetings))
    h_meetings.sort()
    print(h_meetings)

    house_meetings = {}
    for hm in h_meetings:
        m = models.HouseMeeting(hm)
        db.session.add(m)
        db.session.flush()
        db.session.refresh(m)
        house_meetings[hm.strftime("%Y-%m-%d")] = m.id

    print(house_meetings)

    hma = [{
        'uid': hm.username,
        'date': hm.date,
        'present': hm.present,
        'excused': hm.excused,
        'comments': hm.comments
    } for hm in zoo_session.query(zoo.HouseMeeting).all()]

    for a in hma:
        meeting_id = house_meetings[a['date'].strftime("%Y-%m-%d")]

        if a['present'] == 1:
            status = "Attended"
        elif a['excused'] == 1:
            status = "Excused"
        else:
            status = "Absent"

        excuse = a['comments']
        if a['uid'].startswith("f_"):
            # freshman
            fhma = models.FreshmanHouseMeetingAttendance(
                get_fid(a['uid']), meeting_id, excuse, status)
            db.session.add(fhma)
        else:
            # member
            mhma = models.MemberHouseMeetingAttendance(a['uid'], meeting_id,
                                                       excuse, status)
            db.session.add(mhma)

    print("END: house meetings")

    # ==========

    print("BEGIN: Major Projects")

    projects = [{
        'username': mp.username,
        'name': mp.project_name,
        'description': mp.project_description,
        'status': mp.status
    } for mp in zoo_session.query(zoo.MajorProject).all()]

    for p in projects:
        mp = models.MajorProject(p['username'], p['name'], p['description'])

        if p['status'] == 'pass':
            mp.status = 'Passed'
        if p['status'] == 'fail':
            mp.status = 'Failed'

        db.session.add(mp)
    print("END: Major Projects")

    # ==========

    print("BEGIN: ON FLOOR")
    import conditional.util.ldap as ldap
    from datetime import datetime
    members = [
        m['uid'][0].decode('utf-8') for m in ldap.ldap_get_onfloor_members()
    ]
    for m in members:
        db.session.add(models.OnFloorStatusAssigned(m, datetime.utcnow()))
    print("END: ON FLOOR")

    print("BEGIN: SPRING EVALS")
    members = [
        m['uid'][0].decode('utf-8') for m in ldap.ldap_get_active_members()
    ]
    for m in members:
        db.session.add(models.SpringEval(m))
    print("END: SPRING EVALS")
    print("BEGIN: Housing Evals")
    hevals = [{
        'username': he.username,
        'social_attended': he.social_attended,
        'social_hosted': he.social_hosted,
        'seminars_attended': he.seminars_attended,
        'seminars_hosted': he.seminars_hosted,
        'projects': he.projects,
        'comments': he.comments
    } for he in zoo_session.query(zoo.WinterEval).all()]

    for he in hevals:
        db.session.add(
            models.HousingEvalsSubmission(he['username'],
                                          he['social_attended'],
                                          he['social_hosted'],
                                          he['seminars_attended'],
                                          he['seminars_hosted'],
                                          he['projects'], he['comments']))
    print("END: Housing Evals")

    # Default EvalDB Settings
    db.session.add(models.EvalSettings())

    db.session.flush()
    db.session.commit()
예제 #13
0
def display_spring_evals(internal=False):
    log = logger.new(request=request)
    log.info('Display Membership Evaluations Listing')

    user_name = None
    if not internal:
        user_name = request.headers.get('x-webauth-user')

    active_members = [account for account in ldap_get_active_members()]

    sp_members = []
    for account in active_members:
        uid = account.uid
        spring_entry = SpringEval.query.filter(
            SpringEval.date_created > start_of_year(), SpringEval.uid == uid,
            SpringEval.active == True).first()  # pylint: disable=singleton-comparison

        if spring_entry is None:
            spring_entry = SpringEval(uid)
            db.session.add(spring_entry)
            db.session.flush()
            db.session.commit()
        elif spring_entry.status != "Pending" and internal:
            continue

        eval_data = None

        h_meetings = [m.meeting_id for m in get_hm(account, only_absent=True)]
        member = {
            'name':
            account.cn,
            'uid':
            uid,
            'status':
            spring_entry.status,
            'committee_meetings':
            len(get_cm(account)),
            'req_meetings':
            req_cm(account),
            'house_meetings_missed': [{
                "date":
                m.date.strftime("%Y-%m-%d"),
                "reason":
                MemberHouseMeetingAttendance.query.filter(
                    MemberHouseMeetingAttendance.uid == uid).filter(
                        MemberHouseMeetingAttendance.meeting_id ==
                        m.id).first().excuse
            } for m in HouseMeeting.query.filter(
                HouseMeeting.id.in_(h_meetings))],
            'major_projects': [{
                'name': p.name,
                'status': p.status,
                'description': p.description
            } for p in MajorProject.query.filter(
                MajorProject.date > start_of_year(), MajorProject.uid == uid)]
        }
        member['major_projects_len'] = len(member['major_projects'])
        member['major_projects_passed'] = [{
            'name': p.name,
            'status': p.status,
            'description': p.description
        } for p in MajorProject.query.filter(
            MajorProject.date > start_of_year(), MajorProject.status ==
            "Passed", MajorProject.uid == uid)]
        member['major_projects_passed_len'] = len(
            member['major_projects_passed'])
        member['major_project_passed'] = False
        for mp in member['major_projects']:
            if mp['status'] == "Passed":
                member['major_project_passed'] = True
                break

        if internal:
            member['housing_evals'] = eval_data
        sp_members.append(member)

    sp_members.sort(key=lambda x: x['committee_meetings'], reverse=True)
    sp_members.sort(key=lambda x: len(x['house_meetings_missed']))
    sp_members.sort(key=lambda x: len(
        [p for p in x['major_projects'] if p['status'] == "Passed"]),
                    reverse=True)
    # return names in 'first last (username)' format
    if internal:
        return sp_members

    return render_template(request,
                           'spring_evals.html',
                           username=user_name,
                           members=sp_members)
예제 #14
0
def get_onfloor_members():
    return [uid for uid in [members.uid for members in ldap_get_active_members()]
            if uid in [members.uid for members in ldap_get_onfloor_members()]]
예제 #15
0
def display_dashboard(user_dict=None):
    log = logger.new(request=request, auth_dict=user_dict)
    log.info('display dashboard')

    # Get the list of voting members.
    can_vote = get_voting_members()

    data = dict()
    data['username'] = user_dict['account'].uid
    data['active'] = ldap_is_active(user_dict['account'])
    data['bad_standing'] = ldap_is_bad_standing(user_dict['account'])
    data['onfloor'] = ldap_is_onfloor(user_dict['account'])
    data['voting'] = bool(user_dict['account'].uid in can_vote)

    data['voting_count'] = {
        "Voting Members": len(can_vote),
        "Active Members": len(ldap_get_active_members())
    }
    # freshman shit
    if ldap_is_intromember(user_dict['account']):
        data['freshman'] = get_freshman_data(user_dict['account'].uid)
    else:
        data['freshman'] = False

    spring = {}
    c_meetings = get_cm(user_dict['account'])
    spring['committee_meetings'] = len(c_meetings)
    spring['req_meetings'] = req_cm(user_dict['account'])
    h_meetings = [(m.meeting_id, m.attendance_status)
                  for m in get_hm(user_dict['account'])]
    spring['hm_missed'] = len([h for h in h_meetings if h[1] == "Absent"])
    eval_entry = SpringEval.query.filter(
        SpringEval.uid == user_dict['account'].uid,
        SpringEval.date_created > start_of_year(),
        SpringEval.active == True).first()  # pylint: disable=singleton-comparison
    if eval_entry is not None:
        spring['status'] = eval_entry.status
    else:
        spring['status'] = None

    data['spring'] = spring

    # only show housing if member has onfloor status
    if ldap_is_onfloor(user_dict['account']):
        housing = dict()
        housing['points'] = user_dict['account'].housingPoints
        housing['room'] = user_dict['account'].roomNumber
        housing['queue_pos'] = get_queue_position(user_dict['account'].uid)
    else:
        housing = None

    data['housing'] = housing

    data['major_projects'] = [{
        'id': p.id,
        'name': p.name,
        'status': p.status,
        'description': p.description
    } for p in MajorProject.query.filter(
        MajorProject.uid == user_dict['account'].uid,
        MajorProject.date > start_of_year())]

    data['major_projects_count'] = len(data['major_projects'])

    spring['mp_status'] = "Failed"
    for mp in data['major_projects']:
        if mp['status'] == "Pending":
            spring['mp_status'] = 'Pending'
            continue
        if mp['status'] == "Passed":
            spring['mp_status'] = 'Passed'
            break

    conditionals = [{
        'date_created': c.date_created,
        'date_due': c.date_due,
        'description': c.description,
        'status': c.status
    } for c in Conditional.query.filter(
        Conditional.uid == user_dict['account'].uid,
        Conditional.date_due > start_of_year())]
    data['conditionals'] = conditionals
    data['conditionals_len'] = len(conditionals)

    hm_attendance = [{
        'reason': m.excuse,
        'datetime': m.date
    } for m in MemberHouseMeetingAttendance.query.outerjoin(
        HouseMeeting, MemberHouseMeetingAttendance.meeting_id ==
        HouseMeeting.id).with_entities(
            MemberHouseMeetingAttendance.excuse, HouseMeeting.date).filter(
                MemberHouseMeetingAttendance.uid == user_dict['account'].uid,
                MemberHouseMeetingAttendance.attendance_status == "Absent",
                HouseMeeting.date > start_of_year())]

    data['cm_attendance'] = c_meetings
    data['cm_attendance_len'] = len(c_meetings)
    data['hm_attendance'] = hm_attendance
    data['hm_attendance_len'] = len(hm_attendance)

    return render_template('dashboard.html', **data)