예제 #1
0
def main_student():
    sm = students_model.Students(flask.session['id'])
    courses = sm.get_courses()
    context = dict(data=courses)
    signed_in = True if sm.has_signed_in() else False


    if request.method == 'GET':
        return render_template(
                'main_student.html',
                signed_in=signed_in,
                **context)

    elif request.method == 'POST':
        if 'secret_code' in request.form.keys():
            provided_secret = request.form['secret_code']
            cid = int(request.form['cid'])
            actual_secret, seid = sm.get_secret_and_seid(cid)
            if courses:
                for course in courses:
                    if course['cid'] == cid:
                        if int(provided_secret) == int(actual_secret):
                            sm.sign_in(seid=seid)
                            course['secret_valid'] = True
                            course['signed_in'] = True
                        else:
                            course['secret_valid'] = False
            context = dict(data=courses)
            return render_template(
                    'main_student.html',
                    submitted=True,
                    **context)
예제 #2
0
def update_session(seid):
    sm = sessions_model.Sessions(g.conn, seid)
    tm = teachers_model.Teachers(g.conn, flask.session['id'])

    action = request.form['action']
    sid = request.form['sid'] if 'sid' in request.form.keys() else None

    stm = students_model.Students(g.conn, sid)

    if action == 'mark_present':
        stm.insert_attendance_record(seid)

    elif action == 'mark_absent':
        sm.remove_attendance_record(sid)

    elif action == 'approve':
        status = 1
        tm.update_change_request(int(status), int(seid), int(sid))
        stm.insert_attendance_record(seid)

    elif action == 'deny':
        status = 0
        tm.update_change_request(int(status), int(seid), int(sid))

    elif action == 'delete_session':
        sm.delete_session()
        return flask.redirect('/teacher/')

    session = sm.get_session()[0]
    attendance = sm.get_attendance_record()

    return render_template('session.html',
                           session=session,
                           attendance=attendance)
예제 #3
0
def main_teacher():
    tid = flask.session['id']
    if request.method == 'GET':
        index = index_model.Index(tid)
        if (not index.is_teacher()):
            return render_template('error.html')
    tm = teachers_model.Teachers(tid)
    ssm = sessions_model.Sessions()
    if request.method == 'POST':
        if "close" in request.form.keys():
            cid = request.form["close"]
            ssm.open_session(cid)
            ssm.close_window()
        elif "open" in request.form.keys():
            cid = int(request.form["open"])
            new_seid = ssm.open_session(cid)
            ssm.open_window(new_seid)
            course = courses_model.Courses()
            students = course.get_students_sids(cid)
            for student in students:
                sm = students_model.Students(student['sid'])
                sm.insert_attendance_record(new_seid)
    courses = tm.get_courses_with_session()
    empty = True if len(courses) == 0 else False
    context = dict(data=courses)
    return render_template('main_teacher.html', empty=empty, **context)
예제 #4
0
def student_view_attendance():
    sm = students_model.Students(flask.session['id'])
    courses = sm.get_courses()
    records = list()
    course_name=""

    #need to error check for when student is not enrolled in any courses
    if request.method == 'POST':
        cid = request.form['cid']
        course_name = courses_model.Courses(cid).get_course_name()

    elif courses:
        cid = courses[0]['cid']
        course_name = courses[0]['name']
        records = sm.get_course_attendance(cid)
    
    attendance_model = arm.Attendance_Records()
    excuses = attendance_model.get_excuses_multi(sid=flask.session['id'])
    excuse_session_ids = [int(e['seid']) for e in excuses]
    for r in records:
        r['excuse_submitted'] = False
        if r['seid'] in excuse_session_ids:
            r['excuse_submitted'] = True

    return render_template(
        'view_student_record.html',
        courses=courses,
        records=records,
        course_name=course_name
    )
