Пример #1
0
def user_registration_validate(request):
    """Handle the account creation logic when the form is submitted

This function is overloaded to handle either one or two phase reg"""

    if not Tag.getBooleanTag("ask_about_duplicate_accounts", default=False):
        form = SinglePhaseUserRegForm(request.POST)
    else:
        form = UserRegForm(request.POST)

    if form.is_valid():
        try:
            #there is an email-only account with that email address to upgrade
            user = ESPUser.objects.get(email=form.cleaned_data['email'],
                                       password='******')
        except ESPUser.DoesNotExist:
            try:
                #there is an inactive account with that username
                user = ESPUser.objects.filter(
                    username=form.cleaned_data['username'],
                    is_active=False).latest('date_joined')

            except ESPUser.DoesNotExist:
                user = ESPUser.objects.create_user(
                    username=form.cleaned_data['username'],
                    email=form.cleaned_data['email'])

        user.username = form.cleaned_data['username']
        user.last_name = form.cleaned_data['last_name']
        user.first_name = form.cleaned_data['first_name']
        user.set_password(form.cleaned_data['password'])

        #   Append key to password and disable until activation if desired
        if Tag.getBooleanTag('require_email_validation', default=False):
            userkey = random.randint(0, 2**31 - 1)
            user.password += "_%d" % userkey
            user.is_active = False

        user.save()

        user.groups.add(
            Group.objects.get(name=form.cleaned_data['initial_role']))

        if not Tag.getBooleanTag('require_email_validation', default=False):
            user = authenticate(username=form.cleaned_data['username'],
                                password=form.cleaned_data['password'])

            login(request, user)
            return HttpResponseRedirect('/myesp/profile/')
        else:
            send_activation_email(user, userkey)
            return render_to_response(
                'registration/account_created_activation_required.html',
                request, {
                    'user': user,
                    'site': Site.objects.get_current()
                })
    else:
        return render_to_response('registration/newuser.html', request,
                                  {'form': form})
    def lotterystudentreg(self, request, tl, one, two, module, extra, prog):
        """
        Serve the student reg page.

        This is just a static page;
        it gets all of its content from AJAX callbacks.
        """
        from django.conf import settings
        import json
        from django.utils.safestring import mark_safe

        crmi = prog.classregmoduleinfo

        open_class_category = prog.open_class_category
        # Convert the open_class_category ClassCategory object into a dictionary, only including the attributes the lottery needs or might need
        open_class_category = dict( [ (k, getattr( open_class_category, k )) for k in ['id','symbol','category'] ] )
        # Convert this into a JSON string, and mark it safe so that the Django template system doesn't try escaping it
        open_class_category = mark_safe(json.dumps(open_class_category))

        context = {'prog': prog, 'support': settings.DEFAULT_EMAIL_ADDRESSES['support'], 'open_class_registration': {False: 0, True: 1}[crmi.open_class_registration], 'open_class_category': open_class_category}

        ProgInfo = prog.studentclassregmoduleinfo

        #HSSP-style lottery
        if ProgInfo.use_priority == True and ProgInfo.priority_limit > 1:
            return render_to_response('program/modules/lotterystudentregmodule/student_reg_hssp.html', request, context)
        #Splark/Spash style lottery
        return render_to_response('program/modules/lotterystudentregmodule/student_reg_splash.html', request, context)
Пример #3
0
    def grouptextpanel(self, request, tl, one, two, module, extra, prog):
        if not self.is_configured():
            return render_to_response(self.baseDir() + 'not_configured.html',
                                      request, {})

        usc = UserSearchController()
        context = {}
        context['program'] = prog

        if request.method == "POST":
            data = {}
            for key in request.POST:
                data[key] = request.POST[key]
            filterObj = UserSearchController().filter_from_postdata(prog, data)

            context['filterid'] = filterObj.id
            context['num_users'] = ESPUser.objects.filter(
                filterObj.get_Q()).distinct().count()
            context['est_time'] = float(context['num_users']) * 1.0 / len(
                settings.TWILIO_ACCOUNT_NUMBERS)
            return render_to_response(self.baseDir() + 'options.html', request,
                                      context)

        context.update(
            usc.prepare_context(prog,
                                target_path='/manage/%s/grouptextpanel' %
                                prog.url))
        return render_to_response(self.baseDir() + 'search.html', request,
                                  context)
Пример #4
0
def user_registration_phase1(request):
    """Displays phase 1, and receives and passes off phase 1 submissions."""
    if request.user.is_authenticated():
        return render_to_response('registration/already_logged_in.html',
                                  request, {})

    #depending on a tag, we'll either have registration all in one page,
    #or in two separate ones
    if not Tag.getBooleanTag("ask_about_duplicate_accounts", default=False):
        if request.method == 'POST':
            return user_registration_validate(request)

        form = SinglePhaseUserRegForm()
        return render_to_response('registration/newuser.html', request, {
            'form': form,
            'site': Site.objects.get_current()
        })

    #we do want to ask about duplicate accounts
    if request.method == 'POST':
        return user_registration_checkemail(request)

    form = EmailUserRegForm()
    return render_to_response('registration/newuser_phase1.html', request, {
        'form': form,
        'site': Site.objects.get_current()
    })
Пример #5
0
    def selectList(self, request, tl, one, two, module, extra, prog):
        """ Select a group of users and generate a list of information
            about them using the generateList view above. """
        usc = UserSearchController()

        context = {}
        context['program'] = prog

        #   If list information was submitted, generate a query filter and
        #   show options for generating a user list
        if request.method == 'POST':
            #   Turn multi-valued QueryDict into standard dictionary
            data = {}
            for key in request.POST:
                data[key] = request.POST[key]
            filterObj = usc.filter_from_postdata(prog, data)

            #   Display list generation options
            form = ListGenForm()
            context.update({
                'form': form,
                'filterid': filterObj.id,
                'num_users': ESPUser.objects.filter(filterObj.get_Q()).distinct().count()
            })
            return render_to_response(self.baseDir()+'options.html', request, context)

        #   Otherwise, render a page that shows the list selection options
        context.update(usc.prepare_context(prog, target_path='/manage/%s/selectList' % prog.url))
        return render_to_response(self.baseDir()+'search.html', request, context)
Пример #6
0
def myesp_passwd(request):
    """ Change password """
    if request.user.username == 'onsite':
        raise ESPError(
            "Sorry, you're not allowed to change the password of this user. It's special.",
            log=False)

    if request.method == "POST":
        form = UserPasswdForm(user=request.user, data=request.POST)
        if form.is_valid():
            new_data = form.cleaned_data
            user = authenticate(username=request.user.username,
                                password=new_data['password'])

            user.set_password(new_data['newpasswd'])
            user.save()
            login(request, user)
            return render_to_response('users/passwd.html', request,
                                      {'Success': True})
    else:
        form = UserPasswdForm(user=request.user)

    return render_to_response('users/passwd.html', request, {
        'Problem': False,
        'form': form,
        'Success': False
    })
