from django.contrib import admin from django import forms from .models import Equipment, EquipmentDefault, EquipmentRevision, EquipmentCategory, EquipmentLost, EquipmentAttributeValue, EquipmentAttribute from .fields import IdField, IdWidget from shared.admin import admin_site class IdForm(forms.ModelForm): def __init__(self, *args, **kwargs): if 'min_value' in kwargs: kwargs.pop('min_value') if 'num_choices' in kwargs: num_choices = kwargs.pop('num_choices') super(IdForm, self).__init__(*args, **kwargs) for field in self.instance._meta.fields: if isinstance(field, IdField): if num_choices is None: choices = [] else: choices = [(k, str(k)) for k in range(1, num_choices+1)] self.fields[field.name].choices = choices self.fields[field.name].widget = IdWidget(choices=self.fields[field.name].choices) class IdFormset(forms.models.BaseInlineFormSet): def get_form_kwargs(self, index): kwargs = super().get_form_kwargs(index) if self.instance: kwargs["num_choices"] = self.instance.stock return kwargs class EquipmentRevisionExtraInline(admin.TabularInline): model = EquipmentRevision extra = 0 form = IdForm formset = IdFormset classes = ['collapse'] class EquipmentDefaultExtraInline(admin.TabularInline): model = EquipmentDefault extra = 0 form = IdForm formset = IdFormset classes = ['collapse'] class EquipmentLostExtraInline(admin.TabularInline): model = EquipmentLost extra = 0 form = IdForm formset = IdFormset classes = ['collapse'] class EquipmentAttributeValueInline(admin.TabularInline): model = EquipmentAttributeValue extra = 0 class CategoryAdmin(admin.ModelAdmin): list_display = ['name', 'parent'] ordering = ['name', 'parent'] class EquipmentAttributeAdmin(admin.ModelAdmin): list_display = ['name'] ordering = ['name'] class EquipmentAdmin(admin.ModelAdmin): readonly_fields = ['added_at', 'modified_at'] list_display = ['name', 'stock', 'owner', 'category', 'modified_at'] ordering = ['name', 'owner', 'category'] inlines = [EquipmentAttributeValueInline, EquipmentDefaultExtraInline, EquipmentLostExtraInline, EquipmentRevisionExtraInline] admin_site.register(Equipment, EquipmentAdmin) admin_site.register(EquipmentCategory, CategoryAdmin) admin_site.register(EquipmentAttribute, EquipmentAttributeAdmin) admin.site.register(Equipment, EquipmentAdmin)