def budgetrequestcategory(request, org, year, category): LineItemFormSet = modelformset_factory(afap.models.LineItem, exclude=('application', 'category'), can_delete=True, extra=10) try: year = afap.models.Year.objects.get(date=RangedDate(int(year), 1, 1)) except (ValueError, afap.models.Year.DoesNotExist): return shortcuts.redirect(urlresolvers.reverse(home)) try: app = afap.models.Application.objects.get(organization=org, year=year.date) category = afap.models.LineItemCategory.objects.get(pk=category, years=year) except afap.models.Application.DoesNotExist: messages.error(request, "You do not have an application for year %s" % year.range) return shortcuts.redirect(urlresolvers.reverse(home)) except afap.models.LineItemCategory.DoesNotExist: return shortcuts.redirect(urlresolvers.reverse(budgetrequest, args=(year.year,))) if redirect_to_application(app): return shortcuts.redirect(urlresolvers.reverse(application, args=(year.year,))) if request.method == 'POST': if year.read_only: return shortcuts.redirect(urlresolvers.reverse(budgetrequestcategory, args=[year.year, category.pk])) formset = LineItemFormSet(request.POST) if formset.is_valid(): instances = formset.save(commit=False) for instance in instances: instance.application = app instance.category = category instance.save() messages.info(request, "Your changes have been saved.") return shortcuts.redirect(urlresolvers.reverse(budgetrequestcategory, args=[year.year, category.pk])) else: formset = LineItemFormSet( queryset=afap.models.LineItem.objects.filter(application=app, category=category)) for form in formset.forms: form.fields['description'].widget.attrs['class'] = 'itemdescription' form.fields['amount'].widget.attrs['class'] = 'itemamount' form.fields['income'].widget.attrs['class'] = 'itemincome' form.fields['DELETE'].widget.attrs['class'] = 'itemdelete' category_sum = sum_line_items( afap.models.LineItem.objects.filter(application=app, category=category)) return shortcuts.render_to_response('budgetrequestcategory.html', { 'formset': formset, 'year': year, 'active_year': year, 'category': category, 'category_sum': category_sum, 'read_only': year.read_only,}, template.RequestContext(request))
def budgetrequest(request, org, year): try: year = afap.models.Year.objects.get(date=RangedDate(int(year), 1, 1)) app = afap.models.Application.objects.get(organization=org, year=year.date) except ValueError: return shortcuts.redirect(urlresolvers.reverse(home)) except afap.models.Application.DoesNotExist: messages.error(request, "You do not have an application for year %s" % year.range) return shortcuts.redirect(urlresolvers.reverse(home)) if redirect_to_application(app): return shortcuts.redirect(urlresolvers.reverse(application, args=(year.year,))) if request.method == 'POST': if year.read_only: return shortcuts.redirect(urlresolvers.reverse(budgetrequest, args=(year.year,))) form = afap.forms.BudgetRequestForm(request.POST, instance=app) if form.is_valid(): form.save() messages.info(request, "Your changes have been saved.") return shortcuts.redirect(urlresolvers.reverse(budgetrequest, args=(year.year,))) else: form = afap.forms.BudgetRequestForm(instance=app) categories = [] current_year = {} # XXX HACKS -- make current year categories always come first! for category in afap.models.LineItemCategory.objects.filter(years__date=year.date).order_by('pk'): category_sum = sum_line_items( afap.models.LineItem.objects.filter(application=app, category=category)) # XXX HACKS if category.name.startswith("Current"): current_year['name'] = category.name current_year['sum'] = category_sum current_year['pk'] = category.pk current_year['end_balance'] = category_sum - app.balance_forward - app.afap_income else: categories.append({'name': category.name, 'sum': category_sum, 'pk': category.pk}) total_sum = sum([x['sum'] for x in categories]) + current_year['end_balance'] total_sum = total_sum or 0 total_request = max(total_sum, 0) return shortcuts.render_to_response('budgetrequest.html', { 'categories': categories, 'total_sum': total_sum, 'year': year, 'active_year': year, 'total_request': total_request, 'form': form, 'current_year': current_year, 'read_only': year.read_only}, template.RequestContext(request))
def signatures(request, org, year): try: year = afap.models.Year.objects.get(date=RangedDate(int(year), 1, 1)) app = afap.models.Application.objects.get(organization=org, year=year.date) except (ValueError, afap.models.Year.DoesNotExist): return shortcuts.redirect(urlresolvers.reverse(home)) except afap.models.Application.DoesNotExist: messages.error(request, "You do not have an application for year %s" % year.range) return shortcuts.redirect(urlresolvers.reverse(home)) if redirect_to_application(app): return shortcuts.redirect(urlresolvers.reverse(application, args=(year.year,))) if request.method == 'POST': people = (app.president, app.treasurer, app.advisor) for approval in app.approval_set.filter(approver__in=people): t = get_template('emails/approve.txt') c = Context({'to': approval.approver.name, 'organization': approval.application.organization.name, 'location': request.build_absolute_uri(urlresolvers.reverse(approve, args=(year.year, approval.key)))}) from_ = afap.models.Year.objects.get(date=approval.application.year).email_from # can we only email when the approver hasn't yet approved the application? approval.approver.email("AFAP Application Approval", t.render(c), from_) return shortcuts.redirect(urlresolvers.reverse(signatures, args=(year.year,))) return shortcuts.render_to_response('signatures.html', {'last_modified': app.last_modified, 'approvals': app.approval_set.all(), 'year': year, 'active_year': year,}, template.RequestContext(request))