from dbsynce.models import Service from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import UserPassesTestMixin from django.utils.translation import gettext as _ from django_tables2 import SingleTableView from sharix_admin.tables import ServiceTable from sharix_admin.utils import group_required from django.views.generic.edit import UpdateView, CreateView, DeleteView from sharix_admin.forms import ServiceTariffCreateForm, ServiceTariffUpdateForm from sharix_admin.tables import ServiceTariffsTable 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 from tickets.models import Ticket, TicketList from sharix_admin.utils import * from dbsynce.lib.data import * class ServiceTariffCreate(BaseView, FormView): form_class = ServiceTariffCreateForm template_name = "sharix_admin/service_tariff_form.html" success_url = reverse_lazy("sharix_admin:service_tariffs") page_title = 'Добавить тариф к категории услуг' page_name = 'service_tariff/add/' # Проверяем не состояит ли текущий пользователь в группе METASERVICE-ADMIN def test_func(self): group_names = ('PARTNER-ADMIN') #group_names = ('PARTNER-ADMIN', 'PARTNER-SUPERVISOR') 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) #TODO Присвоить по аналогии company? # Присваиваем полю repr идентификатор текущего пользователя #instance.repr = self.request.user # Создаем новую запись в БД, чтобы иметь доступ к ID instance.save() #TODO ADD INTEGRATION WITH PLATFORM! # Создание тикета на активацию Категории услуг на Платформе. # Создаем объект тикета и присваиваем его полю ticket_status instance.ticket_status = create_ticket_service_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 ServiceListView(UserPassesTestMixin, SingleTableView): class ServiceTariffsListView(BaseView, SingleTableView): page_title = _('Тарифы сервиса') page_name = 'service_tariff' table_class = ServiceTariffsTable queryset = Service.objects.all() template_name = 'sharix_admin/service_tariffs.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(service_category__icontains=search_query) | Q(resource__icontains=search_query) | Q(company__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 ServiceTariffUpdateView(BaseView, UpdateView): model = Service page_title = _('Редактирование тарифов услуг Сервиса') form_class = ServiceTariffUpdateForm success_url = reverse_lazy("sharix_admin:service_tariffs") template_name = "sharix_admin/service_tariff_form.html" page_name = 'service_tariff/edit/' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'title': _('Тарифы услуг сервиса'), 'object': self.object, "current_page": "sharix_admin:service_tariffs" }) return context def test_func(self) -> bool or None: #TODO: Add a check a user belongs to a company! group_names = ('PARTNER-ADMIN') #group_names = ('METASERVICE-SUPERVISOR','PARTNER-ADMIN') if bool(self.request.user.groups.filter(name=group_names)): 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) #деактивируем измененную сущность instance.status = "1" # Создаем новую запись в БД, чтобы иметь доступ к ID instance.save() # Создание тикета на активацию тарифа услуги. # Создаем объект тикета и присваиваем его полю ticket_status instance.ticket_status = create_ticket_service_activation(self.request.user, instance) # Создание тикета на утверждение прав пользователя # create_ticket_role_activation_partner_admin(self.request.user, instance) # Сохраняем новые изменения instance.save() #TODO CHECK IF DOCUMENTS NEEDED # Создаем необходимые объекты документов по 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 ServiceTariffsMyListView(BaseView, SingleTableView): #class ServiceListView(UserPassesTestMixin, SingleTableView): table_class = ServiceTable #TODO change to concrete company #queryset = Service.objects.all() template_name = 'sharix_admin/service.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context.update({ 'title': _('Rates'), 'object_list': context['object_list'] }) return context def test_func(self) -> bool or None: group_names = ('PARTNER-ADMIN','PARTNER-SUPERVISOR','PROVIDER') if bool(self.request.user.groups.filter(name=group_names)): return True return False @login_required @group_required('METASERVICE_SUPERVISOR') def change_service_status(request): if request.method == 'POST': service_id = request.POST.get('service_id') new_status = request.POST.get('new_status') service = Service.objects.get(pk=service_id) service.status = new_status service.save()