فهرست منبع

made changes in whole project 1

kateshev14 1 سال پیش
والد
کامیت
16f0bf5f4a

+ 2 - 1
SharixAdmin/forms/company.py

@@ -13,4 +13,5 @@ class CompanyCreateForm(forms.ModelForm):
 
 
     class Meta:
     class Meta:
         model = Company
         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 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):
 class ServiceTariffUpdateForm(forms.ModelForm):
@@ -53,9 +54,9 @@ class ServiceTypeUpdateForm(forms.ModelForm):
         super(ServiceTypeUpdateForm, self).__init__(*args, **kwargs)
         super(ServiceTypeUpdateForm, self).__init__(*args, **kwargs)
     class Meta:
     class Meta:
         model = ServiceType
         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 = {
         widgets = {
             'status': forms.TextInput(attrs={'readonly': True}),
             'status': forms.TextInput(attrs={'readonly': True}),
             'ticket_status': forms.TextInput(attrs={'readonly': True}),
             'ticket_status': forms.TextInput(attrs={'readonly': True}),
@@ -69,9 +70,13 @@ PRICE_CHOICES = [
 ]
 ]
 class ServiceTypeCreateForm(forms.ModelForm):
 class ServiceTypeCreateForm(forms.ModelForm):
     codename = forms.CharField(label="Название услуги")
     codename = forms.CharField(label="Название услуги")
+    caption = forms.CharField(label="Полное название")
     requirements = forms.CharField(label="Требования")
     requirements = forms.CharField(label="Требования")
     price_type = forms.ChoiceField(choices=PRICE_CHOICES, label="Ценообразование")
     price_type = forms.ChoiceField(choices=PRICE_CHOICES, label="Ценообразование")
+    status = forms.CharField(label="Статус")
     description = 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_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
     is_visible = 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)
         super(ServiceTypeCreateForm, self).__init__(*args, **kwargs)
     class Meta:
     class Meta:
         model = ServiceType
         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 = {
         widgets = {
 
 
         }
         }
 
 
 class CommentsCreateForm(forms.ModelForm):
 class CommentsCreateForm(forms.ModelForm):
-    codename = forms.CharField(label="Название услуги")
-    requirements = forms.CharField(label="Требования")
-    price_type = forms.ChoiceField(choices=PRICE_CHOICES, label="Ценообразование")
     description = forms.CharField(label="Описание")
     description = forms.CharField(label="Описание")
     is_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
     is_global = forms.BooleanField(label="Доступно во всех сервисах", required=False)
     is_visible = forms.BooleanField(label="Доступно для планирования цепочек во всех сервисах", required=False)
     is_visible = forms.BooleanField(label="Доступно для планирования цепочек во всех сервисах", required=False)
 
 
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
-        super(ServiceTypeCreateForm, self).__init__(*args, **kwargs)
+        super(CommentsCreateForm, self).__init__(*args, **kwargs)
     class Meta:
     class Meta:
-        model = ServiceType
-        fields = ['codename','requirements', 'price_type',
-                  'description',
+        model = Comments
+        fields = ['description','user_id',
+                  'ticket_status', 'id_metaservice',
                   'is_global','is_visible',]
                   'is_global','is_visible',]
 
 
         widgets = {
         widgets = {
@@ -210,4 +212,37 @@ class PartnerInformationCreateForm(forms.ModelForm):
 
 
 
 
         #     username = forms.CharField(label="Номер телефона",
         #     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"}})
         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('service_type/edit/', verbose_name='', orderable=False, text = "E",
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"edit_col"}})
         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"}})
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
     
     
     
     
@@ -165,20 +165,41 @@ class ServiceTypeTable(tables.Table):
 class CommentsTable(tables.Table):
 class CommentsTable(tables.Table):
 
 
     id = tables.Column( attrs={"td":{"width":"50px"}})
     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"}})
         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"}})
         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"}})
         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:
     class Meta:
