diff --git a/orchestra/contrib/accounts/admin.py b/orchestra/contrib/accounts/admin.py index d61b0c5d..99c38a67 100644 --- a/orchestra/contrib/accounts/admin.py +++ b/orchestra/contrib/accounts/admin.py @@ -2,7 +2,7 @@ import copy import re from urllib.parse import parse_qsl -from django import forms +from django import apps, forms from django.conf.urls import url from django.contrib import admin, messages from django.contrib.admin.utils import unquote @@ -92,7 +92,7 @@ class AccountAdmin(ChangePasswordAdminMixin, auth.UserAdmin, ExtendedModelAdmin) } context.update(extra_context or {}) return super(AccountAdmin, self).change_view( - request, object_id, form_url, context) + request, object_id, form_url=form_url, extra_context=context) def get_fieldsets(self, request, obj=None): fieldsets = super(AccountAdmin, self).get_fieldsets(request, obj) @@ -125,6 +125,7 @@ class AccountListAdmin(AccountAdmin): """ Account list to allow account selection when creating new services """ list_display = ('select_account', 'username', 'type', 'username') actions = None + change_list_template = 'admin/accounts/account/select_account_list.html' def select_account(self, instance): # TODO get query string from request.META['QUERY_STRING'] to preserve filters @@ -139,12 +140,13 @@ class AccountListAdmin(AccountAdmin): select_account.admin_order_field = 'username' def changelist_view(self, request, extra_context=None): - original_app_label = request.META['PATH_INFO'].split('/')[-5] - original_model = request.META['PATH_INFO'].split('/')[-4] + app_label = request.META['PATH_INFO'].split('/')[-5] + model = request.META['PATH_INFO'].split('/')[-4] + model = apps.get_model(app_label, model) + opts = model._meta context = { - 'title': _("Select account for adding a new %s") % (original_model), - 'original_app_label': original_app_label, - 'original_model': original_model, + 'title': _("Select account for adding a new %s") % (opts.verbose_name), + 'original_opts': opts, } context.update(extra_context or {}) response = super(AccountListAdmin, self).changelist_view(request, extra_context=context) diff --git a/orchestra/contrib/accounts/templates/admin/accounts/account/select_account_list.html b/orchestra/contrib/accounts/templates/admin/accounts/account/select_account_list.html new file mode 100644 index 00000000..de881a27 --- /dev/null +++ b/orchestra/contrib/accounts/templates/admin/accounts/account/select_account_list.html @@ -0,0 +1,14 @@ +{% extends 'admin/change_list.html' %} +{% load i18n admin_urls %} + + +{% block breadcrumbs %} +
+{% endblock %} + diff --git a/orchestra/contrib/bills/admin.py b/orchestra/contrib/bills/admin.py index 8b6ccfb9..3e1ed01b 100644 --- a/orchestra/contrib/bills/admin.py +++ b/orchestra/contrib/bills/admin.py @@ -47,13 +47,14 @@ class BillLineInline(admin.TabularInline): order_link = admin_link('order', display='pk') def display_total(self, line): - total = line.compute_total() - sublines = line.sublines.all() - if sublines: - content = '\n'.join(['%s: %s' % (sub.description, sub.total) for sub in sublines]) - img = static('admin/img/icon_alert.gif') - return '%s ' % (content, total, img) - return total + if line.pk: + total = line.compute_total() + sublines = line.sublines.all() + if sublines: + content = '\n'.join(['%s: %s' % (sub.description, sub.total) for sub in sublines]) + img = static('admin/img/icon_alert.gif') + return '%s ' % (content, total, img) + return total display_total.short_description = _("Total") display_total.allow_tags = True @@ -97,7 +98,8 @@ class ClosedBillLineInline(BillLineInline): display_subtotal.allow_tags = True def display_total(self, line): - return line.compute_total() + if line.pk: + return line.compute_total() display_total.short_description = _("Total") display_total.allow_tags = True @@ -110,8 +112,8 @@ class ClosedBillLineInline(BillLineInline): class BillLineAdmin(admin.ModelAdmin): list_display = ( - 'description', 'bill_link', 'display_is_open', 'account_link', 'rate', 'quantity', 'tax', - 'subtotal', 'display_sublinetotal', 'display_total' + 'description', 'bill_link', 'display_is_open', 'account_link', 'rate', 'quantity', + 'tax', 'subtotal', 'display_sublinetotal', 'display_total' ) actions = ( actions.undo_billing, actions.move_lines, actions.copy_lines, actions.service_report @@ -201,7 +203,8 @@ class BillAdmin(AccountAdminMixin, ExtendedModelAdmin): }), (_("Dates"), { 'classes': ('collapse',), - 'fields': ('created_on_display', 'closed_on_display', 'updated_on_display', 'due_on'), + 'fields': ('created_on_display', 'closed_on_display', 'updated_on_display', + 'due_on'), }), (_("Raw"), { 'classes': ('collapse',), @@ -219,7 +222,9 @@ class BillAdmin(AccountAdminMixin, ExtendedModelAdmin): actions.amend_bills, actions.bill_report, actions.service_report, actions.close_send_download_bills, list_accounts, ] - change_readonly_fields = ('account_link', 'type', 'is_open', 'amend_of_link', 'amend_links') + change_readonly_fields = ( + 'account_link', 'type', 'is_open', 'amend_of_link', 'amend_links' + ) readonly_fields = ( 'number', 'display_total', 'is_sent', 'display_payment_state', 'created_on_display', 'closed_on_display', 'updated_on_display' @@ -265,7 +270,8 @@ class BillAdmin(AccountAdminMixin, ExtendedModelAdmin): transactions = bill.transactions.all() if len(transactions) == 1: args = (transactions[0].pk,) - url = reverse('admin:%s_%s_change' % (t_opts.app_label, t_opts.model_name), args=args) + view = 'admin:%s_%s_change' % (t_opts.app_label, t_opts.model_name) + url = reverse(view, args=args) else: url = reverse('admin:%s_%s_changelist' % (t_opts.app_label, t_opts.model_name)) url += '?bill=%i' % bill.pk diff --git a/orchestra/contrib/history/admin.py b/orchestra/contrib/history/admin.py index 7d2e6180..be1d7b5d 100644 --- a/orchestra/contrib/history/admin.py +++ b/orchestra/contrib/history/admin.py @@ -11,7 +11,7 @@ from orchestra.admin.utils import admin_link, admin_date class LogEntryAdmin(admin.ModelAdmin): list_display = ( - 'id', 'display_message', 'display_action_time', 'user_link', + 'display_action_time', 'user_link', 'display_message', ) list_filter = ( 'action_flag', @@ -32,6 +32,10 @@ class LogEntryAdmin(admin.ModelAdmin): user_link = admin_link('user') display_action_time = admin_date('action_time', short_description=_("Time")) + def __init__(self, *args, **kwargs): + super(LogEntryAdmin, self).__init__(*args, **kwargs) + self.list_display_links = (None, ) + def display_message(self, log): edit = '' % { 'url': reverse('admin:admin_logentry_change', args=(log.pk,)), @@ -68,8 +72,9 @@ class LogEntryAdmin(admin.ModelAdmin): def content_object_link(self, log): ct = log.content_type + view = 'admin:%s_%s_change' % (ct.app_label, ct.model) try: - url = reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=(log.object_id,)) + url = reverse(view, args=(log.object_id,)) except NoReverseMatch: return log.object_repr return '%s' % (url, log.object_repr) @@ -87,7 +92,8 @@ class LogEntryAdmin(admin.ModelAdmin): 'object': obj, } context.update(extra_context or {}) - return super(LogEntryAdmin, self).changeform_view(request, object_id, form_url, extra_context=context) + return super(LogEntryAdmin, self).changeform_view( + request, object_id, form_url, extra_context=context) def response_change(self, request, obj): """ save and continue preserve edit query string """ @@ -100,9 +106,12 @@ class LogEntryAdmin(admin.ModelAdmin): """ save redirect to object history """ if 'edit' in request.GET.urlencode(): opts = obj.content_type.model_class()._meta - post_url = reverse('admin:%s_%s_history' % (opts.app_label, opts.model_name), args=(obj.object_id,)) + view = 'admin:%s_%s_history' % (opts.app_label, opts.model_name) + post_url = reverse(view, args=(obj.object_id,)) preserved_filters = self.get_preserved_filters(request) - post_url = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, post_url) + post_url = add_preserved_filters({ + 'preserved_filters': preserved_filters, 'opts': opts + }, post_url) return HttpResponseRedirect(post_url) return super(LogEntryAdmin, self).response_post_save_change(request, obj)