123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- 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
|