Procházet zdrojové kódy

some changes to make provider pages working

ShariX Developer před 16 hodinami
rodič
revize
baa420942a

+ 47 - 1
sharix_admin/forms/service.py

@@ -1,4 +1,7 @@
-from dbsynce.models import ServiceCategory, Service, Company
+from dbsynce.models import ServiceCategory
+from dbsynce.models import Service
+from dbsynce.models import Company
+from dbsynce.models import Provider
 from django import forms
 from sharix_admin.forms import BaseForm
 
@@ -272,3 +275,46 @@ class PartnerInformationCreateForm(forms.ModelForm):
 
         #     username = forms.CharField(label="Номер телефона",
         # widget=forms.TextInput(attrs={'class':'form-control'}))
+
+
+class ProviderCreateForm(forms.ModelForm):
+    gap = forms.CharField(label="Промежуток времени до готовности приступить к выполнению")
+    #gap = forms.DateTimeField(label="Промежуток времени до готовности приступить к выполнению")
+    location_type = forms.CharField(label="Способ отображения геолокации")
+    default_location = forms.CharField(label="Геолокация по умолчанию")
+    #resource_type = forms.ChoiceField(choices=RESOURCE_TYPE_CHOICES, label="Необходимый тип ресурса")
+    #requirements = forms.CharField(label="Требования")
+
+#    is_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
+#    is_visible = forms.BooleanField(label="Доступно для планирования цепочек во всех сервисах", required=False)
+
+    def __init__(self, *args, **kwargs):
+        super(ProviderCreateForm, self).__init__(*args, **kwargs)
+        # Добавляет стиль бутстрапа form-control всем полям таблицы если у них нет своих стилей
+        for field in iter(self.fields):
+            if 'class' not in self.fields[field].widget.attrs:
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
+
+    class Meta:
+
+        model = Provider
+        #fields = '__all__'
+        fields = [
+            'gap',
+            'location_type',
+            'default_location',
+            'service',
+            'resource',
+        ]
+
+        #company - использовать ту, у которой сейчас отображаются услуги
+        #resource - показывать только те, которые имеют отношение к компании
+
+        widgets = {
+            'service': forms.Select(attrs={'class': 'form-select'}),
+            'resource': forms.Select(attrs={'class': 'form-select'}),
+            #'resource': forms.Select(attrs={'class': 'form-select'}),
+            #'ticket_status': forms.TextInput(attrs={'readonly': True}),
+        }
+
+

+ 23 - 0
sharix_admin/templates/sharix_admin/provider_form.html

@@ -0,0 +1,23 @@
+{% extends 'sharix_admin/base_admin.html' %}
+{% load i18n %}
+
+{% block view %}
+<div class="container">
+<form method="post" style="overflow: auto">
+    {% csrf_token %}
+    <div class="container m-2">
+        {% for field in form %}
+        {{field.errors}}
+        <div class="row">
+            {{field.label_tag}}
+            {{field}}
+            <p class="fs-6 fst-italic">{{field.help_text|truncatewords:20}}</p>
+        </div>
+        {% endfor %}
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="Submit" name="submit" value="{% trans 'Submit' %}"/>
+    </div>
+</form>
+</div>
+{% endblock view %}

+ 29 - 2
sharix_admin/templates/sharix_admin/providers.html

@@ -1,9 +1,36 @@
 {% extends 'sharix_admin/base_admin.html' %}
 {% load render_table from django_tables2 %}
-
+{% load i18n %}
 {% block view %}
 {% block contenthome %}
