Browse Source

format code using pycharm

blezz-tech 4 weeks ago
parent
commit
62287eec7d
47 changed files with 534 additions and 460 deletions
  1. 11 5
      README.md
  2. 1 1
      core/_settings_vars.py
  3. 1 2
      core/gunicorn.py
  4. 19 23
      core/settings.py
  5. 19 20
      core/urls.py
  6. 5 5
      core/utils/AuthAPI.py
  7. 23 18
      sharix_admin/admin.py
  8. 1 1
      sharix_admin/api/serializers/__init__.py
  9. 1 1
      sharix_admin/api/serializers/custom_token.py
  10. 30 28
      sharix_admin/apiviews.py
  11. 1 1
      sharix_admin/apps.py
  12. 3 4
      sharix_admin/forms/__init__.py
  13. 5 4
      sharix_admin/forms/auth.py
  14. 2 1
      sharix_admin/forms/base.py
  15. 2 3
      sharix_admin/forms/company.py
  16. 7 5
      sharix_admin/forms/document.py
  17. 38 37
      sharix_admin/forms/service.py
  18. 1 1
      sharix_admin/models.py
  19. 11 6
      sharix_admin/serializer.py
  20. 8 12
      sharix_admin/signals.py
  21. 129 81
      sharix_admin/tables.py
  22. 23 20
      sharix_admin/urls.py
  23. 1 1
      sharix_admin/utils/__init__.py
  24. 1 1
      sharix_admin/utils/group.py
  25. 1 1
      sharix_admin/utils/other.py
  26. 6 7
      sharix_admin/utils/ticket_gen.py
  27. 12 13
      sharix_admin/views/__init__.py
  28. 3 3
      sharix_admin/views/auth.py
  29. 11 11
      sharix_admin/views/balance.py
  30. 4 3
      sharix_admin/views/base.py
  31. 14 17
      sharix_admin/views/cooperate.py
  32. 2 1
      sharix_admin/views/get_userid.py
  33. 2 2
      sharix_admin/views/main.py
  34. 16 15
      sharix_admin/views/partner.py
  35. 29 24
      sharix_admin/views/partner_info.py
  36. 6 6
      sharix_admin/views/partners.py
  37. 1 1
      sharix_admin/views/payment.py
  38. 10 8
      sharix_admin/views/provider.py
  39. 11 8
      sharix_admin/views/resource.py
  40. 4 3
      sharix_admin/views/schema.py
  41. 9 6
      sharix_admin/views/service.py
  42. 13 13
      sharix_admin/views/service_info.py
  43. 13 11
      sharix_admin/views/service_tariff.py
  44. 14 16
      sharix_admin/views/service_type.py
  45. 3 3
      sharix_admin/views/trans_id.py
  46. 2 2
      sharix_admin/views/transactions.py
  47. 5 5
      sharix_admin/views/user_info.py

+ 11 - 5
README.md

@@ -5,7 +5,8 @@ The base Django project of a service web application to which other modules are
 ## Installation / Upgrade
 
 1. Download or clone repository.
-2. Make a copy of configuration file (cp bin/install.cfg.example bin/install.cfg) and modify it for your service (check paths).
+2. Make a copy of configuration file (cp bin/install.cfg.example bin/install.cfg) and modify it for your service (check
+   paths).
 3. For the initial/update project configuration, run *bin/install.sh*.
 
 ### Test Users
@@ -29,12 +30,17 @@ TEST_USERS=true
 
 ## Configuration
 
-For basic project configuration when deploying, use the *core/settings_vars.py*. This file is automatically created during the installation script execution, in case this file has not been created yet. It is a copy of *core/_settings_vars.py* and contains some default settings that allow the project to run locally and is more suitable for development.
+For basic project configuration when deploying, use the *core/settings_vars.py*. This file is automatically created
+during the installation script execution, in case this file has not been created yet. It is a copy of *core/
+_settings_vars.py* and contains some default settings that allow the project to run locally and is more suitable for
+development.
 
-Be careful when adding new settings during development and remember to add them to *core/_settings_vars.py*, as *core/settings_vars.py* is ignored by Git for security reasons.
+Be careful when adding new settings during development and remember to add them to *core/_settings_vars.py*, as
+*core/settings_vars.py* is ignored by Git for security reasons.
 
-You can also change the settings in *bin/install.cfg*. This file contains the links to repositories required for the project to work.
+You can also change the settings in *bin/install.cfg*. This file contains the links to repositories required for the
+project to work.
 
-## Launch 
+## Launch
 
 To start the web application, run *bin/start.sh*.

+ 1 - 1
core/_settings_vars.py

@@ -59,4 +59,4 @@ EJ_SERVICE = "chat.ej.sharix-app.org"
 EJ_HOST = "ej.sharix-app.org"
 
 # Service name that is used in generating ejabber rooms
-WEBSERVICE_NAME = "open" 
+WEBSERVICE_NAME = "open"

+ 1 - 2
core/gunicorn.py

@@ -1,10 +1,9 @@
 import core.settings_vars as sv
 
-
 bind = sv.BIND
 workers = 2
 worker_class = "sync"
 threads = 4
 timeout = 30
 max_requests = 1000
-capture_output = True
+capture_output = True

+ 19 - 23
core/settings.py

@@ -1,12 +1,8 @@
+import core.settings_vars as sv
 import os
-
-from pathlib import Path
-
 from django.contrib.messages import constants as message_constants
 from django.utils.translation import gettext_lazy as _
-
-import core.settings_vars as sv
-
+from pathlib import Path
 
 ########
 #
@@ -23,7 +19,7 @@ SECRET_KEY = sv.SECRET_KEY
 # SECURITY WARNING: don't run with debug turned on in production!
 DEBUG = sv.DEBUG
 CSRF_TRUSTED_ORIGINS = sv.CSRF_TRUSTED_ORIGINS
-ALLOWED_HOSTS = sv.ALLOWED_HOSTS 
+ALLOWED_HOSTS = sv.ALLOWED_HOSTS
 INTERNAL_IPS = sv.INTERNAL_IPS
 
 # Application definition
