Добавил транспондеры к ObjItem шаблону
This commit is contained in:
@@ -3,12 +3,15 @@ Source related views.
|
||||
"""
|
||||
from datetime import datetime
|
||||
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
||||
from django.core.paginator import Paginator
|
||||
from django.db.models import Count
|
||||
from django.shortcuts import render
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.urls import reverse
|
||||
from django.views import View
|
||||
|
||||
from ..forms import SourceForm
|
||||
from ..models import Source
|
||||
from ..utils import parse_pagination_params
|
||||
|
||||
@@ -22,8 +25,8 @@ class SourceListView(LoginRequiredMixin, View):
|
||||
# Get pagination parameters
|
||||
page_number, items_per_page = parse_pagination_params(request)
|
||||
|
||||
# Get sorting parameters
|
||||
sort_param = request.GET.get("sort", "-created_at")
|
||||
# Get sorting parameters (default to ID ascending)
|
||||
sort_param = request.GET.get("sort", "id")
|
||||
|
||||
# Get filter parameters
|
||||
search_query = request.GET.get("search", "").strip()
|
||||
@@ -185,3 +188,117 @@ class SourceListView(LoginRequiredMixin, View):
|
||||
}
|
||||
|
||||
return render(request, "mainapp/source_list.html", context)
|
||||
|
||||
|
||||
|
||||
class AdminModeratorMixin(UserPassesTestMixin):
|
||||
"""Mixin to restrict access to admin and moderator roles only."""
|
||||
|
||||
def test_func(self):
|
||||
return (
|
||||
self.request.user.is_authenticated and
|
||||
hasattr(self.request.user, 'customuser') and
|
||||
self.request.user.customuser.role in ['admin', 'moderator']
|
||||
)
|
||||
|
||||
def handle_no_permission(self):
|
||||
messages.error(self.request, 'У вас нет прав для выполнения этого действия.')
|
||||
return redirect('mainapp:home')
|
||||
|
||||
|
||||
class SourceUpdateView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
"""View for editing Source with 4 coordinate fields and related ObjItems."""
|
||||
|
||||
def get(self, request, pk):
|
||||
source = get_object_or_404(Source, pk=pk)
|
||||
form = SourceForm(instance=source)
|
||||
|
||||
# Get related ObjItems ordered by creation date
|
||||
objitems = source.source_objitems.select_related(
|
||||
'parameter_obj',
|
||||
'parameter_obj__id_satellite',
|
||||
'parameter_obj__polarization',
|
||||
'parameter_obj__modulation',
|
||||
'parameter_obj__standard',
|
||||
'geo_obj',
|
||||
'created_by__user',
|
||||
'updated_by__user'
|
||||
).order_by('created_at')
|
||||
|
||||
context = {
|
||||
'object': source,
|
||||
'form': form,
|
||||
'objitems': objitems,
|
||||
'full_width_page': True,
|
||||
}
|
||||
|
||||
return render(request, 'mainapp/source_form.html', context)
|
||||
|
||||
def post(self, request, pk):
|
||||
source = get_object_or_404(Source, pk=pk)
|
||||
form = SourceForm(request.POST, instance=source)
|
||||
|
||||
if form.is_valid():
|
||||
source = form.save(commit=False)
|
||||
# Set updated_by to current user
|
||||
if hasattr(request.user, 'customuser'):
|
||||
source.updated_by = request.user.customuser
|
||||
source.save()
|
||||
|
||||
messages.success(request, f'Источник #{source.id} успешно обновлен.')
|
||||
|
||||
# Redirect back with query params if present
|
||||
if request.GET.urlencode():
|
||||
return redirect(f"{reverse('mainapp:source_update', args=[source.id])}?{request.GET.urlencode()}")
|
||||
return redirect('mainapp:source_update', pk=source.id)
|
||||
|
||||
# If form is invalid, re-render with errors
|
||||
objitems = source.source_objitems.select_related(
|
||||
'parameter_obj',
|
||||
'parameter_obj__id_satellite',
|
||||
'parameter_obj__polarization',
|
||||
'parameter_obj__modulation',
|
||||
'parameter_obj__standard',
|
||||
'geo_obj',
|
||||
'created_by__user',
|
||||
'updated_by__user'
|
||||
).order_by('created_at')
|
||||
|
||||
context = {
|
||||
'object': source,
|
||||
'form': form,
|
||||
'objitems': objitems,
|
||||
'full_width_page': True,
|
||||
}
|
||||
|
||||
return render(request, 'mainapp/source_form.html', context)
|
||||
|
||||
|
||||
class SourceDeleteView(LoginRequiredMixin, AdminModeratorMixin, View):
|
||||
"""View for deleting Source."""
|
||||
|
||||
def get(self, request, pk):
|
||||
source = get_object_or_404(Source, pk=pk)
|
||||
|
||||
context = {
|
||||
'object': source,
|
||||
'objitems_count': source.source_objitems.count(),
|
||||
}
|
||||
|
||||
return render(request, 'mainapp/source_confirm_delete.html', context)
|
||||
|
||||
def post(self, request, pk):
|
||||
source = get_object_or_404(Source, pk=pk)
|
||||
source_id = source.id
|
||||
|
||||
try:
|
||||
source.delete()
|
||||
messages.success(request, f'Источник #{source_id} успешно удален.')
|
||||
except Exception as e:
|
||||
messages.error(request, f'Ошибка при удалении источника: {str(e)}')
|
||||
return redirect('mainapp:source_update', pk=pk)
|
||||
|
||||
# Redirect to source list
|
||||
if request.GET.urlencode():
|
||||
return redirect(f"{reverse('mainapp:home')}?{request.GET.urlencode()}")
|
||||
return redirect('mainapp:home')
|
||||
|
||||
Reference in New Issue
Block a user