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)
Ejemplo n.º 2
0
def lsr_submit(request, program=None):

    priority_limit = program.priorityLimit()

    # First check whether the user is actually a student.
    if not request.user.isStudent():
        raise ESPError(
            False
        ), "You must be a student in order to access student registration."

    data = json.loads(request.POST['json_data'])

    if priority_limit > 1:
        return lsr_submit_HSSP(
            request, program, priority_limit, data
        )  # temporary function. will merge the two later -jmoldow 05/31

    classes_interest = set()
    classes_no_interest = set()
    classes_flagged = set()
    classes_not_flagged = set()

    reg_priority, created = RegistrationType.objects.get_or_create(
        name="Priority/1", category="student")
    reg_interested, created = RegistrationType.objects.get_or_create(
        name="Interested",
        category="student",
        defaults={
            "description":
            "For lottery reg, a student would be interested in being placed into this class, but it isn't their first choice"
        })

    for reg_token, reg_status in data.iteritems():
        parts = reg_token.split('_')
        if parts[0] == 'flag':
            ## Flagged class
            flag, secid = parts
            if reg_status:
                classes_flagged.add(int(secid))
            else:
                classes_not_flagged.add(int(secid))
        else:
            secid = parts[0]
            if reg_status:
                classes_interest.add(int(secid))
                classes_no_interest.add(int(secid))

    errors = []

    already_flagged_sections = request.user.getSections(
        program=program,
        verbs=[reg_priority.name
               ]).annotate(first_block=Min('meeting_times__start'))
    already_flagged_secids = set(int(x.id) for x in already_flagged_sections)

    flag_related_sections = classes_flagged | classes_not_flagged
    flagworthy_sections = ClassSection.objects.filter(
        id__in=flag_related_sections - already_flagged_secids).annotate(
            first_block=Min('meeting_times__start'))

    sections_by_block = defaultdict(list)
    sections_by_id = {}
    for s in list(flagworthy_sections) + list(already_flagged_sections):
        sections_by_id[int(s.id)] = s
        print s.first_block
        if int(s.id) not in classes_not_flagged:
            sections_by_block[s.first_block].append(s)

    for val in sections_by_block.values():
        if len(val) > 1:
            errors.append({
                "text": "Can't flag two classes at the same time!",
                "cls_sections": [x.id for x in val],
                "block": val[0].firstBlockEvent().id,
                "flagged": True
            })

    if len(errors) == 0:
        for s_id in (already_flagged_secids - classes_flagged):
            sections_by_id[s_id].unpreregister_student(
                request.user, prereg_verb=reg_priority.name)
        for s_id in classes_flagged - already_flagged_secids:
            if not sections_by_id[s_id].preregister_student(
                    request.user, prereg_verb=reg_priority.name,
                    overridefull=True):
                errors.append({
                    "text": "Unable to add flagged class",
                    "cls_sections": [s_id],
                    "emailcode": sections_by_id[s_id].emailcode(),
                    "block": None,
                    "flagged": True
                })

    already_interested_sections = request.user.getSections(
        program=program, verbs=[reg_interested.name])
    already_interested_secids = set(
        int(x.id) for x in already_interested_sections)
    interest_related_sections = classes_interest | classes_no_interest
    sections = ClassSection.objects.filter(
        id__in=(interest_related_sections - flag_related_sections -
                already_flagged_secids - already_interested_secids))

    ## No need to reset sections_by_id
    for s in list(sections) + list(already_interested_sections):
        sections_by_id[int(s.id)] = s

    for s_id in (already_interested_secids - classes_interest):
        sections_by_id[s_id].unpreregister_student(
            request.user, prereg_verb=reg_interested.name)
    for s_id in classes_interest - already_interested_secids:
        print s_id
        if not sections_by_id[s_id].preregister_student(
                request.user, prereg_verb=reg_interested.name,
                overridefull=True):
            errors.append({
                "text": "Unable to add interested class",
                "cls_sections": [s_id],
                "emailcode": sections_by_id[s_id].emailcode(),
                "block": None,
                "flagged": False
            })

    if len(errors) != 0:
        s = StringIO()
        print(errors, s)
        mail_admins('Error in class reg', s.getvalue(), fail_silently=True)

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

    return HttpResponse(json.dumps(errors), mimetype='application/json')
Ejemplo n.º 3
0
    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 = ESPUser(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 prog.isFull() and not user.canRegToFullProgram(
                prog) and not self.program.isConfirmed(user):
            raise ESPError(
                log=False
            ), "This program has filled!  It can't accept any more students.  Please try again next session."

        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(
                False
            ), "You must finish all the necessary steps first, then click on the Save button to finish registration."

        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)
