from dbsynce.models import ServiceCategory from django.urls import reverse from django.utils.translation import gettext as _ from django.views.generic.edit import UpdateView, CreateView, DeleteView from django_tables2 import SingleTableView from sharix_admin.forms import ServiceCategoryCreateForm, ServiceCategoryUpdateForm from sharix_admin.tables import ServiceCategoriesTable from .base import BaseView from sharix_admin.utils import group_required from django.contrib.auth.decorators import login_required from django.urls import reverse_lazy from django.views.generic.edit import FormView from django.db import transaction from django.contrib import messages from django.db.models import Q from django.contrib.auth.mixins import UserPassesTestMixin class ServiceCategoryCreate(BaseView, FormView): form_class = ServiceCategoryCreateForm template_name = "sharix_admin/service_category_form.html" success_url = reverse_lazy("sharix_admin:service_categories") page_title = 'Добавить категорию услуг' page_name = 'service_category/add/' # Проверяем не состояит ли текущий пользователь в группе METASERVICE-ADMIN def test_func(self): group_names = ('METASERVICE-ADMIN') if bool(self.request.user.groups.filter(name=group_names)): #or self.request.user.is_superuser: return True return False #return not "METASERVICE-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() #TODO ADD INTEGRATION WITH PLATFORM! # Создание тикета на активацию Категории услуг на Платформе. # Создаем объект тикета и присваиваем его полю ticket_status #instance.ticket_status = create_ticket_company_activation(self.request.user, instance) # Создание тикета на утверждение прав пользователя #create_ticket_role_activation_partner_admin(self.request.user, instance) # Сохраняем новые изменения instance.save() #TODO! Это делать на платформе! # Создаем необходимые объекты документов по 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) # Возвращаем успешный ответ #class ServiceCategoryCreate(BaseView, CreateView): # page_title = _('Услуги сервиса') # page_name = 'service_category' # model = ServiceCategory # form_class = ServiceCategoryCreateForm # template_name = "sharix_admin/service_category_form.html" # # def get_context_data(self, **kwargs): # context = super().get_context_data(**kwargs) # context.update({ # 'object': self.object, # }) # return context # # def get_success_url(self): # return reverse('service_category') # # def test_func(self) -> bool or None: # group_names = ('METASERVICE-ADMIN') # if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser: # return True # return False #class ServiceCategoriesListView(UserPassesTestMixin, SingleTableView): class ServiceCategoriesListView(BaseView, SingleTableView): page_title = _('Услуги сервиса') page_name = 'service_category' table_class = ServiceCategoriesTable queryset = ServiceCategory.objects.all() template_name = 'sharix_admin/service_categories.html' 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(caption__icontains=search_query) | Q(codename__icontains=search_query) | Q(description__icontains=search_query) ).distinct() return queryset def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'object_list': context['object_list'], }) return context def testing(self, queryset, is_descending): queryset = queryset.annotate.order_by("-" if is_descending else "") return (queryset, True) #def test_func(self) -> bool or None: # return True # group_names = ('METASERVICE-ADMIN') # if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser: # return True # return False class ServiceCategoryUpdateView(BaseView, UpdateView): model = ServiceCategory page_title = _('Редактирование услуг Сервиса') form_class = ServiceCategoryUpdateForm success_url = reverse_lazy("sharix_admin:service_categories") template_name = "sharix_admin/service_category_form.html" page_name = 'service_category/edit/' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'title': _('Услуги сервиса'), 'object': self.object, "current_page": "sharix_admin:service_categories" }) return context def test_func(self) -> bool or None: group_names = ('METASERVICE-ADMIN') if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser: return True return False #def get_success_url(self): # return success_url #return reverse_lazy('sharix_admin:service_categories') def form_valid(self, form): with transaction.atomic(): # Сохраняем форму, чтобы получить объект ресурса instance = form.save(commit=False) # Присваиваем полю repr идентификатор текущего пользователя instance.repr = self.request.user # Создаем новую запись в БД, чтобы иметь доступ к ID instance.save() #TODO ADD INTEGRATION WITH PLATFORM # Создание тикета на активацию категории услуги. # Создаем объект тикета и присваиваем его полю 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() #TODO ADD INTEGRATION WITH PLATFORM # Создаем необходимые объекты документов по 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) # Возвращаем успешный ответ #class ServiceCategoryDelete(BaseView, DeleteView): # model = ServiceCategory # template_name = "sharix_admin/service_category_delete.html" # # def get_context_data(self, **kwargs): # context = super().get_context_data(**kwargs) # context.update({ # 'title': 'Услуги сервиса', # 'object': self.object, # "current_page": "service_category" # }) # return context # # def get_success_url(self): # return reverse('service_category') # # def test_func(self) -> bool or None: # group_names = ('METASERVICE-ADMIN') # if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser: # return True # return False @login_required @group_required('METASERVICE-ADMIN') def change_service_category_status(request): if request.method == 'POST': service_category = request.POST.get('resource') new_status = request.POST.get('new_status') service_category = ServiceCategory.objects.get(pk=service_category) service_category.status = new_status service_category.save() return JsonResponse({'status': 'success'}) else: return JsonResponse({'status': 'error'})