Explorar el Código

Merge remote-tracking branch 'origin/unstable-new'

ShariX Developer hace 5 días
padre
commit
ff77f4dd81

+ 4 - 0
docs/database/local.py

@@ -0,0 +1,4 @@
+class Local():
+    local_data = (
+        "Описание локальных данных"
+    )

+ 4 - 0
docs/verbose_names/local.py

@@ -0,0 +1,4 @@
+class Local():
+    local_data = (
+        "Локальные данные"
+    )

+ 1 - 0
forms/__init__.py

@@ -1 +1,2 @@
 from .order_local import *
+from .resource_local import *

+ 19 - 0
forms/resource_local.py

@@ -0,0 +1,19 @@
+from dbsynce.models import Resource
+from webservice_running.models import ResourceLocal
+from django import forms
+
+
+class ResourceLocalForm(forms.ModelForm):
+    def __init__(self, *args, **kwargs):
+        super(ResourceLocalForm, self).__init__(*args, **kwargs)
+        # Добавляем класс .form-control для всех полей формы
+        for field in iter(self.fields):
+            if 'class' not in self.fields[field].widget.attrs:
+                self.fields[field].widget.attrs.update({'class': 'form-control'})
+
+    class Meta:
+        model = ResourceLocal
+        fields = [
+            'local_data'
+        ]
+

+ 2 - 2
lib/menu.py

@@ -11,7 +11,7 @@ WSR_ALL = ['serivce_tariff_local']
 #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']
 
 #WEBSERVICE_RUNNING_MENU
-MENU_GLOBAL_CUSTOMIZABLE = ['main_local', 'service_tariffs_local']
+MENU_GLOBAL_CUSTOMIZABLE = ['main_assist', 'service_tariffs_local']
 STAFF_METASERVICE_MENU_CUSTOMIZABLE = ['resources_local', 'providers_local', 'orders_local', 'cooperate_request' ]
 STAFF_MY_PARTNER_MENU_CUSTOMIZABLE = ['resources_local', 'providers_local', 'orders_local']
 STAFF_MY_PROVIDER_MENU_CUSTOMIZABLE = ['resources_local', 'orders_local']