Ejemplo n.º 4
0
def lsr_submit(request, program = None):

    priority_limit = program.priorityLimit()

    data = json.loads(request.POST['json_data'])

    if priority_limit > 1:
        return lsr_submit_HSSP(request, program, priority_limit, data) # temporary function. will merge the two later -jmoldow 05/31

    classes_interest = set()
    classes_no_interest = set()
    classes_flagged = set()
    classes_not_flagged = set()

    reg_priority, created = RegistrationType.objects.get_or_create(name="Priority/1", category="student")
    reg_interested, created = RegistrationType.objects.get_or_create(name="Interested", category="student",
                                                                     defaults={"description":"For lottery reg, a student would be interested in being placed into this class, but it isn't their first choice"})

    for reg_token, reg_status in data.iteritems():
        parts = reg_token.split('_')
        if parts[0] == 'flag':
            ## Flagged class
            flag, secid = parts
            if reg_status:
                classes_flagged.add(int(secid))
            else:
                classes_not_flagged.add(int(secid))
        else:
            secid = parts[0]
            if reg_status:
                classes_interest.add(int(secid))
                classes_no_interest.add(int(secid))

    errors = []

    already_flagged_sections = request.user.getSections(program=program, verbs=[reg_priority.name]).annotate(first_block=Min('meeting_times__start'))
    already_flagged_secids = set(int(x.id) for x in already_flagged_sections)

    flag_related_sections = classes_flagged | classes_not_flagged
    flagworthy_sections = ClassSection.objects.filter(id__in=flag_related_sections-already_flagged_secids).annotate(first_block=Min('meeting_times__start'))

    sections_by_block = defaultdict(list)
    sections_by_id = {}
    for s in list(flagworthy_sections) + list(already_flagged_sections):
        sections_by_id[int(s.id)] = s
        if int(s.id) not in classes_not_flagged:
            sections_by_block[s.first_block].append(s)

    for val in sections_by_block.values():
        if len(val) > 1:
            errors.append({"text": "Can't flag two classes at the same time!", "cls_sections": [x.id for x in val], "block": val[0].firstBlockEvent().id, "flagged": True})

    if len(errors) == 0:
        for s_id in (already_flagged_secids - classes_flagged):
            sections_by_id[s_id].unpreregister_student(request.user, prereg_verb=reg_priority.name)
        for s_id in classes_flagged - already_flagged_secids:
            if not sections_by_id[s_id].preregister_student(request.user, prereg_verb=reg_priority.name, overridefull=True):
                errors.append({"text": "Unable to add flagged class", "cls_sections": [s_id], "emailcode": sections_by_id[s_id].emailcode(), "block": None, "flagged": True})

    already_interested_sections = request.user.getSections(program=program, verbs=[reg_interested.name])
    already_interested_secids = set(int(x.id) for x in already_interested_sections)
    interest_related_sections = classes_interest | classes_no_interest
    sections = ClassSection.objects.filter(id__in = (interest_related_sections - flag_related_sections - already_flagged_secids - already_interested_secids))

    ## No need to reset sections_by_id
    for s in list(sections) + list(already_interested_sections):
        sections_by_id[int(s.id)] = s

    for s_id in (already_interested_secids - classes_interest):
        sections_by_id[s_id].unpreregister_student(request.user, prereg_verb=reg_interested.name)
    for s_id in classes_interest - already_interested_secids:
        if not sections_by_id[s_id].preregister_student(request.user, prereg_verb=reg_interested.name, overridefull=True):
            errors.append({"text": "Unable to add interested class", "cls_sections": [s_id], "emailcode": sections_by_id[s_id].emailcode(), "block": None, "flagged": False})

    if len(errors) != 0:
        mail_admins('Error in class reg', str(errors), fail_silently=True)

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

    return HttpResponse(json.dumps(errors), content_type='application/json')
Ejemplo n.º 5
0
    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

        try:
            invoice = Document.get_invoice(request.user, prog.anchor, LineItemType.objects.filter(anchor=GetNode(prog.anchor.get_uri()+'/LineItemTypes/Required')), dont_duplicate=True, get_complete=True)
        except:
            invoice = Document.get_invoice(request.user, prog.anchor, LineItemType.objects.filter(anchor=GetNode(prog.anchor.get_uri()+'/LineItemTypes/Required')), dont_duplicate=True)

        #   Why is get_complete false?
        receipt = Document.get_receipt(request.user, prog.anchor, [], get_complete=False)

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

        context['itemizedcosts'] = invoice.get_items()

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

        try:
            context['balance'] = Decimal("%0.2f" % invoice.cost())
        except EmptyTransactionException:
            context['balance'] = Decimal("0.0")
            
        context['owe_money'] = ( context['balance'] != Decimal("0.0") )

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

        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:
                bit = UserBit.objects.create(user=user, verb=GetNode("V/Flags/Public"), qsc=GetNode("/".join(prog.anchor.tree_encode()) + "/Confirmation"))
        else:
            raise ESPError(False), "You must finish all the necessary steps first, then click on the Save button to finish registration."

        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, (prog, tl), context)
            except:
                receipt = 'program/receipts/default.html'
                return render_to_response(receipt, request, (prog, tl), context)