from dbsynce.models import Resource from django.http import JsonResponse from django.http import Http404 from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import UserPassesTestMixin from django.http import JsonResponse from django.utils.translation import gettext as _ from django_tables2 import SingleTableView from django.views.generic import DetailView from sharix_admin.tables import ResourcesTable from sharix_admin.utils import group_required from datetime import datetime, timedelta from dbsynce.lib.core import parse_requirements, get_admin_url from dbsynce.models import Documents from django.contrib import messages from django.db import transaction from django.urls import reverse_lazy from django.views.generic.edit import FormView from django.views.generic.edit import UpdateView from tickets.models import Ticket, TicketList from sharix_admin.forms import ResourceForm from sharix_admin.utils import * from dbsynce.lib.data import * from .base import BaseView from django.db.models import Q from dbsynce.models import Documents, DocumentFile from sharix_admin.forms import DocumentUploadForm from django.shortcuts import get_object_or_404, redirect from django.core.files.storage import default_storage from dbsynce.docs.database.resource import Resource as ResourceHelpTexts from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames class ResourcesListView(BaseView, UserPassesTestMixin, SingleTableView): table_class = ResourcesTable queryset = Resource.objects.all() template_name = 'sharix_admin/resources.html' page_title = 'Ресурсы' page_name = 'resources' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'title': _('Resources'), 'object_list': context['object_list'], }) return context def get_queryset(self): queryset = super().get_queryset() search_query = self.request.GET.get('q', '').strip() if search_query: queryset = queryset.filter( Q(id__icontains=search_query) | Q(user__first_name__icontains=search_query) | Q(user__last_name__icontains=search_query) | Q(status__icontains=search_query) ).distinct() return queryset def test_func(self) -> bool or None: #group_names = ('PARTNER-ADMIN') #if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser: # return True #return False return True #@login_required #@group_required('PARTNER-ADMIN') def change_resource_status(request): if request.method == 'POST': resource_id = request.POST.get('resource_id') new_status = request.POST.get('new_status') resource = Resource.objects.get(pk=resource_id) resource.status = new_status resource.save() return JsonResponse({'status': 'success'}) else: return JsonResponse({'status': 'error'}) #class ResourceEditView(BaseView, FormView): class ResourceEditView(BaseView, UpdateView): form_class = ResourceForm model = Resource template_name = "sharix_admin/resource.html" success_url = reverse_lazy("sharix_admin:resources") page_title = 'Изменить ресурс' page_name = 'resource_edit' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) try: docs = Documents.objects.filter(resource=self.object.id) except Documents.DoesNotExist: docs=[] context.update({ 'title': self.page_title, 'object': self.object, "current_page": "sharix_admin:resources", }) context['docs'] = docs return context def get_form_kwargs(self): kwargs = super().get_form_kwargs() #docs = Documents.objects.filter(resource=self.object.id) #kwargs['instance'] = get_object_or_404(Company, repr=self.request.user) kwargs['instance'] = get_object_or_404(Resource, id=self.object.id) return kwargs def form_valid(self, form): with transaction.atomic(): # Сохраняем изменения form.save() # Получаем текущий объект компании и деактивируем ее current_resource = form.instance current_resource.deactivate() # Выполняем пересоздание тикета на активацию партнера current_resource.ticket_status.archive() current_resource.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, current_resource) # Отправляем полAьзователю уведомление на страницу об успехе операции messages.success(self.request, 'Данные успешно изменены и теперь проходят проверку!') return super().form_valid(form) # # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN # def test_func(self): # return "PARTNER-ADMIN" in self.user_groups # def form_valid(self, form): # with transaction.atomic(): # # Сохраняем форму, чтобы получить объект ресурса # instance = form.save(commit=False) # # Присваиваем полю user идентификатор текущего пользователя # instance.user = self.request.user # # Создаем новую запись в БД, чтобы иметь доступ к ID # instance.save() # # Создание тикета на активацию ресурса. # # Создаем объект тикета и присваиваем его полю ticket_status # instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance) # # Создание тикета на утверждение прав пользователя # # create_ticket_role_activation_partner_admin(self.request.user, instance) # # Сохраняем новые изменения # instance.save() # # Создаем необходимые объекты документов по requirements указанных в созданной company # # Используем bulk_create для создания всех объектов одновременно # doc_codes = parse_requirements(instance.requirements) # Documents.objects.bulk_create([ # Documents( # resource=instance, # user=self.request.user, # doc_type=doc_code # ) for doc_code in doc_codes # ]) # # Отправляем пользователю уведомление на страницу о успехе операции # messages.success( # self.request, # 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!' # ) # return super().form_valid(form) # Возвращаем успешный ответ class ResourceCreate(BaseView, FormView): form_class = ResourceForm template_name = "sharix_admin/resource.html" success_url = reverse_lazy("sharix_admin:main") page_title = 'Добавить ресурс' page_name = 'resource/add/' # Проверяем не состояит ли текущий пользователь в группе PARTNER-ADMIN # def test_func(self): # return not "PARTNER-ADMIN" in self.user_groups def form_valid(self, form): with transaction.atomic(): # Сохраняем форму, чтобы получить объект компании instance = form.save(commit=False) # Присваиваем полю user идентификатор текущего пользователя instance.user = self.request.user # Создаем новую запись в БД, чтобы иметь доступ к ID instance.save() # Создание тикета на активацию ресурса. # Создаем объект тикета и присваиваем его полю ticket_status instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance) # Создание тикета на утверждение прав пользователя create_ticket_resource_activation_by_partner_admin(self.request.user, instance) # Сохраняем новые изменения instance.save() # Создаем необходимые объекты документов по requirements указанных в созданной company # Используем bulk_create для создания всех объектов одновременно doc_codes = parse_requirements(instance.requirements) Documents.objects.bulk_create([ Documents( #TODO add info about company resource=instance, user=self.request.user, doc_type=doc_code ) for doc_code in doc_codes ]) # Отправляем пользователю уведомление на страницу о успехе операции messages.success( self.request, 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!' ) return super().form_valid(form) # Возвращаем успешный ответ class ResourceDetailView(BaseView, DetailView): model = Resource template_name = 'sharix_admin/resource_detail.html' context_object_name = 'resource' page_title = 'О ресурсе' page_name = 'resource_detail' def detail_view(self, request, primary_key): try: resource = Resource.objects.get(pk=primary_key) except Resource.DoesNotExist: raise Http404('Provider does not exist') return render(request, self.template_name, context={ 'help_texts': ResourceHelpTexts, 'captions': ResourceVerboseNames, }) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['help_texts'] = ResourceHelpTexts context['captions'] = ResourceVerboseNames return context class ResourceDocUploadView(BaseView, FormView): # FIXME: Загрузка новых документов должна деактивировать текущего партнера (предварительно это работа обработчиков) template_name = 'sharix_admin/include/doc_upload.html' form_class = DocumentUploadForm success_url = reverse_lazy('sharix_admin:resources') #success_url = reverse_lazy('resource_detail') page_name = 'Загрузка документа' def dispatch(self, request, *args, **kwargs): self.resource = Resource.objects.get(id=kwargs['pk']) #self.resource = get_object_or_404(id=kwargs['pk']) #self.resource = get_object_or_404(Resource, user=self.request.user) self.doc = Documents.objects.filter( user=self.request.user, resource=self.resource, doc_type=kwargs.get('doc_code') ).first() self.doc_name = self.doc.get_doc_type_display() self.page_title = "Изменение документа ресурса: " + self.doc_name return super().dispatch(request, *args, **kwargs) def form_valid(self, form): with transaction.atomic(): # Удаляем существующие файлы и записи из базы данных existing_files = DocumentFile.objects.filter(document=self.doc) for existing_file in existing_files: # Удаляем файл с сервера if default_storage.exists(existing_file.file.path): default_storage.delete(existing_file.file.path) # Удаляем запись о файле из базы данных existing_file.delete() # Загрузка новых файлов doc_file = self.request.FILES.getlist("doc_file") for file in doc_file: DocumentFile.objects.create( document=self.doc, file=file ) # Создание нового тикета и архивация старого if self.doc.ticket_status: self.doc.ticket_status.archive() self.doc.expire_date = self.request.POST.get('doc_expire_date') if self.request.POST[ 'doc_expire_date'] else None self.doc.ticket_status = create_ticket_resource_docs_verification(self.request.user, self.resource, self.doc) self.doc.save() # Отправляем пользователю уведомление на страницу об успехе операции messages.success(self.request, f'Файлы документа "{self.doc_name}" успешно загружены и теперь проходят проверку!') return super().form_valid(form) class ResourceDocView(BaseView, DetailView): #class PartnerDocView(PartnerBaseView, DetailView): model = Documents template_name = 'sharix_admin/include/doc.html' context_object_name = 'doc' page_name = 'Просмотр документа' def dispatch(self, request, *args, **kwargs): self.resource = Resource.objects.get(id=kwargs['pk']) #self.resource = get_object_or_404(Resource, pk=self.request.id) #self.company = get_object_or_404(Resource, user=self.request.user) self.doc = Documents.objects.filter( user=self.request.user, resource=self.resource, doc_type=kwargs.get('doc_code') ).first() if not self.doc: return self.handle_no_permission() self.doc_name = self.doc.get_doc_type_display() self.page_title = _("Детали документа: ") + self.doc_name return super().dispatch(request, *args, **kwargs) def get_object(self, queryset=None): return self.doc def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) doc_files = DocumentFile.objects.filter(document=self.doc) context.update({"doc_files": doc_files}) return context