Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -415,7 +415,7 @@ def registration_ajax(request):
|
|||||||
user = User.objects.create_user(username=form.data['email'], email=form.data['email'], password=form.data['password'])
|
user = User.objects.create_user(username=form.data['email'], email=form.data['email'], password=form.data['password'])
|
||||||
# user = auth.authenticate(username=new_user_Dict['name'], password=new_user_Dict['pass'])
|
# user = auth.authenticate(username=new_user_Dict['name'], password=new_user_Dict['pass'])
|
||||||
if user:
|
if user:
|
||||||
auth.login(request, user)
|
auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend')
|
||||||
|
|
||||||
user.last_name = form.data['lastname']
|
user.last_name = form.data['lastname']
|
||||||
user.first_name = form.data['firstname']
|
user.first_name = form.data['firstname']
|
||||||
|
|||||||
@@ -74,8 +74,23 @@ class UserProfile(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
def create_user_profile(sender, instance, created, **kwargs):
|
def create_user_profile(sender, instance, created, **kwargs):
|
||||||
|
user_profile = None
|
||||||
if created:
|
if created:
|
||||||
UserProfile.objects.create(user=instance)
|
user_profile = UserProfile.objects.create(user=instance)
|
||||||
|
|
||||||
|
# if user_profile and not user_profile.avatar:
|
||||||
|
# from allauth.socialaccount.models import SocialAccount
|
||||||
|
# # try:
|
||||||
|
# social_accounts = SocialAccount.objects.filter(user=instance)
|
||||||
|
# if social_accounts:
|
||||||
|
# for social_account in social_accounts:
|
||||||
|
# if 'picture' in social_account.account.extra_data and social_account.account.extra_data['picture']:
|
||||||
|
# with open(social_account.account.extra_data['picture'], 'rb') as fd:
|
||||||
|
# user_profile.avatar.save(f'avatar_{instance.id}.jpeg', fd.read(), True)
|
||||||
|
#
|
||||||
|
# # except Exception as e:
|
||||||
|
# # msg = f'post_save create_user_profile Error = {str(e)}'
|
||||||
|
# # print(msg)
|
||||||
|
|
||||||
|
|
||||||
post_save.connect(create_user_profile, sender=User, dispatch_uid='post_save_connect')
|
post_save.connect(create_user_profile, sender=User, dispatch_uid='post_save_connect')
|
||||||
@@ -85,6 +100,7 @@ def preSaveUser(sender, instance, **kwargs):
|
|||||||
if not instance.email:
|
if not instance.email:
|
||||||
instance.email = str(instance.username).lower()
|
instance.email = str(instance.username).lower()
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
instance.user_profile.modifiedDT = datetime.now()
|
instance.user_profile.modifiedDT = datetime.now()
|
||||||
except:
|
except:
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ urlpatterns = [
|
|||||||
path('login/', login_View, name='login_profile'),
|
path('login/', login_View, name='login_profile'),
|
||||||
path('logout/', logout_View, name='logout_profile'),
|
path('logout/', logout_View, name='logout_profile'),
|
||||||
|
|
||||||
|
path('account/signup/', login_View, name="custom_singup" ),
|
||||||
|
|
||||||
|
|
||||||
# ajax ----------------
|
# ajax ----------------
|
||||||
# url(r'^login$', user_login_View_ajax, name='user_login_View_ajax'),
|
# url(r'^login$', user_login_View_ajax, name='user_login_View_ajax'),
|
||||||
|
|||||||
@@ -266,19 +266,22 @@ def techSendMail(sets, html_content, title=None, add_emails=None):
|
|||||||
# return msg
|
# return msg
|
||||||
|
|
||||||
print('techSendMail')
|
print('techSendMail')
|
||||||
|
project_name = ''
|
||||||
|
if 'project_name' in sets:
|
||||||
|
project_name = sets['project_name']
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# subject = u'truEnergy Data техническое оповещение'
|
# subject = u'truEnergy Data техническое оповещение'
|
||||||
from_email = 'support@truenergy.by'
|
from_email = sets['sender_email']
|
||||||
to = ['web@syncsystems.net']
|
to = ['web@syncsystems.net']
|
||||||
if add_emails:
|
if add_emails:
|
||||||
to.extend(add_emails)
|
to.extend(add_emails)
|
||||||
text_content = 'Technical message from truEnergy.'
|
text_content = f'Technical message from {project_name}'
|
||||||
|
|
||||||
if title:
|
if title:
|
||||||
subject = title
|
subject = title
|
||||||
else:
|
else:
|
||||||
subject = u'truEnergy Data техническое оповещение'
|
subject = f'{project_name} - техническое оповещение'
|
||||||
|
|
||||||
res = admin_send_mail_by_SMTPlib(sets, subject, from_email, to, html_content)
|
res = admin_send_mail_by_SMTPlib(sets, subject, from_email, to, html_content)
|
||||||
|
|
||||||
|
|||||||
51
GeneralApp/allauth_funcs.py
Normal file
51
GeneralApp/allauth_funcs.py
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
|
||||||
|
from allauth.account.utils import user_field
|
||||||
|
from django.conf import settings
|
||||||
|
from allauth.account.adapter import DefaultAccountAdapter
|
||||||
|
import requests
|
||||||
|
from django.core.files import File
|
||||||
|
from django.core.files.temp import NamedTemporaryFile
|
||||||
|
|
||||||
|
class MyAccountAdapter(DefaultAccountAdapter):
|
||||||
|
|
||||||
|
def get_login_redirect_url(self, request):
|
||||||
|
path = super(MyAccountAdapter, self).get_login_redirect_url(request)
|
||||||
|
|
||||||
|
try:
|
||||||
|
user = request.user
|
||||||
|
user_profile = user.user_profile
|
||||||
|
if user_profile and not user_profile.avatar:
|
||||||
|
social_accounts = user.socialaccount_set.all()
|
||||||
|
if social_accounts:
|
||||||
|
for social_account in social_accounts:
|
||||||
|
if 'picture' in social_account.extra_data and social_account.extra_data['picture']:
|
||||||
|
r = requests.get(social_account.extra_data['picture'])
|
||||||
|
|
||||||
|
img_temp = NamedTemporaryFile()
|
||||||
|
img_temp.write(r.content)
|
||||||
|
img_temp.flush()
|
||||||
|
user_profile.avatar.save(f'avatar_{user.id}.jpeg', File(img_temp), True)
|
||||||
|
break
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
msg = f'post_save create_user_profile Error = {str(e)}'
|
||||||
|
print(msg)
|
||||||
|
|
||||||
|
return path
|
||||||
|
|
||||||
|
# class CustomSocialAccountAdapter(DefaultSocialAccountAdapter):
|
||||||
|
# def populate_user(self, request, sociallogin, data):
|
||||||
|
# from AuthApp.models import UserProfile
|
||||||
|
#
|
||||||
|
# user = super().populate_user(request, sociallogin, data)
|
||||||
|
# try:
|
||||||
|
# picture = sociallogin.account.extra_data['picture']
|
||||||
|
# user_profile = UserProfile.objects.get_or_create(user=user)
|
||||||
|
# with open(picture, 'rb') as fd:
|
||||||
|
# user_profile.avatar.save(f'user_{user.id}_avatar.jpeg', fd.read(), True)
|
||||||
|
# # user_field(user, "profile_photo", picture)
|
||||||
|
# except Exception as e:
|
||||||
|
# msg = f'CustomSocialAccountAdapter populate_user Error = {str(e)}'
|
||||||
|
# print(msg)
|
||||||
|
#
|
||||||
|
# return user
|
||||||
@@ -13,6 +13,16 @@ def get_options_by_opt_types(opt_types, only_vals=False):
|
|||||||
res = {}
|
res = {}
|
||||||
opts = opts.values('opt_type', 'value', 'prefix')
|
opts = opts.values('opt_type', 'value', 'prefix')
|
||||||
for item in opts:
|
for item in opts:
|
||||||
|
if item['opt_type'] == 'domain':
|
||||||
|
|
||||||
|
try:
|
||||||
|
from django.contrib.sites.models import Site
|
||||||
|
current_site = Site.objects.get_current()
|
||||||
|
res.update({item['opt_type']: current_site.domain})
|
||||||
|
continue
|
||||||
|
except Exception as e:
|
||||||
|
print(str(e))
|
||||||
|
|
||||||
if item['prefix']:
|
if item['prefix']:
|
||||||
res.update({item['opt_type']: f"{item['prefix']}{item['value']}"})
|
res.update({item['opt_type']: f"{item['prefix']}{item['value']}"})
|
||||||
else:
|
else:
|
||||||
@@ -29,6 +39,6 @@ def get_first_option_value_by_opt_type(opt_type):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def get_mail_send_options():
|
def get_mail_send_options():
|
||||||
opt_types = ['mail_server_url', 'mail_server_smtp_port', 'sender_mail_login', 'sender_mail_password', 'sender_email']
|
opt_types = ['mail_server_url', 'mail_server_smtp_port', 'sender_mail_login', 'sender_mail_password', 'sender_email', 'project_name']
|
||||||
|
|
||||||
return get_options_by_opt_types(opt_types, only_vals=True)
|
return get_options_by_opt_types(opt_types, only_vals=True)
|
||||||
|
|||||||
@@ -19,6 +19,11 @@ def test_code(request):
|
|||||||
from RoutesApp.models import Route
|
from RoutesApp.models import Route
|
||||||
from ReferenceDataApp.models import Airport, City
|
from ReferenceDataApp.models import Airport, City
|
||||||
|
|
||||||
|
# import allauth
|
||||||
|
# from allauth.socialaccount.models import SocialApp
|
||||||
|
# apps = SocialApp.objects.all()
|
||||||
|
# apps.delete()
|
||||||
|
|
||||||
from RoutesApp.search_matches import search_matches
|
from RoutesApp.search_matches import search_matches
|
||||||
search_matches()
|
search_matches()
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from webpush import send_user_notification
|
|||||||
import json
|
import json
|
||||||
from django.shortcuts import render, get_object_or_404
|
from django.shortcuts import render, get_object_or_404
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
|
|
||||||
def get_key_Dict():
|
def get_key_Dict():
|
||||||
@@ -16,7 +17,7 @@ def get_key_Dict():
|
|||||||
}
|
}
|
||||||
return Dict
|
return Dict
|
||||||
|
|
||||||
def send_push(user, title, text, img=None):
|
def send_push(user, title, text, url=None, button_name=None, img=None):
|
||||||
try:
|
try:
|
||||||
# body = request.body
|
# body = request.body
|
||||||
# data = json.loads(body)
|
# data = json.loads(body)
|
||||||
@@ -28,8 +29,17 @@ def send_push(user, title, text, img=None):
|
|||||||
# user = get_object_or_404(User, pk=user_id)
|
# user = get_object_or_404(User, pk=user_id)
|
||||||
Dict = {
|
Dict = {
|
||||||
'head': title,
|
'head': title,
|
||||||
'body': text
|
'body': text,
|
||||||
}
|
}
|
||||||
|
if url:
|
||||||
|
Dict['url'] = url
|
||||||
|
if button_name:
|
||||||
|
Dict['button_name'] = button_name
|
||||||
|
else:
|
||||||
|
Dict['button_name'] = _('Перейти'),
|
||||||
|
|
||||||
|
if img:
|
||||||
|
Dict['img'] = img
|
||||||
|
|
||||||
# payload = {'head': data['head'], 'body': data['body']}
|
# payload = {'head': data['head'], 'body': data['body']}
|
||||||
send_user_notification(user=user, payload=Dict, ttl=1000)
|
send_user_notification(user=user, payload=Dict, ttl=1000)
|
||||||
|
|||||||
@@ -150,6 +150,16 @@ def get_routes_Dict(user=None, data=None):
|
|||||||
res_Dict = {}
|
res_Dict = {}
|
||||||
|
|
||||||
if data:
|
if data:
|
||||||
|
|
||||||
|
type_transport = None
|
||||||
|
if 'type_transport' in data and data['type_transport']:
|
||||||
|
items_list = data['type_transport'].split(',')
|
||||||
|
kwargs.update({f'type_transport__in': items_list})
|
||||||
|
|
||||||
|
if len(items_list) == 1:
|
||||||
|
type_transport = items_list[0]
|
||||||
|
|
||||||
|
|
||||||
for key, val in data.items():
|
for key, val in data.items():
|
||||||
if val:
|
if val:
|
||||||
if key == 'weight':
|
if key == 'weight':
|
||||||
@@ -162,9 +172,9 @@ def get_routes_Dict(user=None, data=None):
|
|||||||
else:
|
else:
|
||||||
kwargs.update({f'{key}__lte': int(weight_list[0])})
|
kwargs.update({f'{key}__lte': int(weight_list[0])})
|
||||||
|
|
||||||
if key == 'type_transport':
|
# if key == 'type_transport':
|
||||||
items_list = val.split(',')
|
# items_list = val.split(',')
|
||||||
kwargs.update({f'{key}__in': items_list})
|
# kwargs.update({f'{key}__in': items_list})
|
||||||
|
|
||||||
|
|
||||||
if key in (
|
if key in (
|
||||||
@@ -184,19 +194,18 @@ def get_routes_Dict(user=None, data=None):
|
|||||||
kwargs.update({key: val})
|
kwargs.update({key: val})
|
||||||
|
|
||||||
if key == 'from_address_point':
|
if key == 'from_address_point':
|
||||||
kwargs.update({f'from_city__id': val})
|
city = get_city_by_type_transport_and_address_point(type_transport, val)
|
||||||
|
kwargs.update({f'from_city': city})
|
||||||
|
|
||||||
res_Dict.update({
|
res_Dict.update({
|
||||||
'from_address_point_txt': get_country_n_city_str_by_type_transport_and_address_point(
|
'from_address_point_txt': city.get_country_n_city_str()
|
||||||
'road', val
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if key == 'to_address_point':
|
if key == 'to_address_point':
|
||||||
kwargs.update({f'to_city__id': val})
|
city = get_city_by_type_transport_and_address_point(type_transport, val)
|
||||||
|
kwargs.update({f'to_city': city})
|
||||||
res_Dict.update({
|
res_Dict.update({
|
||||||
'to_address_point_txt': get_country_n_city_str_by_type_transport_and_address_point(
|
'to_address_point_txt': city.get_country_n_city_str()
|
||||||
'road', val
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if key == 'from_el':
|
if key == 'from_el':
|
||||||
|
|||||||
@@ -5,22 +5,53 @@ from django.template.loader import render_to_string
|
|||||||
from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options
|
from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options
|
||||||
from BaseModels.mailSender import admin_send_mail_by_SMTPlib, techSendMail
|
from BaseModels.mailSender import admin_send_mail_by_SMTPlib, techSendMail
|
||||||
|
|
||||||
def send_mail_found_matches_routes(route, kwargs, search_owner_type):
|
|
||||||
|
|
||||||
|
def get_Dict_for_send_msgs(kwargs, search_owner_type):
|
||||||
|
print('get_Dict_for_send_msgs')
|
||||||
|
|
||||||
Dict = {
|
Dict = {
|
||||||
'route': route,
|
|
||||||
'search_owner_type': search_owner_type
|
'search_owner_type': search_owner_type
|
||||||
}
|
}
|
||||||
sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True)
|
sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True)
|
||||||
Dict.update(sets)
|
Dict.update(sets)
|
||||||
Dict.update({'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg',})
|
|
||||||
|
|
||||||
|
Dict.update({'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg', })
|
||||||
|
|
||||||
find_routes_page_url = f'{sets["domain"]}/routes/route_search_results/?'
|
find_routes_page_url = f'{sets["domain"]}/routes/route_search_results/?'
|
||||||
kwargs_list = [f'{key}={value}' for key, value in kwargs.items()]
|
kwargs_list = [f'{key}={value}' for key, value in kwargs.items()]
|
||||||
kwargs_list.append(f'owner_type={search_owner_type}')
|
kwargs_list.append(f'owner_type={search_owner_type}')
|
||||||
find_routes_page_url += f'{"&".join(kwargs_list)}'
|
find_routes_page_url += f'{"&".join(kwargs_list)}'
|
||||||
|
|
||||||
Dict.update({'find_routes_page_url': find_routes_page_url})
|
Dict.update({'find_routes_page_url': find_routes_page_url})
|
||||||
|
|
||||||
|
return Dict
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def send_push_message_for_found_matches_routes(route, data_Dict):
|
||||||
|
print(f'send_push_message_for_found_matches_routes to route id = {route.id}')
|
||||||
|
|
||||||
|
if not route.owner.is_authenticated:
|
||||||
|
return None
|
||||||
|
|
||||||
|
from PushMessages.views import send_push
|
||||||
|
title = 'Мы нашли исполнителя по Вашему объявлению!'
|
||||||
|
text = 'Для просмотра результата нажмите на кнопку ниже'
|
||||||
|
send_push(route.owner, title, text, url=data_Dict['find_routes_page_url'], button_name=_('Перейти к найденному'))
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def send_mail_found_matches_routes(route, data_Dict):
|
||||||
|
print(f'send_mail_found_matches_routes to route id = {route.id}')
|
||||||
|
|
||||||
|
Dict = {
|
||||||
|
'route': route,
|
||||||
|
}
|
||||||
|
Dict.update(data_Dict)
|
||||||
|
|
||||||
html = render_to_string('mail/m_found_matched_routes.html', Dict)
|
html = render_to_string('mail/m_found_matched_routes.html', Dict)
|
||||||
|
|
||||||
|
|
||||||
@@ -38,6 +69,7 @@ def send_mail_found_matches_routes(route, kwargs, search_owner_type):
|
|||||||
|
|
||||||
|
|
||||||
def search_matches(for_routes=None):
|
def search_matches(for_routes=None):
|
||||||
|
print('search_matches')
|
||||||
|
|
||||||
log = ''
|
log = ''
|
||||||
|
|
||||||
@@ -53,6 +85,11 @@ def search_matches(for_routes=None):
|
|||||||
'from_place', 'to_place', 'cargo_type', 'weight'
|
'from_place', 'to_place', 'cargo_type', 'weight'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if for_routes:
|
||||||
|
msg = f'last hour create routes count = {for_routes.count()}'
|
||||||
|
else:
|
||||||
|
msg = f'last hour not create routes'
|
||||||
|
print(msg)
|
||||||
|
|
||||||
for route in for_routes:
|
for route in for_routes:
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
@@ -87,15 +124,22 @@ def search_matches(for_routes=None):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if found_routes:
|
if found_routes:
|
||||||
msg = send_mail_found_matches_routes(route, params, found_routes[0].owner_type)
|
msg = f'found routes for send messages = {found_routes.count()}'
|
||||||
|
|
||||||
|
data_Dict = get_Dict_for_send_msgs(params, found_routes[0].owner_type)
|
||||||
|
msg = send_push_message_for_found_matches_routes(route, data_Dict)
|
||||||
|
if msg:
|
||||||
|
log += msg
|
||||||
|
msg = send_mail_found_matches_routes(route, data_Dict)
|
||||||
if msg:
|
if msg:
|
||||||
log += msg
|
log += msg
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
msg = f'<br>\n! search_matches Error = {str(e)}'
|
msg = f'<br>\n! search_matches Error = {str(e)}'
|
||||||
|
print(msg)
|
||||||
log += msg
|
log += msg
|
||||||
|
|
||||||
mail_sets = get_mail_send_options()
|
mail_sets = get_mail_send_options()
|
||||||
techSendMail(mail_sets, log, msg)
|
techSendMail(mail_sets, log, title='search_matches fail')
|
||||||
|
|
||||||
return log
|
return log
|
||||||
|
|||||||
@@ -36,6 +36,40 @@ WEBPUSH_SETTINGS = {
|
|||||||
"VAPID_ADMIN_EMAIL": "admin@tripwb.com"
|
"VAPID_ADMIN_EMAIL": "admin@tripwb.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SOCIALACCOUNT_LOGIN_ON_GET=True
|
||||||
|
ACCOUNT_DEFAULT_HTTP_PROTOCOL='https'
|
||||||
|
|
||||||
|
ACCOUNT_EMAIL_REQUIRED = True
|
||||||
|
ACCOUNT_USERNAME_REQUIRED = False
|
||||||
|
ACCOUNT_AUTHENTICATION_METHOD = 'email'
|
||||||
|
ACCOUNT_EMAIL_VERIFICATION = 'optional'
|
||||||
|
LOGIN_REDIRECT_URL = '/profile/page/dashboard/'
|
||||||
|
LOGOUT_REDIRECT_URL = '/profile/login/'
|
||||||
|
ACCOUNT_SIGNUP_REDIRECT_URL = '/profile/page/dashboard/'
|
||||||
|
ACCOUNT_LOGOUT_ON_GET = True
|
||||||
|
# SOCIALACCOUNT_ADAPTER = 'GeneralApp.allauth_funcs.MyAccountAdapter'
|
||||||
|
ACCOUNT_ADAPTER = 'GeneralApp.allauth_funcs.MyAccountAdapter'
|
||||||
|
|
||||||
|
AUTHENTICATION_BACKENDS = [
|
||||||
|
'django.contrib.auth.backends.ModelBackend',
|
||||||
|
'allauth.account.auth_backends.AuthenticationBackend',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SOCIALACCOUNT_PROVIDERS = {
|
||||||
|
'google': {
|
||||||
|
'SCOPE': [
|
||||||
|
'profile',
|
||||||
|
'email',
|
||||||
|
],
|
||||||
|
'AUTH_PARAMS': {
|
||||||
|
'access_type': 'online',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# NOTIFICATION_KEY = 'BJLyGzmo8sLI3Qkc6pN2cz11frCXiJdewvgve7Yps-_fM1lY1LSnTQfQxYtAgQ_26nAji_rgeYC1DkLiTwxw0Mo'
|
# NOTIFICATION_KEY = 'BJLyGzmo8sLI3Qkc6pN2cz11frCXiJdewvgve7Yps-_fM1lY1LSnTQfQxYtAgQ_26nAji_rgeYC1DkLiTwxw0Mo'
|
||||||
|
|
||||||
# SESSION_COOKIE_HTTPONLY = False
|
# SESSION_COOKIE_HTTPONLY = False
|
||||||
@@ -56,6 +90,8 @@ INSTALLED_APPS = [
|
|||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'django.contrib.humanize',
|
'django.contrib.humanize',
|
||||||
|
|
||||||
|
'django.contrib.sites',
|
||||||
|
|
||||||
'colorfield',
|
'colorfield',
|
||||||
|
|
||||||
'ckeditor',
|
'ckeditor',
|
||||||
@@ -63,6 +99,11 @@ INSTALLED_APPS = [
|
|||||||
|
|
||||||
'webpush',
|
'webpush',
|
||||||
|
|
||||||
|
'allauth',
|
||||||
|
'allauth.account',
|
||||||
|
'allauth.socialaccount',
|
||||||
|
'allauth.socialaccount.providers.google',
|
||||||
|
|
||||||
'GeneralApp',
|
'GeneralApp',
|
||||||
'AuthApp',
|
'AuthApp',
|
||||||
'RoutesApp',
|
'RoutesApp',
|
||||||
@@ -82,8 +123,12 @@ MIDDLEWARE = [
|
|||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
'AuthApp.middleware.ResponseInterceptionMiddleware',
|
'AuthApp.middleware.ResponseInterceptionMiddleware',
|
||||||
|
|
||||||
|
"allauth.account.middleware.AccountMiddleware",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
SITE_ID = 1
|
||||||
|
|
||||||
ROOT_URLCONF = 'TWB.urls'
|
ROOT_URLCONF = 'TWB.urls'
|
||||||
|
|
||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from django.urls import path, include
|
|||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from GeneralApp.views import Page404
|
from GeneralApp.views import Page404
|
||||||
|
from AuthApp.views import login_View
|
||||||
|
|
||||||
handler404 = Page404
|
handler404 = Page404
|
||||||
|
|
||||||
@@ -12,12 +13,17 @@ urlpatterns = [
|
|||||||
path('ckeditor/', include('ckeditor_uploader.urls')),
|
path('ckeditor/', include('ckeditor_uploader.urls')),
|
||||||
path('i18n/', include('django.conf.urls.i18n')),
|
path('i18n/', include('django.conf.urls.i18n')),
|
||||||
|
|
||||||
# path('webpush/', include('webpush.urls')),
|
path('accounts/signup/', login_View, name='signup'),
|
||||||
|
|
||||||
|
path('accounts/', include('allauth.urls')),
|
||||||
|
path('accounts/', include('allauth.socialaccount.urls')),
|
||||||
|
|
||||||
path('messages/', include('ChatServiceApp.urls')),
|
path('messages/', include('ChatServiceApp.urls')),
|
||||||
|
|
||||||
path('user_account/', include('AuthApp.js_urls')),
|
path('user_account/', include('AuthApp.js_urls')),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
path('routes/', include('RoutesApp.js_urls')),
|
path('routes/', include('RoutesApp.js_urls')),
|
||||||
|
|
||||||
path('subscribes/', include('SubscribesApp.js_urls')),
|
path('subscribes/', include('SubscribesApp.js_urls')),
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ daphne==4.0.0
|
|||||||
channels-redis==4.1.0
|
channels-redis==4.1.0
|
||||||
django-colorfield
|
django-colorfield
|
||||||
django-webpush==0.3.5
|
django-webpush==0.3.5
|
||||||
|
django-allauth==0.60.0
|
||||||
|
|
||||||
|
|||||||
@@ -71,41 +71,41 @@
|
|||||||
left: 33%;
|
left: 33%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards_item_1,
|
/* .cards_item_1,*/
|
||||||
.cards_item_2,
|
/*.cards_item_2,*/
|
||||||
.cards_item_3,
|
/*.cards_item_3,*/
|
||||||
.cards_item_4
|
/*.cards_item_4*/
|
||||||
{
|
/*{*/
|
||||||
width: 46%;
|
/* width: 46%;*/
|
||||||
height: 180px;
|
/* height: 180px;*/
|
||||||
background-size:60%;
|
/* background-size:60%;*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
.card_title_1{
|
/* .card_title_1{*/
|
||||||
font-size: 34px;
|
/* font-size: 34px;*/
|
||||||
font-style: normal;
|
/* font-style: normal;*/
|
||||||
font-weight: 700;
|
/* font-weight: 700;*/
|
||||||
line-height: 42px;
|
/* line-height: 42px;*/
|
||||||
margin: 22px 0 0 10px;
|
/* margin: 22px 0 0 10px;*/
|
||||||
text-shadow: 1px 1px 0px #272424;
|
/* text-shadow: 1px 1px 0px #272424;*/
|
||||||
}
|
/*}*/
|
||||||
.card_title_2{
|
/*.card_title_2{*/
|
||||||
font-size: 17px;
|
/* font-size: 17px;*/
|
||||||
font-style: normal;
|
/* font-style: normal;*/
|
||||||
font-weight: 600;
|
/* font-weight: 600;*/
|
||||||
line-height: 26px;
|
/* line-height: 26px;*/
|
||||||
margin: 10px 0 0 10px;
|
/* margin: 10px 0 0 10px;*/
|
||||||
text-shadow: 1px 1px 0px #272424;
|
/* text-shadow: 1px 1px 0px #272424;*/
|
||||||
}
|
/*}*/
|
||||||
.card_title_3{
|
/*.card_title_3{*/
|
||||||
margin: 10px 0 0 10px;
|
/* margin: 10px 0 0 10px;*/
|
||||||
width: 95%;
|
/* width: 95%;*/
|
||||||
font-size: 12px;
|
/* font-size: 12px;*/
|
||||||
font-style: normal;
|
/* font-style: normal;*/
|
||||||
font-weight: 400;
|
/* font-weight: 400;*/
|
||||||
line-height: 20px;
|
/* line-height: 20px;*/
|
||||||
text-shadow: 1px 1px 0px #272424;
|
/* text-shadow: 1px 1px 0px #272424;*/
|
||||||
}
|
/*}*/
|
||||||
.sf_1_column {
|
.sf_1_column {
|
||||||
padding-left: 25px;
|
padding-left: 25px;
|
||||||
padding-right: 90px;
|
padding-right: 90px;
|
||||||
@@ -159,6 +159,17 @@
|
|||||||
rotate: 270deg;
|
rotate: 270deg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cards_item_1,
|
||||||
|
.cards_item_2,
|
||||||
|
.cards_item_3,
|
||||||
|
.cards_item_4{
|
||||||
|
height: 322px;
|
||||||
|
width: 65%;
|
||||||
|
float: unset;
|
||||||
|
margin: 15px auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
.filter_img{
|
.filter_img{
|
||||||
width: 15px;
|
width: 15px;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -420,7 +431,7 @@
|
|||||||
margin-top: unset;
|
margin-top: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
button#more_button{
|
#more_button{
|
||||||
width: 50%;
|
width: 50%;
|
||||||
/*margin-top: 40px;*/
|
/*margin-top: 40px;*/
|
||||||
}
|
}
|
||||||
@@ -1511,6 +1522,45 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.cards_item_1,
|
||||||
|
.cards_item_2,
|
||||||
|
.cards_item_3,
|
||||||
|
.cards_item_4{
|
||||||
|
width: 70%;
|
||||||
|
height: unset;
|
||||||
|
float: unset;
|
||||||
|
margin: 15px auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards_item_img, .cards_item_text{
|
||||||
|
float: unset;
|
||||||
|
width: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards_item_1>.cards_item_img>img,
|
||||||
|
.cards_item_2>.cards_item_img>img,
|
||||||
|
.cards_item_3>.cards_item_img>img,
|
||||||
|
.cards_item_4>.cards_item_img>img{
|
||||||
|
float: unset;
|
||||||
|
aspect-ratio: 4/3;
|
||||||
|
object-fit: cover;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
.cards_item_text{
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card_title_1{
|
||||||
|
margin: 25px 0 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.read_more_about_subscribe{
|
.read_more_about_subscribe{
|
||||||
padding: 0 14px;
|
padding: 0 14px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
@@ -1792,7 +1842,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
button#more_button{
|
#more_button{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin-top: 40px;
|
margin-top: 40px;
|
||||||
}
|
}
|
||||||
@@ -1802,14 +1852,32 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards_item_1,
|
/*.cards_item_1,*/
|
||||||
.cards_item_2,
|
/*.cards_item_2,*/
|
||||||
.cards_item_3,
|
/*.cards_item_3,*/
|
||||||
.cards_item_4
|
/*.cards_item_4*/
|
||||||
{
|
/*{*/
|
||||||
width: 100%;
|
/* width: 100%;*/
|
||||||
height: 180px;
|
/* height: 180px;*/
|
||||||
background-size:60%;
|
/* background-size:60%;*/
|
||||||
|
/*}*/
|
||||||
|
.card_title_1{
|
||||||
|
font-size: 34px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
line-height: 42px;
|
||||||
|
}
|
||||||
|
.card_title_2{
|
||||||
|
font-size: 18px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 26px;
|
||||||
|
}
|
||||||
|
.card_title_3{
|
||||||
|
font-size: 12px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards_wrapper{
|
.cards_wrapper{
|
||||||
|
|||||||
@@ -780,7 +780,7 @@ span.btn_profile_name {
|
|||||||
/*height: 60px;*/
|
/*height: 60px;*/
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
width: 100%;
|
width: 80%;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
|
||||||
@@ -2137,9 +2137,9 @@ span#sub_title_static{
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
button#more_button{
|
#more_button{
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
height: 60px;
|
/*height: 60px;*/
|
||||||
width: 20%;
|
width: 20%;
|
||||||
background: #FF613A;
|
background: #FF613A;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
@@ -2652,18 +2652,40 @@ button#send_feedback_form:active{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cards_wrapper{
|
.cards_wrapper{
|
||||||
display: flex;
|
/*display: flex;*/
|
||||||
flex-direction: row;
|
/*flex-direction: row;*/
|
||||||
flex-wrap: wrap;
|
/*flex-wrap: wrap;*/
|
||||||
justify-content: center;
|
/*justify-content: center;*/
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.cards_item_1, .cards_item_3{
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.cards_item_2, .cards_item_4{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.cards_item_1>.cards_item_img>img,
|
||||||
|
.cards_item_2>.cards_item_img>img,
|
||||||
|
.cards_item_3>.cards_item_img>img,
|
||||||
|
.cards_item_4>.cards_item_img>img{
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#reg_or_text{
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards_item_2>.cards_item_text>div, .cards_item_3>.cards_item_text>div{
|
||||||
|
color: #1d1e20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.cards_item_1{
|
.cards_item_1{
|
||||||
width: 48%;
|
|
||||||
height: 322px;
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: url(/static/img/png/cards_item_1.png) #1d1e20 50%;
|
/*background: url(/static/img/png/cards_item_1.png) #1d1e20 50%;*/
|
||||||
|
background: #1d1e20 50%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: right;
|
background-position: right;
|
||||||
|
|
||||||
@@ -2672,13 +2694,7 @@ button#send_feedback_form:active{
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards_item_1_left,
|
|
||||||
.cards_item_2_left,
|
|
||||||
.cards_item_3_left,
|
|
||||||
.cards_item_4_left{
|
|
||||||
width: 55%;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2693,10 +2709,9 @@ button#send_feedback_form:active{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cards_item_2{
|
.cards_item_2{
|
||||||
width: 48%;
|
border-radius: 10px;
|
||||||
height: 322px;
|
/*background: url(/static/img/png/cards_item_2.png) white 50%;*/
|
||||||
border-radius: 10px;
|
background: white 50%;
|
||||||
background: url(/static/img/png/cards_item_2.png) white 50%;
|
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: right;
|
background-position: right;
|
||||||
|
|
||||||
@@ -2706,13 +2721,23 @@ button#send_feedback_form:active{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cards_item_2>div,
|
.cards_item_text {
|
||||||
.cards_item_3>div{
|
float: left;
|
||||||
color: black;
|
width: 50%;
|
||||||
text-shadow: none;
|
|
||||||
text-shadow: 1px 1px 0px #ffffff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cards_item_img {
|
||||||
|
float: right;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.cards_item_2>div,*/
|
||||||
|
/*.cards_item_3>div{*/
|
||||||
|
/* color: black;*/
|
||||||
|
/* text-shadow: none;*/
|
||||||
|
/* text-shadow: 1px 1px 0px #ffffff;*/
|
||||||
|
/*}*/
|
||||||
|
|
||||||
.cards_item_2_right{
|
.cards_item_2_right{
|
||||||
float: right;
|
float: right;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
@@ -2738,10 +2763,9 @@ button#send_feedback_form:active{
|
|||||||
|
|
||||||
|
|
||||||
.cards_item_3{
|
.cards_item_3{
|
||||||
width: 48%;
|
|
||||||
height: 322px;
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: url(/static/img/png/cards_item_3.png) white 50%;
|
/*background: url(/static/img/png/cards_item_3.png) white 50%;*/
|
||||||
|
background: white 50%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: right;
|
background-position: right;
|
||||||
box-shadow: -1px 4px 10px 0px rgba(198, 199, 203, 0.20), 0px -1px 10px 0px rgba(198, 199, 203, 0.20);
|
box-shadow: -1px 4px 10px 0px rgba(198, 199, 203, 0.20), 0px -1px 10px 0px rgba(198, 199, 203, 0.20);
|
||||||
@@ -2761,10 +2785,9 @@ button#send_feedback_form:active{
|
|||||||
|
|
||||||
|
|
||||||
.cards_item_4{
|
.cards_item_4{
|
||||||
width: 48%;
|
|
||||||
height: 322px;
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: url(/static/img/png/cards_item_4.png), #111217 50%;
|
/*background: url(/static/img/png/cards_item_4.png), #111217 50%;*/
|
||||||
|
background: #111217 50%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: right;
|
background-position: right;
|
||||||
|
|
||||||
@@ -2773,6 +2796,16 @@ button#send_feedback_form:active{
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cards_item_1,
|
||||||
|
.cards_item_2,
|
||||||
|
.cards_item_3,
|
||||||
|
.cards_item_4{
|
||||||
|
height: 322px;
|
||||||
|
width: 48%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.cards_item_4_right{
|
.cards_item_4_right{
|
||||||
float: right;
|
float: right;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
@@ -2789,7 +2822,7 @@ button#send_feedback_form:active{
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
line-height: 52px; /* 118.182% */
|
line-height: 52px; /* 118.182% */
|
||||||
margin: 104px 0 0 20px;
|
margin: 67px 0 0 20px;
|
||||||
}
|
}
|
||||||
.card_title_2{
|
.card_title_2{
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
@@ -2806,7 +2839,7 @@ button#send_feedback_form:active{
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
margin: 20px 0 0 20px;
|
margin: 20px 0 0 20px;
|
||||||
width: 50%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*faq_main_page*/
|
/*faq_main_page*/
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
{# <div class="button_profile_header" onclick="open_curtain(null,'right')" data-user-id="{{ user.id }}">#}
|
{# <div class="button_profile_header" onclick="open_curtain(null,'right')" data-user-id="{{ user.id }}">#}
|
||||||
|
|
||||||
<span class="btn_profile_name">
|
<span class="btn_profile_name">
|
||||||
{{ user.first_name }} {{ user.last_name }}
|
{{ user.first_name|truncatechars:6}} {{ user.last_name|truncatechars:5 }}
|
||||||
</span>
|
</span>
|
||||||
<span id="placeholder1"></span>
|
<span id="placeholder1"></span>
|
||||||
<div class="icon_unread_messages" style="position:relative;top: 4px;padding-right: 13px;">
|
<div class="icon_unread_messages" style="position:relative;top: 4px;padding-right: 13px;">
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
{% load socialaccount %}
|
||||||
|
|
||||||
{% trans "Логин" as p_login %}
|
{% trans "Логин" as p_login %}
|
||||||
{% trans "Пароль" as p_password %}
|
{% trans "Пароль" as p_password %}
|
||||||
|
|
||||||
<section class="login">
|
<section class="login">
|
||||||
<h1>{% translate "Войдите в профиль" %}</h1>
|
<h1>{% translate "Войдите в профиль" %}</h1>
|
||||||
|
|
||||||
<form class="login_form" name="login_form" method="post">
|
<form class="login_form" name="login_form" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div>
|
<div>
|
||||||
{% if form.errors.all__ %}
|
{% if form.errors.all__ %}
|
||||||
@@ -29,10 +30,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="button_register"><button onclick="SendLoginForm(this)">{% translate "Войти" %}</button></div>
|
<div class="button_register"><button onclick="SendLoginForm(this)">{% translate "Войти" %}</button></div>
|
||||||
<div class="agree_text_l">{% translate "Авторизуясь, вы соглашаетесь с Лицензионным соглашением Политикой конфиденциальности" %}</div>
|
<div class="agree_text_l">{% translate "Авторизуясь, вы соглашаетесь с Лицензионным соглашением Политикой конфиденциальности" %}</div>
|
||||||
{# <div>Или</div>#}
|
<div id="reg_or_text">{% translate "Или" %}</div>
|
||||||
{# <div id = "google_text" class="google"><img src="/static/img/png/google.png" alt="">#}
|
|
||||||
{# <div>Войти через Google</div>#}
|
<a href="{% provider_login_url 'google' %}">
|
||||||
{# </div>#}
|
<div id = "google_text" class="google"><img src="/static/img/png/google.png" alt="">
|
||||||
|
<div> {% translate "Войти через" %} Google</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
<div class="call_to_reg">{% translate "Нет аккаунта?" %} <a href="/ru/profile/registration/">{% translate "Зарегистрируйтесь" %}</a></div>
|
<div class="call_to_reg">{% translate "Нет аккаунта?" %} <a href="/ru/profile/registration/">{% translate "Зарегистрируйтесь" %}</a></div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
<div class="benefit_img_item">
|
<div class="benefit_img_item">
|
||||||
<img src="/static/img/svg/Contact_carrier.svg" alt="">
|
<img src="/static/img/svg/Contact_carrier.svg" alt="">
|
||||||
<h3>{% translate "Свяжитесь с перевозчиком" %}</h3>
|
<h3>{% translate "Свяжитесь с перевозчиком" %}</h3>
|
||||||
<span>{% translate "Откройте контакты на сайте и договоритесь о месте встречи и условиях перевозки" %}</span>
|
<span>{% translate "Откройте контакты на сайте и договоритесь о месте встречи и условиях перевозки. В случае, если Вы не нашли объявления о перевозчиках по Вашему запросу, Вы можете разместить свое объявление воспользовавшись формой в личном кабинете." %}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<img src="/static/img/svg/Arrow_direction.svg" alt="">
|
<img src="/static/img/svg/Arrow_direction.svg" alt="">
|
||||||
@@ -112,7 +112,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="button_container">
|
<div class="button_container">
|
||||||
<a class="a_btn_standart" href="{% url 'profile_page' 'create_route_for_customer' %}" id="more_button">{% translate "Отправить посылку" %}</a>
|
<a class="a_btn_standart"
|
||||||
|
href="{% url 'profile_page' 'create_route_for_customer' %}"
|
||||||
|
id="more_button">{% translate "Отправить посылку" %}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="content-2">
|
<div id="content-2">
|
||||||
@@ -121,8 +124,8 @@
|
|||||||
|
|
||||||
<div class="benefit_img_item">
|
<div class="benefit_img_item">
|
||||||
<img src="/static/img/svg/Find_carrier.svg" alt="">
|
<img src="/static/img/svg/Find_carrier.svg" alt="">
|
||||||
<h3>{% translate "Разместите объявление" %}</h3>
|
<h3>{% translate "Найдите отправителя" %}</h3>
|
||||||
<span>{% translate "Укажите откуда, куда хотите перевезти посылку, а также Вашу дату отправления и прибытия. При желании Вы можете указать дополнительные параметры: тип, вес, вид перевозки и т.д" %}</span>
|
<span>{% translate "Зайдите на сайт Trip With Bonus и в форме вверху страницы, заполните данные для поиска отправителя посылки." %}</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -131,7 +134,7 @@
|
|||||||
<div class="benefit_img_item">
|
<div class="benefit_img_item">
|
||||||
<img src="/static/img/svg/Contact_carrier.svg" alt="">
|
<img src="/static/img/svg/Contact_carrier.svg" alt="">
|
||||||
<h3>{% translate "Свяжитесь с отправителем" %}</h3>
|
<h3>{% translate "Свяжитесь с отправителем" %}</h3>
|
||||||
<span>{% translate "В отобразившемся списке выберите подходящего отправителя и посылку, откройте контакты и свяжитесь удобным способом. Если не нашли подходящего отправителя с посылкой, разместите объявление о возможности перевезти посылку и отправители Вас сами найдут" %}</span>
|
<span>{% translate "Откройте контакты на сайте и договоритесь о месте встречи и условиях перевозки. В случае, если Вы не нашли объявления об отправителях по Вашему запросу, Вы можете разместить свое объявление воспользовавшись формой в личном кабинете." %}</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -140,7 +143,7 @@
|
|||||||
<div class="benefit_img_item">
|
<div class="benefit_img_item">
|
||||||
<img src="/static/img/svg/Pass_package.svg" alt="">
|
<img src="/static/img/svg/Pass_package.svg" alt="">
|
||||||
<h3>{% translate "Передайте посылку" %}</h3>
|
<h3>{% translate "Передайте посылку" %}</h3>
|
||||||
<span>{% translate "Обсудите с отправителем все условия: время, место и прочие детали. Готово! Доставьте посылку из пункта А в пункт Б и получите благодарность отправителя!" %}</span>
|
<span>{% translate "Встречайтесь, знакомьтесь и принимайте посылку" %}</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -148,7 +151,10 @@
|
|||||||
|
|
||||||
|
|
||||||
<div class="button_container">
|
<div class="button_container">
|
||||||
<button id="more_button">{% translate "Перевезти посылку" %}</button>
|
<a class="a_btn_standart"
|
||||||
|
href="{% url 'profile_page' 'create_route_for_mover' %}"
|
||||||
|
id="more_button">{% translate "Перевезти посылку" %}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -167,31 +173,47 @@
|
|||||||
|
|
||||||
<div class="cards_wrapper">
|
<div class="cards_wrapper">
|
||||||
<div class="cards_item_1">
|
<div class="cards_item_1">
|
||||||
|
|
||||||
|
<div class="cards_item_img">
|
||||||
|
<img src="/static/img/png/cards_item_1.png" alt="">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cards_item_text">
|
||||||
<div class="card_title_1">{% translate "+5%" %}</div>
|
<div class="card_title_1">{% translate "+5%" %}</div>
|
||||||
<div class="card_title_2">{% translate "рост путешествий ежегодно" %}</div>
|
<div class="card_title_2">{% translate "рост путешествий ежегодно" %}</div>
|
||||||
<div class="card_title_3">{% translate "В среднем на 5% растёт количество путешествий ежегодно. Просто путешествуй и получай бонусы." %}</div>
|
<div class="card_title_3">{% translate "В среднем на 5% растёт количество путешествий ежегодно. Просто путешествуй и получай бонусы." %}</div>
|
||||||
|
</div>
|
||||||
{# <div class="cards_item_1_right">#}
|
|
||||||
{# <div class="card_gradient_black"></div>#}
|
|
||||||
{# </div>#}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="cards_item_2">
|
<div class="cards_item_2">
|
||||||
|
|
||||||
|
<div class="cards_item_img">
|
||||||
|
<img src="/static/img/png/cards_item_2.png" alt="">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cards_item_text">
|
||||||
<div class="card_title_1">{% translate "в 3 раза" %}</div>
|
<div class="card_title_1">{% translate "в 3 раза" %}</div>
|
||||||
<div class="card_title_2">{% translate "быстрее других сервисов" %}</div>
|
<div class="card_title_2">{% translate "быстрее других сервисов" %}</div>
|
||||||
<div class="card_title_3">{% translate "Почтовые сервисы доставляет посылки в среднем за 10 дней. С нами - быстрее!" %}</div>
|
<div class="card_title_3">{% translate "Почтовые сервисы доставляет посылки в среднем за 10 дней. С нами - быстрее!" %}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{# <div class="card_gradient"></div>#}
|
{# <div class="card_gradient"></div>#}
|
||||||
|
|
||||||
|
|
||||||
{# <div class="cards_item_2_right">#}
|
|
||||||
{# #}
|
|
||||||
{# </div>#}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="cards_item_3">
|
<div class="cards_item_3">
|
||||||
|
|
||||||
|
<div class="cards_item_img">
|
||||||
|
<img src="/static/img/png/cards_item_3.png" alt="">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="cards_item_text">
|
||||||
<div class="card_title_1">{% translate "+142" %}</div>
|
<div class="card_title_1">{% translate "+142" %}</div>
|
||||||
<div class="card_title_2">{% translate "заявки ежедневно" %}</div>
|
<div class="card_title_2">{% translate "заявки ежедневно" %}</div>
|
||||||
<div class="card_title_3">{% translate "На перевозку или отправку посылок в разные уголки мира" %}</div>
|
<div class="card_title_3">{% translate "На перевозку или отправку посылок в разные уголки мира" %}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{# <div class="cards_item_3_right">#}
|
{# <div class="cards_item_3_right">#}
|
||||||
{# <div class="card_gradient"></div>#}
|
{# <div class="card_gradient"></div>#}
|
||||||
@@ -199,9 +221,16 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="cards_item_4">
|
<div class="cards_item_4">
|
||||||
|
|
||||||
<div class="card_title_1">{% translate "30+" %}</div>
|
<div class="cards_item_img">
|
||||||
<div class="card_title_2">{% translate "стран" %}</div>
|
<img src="/static/img/png/cards_item_4.png" alt="">
|
||||||
<div class="card_title_3">{% translate "С TWB отправляй посылки по всему миру! С нами нет границ!" %}</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="cards_item_text">
|
||||||
|
<div class="card_title_1">{% translate "30+" %}</div>
|
||||||
|
<div class="card_title_2">{% translate "стран" %}</div>
|
||||||
|
<div class="card_title_3">{% translate "С TWB отправляй посылки по всему миру! С нами нет границ!" %}</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
{# <div class="cards_item_4_right">#}
|
{# <div class="cards_item_4_right">#}
|
||||||
{# <div class="card_gradient_black"></div>#}
|
{# <div class="card_gradient_black"></div>#}
|
||||||
|
|||||||
@@ -7,12 +7,32 @@ self.addEventListener('push', function (event) {
|
|||||||
const data = JSON.parse(eventInfo);
|
const data = JSON.parse(eventInfo);
|
||||||
const head = data.head || 'New Notification 🕺🕺';
|
const head = data.head || 'New Notification 🕺🕺';
|
||||||
const body = data.body || 'This is default content. Your notification didn\'t have one 🙄🙄';
|
const body = data.body || 'This is default content. Your notification didn\'t have one 🙄🙄';
|
||||||
|
const icon = data.img || 'static/img/svg/Logo.svg';
|
||||||
|
|
||||||
|
let notificationOptions = {
|
||||||
|
body: body,
|
||||||
|
icon: icon,
|
||||||
|
};
|
||||||
|
if ('url' in data){
|
||||||
|
notificationOptions['data'] = { url: data.url };
|
||||||
|
notificationOptions['actions'] = [{action: "open_url", title: data.button_name}]
|
||||||
|
}
|
||||||
|
|
||||||
// Keep the service worker alive until the notification is created.
|
// Keep the service worker alive until the notification is created.
|
||||||
event.waitUntil(
|
event.waitUntil(
|
||||||
self.registration.showNotification(head, {
|
self.registration.showNotification(head, notificationOptions)
|
||||||
body: body,
|
|
||||||
icon: 'static/img/svg/Logo.svg'
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
self.addEventListener('notificationclick', function(event) {
|
||||||
|
|
||||||
|
switch(event.action){
|
||||||
|
case 'open_url':
|
||||||
|
clients.openWindow(event.notification.data.url);
|
||||||
|
break;
|
||||||
|
case 'any_other_action':
|
||||||
|
clients.openWindow("https://www.example.com");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
, false);
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
init_ws()
|
init_ws()
|
||||||
const beep = new Audio('/static/sounds/beep_2.mp3')
|
const beep = new Audio('/static/sounds/beep_2.mp3')
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
@@ -56,6 +56,9 @@
|
|||||||
|
|
||||||
{% block meta %}
|
{% block meta %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6320323599773844" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body{% if page_type == 'routes' %} onscroll="scroll_ev(event,this)"{% endif %}>
|
<body{% if page_type == 'routes' %} onscroll="scroll_ev(event,this)"{% endif %}>
|
||||||
|
|||||||
Reference in New Issue
Block a user