django-orchestra/orchestra/apps/payments/admin.py

175 lines
6.3 KiB
Python
Raw Normal View History

2014-07-23 16:24:56 +00:00
from django.contrib import admin
2014-07-29 20:10:37 +00:00
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
2014-07-23 16:24:56 +00:00
2014-10-21 15:29:36 +00:00
from orchestra.admin import ChangeViewActionsMixin, SelectPluginAdminMixin, ExtendedModelAdmin
2014-09-26 19:21:09 +00:00
from orchestra.admin.utils import admin_colored, admin_link
2014-10-21 15:29:36 +00:00
from orchestra.apps.accounts.admin import AccountAdminMixin, SelectAccountAdminMixin
2014-07-24 09:53:34 +00:00
2014-09-16 17:14:24 +00:00
from . import actions
from .methods import PaymentMethod
from .models import PaymentSource, Transaction, TransactionProcess
2014-07-23 16:24:56 +00:00
2014-07-24 09:53:34 +00:00
STATE_COLORS = {
Transaction.WAITTING_PROCESSING: 'darkorange',
2014-09-18 15:07:39 +00:00
Transaction.WAITTING_EXECUTION: 'magenta',
2014-09-16 17:14:24 +00:00
Transaction.EXECUTED: 'olive',
Transaction.SECURED: 'green',
2014-07-24 09:53:34 +00:00
Transaction.REJECTED: 'red',
}
2014-09-26 19:21:09 +00:00
class PaymentSourceAdmin(SelectPluginAdminMixin, AccountAdminMixin, admin.ModelAdmin):
2014-09-18 15:07:39 +00:00
list_display = ('label', 'method', 'number', 'account_link', 'is_active')
list_filter = ('method', 'is_active')
2014-09-26 19:21:09 +00:00
plugin = PaymentMethod
plugin_field = 'method'
2014-09-18 15:07:39 +00:00
class TransactionInline(admin.TabularInline):
model = Transaction
can_delete = False
extra = 0
2014-09-16 17:14:24 +00:00
fields = (
'transaction_link', 'bill_link', 'source_link', 'display_state',
'amount', 'currency'
)
readonly_fields = fields
transaction_link = admin_link('__unicode__', short_description=_("ID"))
bill_link = admin_link('bill')
source_link = admin_link('source')
display_state = admin_colored('state', colors=STATE_COLORS)
class Media:
css = {
'all': ('orchestra/css/hide-inline-id.css',)
}
def has_add_permission(self, *args, **kwargs):
return False
2014-10-21 15:29:36 +00:00
class TransactionAdmin(SelectAccountAdminMixin, ExtendedModelAdmin):
2014-07-24 09:53:34 +00:00
list_display = (
2014-09-16 17:14:24 +00:00
'id', 'bill_link', 'account_link', 'source_link', 'display_state',
'amount', 'process_link'
2014-07-24 09:53:34 +00:00
)
list_filter = ('source__method', 'state')
2014-10-21 15:29:36 +00:00
fieldsets = (
(None, {
'classes': ('wide',),
'fields': (
'account_link',
'bill_link',
'source_link',
'display_state',
'amount',
'currency',
'process_link'
)
}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': (
'bill',
'source',
'display_state',
'amount',
'currency',
'process'
)
}),
)
2014-09-16 17:14:24 +00:00
actions = (
actions.process_transactions, actions.mark_as_executed,
actions.mark_as_secured, actions.mark_as_rejected
)
change_view_actions = actions
2014-10-21 15:29:36 +00:00
filter_by_account_fields = ('bill', 'source')
change_readonly_fields = ('amount', 'currency')
readonly_fields = ('bill_link', 'display_state', 'process_link', 'account_link', 'source_link')
2014-07-24 09:53:34 +00:00
bill_link = admin_link('bill')
2014-09-04 15:55:43 +00:00
source_link = admin_link('source')
process_link = admin_link('process', short_description=_("proc"))
2014-07-24 09:53:34 +00:00
account_link = admin_link('bill__account')
display_state = admin_colored('state', colors=STATE_COLORS)
2014-08-19 18:59:23 +00:00
def get_queryset(self, request):
qs = super(TransactionAdmin, self).get_queryset(request)
return qs.select_related('source', 'bill__account')
2014-09-16 17:14:24 +00:00
def get_change_view_actions(self, obj=None):
actions = super(TransactionAdmin, self).get_change_view_actions()
2014-09-18 15:07:39 +00:00
exclude = []
2014-09-16 17:14:24 +00:00
if obj:
2014-09-19 14:47:25 +00:00
if obj.state == Transaction.WAITTING_PROCESSING:
exclude = ['mark_as_executed', 'mark_as_secured', 'mark_as_rejected']
elif obj.state == Transaction.WAITTING_EXECUTION:
exclude = ['process_transactions', 'mark_as_secured', 'mark_as_rejected']
2014-09-16 17:14:24 +00:00
if obj.state == Transaction.EXECUTED:
2014-09-19 14:47:25 +00:00
exclude = ['process_transactions', 'mark_as_executed']
elif obj.state in [Transaction.REJECTED, Transaction.SECURED]:
return []
2014-09-18 15:07:39 +00:00
return [action for action in actions if action.__name__ not in exclude]
2014-09-18 15:07:39 +00:00
class TransactionProcessAdmin(ChangeViewActionsMixin, admin.ModelAdmin):
2014-07-29 20:10:37 +00:00
list_display = ('id', 'file_url', 'display_transactions', 'created_at')
2014-10-11 16:21:51 +00:00
fields = ('data', 'file_url', 'created_at')
2014-10-21 15:29:36 +00:00
readonly_fields = ('data', 'file_url', 'display_transactions', 'created_at')
inlines = [TransactionInline]
2014-09-18 15:07:39 +00:00
actions = (actions.mark_process_as_executed, actions.abort, actions.commit)
change_view_actions = actions
2014-07-29 20:10:37 +00:00
def file_url(self, process):
if process.file:
return '<a href="%s">%s</a>' % (process.file.url, process.file.name)
file_url.allow_tags = True
file_url.admin_order_field = 'file'
def display_transactions(self, process):
ids = []
lines = []
counter = 0
2014-08-19 18:59:23 +00:00
# Because of values_list this query doesn't benefit from prefetch_related
tx_ids = process.transactions.values_list('id', flat=True)
for tx_id in tx_ids:
2014-10-11 16:21:51 +00:00
ids.append('#%i' % tx_id)
counter += 1
if counter > 10:
counter = 0
lines.append(','.join(ids))
ids = []
lines.append(','.join(ids))
2014-10-11 16:21:51 +00:00
transactions = '<br'.join(lines)
url = reverse('admin:payments_transaction_changelist')
url += '?processes=%i' % process.id
2014-10-11 16:21:51 +00:00
return '<a href="%s">%s</a>' % (url, transactions)
2014-07-29 20:10:37 +00:00
display_transactions.short_description = _("Transactions")
display_transactions.allow_tags = True
2014-09-18 15:07:39 +00:00
2014-09-22 15:59:53 +00:00
def has_add_permission(self, *args, **kwargs):
return False
2014-09-18 15:07:39 +00:00
def get_change_view_actions(self, obj=None):
actions = super(TransactionProcessAdmin, self).get_change_view_actions()
exclude = []
if obj:
if obj.state == TransactionProcess.EXECUTED:
exclude.append('mark_process_as_executed')
elif obj.state == TransactionProcess.COMMITED:
exclude = ['mark_process_as_executed', 'abort', 'commit']
elif obj.state == TransactionProcess.ABORTED:
exclude = ['mark_process_as_executed', 'abort', 'commit']
return [action for action in actions if action.__name__ not in exclude]
2014-07-29 20:10:37 +00:00
admin.site.register(PaymentSource, PaymentSourceAdmin)
2014-07-24 09:53:34 +00:00
admin.site.register(Transaction, TransactionAdmin)
admin.site.register(TransactionProcess, TransactionProcessAdmin)