Пример #7
0
def resend_activation_view(request):
    if request.user.is_authenticated():
        return render_to_response('registration/already_logged_in.html',
                                  request, {})

    if request.method == 'POST':
        form = AwaitingActivationEmailForm(request.POST)
        if not form.is_valid():
            return render_to_response('registration/resend.html', request, {
                'form': form,
                'site': Site.objects.get_current()
            })
        user = ESPUser.objects.get(username=form.cleaned_data['username'])
        userkey = user.password[user.password.rfind("_") + 1:]
        send_activation_email(user, userkey)
        return render_to_response('registration/resend_done.html', request, {
            'form': form,
            'site': Site.objects.get_current()
        })
    else:
        form = AwaitingActivationEmailForm()
        return render_to_response('registration/resend.html', request, {
            'form': form,
            'site': Site.objects.get_current()
        })
    def confirmreg_forreal(self, request, tl, one, two, module, extra, prog, new_reg):
        """ The page that is shown once the user saves their student reg,
            giving them the option of printing a confirmation            """
        self.request = request

        from esp.program.modules.module_ext import DBReceipt

        iac = IndividualAccountingController(prog, request.user)

        context = {}
        context['one'] = one
        context['two'] = two

        context['itemizedcosts'] = iac.get_transfers()

        user = request.user
        context['finaid'] = user.hasFinancialAid(prog)
        if user.appliedFinancialAid(prog):
            context['finaid_app'] = user.financialaidrequest_set.filter(program=prog).order_by('-id')[0]
        else:
            context['finaid_app'] = None
        context['balance'] = iac.amount_due()

        context['owe_money'] = ( context['balance'] != Decimal("0.0") )

        if not prog.user_can_join(user):
            raise ESPError("This program has filled!  It can't accept any more students.  Please try again next session.", log=False)

        modules = prog.getModules(request.user, tl)
        completedAll = True
        for module in modules:
            if hasattr(module, 'onConfirm'):
                module.onConfirm(request)
            if not module.isCompleted() and module.required:
                completedAll = False
            context = module.prepare(context)

        if completedAll:
            if new_reg:
                rec = Record.objects.create(user=user, event="reg_confirmed",
                                            program=prog)
        else:
            raise ESPError("You must finish all the necessary steps first, then click on the Save button to finish registration.", log=False)

        cfe = ConfirmationEmailController()
        cfe.send_confirmation_email(request.user, self.program)

        try:
            receipt_text = DBReceipt.objects.get(program=self.program, action='confirm').receipt
            context["request"] = request
            context["program"] = prog
            return HttpResponse( Template(receipt_text).render( Context(context, autoescape=False) ) )
        except DBReceipt.DoesNotExist:
            try:
                receipt = 'program/receipts/'+str(prog.id)+'_custom_receipt.html'
                return render_to_response(receipt, request, context)
            except:
                receipt = 'program/receipts/default.html'
                return render_to_response(receipt, request, context)
Пример #9
0
def merge_accounts(request):
    if request.method == 'POST':
        form = UserMergeForm(request.POST)
        if form.is_valid():
            new_user, old_user = form.cleaned_data['absorber'], form.cleaned_data['absorbee']
            merge_users(new_user, old_user)
            return render_to_response('users/merge_success.html', request, {'new_user': new_user, 'old_user': old_user})
    else:
        form = UserMergeForm()

    return render_to_response('users/merge_accounts.html', request, {'form': form})
Пример #10
0
    def lottery(self, request, tl, one, two, module, extra, prog):
        #   Check that the lottery module is included
        students = self.program.students()
        if 'lotteried_students' not in students and 'twophase_star_students' not in students:
            return render_to_response(self.baseDir() + 'not_configured.html', request, {'program': prog})

        #   Render control page with lottery options
        context = {
            'options': {k: v for k, v in LotteryAssignmentController.default_options.items() if v[1] is not False},
            'has_old_schedules': StudentRegistration.objects.filter(section__parent_class__parent_program=self.program, relationship__name='Enrolled').count() > 0,
        }
        return render_to_response(self.baseDir()+'lottery.html', request, context)
Пример #11
0
    def deleteclass(self, request, tl, one, two, module, extra, prog):
        classes = ClassSubject.objects.filter(id=extra)
        if len(classes) != 1 or not request.user.canEdit(classes[0]):
            return render_to_response(self.baseDir() + 'cannoteditclass.html',
                                      request, {})
        cls = classes[0]
        if cls.num_students() > 0:
            return render_to_response(self.baseDir() + 'toomanystudents.html',
                                      request, {})

        cls.delete()
        return self.goToCore(tl)
Пример #12
0
def make_admin(request):
    if request.method == 'POST':
        form = MakeAdminForm(request.POST)
        if form.is_valid():
            target_user = form.cleaned_data['target_user']
            target_user.makeAdmin()
            return render_to_response('users/make_admin_success.html', request,
                                      {'target_user': target_user})
    else:
        form = MakeAdminForm()

    return render_to_response('users/make_admin.html', request, {'form': form})
    def grouptextfinal(self, request, tl, one, two, module, extra, prog):
        if request.method != 'POST' or 'filterid' not in request.GET or 'message' not in request.POST:
            raise ESPError(), 'Filter or message have not been properly set'

        if not self.is_configured():
            return render_to_response(self.baseDir() + 'not_configured.html', request, {})

        # get the filter to use and text message to send from the request; this is set in grouptextpanel form
        filterObj = PersistentQueryFilter.objects.get(id=request.GET['filterid'])
        message = request.POST['message']

        log = self.sendMessages(filterObj, message)

        return render_to_response(self.baseDir()+'finished.html', request, {'log': log})
Пример #14
0
    def commpanel(self, request, tl, one, two, module, extra, prog):

        usc = UserSearchController()

        context = {}

        #   If list information was submitted, continue to prepare a message
        if request.method == 'POST':
            #   Turn multi-valued QueryDict into standard dictionary
            data = {}
            for key in request.POST:
                data[key] = request.POST[key]

            ##  Handle normal list selecting submissions
            if ('base_list' in data and 'recipient_type' in data) or ('combo_base_list' in data):


                filterObj = usc.filter_from_postdata(prog, data)
                sendto_fn_name = usc.sendto_fn_from_postdata(data)
                sendto_fn = MessageRequest.assert_is_valid_sendto_fn_or_ESPError(sendto_fn_name)

                if data['use_checklist'] == '1':
                    (response, unused) = get_user_checklist(request, ESPUser.objects.filter(filterObj.get_Q()).distinct(), filterObj.id, '/manage/%s/commpanel_old' % prog.getUrlBase())
                    return response

                context['filterid'] = filterObj.id
                context['sendto_fn_name'] = sendto_fn_name
                context['listcount'] = self.approx_num_of_recipients(filterObj, sendto_fn)
                return render_to_response(self.baseDir()+'step2.html', request, context)

            ##  Prepare a message starting from an earlier request
            elif 'msgreq_id' in data:
                msgreq = MessageRequest.objects.get(id=data['msgreq_id'])
                context['filterid'] = msgreq.recipients.id
                context['sendto_fn_name'] = msgreq.sendto_fn_name
                sendto_fn = MessageRequest.assert_is_valid_sendto_fn_or_ESPError(msgreq.sendto_fn_name)
                context['listcount'] = self.approx_num_of_recipients(msgreq.recipients, sendto_fn)
                context['from'] = msgreq.sender
                context['subject'] = msgreq.subject
                context['replyto'] = msgreq.special_headers_dict.get('Reply-To', '')
                context['body'] = msgreq.msgtext
                return render_to_response(self.baseDir()+'step2.html', request, context)

            else:
                raise ESPError('What do I do without knowing what kind of users to look for?', log=True)

        #   Otherwise, render a page that shows the list selection options
        context.update(usc.prepare_context(prog))

        return render_to_response(self.baseDir()+'commpanel_new.html', request, context)
