Example #1
0
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)
Example #2
0
    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
Example #3
0
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)