@@ -32,7 +32,7 @@ MENU_SCHEME_LIST = {
     'service_tariffs': ['sharix_admin', 'briefcase', 'Тарифы'],
     'partners': ['sharix_admin', 'handshake', 'Партнеры'],
     'resources': ['sharix_admin', 'hdd-network', 'Ресурсы'],
-#    'resources_local': ['webservice_running', 'hdd-network', 'Ресурсы'],
+    'resources_local': ['webservice_running', 'hdd-network', 'Ресурсы'],
     'providers': ['sharix_admin', 'person', 'Исполнители'],
     #'providers_local': ['webservice_running', 'person', 'Исполнители'],
     'orders': ['sharix_admin', 'clock-history', 'Заказы'],

+ 3 - 1
models/__init__.py

@@ -1,4 +1,6 @@
 from .favoritecontacts import FavoriteContacts
 from .frequentaddress import FrequentAddress
 from .preferredproviders import PreferredProviders
-from .webservice_running import OrdersLocal
+from .webservice_running import *
+from .local_examples import *
+

+ 116 - 0
models/local_examples.py

@@ -0,0 +1,116 @@
+from django.db import models
+from django.contrib.auth import get_user_model
+from dbsynce.models import Orders, Resource, Provider, Service, Client
+
+from webservice_running.docs.database.local import Local as HelpTextsLocal
+from webservice_running.docs.verbose_names.local import Local as VerboseNameLocal
+
+from dbsynce.docs.database.template import Template as HelpTexts
+from dbsynce.docs.verbose_names.template import Template as VerboseName
+
+class ResourceLocal(models.Model):
+    """
+    Таблица с дополнительной информацией о ресурсе
+    """
+    
+    resource = models.ForeignKey(
+        Resource,
+        on_delete=models.DO_NOTHING,
+        blank=True,
+        null=True,
+        verbose_name = VerboseName.resource,
+        help_text=HelpTexts.resource,
+    )
+
+    local_data = models.CharField(
+        null=True,
+        verbose_name = VerboseNameLocal.local_data,
+        help_text=HelpTextsLocal.local_data,
+        max_length=100
+        )
+
+class OrdersLocal(models.Model):
+    """
+    Таблица с дополнительной информацией о ресурсе
+    """
+
+    order = models.ForeignKey(
+        Orders,
+        on_delete=models.DO_NOTHING,
+        blank=True,
+        null=True,
+        verbose_name = VerboseName.order,
+        help_text=HelpTexts.order,
+    )
+
+    local_data = models.CharField(
+        null=True,
+        verbose_name = VerboseNameLocal.local_data,
+        help_text=HelpTextsLocal.local_data,
+        max_length=100
+        )
+
+class ProviderLocal(models.Model):
+    """
+    Таблица с дополнительной информацией о ресурсе
+    """
+
+    provider = models.ForeignKey(
+        Provider,
+        on_delete=models.DO_NOTHING,
+        blank=True,
+        null=True,
+        verbose_name = VerboseName.provider,
+        help_text=HelpTexts.provider,
+    )   
+    
+    local_data = models.CharField(
+        null=True,
+        verbose_name = VerboseNameLocal.local_data,
+        help_text=HelpTextsLocal.local_data,
+        max_length=100
+        )
+
+class SerivceLocal(models.Model):
+    """
+    Таблица с дополнительной информацией о ресурсе
+    """
+
+    service = models.ForeignKey(
+        Service,
+        on_delete=models.DO_NOTHING,
+        blank=True,
+        null=True,
+        verbose_name = VerboseName.service,
+        help_text=HelpTexts.service,
+    )
+
+    local_data = models.CharField(
+        null=True,
+        verbose_name = VerboseNameLocal.local_data,
+        help_text=HelpTextsLocal.local_data,
+        max_length=100
+        )
+
+class ClientLocal(models.Model):
+    """
+    Таблица с дополнительной информацией о ресурсе
+    """
+
+    client = models.ForeignKey(
+        Client,
+        on_delete=models.DO_NOTHING,
+        blank=True,
+        null=True,
+        verbose_name = VerboseName.client,
+        help_text=HelpTexts.client,
+    )
+
+    local_data = models.CharField(
+        null=True,
+        verbose_name = VerboseNameLocal.local_data,
+        help_text=HelpTextsLocal.local_data,
+        max_length=100
+        )
+
+

+ 1 - 1
models/webservice_running.py

@@ -3,7 +3,7 @@ from django.db import models
 from dbsynce.models import Orders, Resource
 
 
-class OrdersLocal(models.Model):
+class OrdersLocalFullTemplate(models.Model):
     """
     OrdersLocal - таблица с заказами
     """

+ 51 - 0
tables.py

@@ -0,0 +1,51 @@
+import django_tables2 as tables
+from dbsynce.models import *
+from webservice_running.models import *
+from django.contrib.auth import get_user_model
+from django.utils.html import format_html
+from django.utils.translation import gettext_lazy as _
+
+from dbsynce.lib.dicts import *
+
+
+
+
+class ResourcesLocalTable(tables.Table):
+    id = tables.LinkColumn(
+        'webservice_running:resource_local_detail',
+        args=[tables.A('pk')],
+        verbose_name=_('ID'),
+        attrs={
+            "td": {"width": "5%"}
+        }
+    )
+    # В user ссылка LinkColumn на страницу Аси "Информация о партнере" страница partner_information_form
+    
+    local_data = tables.Column(
+        verbose_name=_('Локальные данные'),
+        attrs={
+            'th': {'scope': 'col'},
+            "td": {"width": "20%"}
+        }
+    )
+
+    resource.resource_type = tables.Column(
+        verbose_name=_('Тип ресурса'),
+        attrs={
+            'th': {'scope': 'col'},
+            "td": {"width": "20%"}
+        }
+    )
+
+
+class Meta:
+        model = ResourceLocal
+        attrs = {
+            "class": "table table-layout-fixed"
+        }
+        exclude = (
+            #'car_number',
+            #'transmission_type',
+
+        )
+

+ 53 - 0
templates/webservice_running/include/form_local.html

@@ -0,0 +1,53 @@
+{% for field in form_base %}
+    <div class="w-100 mb-2 {% if field.errors %}field-has-errors{% endif %}">
+        <div class="form-floating">
+            {{ field }}
+            <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
+        </div>
+
+        {% if field.errors %}
+            <div class="mt-1">
+                {% for error in field.errors %}
+                    <small class="d-block text-danger">* {{ error }}</small>
+                {% endfor %}
+            </div>
+        {% endif %}
+
+        {% comment %}
+            {% if field.help_text %}
+                <small class="form-text d-block text-muted mt-1">{{ field.help_text }}</small>
+            {% endif %}
+        {% endcomment %}
+    </div>
+{% endfor %}
+
+{% for field in form_local %}
+    <div class="w-100 mb-2 {% if field.errors %}field-has-errors{% endif %}">
+        <div class="form-floating">
+            {{ field }}
+            <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
+        </div>
+
+        {% if field.errors %}
+            <div class="mt-1">
+                {% for error in field.errors %}
+                    <small class="d-block text-danger">* {{ error }}</small>
+                {% endfor %}
+            </div>
+        {% endif %}
+
+        {% comment %}
+            {% if field.help_text %}
+                <small class="form-text d-block text-muted mt-1">{{ field.help_text }}</small>
+            {% endif %}
+        {% endcomment %}
+    </div>
+{% endfor %}
+
+{% if form.non_field_errors %}
+    <div class="alert alert-danger mb-0 small">
+        {% for error in form.non_field_errors %}
+            {{ error }}
+        {% endfor %}
+    </div>
+{% endif %}

+ 74 - 0
templates/webservice_running/local/main_local.html

@@ -0,0 +1,74 @@
+{% extends 'sharix_admin/base_admin.html' %}
+
+{% block view %}
+<p>
+    {{ user }}, приветствуем в личном кабинете сервиса ShariX Open!
+    Пример локальной страницы Сервиса.
+    <!-- FIXME: Сменить адрес ссылки -->
+    <a href="#" class="text-nowrap">Личный кабинет ShariX Platform</a>
+</p>
+
+{% if "METASERVICE-CLIENT" in user_groups %}
+    <div class="card mb-5">
+        <div class="card-body d-flex justify-content-between align-items-center">
+            <span>Баланс: 0 <i class="fa-solid fa-coins me-1"></i></span>
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn btn-primary disabled">
+                Пополнить
+            </a>
+        </div>
+    </div>
+{% endif %}
+
+<div class="row row-cols-1 row-cols-md-2 g-4">
+    <div class="col">
+        <h2>Доступные группы</h2>
+        <div class="my-3">
+            {% for group in user_groups %}
+                <span class="badge rounded-pill text-bg-primary">{{ group }}</span>
+            {% empty %}
+                <p class="opacity-50 m-0">Вы пока еще не добавлены ни в одну группу</p>
+            {% endfor %}
+        </div>
+
+        <div class="d-flex flex-wrap gap-1 text-nowrap mt-2">
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn-sm btn-primary disabled">
+                <i class="fa-solid fa-people-group me-1"></i>
+                Стать частью команды
+            </a>
+            {% if not "PARTNER-ADMIN" in user_groups %}
+                <a href="{% url "sharix_admin:cooperate_request" %}" class="btn btn-sm btn-primary">
+                    <i class="fa-solid fa-handshake me-1"></i>
+                    Стать партнером
+                </a>
+            {% endif %}
+        </div>
+    </div>
+    <div class="col">
+        <h2>Документация</h2>
+        <ul>
+            <!-- FIXME: Сменить адреса всех ссылок -->
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">Политика конфиденциальности</a></li>
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/pravila_okazanija_uslug">Правила оказания услуг</a></li>
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Пользовательское соглашение с пользователями</a></li>
+
+            {% if "PARTNER-ADMIN" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Пользовательское соглашение с партнерами</a></li>
+            {% endif %}
+
+            {% if "METASERVICE-CLIENT" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Договор на оказание услуг</a></li>
+            {% endif %}
+
+            {% if "PARTNER-ADMIN" in user_groups or "METASERVICE-ADMIN" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Договор оказания посреднических услуг (с платформой)</a></li>
+            {% endif %}
+
+            {% if "METASERVICE-TECHSUPPORT" in user_groups %}
+                <li><a href="{% url 'sharix_admin:schemav1' %}">Схема 1</a> / <a  href="{% url 'sharix_admin:schemav2' %}">Схема 2</a> / <a  href="{% url 'sharix_admin:schema' %}">Схема 3</a> / <a  href="{% url 'sharix_admin:schema-redoc' %}">API</a></li>
+            {% endif %}
+        </ul>
+    </div>
+</div>
+{% endblock %}

+ 0 - 0
templates/webservice_running/order_local.html → templates/webservice_running/local/order_local.html


+ 0 - 0
templates/webservice_running/orders_local.html → templates/webservice_running/local/order_local_list.html


+ 14 - 0
templates/webservice_running/local/resource_local.html

@@ -0,0 +1,14 @@
+{% extends 'sharix_admin/base_admin.html' %}
+
+{% block view %}
+
+<p>
+Локальная адаптация формы создания локального ресурса.
+</p>
+
+<form method="post" class="d-flex flex-column align-items-end">
+            {% csrf_token %}
+                {% include 'webservice_running/include/form_local.html' %}
+                    <button class="btn btn-primary" type="submit">Отправить</button>
+</form>
+{% endblock %}

+ 55 - 0
templates/webservice_running/local/resource_local_detail.html

@@ -0,0 +1,55 @@
+{% extends 'sharix_admin/base_admin.html' %}
+{% load static %}
+
+{% block view %}
+<p class="description_service">
+Тут представлена информация о Ресурсе {{ resource_local.id }}. Редактировать информацию может только представитель Партнера Сервиса с ролью PARTNER ADMIN.
+</p>
+
+<div class="card w-100 mb-4">
+    <div class="card-body position-relative">
+        <h5 class="card-title fw-bold mb-4">{{ resource_local.id }} : {{ resource_local.resource.id }}</h5>
+
+        <ul class="list-style-none">
+            <li><b>{{ captions.user }}</b> {{ resource_local.resource.user.get_full_name }}</li>
+            <li><b>{{ captions_local.local_data }}</b> {{ resource_local.local_data }}</li>
+            <li><b>{{ captions.resource_type }}</b> {{ resource_local.resource.resource_type }}</li>
+            <li><b>{{ captions.status }}</b> {{ resource_local.resource.status }}</li>
+            <li><b>{{ captions.ticket_status }}</b> {{ resource_local.resource.ticket_status }}</li>
+
+
+        </ul>
+    </div>
+    {% comment %}    <a class="btn btn-primary btn-edit" href="{% url "sharix_admin:resource/edit" %}">
+            <img src="{% static 'sharix_admin/img/pencil.svg' %}">
+    </a>
+    {% endcomment %}
+</div>
+
+
+<h6 class="mb-4">Документы</h6>
+    <ul class="list-style-none">
+        {% for doc in docs %}
+            <li class="d-flex justify-content-between">
+                <div class="d-flex align-items-center">
+                    {% if doc.ticket_status and doc.status == "1" %}
+                        <i class="fa-solid fa-clock-rotate-left me-2 no-user-select fs-4 text-warning"></i>
+                    {% elif doc.status == "0" %}
+                        <i class="fa-solid fa-check me-2 no-user-select fs-4 text-success"></i>
+                    {% else %}
+                        <i class="fa-regular fa-file me-2 no-user-select fs-4 text-primary"></i>
+                    {% endif %}
+
+                    {{ doc.get_doc_type_display }}
+                </div>
+
+                {% if doc.ticket_status %}
+                    <a class="btn btn-sm btn-outline-primary" href="{% url "sharix_admin:resource_doc" object.resource.id doc.doc_type %}">Посмотреть</a>
+                {% else %}
+                    <a class="btn btn-sm btn-primary" href="{% url "sharix_admin:resource_doc_upload" object.resource.id doc.doc_type %}">Загрузить</a>
+                {% endif %}
+            </li>
+        {% endfor %}
+    </ul>
+
+{% endblock %}

+ 46 - 0
templates/webservice_running/local/resource_local_list.html

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

+ 78 - 0
templates/webservice_running/main_assist.html

@@ -0,0 +1,78 @@
+{% extends 'sharix_admin/base_admin.html' %}
+
+{% block view %}
+<p>
+    {{ user }}, приветствуем в личном кабинете сервиса ShariX Assist!
+    <p>
+    Assist — сервис личных водителей, доступных тогда, когда это необходимо.
+    </p>
+    <!-- FIXME: Сменить адрес ссылки -->
+    <a href="https://sharix-app.org/my/" class="text-nowrap">Личный кабинет ShariX Platform</a>
+</p>
+
+{% if "METASERVICE-CLIENT" in user_groups %}
+    <div class="card mb-5">
+        <div class="card-body d-flex justify-content-between align-items-center">
+            <span>Баланс: 0 <i class="fa-solid fa-coins me-1"></i></span>
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn btn-primary disabled">
+                Пополнить
+            </a>
+        </div>
+    </div>
+{% endif %}
+
+<div class="row row-cols-1 row-cols-md-2 g-4">
+    <div class="col">
+        <h2>Доступные группы</h2>
+        <div class="my-3">
+            {% for group in user_groups %}
+                <span class="badge rounded-pill text-bg-primary">{{ group }}</span>
+            {% empty %}
+                <p class="opacity-50 m-0">Вы пока еще не добавлены ни в одну группу</p>
+            {% endfor %}
+        </div>
+
+        <div class="d-flex flex-wrap gap-1 text-nowrap mt-2">
+            <!-- FIXME: Сменить адрес ссылки -->
+            <a href="#" class="btn btn-sm btn-primary disabled">
+                <i class="fa-solid fa-people-group me-1"></i>
+                Стать частью команды
+            </a>
+            {% if not "PARTNER-ADMIN" in user_groups %}
+                <a href="{% url "sharix_admin:cooperate_request" %}" class="btn btn-sm btn-primary">
+                    <i class="fa-solid fa-handshake me-1"></i>
+                    Стать партнером
+                </a>
+            {% endif %}
+        </div>
+    </div>
+    <div class="col">
+        <h2>Документация</h2>
+        <ul>
+            <!-- FIXME: Сменить адреса всех ссылок -->
+            <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/politika_konfidencialnosti_platformy_sharix">Политика конфиденциальности Платформы ShariX</a></li>
+            <li><a href="https://doc.assist.sharix-app.org/doku.php/site/politika_konfidencialnosti">Политика конфиденциальности Сервиса</a></li>
+            <li><a href="https://doc.assist.sharix-app.org/doku.php/site/pravila_okazanija_uslug">Правила оказания услуг</a></li>
+            <li><a href="https://doc.assist.sharix-app.org/doku.php/site/polzovatelskoe_soglashenie_sharix_assist_s_polzovateljami">Пользовательское соглашение с пользователями</a></li>
+
+            {% if "PARTNER-ADMIN" in user_groups %}
+                <li><a href="https://doc.assist.sharix-app.org/doku.php/site/polzovatelskoe_soglashenie_sharix_assist_s_partnerami">Пользовательское соглашение с партнерами</a></li>
+            {% endif %}
+
+            {% if "METASERVICE-CLIENT" in user_groups %}
+                <li><a href="https://doc.assist.sharix-app.org/doku.php/site/dogovor_okazanija_posrednicheskix_uslug_platforma_s_servisom_agentskij_dogovor">Договор на оказание услуг</a></li>
+            {% endif %}
+
+            {% if "PARTNER-ADMIN" in user_groups or "METASERVICE-ADMIN" in user_groups %}
+                <li><a href="https://wiki.sharix-app.org/doku.php/sharix/legal/porjadok_okazanija_uslug">Договор оказания посреднических услуг (с платформой)</a></li>
+                <li><a href="https://doc.assist.sharix-app.org/doku.php/site/dogovor_okazanija_posrednicheskix_uslug_servis_s_partnerom_i_klientom_agentskij_dogovor">Договор оказания посреднических услуг (с Сервисом)</a></li>
+            {% endif %}
+
+            {% if "METASERVICE-TECHSUPPORT" in user_groups %}
+                <li><a href="{% url 'sharix_admin:schemav1' %}">Схема 1</a> / <a  href="{% url 'sharix_admin:schemav2' %}">Схема 2</a> / <a  href="{% url 'sharix_admin:schema' %}">Схема 3</a> / <a  href="{% url 'sharix_admin:schema-redoc' %}">API</a></li>
+            {% endif %}
+        </ul>
+    </div>
+</div>
+{% endblock %}

+ 5 - 5
urls.py

@@ -31,13 +31,13 @@ urlpatterns_webadmin_local = [
     path('order_local/edit/<int:pk>', login_required(OrderEditView.as_view()), name='order_local/edit'),
 
     #Resource model SHOULD HAVE at least LIST, ADD, DETAIL, EDIT if that corresponds service idea, othervice Open models and pages might be enough
-#    path('resources_local/', login_required(ResourcesLocalListView.as_view()), name='resources_local'),
-#    path('resource_local/<int:pk>', login_required(ResourceDetailView.as_view()), name='resource_local_detail'),
-#    path('resource_local/add/', login_required(ResourceCreate.as_view()), name='resource_local/add/'),
-#    path('resource_local/edit/<int:pk>', login_required(ResourceEditView.as_view()), name='resource_local/edit'),
+    path('resources_local/', login_required(ResourcesLocalListView.as_view()), name='resources_local'),
+    path('resource_local/<int:pk>', login_required(ResourceLocalDetailView.as_view()), name='resource_local_detail'),
+    path('resource_local/add/', login_required(ResourceLocalCreate.as_view()), name='resource_local/add/'),
+    path('resource_local/edit/<int:pk>', login_required(ResourceLocalEditView.as_view()), name='resource_local/edit'),
     
     #Provider model SHOULD HAVE at least LIST, DETAIL, EDIT if that corresponds service idea, othervice Open models and pages might be enough
-    path('providers_local/', login_required(ProvidersListView.as_view()), name='providers_local'),
+#    path('providers_local/', login_required(ProvidersListView.as_view()), name='providers_local'),
 #    path('provider_local/<str:pk>', login_required(ProviderDetailView.as_view()), name='provider_local_detail'),
 #    path('provider_local/edit/<int:pk>', login_required(ProviderEditView.as_view()), name='provider_local_/edit'),
 

+ 3 - 0
views/__init__.py

@@ -1,2 +1,5 @@
 from .local_pages import *
+from .main_assist import *
 from .order_local import *
+from .resource_local import *
+from .base_local import *

+ 38 - 0
views/base_local.py

@@ -0,0 +1,38 @@
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.views import View
+
+
+from django.views.generic import TemplateView
+from sharix_admin.lib import *
+
+
+class BaseLocalView(UserPassesTestMixin, TemplateView, View):
+    """
+    Базовый класс представления админ-панели ShariX.
+
+    Предоставляет общие методы и функционал, который
+    может быть использован в других представлениях админ-панели.
+    """
+
+    def dispatch(self, request, *args, **kwargs):
+        self.user_groups = self.request.user.groups.values_list('name', flat=True)
+        #self.avaliable_menu = self.request.user.groups.values_list('name', flat=True)
+        return super().dispatch(request, *args, **kwargs)
+
+    def test_func(self):
+        return True
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+
+        context.update({
+            'title': self.page_title,
+            'current_page': self.page_name,
+            'user_groups': self.user_groups,
+            'avaliable_pages': gen_avaliable_pages(self.user_groups),
+        })
+
+        return context
+
+
+

+ 1 - 1
views/local_pages.py

@@ -16,7 +16,7 @@ from sharix_admin.views import MainView
 class MainLocalView(MainView):
     page_title = 'Добро пожаловать!'
     page_name = 'main_local'
-    template_name = 'webservice_running/main_local.html'
+    template_name = 'webservice_running/local/main_local.html'
 
 def order_reg(request):
     if request.method == 'POST':

+ 10 - 0
views/main_assist.py

@@ -0,0 +1,10 @@
+from django.utils.translation import gettext as _
+from django.views.generic import TemplateView
+
+from sharix_admin.views import MainView
+
+
+class MainAssistView(MainView):
+    page_title = 'Добро пожаловать!'
+    page_name = 'main_assist'
+    template_name = 'webservice_running/main_assist.html'

+ 4 - 4
views/order_local.py

@@ -27,7 +27,7 @@ class OrdersLocalListView(OrdersListView):
 #class OrdersListView(UserPassesTestMixin, SingleTableView):
 #    table_class = OrdersTable
 #    queryset = Orders.objects.all()
-    template_name = 'webservice_running/orders_local.html'
+    template_name = 'webservice_running/local/order_local_list.html'
 #    page_title = 'Заказы'
     page_name = 'orders_local'
 
@@ -76,7 +76,7 @@ def change_order_local_status(request):
 
 class OrderLocalEditView(OrderEditView):
 #    form_class = OrderForm
-    template_name = "webservice_running/order_local.html"
+    template_name = "webservice_running/local/order_local.html"
     success_url = reverse_lazy("webservice_running:orders_local")
 #    page_title = 'Изменить заказ'
     page_name = 'order_local_edit'
@@ -95,7 +95,7 @@ class OrderLocalEditView(OrderEditView):
         return super().form_valid(form)
 
 class OrderLocalCreateView(OrderCreateView):
-    template_name = "webservice_running/order_local.html"
+    template_name = "webservice_running/local/order_local.html"
     success_url = reverse_lazy("webservice_running:orders_local")
     page_name = 'order_local/add/'
 
@@ -115,7 +115,7 @@ class OrderLocalCreateView(OrderCreateView):
 
 class OrderLocalDetailView(OrderDetailView):
 #    model = Orders
-    template_name = 'webservice_running/order_local.html'
+    template_name = 'webservice_running/local/order_local.html'
     context_object_name = 'order_local'
 
     def get_context_data(self, **kwargs):

+ 259 - 0
views/resource_local.py

@@ -0,0 +1,259 @@
+from dbsynce.models import Resource
+from webservice_running.models import ResourceLocal
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.http import JsonResponse
+from django.utils.translation import gettext as _
+from django_tables2 import SingleTableView
+from django.views.generic import DetailView
+
+from django.shortcuts import render
+
+from webservice_running.tables import ResourcesLocalTable
+from sharix_admin.utils import group_required
+
+
+from datetime import datetime, timedelta
+from dbsynce.lib.core import parse_requirements, get_admin_url
+from dbsynce.models import Documents
+from django.contrib import messages
+from django.db import transaction
+from django.urls import reverse_lazy
+from django.views.generic.edit import FormView
+from django.views.generic.edit import CreateView
+from tickets.models import Ticket, TicketList
+
+from webservice_running.forms import ResourceLocalForm
+from sharix_admin.forms import ResourceForm
+from sharix_admin.utils import *
+from dbsynce.lib.data import *
+from sharix_admin.views.base import BaseView
+from webservice_running.views.base_local import BaseLocalView
+from django.db.models import Q
+
+from django import forms
+from django.shortcuts import redirect
+
+from dbsynce.docs.database.resource import Resource as ResourceHelpTexts
+from dbsynce.docs.verbose_names.resource import Resource as ResourceVerboseNames
+
+from webservice_running.docs.database.local import Local as HelpTextsLocal
+from webservice_running.docs.verbose_names.local import Local as VerboseNameLocal
+
+#def _get_form(request, formcls, prefix):
+def _get_form(request, formcls):
+    data = request.POST
+    #data = request.POST if prefix in request.POST else None
+    return formcls(data)
+    #return formcls(data, prefix=prefix)
+
+
+class ResourcesLocalListView(BaseView, UserPassesTestMixin, SingleTableView):
+    table_class = ResourcesLocalTable
+    queryset = ResourceLocal.objects.all()
+    template_name = 'webservice_running/local/resource_local_list.html'
+    page_title = 'Локальные данные ресурсов'
+    page_name = 'resources'
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'title': self.page_title,
+            'object_list': context['object_list'],
+        })
+        return context
+
+    def get_queryset(self):
+        queryset = super().get_queryset()
+        search_query = self.request.GET.get('q', '').strip()
+        if search_query:
+            queryset = queryset.filter(
+                Q(id__icontains=search_query) |
+                Q(user__first_name__icontains=search_query) |
+                Q(user__last_name__icontains=search_query) |
+                Q(status__icontains=search_query)
+            ).distinct()
+        return queryset
+
+    def test_func(self) -> bool or None:
+        #group_names = ('PARTNER-ADMIN')
+        #if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
+        #    return True
+        #return False
+        return True
+
+
+@login_required
+@group_required('PARTNER-ADMIN')
+def change_resource_status(request):
+    if request.method == 'POST':
+        resource = request.POST.get('resource')
+        new_status = request.POST.get('new_status')
+
+        resource = Resource.objects.get(pk=resource)
+        resource.status = new_status
+        resource.save()
+        return JsonResponse({'status': 'success'})
+    else:
+        return JsonResponse({'status': 'error'})
+
+class ResourceLocalEditView(BaseLocalView, FormView):
+    resource_form = ResourceLocalForm
+    resource_local_form = ResourceLocalForm
+    template_name = "webservice_running/local/resource_local.html"
+    success_url = reverse_lazy("webservice_running:resource_local_list")
+    page_title = 'Изменить ресурс c локальными данными'
+    page_name = 'resource_local_edit'
+
+    # Проверяем состояит ли текущий пользователь в группе PARTNER-ADMIN
+    def test_func(self):
+        return "PARTNER-ADMIN" in self.user_groups
+
+    def form_valid(self, form):
+        with transaction.atomic():
+            # Сохраняем форму, чтобы получить объект ресурса
+            instance = form.save(commit=False)
+
+            # Присваиваем полю repr идентификатор текущего пользователя
+            instance.repr = self.request.user
+
+            # Создаем новую запись в БД, чтобы иметь доступ к ID
+            instance.save()
+
+            # Создание тикета на активацию ресурса.
+            # Создаем объект тикета и присваиваем его полю ticket_status
+            instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
+
+            # Создание тикета на утверждение прав пользователя
+            # create_ticket_role_activation_partner_admin(self.request.user, instance)
+
+            # Сохраняем новые изменения
+            instance.save()
+
+            # Создаем необходимые объекты документов по requirements указанных в созданной company
+            # Используем bulk_create для создания всех объектов одновременно
+            doc_codes = parse_requirements(instance.requirements)
+            Documents.objects.bulk_create([
+                Documents(
+                    company=instance,
+                    user=self.request.user,
+                    doc_type=doc_code
+                ) for doc_code in doc_codes
+            ])
+
+        # Отправляем пользователю уведомление на страницу о успехе операции
+        messages.success(
+            self.request,
+            'Ваша заявка на становление партнером успешно отправлена и теперь проходит проверку!'
+        )
+
+
+        #return super().form_valid(form)  # Возвращаем успешный ответ
+        return super().form_valid(resource_form, resource_local_form)  # Возвращаем успешный ответ
+
+
+class ResourceLocalCreate(BaseLocalView):
+
+    resource_form = ResourceForm
+    resource_local_form = ResourceLocalForm
+    template_name = "webservice_running/local/resource_local.html"
+    success_url = reverse_lazy("webservice_running:main_local")
+    page_title = 'Добавить ресурс с локальными данными'
+    page_name = 'resource_local/add/'
+
+    def get(self, request, *args, **kwargs):
+        context = self.get_context_data(**kwargs)
+        context.update({'form_base': ResourceForm(prefix='form_base'), 'form_local': ResourceLocalForm(prefix='form_local')})
+        return render(
+            request,
+            self.template_name,
+            context,
+        )
+        #return self.render_to_response(context)
+
+    def post(self, request, *args, **kwargs):
+        form_base = _get_form(request, ResourceForm)
+        form_local = _get_form(request, ResourceLocalForm)
+
+        #if form_base.is_valid() and form_local.is_valid():
+        #if form_local.is_valid():
+        if form_local.is_valid() and form_base.is_valid():
+
+            instance=form_base.save(commit=False)
+            instance.user = self.request.user
+            instance.save()
+            instance.ticket_status = create_ticket_resource_activation_by_metaservice_supervisor(self.request.user, instance)
+            create_ticket_resource_activation_by_partner_admin(self.request.user, instance)
+            
+            instance.save()
+
+            doc_codes = parse_requirements(instance.requirements)
+            Documents.objects.bulk_create([
+                Documents(
+            #        #TODO add info about company
+                    resource=instance,
+                    user=self.request.user,
+                    doc_type=doc_code
+                ) for doc_code in doc_codes
+                ])
+
+            messages.success(
+                self.request,
+                'Ваша заявка на добавление ресурса успешно отправлена и теперь проходит проверку!'
+                )
+            instance_local=form_local.save(commit=False)
+            instance_local.resource=instance
+            form_local.save()
+            return redirect(self.success_url)
+        else:
+            messages.error(
+            self.request,
+            'Ошибка добавления, попробуйте снова!'
+            )
+
+
+        
+        context = self.get_context_data(**kwargs)
+        context.update({'form_base': form_base, 'form_local': form_local})
+        
+        return render(
+            request,
+            self.template_name,
+            context,
+        )
+
+
+
+class ResourceLocalDetailView(BaseView, DetailView):
+    model = ResourceLocal
+    template_name = 'webservice_running/local/resource_local_detail.html'
+    context_object_name = 'resource_local'
+    page_title = 'Локальная информация о ресурсе'
+    page_name = 'resource_local_detail'
+
+    def detail_view(self, request, primary_key):
+
+        try:
+            resource_local = ResourceLocal.objects.get(pk=primary_key)
+            #docs = Documents.objects.filter(resource=self.object.resource)
+            #context['docs'] = self.docs
+        except ResourceLocal.DoesNotExist:
+            #docs=[]
+            raise Http404('Something does not exist')
+            
+
+        return render(request, self.template_name, context={
+            })
+
+    def get_context_data(self, **kwargs):
+        try:
+            docs = Documents.objects.filter(resource=self.object.resource)
+        except Documents.DoesNotExist:
+            docs=[]
+        context = super().get_context_data(**kwargs)
+        context['help_texts'] = ResourceHelpTexts
+        context['captions'] = ResourceVerboseNames
+        context['help_texts_local'] = HelpTextsLocal
+        context['captions_local'] = VerboseNameLocal
+        context['docs'] = docs
+        return context