From 4587a49311e099702ebf43170e1b9f8b8bb00111 Mon Sep 17 00:00:00 2001 From: stijndcl Date: Thu, 30 Jun 2022 19:42:48 +0200 Subject: [PATCH] Create database models --- .../5f3a11a80e69_initial_currency_models.py | 51 +++++++++++++++++ database/models.py | 56 ++++++++++++++++++- 2 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 alembic/versions/5f3a11a80e69_initial_currency_models.py diff --git a/alembic/versions/5f3a11a80e69_initial_currency_models.py b/alembic/versions/5f3a11a80e69_initial_currency_models.py new file mode 100644 index 0000000..96981b9 --- /dev/null +++ b/alembic/versions/5f3a11a80e69_initial_currency_models.py @@ -0,0 +1,51 @@ +"""Initial currency models + +Revision ID: 5f3a11a80e69 +Revises: b2d511552a1f +Create Date: 2022-06-30 19:40:02.701336 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5f3a11a80e69' +down_revision = 'b2d511552a1f' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.Column('dinks', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('user_id') + ) + op.create_table('bank', + sa.Column('bank_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=True), + sa.Column('interest_level', sa.Integer(), nullable=False), + sa.Column('capacity_level', sa.Integer(), nullable=False), + sa.Column('rob_level', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.user_id'], ), + sa.PrimaryKeyConstraint('bank_id') + ) + op.create_table('nightly_data', + sa.Column('nightly_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=True), + sa.Column('last_nightly', sa.DateTime(timezone=True), nullable=True), + sa.Column('count', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.user_id'], ), + sa.PrimaryKeyConstraint('nightly_id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('nightly_data') + op.drop_table('bank') + op.drop_table('users') + # ### end Alembic commands ### diff --git a/database/models.py b/database/models.py index 1c28d37..02b16a5 100644 --- a/database/models.py +++ b/database/models.py @@ -1,13 +1,34 @@ from __future__ import annotations from datetime import datetime +from typing import Optional -from sqlalchemy import Column, Integer, Text, ForeignKey, Boolean, DateTime +from sqlalchemy import BigInteger, Column, Integer, Text, ForeignKey, Boolean, DateTime from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() +class Bank(Base): + """A user's currency information""" + + __tablename__ = "bank" + + bank_id: int = Column(Integer, primary_key=True) + user_id: int = Column(BigInteger, ForeignKey("users.user_id")) + + # Interest rate + interest_level: int = Column(Integer, default=1, nullable=False) + + # Maximum amount that can be stored in the bank + capacity_level: int = Column(Integer, default=1, nullable=False) + + # Maximum amount that can be robbed + rob_level: int = Column(Integer, default=1, nullable=False) + + user: User = relationship("User", uselist=False, back_populates="bank", lazy="selectin") + + class CustomCommand(Base): """Custom commands to fill the hole Dyno couldn't""" @@ -36,6 +57,19 @@ class CustomCommandAlias(Base): command: CustomCommand = relationship("CustomCommand", back_populates="aliases", uselist=False, lazy="selectin") +class NightlyData(Base): + """Data for a user's Nightly stats""" + + __tablename__ = "nightly_data" + + nightly_id: int = Column(Integer, primary_key=True) + user_id: int = Column(BigInteger, ForeignKey("users.user_id")) + last_nightly: Optional[datetime] = Column(DateTime(timezone=True), nullable=True) + count: int = Column(Integer, default=0, nullable=False) + + user: User = relationship("User", back_populates="nightly_data", uselist=False, lazy="selectin") + + class UforaCourse(Base): """A course on Ufora""" @@ -72,8 +106,24 @@ class UforaAnnouncement(Base): __tablename__ = "ufora_announcements" - announcement_id = Column(Integer, primary_key=True) - course_id = Column(Integer, ForeignKey("ufora_courses.course_id")) + announcement_id: int = Column(Integer, primary_key=True) + course_id: int = Column(Integer, ForeignKey("ufora_courses.course_id")) publication_date: datetime = Column(DateTime(timezone=True)) course: UforaCourse = relationship("UforaCourse", back_populates="announcements", uselist=False, lazy="selectin") + + +class User(Base): + """A Didier user""" + + __tablename__ = "users" + + user_id: int = Column(BigInteger, primary_key=True) + dinks: int = Column(BigInteger, default=0, nullable=False) + + bank: Bank = relationship( + "Bank", back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan" + ) + nightly_data: NightlyData = relationship( + "NightlyData", back_populates="user", uselist=False, lazy="selectin", cascade="all, delete-orphan" + )