def post_attendance(self, request):
    """Register whether or not a single student attended class.
    
    Arguments
      request: an AttendanceRecord message.

    Returns:
      An instance of message_types.VoidMessage.
    """
    current_user = endpoints.get_current_user()
    app_id = os.environ['APPLICATION_ID']
    if app_id.startswith('dev~') or app_id == 'testbed-test':
      email = '*****@*****.**'
    else:
      if current_user is None:
        raise endpoints.UnauthorizedException('Invalid token.')
      email = current_user.email()

    domain = email.split('@')[1]
    if domain == 'gmail.com': domain = ''
    namespace_manager.set_namespace(domain)

    student_key = ndb.Key('Student', request.student)
    student = student_key.get()
    if not student:
      raise endpoints.BadRequestException('No student: %s' % request.student)
    classname_key = ndb.Key('Class', request.classname)
    classname = classname_key.get()
    if not classname:
      raise endpoints.BadRequestException('No class: %s' % request.classname)

    if not AttendanceAPI.is_enrolled(classname, student_key):
      raise endpoints.BadRequestException(
        'Student %s is not enrolled in class %s' % (student_key, classname.name))

    today = AttendanceAPI.today_as_ordinal(classname.timezone)
    if request.date != today:
      raise endpoints.BadRequestException('Date must be %s, but is: %s' 
                                          % (today, request.date))

    logging.info('Updating class: %s student: %s date: %s user: %s attend: %s' % 
                 (classname.name, request.student, request.date, 
                  email, request.attended))

    attendance_key = ndb.Key('Class', request.classname, 
                             'Attendance', request.date)
    attendance = attendance_key.get()
    if not attendance:
      attendance = Attendance(key=attendance_key, attending=[])
    if request.attended:
      if not AttendanceAPI.is_present(attendance, student_key):
        attendance.attending.append(StudentPresent(student=student_key))
        attendance.put()
    else:
      try:
        attendance.attending.remove(student_present)
        attendance.put()
      except ValueError:
        pass
    return message_types.VoidMessage()
Ejemplo n.º 2
0
 def obj_create(self, bundle, **kwargs):
     bundle = super(DisseminationResource, self).obj_create(bundle, **kwargs)
     dissemination_id  = getattr(bundle.obj,'id')
     att_list = bundle.data.get('attendance_records')
     for att in att_list:
         att = Attendance(dissemination_id=dissemination_id, person_id=att['person_id'], liked = att['interested'], question_asked = att['question_asked'])
         att.save()
     return bundle
Ejemplo n.º 3
0
 def obj_update(self, bundle, **kwargs):
     #Edit case many to many handling. First clear out the previous related objects and create new objects
     bundle = super(ScreeningResource, self).obj_update(bundle, **kwargs)
     dissemination_id = bundle.data.get('id')
     del_objs = Attendance.objects.filter(dissemination_id=dissemination_id).delete()
     att_list = bundle.data.get('attendance_records')
     for att in att_list:
         att = Attendance(dissemination_id=dissemination_id, person_id=att['person_id'], 
                                           liked = att['interested'], 
                                           question_asked = att['question_asked'])
         att.save()    
     return bundle
Ejemplo n.º 4
0
def add_student_to_class(index_id):
    if current_user.role != 'admin':
        flash('You are not authorized to perform this action', 'danger')
        return redirect(url_for('dashboard'))

    dashboard_data = get_dashboard()
    students = Students.query.all()

    if request.method == 'POST':
        # check if the student is inside the class
        index_dates = Indexes.query.get(index_id).dates
        found = False
        for attendance in index_dates[0].attendance:
            if attendance.studentId == int(request.form['name']):
                found = True
                break

        if found:
            flash('Student is already enrolled into this class', 'warning')
            return redirect(url_for('view_class_students', index_id=index_id))
        else:
            # get the highest seat number
            seat_no = get_highest_seat_no(index_dates[0])
            for index_date in index_dates:
                new_attendance = Attendance(indexDateId=index_date.id,
                                            studentId=request.form['name'],
                                            seatNo=seat_no)
                db.session.add(new_attendance)
            db.session.commit()
            flash('Student has successfully enroll into this class', 'success')
            return redirect(url_for('view_class_students', index_id=index_id))

    return render_template('add_student_to_class.html',
                           students=students,
                           dashboard_data=dashboard_data)
Ejemplo n.º 5
0
async def attend(ctx, name: str):
    '''Allows a user to attend an upcoming event
        example: ?attend party
    '''
    author = ctx.message.author.name
    avatar = ctx.message.author.avatar_url
    id = ctx.message.author.id

    try:
        count = session.query(Member).filter(Member.id == id).count()
        event = session.query(Event).filter(Event.name == name).first()

        # Verify This event exists
        if not event:
            await bot.say('This event does not exist')
            return

        # Create member if they do not exist in our database
        if count < 1:
            member = Member(id=id, name=author, avatar=avatar)
            session.add(member)

        attending = Attendance(member_id=id, event_id=event.id)
        session.add(attending)
        session.commit()
        await bot.say('Member {} is now attending event {}'.format(
            author, name))
    except Exception as e:
        await bot.say('Could not complete your command')
        print(e)
