Browse Source

marge updates with open webapp base

kateshev14 5 months ago
parent
commit
521e6df17e
42 changed files with 493 additions and 314 deletions
  1. 0 42
      README.md
  2. 2 5
      SharixAdmin/apps.py
  3. 2 2
      SharixAdmin/forms/company.py
  4. 2 12
      SharixAdmin/signals.py
  5. 4 0
      SharixAdmin/static/SharixAdmin/css/bootstrap.min.css
  6. 0 0
      SharixAdmin/static/SharixAdmin/css/bootstrap.min.css.map
  7. 16 0
      SharixAdmin/static/SharixAdmin/css/style.css
  8. 3 0
      SharixAdmin/static/SharixAdmin/img/file.svg
  9. 3 2
      SharixAdmin/static/SharixAdmin/img/pencil.svg
  10. 5 0
      SharixAdmin/static/SharixAdmin/js/bootstrap.bundle.min.js
  11. 0 0
      SharixAdmin/static/SharixAdmin/js/bootstrap.bundle.min.js.map
  12. 6 1
      SharixAdmin/static/drf-yasg/colors2.css
  13. 3 5
      SharixAdmin/templates/SharixAdmin/base.html
  14. 1 17
      SharixAdmin/templates/SharixAdmin/cooperate.html
  15. 24 0
      SharixAdmin/templates/SharixAdmin/include/form.html
  16. 31 3
      SharixAdmin/templates/SharixAdmin/index.html
  17. 1 0
      SharixAdmin/templates/SharixAdmin/main.html
  18. 47 0
      SharixAdmin/templates/SharixAdmin/partner.html
  19. 38 0
      SharixAdmin/templates/SharixAdmin/partner_edit.html
  20. 28 30
      SharixAdmin/templates/SharixAdmin/partners.html
  21. 1 0
      SharixAdmin/templates/SharixAdmin/payment.html
  22. 1 0
      SharixAdmin/templates/SharixAdmin/payment_form.html
  23. 2 0
      SharixAdmin/templates/SharixAdmin/service_type.html
  24. 9 9
      SharixAdmin/templates/SharixAdmin/transactions.html
  25. 14 8
      SharixAdmin/urls.py
  26. 2 0
      SharixAdmin/utils/__init__.py
  27. 12 0
      SharixAdmin/utils/group.py
  28. 33 0
      SharixAdmin/utils/ticket_gen.py
  29. 9 8
      SharixAdmin/views/__init__.py
  30. 20 0
      SharixAdmin/views/base.py
  31. 44 50
      SharixAdmin/views/cooperate.py
  32. 18 13
      SharixAdmin/views/index.py
  33. 73 0
      SharixAdmin/views/partner.py
  34. 2 66
      SharixAdmin/views/partner_info.py
  35. 7 5
      SharixAdmin/views/partners.py
  36. 8 7
      SharixAdmin/views/payment.py
  37. 1 1
      SharixAdmin/views/provider.py
  38. 1 1
      SharixAdmin/views/resource.py
  39. 1 1
      SharixAdmin/views/service.py
  40. 9 11
      SharixAdmin/views/service_type.py
  41. 8 11
      SharixAdmin/views/transactions.py
  42. 2 4
      requirements.txt

+ 0 - 42
README.md

@@ -14,48 +14,6 @@ Be careful when adding new settings during development and remember to add them
 
 
 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.
 
 
-## Utilities
-
-Utilities provides important functionality to web-application, so it is important to know and understand how they work. They are stored in *core/utils*.
-
-### AuthAPI
-
-That class provides the ability to authenticate an application account through the
-API and store these authentication tokens.
-
-Modules using the API should log in ShariX system using this class.
-
-#### Setting up
-
-```python
-# core/settings_vars.py
-
-API_URL = 'http://127.0.0.1:8000'
-```
-
-```python
-# <module>/apps.py
-
-from core.utils.AuthAPI import AuthAPI
-auth_api = AuthAPI("<module_login>", "<module_password>")
-```
-
-#### Usage example
-
-```python
-# <module>/<file>.py
-
-import requests
-from <module>.apps import auth_api 
-from core.settings import API_URL
-
-# You can use api.headers to get the corret authorization header in your requests.
-requests.get(f"{API_URL}/tickets/api/tickets/", headers=auth_api.headers)
-
-# Or you can get just token.
-print(auth_api.token)
-```
-
 ## Launch 
 ## Launch 
 
 
 To start the web application, run *bin/start.sh*.
 To start the web application, run *bin/start.sh*.

+ 2 - 5
SharixAdmin/apps.py

@@ -5,10 +5,7 @@ from django.apps import AppConfig
 class SharixadminConfig(AppConfig):
 class SharixadminConfig(AppConfig):
     default_auto_field = 'django.db.models.BigAutoField'
     default_auto_field = 'django.db.models.BigAutoField'
     name = 'SharixAdmin'
     name = 'SharixAdmin'
-    verbose_name = "SHARIX_PLATFORM"
+    verbose_name = "SHARIX_OPEN"
 
 
     def ready(self):
     def ready(self):
-        # Импортируем обработчик сигнала, чтобы зарегистрировать его
-        from django.db.models.signals import post_migrate
-        from .groups import create_groups
-        post_migrate.connect(create_groups, sender=self)
+       import SharixAdmin.signals

+ 2 - 2
SharixAdmin/forms/company.py

@@ -3,9 +3,9 @@ from django import forms
 from dbsynce.models import Company
 from dbsynce.models import Company
 
 
 
 
-class CompanyCreateForm(forms.ModelForm):
+class CompanyForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
-        super(CompanyCreateForm, self).__init__(*args, **kwargs)
+        super(CompanyForm, self).__init__(*args, **kwargs)
         # Добавляем класс .form-control для всех полей формы
         # Добавляем класс .form-control для всех полей формы
         for field in iter(self.fields):
         for field in iter(self.fields):
             if 'class' not in self.fields[field].widget.attrs:
             if 'class' not in self.fields[field].widget.attrs:

+ 2 - 12
SharixAdmin/groups.py → SharixAdmin/signals.py

@@ -1,9 +1,9 @@
 from django.contrib.auth.models import Group
 from django.contrib.auth.models import Group
 from django.dispatch import receiver
 from django.dispatch import receiver
 from django.db.models.signals import post_migrate
 from django.db.models.signals import post_migrate
-from django.contrib.auth.decorators import user_passes_test
 
 
-#Создание групп
+
+# Создание групп
 @receiver(post_migrate)
 @receiver(post_migrate)
 def create_groups(sender, **kwargs):
 def create_groups(sender, **kwargs):
     Group.objects.get_or_create(pk=21, name='METASERVICE-ADMIN')
     Group.objects.get_or_create(pk=21, name='METASERVICE-ADMIN')
@@ -19,15 +19,5 @@ def create_groups(sender, **kwargs):
     Group.objects.get_or_create(pk=41, name='PROVIDER')
     Group.objects.get_or_create(pk=41, name='PROVIDER')
     Group.objects.get_or_create(pk=51, name='CLIENT')
     Group.objects.get_or_create(pk=51, name='CLIENT')
     Group.objects.get_or_create(pk=61, name='GUEST')
     Group.objects.get_or_create(pk=61, name='GUEST')