Пример #15
0
def search_for_user(request, user_type='Any', extra='', returnList=False):
    """ Interface to search for a user. If you need a user, just use this.
        Returns (user or response, user returned?) """

    users = None
    error = False

    usc = UserSearchController()
    if isinstance(user_type, basestring):
        user_query = usc.query_from_criteria(user_type, request.GET)
        QSUsers = ESPUser.objects.filter(user_query).distinct()
    elif isinstance(user_type, QuerySet):
        QSUsers = usc.filter_from_criteria(user_type, request.GET)
    else:
        raise ESPError('Invalid user_type: %s' % type(user_type), log=True)

    #   We need to ask for more user input if no filtering options were selected
    if not usc.updated:
        users = None
    else:
        users = [user for user in QSUsers]

    if users is not None and len(users) == 0:
        error = True
        users = None

    if users is None:
        return (render_to_response('users/usersearch.html', request, {
            'error': error,
            'extra': extra,
            'list': returnList
        }), False)

    if len(users) == 1:
        return (users[0], True)

    else:

        users.sort()

        if request.GET.get('listokay') == 'true' or \
           request.GET.get('submitform') == 'Use Filtered List':
            Q_Filter = Q(id__in=QSUsers.values_list('id', flat=True))
            return (Q_Filter, True)

        context = {'users': users, 'extra': str(extra), 'list': returnList}

        return (render_to_response('users/userpick.html', request,
                                   context), False)
Пример #16
0
    def class_docs(self, request, tl, one, two, module, extra, prog):
        from esp.web.forms.fileupload_form import FileUploadForm
        from esp.qsdmedia.models import Media

        clsid = 0
        if 'clsid' in request.POST:
            clsid = request.POST['clsid']
        else:
            clsid = extra

        classes = ClassSubject.objects.filter(id=clsid)
        if len(classes) != 1 or not request.user.canEdit(classes[0]):
            return render_to_response(self.baseDir() + 'cannoteditclass.html',
                                      request, {})

        target_class = classes[0]
        context_form = FileUploadForm()

        if request.method == 'POST':
            if request.POST['command'] == 'delete':
                docid = request.POST['docid']
                media = Media.objects.get(id=docid)
                media.delete()
            elif request.POST['command'] == 'add':
                form = FileUploadForm(request.POST, request.FILES)

                if form.is_valid():
                    media = Media(friendly_name=form.cleaned_data['title'],
                                  owner=target_class)
                    ufile = form.cleaned_data['uploadedfile']

                    #	Append the class code on the filename
                    desired_filename = '%s_%s' % (target_class.emailcode(),
                                                  ufile.name)
                    media.handle_file(ufile, desired_filename)

                    media.format = ''
                    media.save()
                else:
                    context_form = form

        context = {
            'cls': target_class,
            'uploadform': context_form,
            'module': self
        }

        return render_to_response(self.baseDir() + 'class_docs.html', request,
                                  context)
Пример #17
0
    def registrationtype_management(self, request, tl, one, two, module, extra,
                                    prog):

        from esp.program.modules.forms.admincore import VisibleRegistrationTypeForm as VRTF
        from django.conf import settings
        from esp.program.controllers.studentclassregmodule import RegistrationTypeController as RTC

        context = {}
        context['one'] = one
        context['two'] = two
        context['prog'] = prog
        context['POST'] = False
        context['saved'] = False
        context['support'] = settings.DEFAULT_EMAIL_ADDRESSES['support']

        if request.method == 'POST':
            context['POST'] = True
            form = VRTF(request.POST)
            if form.is_valid():
                context['saved'] = RTC.setVisibleRegistrationTypeNames(
                    form.cleaned_data['display_names'], prog)

        display_names = list(
            RTC.getVisibleRegistrationTypeNames(prog, for_VRT_form=True))
        context['form'] = VRTF(data={'display_names': display_names})
        return render_to_response(
            self.baseDir() + 'registrationtype_management.html', request,
            context)
    def view_app(self, request, tl, one, two, module, extra, prog):
        scrmi = prog.studentclassregmoduleinfo
        reg_nodes = scrmi.reg_verbs()

        try:
            cls = ClassSubject.objects.get(id = extra)
            section = cls.default_section()
        except ClassSubject.DoesNotExist:
            raise ESPError('Cannot find class.', log=False)

        student = request.GET.get('student',None)
        if not student:
            student = request.POST.get('student','')

        try:
            student = ESPUser.objects.get(id = student)
        except ESPUser.DoesNotExist:
            raise ESPError('Cannot find student, %s' % student, log=False)

        if student.studentregistration_set.filter(section__parent_class=cls).count() == 0:
            raise ESPError('Student not a student of this class.', log=False)

        try:
            student.app = student.studentapplication_set.get(program = self.program)
        except:
            student.app = None
            assert False, student.studentapplication_set.all()[0].__dict__
            raise ESPError('Error: Student did not apply. Student is automatically rejected.', log=False)

        return render_to_response(self.baseDir()+'app_popup.html', request, {'class': cls, 'student': student})
Пример #19
0
    def _checkTeacher(moduleObj, request, *args, **kwargs):
        if not_logged_in(request):
            return HttpResponseRedirect('%s?%s=%s' % (LOGIN_URL, REDIRECT_FIELD_NAME, quote(request.get_full_path())))

        if not request.user.isTeacher() and not request.user.isAdmin(moduleObj.program):
            return render_to_response('errors/program/notateacher.html', request, {})
        return method(moduleObj, request, *args, **kwargs)
Пример #20
0
def userview(request):
    """ Render a template displaying all the information about the specified user """
    try:
        user = ESPUser.objects.get(username=request.GET['username'])
    except:
        raise ESPError("Sorry, can't find anyone with that username.", log=False)

    teacherbio = TeacherBio.getLastBio(user)
    if not teacherbio.picture:
        teacherbio.picture = 'images/not-available.jpg'

    from esp.users.forms.user_profile import StudentInfoForm

    if 'graduation_year' in request.GET:
        user.set_student_grad_year(request.GET['graduation_year'])

    change_grade_form = StudentInfoForm(user=user)
    if 'disabled' in change_grade_form.fields['graduation_year'].widget.attrs:
        del change_grade_form.fields['graduation_year'].widget.attrs['disabled']
    change_grade_form.fields['graduation_year'].initial = user.getYOG()
    change_grade_form.fields['graduation_year'].choices = filter(lambda choice: bool(choice[0]), change_grade_form.fields['graduation_year'].choices)

    context = {
        'user': user,
        'taught_classes' : user.getTaughtClasses().order_by('parent_program', 'id'),
        'enrolled_classes' : user.getEnrolledSections().order_by('parent_class__parent_program', 'id'),
        'taken_classes' : user.getSections().order_by('parent_class__parent_program', 'id'),
        'teacherbio': teacherbio,
        'domain': settings.SITE_INFO[1],
        'change_grade_form': change_grade_form,
        'printers': StudentRegCore.printer_names(),
    }
    return render_to_response("users/userview.html", request, context )
