Bladeren bron

add some db models

tomoya 2 jaren geleden
bovenliggende
commit
df947ef8c4

+ 68 - 0
backend/app/alembic/versions/208dd144a013_add_membership_progress_and_modify_user_.py

@@ -0,0 +1,68 @@
+"""add membership, progress and modify user and add video
+
+Revision ID: 208dd144a013
+Revises: d4867f3a4c0a
+Create Date: 2023-02-19 17:25:35.565786
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '208dd144a013'
+down_revision = 'd4867f3a4c0a'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.create_table('membership',
+    sa.Column('status', sa.String(length=20), nullable=False),
+    sa.PrimaryKeyConstraint('status')
+    )
+    op.create_table('progress',
+    sa.Column('state', sa.String(length=20), nullable=False),
+    sa.PrimaryKeyConstraint('state')
+    )
+    op.create_table('video',
+    sa.Column('id', sa.Integer(), nullable=False),
+    sa.Column('title', sa.String(), nullable=True),
+    sa.Column('progress_state', sa.String(length=20), nullable=True),
+    sa.Column('owner_id', sa.Integer(), nullable=True),
+    sa.ForeignKeyConstraint(['owner_id'], ['user.id'], ),
+    sa.ForeignKeyConstraint(['progress_state'], ['progress.state'], onupdate='CASCADE', ondelete='RESTRICT'),
+    sa.PrimaryKeyConstraint('id')
+    )
+    op.create_index(op.f('ix_video_id'), 'video', ['id'], unique=False)
+    op.create_index(op.f('ix_video_title'), 'video', ['title'], unique=False)
+    op.add_column('user', sa.Column('membership_status', sa.String(length=20), nullable=True))
+    op.add_column('user', sa.Column('available_time', sa.Integer(), nullable=True))
+    op.alter_column('user', 'email',
+               existing_type=sa.VARCHAR(),
+               nullable=False)
+    op.alter_column('user', 'hashed_password',
+               existing_type=sa.VARCHAR(),
+               nullable=False)
+    op.create_foreign_key(None, 'user', 'membership', ['membership_status'], ['status'], onupdate='CASCADE', ondelete='RESTRICT')
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_constraint(None, 'user', type_='foreignkey')
+    op.alter_column('user', 'hashed_password',
+               existing_type=sa.VARCHAR(),
+               nullable=True)
+    op.alter_column('user', 'email',
+               existing_type=sa.VARCHAR(),
+               nullable=True)
+    op.drop_column('user', 'available_time')
+    op.drop_column('user', 'membership_status')
+    op.drop_index(op.f('ix_video_title'), table_name='video')
+    op.drop_index(op.f('ix_video_id'), table_name='video')
+    op.drop_table('video')
+    op.drop_table('progress')
+    op.drop_table('membership')
+    # ### end Alembic commands ###

+ 52 - 0
backend/app/alembic/versions/ad8a076d04a6_add_membership_progress_and_modify_user_.py

@@ -0,0 +1,52 @@
+"""add membership, progress and modify user and add video
+
+Revision ID: ad8a076d04a6
+Revises: 208dd144a013
+Create Date: 2023-02-19 18:29:18.179836
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'ad8a076d04a6'
+down_revision = '208dd144a013'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('user', 'membership_status',
+               existing_type=sa.VARCHAR(length=20),
+               type_=sa.String(length=10),
+               existing_nullable=True)
+    op.add_column('video', sa.Column('stored_file_name', sa.String(), nullable=False))
+    op.alter_column('video', 'title',
+               existing_type=sa.VARCHAR(),
+               nullable=False)
+    op.alter_column('video', 'progress_state',
+               existing_type=sa.VARCHAR(length=20),
+               type_=sa.String(length=10),
+               existing_nullable=True)
+    op.create_unique_constraint(None, 'video', ['stored_file_name'])
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_constraint(None, 'video', type_='unique')
+    op.alter_column('video', 'progress_state',
+               existing_type=sa.String(length=10),
+               type_=sa.VARCHAR(length=20),
+               existing_nullable=True)
+    op.alter_column('video', 'title',
+               existing_type=sa.VARCHAR(),
+               nullable=True)
+    op.drop_column('video', 'stored_file_name')
+    op.alter_column('user', 'membership_status',
+               existing_type=sa.String(length=10),
+               type_=sa.VARCHAR(length=20),
+               existing_nullable=True)
+    # ### end Alembic commands ###

+ 4 - 0
backend/app/app/api/api_v1/endpoints/users.py

@@ -110,6 +110,10 @@ def create_user_open(
         )
     user_in = schemas.UserCreate(password=password, email=email, full_name=full_name)
     user = crud.user.create(db, obj_in=user_in)
+    if settings.EMAILS_ENABLED and user_in.email:
+        send_new_account_email(
+            email_to=user_in.email, username=user_in.email, password=user_in.password
+        )
     return user
 
 

+ 21 - 3
backend/app/app/api/api_v1/endpoints/videos.py

@@ -11,7 +11,7 @@ from app.api import deps
 router = APIRouter()
 
 @router.get("/", response_model=List[schemas.Video])
