summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-06-01 16:22:18 +0200
committerJules Laplace <julescarbon@gmail.com>2020-06-01 16:22:18 +0200
commit1a7370c19a7eed6a5f0f48e270092f9b3caebbc1 (patch)
treeff1ac87d40bde43648e579e43543d3e1646d00d4 /cli
parent0890fdd951d021308550a0db2e7b6f2593512957 (diff)
models and controllers
Diffstat (limited to 'cli')
-rw-r--r--cli/app/controllers/collection_controller.py20
-rw-r--r--cli/app/controllers/graph_controller.py18
-rw-r--r--cli/app/controllers/page_controller.py15
-rw-r--r--cli/app/controllers/tile_controller.py11
-rw-r--r--cli/app/sql/models/collection.py58
-rw-r--r--cli/app/sql/models/graph.py35
-rw-r--r--cli/app/sql/models/media.py70
-rw-r--r--cli/app/sql/models/page.py34
-rw-r--r--cli/app/sql/models/tile.py35
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,
+ }