source: remit/vouchers/views.py @ 485673a

client
Last change on this file since 485673a was 248b30b, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Split check recipient into first and last names

  • Property mode set to 100644
File size: 5.2 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.template import RequestContext
8from django.http import Http404, HttpResponseRedirect
9from django.forms import Form
10from django.forms import ModelForm
11from django.forms import ModelChoiceField
12from django.core.urlresolvers import reverse
13
14class RequestForm(ModelForm):
15    class Meta:
16        model = ReimbursementRequest
17        fields = (
18            'name',
19            'description',
20            'amount',
21            'budget_area',
22            'expense_area',
23            'check_to_first_name',
24            'check_to_last_name',
25            'check_to_email',
26            'check_to_addr',
27        )
28
29class CommitteesField(ModelChoiceField):
30    def __init__(self, *args, **kargs):
31        base_area = BudgetArea.get_by_path(['Accounts', 'Assets', 'Budget', ])
32        self.strip_levels = base_area.depth
33        areas = (base_area.get_descendants()
34            .filter(depth__lte=base_area.depth+2)
35            .exclude(name='Holding')
36        )
37        ModelChoiceField.__init__(self, queryset=areas,
38            help_text='Select the appropriate committe or other budget area',
39            *args, **kargs)
40
41    def label_from_instance(self, obj,):
42        return obj.indented_name(strip_levels=self.strip_levels)
43
44class SelectRequestBasicsForm(Form):
45    area = CommitteesField()
46    term = ModelChoiceField(queryset = BudgetTerm.objects.all())
47
48@user_passes_test(lambda u: u.is_authenticated())
49def select_request_basics(http_request, ):
50    if http_request.method == 'POST': # If the form has been submitted...
51        form = SelectRequestBasicsForm(http_request.POST) # A form bound to the POST data
52        if form.is_valid(): # All validation rules pass
53            term = form.cleaned_data['term'].slug
54            area = form.cleaned_data['area'].id
55            return HttpResponseRedirect(reverse(submit_request, args=[term, area],)) # Redirect after POST
56    else:
57        form = SelectRequestBasicsForm() # An unbound form
58
59    context = {
60        'form':form,
61    }
62    return render_to_response('vouchers/select.html', context, context_instance=RequestContext(http_request), )
63
64class CommitteeBudgetAreasField(ModelChoiceField):
65    def __init__(self, base_area, *args, **kargs):
66        self.strip_levels = base_area.depth
67        areas = base_area.get_descendants()
68        ModelChoiceField.__init__(self, queryset=areas,
69            help_text='In general, this should be a fully indented budget area, not one with children',
70            *args, **kargs)
71
72    def label_from_instance(self, obj,):
73        return obj.indented_name(strip_levels=self.strip_levels)
74
75class ExpenseAreasField(ModelChoiceField):
76    def __init__(self, *args, **kargs):
77        base_area = vouchers.models.BudgetArea.get_by_path(['Accounts', 'Expenses'])
78        self.strip_levels = base_area.depth
79        areas = base_area.get_descendants()
80        ModelChoiceField.__init__(self, queryset=areas,
81            help_text='In general, this should be a fully indented budget area, not one with children',
82            *args, **kargs)
83
84    def label_from_instance(self, obj,):
85        return obj.indented_name(strip_levels=self.strip_levels)
86
87@user_passes_test(lambda u: u.is_authenticated())
88def submit_request(http_request, term, committee):
89    term_obj = get_object_or_404(BudgetTerm, slug=term)
90    comm_obj = get_object_or_404(BudgetArea, pk=committee)
91
92    new_request = ReimbursementRequest()
93    new_request.submitter = http_request.user.username
94    new_request.budget_term = term_obj
95
96    if http_request.method == 'POST': # If the form has been submitted...
97        form = RequestForm(http_request.POST, instance=new_request) # A form bound to the POST data
98        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
99        form.fields['expense_area'] = ExpenseAreasField()
100        if form.is_valid(): # All validation rules pass
101            form.save()
102            return HttpResponseRedirect(reverse(review_request, args=[new_request.pk],)) # Redirect after POST
103    else:
104        form = RequestForm(instance=new_request) # An unbound form
105        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
106        form.fields['expense_area'] = ExpenseAreasField()
107
108    context = {
109        'term':term_obj,
110        'comm':comm_obj,
111        'form':form,
112    }
113    return render_to_response('vouchers/submit.html', context, context_instance=RequestContext(http_request), )
114
115@user_passes_test(lambda u: u.is_authenticated())
116def review_request(http_request, object_id):
117    request_obj = get_object_or_404(ReimbursementRequest, pk=object_id)
118    if not (http_request.user.has_perm('vouchers.view_requests')
119        or http_request.user.username == request_obj.submitter):
120        # I'd probably use a 403, but that requires like writing
121        # a new template and stuff
122        # So I'm going to call this "don't leak information"
123        # and let it be
124        raise Http404
125    context = {
126        'rr':request_obj,
127    }
128    return render_to_response('vouchers/ReimbursementRequest_review.html', context, context_instance=RequestContext(http_request), )
129
Note: See TracBrowser for help on using the repository browser.