Skip to content

Commit 7f07015

Browse files
committed
refactor model forms into separate reusable components
1 parent 90bf8ac commit 7f07015

File tree

17 files changed

+168
-124
lines changed

17 files changed

+168
-124
lines changed

finder/admin/file.py

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,20 @@
11
from django.contrib import admin
2-
from django.forms.fields import CharField
3-
from django.forms.models import ModelMultipleChoiceField
4-
from django.forms.widgets import Media, TextInput
2+
from django.forms.widgets import Media
53
from django.http.response import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound
64
from django.templatetags.static import static
75
from django.urls import path, reverse
86
from django.utils.html import format_html
97
from django.utils.translation import gettext_lazy as _
108

11-
from entangled.forms import EntangledModelForm
12-
9+
from finder.forms.file import FileForm
1310
from finder.models.file import FileModel
1411
from finder.models.inode import InodeModel
15-
from finder.models.label import Label
1612
from finder.admin.inode import InodeAdmin
1713

1814

19-
class LabelsChoiceField(ModelMultipleChoiceField):
20-
def prepare_value(self, values):
21-
values = super().prepare_value(values)
22-
return [v for v in values if v] if hasattr(values, '__iter__') else values
23-
24-
25-
class FileModelForm(EntangledModelForm):
26-
name = CharField(
27-
widget=TextInput(attrs={'size': 100}),
28-
)
29-
labels = LabelsChoiceField(
30-
queryset=Label.objects.all(),
31-
required=False,
32-
)
33-
34-
class Meta:
35-
model = FileModel
36-
untangled_fields = ['name', 'labels']
37-
exclude = ['meta_data']
38-
39-
4015
@admin.register(FileModel)
4116
class FileAdmin(InodeAdmin):
42-
form = FileModelForm
17+
form = FileForm
4318
form_template = 'finder/admin/change_file_form.html'
4419
readonly_fields = ['details', 'owner', 'created_at', 'last_modified_at', 'mime_type', 'sha1']
4520

finder/apps.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from django.apps import AppConfig
2+
from django.conf import settings
3+
from django.utils.module_loading import import_string
4+
from django.utils.translation import gettext_lazy as _
5+
6+
7+
class FinderConfig(AppConfig):
8+
name = 'finder'
9+
verbose_name = _("Finder")
10+
model_forms = {}
11+
12+
def ready(self):
13+
self.register_finder_forms()
14+
15+
def register_finder_forms(self):
16+
"""
17+
For each model inheriting from AbstractFileModel, try to find the corresponding form class.
18+
This is required, so that the file browser can render the correct detail form for each file type.
19+
"""
20+
21+
from finder.models.file import AbstractFileModel
22+
23+
for model in self.get_models():
24+
if not (model, AbstractFileModel):
25+
continue
26+
for app in settings.INSTALLED_APPS:
27+
if not app.startswith(f'{self.name}.'):
28+
continue
29+
try:
30+
self.model_forms[model] = import_string(f'{app}.forms.{model.__name__[:-5]}Form')
31+
except ImportError:
32+
pass

finder/contrib/archive/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from finder.admin.file import FileAdmin
1414
from finder.contrib.archive.models import ArchiveModel
15-
from finder.models.file import FileModel, AbstractFileModel
15+
from finder.models.file import FileModel
1616
from finder.models.folder import FolderModel
1717

1818

finder/contrib/audio/admin.py

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,13 @@
11
from django.contrib import admin
2-
from django.forms.fields import FloatField
3-
from django.forms.widgets import HiddenInput
42

5-
from finder.admin.file import FileAdmin, FileModelForm
6-
from finder.contrib.audio.models import AudioFileModel, SAMPLE_DURATION
7-
8-
9-
class AudioForm(FileModelForm):
10-
sample_start = FloatField(
11-
widget=HiddenInput(),
12-
initial=0,
13-
)
14-
sample_duration = FloatField(
15-
widget=HiddenInput(),
16-
initial=SAMPLE_DURATION,
17-
)
18-
19-
class Meta:
20-
model = AudioFileModel
21-
entangled_fields = {'meta_data': ['sample_start', 'sample_duration']}
22-
untangled_fields = ['name', 'labels']
23-
24-
class Media:
25-
css = {'all': ['admin/css/forms.css']}
3+
from finder.admin.file import FileAdmin
4+
from finder.contrib.audio.forms import AudioFileForm
5+
from finder.contrib.audio.models import AudioFileModel
266

277

288
@admin.register(AudioFileModel)
299
class AudioAdmin(FileAdmin):
30-
form = AudioForm
10+
form = AudioFileForm
3111

3212
def get_editor_settings(self, request, inode):
3313
settings = super().get_editor_settings(request, inode)

