diff options
Diffstat (limited to 'cli/app')
| -rw-r--r-- | cli/app/server/web.py | 8 | ||||
| -rw-r--r-- | cli/app/settings/app_cfg.py | 2 | ||||
| -rw-r--r-- | cli/app/sql/common.py | 8 | ||||
| -rw-r--r-- | cli/app/sql/env.py | 4 | ||||
| -rw-r--r-- | cli/app/sql/models/graph.py | 15 | ||||
| -rw-r--r-- | cli/app/sql/models/page.py | 27 | ||||
| -rw-r--r-- | cli/app/sql/models/tile.py | 13 | ||||
| -rw-r--r-- | cli/app/sql/models/upload.py | 10 | ||||
| -rw-r--r-- | cli/app/sql/script.py.mako | 1 | ||||
| -rw-r--r-- | cli/app/sql/versions/202006011943_adding_database.py | 66 | ||||
| -rw-r--r-- | cli/app/sql/versions/202006011944_adding_uploads.py | 37 | ||||
| -rw-r--r-- | cli/app/utils/file_utils.py | 3 |
12 files changed, 159 insertions, 35 deletions
diff --git a/cli/app/server/web.py b/cli/app/server/web.py index 49618d2..739f271 100644 --- a/cli/app/server/web.py +++ b/cli/app/server/web.py @@ -16,7 +16,9 @@ from flask import Flask, Blueprint, send_from_directory, request from app.sql.common import db, connection_url from app.settings import app_cfg -from app.controllers.collection_controller import CollectionView +from app.controllers.graph_controller import GraphView +from app.controllers.page_controller import PageView +from app.controllers.tile_controller import TileView from app.controllers.upload_controller import UploadView def create_app(script_info=None): @@ -31,7 +33,9 @@ def create_app(script_info=None): db.init_app(app) - CollectionView.register(app, route_prefix='/api/v1/') + GraphView.register(app, route_prefix='/api/v1/') + PageView.register(app, route_prefix='/api/v1/') + TileView.register(app, route_prefix='/api/v1/') UploadView.register(app, route_prefix='/api/v1/') index_html = 'index.html' diff --git a/cli/app/settings/app_cfg.py b/cli/app/settings/app_cfg.py index 094f51e..758056e 100644 --- a/cli/app/settings/app_cfg.py +++ b/cli/app/settings/app_cfg.py @@ -6,7 +6,7 @@ import logging from dotenv import load_dotenv import yaml -from app.models import types +# from app.models import types from pathlib import Path import codecs diff --git a/cli/app/sql/common.py b/cli/app/sql/common.py index cf819e1..fab324d 100644 --- a/cli/app/sql/common.py +++ b/cli/app/sql/common.py @@ -2,7 +2,7 @@ import os import glob import time -import mysql.connector +# import mysql.connector from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base @@ -21,13 +21,17 @@ from app.settings import app_cfg os.makedirs(app_cfg.DIR_DATABASE, exist_ok=True) connection_url = "sqlite:///{}".format(os.path.join(app_cfg.DIR_DATABASE, 'swimmer.sqlite3')) +print(connection_url) engine = create_engine(connection_url, encoding="utf-8", pool_recycle=3600) Session = sessionmaker(bind=engine) Base = declarative_base() +Base.metadata.bind = engine db = SQLAlchemy() -from app.sql.models.collection import Collection +from app.sql.models.tile import Tile +from app.sql.models.page import Page +from app.sql.models.graph import Graph from app.sql.models.upload import Upload diff --git a/cli/app/sql/env.py b/cli/app/sql/env.py index a2815db..1bf717f 100644 --- a/cli/app/sql/env.py +++ b/cli/app/sql/env.py @@ -13,7 +13,9 @@ config.set_main_option("sqlalchemy.url", connection_url) target_metadata = Base.metadata -from app.sql.models.collection import Collection +from app.sql.models.tile import Tile +from app.sql.models.page import Page +from app.sql.models.graph import Graph from app.sql.models.upload import Upload def run_migrations_offline(): diff --git a/cli/app/sql/models/graph.py b/cli/app/sql/models/graph.py index ef5a817..1f553e9 100644 --- a/cli/app/sql/models/graph.py +++ b/cli/app/sql/models/graph.py @@ -1,9 +1,11 @@ -from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON, ForeignKey +from sqlalchemy.orm import relationship 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.sql.models.page import Page from app.settings import app_cfg @@ -11,16 +13,16 @@ from os.path import join class Graph(Base): """Table for storing references to graphs""" - __tablename__ = 'graphs' + __tablename__ = 'graph' 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()) + updated_at = Column(UtcDateTime(), onupdate=utcnow()) - # pages = relationship("Page", secondary="pages", lazy='dynamic') + # pages = relationship('Page', lazy='dynamic') def toJSON(self): return { @@ -33,6 +35,11 @@ class Graph(Base): 'updated_at': self.updated_at, } + def toFullJSON(self): + data = self.toJSON() + data['pages'] = [ page.toJSON() for page in self.pages ] + return data + class GraphForm(ModelForm): class Meta: model = Graph diff --git a/cli/app/sql/models/page.py b/cli/app/sql/models/page.py index 1362bb3..bad5568 100644 --- a/cli/app/sql/models/page.py +++ b/cli/app/sql/models/page.py @@ -1,15 +1,17 @@ -from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON, ForeignKey +from sqlalchemy.orm import relationship 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.sql.models.graph import Graph from app.settings import app_cfg class Page(Base): """Table for storing references to pages""" - __tablename__ = 'pages' + __tablename__ = 'page' id = Column(Integer, primary_key=True) graph_id = Column(Integer, ForeignKey('graph.id'), nullable=True) path = Column(String(64, convert_unicode=True), nullable=False) @@ -17,9 +19,9 @@ class Page(Base): 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()) + updated_at = Column(UtcDateTime(), onupdate=utcnow()) - tiles = relationship("Tile", secondary="tiles", lazy='dynamic') + # tiles = relationship("Tile", lazy='dynamic') def toJSON(self): return { @@ -33,9 +35,14 @@ class Page(Base): 'updated_at': self.updated_at, } -class PageForm(ModelForm): - class Meta: - model = Page - exclude = ['graph_id', 'settings', 'created_at', 'updated_at'] - def get_session(): - return Session() + def toFullJSON(self): + data = self.toJSON() + data['tiles'] = [ tile.toJSON() for tile in self.tiles ] + return data + +# class PageForm(ModelForm): +# class Meta: +# model = Page +# exclude = ['graph_id', 'settings', 'created_at', 'updated_at'] +# def get_session(): +# return Session() diff --git a/cli/app/sql/models/tile.py b/cli/app/sql/models/tile.py index 01b3fab..85ee1bf 100644 --- a/cli/app/sql/models/tile.py +++ b/cli/app/sql/models/tile.py @@ -1,18 +1,20 @@ -from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON +from sqlalchemy import create_engine, Table, Column, Text, String, Integer, DateTime, JSON, ForeignKey +from sqlalchemy.orm import relationship 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.sql.models.graph import Graph +# from app.sql.models.page import Page -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' + __tablename__ = 'tile' id = Column(Integer, primary_key=True) graph_id = Column(Integer, ForeignKey('graph.id'), nullable=True) page_id = Column(Integer, ForeignKey('page.id'), nullable=True) @@ -20,7 +22,7 @@ class Tile(Base): 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()) + updated_at = Column(UtcDateTime(), onupdate=utcnow()) def toJSON(self): return { @@ -34,10 +36,9 @@ class Tile(Base): 'updated_at': self.updated_at, } - class TileForm(ModelForm): class Meta: model = Tile - exclude = ['graph_id', 'page_id', 'target_page_id', 'settings', 'created_at', 'updated_at'] + # exclude = ['graph_id', 'page_id', 'target_page_id', 'settings', 'created_at', 'updated_at'] def get_session(): return Session() diff --git a/cli/app/sql/models/upload.py b/cli/app/sql/models/upload.py index f1e8108..5863b07 100644 --- a/cli/app/sql/models/upload.py +++ b/cli/app/sql/models/upload.py @@ -4,8 +4,6 @@ from sqlalchemy_utc import UtcDateTime, utcnow from wtforms_alchemy import ModelForm from app.sql.common import db, Base, Session -from app.sql.columns.hash_column import HashColumn -from app.sql.columns.media_type_column import MediaTypeColumn from app.utils.file_utils import sha256_tree from app.settings import app_cfg @@ -14,9 +12,10 @@ from os.path import join class Upload(Base): """Table for storing references to various media""" - __tablename__ = 'uploads' + __tablename__ = 'upload' id = Column(Integer, primary_key=True) - sha256 = Column(HashColumn(32), nullable=False) + sha256 = Column(String(256), nullable=False) + fn = Column(String(256), nullable=False) ext = Column(String(4, convert_unicode=True), nullable=False) username = Column(String(16, convert_unicode=True), nullable=False) created_at = Column(UtcDateTime(), default=utcnow()) @@ -25,6 +24,7 @@ class Upload(Base): return { 'id': self.id, 'sha256': self.sha256, + 'fn': self.fn, 'ext': self.ext, 'username': self.username, 'url': self.url(), @@ -32,7 +32,7 @@ class Upload(Base): } def filename(self): - return "{}{}".format(self.sha256, self.ext) + return "{}{}".format(self.fn) def filepath(self): return join(app_cfg.DIR_UPLOADS, sha256_tree(self.sha256)) diff --git a/cli/app/sql/script.py.mako b/cli/app/sql/script.py.mako index 94bb012..c4b86b8 100644 --- a/cli/app/sql/script.py.mako +++ b/cli/app/sql/script.py.mako @@ -8,7 +8,6 @@ Create Date: ${create_date} from alembic import op import sqlalchemy as sa import sqlalchemy_utc -import app.sql.columns ${imports if imports else ""} # revision identifiers, used by Alembic. diff --git a/cli/app/sql/versions/202006011943_adding_database.py b/cli/app/sql/versions/202006011943_adding_database.py new file mode 100644 index 0000000..4e5b0e6 --- /dev/null +++ b/cli/app/sql/versions/202006011943_adding_database.py @@ -0,0 +1,66 @@ +"""adding database + +Revision ID: 7acd0c82a048 +Revises: +Create Date: 2020-06-01 19:43:53.359855 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utc + + +# revision identifiers, used by Alembic. +revision = '7acd0c82a048' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('graph', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('path', sa.String(length=64, _expect_unicode=True), nullable=False), + sa.Column('title', sa.String(length=64, _expect_unicode=True), nullable=False), + sa.Column('description', sa.Text(_expect_unicode=True), nullable=False), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('created_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.Column('updated_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('page', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('graph_id', sa.Integer(), nullable=True), + sa.Column('path', sa.String(length=64, _expect_unicode=True), nullable=False), + sa.Column('title', sa.String(length=64, _expect_unicode=True), nullable=False), + sa.Column('description', sa.Text(_expect_unicode=True), nullable=False), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('created_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.Column('updated_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['graph_id'], ['graph.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('tile', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('graph_id', sa.Integer(), nullable=True), + sa.Column('page_id', sa.Integer(), nullable=True), + sa.Column('target_page_id', sa.Integer(), nullable=True), + sa.Column('type', sa.String(length=16, _expect_unicode=True), nullable=False), + sa.Column('settings', sa.JSON(), nullable=True), + sa.Column('created_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.Column('updated_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['graph_id'], ['graph.id'], ), + sa.ForeignKeyConstraint(['page_id'], ['page.id'], ), + sa.ForeignKeyConstraint(['target_page_id'], ['page.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tile') + op.drop_table('page') + op.drop_table('graph') + # ### end Alembic commands ### diff --git a/cli/app/sql/versions/202006011944_adding_uploads.py b/cli/app/sql/versions/202006011944_adding_uploads.py new file mode 100644 index 0000000..f09f013 --- /dev/null +++ b/cli/app/sql/versions/202006011944_adding_uploads.py @@ -0,0 +1,37 @@ +"""adding uploads + +Revision ID: 5b926731a4ac +Revises: 7acd0c82a048 +Create Date: 2020-06-01 19:44:30.400513 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utc + + +# revision identifiers, used by Alembic. +revision = '5b926731a4ac' +down_revision = '7acd0c82a048' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('upload', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('sha256', sa.String(length=256), nullable=False), + sa.Column('fn', sa.String(length=256), nullable=False), + sa.Column('ext', sa.String(length=4, _expect_unicode=True), nullable=False), + sa.Column('username', sa.String(length=16, _expect_unicode=True), nullable=False), + sa.Column('created_at', sqlalchemy_utc.sqltypes.UtcDateTime(timezone=True), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('upload') + # ### end Alembic commands ### diff --git a/cli/app/utils/file_utils.py b/cli/app/utils/file_utils.py index 904702c..7f1f417 100644 --- a/cli/app/utils/file_utils.py +++ b/cli/app/utils/file_utils.py @@ -29,9 +29,6 @@ import yaml import hashlib import click from tqdm import tqdm -import cv2 as cv -from PIL import Image -import imutils |