Ejemplo n.º 6
0
def main():
    host = User(username='******',
                studentID='100000000',
                email='*****@*****.**',
                image_file='profiles/Chris.jpg',
                password=dbpassword,
                device='Heroku')
    db.session.add(host)
    db.session.commit()

    test = User(username='******',
                studentID='100000001',
                email='*****@*****.**',
                image_file='profiles/default.PNG',
                password='******',
                device='None')
    db.session.add(test)
    db.session.commit()

    att = Attendance(username='******',
                     studentID='100000000',
                     teamnumber=97,
                     teamcount=10,
                     unit='01')
    db.session.add(att)
    db.session.commit()

    att = AttendLog(username='******', studentID='100000000')
    db.session.add(att)
    db.session.commit()
Ejemplo n.º 7
0
def start_day():
    students = Student.query.all()
    students_att = Attendance.query.filter_by(date_now=date.today()).all()

    # checks if not attendace list has been created for the day.
    if not students:
        flash('No students in the database yet', 'error')
        return redirect('/students')
    if not students_att:
        if students:
            # pushes all students into the attendance table, creating
            # a list for today's date.
            for student in students:
                record = Attendance(student)
                db.session.add(record)
            db.session.commit()
            return redirect('/student_login')
        else:
            # the day's list has not been created
            flash('Today\'s attendance hasn\'t been created yet.', 'error')
            return redirect('/')
    else:
        # the day's list already created
        flash('Today\'s attendance already created', 'error')
        return redirect('/')
Ejemplo n.º 8
0
def mark_attendance(id):
    class_id, user_id, date = id, current_user.user_id, datetime.date.today()
    response = {
        'class_id': class_id,
        'user_id': user_id,
        'date': date,
        'already_marked': False
    }
    
    def is_enrolled():
        enroll = Enrollment.query.filter_by(user_id=user_id, class_id=id, dropped=False).all()
        if enroll:
            return True
        return False
    if not is_enrolled():
        response['success'] = False
        return jsonify(response)
        
    if not Attendance.query.filter_by(
        class_id=class_id, user_id=user_id, date=date).all():
        
        new_attendance = Attendance(
            class_id=id,
            user_id=current_user.user_id,
            date=datetime.date.today()
        )
        db.session.add(new_attendance)
        db.session.commit()
        response['success'] = True
    else:
        response['success'] = True
        response['already_marked'] = True
    return jsonify(response)
Ejemplo n.º 9
0
def events():
    if request.method == "POST":
        my_data = json.loads(request.data.decode('utf-8'))
        name = my_data['eventDate']
        print(name)
        event = Events(
            event_name=my_data['eventName'],
            event_date=my_data['eventDate']
        )

        try:
            db.session.add(event)

            # Need to commit event first so I can use the event_id to link two tables
            db.session.commit()
            attendees = []
            for attendee in my_data['attendees']:
                attendees.append(Attendance(
                    meetup_user_id=attendee['userId'],
                    event_id=event.id,
                    did_attend=attendee['didAttend'],
                    did_rsvp=attendee['didRSVP'],
                    title=attendee['title'],
                    event_host=attendee['eventHost'],
                    rsvp_date=attendee['rsvpDate'],
                    date_joined_group=attendee['dateJoinedGroup']
                ))
            print(attendees)
            print(event)
            db.session.bulk_save_objects(attendees)
            db.session.commit()

        except Exception as exception:
            print(exception)
        return jsonify(my_data)
    else:
        events = []
        for event in Events.query.order_by(Events.event_date.desc()).all():
            try:
                attendees = Attendance.query.filter(
                    Attendance.event_id == event.id, Attendance.did_attend == True).all()
                rsvps = Attendance.query.filter(Attendance.event_id ==
                                                event.id, Attendance.did_rsvp == True).all()
                attendees_who_rsvpd = Attendance.query.filter(Attendance.event_id ==
                                                              event.id, Attendance.did_rsvp == True, Attendance.did_attend == True).all()
                events.append({
                    # Needs to be string here beacuse when front end sends event id back to get attendance data
                    # Database expects getting rows by matching id string, not number
                    "id": event.id,
                    "name": event.event_name,
                    "date": event.event_date,
                    "attendees": len(attendees),
                    "rsvps": len(rsvps),
                    "attendeesWhoRsvpd": len(attendees_who_rsvpd)
                })
            except Exception as exception:
                print(exception)
                return "Could not get the event data"
        return jsonify(data=events)
Ejemplo n.º 10
0
def mark_attendance():
    user_name = str(request.data)
    print("Mark attendance of " + user_name)
    check_user = User.query.filter_by(name=user_name).first()
    if check_user is not None:
        new_attendance = Attendance(check_user.userID, datetime.utcnow())
        db_session.add(new_attendance)
        db_session.commit()
    return json.dumps({'status': 'OK'})
Ejemplo n.º 11
0
def upload_class():
    if current_user.role != 'admin':
        flash('You are not authorized to perform this action', 'danger')
        return redirect(url_for('dashboard'))

    dashboard_data = get_dashboard()
    form = AdminAddFileForm()

    if form.validate_on_submit():
        added = False
        file = form.fileInput.data
        file_string = str(file.read(), 'utf-8')
        class_dict = csv.DictReader(file_string.splitlines(),
                                    skipinitialspace=True)
        for class_details in class_dict:
            try:
                course_index = find_index(class_details['index'])
                if course_index is None:
                    flash(
                        f'Index {class_details["index"]} is not inside the database. Please add this course first',
                        'danger')
                    return redirect(url_for('manage_class'))

                student = find_student(class_details['matricNo'])
                if student is None:
                    flash(
                        f'Student {class_details["matricNo"]} is not inside the database. Please add this student first',
                        'danger')
                    return redirect(url_for('manage_class'))

                index_dates = get_all_index_dates(course_index.id)
                for index_date in index_dates:
                    attendance = find_attendance(index_date.id, student.id)
                    if attendance is None:
                        added = True
                        attendance = Attendance(indexDateId=index_date.id,
                                                studentId=student.id,
                                                seatNo=class_details['seatNo'])
                        db.session.add(attendance)
            except:
                flash('CSV contains incorrect fields', 'danger')
                return redirect(url_for('manage_class'))

        if added:
            db.session.commit()
            flash('Class details have been added', 'success')
        else:
            flash('No class details was added', 'info')
        return redirect(url_for('manage_class'))

    return render_template('admin_add_file.html',
                           form=form,
                           dashboard_data=dashboard_data,
                           legend='Upload Class')
