source: treasury/vouchers/views.py @ 42d0bf6

client
Last change on this file since 42d0bf6 was 6b8d891, checked in by Alex Dehnert <adehnert@…>, 16 years ago

Reimbursement submission workflow mostly works

  • Property mode set to 100644
File size: 2.9 KB
Line 
1import vouchers.models
2from finance_core.models import BudgetTerm, BudgetArea
3from vouchers.models import ReimbursementRequest
4
5from django.contrib.auth.decorators import user_passes_test
6from django.shortcuts import render_to_response, get_object_or_404
7from django.http import Http404, HttpResponseRedirect
8from django.forms import ModelForm
9from django.forms import ModelChoiceField
10from django.core.urlresolvers import reverse
11
12class RequestForm(ModelForm):
13    class Meta:
14        model = ReimbursementRequest
15        fields = (
16            'name',
17            'description',
18            'amount',
19            'budget_area',
20            'check_to_name',
21            'check_to_email',
22            'check_to_addr',
23        )
24
25class BudgetAreaField(ModelChoiceField):
26    def __init__(self, base_area, *args, **kargs):
27        self.strip_levels = base_area.depth
28        areas = base_area.get_descendants()
29        ModelChoiceField.__init__(self, queryset=areas,
30            help_text='In general, this should be a fully indented budget area, not one with children',
31            *args, **kargs)
32
33    def label_from_instance(self, obj,):
34        return obj.indented_name(strip_levels=self.strip_levels)
35
36@user_passes_test(lambda u: u.is_authenticated())
37def submit_request(http_request, term, committee):
38    term_obj = get_object_or_404(BudgetTerm, slug=term)
39    comm_obj = get_object_or_404(BudgetArea, pk=committee)
40
41    new_request = ReimbursementRequest()
42    new_request.submitter = http_request.user.username
43    new_request.budget_term = term_obj
44
45    if http_request.method == 'POST': # If the form has been submitted...
46        form = RequestForm(http_request.POST, instance=new_request) # A form bound to the POST data
47        form.fields['budget_area'] = BudgetAreaField(comm_obj)
48        if form.is_valid(): # All validation rules pass
49            form.save()
50            return HttpResponseRedirect(reverse(review_request, args=[new_request.pk],)) # Redirect after POST
51    else:
52        form = RequestForm(instance=new_request) # An unbound form
53        form.fields['budget_area'] = BudgetAreaField(comm_obj)
54
55    context = {
56        'term':term_obj,
57        'comm':comm_obj,
58        'form':form,
59    }
60    return render_to_response('vouchers/submit.html', context)
61
62@user_passes_test(lambda u: u.is_authenticated())
63def review_request(http_request, object_id):
64    request_obj = get_object_or_404(ReimbursementRequest, pk=object_id)
65    if not (http_request.user.has_perm('vouchers.view_requests')
66        or http_request.user.username == request_obj.submitter):
67        # I'd probably use a 403, but that requires like writing
68        # a new template and stuff
69        # So I'm going to call this "don't leak information"
70        # and let it be
71        raise Http404
72    context = {
73        'rr':request_obj,
74    }
75    return render_to_response('vouchers/ReimbursementRequest_review.html', context)
76
Note: See TracBrowser for help on using the repository browser.