diff options
15 files changed, 102 insertions, 9 deletions
diff --git a/animism-align/cli/app/controllers/upload_controller.py b/animism-align/cli/app/controllers/upload_controller.py index 7122e53..634f15d 100644 --- a/animism-align/cli/app/controllers/upload_controller.py +++ b/animism-align/cli/app/controllers/upload_controller.py @@ -64,6 +64,12 @@ class UploadView(FlaskView): except: raise APIError('No tag specified') + try: + episode_id = request.form.get('episode_id') + # print(episode_id) + except: + raise APIError('No episode_id specified') + if 'image' in request.files: file = request.files['image'] # print(fn) @@ -85,7 +91,7 @@ class UploadView(FlaskView): file.seek(0) uploaded_im_fn = secure_filename(file.filename) - uploaded_im_abspath = os.path.join(app_cfg.DIR_UPLOADS, tag) + uploaded_im_abspath = os.path.join(app_cfg.DIR_UPLOADS, str(episode_id), tag) uploaded_im_fullpath = os.path.join(uploaded_im_abspath, uploaded_im_fn) session = Session() @@ -107,7 +113,7 @@ class UploadView(FlaskView): os.makedirs(uploaded_im_abspath, exist_ok=True) file.save(uploaded_im_fullpath) - upload = Upload(username=username, tag=tag, fn=uploaded_im_fn, sha256=sha256, ext=ext) + upload = Upload(username=username, tag=tag, fn=uploaded_im_fn, sha256=sha256, ext=ext, episode_id=episode_id) session.add(upload) session.commit() response = { diff --git a/animism-align/cli/app/sql/models/upload.py b/animism-align/cli/app/sql/models/upload.py index ae30a54..ea6950f 100644 --- a/animism-align/cli/app/sql/models/upload.py +++ b/animism-align/cli/app/sql/models/upload.py @@ -14,6 +14,7 @@ class Upload(Base): """Table for storing references to various media""" __tablename__ = 'upload' id = Column(Integer, primary_key=True) + episode_id = Column(Integer) sha256 = Column(String(256), nullable=False) fn = Column(String(256), nullable=False) ext = Column(String(4, convert_unicode=True), nullable=False) @@ -24,6 +25,7 @@ class Upload(Base): def toJSON(self): return { 'id': self.id, + 'episode_id': self.episode_id, 'sha256': self.sha256, 'fn': self.fn, 'ext': self.ext, @@ -44,6 +46,6 @@ class Upload(Base): def url(self): if self.tag: - return join('/static/data_store/uploads', self.tag, self.fn) - return join('/static/data_store/uploads', self.fn) + return join('/static/data_store/uploads', str(self.episode_id), self.tag, self.fn) + return join('/static/data_store/uploads', str(self.episode_id), self.fn) # return join(app_cfg.URL_UPLOADS, sha256_tree(self.sha256), self.filename()) diff --git a/animism-align/cli/app/sql/versions/202103111524_add_episode_id_to_uploads.py b/animism-align/cli/app/sql/versions/202103111524_add_episode_id_to_uploads.py new file mode 100644 index 0000000..bccea9e --- /dev/null +++ b/animism-align/cli/app/sql/versions/202103111524_add_episode_id_to_uploads.py @@ -0,0 +1,29 @@ +"""add episode id to uploads + +Revision ID: d00c2398fc5f +Revises: 639488f6e800 +Create Date: 2021-03-11 15:24:07.230796 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utc + + +# revision identifiers, used by Alembic. +revision = 'd00c2398fc5f' +down_revision = '639488f6e800' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('upload', sa.Column('episode_id', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('upload', 'episode_id') + # ### end Alembic commands ### diff --git a/animism-align/cli/commands/admin/fix_uploads.py b/animism-align/cli/commands/admin/fix_uploads.py new file mode 100644 index 0000000..8eaa505 --- /dev/null +++ b/animism-align/cli/commands/admin/fix_uploads.py @@ -0,0 +1,45 @@ +import click + +@click.command('fix_uploads') +@click.pass_context +def cli(ctx): + from app.settings import app_cfg + from app.sql.common import db, Session, Media + from sqlalchemy.orm.attributes import flag_modified + + session = Session() + media = session.query(Media).all() + + seen_keys = {} + for item in media: + if "poster" in item.settings: + fix_url(item.settings['poster']) + print(item.settings['poster']['url']) + if "display" in item.settings: + fix_url(item.settings['display']) + if "fullsize" in item.settings: + fix_url(item.settings['fullsize']) + if "thumbnail" in item.settings: + fix_url(item.settings['thumbnail']) + if "file" in item.settings: + fix_url(item.settings['file']) + if "image_lookup" in item.settings: + fix_lookup(item.settings['image_lookup']) + if "display_lookup" in item.settings: + fix_lookup(item.settings['display_lookup']) + if "thumbnail_lookup" in item.settings: + fix_lookup(item.settings['thumbnail_lookup']) + # sqlalchemy will not notice deep updates of JSON fields + flag_modified(item, "settings") + session.add(item) + session.commit() + +def fix_lookup(lookup): + for key, value in lookup.items(): + fix_url(value) + +def fix_url(obj): + if 'episode_id' in obj: + return + obj['episode_id'] = 1 + obj['url'] = obj['url'].replace('/uploads', '/uploads/1') diff --git a/animism-align/cli/commands/site/export.py b/animism-align/cli/commands/site/export.py index 41e41ed..6bafadc 100644 --- a/animism-align/cli/commands/site/export.py +++ b/animism-align/cli/commands/site/export.py @@ -24,7 +24,7 @@ MEDIA_ANNOTATION_TYPES = [ help='Whether to rebuild the Javascript bundle') @click.pass_context def cli(ctx, opt_output_dir, opt_sync, opt_js): - """Export a graph""" + """Export an episode""" # ------------------------------------------------ # imports diff --git a/animism-align/frontend/app/views/audio/audio.actions.js b/animism-align/frontend/app/views/audio/audio.actions.js index 08a8ba4..4627e90 100644 --- a/animism-align/frontend/app/views/audio/audio.actions.js +++ b/animism-align/frontend/app/views/audio/audio.actions.js @@ -27,7 +27,7 @@ export const load = (url) => dispatch => { }) } export const loadEpisodeAudio = (episode) => dispatch => { - return load(episode.settings.audio.url)(dispatch) + return episode.settings.audio ? load(episode.settings.audio.url)(dispatch) : null } export const play = () => dispatch => { diff --git a/animism-align/frontend/app/views/editor/align/align.actions.js b/animism-align/frontend/app/views/editor/align/align.actions.js index 3b6450b..fe5020c 100644 --- a/animism-align/frontend/app/views/editor/align/align.actions.js +++ b/animism-align/frontend/app/views/editor/align/align.actions.js @@ -150,7 +150,7 @@ export const spliceTime = start_ts => dispatch => { /* peaks */ export const loadPeaks = (episode) => dispatch => ( - api(dispatch, types.peaks, 'peaks', episode.settings.peaks.url) + episode.settings.peaks ? api(dispatch, types.peaks, 'peaks', episode.settings.peaks.url) : null ) /* longform text */ diff --git a/animism-align/frontend/app/views/editor/media/components/media.form.js b/animism-align/frontend/app/views/editor/media/components/media.form.js index df86516..3a989f1 100644 --- a/animism-align/frontend/app/views/editor/media/components/media.form.js +++ b/animism-align/frontend/app/views/editor/media/components/media.form.js @@ -143,7 +143,7 @@ export default class MediaForm extends Component { } render() { - const { isNew, currentUser } = this.props + const { isNew, currentUser, episode_id } = this.props const { title, submitTitle, errorFields, data } = this.state // console.log(data) return ( @@ -161,6 +161,7 @@ export default class MediaForm extends Component { {data.type === 'image' && <MediaImageForm data={data} + episode_id={episode_id} currentUser={currentUser} onChange={this.handleSelect} onSettingsChange={this.handleSettingsChange} @@ -170,6 +171,7 @@ export default class MediaForm extends Component { {data.type === 'video' && <MediaVideoForm data={data} + episode_id={episode_id} currentUser={currentUser} onChange={this.handleSelect} onSettingsChange={this.handleSettingsChange} @@ -179,6 +181,7 @@ export default class MediaForm extends Component { {data.type === 'file' && <MediaFileForm data={data} + episode_id={episode_id} currentUser={currentUser} onChange={this.handleSelect} onSettingsChange={this.handleSettingsChange} @@ -188,6 +191,7 @@ export default class MediaForm extends Component { {data.type === 'gallery' && <MediaGalleryForm data={data} + episode_id={episode_id} currentUser={currentUser} onChange={this.handleSelect} onSettingsChange={this.handleSettingsChange} diff --git a/animism-align/frontend/app/views/editor/media/components/media.formFile.js b/animism-align/frontend/app/views/editor/media/components/media.formFile.js index bec0a90..fc9c922 100644 --- a/animism-align/frontend/app/views/editor/media/components/media.formFile.js +++ b/animism-align/frontend/app/views/editor/media/components/media.formFile.js @@ -38,6 +38,7 @@ export default class MediaFileForm extends Component { const uploadData = { image: file, tag: "file", + episode_id: this.props.episode_id, username: this.props.currentUser.username, } // uploadData['__image_filename'] = file.filename diff --git a/animism-align/frontend/app/views/editor/media/components/media.formGallery.js b/animism-align/frontend/app/views/editor/media/components/media.formGallery.js index 4003c7d..536b3c6 100644 --- a/animism-align/frontend/app/views/editor/media/components/media.formGallery.js +++ b/animism-align/frontend/app/views/editor/media/components/media.formGallery.js @@ -181,6 +181,7 @@ export default class MediaGalleryForm extends Component { const uploadData = { image, tag, + episode_id: this.props.episode_id, username: this.props.currentUser.username, } if (fn) { diff --git a/animism-align/frontend/app/views/editor/media/components/media.formImage.js b/animism-align/frontend/app/views/editor/media/components/media.formImage.js index 027926b..015a1cb 100644 --- a/animism-align/frontend/app/views/editor/media/components/media.formImage.js +++ b/animism-align/frontend/app/views/editor/media/components/media.formImage.js @@ -103,6 +103,7 @@ export default class MediaImageForm extends Component { const uploadData = { image, tag, + episode_id: this.props.episode_id, username: this.props.currentUser.username, } if (fn) { diff --git a/animism-align/frontend/app/views/editor/media/components/media.formVideo.js b/animism-align/frontend/app/views/editor/media/components/media.formVideo.js index 656ad2f..5a60cc6 100644 --- a/animism-align/frontend/app/views/editor/media/components/media.formVideo.js +++ b/animism-align/frontend/app/views/editor/media/components/media.formVideo.js @@ -60,6 +60,7 @@ export default class MediaVideoForm extends Component { const uploadData = { image: file, tag: "poster", + episode_id: this.props.episode_id, username: this.props.currentUser.username, } // uploadData['__image_filename'] = file.filename diff --git a/animism-align/frontend/app/views/editor/media/containers/media.edit.js b/animism-align/frontend/app/views/editor/media/containers/media.edit.js index 6799494..c7c8e25 100644 --- a/animism-align/frontend/app/views/editor/media/containers/media.edit.js +++ b/animism-align/frontend/app/views/editor/media/containers/media.edit.js @@ -38,6 +38,7 @@ class MediaEdit extends Component { <MediaMenu mediaActions={this.props.mediaActions} /> <MediaForm data={show.res} + episode_id={this.props.episode_id} currentUser={this.props.currentUser} onSubmit={this.handleSubmit.bind(this)} /> diff --git a/animism-align/frontend/app/views/editor/media/containers/media.new.js b/animism-align/frontend/app/views/editor/media/containers/media.new.js index 0a1be55..7c378e0 100644 --- a/animism-align/frontend/app/views/editor/media/containers/media.new.js +++ b/animism-align/frontend/app/views/editor/media/containers/media.new.js @@ -63,6 +63,7 @@ class MediaNew extends Component { <MediaForm isNew data={this.state.initialData} + episode_id={this.props.episode_id} currentUser={this.props.currentUser} onSubmit={this.handleSubmit.bind(this)} /> diff --git a/animism-align/frontend/app/views/editor/media/media.css b/animism-align/frontend/app/views/editor/media/media.css index ebf8c33..eb977fd 100644 --- a/animism-align/frontend/app/views/editor/media/media.css +++ b/animism-align/frontend/app/views/editor/media/media.css @@ -17,7 +17,8 @@ max-width: 100%; } .media .results .img img { - max-width: 295px; + max-width: 150px; + max-height: 150px; } /* new / edit media forms */ |
