示例#1
0
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        # TODO:
        #    quarters should not be hardcoded 
        quarter_map = {1: 'Fall', 2: 'Winter', 3: 'Spring', 4: 'Summer'}
        quarter     = self.request.get('quarter')                              # try grabbing quarter/year from URL
        year        = self.request.get('year')

        if not quarter or not year:                                            # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:                                                       # if they don't exist there, redirect with error
                return self.redirect('/admin?message=Please set a current quarter and year')
            quarter,year = temp                                                    

        quarter,year      = int(quarter), int(year)
        active_students   = StudentModel.get_students_by_active_status(quarter, year).fetch()    
        inactive_students = StudentModel.get_students_by_active_status(quarter, year, active=False).fetch()
        active_num        = len(active_students)                            
        inactive_num      = len(inactive_students)

        template        = JINJA_ENV.get_template('/templates/admin_view.html')
        template_values = {                            
            'students':     sorted(active_students + inactive_students, key=lambda x: (x.lab, x.last_name)),
            'quarter_name': quarter_map[int(quarter)],
            'quarter':      int(quarter),
            'year':         int(year),
            'student_num':  active_num + inactive_num,
            'active_num':   active_num,
            'inactive_num': inactive_num,
            'user':         users.get_current_user(),
            'sign_out':     users.create_logout_url('/'),
            'message':      self.request.get('message'),
        }
        return self.response.write(template.render(template_values))        
示例#2
0
    def get(self):
        user = users.get_current_user()
        quarter = SettingModel.quarter()
        year = SettingModel.year()

        # grab message from URL, if it exists
        message = self.request.get('message')

        if (not quarter or not year) and not message:
            message = 'Please set a current year and quarter'

        template_values = {
            'message': message,
            'user': user,
            'sign_out': users.create_logout_url('/'),
            'quarter': quarter,
            'year': year,
        }

        self.session['quarter'] = quarter
        self.session['year'] = year

        if quarter and year:
            template_values['active_students'] = len(
                StudentModel.get_students_by_active_status(quarter,
                                                           year).fetch())
            template_values['inactive_students'] = len(
                StudentModel.get_students_by_active_status(
                    quarter, year, active=False).fetch())
            cur_assign = AssignmentModel.get_active_assign_with_latest_fade_in_date(
                quarter, year)

            if cur_assign:
                template_values['cur_assign'] = cur_assign
                # grab number of active partnerships for the current assignment
                template_values['assign_partners'] = len(
                    PartnershipModel.get_all_partnerships_for_assign(
                        quarter, year, cur_assign.number))
                eval_assign = AssignmentModel.get_active_assign_with_earliest_eval_due_date(
                    quarter, year)

                if eval_assign:
                    template_values['eval_assign'] = eval_assign
                    # grab number of evals for the current eval assignment
                    template_values['assign_eval'] = len(
                        EvalModel.get_all_evals_for_assign(
                            quarter, year, cur_assign.number).fetch())

        template = JINJA_ENV.get_template('/templates/admin.html')
        return self.response.write(template.render(template_values))
示例#3
0
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        # TODO:
        #    quarters should not be hardcoded
        quarter_map = {1: 'Fall', 2: 'Winter', 3: 'Spring', 4: 'Summer'}
        quarter = self.request.get(
            'quarter')  # try grabbing quarter/year from URL
        year = self.request.get('year')

        if not quarter or not year:  # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:  # if they don't exist there, redirect with error
                return self.redirect(
                    '/admin?message=Please set a current quarter and year')
            quarter, year = temp

        quarter, year = int(quarter), int(year)
        active_students = StudentModel.get_students_by_active_status(
            quarter, year).fetch()
        inactive_students = StudentModel.get_students_by_active_status(
            quarter, year, active=False).fetch()
        active_num = len(active_students)
        inactive_num = len(inactive_students)

        template = JINJA_ENV.get_template('/templates/admin_view.html')
        template_values = {
            'students':
            sorted(active_students + inactive_students,
                   key=lambda x: (x.lab, x.last_name)),
            'quarter_name':
            quarter_map[int(quarter)],
            'quarter':
            int(quarter),
            'year':
            int(year),
            'student_num':
            active_num + inactive_num,
            'active_num':
            active_num,
            'inactive_num':
            inactive_num,
            'user':
            users.get_current_user(),
            'sign_out':
            users.create_logout_url('/'),
            'message':
            self.request.get('message'),
        }
        return self.response.write(template.render(template_values))
