source: treasury/vouchers/views.py @ 17193ee

client
Last change on this file since 17193ee was 17193ee, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Revert e0689aa551b3a4489dcfed08ed1a829c1412cdc1

It appears to break things horribly.

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