Пример #21
0
def get_user_checklist(request, userList, extra='', nextpage=None):
    """ Generate a checklist of users given an initial list of users to pick from.
        Returns a tuple (userid_query or response, users found?)
        The query that's returned contains the id's of just the users which are checked off. """

    if 'submit_checklist' in request.POST and \
       request.POST['submit_checklist'] == 'true':
        UsersQ = Q(id=-1)

        for key in request.POST.keys():
            if 'userno' in key:
                try:
                    val = int(request.POST[key])
                    UsersQ |= Q(id=val)
                except:
                    pass

        return (UsersQ, True)

    context = {}
    context['extra'] = extra
    context['users'] = userList
    if nextpage is None:
        context['nextpage'] = request.path
    else:
        context['nextpage'] = nextpage

    return (render_to_response('users/userchecklist.html', request,
                               context), False)  # make the checklist
    def signup(self, request, tl, one, two, module, extra, prog):
        context = {}

        if request.method == 'POST':
            form = VolunteerOfferForm(request.POST, program=prog)
            if form.is_valid():
                offers = form.save()
                if len(offers) > 0:
                    context['complete'] = True
                    context['complete_name'] = offers[0].name
                    context['complete_email'] = offers[0].email
                    context['complete_phone'] = offers[0].phone
                else:
                    context['cancelled'] = True
                form = VolunteerOfferForm(program=prog)
        else:
            form = VolunteerOfferForm(program=prog)

        #   Pre-fill information if possible
        if hasattr(request.user, 'email'):
            form.load(request.user)

        #   Override default appearance; template doesn't mind taking a string instead
        context['form'] = form._html_output(
            normal_row = u'<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
            error_row = u'<tr><td colspan="2">%s</td></tr>',
            row_ender = u'</td></tr>',
            help_text_html = u'%s',
            errors_on_separate_row = False)

        return render_to_response('program/modules/volunteersignup/signup.html', request, context)
    def volunteering(self, request, tl, one, two, module, extra, prog):
        context = {}

        if extra == 'csv':
            response = HttpResponse(content_type="text/csv")
            requests = self.program.getVolunteerRequests()
            write_csv = csv.writer(response)
            write_csv.writerow(("Activity","Time","Name","Phone Number","E-mail Address"))
            for request in requests:
                for offer in request.get_offers():
                    write_csv.writerow((request.timeslot.description, request.timeslot.pretty_time(), offer.name, offer.phone, offer.email))
            response['Content-Disposition'] = 'attachment; filename=volunteers.csv'
            return response

        if 'op' in request.GET:
            if request.GET['op'] == 'edit':
                form = VolunteerRequestForm(program=prog)
                form.load(VolunteerRequest.objects.get(id=request.GET['id']))
            elif request.GET['op'] == 'delete':
                form = VolunteerRequestForm(program=prog)
                VolunteerRequest.objects.get(id=request.GET['id']).delete()
        elif request.method == 'POST':
            form = VolunteerRequestForm(request.POST, program=prog)
            if form.is_valid():
                if form.cleaned_data['vr_id']:
                    form.save(VolunteerRequest.objects.get(id=form.cleaned_data['vr_id']))
                else:
                    form.save()
                form = VolunteerRequestForm(program=prog)
        else:
            form = VolunteerRequestForm(program=prog)

        context['form'] = form
        context['requests'] = self.program.getVolunteerRequests()
        return render_to_response('program/modules/volunteermanage/main.html', request, context)
    def viewlotteryprefs(self, request, tl, one, two, module, extra, prog):
        context = {}
        context['student'] = request.user

        priority_classids = set()
        uniquified_flags = []
        priority_flags = StudentRegistration.valid_objects().filter(user=request.user, section__parent_class__parent_program=prog, relationship__name='Priority/1')
        for flag in priority_flags:
            if flag.section.id not in priority_classids:
                priority_classids.add(flag.section.id)
                uniquified_flags.append(flag)
        context['priority'] = uniquified_flags
        if priority_flags.count() == 0:
            context['pempty'] = True
        else: context['pempty'] = False

        interested_classids = set()
        uniquified_interested = []
        interested = StudentRegistration.valid_objects().filter(user=request.user, section__parent_class__parent_program=prog, relationship__name='Interested')
        for flag in interested:
            if flag.section.id not in interested_classids:
                interested_classids.add(flag.section.id)
                uniquified_interested.append(flag)
        context['interested' ] = uniquified_interested
        if interested.count() == 0:
            context['iempty'] = True
        else: context['iempty'] = False

        return render_to_response(self.baseDir()+'view_lottery_prefs.html', request, context)
Пример #25
0
    def rapidcheckin(self, request, tl, one, two, module, extra, prog):
        context = {}
        if request.method == 'POST':
            #   Handle submission of student
            form = OnSiteRapidCheckinForm(request.POST)
            if form.is_valid():
                student = form.cleaned_data['user']
                #   Check that this is a student user who is not also teaching (e.g. an admin)
                if student.isStudent(
                ) and student not in self.program.teachers()['class_approved']:
                    recs = Record.objects.filter(user=student,
                                                 event="attended",
                                                 program=prog)
                    if not recs.exists():
                        rec, created = Record.objects.get_or_create(
                            user=student, event="attended", program=prog)
                    context['message'] = '%s %s marked as attended.' % (
                        student.first_name, student.last_name)
                    if request.is_ajax():
                        return self.ajax_status(request, tl, one, two, module,
                                                extra, prog, context)
                else:
                    context[
                        'message'] = '%s %s is not a student and has not been checked in' % (
                            student.first_name, student.last_name)
                    if request.is_ajax():
                        return self.ajax_status(request, tl, one, two, module,
                                                extra, prog, context)
        else:
            form = OnSiteRapidCheckinForm()

        context['module'] = self
        context['form'] = form
        return render_to_response(self.baseDir() + 'ajaxcheckin.html', request,
                                  context)
Пример #26
0
    def quiz(self, request, tl, one, two, module, extra, prog):

        custom_form_id = Tag.getProgramTag('quiz_form_id', prog, None)
        if custom_form_id:
            cf = Form.objects.get(id=int(custom_form_id))
        else:
            raise ESPError(
                'Cannot find an appropriate form for the quiz.  Please ask your administrator to create a form and set the quiz_form_id Tag.'
            )

        form_wizard = FormHandler(cf, request, request.user).get_wizard()
        form_wizard.curr_request = request

        if request.method == 'POST':
            form = form_wizard.get_form(0, request.POST, request.FILES)
            if form.is_valid():
                form_wizard.done([form])
                self.controller.markCompleted(request.user)
                return self.goToCore(tl)
        else:
            form = form_wizard.get_form(0)

        return render_to_response(self.baseDir() + 'quiz.html', request, {
            'prog': prog,
            'form': form
        })
    def event_signup(self, request, tl, one, two, module, extra, prog):
        if request.method == 'POST':
            form = TeacherEventSignupForm(self, request.POST)
            if form.is_valid():
                data = form.cleaned_data
                # Remove old bits
                UserAvailability.objects.filter(user=request.user, event__event_type__in=self.event_types().values()).delete()
                # Register for interview
                if data['interview']:
                    ua, created = UserAvailability.objects.get_or_create( user=request.user, event=data['interview'], role=self.availability_role())
                    # Send the directors an e-mail
                    if self.program.director_email and created:
                        event_name = data['interview'].description
                        send_mail('['+self.program.niceName()+'] Teacher Interview for ' + request.user.first_name + ' ' + request.user.last_name + ': ' + event_name, \
                              """Teacher Interview Registration Notification\n--------------------------------- \n\nTeacher: %s %s\n\nTime: %s\n\n""" % \
                              (request.user.first_name, request.user.last_name, event_name) , \
                              ('%s <%s>' % (request.user.first_name + ' ' + request.user.last_name, request.user.email,)), \
                              [self.program.getDirectorCCEmail()], True)

                # Register for training
                if data['training']:
                    ua, created = UserAvailability.objects.get_or_create( user=request.user, event=data['training'], role=self.availability_role())
                return self.goToCore(tl)
        else:
            data = {}
            entries = self.entriesByTeacher(request.user)
            if entries['interview'].count() > 0:
                data['interview'] = entries['interview'][0].event.id
            if entries['training'].count() > 0:
                data['training'] = entries['training'][0].event.id
            form = TeacherEventSignupForm(self, initial=data)
        return render_to_response( self.baseDir()+'event_signup.html', request, {'prog':prog, 'form': form} )
    def rank_classes(self, request, tl, one, two, module, extra, prog):
        """
        Displays a filterable catalog including only class subjects for which
        the student has a StudentSubjectInterest. The sticky on top
        of the catalog lets the student order the top N priorities of classes
        for this particular timeslot. The timeslot is specified through extra.
        """
        try:
            timeslot = Event.objects.get(pk=int(extra), program=prog)
        except (TypeError, ValueError, Event.DoesNotExist) as e:
            raise Http404
        context = dict()
        context['timeslot'] = timeslot
        context['num_priorities'] = prog.priorityLimit()
        context['priorities'] = []
        for rel_index in range(1, prog.priorityLimit()+1):
            rel_name = 'Priority/%s' % rel_index
            rel, created = RegistrationType.objects.get_or_create(
                name=rel_name, category='student')
            context['priorities'].append((rel_index, rel))

        catalog_context = self.catalog_context(
            request, tl, one, two,module, extra, prog)
        context.update(catalog_context)

        return render_to_response(
            self.baseDir() + 'rank_classes.html', request, context)
    def mark_classes(self, request, tl, one, two, module, extra, prog):
        """
        Displays a filterable catalog which allows starring classes that the
        user is interested in.
        """
        # get choices for filtering options
        context = {}

        def group_columns(items):
            # collect into groups of 5
            cols = []
            for i, item in enumerate(items):
                if i % 5 == 0:
                    col = []
                    cols.append(col)
                col.append(item)
            return cols

        category_choices = []
        for category in prog.class_categories.all():
            # FIXME(gkanwar): Make this less hacky, once #770 is resolved
            if category.category == 'Lunch':
                continue
            category_choices.append((category.id, category.category))
        context['category_choices'] = group_columns(category_choices)

        catalog_context = self.catalog_context(
            request, tl, one, two,module, extra, prog)
        context.update(catalog_context)

        return render_to_response(self.baseDir() + 'mark_classes.html', request, context)