示例#4
0
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        quarter     = self.request.get('quarter')                           # try grabbing quarter/year from URL
        year        = self.request.get('year')

        if not quarter or not year:                                         # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:                                                    # if they don't exist there, redirect with error
                return self.redirect('/admin?message=Please set a current quarter and year')
            quarter,year = temp

        quarter,year = int(quarter), int(year)
        view         = self.request.get('view')                             # check URL for 'view by' options (lab vs class)
        view         = view if view else 'class'

        if view == 'class':
            students = StudentModel.get_students_by_active_status(quarter, year).fetch()
        else:
            students = StudentModel.get_students_by_lab(quarter, year, int(view)).fetch()

        current_assign = AssignmentModel.get_active_assign_with_latest_fade_in_date(quarter, year)
        current_num    = 1 if not current_assign else current_assign.number

        template        = JINJA_ENV.get_template('/templates/admin_add_solo_partnership.html')
        template_values = {
            'students':    sorted(students, key=lambda x: x.last_name),
            'view':        str(view),
            'quarter':     quarter,
            'year':        year,
            'user':        users.get_current_user(),
            'sign_out':    users.create_logout_url('/'),
            'current_num': current_num,
            'num_labs':    SettingModel.num_labs() if SettingModel.num_labs() else 1,
        }
        return self.response.write(template.render(template_values))
    def get(self):
        user = users.get_current_user()
        quarter = SettingModel.quarter()
        year = SettingModel.year()

        # grab message from URL, if it exists
        message = self.request.get("message")

        if (not quarter or not year) and not message:
            message = "Please set a current year and quarter"

        template_values = {
            "message": message,
            "user": user,
            "sign_out": users.create_logout_url("/"),
            "quarter": quarter,
            "year": year,
        }

        self.session["quarter"] = quarter
        self.session["year"] = year

        if quarter and year:
            template_values["active_students"] = len(StudentModel.get_students_by_active_status(quarter, year).fetch())
            template_values["inactive_students"] = len(
                StudentModel.get_students_by_active_status(quarter, year, active=False).fetch()
            )
            cur_assign = AssignmentModel.get_active_assign_with_latest_fade_in_date(quarter, year)

            if cur_assign:
                template_values["cur_assign"] = cur_assign
                # grab number of active partnerships for the current assignment
                template_values["assign_partners"] = len(
                    PartnershipModel.get_all_partnerships_for_assign(quarter, year, cur_assign.number)
                )
                eval_assign = AssignmentModel.get_active_assign_with_earliest_eval_due_date(quarter, year)

                if eval_assign:
                    template_values["eval_assign"] = eval_assign
                    # grab number of evals for the current eval assignment
                    template_values["assign_eval"] = len(
                        EvalModel.get_all_evals_for_assign(quarter, year, cur_assign.number).fetch()
                    )

        template = JINJA_ENV.get_template("/templates/admin.html")
        return self.response.write(template.render(template_values))
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        # TODO:
        #    quarters should not be hardcoded 
        #    rethink logic
        quarter_map = {1: 'Fall', 2: 'Winter', 3: 'Spring', 4: 'Summer'}
        quarter     = self.request.get('quarter')                                   # try grabbing quarter/year from URL
        year        = self.request.get('year')

        if not quarter or not year:                                                 # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:                                                            # if they don't exist there, redirect with error
                return self.redirect('/admin?message=Please set a current quarter and year')
            quarter,year = temp                                                    

        quarter,year = int(quarter), int(year)
        view_by      = self.request.get('view_by')                                  # check URL for 'view by' options (lab vs class)
        view_by      = view_by if view_by else 1

        if view_by == 'class':                                                      # if user wants to view by class, or the view by option wasn't specified...
            students = StudentModel.get_students_by_active_status(quarter, year).fetch()              
        else:
            students = StudentModel.get_students_by_lab(quarter, year, int(view_by)).fetch()    

        all_partners = PartnershipModel.get_all_partnerships(quarter, year).fetch()                        
        last_assign  = AssignmentModel.get_assign_n(quarter, year, -1)                            
        last_num     = 1 if not last_assign else last_assign.number                      
        first_assign = AssignmentModel.get_assign_n(quarter, year, 0)                          
        first_num    = 0 if not first_assign else first_assign.number                 

        keys_to_students     = dict(map(lambda x: (x.key,x), students))            # map student objects to keys for easy, fast access from partnership objects
        keys_to_partnerships = keys_to_partners(all_partners)                      # map student keys to partnerships for easy, fast access

        # create mapping of student info to partnership info that the partnership template expects
        partnership_dict = student_info_to_partner_list(last_num, first_num, keys_to_partnerships, keys_to_students, students)
        partnership_dict = sorted(partnership_dict.items(), key=lambda x: (x[0][4], x[0][2]))
        num_labs         = SettingModel.num_labs()                                                    

        template_values = {                                                            
            'partnerships': partnership_dict,
            'view_by':      str(view_by),
            'year':         year,
            'quarter':      quarter,
            'num_labs':     num_labs if num_labs else 0,
            'last_num':     last_num,
            'first_num':    first_num,
            'user':         users.get_current_user(),
            'sign_out':     users.create_logout_url('/'),
        }
        template = JINJA_ENV.get_template('/templates/admin_partnerships.html')
        return self.response.write(template.render(template_values))                