Ejemplo n.º 12
0
 def set_attendance(session_id: str, student: str, status: Optional[str]):
     session_id = int(session_id)
     session = Session.query.get(session_id)
     status = AttendanceStatus[status]
     student = User.query.filter_by(email=student).one()
     Attendance.query.filter_by(session_id=session_id, student=student).delete()
     if status is not None:
         db.session.add(
             Attendance(status=status, session_id=session_id, student=student)
         )
     db.session.commit()
     return fetch_section(section_id=session.section_id)
Ejemplo n.º 13
0
def checkinstudent(coursecode):
    checkinstu = {}
    checkinstu['success'] = False
    checkinstu['error'] = 'Student not registered for the course'
    ccode = coursecode
    stuid = request.args.get('sid')
    flag = request.args.get('flag')
    addi = request.args.get('addi')

    course = Course.query.filter_by(code=ccode).first()
    if course is None:
        checkinstu['error'] = 'Course not exists'
        return jsonify(checkinstu)
    cid = course.cid
    link = StudentCourseLink.query.filter_by(cid=cid, sid=stuid).first()
    if link is None:
        return jsonify(checkinstu)

    #do checkin
    status = 'Yes'
    checkin_time = datetime.datetime.now(timezone('US/Pacific'))
    checkout_time = ''
    date = checkin_time.date()
    #date = date.astimezone(timezone('US/Pacific'))
    student = Student.query.filter_by(sid=stuid).first()
    if student is None:
        checkinstu['error'] = 'Student not exists'
        return jsonify(checkinstu)
    stu_name = student.sfirstname + ' ' + student.slastname
    stu_id = stuid
    course_code = ccode
    course_id = cid
    additional = ''
    if flag is not None and addi is not None:
        additional = flag + ': ' + addi
    newatt = Attendance(checkin_time, checkout_time, date, status, stu_name,
                        stu_id, course_code, course_id, additional)
    try:
        exsiting = Attendance.query.filter_by(stu_id=stu_id,
                                              course_id=course_id,
                                              date=date).first()
        if exsiting is not None:
            db.session.delete(exsiting)
            db.session.commit()

        db.session.add(newatt)
        db.session.commit()
        checkinstu['success'] = True
        checkinstu['error'] = ''
    except:
        checkinstu['error'] = 'Server Error'
    return jsonify(checkinstu)
Ejemplo n.º 14
0
def changestatus():
    if 'email' not in session:
        return redirect(url_for('signin'))

    user = User.query.filter_by(email=session['email']).first()

    if user is None:
        return redirect(url_for('signin'))
    else:
        form = ChangeStatusForm()
        courses = Course.query.filter_by(ins_id=user.uid).all()
        courseChoices = []
        for course in courses:
            courseChoices.append(
                (course.code, course.code + '-' + course.cname))
        form.course.choices = courseChoices
        studentChoices = []
        studentLinks = StudentCourseLink.query.filter_by(
            cid=courses[0].cid).all()
        for link in studentLinks:
            stu = Student.query.filter_by(sid=link.sid).first()
            sname = stu.sfirstname + ' ' + stu.slastname
            studentChoices.append((link.sid, str(link.sid) + ' - ' + sname))
        form.student.choices = studentChoices

        if request.method == 'POST':
            status = form.att.data
            stu_id = form.student.data
            date = form.time.data
            course_code = form.course.data
            course_id = Course.query.filter_by(code=course_code).first().cid
            stu2 = Student.query.filter_by(sid=int(stu_id)).first()
            sname2 = stu2.sfirstname + ' ' + stu2.slastname
            exsiting = Attendance.query.filter_by(stu_id=stu_id,
                                                  course_id=course_id,
                                                  date=date).first()
            checkin_time = ''
            checkout_time = ''
            if exsiting is not None:
                checkin_time = exsiting.checkin_time
                checkout_time = exsiting.checkout_time
                db.session.delete(exsiting)
                db.session.commit()
            additional = 'manually checked in'
            newatt = Attendance(checkin_time, checkout_time, date, status,
                                sname2, stu_id, course_code, course_id,
                                additional)
            db.session.add(newatt)
            db.session.commit()

        return render_template('changestatus.html', form=form)
Ejemplo n.º 15
0
def attendance():
    parents = Member.query.filter_by(member_type="parent").all()
    childs = Member.query.filter_by(member_type="child").all()
    if request.method == 'POST':
        date = datetime.now().strftime('%x')
        day = datetime.now().strftime('%A')

        parent_id = request.form.get("selected_parent")
        child_id = request.form.get("selected_child")

        parent = Attendance(parent_id, date, day)
        parent.present()
        child = Attendance(child_id, date, day)
        child.present()

    return render_template('attendance.html', parents=parents, childs=childs)
