Browse Source

made changes in whole project 1

kateshev14 9 months ago
parent
commit
16f0bf5f4a

+ 2 - 1
SharixAdmin/forms/company.py

@@ -13,4 +13,5 @@ class CompanyCreateForm(forms.ModelForm):
 
     class Meta:
         model = Company
-        fields = ['legal_name', 'inn', 'kpp', 'ogrn', 'bank_name', 'bik', 'rs', 'ks', 'address']
+        fields = ['legal_name', 'inn', 'kpp', 'ogrn', 'bank_name', 'bik', 'rs', 'ks', 'address']
+

+ 50 - 15
SharixAdmin/forms/service.py

@@ -1,5 +1,6 @@
 from django import forms
-from dbsynce.models import ServiceType, Service, Company
+from dbsynce.models import ServiceType, Service, Company, Comments
+from django.contrib.auth import get_user_model
 
 
 class ServiceTariffUpdateForm(forms.ModelForm):
@@ -53,9 +54,9 @@ class ServiceTypeUpdateForm(forms.ModelForm):
         super(ServiceTypeUpdateForm, self).__init__(*args, **kwargs)
     class Meta:
         model = ServiceType
-        fields = ['status','ticket_status','id_metaservice','codename',
-                  'description','requirements','price_type','link_agreement',
-                  'is_global','is_visible']
+        fields = ['codename','requirements','price_type','description',
+                  'caption', 'status', 'id_metaservice', 'ticket_status',
+                  'link_agreement', 'is_global','is_visible']
         widgets = {
             'status': forms.TextInput(attrs={'readonly': True}),
             'ticket_status': forms.TextInput(attrs={'readonly': True}),
@@ -69,9 +70,13 @@ PRICE_CHOICES = [
 ]
 class ServiceTypeCreateForm(forms.ModelForm):
     codename = forms.CharField(label="Название услуги")
+    caption = forms.CharField(label="Полное название")
     requirements = forms.CharField(label="Требования")
     price_type = forms.ChoiceField(choices=PRICE_CHOICES, label="Ценообразование")
+    status = forms.CharField(label="Статус")
     description = forms.CharField(label="Описание")
+    id_metaservice = forms.IntegerField(label="ID метасервиса")
+    link_agreement = forms.CharField(label="Ссылка на договор вики")
     is_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
     is_visible = forms.BooleanField(label="Доступно для планирования цепочек во всех сервисах", required=False)
 
@@ -79,28 +84,25 @@ class ServiceTypeCreateForm(forms.ModelForm):
         super(ServiceTypeCreateForm, self).__init__(*args, **kwargs)
     class Meta:
         model = ServiceType
-        fields = ['codename','requirements', 'price_type',
-                  'description',
-                  'is_global','is_visible',]
+        fields = ['codename','requirements', 'price_type', 'description',
+                  'caption', 'status', 'id_metaservice', 'ticket_status',
+                  'link_agreement', 'is_global','is_visible', ]
 
         widgets = {
 
         }
 
 class CommentsCreateForm(forms.ModelForm):
-    codename = forms.CharField(label="Название услуги")
-    requirements = forms.CharField(label="Требования")
-    price_type = forms.ChoiceField(choices=PRICE_CHOICES, label="Ценообразование")
     description = forms.CharField(label="Описание")
     is_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
     is_visible = forms.BooleanField(label="Доступно для планирования цепочек во всех сервисах", required=False)
 
     def __init__(self, *args, **kwargs):
-        super(ServiceTypeCreateForm, self).__init__(*args, **kwargs)
+        super(CommentsCreateForm, self).__init__(*args, **kwargs)
     class Meta:
-        model = ServiceType
-        fields = ['codename','requirements', 'price_type',
-                  'description',
+        model = Comments
+        fields = ['description','user_id',
+                  'ticket_status', 'id_metaservice',
                   'is_global','is_visible',]
 
         widgets = {
@@ -210,4 +212,37 @@ class PartnerInformationCreateForm(forms.ModelForm):
 
 
         #     username = forms.CharField(label="Номер телефона",
-        # widget=forms.TextInput(attrs={'class':'form-control'}))
+        # widget=forms.TextInput(attrs={'class':'form-control'}))
+
+class UserDataForm(forms.ModelForm):
+    password1 = forms.CharField(label="Пароль",
+        widget=forms.PasswordInput(attrs={'class':'form-control'}))
+    
+    password2 = forms.CharField(label="Подтверждение пароля",
+        widget=forms.PasswordInput(attrs={'class':'form-control'}))
+
+    phone_number = forms.CharField(label="Номер телефона",
+        widget=forms.TextInput(attrs={'class':'form-control'}))
+    
+    email = forms.CharField(label="Email",
+        widget=forms.TextInput(attrs={'class':'form-control'}))
+    
+    username = forms.CharField(label="Имя пользователя",
+        widget=forms.TextInput(attrs={'class':'form-control'}))
+    
+    first_name = forms.CharField(label="Имя",
+        widget=forms.TextInput(attrs={'class':'form-control'}))
+
+    last_name = forms.CharField(label="Фамилия",
+        widget=forms.TextInput(attrs={'class':'form-control'}))  
+
+    def __init__(self, *args, **kwargs):
+        super(UserDataForm, self).__init__(*args, **kwargs)
+    class Meta:
+        model = get_user_model()
+        fields = ['username', 'first_name', 'last_name', 'avatar',
+                  'phone_number', "email", 'password1', 'password2' ]
+
+        widgets = {
+
+        }        

+ 31 - 18
SharixAdmin/tables.py

@@ -144,7 +144,7 @@ class ServiceTypeTable(tables.Table):
         args=[tables.A('pk')], attrs= {"a": {"style": "pointer-events: none;"}, 'th':{'scope':'col'}, "td":{"class":"description_col"}})
     edit = tables.LinkColumn('service_type/edit/', verbose_name='', orderable=False, text = "E",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"edit_col"}})
