diff --git a/worblehat/__init__.py b/worblehat/__init__.py index 53ece25..656c36b 100644 --- a/worblehat/__init__.py +++ b/worblehat/__init__.py @@ -6,7 +6,7 @@ from flask_admin.contrib.sqla import ModelView from os import environ, path from dotenv import load_dotenv -from worblehat.database import db_session, init_db +from worblehat.database import db_session, init_db, drop_db def create_app(): app = Flask(__name__, instance_relative_config=True) @@ -27,6 +27,54 @@ def configure_database(app): init_db() print("Initialized the database.") + @app.cli.command("resetdb") + def resetdb_command(): + drop_db() + print("Cleared the database.") + init_db() + from worblehat.models.MediaType import MediaType + from worblehat.models.Bookcase import Bookcase + from worblehat.models.Location import Location + from worblehat.models.Language import Language + + media_types = [ + MediaType(name='Book', description='A physical book'), + MediaType(name='Comic', description='A comic book'), + MediaType(name='Video Game', description='A digital game for computers or games consoles'), + MediaType(name='Tabletop Game', description='A physical game with cards, boards or similar') + ] + + bookcases = [ + Bookcase(name='A', description='The first bookcase'), + Bookcase(name='B', description='The second bookcase'), + ] + + locations = [ + Location(name='1-1', description='The first location', bookcase=bookcases[0]), + Location(name='1-2', description='The second location', bookcase=bookcases[0]), + Location(name='1-1', description='The first location', bookcase=bookcases[1]), + Location(name='1-2', description='The second location', bookcase=bookcases[1]), + ] + + languages = [ + Language(name='English', shortname='en'), + Language(name='Norwegian', shortname='no'), + Language(name='Japanese', shortname='ja'), + Language(name='Swedish', shortname='sv'), + Language(name='German', shortname='de'), + Language(name='Russian', shortname='ru'), + Language(name='Danish', shortname='da') + ] + + db_session.add_all(media_types) + db_session.add_all(bookcases) + db_session.add_all(locations) + db_session.add_all(languages) + db_session.commit() + print("Added media types, bookcases and locations.") + + + @app.teardown_appcontext def shutdown_session(exception=None): db_session.remove() @@ -37,8 +85,12 @@ def configure_admin(app): from worblehat.models.Category import Category from worblehat.models.Item import Item from worblehat.models.MediaType import MediaType + from worblehat.models.Location import Location + from worblehat.models.Bookcase import Bookcase admin.add_view(ModelView(Category, db_session)) admin.add_view(ModelView(Item, db_session)) admin.add_view(ModelView(MediaType, db_session)) + admin.add_view(ModelView(Location, db_session)) + admin.add_view(ModelView(Bookcase, db_session)) diff --git a/worblehat/database.py b/worblehat/database.py index bf9827e..28077ad 100644 --- a/worblehat/database.py +++ b/worblehat/database.py @@ -18,5 +18,12 @@ def init_db(): from .models.Category import Category from .models.Item import Item from .models.MediaType import MediaType + from .models.Location import Location + from .models.Bookcase import Bookcase + from .models.Language import Language Base.metadata.create_all(bind=engine) + + +def drop_db(): + Base.metadata.drop_all(bind=engine) diff --git a/worblehat/models/Bookcase.py b/worblehat/models/Bookcase.py new file mode 100644 index 0000000..2a04509 --- /dev/null +++ b/worblehat/models/Bookcase.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean +from sqlalchemy.orm import relationship +from worblehat.database import Base + + +class Bookcase(Base): + __tablename__ = 'bookcases' + id = Column(Integer, primary_key=True) + name = Column(String(10), nullable=False) + description = Column(String(255)) + + locations = relationship('Location', back_populates='bookcase') + + def __repr__(self): + return '' % self.name + diff --git a/worblehat/models/Category.py b/worblehat/models/Category.py index 72d7b93..fefb62a 100644 --- a/worblehat/models/Category.py +++ b/worblehat/models/Category.py @@ -1,12 +1,18 @@ -from sqlalchemy import Column, Integer, String, ForeignKey, Boolean +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Table from sqlalchemy.orm import relationship from worblehat.database import Base +category_association = Table('category_association', Base.metadata, + Column('category_id', Integer, ForeignKey('categories.id')), + Column('item_id', Integer, ForeignKey('items.id')) +) + class Category(Base): __tablename__ = 'categories' id = Column(Integer, primary_key=True) name = Column(String(80), unique=True) description = Column(String(255)) + items = relationship('Item', secondary=category_association, back_populates='categories') def __repr__(self): return '' % self.name diff --git a/worblehat/models/Item.py b/worblehat/models/Item.py index fe1bc2d..9185acb 100644 --- a/worblehat/models/Item.py +++ b/worblehat/models/Item.py @@ -1,6 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey, Boolean from sqlalchemy.orm import relationship from worblehat.database import Base +from .Language import Language class Item(Base): __tablename__ = 'items' @@ -13,6 +14,14 @@ class Item(Base): media_id = Column(Integer, ForeignKey('media_types.id'), nullable=False) media = relationship('MediaType', back_populates='items') + location_id = Column(Integer, ForeignKey('locations.id'), nullable=False) + location = relationship('Location', back_populates='items') + + language_id = Column(Integer, ForeignKey('languages.id'), nullable=False) + language = relationship('Language', back_populates='items') + + categories = relationship('Category', secondary='category_association', back_populates='items') + def __repr__(self): return '' % (self.media.name, self.title) diff --git a/worblehat/models/Language.py b/worblehat/models/Language.py new file mode 100644 index 0000000..05d53bf --- /dev/null +++ b/worblehat/models/Language.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean +from sqlalchemy.orm import relationship +from worblehat.database import Base + +class Language(Base): + __tablename__ = 'languages' + id = Column(Integer, primary_key=True) + + name = Column(String(32), nullable=False) + shortname = Column(String(2), nullable=False) + flag = Column(String(2)) + + items = relationship('Item', back_populates='language') + + def __repr__(self): + return '' % self.name diff --git a/worblehat/models/Location.py b/worblehat/models/Location.py new file mode 100644 index 0000000..a923785 --- /dev/null +++ b/worblehat/models/Location.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, String, ForeignKey, Boolean +from sqlalchemy.orm import relationship +from worblehat.database import Base + + +class Location(Base): + __tablename__ = 'locations' + id = Column(Integer, primary_key=True) + name = Column(String(100), nullable=False) + description = Column(String(255)) + + bookcase_id = Column(Integer, ForeignKey('bookcases.id'), nullable=False) + bookcase = relationship('Bookcase', back_populates='locations') + + items = relationship('Item', back_populates='location') + + def __repr__(self): + return '' % (self.bookcase.name, self.name) +