from django import forms from django.utils.translation import ugettext_lazy as _ from orchestra.admin.utils import admin_link from orchestra.forms import SpanWidget class SelectSourceForm(forms.ModelForm): bill_link = forms.CharField(label=_("Number"), required=False, widget=SpanWidget) account_link = forms.CharField(label=_("Account"), required=False) show_total = forms.CharField(label=_("Total"), required=False, widget=SpanWidget) display_type = forms.CharField(label=_("Type"), required=False, widget=SpanWidget) source = forms.ChoiceField(label=_("Source"), required=False) class Meta: fields = ( 'bill_link', 'display_type', 'account_link', 'show_total', 'source' ) readonly_fields = ('account_link',) def __init__(self, *args, **kwargs): super(SelectSourceForm, self).__init__(*args, **kwargs) bill = kwargs.get('instance') if bill: total = bill.compute_total() sources = bill.account.paymentsources.filter(is_active=True) recharge = bool(total < 0) choices = [(None, '-----------')] for source in sources: if not recharge or source.method_class().allow_recharge: choices.append((source.pk, str(source))) self.fields['source'].choices = choices self.fields['source'].initial = choices[-1][0] self.fields['show_total'].widget.display = total self.fields['bill_link'].widget.display = admin_link('__str__')(bill) self.fields['display_type'].widget.display = bill.get_type_display() def clean_source(self): source_id = self.cleaned_data['source'] if not source_id: return None source_model = self.instance.account.paymentsources.model return source_model.objects.get(id=source_id) def has_changed(self): return False def save(self, commit=True): pass