You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.6 KiB
154 lines
4.6 KiB
from django.contrib import admin |
|
from cashonly.core.models import * |
|
from cashonly.core.formfields import DigitField |
|
from cashonly.core.services import AccountManager |
|
from django import forms |
|
from django.urls import reverse |
|
from django.utils.translation import gettext as _ |
|
from django.utils.translation import gettext_lazy |
|
|
|
|
|
class AccountForm(forms.ModelForm): |
|
credit_change = forms.DecimalField( |
|
max_digits=5, decimal_places=2, required=False, label=gettext_lazy("amount") |
|
) |
|
|
|
credit_change_comment = forms.CharField( |
|
max_length=64, required=False, label=gettext_lazy("comment") |
|
) |
|
|
|
pin_change = DigitField(min_length=4, required=False, label=gettext_lazy("PIN")) |
|
|
|
pin_empty = forms.BooleanField(required=False, label=gettext_lazy("clear PIN")) |
|
|
|
class Meta: |
|
model = Account |
|
|
|
# Include all fields (omitting this causes a RemovedInDjango18Warning) |
|
exclude = [] |
|
|
|
|
|
class AccountAdmin(admin.ModelAdmin): |
|
list_display = ("user", "card_number", "credit", "debit_limit", "transaction_link") |
|
form = AccountForm |
|
readonly_fields = ( |
|
"user", |
|
"credit", |
|
) |
|
fieldsets = ( |
|
( |
|
None, |
|
{ |
|
"fields": ("user", "card_number", "credit", "debit_limit", "avatar"), |
|
}, |
|
), |
|
( |
|
gettext_lazy("credit change"), |
|
{ |
|
"fields": ("credit_change", "credit_change_comment"), |
|
}, |
|
), |
|
( |
|
gettext_lazy("change PIN"), |
|
{ |
|
"fields": ("pin_change", "pin_empty"), |
|
}, |
|
), |
|
) |
|
|
|
# Disable manual creation of accounts. |
|
# Accounts are create after user creation automatically. |
|
def has_add_permission(self, request): |
|
return False |
|
|
|
def transaction_link(self, account): |
|
return '<a href="%s?account__id__exact=%d">%s</a>' % ( |
|
reverse("admin:cashonly_core_transaction_changelist"), |
|
account.id, |
|
_("Transactions"), |
|
) |
|
|
|
transaction_link.short_description = gettext_lazy("Transaction link") |
|
|
|
transaction_link.allow_tags = True |
|
|
|
def save_model(self, request, obj, form, change): |
|
accmgr = AccountManager(obj) |
|
|
|
pin = form.cleaned_data["pin_change"] |
|
pin_empty = form.cleaned_data["pin_empty"] |
|
if pin_empty: |
|
accmgr.clear_pin() |
|
elif pin is not None and len(pin) != 0: |
|
accmgr.set_pin(pin) |
|
|
|
amount = form.cleaned_data["credit_change"] |
|
comment = form.cleaned_data["credit_change_comment"] |
|
if amount is not None and amount != 0: |
|
accmgr.change_credit(amount, request.user, comment) |
|
|
|
# TODO: check whether this can be dropped |
|
# Make sure the object is saved in any case |
|
obj.save() |
|
|
|
|
|
class ProductBarcodeInline(admin.TabularInline): |
|
model = ProductBarcode |
|
extra = 1 |
|
|
|
|
|
class ProductAdmin(admin.ModelAdmin): |
|
list_display = ("name", "category", "price", "active") |
|
list_filter = ["category", "active"] |
|
ordering = ("-active", "name") |
|
inlines = [ProductBarcodeInline] |
|
fields = ("name", "price", "active", "category", "image") |
|
|
|
|
|
class ProductCategoryAdmin(admin.ModelAdmin): |
|
list_display = ("name", "comment") |
|
|
|
|
|
class SalesLogEntryAdmin(admin.ModelAdmin): |
|
list_display = ("account", "timestamp", "product", "count", "unit_price") |
|
list_filter = ["account", "timestamp", "product"] |
|
# Make sales log entries completely read-only |
|
readonly_fields = list(map(lambda f: f.name, SalesLogEntry._meta.fields)) |
|
|
|
|
|
class TransactionAdmin(admin.ModelAdmin): |
|
list_display = ("account", "timestamp", "subject", "description", "amount") |
|
list_filter = ["account", "timestamp", "subject"] |
|
|
|
# Disable mass deletion in the overview page |
|
actions = None |
|
|
|
date_hierarchy = "timestamp" |
|
|
|
# Disable tampering with the transactions completely. |
|
def has_add_permission(self, request): |
|
return False |
|
|
|
def has_change_permission(self, request, obj=None): |
|
if obj is None: |
|
return True |
|
return False |
|
|
|
def has_delete_permission(self, request, obj=None): |
|
return False |
|
|
|
# Needed to not trigger an ImproperlyConfigured exception. |
|
# FIXME: a bit too hacky |
|
def changelist_view(self, request, extra_context=None): |
|
self.list_display_links = (None,) |
|
return super(TransactionAdmin, self).changelist_view( |
|
request, |
|
extra_context=None, |
|
) |
|
|
|
|
|
admin.site.register(Account, AccountAdmin) |
|
admin.site.register(Product, ProductAdmin) |
|
admin.site.register(ProductCategory, ProductCategoryAdmin) |
|
admin.site.register(Transaction, TransactionAdmin) |
|
admin.site.register(SalesLogEntry, SalesLogEntryAdmin)
|
|
|