diff --git a/TODO.md b/TODO.md index 653251de..6972c886 100644 --- a/TODO.md +++ b/TODO.md @@ -424,3 +424,6 @@ Colaesce('total', 'computed_total') Case # case on payment transaction state ? case when trans.amount > + + +# ORDERS keep content_object verbose name for deleted objects diff --git a/orchestra/admin/utils.py b/orchestra/admin/utils.py index a74b04f2..b5b01b7c 100644 --- a/orchestra/admin/utils.py +++ b/orchestra/admin/utils.py @@ -109,7 +109,7 @@ def admin_link(*args, **kwargs): return '---' display = kwargs.get('display') if display: - display = getattr(obj, display, 'merda') + display = getattr(obj, display, None) else: display = obj try: diff --git a/orchestra/contrib/domains/models.py b/orchestra/contrib/domains/models.py index 050d6d53..febc3223 100644 --- a/orchestra/contrib/domains/models.py +++ b/orchestra/contrib/domains/models.py @@ -20,24 +20,36 @@ class Domain(models.Model): top = models.ForeignKey('domains.Domain', null=True, related_name='subdomain_set', editable=False) serial = models.IntegerField(_("serial"), default=utils.generate_zone_serial, editable=False, - help_text=_("A timestamp that changes whenever you update your domain.")) + help_text=_("A revision number that changes whenever you update your domain.")) refresh = models.IntegerField(_("refresh"), null=True, blank=True, validators=[validators.validate_zone_interval], - help_text=_("The number of seconds before the zone should be refreshed " - "(%s by default).") % settings.DOMAINS_DEFAULT_REFRESH) + help_text=_("The time a secondary DNS server waits before querying the primary DNS " + "server's SOA record to check for changes. When the refresh time expires, " + "the secondary DNS server requests a copy of the current SOA record from " + "the primary. The primary DNS server complies with this request. " + "The secondary DNS server compares the serial number of the primary DNS " + "server's current SOA record and the serial number in it's own SOA record. " + "If they are different, the secondary DNS server will request a zone " + "transfer from the primary DNS server. " + "The default value is %s.") % settings.DOMAINS_DEFAULT_REFRESH) retry = models.IntegerField(_("retry"), null=True, blank=True, validators=[validators.validate_zone_interval], - help_text=_("The number of seconds before a failed refresh should be retried " - "(%s by default).") % settings.DOMAINS_DEFAULT_RETRY) + help_text=_("The time a secondary server waits before retrying a failed zone transfer. " + "Normally, the retry time is less than the refresh time. " + "The default value is %s.") % settings.DOMAINS_DEFAULT_RETRY) expire = models.IntegerField(_("expire"), null=True, blank=True, validators=[validators.validate_zone_interval], - help_text=_("The upper limit in seconds before a zone is considered no longer " - "authoritative (%s by default).") % settings.DOMAINS_DEFAULT_EXPIRE) - min_ttl = models.IntegerField(_("refresh"), null=True, blank=True, + help_text=_("The time that a secondary server will keep trying to complete a zone " + "transfer. If this time expires prior to a successful zone transfer, " + "the secondary server will expire its zone file. This means the secondary " + "will stop answering queries. " + "The default value is %s.") % settings.DOMAINS_DEFAULT_EXPIRE) + min_ttl = models.IntegerField(_("min TTL"), null=True, blank=True, validators=[validators.validate_zone_interval], - help_text=_("The negative result TTL (for example, how long a resolver should " - "consider a negative result for a subdomain to be valid before retrying) " - "(%s by default).") % settings.DOMAINS_DEFAULT_MIN_TTL) + help_text=_("The minimum time-to-live value applies to all resource records in the " + "zone file. This value is supplied in query responses to inform other " + "servers how long they should keep the data in cache. " + "The default value is %s.") % settings.DOMAINS_DEFAULT_MIN_TTL) def __str__(self): return self.name diff --git a/orchestra/contrib/orders/admin.py b/orchestra/contrib/orders/admin.py index bc6fa5d3..9f687067 100644 --- a/orchestra/contrib/orders/admin.py +++ b/orchestra/contrib/orders/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from django.core.urlresolvers import reverse +from django.core.urlresolvers import reverse, NoReverseMatch from django.db.models import Prefetch from django.utils import timezone from django.utils.html import escape @@ -7,7 +7,7 @@ from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from orchestra.admin import ExtendedModelAdmin -from orchestra.admin.utils import admin_link, admin_date +from orchestra.admin.utils import admin_link, admin_date, change_url from orchestra.contrib.accounts.admin import AccountAdminMixin from orchestra.utils.humanize import naturaldate @@ -60,18 +60,33 @@ class OrderAdmin(AccountAdminMixin, ExtendedModelAdmin): date_hierarchy = 'registered_on' inlines = (MetricStorageInline,) add_inlines = () - search_fields = ('account__username', 'description') + search_fields = ('account__username', 'content_object_repr', 'description',) list_prefetch_related = ( 'content_object', Prefetch('metrics', queryset=MetricStorage.objects.order_by('-id')), ) list_select_related = ('account', 'service') + readonly_fields = ('content_object_repr', 'content_object_link') service_link = admin_link('service') - content_object_link = admin_link('content_object', order=False) display_registered_on = admin_date('registered_on') display_cancelled_on = admin_date('cancelled_on') + def content_object_link(self, order): + if order.content_object: + try: + url = change_url(order.content_object) + except NoReverseMatch: + # Does not has admin + return order.content_object_repr + description = str(order.content_object) + return '{description}'.format( + url=url, description=description) + return order.content_object_repr + content_object_link.short_description = _("Content object") + content_object_link.allow_tags = True + content_object_link.admin_order_field = 'content_object_repr' + def display_billed_until(self, order): billed_until = order.billed_until red = False diff --git a/orchestra/contrib/orders/models.py b/orchestra/contrib/orders/models.py index 9305b16b..11ee27e3 100644 --- a/orchestra/contrib/orders/models.py +++ b/orchestra/contrib/orders/models.py @@ -118,6 +118,8 @@ class Order(models.Model): billed_until = models.DateField(_("billed until"), null=True, blank=True) ignore = models.BooleanField(_("ignore"), default=False) description = models.TextField(_("description"), blank=True) + content_object_repr = models.CharField(_("content object representation"), max_length=256, + editable=False) content_object = GenericForeignKey() objects = OrderQuerySet.as_manager() @@ -146,8 +148,12 @@ class Order(models.Model): # New account workaround -> user.account_id == None continue ignore = service.handler.get_ignore(instance) - order = cls(content_object=instance, service=service, - account_id=account_id, ignore=ignore) + order = cls( + content_object=instance, + content_object_repr=str(instance), + service=service, + account_id=account_id, + ignore=ignore) if commit: order.save() updates.append((order, 'created')) @@ -187,9 +193,16 @@ class Order(models.Model): logger.info("UPDATED order id:{id}, description:{description}{metric}".format( id=self.id, description=description, metric=metric).encode('ascii', 'replace') ) + update_fields = [] if self.description != description: self.description = description - self.save(update_fields=['description']) + update_fields.append('description') + content_object_repr = str(instance) + if self.content_object_repr != content_object_repr: + self.content_object_repr = content_object_repr + update_fields.append('content_object_repr') + if update_fields: + self.save(update_fields=update_fields) def cancel(self, commit=True): self.cancelled_on = timezone.now() diff --git a/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.mo b/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.mo index d130159a..b1132507 100644 Binary files a/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.mo and b/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.mo differ diff --git a/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.po b/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.po index 3d9c3bba..302a0436 100644 --- a/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.po +++ b/orchestra/contrib/payments/locale/ca/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-28 16:40+0000\n" +"POT-Creation-Date: 2015-07-15 12:08+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,133 +18,154 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions.py:21 +#: actions.py:24 msgid "Selected transactions must be on '{state}' state" msgstr "" -#: actions.py:30 +#: actions.py:34 msgid "Processed" msgstr "" -#: actions.py:37 -msgid "Selected transaction has been processed." +#: actions.py:41 +msgid "One selected transaction has been processed." msgstr "" -#: actions.py:38 +#: actions.py:42 #, python-format msgid "%s Selected transactions have been processed." msgstr "" -#: actions.py:41 +#: actions.py:45 msgid "" "The following transaction process has been generated, you may want to save " "it on your computer now." msgstr "" -#: actions.py:43 +#: actions.py:47 #, python-format msgid "" "The following %s transaction processes have been generated, you may want to " "save it on your computer now." msgstr "" -#: actions.py:46 +#: actions.py:50 msgid "Process" msgstr "" -#: actions.py:59 actions.py:130 models.py:93 models.py:161 +#: actions.py:63 actions.py:134 models.py:97 models.py:164 msgid "Executed" msgstr "" -#: actions.py:62 +#: actions.py:66 msgid "One selected transaction has been marked as executed." msgstr "" -#: actions.py:63 +#: actions.py:67 #, python-format msgid "%s selected transactions have been marked as executed." msgstr "" -#: actions.py:67 actions.py:138 +#: actions.py:71 actions.py:142 msgid "Mark as executed" msgstr "" -#: actions.py:75 models.py:94 +#: actions.py:79 models.py:98 msgid "Secured" msgstr "" -#: actions.py:78 +#: actions.py:82 msgid "One selected transaction has been marked as secured." msgstr "" -#: actions.py:79 +#: actions.py:83 #, python-format msgid "%s selected transactions have been marked as secured." msgstr "" -#: actions.py:83 +#: actions.py:87 msgid "Mark as secured" msgstr "" -#: actions.py:91 actions.py:162 models.py:95 +#: actions.py:95 actions.py:166 models.py:99 msgid "Rejected" msgstr "" -#: actions.py:94 actions.py:165 +#: actions.py:98 actions.py:169 msgid "One selected transaction has been marked as rejected." msgstr "" -#: actions.py:95 actions.py:166 +#: actions.py:99 actions.py:170 #, python-format msgid "%s selected transactions have been marked as rejected." msgstr "" -#: actions.py:99 +#: actions.py:103 msgid "Mark as rejected" msgstr "" -#: actions.py:133 +#: actions.py:137 msgid "One selected process has been marked as executed." msgstr "" -#: actions.py:134 +#: actions.py:138 #, python-format msgid "%s selected processes have been marked as executed." msgstr "" -#: actions.py:146 models.py:162 +#: actions.py:150 models.py:165 msgid "Aborted" msgstr "" -#: actions.py:149 +#: actions.py:153 msgid "One selected process has been aborted." msgstr "" -#: actions.py:150 +#: actions.py:154 #, python-format msgid "%s selected processes have been aborted." msgstr "" -#: actions.py:154 +#: actions.py:158 msgid "Abort" msgstr "" -#: actions.py:170 +#: actions.py:174 msgid "Commit" msgstr "" -#: admin.py:42 +#: admin.py:43 msgid "ID" msgstr "" -#: admin.py:101 +#: admin.py:105 msgid "proc" msgstr "" -#: admin.py:152 +#: admin.py:158 msgid "Transactions" msgstr "" +#: helpers.py:11 +msgid "No transaction process selected." +msgstr "" + +#: helpers.py:15 +msgid "Done nothing. Not all related transactions in waitting execution." +msgstr "" + +#: helpers.py:32 +msgid "Unprocessed" +msgstr "" + +#: helpers.py:34 +#, python-format +msgid "" +"One related transaction has been marked as waitting for processing" +msgid_plural "" +"%i related transactions have been marked as waitting for processing." +msgstr[0] "" +msgstr[1] "" + #: methods/creditcard.py:11 msgid "Label" msgstr "" @@ -165,86 +186,123 @@ msgstr "" msgid "SEPA Direct Debit" msgstr "" -#: methods/sepadirectdebit.py:48 -msgid "" -"This bill will be automatically charged to your bank account with IBAN " -"number
%s." -msgstr "" -"Aquesta factura es cobrarà automaticament en el teu compte bancari amb IBAN " -"
%s." - -#: models.py:19 +#: models.py:20 msgid "account" msgstr "" -#: models.py:21 +#: models.py:22 msgid "method" msgstr "" -#: models.py:23 models.py:166 +#: models.py:24 models.py:169 msgid "data" msgstr "" -#: models.py:24 +#: models.py:25 msgid "active" msgstr "" -#: models.py:91 +#: models.py:95 msgid "Waitting processing" msgstr "" -#: models.py:92 +#: models.py:96 msgid "Waitting execution" msgstr "" -#: models.py:98 +#: models.py:102 msgid "bill" msgstr "" -#: models.py:101 +#: models.py:105 msgid "source" msgstr "" -#: models.py:103 +#: models.py:107 msgid "process" msgstr "" -#: models.py:104 models.py:168 +#: models.py:108 models.py:171 msgid "state" msgstr "" -#: models.py:106 +#: models.py:110 msgid "amount" msgstr "" -#: models.py:108 models.py:169 +#: models.py:112 models.py:172 msgid "created" msgstr "" -#: models.py:109 +#: models.py:113 msgid "modified" msgstr "" -#: models.py:124 +#: models.py:128 msgid "New transactions can not be allocated for this bill." msgstr "" -#: models.py:160 +#: models.py:163 templates/admin/payments/transaction/report.html:63 msgid "Created" msgstr "" -#: models.py:163 +#: models.py:166 msgid "Commited" msgstr "" -#: models.py:167 +#: models.py:170 msgid "file" msgstr "" -#: models.py:170 +#: models.py:173 msgid "updated" msgstr "" -#: models.py:173 +#: models.py:176 msgid "Transaction processes" msgstr "" + +#: settings.py:12 +#, fuzzy, python-format +#| msgid "" +#| "This bill will be automatically charged to your bank account with IBAN " +#| "number
%s." +msgid "" +"Direct debit, this bill will be automatically charged to " +"your bank account with IBAN number
%(number)s." +msgstr "" +"Càrrec per domiciliació, aquesta factura es cobrarà " +"automaticament en el teu compte bancari amb IBAN
%s." + +#: templates/admin/payments/transaction/report.html:38 +msgid "Summary" +msgstr "" + +#: templates/admin/payments/transaction/report.html:39 +#: templates/admin/payments/transaction/report.html:61 +msgid "Amount" +msgstr "" + +#: templates/admin/payments/transaction/report.html:48 +msgid "TOTAL" +msgstr "" + +#: templates/admin/payments/transaction/report.html:57 +msgid "Bill" +msgstr "" + +#: templates/admin/payments/transaction/report.html:58 +msgid "Account" +msgstr "" + +#: templates/admin/payments/transaction/report.html:59 +msgid "Contact" +msgstr "" + +#: templates/admin/payments/transaction/report.html:62 +msgid "State" +msgstr "" + +#: templates/admin/payments/transaction/report.html:64 +msgid "Updated" +msgstr "" diff --git a/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.mo b/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.mo index ae58b2d0..b1132507 100644 Binary files a/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.mo and b/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.mo differ diff --git a/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.po b/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.po index 3088c22e..be4b79b7 100644 --- a/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.po +++ b/orchestra/contrib/payments/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-28 16:40+0000\n" +"POT-Creation-Date: 2015-07-15 12:08+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,133 +18,154 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions.py:21 +#: actions.py:24 msgid "Selected transactions must be on '{state}' state" msgstr "" -#: actions.py:30 +#: actions.py:34 msgid "Processed" msgstr "" -#: actions.py:37 -msgid "Selected transaction has been processed." +#: actions.py:41 +msgid "One selected transaction has been processed." msgstr "" -#: actions.py:38 +#: actions.py:42 #, python-format msgid "%s Selected transactions have been processed." msgstr "" -#: actions.py:41 +#: actions.py:45 msgid "" "The following transaction process has been generated, you may want to save " "it on your computer now." msgstr "" -#: actions.py:43 +#: actions.py:47 #, python-format msgid "" "The following %s transaction processes have been generated, you may want to " "save it on your computer now." msgstr "" -#: actions.py:46 +#: actions.py:50 msgid "Process" msgstr "" -#: actions.py:59 actions.py:130 models.py:93 models.py:161 +#: actions.py:63 actions.py:134 models.py:97 models.py:164 msgid "Executed" msgstr "" -#: actions.py:62 +#: actions.py:66 msgid "One selected transaction has been marked as executed." msgstr "" -#: actions.py:63 +#: actions.py:67 #, python-format msgid "%s selected transactions have been marked as executed." msgstr "" -#: actions.py:67 actions.py:138 +#: actions.py:71 actions.py:142 msgid "Mark as executed" msgstr "" -#: actions.py:75 models.py:94 +#: actions.py:79 models.py:98 msgid "Secured" msgstr "" -#: actions.py:78 +#: actions.py:82 msgid "One selected transaction has been marked as secured." msgstr "" -#: actions.py:79 +#: actions.py:83 #, python-format msgid "%s selected transactions have been marked as secured." msgstr "" -#: actions.py:83 +#: actions.py:87 msgid "Mark as secured" msgstr "" -#: actions.py:91 actions.py:162 models.py:95 +#: actions.py:95 actions.py:166 models.py:99 msgid "Rejected" msgstr "" -#: actions.py:94 actions.py:165 +#: actions.py:98 actions.py:169 msgid "One selected transaction has been marked as rejected." msgstr "" -#: actions.py:95 actions.py:166 +#: actions.py:99 actions.py:170 #, python-format msgid "%s selected transactions have been marked as rejected." msgstr "" -#: actions.py:99 +#: actions.py:103 msgid "Mark as rejected" msgstr "" -#: actions.py:133 +#: actions.py:137 msgid "One selected process has been marked as executed." msgstr "" -#: actions.py:134 +#: actions.py:138 #, python-format msgid "%s selected processes have been marked as executed." msgstr "" -#: actions.py:146 models.py:162 +#: actions.py:150 models.py:165 msgid "Aborted" msgstr "" -#: actions.py:149 +#: actions.py:153 msgid "One selected process has been aborted." msgstr "" -#: actions.py:150 +#: actions.py:154 #, python-format msgid "%s selected processes have been aborted." msgstr "" -#: actions.py:154 +#: actions.py:158 msgid "Abort" msgstr "" -#: actions.py:170 +#: actions.py:174 msgid "Commit" msgstr "" -#: admin.py:42 +#: admin.py:43 msgid "ID" msgstr "" -#: admin.py:101 +#: admin.py:105 msgid "proc" msgstr "" -#: admin.py:152 +#: admin.py:158 msgid "Transactions" msgstr "" +#: helpers.py:11 +msgid "No transaction process selected." +msgstr "" + +#: helpers.py:15 +msgid "Done nothing. Not all related transactions in waitting execution." +msgstr "" + +#: helpers.py:32 +msgid "Unprocessed" +msgstr "" + +#: helpers.py:34 +#, python-format +msgid "" +"One related transaction has been marked as waitting for processing" +msgid_plural "" +"%i related transactions have been marked as waitting for processing." +msgstr[0] "" +msgstr[1] "" + #: methods/creditcard.py:11 msgid "Label" msgstr "" @@ -165,86 +186,123 @@ msgstr "" msgid "SEPA Direct Debit" msgstr "" -#: methods/sepadirectdebit.py:48 -msgid "" -"This bill will be automatically charged to your bank account with IBAN " -"number
%s." -msgstr "" -"Esta factura se cobrará automaticamente en tu cuenta bancaria con IBAN " -"
%s." - -#: models.py:19 +#: models.py:20 msgid "account" msgstr "" -#: models.py:21 +#: models.py:22 msgid "method" msgstr "" -#: models.py:23 models.py:166 +#: models.py:24 models.py:169 msgid "data" msgstr "" -#: models.py:24 +#: models.py:25 msgid "active" msgstr "" -#: models.py:91 +#: models.py:95 msgid "Waitting processing" msgstr "" -#: models.py:92 +#: models.py:96 msgid "Waitting execution" msgstr "" -#: models.py:98 +#: models.py:102 msgid "bill" msgstr "" -#: models.py:101 +#: models.py:105 msgid "source" msgstr "" -#: models.py:103 +#: models.py:107 msgid "process" msgstr "" -#: models.py:104 models.py:168 +#: models.py:108 models.py:171 msgid "state" msgstr "" -#: models.py:106 +#: models.py:110 msgid "amount" msgstr "" -#: models.py:108 models.py:169 +#: models.py:112 models.py:172 msgid "created" msgstr "" -#: models.py:109 +#: models.py:113 msgid "modified" msgstr "" -#: models.py:124 +#: models.py:128 msgid "New transactions can not be allocated for this bill." msgstr "" -#: models.py:160 +#: models.py:163 templates/admin/payments/transaction/report.html:63 msgid "Created" msgstr "" -#: models.py:163 +#: models.py:166 msgid "Commited" msgstr "" -#: models.py:167 +#: models.py:170 msgid "file" msgstr "" -#: models.py:170 +#: models.py:173 msgid "updated" msgstr "" -#: models.py:173 +#: models.py:176 msgid "Transaction processes" msgstr "" + +#: settings.py:12 +#, fuzzy, python-format +#| msgid "" +#| "This bill will be automatically charged to your bank account with IBAN " +#| "number
%s." +msgid "" +"Direct debit, this bill will be automatically charged to " +"your bank account with IBAN number
%(number)s." +msgstr "" +"Adeudo por domiciliación, esta factura se cobrará " +"automaticamente en tu cuenta bancaria con IBAN
%s." + +#: templates/admin/payments/transaction/report.html:38 +msgid "Summary" +msgstr "" + +#: templates/admin/payments/transaction/report.html:39 +#: templates/admin/payments/transaction/report.html:61 +msgid "Amount" +msgstr "" + +#: templates/admin/payments/transaction/report.html:48 +msgid "TOTAL" +msgstr "" + +#: templates/admin/payments/transaction/report.html:57 +msgid "Bill" +msgstr "" + +#: templates/admin/payments/transaction/report.html:58 +msgid "Account" +msgstr "" + +#: templates/admin/payments/transaction/report.html:59 +msgid "Contact" +msgstr "" + +#: templates/admin/payments/transaction/report.html:62 +msgid "State" +msgstr "" + +#: templates/admin/payments/transaction/report.html:64 +msgid "Updated" +msgstr "" diff --git a/orchestra/contrib/payments/methods/sepadirectdebit.py b/orchestra/contrib/payments/methods/sepadirectdebit.py index 98be12c5..8a417b47 100644 --- a/orchestra/contrib/payments/methods/sepadirectdebit.py +++ b/orchestra/contrib/payments/methods/sepadirectdebit.py @@ -19,14 +19,14 @@ from .options import PaymentMethod class SEPADirectDebitForm(PluginDataForm): iban = forms.CharField(label='IBAN', - widget=forms.TextInput(attrs={'size': '50'})) + widget=forms.TextInput(attrs={'size': '50'})) name = forms.CharField(max_length=128, label=_("Name"), - widget=forms.TextInput(attrs={'size': '50'})) + widget=forms.TextInput(attrs={'size': '50'})) class SEPADirectDebitSerializer(serializers.Serializer): iban = serializers.CharField(label='IBAN', validators=[IBANValidator()], - min_length=min(IBAN_COUNTRY_CODE_LENGTH.values()), max_length=34) + min_length=min(IBAN_COUNTRY_CODE_LENGTH.values()), max_length=34) name = serializers.CharField(label=_("Name"), max_length=128) def validate(self, data): @@ -45,8 +45,10 @@ class SEPADirectDebit(PaymentMethod): due_delta = datetime.timedelta(days=5) def get_bill_message(self): - return _("This bill will be automatically charged to your bank account " - " with IBAN number
%s.") % self.instance.number + context = { + 'number': self.instance.number + } + return settings.PAYMENTS_DD_BILL_MESSAGE % context @classmethod def process(cls, transactions): diff --git a/orchestra/contrib/payments/settings.py b/orchestra/contrib/payments/settings.py index 41227e3a..fe2e95b9 100644 --- a/orchestra/contrib/payments/settings.py +++ b/orchestra/contrib/payments/settings.py @@ -8,6 +8,11 @@ PAYMENT_CURRENCY = Setting('PAYMENT_CURRENCY', ) +PAYMENTS_DD_BILL_MESSAGE = Setting('PAYMENTS_DD_BILL_MESSAGE', + _("Direct debit, this bill will be automatically charged " + "to your bank account with IBAN number
%(number)s."), +) + PAYMENTS_DD_CREDITOR_NAME = Setting('PAYMENTS_DD_CREDITOR_NAME', 'Orchestra' )