Пример #30
0
    def mark_classes(self, request, tl, one, two, module, extra, prog):
        """
        Displays a filterable catalog which allows starring classes that the
        user is interested in.
        """
        # get choices for filtering options
        context = {}

        def group_columns(items):
            # collect into groups of 5
            cols = []
            for i, item in enumerate(items):
                if i % 5 == 0:
                    col = []
                    cols.append(col)
                col.append(item)
            return cols

        category_choices = []
        for category in prog.class_categories.all():
            # FIXME(gkanwar): Make this less hacky, once #770 is resolved
            if category.category == 'Lunch':
                continue
            category_choices.append((category.id, category.category))
        context['category_choices'] = group_columns(category_choices)

        catalog_context = self.catalog_context(request, tl, one, two, module,
                                               extra, prog)
        context.update(catalog_context)

        return render_to_response(self.baseDir() + 'mark_classes.html',
                                  request, context)
Пример #31
0
    def rank_classes(self, request, tl, one, two, module, extra, prog):
        """
        Displays a filterable catalog including only class subjects for which
        the student has a StudentSubjectInterest. The sticky on top
        of the catalog lets the student order the top N priorities of classes
        for this particular timeslot. The timeslot is specified through extra.
        """
        try:
            timeslot = Event.objects.get(pk=int(extra), program=prog)
        except (TypeError, ValueError, Event.DoesNotExist) as e:
            raise Http404
        context = dict()
        context['timeslot'] = timeslot
        context['num_priorities'] = prog.priorityLimit()
        context['priorities'] = []
        for rel_index in range(1, prog.priorityLimit() + 1):
            rel_name = 'Priority/%s' % rel_index
            rel, created = RegistrationType.objects.get_or_create(
                name=rel_name, category='student')
            context['priorities'].append((rel_index, rel))

        catalog_context = self.catalog_context(request, tl, one, two, module,
                                               extra, prog)
        context.update(catalog_context)

        return render_to_response(self.baseDir() + 'rank_classes.html',
                                  request, context)
    def cybersource(self, request, tl, one, two, module, extra, prog):

        # Force users to pay for non-optional stuffs
        user = request.user

        iac = IndividualAccountingController(self.program, request.user)
        context = {}
        context['module'] = self
        context['one'] = one
        context['two'] = two
        context['tl']  = tl
        context['user'] = user
        context['contact_email'] = self.program.director_email
        context['invoice_id'] = iac.get_id()
        context['identifier'] = iac.get_identifier()
        payment_type = iac.default_payments_lineitemtype()
        sibling_type = iac.default_siblingdiscount_lineitemtype()
        grant_type = iac.default_finaid_lineitemtype()
        context['itemizedcosts'] = iac.get_transfers().exclude(line_item__in=[payment_type, sibling_type, grant_type]).order_by('-line_item__required')
        context['itemizedcosttotal'] = iac.amount_due()
        context['subtotal'] = iac.amount_requested()
        context['financial_aid'] = iac.amount_finaid()
        context['sibling_discount'] = iac.amount_siblingdiscount()
        context['amount_paid'] = iac.amount_paid()
        context['result'] = request.GET.get("result")
        context['post_url'] = settings.CYBERSOURCE_CONFIG['post_url']
        context['merchant_id'] = settings.CYBERSOURCE_CONFIG['merchant_id']

        if (not context['post_url']) or (not context['merchant_id']):
            raise ESPError("The Cybersource module is not configured")

        return render_to_response(self.baseDir() + 'cardpay.html', request, context)
Пример #33
0
    def edit_availability(self, request, tl, one, two, module, extra, prog):
        """
        Admins edits availability of the specified user.
        """

        target_id = None

        if 'user' in request.GET:
            target_id = request.GET['user']
        elif 'user' in request.POST:
            target_id = request.POST['user']
        else:
            context = {}
            return render_to_response(
                self.baseDir() + 'check_availability.html', request, context)

        try:
            teacher = ESPUser.objects.get(id=target_id)
        except:
            try:
                teacher = ESPUser.objects.get(username=target_id)
            except:
                raise ESPError("The user with id/username="******" does not appear to exist!",
                               log=False)

        return self.availabilityForm(request, tl, one, two, prog, teacher,
                                     True)
Пример #34
0
def selector(request, keep_files=None):
    if settings.LOCAL_THEME:
        raise ESPError(THEME_ERROR_STRING, log=False)

    context = {}
    tc = ThemeController()

    if request.method == 'POST' and 'action' in request.POST:
        if request.POST['action'] == 'select':
            theme_name = request.POST['theme'].replace(' (current)', '')

            #   Check for differences between the theme's files and those in the working copy.
            #   If there are differences, require a confirmation from the user for each file.
            differences = tc.check_local_modifications(theme_name)
            if len(differences) > 0 and keep_files is None:
                return confirm_overwrite(request, current_theme=theme_name, differences=differences, orig_view='selector')

            #   Display configuration form if one is provided for the selected theme
            if tc.get_config_form_class(theme_name) is not None:
                return configure(request, current_theme=theme_name, force_display=True, keep_files=keep_files)

            tc.save_customizations('%s-last' % tc.get_current_theme())
            backup_info = tc.clear_theme(keep_files=keep_files)
            tc.load_theme(theme_name, backup_info=backup_info)
        elif request.POST['action'] == 'clear':
            tc.save_customizations('%s-last' % tc.get_current_theme())
            tc.clear_theme()

    context['theme_name'] = tc.get_current_theme()
    context['themes'] = tc.get_theme_names()
    return render_to_response('themes/selector.html', request, context)
Пример #35
0
        def _inner_function(request, *args, **kwargs):
            if request.user.is_authenticated():
                return render_to_response('errors/anonymous_only.html',
                                          request,
                                          {})

            return method(request, *args, **kwargs)
Пример #36
0
    def _checkTeacher(moduleObj, request, *args, **kwargs):
        if not_logged_in(request):
            return HttpResponseRedirect('%s?%s=%s' % (LOGIN_URL, REDIRECT_FIELD_NAME, quote(request.get_full_path())))

        if not request.user.isTeacher() and not request.user.isAdmin(moduleObj.program):
            return render_to_response('errors/program/notateacher.html', request, {})
        return method(moduleObj, request, *args, **kwargs)
