From 835a4ab872328f743fc0ba8e89a7a697e441e2e9 Mon Sep 17 00:00:00 2001 From: Marc Aymerich Date: Tue, 29 Sep 2015 12:35:22 +0000 Subject: [PATCH] Fixes on payments and saas domains --- orchestra/contrib/bills/filters.py | 11 ++++---- orchestra/contrib/domains/admin.py | 8 +++++- orchestra/contrib/payments/admin.py | 10 ++++++- orchestra/contrib/payments/methods/options.py | 1 + .../payments/methods/sepadirectdebit.py | 6 +++++ orchestra/contrib/payments/models.py | 27 ++++++++++--------- .../contrib/saas/backends/wordpressmu.py | 22 +++++++-------- orchestra/contrib/saas/forms.py | 13 ++++++--- orchestra/contrib/saas/services/dokuwiki.py | 7 ++--- orchestra/contrib/saas/services/options.py | 9 ++++--- orchestra/contrib/saas/services/phplist.py | 10 ++++--- orchestra/contrib/saas/services/wordpress.py | 7 ++--- orchestra/contrib/saas/settings.py | 14 +++++----- 13 files changed, 86 insertions(+), 59 deletions(-) diff --git a/orchestra/contrib/bills/filters.py b/orchestra/contrib/bills/filters.py index cb1b38e3..4aa772fd 100644 --- a/orchestra/contrib/bills/filters.py +++ b/orchestra/contrib/bills/filters.py @@ -101,16 +101,16 @@ class PaymentStateListFilter(SimpleListFilter): elif self.value() == 'PAID': zeros = queryset.filter(approx_total=0, approx_total__isnull=True) zeros = zeros.values_list('id', flat=True) - ammounts = Transaction.objects.exclude(bill_id__in=zeros).secured().group_by('bill_id') + amounts = Transaction.objects.exclude(bill_id__in=zeros).secured().group_by('bill_id') paid = [] relevant = queryset.exclude(approx_total=0, approx_total__isnull=True, is_open=True) for bill_id, total in relevant.values_list('id', 'approx_total'): try: - ammount = sum([t.ammount for t in ammounts[bill_id]]) + amount = sum([t.amount for t in amounts[bill_id]]) except KeyError: pass else: - if abs(total) <= abs(ammount): + if abs(total) <= abs(amount): paid.append(bill_id) return queryset.filter( Q(approx_total=0) | @@ -120,8 +120,9 @@ class PaymentStateListFilter(SimpleListFilter): elif self.value() == 'PENDING': has_transaction = queryset.exclude(transactions__isnull=True) non_rejected = has_transaction.exclude(transactions__state=Transaction.REJECTED) - non_rejected = non_rejected.values_list('id', flat=True).distinct() - return queryset.filter(pk__in=non_rejected) + paid = non_rejected.exclude(transactions__state=Transaction.SECURED) + paid = paid.values_list('id', flat=True).distinct() + return queryset.filter(pk__in=paid) elif self.value() == 'BAD_DEBT': closed = queryset.filter(is_open=False).exclude(approx_total=0) return closed.filter( diff --git a/orchestra/contrib/domains/admin.py b/orchestra/contrib/domains/admin.py index 7f7e0573..4ad7d3d5 100644 --- a/orchestra/contrib/domains/admin.py +++ b/orchestra/contrib/domains/admin.py @@ -94,7 +94,13 @@ class DomainAdmin(AccountAdminMixin, ExtendedModelAdmin): link = '%s %s' % (admin_url, website.name, site_link) links.append(link) return '
'.join(links) - return _("No website") + context = { + 'title': _("View on site"), + 'url': 'http://%s' % domain.name, + 'image': '' % static('orchestra/images/view-on-site.png'), + } + site_link = '%(image)s' % context + return _("No website %s") % site_link display_websites.admin_order_field = 'websites__name' display_websites.short_description = _("Websites") display_websites.allow_tags = True diff --git a/orchestra/contrib/payments/admin.py b/orchestra/contrib/payments/admin.py index ccbfe126..e71e34bc 100644 --- a/orchestra/contrib/payments/admin.py +++ b/orchestra/contrib/payments/admin.py @@ -105,7 +105,6 @@ class TransactionAdmin(SelectAccountAdminMixin, ExtendedModelAdmin): source_link = admin_link('source') process_link = admin_link('process', short_description=_("proc")) account_link = admin_link('bill__account') - display_state = admin_colored('state', colors=STATE_COLORS) def get_change_view_actions(self, obj=None): actions = super(TransactionAdmin, self).get_change_view_actions() @@ -120,6 +119,15 @@ class TransactionAdmin(SelectAccountAdminMixin, ExtendedModelAdmin): elif obj.state in [Transaction.REJECTED, Transaction.SECURED]: return [] return [action for action in actions if action.__name__ not in exclude] + + def display_state(self, obj): + state = admin_colored('state', colors=STATE_COLORS)(obj) + help_text = obj.get_state_help() + state = state.replace('= self.bill.total: raise ValidationError(_("New transactions can not be allocated for this bill.")) - def check_state(self, *args): - if self.state not in args: - raise TypeError("Transaction not in %s" % ' or '.join(args)) + def get_state_help(self): + if self.source: + return self.source.method_instance.state_help.get(self.state) or self.STATE_HELP.get(self.state) + return self.STATE_HELP.get(self.state) def mark_as_processed(self): - self.check_state(self.WAITTING_PROCESSING) self.state = self.WAITTING_EXECUTION self.save(update_fields=('state', 'modified_at')) def mark_as_executed(self): - self.check_state(self.WAITTING_EXECUTION) self.state = self.EXECUTED self.save(update_fields=('state', 'modified_at')) def mark_as_secured(self): - self.check_state(self.EXECUTED) self.state = self.SECURED self.save(update_fields=('state', 'modified_at')) @@ -178,26 +186,19 @@ class TransactionProcess(models.Model): def __str__(self): return '#%i' % self.id - def check_state(self, *args): - if self.state not in args: - raise TypeError("Transaction process not in %s" % ' or '.join(args)) - def mark_as_executed(self): - self.check_state(self.CREATED) self.state = self.EXECUTED for transaction in self.transactions.all(): transaction.mark_as_executed() self.save(update_fields=('state',)) def abort(self): - self.check_state(self.CREATED, self.EXCECUTED) self.state = self.ABORTED for transaction in self.transaction.all(): transaction.mark_as_aborted() self.save(update_fields=('state',)) def commit(self): - self.check_state(self.CREATED, self.EXECUTED) self.state = self.COMMITED for transaction in self.transactions.processing(): transaction.mark_as_secured() diff --git a/orchestra/contrib/saas/backends/wordpressmu.py b/orchestra/contrib/saas/backends/wordpressmu.py index 5d6dc25d..906f3a49 100644 --- a/orchestra/contrib/saas/backends/wordpressmu.py +++ b/orchestra/contrib/saas/backends/wordpressmu.py @@ -17,24 +17,24 @@ class WordpressMuBackend(ServiceController): model = 'saas.SaaS' default_route_match = "saas.service == 'wordpress'" doc_settings = (settings, - ('SAAS_WORDPRESS_ADMIN_PASSWORD', 'SAAS_WORDPRESS_BASE_URL') + ('SAAS_WORDPRESS_ADMIN_PASSWORD', 'SAAS_WORDPRESS_MAIN_URL') ) def login(self, session): - base_url = self.get_base_url() - login_url = base_url + '/wp-login.php' + main_url = self.get_main_url() + login_url = main_url + '/wp-login.php' login_data = { 'log': 'admin', 'pwd': settings.SAAS_WORDPRESS_ADMIN_PASSWORD, 'redirect_to': '/wp-admin/' } response = session.post(login_url, data=login_data) - if response.url != base_url + '/wp-admin/': + if response.url != main_url + '/wp-admin/': raise IOError("Failure login to remote application") - def get_base_url(self): - base_url = settings.SAAS_WORDPRESS_BASE_URL - return base_url.rstrip('/') + def get_main_url(self): + main_url = settings.SAAS_WORDPRESS_MAIN_URL + return main_url.rstrip('/') def validate_response(self, response): if response.status_code != 200: @@ -42,7 +42,7 @@ class WordpressMuBackend(ServiceController): raise RuntimeError(errors[0] if errors else 'Unknown %i error' % response.status_code) def get_id(self, session, saas): - search = self.get_base_url() + search = self.get_main_url() search += '/wp-admin/network/sites.php?s=%s&action=blogs' % saas.name regex = re.compile( '