Changeset 2b31097 for remit/vouchers/views.py
- Timestamp:
- Jul 6, 2014, 11:48:25 PM (11 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
remit/vouchers/views.py
r4439c52 r2b31097 10 10 from django.http import Http404, HttpResponseRedirect 11 11 import django.forms 12 from django.forms import Form 13 from django.forms import ModelForm 14 from django.forms import ModelChoiceField 12 from django.forms import ChoiceField, Form, ModelForm, ModelChoiceField 15 13 from django.core.urlresolvers import reverse 16 14 from django.core.mail import send_mail, mail_admins … … 23 21 import settings 24 22 23 24 class 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 39 class SelectRequestBasicsForm(Form): 40 area = CommitteesField() 41 term = ModelChoiceField(queryset = BudgetTerm.objects.all()) 42 recipient_type = ChoiceField(choices=vouchers.models.recipient_type_choices) 43 44 class 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()) 65 def 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 84 class 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 95 class 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 25 107 class 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 26 123 class Meta: 27 124 model = ReimbursementRequest … … 39 136 ) 40 137 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.depth46 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_type66 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 f72 73 class Meta:74 model = Documentation75 fields = (76 'label',77 'backing_file',78 )79 80 81 138 @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): 139 def submit_request(http_request, term, committee, recipient_type, ): 123 140 term_obj = get_object_or_404(BudgetTerm, slug=term) 124 141 comm_obj = get_object_or_404(BudgetArea, pk=committee) … … 127 144 new_request.submitter = http_request.user.username 128 145 new_request.budget_term = term_obj 146 new_request.recipient_type = recipient_type 129 147 130 148 # Prefill from user information (itself prefilled from LDAP now) … … 137 155 form = RequestForm(http_request.POST, instance=new_request) # A form bound to the POST data 138 156 form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj) 139 form.fields['expense_area'] = ExpenseAreasField()140 157 141 158 if form.is_valid(): # All validation rules pass 142 159 request_obj = form.save() 160 print "request_obj==new_request:", request_obj == new_request 143 161 144 162 # Send email … … 170 188 form = RequestForm(instance=new_request, initial=initial, ) # An unbound form 171 189 form.fields['budget_area'] = CommitteeBudgetAreasField(comm_obj) 172 form.fields['expense_area'] = ExpenseAreasField()173 190 174 191 context = { 175 192 'term':term_obj, 176 193 'comm':comm_obj, 194 'request': new_request, 177 195 'form':form, 178 196 'pagename':'request_reimbursement',
Note: See TracChangeset
for help on using the changeset viewer.