""" Views для управления отметками объектов. """ from django.contrib.auth.mixins import LoginRequiredMixin from django.db.models import Prefetch from django.http import JsonResponse from django.views.generic import ListView, View from django.shortcuts import get_object_or_404 from mainapp.models import Source, ObjectMark, CustomUser class ObjectMarksListView(LoginRequiredMixin, ListView): """ Представление списка источников с отметками. """ model = Source template_name = "mainapp/object_marks.html" context_object_name = "sources" paginate_by = 50 def get_queryset(self): """Получить queryset с предзагруженными связанными данными""" queryset = Source.objects.prefetch_related( 'source_objitems', 'source_objitems__parameter_obj', 'source_objitems__parameter_obj__id_satellite', Prefetch( 'marks', queryset=ObjectMark.objects.select_related('created_by__user').order_by('-timestamp') ) ).order_by('-updated_at') # Фильтрация по спутнику satellite_id = self.request.GET.get('satellite') if satellite_id: queryset = queryset.filter(source_objitems__parameter_obj__id_satellite_id=satellite_id).distinct() # Поиск по имени объекта search_query = self.request.GET.get('search', '').strip() if search_query: queryset = queryset.filter(source_objitems__name__icontains=search_query).distinct() return queryset def get_context_data(self, **kwargs): """Добавить дополнительные данные в контекст""" context = super().get_context_data(**kwargs) from mainapp.models import Satellite context['satellites'] = Satellite.objects.all().order_by('name') # Добавить информацию о возможности редактирования для каждой отметки # и получить имя первого объекта для каждого источника for source in context['sources']: # Получить имя первого объекта first_objitem = source.source_objitems.first() source.objitem_name = first_objitem.name if first_objitem and first_objitem.name else '-' for mark in source.marks.all(): mark.editable = mark.can_edit() return context class AddObjectMarkView(LoginRequiredMixin, View): """ API endpoint для добавления отметки источника. """ def post(self, request, *args, **kwargs): """Создать новую отметку""" from datetime import timedelta from django.utils import timezone source_id = request.POST.get('source_id') mark = request.POST.get('mark') == 'true' if not source_id: return JsonResponse({'success': False, 'error': 'Не указан ID источника'}, status=400) source = get_object_or_404(Source, pk=source_id) # Проверить последнюю отметку источника last_mark = source.marks.first() if last_mark: time_diff = timezone.now() - last_mark.timestamp if time_diff < timedelta(minutes=5): minutes_left = 5 - int(time_diff.total_seconds() / 60) return JsonResponse({ 'success': False, 'error': f'Нельзя добавить отметку. Подождите ещё {minutes_left} мин.' }, status=400) # Получить или создать CustomUser для текущего пользователя custom_user, _ = CustomUser.objects.get_or_create(user=request.user) # Создать отметку object_mark = ObjectMark.objects.create( source=source, mark=mark, created_by=custom_user ) return JsonResponse({ 'success': True, 'mark': { 'id': object_mark.id, 'mark': object_mark.mark, 'timestamp': object_mark.timestamp.strftime('%d.%m.%Y %H:%M'), 'created_by': str(object_mark.created_by) if object_mark.created_by else 'Неизвестно', 'can_edit': object_mark.can_edit() } }) class UpdateObjectMarkView(LoginRequiredMixin, View): """ API endpoint для обновления отметки объекта (в течение 5 минут). """ def post(self, request, *args, **kwargs): """Обновить существующую отметку""" mark_id = request.POST.get('mark_id') new_mark_value = request.POST.get('mark') == 'true' if not mark_id: return JsonResponse({'success': False, 'error': 'Не указан ID отметки'}, status=400) object_mark = get_object_or_404(ObjectMark, pk=mark_id) # Проверить возможность редактирования if not object_mark.can_edit(): return JsonResponse({ 'success': False, 'error': 'Время редактирования истекло (более 5 минут)' }, status=400) # Обновить отметку object_mark.mark = new_mark_value object_mark.save() return JsonResponse({ 'success': True, 'mark': { 'id': object_mark.id, 'mark': object_mark.mark, 'timestamp': object_mark.timestamp.strftime('%d.%m.%Y %H:%M'), 'created_by': str(object_mark.created_by) if object_mark.created_by else 'Неизвестно', 'can_edit': object_mark.can_edit() } })