diff --git a/AuthApp/js_urls.py b/AuthApp/js_urls.py index d8fce57..6b0ecd8 100644 --- a/AuthApp/js_urls.py +++ b/AuthApp/js_urls.py @@ -14,6 +14,9 @@ urlpatterns = [ path('my_routes/', my_routes_ajax, name='my_routes_ajax'), path('subscribe/', subscribe_ajax, name='subscribe_ajax'), path('new_msg_to_user/', new_msg_to_user_ajax, name='new_msg_to_user' ), + path('new_msg_to_support/', new_msg_to_support_ajax, name='new_msg_to_support_ajax'), + path('support_create_ticket_ajax/', support_create_ticket_ajax, name='support_create_ticket_ajax'), + path('change_profile/', change_profile_ajax, name='change_profile_ajax'), ] \ No newline at end of file diff --git a/AuthApp/js_views.py b/AuthApp/js_views.py index 9b7088a..a1c0ff0 100644 --- a/AuthApp/js_views.py +++ b/AuthApp/js_views.py @@ -43,6 +43,21 @@ def new_msg_to_support_ajax(request): html = render_to_string('blocks/profile/b_new_msg_to_support.html', Dict, request=request) return JsonResponse({'html': html}, status=200) + +def support_create_ticket_ajax(request): + from ChatServiceApp.forms import CreateTicketForm + + if request.method != 'POST': + raise Http404 + + Dict = { + 'forms': CreateTicketForm() + } + + html = render_to_string('blocks/profile/b_create_ticket.html', Dict, request=request) + return JsonResponse({'html': html}, status=200) + + def change_profile_ajax(request): if request.method != 'POST': raise Http404 diff --git a/ChatServiceApp/__init__.py b/ChatServiceApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ChatServiceApp/admin.py b/ChatServiceApp/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/ChatServiceApp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/ChatServiceApp/apps.py b/ChatServiceApp/apps.py new file mode 100644 index 0000000..d497496 --- /dev/null +++ b/ChatServiceApp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ChatserviceappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'ChatServiceApp' diff --git a/ChatServiceApp/forms.py b/ChatServiceApp/forms.py new file mode 100644 index 0000000..91cc81a --- /dev/null +++ b/ChatServiceApp/forms.py @@ -0,0 +1,17 @@ +from django import forms +from django.contrib.auth.forms import AuthenticationForm +from django.utils.translation import gettext_lazy as _ +from django.core.exceptions import ValidationError +from .models import * + + +class CreateTicketForm(forms.ModelForm): + text = forms.CharField(required=True) + # files = forms.CharField(required=True) + class Meta: + model = MsgGroup + exclude = [ + 'files' + # 'name', 'name_plural', 'order', 'createDT', 'modifiedDT', 'enable', 'json_data', + # 'receive_msg_by_sms', 'owner', 'owner_type' + ] \ No newline at end of file diff --git a/ChatServiceApp/migrations/0001_initial.py b/ChatServiceApp/migrations/0001_initial.py new file mode 100644 index 0000000..448620a --- /dev/null +++ b/ChatServiceApp/migrations/0001_initial.py @@ -0,0 +1,58 @@ +# Generated by Django 4.2.2 on 2023-07-31 14:34 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='MsgGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('department', models.CharField(choices=[('support', 'Отдел: Техническая поддержка'), ('finance', 'Отдел: Финансовый департамент')], default='support', verbose_name='Отдел')), + ('status', models.CharField(choices=[('open', 'Открыт'), ('answered', 'Отвечен'), ('closed', 'Закрыт')], default='open', verbose_name='Статус')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('msg_type', models.CharField(choices=[('support', 'техподдержка'), ('private', 'личное')], default='private', max_length=50, verbose_name='Тип сообщения')), + ('text', models.TextField(verbose_name='Сообщение')), + ('status', models.CharField(choices=[('sended', 'Отправлено'), ('seen', 'Просмотрено')], default='sended', verbose_name='Статус')), + ('files', models.JSONField(default=dict, verbose_name='Прикрепленные файлы')), + ('group', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rel_messages_for_group', to='ChatServiceApp.msggroup', verbose_name='Группа сообщений')), + ('receiver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_messages_for_receiver', to=settings.AUTH_USER_MODEL, verbose_name='Получатель')), + ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_messages_for_sender', to=settings.AUTH_USER_MODEL, verbose_name='Отправитель')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/ChatServiceApp/migrations/__init__.py b/ChatServiceApp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ChatServiceApp/models.py b/ChatServiceApp/models.py new file mode 100644 index 0000000..b55eb1f --- /dev/null +++ b/ChatServiceApp/models.py @@ -0,0 +1,53 @@ +from django.db import models +from BaseModels.base_models import BaseModel + + +msg_type_choices = ( + ('support', 'техподдержка'), + ('private', 'личное') +) + +msg_status_choices = ( + ('sended', 'Отправлено'), + ('seen', 'Просмотрено') +) + +grp_msg_status = ( + ('open', 'Открыт'), + ('answered', 'Отвечен'), + ('closed', 'Закрыт') +) + + +grp_msg_department = ( + ('support', 'Отдел: Техническая поддержка'), + ('finance', 'Отдел: Финансовый департамент'), +) + + +class MsgGroup(BaseModel): + department = models.CharField(verbose_name='Отдел', default='support', choices=grp_msg_department) + status = models.CharField(verbose_name='Статус', default='open', choices=grp_msg_status) + +class Message(BaseModel): + from AuthApp.models import User + + msg_type = models.CharField(max_length=50, verbose_name='Тип сообщения', default='private', choices=msg_type_choices) + group = models.ForeignKey( + MsgGroup, verbose_name='Группа сообщений', related_name='rel_messages_for_group', + on_delete=models.SET_NULL, null=True) + + sender = models.ForeignKey( + User, verbose_name='Отправитель', on_delete=models.CASCADE, related_name='rel_messages_for_sender' + ) + receiver = models.ForeignKey( + User, verbose_name='Получатель', on_delete=models.CASCADE, related_name='rel_messages_for_receiver' + ) + + text = models.TextField(verbose_name='Сообщение') + + status = models.CharField(verbose_name='Статус', default='sended', choices=msg_status_choices) + + files = models.JSONField(verbose_name='Прикрепленные файлы', default=dict) + + diff --git a/ChatServiceApp/tests.py b/ChatServiceApp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/ChatServiceApp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/ChatServiceApp/views.py b/ChatServiceApp/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/ChatServiceApp/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/RoutesApp/migrations/0004_alter_route_type_transport.py b/RoutesApp/migrations/0004_alter_route_type_transport.py new file mode 100644 index 0000000..c80d36d --- /dev/null +++ b/RoutesApp/migrations/0004_alter_route_type_transport.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2023-07-31 14:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('RoutesApp', '0003_alter_route_type_transport'), + ] + + operations = [ + migrations.AlterField( + model_name='route', + name='type_transport', + field=models.CharField(choices=[('', '-- Выберите cпособ перевозки --'), ('avia', 'Авиатранспорт'), ('road', 'Наземный транспорт')], default='', verbose_name='Выберите способ перевозки'), + ), + ] diff --git a/TWB/settings.py b/TWB/settings.py index 24a9513..faae81a 100644 --- a/TWB/settings.py +++ b/TWB/settings.py @@ -48,6 +48,7 @@ INSTALLED_APPS = [ 'AuthApp', 'RoutesApp', 'ReferenceDataApp', + 'ChatServiceApp', ] MIDDLEWARE = [