Browse Source

Users who are members of a group PARTNER-ADMIN can visit the "About Partner" page

- Reference to AuthAPI in README.md removed
- Fixed some views, simplified logic
- Broken links are commented out in templates to make the system work cleaner
- Fixed layout of some templates
TonyKurts 6 months ago
parent
commit
c7401f5be4

+ 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.
 
-## 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 
 
 To start the web application, run *bin/start.sh*.

+ 24 - 6
SharixAdmin/templates/SharixAdmin/index.html

@@ -86,12 +86,12 @@
                   {% else %}
                     {% static 'SharixAdmin/img/menu/handshake.svg' %}
                   {% endif %}">
-              <span class="menu-bar-label">Сотрудничество {{ is_partner_admin }}</span>
+              <span class="menu-bar-label">Сотрудничество</span>
             </div>
           </a>
         </li>
       {% endif %}
-      <li class="nav-item">
+      {% comment %} <li class="nav-item">
         <a href="{% url 'user_information' %}" class="nav-link {% if current_page == "none" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
             <img
@@ -105,7 +105,7 @@
             <span class="menu-bar-label">Управление правами</span>
           </div>
         </a>
-      </li>
+      </li> {% endcomment %}
       <li class="nav-item">
         <a href="{% url 'service_type' %}" class="nav-link {% if current_page == "service_type" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
@@ -122,7 +122,7 @@
         </a>
       </li>
       <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">
             <img
               class="nav-img"
@@ -136,7 +136,24 @@
           </div>
         </a>
       </li>
-      <li class="nav-item">
+      {% if is_partner_admin %}
+        <li class="nav-item">
+          <a href="{% url 'partner' %}" 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">
         <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">
             <img
@@ -150,7 +167,7 @@
             <span class="menu-bar-label">Информация о сервисе</span>
           </div>
         </a>
-      </li>
+      </li> {% endcomment %}
       <li class="nav-item">
         <a href="{% url 'payment' %}" class="nav-link {% if current_page == "payment" %}active rounded{% endif %}">
           <div class="link d-flex align-items-center">
@@ -170,6 +187,7 @@
   </nav>
 
   <div id="user-workspace" class="p-5 border rounded box-shadow">
+      <h1 class="mainHeader">{{ title }}</h1>
       {% block contenthome %}{% endblock contenthome%}
   </div>
 

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

@@ -2,7 +2,6 @@
 {% load i18n %}
 
 {% block contenthome %}
-<h1 class="mainHeader">{{ title }}</h1>
 <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
     Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>    
 <div class="container" style="padding: 2px;">

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

@@ -0,0 +1,9 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<p class="description_service">
+    Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
+    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете
+</p>
+{% endblock contenthome %}

+ 29 - 34
SharixAdmin/templates/SharixAdmin/partners.html

@@ -2,40 +2,35 @@
 {% load render_table from django_tables2 %}
 
 {% block contenthome %}
-<div class="container">
-    <h1 class="mainHeader">{{ title }}</h1>
-    <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
-      Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
+  <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
+    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</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);
-          }
-        });
+  <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>    
-
-    
+    });
+  </script> 
 {% endblock contenthome %}

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

@@ -2,8 +2,6 @@
 {% load i18n %}
 
 {% block contenthome %}
-<div class="container">
-    <h1 class="mainHeader">{{ title }}</h1>
     <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
   Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
 

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

@@ -2,8 +2,6 @@
 {% load i18n %}
 
 {% block contenthome %}
-<div class="container">
-    <h1 class="mainHeader">{{ title }}</h1>
     <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
   Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
 

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

@@ -14,7 +14,6 @@
   }
 </style>
 
-<h1 class="mainHeader">{{ title }}</h1>
 <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
         Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
       <div class="row justify-content-start">

+ 10 - 13
SharixAdmin/templates/SharixAdmin/transactions.html

@@ -3,18 +3,15 @@
 {% load i18n %}
 
 {% block contenthome %}