-def read_items(
+def get_video_list(
     db: Session = Depends(deps.get_db),
     skip: int = 0,
     limit: int = 100,
@@ -29,7 +29,7 @@ def read_items(
     return items
 
 @router.post("/", response_model=schemas.Item)
-def create_item(
+def upload_plot(
     *,
     db: Session = Depends(deps.get_db),
     video_upload: schemas.VideoUpload,
@@ -42,4 +42,22 @@ def create_item(
     video_create.title = video_upload.title
     video_create.progress = models.Progress.WAITING
     video = crud.item.create_with_owner(db=db, obj_in=video_create, owner_id=current_user.id)
-    return video
+    return video
+
+@router.get("/{id}")
+def download_video(
+
+) -> Any:
+    pass
+
+@router.get("/worker/{id}")
+def download_plot(
+
+) -> Any:
+    pass
+
+@router.get("/worker")
+def upload_complete_video(
+
+) -> Any:
+    pass

+ 3 - 0
backend/app/app/core/config.py

@@ -82,6 +82,9 @@ class Settings(BaseSettings):
     FIRST_SUPERUSER_PASSWORD: str
     USERS_OPEN_REGISTRATION: bool = False
 
+    MEMBERSHIP_TYPES: List[str]
+    PROGRESS_TYPES: List[str]
+
     class Config:
         case_sensitive = True
 

+ 1 - 2
backend/app/app/db/base.py

@@ -3,6 +3,5 @@
 from app.db.base_class import Base  # noqa
 from app.models.item import Item  # noqa
 from app.models.user import User  # noqa
-from app.models.user import Membership
 from app.models.video import Video
-from app.models.video import Progress
+from app.models.enum import Progress, Membership

+ 12 - 2
backend/app/app/db/init_db.py

@@ -3,7 +3,7 @@ from sqlalchemy.orm import Session
 from app import crud, schemas
 from app.core.config import settings
 from app.db import base  # noqa: F401
-
+from app.models.enum import Membership, Progress
 # make sure all SQL Alchemy models are imported (app.db.base) before initializing DB
 # otherwise, SQL Alchemy might fail to initialize relationships properly
 # for more details: https://github.com/tiangolo/full-stack-fastapi-postgresql/issues/28
@@ -23,5 +23,15 @@ def init_db(db: Session) -> None:
             is_superuser=True,
         )
         user = crud.user.create(db, obj_in=user_in)  # noqa: F841
+    
+    if settings.MEMBERSHIP_TYPES:
+        for TYPE in settings.MEMBERSHIP_TYPES:
+            if not db.query(Membership).filter(Membership.status == TYPE).first():
+                  db.add(Membership(status=TYPE))
+        db.commit()
 
-    
+    if settings.PROGRESS_TYPES:
+        for TYPE in settings.PROGRESS_TYPES:
+            if not db.query(Progress).filter(Progress.state == TYPE).first():
+                db.add(Progress(state=TYPE))
+        db.commit()

+ 1 - 2
backend/app/app/models/__init__.py

@@ -1,5 +1,4 @@
 from .item import Item
 from .user import User
-from .user import Membership
 from .video import Video
-from .video import Progress
+from .enum import Membership, Progress

+ 2 - 2
backend/app/app/models/enum.py

@@ -6,7 +6,7 @@ from sqlalchemy.orm import relationship
 from app.db.base_class import Base
 
 class Membership(Base):
-  status = Column(String(20), primary_key=True)
+  status = Column(String(10), primary_key=True)
 
 class Progress(Base):
-  state = Column(String(20), primary_key=True)
+  state = Column(String(10), primary_key=True)

+ 4 - 4
backend/app/app/models/user.py

@@ -14,10 +14,10 @@ class User(Base):
   full_name = Column(String, index=True)
   email = Column(String, unique=True, index=True, nullable=False)
   hashed_password = Column(String, nullable=False)
-  membership = Column(String(20), 
-                      ForeignKey("membership.status", onupdate="CASCASE", ondelete="RESTRICT"), 
-                      nullable=False)
-  time = Column(Integer, default=60, nullable=False)
+  membership_status = Column(String(10), 
+                      ForeignKey("membership.status", onupdate="CASCADE", ondelete="RESTRICT"), 
+                      default="normal")
+  available_time = Column(Integer, default=0)
   is_active = Column(Boolean(), default=True)
   is_superuser = Column(Boolean(), default=False)
   items = relationship("Item", back_populates="owner")

+ 5 - 5
backend/app/app/models/video.py

@@ -12,10 +12,10 @@ if TYPE_CHECKING:
 
 class Video(Base):
   id = Column(Integer, primary_key=True, index=True)
-  title = Column(String, index=True)
-  progress = Column(String(20), 
-                    ForeignKey("progress.state", ondelete="STRICT", onupdate="STRICT"),
-                    defalt="waiting",
-                    nullable=False)
+  title = Column(String, index=True, nullable=False)
+  stored_file_name = Column(String, unique=True, nullable=False)
+  progress_state = Column(String(10), 
+                    ForeignKey("progress.state", ondelete="RESTRICT", onupdate="CASCADE"),
+                    default="waiting")
   owner_id = Column(Integer, ForeignKey("user.id"))
   owner = relationship("User", back_populates="videos")