def profile(self, request, tl, one, two, module, extra, prog): """ Display the registration profile page, the page that contains the contact information for a student, as attached to a particular program """ from esp.web.views.myesp import profile_editor # Check user role. Some users may have multiple roles; if one of them # is 'student' or 'teacher' then use that to set up the profile. # Otherwise, make a wild guess. user_roles = request.user.getUserTypes() user_roles = [x.lower() for x in user_roles] if 'teacher' in user_roles or 'student' in user_roles: role = {'teach': 'teacher','learn': 'student'}[tl] else: role = user_roles[0] # Reset e-mail address for program registrations. if prog is None: regProf = RegistrationProfile.getLastProfile(request.user) else: regProf = RegistrationProfile.getLastForProgram(request.user, prog) # aseering 8/20/2007: It is possible for a user to not have a # contact_user associated with their registration profile. # Deal nicely with this. if hasattr(regProf.contact_user, 'e_mail'): regProf.contact_user.e_mail = '' regProf.contact_user.save() response = profile_editor(request, prog, False, role) if response == True: return self.goToCore(tl) return response
def testGradeChange(self): # Create the admin user adminUser, c1 = ESPUser.objects.get_or_create(username='******') adminUser.set_password('password') adminUser.makeAdmin() # Create the student user studentUser, c2 = ESPUser.objects.get_or_create(username='******') # Make it a student studentUser.makeRole("Student") # Give it a starting grade student_studentinfo = StudentInfo(user=studentUser, graduation_year=ESPUser.YOGFromGrade(9)) student_studentinfo.save() student_regprofile = RegistrationProfile(user=studentUser, student_info=student_studentinfo, most_recent_profile=True) student_regprofile.save() # Check that the grade starts at 9 self.assertTrue(studentUser.getGrade() == 9) # Login the admin self.assertTrue(self.client.login(username="******", password="******")) testGrade = 11 curYear = ESPUser.current_schoolyear() gradYear = curYear + (12 - testGrade) self.client.get("/manage/userview?username=student&graduation_year="+str(gradYear)) self.assertTrue(studentUser.getGrade() == testGrade, "Grades don't match: %s %s" % (studentUser.getGrade(), testGrade)) # Clean up if (c1): adminUser.delete() if (c2): studentUser.delete()
def testGradeChange(self): # Create the admin user adminUser, c1 = ESPUser.objects.get_or_create(username='******') adminUser.set_password('password') make_user_admin(adminUser) # Create the student user studentUser, c2 = ESPUser.objects.get_or_create(username='******') # Make it a student role_bit, created = UserBit.objects.get_or_create(user=studentUser, qsc=GetNode('Q'), verb=GetNode('V/Flags/UserRole/Student'), recursive=False) # Give it a starting grade student_studentinfo = StudentInfo(user=studentUser, graduation_year=ESPUser.YOGFromGrade(9)) student_studentinfo.save() student_regprofile = RegistrationProfile(user=studentUser, student_info=student_studentinfo, most_recent_profile=True) student_regprofile.save() # Check that the grade starts at 9 self.failUnless(studentUser.getGrade() == 9) # Login the admin self.failUnless(self.client.login(username="******", password="******")) testGrade = 11 curYear = ESPUser.current_schoolyear() gradYear = curYear + (12 - testGrade) self.client.get("/manage/userview?username=student&graduation_year="+str(gradYear)) self.failUnless(studentUser.getGrade() == testGrade, "Grades don't match: %s %s" % (studentUser.getGrade(), testGrade)) # Clean up if (c1): adminUser.delete() if (c2): studentUser.delete()
def onConfirm(self, request): form = TextMessageForm(request.POST) student = request.user if form.is_valid() and len(form.cleaned_data['phone_number']) > 0: profile = RegistrationProfile.getLastForProgram(student, self.program) profile.text_reminder = True profile.save() profile.contact_user.phone_cell = form.cleaned_data['phone_number'] profile.contact_user.save() else: profile = RegistrationProfile.getLastForProgram(student, self.program) profile.text_reminder = False profile.save()
def get_msg_vars(self, user, key): user = ESPUser(user) if key == 'verifyemaillink': return 'http://esp.mit.edu/%s/%s/verify_email_code?code=%s' % \ ('teach', self.program.getUrlBase(), \ RegistrationProfile.getLastForProfile(user, self.program).emailverifycode) return ''
def prepare(self, context): context['textmessage_form'] = TextMessageForm() profile = RegistrationProfile.getLastForProgram(get_current_request().user, self.program) if profile.text_reminder is True: if profile.contact_user: context['textmessage_form'] = TextMessageForm(initial={'phone_number': profile.contact_user.phone_cell}) return context
def clean(self): super(StudentInfoForm, self).clean() cleaned_data = self.cleaned_data show_studentrep_application = Tag.getTag('show_studentrep_application') if show_studentrep_application and show_studentrep_application != "no_expl": expl = self.cleaned_data['studentrep_expl'].strip() if self.studentrep_error and self.cleaned_data[ 'studentrep'] and expl == '': raise forms.ValidationError( "Please enter an explanation if you would like to become a student rep." ) if not Tag.getTag('allow_change_grade_level'): user = self._user orig_prof = RegistrationProfile.getLastProfile(user) # If graduation year and dob were disabled, get old data. if (orig_prof.id is not None) and (orig_prof.student_info is not None): if not 'graduation_year' in cleaned_data: # Get rid of the error saying this is missing del self.errors['graduation_year'] if not 'dob' in cleaned_data: del self.errors['dob'] # Always use the old birthdate if it exists, so that people can't # use something like Firebug to change their age/grade cleaned_data[ 'graduation_year'] = orig_prof.student_info.graduation_year cleaned_data['dob'] = orig_prof.student_info.dob if Tag.getBooleanTag('require_school_field'): if not cleaned_data['k12school'] and not cleaned_data[ 'unmatched_school']: raise forms.ValidationError( "Please select your school from the dropdown list that appears as you type its name. You will need to click on an entry to select it. If you cannot find your school, please type in its full name and check the box below; we will do our best to add it to our database." ) return cleaned_data
def verify_email(self): import string import random from esp.users.models import PersistentQueryFilter from esp.dbmail.models import MessageRequest from django.template import loader symbols = string.ascii_uppercase + string.digits code = "".join([random.choice(symbols) for x in range(30)]) regProf = RegistrationProfile.getLastForProgram( get_current_request().user, self.program) if regProf.email_verified: return self.goToCore(tl) if request.method == 'POST' and request.POST.has_key('verify_me'): # create the variable modules variable_modules = { 'program': self.program, 'user': get_current_request().user } # get the filter object filterobj = PersistentQueryFilter.getFilterFromQ( Q(id=get_current_request().user.id), User, 'User %s' % get_current_request().user.username) newmsg_request = MessageRequest.createRequest( var_dict=variable_modules, subject='[ESP] Email Verification For esp.mit.edu', recipients=filterobj, sender='"MIT Educational Studies Program" <*****@*****.**>', creator=self, msgtext=loader.find_template_source('email/verify')[0]) newmsg_request.save() return render_to_response(self.baseDir() + 'emailsent.html', request, {}) return render_to_response(self.baseDir() + 'sendemail.html', request, {})
def register_student(self, request, tl, one, two, module, extra, prog): resp = HttpResponse(content_type='application/json') program = self.program success = False student = get_object_or_404(ESPUser,pk=request.POST.get("student_id")) registration_profile = RegistrationProfile.getLastForProgram(student, program) success = registration_profile.student_info is not None if success: registration_profile.save() for extension in ['paid','Attended','medical','liability','OnSite']: Record.createBit(extension, program, student) IndividualAccountingController.updatePaid(self.program, student, paid=True) json.dump({'status':success}, resp) return resp
def clean(self): super(StudentInfoForm, self).clean() cleaned_data = self.cleaned_data show_studentrep_application = Tag.getTag('show_studentrep_application') if show_studentrep_application and show_studentrep_application != "no_expl": expl = self.cleaned_data['studentrep_expl'].strip() if self.studentrep_error and self.cleaned_data['studentrep'] and expl == '': raise forms.ValidationError("Please enter an explanation if you would like to become a student rep.") if not Tag.getTag('allow_change_grade_level'): user = self._user orig_prof = RegistrationProfile.getLastProfile(user) # If graduation year and dob were disabled, get old data. if (orig_prof.id is not None) and (orig_prof.student_info is not None): if not 'graduation_year' in cleaned_data: # Get rid of the error saying this is missing del self.errors['graduation_year'] if not 'dob' in cleaned_data: del self.errors['dob'] # Always use the old birthdate if it exists, so that people can't # use something like Firebug to change their age/grade cleaned_data['graduation_year'] = orig_prof.student_info.graduation_year cleaned_data['dob'] = orig_prof.student_info.dob if Tag.getBooleanTag('require_school_field'): if not cleaned_data['k12school'] and not cleaned_data['unmatched_school']: raise forms.ValidationError("Please select your school from the dropdown list that appears as you type its name. You will need to click on an entry to select it. If you cannot find your school, please type in its full name and check the box below; we will do our best to add it to our database.") return cleaned_data
def profile_editor(request, prog_input=None, responseuponCompletion = True, role=''): """ Display the registration profile page, the page that contains the contact information for a student, as attached to a particular program """ from esp.users.models import K12School from esp.web.views.main import registration_redirect STUDREP_VERB = GetNode('V/Flags/UserRole/StudentRep') STUDREP_QSC = GetNode('Q') if prog_input is None: prog = None navnode = GetNode('Q/Web/myesp') else: prog = prog_input navnode = prog.anchor curUser = request.user context = {'logged_in': request.user.is_authenticated() } context['user'] = request.user context['program'] = prog curUser = ESPUser(curUser) curUser.updateOnsite(request) # Get the profile form from the user's type, although we need to handle # a couple of extra possibilities for the 'role' variable. user_types = ESPUser.getAllUserTypes() additional_types = [['', {'label': 'Not specified', 'profile_form': 'UserContactForm'}], ['Administrator', {'label': 'Administrator', 'profile_form': 'UserContactForm'}], ] additional_type_labels = [x[0] for x in additional_types] # Handle all-lowercase versions of role being passed in by calling title() user_type_labels = [x[0] for x in user_types] if role.title() in user_type_labels: target_type = user_types[user_type_labels.index(role.title())][1] else: target_type = additional_types[additional_type_labels.index(role.title())][1] mod = __import__('esp.users.forms.user_profile', (), (), target_type['profile_form']) FormClass = getattr(mod, target_type['profile_form']) context['profiletype'] = role if request.method == 'POST' and request.POST.has_key('profile_page'): form = FormClass(curUser, request.POST) # Don't suddenly demand an explanation from people who are already student reps if UserBit.objects.UserHasPerms(curUser, STUDREP_QSC, STUDREP_VERB): if hasattr(form, 'repress_studentrep_expl_error'): form.repress_studentrep_expl_error() if form.is_valid(): new_data = form.cleaned_data regProf = RegistrationProfile.getLastForProgram(curUser, prog) if regProf.id is None: old_regProf = RegistrationProfile.getLastProfile(curUser) else: old_regProf = regProf for field_name in ['address_zip','address_city','address_street','address_state']: if field_name in new_data and new_data[field_name] != getattr(old_regProf.contact_user,field_name,False): new_data['address_postal'] = '' if new_data['address_postal'] == '': new_data['address_postal'] = False regProf.contact_user = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_user, '', curUser) regProf.contact_emergency = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_emergency, 'emerg_') if new_data.has_key('dietary_restrictions') and new_data['dietary_restrictions']: regProf.dietary_restrictions = new_data['dietary_restrictions'] if role == 'student': regProf.student_info = StudentInfo.addOrUpdate(curUser, regProf, new_data) regProf.contact_guardian = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_guardian, 'guard_') elif role == 'teacher': regProf.teacher_info = TeacherInfo.addOrUpdate(curUser, regProf, new_data) elif role == 'guardian': regProf.guardian_info = GuardianInfo.addOrUpdate(curUser, regProf, new_data) elif role == 'educator': regProf.educator_info = EducatorInfo.addOrUpdate(curUser, regProf, new_data) blah = regProf.__dict__ regProf.save() curUser.first_name = new_data['first_name'] curUser.last_name = new_data['last_name'] curUser.email = new_data['e_mail'] curUser.save() if responseuponCompletion == True: return registration_redirect(request) else: return True else: # Force loading the school back in if possible... replacement_data = form.data.copy() try: replacement_data['k12school'] = form.fields['k12school'].clean(form.data['k12school']).id except: pass form = FormClass(curUser, replacement_data) else: if prog_input is None: regProf = RegistrationProfile.getLastProfile(curUser) else: regProf = RegistrationProfile.getLastForProgram(curUser, prog) if regProf.id is None: regProf = RegistrationProfile.getLastProfile(curUser) new_data = {} if curUser.isStudent(): new_data['studentrep'] = (UserBit.objects.filter(user = curUser, verb = STUDREP_VERB, qsc = STUDREP_QSC).count() > 0) new_data['first_name'] = curUser.first_name new_data['last_name'] = curUser.last_name new_data['e_mail'] = curUser.email new_data = regProf.updateForm(new_data, role) if request.session.has_key('birth_month') and request.session.has_key('birth_day'): new_data['dob'] = datetime.date(1994, int(request.session['birth_month']), int(request.session['birth_day'])) if request.session.has_key('school_id'): new_data['k12school'] = request.session['school_id'] # Set default values for state fields state_fields = ['address_state', 'emerg_address_state'] state_tag_map = {} for field in state_fields: state_tag_map[field] = 'local_state' form = FormClass(curUser, initial=new_data, tag_map=state_tag_map) context['request'] = request context['form'] = form return render_to_response('users/profile.html', request, navnode, context)
def onsite_create(self, request, tl, one, two, module, extra, prog): if request.method == 'POST': form = OnSiteRegForm(request.POST) if form.is_valid(): new_data = form.cleaned_data username = ESPUser.get_unused_username(new_data['first_name'], new_data['last_name']) new_user = ESPUser.objects.create_user(username = username, first_name = new_data['first_name'], last_name = new_data['last_name'], email = new_data['email']) self.student = new_user regProf = RegistrationProfile.getLastForProgram(new_user, self.program) contact_user = ContactInfo(first_name = new_user.first_name, last_name = new_user.last_name, e_mail = new_user.email, user = new_user) contact_user.save() regProf.contact_user = contact_user student_info = StudentInfo(user = new_user, graduation_year = ESPUser.YOGFromGrade(new_data['grade'], ESPUser.program_schoolyear(self.program))) try: if isinstance(new_data['k12school'], K12School): student_info.k12school = new_data['k12school'] else: if isinstance(new_data['k12school'], int): student_info.k12school = K12School.objects.get(id=int(new_data['k12school'])) else: student_info.k12school = K12School.objects.filter(name__icontains=new_data['k12school'])[0] except: student_info.k12school = None student_info.school = new_data['school'] if not student_info.k12school else student_info.k12school.name student_info.save() regProf.student_info = student_info regProf.save() if new_data['paid']: self.createBit('paid') self.updatePaid(True) else: self.updatePaid(False) self.createBit('Attended') if new_data['medical']: self.createBit('Med') if new_data['liability']: self.createBit('Liab') self.createBit('OnSite') new_user.groups.add(Group.objects.get(name="Student")) new_user.recoverPassword() return render_to_response(self.baseDir()+'reg_success.html', request, { 'student': new_user, 'retUrl': '/onsite/%s/classchange_grid?student_id=%s' % (self.program.getUrlBase(), new_user.id) }) else: form = OnSiteRegForm() return render_to_response(self.baseDir()+'reg_info.html', request, {'form':form})
def onsite_create(self, request, tl, one, two, module, extra, prog): if request.method == 'POST': form = OnSiteRegForm(request.POST) if form.is_valid(): new_data = form.cleaned_data username = ESPUser.get_unused_username(new_data['first_name'], new_data['last_name']) new_user = ESPUser(username = username, first_name = new_data['first_name'], last_name = new_data['last_name'], email = new_data['email'], is_staff = False, is_superuser = False) new_user.save() self.student = new_user regProf = RegistrationProfile.getLastForProgram(new_user, self.program) contact_user = ContactInfo(first_name = new_user.first_name, last_name = new_user.last_name, e_mail = new_user.email, user = new_user) contact_user.save() regProf.contact_user = contact_user student_info = StudentInfo(user = new_user, graduation_year = ESPUser.YOGFromGrade(new_data['grade'])) student_info.save() regProf.student_info = student_info regProf.save() if new_data['paid']: self.createBit('Paid') self.updatePaid(True) else: self.updatePaid(False) self.createBit('Attended') if new_data['medical']: self.createBit('MedicalFiled') if new_data['liability']: self.createBit('LiabilityFiled') self.createBit('OnSite') v = GetNode( 'V/Flags/UserRole/Student') ub = UserBit() ub.user = new_user ub.recursive = False ub.qsc = GetNode('Q') ub.verb = v ub.save() new_user.recoverPassword() return render_to_response(self.baseDir()+'reg_success.html', request, (prog, tl), { 'student': new_user, 'retUrl': '/onsite/%s/classchange_grid?student_id=%s' % (self.program.getUrlBase(), new_user.id) }) else: form = OnSiteRegForm() return render_to_response(self.baseDir()+'reg_info.html', request, (prog, tl), {'form':form, 'current_year':ESPUser.current_schoolyear()})
def isCompleted(self): regProf = RegistrationProfile.getLastForProgram(get_current_request().user, self.program) return regProf.id is not None
def prepare(self, context={}): from esp.program.controllers.studentclassregmodule import RegistrationTypeController as RTC verbs = RTC.getVisibleRegistrationTypeNames(prog=self.program) regProf = RegistrationProfile.getLastForProgram( get_current_request().user, self.program) timeslots = self.program.getTimeSlotList(exclude_compulsory=False) classList = ClassSection.prefetch_catalog_data( regProf.preregistered_classes(verbs=verbs)) prevTimeSlot = None blockCount = 0 if not isinstance(get_current_request().user, ESPUser): user = ESPUser(get_current_request().user) else: user = get_current_request().user is_onsite = user.isOnsite(self.program) scrmi = self.program.getModuleExtension('StudentClassRegModuleInfo') # Hack, to hide the Saturday night timeslots from grades 7-8 if not is_onsite and not user.getGrade() > 8: timeslots = [x for x in timeslots if x.start.hour < 19] # Filter out volunteer timeslots timeslots = [ x for x in timeslots if x.event_type.description != 'Volunteer' ] schedule = [] timeslot_dict = {} for sec in classList: # TODO: Fix this bit (it was broken, and may need additional queries # or a parameter added to ClassRegModuleInfo). show_changeslot = False # Get the verbs all the time in order for the schedule to show # the student's detailed enrollment status. (Performance hit, I know.) # - Michael P, 6/23/2009 # if scrmi.use_priority: sec.verbs = sec.getRegVerbs(user, allowed_verbs=verbs) for mt in sec.get_meeting_times(): section_dict = {'section': sec, 'changeable': show_changeslot} if mt.id in timeslot_dict: timeslot_dict[mt.id].append(section_dict) else: timeslot_dict[mt.id] = [section_dict] user_priority = user.getRegistrationPriorities( self.program, [t.id for t in timeslots]) for i in range(len(timeslots)): timeslot = timeslots[i] daybreak = False if prevTimeSlot != None: if not Event.contiguous(prevTimeSlot, timeslot): blockCount += 1 daybreak = True if timeslot.id in timeslot_dict: cls_list = timeslot_dict[timeslot.id] schedule.append( (timeslot, cls_list, blockCount + 1, user_priority[i])) else: schedule.append( (timeslot, [], blockCount + 1, user_priority[i])) prevTimeSlot = timeslot context['num_classes'] = len(classList) context['timeslots'] = schedule context['use_priority'] = scrmi.use_priority context['allow_removal'] = self.deadline_met('/Removal') return context
def onsite_create(self, request, tl, one, two, module, extra, prog): if request.method == 'POST': form = OnSiteRegForm(request.POST) if form.is_valid(): new_data = form.cleaned_data username = ESPUser.get_unused_username(new_data['first_name'], new_data['last_name']) new_user = ESPUser.objects.create_user( username=username, first_name=new_data['first_name'], last_name=new_data['last_name'], email=new_data['email']) self.student = new_user regProf = RegistrationProfile.getLastForProgram( new_user, self.program) contact_user = ContactInfo(first_name=new_user.first_name, last_name=new_user.last_name, e_mail=new_user.email, user=new_user) contact_user.save() regProf.contact_user = contact_user student_info = StudentInfo( user=new_user, graduation_year=ESPUser.YOGFromGrade( new_data['grade'], ESPUser.program_schoolyear(self.program))) try: if isinstance(new_data['k12school'], K12School): student_info.k12school = new_data['k12school'] else: if isinstance(new_data['k12school'], int): student_info.k12school = K12School.objects.get( id=int(new_data['k12school'])) else: student_info.k12school = K12School.objects.filter( name__icontains=new_data['k12school'])[0] except: student_info.k12school = None student_info.school = new_data[ 'school'] if not student_info.k12school else student_info.k12school.name student_info.save() regProf.student_info = student_info regProf.save() if new_data['paid']: self.createBit('paid') self.updatePaid(True) else: self.updatePaid(False) self.createBit('Attended') if new_data['medical']: self.createBit('Med') if new_data['liability']: self.createBit('Liab') self.createBit('OnSite') new_user.groups.add(Group.objects.get(name="Student")) new_user.recoverPassword() return render_to_response( self.baseDir() + 'reg_success.html', request, { 'student': new_user, 'retUrl': '/onsite/%s/classchange_grid?student_id=%s' % (self.program.getUrlBase(), new_user.id) }) else: form = OnSiteRegForm() return render_to_response(self.baseDir() + 'reg_info.html', request, {'form': form})
def prepare(self, context={}): from esp.program.controllers.studentclassregmodule import RegistrationTypeController as RTC verbs = RTC.getVisibleRegistrationTypeNames(prog=self.program) regProf = RegistrationProfile.getLastForProgram(get_current_request().user, self.program) timeslots = self.program.getTimeSlots(types=['Class Time Block', 'Compulsory']) classList = ClassSection.prefetch_catalog_data(regProf.preregistered_classes(verbs=verbs)) prevTimeSlot = None blockCount = 0 user = get_current_request().user is_onsite = user.isOnsite(self.program) scrmi = self.program.studentclassregmoduleinfo # Filter out volunteer timeslots timeslots = [x for x in timeslots if x.event_type.description != 'Volunteer'] schedule = [] timeslot_dict = {} for sec in classList: # Get the verbs all the time in order for the schedule to show # the student's detailed enrollment status. (Performance hit, I know.) # - Michael P, 6/23/2009 # if scrmi.use_priority: sec.verbs = sec.getRegVerbs(user, allowed_verbs=verbs) sec.verb_names = [v.name for v in sec.verbs] sec.is_enrolled = True if "Enrolled" in sec.verb_names else False # While iterating through the meeting times for a section, # we use this variable to keep track of the first timeslot. # In the section_dict appended to timeslot_dict, # we save whether or not this is the first timeslot for this # section. If it isn't, the student schedule will indicate # this, and will not display the option to remove the # section. This is to prevent students from removing what # they have mistaken to be duplicated classes from their # schedules. first_meeting_time = True for mt in sec.get_meeting_times().order_by('start'): section_dict = {'section': sec, 'first_meeting_time': first_meeting_time} first_meeting_time = False if mt.id in timeslot_dict: timeslot_dict[mt.id].append(section_dict) else: timeslot_dict[mt.id] = [section_dict] for i in range(len(timeslots)): timeslot = timeslots[i] daybreak = False if prevTimeSlot != None: if not Event.contiguous(prevTimeSlot, timeslot): blockCount += 1 daybreak = True if timeslot.id in timeslot_dict: cls_list = timeslot_dict[timeslot.id] doesnt_have_enrollment = not any(sec['section'].is_enrolled for sec in cls_list) schedule.append((timeslot, cls_list, blockCount + 1, doesnt_have_enrollment)) else: schedule.append((timeslot, [], blockCount + 1, False)) prevTimeSlot = timeslot context['num_classes'] = len(classList) context['timeslots'] = schedule context['use_priority'] = scrmi.use_priority context['allow_removal'] = self.deadline_met('/Removal') return context
def prepare(self, context={}): from esp.program.controllers.studentclassregmodule import RegistrationTypeController as RTC verbs = RTC.getVisibleRegistrationTypeNames(prog=self.program) regProf = RegistrationProfile.getLastForProgram( get_current_request().user, self.program) timeslots = self.program.getTimeSlots( types=['Class Time Block', 'Compulsory']) classList = ClassSection.prefetch_catalog_data( regProf.preregistered_classes(verbs=verbs)) prevTimeSlot = None blockCount = 0 user = get_current_request().user is_onsite = user.isOnsite(self.program) scrmi = self.program.studentclassregmoduleinfo # Filter out volunteer timeslots timeslots = [ x for x in timeslots if x.event_type.description != 'Volunteer' ] schedule = [] timeslot_dict = {} for sec in classList: # Get the verbs all the time in order for the schedule to show # the student's detailed enrollment status. (Performance hit, I know.) # - Michael P, 6/23/2009 # if scrmi.use_priority: sec.verbs = sec.getRegVerbs(user, allowed_verbs=verbs) sec.verb_names = [v.name for v in sec.verbs] sec.is_enrolled = True if "Enrolled" in sec.verb_names else False # While iterating through the meeting times for a section, # we use this variable to keep track of the first timeslot. # In the section_dict appended to timeslot_dict, # we save whether or not this is the first timeslot for this # section. If it isn't, the student schedule will indicate # this, and will not display the option to remove the # section. This is to prevent students from removing what # they have mistaken to be duplicated classes from their # schedules. first_meeting_time = True for mt in sec.get_meeting_times().order_by('start'): section_dict = { 'section': sec, 'first_meeting_time': first_meeting_time } first_meeting_time = False if mt.id in timeslot_dict: timeslot_dict[mt.id].append(section_dict) else: timeslot_dict[mt.id] = [section_dict] for i in range(len(timeslots)): timeslot = timeslots[i] daybreak = False if prevTimeSlot != None: if not Event.contiguous(prevTimeSlot, timeslot): blockCount += 1 daybreak = True if timeslot.id in timeslot_dict: cls_list = timeslot_dict[timeslot.id] doesnt_have_enrollment = not any(sec['section'].is_enrolled for sec in cls_list) schedule.append((timeslot, cls_list, blockCount + 1, doesnt_have_enrollment)) else: schedule.append((timeslot, [], blockCount + 1, False)) prevTimeSlot = timeslot context['num_classes'] = len(classList) context['timeslots'] = schedule context['use_priority'] = scrmi.use_priority context['allow_removal'] = self.deadline_met('/Removal') return context
def profile_editor(request, prog_input=None, responseuponCompletion = True, role=''): """ Display the registration profile page, the page that contains the contact information for a student, as attached to a particular program """ from esp.users.models import K12School from esp.web.views.main import registration_redirect if prog_input is None: prog = None else: prog = prog_input curUser = request.user context = {'logged_in': request.user.is_authenticated() } context['user'] = request.user context['program'] = prog curUser.updateOnsite(request) # Get the profile form from the user's type, although we need to handle # a couple of extra possibilities for the 'role' variable. user_types = ESPUser.getAllUserTypes() additional_types = [['', {'label': 'Not specified', 'profile_form': 'UserContactForm'}], ['Administrator', {'label': 'Administrator', 'profile_form': 'UserContactForm'}], ] additional_type_labels = [x[0] for x in additional_types] # Handle all-lowercase versions of role being passed in by calling title() user_type_labels = [x[0] for x in user_types] if role.title() in user_type_labels: target_type = user_types[user_type_labels.index(role.title())][1] else: target_type = additional_types[additional_type_labels.index(role.title())][1] mod = __import__('esp.users.forms.user_profile', (), (), target_type['profile_form']) FormClass = getattr(mod, target_type['profile_form']) context['profiletype'] = role if request.method == 'POST' and 'profile_page' in request.POST: form = FormClass(curUser, request.POST) # Don't suddenly demand an explanation from people who are already student reps if curUser.hasRole("StudentRep"): if hasattr(form, 'repress_studentrep_expl_error'): form.repress_studentrep_expl_error() if form.is_valid(): new_data = form.cleaned_data regProf = RegistrationProfile.getLastForProgram(curUser, prog) if regProf.id is None: old_regProf = RegistrationProfile.getLastProfile(curUser) else: old_regProf = regProf for field_name in ['address_zip','address_city','address_street','address_state']: if field_name in new_data and new_data[field_name] != getattr(old_regProf.contact_user,field_name,False): new_data['address_postal'] = '' if new_data['address_postal'] == '': new_data['address_postal'] = False regProf.contact_user = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_user, '', curUser) regProf.contact_emergency = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_emergency, 'emerg_') if new_data.get('dietary_restrictions'): regProf.dietary_restrictions = new_data['dietary_restrictions'] if role == 'student': regProf.student_info = StudentInfo.addOrUpdate(curUser, regProf, new_data) regProf.contact_guardian = ContactInfo.addOrUpdate(regProf, new_data, regProf.contact_guardian, 'guard_') elif role == 'teacher': regProf.teacher_info = TeacherInfo.addOrUpdate(curUser, regProf, new_data) elif role == 'guardian': regProf.guardian_info = GuardianInfo.addOrUpdate(curUser, regProf, new_data) elif role == 'educator': regProf.educator_info = EducatorInfo.addOrUpdate(curUser, regProf, new_data) blah = regProf.__dict__ regProf.save() curUser.first_name = new_data['first_name'] curUser.last_name = new_data['last_name'] curUser.email = new_data['e_mail'] curUser.save() if responseuponCompletion == True: return registration_redirect(request) else: return True else: # Force loading the school back in if possible... replacement_data = form.data.copy() try: replacement_data['k12school'] = form.fields['k12school'].clean(form.data['k12school']).id except: pass form = FormClass(curUser, replacement_data) else: if prog_input is None: regProf = RegistrationProfile.getLastProfile(curUser) else: regProf = RegistrationProfile.getLastForProgram(curUser, prog) if regProf.id is None: regProf = RegistrationProfile.getLastProfile(curUser) new_data = {} if curUser.isStudent(): new_data['studentrep'] = curUser.groups.filter(name="StudentRep").exists() new_data['first_name'] = curUser.first_name new_data['last_name'] = curUser.last_name new_data['e_mail'] = curUser.email new_data = regProf.updateForm(new_data, role) if regProf.student_info and regProf.student_info.dob: new_data['dob'] = regProf.student_info.dob # Set default values for state fields state_fields = ['address_state', 'emerg_address_state'] state_tag_map = {} for field in state_fields: state_tag_map[field] = 'local_state' form = FormClass(curUser, initial=new_data, tag_map=state_tag_map) context['request'] = request context['form'] = form return render_to_response('users/profile.html', request, context)