HackAssistant/registration

View on GitHub
reimbursement/forms.py

Summary

Maintainability
B
6 hrs
Test Coverage
from django import forms
from django.conf import settings
from django.forms import ModelForm
from django.template.defaultfilters import filesizeformat

from app.mixins import BootstrapFormMixin
from reimbursement.models import Reimbursement, check_friend_emails


class ReceiptSubmissionReceipt(BootstrapFormMixin, ModelForm):
    bootstrap_field_info = {
        'Upload your receipt': {
            'fields': [{'name': 'receipt', 'space': 12}, {'name': 'multiple_hackers', 'space': 12},
                       {'name': 'friend_emails', 'space': 12}, ],
        },
        'Where should we send you the monies?': {
            'fields': [{'name': 'venmo_user', 'space': 12}, {'name': 'paypal_email', 'space': 12}, ],
        },
        'Where are you joining us from?': {
            'fields': [{'name': 'origin', 'space': 12}, ],
        }
    }

    def __init__(self, *args, **kwargs):
        super(ReceiptSubmissionReceipt, self).__init__(*args, **kwargs)
        self.fields['receipt'].required = True

    def clean_friend_emails(self):
        multipl_hacks = self.cleaned_data.get('friend_emails', '')
        if multipl_hacks:
            try:
                check_friend_emails(multipl_hacks, self.instance.hacker.email)
            except Exception as e:
                raise forms.ValidationError(str(e))
        return multipl_hacks

    def clean_paypal_email(self):
        venmo = self.cleaned_data.get('venmo_user', '')
        paypal = self.cleaned_data.get('paypal_email', '')
        if not venmo and not paypal:
            raise forms.ValidationError("Please add either venmo or paypal so we can send you reimbursement")
        return paypal

    def clean_receipt(self):
        receipt = self.cleaned_data['receipt']
        size = getattr(receipt, '_size', 0)
        if size > settings.MAX_UPLOAD_SIZE:
            raise forms.ValidationError("Please keep resume under %s. Current filesize %s" % (
                filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(size)))
        return receipt

    def save(self, commit=True):
        reimb = super(ReceiptSubmissionReceipt, self).save(commit=False)
        reimb.submit_receipt()
        if commit:
            reimb.save()
        return reimb

    class Meta:
        model = Reimbursement
        fields = (
            'venmo_user', 'paypal_email', 'receipt', 'multiple_hackers', 'friend_emails', 'origin',)
        widgets = {
            'origin': forms.TextInput(attrs={'autocomplete': 'off'}),
        }

        labels = {
            'multiple_hackers': 'This receipt covers multiple hackers',
            'friend_emails': 'Hackers emails'
        }

        help_texts = {
            'friend_emails': 'Comma separated, use emails your friends used to register'
        }


class RejectReceiptForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(RejectReceiptForm, self).__init__(*args, **kwargs)
        self.fields['public_comment'].required = True

    class Meta:
        model = Reimbursement
        fields = (
            'public_comment',
        )
        labels = {
            'public_comment': 'Why is this receipt being rejected?'
        }


class AcceptReceiptForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(AcceptReceiptForm, self).__init__(*args, **kwargs)
        self.fields['reimbursement_money'].required = True

    class Meta:
        model = Reimbursement
        fields = (
            'reimbursement_money', 'origin',)
        labels = {
            'reimbursement_money': 'Total cost in receipt'
        }

        widgets = {
            'origin': forms.TextInput(attrs={'autocomplete': 'off'}),
        }


class EditReimbursementForm(ModelForm):
    def __getitem__(self, item):
        item = super(EditReimbursementForm, self).__getitem__(item)
        # Hide reimbursement money if it has not been approved yet!
        if not self.instance.is_accepted() and item.name == 'reimbursement_money':
            item.field.widget = forms.HiddenInput()
        else:
            item.field.required = True
        return item

    class Meta:
        model = Reimbursement
        fields = ('reimbursement_money', 'expiration_time',)
        labels = {
            'reimbursement_money': 'Amount to be reimbursed',
            'expiration_time': 'When is the reimbursement expiring?'
        }