создал миграции, исправил связи

This commit is contained in:
Archibald 2025-04-13 13:18:36 +05:00
parent 9b5b9516cc
commit c0f0293ce7
9 changed files with 218 additions and 6 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@ API/.idea
API/.venv/
API/.idea/
API/.env

View File

@ -0,0 +1,169 @@
"""0001_инициализация
Revision ID: d53be3a35511
Revises:
Create Date: 2025-04-13 13:16:29.461322
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
# revision identifiers, used by Alembic.
revision: str = 'd53be3a35511'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('contest_statuses',
sa.Column('title', sa.VARCHAR(length=150), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('title')
)
op.create_table('projects',
sa.Column('description', sa.VARCHAR(length=150), nullable=True),
sa.Column('repository_url', sa.String(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_table('roles',
sa.Column('title', mysql.VARCHAR(length=150), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('title')
)
op.create_table('teams',
sa.Column('title', sa.VARCHAR(length=150), nullable=False),
sa.Column('description', sa.VARCHAR(length=150), nullable=True),
sa.Column('logo', sa.String(), nullable=True),
sa.Column('git_url', sa.String(), nullable=True),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.create_table('contests',
sa.Column('title', sa.VARCHAR(length=150), nullable=False),
sa.Column('description', sa.String(), nullable=True),
sa.Column('web_url', sa.String(), nullable=False),
sa.Column('photo', sa.String(), nullable=True),
sa.Column('results', sa.String(), nullable=True),
sa.Column('is_win', sa.Boolean(), nullable=True),
sa.Column('project_id', sa.Integer(), nullable=False),
sa.Column('status_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
sa.ForeignKeyConstraint(['status_id'], ['contest_statuses.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('title')
)
op.create_table('profiles',
sa.Column('first_name', sa.VARCHAR(length=150), nullable=False),
sa.Column('last_name', sa.VARCHAR(length=150), nullable=False),
sa.Column('patronymic', sa.VARCHAR(length=150), nullable=True),
sa.Column('birthday', sa.Date(), nullable=False),
sa.Column('email', sa.VARCHAR(length=150), nullable=True),
sa.Column('phone', sa.VARCHAR(length=28), nullable=True),
sa.Column('role_id', sa.Integer(), nullable=False),
sa.Column('team_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['role_id'], ['roles.id'], ),
sa.ForeignKeyConstraint(['team_id'], ['teams.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('project_files',
sa.Column('file_path', sa.String(), nullable=False),
sa.Column('project_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('file_path')
)
op.create_table('contest_carousel_photos',
sa.Column('file_path', sa.String(), nullable=False),
sa.Column('number', sa.Integer(), nullable=False),
sa.Column('contest_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['contest_id'], ['contests.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('contest_files',
sa.Column('file_path', sa.String(), nullable=False),
sa.Column('contest_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['contest_id'], ['contests.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('profile_photos',
sa.Column('file_path', sa.String(), nullable=False),
sa.Column('profile_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['profile_id'], ['profiles.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('project_members',
sa.Column('description', sa.String(), nullable=True),
sa.Column('project_id', sa.Integer(), nullable=False),
sa.Column('profile_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['profile_id'], ['profiles.id'], ),
sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_table('users',
sa.Column('login', sa.VARCHAR(length=150), nullable=False),
sa.Column('password', sa.VARCHAR(length=150), nullable=False),
sa.Column('profile_id', sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['profile_id'], ['profiles.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('login')
)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('users')
op.drop_table('project_members')
op.drop_table('profile_photos')
op.drop_table('contest_files')
op.drop_table('contest_carousel_photos')
op.drop_table('project_files')
op.drop_table('profiles')
op.drop_table('contests')
op.drop_table('teams')
op.drop_table('roles')
op.drop_table('projects')
op.drop_table('contest_statuses')
# ### end Alembic commands ###

View File

@ -1,3 +1,16 @@
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Base = declarative_base()
from app.domain.models.contest_carousel_photos import ContestCarouselPhoto
from app.domain.models.contest_files import ContestFile
from app.domain.models.contests import Contest
from app.domain.models.contest_statuses import ContestStatus
from app.domain.models.projects import Project
from app.domain.models.project_files import ProjectFile
from app.domain.models.users import User
from app.domain.models.profiles import Profile
from app.domain.models.roles import Role
from app.domain.models.teams import Team
from app.domain.models.project_members import ProjectMember
from app.domain.models.profile_photos import ProfilePhoto

View File

@ -15,7 +15,7 @@ class Contest(AdvancedBaseModel):
is_win = Column(Boolean)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
status_id = Column(Integer, ForeignKey('contest_status.id'), nullable=False)
status_id = Column(Integer, ForeignKey('contest_statuses.id'), nullable=False)
project = relationship('Project', back_populates='contests')
status = relationship('ContestStatus', back_populates='contests')

View File

@ -0,0 +1,14 @@
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship
from app.domain.models.base import AdvancedBaseModel
class ProfilePhoto(AdvancedBaseModel):
__tablename__ = 'profile_photos'
file_path = Column(String, nullable=False)
profile_id = Column(Integer, ForeignKey('profiles.id'), nullable=False)
profile = relationship('Profile', back_populates='photos')

View File

@ -21,3 +21,5 @@ class Profile(AdvancedBaseModel):
team = relationship('Team', back_populates='profiles')
user = relationship('User', back_populates='profile')
profile_photo = relationship('ProfilePhoto', back_populates='profile')
projects = relationship('ProjectMember', back_populates='profile')

View File

@ -0,0 +1,16 @@
from sqlalchemy import Column, Integer, ForeignKey, String
from sqlalchemy.orm import relationship
from app.domain.models.base import AdvancedBaseModel
class ProjectMember(AdvancedBaseModel):
__tablename__ = 'project_members'
description = Column(String)
project_id = Column(Integer, ForeignKey('projects.id'), nullable=False)
profile_id = Column(Integer, ForeignKey('profiles.id'), nullable=False)
project = relationship('Project', back_populates='members')
profile = relationship('Profile', back_populates='projects')

View File

@ -12,3 +12,4 @@ class Project(AdvancedBaseModel):
contest = relationship("Contest", back_populates="project")
files = relationship("ProjectFile", back_populates="project")
members = relationship("ProjectMember", back_populates="project")

View File

@ -3,11 +3,7 @@ from pydantic_settings import BaseSettings
class Settings(BaseSettings):
DATABASE_URL: str
LOG_LEVEL: str
LOG_FILE: str
SECRET_KEY: str
ALGORITHM: str
APP_PREFIX: str
class Config:
env_file = '.env'