-    deletee = tables.LinkColumn('service_type/delete/', verbose_name='', orderable=False, text = "D",
+    delete = tables.LinkColumn('service_type/delete/', verbose_name='', orderable=False, text = "D",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
     
     
@@ -165,20 +165,41 @@ class ServiceTypeTable(tables.Table):
 class CommentsTable(tables.Table):
 
     id = tables.Column( attrs={"td":{"width":"50px"}})
-    name_comment = tables.LinkColumn('service_type/edit/', verbose_name='Комментарий', orderable=False, text = lambda record: record.codename,
-        args=[tables.A('pk')], attrs= {"a": {"style": "pointer-events: none;"}, 'th':{'scope':'col'}, "td":{"class":"name_col"}})
-    description = tables.LinkColumn('service_type/edit/', orderable=False, verbose_name='Описание', text = lambda record: record.description,
+    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'), verbose_name=_('User'), attrs={"td":{"width":"15%"}})
+
+    check = tables.BooleanColumn(verbose_name='', attrs={'th':{'scope':'col'}, "td":{"width":"5%"}})
+    delete = tables.LinkColumn('comments/delete/', verbose_name='', orderable=False, text = "D",
+        args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
+    status = tables.Column(verbose_name=_('Status'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
+    
+    class Meta:
+        model = Comments
+        attrs = {"class": "table table-layout-fixed text-start"}
+        exclude = ('ticket_status', 'id_metaservice',
+                   'is_global', 'is_visible')
+        
+    def render_check(self, value, record):
+        if record.status == 'active':
+            return format_html('<input class="form-check-input status-toggle" checked type="checkbox" id="flexCheckDefault" data-comments-id="{}">', record.id)
+        else:
+            return format_html('<input class="form-check-input status-toggle" type="checkbox" id="flexCheckDefault" data-comments-id="{}">', record.id)
+
+class TechSupTable(tables.Table):
+
+    id = tables.Column( attrs={"td":{"width":"50px"}})
+    user_id = tables.Column(accessor='user_id.full_name', order_by=('user_id.first_name', 'user_id.last_name'), verbose_name=_('User'), attrs={"td":{"width":"15%"}})
+    description = tables.LinkColumn('tech_support/edit/', orderable=False, verbose_name='Описание', text = lambda record: record.description,
         args=[tables.A('pk')], attrs= {"a": {"style": "pointer-events: none;"}, 'th':{'scope':'col'}, "td":{"class":"description_col"}})
-    edit = tables.LinkColumn('service_type/edit/', verbose_name='', orderable=False, text = "E",
+    edit = tables.LinkColumn('tech_support/edit/', verbose_name='', orderable=False, text = "E",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"edit_col"}})
-    deletee = tables.LinkColumn('service_type/delete/', verbose_name='', orderable=False, text = "D",
+    delete = tables.LinkColumn('tech_support/delete/', verbose_name='', orderable=False, text = "D",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
-    
+    status = tables.Column(verbose_name=_('Status'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}}) 
     
     class Meta:
-        model = ServiceType
+        model = Comments
         attrs = {"class": "table table-layout-fixed text-start"}
-        exclude = ('ticket_status',
+        exclude = ('ticket_status', 'id_metaservice',
                    'is_global', 'is_visible')
 
 class ServiceTable(tables.Table):
@@ -187,14 +208,6 @@ class ServiceTable(tables.Table):
     servicetype_id = tables.Column(verbose_name=_('Description of the service'), accessor = 'servicetype_id.caption',
         attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
     
-    # description = tables.Column(verbose_name='Название тарифа', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    # description = tables.Column(verbose_name='Описание строки тарифов', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    # price_type = tables.Column(verbose_name='Тип тарифа', attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    
-    price_km = tables.Column(verbose_name=_('Cost km.'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    price_min = tables.Column(verbose_name=_('Cost min.'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    price_amount = tables.Column(verbose_name=_('Cost of service'), attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
-    
     id_provider = tables.Column(verbose_name=_('Организатор'))
     name_service = tables.Column(verbose_name=_('Экскурсия'))
     rating = tables.Column(verbose_name=_('Рейтинг'))
@@ -217,7 +230,7 @@ class UserInfoTable(tables.Table):
 
     id = tables.Column(verbose_name=_('ID'), attrs={"td":{"width":"5%"}})
 
-    deletee = tables.LinkColumn('user_information/delete/', verbose_name='', orderable=False, text = "D",
+    delete = tables.LinkColumn('user_information/delete/', verbose_name='', orderable=False, text = "D",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
     
     class Meta:

+ 4 - 4
SharixAdmin/templates/SharixAdmin/account.html

@@ -24,15 +24,15 @@
                   {% blocktrans trimmed with request.user.id as id %}
                   <td class="p-3">{{ id }}</td>                  
                   {% endblocktrans %}
-                  <td class="p-3"><img class="mb-4" style="height: 45px;" src="{% static '{{request.user.avatar}}' %}" alt="" ></td>                 
+                  <td class="p-3"><img class="mb-4" style="height: 45px; border-radius: 50%;" src="{{ user.avatar.url }}" alt="Аватар" ></td>                 
                   {% blocktrans trimmed with request.user.username as user %}
                   <td class="p-3">{{ user }}</td>                  
                   {% endblocktrans %}
                   {% blocktrans trimmed with request.user.email as email %}
                   <td class="p-3">{{ email }}</td>                  
                   {% endblocktrans %}
-                  <td class="p-3"><img class="nav-img" src="{% static 'SharixAdmin/img/pencil.svg' %}"></td>
-                  <td class="p-3"><img class="nav-img" src="{% static 'SharixAdmin/img/trash.svg' %}"></td>
+                  <td class="p-3"><a href="/account/edit/{{ user.pk }}"><img class="nav-img" src="{% static 'SharixAdmin/img/pencil.svg' %}"></a></td>
+                  <td class="p-3"><a href="/account/delete/{{ user.pk }}"><img class="nav-img" src="{% static 'SharixAdmin/img/trash.svg' %}"></a></td>
                 </tr>
             </tbody>
         </table>
@@ -40,7 +40,7 @@
 </div>
     
 <div class="text-end mt-3">
-    <a class="btn btn-primary ps-3 pe-3" id="bord" href="*">Выйти из аккаунта</a>
+    <a class="btn btn-primary ps-3 pe-3" id="bord" href="/accounts/login/">Выйти из аккаунта</a>
 </div>
 </div>    
 {% endblock contenthome %}

+ 15 - 0
SharixAdmin/templates/SharixAdmin/account_delete.html

@@ -0,0 +1,15 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<h1 class="mainHeader">{{ title }}</h1>
+<form method="post">
+    {% csrf_token %}
+    <div class="container m-2">
+        <p>{% blocktrans %}Are you sure you want to delete \"%(object.caption)s\"?{% endblocktrans %}</p>
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="submit" name="apply" value="{% trans 'Delete' %}"/>
+    </div>
+</form>
+{% endblock %}

+ 24 - 0
SharixAdmin/templates/SharixAdmin/account_form.html

@@ -0,0 +1,24 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<div class="container">
+<h1 class="mainHeader">{{ title }}</h1>
+<form method="post" style="overflow: auto">
+    {% csrf_token %}
+    <div class="container m-2">
+        {% for field in form %}
+        {{field.errors}}
+        <div class="row">
+            {{field.label_tag}}
+            {{field}}
+            <p class="fs-6 fst-italic">{{field.help_text|truncatewords:20}}</p>
+        </div>
+        {% endfor %}
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="Submit" name="submit" value="{% trans 'Save' %}"/>
+    </div>
+</form>
+</div>
+{% endblock %}

+ 25 - 3
SharixAdmin/templates/SharixAdmin/comments.html

@@ -23,7 +23,29 @@
           </div>     
       </div>
 
-  <div class="container text-end mt-2">
-    <a class="btn btn-primary" id="bord" href="*">{% trans 'Add' %}</a>
-  </div>
+  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
+  <script>
+    // Запрос на изменения статуса исполнителя
+    $('.status-toggle').change(function() {
+      var comments_id = $(this).data('comments-id');
+      var new_status = $(this).prop('checked') ? 'active' : 'deactivated';
+      $.ajax({
+        url: '{% url "comments/change_status" %}',
+        type: 'POST',
+        data: {
+          'comments_id': comments_id,
+          'new_status': new_status,
+          'csrfmiddlewaretoken': '{{ csrf_token }}'
+        },
+        success: function(response) {
+          var scrollTop = window.pageYOffset;
+          location.reload();
+          window.scrollTo(0, scrollTop);
+        },
+        error: function(xhr, status, error) {
+          console.log(xhr.responseText);
+        }
+      });
+    });
+  </script>
 {% endblock contenthome %}

+ 15 - 0
SharixAdmin/templates/SharixAdmin/comments_delete.html

@@ -0,0 +1,15 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<h1 class="mainHeader">{{ title }}</h1>
+<form method="post">
+    {% csrf_token %}
+    <div class="container m-2">
+        <p>{% blocktrans %}Are you sure you want to delete \"%(object.caption)s\"?{% endblocktrans %}</p>
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="submit" name="apply" value="{% trans 'Delete' %}"/>
+    </div>
+</form>
+{% endblock %}

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

@@ -33,6 +33,9 @@
             <p>Balance: <b>{{ balance }} points</b></p>
             {% endblocktrans %}
             <a href="{% url 'balance' %}" class="btn btn-success">{% trans 'Buy points' %}</a>
+            <div class="text-end mt-3">
+                <a class="btn btn-primary ps-3 pe-3" id="bord" href="/accounts/login/">Выйти из аккаунта</a>
+            </div>
         </div>
     </div>
 </div>  

+ 3 - 0
SharixAdmin/templates/SharixAdmin/service.html

@@ -4,13 +4,16 @@
 
 {% block contenthome %}
     <h1 class="mainHeader">{{ title }}</h1>
+    {% if user.is_superuser %}
     <p class="description_service">Просмотр и создание новых экскурсий. Здесь админ может просматривать и добавлять экскурсии с различными данными: 
       организатор экскурсии, название экскурсии, рейтинг, цена и активация/деактивация экскурсии. Кроме того, здесь имеется сортировка, 
       позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
+      {%else%}
       <p class="description_service">Поиск и бронирование разнообразных экскурсий и туров. 
         Здесь пользователи могут найти подробную информацию о доступных экскурсиях, включая описания, 
         фотографии, цены и рейтинги. Кроме того, здесь имеется сортировка, позволяющая пользователю легко 
         настроить поиск в соответствии с предпочтениями.</p>
+        {%endif%}
     <div class="container text-center mt-2">
       {% render_table table %}
     </div>

+ 4 - 1
SharixAdmin/templates/SharixAdmin/service_information_form.html

@@ -4,10 +4,13 @@
 {% block contenthome %}
 <div class="container">
 <h1 class="mainHeader">{{ title }}</h1>
+{% if user.is_superuser %}
 <p class="description_service"> Полный обзор всей доступной информации о сервисе. 
     Администраторы могут просматривать и редактировать информацию с определенными данными: название, юр.лицо, представитель и описание сервиса. </p>
-<p class="description_service"></p>Полный обзор всей доступной информации о сервисе. Пользователи могут просматривать информацию 
+    {%else%}
+<p class="description_service">Полный обзор всей доступной информации о сервисе. Пользователи могут просматривать информацию 
     с определенными данными: название, юр.лицо, представитель и описание сервиса.</p>
+    {%endif%}
 {{object.servicetype_id.caption}}
 {{object.id_provider.company_id.address}}
 {{object.id_provider.company_id.repr_id}}

+ 1 - 1
SharixAdmin/templates/SharixAdmin/service_type_form.html

@@ -17,7 +17,7 @@
         {% endfor %}
     </div>
     <div class="text-center mt-2 mb-5">
-        <input class="btn btn-primary center" type="Submit" name="submit" value="{% trans 'Submit' %}"/>
+        <input class="btn btn-primary center" type="Submit" name="submit" value="{% trans 'Save' %}"/>
     </div>
 </form>
 </div>

+ 1 - 1
SharixAdmin/templates/SharixAdmin/tech_support.html

@@ -24,6 +24,6 @@
       </div>
 
   <div class="container text-end mt-2">
-    <a class="btn btn-primary" id="bord" href="*">{% trans 'Add' %}</a>
+    <a class="btn btn-primary" id="bord" href="/tech_support/add">{% trans 'Add' %}</a>
   </div>
 {% endblock contenthome %}

+ 15 - 0
SharixAdmin/templates/SharixAdmin/tech_support_delete.html

@@ -0,0 +1,15 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<h1 class="mainHeader">{{ title }}</h1>
+<form method="post">
+    {% csrf_token %}
+    <div class="container m-2">
+        <p>{% blocktrans %}Are you sure you want to delete \"%(object.caption)s\"?{% endblocktrans %}</p>
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="submit" name="apply" value="{% trans 'Delete' %}"/>
+    </div>
+</form>
+{% endblock %}

+ 24 - 0
SharixAdmin/templates/SharixAdmin/tech_support_form.html

@@ -0,0 +1,24 @@
+{% extends 'SharixAdmin/index.html' %}
+{% load i18n %}
+
+{% block contenthome %}
+<div class="container">
+<h1 class="mainHeader">{{ title }}</h1>
+<form method="post" style="overflow: auto">
+    {% csrf_token %}
+    <div class="container m-2">
+        {% for field in form %}
+        {{field.errors}}
+        <div class="row">
+            {{field.label_tag}}
+            {{field}}
+            <p class="fs-6 fst-italic">{{field.help_text|truncatewords:20}}</p>
+        </div>
+        {% endfor %}
+    </div>
+    <div class="text-center mt-2 mb-5">
+        <input class="btn btn-primary center" type="Submit" name="submit" value="{% trans 'Save' %}"/>
+    </div>
+</form>
+</div>
+{% endblock %}

+ 4 - 1
SharixAdmin/templates/SharixAdmin/transactions.html

@@ -5,12 +5,15 @@
 {% block contenthome %}
 <div class="container">
     <h1 class="mainHeader">{{ title }}</h1>
+    {% if user.is_superuser %}
     <p class="description_service">Полная информация обо всех заказах пользователей. 
       Админы могут просматривать детали каждого заказа, включая выбранные услуги, стоимость, дату и время заказа. 
       Также на этой странице доступна информация о статусе выполнения каждого заказа и ответственных сотрудниках. 
       Кроме того, здесь имеется сортировка, позволяющая администратору легко настроить поиск в соответствии с предпочтениями.</p>
-      <p class="description_service"></p>Полная информация обо всех заказах пользователей. Пользователи могут просматривать детали своих прошлых заказов, 
+      {%else%}
+      <p class="description_service">Полная информация обо всех заказах пользователей. Пользователи могут просматривать детали своих прошлых заказов, 
       включая выбранные услуги, стоимость, дату и время заказа.</p>
+      {%endif%}
     <h3 >{% trans 'User: ' %}{{ request.user.username }}</h3>
     <h3 >{% blocktrans %}Balance: {{ wallet.balance }} points{% endblocktrans %}</h3>
     <form class="d-flex" method="post">

+ 2 - 2
SharixAdmin/templates/SharixAdmin/user_information.html

@@ -25,7 +25,7 @@
           </div>     
       </div>
 
-  <div class="container text-end mt-2">
+  <!--<div class="container text-end mt-2">
     <a class="btn btn-primary" id="bord" href="*">{% trans 'Add' %}</a>
-  </div>
+  </div>-->
 {% endblock contenthome %}

+ 8 - 1
SharixAdmin/urls.py

@@ -22,14 +22,21 @@ urlpatterns = [
     path('balance/', balance, name='balance'),
     path('payment/', login_required(paymentView), name='payment'),
     path('payment_way/', login_required(paymentWayView), name='payment_way'),
-    path('account/', login_required(AccountView), name='account'),
 
+    path('account/', login_required(AccountView), name='account'),
+    path('account/delete/<int:pk>/', login_required(AccountDelete.as_view()), name='account/delete/'),
+    path('account/edit/<int:pk>/', login_required(AccountUpdateView.as_view()), name='account/edit/'),
 
     path('task_management/', login_required(TaskListView.as_view()), name='task_management'),
     
     path('comments/', login_required(CommentsListView.as_view()), name='comments'),
+    path('comments/change_status/', change_comments_status, name='comments/change_status'),
+    path('comments/delete/<int:pk>', login_required(CommentsDelete.as_view()), name='comments/delete/'),
 
     path('tech_support/', login_required(TechListView.as_view()), name='tech_support'),
+    path('tech_support/edit/<int:pk>', login_required(CommentsUpdateView.as_view()), name='tech_support/edit/'),
+    path('tech_support/add/', login_required(CommentsCreate.as_view()), name='tech_support/add/'),
+    path('tech_support/delete/<int:pk>', login_required(TechSupDelete.as_view()), name='tech_support/delete/'),
 
     path('partners/', login_required(PartnersListView.as_view()), name='partners'),
     path('partners/change_status/', change_partners_status, name='partners/change_status'),

+ 1 - 1
SharixAdmin/views/__init__.py

@@ -20,4 +20,4 @@ from .task_management import *
 from .comments import *
 from .tech_support  import *
 from .payment_way  import paymentWayView
-from .account  import AccountView
+from .account  import *

+ 83 - 0
SharixAdmin/views/account.py

@@ -1,5 +1,88 @@
 from django.shortcuts import render
 from django.utils.translation import gettext as _
+from django.contrib.auth import get_user_model
+from django.urls import reverse
+from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
+from django.views.generic.edit import UpdateView, DeleteView
+from SharixAdmin.forms import UserDataForm
+
+
+#class AccountUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
+    #model = get_user_model()
+    #form_class = UserDataForm
+    #template_name = "SharixAdmin/account_form.html"
+
+    #def get_queryset(self):
+        # Возвращаем текущего пользователя
+        #return get_user_model().objects.filter(id=self.request.user.id)
+    
+    #def get_context_data(self, **kwargs):
+        #context = super().get_context_data(**kwargs)
+        #context.update({
+            #'title': _('Аккаунт'),
+            #'object': self.object,
+            #"current_page": "account"
+        #})
+        #return context  
+  #
+    #def test_func(self):
+        #group_names = ('METASERVICE-ADMIN')
+        #return self.request.user.groups.filter(name=group_names).exists() or self.request.user
+    
+    #def get_success_url(self):
+        #return reverse('account')
+
+class AccountUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
+    model = get_user_model()
+    form_class = UserDataForm
+    template_name = "SharixAdmin/account_form.html"
+
+    def get_queryset(self):
+        # Возвращаем текущего пользователя
+        return get_user_model().objects.all()
+
+    def get_object(self, queryset=None):
+        # Получаем объект по pk или slug
+        pk = self.kwargs.get('pk')
+        if pk is not None:
+            try:
+                obj = self.model.objects.get(pk=pk)
+            except self.model.DoesNotExist:
+                raise Http404(_("No %(verbose_name)s found matching the query") % {'verbose_name': self.model._meta.verbose_name})
+            return obj
+
+    def test_func(self):
+        # Проверяем, что пользователь имеет право редактировать свой аккаунт
+        account = self.get_object()
+        if account == self.request.user:
+            return True
+        else:
+            return False
+
+    def get_success_url(self):
+        return reverse('account')
+
+class AccountDelete(UserPassesTestMixin, DeleteView):
+    model = get_user_model()
+    template_name = "SharixAdmin/account_delete.html"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'title': 'Аккаунт',
+            'object': self.object,
+            "current_page": "account"
+        })
+        return context
+    
+    def get_success_url(self):
+        return reverse('account')
+    
+    def test_func(self) -> bool or None:
+        group_names = ('METASERVICE-ADMIN')
+        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:
+            return True
+        return False
 
 def AccountView(request):
     context = {

+ 72 - 9
SharixAdmin/views/comments.py

@@ -3,32 +3,35 @@ from django.views.generic.edit import UpdateView, CreateView, DeleteView
 from SharixAdmin.tables import CommentsTable
 from django.contrib.auth.mixins import UserPassesTestMixin
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
-from dbsynce.models import ServiceType
+from dbsynce.models import Comments
 from django.urls import reverse
 from django.utils.translation import gettext as _
+from SharixAdmin.groups import group_required
+from django.contrib.auth.decorators import login_required
+from django.http import JsonResponse
 
     
     
 class CommentsCreate(UserPassesTestMixin, CreateView):
-    model = ServiceType
+    model = Comments
     form_class = CommentsCreateForm
-    template_name = "SharixAdmin/service_type_form.html"
+    template_name = "SharixAdmin/tech_support_form.html"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
-            'title': _('Комментарии'),
+            'title': _('Техническая поддержка'),
             'object': self.object,
-            "current_page": "comments"
+            "current_page": "tech_support"
         })
         return context
     
     def get_success_url(self):
-        return reverse('comments')
+        return reverse('tech_support')
     
     def test_func(self) -> bool or None:
         group_names = ('METASERVICE-ADMIN')
-        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
+        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:
             return True
         return False
     
@@ -37,7 +40,7 @@ class CommentsCreate(UserPassesTestMixin, CreateView):
 
 class CommentsListView(UserPassesTestMixin, SingleTableView):
     table_class = CommentsTable
-    queryset = ServiceType.objects.all()
+    queryset = Comments.objects.all()
     template_name = 'SharixAdmin/comments.html'
 
     def get_context_data(self, **kwargs):
@@ -57,4 +60,64 @@ class CommentsListView(UserPassesTestMixin, SingleTableView):
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
             return True
-        return False
+        return False
+
+
+class CommentsUpdateView(UserPassesTestMixin, UpdateView):
+    model = Comments
+    form_class = CommentsCreateForm
+    template_name = "SharixAdmin/tech_support_form.html"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'title': _('Комментарии'),
+            'object': self.object,
+            "current_page": "tech_support"
+        })
+        return context
+    
+    
+    def test_func(self) -> bool or None:
+        group_names = ('METASERVICE-ADMIN')
+        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:
+            return True
+        return False
+    
+    def get_success_url(self):
+        return reverse('tech_support')
+
+class CommentsDelete(UserPassesTestMixin, DeleteView):
+    model = Comments
+    template_name = "SharixAdmin/comments_delete.html"
+
+    def get_context_data(self, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context.update({
+            'title': 'Комментарии',
+            'object': self.object,
+            "current_page": "comments"
+        })
+        return context
+    
+    def get_success_url(self):
+        return reverse('comments')
+    
+    def test_func(self) -> bool or None:
+        group_names = ('METASERVICE-ADMIN')
+        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
+            return True
+        return False
+
+@login_required
+@group_required('METASERVICE-ADMIN')
+def change_comments_status(request):
+    if request.method == 'POST':
+        comments_id = request.POST.get('comments_id')
+        new_status = request.POST.get('new_status')
+        comments = Comments.objects.get(pk=comments_id)
+        comments.status = new_status
+        comments.save()
+        return JsonResponse({'status': 'success'})
+    else:
+        return JsonResponse({'status': 'error'})

+ 22 - 27
SharixAdmin/views/tech_support.py

@@ -1,58 +1,53 @@
 from django_tables2 import SingleTableView
 from django.views.generic.edit import UpdateView, CreateView, DeleteView
-from SharixAdmin.tables import CommentsTable
+from SharixAdmin.tables import TechSupTable
 from django.contrib.auth.mixins import UserPassesTestMixin
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
-from dbsynce.models import ServiceType
+from dbsynce.models import Comments
 from django.urls import reverse
-from django.utils.translation import gettext as _
+from django.utils.translation import gettext as _    
+       
 
-    
-    
-class TechCreate(UserPassesTestMixin, CreateView):
-    model = ServiceType
-    form_class = CommentsCreateForm
-    template_name = "SharixAdmin/service_type_form.html"
+class TechListView(UserPassesTestMixin, SingleTableView):
+    table_class = TechSupTable
+    queryset = Comments.objects.all()
+    template_name = 'SharixAdmin/tech_support.html'
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
-            'title': _('Техническая поддержка'),
-            'object': self.object,
+            'title': 'Техническая поддержка',
+            'object_list': context['object_list'],
             "current_page": "tech_support"
         })
         return context
     
-    def get_success_url(self):
-        return reverse('tech_support')
-    
+    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:
         group_names = ('METASERVICE-ADMIN')
-        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user.is_superuser:
+        if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:
             return True
         return False
     
-    
-       
-
-class TechListView(UserPassesTestMixin, SingleTableView):
-    table_class = CommentsTable
-    queryset = ServiceType.objects.all()
-    template_name = 'SharixAdmin/tech_support.html'
+class TechSupDelete(UserPassesTestMixin, DeleteView):
+    model = Comments
+    template_name = "SharixAdmin/tech_support_delete.html"
 
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context.update({
             'title': 'Техническая поддержка',
-            'object_list': context['object_list'],
+            'object': self.object,
             "current_page": "tech_support"
         })
         return context
     
-    def testing(self, queryset, is_descending):
-        queryset = queryset.annotate.order_by("-" if is_descending else "")
-        return (queryset, True)
-
+    def get_success_url(self):
+        return reverse('tech_support')
+    
     def test_func(self) -> bool or None:
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:

+ 1 - 1
SharixAdmin/views/user_info.py

@@ -34,7 +34,7 @@ class UserListView(UserPassesTestMixin, SingleTableView):
         return False
 
 class UserDelete(UserPassesTestMixin, DeleteView):
-    model = UserInfoTable
+    model = get_user_model()
     template_name = "SharixAdmin/user_information_delete.html"
 
     def get_context_data(self, **kwargs):