Ejemplo n.º 16
0
def attendance_info():
    uData = User.query.all()
    fname=[fn.firstName for fn in uData]
    lname=[ln.lastName for ln in uData]
    fullname=zip(fname,lname)
    if ('user' in session and session['user'] == params['admin_user']):
       if request.method == 'POST':
             name = request.form.get('username')
             date = request.form.get('date')
             message = request.form.get('message')
             entry = Attendance(userName=name,date=date,message=message)
             db.session.add(entry)
             db.session.commit()
             flash('Data Saved Successfully')
    return render_template('attendance.html',params=params,name=fullname)
Ejemplo n.º 17
0
def checkin():
    if 'email' not in session:
        return redirect(url_for('signin'))

    user = User.query.filter_by(email=session['email']).first()

    if user is None:
        return redirect(url_for('signin'))

    form = CheckinForm()

    courses = Course.query.filter_by(ins_id=user.uid).all()
    courseChoices = []
    for course in courses:
        courseChoices.append((course.code, course.code + '-' + course.cname))
    form.course.choices = courseChoices

    if request.method == 'POST':
        course_code = form.course.data
        course = Course.query.filter_by(code=course_code).first()
        course_name = course.cname
        cid = course.cid
        studentLinks = StudentCourseLink.query.filter_by(cid=cid).all()
        for link in studentLinks:
            stu = Student.query.filter_by(sid=link.sid).first()
            stu_id = stu.sid
            stu_name = stu.sfirstname + ' ' + stu.slastname
            checkin_time = ''
            checkout_time = ''
            additional = ''
            status = 'No'
            date = datetime.datetime.now(timezone('US/Pacific'))
            date = date.date()
            exsiting = Attendance.query.filter_by(stu_id=stu_id,
                                                  course_id=cid,
                                                  date=date).first()
            if exsiting is not None:
                db.session.delete(exsiting)
                db.session.commit()
            newatt = Attendance(checkin_time, checkout_time, date, status,
                                stu_name, stu_id, course_code, cid, additional)

            db.session.add(newatt)
            db.session.commit()

        context = buildqrjson(True, form.time.data, course_code, course_name)
        return render_template('qr.html', qrStr=context)
    return render_template('checkin.html', form=form)
Ejemplo n.º 18
0
def attendanceRecord(unit_id):
    cam = cv2.VideoCapture(0)
    rec = cv2.face.createLBPHFaceRecognizer()
    rec.load('trainer/trainingdata.yml')
    font = cv2.FONT_HERSHEY_COMPLEX
    start_time = time.time()
    while (True):
        date_string = time.strftime('%Y-%m-%d-%H:%M')
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = faceDetect.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
            id, conf = rec.predict(gray[y:y + h, x:x + w])
            print('Predicted Id = ', id, ' ', conf)
            profile = getProfile(id)
            if (profile != None):
                cv2.putText(img, profile.first_name, (x, y + h + 20), font, 1,
                            (0, 255, 0))
                print(profile.first_name)
                now = time.time()
                if (now - start_time) < LESSON_TIME:
                    if not LESSON_STUDENTS.get(profile.id, None):
                        LESSON_STUDENTS[profile.id] = profile.first_name
                        attendance = Attendance(unit_id=unit_id,
                                                student_id=profile.id)
                        db_session.add(attendance)
                        db_session.commit()
                    else:
                        print('Student [%s] attendance recorded' % profile.id)

            else:

                cv2.putText(img, 'New Student', (x - 10, y - 10), font, 1,
                            (0, 255, 0))
            image_path = "output/User." + str(id) + "\t" + date_string + ".png"
            print(image_path)
            cv2.imwrite(image_path, img[y:y + h, x:x + w])
        cv2.imshow("face", img)
        if (cv2.waitKey(1) == ord('q')):
            break

    cam.release()
    cv2.destroyAllWindows()
Ejemplo n.º 19
0
def get_class(course_name, class_date):
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)
        file = request.files['file']
        # if user does not select file, browser also
        # submit an empty part without filename
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(os.getcwd() + '/' + app.config['UPLOAD_FOLDER'], filename))
            people_found = give_match(os.path.join(os.getcwd() + '/' + app.config['UPLOAD_FOLDER'], filename))
            username = session.get('username')
            teacher = Teacher.query.filter_by(username=username).first()
            course = Course.query.filter_by(teacher=teacher).filter_by(course_name=course_name).first()
            the_class = Class.query.filter_by(course=course).filter_by(date=class_date).first()
            for people in people_found:
                people = people.strip()
                print(people)
                student = Student.query.filter_by(full_name=people).first()
                if student:
                    attendance = Attendance(course.id, the_class.id, student.id, True)
                    db.session.add(attendance)
                    db.session.commit()
                else:
                    print('Student not detected')
            return redirect(request.url)
    else:
        if session.get('role') == 'teacher':
            username = session.get('username')
            teacher = Teacher.query.filter_by(username=username).first()
            course = Course.query.filter_by(teacher=teacher).filter_by(course_name=course_name).first()
            if course:
                the_class = Class.query.filter_by(course=course).filter_by(date=class_date).first()
                attendance = the_class.attendance
                return render_template('class.html', course=course, the_class=the_class, attendances=attendance)
            else:
                return abort(403)
        else:
            return abort(403)
Ejemplo n.º 20
0
def addattend():

    if request.method == 'POST':
        attend_time = datetime.now()
        mod_time = datetime.now()
        user = Users.query.filter_by(username=session['user']).first()
        course = Courses.query.filter_by(code=request.form['course']).first()
        section = Courses.query.filter_by(
            section=request.form['section']).first()
        key = request.form['key']
        print('user {} present in {}', user.id, course.id, course.section, key)

        #need to validate what the student submits based on what is registered in Courses. how to error handle (try-catch)

        # build the attendance record and write to db
        attendee = Attendance(attend_time, mod_time, user.id, course.id, key)
        db.session.add(attendee)
        db.session.commit()

    return redirect(url_for('home'))
