refactoring
parent
7d70c38fb8
commit
199eb0f3ae
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import uuid
|
import uuid
|
||||||
|
from datetime import datetime as dt
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
@ -9,12 +10,16 @@ if os.path.exists(dotenv_path):
|
||||||
|
|
||||||
|
|
||||||
with open(dotenv_path, "a") as f:
|
with open(dotenv_path, "a") as f:
|
||||||
|
if os.getenv("BRAND") is None:
|
||||||
|
br = input("Введите название блога: ")
|
||||||
|
f.writelines(f"BRAND={br}\n")
|
||||||
|
|
||||||
print("Генерирую SECRET_KEY...")
|
print("Генерирую SECRET_KEY...")
|
||||||
if os.getenv("SECRET_KEY") is None:
|
if os.getenv("SECRET_KEY") is None:
|
||||||
f.writelines(f"SECRET_KEY={uuid.uuid4().hex}\n")
|
f.writelines(f"SECRET_KEY={uuid.uuid4().hex}\n")
|
||||||
print("_Ok_")
|
print("_Ok_")
|
||||||
else:
|
else:
|
||||||
print("SECRET_KEY уже установлен, прорускаю")
|
print("SECRET_KEY уже установлен, пропускаю")
|
||||||
|
|
||||||
print('Генерирую "Соль"...')
|
print('Генерирую "Соль"...')
|
||||||
if os.getenv("SECURITY_PASSWORD_SALT") is None:
|
if os.getenv("SECURITY_PASSWORD_SALT") is None:
|
||||||
|
@ -27,9 +32,32 @@ with open(dotenv_path, "a") as f:
|
||||||
print("Настроки подключения к базе данных Posgresql:")
|
print("Настроки подключения к базе данных Posgresql:")
|
||||||
login = input("Введите логин пользователя бд: ")
|
login = input("Введите логин пользователя бд: ")
|
||||||
passwd = input("Пароль: ")
|
passwd = input("Пароль: ")
|
||||||
db = input("Название бд (по умолчанию pyproger):") or "pyproger"
|
db = input("Название бд (по умолчанию pyprogerdb):") or "pyprogerdb"
|
||||||
ip = input("Адрес бд (по умолчанию localhost)") or "localhost"
|
ip = input("Адрес бд (по умолчанию localhost)") or "localhost"
|
||||||
port = input("Порт подключения: (по умолчанию 5432)") or "5432"
|
port = input("Порт подключения: (по умолчанию 5432)") or "5432"
|
||||||
f.writelines(
|
f.writelines(
|
||||||
f"SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://{login}:{passwd}@{ip}:{port}/{db}"
|
f"SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://{login}:{passwd}@{ip}:{port}/{db}\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if os.getenv("COPYRIGHT_YEAR") is None:
|
||||||
|
start_date = dt.utcnow().strftime("%Y")
|
||||||
|
f.writelines(f"COPYRIGHT_YEAR={start_date}\n")
|
||||||
|
|
||||||
|
if os.getenv("COPYRIGHT_NAME") is None:
|
||||||
|
name = input("Введите имя для для футера:")
|
||||||
|
f.writelines(f"COPYRIGHT_NAME={name}\n")
|
||||||
|
|
||||||
|
if os.getenv("COPYRIGHT_LINK") is None:
|
||||||
|
print("Введите ссылку для футера:")
|
||||||
|
print(
|
||||||
|
"email('something@somthing.else) или веб адрес полностью('http://anysite.any')"
|
||||||
|
)
|
||||||
|
link = input(">:")
|
||||||
|
if link.startswith("http"):
|
||||||
|
f.writelines(f"COPYRIGHT_LINK={link}\n")
|
||||||
|
else:
|
||||||
|
f.writelines(f"COPYRIGHT_LINK=mailto:{link}\n")
|
||||||
|
|
||||||
|
if os.getenv("COPYRIGHT_CITY") is None:
|
||||||
|
name = input("Введите свой город для для футера:")
|
||||||
|
f.writelines(f"COPYRIGHT_CITY={name}\n")
|
||||||
|
|
|
@ -7,6 +7,7 @@ Create Date: ${create_date}
|
||||||
"""
|
"""
|
||||||
from alembic import op
|
from alembic import op
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
import flask_security
|
||||||
${imports if imports else ""}
|
${imports if imports else ""}
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
"""empty message
|
|
||||||
|
|
||||||
Revision ID: 5e6d181b4b74
|
|
||||||
Revises: e24055e16b26
|
|
||||||
Create Date: 2023-10-04 08:46:50.473590
|
|
||||||
|
|
||||||
"""
|
|
||||||
from alembic import op
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = '5e6d181b4b74'
|
|
||||||
down_revision = 'e24055e16b26'
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
with op.batch_alter_table('page', schema=None) as batch_op:
|
|
||||||
batch_op.add_column(sa.Column('update_datetime', sa.DateTime(), nullable=True))
|
|
||||||
batch_op.create_unique_constraint(None, ['id'])
|
|
||||||
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
with op.batch_alter_table('page', schema=None) as batch_op:
|
|
||||||
batch_op.drop_constraint(None, type_='unique')
|
|
||||||
batch_op.drop_column('update_datetime')
|
|
||||||
|
|
||||||
# ### end Alembic commands ###
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
"""initial_migration
|
||||||
|
|
||||||
|
Revision ID: 68537cc1688c
|
||||||
|
Revises:
|
||||||
|
Create Date: 2023-10-10 22:17:40.476992
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
import flask_security
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '68537cc1688c'
|
||||||
|
down_revision = None
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.create_table('footer_icons',
|
||||||
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('name', sa.String(length=30), nullable=True),
|
||||||
|
sa.Column('bootstrap_ico', sa.String(length=20), nullable=True),
|
||||||
|
sa.Column('link', sa.String(length=100), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('id')
|
||||||
|
)
|
||||||
|
op.create_table('page',
|
||||||
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('name', sa.String(length=20), nullable=True),
|
||||||
|
sa.Column('slug', sa.String(length=50), nullable=False),
|
||||||
|
sa.Column('text', sa.Text(), nullable=True),
|
||||||
|
sa.Column('update_datetime', sa.DateTime(), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('id')
|
||||||
|
)
|
||||||
|
op.create_table('role',
|
||||||
|
sa.Column('name', sa.String(length=80), nullable=False),
|
||||||
|
sa.Column('id', sa.Integer(), nullable=False),
|
||||||
|
sa.Column('description', sa.String(length=255), nullable=True),
|
||||||
|
sa.Column('permissions', flask_security.datastore.AsaList(), nullable=True),
|
||||||
|
sa.Column('update_datetime', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('name')
|
||||||
|
)
|
||||||
|
op.create_table('site_headers',
|
||||||
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('name', sa.String(length=20), nullable=True),
|
||||||
|
sa.Column('description', sa.Text(), nullable=True),
|
||||||
|
sa.Column('content', sa.Text(), nullable=True),
|
||||||
|
sa.Column('enabled', sa.Boolean(), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('id')
|
||||||
|
)
|
||||||
|
op.create_table('tag',
|
||||||
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('tag', sa.String(length=20), nullable=True),
|
||||||
|
sa.PrimaryKeyConstraint('id')
|
||||||
|
)
|
||||||
|
op.create_table('user',
|
||||||
|
sa.Column('first_name', sa.String(length=255), nullable=True),
|
||||||
|
sa.Column('last_name', sa.String(length=255), nullable=True),
|
||||||
|
sa.Column('id', sa.Integer(), nullable=False),
|
||||||
|
sa.Column('email', sa.String(length=255), nullable=False),
|
||||||
|
sa.Column('username', sa.String(length=255), nullable=True),
|
||||||
|
sa.Column('password', sa.String(length=255), nullable=False),
|
||||||
|
sa.Column('active', sa.Boolean(), nullable=False),
|
||||||
|
sa.Column('fs_uniquifier', sa.String(length=64), nullable=False),
|
||||||
|
sa.Column('confirmed_at', sa.DateTime(), nullable=True),
|
||||||
|
sa.Column('last_login_at', sa.DateTime(), nullable=True),
|
||||||
|
sa.Column('current_login_at', sa.DateTime(), nullable=True),
|
||||||
|
sa.Column('last_login_ip', sa.String(length=64), nullable=True),
|
||||||
|
sa.Column('current_login_ip', sa.String(length=64), nullable=True),
|
||||||
|
sa.Column('login_count', sa.Integer(), nullable=True),
|
||||||
|
sa.Column('tf_primary_method', sa.String(length=64), nullable=True),
|
||||||
|
sa.Column('tf_totp_secret', sa.String(length=255), nullable=True),
|
||||||
|
sa.Column('tf_phone_number', sa.String(length=128), nullable=True),
|
||||||
|
sa.Column('create_datetime', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||||
|
sa.Column('update_datetime', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('email'),
|
||||||
|
sa.UniqueConstraint('fs_uniquifier')
|
||||||
|
)
|
||||||
|
op.create_table('post',
|
||||||
|
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('author', sa.Integer(), nullable=True),
|
||||||
|
sa.Column('slug', sa.String(length=100), nullable=False),
|
||||||
|
sa.Column('title', sa.Text(), nullable=False),
|
||||||
|
sa.Column('description', sa.Text(), nullable=False),
|
||||||
|
sa.Column('published', sa.Boolean(), nullable=True),
|
||||||
|
sa.Column('create_datetime', sa.DateTime(), nullable=True),
|
||||||
|
sa.Column('update_datetime', sa.DateTime(), nullable=True),
|
||||||
|
sa.Column('text', sa.Text(), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['author'], ['user.id'], ),
|
||||||
|
sa.PrimaryKeyConstraint('id'),
|
||||||
|
sa.UniqueConstraint('id')
|
||||||
|
)
|
||||||
|
op.create_table('roles_users',
|
||||||
|
sa.Column('user_id', sa.Integer(), nullable=True),
|
||||||
|
sa.Column('role_id', sa.Integer(), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['role_id'], ['role.id'], ),
|
||||||
|
sa.ForeignKeyConstraint(['user_id'], ['user.id'], )
|
||||||
|
)
|
||||||
|
op.create_table('tag_post',
|
||||||
|
sa.Column('tag_id', sa.Integer(), nullable=True),
|
||||||
|
sa.Column('post_id', sa.Integer(), nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['post_id'], ['post.id'], ),
|
||||||
|
sa.ForeignKeyConstraint(['tag_id'], ['tag.id'], )
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table('tag_post')
|
||||||
|
op.drop_table('roles_users')
|
||||||
|
op.drop_table('post')
|
||||||
|
op.drop_table('user')
|
||||||
|
op.drop_table('tag')
|
||||||
|
op.drop_table('site_headers')
|
||||||
|
op.drop_table('role')
|
||||||
|
op.drop_table('page')
|
||||||
|
op.drop_table('footer_icons')
|
||||||
|
# ### end Alembic commands ###
|
|
@ -1,132 +0,0 @@
|
||||||
"""initial_migration
|
|
||||||
|
|
||||||
Revision ID: 8c415e462cb3
|
|
||||||
Revises:
|
|
||||||
Create Date: 2023-09-22 12:19:22.923813
|
|
||||||
|
|
||||||
"""
|
|
||||||
import flask_security
|
|
||||||
import sqlalchemy as sa
|
|
||||||
from alembic import op
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = "8c415e462cb3"
|
|
||||||
down_revision = None
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.create_table(
|
|
||||||
"role",
|
|
||||||
sa.Column("name", sa.String(length=80), nullable=False),
|
|
||||||
sa.Column("id", sa.Integer(), nullable=False),
|
|
||||||
sa.Column("description", sa.String(length=255), nullable=True),
|
|
||||||
sa.Column("permissions", flask_security.datastore.AsaList(), nullable=True),
|
|
||||||
sa.Column(
|
|
||||||
"update_datetime",
|
|
||||||
sa.DateTime(),
|
|
||||||
server_default=sa.text("now()"),
|
|
||||||
nullable=False,
|
|
||||||
),
|
|
||||||
sa.PrimaryKeyConstraint("id"),
|
|
||||||
sa.UniqueConstraint("name"),
|
|
||||||
)
|
|
||||||
op.create_table(
|
|
||||||
"tag",
|
|
||||||
sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
|
|
||||||
sa.Column("tag", sa.String(length=20), nullable=True),
|
|
||||||
sa.PrimaryKeyConstraint("id"),
|
|
||||||
)
|
|
||||||
op.create_table(
|
|
||||||
"user",
|
|
||||||
sa.Column("first_name", sa.String(length=255), nullable=True),
|
|
||||||
sa.Column("last_name", sa.String(length=255), nullable=True),
|
|
||||||
sa.Column("id", sa.Integer(), nullable=False),
|
|
||||||
sa.Column("email", sa.String(length=255), nullable=False),
|
|
||||||
sa.Column("username", sa.String(length=255), nullable=True),
|
|
||||||
sa.Column("password", sa.String(length=255), nullable=False),
|
|
||||||
sa.Column("active", sa.Boolean(), nullable=False),
|
|
||||||
sa.Column("fs_uniquifier", sa.String(length=64), nullable=False),
|
|
||||||
sa.Column("confirmed_at", sa.DateTime(), nullable=True),
|
|
||||||
sa.Column("last_login_at", sa.DateTime(), nullable=True),
|
|
||||||
sa.Column("current_login_at", sa.DateTime(), nullable=True),
|
|
||||||
sa.Column("last_login_ip", sa.String(length=64), nullable=True),
|
|
||||||
sa.Column("current_login_ip", sa.String(length=64), nullable=True),
|
|
||||||
sa.Column("login_count", sa.Integer(), nullable=True),
|
|
||||||
sa.Column("tf_primary_method", sa.String(length=64), nullable=True),
|
|
||||||
sa.Column("tf_totp_secret", sa.String(length=255), nullable=True),
|
|
||||||
sa.Column("tf_phone_number", sa.String(length=128), nullable=True),
|
|
||||||
sa.Column(
|
|
||||||
"create_datetime",
|
|
||||||
sa.DateTime(),
|
|
||||||
server_default=sa.text("now()"),
|
|
||||||
nullable=False,
|
|
||||||
),
|
|
||||||
sa.Column(
|
|
||||||
"update_datetime",
|
|
||||||
sa.DateTime(),
|
|
||||||
server_default=sa.text("now()"),
|
|
||||||
nullable=False,
|
|
||||||
),
|
|
||||||
sa.PrimaryKeyConstraint("id"),
|
|
||||||
sa.UniqueConstraint("email"),
|
|
||||||
sa.UniqueConstraint("fs_uniquifier"),
|
|
||||||
)
|
|
||||||
op.create_table(
|
|
||||||
"post",
|
|
||||||
sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
|
|
||||||
sa.Column("author", sa.Integer(), nullable=True),
|
|
||||||
sa.Column("slug", sa.String(length=100), nullable=False),
|
|
||||||
sa.Column("title", sa.Text(), nullable=False),
|
|
||||||
sa.Column("description", sa.Text(), nullable=False),
|
|
||||||
sa.Column("published", sa.Boolean(), nullable=True),
|
|
||||||
sa.Column("create_datetime", sa.DateTime(), nullable=True),
|
|
||||||
sa.Column("update_datetime", sa.DateTime(), nullable=True),
|
|
||||||
sa.Column("text", sa.Text(), nullable=True),
|
|
||||||
sa.ForeignKeyConstraint(
|
|
||||||
["author"],
|
|
||||||
["user.id"],
|
|
||||||
),
|
|
||||||
sa.PrimaryKeyConstraint("id"),
|
|
||||||
sa.UniqueConstraint("id"),
|
|
||||||
)
|
|
||||||
op.create_table(
|
|
||||||
"roles_users",
|
|
||||||
sa.Column("user_id", sa.Integer(), nullable=True),
|
|
||||||
sa.Column("role_id", sa.Integer(), nullable=True),
|
|
||||||
sa.ForeignKeyConstraint(
|
|
||||||
["role_id"],
|
|
||||||
["role.id"],
|
|
||||||
),
|
|
||||||
sa.ForeignKeyConstraint(
|
|
||||||
["user_id"],
|
|
||||||
["user.id"],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
op.create_table(
|
|
||||||
"tag_post",
|
|
||||||
sa.Column("tag_id", sa.Integer(), nullable=True),
|
|
||||||
sa.Column("post_id", sa.Integer(), nullable=True),
|
|
||||||
sa.ForeignKeyConstraint(
|
|
||||||
["post_id"],
|
|
||||||
["post.id"],
|
|
||||||
),
|
|
||||||
sa.ForeignKeyConstraint(
|
|
||||||
["tag_id"],
|
|
||||||
["tag.id"],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.drop_table("tag_post")
|
|
||||||
op.drop_table("roles_users")
|
|
||||||
op.drop_table("post")
|
|
||||||
op.drop_table("user")
|
|
||||||
op.drop_table("tag")
|
|
||||||
op.drop_table("role")
|
|
||||||
# ### end Alembic commands ###
|
|
|
@ -1,42 +0,0 @@
|
||||||
"""empty message
|
|
||||||
|
|
||||||
Revision ID: e24055e16b26
|
|
||||||
Revises: 8c415e462cb3
|
|
||||||
Create Date: 2023-10-02 09:30:10.566908
|
|
||||||
|
|
||||||
"""
|
|
||||||
import flask_security
|
|
||||||
import sqlalchemy as sa
|
|
||||||
from alembic import op
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = "e24055e16b26"
|
|
||||||
down_revision = "8c415e462cb3"
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.create_table(
|
|
||||||
"page",
|
|
||||||
sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
|
|
||||||
sa.Column("name", sa.String(length=20), nullable=True),
|
|
||||||
sa.Column("slug", sa.String(length=50), nullable=False),
|
|
||||||
sa.Column("text", sa.Text(), nullable=True),
|
|
||||||
sa.PrimaryKeyConstraint("id"),
|
|
||||||
sa.UniqueConstraint("id"),
|
|
||||||
)
|
|
||||||
with op.batch_alter_table("post", schema=None) as batch_op:
|
|
||||||
batch_op.create_unique_constraint(None, ["id"])
|
|
||||||
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
with op.batch_alter_table("post", schema=None) as batch_op:
|
|
||||||
batch_op.drop_constraint(None, type_="unique")
|
|
||||||
|
|
||||||
op.drop_table("page")
|
|
||||||
# ### end Alembic commands ###
|
|
|
@ -1,36 +0,0 @@
|
||||||
"""empty message
|
|
||||||
|
|
||||||
Revision ID: ea0fde3014d7
|
|
||||||
Revises: 5e6d181b4b74
|
|
||||||
Create Date: 2023-10-07 14:32:08.410786
|
|
||||||
|
|
||||||
"""
|
|
||||||
from alembic import op
|
|
||||||
import sqlalchemy as sa
|
|
||||||
|
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
|
||||||
revision = 'ea0fde3014d7'
|
|
||||||
down_revision = '5e6d181b4b74'
|
|
||||||
branch_labels = None
|
|
||||||
depends_on = None
|
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.create_table('site_headers',
|
|
||||||
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
|
|
||||||
sa.Column('name', sa.String(length=20), nullable=True),
|
|
||||||
sa.Column('description', sa.Text(), nullable=True),
|
|
||||||
sa.Column('content', sa.Text(), nullable=True),
|
|
||||||
sa.Column('enabled', sa.Boolean(), nullable=True),
|
|
||||||
sa.PrimaryKeyConstraint('id'),
|
|
||||||
sa.UniqueConstraint('id')
|
|
||||||
)
|
|
||||||
# ### end Alembic commands ###
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
|
||||||
op.drop_table('site_headers')
|
|
||||||
# ### end Alembic commands ###
|
|
|
@ -112,3 +112,12 @@ class HeadersView(MyAdminView):
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FooterLinksView(MyAdminView):
|
||||||
|
column_labels = dict(
|
||||||
|
name="Название",
|
||||||
|
bootstrap_ico="Bootstrap код иконки",
|
||||||
|
link="Ссылка",
|
||||||
|
)
|
||||||
|
column_list = ("name",)
|
||||||
|
|
|
@ -7,9 +7,12 @@ from flask_ckeditor import CKEditor
|
||||||
from flask_migrate import Migrate
|
from flask_migrate import Migrate
|
||||||
from flask_security.core import Security
|
from flask_security.core import Security
|
||||||
|
|
||||||
|
from pyproger.admin.views import FooterLinksView
|
||||||
from pyproger.dbase import Role, User, db, user_datastore
|
from pyproger.dbase import Role, User, db, user_datastore
|
||||||
from pyproger.dbase.database import get_headers, get_menu_items
|
from pyproger.dbase.database import (get_footer_links, get_headers,
|
||||||
from pyproger.dbase.models import Page, Post, SiteHeaders, Tag
|
get_menu_items)
|
||||||
|
from pyproger.dbase.models import (FooterContactLinks, Page, Post, SiteHeaders,
|
||||||
|
Tag)
|
||||||
|
|
||||||
|
|
||||||
def create_app(test_config=None):
|
def create_app(test_config=None):
|
||||||
|
@ -23,6 +26,13 @@ def create_app(test_config=None):
|
||||||
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
|
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
|
||||||
app.config["SECURITY_PASSWORD_SALT"] = os.getenv("SECURITY_PASSWORD_SALT")
|
app.config["SECURITY_PASSWORD_SALT"] = os.getenv("SECURITY_PASSWORD_SALT")
|
||||||
app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("SQLALCHEMY_DATABASE_URI")
|
app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("SQLALCHEMY_DATABASE_URI")
|
||||||
|
app.config["MYCOPYRIGHT"] = {
|
||||||
|
"year": os.getenv("COPYRIGHT_YEAR"),
|
||||||
|
"name": os.getenv("COPYRIGHT_NAME"),
|
||||||
|
"link": os.getenv("COPYRIGHT_LINK"),
|
||||||
|
"city": os.getenv("COPYRIGHT_CITY"),
|
||||||
|
}
|
||||||
|
app.config["BRAND"] = os.getenv("BRAND")
|
||||||
else:
|
else:
|
||||||
app.config.from_mapping(test_config)
|
app.config.from_mapping(test_config)
|
||||||
|
|
||||||
|
@ -98,6 +108,14 @@ def create_app(test_config=None):
|
||||||
name="Включаемые в html заголовки",
|
name="Включаемые в html заголовки",
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
admin.add_view(
|
||||||
|
FooterLinksView(
|
||||||
|
FooterContactLinks,
|
||||||
|
db.session,
|
||||||
|
category="Страницы",
|
||||||
|
name="Иконки-ссылки футера",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
from pyproger.blog.blog import bp as bp_blog
|
from pyproger.blog.blog import bp as bp_blog
|
||||||
from pyproger.cli.commands import bp_cli
|
from pyproger.cli.commands import bp_cli
|
||||||
|
@ -110,11 +128,27 @@ def create_app(test_config=None):
|
||||||
app.register_blueprint(bp_robots)
|
app.register_blueprint(bp_robots)
|
||||||
|
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
site_headers = get_headers()
|
try:
|
||||||
|
site_headers = get_headers()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
site_headers = None
|
||||||
app.config["SITE_HEADERS"] = site_headers
|
app.config["SITE_HEADERS"] = site_headers
|
||||||
menu_items = get_menu_items()
|
|
||||||
|
try:
|
||||||
|
menu_items = get_menu_items()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
menu_items = None
|
||||||
app.config["MENU_ITEMS"] = menu_items
|
app.config["MENU_ITEMS"] = menu_items
|
||||||
|
|
||||||
|
try:
|
||||||
|
links = get_footer_links()
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
links = None
|
||||||
|
app.config["MYLINKS"] = links
|
||||||
|
|
||||||
@security.context_processor
|
@security.context_processor
|
||||||
def security_context_processor():
|
def security_context_processor():
|
||||||
return dict(
|
return dict(
|
||||||
|
|
|
@ -1,20 +1,7 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Настройки блога
|
# Настройки блога
|
||||||
BRAND = "блог"
|
MYLIPOSTS_ON_PAGE = 6
|
||||||
MYCOPYRIGHT = {
|
|
||||||
"year": "2023",
|
|
||||||
"name": "Иванов Иван",
|
|
||||||
"link": "http://yandex.ru",
|
|
||||||
"city": "г.Москва",
|
|
||||||
}
|
|
||||||
MYLINKS = (
|
|
||||||
{"icon": "fab fa-telegram", "link": "https://t.me"},
|
|
||||||
{"icon": "fab fa-vk", "link": "https://m.vk.com"},
|
|
||||||
{"icon": "fab fa-yandex", "link": "mailto:user@yandex.ru"},
|
|
||||||
{"icon": "fab fa-github", "link": "https://github.com"},
|
|
||||||
)
|
|
||||||
POSTS_ON_PAGE = 6
|
|
||||||
|
|
||||||
# Тема оформления админ панели
|
# Тема оформления админ панели
|
||||||
FLASK_ADMIN_SWATCH = "slate"
|
FLASK_ADMIN_SWATCH = "slate"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from . import db
|
from . import db
|
||||||
from .models import Page, Post, SiteHeaders, Tag, User
|
from .models import FooterContactLinks, Page, Post, SiteHeaders, Tag, User
|
||||||
|
|
||||||
|
|
||||||
def get_paginated_posts(page, per_page):
|
def get_paginated_posts(page, per_page):
|
||||||
|
@ -72,3 +72,11 @@ def get_headers():
|
||||||
.all()
|
.all()
|
||||||
)
|
)
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
|
|
||||||
|
def get_footer_links():
|
||||||
|
links = db.session.query(
|
||||||
|
FooterContactLinks.link,
|
||||||
|
FooterContactLinks.bootstrap_ico,
|
||||||
|
).all()
|
||||||
|
return links
|
||||||
|
|
|
@ -122,3 +122,17 @@ class SiteHeaders(db.Model):
|
||||||
description = Column(Text)
|
description = Column(Text)
|
||||||
content = Column(Text)
|
content = Column(Text)
|
||||||
enabled = Column(Boolean, default=False)
|
enabled = Column(Boolean, default=False)
|
||||||
|
|
||||||
|
|
||||||
|
class FooterContactLinks(db.Model):
|
||||||
|
__tablename__ = "footer_icons"
|
||||||
|
id = Column(
|
||||||
|
Integer,
|
||||||
|
primary_key=True,
|
||||||
|
nullable=False,
|
||||||
|
unique=True,
|
||||||
|
autoincrement=True,
|
||||||
|
)
|
||||||
|
name = Column(String(30))
|
||||||
|
bootstrap_ico = Column(String(20))
|
||||||
|
link = Column(String(100))
|
||||||
|
|
|
@ -71,7 +71,7 @@
|
||||||
<a class="btn btn-outline-light btn-floating m-2"
|
<a class="btn btn-outline-light btn-floating m-2"
|
||||||
href="{{ l.link }}"
|
href="{{ l.link }}"
|
||||||
role="button"
|
role="button"
|
||||||
><i class="{{ l.icon }}"></i
|
><i class="{{ l.bootstrap_ico }}"></i
|
||||||
></a>
|
></a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</section>
|
</section>
|
||||||
|
|
Loading…
Reference in New Issue