diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2020-06-01 16:22:18 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2020-06-01 16:22:18 +0200 |
| commit | 1a7370c19a7eed6a5f0f48e270092f9b3caebbc1 (patch) | |
| tree | ff1ac87d40bde43648e579e43543d3e1646d00d4 | |
| parent | 0890fdd951d021308550a0db2e7b6f2593512957 (diff) | |
models and controllers
| -rw-r--r-- | cli/app/controllers/collection_controller.py | 20 | ||||
| -rw-r--r-- | cli/app/controllers/graph_controller.py | 18 | ||||
| -rw-r--r-- | cli/app/controllers/page_controller.py | 15 | ||||
| -rw-r--r-- | cli/app/controllers/tile_controller.py | 11 | ||||
| -rw-r--r-- | cli/app/sql/models/collection.py | 58 | ||||
| -rw-r--r-- | cli/app/sql/models/graph.py | 35 | ||||
| -rw-r--r-- | cli/app/sql/models/media.py | 70 | ||||
| -rw-r--r-- | cli/app/sql/models/page.py | 34 | ||||
| -rw-r--r-- | cli/app/sql/models/tile.py | 35 |
9 files changed, 148 insertions, 148 deletions
diff --git a/cli/app/controllers/collection_controller.py b/cli/app/controllers/collection_controller.py deleted file mode 100644 index 7206bd8..0000000 --- a/cli/app/controllers/collection_controller.py +++ /dev/null @@ -1,20 +0,0 @@ -from flask import request, jsonify, redirect -from flask_classful import route -from werkzeug.datastructures import MultiDict - -from app.sql.common import db, Session -from app.sql.models.collection import Collection, CollectionForm, getMediaCounts -from app.controllers.crud_controller import CrudView - -from app.data.export import export_zip - -class CollectionView(CrudView): - model = Collection - form = CollectionForm - - def on_index(self, session, data): - data['counts'] = getMediaCounts(session) - return data - - def on_destroy(self, session, item): - session.query(CollectionMedia).filter(CollectionMedia.collection_id == item.id).delete(synchronize_session=False) diff --git a/cli/app/controllers/graph_controller.py b/cli/app/controllers/graph_controller.py new file mode 100644 index 0000000..25b49aa --- /dev/null +++ b/cli/app/controllers/graph_controller.py @@ -0,0 +1,18 @@ +from flask import request, jsonify, redirect +from flask_classful import route +from werkzeug.datastructures import MultiDict + +from app.sql.common import db, Session +from app.sql.models.graph import Graph, GraphForm +from app.sql.models.page import Page +from app.sql.models.tile import Tile +from app.controllers.crud_controller import CrudView + +class GraphView(CrudView): + model = Graph + form = GraphForm + + def on_destroy(self, session, item): + for item in item.pages: + session.query(Tile).filter(Tile.page_id == item.id).delete(synchronize_session=False) + session.query(Page).filter(Page.graph_id == item.id).delete(synchronize_session=False) diff --git a/cli/app/controllers/page_controller.py b/cli/app/controllers/page_controller.py new file mode 100644 index 0000000..5263cf0 --- /dev/null +++ b/cli/app/controllers/page_controller.py @@ -0,0 +1,15 @@ +from flask import request, jsonify, redirect +from flask_classful import route +from werkzeug.datastructures import MultiDict + +from app.sql.common import db, Session +from app.sql.models.page import Page, PageForm +from app.sql.models.tile import Tile +from app.controllers.crud_controller import CrudView + +class PageView(CrudView): + model = Page + form = PageForm + + def on_destroy(self, session, item): + session.query(Tile).filter(Tile.page_id == item.id).delete(synchronize_session=False) diff --git a/cli/app/controllers/tile_controller.py b/cli/app/controllers/tile_controller.py new file mode 100644 index 0000000..c47237b --- /dev/null +++ b/cli/app/controllers/tile_controller.py @@ -0,0 +1,11 @@ +from flask import request, jsonify, redirect +from flask_classful import route +from werkzeug.datastructures import MultiDict + +from app.sql.common import db, Session +from app.sql.models.tile import Tile, TileForm +from app.controllers.crud_controller import CrudView + +class TileView(CrudView): + model = Tile + form = TileForm diff --git a/cli/app/sql/models/collection.py b/cli/app/sql/models/collection.py deleted file mode 100644 index 0bc808c..0000000 --- a/cli/app/sql/models/collection.py +++ /dev/null @@ -1,58 +0,0 @@ -from sqlalchemy import create_engine, Table, Column, String, Integer, Boolean, DateTime, Text -from sqlalchemy.orm import relationship -from sqlalchemy_utc import UtcDateTime, utcnow -import sqlalchemy.sql.functions as func -from wtforms_alchemy import ModelForm - -from app.sql.common import Base, Session -from app.sql.models.collection_media import CollectionMedia - -class Collection(Base): - """Table for storing references to various media""" - __tablename__ = 'collection' - id = Column(Integer, primary_key=True) - title = Column(String(64, convert_unicode=True), nullable=False) - username = Column(String(16, convert_unicode=True), nullable=False) - notes = Column(Text) - archived = Column(Boolean, default=False) - created_at = Column(UtcDateTime(), default=utcnow()) - updated_at = Column(UtcDateTime(), onupdate=utcnow()) - - medias = relationship("Media", secondary="collection_media", lazy='dynamic') - - def toJSON(self): - return { - 'id': self.id, - 'title': self.title, - 'username': self.username, - 'notes': self.notes, - 'archived': self.archived, - 'created_at': self.created_at, - 'updated_at': self.updated_at, - 'media': [media.toJSON() for media in self.medias.limit(7)], - } - - def toFullJSON(self): - return { - 'id': self.id, - 'title': self.title, - 'username': self.username, - 'notes': self.notes, - 'archived': self.archived, - 'created_at': self.created_at, - 'updated_at': self.updated_at, - 'media': [media.toJSON() for media in self.medias], - } - -def getMediaCounts(session): - return session.query( - CollectionMedia.collection_id, - func.count(CollectionMedia.media_id) - ).group_by(CollectionMedia.collection_id).all() - -class CollectionForm(ModelForm): - class Meta: - model = Collection - exclude = ['created_at', 'updated_at'] - def get_session(): - return Session()
\ No newline at end of file diff --git a/cli/app/sql/models/graph.py b/cli/app/sql/models/graph.py new file mode 100644 index 0000000..59d55c8 --- /dev/null +++ b/cli/app/sql/models/graph.py @@ -0,0 +1,35 @@ +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +import sqlalchemy.sql.functions as func +from sqlalchemy_utc import UtcDateTime, utcnow +from wtforms_alchemy import ModelForm + +from app.sql.common import db, Base, Session + +from app.utils.file_utils import sha256_tree +from app.settings import app_cfg + +from os.path import join + +class Graph(Base): + """Table for storing references to graphs""" + __tablename__ = 'graphs' + id = Column(Integer, primary_key=True) + path = Column(String(64, convert_unicode=True), nullable=False) + title = Column(String(64, convert_unicode=True), nullable=False) + description = Column(Text(convert_unicode=True), nullable=False) + settings = Column(JSON, default={}, nullable=True) + created_at = Column(UtcDateTime(), default=utcnow()) + updated_at = Column(UtcDateTime(), default=utcnow()) + + # pages = relationship("Page", secondary="pages", lazy='dynamic') + + def toJSON(self): + return { + 'id': self.id, + 'path': self.path, + 'title': self.title, + 'description': self.description, + 'settings': self.settings, + 'created_at': self.created_at, + 'updated_at': self.updated_at, + } diff --git a/cli/app/sql/models/media.py b/cli/app/sql/models/media.py deleted file mode 100644 index d732b24..0000000 --- a/cli/app/sql/models/media.py +++ /dev/null @@ -1,70 +0,0 @@ -from sqlalchemy import create_engine, Table, Column, String, Integer, DateTime, ForeignKey -from sqlalchemy.orm import relationship -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy_utc import UtcDateTime, utcnow -import sqlalchemy.sql.functions as func -from wtforms_alchemy import ModelForm - -from app.sql.common import Base, Session -from app.sql.columns.hash_column import HashColumn -from app.sql.columns.media_type_column import MediaTypeColumn -from app.models.types import MediaTypeIndex, MediaTypeName - -from app.utils.file_utils import sha256_tree -from app.settings import app_cfg - -from os.path import join - -class Media(Base): - """Table for storing references to various media""" - __tablename__ = 'media' - id = Column(Integer, primary_key=True) - import_id = Column(Integer, ForeignKey('media_import.id'), nullable=True) - mediaType = Column(MediaTypeColumn(), nullable=False) - sha256 = Column(HashColumn(32), nullable=False) - ext = Column(String(4, convert_unicode=True), nullable=False) - frame = Column(Integer, nullable=True) - created_at = Column(UtcDateTime(), default=utcnow()) - - # children = relationship("Media") - # media_features = relationship("MediaFeature") - # media_metadata = relationship("MediaMetadata") - - def toJSON(self): - return { - 'id': self.id, - 'import_id': self.import_id, - 'mediaType': self.mediaType, - 'sha256': self.sha256, - 'frame': self.frame, - 'ext': self.ext, - 'url': self.url(), - 'created_at': self.created_at, - } - - def toFullJSON(self, session): - siblings = session.query(Media).filter(Media.sha256 == self.sha256).all() - return { - 'el': self.toJSON(), - 'siblings': [ el.toJSON() for el in siblings ], - } - - def filename(self): - if self.mediaType == 'video_frame': - return "{}_{:03d}{}".format(self.sha256, self.frame, self.ext) - return "{}{}".format(self.sha256, self.ext) - - def filetree(self): - return sha256_tree(self.sha256) - - def filepath(self): - return join(app_cfg.DIR_MEDIA, self.filetree()) - - def fullpath(self): - return join(self.filepath(), self.filename()) - - def archivepath(self): - return join('media', self.filename()) - - def url(self): - return join(app_cfg.URL_MEDIA, self.filetree(), self.filename()) diff --git a/cli/app/sql/models/page.py b/cli/app/sql/models/page.py new file mode 100644 index 0000000..09470b5 --- /dev/null +++ b/cli/app/sql/models/page.py @@ -0,0 +1,34 @@ +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +import sqlalchemy.sql.functions as func +from sqlalchemy_utc import UtcDateTime, utcnow +from wtforms_alchemy import ModelForm + +from app.sql.common import db, Base, Session + +from app.settings import app_cfg + +class Page(Base): + """Table for storing references to pages""" + __tablename__ = 'pages' + id = Column(Integer, primary_key=True) + graph_id = Column(Integer, ForeignKey('graph.id'), nullable=True) + path = Column(String(64, convert_unicode=True), nullable=False) + title = Column(String(64, convert_unicode=True), nullable=False) + description = Column(Text(convert_unicode=True), nullable=False) + settings = Column(JSON, default={}, nullable=True) + created_at = Column(UtcDateTime(), default=utcnow()) + updated_at = Column(UtcDateTime(), default=utcnow()) + + tiles = relationship("Tile", secondary="tiles", lazy='dynamic') + + def toJSON(self): + return { + 'id': self.id, + 'graph_id': self.graph_id, + 'path': self.path, + 'title': self.title, + 'description': self.description, + 'settings': self.settings, + 'created_at': self.created_at, + 'updated_at': self.updated_at, + } diff --git a/cli/app/sql/models/tile.py b/cli/app/sql/models/tile.py new file mode 100644 index 0000000..7ca311d --- /dev/null +++ b/cli/app/sql/models/tile.py @@ -0,0 +1,35 @@ +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +import sqlalchemy.sql.functions as func +from sqlalchemy_utc import UtcDateTime, utcnow +from wtforms_alchemy import ModelForm + +from app.sql.common import db, Base, Session + +from app.utils.file_utils import sha256_tree +from app.settings import app_cfg + +from os.path import join + +class Tile(Base): + """Table for storing references to tiles""" + __tablename__ = 'tiles' + id = Column(Integer, primary_key=True) + graph_id = Column(Integer, ForeignKey('graph.id'), nullable=True) + page_id = Column(Integer, ForeignKey('page.id'), nullable=True) + target_page_id = Column(Integer, ForeignKey('page.id'), nullable=True) + type = Column(String(16, convert_unicode=True), nullable=False) + settings = Column(JSON, default={}, nullable=True) + created_at = Column(UtcDateTime(), default=utcnow()) + updated_at = Column(UtcDateTime(), default=utcnow()) + + def toJSON(self): + return { + 'id': self.id, + 'graph_id': self.graph_id, + 'page_id': self.page_id, + 'target_page_id': self.target_page_id, + 'type': self.type, + 'settings': self.settings, + 'created_at': self.created_at, + 'updated_at': self.updated_at, + } |
