def clean(self, value): if not isinstance(value, tuple): raise Exception("Invalid value provided for MoneyField.clean (expected tupple)") amount = super(MoneyField, self).clean(value[0]) currency = value[1] if not currency: raise forms.ValidationError(_(u"Input currency")) currency = currency.upper() if not currency_provider().get(currency, False) or currency == u"XXX": raise forms.ValidationError(_(u"This currency not exist")) return Money(amount=amount, currency=currency)
objects = CurrencyManager() def __unicode__(self): return self.name def save(self, *args, **kwargs): if self.default and self.pk: type(self).objects.exclude(pk=self.pk, default=False).update(default=False) return models.Model.save(self, *args, **kwargs) class Meta: ordering = ['-default', 'code'] verbose_name_plural = "currencies" ORIGINAL_CURRENCIES = money.currency_provider() money.set_currency_provider(Currency.objects) def _load_currencies(): for key, value in ORIGINAL_CURRENCIES.iteritems(): if key == 'XXX': continue Currency.objects.get_or_create(name=value.name, code=value.code, numeric=value.numeric) try: Currency.objects.default() except Currency.DoesNotExist: new_default = Currency.objects['USD'] new_default.default = True new_default.save()
def choices(): yield '', '--' for key in currency_provider().iterkeys(): yield key, key
from django import forms from money import Money, currency_provider from decimal import Decimal __all__ = ('InputMoneyWidget', 'CurrencySelect',) CURRENCY_CHOICES = ((c.code, c.name) for i, c in currency_provider().items() if c.code != 'XXX') class CurrencySelect(forms.Select): def __init__(self, attrs=None, choices=CURRENCY_CHOICES): super(CurrencySelect, self).__init__(attrs, choices) class InputMoneyWidget(forms.TextInput): def __init__(self, attrs=None, currency_widget=None): self.currency_widget = currency_widget if not self.currency_widget: self.currency_widget = CurrencySelect() super(InputMoneyWidget, self).__init__(attrs) def render(self, name, value, attrs=None): amount = '' currency = '' if isinstance(value, Money): amount = value.amount currency = value.currency.code if isinstance(value, tuple): amount = value[0] currency = value[1] if isinstance(value, int) or isinstance(value, Decimal): amount = value