Ejemplo n.º 21
0
  def get(self):
    user = users.get_current_user()
    authz = Authorize()
    if not authz.authorize():
      self.error(403)
      return
    self.response.headers['Content-Type'] = 'text/plain'
    class_id = self.request.get('class_id')
    class_key = ndb.Key('Class', int(class_id))
    the_class = class_key.get()
    enrolled = the_class.enrolled
    all_students = {}
    self.response.out.write(',')
    for student_key in enrolled:
      if student_key not in all_students:
        the_student = student_key.get()
        all_students[student_key] = the_student
        self.response.out.write('%s %s,' % (the_student.first_name, the_student.last_name))
    self.response.out.write('\n')

    qry = Attendance.query(ancestor=class_key).order(Attendance.key)
    attendance = qry.fetch(200)
    for the_attendance in attendance:
      the_attendance_key = the_attendance.key
      date_ordinal = the_attendance_key.id()
      date_struct = datetime.date.fromordinal(int(date_ordinal))
      date_str = date_struct.isoformat()
      self.response.out.write('%s,' % (date_str))
      students = the_attendance.attending
      attending_students = {}
      for student in students:
        student_key = student.student
        attending_students[student_key] = student.hours
      for the_enrolled in enrolled:
        if the_enrolled in attending_students:
          output = attending_students[the_enrolled]
          if not output: output = 1
          self.response.out.write('%s,' % (output))
        else:
          self.response.out.write(',')
      self.response.out.write('\n')
Ejemplo n.º 22
0
def processPhoto():
    if request.method == 'GET':
        att_list = []

        today = date.today()
        start_date = datetime(year=today.year,
                              month=today.month,
                              day=today.day,
                              hour=0,
                              minute=0,
                              second=0,
                              microsecond=0)
        end_date = datetime(year=today.year,
                            month=today.month,
                            day=today.day,
                            hour=23,
                            minute=59,
                            second=59,
                            microsecond=59)

        class_photos = Photo.query.filter(
            Photo.week == 1, Photo.timestamp >= start_date,
            Photo.timestamp <= end_date).all()[-1]

        image = class_photos.serialize()
        path = './app_storage/' + image['img_filename']
        print(path)
        class_photo = face_recognition.load_image_file(path)
        face_encodings_class = face_recognition.face_encodings(class_photo,
                                                               num_jitters=2)

        returned_students = Student.query.filter_by(student_section='G1')
        for student in returned_students:
            student = student.serialize()
            face_encoding_student = student['encodings']
            face_encoding_student = literal_eval(face_encoding_student)
            face_encoding_student = np.asarray(face_encoding_student)
            results = face_recognition.compare_faces(face_encodings_class,
                                                     face_encoding_student,
                                                     tolerance=0.4)
            print(results)
            name = student['name']
            if True in results:
                att_list.append({'name': name, 'attendance': 'present'})
                stu_id = Student.query.filter_by(
                    student_name=name).first().student_id
                if id is not None:
                    new_attendance = Attendance(student_id=stu_id,
                                                present=1,
                                                timestamp=datetime.now())
                    db.session.add(new_attendance)
                    db.session.commit()
            else:
                att_list.append({'name': name, 'attendance': 'absent'})
                stu_id = Student.query.filter_by(
                    student_name=name).first().student_id
                if id is not None:
                    new_attendance = Attendance(student_id=stu_id,
                                                present=0,
                                                timestamp=datetime.now())
                    db.session.add(new_attendance)
                    db.session.commit()

        return render_template('displayer.html', att_list=att_list)
