Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -154,7 +154,11 @@ def find_routes_ajax(request):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
|
||||||
data = request.POST.dict()
|
data = request.POST.dict()
|
||||||
|
if not data and request.body:
|
||||||
|
data = json.loads(request.body)
|
||||||
|
|
||||||
data['owner_type'] = 'mover'
|
data['owner_type'] = 'mover'
|
||||||
routes_Dict = get_routes_Dict(data=data)
|
routes_Dict = get_routes_Dict(data=data)
|
||||||
if 'errors' in routes_Dict:
|
if 'errors' in routes_Dict:
|
||||||
|
|||||||
0
SubscribesApp/__init__.py
Normal file
0
SubscribesApp/__init__.py
Normal file
3
SubscribesApp/admin.py
Normal file
3
SubscribesApp/admin.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
6
SubscribesApp/apps.py
Normal file
6
SubscribesApp/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class SubscribesappConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'SubscribesApp'
|
||||||
89
SubscribesApp/migrations/0001_initial.py
Normal file
89
SubscribesApp/migrations/0001_initial.py
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# Generated by Django 4.2.2 on 2023-08-29 16:04
|
||||||
|
|
||||||
|
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='Subscribe',
|
||||||
|
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_ru', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
|
||||||
|
('name_en', 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='Дополнительные данные')),
|
||||||
|
('price', models.FloatField(default=0, verbose_name='Стоимость')),
|
||||||
|
('period_name', models.CharField(max_length=250, verbose_name='Название периода')),
|
||||||
|
('period_name_ru', models.CharField(max_length=250, null=True, verbose_name='Название периода')),
|
||||||
|
('period_name_en', models.CharField(max_length=250, null=True, verbose_name='Название периода')),
|
||||||
|
('period', models.IntegerField(default=0, verbose_name='Длительность подписки в часах')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Подписка',
|
||||||
|
'verbose_name_plural': 'Подписки',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='SubscribeOption',
|
||||||
|
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_ru', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')),
|
||||||
|
('name_en', 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='Дополнительные данные')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Опция подписки',
|
||||||
|
'verbose_name_plural': 'Опции подписки',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='SubscribeForUser',
|
||||||
|
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='Дополнительные данные')),
|
||||||
|
('last_paid_DT', models.DateTimeField(blank=True, null=True, verbose_name='Последняя дата оплаты')),
|
||||||
|
('paid_period_from_DT', models.DateTimeField(blank=True, null=True, verbose_name='Оплаченный период с')),
|
||||||
|
('paid_period_to_DT', models.DateTimeField(blank=True, null=True, verbose_name='Оплаченный период до')),
|
||||||
|
('auto_continue', models.BooleanField(default=False, verbose_name='Автопродление')),
|
||||||
|
('receive_finish_subscribe_msg', models.BooleanField(default=False, verbose_name='Получать сообщения о окончании периода')),
|
||||||
|
('subscribe', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rel_userSubscribes_for_subscribe', to='SubscribesApp.subscribe', verbose_name='Подписка')),
|
||||||
|
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_userSubscribes_for_user', to=settings.AUTH_USER_MODEL, verbose_name='Пользователь')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Пользовательская подписка',
|
||||||
|
'verbose_name_plural': 'Пользовательские подписки',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='subscribe',
|
||||||
|
name='options',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='rel_subscribes_for_option', to='SubscribesApp.subscribeoption', verbose_name='Подключенные опции'),
|
||||||
|
),
|
||||||
|
]
|
||||||
0
SubscribesApp/migrations/__init__.py
Normal file
0
SubscribesApp/migrations/__init__.py
Normal file
47
SubscribesApp/models.py
Normal file
47
SubscribesApp/models.py
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
from django.db import models
|
||||||
|
from BaseModels.base_models import BaseModel
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
class SubscribeOption(BaseModel):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Опция подписки')
|
||||||
|
verbose_name_plural = _('Опции подписки')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Subscribe(BaseModel):
|
||||||
|
|
||||||
|
price = models.FloatField(verbose_name='Стоимость', default=0)
|
||||||
|
options = models.ManyToManyField(
|
||||||
|
SubscribeOption, verbose_name=_('Подключенные опции'), blank=True, related_name='rel_subscribes_for_option'
|
||||||
|
)
|
||||||
|
period_name = models.CharField(max_length=250, verbose_name=_('Название периода'))
|
||||||
|
period = models.IntegerField(default=0, verbose_name=_('Длительность подписки в часах'))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Подписка')
|
||||||
|
verbose_name_plural = _('Подписки')
|
||||||
|
|
||||||
|
|
||||||
|
class SubscribeForUser(BaseModel):
|
||||||
|
from AuthApp.models import User
|
||||||
|
|
||||||
|
user = models.ForeignKey(
|
||||||
|
User, verbose_name=_('Пользователь'), related_name='rel_userSubscribes_for_user', on_delete=models.CASCADE)
|
||||||
|
subscribe = models.ForeignKey(
|
||||||
|
Subscribe, verbose_name=_('Подписка'), null=True, blank=True, related_name='rel_userSubscribes_for_subscribe',
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
last_paid_DT = models.DateTimeField(verbose_name=_('Последняя дата оплаты'), blank=True, null=True)
|
||||||
|
paid_period_from_DT = models.DateTimeField(verbose_name=_('Оплаченный период с'), blank=True, null=True)
|
||||||
|
paid_period_to_DT = models.DateTimeField(verbose_name=_('Оплаченный период до'), blank=True, null=True)
|
||||||
|
|
||||||
|
auto_continue = models.BooleanField(default=False, verbose_name=_('Автопродление'))
|
||||||
|
|
||||||
|
receive_finish_subscribe_msg = models.BooleanField(
|
||||||
|
default=False, verbose_name=_('Получать сообщения о окончании периода'))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('Пользовательская подписка')
|
||||||
|
verbose_name_plural = _('Пользовательские подписки')
|
||||||
3
SubscribesApp/tests.py
Normal file
3
SubscribesApp/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
21
SubscribesApp/translation.py
Normal file
21
SubscribesApp/translation.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
from modeltranslation.translator import translator, TranslationOptions
|
||||||
|
from .models import *
|
||||||
|
|
||||||
|
|
||||||
|
class Subscribe_TranslationOptions(TranslationOptions):
|
||||||
|
fields = (
|
||||||
|
'name', 'period_name'
|
||||||
|
)
|
||||||
|
translator.register(Subscribe, Subscribe_TranslationOptions)
|
||||||
|
|
||||||
|
class SubscribeOption_TranslationOptions(TranslationOptions):
|
||||||
|
fields = (
|
||||||
|
'name',
|
||||||
|
)
|
||||||
|
translator.register(SubscribeOption, SubscribeOption_TranslationOptions)
|
||||||
|
|
||||||
|
|
||||||
|
class SubscribeForUser_TranslationOptions(TranslationOptions):
|
||||||
|
fields = (
|
||||||
|
)
|
||||||
|
translator.register(SubscribeForUser, SubscribeForUser_TranslationOptions)
|
||||||
3
SubscribesApp/views.py
Normal file
3
SubscribesApp/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
@@ -54,7 +54,7 @@ INSTALLED_APPS = [
|
|||||||
'RoutesApp',
|
'RoutesApp',
|
||||||
'ReferenceDataApp',
|
'ReferenceDataApp',
|
||||||
'ArticlesApp',
|
'ArticlesApp',
|
||||||
|
'SubscribesApp',
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.text-align-center{
|
.text-align-center{
|
||||||
text-align: center;
|
text-align: -webkit-center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -552,6 +552,8 @@
|
|||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
display: block;
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.insert_users{
|
.insert_users{
|
||||||
@@ -1460,4 +1462,17 @@
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-find-more-routes.hide{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loader_f_loading_routes{
|
||||||
|
width: 25px;
|
||||||
|
height: 25px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.loader_f_loading_routes.show{
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,9 @@ let page_iterator = 2
|
|||||||
|
|
||||||
|
|
||||||
function load_routes (el) {
|
function load_routes (el) {
|
||||||
|
let loader = document.querySelector(".loader_f_loading_routes")
|
||||||
|
loader.classList.toggle("show")
|
||||||
|
el.classList.toggle("hide")
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
// let el_parent = el.parentNode
|
// let el_parent = el.parentNode
|
||||||
// let new_el = el_parent.previousSibling.previousSibling
|
// let new_el = el_parent.previousSibling.previousSibling
|
||||||
@@ -25,12 +28,21 @@ function load_routes (el) {
|
|||||||
// enctype: 'json',
|
// enctype: 'json',
|
||||||
data: JSON.stringify(data),
|
data: JSON.stringify(data),
|
||||||
success: function(data){
|
success: function(data){
|
||||||
|
|
||||||
// new_el.parentNode.insertBefore(data.html, new_el.nextSibling);
|
// new_el.parentNode.insertBefore(data.html, new_el.nextSibling);
|
||||||
let url_insert = ".page_routes_" + page_iterator
|
let url_insert = ".page_routes_" + page_iterator
|
||||||
document.querySelector(url_insert).innerHTML = data.html
|
let place_ins = document.querySelector(url_insert)
|
||||||
|
place_ins.innerHTML = data.html
|
||||||
let old_page_iterator = page_iterator
|
let old_page_iterator = page_iterator
|
||||||
page_iterator++
|
page_iterator++
|
||||||
|
loader.classList.toggle("show")
|
||||||
|
el.classList.toggle("hide")
|
||||||
|
let el_scroll = place_ins.firstElementChild
|
||||||
|
el_scroll.scrollIntoView(
|
||||||
|
{
|
||||||
|
behavior:"smooth"
|
||||||
|
}
|
||||||
|
)
|
||||||
let new_page_routes = document.createElement("div")
|
let new_page_routes = document.createElement("div")
|
||||||
new_page_routes.classList.add("page_routes_" + page_iterator)
|
new_page_routes.classList.add("page_routes_" + page_iterator)
|
||||||
$(new_page_routes).insertAfter(".page_routes_" + old_page_iterator);
|
$(new_page_routes).insertAfter(".page_routes_" + old_page_iterator);
|
||||||
@@ -40,7 +52,7 @@ function load_routes (el) {
|
|||||||
},
|
},
|
||||||
error: function (data){
|
error: function (data){
|
||||||
|
|
||||||
document.querySelector(".info_profile").innerHTML = data.responseJSON.html;
|
document.querySelector(".block-finded-routes").innerHTML = data.responseJSON.html;
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -219,6 +219,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="text-align-center">
|
<div class="text-align-center">
|
||||||
<button class="button-find-more-routes" id="25" onclick="load_routes(this)">Показать ещё 10</button>
|
<button class="button-find-more-routes" id="25" onclick="load_routes(this)">Показать ещё 10</button>
|
||||||
|
<img class="loader_f_loading_routes" src="{% static "img/svg/loader.svg" %}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user