Răsfoiți Sursa

Added order_local.html template and corrected template settings

Ivan 1 zi în urmă
părinte
comite
f3d1e9826a

+ 1 - 1
sharix_admin/forms/__init__.py

@@ -5,4 +5,4 @@ from .job_request import *
 from .document import *
 from .service import *
 from .resource import *
-
+from .order import *

+ 37 - 0
sharix_admin/forms/order.py

@@ -0,0 +1,37 @@
+from django import forms
+from dbsynce.models import Orders
+
+class OrderForm(forms.ModelForm):
+    def __init__(self, *args, **kwargs):
+        super(ResourceForm, 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()

+ 58 - 81
sharix_admin/tables.py

@@ -144,6 +144,64 @@ class PartnersTable(tables.Table):
                 record.id
             )
 
+class OrdersTable(tables.Table):
+    id = tables.Column(
+        verbose_name=_('ID'),
+        attrs={
+                "td": {"width": "5%"}
+        }
+    )
+    title = tables.Column(
+        verbose_name=_('Title'), 
+        attrs={
+            "td": {"width": "20%"}
+        }
+    )
+    status = tables.Column(
+        verbose_name=_('Status'), 
+        attrs={
+            "td": {"width": "15%"}
+        }
+    )
+    receiver = tables.Column(
+        accessor='receiver.get_full_name',
+        verbose_name=_('Receiver'),
+        attrs={
+            "td": {"width": "20%"}
+        }
+    )
+    time_created = tables.DateTimeColumn(
+        verbose_name=_('Created'),
+        attrs={
+            "td": {"width": "20%"}
+        }
+    )
+
+    class Meta:
+        model = Orders
+        attrs = {
+            "class": "table table-layout-fixed"
+        }
+        exclude = (
+            'id_metaservice', 
+            'note', 
+            'time_placed', 
+            'time_start', 
+            'time_start_real', 
+            'time_start_predicted', 
+            'time_finish_real', 
+            'time_finish_predicted', 
+            'real_price', 
+            'predicted_price', 
+            'asap', 
+            'is_global', 
+            'is_visible', 
+            'ticket', 
+            'service', 
+            'service_category', 
+            'client', 
+            'provider', 
+            'company')
 
 class ResourcesTable(tables.Table):
     id = tables.Column(
@@ -202,87 +260,6 @@ class ResourcesTable(tables.Table):
                 '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-resource-id="{}">',
                 record.id
             )