Пример #37
0
    def resources_equipment(self, request, tl, one, two, module, extra, prog):
        context = {}
        response = None

        controller = ResourceController(prog)

        if request.GET.get('op') == 'edit':
            #   pre-fill form
            equip = Resource.objects.get(id=request.GET['id'])
            context['equipment_form'] = EquipmentForm(self.program)
            context['equipment_form'].load_equipment(self.program, equip)

        if request.GET.get('op') == 'delete':
            #   show delete confirmation page
            context['prog'] = self.program
            context['equipment'] = Resource.objects.get(id=request.GET['id'])
            response = render_to_response(
                self.baseDir() + 'equipment_delete.html', request, context)

        if request.method == 'POST':
            data = request.POST

            if data['command'] == 'reallyremove':
                controller.delete_equipment(data['id'])

            elif data['command'] == 'addedit':
                #   add/edit restype
                form = EquipmentForm(self.program, data)

                if form.is_valid():
                    form.save_equipment(self.program)
                else:
                    context['equipment_form'] = form

        return (response, context)
Пример #38
0
    def resources_timeslot(self, request, tl, one, two, module, extra, prog):
        context = {}
        response = None

        controller = ResourceController(prog)

        if request.GET.get('op') == 'edit':
            #   pre-fill form
            current_slot = Event.objects.get(id=request.GET['id'])
            context['timeslot_form'] = TimeslotForm()
            context['timeslot_form'].load_timeslot(current_slot)

        if request.GET.get('op') == 'delete':
            #   show delete confirmation page
            context['prog'] = self.program
            context['timeslot'] = Event.objects.get(id=request.GET['id'])
            response = render_to_response(
                self.baseDir() + 'timeslot_delete.html', request, context)

        if request.method == 'POST':
            data = request.POST

            if data['command'] == 'reallyremove':
                controller.delete_timeslot(data['id'])

            elif data['command'] == 'addedit':
                #   add/edit timeslot
                form = TimeslotForm(data)
                if form.is_valid():
                    controller.add_or_edit_timeslot(form)
                else:
                    context['timeslot_form'] = form

        return (response, context)
Пример #39
0
    def signup(self, request, tl, one, two, module, extra, prog):
        context = {}

        if request.method == 'POST':
            form = VolunteerOfferForm(request.POST, program=prog)
            if form.is_valid():
                offers = form.save()
                if len(offers) > 0:
                    context['complete'] = True
                    context['complete_name'] = offers[0].name
                    context['complete_email'] = offers[0].email
                    context['complete_phone'] = offers[0].phone
                else:
                    context['cancelled'] = True
                form = VolunteerOfferForm(program=prog)
        else:
            form = VolunteerOfferForm(program=prog)

        #   Pre-fill information if possible
        if hasattr(request.user, 'email'):
            form.load(request.user)

        #   Override default appearance; template doesn't mind taking a string instead
        context['form'] = form._html_output(
            normal_row=
            u'<tr%(html_class_attr)s><th>%(label)s</th><td>%(errors)s%(field)s%(help_text)s</td></tr>',
            error_row=u'<tr><td colspan="2">%s</td></tr>',
            row_ender=u'</td></tr>',
            help_text_html=u'%s',
            errors_on_separate_row=False)

        return render_to_response(
            'program/modules/volunteersignup/signup.html', request, context)
Пример #40
0
 def volunteerschedule(self, request, tl, one, two, module, extra, prog):
     #   Use the template defined in ProgramPrintables
     from esp.program.modules.handlers import ProgramPrintables
     context = {'module': self}
     pmos = ProgramModuleObj.objects.filter(
         program=prog, module__handler__icontains='printables')
     if pmos.count() == 1:
         pmo = ProgramPrintables(pmos[0])
         if request.user.isAdmin() and 'user' in request.GET:
             volunteer = ESPUser.objects.get(id=request.GET['user'])
         else:
             volunteer = request.user
         scheditems = []
         offers = VolunteerOffer.objects.filter(
             user=volunteer, request__program=self.program)
         for offer in offers:
             scheditems.append({
                 'name': volunteer.name(),
                 'volunteer': volunteer,
                 'offer': offer
             })
         #sort the offers by timeslot
         scheditems.sort(
             key=lambda item: item['offer'].request.timeslot.start)
         context['scheditems'] = scheditems
         return render_to_response(pmo.baseDir() + 'volunteerschedule.html',
                                   request, context)
     else:
         raise ESPError(
             'No printables module resolved, so this document cannot be generated.  Consult the webmasters.',
             log=False)
    def cybersource(self, request, tl, one, two, module, extra, prog):

        # Force users to pay for non-optional stuffs
        user = request.user

        iac = IndividualAccountingController(self.program, request.user)
        context = {}
        context['module'] = self
        context['one'] = one
        context['two'] = two
        context['tl'] = tl
        context['user'] = user
        context['contact_email'] = self.program.director_email
        context['invoice_id'] = iac.get_id()
        context['identifier'] = iac.get_identifier()
        payment_type = iac.default_payments_lineitemtype()
        sibling_type = iac.default_siblingdiscount_lineitemtype()
        grant_type = iac.default_finaid_lineitemtype()
        context['itemizedcosts'] = iac.get_transfers().exclude(
            line_item__in=[payment_type, sibling_type, grant_type]).order_by(
                '-line_item__required')
        context['itemizedcosttotal'] = iac.amount_due()
        context['subtotal'] = iac.amount_requested()
        context['financial_aid'] = iac.amount_finaid()
        context['sibling_discount'] = iac.amount_siblingdiscount()
        context['amount_paid'] = iac.amount_paid()
        context['result'] = request.GET.get("result")
        context['post_url'] = settings.CYBERSOURCE_CONFIG['post_url']
        context['merchant_id'] = settings.CYBERSOURCE_CONFIG['merchant_id']

        if (not context['post_url']) or (not context['merchant_id']):
            raise ESPError("The Cybersource module is not configured")

        return render_to_response(self.baseDir() + 'cardpay.html', request,
                                  context)
    def medicalbypass(self, request, tl, one, two, module, extra, prog):
        status = None

        if request.method == 'POST':
            form = GenericSearchForm(request.POST)
            if form.is_valid():
                user = form.cleaned_data['target_user']
                if Record.objects.filter(user=user,
                                          program=self.program,
                                          event="med_bypass").exists():
                    status = 'bypass exists'
                elif Record.objects.filter(user=user,
                                            program=self.program,
                                            event="med").exists():
                    status = 'reg bit exists'
                else:
                    Record.objects.create(user=user,
                                           program=self.program,
                                           event="med_bypass")
                    status = 'success'
            else:
                status = 'invalid user'

        context = {'status': status, 'form': GenericSearchForm()}

        return render_to_response(self.baseDir()+'medicalbypass.html',
                                  request, context)
    def resources_equipment(self, request, tl, one, two, module, extra, prog):
        context = {}
        response = None

        controller = ResourceController(prog)

        if request.GET.get('op') == 'edit':
            #   pre-fill form
            equip = Resource.objects.get(id=request.GET['id'])
            context['equipment_form'] = EquipmentForm(self.program)
            context['equipment_form'].load_equipment(self.program, equip)

        if request.GET.get('op') == 'delete':
            #   show delete confirmation page
            context['prog'] = self.program
            context['equipment'] = Resource.objects.get(id=request.GET['id'])
            response = render_to_response(self.baseDir()+'equipment_delete.html', request, context)

        if request.method == 'POST':
            data = request.POST

            if data['command'] == 'reallyremove':
                controller.delete_equipment(data['id'])

            elif data['command'] == 'addedit':
                #   add/edit restype
                form = EquipmentForm(self.program, data)

                if form.is_valid():
                    form.save_equipment(self.program)
                else:
                    context['equipment_form'] = form

        return (response, context)
