347 lines
23 KiB
Python
347 lines
23 KiB
Python
"""Seed static content
|
||
|
||
Revision ID: 018_seed_static_content
|
||
Revises: 017_admin_logs_nullable_admin_id
|
||
Create Date: 2024-12-20
|
||
|
||
"""
|
||
from typing import Sequence, Union
|
||
|
||
from alembic import op
|
||
import sqlalchemy as sa
|
||
|
||
|
||
# revision identifiers, used by Alembic.
|
||
revision: str = '018_seed_static_content'
|
||
down_revision: Union[str, None] = '017_admin_logs_nullable_admin_id'
|
||
branch_labels: Union[str, Sequence[str], None] = None
|
||
depends_on: Union[str, Sequence[str], None] = None
|
||
|
||
|
||
STATIC_CONTENT_DATA = [
|
||
{
|
||
'key': 'terms_of_service',
|
||
'title': 'Пользовательское соглашение',
|
||
'content': '''<p class="text-gray-400 mb-6">Настоящее Пользовательское соглашение (далее — «Соглашение») регулирует отношения между администрацией интернет-сервиса «Игровой Марафон» (далее — «Сервис», «Платформа», «Мы») и физическим лицом, использующим Сервис (далее — «Пользователь», «Вы»).</p>
|
||
|
||
<p class="text-gray-400 mb-6"><strong class="text-white">Дата вступления в силу:</strong> с момента регистрации на Платформе.<br/>
|
||
Используя Сервис, Вы подтверждаете, что полностью ознакомились с условиями настоящего Соглашения и принимаете их в полном объёме.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>1. Общие положения</h2>
|
||
|
||
<p>1.1. Сервис «Игровой Марафон» представляет собой онлайн-платформу для организации и проведения игровых марафонов — соревнований, в рамках которых участники выполняют игровые задания (челленджи) и получают очки за их успешное выполнение.</p>
|
||
|
||
<p>1.2. Сервис предоставляет Пользователям следующие возможности:</p>
|
||
<ul>
|
||
<li>Создание и участие в игровых марафонах</li>
|
||
<li>Получение случайных игровых заданий различной сложности</li>
|
||
<li>Отслеживание прогресса и статистики участников</li>
|
||
<li>Участие в специальных игровых событиях</li>
|
||
<li>Получение уведомлений через интеграцию с Telegram</li>
|
||
</ul>
|
||
|
||
<p>1.3. Сервис предоставляется на условиях «как есть» (as is). Администрация не гарантирует, что Сервис будет соответствовать ожиданиям Пользователя или работать бесперебойно.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>2. Регистрация и учётная запись</h2>
|
||
|
||
<p>2.1. Для доступа к функционалу Сервиса необходима регистрация учётной записи. При регистрации Пользователь обязуется предоставить достоверные данные.</p>
|
||
|
||
<p>2.2. Пользователь несёт полную ответственность за:</p>
|
||
<ul>
|
||
<li>Сохранность своих учётных данных (логина и пароля)</li>
|
||
<li>Все действия, совершённые с использованием его учётной записи</li>
|
||
<li>Своевременное уведомление Администрации о несанкционированном доступе к аккаунту</li>
|
||
</ul>
|
||
|
||
<p>2.3. Каждый Пользователь имеет право на одну учётную запись. Создание дополнительных аккаунтов (мультиаккаунтинг) запрещено и влечёт блокировку всех связанных учётных записей.</p>
|
||
|
||
<p>2.4. Пользователь вправе в любой момент удалить свою учётную запись, обратившись к Администрации. При удалении аккаунта все связанные данные будут безвозвратно удалены.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>3. Правила использования Сервиса</h2>
|
||
|
||
<p>3.1. <strong class="text-white">При использовании Сервиса запрещается:</strong></p>
|
||
<ul>
|
||
<li>Использовать читы, эксплойты, модификации и любое стороннее программное обеспечение, дающее нечестное преимущество при выполнении игровых заданий</li>
|
||
<li>Предоставлять ложные доказательства выполнения заданий (поддельные скриншоты, видео, достижения)</li>
|
||
<li>Передавать доступ к учётной записи третьим лицам</li>
|
||
<li>Оскорблять, унижать или преследовать других участников</li>
|
||
<li>Распространять спам, рекламу или вредоносный контент</li>
|
||
<li>Нарушать работу Сервиса техническими средствами</li>
|
||
<li>Использовать Сервис для деятельности, нарушающей законодательство</li>
|
||
</ul>
|
||
|
||
<p>3.2. <strong class="text-white">Правила проведения марафонов:</strong></p>
|
||
<ul>
|
||
<li>Участники обязаны честно выполнять полученные задания</li>
|
||
<li>Доказательства выполнения должны быть подлинными и соответствовать требованиям задания</li>
|
||
<li>Отказ от задания (дроп) влечёт штрафные санкции согласно правилам конкретного марафона</li>
|
||
<li>Споры по заданиям разрешаются через систему диспутов с участием других участников марафона</li>
|
||
</ul>
|
||
|
||
<p>3.3. Организаторы марафонов несут ответственность за соблюдение правил в рамках своих мероприятий и имеют право устанавливать дополнительные правила, не противоречащие настоящему Соглашению.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>4. Система очков и рейтинг</h2>
|
||
|
||
<p>4.1. За выполнение заданий Пользователи получают очки, количество которых зависит от сложности задания и активных игровых событий.</p>
|
||
|
||
<p>4.2. Очки используются исключительно для формирования рейтинга участников в рамках марафонов и не имеют денежного эквивалента.</p>
|
||
|
||
<p>4.3. Администрация оставляет за собой право корректировать начисленные очки в случае выявления нарушений или технических ошибок.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>5. Ответственность сторон</h2>
|
||
|
||
<p>5.1. <strong class="text-white">Администрация не несёт ответственности за:</strong></p>
|
||
<ul>
|
||
<li>Временную недоступность Сервиса по техническим причинам</li>
|
||
<li>Потерю данных вследствие технических сбоев</li>
|
||
<li>Действия третьих лиц, получивших доступ к учётной записи Пользователя</li>
|
||
<li>Контент, размещаемый Пользователями</li>
|
||
<li>Качество интернет-соединения Пользователя</li>
|
||
</ul>
|
||
|
||
<p>5.2. Пользователь несёт ответственность за соблюдение условий настоящего Соглашения и применимого законодательства.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>6. Санкции за нарушения</h2>
|
||
|
||
<p>6.1. За нарушение условий настоящего Соглашения Администрация вправе применить следующие санкции:</p>
|
||
<ul>
|
||
<li><strong class="text-yellow-400">Предупреждение</strong> — за незначительные нарушения</li>
|
||
<li><strong class="text-orange-400">Временная блокировка</strong> — ограничение доступа к Сервису на определённый срок</li>
|
||
<li><strong class="text-red-400">Постоянная блокировка</strong> — бессрочное ограничение доступа за грубые или повторные нарушения</li>
|
||
</ul>
|
||
|
||
<p>6.2. Решение о применении санкций принимается Администрацией единолично и является окончательным. Администрация не обязана объяснять причины принятого решения.</p>
|
||
|
||
<p>6.3. Обход блокировки путём создания новых учётных записей влечёт блокировку всех выявленных аккаунтов.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>7. Интеллектуальная собственность</h2>
|
||
|
||
<p>7.1. Все элементы Сервиса (дизайн, код, тексты, логотипы) являются объектами интеллектуальной собственности Администрации и защищены применимым законодательством.</p>
|
||
|
||
<p>7.2. Использование материалов Сервиса без письменного разрешения Администрации запрещено.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>8. Изменение условий Соглашения</h2>
|
||
|
||
<p>8.1. Администрация вправе в одностороннем порядке изменять условия настоящего Соглашения.</p>
|
||
|
||
<p>8.2. Актуальная редакция Соглашения размещается на данной странице с указанием даты последнего обновления.</p>
|
||
|
||
<p>8.3. Продолжение использования Сервиса после внесения изменений означает согласие Пользователя с новой редакцией Соглашения.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>9. Заключительные положения</h2>
|
||
|
||
<p>9.1. Настоящее Соглашение регулируется законодательством Российской Федерации.</p>
|
||
|
||
<p>9.2. Все споры, возникающие в связи с использованием Сервиса, подлежат разрешению путём переговоров. При недостижении согласия споры разрешаются в судебном порядке по месту нахождения Администрации.</p>
|
||
|
||
<p>9.3. Признание судом недействительности какого-либо положения настоящего Соглашения не влечёт недействительности остальных положений.</p>
|
||
|
||
<p>9.4. По всем вопросам, связанным с использованием Сервиса, Вы можете обратиться к Администрации через Telegram-бота или иные доступные каналы связи.</p>'''
|
||
},
|
||
{
|
||
'key': 'privacy_policy',
|
||
'title': 'Политика конфиденциальности',
|
||
'content': '''<p class="text-gray-400 mb-6">Настоящая Политика конфиденциальности (далее — «Политика») описывает, как интернет-сервис «Игровой Марафон» (далее — «Сервис», «Мы») собирает, использует, хранит и защищает персональные данные пользователей (далее — «Пользователь», «Вы»).</p>
|
||
|
||
<p class="text-gray-400 mb-6">Используя Сервис, Вы даёте согласие на обработку Ваших персональных данных в соответствии с условиями настоящей Политики.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>1. Собираемые данные</h2>
|
||
|
||
<p>1.1. <strong class="text-white">Данные, предоставляемые Пользователем:</strong></p>
|
||
<ul>
|
||
<li><strong>Регистрационные данные:</strong> логин, пароль (в зашифрованном виде), никнейм</li>
|
||
<li><strong>Данные профиля:</strong> аватар (при загрузке)</li>
|
||
<li><strong>Данные интеграции Telegram:</strong> Telegram ID, имя пользователя, имя и фамилия (при привязке бота)</li>
|
||
</ul>
|
||
|
||
<p>1.2. <strong class="text-white">Данные, собираемые автоматически:</strong></p>
|
||
<ul>
|
||
<li><strong>Данные об активности:</strong> участие в марафонах, выполненные задания, заработанные очки, статистика</li>
|
||
<li><strong>Технические данные:</strong> IP-адрес, тип браузера, время доступа (для обеспечения безопасности)</li>
|
||
<li><strong>Данные сессии:</strong> информация для поддержания авторизации</li>
|
||
</ul>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>2. Цели обработки данных</h2>
|
||
|
||
<p>2.1. Мы обрабатываем Ваши персональные данные для следующих целей:</p>
|
||
|
||
<p><strong class="text-neon-400">Предоставление услуг:</strong></p>
|
||
<ul>
|
||
<li>Идентификация и аутентификация Пользователя</li>
|
||
<li>Обеспечение участия в марафонах и игровых событиях</li>
|
||
<li>Ведение статистики и формирование рейтингов</li>
|
||
<li>Отображение профиля Пользователя другим участникам</li>
|
||
</ul>
|
||
|
||
<p><strong class="text-neon-400">Коммуникация:</strong></p>
|
||
<ul>
|
||
<li>Отправка уведомлений о событиях марафонов через Telegram-бота</li>
|
||
<li>Информирование о новых заданиях и результатах</li>
|
||
<li>Ответы на обращения Пользователей</li>
|
||
</ul>
|
||
|
||
<p><strong class="text-neon-400">Безопасность:</strong></p>
|
||
<ul>
|
||
<li>Защита от несанкционированного доступа</li>
|
||
<li>Выявление и предотвращение нарушений</li>
|
||
<li>Ведение журнала административных действий</li>
|
||
</ul>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>3. Правовые основания обработки</h2>
|
||
|
||
<p>3.1. Обработка персональных данных осуществляется на следующих основаниях:</p>
|
||
<ul>
|
||
<li><strong>Согласие Пользователя</strong> — при регистрации и использовании Сервиса</li>
|
||
<li><strong>Исполнение договора</strong> — Пользовательского соглашения</li>
|
||
<li><strong>Законный интерес</strong> — обеспечение безопасности Сервиса</li>
|
||
</ul>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>4. Хранение и защита данных</h2>
|
||
|
||
<p>4.1. <strong class="text-white">Меры безопасности:</strong></p>
|
||
<ul>
|
||
<li>Пароли хранятся в зашифрованном виде с использованием алгоритма bcrypt</li>
|
||
<li>Передача данных осуществляется по защищённому протоколу HTTPS</li>
|
||
<li>Доступ к базе данных ограничен и контролируется</li>
|
||
<li>Административные действия логируются и требуют двухфакторной аутентификации</li>
|
||
</ul>
|
||
|
||
<p>4.2. <strong class="text-white">Срок хранения:</strong></p>
|
||
<ul>
|
||
<li>Данные учётной записи хранятся до момента её удаления Пользователем</li>
|
||
<li>Данные об активности в марафонах хранятся бессрочно для ведения статистики</li>
|
||
<li>Технические логи хранятся в течение 12 месяцев</li>
|
||
</ul>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>5. Передача данных третьим лицам</h2>
|
||
|
||
<p>5.1. Мы не продаём, не сдаём в аренду и не передаём Ваши персональные данные третьим лицам в коммерческих целях.</p>
|
||
|
||
<p>5.2. <strong class="text-white">Данные могут быть переданы:</strong></p>
|
||
<ul>
|
||
<li>Telegram — для обеспечения работы уведомлений (только Telegram ID)</li>
|
||
<li>Правоохранительным органам — по законному запросу в соответствии с применимым законодательством</li>
|
||
</ul>
|
||
|
||
<p>5.3. <strong class="text-white">Публично доступная информация:</strong></p>
|
||
<p>Следующие данные видны другим Пользователям Сервиса:</p>
|
||
<ul>
|
||
<li>Никнейм</li>
|
||
<li>Аватар</li>
|
||
<li>Статистика участия в марафонах</li>
|
||
<li>Позиция в рейтингах</li>
|
||
</ul>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>6. Права Пользователя</h2>
|
||
|
||
<p>6.1. Вы имеете право:</p>
|
||
<ul>
|
||
<li><strong>Получить доступ</strong> к своим персональным данным</li>
|
||
<li><strong>Исправить</strong> неточные или неполные данные в настройках профиля</li>
|
||
<li><strong>Удалить</strong> свою учётную запись и связанные данные</li>
|
||
<li><strong>Отозвать согласие</strong> на обработку данных (путём удаления аккаунта)</li>
|
||
<li><strong>Отключить</strong> интеграцию с Telegram в любой момент</li>
|
||
</ul>
|
||
|
||
<p>6.2. Для реализации своих прав обратитесь к Администрации через доступные каналы связи.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>7. Файлы cookie и локальное хранилище</h2>
|
||
|
||
<p>7.1. Сервис использует локальное хранилище браузера (localStorage, sessionStorage) для:</p>
|
||
<ul>
|
||
<li>Хранения токена авторизации</li>
|
||
<li>Сохранения пользовательских настроек интерфейса</li>
|
||
<li>Запоминания закрытых информационных баннеров</li>
|
||
</ul>
|
||
|
||
<p>7.2. Вы можете очистить локальное хранилище в настройках браузера, однако это приведёт к выходу из учётной записи.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>8. Обработка данных несовершеннолетних</h2>
|
||
|
||
<p>8.1. Сервис не предназначен для лиц младше 14 лет. Мы сознательно не собираем персональные данные детей.</p>
|
||
|
||
<p>8.2. Если Вам стало известно, что ребёнок предоставил нам персональные данные, пожалуйста, свяжитесь с Администрацией для их удаления.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>9. Изменение Политики</h2>
|
||
|
||
<p>9.1. Мы оставляем за собой право изменять настоящую Политику. Актуальная редакция всегда доступна на данной странице.</p>
|
||
|
||
<p>9.2. О существенных изменениях мы уведомим Пользователей через Telegram-бота или баннер на сайте.</p>
|
||
|
||
<p>9.3. Продолжение использования Сервиса после внесения изменений означает согласие с обновлённой Политикой.</p>
|
||
|
||
<hr class="my-8 border-dark-600" />
|
||
|
||
<h2>10. Контактная информация</h2>
|
||
|
||
<p>10.1. По вопросам, связанным с обработкой персональных данных, Вы можете обратиться к Администрации через:</p>
|
||
<ul>
|
||
<li>Telegram-бота Сервиса</li>
|
||
<li>Форму обратной связи (при наличии)</li>
|
||
</ul>
|
||
|
||
<p>10.2. Мы обязуемся рассмотреть Ваше обращение в разумные сроки и предоставить ответ.</p>'''
|
||
},
|
||
{
|
||
'key': 'telegram_bot_info',
|
||
'title': 'Привяжите Telegram-бота',
|
||
'content': 'Получайте уведомления о событиях марафона, новых заданиях и результатах прямо в Telegram'
|
||
},
|
||
{
|
||
'key': 'announcement',
|
||
'title': 'Добро пожаловать!',
|
||
'content': 'Мы рады приветствовать вас в «Игровом Марафоне»! Создайте свой первый марафон или присоединитесь к существующему по коду приглашения.'
|
||
}
|
||
]
|
||
|
||
|
||
def upgrade() -> None:
|
||
for item in STATIC_CONTENT_DATA:
|
||
# Use ON CONFLICT to avoid duplicates
|
||
op.execute(f"""
|
||
INSERT INTO static_content (key, title, content, created_at, updated_at)
|
||
VALUES ('{item['key']}', '{item['title'].replace("'", "''")}', '{item['content'].replace("'", "''")}', NOW(), NOW())
|
||
ON CONFLICT (key) DO NOTHING
|
||
""")
|
||
|
||
|
||
def downgrade() -> None:
|
||
keys = [f"'{item['key']}'" for item in STATIC_CONTENT_DATA]
|
||
op.execute(f"DELETE FROM static_content WHERE key IN ({', '.join(keys)})")
|