Changeset 6b8d891


Ignore:
Timestamp:
Jan 7, 2010, 3:38:24 AM (16 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, client
Children:
42d0bf6
Parents:
169d7b5
git-author:
Alex Dehnert <adehnert@…> (01/07/10 03:38:24)
git-committer:
Alex Dehnert <adehnert@…> (01/07/10 03:38:24)
Message:

Reimbursement submission workflow mostly works

Location:
treasury
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • treasury/templates/vouchers/submit.html

    r269db50 r6b8d891  
    33{% block title %}Submit reimbursement request{% endblock %}
    44{% block content %}
    5 <p>Term: {{term}}</p>
    6 <p>Committee: {{comm}}</p>
     5
     6<h2>UA Reimbursement Request Form</h2>
     7
     8<form method="post">
     9<table>
     10<tr>
     11    <td></td>
     12    <th>You are requesting a reimbursement from:</th>
     13</tr>
     14<tr>
     15    <th>Term</th>
     16    <td>{{term}}</td>
     17</tr>
     18<tr>
     19    <th>Committee</th>
     20    <td>{{comm}}</td>
     21</tr>
     22
     23<tr>
     24    <td></td>
     25    <th>Request details:</th>
     26</tr>
     27{{ form.as_table }}
     28<tr><td></td><td><input type='submit' value='Request Reimbursement' /></td></tr>
     29</table>
     30</form>
     31
    732{% endblock %}
  • treasury/vouchers/models.py

    r6a867b3 r6b8d891  
    1111    check_to_email = models.EmailField(verbose_name="email address for check pickup")
    1212    check_to_addr = models.TextField(blank=True, verbose_name="address for check mailing", help_text="For most requests, this should be blank for pickup in SAO (W20-549)")
    13     amount = models.DecimalField(max_digits=7, decimal_places=2)
     13    amount = models.DecimalField(max_digits=7, decimal_places=2, help_text='Do not include "$"')
    1414    budget_area = models.ForeignKey(BudgetArea)
    1515    budget_term = models.ForeignKey(BudgetTerm)
    1616    request_time = models.DateTimeField(default=datetime.datetime.now)
    17     approval_time = models.DateTimeField(blank=True)
    18     printing_time = models.DateTimeField(blank=True)
    19     name = models.CharField(max_length=50,)
    20     description = models.TextField(blank=True)
     17    approval_time = models.DateTimeField(blank=True, null=True,)
     18    printing_time = models.DateTimeField(blank=True, null=True,)
     19    name = models.CharField(max_length=50, verbose_name='short description', )
     20    description = models.TextField(blank=True, verbose_name='long description', )
    2121
    2222    def __unicode__(self, ):
  • treasury/vouchers/urls.py

    r269db50 r6b8d891  
    33
    44urlpatterns = patterns('',
    5     (r'submit/(?P<term>[\d\w-]+)/(?P<committee>[\d\w-]+)/', 'treasury.vouchers.views.submit_request', )
     5    (r'submit/(?P<term>[\d\w-]+)/(?P<committee>[\d\w-]+)/', 'vouchers.views.submit_request', ),
     6    (r'review/(?P<object_id>\d+)/', 'vouchers.views.review_request', ),
    67)
  • treasury/vouchers/views.py

    r269db50 r6b8d891  
    11import vouchers.models
    22from finance_core.models import BudgetTerm, BudgetArea
     3from vouchers.models import ReimbursementRequest
    34
    4 from django.shortcuts import render_to_response
    5 from django.http import Http404
     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
    611
    7 def submit_request(request, term, committee):
    8     try:
    9         term_obj = BudgetTerm.objects.get(slug=term)
    10     except BudgetTerm.DoesNotExist:
    11         raise Http404
    12     try:
    13         comm_obj = BudgetArea.objects.get(pk=committee)
    14     except BudgetArea.DoesNotExist:
    15         raise Http404
     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)
    1654
    1755    context = {
    1856        'term':term_obj,
    1957        'comm':comm_obj,
     58        'form':form,
    2059    }
    2160    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 TracChangeset for help on using the changeset viewer.