-        model = ServiceType
+        model = Comments
         attrs = {"class": "table table-layout-fixed text-start"}
         attrs = {"class": "table table-layout-fixed text-start"}
-        exclude = ('ticket_status',
+        exclude = ('ticket_status', 'id_metaservice',
                    'is_global', 'is_visible')
                    'is_global', 'is_visible')
 
 
 class ServiceTable(tables.Table):
 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',
     servicetype_id = tables.Column(verbose_name=_('Description of the service'), accessor = 'servicetype_id.caption',
         attrs={'th':{'scope':'col'}, "td":{"width":"20%"}})
         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=_('Организатор'))
     id_provider = tables.Column(verbose_name=_('Организатор'))
     name_service = tables.Column(verbose_name=_('Экскурсия'))
     name_service = tables.Column(verbose_name=_('Экскурсия'))
     rating = 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%"}})
     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"}})
         args=[tables.A('pk')], attrs={'th':{'scope':'col'}, "td":{"class":"delete_col"}})
     
     
     class Meta:
     class Meta:

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

@@ -24,15 +24,15 @@
                   {% blocktrans trimmed with request.user.id as id %}
                   {% blocktrans trimmed with request.user.id as id %}
                   <td class="p-3">{{ id }}</td>                  
                   <td class="p-3">{{ id }}</td>                  
                   {% endblocktrans %}
                   {% 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 %}
                   {% blocktrans trimmed with request.user.username as user %}
                   <td class="p-3">{{ user }}</td>                  
                   <td class="p-3">{{ user }}</td>                  
                   {% endblocktrans %}
                   {% endblocktrans %}
                   {% blocktrans trimmed with request.user.email as email %}
                   {% blocktrans trimmed with request.user.email as email %}
                   <td class="p-3">{{ email }}</td>                  
                   <td class="p-3">{{ email }}</td>                  
                   {% endblocktrans %}
                   {% 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>
                 </tr>
             </tbody>
             </tbody>
         </table>
         </table>
@@ -40,7 +40,7 @@
 </div>
 </div>
     
     
 <div class="text-end mt-3">
 <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>
 </div>    
 </div>    
 {% endblock contenthome %}
 {% 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>
       </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 %}
 {% 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>
             <p>Balance: <b>{{ balance }} points</b></p>
             {% endblocktrans %}
             {% endblocktrans %}
             <a href="{% url 'balance' %}" class="btn btn-success">{% trans 'Buy points' %}</a>
             <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>
     </div>
 </div>  
 </div>  

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

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

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

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

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

@@ -17,7 +17,7 @@
         {% endfor %}
         {% endfor %}
     </div>
     </div>
     <div class="text-center mt-2 mb-5">
     <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>
     </div>
 </form>
 </form>
 </div>
 </div>

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

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

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

@@ -25,7 +25,7 @@
           </div>     
           </div>     
       </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>
     <a class="btn btn-primary" id="bord" href="*">{% trans 'Add' %}</a>
-  </div>
+  </div>-->
 {% endblock contenthome %}
 {% endblock contenthome %}

+ 8 - 1
SharixAdmin/urls.py

@@ -22,14 +22,21 @@ urlpatterns = [
     path('balance/', balance, name='balance'),
     path('balance/', balance, name='balance'),
     path('payment/', login_required(paymentView), name='payment'),
     path('payment/', login_required(paymentView), name='payment'),
     path('payment_way/', login_required(paymentWayView), name='payment_way'),
     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('task_management/', login_required(TaskListView.as_view()), name='task_management'),
     
     
     path('comments/', login_required(CommentsListView.as_view()), name='comments'),
     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/', 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/', login_required(PartnersListView.as_view()), name='partners'),
     path('partners/change_status/', change_partners_status, name='partners/change_status'),
     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 .comments import *
 from .tech_support  import *
 from .tech_support  import *
 from .payment_way  import paymentWayView
 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.shortcuts import render
 from django.utils.translation import gettext as _
 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):
 def AccountView(request):
     context = {
     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 SharixAdmin.tables import CommentsTable
 from django.contrib.auth.mixins import UserPassesTestMixin
 from django.contrib.auth.mixins import UserPassesTestMixin
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
-from dbsynce.models import ServiceType
+from dbsynce.models import Comments
 from django.urls import reverse
 from django.urls import reverse
 from django.utils.translation import gettext as _
 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):
 class CommentsCreate(UserPassesTestMixin, CreateView):
-    model = ServiceType
+    model = Comments
     form_class = CommentsCreateForm
     form_class = CommentsCreateForm
-    template_name = "SharixAdmin/service_type_form.html"
+    template_name = "SharixAdmin/tech_support_form.html"
 
 
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
-            'title': _('Комментарии'),
+            'title': _('Техническая поддержка'),
             'object': self.object,
             'object': self.object,
-            "current_page": "comments"
+            "current_page": "tech_support"
         })
         })
         return context
         return context
     
     
     def get_success_url(self):
     def get_success_url(self):
