diff --git a/roms/admin.py b/roms/admin.py index 1f49dde..bdc6762 100644 --- a/roms/admin.py +++ b/roms/admin.py @@ -3,14 +3,22 @@ from django.contrib import admin from taggit_helpers.admin import TaggitListFilter, TaggitTabularInline from roms.models import Rom, RomFile - +from roms.forms import RomFileForm, RomFileInlineFormSet from gulashromstore.settings import SLOT_COUNT + class RomFileInline(admin.TabularInline): model = RomFile + form = RomFileForm + formset = RomFileInlineFormSet + + fields = ('slot', 'binary') + + can_delete = False max_num = SLOT_COUNT min_num = SLOT_COUNT + class RomAdmin(admin.ModelAdmin): list_display = ('name', 'approved', 'tag_list') list_filter = [TaggitListFilter] diff --git a/roms/forms.py b/roms/forms.py new file mode 100644 index 0000000..a895f64 --- /dev/null +++ b/roms/forms.py @@ -0,0 +1,42 @@ +from django.forms import Field, Widget, ModelForm +from django.forms.models import BaseInlineFormSet + +from roms.models import RomFile + +class ReadOnlyWidget(Widget): + def render(self, name, value, attrs): + final_attrs = self.build_attrs(attrs, name=name) + if hasattr(self, 'initial'): + value = self.initial + return "%s" % (value or '') + + def _has_changed(self, initial, data): + return False + + +class ReadOnlyField(Field): + widget = ReadOnlyWidget + def __init__(self, widget=None, label=None, initial=None, help_text=None): + super(ReadOnlyField, self).__init__(self, label=label, initial=initial, + help_text=help_text, widget=widget) + + def clean(self, value, initial): + self.widget.initial = initial + return initial + + +class RomFileForm(ModelForm): + slot = ReadOnlyField() + class Meta: + model = RomFile + fields = ['binary'] + + +class RomFileInlineFormSet(BaseInlineFormSet): + + def __init__(self, *args, **kwargs): + super(RomFileInlineFormSet, self).__init__(*args, **kwargs) + # Check that the data doesn't already exist + if not kwargs['instance'].romfile_set.all(): + self.initial = [{'slot' : i} for i in range(1, SLOT_COUNT+1)] + self.extra = SLOT_COUNT diff --git a/roms/models.py b/roms/models.py index ce0c1c1..689a203 100644 --- a/roms/models.py +++ b/roms/models.py @@ -38,6 +38,9 @@ class Rom(models.Model): return json + def __str__(self): + return "Rom %s" % self.name + class RomFile(models.Model): @@ -48,3 +51,6 @@ class RomFile(models.Model): class Meta: unique_together = ('rom', 'slot') + + def __str__(self): + return "RomFile %s %d" % (self.rom.name, self.slot)