def registration_redirect(request): """ A view which returns: - A redirect to the currently open registration if exactly one registration is open - A list of open registration links otherwise """ from esp.users.models import ESPUser from esp.program.models import Program # Make sure we have an ESPUser user = ESPUser(request.user) # prepare the rendered page so it points them to open student/teacher reg's ctxt = {} userrole = {} regperm = None if user.isStudent(): userrole['name'] = 'Student' userrole['base'] = 'learn' userrole['reg'] = 'studentreg' regperm = 'Student/Classes' elif user.isTeacher(): userrole['name'] = 'Teacher' userrole['base'] = 'teach' userrole['reg'] = 'teacherreg' regperm = 'Teacher/Classes' else: # Default to student registration (this will only show if the program # is found via the 'allowed_student_types' Tag) userrole['name'] = user.getUserTypes()[0] userrole['base'] = 'learn' userrole['reg'] = 'studentreg' ctxt['userrole'] = userrole if regperm: progs_deadline = list(Permission.program_by_perm(user, regperm)) else: progs_deadline = [] progs_tag = list(t.target \ for t in Tag.objects.filter(key = "allowed_student_types").select_related() \ if isinstance(t.target, Program) \ and (set(user.getUserTypes()) & set(t.value.split(",")))) progs = list(set(progs_deadline + progs_tag)) #distinct ones # If we have 1 program, automatically redirect to registration for that program. # Most chapters will want this, but it can be disabled by a Tag. if len(progs) == 1 and Tag.getBooleanTag('automatic_registration_redirect', default=True): ctxt['prog'] = progs[0] return HttpResponseRedirect( u'/%s/%s/%s' % (userrole['base'], progs[0].getUrlBase(), userrole['reg'])) else: if len(progs) > 0: # Sort available programs newest first progs.sort(key=lambda x: -x.id) ctxt['progs'] = progs ctxt['prog'] = progs[0] return render_to_response('users/profile_complete.html', request, ctxt)
def process_response(self, request, response): ## This gets set if we're not supposed to modify the cookie if getattr(response, 'no_set_cookies', False): return response modified_cookies = False user = getattr(request, '_cached_user', None) # Allow a view to set a newly logged-in user via the response if not user or isinstance(user, AnonymousUser): new_user = getattr(response, '_new_user', None) if isinstance(new_user, ESPUser): user = new_user if user and user.id: if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE: max_age = None expires = None else: max_age = settings.SESSION_COOKIE_AGE expires = datetime.datetime.strftime( datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT") ret_title = '' try: ret_title = request.session['user_morph']['retTitle'] except KeyError: pass # URL-encode some data since cookies don't like funny characters. They # make the chocolate chips nervous. # : see public/media/scripts/content/user_data.js import urllib encoding = request.encoding if encoding is None: encoding = settings.DEFAULT_CHARSET espuser = ESPUser(user) has_qsd_bits = espuser.isAdministrator() new_values = { 'cur_username': user.username, 'cur_userid': user.id, 'cur_email': urllib.quote(user.email.encode(encoding)), 'cur_first_name': urllib.quote(user.first_name.encode(encoding)), 'cur_last_name': urllib.quote(user.last_name.encode(encoding)), 'cur_other_user': getattr(user, 'other_user', False) and '1' or '0', 'cur_retTitle': ret_title, 'cur_admin': espuser.isAdministrator() and '1' or '0', 'cur_qsd_bits': has_qsd_bits and '1' or '0', 'cur_grade': espuser.getGrade(), 'cur_roles': urllib.quote(",".join(espuser.getUserTypes())), } for key, value in new_values.iteritems(): if request.COOKIES.get(key, "") != str(value if value else ""): response.set_cookie(key, value, max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, secure=settings.SESSION_COOKIE_SECURE or None) modified_cookies = True if user and not user.is_authenticated(): cookies_to_delete = [ x for x in ('cur_username', 'cur_userid', 'cur_email', 'cur_first_name', 'cur_last_name', 'cur_other_user', 'cur_retTitle', 'cur_admin', 'cur_roles', 'cur_grade', 'cur_qsd_bits') if request.COOKIES.get(x, False) ] map(response.delete_cookie, cookies_to_delete) modified_cookies = (len(cookies_to_delete) > 0) request.session.accessed = request.session.modified ## Django only uses this for determining whether it refreshed the session cookie (and so needs to vary on cache), and its behavior is buggy; this works around it. -- aseering 11/1/2010 if modified_cookies: patch_vary_headers(response, ('Cookie', )) return response
def registration_redirect(request): """ A view which returns: - A redirect to the currently open registration if exactly one registration is open - A list of open registration links otherwise """ from esp.users.models import ESPUser, UserBit from esp.program.models import Program # Make sure we have an ESPUser user = ESPUser(request.user) # prepare the rendered page so it points them to open student/teacher reg's ctxt = {} userrole = {} regverb = None if user.isStudent(): userrole['name'] = 'Student' userrole['base'] = 'learn' userrole['reg'] = 'studentreg' regverb = GetNode('V/Deadline/Registration/Student/Classes/OneClass') elif user.isTeacher(): userrole['name'] = 'Teacher' userrole['base'] = 'teach' userrole['reg'] = 'teacherreg' regverb = GetNode('V/Deadline/Registration/Teacher/Classes') else: # Default to student registration (this will only show if the program # is found via the 'allowed_student_types' Tag) userrole['name'] = user.getUserTypes()[0] userrole['base'] = 'learn' userrole['reg'] = 'studentreg' ctxt['userrole'] = userrole ctxt['navnode'] = GetNode('Q/Web/myesp') if regverb: progs_userbit = list( UserBit.find_by_anchor_perms(Program, user=user, verb=regverb)) else: progs_userbit = [] progs_tag = list(t.target \ for t in Tag.objects.filter(key = "allowed_student_types").select_related() \ if isinstance(t.target, Program) \ and (set(user.getUserTypes()) & set(t.value.split(",")))) progs = set(progs_userbit + progs_tag) nextreg = UserBit.objects.filter( user__isnull=True, verb=regverb, startdate__gt=datetime.datetime.now()).order_by('startdate') progs = list(progs) # If we have 1 program, automatically redirect to registration for that program. # Most chapters will want this, but it can be disabled by a Tag. if len(progs) == 1 and Tag.getBooleanTag('automatic_registration_redirect', default=True): ctxt['prog'] = progs[0] ctxt['navnode'] = progs[0].anchor return HttpResponseRedirect( u'/%s/%s/%s' % (userrole['base'], progs[0].getUrlBase(), userrole['reg'])) else: if len(progs) > 0: # Sort available programs newest first progs.sort(key=lambda x: -x.id) ctxt['progs'] = progs ctxt['prog'] = progs[0] ctxt['nextreg'] = list(nextreg) return render_to_response('users/profile_complete.html', request, GetNode('Q/Web'), ctxt)