-    
-
 
 
-# Функция позволяющая определить принадлежность к группе, перенаправляет на авторизацию
-def group_required(*group_names):
-    def in_groups(u):
-        if u.is_authenticated:
-            if u.groups.filter(name=group_names).exists() or u.is_superuser:
-                return True
-        return False
 
 
-    return user_passes_test(in_groups)

File diff suppressed because it is too large
+ 4 - 0
SharixAdmin/static/SharixAdmin/css/bootstrap.min.css


File diff suppressed because it is too large
+ 0 - 0
SharixAdmin/static/SharixAdmin/css/bootstrap.min.css.map


+ 16 - 0
SharixAdmin/static/SharixAdmin/css/style.css

@@ -77,6 +77,16 @@
     100% { transform: rotate(360deg); }
     100% { transform: rotate(360deg); }
 }
 }
 
 
+.list-style-none {
+    list-style-type: none;
+    margin: 0;
+    padding: 0;
+}
+
+.list-style-none li:not(:last-child) {
+    margin-bottom: 1em;
+}
+
 .nav-link {
 .nav-link {
     height: 48px;
     height: 48px;
     display: flex;
     display: flex;
@@ -95,4 +105,10 @@
 .menu-bar-label.collapsed {
 .menu-bar-label.collapsed {
     opacity: 0;
     opacity: 0;
     pointer-events: none;
     pointer-events: none;
+}
+
+.btn-edit {
+    position: absolute;
+    top: 1em;
+    right: 1em;
 }
 }

+ 3 - 0
SharixAdmin/static/SharixAdmin/img/file.svg

@@ -0,0 +1,3 @@
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M20 8.94C19.9896 8.84813 19.9695 8.75763 19.94 8.67V8.58C19.8919 8.47718 19.8278 8.38267 19.75 8.3L13.75 2.3C13.6673 2.22222 13.5728 2.15808 13.47 2.11H13.38C13.2784 2.05174 13.1662 2.01434 13.05 2H7C6.20435 2 5.44129 2.31607 4.87868 2.87868C4.31607 3.44129 4 4.20435 4 5V19C4 19.7956 4.31607 20.5587 4.87868 21.1213C5.44129 21.6839 6.20435 22 7 22H17C17.7956 22 18.5587 21.6839 19.1213 21.1213C19.6839 20.5587 20 19.7956 20 19V9C20 9 20 9 20 8.94ZM14 5.41L16.59 8H15C14.7348 8 14.4804 7.89464 14.2929 7.70711C14.1054 7.51957 14 7.26522 14 7V5.41ZM18 19C18 19.2652 17.8946 19.5196 17.7071 19.7071C17.5196 19.8946 17.2652 20 17 20H7C6.73478 20 6.48043 19.8946 6.29289 19.7071C6.10536 19.5196 6 19.2652 6 19V5C6 4.73478 6.10536 4.48043 6.29289 4.29289C6.48043 4.10536 6.73478 4 7 4H12V7C12 7.79565 12.3161 8.55871 12.8787 9.12132C13.4413 9.68393 14.2044 10 15 10H18V19Z" fill="#479FF8"/>
+</svg>

+ 3 - 2
SharixAdmin/static/SharixAdmin/img/pencil.svg

@@ -1,3 +1,4 @@
-<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M22.5 7.23962C22.5007 7.10803 22.4755 6.97758 22.4258 6.85575C22.376 6.73392 22.3027 6.62311 22.21 6.52968L17.97 2.29C17.8765 2.19732 17.7657 2.124 17.6439 2.07424C17.5221 2.02448 17.3916 1.99926 17.26 2.00002C17.1284 1.99926 16.9979 2.02448 16.8761 2.07424C16.7542 2.124 16.6434 2.19732 16.55 2.29L13.72 5.11978L2.79002 16.049C2.69733 16.1424 2.62401 16.2532 2.57425 16.375C2.52448 16.4969 2.49926 16.6273 2.50002 16.7589V20.9986C2.50002 21.2638 2.60537 21.5181 2.79291 21.7057C2.98045 21.8932 3.2348 21.9985 3.50001 21.9985H7.74001C7.87993 22.0061 8.0199 21.9843 8.15083 21.9343C8.28175 21.8843 8.40072 21.8074 8.50001 21.7085L19.37 10.7794L22.21 7.99957C22.3013 7.90266 22.3756 7.79112 22.43 7.66959C22.4396 7.58989 22.4396 7.50932 22.43 7.42961C22.4347 7.38307 22.4347 7.33617 22.43 7.28962L22.5 7.23962ZM7.33001 19.9987H4.50001V17.1689L14.43 7.23962L17.26 10.0694L7.33001 19.9987ZM18.67 8.65952L15.84 5.82973L17.26 4.41984L20.08 7.23962L18.67 8.65952Z" fill="#275A27"/>
+
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M21.1203 6.40527L17.5949 2.87987C17.0083 2.29329 16.241 2 15.4737 2C14.7064 2 13.9392 2.29329 13.3526 2.87987L2.88005 13.3376C2.30532 13.9093 1.9913 14.6885 2.00018 15.4973L2.05943 19.9855C2.07425 21.1024 2.98374 22 4.10061 22H8.50589C9.3028 22 10.0671 21.683 10.63 21.1201L21.1203 10.6476C22.2905 9.47741 22.2905 7.57843 21.1203 6.40527ZM9.56943 20.0595C9.28503 20.3439 8.90583 20.501 8.50589 20.501H4.10061C3.80732 20.501 3.56143 20.261 3.55847 19.9677L3.49922 15.4795C3.4933 15.0795 3.65327 14.6855 3.93767 14.4041L12.3779 5.97571L18.0245 11.6193L9.56943 20.0625V20.0595ZM20.0597 9.58702L19.0851 10.5587L13.4385 4.91512L14.4102 3.94342C14.6946 3.65901 15.0708 3.50496 15.4708 3.50496C15.8707 3.50496 16.247 3.66198 16.5314 3.94342L20.0568 7.46882C20.6404 8.05244 20.6404 9.00637 20.0568 9.58999L20.0597 9.58702Z" fill="white"/>
 </svg>
 </svg>

File diff suppressed because it is too large
+ 5 - 0
SharixAdmin/static/SharixAdmin/js/bootstrap.bundle.min.js


File diff suppressed because it is too large
+ 0 - 0
SharixAdmin/static/SharixAdmin/js/bootstrap.bundle.min.js.map


+ 6 - 1
SharixAdmin/static/drf-yasg/colors2.css

@@ -15,12 +15,17 @@
   --btn-danger-hover: #821e27;
   --btn-danger-hover: #821e27;
 }
 }
 
 
-.btn-primary, .btn-outline-primary{
+.btn-primary {
   background-color: var(--btn-bg-color);
   background-color: var(--btn-bg-color);
   color: var(--btn-txt-color);
   color: var(--btn-txt-color);
   border-color: var(--btn-bg-color);
   border-color: var(--btn-bg-color);
 }
 }
 
 
