Browse Source

simple example of local order page added

ShariX Developer 12 hours ago
parent
commit
943b031e37

+ 1 - 0
forms/__init__.py

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

+ 46 - 0
forms/order_local.py

@@ -0,0 +1,46 @@
+from django import forms
+from dbsynce.models import Orders
+from dbsynce.models import Client
+from dbsynce.models import Company
+from dbsynce.models import Service
+from dbsynce.models import ServiceCategory
+from dbsynce.models import Provider
+from tickets.models import Ticket
+from django.contrib.auth import get_user_model
+
+from sharix_admin.forms import OrderForm
+
+class OrderLocalForm(OrderForm):
+    def __init__(self, *args, **kwargs):
+        super(OrderForm, 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 = Orders
+#        fields = [
+#            'status', 'title', 'note', 'time_placed', 'time_start', 'time_start_real',
+#            'time_start_predicted', 'time_finish_real', 'time_finish_predicted',
+#            'real_price', 'predicted_price', 'asap', 'ticket', 'service',
+#            'service_category', 'client', 'provider', 'receiver', 'company'
+#        ]
+#        widgets = {
+#            'time_placed': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#            'time_start': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#            'time_start_real': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#            'time_start_predicted': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#            'time_finish_real': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#            'time_finish_predicted': forms.DateTimeInput(attrs={'type': 'datetime-local'}),
+#        }
+#
+#    def __init__(self, *args, **kwargs):
+#        super().__init__(*args, **kwargs)
+#        self.fields['receiver'].queryset = get_user_model().objects.all()
+#        self.fields['client'].queryset = Client.objects.all()
+#        self.fields['company'].queryset = Company.objects.all()
+#        self.fields['provider'].queryset = Provider.objects.all()
+#        self.fields['service'].queryset = Service.objects.all()
+#        self.fields['service_category'].queryset = ServiceCategory.objects.all()
+#        self.fields['ticket'].queryset = Ticket.objects.all()

+ 1 - 1
lib/menu.py

@@ -36,7 +36,7 @@ MENU_SCHEME_LIST = {
     'providers': ['sharix_admin', 'person', 'Исполнители'],
     #'providers_local': ['webservice_running', 'person', 'Исполнители'],
     'orders': ['sharix_admin', 'clock-history', 'Заказы'],
-#    'orders_local': ['webservice_running', 'clock-history', 'Заказы'],
+    'orders_local': ['webservice_running', 'clock-history', 'Заказы'],
     'access_control': ['sharix_admin', 'hdd-network', 'Права доступа'],
     'relationship': ['sharix_admin', 'hdd-network', 'Взаимоотношения'],
     'ticket_list_list': ['tickets', 'tickets', 'Заявки'],

+ 14 - 0
templates/webservice_running/order_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 'sharix_admin/include/form.html' %}
+		    <button class="btn btn-primary" type="submit">Отправить</button>
+</form>
+{% endblock %}

+ 45 - 0
templates/webservice_running/orders_local.html

@@ -0,0 +1,45 @@
+{% 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 "CLIENT" in user_groups %}
+<h1></h1>
+  <div class="container text-end mt-2">
+          <a class="btn btn-primary" id="bord" href={% url "webservice_running:order_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 %}

+ 6 - 5
urls.py

@@ -2,6 +2,7 @@ from django.urls import path, include
 from rest_framework import routers
 
 from webservice_running import views
+from webservice_running.views import *
 from webservice_running.apiviews import *
 
 from sharix_admin.apiviews import *
@@ -21,14 +22,14 @@ urlpatterns_webadmin_local = [
     #TODO - make local pages based on Open with Local data. Now it points on Open Views, make your own to change
 
     #Order model SHOULD HAVE at least LIST, ADD, DETAIL, EDIT if that corresponds service idea, othervice Open models and pages might be enough
-#    path('orders_local/', login_required(OrdersListView.as_view()), name='orders_local'),
-#    path('order_local/<int:pk>', login_required(OrdersDetailView.as_view()), name='order_local_detail'),
+    path('orders_local/', login_required(OrdersLocalListView.as_view()), name='orders_local'),
+    path('order_local/<int:pk>', login_required(OrderDetailView.as_view()), name='order_local_detail'),
     #todo - move from views.order_reg to this one
-#    path('order_local/add/', login_required(OrdersCreate.as_view()), name='order_local/add/'),
-#    path('order_local/edit/<int:pk>', login_required(OrdersEditView.as_view()), name='order_local/edit'),
+    path('order_local/add/', login_required(OrderCreateView.as_view()), name='order_local/add/'),
+    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(ResourcesListView.as_view()), name='resources_local'),
+#    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'),

+ 2 - 0
views/__init__.py

@@ -0,0 +1,2 @@
+from .local_pages import *
+from .order_local import *

+ 2 - 2
views.py → views/local_pages.py

@@ -4,12 +4,12 @@ from django.shortcuts import render
 
 from core.settings import API_URL
 from webservice_running.apps import api
-from webservice_running.forms import OrderRegForm
+from webservice_running.forms import OrderLocalForm
 
 
 def order_reg(request):
     if request.method == 'POST':
-        form = OrderRegForm(request.POST)
+        form = OrderLocalForm(request.POST)
         if form.is_valid():
             data = request.POST
             responce = requests.post(f'{API_URL}/webservice/api/webservice/', data=data, headers=api.headers)

+ 124 - 0
views/order_local.py

@@ -0,0 +1,124 @@
+from dbsynce.models import Orders
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.http import JsonResponse
+from django.utils.translation import gettext as _
+from django_tables2 import SingleTableView
+from sharix_admin.tables import OrdersTable
+from sharix_admin.views import OrdersListView, OrderCreateView, OrderDetailView, OrderEditView
+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 import DetailView
+from tickets.models import Ticket, TicketList
+from sharix_admin.forms import OrderForm
+from sharix_admin.utils import *
+from dbsynce.lib.data import *
+from sharix_admin.views import BaseView
+from django.db.models import Q
+from django.contrib.auth import get_user_model
+
+class OrdersLocalListView(OrdersListView):
+#class OrdersListView(UserPassesTestMixin, SingleTableView):
+#    table_class = OrdersTable
+#    queryset = Orders.objects.all()
+    template_name = 'webservice_running/orders_local.html'
+#    page_title = 'Заказы'
+    page_name = 'orders_local'
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'title': _('Orders'),
+            '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__first_name__icontains=search_query) |
+                Q(status__icontains=search_query)
+            ).distinct()
+        return queryset
+
+    def testing(self, queryset, is_descending):
+        queryset = queryset.annotate.order_by("-" if is_descending else "")
+        return (queryset, True)
+
+    def test_func(self) -> bool or None:
+        return True
+
+@login_required
+@group_required('PARTNER-SUPERVISOR')
+def change_order_local_status(request):
+    if request.method == 'POST':
+        order_id = request.POST.get('order_local') 
+        new_status = request.POST.get('new_status')
+
+        try:
+            order = Orders.objects.get(pk=order_id)
+            order.status = new_status
+            order.save()
+            return JsonResponse({'status': 'success'})
+        except Orders.DoesNotExist:
+            return JsonResponse({'status': 'error', 'message': 'Order not found'}, status=404)
+    return JsonResponse({'status': 'error'}, status=400)
+
+class OrderLocalEditView(OrderEditView):
+#    form_class = OrderForm
+    template_name = "webservice_running/order_local.html"
+    success_url = reverse_lazy("webservice_running:orders_local")
+#    page_title = 'Изменить заказ'
+    page_name = 'order_local_edit'
+
+    def test_func(self):
+        return "CLIENT" in self.user_groups
+
+    def form_valid(self, form):
+        with transaction.atomic():
+            instance = form.save(commit=False)
+            instance.repr = self.request.user
+            instance.save()
+            instance.save()
+            doc_codes = parse_requirements(instance.requirements)
+        messages.success(self.request, 'Заказ успешно обновлён!')
+        return super().form_valid(form)
+
+class OrderLocalCreateView(OrderCreateView):
+    template_name = "webservice_running/order_local.html"
+    success_url = reverse_lazy("webservice_running:orders_local")
+    page_name = 'order_local/add/'
+
+    def test_func(self):
+        return "CLIENT" in self.user_groups
+        #return not "CLIENT" in self.user_groups
+
+    def form_valid(self, form):
+        with transaction.atomic():
+            instance = form.save(commit=False)
+            instance.repr = self.request.user
+            instance.save()
+            instance.ticket_status = create_ticket_order(self.request.user, instance)
+            instance.save()
+        messages.success(self.request, 'Заказ успешно создан!')
+        return super().form_valid(form)
+
+class OrderLocalDetailView(OrderDetailView):
+#    model = Orders
+    template_name = 'webservice_running/order_local.html'
+    context_object_name = 'order_local'
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['title'] = _('Order Local Details')
+        return context