示例#7
0
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        # TODO:
        #    quarters should not be hardcoded
        #    rethink logic
        quarter_map = {1: 'Fall', 2: 'Winter', 3: 'Spring', 4: 'Summer'}
        quarter     = self.request.get('quarter')                                   # try grabbing quarter/year from URL
        year        = self.request.get('year')

        if not quarter or not year:                                                 # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:                                                            # if they don't exist there, redirect with error
                return self.redirect('/admin?message=Please set a current quarter and year')
            quarter,year = temp

        quarter,year = int(quarter), int(year)
        view_by      = self.request.get('view_by')                                  # check URL for 'view by' options (lab vs class)
        view_by      = view_by if view_by else 1

        if view_by == 'class':                                                      # if user wants to view by class, or the view by option wasn't specified...
            students = StudentModel.get_students_by_active_status(quarter, year).fetch()
        else:
            students = StudentModel.get_students_by_lab(quarter, year, int(view_by)).fetch()

        all_partners = PartnershipModel.get_all_partnerships(quarter, year).fetch()
        last_assign  = AssignmentModel.get_assign_n(quarter, year, -1)
        last_num     = 1 if not last_assign else last_assign.number
        first_assign = AssignmentModel.get_assign_n(quarter, year, 0)
        first_num    = 0 if not first_assign else first_assign.number

        keys_to_students     = dict(map(lambda x: (x.key,x), students))            # map student objects to keys for easy, fast access from partnership objects
        keys_to_partnerships = keys_to_partners(all_partners)                      # map student keys to partnerships for easy, fast access

        # create mapping of student info to partnership info that the partnership template expects
        partnership_dict = student_info_to_partner_list(last_num, first_num, keys_to_partnerships, keys_to_students, students)
        partnership_dict = sorted(partnership_dict.items(), key=lambda x: (x[0][4], x[0][2]))
        num_labs         = SettingModel.num_labs()

        template_values = {
            'partnerships': partnership_dict,
            'view_by':      str(view_by),
            'year':         year,
            'quarter':      quarter,
            'num_labs':     num_labs if num_labs else 0,
            'last_num':     last_num,
            'first_num':    first_num,
            'user':         users.get_current_user(),
            'sign_out':     users.create_logout_url('/'),
        }
        template = JINJA_ENV.get_template('/templates/admin_partnerships.html')
        return self.response.write(template.render(template_values))
    def get(self):
        # pass map of quarter DB representations (ints) to string representation
        # TODO:
        #    quarters should not be hardcoded 
        quarter_map = {1: 'Fall', 2: 'Winter', 3: 'Spring', 4: 'Summer'}
        quarter     = self.request.get('quarter')                           # try grabbing quarter/year from URL
        year        = self.request.get('year')

        if not quarter or not year:                                         # if they don't exist, try grabbing from session
            temp = get_sess_vals(self.session, 'quarter', 'year')
            if not temp:                                                    # if they don't exist there, redirect with error
                return self.redirect('/admin?message=Please set a current quarter and year')
            quarter,year = temp                                                    

        quarter,year = int(quarter), int(year)
        view         = self.request.get('view')                             # check URL for 'view by' options (lab vs class)
        view         = view if view else 'class'

        if view == 'class':                                                            
            students = StudentModel.get_students_by_active_status(quarter, year).fetch()                
        else:
            students = StudentModel.get_students_by_lab(quarter, year, int(view)).fetch()        

        current_assign = AssignmentModel.get_active_assign_with_latest_fade_in_date(quarter, year)                         
        current_num    = 1 if not current_assign else current_assign.number           

        template        = JINJA_ENV.get_template('/templates/admin_add_partnership.html')
        template_values = {                                                            
            'students':    sorted(students, key=lambda x: x.last_name),
            'view':        str(view),
            'quarter':     quarter,
            'year':        year,
            'user':        users.get_current_user(),
            'sign_out':    users.create_logout_url('/'),
            'current_num': current_num,
            'num_labs':    SettingModel.num_labs() if SettingModel.num_labs() else 1,
        }
        return self.response.write(template.render(template_values))                
