После рефакторинга

This commit is contained in:
2025-11-18 14:44:32 +03:00
parent 55759ec705
commit c8bcd1adf0
56 changed files with 204454 additions and 683 deletions

View File

@@ -236,17 +236,40 @@ class SourceListView(LoginRequiredMixin, View):
# Get all Source objects with query optimization
# Using annotate to count ObjItems efficiently (single query with GROUP BY)
# Using prefetch_related for reverse ForeignKey relationships to avoid N+1 queries
# Using select_related for ForeignKey/OneToOne relationships to avoid N+1 queries
# Using prefetch_related for reverse ForeignKey and ManyToMany relationships
sources = Source.objects.select_related(
'info'
'info', # ForeignKey to ObjectInfo
'created_by', # ForeignKey to CustomUser
'created_by__user', # OneToOne to User
'updated_by', # ForeignKey to CustomUser
'updated_by__user', # OneToOne to User
).prefetch_related(
# Prefetch related objitems with their nested relationships
'source_objitems',
'source_objitems__parameter_obj',
'source_objitems__parameter_obj__id_satellite',
'source_objitems__parameter_obj__polarization',
'source_objitems__parameter_obj__modulation',
'source_objitems__parameter_obj__standard',
'source_objitems__geo_obj',
'source_objitems__geo_obj__mirrors',
'source_objitems__lyngsat_source',
'source_objitems__lyngsat_source__id_satellite',
'source_objitems__lyngsat_source__polarization',
'source_objitems__lyngsat_source__modulation',
'source_objitems__lyngsat_source__standard',
'source_objitems__transponder',
'source_objitems__created_by',
'source_objitems__created_by__user',
'source_objitems__updated_by',
'source_objitems__updated_by__user',
# Prefetch marks with their relationships
'marks',
'marks__created_by',
'marks__created_by__user'
).annotate(
# Use annotate for efficient counting in a single query
objitem_count=Count('source_objitems', filter=objitem_filter_q, distinct=True) if has_objitem_filter else Count('source_objitems')
)
@@ -704,7 +727,7 @@ class AdminModeratorMixin(UserPassesTestMixin):
def handle_no_permission(self):
messages.error(self.request, 'У вас нет прав для выполнения этого действия.')
return redirect('mainapp:home')
return redirect('mainapp:source_list')
class SourceUpdateView(LoginRequiredMixin, AdminModeratorMixin, View):
@@ -801,8 +824,8 @@ class SourceDeleteView(LoginRequiredMixin, AdminModeratorMixin, View):
# Redirect to source list
if request.GET.urlencode():
return redirect(f"{reverse('mainapp:home')}?{request.GET.urlencode()}")
return redirect('mainapp:home')
return redirect(f"{reverse('mainapp:source_list')}?{request.GET.urlencode()}")
return redirect('mainapp:source_list')
class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
@@ -813,7 +836,7 @@ class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
ids = request.GET.get("ids", "")
if not ids:
messages.error(request, "Не выбраны источники для удаления")
return redirect('mainapp:home')
return redirect('mainapp:source_list')
try:
id_list = [int(x) for x in ids.split(",") if x.isdigit()]
@@ -858,7 +881,7 @@ class DeleteSelectedSourcesView(LoginRequiredMixin, AdminModeratorMixin, View):
except Exception as e:
messages.error(request, f'Ошибка при подготовке удаления: {str(e)}')
return redirect('mainapp:home')
return redirect('mainapp:source_list')
def post(self, request):
"""Actually delete the selected sources."""