finder/contrib/audio/forms.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from django.forms.fields import FloatField
2+
from django.forms.widgets import HiddenInput
3+
4+
from finder.contrib.audio.models import AudioFileModel, SAMPLE_DURATION
5+
from finder.forms.file import FileForm
6+
7+
8+
class AudioFileForm(FileForm):
9+
sample_start = FloatField(
10+
widget=HiddenInput(),
11+
initial=0,
12+
)
13+
sample_duration = FloatField(
14+
widget=HiddenInput(),
15+
initial=SAMPLE_DURATION,
16+
)
17+
18+
class Meta:
19+
model = AudioFileModel
20+
entangled_fields = {'meta_data': ['sample_start', 'sample_duration']}
21+
untangled_fields = ['name', 'labels']

finder/contrib/image/admin.py

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,13 @@
11
from django.contrib import admin
2-
from django.forms.fields import CharField, FloatField, IntegerField
3-
from django.forms.widgets import HiddenInput, TextInput
42

5-
from finder.admin.file import FileAdmin, FileModelForm
6-
from finder.contrib.image.models import ImageModel
3+
from finder.admin.file import FileAdmin
4+
from finder.contrib.image.forms import ImageFileForm
5+
from finder.contrib.image.models import ImageFileModel
76

87

9-
class ImageForm(FileModelForm):
10-
crop_x = FloatField(
11-
widget=HiddenInput(),
12-
required=False,
13-
)
14-
crop_y = FloatField(
15-
widget=HiddenInput(),
16-
required=False,
17-
)
18-
crop_size = FloatField(
19-
widget=HiddenInput(),
20-
required=False,
21-
)
22-
width = IntegerField(widget=HiddenInput())
23-
height = IntegerField(widget=HiddenInput())
24-
alt_text = CharField(
25-
widget=TextInput(attrs={'size': 100}),
26-
required=False,
27-
)
28-
29-
class Meta:
30-
model = ImageModel
31-
entangled_fields = {'meta_data': ['crop_x', 'crop_y', 'crop_size', 'alt_text']}
32-
untangled_fields = ['name', 'labels', 'width', 'height']
33-
34-
class Media:
35-
css = {'all': ['admin/css/forms.css']}
36-
37-
38-
@admin.register(ImageModel)
8+
@admin.register(ImageFileModel)
399
class ImageAdmin(FileAdmin):
40-
form = ImageForm
10+
form = ImageFileForm
4111

4212
def get_editor_settings(self, request, inode):
4313
settings = super().get_editor_settings(request, inode)

finder/contrib/image/forms.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from django.forms.fields import CharField, FloatField, IntegerField
2+
from django.forms.widgets import HiddenInput, TextInput
3+
4+
from finder.contrib.image.models import ImageFileModel
5+
from finder.forms.file import FileForm
6+
7+
8+
class ImageFileForm(FileForm):
9+
crop_x = FloatField(
10+
widget=HiddenInput(),
11+
required=False,
12+
)
13+
crop_y = FloatField(
14+
widget=HiddenInput(),
15+
required=False,
16+
)
17+
crop_size = FloatField(
18+
widget=HiddenInput(),
19+
required=False,
20+
)
21+
width = IntegerField(widget=HiddenInput())
22+
height = IntegerField(widget=HiddenInput())
23+
alt_text = CharField(
24+
widget=TextInput(attrs={'size': 100}),
25+
required=False,
26+
)
27+
28+
class Meta:
29+
model = ImageFileModel
30+
entangled_fields = {'meta_data': ['crop_x', 'crop_y', 'crop_size', 'alt_text']}
31+
untangled_fields = ['name', 'labels', 'width', 'height']

finder/contrib/image/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from finder.models.file import AbstractFileModel
1010

1111

12-
class ImageModel(AbstractFileModel):
12+
class ImageFileModel(AbstractFileModel):
1313
accept_mime_types = ['image/*']
14-
editor_component = 'Image'
14+
browser_component = editor_component = 'Image'
1515
data_fields = AbstractFileModel.data_fields + ['width', 'height']
1616
filer_public_thumbnails = Path(
1717
filer_settings.FILER_STORAGES['public']['thumbnails']['THUMBNAIL_OPTIONS']['base_dir']

finder/contrib/image/pil/forms.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from finder.contrib.image.forms import ImageFileForm as PILImageForm
2+
3+
__all__ = ['PILImageForm']

finder/contrib/image/pil/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
from django.utils.timezone import datetime
55
from django.utils.translation import gettext_lazy as _
66

7-
from finder.contrib.image.models import ImageModel
7+
from finder.contrib.image.models import ImageFileModel
88

99

10-
class PILImageModel(ImageModel):
10+
class PILImageModel(ImageFileModel):
1111
"""
1212
Model for image files which can be transformed by the PIL package.
1313
"""

0 commit comments

Comments
 (0)