示例#9
0
    def post(self):
        try:
            file = self.request.get('the_file')
            file = file.strip().split('\n')

            quarter = int(self.request.get('quarter'))
            year = int(self.request.get('year'))
            num_labs = 0

            # students to be uploaded
            students = []
            # to check for duplicates in roster
            student_cache = set()

            # grab students in DB (active and not active)
            existing_students = StudentModel.get_students_by_active_status(
                quarter, year).fetch()
            existing_students += StudentModel.get_students_by_active_status(
                quarter, year, active=False).fetch()
            existing_students = dict(
                map(lambda x: (int(x.studentid), x), existing_students))

            for row in file:
                row = row.split(',')

                # save highest lab number found
                if int(row[5]) > num_labs:
                    num_labs = int(row[5])

                # grab student ID from current row of CSV roster
                studentid = int(row[0].strip())

                # if student w/ same studentid has already been found in roster, skip...
                if studentid in student_cache:
                    continue

                # ...else, add them to 'seen' cache
                student_cache.add(studentid)

                # if student in DB, skip to next student...
                if studentid in existing_students:
                    existing_student = existing_students[studentid]

                    # ...unless they're inactive; if so, activate them...
                    if not existing_student.active:
                        existing_student.active = True
                        students.append(existing_student)

                    # ...or if they've switched labs; if so, update lab num...
                    if existing_student.lab != int(row[5]):
                        existing_student.lab = int(row[5])
                        students.append(existing_student)

                    # ...to see which students have dropped the class, remove active students from existing_students
                    del existing_students[studentid]
                    # ...and continue to next student
                    continue

                # create student object
                student = Student()

                student.studentid = studentid
                student.last_name = row[1].strip().title()
                student.last_name = row[1].strip('"').title()
                student.first_name = row[2].strip().title()
                student.first_name = row[2].strip('"').title()
                student.ucinetid = row[3].lower().strip()
                student.email = row[4].lower().strip()
                if not student.email.endswith("@uci.edu"):
                    student.email = student.email + "@uci.edu"
                student.lab = int(row[5])
                student.quarter = quarter
                student.year = year
                student.active = True
                students.append(student)

            # deactivate students who have dropped (students left in existing_students)
            for dropped in existing_students.values():
                dropped.active = False
                students.append(dropped)

            # save student objects...
            ndb.put_multi(students)
            # ...save num_labs...
            setting = Setting.query().get()
            setting = setting if setting else Setting()
            setting.num_labs = num_labs
            setting.put()
            # ...and render the response
            return self.redirect('/admin/roster/view?message=' +
                                 'Successfully uploaded new roster')

        except Exception, e:
            return self.redirect('/admin?message=' +
                                 'There was a problem uploading the roster: ' +
                                 str(e))
示例#10
0
    def post(self):
        try:
            file = self.request.get('the_file')                               
            file = file.strip().split('\n')                                    

            quarter  = int(self.request.get('quarter'))                       
            year     = int(self.request.get('year'))
            num_labs = 0
            
            # students to be uploaded 
            students = []
            # to check for duplicates in roster
            student_cache = set()

            # grab students in DB (active and not active) 
            existing_students  = StudentModel.get_students_by_active_status(quarter, year).fetch()    
            existing_students += StudentModel.get_students_by_active_status(quarter, year, active=False).fetch()
            existing_students  = dict(map(lambda x: (int(x.studentid), x), existing_students))

            for row in file:
                row = row.split(',')

                # save highest lab number found
                if int(row[5]) > num_labs:
                    num_labs = int(row[5])

                # grab student ID from current row of CSV roster
                studentid = int(row[0].strip())

                # if student w/ same studentid has already been found in roster, skip...
                if studentid in student_cache:
                    continue

                # ...else, add them to 'seen' cache
                student_cache.add(studentid)

                # if student in DB, skip to next student...
                if studentid in existing_students:
                    existing_student = existing_students[studentid]

                    # ...unless they're inactive; if so, activate them...
                    if not existing_student.active:
                        existing_student.active = True
                        students.append(existing_student)

                    # ...or if they've switched labs; if so, update lab num...
                    if existing_student.lab != int(row[5]):
                        existing_student.lab = int(row[5])
                        students.append(existing_student)

                    # ...to see which students have dropped the class, remove active students from existing_students
                    del existing_students[studentid]
                    # ...and continue to next student
                    continue

                # create student object
                student = Student()

                student.studentid  = studentid
                student.last_name  = row[1].strip().title()
                student.last_name  = row[1].strip('"').title()
                student.first_name = row[2].strip().title()
                student.first_name = row[2].strip('"').title()
                student.ucinetid   = row[3].lower().strip()
                student.email      = row[4].lower().strip()
                student.lab        = int(row[5])
                student.quarter    = quarter
                student.year       = year
                student.active     = True
                students.append(student)

            # deactivate students who have dropped (students left in existing_students)
            for dropped in existing_students.values():
                dropped.active = False
                students.append(dropped)

            # save student objects...
            ndb.put_multi(students)
            # ...save num_labs...
            setting = Setting.query().get()
            setting = setting if setting else Setting()
            setting.num_labs = num_labs
            setting.put()
            # ...and render the response
            return self.redirect('/admin/roster/view?message=' + 'Successfully uploaded new roster')            

        except Exception, e:
            return self.redirect('/admin?message=' + 'There was a problem uploading the roster: ' + str(e))