This commit is contained in:
Vladislav 2026-07-27 02:02:05 -04:00
parent 43f1048320
commit 7dd8c520bc
15 changed files with 224 additions and 43 deletions

View File

@ -189,7 +189,7 @@
"import json\n", "import json\n",
"import os\n", "import os\n",
"\n", "\n",
"IGNORE = ['build.ipynb', 'data.ipynb']\n", "IGNORE = ['build.ipynb', 'data.ipynb', 'migrate.ipynb']\n",
"def build():\n", "def build():\n",
" for _filename in [i for i in os.listdir() if 'ipynb' in i and i not in IGNORE]:\n", " for _filename in [i for i in os.listdir() if 'ipynb' in i and i not in IGNORE]:\n",
" filename_without_extension = os.path.splitext(os.path.basename(_filename))[0]\n", " filename_without_extension = os.path.splitext(os.path.basename(_filename))[0]\n",
@ -1127,7 +1127,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": ".venv", "display_name": ".venv (3.14.6.final.0)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },

View File

@ -608,6 +608,10 @@
" {\"$set\": new_doc},\n", " {\"$set\": new_doc},\n",
" upsert=True,\n", " upsert=True,\n",
" ))\n", " ))\n",
" tasks.append(posts_collection.update_one(\n",
" {\"_id\": ObjectId(post_id)},\n",
" {\"$set\": {\"status\": \"На выставке\"}}\n",
" ))\n",
"\n", "\n",
" # NOTE: your original code used `post` from inside the loop (could be last item / even undefined).\n", " # NOTE: your original code used `post` from inside the loop (could be last item / even undefined).\n",
" # This version notifies once using the first found post user.\n", " # This version notifies once using the first found post user.\n",
@ -3073,7 +3077,7 @@
" \"grade\": safe_strip(grade),\n", " \"grade\": safe_strip(grade),\n",
" \"city\": safe_strip(city) or current_user.get('living_place'),\n", " \"city\": safe_strip(city) or current_user.get('living_place'),\n",
" \"size\": safe_strip(size),\n", " \"size\": safe_strip(size),\n",
" \"status\": \"publish\",\n", " \"status\": \"Опубликована\",\n",
" \"material\": safe_strip(material),\n", " \"material\": safe_strip(material),\n",
" \"genre\": safe_strip(genre),\n", " \"genre\": safe_strip(genre),\n",
" \"price\": safe_strip(price),\n", " \"price\": safe_strip(price),\n",
@ -4424,12 +4428,14 @@
" ])\n", " ])\n",
"\n", "\n",
" data = [doc async for doc in cursor]\n", " data = [doc async for doc in cursor]\n",
" exhibitions = await exhibition_collection.find({'_id': {'$in': [ObjectId(i.get('exhibition_id')) for i in data if i.get('exhibition_id')]}}).to_list()\n",
"\n", "\n",
" return templates.TemplateResponse(\n", " return templates.TemplateResponse(\n",
" request=request,\n", " request=request,\n",
" name=\"profile/delivery.html\",\n", " name=\"profile/delivery.html\",\n",
" context={\n", " context={\n",
" \"user\": user,\n", " \"user\": user,\n",
" \"exhibitions\": exhibitions,\n",
" \"data\": data,\n", " \"data\": data,\n",
" \"page_title\": \"Доставка\",\n", " \"page_title\": \"Доставка\",\n",
" \"active_section\": \"delivery\"\n", " \"active_section\": \"delivery\"\n",
@ -4559,7 +4565,7 @@
" counts_by_username = {d[\"_id\"]: d[\"count\"] for d in post_counts}\n", " counts_by_username = {d[\"_id\"]: d[\"count\"] for d in post_counts}\n",
"\n", "\n",
" galerists = [{\"_id\": uname, \"count\": counts_by_username.get(uname, '')} for uname in usernames]\n", " galerists = [{\"_id\": uname, \"count\": counts_by_username.get(uname, '')} for uname in usernames]\n",
" posts = [doc async for doc in posts_collection.find({}).sort('_id', -1).limit(32)]\n", " posts = [doc async for doc in posts_collection.find({'status':'Опубликована'}).sort('_id', -1).limit(32)]\n",
" return templates.TemplateResponse(\n", " return templates.TemplateResponse(\n",
" request=request, name=\"profile/partner/exhibition catalog.html\", context={\"now\": datetime.now(), \"user\": user, \"galerists\": galerists, \"genres\": genres, \"living_places\": living_places, \"exhibition\": exhibition, \"posts\": posts}\n", " request=request, name=\"profile/partner/exhibition catalog.html\", context={\"now\": datetime.now(), \"user\": user, \"galerists\": galerists, \"genres\": genres, \"living_places\": living_places, \"exhibition\": exhibition, \"posts\": posts}\n",
" )" " )"
@ -4581,6 +4587,12 @@
" exhibition = await exhibition_collection.find_one({'_id': ObjectId(exhibition_id)})\n", " exhibition = await exhibition_collection.find_one({'_id': ObjectId(exhibition_id)})\n",
" obj_ids = [ObjectId(x) for x in exhibition.get('posts', [])]\n", " obj_ids = [ObjectId(x) for x in exhibition.get('posts', [])]\n",
" posts = await posts_collection.find({\"_id\": {\"$in\": obj_ids}}).to_list() if obj_ids else []\n", " posts = await posts_collection.find({\"_id\": {\"$in\": obj_ids}}).to_list() if obj_ids else []\n",
" d_posts = await delivery_collection.find({'post_id':{'$in':[str(i.get('_id')) for i in posts]}}).to_list()\n",
" print(d_posts)\n",
" for doc in posts:\n",
" for post in d_posts:\n",
" if str(doc.get('_id')) == post.get('post_id'):\n",
" doc.update({'status':post.get('status')})\n",
" return templates.TemplateResponse(\n", " return templates.TemplateResponse(\n",
" request=request, name=\"profile/partner/exhibition.html\", context={\"now\": datetime.now(), \"user\": user, \"exhibition\": exhibition, \"posts\": posts}\n", " request=request, name=\"profile/partner/exhibition.html\", context={\"now\": datetime.now(), \"user\": user, \"exhibition\": exhibition, \"posts\": posts}\n",
" )\n", " )\n",
@ -4709,7 +4721,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": ".venv", "display_name": ".venv (3.14.6.final.0)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },

