Browse Source

sketch for menu generation

ShariX Developer 1 day ago
parent
commit
16e9c31807

+ 1 - 0
sharix_admin/lib/__init__.py

@@ -0,0 +1 @@
+from .menu import *

+ 212 - 0
sharix_admin/lib/menu.py

@@ -0,0 +1,212 @@
+#import from webservice_running.menu WEBSERVICE_RUNNING_MENU
+
+#TODO - user profile connected to platform
+#ALL_MY = ['tickets', 'main']
+ALL_ALL = ['service_categories', 'service_tariffs', 'support_chat', 'job_request_metaservice']
+
+#Same idea as vvv, maybe some custom pages for example for reports later 
+METASERVICE_ADMIN_ALL = ['partners', 'orders', 'access_control', 'resources', 'providers']
+#note: delete 'delete' operation from urlpatterns! Question - should be edit and change status apart or not?
+METASERVICE_ADMIN_OPERATIONS = ['service_category/add', 'service_category/edit', 'service_category/change_status']
+#TODO - page to add money to client balance manually based on manual b2b payments! And add logic connected to platform if possible later. 2 balances - platform and manual local.
+#Add pages similar to platform's for payment reports for manual payments.
+
+METASERVICE_SUPERVISOR_ALL = ['partners', 'resources', 'providers', 'orders', 'access_control']
+
+METASERVICE_SUPPORT_ALL = ['partners', 'resources', 'providers', 'orders', 'orders/edit']
+METASERVICE_TECHSUPPORT_ALL = ['partners', 'resources', 'providers']
+
+#LOCAL - same idea except access_control that is only in open by default
+PARTNER_ADMIN_MY = ['resources', 'providers', 'access_control']
+PARTNER_ADMIN_OPERATIONS = ['service_tariff/add', 'service_tariff/edit', 'service_tariff/change_status']
+
+PARTNER_SUPERVISOR_MY = ['resources', 'providers', 'access_control']
+
+PARTNER_SUPPORT_MY = ['resources', 'providers', 'orders', 'orders/edit']
+PARTNER_TECHSUPPORT_MY = ['resources', 'providers']
+
+#LOCAL - same idea +local
+#CHECK Documentation - it seems provider should be able to add service_tariffs that he want to appy to himself based on partner's restrictions
+#order change_status or edit - based on handlers logic. Provider should be able to tell system he wants to process the order or customize it
+PROVIDER_MY_OPERATIONS = ['resource/add', 'resource/edit', 'resource', 'order/change_status']
+PROVIDER_MY = ['resources', 'orders']
+#on partners page provider might make a connection with another partner - does that mean PARTNERS list should be in ALL category?
+
+CLIENT_MY = ['order', 'orders']
+CLIENT_MY_OPERATIONS = ['order/edit', 'order/add']
+#TODO should be something for transactions
+
+######################
+# WEBSERVICE_RUNNING #
+######################
+
+WSR_ALL = ['serivce_tariff_local']
+
+#TODO - providers+resources on map
+WSR_CLIENT_MY = ['order_local', 'orders_local', 'frequent_address', 'favorite_contacts', 'preferred_providers']
+WSR_MENU_CLIENT_MY_OPERATIONS = ['order_local/add']
+WSR_NOT_MENU_CLIENT_MY_OPERATIONS = ['order_local/edit', 'frequent_address/add', 'frequent_address/edit', 'frequent_address/del', 'favorite_contacts/add', 'favorite_contacts/edit', 'favorite_contacts/del', 'preferred_providers/add', 'preferred_providers/edit', 'preferred_providers_del']
+
+
+#Idea - Menu categories
+
+#GLOBAL_MENU - same for all users, info on forms may vary according to roles, but view is one for all
+#MENU_GLOBAL = ['service_categories', 'support_chat', 'job_request_metaservice']
+MENU_GLOBAL = ['tickets:ticket_list_list', 'sharix_admin:service_categories', 'sharix_admin:support_chat', 'sharix_admin:job_request_metaservice']
+#MENU_GLOBAL = ['tickets', 'service_categories', 'support_chat', 'job_request_metaservice']
+MENU_OPEN = ['sharix_admin:main', 'sharix_admin:service_tariffs']
+#MENU_OPEN = ['main', 'service_tariffs']
+
+#Thus menu points for all staff roles is the same
+STAFF_METASERVICE_MENU_GLOBAL = ['sharix_admin:access_control', 'sharix_admin:partners']
+#STAFF_METASERVICE_MENU_GLOBAL = ['access_control', 'partners']
+STAFF_METASERVICE_MENU_OPEN = ['sharix_admin:resources', 'sharix_admin:providers', 'sharix_admin:orders']
+#STAFF_METASERVICE_MENU_OPEN = ['resources', 'providers', 'orders']
+#Another set of pages that lists only MY PARTNER objects - needed for the situation for users with multiple roles. For each Partner connection - same set of pages, maybe it's good idea to hide it
+STAFF_MY_PARTNER_MENU_GLOBAL = ['sharix_admin:access_control', 'sharix_admin:partners']
+#STAFF_MY_PARTNER_MENU_GLOBAL = ['access_control', 'partners']
+STAFF_MY_PARTNER_MENU_OPEN = ['sharix_admin:resources', 'sharix_admin:providers', 'sharix_admin:orders']
+#STAFF_MY_PARTNER_MENU_OPEN = ['resources', 'providers', 'orders']
+
+STAFF_MY_PROVIDER_MENU_OPEN = ['sharix_admin:resources', 'sharix_admin:orders']
+#STAFF_MY_PROVIDER_MENU_OPEN = ['resources', 'orders']
+
+CLIENT_MY_MENU_GLOBAL = ['sharix_admin:transactions']
+#CLIENT_MY_MENU_GLOBAL = ['transactions']
+CLIENT_MY_MENU_OPEN = ['sharix_admin:orders']
+#CLIENT_MY_MENU_OPEN = ['orders']
+
+#WEBSERVICE_RUNNING_MENU
+MENU_GLOBAL_CUSTOMIZABLE = ['main_local', 'service_tariffs_local']
+STAFF_METASERVICE_MENU_CUSTOMIZABLE = ['resources_local', 'providers_local', 'orders_local' ]
+STAFF_MY_PARTNER_MENU_CUSTOMIZABLE = ['resources_local', 'providers_local', 'orders_local']
+STAFF_MY_PROVIDER_MENU_CUSTOMIZABLE = ['resources_local', 'orders_local']
+CLIENT_MY_MENU_CUSTOMIZABLE = ['order_local', 'orders_local']
+
+#CUSTOM PAGES
+WSR_EXTENDED_MY = ['frequent_address', 'frequent_contacts', 'preferred_providers']
+WSR_EXTENDED = []
+#TODO - providers+resources on map (NOT MY, GLOBAL or MY meant by geolocation+preferences)
+
+#3 variants to show customizable pages, it depends on settings of a project ALL (PURE), ALL + CUSTOMIZABLE (REPLACE) replaced, ALL + CUSTOMIZABLE added (APPEND)
+#function to check if menu should be visible:
+# function that get roles by userid
+
+STAFF_METASERVICE_ROLES = ['METASERVICE_ADMIN', 'METASERVICE_SUPERVISOR', 'METASERVICE_SUPPORT', 'METASERVICE_TECHSUPPORT']
+STAFF_PARTNER_ROLES = ['PARTNER_ADMIN', 'PARTNER_SUPERVISOR', 'PARTNER_SUPPORT', 'PARTNER_TECHSUPPORT', 'PROVIDER']
+CLIENT_ROLES = ['CLIENT']
+
+#if user role in list provided and page name in a connected list then menu item is visible
+#so we have to know user_id and page type and MENU_ALG algorythm
+
+MENU_ALG = 'PURE'
+global MENU_VISIBLE_PAGES
+MENU_VISIBLE_PAGES = []
+
+if MENU_ALG == 'PURE':
+    MENU_VISIBLE_PAGES = []
+    MENU_VISIBLE_PAGES.extend(MENU_GLOBAL)
+    MENU_VISIBLE_PAGES.extend(MENU_OPEN)
+    
+if MENU_ALG == 'REPLACE':
+    MENU_VISIBLE_PAGES = []
+    MENU_VISIBLE_PAGES.extend(MENU_GLOBAL)
+    MENU_VISIBLE_PAGES.extend(MENU_GLOBAL_CUSTOMIZABLE)
+    
+if MENU_ALG == 'APPEND':
+    MENU_VISIBLE_PAGES = []
+    MENU_VISIBLE_PAGES.extend(MENU_GLOBAL)
+    MENU_VISIBLE_PAGES.extend(MENU_GLOBAL_CUSTOMIZABLE)
+    MENU_VISIBLE_PAGES.extend(MENU_OPEN)
+
+#TODO - change menu template to FOR loop with parameters - name, link, icon
+# menu structure should base on config file with menu structure as settings
+
+#MENU_SCHEME_OPEN = [
+#        'main',
+#    'service_categories',
+#    'service_tariffs',
+#    'partners',
+#    'resources',
+#    'providers',
+#    'orders',
+#    'access_control',
+#    'tickets',
+#    'support_chat',
+#    'job_request_metaservice',
+#    ]
+
+#TODO - move to WSR! And add MENU_ALG setting to project settings!
+#MENU_SCHEME_WSR = [
+#    'main_local',
+#    'service_categories',
+#    'partners',
+#    'resources_local',
+#    'providers_local',
+#    'orders_local',
+#    'access_control',
+#    'tickets',
+#    'support_chat',
+#    'job_request_metaservice',
+#    ]
+
+def gen_avaliable_pages(roles):
+#any(x in role for x in STAFF_METASERVICE_ROLES):
+    global MENU_VISIBLE_PAGES
+    if any(x in roles for x in STAFF_METASERVICE_ROLES):
+
+        if MENU_ALG == 'PURE':
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_OPEN)
+
+        if MENU_ALG == 'REPLACE':
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_CUSTOMIZABLE)
+        if MENU_ALG == 'APPEND':
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(STAFF_METASERVICE_MENU_OPEN)
+
+    if any(x in roles for x in STAFF_PARTNER_ROLES):
+#if role in STAFF_PARTNER_ROLES:
+
+        if MENU_ALG == 'PURE':
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_OPEN)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PROVIDER_MENU_OPEN)
+
+        if MENU_ALG == 'REPLACE':
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PROVIDER_MENU_CUSTOMIZABLE)
+
+        if MENU_ALG == 'APPEND':
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PARTNER_MENU_OPEN)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PROVIDER_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(STAFF_MY_PROVIDER_MENU_OPEN)
+
+    if any(x in roles for x in CLIENT_ROLES):
+#if role in CLIENT_ROLES:
+        if MENU_ALG == 'PURE':
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_OPEN)
+    
+        if MENU_ALG == 'REPLACE':
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(WSR_EXTENDED)
+            MENU_VISIBLE_PAGES.extend(WSR_EXTENDED_MY)
+
+        if MENU_ALG == 'APPEND':
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_GLOBAL)
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_CUSTOMIZABLE)
+            MENU_VISIBLE_PAGES.extend(CLIENT_MY_MENU_OPEN)
+            MENU_VISIBLE_PAGES.extend(WSR_EXTENDED)
+            MENU_VISIBLE_PAGES.extend(WSR_EXTENDED_MY)
+
+#MAYBE REMOVE DUPLICATES?
+    MENU_VISIBLE_PAGES = list(dict.fromkeys(MENU_VISIBLE_PAGES))
+    return MENU_VISIBLE_PAGES
+

