Ignore:
Timestamp:
Jul 6, 2014, 11:48:25 PM (11 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master
Children:
7ee21d8
Parents:
4439c52
git-author:
Alex Dehnert <adehnert@…> (07/06/14 23:48:25)
git-committer:
Alex Dehnert <adehnert@…> (07/06/14 23:48:25)
Message:

WIP: gather info needed for RFPs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • remit/vouchers/views.py

    r4439c52 r2b31097  
    1010from django.http import Http404, HttpResponseRedirect
    1111import django.forms
    12 from django.forms import Form
    13 from django.forms import ModelForm
    14 from django.forms import ModelChoiceField
     12from django.forms import ChoiceField, Form, ModelForm, ModelChoiceField
    1513from django.core.urlresolvers import reverse
    1614from django.core.mail import send_mail, mail_admins
     
    2321import settings
    2422
     23
     24class CommitteesField(ModelChoiceField):
     25    def __init__(self, *args, **kargs):
     26        base_area = BudgetArea.get_by_path(settings.BASE_COMMITTEE_PATH)
     27        self.strip_levels = base_area.depth
     28        areas = (base_area.get_descendants()
     29            .filter(depth__lte=base_area.depth+settings.COMMITTEE_HIERARCHY_LEVELS)
     30            .exclude(name='Holding')
     31        )
     32        ModelChoiceField.__init__(self, queryset=areas,
     33            help_text='Select the appropriate committe or other budget area',
     34            *args, **kargs)
     35
     36    def label_from_instance(self, obj,):
     37        return obj.indented_name(strip_levels=self.strip_levels)
     38
     39class SelectRequestBasicsForm(Form):
     40    area = CommitteesField()
     41    term = ModelChoiceField(queryset = BudgetTerm.objects.all())
     42    recipient_type = ChoiceField(choices=vouchers.models.recipient_type_choices)
     43
     44class DocUploadForm(ModelForm):
     45    def clean_backing_file(self, ):
     46        f = self.cleaned_data['backing_file']
     47        ext = f.name.rsplit('.')[-1]
     48        contenttype = f.content_type
     49        if ext != 'pdf':
     50            raise django.forms.ValidationError(u"Only PDF files are accepted – you submitted a .%s file" % (ext, ))
     51        elif contenttype != 'application/pdf':
     52            raise django.forms.ValidationError(u"Only PDF files are accepted – you submitted a %s file" % (contenttype, ))
     53        else:
     54            return f
     55
     56    class Meta:
     57        model = Documentation
     58        fields = (
     59            'label',
     60            'backing_file',
     61        )
     62
     63
     64@user_passes_test(lambda u: u.is_authenticated())
     65def select_request_basics(http_request, ):
     66    if http_request.method == 'POST': # If the form has been submitted...
     67        form = SelectRequestBasicsForm(http_request.POST) # A form bound to the POST data
     68        if form.is_valid(): # All validation rules pass
     69            term = form.cleaned_data['term'].slug
     70            area = form.cleaned_data['area'].id
     71            recipient_type = form.cleaned_data['recipient_type']
     72            url = reverse(submit_request, args=[term, area, recipient_type],)
     73            return HttpResponseRedirect(url) # Redirect after POST
     74    else:
     75        form = SelectRequestBasicsForm() # An unbound form
     76
     77    context = {
     78        'form':form,
     79        'pagename':'request_reimbursement',
     80    }
     81    return render_to_response('vouchers/select.html', context, context_instance=RequestContext(http_request), )
     82
     83
     84class CommitteeBudgetAreasField(ModelChoiceField):
     85    def __init__(self, base_area, *args, **kargs):
     86        self.strip_levels = base_area.depth
     87        areas = base_area.get_descendants()
     88        ModelChoiceField.__init__(self, queryset=areas,
     89            help_text='In general, this should be a fully indented budget area, not one with children',
     90            *args, **kargs)
     91
     92    def label_from_instance(self, obj,):
     93        return obj.indented_name(strip_levels=self.strip_levels)
     94
     95class ExpenseAreasField(ModelChoiceField):
     96    def __init__(self, *args, **kargs):
     97        base_area = vouchers.models.BudgetArea.get_by_path(['Accounts', 'Expenses'])
     98        self.strip_levels = base_area.depth
     99        areas = base_area.get_descendants()
     100        ModelChoiceField.__init__(self, queryset=areas,
     101            help_text='In general, this should be a fully indented budget area, not one with children',
     102            *args, **kargs)
     103
     104    def label_from_instance(self, obj,):
     105        return obj.indented_name(strip_levels=self.strip_levels)
     106
    25107class RequestForm(ModelForm):
     108    expense_area = ExpenseAreasField()
     109
     110    def __init__(self, *args, **kwargs):
     111        super(RequestForm, self).__init__(*args, **kwargs)
     112        if self.instance.recipient_type == 'mit':
     113            addr_widget = django.forms.HiddenInput()
     114            self.fields['check_to_addr'].widget = addr_widget
     115        else:
     116            rfp = vouchers.models.RFP
     117            error_msgs = dict(invalid=rfp.addr_error)
     118            addr_widget = self.fields['check_to_addr'].widget
     119            addr_field = django.forms.RegexField(regex=rfp.addr_regex, error_messages=error_msgs)
     120            addr_field.widget = addr_widget
     121            self.fields['check_to_addr'] = addr_field
     122
    26123    class Meta:
    27124        model = ReimbursementRequest
     
    39136        )
    40137
    41 
    42 class CommitteesField(ModelChoiceField):
    43     def __init__(self, *args, **kargs):
    44         base_area = BudgetArea.get_by_path(settings.BASE_COMMITTEE_PATH)
    45         self.strip_levels = base_area.depth
    46         areas = (base_area.get_descendants()
    47             .filter(depth__lte=base_area.depth+settings.COMMITTEE_HIERARCHY_LEVELS)
    48             .exclude(name='Holding')
    49         )
    50         ModelChoiceField.__init__(self, queryset=areas,
    51             help_text='Select the appropriate committe or other budget area',
    52             *args, **kargs)
    53 
    54     def label_from_instance(self, obj,):
    55         return obj.indented_name(strip_levels=self.strip_levels)
    56 
    57 class SelectRequestBasicsForm(Form):
    58     area = CommitteesField()
    59     term = ModelChoiceField(queryset = BudgetTerm.objects.all())
    60 
    61 class DocUploadForm(ModelForm):
    62     def clean_backing_file(self, ):
    63         f = self.cleaned_data['backing_file']
    64         ext = f.name.rsplit('.')[-1]
    65         contenttype = f.content_type
    66         if ext != 'pdf':
    67             raise django.forms.ValidationError(u"Only PDF files are accepted – you submitted a .%s file" % (ext, ))
    68         elif contenttype != 'application/pdf':
    69             raise django.forms.ValidationError(u"Only PDF files are accepted – you submitted a %s file" % (contenttype, ))
    70         else:
    71             return f
    72 
    73     class Meta:
    74         model = Documentation
    75         fields = (
    76             'label',
    77             'backing_file',
    78         )
    79 
    80 
    81138@user_passes_test(lambda u: u.is_authenticated())
    82 def select_request_basics(http_request, ):
    83     if http_request.method == 'POST': # If the form has been submitted...
    84         form = SelectRequestBasicsForm(http_request.POST) # A form bound to the POST data
    85         if form.is_valid(): # All validation rules pass
    86             term = form.cleaned_data['term'].slug
    87             area = form.cleaned_data['area'].id
    88             return HttpResponseRedirect(reverse(submit_request, args=[term, area],)) # Redirect after POST
    89     else:
    90         form = SelectRequestBasicsForm() # An unbound form
    91 
    92     context = {
    93         'form':form,
    94         'pagename':'request_reimbursement',
    95     }
    96     return render_to_response('vouchers/select.html', context, context_instance=RequestContext(http_request), )
    97 
    98 class CommitteeBudgetAreasField(ModelChoiceField):
    99     def __init__(self, base_area, *args, **kargs):
    100         self.strip_levels = base_area.depth
    101         areas = base_area.get_descendants()
    102         ModelChoiceField.__init__(self, queryset=areas,
    103             help_text='In general, this should be a fully indented budget area, not one with children',
    104             *args, **kargs)
    105 
    106     def label_from_instance(self, obj,):
    107         return obj.indented_name(strip_levels=self.strip_levels)
    108 
    109 class ExpenseAreasField(ModelChoiceField):
    110     def __init__(self, *args, **kargs):
    111         base_area = vouchers.models.BudgetArea.get_by_path(['Accounts', 'Expenses'])
    112         self.strip_levels = base_area.depth
    113         areas = base_area.get_descendants()
    114         ModelChoiceField.__init__(self, queryset=areas,
    115             help_text='In general, this should be a fully indented budget area, not one with children',
    116             *args, **kargs)
    117 
    118     def label_from_instance(self, obj,):
    119         return obj.indented_name(strip_levels=self.strip_levels)
    120 
    121 @user_passes_test(lambda u: u.is_authenticated())
    122 def submit_request(http_request, term, committee):
     139def submit_request(http_request, term, committee, recipient_type, ):
    123140    term_obj = get_object_or_404(BudgetTerm, slug=term)
    124141    comm_obj = get_object_or_404(BudgetArea, pk=committee)
     
    127144    new_request.submitter = http_request.user.username
    128145    new_request.budget_term = term_obj
     146    new_request.recipient_type = recipient_type
    129147
    130148    # Prefill from user information (itself prefilled from LDAP now)
     
    137155        form = RequestForm(http_request.POST, instance=new_request) # A form bound to the POST data
    138156        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
    139         form.fields['expense_area'] = ExpenseAreasField()
    140157
    141158        if form.is_valid(): # All validation rules pass
    142159            request_obj = form.save()
     160            print "request_obj==new_request:", request_obj == new_request
    143161
    144162            # Send email
     
    170188        form = RequestForm(instance=new_request, initial=initial, ) # An unbound form
    171189        form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj)
    172         form.fields['expense_area'] = ExpenseAreasField()
    173190
    174191    context = {
    175192        'term':term_obj,
    176193        'comm':comm_obj,
     194        'request': new_request,
    177195        'form':form,
    178196        'pagename':'request_reimbursement',
Note: See TracChangeset for help on using the changeset viewer.