Ejemplo n.º 23
0
def attendance_1(student_id, group_id):
    user = get_current_user()
    teacher = get_current_teacher()
    try:
        if not teacher:
            return redirect(url_for('home'))
    except AttributeError:
        return redirect(url_for('home'))
    if request.method == 'POST':
        query = Student.query.filter_by(attendance=True).first()
        query2 = Groups.query.filter_by(id=group_id).first()
        group = Groups.query.filter(
            or_(Groups.id == query.group1, Groups.id == query.group2,
                Groups.id == query.group3)).first()
        query_teacher = Teachers.query.filter_by(id=group.teacher_1).first()
        query_teacher1 = Teachers.query.filter_by(id=teacher.id).first()
        slesh = group.cost / 13 + query.charity
        boluv = slesh / 2
        if query_teacher.salary is None:
            salery = boluv
        else:
            salery = query_teacher.salary + boluv
        if query.money is None:
            plus2 = -slesh
        else:
            plus2 = query.money - slesh
        get_date = datetime.now()
        if teacher.subject == 'Ingliz tili' or teacher.subject == 'Rus tili':
            get_homework = int(request.form.get('homework'))
            get_dictonary = int(request.form.get('dictionary'))
            get_class_activity = int(request.form.get('active'))
            plus1 = get_homework + get_dictonary + get_class_activity
            boluv2 = plus1 / 3
            add = Attendance(group_id=group_id,
                             student_id=student_id,
                             teacher_id=teacher.id,
                             darsga_tayyorgarligi=get_homework,
                             lugat=get_dictonary,
                             darsda_qatnashishi=get_class_activity,
                             ortacha_baho=boluv2,
                             present=get_date,
                             fan=group.subject,
                             apset=None)
            db.session.add(add)
            db.session.commit()
            print(teacher.subject)
        elif teacher.subject == 'Matematika' or teacher.subject == 'Tarix' or \
                teacher.subject == 'Fizika' or teacher.subject == 'Ona tili va Adabiyot' \
                or teacher.subject == 'Biologiya':
            get_homework2 = int(request.form.get('homework'))
            get_class_activity2 = int(request.form.get('active'))
            plus3 = get_homework2 + get_class_activity2
            boluv3 = plus3 / 2
            add2 = Attendance(group_id=group_id,
                              student_id=student_id,
                              teacher_id=teacher.id,
                              darsga_tayyorgarligi=get_homework2,
                              darsda_qatnashishi=get_class_activity2,
                              ortacha_baho=boluv3,
                              lugat=0,
                              present=get_date,
                              fan=group.subject,
                              apset=None)
            db.session.add(add2)
            db.session.commit()
            print(teacher.subject)
        Student.query.filter_by(attendance=True).update({
            'money': plus2,
            'attendance': False
        })
        Teachers.query.filter_by(id=group.teacher_1).update({'salary': salery})
        db.session.commit()
        query_charity = All_Charity_Sums.query.order_by('bank_charity').first()

        plus_charity = query_charity.bank_charity + query.charity
        All_Charity_Sums.query.update({'bank_charity': plus_charity})
        db.session.commit()

        if query2.id == query_teacher1.group1:
            return redirect(url_for('my_group1'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group2'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group3'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group4'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group5'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group6'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group7'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group8'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group9'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group10'))
    groups = Groups.query.filter_by(teacher_1=teacher.id).all()
    for i in groups:
        student = Student.query.filter(
            or_(Student.group1 == i.id, Student.group2 == i.id,
                Student.group3 == i.id))
        return render_template('Teacher/my groups.html',
                               user=user,
                               teacher=teacher,
                               groups=groups,
                               students=student)

    return render_template('Teacher/my groups.html',
                           user=user,
                           teacher=teacher,
                           groups=groups)
Ejemplo n.º 24
0
def attendance_3(student_id, group_id):
    user = get_current_user()
    teacher = get_current_teacher()
    try:
        if not teacher:
            return redirect(url_for('home'))
    except AttributeError:
        return redirect(url_for('home'))
    if request.method == 'POST':
        query2 = Groups.query.filter_by(id=group_id).first()
        query = Student.query.filter_by(id=student_id).first()
        group = Groups.query.filter(
            or_(Groups.id == query.group1, Groups.id == query.group2,
                Groups.id == query.group3)).first()
        query_teacher1 = Teachers.query.filter_by(id=teacher.id).first()
        query_teacher = Teachers.query.filter_by(id=group.teacher_1).first()
        slesh = group.cost / 13
        boluv = slesh / 2
        salery = query_teacher.salary + boluv
        plus = query.money - slesh + query.charity
        get_date = datetime.now()
        Student.query.filter_by(id=student_id).update({'money': plus})
        Teachers.query.filter_by(id=group.teacher_1).update({'salary': salery})
        db.session.commit()
        add = Attendance(group_id=group.id,
                         student_id=student_id,
                         teacher_id=teacher.id,
                         present=None,
                         apset=get_date)
        db.session.add(add)
        db.session.commit()
        query_charity = All_Charity_Sums.query.order_by('id').first()

        plus_charity = query_charity.bank_charity + query.charity
        All_Charity_Sums.query.update({'bank_charity': plus_charity})
        db.session.commit()
        if query2.id == query_teacher1.group1:
            return redirect(url_for('my_group1'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group2'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group3'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group4'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group5'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group6'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group7'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group8'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group9'))
        elif query2.id == query_teacher1.group1:
            return redirect(url_for('my_group10'))
    groups = Groups.query.filter_by(teacher_1=teacher.id).all()
    for i in groups:
        student = Student.query.filter(
            or_(Student.group1 == i.id, Student.group2 == i.id,
                Student.group3 == i.id))
        return render_template('Teacher/my groups.html',
                               user=user,
                               teacher=teacher,
                               groups=groups,
                               students=student)

    return render_template('Teacher/my groups.html',
                           user=user,
                           teacher=teacher,
                           groups=groups)
Ejemplo n.º 25
0
  def get(self):
    # authorize web requests
    user = users.get_current_user()
    authz = Authorize()
    if not authz.authorize():
      self.error(403)
      return
    # get the form input
    yes = int(self.request.get('yes'))
    class_id = self.request.get('class_id')
    student_id = self.request.get('student_id')
    if student_id:
      student_key = ndb.Key('Student', int(student_id))
      student = student_key.get()
    date_ordinal = self.request.get('date')
    date_struct = datetime.date.fromordinal(int(date_ordinal))
    class_key = ndb.Key('Class', int(class_id))
    the_class = class_key.get()
    hours = self.request.get('hours')
    today_as_ordinal = self.today_as_ordinal(the_class.timezone)
    # can only edit attendance for today
    attendance = None
    if int(date_ordinal) == today_as_ordinal:
      attendance_key = ndb.Key('Class', int(class_id), 'Attendance', int(date_ordinal))
      attendance = attendance_key.get()
      attendance_already_exists = False
      try:
        if attendance:
          attendance_already_exists = True
          if yes:
            if student_id:
              self.add_student(student_key, hours, attendance.attending)
            else:
              students = ndb.get_multi(the_class.enrolled)
              for student in students:
                self.add_student(student.key, hours, attendance.attending)
          else:
            self.remove_student(student_key, attendance.attending)
        else:
          if yes:
            attendance = Attendance(key=attendance_key, attending=[])
            if student_id:
              self.add_student(student_key, hours, attendance.attending)
            else:
              students = ndb.get_multi(the_class.enrolled)
              for student in students:
                self.add_student(student.key, hours, attendance.attending)

      except ValueError:
        # hours was not a float
        self.redirect('/students?class_id=%s&date=%s&errmsg=Invalid%%20value%%20for%%20hours' % (class_id, date_ordinal))
        return
    if attendance:
      if yes:
        status = "present"
      else:
        status = "absent"
      logging.info('Change by %s: %s %s marked as %s for %s (hours: %s)' % 
                   (authz.get_name(), student.first_name, student.last_name, status, the_class.name, hours))
      attendance.put()
    elif attendance_already_exists:
      attendance_key.delete()
    self.redirect('/students?class_id=%s&date=%s' % (class_id, date_ordinal))
Ejemplo n.º 26
0
        try:
            group = Group.objects.get(id=group_id)
        except DoesNotExist:
            raise ValidationError("Group Id is invalid: %s" % group_id)
        attendance_objs = []
        for student_id, is_present in attendance_data.items():

            if is_present not in VALID_ATTENDANCE_TYPES:
                raise ValidationError("Invalid attendance type : %s " %(attendance_data))
            try:
                student = User.objects.get(id=student_id)
            except DoesNotExist, ex:
                raise DoesNotExist("Student id does not exist: %s" % student_id)

            attendance_objs.append(Attendance(student=student, present=int(is_present)))

            for parent_id in student.parent_ids:
                QueueRequests.enqueue(NOTIFICATION_QUEUE, {'id': parent_id, 'name': student.name})

        try:
            Attendance.objects.insert(attendance_objs)
        except Exception, ex:
            logger.error("Error occurred while saving the attendance doc: %s, data: %s, group_id:%s" % (str(ex), attendance_data, group_id))
            raise APIException("Error while saving data")
        return JSONResponse({"stat": "ok"})


class GroupView(APIView):

    #@authenticate_user
Ejemplo n.º 27
0
def update_records(request, lms_id):
    if request.method == 'POST':
        student = Student.objects.get(lmsId=lms_id)

        status = ""

        # Logging In
        s = requests.session()
        login_url = 'http://lms.bml.edu.in/login/index.php'
        dash_url = 'http://lms.bml.edu.in/local/dashboard/index.php'

        year = student.lmsId.split('.')[2][:2]

        print '-' * 103
        print 'Name : ' + student.lmsId.split(
            '.')[0].title() + ' ' + student.lmsId.split('.')[1].title()
        print 'Year : ' + str(year)
        print 'Batch: ' + student.lmsId.split('.')[2][2:].upper()

        sem = 'Sem I'

        login = s.get(login_url)
        login_html = lxml.html.fromstring(login.content)
        hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]')
        form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
        form['username'] = student.lmsId
        form['password'] = decode(student.password)
        response = s.post(login_url, data=form)

        print '-' * 103
        if response.url == dash_url:
            status = "Login Succees!"
            print status
        else:
            status = 'Could Not Login! Check Details!'
            print status
            return render(request, "attendance/error.html", {})

        # Searching for attendance link
        res_html = lxml.html.fromstring(response.content)
        res_links = res_html.xpath('//a[@class="btn-block "]/@href')
        attendance_link = ''

        for i in range(len(res_links)):
            if 'http://lms.bml.edu.in/mod/attendance/myattendance.php?studentid' in res_links[
                    i]:
                attendance_link = res_links[i]

        # Extracting info from Attendance Page
        attendance_page = s.get(attendance_link)
        attendance_html = lxml.html.fromstring(attendance_page.content)
        subjects = attendance_html.xpath('//a[@class="panel-title"]/text()')
        total_classes = attendance_html.xpath(
            '//div[@class="attendance-report-wrapper"]/div[2]/table[1]/tbody[1]/tr[1]/td[1]/text()'
        )
        present = attendance_html.xpath(
            '//div[@class="attendance-report-wrapper"]/div[2]/table[1]/tbody[1]/tr[1]/td['
            '2]/text()')
        absent = attendance_html.xpath(
            '//div[@class="attendance-report-wrapper"]/div[2]/table[1]/tbody[1]/tr[1]/td['
            '3]/text()')

        sem_subjects = []

        sub_array = []
        # Formatting Subjects
        for i in range(len(subjects)):
            sem_subjects += [i]
            num = -1
            if "SEM VI" in subjects[i]:
                num = 6
                print "Found 6 sem" + subjects[i]
            elif "SEM V" in subjects[i]:
                num = 5
            elif "SEM IV" in subjects[i]:
                num = 4
            elif "SEM III" in subjects[i]:
                num = 3
            elif "SEM II" in subjects[i]:
                num = 2
            elif "Sem II" in subjects[i]:
                num = 2
            elif "SEM I" in subjects[i]:
                num = 1
            elif "Sem I" in subjects[i]:
                num = 1

            temp = subjects[i].split(':')
            if len(temp) > 1:
                try:
                    subjects[i] = temp[2].strip()[:-12]
                except IndexError:
                    subjects[i] = subjects[i].strip()

            else:
                subjects[i] = temp[0].split('-')[0]
            sub_array.append({'name': subjects[i], 'sem': num})

        k = 0
        subjects_array = []
        for subject in sub_array:
            try:
                test = Subjects.objects.get(name=subject['name'])
            except Exception:
                test = Subjects(name=subject['name'], sem=subject['sem'])
                test.save()
                pass
            k += 1
            subjects_array.append(test)

        # Printing Details
        print '-' * 103
        print '{0:50}||{1:5}|{2:7}|{3:6}|{4:7}|{5:6}|{6:6}| Set ah? '.format(
            'Course', 'Total', 'Present', 'Absent', '   %', 'For 80', 'For 75')
        print '-' * 103

        for i in range(len(sem_subjects)):
            k = sem_subjects[i]

            if total_classes[k] != '0':
                perc = (float(present[k])) / float(total_classes[k]) * 100
            else:
                perc = -1

            comment = ''
            if perc >= 80:
                comment = '{0:6}|{1:6}| SET!'.format('  SET', '  SET')
            elif perc == -1:
                perc = 0
                comment = '{0:6}|{1:6}| SET!'.format('  SET', '  SET')
            elif perc >= 75:
                classes80 = int(absent[k]) * 5 - int(total_classes[k])
                comment = '{0:4d}  |{1:6}| uh?'.format(classes80, '  SET')
            else:
                classes80 = int(absent[k]) * 5 - int(total_classes[k])
                classes75 = int(absent[k]) * 4 - int(total_classes[k])
                comment = '{0:4d}  |{1:4d}  | Dhadel!'.format(
                    classes80, classes75)

            print u'{0:50}||{1:4d} |{2:5d}  |{3:4d}  |{4:6.2f}%|{5:15}'.format(
                subjects[k], int(total_classes[k]), int(present[k]),
                int(absent[k]), float(perc), comment)

            try:
                temp = Attendance.objects.filter(
                    student__lmsId=student.lmsId).get(
                        subject__name=subjects[k])
                # print temp
                temp.present_class = present[k]
                temp.absent_class = absent[k]
                temp.total_class = total_classes[k]
                temp.for75 = int(absent[k]) * 4 - int(total_classes[k])
                temp.for80 = int(absent[k]) * 5 - int(total_classes[k])
                temp.save()
            except Exception:
                temp = Attendance(
                    student=student,
                    subject=subjects_array[k],
                    present_class=present[k],
                    absent_class=absent[k],
                    total_class=total_classes[k],
                    for75=int(absent[k]) * 4 - int(total_classes[k]),
                    for80=int(absent[k]) * 5 - int(total_classes[k]))
                temp.save()

        print '-' * 103
        student.last_updated = timezone.now()
        student.cur_sem = max(list_of_sems(student))
        print student.name + " --------- " + str(student.cur_sem)
        student.save()
        print student.last_updated
        # Loggin Out
        page_html = lxml.html.fromstring(response.content)
        logout = page_html.xpath(r'//a[@title = "Log out"]/@href')
        response = s.post(logout[0])
        if response.url == 'http://lms.bml.edu.in/':
            status = 'Logout Success!'
            print status
        else:
            status = 'Logout Failed!'
            print status
        print '-' * 103

        return redirect('/attendance/' + student.lmsId + "/" +
                        str(student.cur_sem) + "/#focus")
    return HttpResponse("Failure!")
Ejemplo n.º 28
0
def set_attendance_status_daily(date=""):
    """ A function that runs once a day, in order to set user's attendance attendance

    If user has checked out, set_attendance_status_on_check_out should be called.
    So this function should deal with illegal attendance, such as no_check_out, no_attendance_today, etc.
    """
    if not date:
        date = datetime.datetime.now().strftime("%Y-%m-%d")

    the_date = datetime.datetime.strptime(date, "%Y-%m-%d")

    default_check_time = datetime.datetime.strptime("{date}".format(date=date), "%Y-%m-%d")

    session = DB_Session()
    users = session.query(User).filter(
        User.is_present == 1,
        User.is_admin == 0
    ).order_by(User.id).all()

    for user in users:
        try:
            # 用户当天有打卡记录,说明来打过上班卡
            attendance = session.query(Attendance).filter(
                Attendance.userid == user.id,
                Attendance.date == date
            ).one()
            if attendance.attendance_status == 1:
                # 状态为待定,说明还没打下班卡
                attendance.check_out = default_check_time
                attendance.is_maintainable = 2
                if the_date.weekday() in [5, 6]:
                    # 周末加班忘打下班卡……
                    # 只能算作没加班了……
                    # ╮(╯▽╰)╭
                    attendance.attendance_status = 2
                else:
                    attendance.attendance_status = 9
            else:
                # 用户的状态已经计算过了,忽略
                pass
        except sqlalchemy.orm.exc.NoResultFound:
            # 没有找到用户当天的打卡记录
            # 需要强势插入一条记录!
            legal_check_in = datetime.datetime.strptime(
                "{date} {time}".format(date=date, time=user.banci), "%Y-%m-%d %H:%M"
            )
            legal_check_out = legal_check_in + datetime.timedelta(hours=9)
            attendance = Attendance(
                userid=user.id,
                legal_check_in=legal_check_in,
                legal_check_out=legal_check_out,
                date=date,
                check_in=default_check_time,
                check_out=default_check_time,
                updatetime=datetime.datetime.now()
            )
            if the_date.weekday() in [5, 6]:
                # 周末未打卡,正常
                attendance.is_maintainable = 1
                attendance.attendance_status = 2
            else:
                # 工作日未打卡,得多大心啊...
                attendance.is_maintainable = 2
                attendance.attendance_status = 9
            session.add(attendance)
        except sqlalchemy.orm.exc.MultipleResultsFound:
            # 找到当天有多条打卡记录
            # todo
            pass

    session.commit()
    session.close()