-# class ResourcesTable(tables.Table):
-#     id = tables.Column(
-#         verbose_name=_('ID'),
-#         attrs={
-#             "td": {"width": "5%"}
-#         }
-#     )
-#     user = tables.Column(
-#         accessor='user.get_full_name',
-#         order_by=('user.first_name', 'user.last_name'),
-#         verbose_name=_('Responsible'),
-#         attrs={
-#             "td": {"width": "15%"}
-#         }
-#     )
-#     status = tables.Column(
-#         verbose_name=_('Status'),
-#         attrs={
-#             'th': {'scope': 'col'},
-#             "td": {"width": "20%"}
-#         }
-#     )
-#     activation = tables.Column(
-#         verbose_name=_('Активация'),
-#         attrs={
-#             'th': {'scope': 'col'},
-#             "td": {"width": "40%"}  # Увеличим ширину для размещения 4 кнопок
-#         }
-#     )
-
-#     class Meta:
-#         model = Resource
-#         attrs = {
-#             "class": "table table-layout-fixed custom-table"  # Добавлен кастомный класс для стилей
-#         }
-#         exclude = (
-#             'id_metaservice',
-#             'resource_type',
-#             'requirements',
-#             'is_global',
-#             'is_visible',
-#             'ticket_status'
-#         )
-
-#     def render_activation(self, value, record):
-#         # Чекбокс для текущего статуса
-#         checkbox = format_html(
-#             '<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault_{}" data-resource-id="{}" {}>',
-#             record.id, record.id, 'checked' if record.status == 'active' else ''
-#         )
-
-#         # 4 кнопки-картинки без href, полагаемся на AJAX
-#         buttons = [
-#             format_html(
-#                 '<a class="activation-btn" data-action="action1" data-resource-id="{}">'
-#                 '<img src="{}" alt="Action 1" style="width: 30px; height: 30px;"></a>',
-#                 record.id, self.get_image_url('logo.png')
-#             ),
-#             format_html(
-#                 '<a class="activation-btn" data-action="action2" data-resource-id="{}">'
-#                 '<img src="{}" alt="Action 2" style="width: 30px; height: 30px;"></a>',
-#                 record.id, self.get_image_url('logo.png')
-#             ),
-#             format_html(
-#                 '<a class="activation-btn" data-action="action3" data-resource-id="{}">'
-#                 '<img src="{}" alt="Action 3" style="width: 30px; height: 30px;"></a>',
-#                 record.id, self.get_image_url('logo.png')
-#             ),
-#             format_html(
-#                 '<a class="activation-btn" data-action="action4" data-resource-id="{}">'
-#                 '<img src="{}" alt="Action 4" style="width: 30px; height: 30px;"></a>',
-#                 record.id, self.get_image_url('logo.png')
-#             )
-#         ]
-
-#         # Объединяем чекбокс и кнопки
-#         return format_html('{} {}', checkbox, ' '.join(buttons))
-
-#     def get_image_url(self, filename):
-#         # Путь к изображениям
-#         return f"{settings.STATIC_URL}sharix_admin/img/{filename}"
 
 class ProvidersTable(tables.Table):
     id = tables.Column(

+ 11 - 0
sharix_admin/templates/sharix_admin/order_local.html

@@ -0,0 +1,11 @@
+{% extends 'sharix_admin/base_admin.html' %}
+{% load render_table from django_tables2 %}
+{% load static %}
+
+{% block view %}
+{% block contenthome %}
+    <h1>{{ title }}</h1>
+    
+    
+{% endblock contenthome %}
+{% endblock view %}

+ 10 - 3
sharix_admin/urls.py

@@ -33,6 +33,13 @@ urlpatterns = [
     path('job-request/', login_required(JobRequestMetaserviceView.as_view()), name='job_request_metaservice'),
     #path('job-request/<str:partner>', login_required(JobRequestPartnerView.as_view()), name='job_request_partner'),
 
+        #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'),
+        # 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('partners/', login_required(PartnersListView.as_view()), name='partners'),
     path('partner/', login_required(PartnerDetailView.as_view()), name='partner_detail_my'),
@@ -48,9 +55,9 @@ urlpatterns = [
     #path('resource/<str:pk>', login_required(ResourceDetailView.as_view()), name='resource_detail'),
     path('resource/add/', login_required(ResourceCreate.as_view()), name='resource/add/'),
     path('resource/edit/<int:pk>', login_required(ResourceEditView.as_view()), name='resource/edit'),
-#    path('resource/doc/<str:doc_code>/upload', login_required(ResourceDocUploadView.as_view()),
-#         name='partner_doc_upload'),
-#    path('resource/doc/<str:doc_code>', login_required(ResourceDocView.as_view()), name='resource_doc'),
+    # path('resource/doc/<str:doc_code>/upload', login_required(ResourceDocUploadView.as_view()),
+    #      name='partner_doc_upload'),
+    # path('resource/doc/<str:doc_code>', login_required(ResourceDocView.as_view()), name='resource_doc'),
     path('resource/change_status/', change_resource_status, name='resource/change_status'),
 
     path('providers/', login_required(ProvidersListView.as_view()), name='providers'),

+ 1 - 0
sharix_admin/views/__init__.py

@@ -18,3 +18,4 @@ from .service_category import *
 from .trans_id import *
 from .transactions import *
 from .user_info import *
+from .order import *

+ 133 - 0
sharix_admin/views/order.py

@@ -0,0 +1,133 @@
+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.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 .base import BaseView
+from django.db.models import Q
+
+class OrdersListView(UserPassesTestMixin, SingleTableView):
+    table_class = OrdersTable
+    queryset = Orders.objects.all()
+    template_name = 'sharix_admin/order_local.html'
+
+    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 test_func(self) -> bool or None:
+        return True
+
+@login_required
+@group_required('PARTNER-ADMIN')
+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 OrdersEditView(BaseView, FormView):
+    form_class = OrderForm
+    template_name = "sharix_admin/order_local.html"
+    success_url = reverse_lazy("sharix_admin:order_local")
+    page_title = 'Изменить заказ'
+    page_name = 'order_edit'
+
+    def test_func(self):
+        return "PARTNER-ADMIN" 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_local_activation_by_metaservice_supervisor(self.request.user, instance)
+            instance.save()
+            doc_codes = parse_requirements(instance.requirements)
+            Documents.objects.bulk_create([
+                Documents(
+                    order_local=instance, 
+                    user=self.request.user,
+                    doc_type=doc_code
+                ) for doc_code in doc_codes
+            ])
+        messages.success(self.request, 'Заказ успешно обновлён!')
+        return super().form_valid(form)
+
+class OrdersCreate(BaseView, FormView):
+    form_class = OrderForm
+    template_name = "sharix_admin/order_local.html"
+    success_url = reverse_lazy("sharix_admin:order_local")
+    page_title = 'Добавить заказ'
+    page_name = 'order_local/add/'
+
+    def test_func(self):
+        return not "PARTNER-ADMIN" 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_local_activation_by_metaservice_supervisor(self.request.user, instance)
+            create_ticket_order_local_activation_by_partner_admin(self.request.user, instance)
+            instance.save()
+            doc_codes = parse_requirements(instance.requirements)
+            Documents.objects.bulk_create([
+                Documents(
+                    order_local=instance,
+                    user=self.request.user,
+                    doc_type=doc_code
+                ) for doc_code in doc_codes
+            ])
+        messages.success(self.request, 'Заказ успешно создан!')
+        return super().form_valid(form)
+
+class OrdersDetailView(DetailView):
+    model = Orders
+    template_name = 'sharix_admin/order_local.html'
+    context_object_name = 'order'
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['title'] = _('Order Details')
+        return context