154 lines
6.1 KiB
Python
154 lines
6.1 KiB
Python
"""
|
||
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()
|
||
}
|
||
})
|