Пример #44
0
def disable_account(request):

    curUser = request.user

    if 'enable' in request.GET:
        curUser.is_active = True
        curUser.save()
    elif 'disable' in request.GET:
        curUser.is_active = False
        curUser.save()

    other_users = ESPUser.objects.filter(email=curUser.email).exclude(
        id=curUser.id)

    context = {
        'user':
        curUser,
        'other_users':
        other_users,
        # Right now, we only deactivate the other users with the same email
        # address if we are using mailman.
        'will_deactivate_others':
        curUser.is_active and other_users and settings.USE_MAILMAN,
    }

    return render_to_response('users/disable_account.html', request, context)
Пример #45
0
    def medicalbypass(self, request, tl, one, two, module, extra, prog):
        status = None

        if request.method == 'POST':
            form = GenericSearchForm(request.POST)
            if form.is_valid():
                user = form.cleaned_data['target_user']
                if Record.objects.filter(user=user,
                                         program=self.program,
                                         event="med_bypass").exists():
                    status = 'bypass exists'
                elif Record.objects.filter(user=user,
                                           program=self.program,
                                           event="med").exists():
                    status = 'reg bit exists'
                else:
                    Record.objects.create(user=user,
                                          program=self.program,
                                          event="med_bypass")
                    status = 'success'
            else:
                status = 'invalid user'

        context = {'status': status, 'form': GenericSearchForm()}

        return render_to_response(self.baseDir() + 'medicalbypass.html',
                                  request, context)
Пример #46
0
    def classsearch(self, request, tl, one, two, module, extra, prog):
        data = request.GET.get('query')
        query_builder = self.query_builder()
        context = {
            'query_builder': query_builder,
            'program': self.program,
            'query': None,
        }
        namequery = request.GET.get('namequery')
        decoded = None
        if data is not None:
            decoded = json.loads(data)
        elif namequery:  # only search if not None and not ""
            decoded = {
                'filter': 'title',
                'negated': False,
                'values': [namequery]
            }

        if decoded is not None:
            queryset = query_builder.as_queryset(decoded)
            queryset = queryset.distinct().order_by('id').prefetch_related(
                'flags', 'flags__flag_type', 'teachers', 'category',
                'sections', 'sections__resourcerequest_set')
            if request.GET.get('randomize'):
                queryset = list(queryset)
                random.shuffle(queryset)
            if request.GET.get('lucky'):
                return HttpResponseRedirect(queryset[0].get_absolute_url())
            context['query'] = decoded
            context['queryset'] = queryset
            context['flag_types'] = self.program.flag_types.all()
        return render_to_response(self.baseDir() + 'class_search.html',
                                  request, context)
Пример #47
0
    def ajax_clear_schedule(self, request, tl, one, two, module, extra, prog):
        """ A view that you can use to remove schedule assignments for all class
            sections below a certain lock level.
            Be very careful using this view since it can sometimes work quite well,
            and there is currently no backup.
        """
        try:
            lock_level = int(request.POST.get('lock_level', '0'))
        except:
            lock_level = 0

        if request.method == 'POST':
            num_affected_sections = self.clear_schedule_logic(prog, lock_level)
            data = {
                'message':
                'Cleared schedule assignments for %d sections.' %
                (num_affected_sections)
            }
            response = HttpResponse(content_type="application/json")
            json.dump(data, response)
        else:
            context = {}
            context['num_affected_sections'] = self._get_affected_sections(
                prog, lock_level).count()
            response = render_to_response(
                self.baseDir() + 'clear_schedule_confirmation.html', request,
                context)

        return response
    def resources_timeslot(self, request, tl, one, two, module, extra, prog):
        context = {}
        response = None

        controller = ResourceController(prog)

        if request.GET.get('op') == 'edit':
            #   pre-fill form
            current_slot = Event.objects.get(id=request.GET['id'])
            context['timeslot_form'] = TimeslotForm()
            context['timeslot_form'].load_timeslot(current_slot)

        if request.GET.get('op') == 'delete':
            #   show delete confirmation page
            context['prog'] = self.program
            context['timeslot'] = Event.objects.get(id=request.GET['id'])
            response = render_to_response(self.baseDir()+'timeslot_delete.html', request, context)

        if request.method == 'POST':
            data = request.POST

            if data['command'] == 'reallyremove':
                controller.delete_timeslot(data['id'])

            elif data['command'] == 'addedit':
                #   add/edit timeslot
                form = TimeslotForm(data)
                if form.is_valid():
                    controller.add_or_edit_timeslot(form)
                else:
                    context['timeslot_form'] = form

        return (response, context)
    def payonline(self, request, tl, one, two, module, extra, prog):

        #   Check that the user has completed all required modules so that they
        #   are "finished" registering for the program.  (In other words, they
        #   should be registered for at least one class, and filled out other
        #   required forms, before paying by credit card.)
        modules = prog.getModules(request.user, tl)
        completedAll = True
        for module in modules:
            if not module.isCompleted() and module.required:
                completedAll = False
        if not completedAll and not request.user.isAdmin(prog):
            raise ESPError("Please go back and ensure that you have completed all required steps of registration before paying by credit card.", log=False)

        #   Check for setup of module.  This is also required to initialize settings.
        self.check_setup()

        user = request.user

        iac = IndividualAccountingController(self.program, request.user)
        context = {}
        context['module'] = self
        context['program'] = prog
        context['user'] = user
        context['invoice_id'] = iac.get_id()
        context['identifier'] = iac.get_identifier()
        payment_type = iac.default_payments_lineitemtype()
        sibling_type = iac.default_siblingdiscount_lineitemtype()
        grant_type = iac.default_finaid_lineitemtype()
        offer_donation = self.settings['offer_donation']
        donate_type = iac.get_lineitemtypes().get(text=self.settings['donation_text']) if offer_donation else None
        context['itemizedcosts'] = iac.get_transfers().exclude(line_item__in=filter(None, [payment_type, sibling_type, grant_type, donate_type])).order_by('-line_item__required')
        context['itemizedcosttotal'] = iac.amount_due()
        #   This amount should be formatted as an integer in order to be
        #   accepted by Stripe.
        context['totalcost_cents'] = int(context['itemizedcosttotal'] * 100)
        context['subtotal'] = iac.amount_requested()
        context['financial_aid'] = iac.amount_finaid()
        context['sibling_discount'] = iac.amount_siblingdiscount()
        context['amount_paid'] = iac.amount_paid()

        #   Load donation amount separately, since the client-side code needs to know about it separately.
        donation_prefs = iac.get_preferences([donate_type,]) if offer_donation else None
        if donation_prefs:
            context['amount_donation'] = Decimal(donation_prefs[0][2])
            context['has_donation'] = True
        else:
            context['amount_donation'] = Decimal('0.00')
            context['has_donation'] = False
        context['amount_without_donation'] = context['itemizedcosttotal'] - context['amount_donation']

        if 'HTTP_HOST' in request.META:
            context['hostname'] = request.META['HTTP_HOST']
        else:
            context['hostname'] = Site.objects.get_current().domain
        context['institution'] = settings.INSTITUTION_NAME
        context['support_email'] = settings.DEFAULT_EMAIL_ADDRESSES['support']

        return render_to_response(self.baseDir() + 'cardpay.html', request, context)