+ 480 - 0
sharix_admin/templates/sharix_admin/base_admin_menu.html

@@ -0,0 +1,480 @@
+{% extends 'sharix_admin/base.html' %}
+{% load i18n %}
+{% load static %}
+
+{% block content %}
+<div id="loader-wrapper">
+  <div id="loader"></div>
+</div>
+
+<div class="content p-4 mx-auto d-flex flex-column justify-content-between">
+  <nav id="menu-bar">
+    <button class="bg-white border box-shadow rounded mb-2 px-4 py-1" onclick="menuBarSwitch()">
+        <img id="menu-bar-img-arrow" src="{% static 'sharix_admin/img/menu/arrow-right.svg' %}">
+    </button>
+
+    <ul class="d-flex flex-column nav nav-pills rounded box-shadow border p-2 bg-white">
+      
+    {% for page in avaliable_pages %}
+    <li class="nav-item">
+	    <a href="{% url page %}" class="nav-link {% if current_page == "{{ page }}" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "main" %}
+                  {% static 'sharix_admin/img/menu/house_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/house.svg' %}
+                {% endif %}">
+	    <span class="menu-bar-label">{{ page }}</span>
+          </div>
+        </a>
+      </li>
+      {% endfor %}
+
+
+      <li class="nav-item">
+        <a href="{% url 'tickets:ticket_list_list' %}" class="nav-link {% if current_page == "tickets" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "tickets" %}
+                  {% static 'sharix_admin/img/menu/tickets_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/tickets.svg' %}
+                {% endif %}"> 
+            <span class="menu-bar-label">Заявки</span>
+          </div>
+        </a>
+      </li>
+      <li class="nav-item">
+        <a href="http://study.reversea.net/" class="nav-link {% if current_page == "education" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "education" %}
+                  {% static 'sharix_admin/img/menu/education_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/education.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Курсы</span>
+          </div>
+        </a>
+      </li>
+
+      <!-- STAFF MENU-->
+      <!-- METASERVICE ADMIN OPEN SPECIFIC MENU -->
+
+      {% if "METASERVICE-ADMIN" in user_groups %}
+
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:service_categories' %}" class="nav-link {% if current_page == "service_categories" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "service_categories" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Категории услуг</span>
+          </div>
+        </a>
+      </li>
+
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:service_category/add/' %}" class="nav-link {% if current_page == "service_category/add/" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "service_category/add/" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Добавить категорию услуг</span>
+          </div>
+        </a>
+      </li>
+
+      <!-- TODO - add metaservice supervisor to viewers -->
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:service_tariffs' %}" class="nav-link {% if current_page == "service_tariffs" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "service_tariffs" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Тарифы услуг</span>
+          </div>
+        </a>
+      </li>
+
+      <!-- TODO - add metaservice supervisor to viewers maybe without duplication -->
+      <li class="nav-item">
+        <a href="{% url "sharix_admin:partners" %}" class="nav-link {% if current_page == "partners" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "partners" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Партнеры</span>
+          </div>
+        </a>
+      </li>
+
+            <!-- TODO: Управление правами ADD ALSO CHECK FOR SUPERVISOR-->
+        <a href="{% url 'sharix_admin:access_control' %}" class="nav-link {% if current_page == "access_control" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "access_control" %}
+                  {% static 'sharix_admin/img/menu/hdd-network_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/hdd-network.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Управление правами</span>
+          </div>
+        </a>
+      </li>
+
+      {% endif %}
+
+
+      <!-- METASERVICE SUPERVISOR MENU BLOCK -->
+      {% if "METASERVICE-SUPERVISOR" in user_groups %}
+      <li class="nav-item">
+        <a href="{% url "sharix_admin:partners" %}" class="nav-link {% if current_page == "partners" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "partners" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Партнеры</span>
+          </div>
+        </a>
+      </li>
+
+      <li class="nav-item">
+        <a href="{% url "sharix_admin:resources" %}" class="nav-link {% if current_page == "resources" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "resources" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Ресурсы</span>
+          </div>
+        </a>
+      </li>
+
+      <li class="nav-item">
+        <a href="{% url "sharix_admin:providers" %}" class="nav-link {% if current_page == "providers" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "providers" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Исполнители</span>
+          </div>
+        </a>
+      </li>
+
+      <!-- PARTNER-ADMIN menu block TODO - add customization to list views -->
+
+      <li class="nav-item">
+        <a href="{% url "sharix_admin:resources" %}" class="nav-link {% if current_page == "resources" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "resources" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Мои Ресурсы</span>
+          </div>
+        </a>
+      </li>
+
+       <li class="nav-item">
+        <a href="{% url 'sharix_admin:resource/add/' %}" class="nav-link {% if current_page == "resource/add/" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "resource/add/" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Добавить ресурс</span>
+          </div>
+        </a>
+      </li>
+
+       <li class="nav-item">
+        <a href="{% url "sharix_admin:providers" %}" class="nav-link {% if current_page == "providers" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "providers" %}
+                  {% static 'sharix_admin/img/menu/people_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/people.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Мои Исполнители</span>
+          </div>
+        </a>
+      </li>
+
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:provider/add/' %}" class="nav-link {% if current_page == "provider/add/" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "provider/add/" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Добавить Исполнителя</span>
+          </div>
+        </a>
+      </li>
+      {% endif %}
+
+
+      <!-- COOPERATE BLOCK -->
+      {% if not "PARTNER-ADMIN" in user_groups %}
+        <li class="nav-item">
+          <a href="{% url "sharix_admin:cooperate_request" %}" class="nav-link {% if current_page == "cooperate_request" %}active rounded{% endif %}">
+            <div class="link d-flex align-items-center">
+              <img
+                class="nav-img"
+                src="
+                  {% if current_page == "cooperate_request" %}
+                    {% static 'sharix_admin/img/menu/handshake_w.svg' %}
+                  {% else %}
+                    {% static 'sharix_admin/img/menu/handshake.svg' %}
+                  {% endif %}">
+              <span class="menu-bar-label">Стать партнером</span>
+            </div>
+          </a>
+        </li>
+      {% endif %}
+
+        <li class="nav-item">
+          <a href="{% url "sharix_admin:job_request_metaservice" %}" class="nav-link {% if current_page == "job_request_metaservice" %}active rounded{% endif %}">
+            <div class="link d-flex align-items-center">
+              <img
+                class="nav-img"
+                src="
+                  {% if current_page == "job_request_metaservice" %}
+                    {% static 'sharix_admin/img/menu/handshake_w.svg' %}
+                  {% else %}
+                    {% static 'sharix_admin/img/menu/handshake.svg' %}
+                  {% endif %}">
+              <span class="menu-bar-label">Работа в Сервисе</span>
+            </div>
+          </a>
+        </li>
+      {% comment %} <li class="nav-item">
+        <a href="{% url 'sharix_admin:user_information' %}" class="nav-link {% if current_page == "none" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "none" %}
+                  {% static 'sharix_admin/img/menu/hdd-network_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/hdd-network.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Управление правами</span>
+          </div>
+        </a>
+      </li> {% endcomment %}
+
+      {% comment %}
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:service_category' %}" class="nav-link {% if current_page == "service_category" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "service_category" %}
+                  {% static 'sharix_admin/img/menu/briefcase_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/briefcase.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Услуги сервиса</span>
+          </div>
+        </a>
+      </li> {% endcomment %}
+      {% comment %} <li class="nav-item">
+        <a href="{% url 'sharix_admin:transactions' %}" class="nav-link {% if current_page == "transactions" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "transactions" %}
+                  {% static 'sharix_admin/img/menu/clock-history_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/clock-history.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">История заказов</span>
+          </div>
+        </a>
+      </li> {% endcomment %}
+      {% if "PARTNER-ADMIN" in user_groups %}
+        <li class="nav-item">
+          <a href="{% url 'sharix_admin:partner_detail_my' %}" 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 'sharix_admin/img/menu/person_w.svg' %}
+                  {% else %}
+                    {% static 'sharix_admin/img/menu/person.svg' %}
+                  {% endif %}">
+              <span class="menu-bar-label">О партнере</span>
+            </div>
+          </a>
+        </li>
+      {% endif %}
+      {% comment %} <li class="nav-item">
+        <a href="{% url 'sharix_admin:service_information-add' %}" class="nav-link {% if current_page == "service_info" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "service_info" %}
+                  {% static 'sharix_admin/img/menu/person_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/person.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Информация о сервисе</span>
+          </div>
+        </a>
+      </li> {% endcomment %}
+      {% comment %} <li class="nav-item">
+        <a href="{% url 'sharix_admin:payment' %}" class="nav-link {% if current_page == "payment" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "payment" %}
+                  {% static 'sharix_admin/img/menu/credit-card_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/credit-card.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Реквизиты</span>
+          </div>
+        </a>
+      </li> {% endcomment %}
+
+
+      <!-- Converse integration -->
+      <li class="nav-item">
+        <a href="{% url 'sharix_admin:support_chat' %}" class="nav-link {% if current_page == "support_chat" %}active rounded{% endif %}">
+          <div class="link d-flex align-items-center">
+            <img
+              class="nav-img"
+              src="
+                {% if current_page == "support_chat" %}
+                  {% static 'sharix_admin/img/menu/tickets_w.svg' %}
+                {% else %}
+                  {% static 'sharix_admin/img/menu/tickets.svg' %}
+                {% endif %}">
+            <span class="menu-bar-label">Чат с техподдержкой</span>
+          </div>
+        </a>
+      </li>
+
+      
+      {% include 'webservice_running/metaservice_menu.html' %}
+     
+
+    </ul>
+  </nav>
+
+  <div id="user-workspace" class="p-5 border rounded box-shadow">
+      <h1>{{ title }}</h1>
+      {% if messages %}
+        {% for message in messages %}
+          <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}">{{ message }}</div>
+        {% endfor %}
+      {% endif %}
+      
+      {% block view %}{% endblock view %}
+  </div>
+
+  <footer class="d-flex justify-content-between mt-3 p-2 align-items-center border rounded box-shadow">
+    <div class="d-flex align-items-center">
+        <div class="d-flex justify-content-center align-items-center rounded-circle bg-secondary-subtle p-3">
+          <i class="fa-solid fa-user"></i>
+        </div>
+        <span class="mx-2 text-nowrap text-muted">{{ user }}</span>
+    </div>
+
+    <div class="d-flex gap-3 mx-2">
+        {% comment %} <a href="{% url 'contact' %}">{% trans 'Contacts' %}</a> {% endcomment %}
+        <a href="https://wiki.sharix-app.org/doku.php/sharix/legal/soglashenie_s_servisom_na_ispolzovanie_platformy_sharix">{% trans 'Terms of use' %}</a>
+        <a href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">{% trans 'Privacy policy' %}</a>
+        <a href="https://wiki.sharix-app.org/doku.php">Помощь</a>
+    </div>
+
+    <form method="post" action="{% url "sharix_admin:auth_logout" %}">
+      {% csrf_token %}
+      <button class="btn btn-sm btn-outline-secondary text-nowrap" type="submit">
+        Выйти
+        <i class="fa-solid fa-right-from-bracket ms-1"></i>
+      </button>
+    </form>
+  </footer>
+</div>
+
+<script src="{% static 'sharix_admin/js/menu-bar.js' %}"></script>
+
+<script>
+  // Запуск некоторых функций после загрузки страницы
+  document.addEventListener('DOMContentLoaded', function() {
+    menuBarControll();
+  });
+
+  // Функция для скрытия экрана загрузки
+  function hideLoader() { document.getElementById("loader-wrapper").style.display = "none"; }
+
+  // Скрыть экран загрузки через 4 секунды
+  setTimeout(hideLoader, 400);
+</script>
+{% endblock %}

+ 1 - 1
sharix_admin/templates/sharix_admin/main.html

@@ -1,4 +1,4 @@
-{% extends 'sharix_admin/base_admin.html' %}
+{% extends 'sharix_admin/base_admin_menu.html' %}
 
 {% block view %}
 <p>

+ 4 - 1
sharix_admin/views/base.py

@@ -1,6 +1,8 @@
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.views import View
 
+from sharix_admin.lib import *
+
 
 class BaseView(UserPassesTestMixin, View):
     """
@@ -24,7 +26,8 @@ class BaseView(UserPassesTestMixin, View):
         context.update({
             'title': self.page_title,
             'current_page': self.page_name,
-            'user_groups': self.user_groups
+            'user_groups': self.user_groups,
+            'avaliable_pages': gen_avaliable_pages(self.user_groups),
         })
 
         return context