예제 #5
0
def main_student():
    sm = students_model.Students(g.conn, flask.session['id'])
    courses = sm.get_courses()
    context = dict(data=courses)

    signed_in = True if sm.has_signed_in() else False

    if request.method == 'GET':
        return render_template('main_student.html',
                               signed_in=signed_in,
                               **context)

    elif request.method == 'POST':
        if 'secret_code' in request.form.keys():
            provided_secret = request.form['secret_code']
            actual_secret, seid = sm.get_secret_and_seid()

            if provided_secret == actual_secret:
                sm.insert_attendance_record(seid)
                valid = True
            else:
                valid = False

            return render_template('main_student.html',
                                   submitted=True,
                                   valid=valid,
                                   **context)
        else:
            return render_template('main_student.html',
                                   signed_in=signed_in,
                                   **context)
예제 #6
0
def test_insert_attendance_record(db):
    grommash = students_model.Students(db, 5)
    assert not grommash.has_signed_in()

    # insert grommash into session (seid=2)
    grommash.insert_attendance_record(2)

    assert grommash.has_signed_in()
예제 #7
0
    def test_get_courses(self):
        student = sm.Students(sid=STUDENT['sid'])
        for enrolled in ENROLLMENT:
            self.store_model('enrolled_in', **enrolled)

        student_courses = sorted(student.get_courses(), key=lambda c: c['cid'])
        correct_courses = sorted(COURSES, key=lambda x: x['cid'])
        self.assertEquals(len(student_courses), len(correct_courses))
        '''
예제 #8
0
def student_change_request(seid):
    sm = students_model.Students(g.conn, flask.session['id'])

    message = request.form['message'] or ''

    sm.create_change_request(seid, message)

    redirect = flask.session.pop('redirect', None)

    return flask.redirect(redirect or '/student/')
예제 #9
0
def view_class():
    if request.method == 'GET':
        flask.redirect(flask.url_for('main_teacher'))

    elif request.method == 'POST':
        cm = courses_model.Courses()

        if 'close' in request.form.keys():
            cid = request.form['close']
            cm.cid = cid
            cm.close_session(cm.get_active_session())
        elif 'open' in request.form.keys():
            cid = request.form['open']
            cm.cid = cid
            cm.open_session()
        else:
            cid = request.form['cid']
            cm.cid = cid

        res = 0
        uni = None
        if 'add_student' in request.form.keys():
            uni = request.form['add_student']
            res = cm.add_student(uni)
        elif 'remove_student' in request.form.keys():
            uni = request.form['remove_student']
            res = cm.remove_student(uni)

        course_name = cm.get_course_name()
        secret = cm.get_secret_code()
        num_sessions = cm.get_num_sessions()
        students = cm.get_students()
        students_with_ar = []
        for student in students:
            sm = students_model.Students(student['id'])
            student_uni = sm.get_uni()
            num_ar = sm.get_num_attendance_records(cid)
            students_with_ar.append([student, student_uni, num_ar])

        context = dict(students=students_with_ar)
        return render_template(
                'view_class.html',
                cid=cid,
                secret=secret,
                course_name=course_name,
                num_sessions=num_sessions,
                uni=uni,
                res=res,
                **context)
예제 #10
0
def test_get_num_attendance_records(db):
    jaina = students_model.Students(db, 6)
    cid_of_ah = 4

    assert jaina.get_num_attendance_records(cid_of_ah) == 0

    # insert into 1st session
    jaina.insert_attendance_record(1)

    assert jaina.get_num_attendance_records(cid_of_ah) == 1

    # insert into 2nd session
    jaina.insert_attendance_record(2)

    assert jaina.get_num_attendance_records(cid_of_ah) == 2
예제 #11
0
    def test_get_course_attendance(self):
        for session in SESSIONS:
            self.store_model('sessions', **session)

        for record in RECORDS:
            self.store_model('attendance_records', **record)

        student = sm.Students(sid=STUDENT['sid'])
        attendance = sorted(student.get_course_attendance(COURSES[0]['cid']),
                            key=lambda x: x['seid'])
        correct_att = sorted(SESSIONS, key=lambda x: x['seid'])

        self.assertEquals(len(attendance), len(correct_att))
        for s1, s2 in zip(attendance, correct_att):
            for attr in s1:
                self.assertEquals(s1[attr], s2[attr])
예제 #12
0
    def setUp(self):
        super(AttendanceTestCase, self).setUp()

        self.context = {}
        self.context['student'] = [self.store_model('student', **STUDENT)]
        self.context['courses'] = [
            self.store_model('courses', **course) for course in COURSES
        ]
        self.context['enrolled_in'] = [
            self.store_model('enrolled_in', **e) for e in ENROLLS
        ]
        self.context['sessions'] = [
            self.store_model('sessions', **s) for s in SESSIONS
        ]
        self.student = sm.Students(STUDENT['sid']),
        self.courses = [cm.Courses(c['cid']) for c in COURSES],
        self.record = arm.Attendance_Records(sid=RECORD['sid'],
                                             seid=RECORD['seid'])
예제 #13
0
def student_view_class(cid):
    cm = courses_model.Courses(g.conn, cid)
    sm = students_model.Students(g.conn, flask.session['id'])

    course_name = cm.get_course_name()
    attendance_record = sm.get_attendance_record(cid)
    present = 0
    total = len(attendance_record)
    for rec in attendance_record:
        if rec['sid'] is not None:
            present += 1

    flask.session['redirect'] = '/student/view_class/%s' % cid

    return render_template('student_view_class.html',
                           course_name=course_name,
                           attendance_record=attendance_record,
                           present=present,
                           total=total)
예제 #14
0
def test_sessions(db):

    cid = 7
    student = 15

    cm = courses_model.Courses(db, cid)
    sm = students_model.Students(db, student)

    sessions = cm.get_sessions()
    assert len(sessions) == 0

    secret = cm.open_session()
    seid = cm.get_active_session()

    sessions = cm.get_sessions()
    assert len(sessions) == 1
    assert sessions[0]['enrollment'] == 1
    assert sessions[0]['attendance'] == 0

    sm.insert_attendance_record(seid)
    sessions = cm.get_sessions()
    assert sessions[0]['attendance'] == 1
예제 #15
0
def view_requests():
    tm = teachers_model.Teachers(g.conn, flask.session['id'])
    if request.method == 'GET':
        results = tm.get_change_requests()
        context = dict(data=results)
        return render_template('view_requests.html', **context)
    elif request.method == 'POST':
        if 'approve' in request.form.keys():
            iden = request.form['approve'].split()
            seid = int(iden[0])
            sid = int(iden[1])
            sm = students_model.Students(g.conn, sid)
            sm.insert_attendance_record(seid)
            tm.update_change_request(1, seid, sid)
        elif 'deny' in request.form.keys():
            iden = request.form['deny'].split()
            seid = int(iden[0])
            sid = int(iden[1])
            tm.update_change_request(-1, seid, sid)
        results = tm.get_change_requests()
        context = dict(data=results)
        return render_template('view_requests.html', **context)
예제 #16
0
def teacher_view_excuses():
    #get courses
    tid = flask.session['id']
    teacher = teachers_model.Teachers(tid)
    courses_taught = teacher.get_courses() 

    #get sessions for selected course id and submitted excuses
    context = dict(data=[])
    if not courses_taught:
        return render_template("teacher_view_excuses.html",
                               courses_taught=courses_taught,
                               **context)

    if request.method == 'POST':
        cid = request.form['cid']
    else:
        cid = courses_taught[0]['cid']
    course = courses_model.Courses(cid)
    sessions = course.get_sessions()

    #get unis and excuse messages for all sessions
    sm = students_model.Students(1)
    results = []
    for s in sessions:
        excuses = arm.Attendance_Records().get_excuses_multi(seid=s['seid'])
        if excuses:
            for e in excuses:
                sm.sid = e['sid']
                e['uni'] = sm.get_uni()
            s['excuses'] = excuses
            results.append(s)
       
    context['data'] = results
    context['course_name'] = course.get_course_name()

    return render_template("teacher_view_excuses.html",
                           courses_taught=courses_taught,
                           **context)
예제 #17
0
 def test_get_uni_existing_student(self):
     student = sm.Students(sid=STUDENT['sid'])
     uni = student.get_uni()
     self.assertEquals(uni, STUDENT['uni'])
예제 #18
0
def view_class():
    if request.method == 'GET':
        flask.redirect(flask.url_for('main_teacher'))

    elif request.method == 'POST':
        cm = courses_model.Courses()
        ssm = sessions_model.Sessions()

        if 'close' in request.form.keys():
            cid = request.form['close']
            cm.cid = cid
            ssm.open_session(cid)
            ssm.close_window()
        elif 'open' in request.form.keys():
            cid = request.form['open']
            cm.cid = cid
            new_seid = ssm.open_session(cid)
            ssm.open_window(new_seid)
        else:
            cid = request.form['cid']
            cm.cid = cid

        res = 0
        uni = None
        if 'add_student' in request.form.keys():
            for uni in request.form['add_student'].split('\n'):
                uni = uni.strip('\r')
                res = cm.add_student(uni)
        elif 'remove_student' in request.form.keys():
            for uni in request.form['remove_student'].split('\n'):
                uni = uni.strip('\r')
                res = cm.remove_student(uni)
        course_name = cm.get_course_name()

        secret = ssm.get_secret_code()
        num_sessions = cm.get_num_sessions()
        sess = cm.get_sessions()
        ssm2 = sessions_model.Sessions()
        labels = []
        values = []
        for ses in sess:
            denom = float(ssm2.get_current_roster_size(ses['seid']))
            numerator = float(ssm2.get_attendance_count(ses['seid']))
            if(denom == 0):
                values.append(0)
            else:
                values.append((float(numerator/denom))*100)
            labels.append(str(ses['date']))
        students = cm.get_students()
        students_with_ar = []
        for student in students:
            sm = students_model.Students(student['id'])
            student_uni = sm.get_uni()
            num_ar = sm.get_num_attendance_records(cid)
            students_with_ar.append([student, student_uni, num_ar])

        context = dict(students=students_with_ar)
        return render_template(
                'view_class.html',
                cid=cid,
                secret=secret,
                course_name=course_name,
                num_sessions=num_sessions,
                uni=uni,
                res=res,
                labels=labels,
                values=values,
                **context)
예제 #19
0
    def test_get_courses_no_courses(self):
        student = sm.Students(sid=STUDENT['sid'])
        courses = student.get_courses()

        self.assertEquals(len(courses), 0)
예제 #20
0
def main_student():
    sm = students_model.Students(flask.session['id'])
    courses = sm.get_courses()
    context = dict(data=courses)
    signed_in, ontime_or_not = sm.has_signed_in()
    # signed_in = True if sm.has_signed_in() else False
    record_timestamp, record_coordinate = sm.get_attendance_record()
    valid = 0
    new_record_timestamp = record_timestamp+timedelta(hours=-4)
    if request.method == 'GET':
        return render_template(
                'main_student.html',
                valid=valid,
                signed_in=signed_in,
                ontime_or_not=ontime_or_not,
                uni=sm.get_uni(),
                record_timestamp=new_record_timestamp, 
                record_coordinate=record_coordinate,
                **context)

    elif request.method == 'POST':
        if 'secret_code' in request.form.keys():

            # Provided_secret is student's secret code input

            provided_secret = request.form['secret_code']

            # provided_timestamp = datetime.datetime.now(tz=EST5EDT())
            provided_timestamp = datetime.now()
            provided_coordinate_data = json.load(urlopen(_URL + "/" + str(request.remote_addr)))
            if 'lat' not in provided_coordinate_data:
                provided_coordinate = [0, 0]
            else:
                provided_coordinate = [provided_coordinate_data['lat'], provided_coordinate_data['lon']]
            
            # actual_secret, and seid is the real secret code and real session id related to the course above.
            actual_secret, seid, course_timestamp, course_coordinate = sm.get_secret_and_seid()
            
            # valid = 1     true valid
            # valid = 2     out of distance range
            # valid = 3     out of timestamp range
            # valid = 4     invalid secret code
            if provided_secret == '':
                provided_secret = 999

            if int(provided_secret) == int(actual_secret):
                if (course_timestamp + timedelta(minutes=15)).replace(tzinfo=None) >= provided_timestamp:
                    distance = great_circle(tuple(provided_coordinate), tuple(course_coordinate)).meters

                    if distance <= 25:
                        sm.insert_attendance_record(seid, provided_timestamp, provided_coordinate, True)
                        valid = 1
                    else: 
                        valid = 2
                else:
                    sm.insert_attendance_record(seid, provided_timestamp, provided_coordinate, False)
                    valid = 3
            else:
                valid = 4
            new_signin_timestamp = provided_timestamp+timedelta(hours=-4)
            return render_template(
                    'main_student.html',
                    submitted=True,
                    valid=valid,
                    uni=sm.get_uni(),
                    actual_secret=actual_secret,
                    signin_timestamp=new_signin_timestamp,
                    signin_coordinate=provided_coordinate,
                    **context)
예제 #21
0
def view_class():
    tm = teachers_model.Teachers(flask.session['id'])
    if request.method == 'GET':
        flask.redirect(flask.url_for('main_teacher'))

    elif request.method == 'POST':
        cm = courses_model.Courses()

        if 'close' in request.form.keys():
            cid = request.form['close']
            cm.cid = cid
            cm.close_session(cm.get_active_session())
        elif 'open' in request.form.keys():
            cid = request.form['open']
            cm.cid = cid
            cm.open_session()
        else:
            cid = request.form['cid']
            cm.cid = cid

        res = 0
        uni = None
        if 'add_student' in request.form.keys():
            uni = request.form['add_student']
            res = cm.add_student(uni)
        elif 'remove_student' in request.form.keys():
            uni = request.form['remove_student']
            res = cm.remove_student(uni)

        course_name = cm.get_course_name()
        secret = cm.get_secret_code()

        # Get class timestamp
        timestamp = cm.get_timestamp()

        # Get class coordinate
        coordinate = cm.get_coordinate()

        num_sessions = cm.get_num_sessions()
        students = cm.get_students()
        students_with_ar = []
        for student in students:
            sm = students_model.Students(student['id'])
            student_uni = sm.get_uni()
            num_ar = sm.get_num_attendance_records(cid)
            num_late = sm.get_num_late_attendance_records(cid)
            students_with_ar.append([student, student_uni, num_ar, num_late])

        context = dict(students=students_with_ar)
        if timestamp:
            new_timestamp = timestamp+timedelta(hours=-4)
        else:
            new_timestamp = "NO TIME."


        courses = tm.get_courses_with_session()
        context_course = dict(data=courses)

        disable_rest_open_windows = False
        for item in context_course['data']:
            if item['active'] == 1:
                disable_rest_open_windows = True

        return render_template(
                'view_class.html',
                cid=cid,
                secret=secret,
                timestamp=new_timestamp,
                coordinate=coordinate,
                course_name=course_name,
                num_sessions=num_sessions,
                uni=uni,
                disable_rest_open_windows=disable_rest_open_windows,
                res=res,
                **context)
예제 #22
0
def test_get_uni(db):
    sm = students_model.Students(db, 3)
    assert sm.get_uni() == 'ds9876'
예제 #23
0
def test_has_signed_in(db):
    dave = students_model.Students(db, 3)
    assert dave.has_signed_in()

    grommash = students_model.Students(db, 5)
    assert not grommash.has_signed_in()
예제 #24
0
 def test_get_uni_nonexistant_student(self):
     invalid_id = 9999
     student = sm.Students(sid=invalid_id)
     uni = student.get_uni()
     self.assertFalse(uni)