+.btn-outline-primary {
+  border-color: var(--btn-bg-color);
+  color: var(--btn-bg-color);
+}
+
 .btn-primary:hover, .btn-outline-primary:hover{
 .btn-primary:hover, .btn-outline-primary:hover{
   background-color: var(--btn-hover-color);
   background-color: var(--btn-hover-color);
   border-color: var(--btn-hover-color);
   border-color: var(--btn-hover-color);

+ 3 - 5
SharixAdmin/templates/SharixAdmin/base.html

@@ -7,11 +7,9 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <link rel="shortcut icon" href="{% static 'SharixAdmin/img/logo.png' %}">
     <link rel="shortcut icon" href="{% static 'SharixAdmin/img/logo.png' %}">
-    <link rel="stylesheet" href="{% static 'drf-yasg/navbar-style.css' %}">
+    <link rel="stylesheet" href="{% static 'SharixAdmin/css/bootstrap.min.css' %}">
     <link rel="stylesheet" href="{% static 'drf-yasg/service_type.css' %}">
     <link rel="stylesheet" href="{% static 'drf-yasg/service_type.css' %}">
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
-    <link href="{% static 'drf-yasg/colors2.css' %}" rel="stylesheet">
-    
+    <link rel="stylesheet" href="{% static 'drf-yasg/colors2.css' %}">
     <link rel="stylesheet" href="{% static 'SharixAdmin/css/style.css' %}">
     <link rel="stylesheet" href="{% static 'SharixAdmin/css/style.css' %}">
 
 
     <title>{{ title }}</title>
     <title>{{ title }}</title>
@@ -20,6 +18,6 @@
 <body>
 <body>
     {% block content %}{% endblock %}
     {% block content %}{% endblock %}
     
     
-    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
+    <script src="{% static 'SharixAdmin/js/bootstrap.bundle.min.js' %}"></script>
 </body>
 </body>
 </html>
 </html>

+ 1 - 17
SharixAdmin/templates/SharixAdmin/cooperate.html

@@ -1,26 +1,10 @@
 {% extends 'SharixAdmin/index.html' %}
 {% extends 'SharixAdmin/index.html' %}
 
 
 {% block contenthome %}
 {% block contenthome %}
-<h1 class="mainHeader">{{ title }}</h1>
 <p class="description_service">Товарищи! Консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Идейные соображения высшего порядка, а также постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании форм развития. </p>
 <p class="description_service">Товарищи! Консультация с широким активом требуют определения и уточнения существенных финансовых и административных условий. Идейные соображения высшего порядка, а также постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании форм развития. </p>
 <form method="post" class="d-flex flex-column align-items-end">
 <form method="post" class="d-flex flex-column align-items-end">
     {% csrf_token %}
     {% csrf_token %}
-    {% for field in form %}
-        <div class="w-100 mb-3">
-            <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
-            {{ field }}
-            {% if field.help_text %}
-                <small class="form-text text-muted">{{ field.help_text }}</small>
-            {% endif %}
-            {% if field.errors %}
-                <ul class="errorlist">
-                    {% for error in field.errors %}
-                        <li>{{ error }}</li>
-                    {% endfor %}
-                </ul>
-            {% endif %}
-        </div>
-    {% endfor %}
+    {% include 'SharixAdmin/include/form.html' %}
     <button class="btn btn-primary" type="submit">Отправить</button>
     <button class="btn btn-primary" type="submit">Отправить</button>
 </form>
 </form>
 {% endblock %}
 {% endblock %}

+ 24 - 0
SharixAdmin/templates/SharixAdmin/include/form.html

@@ -0,0 +1,24 @@
+{% for field in form %}
+    <div class="w-100 mb-3">
+        <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
+        {{ field }}
+        {% if field.help_text %}
+            <small class="form-text text-muted">{{ field.help_text }}</small>
+        {% endif %}
+        {% if field.errors %}
+            <ul class="errorlist">
+                {% for error in field.errors %}
+                    <li>{{ error }}</li>
+                {% endfor %}
+            </ul>
+        {% endif %}
+    </div>
+{% endfor %}
+
+{% if form.non_field_errors %}
+    <div class="alert alert-danger">
+        {% for error in form.non_field_errors %}
+            {{ error }}
+        {% endfor %}
+    </div>
+{% endif %}

+ 31 - 3
SharixAdmin/templates/SharixAdmin/index.html

@@ -108,6 +108,7 @@
       </li>-->
       </li>-->
       <li class="nav-item">
       <li class="nav-item">
         <a href="{% url 'user_information' %}" class="nav-link {% if current_page == "user_information" %}active rounded{% endif %}">
         <a href="{% url 'user_information' %}" class="nav-link {% if current_page == "user_information" %}active rounded{% endif %}">
+
           <div class="link d-flex align-items-center">
           <div class="link d-flex align-items-center">
             <img
             <img
               class="nav-img"
               class="nav-img"
@@ -120,7 +121,7 @@
             <span class="menu-bar-label">Управление правами</span>
             <span class="menu-bar-label">Управление правами</span>
           </div>
           </div>
         </a>
         </a>
-      </li>
+      </li> {% endcomment %}
       <li class="nav-item">
       <li class="nav-item">
         <a href="{% url 'service_type' %}" class="nav-link {% if current_page == "service_type" %}active rounded{% endif %}">
         <a href="{% url 'service_type' %}" class="nav-link {% if current_page == "service_type" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
           <div class="link d-flex align-items-center">
@@ -154,7 +155,7 @@
       </li>  
       </li>  
       {% endif %}   
       {% endif %}   
       <li class="nav-item">
       <li class="nav-item">
-        <a href="{% url 'trans' %}" class="nav-link {% if current_page == "transactions" %}active rounded{% endif %}">
+        <a href="{% url 'transactions' %}" class="nav-link {% if current_page == "transactions" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
           <div class="link d-flex align-items-center">
             <img
             <img
               class="nav-img"
               class="nav-img"
@@ -168,8 +169,29 @@
           </div>
           </div>
         </a>
         </a>
       </li>
       </li>
+<<<<<<< HEAD
       {% if user.is_superuser %}      
       {% if user.is_superuser %}      
       <li class="nav-item">
       <li class="nav-item">
+=======
+      {% if is_partner_admin %}
+        <li class="nav-item">
+          <a href="{% url 'partner_detail' %}" class="nav-link {% if current_page == 'partner' %}active rounded{% endif %}">
+            <div class="link d-flex align-items-center">
+              <img
+                class="nav-img"
+                src="
+                  {% if current_page == 'partner' %}
+                    {% static 'SharixAdmin/img/menu/person_w.svg' %}
+                  {% else %}
+                    {% static 'SharixAdmin/img/menu/person.svg' %}
+                  {% endif %}">
+              <span class="menu-bar-label">О партнере</span>
+            </div>
+          </a>
+        </li>
+      {% endif %}
+      {% comment %} <li class="nav-item">
+>>>>>>> upstream/unstable
         <a href="{% url 'service_information-add' %}" class="nav-link {% if current_page == "service_info" %}active rounded{% endif %}">
         <a href="{% url 'service_information-add' %}" class="nav-link {% if current_page == "service_info" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
           <div class="link d-flex align-items-center">
             <img
             <img
@@ -183,7 +205,7 @@
             <span class="menu-bar-label">Информация о сервисе</span>
             <span class="menu-bar-label">Информация о сервисе</span>
           </div>
           </div>
         </a>
         </a>
-      </li>
+      </li> {% endcomment %}
       <li class="nav-item">
       <li class="nav-item">
         <a href="{% url 'payment' %}" class="nav-link {% if current_page == "payment" %}active rounded{% endif %}">
         <a href="{% url 'payment' %}" class="nav-link {% if current_page == "payment" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
           <div class="link d-flex align-items-center">
@@ -295,6 +317,12 @@
   </nav>
   </nav>
 
 
   <div id="user-workspace" class="p-5 border rounded box-shadow">
   <div id="user-workspace" class="p-5 border rounded box-shadow">
+      <h1 class="mainHeader mb-3">{{ title }}</h1>
+      {% if messages %}
+        {% for message in messages %}
+          <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}">{{ message }}</div>
+        {% endfor %}
+      {% endif %}
       {% block contenthome %}{% endblock contenthome%}
       {% block contenthome %}{% endblock contenthome%}
   </div>
   </div>
 
 

+ 1 - 0
SharixAdmin/templates/SharixAdmin/main.html

@@ -5,6 +5,7 @@
 <h1 class="mainHeader">{{ title }}</h1>
 <h1 class="mainHeader">{{ title }}</h1>
 <p class="description_service">Это удобное и информативное пространство, где пользователи могут быстро ознакомиться с основной документацией сервиса ShariX Guide. 
 <p class="description_service">Это удобное и информативное пространство, где пользователи могут быстро ознакомиться с основной документацией сервиса ShariX Guide. 
     <br>Также здесь представлена краткая информация про пользователя, его дату регистрации, а также баланс баллов. При необходимости можно приобрести баллы.</br></p>    
     <br>Также здесь представлена краткая информация про пользователя, его дату регистрации, а также баланс баллов. При необходимости можно приобрести баллы.</br></p>    
+
 <div class="container" style="padding: 2px;">
 <div class="container" style="padding: 2px;">
     <div class="row fs-6">
     <div class="row fs-6">
         
         

+ 47 - 0
SharixAdmin/templates/SharixAdmin/partner.html

@@ -0,0 +1,47 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+{% load static %}
+
+{% block contenthome %}
+<p class="description_service">
+    Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
+    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете
+</p>
+
+<div class="card w-100 mb-4">
+    <div class="card-body position-relative">
+        <h5 class="card-title fw-bold mb-4">{{ company.legal_name }}</h5>
+
+        <ul class="list-style-none">
+            <li><b>Представитель</b> {{ company.repr_id.get_full_name }}</li>
+            <li><b>Юр. адрес</b> {{ company.address }}</li>
+            
+            <!-- FIXME: Не настроено -->
+            <li><b>НДС</b> Не платит</li>
+            
+            <li><b>ИНН</b> {{ company.inn }}</li>
+            <li><b>ОГРН</b> {{ company.ogrn }}</li>
+            <li><b>Р/c</b> {{ company.rs }}</li>
+            <li><b>К/c</b> {{ company.ks }}</li>
+            <li><b>БИК</b> {{ company.bik }}</li>
+            <li><b>Банк</b> {{ company.bank_name }}</li>
+        </ul>
+    </div>
+    <a class="btn btn-primary btn-edit" href="{% url "partner_edit" %}">
+        <img src="{% static 'SharixAdmin/img/pencil.svg' %}">
+    </a>
+</div>
+
+<h6 class="mb-4">Документы</h6>
+    <ul class="list-style-none">
+        {% for document in company_documents %}
+            <li class="d-flex justify-content-between">
+                <div class="d-flex align-items-center">
+                    <img class="me-2" style="height: 32px;" src="{% static "SharixAdmin/img/file.svg" %}">
+                    {{ document }}
+                </div>
+                <button class="btn btn-sm btn-outline-primary">Загрузить</button>
+            </li>
+        {% endfor %}
+    </ul>
+{% endblock contenthome %}

+ 38 - 0
SharixAdmin/templates/SharixAdmin/partner_edit.html

@@ -0,0 +1,38 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+{% load static %}
+
+{% block contenthome %}
+
+<a class="display-block btn btn-sm btn-outline-secondary" href="{% url 'partner_detail' %}"><< Назад</a>
+
+<p class="description_service">
+    Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
+    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете
+</p>
+
+<form method="post" class="d-flex flex-column align-items-end">
+    {% csrf_token %}
+    {% include 'SharixAdmin/include/form.html' %}
+    <button class="btn btn-primary" type="button" data-bs-toggle="modal" data-bs-target="#partner-edit-modal">Отправить</button>
+
+    <!-- Окно подтверждения -->
+    <div id="partner-edit-modal" class="modal fade" tabindex="-1">
+        <div class="modal-dialog modal-dialog-centered">
+          <div class="modal-content">
+            <div class="modal-header">
+              <h5 class="modal-title">Подтверждение действия</h5>
+              <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+              <p>Внесение изменений в данные партнера приведет к его деактивации до момента проверки новой информации!</p>
+            </div>
+            <div class="modal-footer">
+              <button type="button" class="btn btn-primary" data-bs-dismiss="modal">Отменить</button>
+              <button type="sumbit" class="btn btn-outline-primary">Подтвердить</button>
+            </div>
+          </div>
+        </div>
+    </div>
+</form>
+{% endblock contenthome %}

+ 28 - 30
SharixAdmin/templates/SharixAdmin/partners.html

@@ -8,35 +8,33 @@
       добавлять новых партнеров, управлять условиями сотрудничества и менять статус партнера. 
       добавлять новых партнеров, управлять условиями сотрудничества и менять статус партнера. 
       Кроме того, здесь имеется сортировка, позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
       Кроме того, здесь имеется сортировка, позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
 
 
-    <div class="container text-center mt-2">
-      {% render_table table %}
-    </div>
-    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
-    <script>
-      // Запрос на изменения статуса партнера
-      $('.status-toggle').change(function() {
-        var partners_id = $(this).data('partners-id');
-        var new_status = $(this).prop('checked') ? 'active' : 'deactivated';
-        $.ajax({
-          url: '{% url "partners/change_status" %}',
-          type: 'POST',
-          data: {
-            'partners_id': partners_id,
-            'new_status': new_status,
-            'csrfmiddlewaretoken': '{{ csrf_token }}'
-          },
-          success: function(response) {
-            var scrollTop = window.pageYOffset;
-            location.reload();
-            window.scrollTo(0, scrollTop);
-          },
-          error: function(xhr, status, error) {
-            console.log(xhr.responseText);
-          }
-        });
-      });
-    </script> 
-</div>    
 
 
-    
+  <div class="container text-center mt-2">
+    {% render_table table %}
+  </div>
+  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+  <script>
+    // Запрос на изменения статуса партнера
+    $('.status-toggle').change(function() {
+      var partners_id = $(this).data('partners-id');
+      var new_status = $(this).prop('checked') ? 'active' : 'deactivated';
+      $.ajax({
+        url: '{% url "partners/change_status" %}',
+        type: 'POST',
+        data: {
+          'partners_id': partners_id,
+          'new_status': new_status,
+          'csrfmiddlewaretoken': '{{ csrf_token }}'
+        },
+        success: function(response) {
+          var scrollTop = window.pageYOffset;
+          location.reload();
+          window.scrollTo(0, scrollTop);
+        },
+        error: function(xhr, status, error) {
+          console.log(xhr.responseText);
+        }
+      });
+    });
+  </script> 
 {% endblock contenthome %}
 {% endblock contenthome %}

+ 1 - 0
SharixAdmin/templates/SharixAdmin/test.html → SharixAdmin/templates/SharixAdmin/payment.html

@@ -6,6 +6,7 @@
     <h1 class="mainHeader">{{ title }}</h1>
     <h1 class="mainHeader">{{ title }}</h1>
     <p class="description_service">Управление данными реквизитов компании. Администраторы могут просматривать и вносить правки в реквизиты компании.</p>
     <p class="description_service">Управление данными реквизитов компании. Администраторы могут просматривать и вносить правки в реквизиты компании.</p>
 
 
+
 <div class="row justify-content-start">
 <div class="row justify-content-start">
     <div class="maintable" id="maintable">
     <div class="maintable" id="maintable">
         <table class="table table-sm m-2">
         <table class="table table-sm m-2">

+ 1 - 0
SharixAdmin/templates/SharixAdmin/payment_form.html

@@ -6,6 +6,7 @@
     <h1 class="mainHeader">{{ title }}</h1>
     <h1 class="mainHeader">{{ title }}</h1>
     <p class="description_service"> Управление данными реквизитов компании. Администраторы могут просматривать и вносить правки в реквизиты компании. </p>
     <p class="description_service"> Управление данными реквизитов компании. Администраторы могут просматривать и вносить правки в реквизиты компании. </p>
 
 
+
 <div class="row justify-content-start">
 <div class="row justify-content-start">
     <div class="maintable" id="maintable">
     <div class="maintable" id="maintable">
         <table class="table table-sm m-2">
         <table class="table table-sm m-2">

+ 2 - 0
SharixAdmin/templates/SharixAdmin/service_type.html

@@ -14,9 +14,11 @@
   }
   }
 </style>
 </style>
 
 