-<div class="container">
-    <h1 class="mainHeader">{{ title }}</h1>
-    <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
-      Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
-    <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>
+  <p class="description_service">Это система управления государством, источником власти в которой является сам народ. Именно народ решает, какие законы и нормы необходимы для гармоничного существования и развития государства. Таким образом, каждый человек в демократическом обществе 
+    Получает определенный набор свобод и обязательств сформированных с учетом интересов всего сообщества. Исходя из вышесказанного, можно заключить, что демократия – это возможность для каждого человека свободно участвовать в непосредственном управлении своим государством, обществом и личной судьбой в конечном счете.</p>
+  <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 %} 
 

+ 12 - 13
SharixAdmin/urls.py

@@ -12,14 +12,19 @@ router.register(r'sharix-users', SharixUserMVS)
 router.register(r'group', GroupMVS)
 
 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(PartnerView.as_view()), name='partner'),
+
+
     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('logout/', logout_view, name='logoutweb'),
     path('balance/', balance, name='balance'),
-    path('payment/', login_required(paymentView), name='payment'),
    
     path('partners/', login_required(PartnersListView.as_view()), name='partners'),
     path('partners/change_status/', change_partners_status, name='partners/change_status'),
@@ -30,12 +35,6 @@ urlpatterns = [
     path('provider/', login_required(ProviderListView.as_view()), name='provider'),
     path('provider/change_status/', change_provider_status, name='provider/change_status'),
 
-    # Запрос на подключение к сервису
-    path('cooperate/', login_required(CooperateView.as_view()), name="cooperate"),
-    
-    # Страница пользователя с группой PARTNER-ADMIN
-    
-
     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/'),
@@ -51,9 +50,9 @@ urlpatterns = [
     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'),
 

+ 8 - 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 .partner import *
 from .service_type import *
 from .service_tariff import *
 from .service_info import *
@@ -11,8 +11,8 @@ from .partner_info import *
 from .provider import *
 from .login import *
 from .cooperate import *
-from .payment import paymentView
-from .balance import balance
-from .trans_id import trans_id
-from .schema import schema_v3
-from .user_info import UserListView
+from .payment import *
+from .balance import *
+from .trans_id import *
+from .schema import *
+from .user_info 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

+ 18 - 14
SharixAdmin/views/index.py

@@ -1,18 +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 .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',
-        "is_partner_admin": request.user.groups.filter(name='PARTNER-ADMIN').exists()
-    }
-    
-    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

+ 15 - 0
SharixAdmin/views/partner.py

@@ -0,0 +1,15 @@
+from django.views.generic import TemplateView
+from django.utils.translation import gettext as _
+from django.contrib.auth.mixins import UserPassesTestMixin
+
+from .base import BaseView
+
+
+class PartnerView(UserPassesTestMixin, BaseView, TemplateView):
+    page_title = _('О партнере')
+    page_name = 'partner'
+    template_name = 'SharixAdmin/partner.html'
+
+    # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
+    def test_func(self):
+        return self.request.user.groups.filter(name='PARTNER-ADMIN').exists()

+ 1 - 65
SharixAdmin/views/partner_info.py

@@ -106,68 +106,4 @@ class PartnerInformationUpdateView(UserPassesTestMixin, UpdateView):
         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 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

+ 6 - 4
SharixAdmin/views/partners.py

@@ -7,8 +7,12 @@ from dbsynce.models import Company
 from django.http import JsonResponse
 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
     queryset = Company.objects.all()
     template_name = 'SharixAdmin/partners.html'
@@ -16,13 +20,11 @@ class PartnersListView(UserPassesTestMixin, SingleTableView):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
-            'title': _('Partners'),
             'object_list': context['object_list'],
-            'current_page': "partners"
         })
         return context
     
-    def test_func(self) -> bool or None:
+    def test_func(self):
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True

+ 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 _
 
-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'

+ 9 - 11
SharixAdmin/views/service_type.py

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