source: remit/vouchers/views.py @ 5cbf234

client
Last change on this file since 5cbf234 was 92ca60e, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Rename treasury to remit

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