from dbsynce.models import Resource from webservice_running.models import ResourceLocal 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 django.shortcuts import render from webservice_running.tables import ResourcesLocalTable 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 CreateView from tickets.models import Ticket, TicketList from webservice_running.forms import ResourceLocalForm from sharix_admin.forms import ResourceForm from sharix_admin.utils import * from dbsynce.lib.data import * from sharix_admin.views.base import BaseView from webservice_running.views.base_local import BaseLocalView from django.db.models import Q from django import forms from django.shortcuts import redirect from dbsynce.docs.database.resource import Resource as ResourceHelpTexts from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames from webservice_running.docs.database.local import Local as HelpTextsLocal from webservice_running.docs.verbose_names.local import Local as VerboseNameLocal #def _get_form(request, formcls, prefix): def _get_form(request, formcls): data = request.POST #data = request.POST if prefix in request.POST else None return formcls(data) #return formcls(data, prefix=prefix) class ResourcesLocalListView(BaseView, UserPassesTestMixin, SingleTableView): table_class = ResourcesLocalTable queryset = ResourceLocal.objects.all() template_name = 'webservice_running/local/resource_local_list.html' page_title = 'Локальные данные ресурсов' page_name = 'resources' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'title': self.page_title, '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 = request.POST.get('resource') new_status = request.POST.get('new_status') resource = Resource.objects.get(pk=resource) resource.status = new_status resource.save() return JsonResponse({'status': 'success'}) else: return JsonResponse({'status': 'error'}) class ResourceLocalEditView(BaseLocalView, FormView): resource_form = ResourceLocalForm resource_local_form = ResourceLocalForm template_name = "webservice_running/local/resource_local.html" success_url = reverse_lazy("webservice_running:resource_local_list") page_title = 'Изменить ресурс c локальными данными' page_name = 'resource_local_edit' # Проверяем состояит ли текущий пользователь в группе 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) # Присваиваем полю repr идентификатор текущего пользователя instance.repr = 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( company=instance, user=self.request.user, doc_type=doc_code ) for doc_code in doc_codes ]) # Отправляем пользователю уведомление на страницу о успехе операции messages.success( self.request, 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!' ) #return super().form_valid(form) # Возвращаем успешный ответ return super().form_valid(resource_form, resource_local_form) # Возвращаем успешный ответ class ResourceLocalCreate(BaseLocalView): resource_form = ResourceForm resource_local_form = ResourceLocalForm template_name = "webservice_running/local/resource_local.html" success_url = reverse_lazy("webservice_running:main_local") page_title = 'Добавить ресурс с локальными данными' page_name = 'resource_local/add/' def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) context.update({'form_base': ResourceForm(prefix='form_base'), 'form_local': ResourceLocalForm(prefix='form_local')}) return render( request, self.template_name, context, ) #return self.render_to_response(context) def post(self, request, *args, **kwargs): form_base = _get_form(request, ResourceForm) form_local = _get_form(request, ResourceLocalForm) #if form_base.is_valid() and form_local.is_valid(): #if form_local.is_valid(): if form_local.is_valid() and form_base.is_valid(): instance=form_base.save(commit=False) instance.user = self.request.user instance.save() 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() 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, 'Ваша заявка на добавление ресурса успешно отправлена и теперь проходит проверку!' ) instance_local=form_local.save(commit=False) instance_local.resource=instance form_local.save() return redirect(self.success_url) else: messages.error( self.request, 'Ошибка добавления, попробуйте снова!' ) context = self.get_context_data(**kwargs) context.update({'form_base': form_base, 'form_local': form_local}) return render( request, self.template_name, context, ) class ResourceLocalDetailView(BaseView, DetailView): model = ResourceLocal template_name = 'webservice_running/local/resource_local_detail.html' context_object_name = 'resource_local' page_title = 'Локальная информация о ресурсе' page_name = 'resource_local_detail' def detail_view(self, request, primary_key): try: resource_local = ResourceLocal.objects.get(pk=primary_key) #docs = Documents.objects.filter(resource=self.object.resource) #context['docs'] = self.docs except ResourceLocal.DoesNotExist: #docs=[] raise Http404('Something does not exist') return render(request, self.template_name, context={ }) def get_context_data(self, **kwargs): try: docs = Documents.objects.filter(resource=self.object.resource) except Documents.DoesNotExist: docs=[] context = super().get_context_data(**kwargs) context['help_texts'] = ResourceHelpTexts context['captions'] = ResourceVerboseNames context['help_texts_local'] = HelpTextsLocal context['captions_local'] = VerboseNameLocal context['docs'] = docs return context