source: remit/vouchers/views.py @ 193cceb

client
Last change on this file since 193cceb was 3a0c51b, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Top navigation bar

  • Property mode set to 100644
File size: 7.2 KB
Line 
1import vouchers.models
2from vouchers.models import ReimbursementRequest
3from finance_core.models import BudgetTerm, BudgetArea
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
9import django.forms
10from django.forms import Form
11from django.forms import ModelForm
12from django.forms import ModelChoiceField
13from django.core.urlresolvers import reverse
14
15import settings
16
17class RequestForm(ModelForm):
18    class Meta:
19        model = ReimbursementRequest
20        fields = (
21            'name',
22            'description',
23            'amount',
24            'budget_area',
25            'expense_area',
26            'check_to_first_name',
27            'check_to_last_name',
28            'check_to_email',
29            'check_to_addr',
30        )
31
32class CommitteesField(ModelChoiceField):
33    def __init__(self, *args, **kargs):
34        base_area = BudgetArea.get_by_path(['Accounts', 'Assets', 'Budget', ])
35        self.strip_levels = base_area.depth
36        areas = (base_area.get_descendants()
37            .filter(depth__lte=base_area.depth+2)
38            .exclude(name='Holding')
39        )
40        ModelChoiceField.__init__(self, queryset=areas,
41            help_text='Select the appropriate committe or other budget area',
42            *args, **kargs)
43
44    def label_from_instance(self, obj,):
45        return obj.indented_name(strip_levels=self.strip_levels)
46
47class SelectRequestBasicsForm(Form):
48    area = CommitteesField()
49    term = ModelChoiceField(queryset = BudgetTerm.objects.all())
50
51@user_passes_test(lambda u: u.is_authenticated())
52def select_request_basics(http_request, ):
53    if http_request.method == 'POST': # If the form has been submitted...
54        form = SelectRequestBasicsForm(http_request.POST) # A form bound to the POST data
55        if form.is_valid(): # All validation rules pass
56            term = form.cleaned_data['term'].slug
57            area = form.cleaned_data['area'].id
58            return HttpResponseRedirect(reverse(submit_request, args=[term, area],)) # Redirect after POST
59    else:
60        form = SelectRequestBasicsForm() # An unbound form
61
62    context = {
63        'form':form,
64        'pagename':'request_reimbursement',
65    }
66    return render_to_response('vouchers/select.html', context, context_instance=RequestContext(http_request), )
67
68class CommitteeBudgetAreasField(ModelChoiceField):
69    def __init__(self, base_area, *args, **kargs):
70        self.strip_levels = base_area.depth
71        areas = base_area.get_descendants()
72        ModelChoiceField.__init__(self, queryset=areas,
73            help_text='In general, this should be a fully indented budget area, not one with children',
74            *args, **kargs)
75
76    def label_from_instance(self, obj,):
77        return obj.indented_name(strip_levels=self.strip_levels)
78
79class ExpenseAreasField(ModelChoiceField):
80    def __init__(self, *args, **kargs):
81        base_area = vouchers.models.BudgetArea.get_by_path(['Accounts', 'Expenses'])
82        self.strip_levels = base_area.depth
83        areas = base_area.get_descendants()
84        ModelChoiceField.__init__(self, queryset=areas,
85            help_text='In general, this should be a fully indented budget area, not one with children',
86            *args, **kargs)
87
88    def label_from_instance(self, obj,):
89        return obj.indented_name(strip_levels=self.strip_levels)
90
91@user_passes_test(lambda u: u.is_authenticated())
92def submit_request(http_request, term, committee):
93    term_obj = get_object_or_404(BudgetTerm, slug=term)
94    comm_obj = get_object_or_404(BudgetArea, pk=committee)
95
96    new_request = ReimbursementRequest()
97    new_request.submitter = http_request.user.username
98    new_request.budget_term = term_obj
99
100    # Prefill from certs
101    initial = {}
102    try:
103        name = http_request.META['SSL_CLIENT_S_DN_CN']
104        names = name.split(' ')
105        initial['check_to_first_name'] = names[0]
106        initial['check_to_last_name'] = names[-1]
107    except KeyError:
108        pass
109    try:
110        initial['check_to_email'] = http_request.META['SSL_CLIENT_S_DN_Email']
111    except KeyError:
112        pass
113
114    if http_request.method == 'POST': # If the form has been submitted...
115        form = RequestForm(http_request.POST, instance=new_request) # A form bound to the POST data
116        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
117        form.fields['expense_area'] = ExpenseAreasField()
118        if form.is_valid(): # All validation rules pass
119            form.save()
120            return HttpResponseRedirect(reverse(review_request, args=[new_request.pk],)) # Redirect after POST
121    else:
122        form = RequestForm(instance=new_request, initial=initial, ) # An unbound form
123        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
124        form.fields['expense_area'] = ExpenseAreasField()
125
126    context = {
127        'term':term_obj,
128        'comm':comm_obj,
129        'form':form,
130        'pagename':'request_reimbursement',
131    }
132    return render_to_response('vouchers/submit.html', context, context_instance=RequestContext(http_request), )
133
134class VoucherizeForm(Form):
135    name = django.forms.CharField(max_length=100)
136    email = django.forms.EmailField(max_length=100)
137
138
139@user_passes_test(lambda u: u.is_authenticated())
140def review_request(http_request, object_id):
141    request_obj = get_object_or_404(ReimbursementRequest, pk=object_id)
142
143    show_approve = (http_request.user.has_perm('vouchers.can_approve')
144        and request_obj.approval_status == vouchers.models.APPROVAL_STATE_PENDING)
145    if show_approve:
146        # Voucherize form
147        # Prefill from certs / config
148        initial = {}
149        try:
150            name = http_request.META['SSL_CLIENT_S_DN_CN']
151            initial['name'] = name
152        except KeyError:
153            pass
154        if settings.SIGNATORY_EMAIL:
155            initial['email'] = settings.SIGNATORY_EMAIL
156        else:
157            try:
158                initial['email'] = http_request.META['SSL_CLIENT_S_DN_Email']
159            except KeyError:
160                pass
161
162        approve_message = ''
163        if http_request.method == 'POST' and 'approve' in http_request.REQUEST:
164            approve_form = VoucherizeForm(http_request.POST)
165            if approve_form.is_valid():
166                voucher = request_obj.convert(
167                    approve_form.cleaned_data['name'],
168                    signatory_email=approve_form.cleaned_data['email'],)
169                approve_message = 'Created new voucher from request'
170        else:
171            approve_form = VoucherizeForm(initial=initial)
172
173    # Display the content
174    if not (http_request.user.has_perm('vouchers.view_requests')
175        or http_request.user.username == request_obj.submitter):
176        # I'd probably use a 403, but that requires like writing
177        # a new template and stuff
178        # So I'm going to call this "don't leak information"
179        # and let it be
180        raise Http404
181    context = {
182        'rr':request_obj,
183        'pagename':'request_reimbursement',
184    }
185    if show_approve:
186        context['approve_form'] = approve_form
187        context['approve_message'] = approve_message
188    return render_to_response('vouchers/ReimbursementRequest_review.html', context, context_instance=RequestContext(http_request), )
189
Note: See TracBrowser for help on using the repository browser.