Пример #50
0
def landing(request):
    if settings.LOCAL_THEME:
        raise ESPError(THEME_ERROR_STRING, log=False)
    context = {}
    tc = ThemeController()
    context['theme_name'] = tc.get_current_theme()
    context['last_customization_name'] = tc.get_current_customization()
    return render_to_response('themes/landing.html', request, context)
 def catalogpreview(self, request, tl, one, two, module, extra, prog):
     try:
         qs = ClassSubject.objects.filter(id=int(extra))
         cls = qs[0]
     except (ValueError, IndexError):
         raise Http404('The requested class could not be found.')
     cls = ClassSubject.objects.catalog(cls.parent_program, force_all=True, initial_queryset=qs)[0]
     return render_to_response(self.baseDir()+'catalogpreview.html', request, {'class': cls})
Пример #52
0
    def deleteclass(self, request, tl, one, two, module, extra, prog):
        classes = ClassSubject.objects.filter(id = extra)
        if len(classes) != 1 or not request.user.canEdit(classes[0]):
                return render_to_response(self.baseDir()+'cannoteditclass.html', request, {})
        cls = classes[0]

        cls.delete(True)
        return self.goToCore(tl)
Пример #53
0
 def _meets_cap(moduleObj, request, tl, one, two, module, extra, prog,
                *args, **kwargs):
     if prog.user_can_join(request.user):
         return view_method(moduleObj, request, tl, one, two, module, extra,
                            prog, *args, **kwargs)
     else:
         return render_to_response('errors/program/program_full.html',
                                   request, {'moduleObj': moduleObj})
 def scheduling_checks(self, request, tl, one, two, module, extra, prog):
      s = SchedulingCheckRunner(prog)
      if extra:
           results = s.run_diagnostics([extra])
           return HttpResponse(results)
      else:
           context = {'check_list': s.all_diagnostics}
           return render_to_response(self.baseDir()+'output.html', request, context)
Пример #55
0
    def commprev(self, request, tl, one, two, module, extra, prog):
        from esp.users.models import PersistentQueryFilter
        from django.conf import settings

        filterid, listcount, subject, body = [request.POST['filterid'],
                                              request.POST['listcount'],
                                              request.POST['subject'],
                                              request.POST['body']    ]
        sendto_fn_name = request.POST.get('sendto_fn_name', MessageRequest.SEND_TO_SELF_REAL)

        # Set From address
        if request.POST.get('from', '').strip():
            fromemail = request.POST['from']
        else:
            # String together an address like [email protected]
            fromemail = '%s@%s' % (request.user.username, settings.SITE_INFO[1])

        # Set Reply-To address
        if request.POST.get('replyto', '').strip():
            replytoemail = request.POST['replyto']
        else:
            replytoemail = fromemail

        try:
            filterid = int(filterid)
        except:
            raise ESPError("Corrupted POST data!  Please contact us at [email protected] and tell us how you got this error, and we'll look into it.")

        userlist = PersistentQueryFilter.getFilterFromID(filterid, ESPUser).getList(ESPUser)

        try:
            firstuser = userlist[0]
        except:
            raise ESPError("You seem to be trying to email 0 people!  Please go back, edit your search, and try again.")

        MessageRequest.assert_is_valid_sendto_fn_or_ESPError(sendto_fn_name)

        #   If they were trying to use HTML, don't sanitize the content.
        if '<html>' not in body:
            htmlbody = body.replace('<', '&lt;').replace('>', '&gt;').replace('\n', '<br />')
        else:
            htmlbody = body

        contextdict = {'user'   : ActionHandler(firstuser, firstuser),
                       'program': ActionHandler(self.program, firstuser) }

        renderedtext = Template(htmlbody).render(DjangoContext(contextdict))

        return render_to_response(self.baseDir()+'preview.html', request,
                                              {'filterid': filterid,
                                               'sendto_fn_name': sendto_fn_name,
                                               'listcount': listcount,
                                               'subject': subject,
                                               'from': fromemail,
                                               'replyto': replytoemail,
                                               'body': body,
                                               'renderedtext': renderedtext})
    def classchangerequest(self, request, tl, one, two, module, extra, prog):
        timeslots = prog.getTimeSlots()
        sections = prog.sections().filter(status=10, meeting_times__isnull=False).distinct()

        enrollments = {}
        for timeslot in timeslots:
            try:
                enrollments[timeslot] = ClassSubject.objects.get(nest_Q(StudentRegistration.is_valid_qobject(), 'sections__studentregistration'), sections__studentregistration__relationship__name="Enrolled", sections__studentregistration__user=request.user, sections__meeting_times=timeslot, parent_program=prog)
            except ClassSubject.DoesNotExist:
                enrollments[timeslot] = None

        context = {}
        context['timeslots'] = timeslots
        context['enrollments'] = enrollments
        context['user'] = request.user
        if 'success' in request.GET:
            context['success'] = True
        else:
            context['success'] = False

        if request.user.isStudent():
            sections_by_slot = dict([(timeslot,[(section, 1 == StudentRegistration.valid_objects().filter(user=context['user'], section=section, relationship__name="Request").count()) for section in sections if section.get_meeting_times()[0] == timeslot and section.parent_class.grade_min <= request.user.getGrade(prog) <= section.parent_class.grade_max and section.parent_class not in enrollments.values() and ESPUser.getRankInClass(request.user, section.parent_class) in (5,10)]) for timeslot in timeslots])
        else:
            sections_by_slot = dict([(timeslot,[(section, False) for section in sections if section.get_meeting_times()[0] == timeslot]) for timeslot in timeslots])

        fields = {}
        for i, timeslot in enumerate(sections_by_slot.keys()):
            choices = [('0', "I'm happy with my current enrollment.")]
            initial = '0'
            for section in sections_by_slot[timeslot]:
                choices.append((section[0].emailcode(), section[0].emailcode()+": "+section[0].title()))
                if section[1]:
                    initial = section[0].emailcode()
            fields['timeslot_'+str(i+1)] = forms.ChoiceField(label="Timeslot "+str(i+1)+" ("+timeslot.pretty_time()+")", choices=choices, initial=initial)

        form = type('ClassChangeRequestForm', (forms.Form,), fields)
        context['form'] = form()
        if request.method == "POST":
            old_requests = StudentRegistration.valid_objects().filter(user=context['user'], section__parent_class__parent_program=prog, relationship__name="Request")
            for r in old_requests:
                r.expire()
            form = form(request.POST)
            if form.is_valid():
                for value in form.cleaned_data.values():
                    section = None
                    for s in sections:
                        if s.emailcode() == value:
                            section = s
                            break
                    if not section:
                        continue
                    r = StudentRegistration.valid_objects().get_or_create(user=context['user'], section=section, relationship=RegistrationType.objects.get_or_create(name="Request", category="student")[0])[0]
                    r.save()

                return HttpResponseRedirect(request.path.rstrip('/')+'/?success')
        else:
            return render_to_response(self.baseDir() + 'classchangerequest.html', request, context)
 def medliab(self, request, tl, one, two, module, extra, prog):
     """
     Landing page redirecting to med-liab form on Formstack.
     """
     t = Tag.getProgramTag("formstack_id", self.program)
     v = Tag.getProgramTag("formstack_viewkey", self.program)
     context = {"formstack_id": t, "formstack_viewkey": v}
     return render_to_response(self.baseDir()+'medliab.html',
                               request, context)
Пример #58
0
 def _check(moduleObj, request, tl, *args, **kwargs):
     if test_func(moduleObj):
         return view_method(moduleObj, request, tl, *args, **kwargs)
     errorpage = 'errors/program/deadline-%s.html' % tl
     return render_to_response(
         errorpage,
         request,
         {'extension': error_message, 'moduleObj': moduleObj},
     )