+
 <h1 class="mainHeader">{{ title }}</h1>
 <h1 class="mainHeader">{{ title }}</h1>
 <p class="description_service">Управление набором предоставляемых услуг. Здесь админы могут создавать, редактировать и удалять описания услуг. 
 <p class="description_service">Управление набором предоставляемых услуг. Здесь админы могут создавать, редактировать и удалять описания услуг. 
   Кроме того, здесь имеется сортировка, позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
   Кроме того, здесь имеется сортировка, позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
+
       <div class="row justify-content-start">
       <div class="row justify-content-start">
           <div class="maintable" id="maintable">
           <div class="maintable" id="maintable">
             {% render_table table %}
             {% render_table table %}

+ 9 - 9
SharixAdmin/templates/SharixAdmin/transactions.html

@@ -3,6 +3,7 @@
 {% load i18n %}
 {% load i18n %}
 
 
 {% block contenthome %}
 {% block contenthome %}
+
 <div class="container">
 <div class="container">
     <h1 class="mainHeader">{{ title }}</h1>
     <h1 class="mainHeader">{{ title }}</h1>
     {% if user.is_superuser %}
     {% if user.is_superuser %}
@@ -14,14 +15,13 @@
       <p class="description_service">Полная информация обо всех заказах пользователей. Пользователи могут просматривать детали своих прошлых заказов, 
       <p class="description_service">Полная информация обо всех заказах пользователей. Пользователи могут просматривать детали своих прошлых заказов, 
       включая выбранные услуги, стоимость, дату и время заказа.</p>
       включая выбранные услуги, стоимость, дату и время заказа.</p>
       {%endif%}
       {%endif%}