-        return reverse('comments')
+        return reverse('tech_support')
     
     
     def test_func(self) -> bool or None:
     def test_func(self) -> bool or None:
         group_names = ('METASERVICE-ADMIN')
         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 True
         return False
         return False
     
     
@@ -37,7 +40,7 @@ class CommentsCreate(UserPassesTestMixin, CreateView):
 
 
 class CommentsListView(UserPassesTestMixin, SingleTableView):
 class CommentsListView(UserPassesTestMixin, SingleTableView):
     table_class = CommentsTable
     table_class = CommentsTable
-    queryset = ServiceType.objects.all()
+    queryset = Comments.objects.all()
     template_name = 'SharixAdmin/comments.html'
     template_name = 'SharixAdmin/comments.html'
 
 
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):
@@ -57,4 +60,64 @@ class CommentsListView(UserPassesTestMixin, SingleTableView):
         group_names = ('METASERVICE-ADMIN')
         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.is_superuser:
             return True
             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_tables2 import SingleTableView
 from django.views.generic.edit import UpdateView, CreateView, DeleteView
 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 django.contrib.auth.mixins import UserPassesTestMixin
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
 from SharixAdmin.forms import CommentsCreateForm, ServiceTypeUpdateForm
-from dbsynce.models import ServiceType
+from dbsynce.models import Comments
 from django.urls import reverse
 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):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
-            'title': _('Техническая поддержка'),
-            'object': self.object,
+            'title': 'Техническая поддержка',
+            'object_list': context['object_list'],
             "current_page": "tech_support"
             "current_page": "tech_support"
         })
         })
         return context
         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:
     def test_func(self) -> bool or None:
         group_names = ('METASERVICE-ADMIN')
         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 True
         return False
         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):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context = super().get_context_data(**kwargs)
         context.update({
         context.update({
             'title': 'Техническая поддержка',
             'title': 'Техническая поддержка',
-            'object_list': context['object_list'],
+            'object': self.object,
             "current_page": "tech_support"
             "current_page": "tech_support"
         })
         })
         return context
         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:
     def test_func(self) -> bool or None:
         group_names = ('METASERVICE-ADMIN')
         group_names = ('METASERVICE-ADMIN')
         if bool(self.request.user.groups.filter(name=group_names)) or self.request.user:
         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
         return False
 
 
 class UserDelete(UserPassesTestMixin, DeleteView):
 class UserDelete(UserPassesTestMixin, DeleteView):
-    model = UserInfoTable
+    model = get_user_model()
     template_name = "SharixAdmin/user_information_delete.html"
     template_name = "SharixAdmin/user_information_delete.html"
 
 
     def get_context_data(self, **kwargs):
     def get_context_data(self, **kwargs):