Skip to content

Commit c2fb765

Browse files
committed
refactor property concrete_models into function get_models
refactor property concrete_models into function get_models
1 parent c0fcf4f commit c2fb765

File tree

9 files changed

+38
-49
lines changed

9 files changed

+38
-49
lines changed

finder/admin/file.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from entangled.forms import EntangledModelForm
1212

1313
from finder.models.file import FileModel
14+
from finder.models.inode import InodeModel
1415
from finder.models.label import Label
1516
from finder.admin.inode import InodeAdmin
1617

@@ -59,7 +60,7 @@ def get_urls(self):
5960
),
6061
]
6162
urls.extend(super().get_urls())
62-
for model in FileModel.file_models:
63+
for model in InodeModel.get_models(include_proxy=True):
6364
if model_admin := self.admin_site._registry.get(model):
6465
urls.extend(model_admin.get_editor_urls())
6566
return urls

finder/admin/folder.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def get_urls(self):
8787
),
8888
]
8989
urls.extend(default_urls)
90-
for model in InodeModel.file_models:
90+
for model in InodeModel.get_models(include_proxy=True):
9191
if model_admin := self.admin_site._registry.get(model):
9292
urls.extend(model_admin.get_menu_extension_urls())
9393
return urls
@@ -149,7 +149,7 @@ def get_editor_settings(self, request, inode):
149149

150150
def get_menu_extension_settings(self, request):
151151
extensions = []
152-
for model in InodeModel.file_models:
152+
for model in InodeModel.get_models(include_proxy=True):
153153
if model_admin := self.admin_site._registry.get(model):
154154
extension = model_admin.get_menu_extension_settings(request)
155155
if extension.get('component'):
@@ -218,14 +218,15 @@ def upload_file(self, request, folder_id):
218218
return HttpResponseBadRequest(f"Method {request.method} not allowed. Only POST requests are allowed.")
219219
if not (folder := self.get_object(request, folder_id)):
220220
return HttpResponseNotFound(f"Folder {folder_id} not found.")
221-
if request.content_type == 'multipart/form-data' and 'upload_file' in request.FILES:
222-
model = FileModel.objects.get_model_for(request.FILES['upload_file'].content_type)
223-
new_file = model.objects.create_from_upload(
224-
request.FILES['upload_file'],
225-
folder=folder,
226-
owner=request.user,
227-
)
228-
return HttpResponse(f"Uploaded {new_file.name} successfully.")
221+
if request.content_type != 'multipart/form-data' or 'upload_file' not in request.FILES:
222+
return HttpResponseBadRequest("Bad encoding type or missing payload.")
223+
model = FileModel.objects.get_model_for(request.FILES['upload_file'].content_type)
224+
new_file = model.objects.create_from_upload(
225+
request.FILES['upload_file'],
226+
folder=folder,
227+
owner=request.user,
228+
)
229+
return JsonResponse({'uploaded_file': new_file.as_dict})
229230

230231
def update_inode(self, request, folder_id):
231232
if response := self.check_for_valid_post_request(request, folder_id):

finder/admin/inode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def get_urls(self):
3939

4040
def get_object(self, request, object_id, from_field=None):
4141
site = get_current_site(request)
42-
for model in InodeModel.concrete_models:
42+
for model in InodeModel.get_models(include_folder=True):
4343
try:
4444
obj = model.objects.get(id=object_id)
4545
if obj.is_folder and obj.realm.site == site and obj.realm.slug == self.admin_site.name:
@@ -124,7 +124,7 @@ def get_inodes(self, request, sorting=None, **lookup):
124124
"""
125125
inodes, applicable_sorting = [], []
126126
labels = lookup.pop('labels__in', None)
127-
for inode_model in InodeModel.concrete_models:
127+
for inode_model in InodeModel.get_models(include_folder=True):
128128
queryset = (
129129
inode_model.objects.select_related('owner')
130130
.filter(**lookup)

finder/api/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def search(self, request, folder_id):
182182
sorting = self.sorting_map.get(request.COOKIES.get('django-finder-sorting'))
183183

184184
files = []
185-
for file_model in AbstractFileModel.concrete_models:
185+
for file_model in InodeModel.get_models():
186186
queryset = file_model.objects.filter(**lookup)
187187
if sorting:
188188
queryset = queryset.order_by(sorting[0])
@@ -208,7 +208,7 @@ def upload(self, request, folder_id):
208208
raise BadRequest(f"Method {request.method} not allowed. Only POST requests are allowed.")
209209
if request.content_type != 'multipart/form-data' or 'upload_file' not in request.FILES:
210210
raise BadRequest("Bad form encoding or missing payload.")
211-
model = AbstractFileModel.objects.get_model_for(request.FILES['upload_file'].content_type)
211+
model = FileModel.objects.get_model_for(request.FILES['upload_file'].content_type)
212212
folder = FolderModel.objects.get(id=folder_id)
213213
file = model.objects.create_from_upload(
214214
request.FILES['upload_file'],

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
15+
from finder.models.file import FileModel, AbstractFileModel
1616
from finder.models.folder import FolderModel
1717

1818

finder/management/commands/reorganize_finder.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ def handle(self, verbosity, *args, **options):
1414
self.reorganize()
1515

1616
def reorganize(self):
17-
for inode_model in InodeModel.concrete_models:
18-
if inode_model.is_folder:
19-
continue
17+
for inode_model in InodeModel.get_models():
2018
for file in inode_model.objects.all():
2119
file_model = FileModel.objects.get_model_for(file.mime_type)
2220
if not issubclass(file_model, file.__class__):

finder/models/file.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from django.core.files.storage import default_storage
1010
from django.db import models
1111
from django.template.defaultfilters import filesizeformat
12-
from django.utils.functional import cached_property
12+
from django.utils.functional import cached_property, classproperty
1313
from django.utils.translation import gettext_lazy as _
1414

1515
from filer import settings as filer_settings
@@ -42,7 +42,7 @@ def create_from_upload(self, uploaded_file, **kwargs):
4242

4343
def get_model_for(self, mime_type):
4444
def lookup(mime_type):
45-
for model in InodeModel.file_models:
45+
for model in InodeModel.get_models(include_proxy=True):
4646
if mime_type in model.accept_mime_types:
4747
return model
4848
return None
@@ -174,6 +174,15 @@ def get_thumbnail_url(self):
174174
"""
175175
return self.fallback_thumbnail_url
176176

