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))
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 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))
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))
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))
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))
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))