-    <h3 >{% trans 'User: ' %}{{ request.user.username }}</h3>
-    <h3 >{% blocktrans %}Balance: {{ wallet.balance }} points{% endblocktrans %}</h3>
-    <form class="d-flex" method="post">
-        {% csrf_token %}
-        <input class="form-control me-2" name="search" type="search" placeholder="{% trans 'Search' %}" aria-label="Search">
-        <button class="btn btn-outline-success" type="submit">{% trans 'Search' %}</button>
-      </form>
-      {% comment %} {% render_table  table %} {% endcomment %}
-</div>
+  <h3 >{% trans 'User: ' %}{{ request.user.username }}</h3>
+  <h3 >{% blocktrans %}Balance: {{ wallet.balance }} points{% endblocktrans %}</h3>
+  <form class="d-flex" method="post">
+      {% csrf_token %}
+      <input class="form-control me-2" name="search" type="search" placeholder="{% trans 'Search' %}" aria-label="Search">
+      <button class="btn btn-outline-success" type="submit">{% trans 'Search' %}</button>
+    </form>
+    {% comment %} {% render_table  table %} {% endcomment %}
 {% endblock contenthome %} 
 {% endblock contenthome %} 
 
 

+ 14 - 8
SharixAdmin/urls.py

@@ -13,13 +13,21 @@ router.register(r'sharix-users', SharixUserMVS)
 router.register(r'group', GroupMVS)
 router.register(r'group', GroupMVS)
 
 
 urlpatterns = [
 urlpatterns = [
-    #path('auth/', LoginSharix.as_view(), name='auth'),
+    path('', login_required(IndexView.as_view()), name='home'),
+    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('accounts/login/', LoginSharix.as_view(), name='authweb'),
     path('accounts/login/', LoginSharix.as_view(), name='authweb'),
-    path('', index, name='home'),
-    path('transactions/', transactions, name='trans'),
     path('transactions/<int:trans_id>/', trans_id, name='transid'),
     path('transactions/<int:trans_id>/', trans_id, name='transid'),
     path('logout/', logout_view, name='logoutweb'),
     path('logout/', logout_view, name='logoutweb'),
     path('balance/', balance, name='balance'),
     path('balance/', balance, name='balance'),
+
     path('payment/', login_required(paymentView), name='payment'),
     path('payment/', login_required(paymentView), name='payment'),
     path('payment_way/', login_required(paymentWayView), name='payment_way'),
     path('payment_way/', login_required(paymentWayView), name='payment_way'),
 
 
@@ -47,8 +55,6 @@ urlpatterns = [
     path('provider/', login_required(ProviderListView.as_view()), name='provider'),
     path('provider/', login_required(ProviderListView.as_view()), name='provider'),
     path('provider/change_status/', change_provider_status, name='provider/change_status'),
     path('provider/change_status/', change_provider_status, name='provider/change_status'),
 
 
-    path('cooperate/', login_required(CooperateView.as_view()), name="cooperate"),
-
     path('service_tariff/', login_required(ServiceTariffListView.as_view()), name='service_tariff'),
     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/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/'),
@@ -65,9 +71,9 @@ urlpatterns = [
     path('service/', ServiceListView.as_view(), name='service'),
     path('service/', ServiceListView.as_view(), name='service'),
     path('service/change_status/', change_service_status, name='service/change_status'),
     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'),
     path('user_information', login_required(UserListView.as_view()), name='user_information'),
     path('user_information/delete/<int:pk>', login_required(UserDelete.as_view()), name='user_information/delete/'),    
     path('user_information/delete/<int:pk>', login_required(UserDelete.as_view()), name='user_information/delete/'),    

+ 2 - 0
SharixAdmin/utils/__init__.py

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

+ 12 - 0
SharixAdmin/utils/group.py

@@ -0,0 +1,12 @@
+from django.contrib.auth.decorators import user_passes_test
+
+
+# Функция позволяющая определить принадлежность к группе, перенаправляет на авторизацию
+def group_required(*group_names):
+    def in_groups(u):
+        if u.is_authenticated:
+            if u.groups.filter(name=group_names).exists() or u.is_superuser:
+                return True
+        return False
+
+    return user_passes_test(in_groups)

+ 33 - 0
SharixAdmin/utils/ticket_gen.py

@@ -0,0 +1,33 @@
+from datetime import datetime, timedelta
+
+from tickets.models import Ticket, TicketList
+
+
+def create_ticket_partner_activation(user, сompany):
+    """
+    Создание тикета на активацию партнера.
+    
+    Список: 2101, METASERVICE-ADMIN: Активация партнеров (NEG_REQUEST)
+    Тип: 4, NEG_REQUEST
+    """
+    # FIXME: Возможно нужно автоматически создавать содержимое поля json
+    return Ticket.objects.create(
+        title=f"Создание нового Партнера '{сompany.legal_name}'",
+        ticket_list=TicketList.objects.get(pk=2101),
+        ticket_type=4,
+        due_date=datetime.now().date() + timedelta(days=30),
+        created_by=user,
+        
+        note=f"""
+            Пользователь {user} #{user.pk} отправил заявку на становление партнером сервиса:\n
+            - Имя: {сompany.legal_name}\n
+            - ИНН: {сompany.inn}\n
+            - Юридический адрес: {сompany.address}\n
+            <a href="{сompany.get_admin_url()}">Полная информация</a>\n
+            \n
+            Проверьте всю информацию и для активации партнера измените статус заявки на ACCEPTED.
+            Это будет означать, что договорные отношения между сервисом и партнером, вступают в силу.
+        """
+    )
+
+    

+ 9 - 8
SharixAdmin/views/__init__.py

@@ -1,7 +1,7 @@
-from .index import index
-from .transactions import transactions
-#from .context import get_context
+from .index import *
+from .transactions import *
 from .service import *
 from .service import *
+from .partner import *
 from .service_type import *
 from .service_type import *
 from .service_tariff import *
 from .service_tariff import *
 from .service_info import *
 from .service_info import *
@@ -11,13 +11,14 @@ from .partner_info import *
 from .provider import *
 from .provider import *
 from .login import *
 from .login import *
 from .cooperate import *
 from .cooperate import *
-from .payment import paymentView
-from .balance import balance
-from .trans_id import trans_id
-from .schema import schema_v3
+from .payment import *
+from .balance import *
+from .trans_id import *
+from .schema import *
 from .user_info import *
 from .user_info import *
 from .task_management import *
 from .task_management import *
 from .comments import *
 from .comments import *
 from .tech_support  import *
 from .tech_support  import *
 from .payment_way  import paymentWayView
 from .payment_way  import paymentWayView
-from .account  import *
+from .account  import *
+

+ 20 - 0
SharixAdmin/views/base.py

@@ -0,0 +1,20 @@
+from django.views import View
+
+
+class BaseView(View):
+    """
+    Базовый класс представления админ-панели ShariX.
+
+    Предоставляет общие методы и функционал, который
+    может быть использован в других представлениях админ-панели.
+    """
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        context.update({
+            'title': self.page_title,
+            'current_page': self.page_name,
+            'is_partner_admin': self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+        })
+        
+        return context

+ 44 - 50
SharixAdmin/views/cooperate.py

@@ -2,68 +2,62 @@ from datetime import datetime, timedelta
 
 
 from django.views.generic.edit import FormView
 from django.views.generic.edit import FormView
 from django.urls import reverse_lazy
 from django.urls import reverse_lazy
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.contrib import messages
+from django.db import transaction
 
 
-from SharixAdmin.forms import CompanyCreateForm
+from SharixAdmin.forms import CompanyForm
+from SharixAdmin.utils import create_ticket_partner_activation
 from tickets.models import Ticket, TicketList
 from tickets.models import Ticket, TicketList
 
 
 
 
-class CooperateView(FormView):
-    form_class = CompanyCreateForm
+class CooperateView(UserPassesTestMixin, FormView):
+    form_class = CompanyForm
     template_name = "SharixAdmin/cooperate.html"
     template_name = "SharixAdmin/cooperate.html"
-    success_url = reverse_lazy("cooperate")
+    success_url = reverse_lazy("home")
+
+    # Проверяем не состояит ли текущий пользователь в группе PARTNER-ADMIN
+    def test_func(self):
+        return not self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
 
 
     def form_valid(self, form):
     def form_valid(self, form):
-        # Сохраняем форму, чтобы получить объект компании
-        instance = form.save(commit=False)
-    
-        # Присваиваем полю repr_id идентификатор текущего пользователя
-        instance.repr_id = self.request.user
+        with transaction.atomic():
+            # Сохраняем форму, чтобы получить объект компании
+            instance = form.save(commit=False)
+        
+            # Присваиваем полю repr_id идентификатор текущего пользователя
+            instance.repr_id = self.request.user
 
 
-        # Создаем новую запись в БД, чтобы иметь доступ к ID
-        instance.save() 
+            # Создаем новую запись в БД, чтобы иметь доступ к ID
+            instance.save() 
 
 
-        # Создание тикета на активацию партнера
-        # Создаем объект тикета и присваиваем его полю ticket_status
-        instance.ticket_status = Ticket.objects.create(
-            title=f"Создание нового Партнера '{instance.legal_name}'",
-            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,
+            # Создание тикета на активацию партнера.
+            # Создаем объект тикета и присваиваем его полю ticket_status
+            instance.ticket_status = create_ticket_partner_activation(self.request.user, instance)
             
             
-            # FIXME: Возможно необходима автоматическая генерация содержимого в определенном формате
-            note=f"""
-            Пользователь {self.request.user} #{self.request.user.pk} отправил заявку на становление партнером сервиса:\n
-            - Имя: {instance.legal_name}\n
-            - ИНН: {instance.inn}\n
-            - Юридический адрес: {instance.address}\n
-            <a href="{instance.get_admin_url()}">Полная информация</a>\n
-            \n
-            Проверьте всю информацию и для активации партнера измените статус заявки на ACCEPTED.
-            Это будет означать, что договорные отношения между сервисом и партнером, вступают в силу.
-            """
-        )
+            # Создание тикета на утверждение прав пользователя
+            Ticket.objects.create(
+                title=f"Запрос прав на становление Партнером '{instance.legal_name}'",
+                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
+                    \n
+                    <a href="{instance.get_admin_url()}">Полная информация о компании партнера</a>\n
+                    \n
+                    После принятия изменений указанное лицо будет партнером сервиса при совершении юридически значимых действий.
+                """
+            )
 
 
-        # Сохраняем новые изменения
-        instance.save()
+            # Сохраняем новые изменения
+            instance.save()
 
 
-        # Создание тикета на утверждение прав пользователя
-        Ticket.objects.create(
-            title=f"Запрос прав на становление Партнером '{instance.legal_name}'",
-            ticket_list=TicketList.objects.get(pk=2101),# METASERVICE-ADMIN: Активация партнеров (NEG_REQUEST)
-            ticket_type=4, # NEG_REQUEST
-            due_date=datetime.now().date() + timedelta(days=30),
-            created_by=self.request.user,
-            
-            # FIXME: Возможно необходима автоматическая генерация содержимого в определенном формате
-            note=f"""
-            Пользователь {self.request.user} #{self.request.user.pk} отправил заявку на права партнера сервиса.\n
-            \n
-            <a href="{instance.get_admin_url()}">Полная информация о компании партнера</a>\n
-            \n
-            После принятия изменений указанное лицо будет партнером сервиса при совершении юридически значимых действий.
-            """
-        )
+        # Отправляем пользователю уведомление на страницу о успехе операции
+        messages.success(self.request, 'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!')
 
 
         return super().form_valid(form) # Возвращаем успешный ответ
         return super().form_valid(form) # Возвращаем успешный ответ
 
 

+ 18 - 13
SharixAdmin/views/index.py

@@ -1,17 +1,22 @@
-from django.contrib.auth.decorators import login_required
-from django.shortcuts import render
+from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from .base import BaseView
 
 
-@login_required
-def index(request):
-    ph_num = str(request.user.phone_number)
-    convert_ph_num = f"+{ph_num[:1]} ({ph_num[1:4]}) {ph_num[4:7]}-{ph_num[7:9]}-{ph_num[9:11]}"
 
 
-    context = {
-        'title':_('Home/Balance'),
-        'phone':convert_ph_num,
-        'current_page': 'index'
-    }
-    
-    return render(request, 'SharixAdmin/main.html', context)
+class IndexView(BaseView, TemplateView):
+    page_title = _('Home/Balance')
+    page_name = 'index'
+    template_name = 'SharixAdmin/main.html'
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        ph_num = str(self.request.user.phone_number)
+        convert_ph_num = f"+{ph_num[:1]} ({ph_num[1:4]}) {ph_num[4:7]}-{ph_num[7:9]}-{ph_num[9:11]}"
+
+        context.update({
+            'phone': convert_ph_num,
+        })
+
+        return context

+ 73 - 0
SharixAdmin/views/partner.py

@@ -0,0 +1,73 @@
+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
+from django.utils.translation import gettext as _
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.contrib import messages
+from django.db import transaction
+
+from dbsynce.models import Company, Documents
+from SharixAdmin.forms import CompanyForm
+from SharixAdmin.utils import create_ticket_partner_activation
+
+from .base import BaseView
+
+
+class PartnerDetailView(UserPassesTestMixin, BaseView, DetailView):
+    model = Company
+    template_name = 'SharixAdmin/partner.html'
+    context_object_name = 'company'
+
+    page_title = _('О партнере')
+    page_name = 'partner'
+
+    # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
+    def test_func(self):
+        return self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+
+    def get_object(self, queryset=None):
+        return get_object_or_404(Company, repr_id=self.request.user)
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            "company_documents": Documents.parse_requirements(self.object.requirements)
+        }) 
+        return context
+    
+
+
+class PartnerEditView(UserPassesTestMixin, BaseView, FormView):
+    template_name = 'SharixAdmin/partner_edit.html'
+    form_class = CompanyForm
+    success_url = reverse_lazy('partner_detail')
+
+    page_title = _('Изменение данных партнера')
+    page_name = 'partner'
+
+    # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
+    def test_func(self):
+        return self.request.user.groups.filter(name='PARTNER-ADMIN').exists()
+
+    def get_form_kwargs(self):
+        kwargs = super().get_form_kwargs()
+        kwargs['instance'] = get_object_or_404(Company, repr_id=self.request.user)
+        return kwargs
+
+    def form_valid(self, form):
+        with transaction.atomic():
+            # Сохраняем изменения
+            form.save()
+
+            # Получаем текущий объект компании и деактивируем ее
+            current_company = form.instance
+            current_company.deactivate()
+
+            # Выполняем пересоздание тикета на активацию партнера
+            current_company.ticket_status.archive()
+            create_ticket_partner_activation(self.request.user, current_company)
+
+        # Отправляем пользователю уведомление на страницу о успехе операции
+        messages.success(self.request, 'Данные успешно изменены и теперь проходят проверку!')
+        return super().form_valid(form)

+ 2 - 66
SharixAdmin/views/partner_info.py

@@ -1,6 +1,6 @@
 from django.shortcuts import render
 from django.shortcuts import render
 from SharixAdmin.forms import PartnerInformationCreateForm, PartnerInformationUpdateForm
 from SharixAdmin.forms import PartnerInformationCreateForm, PartnerInformationUpdateForm
-from SharixAdmin.groups import group_required
+from SharixAdmin.utils import group_required
 from dbsynce.models import Company
 from dbsynce.models import Company
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.views.generic.edit import UpdateView, CreateView
 from django.views.generic.edit import UpdateView, CreateView
@@ -106,68 +106,4 @@ class PartnerInformationUpdateView(UserPassesTestMixin, UpdateView):
         group_names = ('PARTNER-ADMIN')
         group_names = ('PARTNER-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True
             return True
-        return False
-
-class PartnerInfoView(UserPassesTestMixin, UpdateView):
-    model = Company
-    form_class = PartnerInformationUpdateForm
-    template_name = "SharixAdmin/partner_information_form.html"
-
-    def get_context_data(self, **kwargs):
-        # Проверяем, был ли ранее создан объект Company текущим пользователем
-        if self.request.user.is_authenticated:
-            company = Company.objects.filter(repr_id=self.request.user).first()
-            if company:
-                context['object'] = company
-            
-        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']):
-            new_ticket = {
-            "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))
-            self.object.status = "deactivate"
-            responce = super().form_valid(form)
-            return responce
-        else:
-            return super().form_valid(form)
-
-    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
-
-
-def partner_information(request):
-    context = get_context(request, {
-        'title':_('Partner Information'),
-        })
-    
-    return render(request, 'SharixAdmin/partner_information.html', context)
+        return False

+ 7 - 5
SharixAdmin/views/partners.py

@@ -1,14 +1,18 @@
 from django_tables2 import SingleTableView
 from django_tables2 import SingleTableView
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib.auth.mixins import UserPassesTestMixin
-from SharixAdmin.groups import group_required
+from SharixAdmin.utils import group_required
 from SharixAdmin.tables import PartnersTable
 from SharixAdmin.tables import PartnersTable
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.decorators import login_required
 from dbsynce.models import Company
 from dbsynce.models import Company
 from django.http import JsonResponse
 from django.http import JsonResponse
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from .base import BaseView
 
 
-class PartnersListView(UserPassesTestMixin, SingleTableView):
+
+class PartnersListView(UserPassesTestMixin, BaseView, SingleTableView):
+    page_title = _('Partners')
+    page_name = 'partners'
     table_class = PartnersTable
     table_class = PartnersTable
     queryset = Company.objects.all()
     queryset = Company.objects.all()
     template_name = 'SharixAdmin/partners.html'
     template_name = 'SharixAdmin/partners.html'
@@ -16,13 +20,11 @@ class PartnersListView(UserPassesTestMixin, SingleTableView):
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
-            'title': _('Partners'),
             'object_list': context['object_list'],
             'object_list': context['object_list'],
-            'current_page': "partners"
         })
         })
         return context
         return context
     
     
-    def test_func(self) -> bool or None:
+    def test_func(self):
         group_names = ('METASERVICE-ADMIN')
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True
             return True

+ 8 - 7
SharixAdmin/views/payment.py

@@ -1,9 +1,10 @@
-from django.shortcuts import render
+from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
-def paymentView(request):
-    context = {
-        'title':_('Оплата'),
-        'current_page': 'payment'
-    }
-    return render(request, "SharixAdmin/test.html", context)
+from .base import BaseView
+
+
+class PaymentView(BaseView, TemplateView):
+    page_title = _('Оплата')
+    page_name = 'payment'
+    template_name = 'SharixAdmin/payment.html'

+ 1 - 1
SharixAdmin/views/provider.py

@@ -1,5 +1,5 @@
 from django_tables2 import SingleTableView
 from django_tables2 import SingleTableView
-from SharixAdmin.groups import group_required
+from SharixAdmin.utils import group_required
 from SharixAdmin.tables import ProviderTable
 from SharixAdmin.tables import ProviderTable
 from dbsynce.models import Provider
 from dbsynce.models import Provider
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.decorators import login_required

+ 1 - 1
SharixAdmin/views/resource.py

@@ -1,6 +1,6 @@
 from django_tables2 import SingleTableView
 from django_tables2 import SingleTableView
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib.auth.mixins import UserPassesTestMixin
-from SharixAdmin.groups import group_required
+from SharixAdmin.utils import group_required
 from SharixAdmin.tables import ResourceTable
 from SharixAdmin.tables import ResourceTable
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.decorators import login_required
 from dbsynce.models import Resource
 from dbsynce.models import Resource

+ 1 - 1
SharixAdmin/views/service.py

@@ -1,5 +1,5 @@
 from django_tables2 import SingleTableView
 from django_tables2 import SingleTableView
-from SharixAdmin.groups import group_required
+from SharixAdmin.utils import group_required
 from SharixAdmin.tables import ServiceTable
 from SharixAdmin.tables import ServiceTable
 from dbsynce.models import Service
 from dbsynce.models import Service
 from django.contrib.auth.decorators import login_required
 from django.contrib.auth.decorators import login_required

+ 9 - 11
SharixAdmin/views/service_type.py

@@ -7,9 +7,12 @@ from dbsynce.models import ServiceType
 from django.urls import reverse
 from django.urls import reverse
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
+from .base import BaseView
+
     
     
-    
-class ServiceTypeCreate(UserPassesTestMixin, CreateView):
+class ServiceTypeCreate(UserPassesTestMixin, BaseView, CreateView):
+    page_title = _('Услуги сервиса')
+    page_name = 'service_type'
     model = ServiceType
     model = ServiceType
     form_class = ServiceTypeCreateForm
     form_class = ServiceTypeCreateForm
     template_name = "SharixAdmin/service_type_form.html"
     template_name = "SharixAdmin/service_type_form.html"
@@ -17,9 +20,7 @@ class ServiceTypeCreate(UserPassesTestMixin, CreateView):
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
-            'title': _('Услуги сервиса'),
             'object': self.object,
             'object': self.object,
-            "current_page": "service_type"
         })
         })
         return context
         return context
     
     
@@ -32,12 +33,10 @@ class ServiceTypeCreate(UserPassesTestMixin, CreateView):
             return True
             return True
         return False
         return False
     
     
-    
-    
 
 
-    
-
-class ServiceTypeListView(UserPassesTestMixin, SingleTableView):
+class ServiceTypeListView(UserPassesTestMixin, BaseView, SingleTableView):
+    page_title = _('Услуги сервиса')
+    page_name = 'service_type'
     table_class = ServiceTypeTable
     table_class = ServiceTypeTable
     queryset = ServiceType.objects.all()
     queryset = ServiceType.objects.all()
     template_name = 'SharixAdmin/service_type.html'
     template_name = 'SharixAdmin/service_type.html'
@@ -45,9 +44,7 @@ class ServiceTypeListView(UserPassesTestMixin, SingleTableView):
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
-            'title': 'Услуги сервиса',
             'object_list': context['object_list'],
             'object_list': context['object_list'],
-            "current_page": "service_type"
         })
         })
         return context
         return context
     
     
@@ -61,6 +58,7 @@ class ServiceTypeListView(UserPassesTestMixin, SingleTableView):
             return True
             return True
         return False
         return False
 
 
+
 class ServiceTypeUpdateView(UserPassesTestMixin, UpdateView):
 class ServiceTypeUpdateView(UserPassesTestMixin, UpdateView):
     model = ServiceType
     model = ServiceType
     form_class = ServiceTypeCreateForm
     form_class = ServiceTypeCreateForm

+ 8 - 11
SharixAdmin/views/transactions.py

@@ -1,13 +1,10 @@
-from django.contrib.auth.decorators import login_required
-from django.shortcuts import render
+from django.views.generic import TemplateView
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
-@login_required
-def transactions(request):
-    
-    context = {
-        'title':_('Payment history'),
-        'current_page': 'transactions'
-    }
-        
-    return render(request, 'SharixAdmin/transactions.html', context)
+from .base import BaseView
+
+
+class TransactionsView(BaseView, TemplateView):
+    page_title = _('Payment history')
+    page_name = 'transactions'
+    template_name = 'SharixAdmin/transactions.html'

+ 2 - 4
requirements.txt

@@ -35,7 +35,7 @@ MarkupSafe==2.1.2
 oauthlib==3.2.2
 oauthlib==3.2.2
 packaging==23.0
 packaging==23.0
 promise==2.3
 promise==2.3
-psycopg2-binary==2.9.5
+psycopg2-binary
 pycparser==2.21
 pycparser==2.21
 pydot==1.4.2
 pydot==1.4.2
 PyJWT==2.6.0
 PyJWT==2.6.0
@@ -44,8 +44,6 @@ python3-openid==3.2.0
 pytz==2022.7.1
 pytz==2022.7.1
 requests==2.28.2
 requests==2.28.2
 requests-oauthlib==1.3.1
 requests-oauthlib==1.3.1
-ruamel.yaml==0.17.21
-ruamel.yaml.clib==0.2.7
 six==1.16.0
 six==1.16.0
 social-auth-app-django==4.0.0
 social-auth-app-django==4.0.0
 social-auth-core==4.3.0
 social-auth-core==4.3.0
@@ -57,4 +55,4 @@ urllib3==1.26.14
 webencodings==0.5.1
 webencodings==0.5.1
 xmpppy==0.7.1
 xmpppy==0.7.1
 django-ckeditor
 django-ckeditor
-pillow
+pillow

Some files were not shown because too many files changed in this diff