16
main.py
View File

@ -412,6 +412,10 @@ async def cron_every_five_min(token: str = Security(get_token)):
{"$set": new_doc}, {"$set": new_doc},
upsert=True, upsert=True,
)) ))
tasks.append(posts_collection.update_one(
{"_id": ObjectId(post_id)},
{"$set": {"status": "На выставке"}}
))
# NOTE: your original code used `post` from inside the loop (could be last item / even undefined). # NOTE: your original code used `post` from inside the loop (could be last item / even undefined).
# This version notifies once using the first found post user. # This version notifies once using the first found post user.
@ -2327,7 +2331,7 @@ async def post_painting(
"grade": safe_strip(grade), "grade": safe_strip(grade),
"city": safe_strip(city) or current_user.get('living_place'), "city": safe_strip(city) or current_user.get('living_place'),
"size": safe_strip(size), "size": safe_strip(size),
"status": "publish", "status": "Опубликована",
"material": safe_strip(material), "material": safe_strip(material),
"genre": safe_strip(genre), "genre": safe_strip(genre),
"price": safe_strip(price), "price": safe_strip(price),
@ -3439,12 +3443,14 @@ async def profile_delivery(
]) ])
data = [doc async for doc in cursor] data = [doc async for doc in cursor]
exhibitions = await exhibition_collection.find({'_id': {'$in': [ObjectId(i.get('exhibition_id')) for i in data if i.get('exhibition_id')]}}).to_list()
return templates.TemplateResponse( return templates.TemplateResponse(
request=request, request=request,
name="profile/delivery.html", name="profile/delivery.html",
context={ context={
"user": user, "user": user,
"exhibitions": exhibitions,
"data": data, "data": data,
"page_title": "Доставка", "page_title": "Доставка",
"active_section": "delivery" "active_section": "delivery"
@ -3552,7 +3558,7 @@ async def profile_partner_exhibitions_catalog(
counts_by_username = {d["_id"]: d["count"] for d in post_counts} counts_by_username = {d["_id"]: d["count"] for d in post_counts}
galerists = [{"_id": uname, "count": counts_by_username.get(uname, '')} for uname in usernames] galerists = [{"_id": uname, "count": counts_by_username.get(uname, '')} for uname in usernames]
posts = [doc async for doc in posts_collection.find({}).sort('_id', -1).limit(32)] posts = [doc async for doc in posts_collection.find({'status':'Опубликована'}).sort('_id', -1).limit(32)]
return templates.TemplateResponse( return templates.TemplateResponse(
request=request, name="profile/partner/exhibition catalog.html", context={"now": datetime.now(), "user": user, "galerists": galerists, "genres": genres, "living_places": living_places, "exhibition": exhibition, "posts": posts} request=request, name="profile/partner/exhibition catalog.html", context={"now": datetime.now(), "user": user, "galerists": galerists, "genres": genres, "living_places": living_places, "exhibition": exhibition, "posts": posts}
) )
@ -3566,6 +3572,12 @@ async def profile_partner_exhibitions(
exhibition = await exhibition_collection.find_one({'_id': ObjectId(exhibition_id)}) exhibition = await exhibition_collection.find_one({'_id': ObjectId(exhibition_id)})
obj_ids = [ObjectId(x) for x in exhibition.get('posts', [])] obj_ids = [ObjectId(x) for x in exhibition.get('posts', [])]
posts = await posts_collection.find({"_id": {"$in": obj_ids}}).to_list() if obj_ids else [] posts = await posts_collection.find({"_id": {"$in": obj_ids}}).to_list() if obj_ids else []
d_posts = await delivery_collection.find({'post_id':{'$in':[str(i.get('_id')) for i in posts]}}).to_list()
print(d_posts)
for doc in posts:
for post in d_posts:
if str(doc.get('_id')) == post.get('post_id'):
doc.update({'status':post.get('status')})
return templates.TemplateResponse( return templates.TemplateResponse(
request=request, name="profile/partner/exhibition.html", context={"now": datetime.now(), "user": user, "exhibition": exhibition, "posts": posts} request=request, name="profile/partner/exhibition.html", context={"now": datetime.now(), "user": user, "exhibition": exhibition, "posts": posts}
) )

85
migrate.ipynb Normal file
View File

@ -0,0 +1,85 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "90b31bac",
"metadata": {},
"outputs": [],
"source": [
"# ignore\n",
"import os\n",
"\n",
"def load_env(file_path):\n",
" \"\"\"Загружает переменные окружения из файла .env с поддержкой булевых значений.\"\"\"\n",
" with open(file_path) as f:\n",
" for line in f:\n",
" line = line.strip()\n",
" if not line or line.startswith('#'):\n",
" continue\n",
" \n",
" try:\n",
" key, value = line.split('=', 1)\n",
" key = key.strip()\n",
" value = value.strip('\"\\' ')\n",
" # Преобразование строковых значений в булевые\n",
" if value.lower() in ['true', '1', 'yes']:\n",
" value = True\n",
" elif value.lower() in ['false', '0', 'no']:\n",
" value = False\n",
" \n",
" # Проверка, что ключ не пустой\n",
" if key:\n",
" os.environ[key] = str(value) # Храним как строку\n",
" except ValueError:\n",
" print(f\"Ошибка: неверный формат в строке '{line}'\")\n",
"\n",
"try:\n",
" load_env('env')\n",
"except:\n",
" load_env('env_example')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3f5835c",
"metadata": {},
"outputs": [],
"source": [
"from db import *"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d80807dd",
"metadata": {},
"outputs": [],
"source": [
"await posts_collection.update_many({'status':'publish'},{'$set':{'status':'Опубликована'}})"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv (3.14.6.final.0)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.14.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -918,7 +918,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": ".venv", "display_name": ".venv (3.14.6.final.0)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },

View File

@ -60,7 +60,7 @@
</span> </span>
</div> </div>
{% if profile %} {% if profile %}
<!-- {% if competition.get('publish') is none %} <!-- {% if competition.get('Опубликована') is none %}
<div class="fl"> <div class="fl">
<span class="c_2fr39 b_tfnz2">Публикация запланирована на</span> <span class="c_2fr39 b_tfnz2">Публикация запланирована на</span>
</div> </div>
@ -83,7 +83,7 @@
<span class="offer-text">Публикация в соц. сетях Художников</span> <span class="offer-text">Публикация в соц. сетях Художников</span>
</label> </label>
<button class="c_aq9et" id="rePublishCompetition" data-competition_id="{{competition._id}}"> <button class="c_aq9et" id="rePublishCompetition" data-competition_id="{{competition._id}}">
<span class="c_som9s">{% if competition.get('publish') is none %}Опубликовать{% else %}Опубликовать повторно{% endif %}</span> <span class="c_som9s">{% if competition.get('Опубликована') is none %}Опубликовать{% else %}Опубликовать повторно{% endif %}</span>
</button> </button>
<div class="fl"> <div class="fl">
<a class="c_2fr39 b_tfnz2" href="/form/competition/{{competition._id}}">Редактировать</a> <a class="c_2fr39 b_tfnz2" href="/form/competition/{{competition._id}}">Редактировать</a>

View File

@ -0,0 +1,20 @@
{% macro blue() %}
.l_blue{}
.l_blue>span{}
{% endmacro %}
{% macro green() %}
.l_green{align-items: center;background: rgba(14, 214, 70, 0.20);border-radius: 30px;display: flex;justify-content: center;padding: 1.5px 10px;}
.l_green>span{color: #0ED646;font-family: Inter;font-size: 12px;font-style: normal;font-weight: 700;line-height: normal;}
{% endmacro %}
{% macro purple() %}
.l_purple{align-items: center;background: rgba(95, 23, 152, 0.20);border-radius: 30px;display: flex;justify-content: center;padding: 1.5px 10px;}
.l_purple>span{color: #5F1798;font-family: Inter;font-size: 12px;font-style: normal;font-weight: 700;line-height: normal;}
{% endmacro %}
{% macro tg() %}
.l_tg{}
.l_tg>span{}
{% endmacro %}
{% macro vk() %}
.l_vk{}
.l_vk>span{}
{% endmacro %}

View File

@ -17,7 +17,7 @@
<img src="/static/ar.svg" crossorigin="anonymous" fetchpriority="high" loading="eager"/> <img src="/static/ar.svg" crossorigin="anonymous" fetchpriority="high" loading="eager"/>
</a> </a>
<a class="{% if nav =='delivery' %}b_ny6vg{%else%}b_cros1{%endif%}" href="/profile/delivery#main"> <a class="{% if nav =='delivery' %}b_ny6vg{%else%}b_cros1{%endif%}" href="/profile/delivery#main">
<span class="{% if nav =='delivery' %}b_ld219{%else%}b_v15gw{%endif%}">Доставка картин <span class="{% if nav =='delivery' %}b_ld219{%else%}b_v15gw{%endif%}">Где картины
{% if delivery_read_cnt > 0 %} {% if delivery_read_cnt > 0 %}
<span class="notification-badge mob" id="notificationCount"> <span class="notification-badge mob" id="notificationCount">
{{ delivery_read_cnt }} {{ delivery_read_cnt }}
@ -37,7 +37,7 @@
{% elif 'admin' in user.get('profile', '') %} {% elif 'admin' in user.get('profile', '') %}
{% else %} {% else %}
<a class="{% if nav =='delivery' %}b_ny6vg{%else%}b_cros1{%endif%}" href="/profile/delivery#main"> <a class="{% if nav =='delivery' %}b_ny6vg{%else%}b_cros1{%endif%}" href="/profile/delivery#main">
<span class="{% if nav =='delivery' %}b_ld219{%else%}b_v15gw{%endif%}">Доставка картин <span class="{% if nav =='delivery' %}b_ld219{%else%}b_v15gw{%endif%}">Где картины
{% if delivery_read_cnt > 0 %} {% if delivery_read_cnt > 0 %}
<span class="notification-badge mob" id="notificationCount"> <span class="notification-badge mob" id="notificationCount">
{{ delivery_read_cnt }} {{ delivery_read_cnt }}

View File

@ -5,12 +5,12 @@
{% import "components/profile_nav.html" as profile_nav %} {% import "components/profile_nav.html" as profile_nav %}
{% import "competition/list.html" as competition %} {% import "competition/list.html" as competition %}
{% block title %}Доставка картин{% endblock %} {% block title %}Где картины{% endblock %}
{% macro render_doc(doc) %} {% macro render_doc(doc) %}
<figure class="c_4b1hy b_uu2ub" data-delivery-id="{{doc._id}}" data-sender="{{doc.sender._id}}" data-receiver="{{doc.receiver._id}}"> <figure class="c_4b1hy b_uu2ub" data-exhibition_id="{{doc.get('exhibition_id')}}" data-delivery-id="{{doc._id}}" data-sender="{{doc.sender._id}}" data-receiver="{{doc.receiver._id}}">
<img class="b_1fvkt" src="/b/posts/{{doc.img}}"> <img class="b_1fvkt" src="/b/posts/{{doc.img}}">
<figcaption class="c_3g8gh b_pvw5a" data-id="{{doc._id}}"> <figcaption class="c_3g8gh b_pvw5a" data-id="{{doc._id}}">
{% if doc.status == 'Ожидает отправки' %} {% if doc.status == 'Ожидает отправки' %}
<div class="b_thlt1"> <div class="b_thlt1">
@ -100,39 +100,79 @@
<div class="c_ru432"> <div class="c_ru432">
{{ profile_nav.profile_nav(user, 'delivery') }} {{ profile_nav.profile_nav(user, 'delivery') }}
<div class="c_tihtk" id="main"> <div class="c_tihtk" id="main">
{% set statuses = ['Ожидает отправки', 'Возврат художнику'] %} {% set statuses = ['Ожидает отправки', 'Возврат художнику'] %}
{% if data | selectattr('status', 'in', statuses) | list | length > 0 %} {% if data | selectattr('status', 'in', statuses) | list | length > 0 %}
<article class="c_9fgdh b_ax8vz"> <article class="c_9fgdh b_ax8vz">
<div class="c_z3dpx b_73p10"> <div class="c_z3dpx b_73p10">
<header class="c_m876y b_9xtz9"> <header class="c_m876y b_9xtz9">
<h3 class="b_8f3uh">Настройки отправки</h3> <h3 class="b_8f3uh">Фильтры</h3>
</header> </header>
<p class="b_tfnz2">Можно менять перед каждой отправкой картины</p> <div class="c_aihm6 floating-group">
<div class="b_73p10"> <select class="c_xhd5k" id="exhibition_id" name="exhibition_id" required
onchange="filterFigure(this.value)">
<option value="">Выбрать выставку</option>
{% for doc in exhibitions %}
<option value="{{doc._id}}">{{doc.title}}</option>
{% endfor %}
</select>
<label for="exhibition_id" class="c_z3ybu floating-label">Выставка</label>
</div>
<header class="c_m876y b_9xtz9">
<h3 class="b_8f3uh">Настройки отправки</h3>
</header>
<p class="b_tfnz2">Можно менять перед каждой отправкой картины</p>
<div class="b_73p10">
<div class="c_aihm6 floating-group"> <div class="c_aihm6 floating-group">
<select class="c_xhd5k" type="text" id="delivery_type" name="delivery_type" required> <select class="c_xhd5k" type="text" id="delivery_type" name="delivery_type" required>
<option>СДЭК</option> <option>СДЭК</option>
<option>Самостоятельно</option> <option>Самостоятельно</option>
</select> </select>
<label for="delivery_type" class="c_z3ybu floating-label">Способ доставки</label> <label for="delivery_type" class="c_z3ybu floating-label">Способ доставки</label>
</div> </div>
<div class="c_aihm6 floating-group"> <div class="c_aihm6 floating-group">
<input placeholder="..." type="text" id="track" name="track" class="c_xhd5k" required <input placeholder="..." type="text" id="track" name="track" class="c_xhd5k" required
data-toast="Поле Трэк-номер должно быть заполнено"> data-toast="Поле Трэк-номер должно быть заполнено">
<label for="track" class="c_z3ybu floating-label">Трэк-номер</label> <label for="track" class="c_z3ybu floating-label">Трэк-номер</label>
</div>
</div> </div>
</div> </div>
</article> </div>
{% endif %} </article>
{% endif %}
{% for doc in data if doc.status in statuses %} {% for doc in data if doc.status in statuses %}
{{ render_doc(doc) }} {{ render_doc(doc) }}
{% endfor %} {% endfor %}
{% for doc in data if doc.status not in statuses %} {% for doc in data if doc.status not in statuses %}
{{ render_doc(doc) }} {{ render_doc(doc) }}
{% endfor %} {% endfor %}
<script defer>
const query = window.location.href.split('?')[1] || '';
let exhibition_id = null;
if (query) {
const parts = query.split('=');
if (parts[0] === 'exhibition_id' && parts[1] !== 'None') {
exhibition_id = parts[1];
}
}
function filterFigure(exhibition_id) {
document.getElementById('main').querySelectorAll('figure').forEach(figure => {
if (!exhibition_id || figure.dataset.exhibition_id === exhibition_id) {
figure.style.display = 'flex';
console.log(figure.dataset.exhibition_id, exhibition_id, 'flex')
} else {
console.log(figure.dataset.exhibition_id, exhibition_id)
figure.style.display = 'none';
}
});
}
if (exhibition_id) {
document.getElementById('exhibition_id').value = exhibition_id;
}
filterFigure(exhibition_id);
</script>
<script> <script>
const deliveryType = document.getElementById('delivery_type'); const deliveryType = document.getElementById('delivery_type');
const track = document.getElementById('track'); const track = document.getElementById('track');

View File

@ -5,7 +5,7 @@
{% import "components/profile_nav.html" as profile_nav %} {% import "components/profile_nav.html" as profile_nav %}
{% import "competition/list.html" as competition %} {% import "competition/list.html" as competition %}
{% block title %}Доставка картин{% endblock %} {% block title %}Где картины{% endblock %}

View File

@ -18,7 +18,7 @@
<div class="c_tihtk" id="main"> <div class="c_tihtk" id="main">
{% for i in data %} {% for i in data %}
<article class="c_9fgdh b_ax8vz"> <article class="c_9fgdh b_ax8vz">
<a href="/profile/partner/exhibition/{{i._id}}{% if i.status == 0 %}/catalog{%endif%}#main"> <a href="/exhibition/{{i._id}}{% if i.status == 0 %}/catalog{%endif%}#main">
<div class="b_ornr9"> <div class="b_ornr9">
<picture> <picture>
<img src="/b/exhibition/{{i.poster_file_id}}" data-src="/b/exhibition/{{i.poster_orig_id}}" id="preview_poster" crossorigin="anonymous" fetchpriority="high" loading="eager" alt="Загрузите афишу" class="b_ornr9"> <img src="/b/exhibition/{{i.poster_file_id}}" data-src="/b/exhibition/{{i.poster_orig_id}}" id="preview_poster" crossorigin="anonymous" fetchpriority="high" loading="eager" alt="Загрузите афишу" class="b_ornr9">
@ -26,7 +26,7 @@
</div> </div>
</a> </a>
<div class="c_z3dpx b_73p10"> <div class="c_z3dpx b_73p10">
<a class="b_73p10" href="/profile/partner/exhibition/{{i._id}}{% if i.status == 0 %}/catalog{%endif%}#main"> <a class="b_73p10" href="/exhibition/{{i._id}}{% if i.status == 0 %}/catalog{%endif%}#main">
<div class="c_c4wam b_vabj9"> <div class="c_c4wam b_vabj9">
{% if now > i.date_finish %} {% if now > i.date_finish %}
<span class="c_95csi b_0jst1">Закончилась</span> <span class="c_95csi b_0jst1">Закончилась</span>

View File

@ -185,7 +185,7 @@
setTimeout(() => { setTimeout(() => {
localStorage.removeItem(LS_KEY); localStorage.removeItem(LS_KEY);
window.location.href = '/profile/delivery#main'; window.location.href = '/profile/delivery#main?exhibition_id={{doc.get("exhibition_id")}}';
}, 5000); }, 5000);
} catch (e) { } catch (e) {

View File

@ -233,7 +233,7 @@ document.querySelectorAll('.b_k2cle button').forEach(button => {
if (this.textContent.trim() == this.dataset.status){ if (this.textContent.trim() == this.dataset.status){
parent.querySelectorAll('button').forEach(btn => { parent.querySelectorAll('button').forEach(btn => {
btn.dataset.status = 'publish'; btn.dataset.status = 'Опубликована';
if (btn !== this) btn.classList.remove('hidden'); if (btn !== this) btn.classList.remove('hidden');
}); });
} else { } else {

View File

@ -4,6 +4,7 @@
{% import "components/profile_card.html" as profile_card %} {% import "components/profile_card.html" as profile_card %}
{% import "components/profile_nav.html" as profile_nav %} {% import "components/profile_nav.html" as profile_nav %}
{% import "competition/list.html" as competition %} {% import "competition/list.html" as competition %}
{% import "components/label.html" as label %}
{% block title %}Каталог картин{% endblock %} {% block title %}Каталог картин{% endblock %}
@ -34,7 +35,6 @@
<input readonly name="filter-grade" id="filter-grade" value="Выбрать все" class="c_xhd5k" data-select="1" data-radio="0" data-takeall="1" <input readonly name="filter-grade" id="filter-grade" value="Выбрать все" class="c_xhd5k" data-select="1" data-radio="0" data-takeall="1"
data-list="['Без звания', 'Заслуженный художник Российской федерации', 'Народный художник Российской федерации', 'Академик Российской академии художеств', 'Почетный член Российской академии художеств', 'Действительный член Российской Академии художеств', 'Член-корреспондент Российской академии художеств', 'Член Союза художников России', 'Член творческого союза художников России', 'Член Московского союза художников', 'Член Подмосковного союза художников', 'Член Союза русских художников', 'Творческий союз профессиональных художников', 'Евразийский союз художников', 'Международный художественный фонд', 'Творческое объединение женщин-художников']" data-list="['Без звания', 'Заслуженный художник Российской федерации', 'Народный художник Российской федерации', 'Академик Российской академии художеств', 'Почетный член Российской академии художеств', 'Действительный член Российской Академии художеств', 'Член-корреспондент Российской академии художеств', 'Член Союза художников России', 'Член творческого союза художников России', 'Член Московского союза художников', 'Член Подмосковного союза художников', 'Член Союза русских художников', 'Творческий союз профессиональных художников', 'Евразийский союз художников', 'Международный художественный фонд', 'Творческое объединение женщин-художников']"
data-label="Сохранить" data-custom_placeholder="" data-custom="0" data-title="Выберите звание из списка"> data-label="Сохранить" data-custom_placeholder="" data-custom="0" data-title="Выберите звание из списка">
<label for="filter-grade" class="c_z3ybu floating-label">По званию</label> <label for="filter-grade" class="c_z3ybu floating-label">По званию</label>
</div> </div>
<div class="c_aihm6 floating-group"> <div class="c_aihm6 floating-group">
@ -252,6 +252,7 @@ genre = genres.map(g => {
size: {{ p.size|tojson }}, size: {{ p.size|tojson }},
material: {{ p.material|tojson }}, material: {{ p.material|tojson }},
genre: {{ p.genre|tojson }}, genre: {{ p.genre|tojson }},
status: {{ p.status|tojson }},
medias: {{ (p.medias or [])|tojson }}, medias: {{ (p.medias or [])|tojson }},
medias_original: {{ (p.medias_original or [])|tojson }}, medias_original: {{ (p.medias_original or [])|tojson }},
{% if p.user %} {% if p.user %}
@ -303,6 +304,7 @@ genre = genres.map(g => {
</div> </div>
<div class="c_z3dpx b_73p10"> <div class="c_z3dpx b_73p10">
<header class="c_m876y b_9xtz9"><h3 class="c_hysjg b_8f3uh">${escapeHtml(post?.title)}</h3></header> <header class="c_m876y b_9xtz9"><h3 class="c_hysjg b_8f3uh">${escapeHtml(post?.title)}</h3></header>
<div class="l_green"><span>${escapeHtml(post?.status)}</span></div>
<p class="c_2fr39 b_tfnz2">Размер: ${escapeHtml(post?.size)}</p> <p class="c_2fr39 b_tfnz2">Размер: ${escapeHtml(post?.size)}</p>
<p class="c_2fr39 b_tfnz2">Материал: ${escapeHtml(post?.material)}</p> <p class="c_2fr39 b_tfnz2">Материал: ${escapeHtml(post?.material)}</p>
<p class="c_2fr39 b_tfnz2">Жанр: ${escapeHtml(post?.genre)}</p> <p class="c_2fr39 b_tfnz2">Жанр: ${escapeHtml(post?.genre)}</p>
@ -499,6 +501,8 @@ genre = genres.map(g => {
{{ profile_nav.style() }} {{ profile_nav.style() }}
{{ competition.style() }} {{ competition.style() }}
<style type="text/css"> <style type="text/css">
{{label.green()}}
{{label.purple()}}
@media (min-width: 901px) { @media (min-width: 901px) {
.c_aihm6 { display: flex; width: 284px; justify-content: center; align-items: center; border-radius: 5px; background: #FFF; } .c_aihm6 { display: flex; width: 284px; justify-content: center; align-items: center; border-radius: 5px; background: #FFF; }
.c_xhd5k { display: flex; height: 42px; padding: 5px 10px; align-items: center; flex: 1 0 0; } .c_xhd5k { display: flex; height: 42px; padding: 5px 10px; align-items: center; flex: 1 0 0; }

View File

@ -4,6 +4,7 @@
{% import "components/profile_card.html" as profile_card %} {% import "components/profile_card.html" as profile_card %}
{% import "components/profile_nav.html" as profile_nav %} {% import "components/profile_nav.html" as profile_nav %}
{% import "competition/list.html" as competition %} {% import "competition/list.html" as competition %}
{% import "components/label.html" as label %}
{% block title %}Отобранные картины | Выставка {{exhibition.title}}{% endblock %} {% block title %}Отобранные картины | Выставка {{exhibition.title}}{% endblock %}
@ -68,6 +69,11 @@
<header class="c_m876y b_9xtz9"> <header class="c_m876y b_9xtz9">
<h3 class="c_hysjg b_8f3uh" id="preview_title">{{post.title}}</h3> <h3 class="c_hysjg b_8f3uh" id="preview_title">{{post.title}}</h3>
</header> </header>
{% if post.status=='Опубликована' %}
<div class="l_green"><span>{{post.status}}</span></div>
{% else %}
<div class="l_purple"><span>{{post.status}}</span></div>
{% endif %}
<p class="c_2fr39 b_tfnz2" id="preview_topic">Размер: {{post.size}}</p> <p class="c_2fr39 b_tfnz2" id="preview_topic">Размер: {{post.size}}</p>
<p class="c_2fr39 b_tfnz2" id="preview_topic">Материал: {{post.material}}</p> <p class="c_2fr39 b_tfnz2" id="preview_topic">Материал: {{post.material}}</p>
<p class="c_2fr39 b_tfnz2" id="preview_topic">Жанр: {{post.genre}}</p> <p class="c_2fr39 b_tfnz2" id="preview_topic">Жанр: {{post.genre}}</p>
@ -145,6 +151,8 @@
{{ profile_nav.style() }} {{ profile_nav.style() }}
{{ competition.style() }} {{ competition.style() }}
<style type="text/css"> <style type="text/css">
{{label.green()}}
{{label.purple()}}
#preview_poster{min-height: 456px;} #preview_poster{min-height: 456px;}
body{background: #F6EBFF;} body{background: #F6EBFF;}
.c_3ihvi{ position: sticky; top: 0; z-index: 2; background: white; } .c_3ihvi{ position: sticky; top: 0; z-index: 2; background: white; }