-    <h1 class="mainHeader">{{ title }}</h1>
+
+<p>
+На данной странице представлен список исполнителей по конкретным услугам.
+</p>
+
+<div class="dropdown mb-3">
+        <button class="btn btn-secondary dropdown-toggle" type="button" id="howToUseDropdown" data-bs-toggle="dropdown" aria-expanded="false">
+            Как пользоваться?
+        </button>
+        <div class="dropdown-menu" aria-labelledby="howToUseDropdown">
+            <p class="dropdown-item-text custom-dropdown-text">
+	    Активация происходит через заявки, отправленные на платформу, или, если Сервис не подключен к платформе - вручную.
+	    </p>
+        </div>
+</div>
+
+    <div class="mb-3 d-flex justify-content-between align-items-center">
+      <form method="get" action="" class="d-flex align-items-center">
+          <input type="text" name="q" class="form-control" placeholder="Поиск" value="{{ request.GET.q }}" style="width: 300px; height: 38px;">
+          <button type="submit" class="btn btn-primary ms-2" style="height: 38px;">Поиск</button>
+      </form>
+      </div>
+
+{% if "PROVIDER" in user_groups %}
+  <div class="container text-end mt-2">
+          <a class="btn btn-primary" id="bord" href={% url "sharix_admin:provider/add/" %}>{% trans 'Add' %}</a>
+  </div>
+{% endif %}
 
     <div class="container text-center mt-2">
       {% render_table table %}

+ 1 - 0
sharix_admin/urls.py

@@ -60,6 +60,7 @@ urlpatterns = [
     path('providers/', login_required(ProvidersListView.as_view()), name='providers'),
     # path('provider/<str:pk>', login_required(ProviderDetailView.as_view()), name='provider_detail'),
     # path('provider/edit/<int:pk>', login_required(ProviderEditView.as_view()), name='provider/edit'),
+    path('provider/add', login_required(ProviderCreate.as_view()), name='provider/add'),
     # path('provider/doc/<str:doc_code>/upload', login_required(ProviderDocUploadView.as_view()),
     #      name='partner_doc_upload'),
     # path('provider/doc/<str:doc_code>', login_required(ProviderDocView.as_view()), name='provider_doc'),

+ 2 - 2
sharix_admin/views/__init__.py

@@ -5,14 +5,14 @@ from .get_userid import *
 from .staff import *
 from .main import *
 from .partner import *
-from .partner_info import *
+#from .partner_info import *
 #from .partners import *
 from .payment import *
 from .provider import *
 from .resource import *
 from .schema import *
 from .service import *
-from .service_info import *
+#from .service_info import *
 #from .service_tariff import *
 from .service_category import *
 from .trans_id import *

+ 0 - 0
sharix_admin/views/service_info.py → sharix_admin/views/depr_service_info.py


+ 98 - 5
sharix_admin/views/provider.py

@@ -8,12 +8,105 @@ from django_tables2 import SingleTableView
 from sharix_admin.tables import ProvidersTable
 from sharix_admin.utils import group_required
 
+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 tickets.models import Ticket, TicketList
+
+from sharix_admin.forms import CompanyForm
+from sharix_admin.utils import *
+from dbsynce.lib.data import *
+from dbsynce.lib.dicts import *
+
+from sharix_admin.forms import ProviderCreateForm
+#from sharix_admin.forms import ProviderUpdateForm
+
+class ProviderCreate(BaseView, FormView):
+    form_class = ProviderCreateForm
+    template_name = "sharix_admin/provider_form.html"
+    success_url = reverse_lazy("sharix_admin:providers")
+    page_title = 'Добавить услугу к исполнению'
+    page_name = 'providers/add/'
+
+    # Проверяем не состояит ли текущий пользователь в группе METASERVICE-ADMIN
+    def test_func(self):
+        group_names = ('PROVIDER')
+        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)
+            instance.ticket_status = create_ticket_provider_activation_by_partner_admin(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 ProvidersListView(UserPassesTestMixin, SingleTableView):
+
+    page_title = _('Исполнители по видам услуг')
+    page_name = 'providers'
     table_class = ProvidersTable
     queryset = Provider.objects.all()
     template_name = 'sharix_admin/providers.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_status__icontains=search_query) |
+                Q(service__icontains=search_query) |
+                Q(resource__icontains=search_query)
+            ).distinct()
+        return queryset
+
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
@@ -23,11 +116,11 @@ class ProvidersListView(UserPassesTestMixin, SingleTableView):
         return context
 
     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
-
+    #    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')