Merge remote-tracking branch 'origin/main'

This commit is contained in:
SDE
2023-08-06 17:14:03 +03:00
30 changed files with 765 additions and 97 deletions

View File

@@ -15,7 +15,7 @@ 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('chats/', chats_ajax, name='chats_ajax'),
path('support_tickets/', support_tickets_ajax, name='support_tickets_ajax'),

View File

@@ -25,14 +25,14 @@ def subscribe_ajax(request):
return JsonResponse({'html': html}, status=200)
@login_required(login_url='/profile/login/')
def new_msg_to_user_ajax(request):
def chats_ajax(request):
if request.method != 'POST':
raise Http404
Dict = {
}
html = render_to_string('blocks/profile/b_new_msg_to_user.html', Dict, request=request)
html = render_to_string('blocks/profile/b_chats.html', Dict, request=request)
return JsonResponse({'html': html}, status=200)
@login_required(login_url='/profile/login/')

View File

@@ -9,6 +9,8 @@ urlpatterns = [
path('registration/', registration_View, name='registration_page'),
path('', user_profile_View, name='user_profile'),
path('chat/<int:user_id>/', chat_w_user_View, name='chat_w_user'),
path('chat/', chat_w_user_View, name='chat_w_user_wo_user_id'),
path('login/', login_View, name='login_profile'),

View File

@@ -22,6 +22,34 @@ def registration_View(request):
return HttpResponse(t.render(Dict, request))
@login_required(login_url='/profile/login/')
def chat_w_user_View(request, user_id=None):
from ChatServiceApp.funcs import get_chat_receivers_for_user, get_msgs_for_chat_w_users
receivers = get_chat_receivers_for_user(request.user)
cur_chat_msgs = None
try:
cur_receiver = User.objects.get(id=user_id)
if not cur_receiver in receivers:
receivers.insert(0, cur_receiver)
cur_chat_msgs = get_msgs_for_chat_w_users(request.user, cur_receiver)
except User.DoesNotExist:
cur_receiver = None
Dict = {
'page': 'chat',
'cur_receiver': cur_receiver,
'receivers': receivers,
'messages':cur_chat_msgs
}
t = loader.get_template('pages/profile/p_user_profile.html')
return HttpResponse(t.render(Dict, request))
@login_required(login_url='/profile/login/')
def user_profile_View(request):

View File

@@ -1,4 +1,27 @@
from .models import *
from django.db.models import Q
def get_msgs_for_chat_w_users(user1, user2):
msgs = Message.objects.filter(
Q(sender=user1) | Q(receiver=user1),
Q(sender=user2) | Q(receiver=user2),
group=None
)
return msgs
def get_chat_receivers_for_user(user):
receivers = Message.objects.filter(
Q(sender=user) | Q(receiver=user),
group=None
).order_by('-modifiedDT').values('sender', 'receiver')
receivers_list = []
receivers_list.extend([item['sender'] for item in receivers if item['sender'] != user])
receivers_list.extend([item['receiver'] for item in receivers if item['receiver'] != user])
return receivers_list
def get_messages_for_ticket(ticket):
return ticket.rel_messages_for_group.filter(enable=True).order_by('-modifiedDT')

View File

@@ -11,4 +11,5 @@ urlpatterns = [
path('create_ticket/', create_ticket_ajax, name='create_ticket_ajax'),
path('support_show_chat_by_ticket/', support_show_chat_by_ticket_ajax, name='support_show_chat_by_ticket_ajax'),
path('send_msg/', send_msg_ajax, name='send_msg_ajax'),
path('show_chat_w_user/', show_chat_w_user_ajax, name='show_chat_w_user_ajax'),
]

View File

@@ -15,6 +15,34 @@ from .funcs import *
import json
@login_required(login_url='/profile/login/')
def show_chat_w_user_ajax(request):
if request.method != 'POST':
raise Http404
try:
data = json.loads(request.body)
from AuthApp.models import User
cur_receiver = User.objects.get(id=data['user_id'])
Dict = {
'cur_receiver': cur_receiver,
'messages': get_msgs_for_chat_w_users(request.user, cur_receiver),
}
tpl_name = 'blocks/profile/b_chats.html'
html = render_to_string(tpl_name, Dict, request=request)
return JsonResponse({'html': html}, status=200)
except Exception as e:
msg = f'show_chat_w_user_ajax Error = {str(e)}'
return JsonResponse({'error': msg}, status=400)
@login_required(login_url='/profile/login/')
def send_msg_ajax(request):
from AuthApp.models import User

View File

@@ -17,10 +17,12 @@ def get_msg_side(cur_user, ticket, msg):
return 'right'
else:
return 'left'
else:
elif ticket:
if ticket.owner == cur_user:
return 'right'
else:
return 'left'
else:
return 'right'
# return 'left'

View File

@@ -2,7 +2,7 @@ from sets.admin import *
from .models import *
from django.contrib import admin
class Admin_Route(Admin_Trans_BaseModelViewPage):
class Admin_Route(Admin_Trans_BaseModel):
list_display = [
'id', 'type_transport', 'cargo_type',
'departure_DT', 'from_address_point', 'from_place',
@@ -10,4 +10,6 @@ class Admin_Route(Admin_Trans_BaseModelViewPage):
'order', 'modifiedDT', 'createDT'
]
list_display_links = ['id']
admin.site.register(Route,Admin_Route)

View File

@@ -1,16 +1,21 @@
from .models import *
def get_routes_for_user(user):
def get_routes_Dict(user=None):
from ReferenceDataApp.models import Airport, Country, City
if not user and user.is_authenticated:
errors_Dict = {
'errors': {
'all__': f'ошибка идентификации пользователя'
}
}
return errors_Dict
# if not user and user.is_authenticated:
# errors_Dict = {
# 'errors': {
# 'all__': f'ошибка идентификации пользователя'
# }
# }
# return errors_Dict
kwargs = {}
if user:
kwargs.update({
'owner': user
})
routes = Route.objects.filter(owner=user)
routes = Route.objects.filter(**kwargs).order_by('-modifiedDT')
res_Dict = {}

View File

@@ -14,7 +14,7 @@ from datetime import datetime
from django.template.loader import render_to_string
from django.urls import reverse
from .forms import *
from .funcs import get_routes_for_user
from .funcs import get_routes_Dict
def edit_route_ajax(request):
@@ -153,7 +153,7 @@ def get_routes_ajax(request):
raise Http404
try:
routes_Dict = get_routes_for_user(request.user)
routes_Dict = get_routes_Dict(request.user)
if 'errors' in routes_Dict:
return JsonResponse(routes_Dict, status=400)
@@ -209,7 +209,7 @@ def create_or_change_route_ajax(request, route_id=None):
obj.owner = request.user
obj.save()
routes_Dict = get_routes_for_user(request.user)
routes_Dict = get_routes_Dict(request.user)
if 'errors' in routes_Dict:
form.errors.update(routes_Dict['errors'])

10
RoutesApp/urls.py Normal file
View File

@@ -0,0 +1,10 @@
# coding=utf-8
from django.urls import path
from .views import *
from django.contrib.auth import views
urlpatterns = [
path('route_search_results/', route_search_results_View, name='route_search_results_View'),
]

View File

@@ -1,3 +1,25 @@
from django.shortcuts import render
# Create your views here.
from uuid import uuid1
from .models import *
from django.contrib import auth
from django.http import HttpResponse, Http404
from django.template import loader, RequestContext
from django.contrib.auth.decorators import login_required
from BaseModels.mailSender import techSendMail
from django.utils.translation import gettext as _
from datetime import datetime
from .funcs import *
def route_search_results_View(request):
Dict = {}
routes = get_routes_Dict()
if routes:
Dict = {
'routes': routes['routes']
}
t = loader.get_template('pages/p_results_find_route.html')
return HttpResponse(t.render(Dict, request))

View File

@@ -20,7 +20,10 @@ urlpatterns += i18n_patterns(
path('profile/', include('AuthApp.urls')),
path('user_account/', include('AuthApp.js_urls')),
path('routes/', include('RoutesApp.js_urls')),
path('routes/', include('RoutesApp.urls')),
path('messages/', include('ChatServiceApp.js_urls')),
path('reference_data/', include('ReferenceDataApp.js_urls')),

View File

@@ -6,6 +6,31 @@
width: 100% !important;
}
.text-align-center{
text-align: center;
width: 100%;
}
.title_page{
font-size: 44px;
color: #272424;
font-weight: 700;
}
.cut-width{
max-width: 1280px;
margin: auto;
}
.clear_both{
clear: both;
}
/**/
.title-profile-cont{
@@ -329,13 +354,14 @@
}
.container-messages{
height: 74%;
height: calc(74% - 70px);
width: 100%;
/*transform: rotate(180deg);*/
/* transform: rotate(180deg); */
overflow-y: auto;
/*transform: scaleY(-1);*/
/* transform: scaleY(-1); */
display: flex;
flex-direction: column-reverse;
padding-top: 70px;
}
@@ -512,6 +538,7 @@
.insert_users{
/*min-height: 440px;*/
margin-bottom: 20px;
}
/*messgae*/
@@ -581,7 +608,7 @@
.container_text_message{
width: 100%;
min-height: 60px;
/*min-height: 60px;*/
border-radius: 10px;
}
@@ -634,4 +661,298 @@
padding-top: 10px;
border-top: 1px solid #E6E6E6;
width: 100%;
}
/*p_results_find_route*/
.container_form_search_carrier{
height: 120px;
width: 100%;
background: #FFF;
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
margin-top: 60px;
margin-bottom: 40px;
border-radius: 10px;
}
.block-filters-find-route{
min-height: 660px;
background: #FFFFFF;
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
width: 30%;
float: left;
}
.block-finded-routes{
width: 68%;
float: right;
/*display: inline-block;*/
}
.carrier-card{
width: 100%;
/*height: 830px;*/
background: #FFFFFF;
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
margin-bottom: 20px;
border-radius: 10px;
/*padding: 20px;*/
}
.left-part-carrier-card{
width: 58%;
float: left;
padding: 2%;
border-right: 1px solid #E6E6E6;
}
.first-line-card-carrier{
margin-bottom: 20px;
}
.carrier-title{
font-size: 20px;
font-weight: 500;
color: #272424;
width: 50%;
float: left;
text-align: left;
display: block;
}
.type_transportation_carrier{
width: 50%;
float: right;
text-align: -webkit-right;
display: block;
}
.from-to-country-container-carrier{
width: calc(100% - 70px);
margin: auto;
background: #F8F8F8;
box-shadow: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), 0 -1px 10px 0 rgba(198, 199, 203, 0.20);
padding-top: 20px;
padding-bottom: 20px;
padding-left: 35px;
padding-right: 35px;
margin-bottom: 20px;
}
.from-to-country-text.left{
color: #272424;
font-size: 16px;
font-weight: 500;
width: 46%;
/*padding-top: 20px;*/
/*padding-bottom: 20px;*/
/*padding-left: 80px;*/
float: left;
text-align: right;
}
.from-to-country-text.right{
color: #272424;
font-size: 16px;
font-weight: 500;
width: 46%;
/*padding-top: 20px;*/
/*padding-bottom: 20px;*/
/*padding-right: 80px;*/
float: right;
text-align: left;
}
.line_inf_about_moving{
width: 100%;
margin-bottom: 20px;
}
.container_inf_about_moving.second{
margin-bottom: 0;
}
.splitter-from-to-country{
border: 1px solid #FF613A;
width: 20px;
display: inline-block;
/*width: 5%;*/
margin-bottom: 4px;
margin-left: 9px;
}
.container_inf_about_moving{
display: block;
width: 100%;
}
.carrier_inf_moving.left{
width: 41%;
float: left;
text-align: left;
}
.carrier_inf_moving.right{
width: 41%;
float: right;
text-align: right;
}
.splliter-left-right-part-carrier-card{
border: 1px solid #E6E6E6;
height: 100%;
display: inline-block;
transform: rotate(180deg) ;
position: relative;
left: 70%;
}
.inf_carrier{
padding-top: 15px;
display: block;
margin-bottom: 15px;
}
.phones_carrier{
text-decoration: none;
color: #000000;
font-size: 16px;
padding-bottom: 10px;
display: block;
}
.phones_carrier_span{
position: relative;
top: 6px;
background: linear-gradient(99deg, #040404 56%, #9f9f9f 25%, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
transition: 200ms;
width: calc(90% - 10px);
overflow: hidden;
float: right;
padding-right: 10px;
}
.inf_carrier_icon{
width: 10%;
}
.phones_carrier_span.active{
background: unset;
-webkit-background-clip: unset;
-webkit-text-fill-color: unset;
overflow: unset;
overflow-wrap: break-word;
}
.phones_carrier input{
display: none;
}
.email_carrier{
text-decoration: none;
color: #000000;
font-size: 16px;
padding-bottom: 10px;
display: block;
}
.email_carrier_span{
position: relative;
top: 5px;
background: linear-gradient(99deg, #040404 2%, #f5f5f5 16%, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
transition: 200ms;
width: calc(90% - 10px);
float: right;
overflow: hidden;
padding-right: 10px;
}
.email_carrier_span.active{
background: unset;
-webkit-background-clip: unset;
-webkit-text-fill-color: unset;
overflow: unset;
overflow-wrap: break-word;
}
.email_carrier input{
display: none;
}
.open_inf_carrier{
font-size: 16px;
font-weight: 500;
color: #272424;
border: 2px solid #FF613A;
padding: 8px 16px;
background: #FFFFFF;
transition: 200ms;
border-radius: 10px;
width: 100%;
}
.open_inf_carrier:hover{
background: #FF613A;
color: #FFFFFF;
}
.open_chat_carrier{
display: none;
}
.open_chat_carrier.active{
display: block;
font-size: 16px;
font-weight: 500;
color: #272424;
border: 2px solid #00a420;
padding: 8px 16px;
background: #FFFFFF;
border-radius: 10px;
width: 100%;
margin-bottom: 10px;
}
/*.open_chat_carrier:hover{*/
/* color: #FFFFFF;*/
/* background: #00A420;*/
/*}*/
.inf_carrier_container{
width: 33%;
float: right;
padding: 2%;
}
.title_container_inf_carrier{
font-weight: 500;
font-size: 20px;
color: #272424;
padding-bottom: 10px;
}
.name_carrier{
font-size: 16px;
color: #272424;
font-weight: 400;
position: relative;
top: 11px;
left: 4px;
}
.from-to-city-text{
font-size: 14px;
color: #27242499;
padding-top: 10px;
}
.arrow_inf_about_moving{
position: relative;
top: 19px;
left: 18px;
}

View File

@@ -106,15 +106,8 @@ html, body{
height: 100%;
}
/*uni-classes (boris)*/
.text-align-center{
text-align: center;
}
/*uno classes end (boris)*/
/*Стилизация radio button */

3
static/img/svg/arrow.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg width="96" height="10" viewBox="0 0 96 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="arrow" fill-rule="evenodd" clip-rule="evenodd" d="M96 5C96 5.21733 95.7803 5.35456 95.3409 5.62903L88.6981 9.77837C88.4399 9.93965 88.3108 10.0203 88.2152 9.99563C88.1345 9.97479 88.0652 9.9108 88.0255 9.82055C87.9785 9.7137 88.0023 9.53583 88.0497 9.1801L88.0498 9.17981C88.2598 7.60568 88.3648 6.81856 88.406 6.02668C88.4064 6.01778 88.4069 6.00889 88.4073 6H1.21333C0.543227 6 0 5.55717 0 5.0109C0 4.46464 0.543228 4.02181 1.21333 4.02181H1.24893C1.28678 3.99273 1.34312 3.99273 1.38096 4.02181H3.06945C3.10731 3.99273 3.16364 3.99273 3.20149 4.02181H4.88998C4.92783 3.99273 4.98416 3.99273 5.02201 4.02181H6.7105C6.74835 3.99273 6.80469 3.99273 6.84254 4.02181H8.53102C8.56888 3.99273 8.62521 3.99273 8.66306 4.02181H10.3515C10.3894 3.99273 10.4457 3.99273 10.4836 4.02181H12.1721C12.2099 3.99273 12.2663 3.99273 12.3041 4.02181H13.9926C14.0304 3.99273 14.0868 3.99273 14.1246 4.02181H15.8131C15.851 3.99273 15.9073 3.99273 15.9452 4.02181H17.6336C17.6715 3.99273 17.7278 3.99273 17.7657 4.02181H19.4542C19.492 3.99273 19.5484 3.99273 19.5862 4.02181H21.2747C21.3125 3.99273 21.3689 3.99273 21.4067 4.02181H23.0952C23.1331 3.99273 23.1894 3.99273 23.2272 4.02181H24.9157C24.9536 3.99273 25.0099 3.99273 25.0478 4.02181H26.7363C26.7741 3.99273 26.8304 3.99273 26.8683 4.02181H28.5568C28.5946 3.99273 28.651 3.99273 28.6888 4.02181H30.3773C30.4152 3.99273 30.4715 3.99273 30.5093 4.02181H32.1978C32.2357 3.99273 32.292 3.99273 32.3299 4.02181H34.0184C34.0562 3.99273 34.1125 3.99273 34.1504 4.02181H35.8389C35.8767 3.99273 35.9331 3.99273 35.9709 4.02181H37.6594C37.6973 3.99273 37.7536 3.99273 37.7914 4.02181H39.4799C39.5178 3.99273 39.5741 3.99273 39.612 4.02181H41.3004C41.3383 3.99273 41.3946 3.99273 41.4325 4.02181H43.121C43.1588 3.99273 43.2152 3.99273 43.253 4.02181H44.9415C44.9793 3.99273 45.0357 3.99273 45.0735 4.02181H46.762C46.7999 3.99273 46.8562 3.99273 46.894 4.02181H48.5825C48.6204 3.99273 48.6767 3.99273 48.7146 4.02181H50.4031C50.4409 3.99273 50.4972 3.99273 50.5351 4.02181H52.2236C52.2614 3.99273 52.3178 3.99273 52.3556 4.02181H54.0441C54.082 3.99273 54.1383 3.99273 54.1761 4.02181H55.8646C55.9025 3.99273 55.9588 3.99273 55.9967 4.02181H57.6852C57.723 3.99273 57.7793 3.99273 57.8172 4.02181H59.5057C59.5435 3.99273 59.5999 3.99273 59.6377 4.02181H61.3262C61.364 3.99273 61.4204 3.99273 61.4582 4.02181H63.1467C63.1846 3.99273 63.2409 3.99273 63.2788 4.02181H64.9672C65.0051 3.99273 65.0614 3.99273 65.0993 4.02181H66.7878C66.8256 3.99273 66.882 3.99273 66.9198 4.02181H68.6083C68.6461 3.99273 68.7025 3.99273 68.7403 4.02181H70.4288C70.4667 3.99273 70.523 3.99273 70.5608 4.02181H72.2493C72.2872 3.99273 72.3435 3.99273 72.3814 4.02181H74.0699C74.1077 3.99273 74.164 3.99273 74.2019 4.02181H75.8904C75.9282 3.99273 75.9846 3.99273 76.0224 4.02181H77.7109C77.7487 3.99273 77.8051 3.99273 77.8429 4.02181H79.5314C79.5693 3.99273 79.6256 3.99273 79.6635 4.02181H81.352C81.3898 3.99273 81.4461 3.99273 81.484 4.02181H83.1725C83.2103 3.99273 83.2667 3.99273 83.3045 4.02181H84.993C85.0309 3.99273 85.0872 3.99273 85.125 4.02181H86.8135C86.8514 3.99273 86.9077 3.99273 86.9456 4.02181H88.4084C88.4076 4.00564 88.4068 3.98948 88.406 3.97333C88.3648 3.18144 88.2598 2.39432 88.0498 0.820179L88.0497 0.819904C88.0023 0.464169 87.9785 0.286303 88.0255 0.179455C88.0652 0.089202 88.1345 0.0252118 88.2152 0.00437444C88.3108 -0.0202936 88.4399 0.0603426 88.6981 0.221616L88.6981 0.221631L95.3409 4.37097C95.7803 4.64544 96 4.78267 96 5Z" fill="#FF613A"/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

5
static/img/svg/email.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Icon &#34;Calendar&#34;">
<path id="Vector" d="M4 7H27M4 7V24C4 24.2652 4.10097 24.5196 4.28069 24.7071C4.46041 24.8946 4.70417 25 4.95833 25H26.0417C26.2958 25 26.5396 24.8946 26.7193 24.7071C26.899 24.5196 27 24.2652 27 24V7M4 7L15.5 18L27 7" stroke="#FF613A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 445 B

33
static/js/find_route.js Normal file
View File

@@ -0,0 +1,33 @@
function show_inf_carrier (el) {
event.preventDefault()
let form = el.form
let ph_1 = form[0]
let ph_2 = form[1]
let em_2 = form[2]
let btn_open_chat = form[3]
ph_1.parentElement.children[1].classList.toggle("active");
try {
ph_2.parentElement.children[1].classList.toggle("active");
} catch {
// p
}
em_2.parentElement.children[1].classList.toggle("active");
btn_open_chat.classList.toggle("active")
if (el.style.display === "none"){
el.style.display = ""
} else {
el.style.display = "none"
}
}
function open_chat (user_id){
event.preventDefault()
let host = window.location.origin
let user_id_ = user_id.toString()
let href = host + '/ru/profile/chat/' + user_id_
// window.location.href = host + '/profile/chat/' + user_id
window.location.replace(href)
}

View File

@@ -170,7 +170,7 @@ function selectedUserMessenger (el,ticket_id){
});
}
function sendMessage(id_ticket,sender,receiver){
function sendMessage(id_ticket=null,sender,receiver){
event.preventDefault()
let text = document.querySelector(".enter-message-inp").value
@@ -179,14 +179,24 @@ function sendMessage(id_ticket,sender,receiver){
//
}
else {
let data = {
'ticket_id': id_ticket,
'sender': sender,
'receiver': receiver,
'text': text
let data = {}
if (id_ticket === null){
data = {
'sender': sender,
'receiver': receiver,
'text': text
}
} else {
data = {
'ticket_id': id_ticket,
'sender': sender,
'receiver': receiver,
'text': text
}
}
$.ajax({
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
url: '/ru/messages/send_msg/',
@@ -247,3 +257,5 @@ function sendMessageEnter (e,id_ticket,sender,receiver){
//
}
}

View File

@@ -1,7 +1,7 @@
function writeMessage(){
$.ajax({
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
url: '/ru/user_account/new_msg_to_user/',
url: '/ru/user_account/chats/',
type: "POST",
// async: true,
cache: false,
@@ -254,7 +254,7 @@ function sendRoute(el, routeID = null){
},
error: function (data, exception){
document.querySelector(".info_profile").innerHTML = data.responseText;
document.querySelector(".info_profile").innerHTML = data.responseJSON.html;
@@ -396,8 +396,8 @@ function getRoute(){
'route_id': id
}
$.ajax({
headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() },
$.ajax({
headers: {"X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val()},
url: '/ru/routes/edit_route/',
type: "POST",
// async: true,
@@ -406,14 +406,14 @@ function getRoute(){
contentType: false,
// enctype: 'json',
data: JSON.stringify(route_obj),
success: function(data){
success: function (data) {
console.log('data received')
// location.href = '/profile'
document.querySelector(".info_profile").innerHTML = data.html;
},
error: function (data, exception){
error: function (data, exception) {
console.log(101)
}

View File

@@ -31,20 +31,10 @@
</div>
</div>
<div class="info_profile">
<h1>Добро пожаловать: <span>{{ user.first_name }} {{ user.last_name }}</span> <span>({{ user.username }})</span></h1>
<div class="profile_prof"><img class="avatar_profile" src="{{ user.user_profile.avatar }}" alt="">
<div>
<div>Статус: {{ user.user_profile.get_account_type_display }}</div>
{# <div>#}
{# <select name="" id="">#}
{# <option>Перевозчик</option>#}
{# <option>Отправитель</option>#}
{# </select></div>#}
</div>
</div>
<div>Если хотите отправить посылку - зарегистрируйтесь, как отправитель</div>
<div>Если у Вас возникнут вопросы Вы можете связаться с нами: <a href="mailto:support@twb.com">support@twb.com</a></div>
<div>У Вас <a href="#">три</a> новых сообщения. <a href="#">Посмотреть</a></div>
<div>Хотите получать уведомление о появлении посылок? <a href="#">Заполните форму</a></div>
{% if not page %}
{% include "blocks/profile/b_profile_first_page.html" %}
{% elif page == 'chat' %}
{% include "blocks/profile/b_chats.html" %}
{% endif %}
</div>
</section>

View File

@@ -0,0 +1,87 @@
{% load static %}
<div class="title-profile-cont">
<h1>Написать сообщение</h1>
</div>
{#<div class="container-messenger">#}
{# <div class="block-chat">#}
{# <div class="container-header-chat">#}
{# <div class="header-chat-left-part">#}
{# <img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">#}
{# <span class="chat-username">Сергейко Сергей</span>#}
{# </div>#}
{# <div class="header-chat-right-part">#}
{# <img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">#}
{# <img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">#}
{# </div>#}
{# </div>#}
{# <div class="container-messages">#}
{# {% include "widgets/w_message.html" %}#}
{# </div>#}
{# <div class="footer-chat">#}
{# <div class="left-part-block-enter-message">#}
{# <input class="enter-message-inp" placeholder="Отправить сообщение">#}
{# </div>#}
{# <div class="right-part-block-enter-message">#}
{# <button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>#}
{# <button class="send-message"></button>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# <div class="block-list-of-users">#}
{# <span class="title-list-of-users">Пользователи</span>#}
{# <div class="insert_users">#}
{# {% include "widgets/w_tab_user.html" %}#}
{# </div>#}
{# </div>#}
{#</div>#}
<div class="block-chat">
<div class="container-header-chat">
<div class="header-chat-left-part">
<img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">
<span class="chat-username">{{ ticket.manager.last_name }} {{ ticket.manager.first_name }}</span>
</div>
<div class="header-chat-right-part">
<img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">
<img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">
</div>
</div>
<div class="container-messages">
{% if not messages %}
{% with text=ticket.text modifiedDT=ticket.modifiedDT %}
{% include "widgets/w_message.html" %}
{% endwith %}
{% else %}
{% for msg in messages %}
{% with text=msg.text modifiedDT=msg.modifiedDT %}
{% include "widgets/w_message.html" %}
{% endwith %}
{% endfor %}
{% endif %}
</div>
<div class="footer-chat">
<div class="left-part-block-enter-message">
<input class="enter-message-inp" onkeypress="sendMessageEnter(event,{{ ticket.id }},{{ user.id }},{{ ticket.owner.id }})" placeholder="Отправить сообщение">
</div>
<div class="right-part-block-enter-message">
<button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>
<button class="send-message" onclick="sendMessage({{ ticket.id }},{{ user.id }},{{ ticket.owner.id }})"></button>
</div>
</div>
</div>
<div class="block-list-of-users">
<span class="title-list-of-users">Неразобранные тикеты</span>
<div class="insert_users">
{% if tickets_wo_manager %}
{% for item in tickets_wo_manager %}
{% include "widgets/w_tab_user.html" %}
{% endfor %}
{% endif %}
</div>
</div>

View File

@@ -46,4 +46,6 @@
{# <input class="create-ticket-file" type="file" value="">#}
</div>
</form>
</form>
<div></div>

View File

@@ -1,38 +0,0 @@
{% load static %}
<div class="title-profile-cont">
<h1>Написать сообщение</h1>
</div>
<div class="container-messenger">
<div class="block-chat">
<div class="container-header-chat">
<div class="header-chat-left-part">
<img class="chat-avatar" src="{% static "delete_later/Avatar.png" %}">
<span class="chat-username">Сергейко Сергей</span>
</div>
<div class="header-chat-right-part">
<img class="header-icons-right-part-padding" src="{% static "img/svg/phone.svg" %}">
<img class="header-icons-right-part-padding" src="{% static "img/svg/info.svg" %}">
</div>
</div>
<div class="container-messages">
{% include "widgets/w_message.html" %}
</div>
<div class="footer-chat">
<div class="left-part-block-enter-message">
<input class="enter-message-inp" placeholder="Отправить сообщение">
</div>
<div class="right-part-block-enter-message">
<button class="attach-file-btn-message" onclick="attachFilemeassge()"></button>
<button class="send-message"></button>
</div>
</div>
</div>
<div class="block-list-of-users">
<span class="title-list-of-users">Пользователи</span>
<div class="insert_users">
{% include "widgets/w_tab_user.html" %}
</div>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<h1>Добро пожаловать: <span>{{ user.first_name }} {{ user.last_name }}</span> <span>({{ user.username }})</span></h1>
<div class="profile_prof"><img class="avatar_profile" src="{{ user.user_profile.avatar }}" alt="">
<div>
<div>Статус: {{ user.user_profile.get_account_type_display }}</div>
{# <div>#}
{# <select name="" id="">#}
{# <option>Перевозчик</option>#}
{# <option>Отправитель</option>#}
{# </select></div>#}
</div>
</div>
<div>Если хотите отправить посылку - зарегистрируйтесь, как отправитель</div>
<div>Если у Вас возникнут вопросы Вы можете связаться с нами: <a href="mailto:support@twb.com">support@twb.com</a></div>
<div>У Вас <a href="#">три</a> новых сообщения. <a href="#">Посмотреть</a></div>
<div>Хотите получать уведомление о появлении посылок? <a href="#">Заполните форму</a></div>

View File

@@ -0,0 +1,30 @@
{% extends "tb_base.html" %}
{% load static %}
{% block meta %}
<script src='{% static "js/find_route.js" %}'> </script>
{% endblock %}
{% block content %}
<div class="cut-width">
<div class="text-align-center">
<h1 class="title_page">Поиск перевозчика</h1>
</div>
<div class="container_form_search_carrier">
</div>
<div class="block-find-route">
<div class="block-filters-find-route">
</div>
<div class="block-finded-routes">
{% for route in routes %}
{% include "widgets/w_carrier_card.html" %}
{% endfor %}
</div>
<div class="clear_both"></div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,31 @@
{% load static %}
<div class="container_inf_about_moving">
<div class="line_inf_about_moving">
<div class="carrier_inf_moving left">
<div>Отправка:</div>
<div class="from-to-city-text">{% if route.arrival_DT %}{{ route.arrival_DT }}{% else %}Неизвестно{% endif %}</div>
</div>
<img class="arrow_inf_about_moving" src="{% static "/img/svg/arrow.svg" %}">
<div class="carrier_inf_moving right">
<div>Прибытие:</div>
<div class="from-to-city-text">{% if route.departure_DT %}{{ route.departure_DT }}{% else %}Неизвестно{% endif %}</div>
</div>
<div class="clear_both"></div>
</div>
<div class="line_inf_about_moving second">
<div class="carrier_inf_moving left">
<div>Откуда заберёт:</div>
<div class="from-to-city-text">{% if route.from_place == 'airport' %}{{ route.from_airport }}{% else %}{{ route.get_from_place_display }}{% endif %}</div>
</div>
<img class="arrow_inf_about_moving" src="{% static "/img/svg/arrow.svg" %}">
<div class="carrier_inf_moving right">
<div>Куда доставит:</div>
<div class="from-to-city-text">{% if route.to_place == 'airport' %}{{ route.to_airport }}{% else %}{{ route.get_to_place_display }}{% endif %}</div>
</div>
<div class="clear_both"></div>
</div>
</div>

View File

@@ -8,17 +8,19 @@
<script src='{% static "js/jquery_v3_6_4.js" %}'> </script>
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
<link rel="stylesheet" href="{% static 'css/styles(boris).css' %}">
<link rel="stylesheet" href="{% static 'css/styles(boris).css' %}" >
{% block meta %}
{% endblock %}
</head>
<body>
<div class="wrapper">
{% include 'blocks/b_header.html' %}
{% block content %}

View File

@@ -0,0 +1,56 @@
{% load static %}
<div class="carrier-card">
<div class="left-part-carrier-card">
<div class="first-line-card-carrier">
<div class="carrier-title">
Перевозчик:
</div>
<div class="type_transportation_carrier">
{{ route.get_type_transport_display }}
</div>
<div class="clear_both"></div>
</div>
<div class="from-to-country-container-carrier">
<div class="from-to-country-text left fl-left txt-al-right">
{% if route.from_country %}{{ route.from_country }}{% else %}Неизвестно{% endif %} / {% if route.from_city %}{{ route.from_city }}{% else %}Неизвестно{% endif %}
</div>
<div class="splitter-from-to-country"></div>
<div class="from-to-country-text right fl-right txt-al-left">
{% if route.to_country %}{{ route.to_country }}{% else %}Неизвестно{% endif %} / {% if route.to_city %}{{ route.to_city }}{% else %}Неизвестно{% endif %}
</div>
</div>
{% include "small_INCLUDES/carrier_card/inf_about_moving.html" %}
</div>
{# <div class="splliter-left-right-part-carrier-card"></div>#}
<div class="inf_carrier_container">
<div class="title_container_inf_carrier">Контакты отправителия:</div>
<div>
<img src="{% static "/delete_later/Avatar.png" %}">
<span class="name_carrier">{{ route.owner.last_name }} {{ route.owner.first_name }}</span>
</div>
<form>
<div class="inf_carrier">
<a class="phones_carrier" href="tel:{{ route.phone }}">
<img class="inf_carrier_icon" src="{% static "/img/svg/phone.svg" %}"/>
<span class="phones_carrier_span">{{ route.phone }}</span>
<input name="phone_1" value="{{ route.phone }}">
</a>
<a class="email_carrier" href="mailto:{{ route.owner.email }}">
<img class="inf_carrier_icon" src="{% static "/img/svg/email.svg" %}">
<span class="email_carrier_span">{{ route.owner.email }}</span>
<input name="email_1" value="{{ route.owner.email }}">
</a>
</div>
<button class="open_chat_carrier" onclick="open_chat({{ route.owner_id }})">
<img src="{% static "img/svg/Logo.svg" %}" width="30px" style="position:relative;top: 6px;">
<span style="position: relative;top: 2px;">Написать</span>
{# <img src="{% static "/img/svg/email.svg" %}" width="25px" style="position:relative;left: 3px;">#}
</button>
<button class="open_inf_carrier" onclick="show_inf_carrier(this)">Открыть контакт</button>
</form>
</div>
<div class="clear_both"></div>
</div>