@@ -231,10 +227,10 @@ JAZZMIN_SETTINGS = {
     "topmenu_links": [
 
         # Url that gets reversed (Permissions can be added)
-        {"name": "Главная",  "url": "admin:index", "permissions": ["auth.view_user"]},
+        {"name": "Главная", "url": "admin:index", "permissions": ["auth.view_user"]},
 
         # external url that opens in a new window (Permissions can be added)
-        #{"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True},
+        # {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True},
 
         # model admin to link to (Permissions checked against model)
         {"model": "sharix_admin.SharixUser"},
@@ -309,10 +305,10 @@ JAZZMIN_SETTINGS = {
     # # UI Tweaks #
     # #############
     # # Relative paths to custom CSS/JS scripts (must be present in static files)
-        "custom_css": None,
-        "custom_js": None,
+    "custom_css": None,
+    "custom_js": None,
     # Whether to link font from fonts.googleapis.com (use custom_css to supply font otherwise)
-        "use_google_fonts_cdn": True,
+    "use_google_fonts_cdn": True,
     # # Whether to show the UI customizer on the sidebar
     "show_ui_builder": True,
 
@@ -325,11 +321,11 @@ JAZZMIN_SETTINGS = {
     # - vertical_tabs
     # - collapsible
     # - carousel
-    #"changeform_format": "horizontal_tabs",
+    # "changeform_format": "horizontal_tabs",
     # override change forms on a per modeladmin basis
-    #"changeform_format_overrides": {"sharix_admin.SharixUser": "collapsible", "auth.group": "vertical_tabs"},
+    # "changeform_format_overrides": {"sharix_admin.SharixUser": "collapsible", "auth.group": "vertical_tabs"},
     # Add a language dropdown into the admin
-    #"language_chooser": True,
+    # "language_chooser": True,
 }
 
 JAZZMIN_UI_TWEAKS = {
@@ -376,13 +372,13 @@ API_URL = sv.API_URL
 REST_FRAMEWORK = {
     # Use Django's standard `django.contrib.auth` permissions,
     # or allow read-only access for unauthenticated users.
-    'DEFAULT_RENDERER_CLASSES':[
+    'DEFAULT_RENDERER_CLASSES': [
         'rest_framework.renderers.JSONRenderer',
         'rest_framework.renderers.BrowsableAPIRenderer',
     ],
     'DEFAULT_PERMISSION_CLASSES': [
-        #'rest_framework.permissions.AllowAny',
-        #'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
+        # 'rest_framework.permissions.AllowAny',
+        # 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
     ],
     'DEFAULT_AUTHENTICATION_CLASSES': (
         'rest_framework.authentication.TokenAuthentication',
@@ -392,11 +388,11 @@ REST_FRAMEWORK = {
 }
 
 SPAGHETTI_SAUCE = {
-    'apps': ['auth', 'sharix_admin', 
-                'tickets', 'admin', 
-                'flatpages', 'sessions', 'sites', 'dbsynce'],
+    'apps': ['auth', 'sharix_admin',
+             'tickets', 'admin',
+             'flatpages', 'sessions', 'sites', 'dbsynce'],
     'show_fields': False,
-    'show_proxy':True,
+    'show_proxy': True,
 }
 
 GRAPH_MODELS = {
@@ -409,6 +405,6 @@ EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
 EMAIL_HOST = sv.EMAIL_HOST
 EMAIL_PORT = sv.EMAIL_PORT
 EMAIL_USE_TLS = sv.EMAIL_USE_TLS
-EMAIL_HOST_USER = sv.EMAIL_HOST_USER 
+EMAIL_HOST_USER = sv.EMAIL_HOST_USER
 EMAIL_HOST_PASSWORD = sv.EMAIL_HOST_PASSWORD
 DEFAULT_FROM_EMAIL = sv.DEFAULT_FROM_EMAIL

+ 19 - 20
core/urls.py

@@ -1,26 +1,25 @@
-from django.contrib import admin
-from django.urls import include, path
 from django.conf import settings
-from django.conf.urls.static import static
 from django.conf.urls.i18n import i18n_patterns
-
+from django.conf.urls.static import static
+from django.contrib import admin
+from django.urls import include, path
 
 urlpatterns = [
-    path('testwords/admin/', admin.site.urls),
-] + i18n_patterns(
-        path('i18n/', include('django.conf.urls.i18n')),
-        path('', include("landing.urls")),
-        path('tickets/', include('tickets.urls', namespace='tickets'), name='tickets'),
-        path('design/', include("design_template.urls"), name='design'),
-        path('dbsynce/', include("dbsynce.urls"), name="dbsynce"),
-        path('webservice/', include("webservice_running.urls"), name='webservice_running'),
-        path('my/', include('sharix_admin.urls'), name="Admin"), # FIXME: Check where using Admin name and replace this to admin (name="Admin" -> name="admin")
-        prefix_default_language=False,
-    )
-    
+                  path('testwords/admin/', admin.site.urls),
+              ] + i18n_patterns(
+    path('i18n/', include('django.conf.urls.i18n')),
+    path('', include("landing.urls")),
+    path('tickets/', include('tickets.urls', namespace='tickets'), name='tickets'),
+    path('design/', include("design_template.urls"), name='design'),
+    path('dbsynce/', include("dbsynce.urls"), name="dbsynce"),
+    path('webservice/', include("webservice_running.urls"), name='webservice_running'),
+    path('my/', include('sharix_admin.urls'), name="Admin"),
+    # FIXME: Check where using Admin name and replace this to admin (name="Admin" -> name="admin")
+    prefix_default_language=False,
+)
 
 if settings.DEBUG:
-   urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
-   urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
-   
-   urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))
+    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
+    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+
+    urlpatterns.append(path("__debug__/", include("debug_toolbar.urls")))

+ 5 - 5
core/utils/AuthAPI.py

@@ -15,12 +15,12 @@ class AuthAPI:
         self._login = login
         self._password = password
         self._token = None
-        self._headers =  None
+        self._headers = None
 
     def _create_token(self):
         try:
             response = requests.post(
-                f"{API_URL}/auth/token/login/", 
+                f"{API_URL}/auth/token/login/",
                 {
                     "phone_number": self._login,
                     "password": self._password
@@ -31,7 +31,7 @@ class AuthAPI:
             print("\033[31m" + f"{self.__class__.__name__}: Can't connect to the API." + "\033[0m")
         except KeyError:
             print("\033[31m" + f"{self.__class__.__name__}: Incorrect login data." + "\033[0m")
-    
+
     @property
     def token(self):
         if self._token is None:
@@ -42,5 +42,5 @@ class AuthAPI:
     def headers(self):
         if self._token is None:
             self._create_token()
-            self._headers =  {'Authorization': f'Token {self._token}'}
-        return self._headers
+            self._headers = {'Authorization': f'Token {self._token}'}
+        return self._headers

+ 23 - 18
sharix_admin/admin.py

@@ -1,43 +1,48 @@
 # -*- coding: utf-8 -*-
+import django.contrib.auth.admin as adm
+from django import forms
 from django.contrib import admin
-from django.http import HttpResponseRedirect
-from django.shortcuts import render
 from django.contrib.auth import get_user_model
-from django import forms
-from xmpp import cli
 from django.contrib.auth.admin import UserAdmin
 from django.contrib.auth.models import Permission
-import django.contrib.auth.admin as adm
+from django.http import HttpResponseRedirect
+from django.shortcuts import render
+from xmpp import cli
+
 
 class MessageForm(forms.Form):
     _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
     message = forms.CharField(label='Message', max_length=1000)
 
 
-#@admin.action(description='Отправить сообщение на номер телефона')
+# @admin.action(description='Отправить сообщение на номер телефона')
 def send_phone(modeladmin, request, queryset):
     form = None
-    #print("Hello world")
+    # print("Hello world")
     if 'apply' in request.POST:
-        #print("Hello world")
+        # print("Hello world")
         modeladmin.message_user(request, "Сообщения успешно отправлены!")
         form = MessageForm(request.POST)
         if form.is_valid():
             for i in queryset:
                 if str(i.phone_number).startswith("7"):
-                    message = '{"phone":"+'+i.phone_number+'","msg":"'+request.POST['message']+'"}'      
+                    message = '{"phone":"+' + i.phone_number + '","msg":"' + request.POST['message'] + '"}'
                 else:
-                    message = '{"phone":"'+i.phone_number+'","msg":"'+request.POST['message']+'"}'
+                    message = '{"phone":"' + i.phone_number + '","msg":"' + request.POST['message'] + '"}'
                 cli.send_message("sender", "password", "getter", message)
                 print(i)
             print(request.POST['message'])
             return HttpResponseRedirect(request.get_full_path())
     else:
         form = MessageForm(initial={'_selected_action': request.POST.getlist("_selected_action")})
-           
-    return render(request, "sharix_admin/senderform.html", {"items":queryset, "form":form, 'title':'Отправка сообщений на номер телефона'})
+
+    return render(request, "sharix_admin/senderform.html",
+                  {"items": queryset, "form": form, 'title': 'Отправка сообщений на номер телефона'})
+
+
 send_phone.short_description = u"Отправить сообщение на номер телефона"
 
+
 @admin.register(Permission)
 class PermissionsAdmin(admin.ModelAdmin):
     list_display = (
@@ -46,10 +51,10 @@ class PermissionsAdmin(admin.ModelAdmin):
         'content_type',
         'codename',
     )
-    
+
+
 @admin.register(get_user_model())
 class ShariXUserAdmin(adm.UserAdmin):
-    
     list_display = (
         'username',
         'phone_number',
@@ -65,19 +70,19 @@ class ShariXUserAdmin(adm.UserAdmin):
     )
     fieldsets = (
         ("Главное", {'fields': ('phone_number', 'password')}),
-        ('Персональные данные', {'fields': ('username', 'email', 'first_name','last_name')}),
+        ('Персональные данные', {'fields': ('username', 'email', 'first_name', 'last_name')}),
         ('Разрешения', {'fields': ('is_staff', 'is_active', 'is_superuser',)}),
         ('Прочие разрешения', {'fields': ('groups', 'user_permissions'), 'classes': ['collapse']}),
         ('Прочее', {'fields': ('last_login', 'date_joined',)}),
     )
     add_fieldsets = (
         ("Главное", {'fields': ('phone_number', 'password1', 'password2')}),
-        ('Персональные данные', {'fields': ('username', 'email', 'first_name','last_name')}),
+        ('Персональные данные', {'fields': ('username', 'email', 'first_name', 'last_name')}),
         ('Разрешения', {'fields': ('is_staff', 'is_active', 'is_superuser',)}),
         ('Прочие разрешения', {'fields': ('groups', 'user_permissions'), 'classes': ['collapse']}),
         ('Прочее', {'fields': ('last_login', 'date_joined',)}),
     )
-    #raw_id_fields = ('groups', 'user_permissions')
+    # raw_id_fields = ('groups', 'user_permissions')
     actions = [send_phone]
 
-#admin.site.register(SharixUser, UserAdmin)
+# admin.site.register(SharixUser, UserAdmin)

+ 1 - 1
sharix_admin/api/serializers/__init__.py

@@ -1 +1 @@
-from sharix_admin.api.serializers.custom_token import CustomTokenSerializer
+from sharix_admin.api.serializers.custom_token import CustomTokenSerializer

+ 1 - 1
sharix_admin/api/serializers/custom_token.py

@@ -6,4 +6,4 @@ class CustomTokenSerializer(serializers.Serializer):
     auth_token = serializers.CharField(source="key")
 
     class Meta:
-        fields = ("user_id", "auth_token")
+        fields = ("user_id", "auth_token")

+ 30 - 28
sharix_admin/apiviews.py

@@ -1,33 +1,35 @@
-#REST API ---------------------------
-from .serializer import *
+# REST API ---------------------------
+from django.contrib.auth import get_user_model
+from drf_yasg import openapi
+from drf_yasg.utils import swagger_auto_schema
+from drf_yasg.views import get_schema_view
 from rest_framework import viewsets, permissions, exceptions
 from rest_framework.authentication import TokenAuthentication
 from rest_framework.decorators import action
-from django.contrib.auth import get_user_model
-from rest_framework.views import APIView
 from rest_framework.response import Response
+from rest_framework.views import APIView
 from xmpp import cli
-from drf_yasg.views import get_schema_view
-from drf_yasg import openapi
-from drf_yasg.utils import swagger_auto_schema
+
+from .serializer import *
 
 schema_view = get_schema_view(
-   openapi.Info(
-      title="ShariX Admin Open API",
-      default_version='v1',
-      description="REST API Documentation",
-      #terms_of_service="https://www.google.com/policies/terms/",
-      #contact=openapi.Contact(email="contact@snippets.local"),
-      #license=openapi.License(name="BSD License"),
-   ),
-   public=False,
-   permission_classes=[permissions.IsAuthenticated],
+    openapi.Info(
+        title="ShariX Admin Open API",
+        default_version='v1',
+        description="REST API Documentation",
+        # terms_of_service="https://www.google.com/policies/terms/",
+        # contact=openapi.Contact(email="contact@snippets.local"),
+        # license=openapi.License(name="BSD License"),
+    ),
+    public=False,
+    permission_classes=[permissions.IsAuthenticated],
 )
 
+
 class SharixUserMVS(viewsets.ModelViewSet):
     queryset = get_user_model().objects.all()
     serializer_class = UserSerializer
-    #permission_classes = [IsOwnerOrReadOnly]
+    # permission_classes = [IsOwnerOrReadOnly]
     permission_classes = [permissions.IsAuthenticated]
 
 
@@ -37,29 +39,29 @@ class GroupMVS(viewsets.ModelViewSet):
     permission_classes = [permissions.IsAuthenticated]
 
     def update(self, request, *args, **kwargs):
-        #print(self.request.user.pk)
+        # print(self.request.user.pk)
         return super().update(request, *args, **kwargs)
-        
-    #def get_queryset(self):
-        #owner_req = self.queryset.filter(wallet=self.request.user.pk)
-        #return owner_req    
+
+    # def get_queryset(self):
+    # owner_req = self.queryset.filter(wallet=self.request.user.pk)
+    # return owner_req
 
     def partial_update(self, request, *args, **kwargs):
         return super().partial_update(request, *args, **kwargs)
 
-    
+
 class PhoneSender(APIView):
     """
     Test description one
     """
-    
+
     permission_classes = [permissions.IsAdminUser, permissions.IsAuthenticated]
-    
+
     @swagger_auto_schema(operation_description="Test description two")
     def get(self, request, format=None):
         return Response({"message": "Для отправки сообщения используйте POST-запрос"})
-    
+
     @swagger_auto_schema(operation_description="Test description three")
     def post(self, request, format=None):
         cli.send_message("sender", "password", "getter", request.data)
-        return Response({"message": "Сообщение успешно отправлено!"})
+        return Response({"message": "Сообщение успешно отправлено!"})

+ 1 - 1
sharix_admin/apps.py

@@ -7,4 +7,4 @@ class ShariXAdminConfig(AppConfig):
     verbose_name = "ShariX Open"
 
     def ready(self):
-       import sharix_admin.signals
+        import sharix_admin.signals

+ 3 - 4
sharix_admin/forms/__init__.py

@@ -1,6 +1,5 @@
-from .base import BaseForm
 from .auth import *
-
-from .service import *
+from .base import BaseForm
 from .company import *
-from .document import *
+from .document import *
+from .service import *

+ 5 - 4
sharix_admin/forms/auth.py

@@ -1,6 +1,6 @@
 from django import forms
-from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, UsernameField
 from django.contrib.auth import get_user_model
+from django.contrib.auth.forms import UserCreationForm, AuthenticationForm, UsernameField
 from django.contrib.auth.models import Group
 
 from sharix_admin.forms import BaseForm
@@ -10,12 +10,13 @@ class ShariXSignUpForm(BaseForm, UserCreationForm):
     """
     Форма для регистрации пользователей. 
     """
+
     def save(self, commit=True):
         user = super().save(commit=False)
-        user.username = self.cleaned_data['phone_number'] # FIXME: Имя пользователя = номер телефона
+        user.username = self.cleaned_data['phone_number']  # FIXME: Имя пользователя = номер телефона
         if commit:
             user.save()
-            user.groups.add(Group.objects.get(id=51)) # Добавляем всех пользователей по умолчанию в группу CLIENT
+            user.groups.add(Group.objects.get(id=51))  # Добавляем всех пользователей по умолчанию в группу CLIENT
         return user
 
     class Meta:
@@ -31,4 +32,4 @@ class ShariXLoginForm(BaseForm, AuthenticationForm):
     """
     Форма для авторизации пользователей.
     """
-    pass
+    pass

+ 2 - 1
sharix_admin/forms/base.py

@@ -6,8 +6,9 @@ class BaseForm(forms.Form):
     Базовая форма, которая автоматически добавляет класс 'form-control' 
     к каждому полю формы.
     """
+
     def __init__(self, *args, **kwargs):
         super(BaseForm, self).__init__(*args, **kwargs)
         for field in self.fields:
             if 'class' not in self.fields[field].widget.attrs:
-                self.fields[field].widget.attrs.update({'class': 'form-control'})
+                self.fields[field].widget.attrs.update({'class': 'form-control'})

+ 2 - 3
sharix_admin/forms/company.py

@@ -1,6 +1,5 @@
-from django import forms
-
 from dbsynce.models import Company
+from django import forms
 
 
 class CompanyForm(forms.ModelForm):
@@ -13,4 +12,4 @@ class CompanyForm(forms.ModelForm):
 
     class Meta:
         model = Company
-        fields = ['legal_name', 'inn', 'kpp', 'ogrn', 'bank_name', 'bik', 'rs', 'ks', 'address']
+        fields = ['legal_name', 'inn', 'kpp', 'ogrn', 'bank_name', 'bik', 'rs', 'ks', 'address']

+ 7 - 5
sharix_admin/forms/document.py

@@ -39,15 +39,17 @@ class DocumentUploadForm(forms.Form):
         # Проверка на максимальное количество файлов
         if len(files) > self.MAX_FILES:
             raise ValidationError(f"Вы можете загрузить не более {self.MAX_FILES} файлов.")
-        
+
         for file in files:
             # Проверяем расширение файла
             extension = file.name.split('.')[-1].lower()
             if extension not in allowed_extensions:
-                raise ValidationError(f"Файл {file.name} имеет недопустимое расширение. Допустимые расширения: {', '.join(allowed_extensions)}.")
+                raise ValidationError(
+                    f"Файл {file.name} имеет недопустимое расширение. Допустимые расширения: {', '.join(allowed_extensions)}.")
 
             # Проверяем MIME тип файла
             if file.content_type not in allowed_mime_types:
-                raise ValidationError(f"Файл {file.name} имеет недопустимый формат. Допустимые форматы: {', '.join(allowed_mime_types)}.")
-        
-        return files
+                raise ValidationError(
+                    f"Файл {file.name} имеет недопустимый формат. Допустимые форматы: {', '.join(allowed_mime_types)}.")
+
+        return files

+ 38 - 37
sharix_admin/forms/service.py

@@ -1,5 +1,5 @@
-from django import forms
 from dbsynce.models import ServiceType, Service, Company
+from django import forms
 
 
 class ServiceTariffUpdateForm(forms.ModelForm):
@@ -9,7 +9,7 @@ class ServiceTariffUpdateForm(forms.ModelForm):
         # Добавляет стиль бутстрапа 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'})
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
 
     class Meta:
 
@@ -31,7 +31,7 @@ class ServiceTariffUpdateForm(forms.ModelForm):
         widgets = {
             'status': forms.TextInput(attrs={'readonly': True}, ),
             'ticket_status': forms.TextInput(attrs={'readonly': True}),
-            
+
             'servicetype_id': forms.Select(attrs={'class': 'form-select'}),
             'resource_id': forms.Select(attrs={'class': 'form-select'}),
         }
@@ -43,8 +43,8 @@ class ServiceTariffCreateForm(forms.ModelForm):
         # Добавляет стиль бутстрапа 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'})
-    
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
+
     class Meta:
 
         model = Service
@@ -60,22 +60,25 @@ class ServiceTariffCreateForm(forms.ModelForm):
 class ServiceTypeUpdateForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
         super(ServiceTypeUpdateForm, self).__init__(*args, **kwargs)
+
     class Meta:
         model = ServiceType
-        fields = ['status','ticket_status','id_metaservice','codename',
-                  'description','requirements','price_type','link_agreement',
-                  'is_global','is_visible']
+        fields = ['status', 'ticket_status', 'id_metaservice', 'codename',
+                  'description', 'requirements', 'price_type', 'link_agreement',
+                  'is_global', 'is_visible']
         widgets = {
             'status': forms.TextInput(attrs={'readonly': True}),
             'ticket_status': forms.TextInput(attrs={'readonly': True}),
         }
-        
+
 
 PRICE_CHOICES = [
     ('one', 'text #1'),
     ('two', 'text #2'),
     ('three', 'text #3'),
 ]
+
+
 class ServiceTypeCreateForm(forms.ModelForm):
     codename = forms.CharField(label="Название услуги")
     requirements = forms.CharField(label="Требования")
@@ -86,11 +89,12 @@ class ServiceTypeCreateForm(forms.ModelForm):
 
     def __init__(self, *args, **kwargs):
         super(ServiceTypeCreateForm, self).__init__(*args, **kwargs)
+
     class Meta:
         model = ServiceType
-        fields = ['codename','requirements', 'price_type',
+        fields = ['codename', 'requirements', 'price_type',
                   'description',
-                  'is_global','is_visible',]
+                  'is_global', 'is_visible', ]
 
         widgets = {
 
@@ -104,9 +108,8 @@ class ServiceInformationUpdateForm(forms.ModelForm):
         # Добавляет стиль бутстрапа 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'})
-        
-    
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
+
     class Meta:
         model = Service
         fields = [
@@ -116,38 +119,37 @@ class ServiceInformationUpdateForm(forms.ModelForm):
         widgets = {
             # 'status': forms.TextInput(attrs={'readonly': True}),
             # 'ticket_status': forms.TextInput(attrs={'readonly': True}),
-            
-             'servicetype_id': forms.Select(attrs={'class': 'form-select'}),
-            #'repr_id': forms.Select(attrs={'class': 'form-select'}),
+
+            'servicetype_id': forms.Select(attrs={'class': 'form-select'}),
+            # 'repr_id': forms.Select(attrs={'class': 'form-select'}),
             # 'resource_id': forms.Select(attrs={'class': 'form-select'}),
         }
-        
+
 
 class ServiceInformationCreateForm(forms.ModelForm):
-    
+
     def __init__(self, *args, **kwargs):
         super(ServiceInformationCreateForm, 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'})
-
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
 
     class Meta:
         model = Service
         fields = "__all__"
-        exclude = ["id", 
-                   "is_global", 
-                   "is_visible", 
+        exclude = ["id",
+                   "is_global",
+                   "is_visible",
                    "ticket_status",
                    "id_metaservice",
                    "resource_id"]
 
         widgets = {
-            #'servicetype_id': forms.CharField(max_length=255)
+            # 'servicetype_id': forms.CharField(max_length=255)
             # 'legal_name': forms.TextInput(label = 'Название')
             # 'servicetype_id': forms.Select(attrs={'class': 'form-select'}),
-            #'repr_id': forms.Select(attrs={'class': 'form-select'}),
+            # 'repr_id': forms.Select(attrs={'class': 'form-select'}),
             # 'resource_id': forms.Select(attrs={'class': 'form-select'}),
             # 'ticket_status': forms.Select(attrs={'class': 'form-select'}),
         }
@@ -159,14 +161,14 @@ class PartnerInformationUpdateForm(forms.ModelForm):
         # Добавляет стиль бутстрапа 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'})
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
 
     class Meta:
         model = Company
         fields = "__all__"
         exclude = ["id", "ticket_status",
-                   "is_global", 
-                   "is_visible", 
+                   "is_global",
+                   "is_visible",
                    "id_metaservice",
                    "status"
                    ]
@@ -174,22 +176,22 @@ class PartnerInformationUpdateForm(forms.ModelForm):
             'description': forms.Select(attrs={'class': 'form-select'}),
             'repr_id': forms.Select(attrs={'class': 'form-select'}),
         }
-        
+
 
 class PartnerInformationCreateForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
-        super(PartnerInformationCreateForm, self).__init__(*args, **kwargs)       
+        super(PartnerInformationCreateForm, self).__init__(*args, **kwargs)
         for field in iter(self.fields):
             if 'class' not in self.fields[field].widget.attrs:
-                self.fields[field].widget.attrs.update({'class':'form-control'})
-   
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
+
     # legal_name = forms.Fi()
     class Meta:
         model = Company
         fields = "__all__"
         exclude = ["id", "ticket_status",
-                   "is_global", 
-                   "is_visible", 
+                   "is_global",
+                   "is_visible",
                    "id_metaservice",
                    "status"
                    ]
@@ -199,6 +201,5 @@ class PartnerInformationCreateForm(forms.ModelForm):
             'repr_id': forms.Select(attrs={'class': 'form-select'}),
         }
 
-
         #     username = forms.CharField(label="Номер телефона",
-        # widget=forms.TextInput(attrs={'class':'form-control'}))
+        # widget=forms.TextInput(attrs={'class':'form-control'}))

+ 1 - 1
sharix_admin/models.py

@@ -1 +1 @@
-from django.db import models
+from django.db import models

+ 11 - 6
sharix_admin/serializer.py

@@ -1,29 +1,34 @@
-from rest_framework import serializers
-#from rest_framework.exceptions import ValidationError
-#from django.contrib.auth.models import User
+# from rest_framework.exceptions import ValidationError
+# from django.contrib.auth.models import User
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import *
+from rest_framework import serializers
+
 
 class UserSerializer(serializers.ModelSerializer):
     full_name = serializers.ReadOnlyField()
     group_name = serializers.ReadOnlyField(source="groups.name")
+
     class Meta:
         model = get_user_model()
         exclude = ['password', 'id']
         read_only_fields = ['username', 'phone_number']
         extra_kwargs = {
             'first_name': {'write_only': True},
-            'last_name':{'write_only':True}
+            'last_name': {'write_only': True}
         }
+
     def validate(self, attrs):
         return super().validate(attrs)
 
+
 class GroupToUserSerializer(serializers.ModelSerializer):
     class Meta:
         model = GroupManager
         fields = "__all__"
-    
+
+
 class GroupSerializer(serializers.ModelSerializer):
     class Meta:
         model = Group
-        fields = ("id", "name")
+        fields = ("id", "name")

+ 8 - 12
sharix_admin/signals.py

@@ -1,16 +1,13 @@
 import os
-
-from django.contrib.auth.models import Group
-from django.dispatch import receiver
-from django.db.models.signals import post_migrate
+from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.contrib.auth.hashers import make_password
-from django.conf import settings
+from django.contrib.auth.models import Group
 from django.db import models
-
+from django.db.models.signals import post_migrate
+from django.dispatch import receiver
 from tickets.models import TicketList
 
-
 User = get_user_model()
 
 
@@ -37,7 +34,6 @@ def create_initial_groups(sender, **kwargs):
             print(f"Group {name} already exists.")
 
 
-
 @receiver(post_migrate)
 def create_test_users(sender, **kwargs):
     """
@@ -66,7 +62,7 @@ def create_test_users(sender, **kwargs):
         ]
 
         for test_user in test_users:
-            group_name = test_user[0]        
+            group_name = test_user[0]
             group = Group.objects.get(name=group_name)
 
             for i in range(1, test_user[1] + 1):
@@ -119,12 +115,12 @@ def create_initial_ticket_lists(sender, **kwargs):
             (3207, 'Ручное подтверждение заявок (ACCESS-REQUEST)', 'PARTNER-SUPERVISOR'),
             (3401, 'Входящие технические заявки (ST_REQUEST)', 'PARTNER-TECHSUPPORT'),
         ]
-        
+
         for pk, name, group_name in ticket_data:
             group = Group.objects.get(name=group_name)
             # Проверяем существование тикета с таким же name и group
             ticket_exists = TicketList.objects.filter(group=group, name=name).exists()
-            
+
             if not ticket_exists:
                 TicketList.objects.create(pk=pk, name=name, group=group)
 
@@ -138,4 +134,4 @@ try:
         if users_in_test_group:
             users_in_test_group.update(is_active=settings.DEBUG)
 except:
-    print("Test user validation is not available. Models have not been created yet")
+    print("Test user validation is not available. Models have not been created yet")

+ 129 - 81
sharix_admin/tables.py

@@ -1,61 +1,87 @@
 import django_tables2 as tables
-from django.contrib.auth import get_user_model
-
 from dbsynce.models import *
-from django.utils.html import format_html
 from dbsynce.models import *
+from django.contrib.auth import get_user_model
+from django.utils.html import format_html
 from django.utils.translation import gettext_lazy as _
 
+
 class TransactionsWalletTable(tables.Table):
     # id = tables.Column(order_by=True)
-    id = tables.Column(verbose_name='#', orderable=False,                                       attrs={"td":{"width":"5%"}})
-    wallet = tables.Column(verbose_name=_('Owner'), orderable=False,                            attrs={"td":{"width":"15%"}})
-    name_operation = tables.Column(verbose_name=_('Service'), attrs={'th':{'scope':'col'},          "td":{"width":"20%"}}) 
-    price = tables.Column(verbose_name=_('Points'), attrs={"class":"row",                           "td":{"width":"10%"}})
-    date_operation = tables.Column(verbose_name=_('Registration date'),                              attrs={"td":{"width":"30%"}})
-    is_carried_out = tables.BooleanColumn(verbose_name=_('Status'), orderable=False, yesno=_("Successful, not successful"), attrs={"td":{"width":"20%"}})
-    
+    id = tables.Column(verbose_name='#', orderable=False, attrs={"td": {"width": "5%"}})
+    wallet = tables.Column(verbose_name=_('Owner'), orderable=False, attrs={"td": {"width": "15%"}})
+    name_operation = tables.Column(verbose_name=_('Service'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    price = tables.Column(verbose_name=_('Points'), attrs={"class": "row", "td": {"width": "10%"}})
+    date_operation = tables.Column(verbose_name=_('Registration date'), attrs={"td": {"width": "30%"}})
+    is_carried_out = tables.BooleanColumn(verbose_name=_('Status'), orderable=False,
+                                          yesno=_("Successful, not successful"), attrs={"td": {"width": "20%"}})
+
     class Meta:
-        #model = TransactionsWallets
+        # model = TransactionsWallets
         attrs = {"class": "table table-striped"}
-        exclude = ("balance_before", 
-                   "amount", 
-                   "metaservice_id", 
+        exclude = (
+            "balance_before",
+                   "amount",
+                   "metaservice_id",
                    "transaction_type",
                    "doc_num",
-                   "service_id")
+                   "service_id"
+                   )
+
     def render_name_operation(self, value, record):
         return format_html("<a href='{}'>{}</a>", record.get_absolute_url(), value)
-        
+
+
 class PartnersTable(tables.Table):
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
-    legal_name = tables.Column(verbose_name=_('Legal entity'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    repr_id = tables.Column(accessor='repr_id.full_name', order_by=('repr_id.first_name', 'repr_id.last_name'), verbose_name=_('Responsible'), attrs={"td":{"width":"15%"}})
-   
-    status = tables.Column(verbose_name=_('Status'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
-    check = tables.BooleanColumn(verbose_name='', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
+    legal_name = tables.Column(verbose_name=_('Legal entity'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    repr_id = tables.Column(accessor='repr_id.full_name', order_by=('repr_id.first_name', 'repr_id.last_name'),
+                            verbose_name=_('Responsible'), attrs={"td": {"width": "15%"}})
+
+    status = tables.Column(verbose_name=_('Status'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    check = tables.BooleanColumn(verbose_name='', attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+
     # paginate_by = 10
     class Meta:
         model = Company
-        attrs = {"class": "table table-layout-fixed"}
-        exclude = ('inn','kpp','ogrn', 'bank_name', 
-                   'bik', 'ks', 'rs', 
-                   'address', 'requirements', 
-                   'id_metaservice', 'is_global', 'is_visible', 'ticket_status')
+        attrs = {
+            "class": "table table-layout-fixed"
+            }
+        exclude = (
+            'inn',
+              'kpp', 
+              'ogrn',
+                'bank_name',
+                   'bik', 
+                   'ks', 
+                   'rs',
+                   'address', 
+                   'requirements',
+                   'id_metaservice', 
+                   'is_global', 
+                   'is_visible',
+                     'ticket_status'
+                     )
 
     def render_check(self, value, record):
         if record.status == 'active':
-            return format_html('<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-partners-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-partners-id="{}">',
+                record.id)
         else:
-            return format_html('<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-partners-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-partners-id="{}">',
+                record.id)
+
 
 class ResourceTable(tables.Table):
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
+    # В user_id ссылка LinkColumn на страницу Аси "Информация о партнере" страница partner_information_form
+    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'),
+                            verbose_name=_('Responsible'), attrs={"td": {"width": "15%"}})
+    status = tables.Column(verbose_name=_('Status'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    check = tables.BooleanColumn(verbose_name='', attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
 
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
-    #В user_id ссылка LinkColumn на страницу Аси "Информация о партнере" страница partner_information_form
-    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'), verbose_name=_('Responsible'), attrs={"td":{"width":"15%"}})
-    status = tables.Column(verbose_name=_('Status'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
-    check = tables.BooleanColumn(verbose_name='', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
     # paginate_by = 10
     class Meta:
         model = Resource
@@ -71,39 +97,51 @@ class ResourceTable(tables.Table):
 
     def render_check(self, value, record):
         if record.status == 'active':
-            return format_html('<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-resource-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-resource-id="{}">',
+                record.id)
         else:
-            return format_html('<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-resource-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-resource-id="{}">',
+                record.id)
 
-class ProviderTable(tables.Table):
 
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
-    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'), verbose_name=_('Full Name'), attrs={"td":{"width":"15%"}})
+class ProviderTable(tables.Table):
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
+    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'),
+                            verbose_name=_('Full Name'), attrs={"td": {"width": "15%"}})
 
-    status = tables.Column(verbose_name=_('Status'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
-    check = tables.BooleanColumn(verbose_name='', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
+    status = tables.Column(verbose_name=_('Status'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    check = tables.BooleanColumn(verbose_name='', attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
     paginate_by = 10
+
     class Meta:
         model = Provider
         attrs = {"class": "table table-layout-fixed"}
-        exclude = ('type','company_id','id_metaservice', 'requirements', 
-                   'ticket_status', 'location_type', 'default_location', 
+        exclude = ('type', 'company_id', 'id_metaservice', 'requirements',
+                   'ticket_status', 'location_type', 'default_location',
                    'is_global', 'is_visible')
 
     def render_check(self, value, record):
         if record.status == 'active':
-            return format_html('<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-provider-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-provider-id="{}">',
+                record.id)
         else:
-            return format_html('<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-provider-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-provider-id="{}">',
+                record.id)
 
-class ServiceTariffTable(tables.Table):
-
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
-    servicetype_id = tables.LinkColumn('service_tariff/edit/', verbose_name=_('Name of the tariff'), text = lambda record: record.servicetype_id.caption,
-        args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    ticket_status = tables.Column(verbose_name=_('Name of the service scheme'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
-    check = tables.BooleanColumn(verbose_name=_('Activity'), orderable=False, attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
 
+class ServiceTariffTable(tables.Table):
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
+    servicetype_id = tables.LinkColumn('service_tariff/edit/', verbose_name=_('Name of the tariff'),
+                                       text=lambda record: record.servicetype_id.caption,
+                                       args=[tables.A('pk')], attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    ticket_status = tables.Column(verbose_name=_('Name of the service scheme'),
+                                  attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    check = tables.BooleanColumn(verbose_name=_('Activity'), orderable=False,
+                                 attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
 
     class Meta:
         model = Service
@@ -128,46 +166,52 @@ class ServiceTariffTable(tables.Table):
         else:
             return format_html('<input class="form-check-input status-toggle" disabled  type="checkbox"')
 
+
 class ServiceTypeTable(tables.Table):
+    id = tables.Column(attrs={"td": {"width": "50px"}})
+    codename = tables.LinkColumn('service_type/edit/', verbose_name='Услуга', orderable=False,
+                                 text=lambda record: record.codename,
+                                 args=[tables.A('pk')],
+                                 attrs={"a": {"style": "pointer-events: none;"}, 'th': {'scope': 'col'},
+                                        "td": {"class": "name_col"}})
+    description = tables.LinkColumn('service_type/edit/', orderable=False, verbose_name='Описание',
+                                    text=lambda record: record.description,
+                                    args=[tables.A('pk')],
+                                    attrs={"a": {"style": "pointer-events: none;"}, 'th': {'scope': 'col'},
+                                           "td": {"class": "description_col"}})
+    edit = tables.LinkColumn('service_type/edit/', verbose_name='', orderable=False, text="E",
+                             args=[tables.A('pk')], attrs={'th': {'scope': 'col'}, "td": {"class": "edit_col"}})
+    deletee = tables.LinkColumn('service_type/delete/', verbose_name='', orderable=False, text="D",
+                                args=[tables.A('pk')], attrs={'th': {'scope': 'col'}, "td": {"class": "delete_col"}})
 
-    id = tables.Column( attrs={"td":{"width":"50px"}})
-    codename = tables.LinkColumn('service_type/edit/', verbose_name='Услуга', orderable=False, text = lambda record: record.codename,
-        args=[tables.A('pk')], attrs= {"a": {"style": "pointer-events: none;"}, 'th':{'scope':'col'}, "td":{"class":"name_col"}})
-    description = tables.LinkColumn('service_type/edit/', orderable=False, verbose_name='Описание', text = lambda record: record.description,
-        args=[tables.A('pk')], attrs= {"a": {"style": "pointer-events: none;"}, 'th':{'scope':'col'}, "td":{"class":"description_col"}})
-    edit = tables.LinkColumn('service_type/edit/', verbose_name='', orderable=False, text = "E",
-        args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"edit_col"}})
-    deletee = tables.LinkColumn('service_type/delete/', verbose_name='', orderable=False, text = "D",
-        args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
-    
-    
     class Meta:
         model = ServiceType
         attrs = {"class": "table table-layout-fixed text-start"}
         exclude = ('requirements',
-                   'price_type','status','ticket_status', 
+                   'price_type', 'status', 'ticket_status',
                    'id_metaservice', 'link_agreement',
                    'is_global', 'is_visible', 'caption')
 
     # def render_delete(self, value, record):
     #     return format_html('<a href="/service_type/delete" class="btn btn-outline-danger">_(Delete)</a>')
-        
+
     # def render_name_operation(self, value, record):
     #     return format_html("<a href='{}'>{}</a>", record.get_absolute_url(), value)
-   
+
+
 class ServiceTable(tables.Table):
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
+    servicetype_id = tables.Column(verbose_name=_('Description of the service'), accessor='servicetype_id.caption',
+                                   attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
 
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
-    servicetype_id = tables.Column(verbose_name=_('Description of the service'), accessor = 'servicetype_id.caption',
-        attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    
     # description = tables.Column(verbose_name='Название тарифа', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
     # description = tables.Column(verbose_name='Описание строки тарифов', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
     # price_type = tables.Column(verbose_name='Тип тарифа', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    
-    price_km = tables.Column(verbose_name=_('Cost km.'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    price_min = tables.Column(verbose_name=_('Cost min.'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    price_amount = tables.Column(verbose_name=_('Cost of service'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
+
+    price_km = tables.Column(verbose_name=_('Cost km.'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    price_min = tables.Column(verbose_name=_('Cost min.'), attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
+    price_amount = tables.Column(verbose_name=_('Cost of service'),
+                                 attrs={'th': {'scope': 'col'}, "td": {"width": "20%"}})
 
     class Meta:
         model = Service
@@ -185,17 +229,21 @@ class ServiceTable(tables.Table):
 
     def render_check(self, value, record):
         if record.status == 'active':
-            return format_html('<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-service-id="{}">', record.id)
+            return format_html(
+                '<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-service-id="{}">',
+                record.id)
         else:
-            return format_html('<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-service-id="{}">', record.id)     
+            return format_html(
+                '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-service-id="{}">',
+                record.id)
 
-class UserInfoTable(tables.Table):
 
-    id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
+class UserInfoTable(tables.Table):
+    id = tables.Column(verbose_name=_('ID'), attrs={"td": {"width": "5%"}})
 
     class Meta:
         model = get_user_model()
         attrs = {"class": "table table-layout-fixed"}
-        exclude = ('password', 'phone_number', 
-                   'last_login','is_staff', 'is_superuser',
-                   'date_joined')
+        exclude = ('password', 'phone_number',
+                   'last_login', 'is_staff', 'is_superuser',
+                   'date_joined')

+ 23 - 20
sharix_admin/urls.py

@@ -1,13 +1,12 @@
-from django.contrib.auth.views import LogoutView
 from django.contrib.auth.decorators import login_required
+from django.contrib.auth.views import LogoutView
 from django.urls import path, include, re_path
 from django_spaghetti.views import Plate
-from schema_graph.views import Schema
 from rest_framework import routers
+from schema_graph.views import Schema
 
-from sharix_admin.views import *
 from sharix_admin.apiviews import *
-
+from sharix_admin.views import *
 
 router = routers.SimpleRouter()
 router.register(r'sharix-users', SharixUserMVS)
@@ -24,51 +23,55 @@ urlpatterns = [
 
     # Главная
     path('', login_required(MainView.as_view()), name='main'),
-    
+
     # --- Ниже страницы, требующие ревью ---
 
     path('transactions/', login_required(TransactionsView.as_view()), name='transactions'),
     path('payment/', login_required(PaymentView.as_view()), name='payment'),
-    
+
     # Страница "Сотрудничество" (запрос на подключение к сервису)
     path('cooperate/', login_required(CooperateView.as_view()), name='cooperate'),
-    
+
     # Страница "О партнере"
     path('partner/', login_required(PartnerDetailView.as_view()), name='partner_detail'),
     path('partner/edit/', login_required(PartnerEditView.as_view()), name='partner_edit'),
-    path('partner/doc/<str:doc_code>/upload', login_required(PartnerDocUploadView.as_view()), name='partner_doc_upload'),
+    path('partner/doc/<str:doc_code>/upload', login_required(PartnerDocUploadView.as_view()),
+         name='partner_doc_upload'),
     path('partner/doc/<str:doc_code>', login_required(PartnerDocView.as_view()), name='partner_doc'),
 
     path('transactions/<int:trans_id>/', trans_id, name='transid'),
     path('balance/', balance, name='balance'),
-   
+
     path('partners/', login_required(PartnersListView.as_view()), name='partners'),
     path('partners/change_status/', change_partners_status, name='partners/change_status'),
 
     path('resource/', login_required(ResourceListView.as_view()), name='resource'),
     path('resource/change_status/', change_resource_status, name='resource/change_status'),
-    
+
     path('provider/', login_required(ProviderListView.as_view()), name='provider'),
     path('provider/change_status/', change_provider_status, name='provider/change_status'),
 
     path('service_tariff/', login_required(ServiceTariffListView.as_view()), name='service_tariff'),
     path('service_tariff/add/', login_required(ServiceTariffCreate.as_view()), name='service_tariff/add/'),
-    path('service_tariff/edit/<int:pk>', login_required(ServiceTariffUpdateView.as_view()), name='service_tariff/edit/'),
+    path('service_tariff/edit/<int:pk>', login_required(ServiceTariffUpdateView.as_view()),
+         name='service_tariff/edit/'),
 
     path('service_type/', login_required(ServiceTypeListView.as_view()), name='service_type'),
     path('service_type/edit/<int:pk>', login_required(ServiceTypeUpdateView.as_view()), name='service_type/edit/'),
     path('service_type/add/', login_required(ServiceTypeCreate.as_view()), name='service_type/add/'),
     path('service_type/delete/<int:pk>', login_required(ServiceTypeDelete.as_view()), name='service_type/delete/'),
 
-    path('service_information/add/', login_required(ServiceInformationCreate.as_view()), name='service_information-add'),
-    path('service_information/edit/<int:pk>', login_required(ServiceInformationUpdateView.as_view()), name='service_information/edit/'),
-    
+    path('service_information/add/', login_required(ServiceInformationCreate.as_view()),
+         name='service_information-add'),
+    path('service_information/edit/<int:pk>', login_required(ServiceInformationUpdateView.as_view()),
+         name='service_information/edit/'),
+
     path('service/', ServiceListView.as_view(), name='service'),
     path('service/change_status/', change_service_status, name='service/change_status'),
 
-    #path('partner_information/', login_required(PartnerInfoView.as_view()), name='partner_information/'),    
-    #path('partner_information/add/', login_required(PartnerInformationCreate.as_view()), name='partner_information/add/'),
-    #path('partner_information/edit/<int:pk>', login_required(PartnerInformationUpdateView.as_view()), name='partner_information/edit/'),
+    # path('partner_information/', login_required(PartnerInfoView.as_view()), name='partner_information/'),
+    # path('partner_information/add/', login_required(PartnerInformationCreate.as_view()), name='partner_information/add/'),
+    # path('partner_information/edit/<int:pk>', login_required(PartnerInformationUpdateView.as_view()), name='partner_information/edit/'),
 
     path('user_information', login_required(UserListView.as_view()), name='user_information'),
 
@@ -78,10 +81,10 @@ urlpatterns = [
 
     path('senderphone/', PhoneSender.as_view()),
 
-    #schemas
+    # schemas
     path('schemav1/', login_required(Schema.as_view()), name='schemav1'),
-    path('schemav2/', login_required(Plate.as_view()),  name='schemav2'),
+    path('schemav2/', login_required(Plate.as_view()), name='schemav2'),
     path('schemav3/', schema_v3, name='schema'),
-    
+
     re_path(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
 ]

+ 1 - 1
sharix_admin/utils/__init__.py

@@ -1,2 +1,2 @@
 from .group import *
-from .ticket_gen import *
+from .ticket_gen import *

+ 1 - 1
sharix_admin/utils/group.py

@@ -9,4 +9,4 @@ def group_required(*group_names):
                 return True
         return False
 
-    return user_passes_test(in_groups)
+    return user_passes_test(in_groups)

+ 1 - 1
sharix_admin/utils/other.py

@@ -1,7 +1,7 @@
 from django.conf import settings
+from django.core.mail import send_mail
 from django.template.loader import render_to_string
 from django.utils.html import strip_tags
-from django.core.mail import send_mail
 
 
 def send_notify_mail(subject: str, message_template: str, recipient_list: list, context: dict):

+ 6 - 7
sharix_admin/utils/ticket_gen.py

@@ -1,8 +1,7 @@
 from datetime import datetime, timedelta
-
-from tickets.models import Ticket, TicketList
-from dbsynce.models import DocumentFile
 from dbsynce.lib.core import get_admin_url
+from dbsynce.models import DocumentFile
+from tickets.models import Ticket, TicketList
 
 
 def create_ticket_partner_activation(user, сompany):
@@ -19,7 +18,7 @@ def create_ticket_partner_activation(user, сompany):
         ticket_type=4,
         due_date=datetime.now().date() + timedelta(days=30),
         created_by=user,
-        
+
         note=f"""
             Пользователь {user} #{user.pk} отправил заявку на становление партнером сервиса:\n
             - Имя: {сompany.legal_name}\n
@@ -43,11 +42,11 @@ def create_ticket_partner_docs_verification(user, company, doc):
     doc_name = doc.get_doc_type_display()
     doc_files = DocumentFile.objects.filter(document=doc)
 
-    note=f"Пользователь {user} #{user.pk} добавил новые файлы документа <a href='{get_admin_url(doc)}'>{doc_name}</a> партнера <a href='{get_admin_url(company)}'>{company.legal_name}</a> требующие проверки:<ul>"
+    note = f"Пользователь {user} #{user.pk} добавил новые файлы документа <a href='{get_admin_url(doc)}'>{doc_name}</a> партнера <a href='{get_admin_url(company)}'>{company.legal_name}</a> требующие проверки:<ul>"
     for file in doc_files:
         note += f"<li><a href='{file.file.url}' target='_blank'>{file}</a></li>"
     note += "</ul>"
-    
+
     return Ticket.objects.create(
         title=f"Проверка документа '{doc_name}' партнера '{company.legal_name}'",
         ticket_list=TicketList.objects.get(pk=2103),
@@ -55,4 +54,4 @@ def create_ticket_partner_docs_verification(user, company, doc):
         due_date=datetime.now().date() + timedelta(days=30),
         created_by=user,
         note=note
-    )    
+    )

+ 12 - 13
sharix_admin/views/__init__.py

@@ -1,20 +1,19 @@
 from .auth import *
+from .balance import *
+from .cooperate import *
+from .get_userid import *
 from .main import *
-
-from .transactions import *
-from .service import *
 from .partner import *
-from .service_type import *
-from .service_tariff import *
-from .service_info import *
-from .resource import *
-from .partners import *
 from .partner_info import *
-from .provider import *
-from .cooperate import *
+from .partners import *
 from .payment import *
-from .balance import *
-from .trans_id import *
+from .provider import *
+from .resource import *
 from .schema import *
+from .service import *
+from .service_info import *
+from .service_tariff import *
+from .service_type import *
+from .trans_id import *
+from .transactions import *
 from .user_info import *
-from .get_userid import *

+ 3 - 3
sharix_admin/views/auth.py

@@ -1,7 +1,7 @@
-from django.views.generic.edit import CreateView
-from django.views.generic import TemplateView
 from django.contrib.auth.views import LoginView
 from django.urls import reverse_lazy
+from django.views.generic import TemplateView
+from django.views.generic.edit import CreateView
 
 from sharix_admin.forms import ShariXSignUpForm, ShariXLoginForm
 
@@ -29,4 +29,4 @@ class ShariXResetPasswordView(TemplateView):
     """
     Представление для восстановления пароля.
     """
-    template_name = "sharix_admin/auth/reset_password.html"
+    template_name = "sharix_admin/auth/reset_password.html"

+ 11 - 11
sharix_admin/views/balance.py

@@ -1,25 +1,25 @@
-from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
 from django.utils.translation import gettext as _
 
+
 @login_required
 def balance(request):
     context = get_context(request, {
-        'title':_('Top up your balance')
-        })
+        'title': _('Top up your balance')
+    })
     if request.method == 'POST':
         if float(request.POST['price']) > 0:
             context = get_context(request, {
-                'title':_('Top up your balance'),
-                'msg':_('The payment was successful ;)')
-                })
+                'title': _('Top up your balance'),
+                'msg': _('The payment was successful ;)')
+            })
             return render(request, "sharix_admin/balance_success.html", context)
         else:
             context = get_context(request, {
-                'title':_('Top up your balance'),
-                'msg':_('Payment failed ;(')
-                })
+                'title': _('Top up your balance'),
+                'msg': _('Payment failed ;(')
+            })
             return render(request, "sharix_admin/balance_success.html", context)
 
-    
-    return render(request, "sharix_admin/balance.html", context)
+    return render(request, "sharix_admin/balance.html", context)

+ 4 - 3
sharix_admin/views/base.py

@@ -1,5 +1,5 @@
-from django.views import View
 from django.contrib.auth.mixins import UserPassesTestMixin
+from django.views import View
 
 
 class BaseView(UserPassesTestMixin, View):
@@ -9,6 +9,7 @@ class BaseView(UserPassesTestMixin, View):
     Предоставляет общие методы и функционал, который
     может быть использован в других представлениях админ-панели.
     """
+
     def dispatch(self, request, *args, **kwargs):
         self.user_groups = self.request.user.groups.values_list('name', flat=True)
         return super().dispatch(request, *args, **kwargs)
@@ -24,5 +25,5 @@ class BaseView(UserPassesTestMixin, View):
             'current_page': self.page_name,
             'user_groups': self.user_groups
         })
-        
-        return context
+
+        return context

+ 14 - 17
sharix_admin/views/cooperate.py

@@ -1,17 +1,14 @@
 from datetime import datetime, timedelta
-
-from django.views.generic.edit import FormView
-from django.urls import reverse_lazy
+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 tickets.models import Ticket, TicketList
 
 from sharix_admin.forms import CompanyForm
 from sharix_admin.utils import create_ticket_partner_activation
-from dbsynce.models import Documents
-from tickets.models import Ticket, TicketList
-
-from dbsynce.lib.core import parse_requirements, get_admin_url
-
 from .base import BaseView
 
 
@@ -30,25 +27,25 @@ class CooperateView(BaseView, FormView):
         with transaction.atomic():
             # Сохраняем форму, чтобы получить объект компании
             instance = form.save(commit=False)
-        
+
             # Присваиваем полю repr_id идентификатор текущего пользователя
             instance.repr_id = self.request.user
 
             # Создаем новую запись в БД, чтобы иметь доступ к ID
-            instance.save() 
+            instance.save()
 
             # Создание тикета на активацию партнера.
             # Создаем объект тикета и присваиваем его полю ticket_status
             instance.ticket_status = create_ticket_partner_activation(self.request.user, instance)
-            
+
             # Создание тикета на утверждение прав пользователя
             Ticket.objects.create(
                 title=f"Запрос прав на становление Партнером '{instance.legal_name}'",
-                ticket_list=TicketList.objects.get(pk=2102),# METASERVICE-ADMIN: Права в сервисе (ACCESS_REQUEST)
-                ticket_type=3, # ACCESS_REQUEST
+                ticket_list=TicketList.objects.get(pk=2102),  # METASERVICE-ADMIN: Права в сервисе (ACCESS_REQUEST)
+                ticket_type=3,  # ACCESS_REQUEST
                 due_date=datetime.now().date() + timedelta(days=30),
                 created_by=self.request.user,
-                
+
                 # FIXME: Возможно нужно автоматически создавать содержимое поля json
                 note=f"""
                     Пользователь {self.request.user} #{self.request.user.pk} отправил заявку на права партнера сервиса.\n
@@ -74,7 +71,7 @@ class CooperateView(BaseView, FormView):
             ])
 
         # Отправляем пользователю уведомление на страницу о успехе операции
-        messages.success(self.request, 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!')
+        messages.success(self.request,
+                         'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!')
 
-        return super().form_valid(form) # Возвращаем успешный ответ
-    
+        return super().form_valid(form)  # Возвращаем успешный ответ

+ 2 - 1
sharix_admin/views/get_userid.py

@@ -1,8 +1,9 @@
-from django.http import JsonResponse
 from django.contrib.auth import get_user_model
 from django.contrib.auth.decorators import login_required
+from django.http import JsonResponse
 from django.views.decorators.csrf import csrf_exempt
 
+
 @csrf_exempt
 def get_user_by_phone_number(request, phone_number):
     if request.method == 'GET':

+ 2 - 2
sharix_admin/views/main.py

@@ -1,5 +1,5 @@
-from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
+from django.views.generic import TemplateView
 
 from .base import BaseView
 
@@ -7,4 +7,4 @@ from .base import BaseView
 class MainView(BaseView, TemplateView):
     page_title = 'Добро пожаловать!'
     page_name = 'main'
-    template_name = 'sharix_admin/main.html'
+    template_name = 'sharix_admin/main.html'

+ 16 - 15
sharix_admin/views/partner.py

@@ -1,15 +1,14 @@
+from dbsynce.models import Company, Documents, DocumentFile
+from django.contrib import messages
 from django.core.files.storage import default_storage
+from django.db import transaction
+from django.shortcuts import get_object_or_404, redirect
+from django.urls import reverse_lazy
 from django.views.generic import DetailView
 from django.views.generic.edit import FormView
-from django.urls import reverse_lazy
-from django.shortcuts import get_object_or_404, redirect
-from django.contrib import messages
-from django.db import transaction
 
-from dbsynce.models import Company, Documents, DocumentFile
 from sharix_admin.forms import CompanyForm, DocumentUploadForm
 from sharix_admin.utils import *
-
 from .base import BaseView
 
 
@@ -26,7 +25,7 @@ class PartnerDetailView(PartnerBaseView, DetailView):
     template_name = 'sharix_admin/partner.html'
     context_object_name = 'company'
     page_title = 'О партнере'
-   
+
     def get_object(self, queryset=None):
         return get_object_or_404(Company, repr_id=self.request.user)
 
@@ -38,7 +37,7 @@ class PartnerDetailView(PartnerBaseView, DetailView):
             company_id=self.object
         ).prefetch_related('files').order_by('doc_type')
 
-        context.update({ "docs": docs }) 
+        context.update({"docs": docs})
 
         return context
 
@@ -114,14 +113,16 @@ class PartnerDocUploadView(PartnerBaseView, FormView):
             # Создание нового тикета и архивация старого
             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.expire_date = self.request.POST.get('doc_expire_date') if self.request.POST[
+                'doc_expire_date'] else None
             self.doc.ticket_status = create_ticket_partner_docs_verification(self.request.user, self.company, self.doc)
-            
+
             self.doc.save()
 
         # Отправляем пользователю уведомление на страницу об успехе операции
-        messages.success(self.request, f'Файлы документа "{self.doc_name}" успешно загружены и теперь проходят проверку!')
+        messages.success(self.request,
+                         f'Файлы документа "{self.doc_name}" успешно загружены и теперь проходят проверку!')
         return super().form_valid(form)
 
 
@@ -132,7 +133,7 @@ class PartnerDocView(PartnerBaseView, DetailView):
 
     def dispatch(self, request, *args, **kwargs):
         self.company = get_object_or_404(Company, repr_id=self.request.user)
-        
+
         self.doc = Documents.objects.filter(
             user_id=self.request.user,
             company_id=self.company,
@@ -153,5 +154,5 @@ class PartnerDocView(PartnerBaseView, DetailView):
     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
+        context.update({"doc_files": doc_files})
+        return context

+ 29 - 24
sharix_admin/views/partner_info.py

@@ -1,15 +1,16 @@
-from django.shortcuts import render
-from sharix_admin.forms import PartnerInformationCreateForm, PartnerInformationUpdateForm
-from sharix_admin.utils import group_required
 from dbsynce.models import Company
 from django.contrib.auth.mixins import UserPassesTestMixin
-from django.views.generic.edit import UpdateView, CreateView
+from django.shortcuts import render
 from django.urls import reverse
 from django.utils.translation import gettext as _
-
-from core.utils.AuthAPI import AuthAPI
+from django.views.generic.edit import UpdateView, CreateView
 from tickets.models import Ticket
+
 from core.settings import API_URL
+from core.utils.AuthAPI import AuthAPI
+from sharix_admin.forms import PartnerInformationCreateForm, PartnerInformationUpdateForm
+from sharix_admin.utils import group_required
+
 api = AuthAPI("79999999999", "Pa$$w0rd1")
 import requests
 from django.urls import reverse_lazy
@@ -18,6 +19,7 @@ from django.contrib.auth.hashers import check_password
 import xmpp
 from xmpp import cli
 
+
 class PartnerInformationCreate(UserPassesTestMixin, CreateView):
     model = Company
     form_class = PartnerInformationCreateForm
@@ -38,7 +40,8 @@ class PartnerInformationCreate(UserPassesTestMixin, CreateView):
         form.instance.ticket_status = Ticket.objects.get(pk=int(jso['id']))
         print(form.cleaned_data)
         responce = super().form_valid(form)
-        cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c", "open_strequest_new@ej.sharix-app.org", str(jso))
+        cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c",
+                         "open_strequest_new@ej.sharix-app.org", str(jso))
         return responce
 
     def get_context_data(self, **kwargs):
@@ -48,51 +51,53 @@ class PartnerInformationCreate(UserPassesTestMixin, CreateView):
             'object': self.object,
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('partners')
-    
+
     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
-    
+
+
 class PartnerInformationUpdateView(UserPassesTestMixin, UpdateView):
     model = Company
     form_class = PartnerInformationUpdateForm
     template_name = "sharix_admin/partner_information_form.html"
 
     def get_context_data(self, **kwargs):
-        context = super().get_context_data(**kwargs)       
+        context = super().get_context_data(**kwargs)
         context.update(get_context(self.request, {
             'title': _('Partner Information'),
             'object': self.object,
         }))
         return context
-    
+
     def form_valid(self, form):
         # Получаем текущий объект Company
         self.object = form.save()
 
         # Проверяем, изменились ли поля inn, ogrn, kpp, ответственный, название
         if (self.object.inn != form.initial['inn'] or
-            self.object.ogrn != form.initial['ogrn'] or
-            self.object.kpp != form.initial['kpp'] or
-            self.object.repr_id != form.initial['repr_id'] or
-            self.object.legal_name != form.initial['legal_name']):
+                self.object.ogrn != form.initial['ogrn'] or
+                self.object.kpp != form.initial['kpp'] or
+                self.object.repr_id != form.initial['repr_id'] or
+                self.object.legal_name != form.initial['legal_name']):
             new_ticket = {
-            "ticket_list": 1,
-            "created_by": self.request.user.pk,
-            "type": 1,
-            "title": "service_update",
-            "note": str(form.data),
+                "ticket_list": 1,
+                "created_by": self.request.user.pk,
+                "type": 1,
+                "title": "service_update",
+                "note": str(form.data),
             }
             resp = requests.post(f"{API_URL}/tickets/api/tickets/", data=new_ticket, headers=api.headers)
             jso = resp.json()
             form.instance.ticket_status = Ticket.objects.get(pk=int(jso['id']))
             print(form.cleaned_data)
-            cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c", "open_strequest_new@ej.sharix-app.org", str(jso))
+            cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c",
+                             "open_strequest_new@ej.sharix-app.org", str(jso))
             self.object.status = "deactivate"
             responce = super().form_valid(form)
             return responce
@@ -101,9 +106,9 @@ class PartnerInformationUpdateView(UserPassesTestMixin, UpdateView):
 
     def get_success_url(self):
         return reverse('test-page')
-    
+
     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 False

+ 6 - 6
sharix_admin/views/partners.py

@@ -1,11 +1,11 @@
-from django_tables2 import SingleTableView
-from sharix_admin.utils import group_required
-from sharix_admin.tables import PartnersTable
-from django.contrib.auth.decorators import login_required
 from dbsynce.models import Company
+from django.contrib.auth.decorators import login_required
 from django.http import JsonResponse
 from django.utils.translation import gettext as _
+from django_tables2 import SingleTableView
 
+from sharix_admin.tables import PartnersTable
+from sharix_admin.utils import group_required
 from .base import BaseView
 
 
@@ -22,7 +22,7 @@ class PartnersListView(BaseView, SingleTableView):
             'object_list': context['object_list'],
         })
         return context
-    
+
     def test_func(self):
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
@@ -41,4 +41,4 @@ def change_partners_status(request):
         partners.save()
         return JsonResponse({'status': 'success'})
     else:
-        return JsonResponse({'status': 'error'})
+        return JsonResponse({'status': 'error'})

+ 1 - 1
sharix_admin/views/payment.py

@@ -1,5 +1,5 @@
-from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
+from django.views.generic import TemplateView
 
 from .base import BaseView
 

+ 10 - 8
sharix_admin/views/provider.py

@@ -1,11 +1,13 @@
-from django_tables2 import SingleTableView
-from sharix_admin.utils import group_required
-from sharix_admin.tables import ProviderTable
 from dbsynce.models import Provider
 from django.contrib.auth.decorators import login_required
-from django.http import JsonResponse
 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 sharix_admin.tables import ProviderTable
+from sharix_admin.utils import group_required
+
 
 class ProviderListView(UserPassesTestMixin, SingleTableView):
     table_class = ProviderTable
@@ -19,24 +21,24 @@ class ProviderListView(UserPassesTestMixin, SingleTableView):
             'object_list': context['object_list'],
         })
         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
 
-    
+
 @login_required
 @group_required('PARTNER-ADMIN')
 def change_provider_status(request):
     if request.method == 'POST':
         provider_id = request.POST.get('provider_id')
         new_status = request.POST.get('new_status')
-        
+
         provider = Provider.objects.get(pk=provider_id)
         provider.status = new_status
         provider.save()
         return JsonResponse({'status': 'success'})
     else:
-        return JsonResponse({'status': 'error'})
+        return JsonResponse({'status': 'error'})

+ 11 - 8
sharix_admin/views/resource.py

@@ -1,11 +1,13 @@
-from django_tables2 import SingleTableView
-from django.contrib.auth.mixins import UserPassesTestMixin
-from sharix_admin.utils import group_required
-from sharix_admin.tables import ResourceTable
-from django.contrib.auth.decorators import login_required
 from dbsynce.models import Resource
+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 sharix_admin.tables import ResourceTable
+from sharix_admin.utils import group_required
+
 
 class ResourceListView(UserPassesTestMixin, SingleTableView):
     table_class = ResourceTable
@@ -19,23 +21,24 @@ class ResourceListView(UserPassesTestMixin, SingleTableView):
             'object_list': context['object_list'],
         })
         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
 
+
 @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'})
+        return JsonResponse({'status': 'error'})

+ 4 - 3
sharix_admin/views/schema.py

@@ -1,7 +1,8 @@
-from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
+
 
-#Shema views
+# Shema views
 @login_required
 def schema_v3(request):
-    return render(request, "sharix_admin/schema.html")
+    return render(request, "sharix_admin/schema.html")

+ 9 - 6
sharix_admin/views/service.py

@@ -1,10 +1,12 @@
-from django_tables2 import SingleTableView
-from sharix_admin.utils import group_required
-from sharix_admin.tables import ServiceTable
 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
+
 
 class ServiceListView(UserPassesTestMixin, SingleTableView):
     table_class = ServiceTable
@@ -18,20 +20,21 @@ class ServiceListView(UserPassesTestMixin, SingleTableView):
             'object_list': context['object_list']
         })
         return context
-    
+
     def test_func(self) -> bool or None:
         group_names = ('PROVIDER')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True
         return False
 
+
 @login_required
 @group_required('PROVIDER')
 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()
+        service.save()

+ 13 - 13
sharix_admin/views/service_info.py

@@ -1,13 +1,14 @@
-from sharix_admin.forms import ServiceInformationCreateForm, ServiceInformationUpdateForm
-from django.contrib.auth.mixins import UserPassesTestMixin
-from django.views.generic.edit import CreateView, UpdateView
 from dbsynce.models import Service
+from django.contrib.auth.mixins import UserPassesTestMixin
 from django.urls import reverse
 from django.utils.translation import gettext as _
-
-from core.utils.AuthAPI import AuthAPI
+from django.views.generic.edit import CreateView, UpdateView
 from tickets.models import Ticket
+
 from core.settings import API_URL
+from core.utils.AuthAPI import AuthAPI
+from sharix_admin.forms import ServiceInformationCreateForm, ServiceInformationUpdateForm
+
 api = AuthAPI("89855703300", "12345")
 import requests
 from django.urls import reverse_lazy
@@ -35,10 +36,10 @@ class ServiceInformationCreate(UserPassesTestMixin, CreateView):
         form.instance.ticket_status = Ticket.objects.get(pk=int(jso['id']))
         print(form.cleaned_data)
         responce = super().form_valid(form)
-        cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c", "open_strequest_new@ej.sharix-app.org", str(jso))
+        cli.send_message("open_tickets_backend@ej.sharix-app.org", "eb177b1c9f99a7a13798928318d7a72c",
+                         "open_strequest_new@ej.sharix-app.org", str(jso))
         return responce
 
-
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
@@ -47,11 +48,10 @@ class ServiceInformationCreate(UserPassesTestMixin, CreateView):
             'current_page': 'service_info'
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('service_tariff')
-    
-    
+
     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:
@@ -72,12 +72,12 @@ class ServiceInformationUpdateView(UserPassesTestMixin, UpdateView):
             'current_page': 'service_info'
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('test-page')
-    
+
     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
+        return False

+ 13 - 11
sharix_admin/views/service_tariff.py

@@ -1,11 +1,13 @@
-from django_tables2 import SingleTableView
-from django.contrib.auth.mixins import UserPassesTestMixin
-from django.views.generic.edit import UpdateView, CreateView
-from sharix_admin.tables import ServiceTariffTable
-from sharix_admin.forms import ServiceTariffCreateForm, ServiceTariffUpdateForm
 from dbsynce.models import Service
+from django.contrib.auth.mixins import UserPassesTestMixin
 from django.urls import reverse
 from django.utils.translation import gettext as _
+from django.views.generic.edit import UpdateView, CreateView
+from django_tables2 import SingleTableView
+
+from sharix_admin.forms import ServiceTariffCreateForm, ServiceTariffUpdateForm
+from sharix_admin.tables import ServiceTariffTable
+
 
 class ServiceTariffCreate(UserPassesTestMixin, CreateView):
     model = Service
@@ -19,16 +21,17 @@ class ServiceTariffCreate(UserPassesTestMixin, CreateView):
             'object': self.object,
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('service_tariff')
-    
+
     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
 
+
 class ServiceTariffListView(UserPassesTestMixin, SingleTableView):
     table_class = ServiceTariffTable
     queryset = Service.objects.all()
@@ -41,7 +44,7 @@ class ServiceTariffListView(UserPassesTestMixin, SingleTableView):
             'object_list': context['object_list'],
         }))
         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:
@@ -61,13 +64,12 @@ class ServiceTariffUpdateView(UserPassesTestMixin, UpdateView):
             'object': self.object,
         }))
         return context
-    
+
     def get_success_url(self):
         return reverse('service_tariff')
-    
+
     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
-

+ 14 - 16
sharix_admin/views/service_type.py

@@ -1,14 +1,14 @@
-from django_tables2 import SingleTableView
-from django.views.generic.edit import UpdateView, CreateView, DeleteView
-from sharix_admin.tables import ServiceTypeTable
-from sharix_admin.forms import ServiceTypeCreateForm, ServiceTypeUpdateForm
 from dbsynce.models import ServiceType
 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 ServiceTypeCreateForm, ServiceTypeUpdateForm
+from sharix_admin.tables import ServiceTypeTable
 from .base import BaseView
 
-    
+
 class ServiceTypeCreate(BaseView, CreateView):
     page_title = _('Услуги сервиса')
     page_name = 'service_type'
@@ -22,16 +22,16 @@ class ServiceTypeCreate(BaseView, CreateView):
             'object': self.object,
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('service_type')
-    
+
     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 ServiceTypeListView(BaseView, SingleTableView):
     page_title = _('Услуги сервиса')
@@ -46,7 +46,7 @@ class ServiceTypeListView(BaseView, SingleTableView):
             '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)
@@ -71,17 +71,16 @@ class ServiceTypeUpdateView(BaseView, UpdateView):
             "current_page": "service_type"
         })
         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 reverse('service_type')
-    
+
 
 class ServiceTypeDelete(BaseView, DeleteView):
     model = ServiceType
@@ -95,13 +94,12 @@ class ServiceTypeDelete(BaseView, DeleteView):
             "current_page": "service_type"
         })
         return context
-    
+
     def get_success_url(self):
         return reverse('service_type')
-    
+
     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
-    

+ 3 - 3
sharix_admin/views/trans_id.py

@@ -1,11 +1,11 @@
-from django.shortcuts import render
 from django.contrib.auth.decorators import login_required
+from django.shortcuts import render
 from django.utils.translation import gettext as _
 
 
 @login_required
 def trans_id(request, trans_id):
     context = {
-        'title':_('Service')
+        'title': _('Service')
     }
-    return render(request, 'sharix_admin/trans_carried.html', context)
+    return render(request, 'sharix_admin/trans_carried.html', context)

+ 2 - 2
sharix_admin/views/transactions.py

@@ -1,5 +1,5 @@
-from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
+from django.views.generic import TemplateView
 
 from .base import BaseView
 
@@ -7,4 +7,4 @@ from .base import BaseView
 class TransactionsView(BaseView, TemplateView):
     page_title = _('Payment history')
     page_name = 'transactions'
-    template_name = 'sharix_admin/transactions.html'
+    template_name = 'sharix_admin/transactions.html'

+ 5 - 5
sharix_admin/views/user_info.py

@@ -1,10 +1,10 @@
 from django.contrib.auth import get_user_model
-
-from django_tables2 import SingleTableView
-from sharix_admin.tables import UserInfoTable
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib.auth.models import Group
 from django.utils.translation import gettext as _
+from django_tables2 import SingleTableView
+
+from sharix_admin.tables import UserInfoTable
 
 
 class UserListView(UserPassesTestMixin, SingleTableView):
@@ -20,9 +20,9 @@ class UserListView(UserPassesTestMixin, SingleTableView):
             'groups': Group.objects.all()
         })
         return context
-    
+
     def test_func(self) -> bool or None:
         group_names = ('PROVIDER')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True
-        return False
+        return False