177+
# @classproperty
178+
# def concrete_models(cls):
179+
# """
180+
# Yields all concrete (excluding proxy models) that inherit from AbstractFileModel.
181+
# """
182+
# for model in cls._inode_models.values():
183+
# if not model.is_folder and not model._meta.proxy:
184+
# yield model
185+
177186
@cached_property
178187
def mime_maintype(self):
179188
return self.mime_type.split('/')[0]
@@ -226,15 +235,6 @@ def delete(self, using=None, keep_parents=False):
226235
default_storage.delete(self.file_path)
227236
super().delete(using, keep_parents)
228237

229-
@property
230-
def concrete_models(self):
231-
"""
232-
Yields all concrete (excluding proxy models) that inherit from AbstractFileModel.
233-
"""
234-
for model in self._inode_models.values():
235-
if not model.is_folder and not model._meta.proxy:
236-
yield model
237-
238238

239239
class FileModel(AbstractFileModel):
240240
"""

finder/models/folder.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def subfolders(self):
8787
def num_children(self):
8888
num_children = sum(
8989
inode_model.objects.filter(parent=self).count()
90-
for inode_model in InodeModel.concrete_models
90+
for inode_model in InodeModel.get_models(include_folder=True)
9191
)
9292
return num_children
9393

finder/models/inode.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,14 @@ def _validate_accept_mime_types(new_class):
4747
raise ImproperlyConfigured(msg.format(accept_mime_type, other))
4848
new_class._mime_types_mapping[accept_mime_type] = new_class
4949

50-
@property
51-
def concrete_models(self):
50+
def get_models(self, include_proxy=False, include_folder=False):
5251
"""
53-
Yields all concrete (excluding proxy models) that inherit from InodeModel.
52+
Yields all models that inherit from InodeModel.
53+
If `include_proxy` is True, all proxy models are included.
54+
If `include_folder` is True, the `FolderModel` is included.
5455
"""
5556
for model in self._inode_models.values():
56-
if not model._meta.proxy:
57-
yield model
58-
59-
@property
60-
def file_models(cls):
61-
"""
62-
Returns all models (including proxy models) that inherit from AbstractFileModel.
63-
"""
64-
for model in cls._inode_models.values():
65-
if not model.is_folder:
57+
if (not model._meta.proxy or include_proxy) and (not model.is_folder or include_folder):
6658
yield model
6759

6860

@@ -72,14 +64,11 @@ class InodeManagerMixin:
7264
"""
7365

7466
def filter_inodes(self, **lookup):
75-
from .file import AbstractFileModel
7667
from .folder import FolderModel
7768

78-
is_folder = lookup.pop('is_folder', None)
79-
if is_folder:
69+
if is_folder := lookup.pop('is_folder', None):
8070
return FolderModel.objects.filter(**lookup).iterator()
81-
# `is_folder` may be None (all models) or False (only files)
82-
concrete_models = AbstractFileModel.concrete_models if is_folder is False else InodeModel.concrete_models
71+
concrete_models = InodeModel.get_models(include_folder=is_folder is None)
8372
inodes = [inode_model.objects.filter(**lookup) for inode_model in concrete_models]
8473
return chain(*inodes)
8574

0 commit comments

Comments
 (0)