mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-10-31 10:42:43 +00:00 
			
		
		
		
	add tables for files
This commit is contained in:
		| @@ -250,6 +250,28 @@ class AnonymousUser(AnonymousUserMixin): | |||||||
|         return False |         return False | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class JobInput(db.Model): | ||||||
|  |     """ | ||||||
|  |     Class to define Files. | ||||||
|  |     """ | ||||||
|  |     __tablename__ = 'job_inputs' | ||||||
|  |     # Primary key | ||||||
|  |     id = db.Column(db.Integer, primary_key=True) | ||||||
|  |     filename = db.Column(db.String(255)) | ||||||
|  |     job_id = db.Column(db.Integer, db.ForeignKey('jobs.id')) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class JobResult(db.Model): | ||||||
|  |     """ | ||||||
|  |     Class to define Files. | ||||||
|  |     """ | ||||||
|  |     __tablename__ = 'job_results' | ||||||
|  |     # Primary key | ||||||
|  |     id = db.Column(db.Integer, primary_key=True) | ||||||
|  |     filename = db.Column(db.String(255)) | ||||||
|  |     job_id = db.Column(db.Integer, db.ForeignKey('jobs.id')) | ||||||
|  |  | ||||||
|  |  | ||||||
| class Job(db.Model): | class Job(db.Model): | ||||||
|     """ |     """ | ||||||
|     Class to define Jobs. |     Class to define Jobs. | ||||||
| @@ -272,6 +294,15 @@ class Job(db.Model): | |||||||
|     status = db.Column(db.String(16)) |     status = db.Column(db.String(16)) | ||||||
|     title = db.Column(db.String(32)) |     title = db.Column(db.String(32)) | ||||||
|     user_id = db.Column(db.Integer, db.ForeignKey('users.id')) |     user_id = db.Column(db.Integer, db.ForeignKey('users.id')) | ||||||
|  |     # Relationships | ||||||
|  |     inputs = db.relationship('JobInput', | ||||||
|  |                              backref='job', | ||||||
|  |                              lazy='dynamic', | ||||||
|  |                              cascade='save-update, merge, delete') | ||||||
|  |     results = db.relationship('JobResult', | ||||||
|  |                               backref='job', | ||||||
|  |                               lazy='dynamic', | ||||||
|  |                               cascade='save-update, merge, delete') | ||||||
|  |  | ||||||
|     def __init__(self, **kwargs): |     def __init__(self, **kwargs): | ||||||
|         super(Job, self).__init__(**kwargs) |         super(Job, self).__init__(**kwargs) | ||||||
| @@ -329,6 +360,17 @@ class Job(db.Model): | |||||||
|         db.session.commit() |         db.session.commit() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CorpusFile(db.Model): | ||||||
|  |     """ | ||||||
|  |     Class to define Files. | ||||||
|  |     """ | ||||||
|  |     __tablename__ = 'corpus_files' | ||||||
|  |     # Primary key | ||||||
|  |     id = db.Column(db.Integer, primary_key=True) | ||||||
|  |     filename = db.Column(db.String(255)) | ||||||
|  |     corpus_id = db.Column(db.Integer, db.ForeignKey('corpora.id')) | ||||||
|  |  | ||||||
|  |  | ||||||
| class Corpus(db.Model): | class Corpus(db.Model): | ||||||
|     """ |     """ | ||||||
|     Class to define a corpus. |     Class to define a corpus. | ||||||
| @@ -340,6 +382,11 @@ class Corpus(db.Model): | |||||||
|     description = db.Column(db.String(255)) |     description = db.Column(db.String(255)) | ||||||
|     title = db.Column(db.String(32)) |     title = db.Column(db.String(32)) | ||||||
|     user_id = db.Column(db.Integer, db.ForeignKey('users.id')) |     user_id = db.Column(db.Integer, db.ForeignKey('users.id')) | ||||||
|  |     # Relationships | ||||||
|  |     files = db.relationship('CorpusFile', | ||||||
|  |                             backref='relation', | ||||||
|  |                             lazy='dynamic', | ||||||
|  |                             cascade='save-update, merge, delete') | ||||||
|  |  | ||||||
|     def __init__(self, **kwargs): |     def __init__(self, **kwargs): | ||||||
|         super(Corpus, self).__init__(**kwargs) |         super(Corpus, self).__init__(**kwargs) | ||||||
|   | |||||||
| @@ -1,9 +1,10 @@ | |||||||
| from flask import abort, current_app, flash, redirect, render_template, url_for | from flask import abort, current_app, flash, redirect, render_template, url_for | ||||||
| from . import services |  | ||||||
| from flask_login import current_user, login_required | from flask_login import current_user, login_required | ||||||
|  | from werkzeug.utils import secure_filename | ||||||
|  | from . import services | ||||||
| from .forms import NewNLPJobForm, NewOCRJobForm | from .forms import NewNLPJobForm, NewOCRJobForm | ||||||
| from ..models import Job |  | ||||||
| from .. import db | from .. import db | ||||||
|  | from ..models import Job, JobInput | ||||||
| import json | import json | ||||||
| import os | import os | ||||||
|  |  | ||||||
| @@ -53,7 +54,10 @@ def service(service_handle): | |||||||
|         else: |         else: | ||||||
|             for file in new_job_form.files.data: |             for file in new_job_form.files.data: | ||||||
|                 ''' TODO: Use secure filename ''' |                 ''' TODO: Use secure filename ''' | ||||||
|                 file.save(os.path.join(dir, file.filename)) |                 filename = secure_filename(file.filename) | ||||||
|  |                 file.save(os.path.join(dir, filename)) | ||||||
|  |                 job_input = JobInput(filename=filename, job=job) | ||||||
|  |                 db.session.add(job_input) | ||||||
|             job.status = 'submitted' |             job.status = 'submitted' | ||||||
|             db.session.commit() |             db.session.commit() | ||||||
|             flash('Job created!') |             flash('Job created!') | ||||||
|   | |||||||
| @@ -1 +0,0 @@ | |||||||
| Generic single-database configuration. |  | ||||||
| @@ -1,45 +0,0 @@ | |||||||
| # A generic, single database configuration. |  | ||||||
|  |  | ||||||
| [alembic] |  | ||||||
| # template used to generate migration files |  | ||||||
| # file_template = %%(rev)s_%%(slug)s |  | ||||||
|  |  | ||||||
| # set to 'true' to run the environment during |  | ||||||
| # the 'revision' command, regardless of autogenerate |  | ||||||
| # revision_environment = false |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # Logging configuration |  | ||||||
| [loggers] |  | ||||||
| keys = root,sqlalchemy,alembic |  | ||||||
|  |  | ||||||
| [handlers] |  | ||||||
| keys = console |  | ||||||
|  |  | ||||||
| [formatters] |  | ||||||
| keys = generic |  | ||||||
|  |  | ||||||
| [logger_root] |  | ||||||
| level = WARN |  | ||||||
| handlers = console |  | ||||||
| qualname = |  | ||||||
|  |  | ||||||
| [logger_sqlalchemy] |  | ||||||
| level = WARN |  | ||||||
| handlers = |  | ||||||
| qualname = sqlalchemy.engine |  | ||||||
|  |  | ||||||
| [logger_alembic] |  | ||||||
| level = INFO |  | ||||||
| handlers = |  | ||||||
| qualname = alembic |  | ||||||
|  |  | ||||||
| [handler_console] |  | ||||||
| class = StreamHandler |  | ||||||
| args = (sys.stderr,) |  | ||||||
| level = NOTSET |  | ||||||
| formatter = generic |  | ||||||
|  |  | ||||||
| [formatter_generic] |  | ||||||
| format = %(levelname)-5.5s [%(name)s] %(message)s |  | ||||||
| datefmt = %H:%M:%S |  | ||||||
| @@ -1,96 +0,0 @@ | |||||||
| from __future__ import with_statement |  | ||||||
|  |  | ||||||
| import logging |  | ||||||
| from logging.config import fileConfig |  | ||||||
|  |  | ||||||
| from sqlalchemy import engine_from_config |  | ||||||
| from sqlalchemy import pool |  | ||||||
|  |  | ||||||
| from alembic import context |  | ||||||
|  |  | ||||||
| # this is the Alembic Config object, which provides |  | ||||||
| # access to the values within the .ini file in use. |  | ||||||
| config = context.config |  | ||||||
|  |  | ||||||
| # Interpret the config file for Python logging. |  | ||||||
| # This line sets up loggers basically. |  | ||||||
| fileConfig(config.config_file_name) |  | ||||||
| logger = logging.getLogger('alembic.env') |  | ||||||
|  |  | ||||||
| # add your model's MetaData object here |  | ||||||
| # for 'autogenerate' support |  | ||||||
| # from myapp import mymodel |  | ||||||
| # target_metadata = mymodel.Base.metadata |  | ||||||
| from flask import current_app |  | ||||||
| config.set_main_option( |  | ||||||
|     'sqlalchemy.url', current_app.config.get( |  | ||||||
|         'SQLALCHEMY_DATABASE_URI').replace('%', '%%')) |  | ||||||
| target_metadata = current_app.extensions['migrate'].db.metadata |  | ||||||
|  |  | ||||||
| # other values from the config, defined by the needs of env.py, |  | ||||||
| # can be acquired: |  | ||||||
| # my_important_option = config.get_main_option("my_important_option") |  | ||||||
| # ... etc. |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def run_migrations_offline(): |  | ||||||
|     """Run migrations in 'offline' mode. |  | ||||||
|  |  | ||||||
|     This configures the context with just a URL |  | ||||||
|     and not an Engine, though an Engine is acceptable |  | ||||||
|     here as well.  By skipping the Engine creation |  | ||||||
|     we don't even need a DBAPI to be available. |  | ||||||
|  |  | ||||||
|     Calls to context.execute() here emit the given string to the |  | ||||||
|     script output. |  | ||||||
|  |  | ||||||
|     """ |  | ||||||
|     url = config.get_main_option("sqlalchemy.url") |  | ||||||
|     context.configure( |  | ||||||
|         url=url, target_metadata=target_metadata, literal_binds=True |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     with context.begin_transaction(): |  | ||||||
|         context.run_migrations() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def run_migrations_online(): |  | ||||||
|     """Run migrations in 'online' mode. |  | ||||||
|  |  | ||||||
|     In this scenario we need to create an Engine |  | ||||||
|     and associate a connection with the context. |  | ||||||
|  |  | ||||||
|     """ |  | ||||||
|  |  | ||||||
|     # this callback is used to prevent an auto-migration from being generated |  | ||||||
|     # when there are no changes to the schema |  | ||||||
|     # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html |  | ||||||
|     def process_revision_directives(context, revision, directives): |  | ||||||
|         if getattr(config.cmd_opts, 'autogenerate', False): |  | ||||||
|             script = directives[0] |  | ||||||
|             if script.upgrade_ops.is_empty(): |  | ||||||
|                 directives[:] = [] |  | ||||||
|                 logger.info('No changes in schema detected.') |  | ||||||
|  |  | ||||||
|     connectable = engine_from_config( |  | ||||||
|         config.get_section(config.config_ini_section), |  | ||||||
|         prefix='sqlalchemy.', |  | ||||||
|         poolclass=pool.NullPool, |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     with connectable.connect() as connection: |  | ||||||
|         context.configure( |  | ||||||
|             connection=connection, |  | ||||||
|             target_metadata=target_metadata, |  | ||||||
|             process_revision_directives=process_revision_directives, |  | ||||||
|             **current_app.extensions['migrate'].configure_args |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         with context.begin_transaction(): |  | ||||||
|             context.run_migrations() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| if context.is_offline_mode(): |  | ||||||
|     run_migrations_offline() |  | ||||||
| else: |  | ||||||
|     run_migrations_online() |  | ||||||
| @@ -1,24 +0,0 @@ | |||||||
| """${message} |  | ||||||
|  |  | ||||||
| Revision ID: ${up_revision} |  | ||||||
| Revises: ${down_revision | comma,n} |  | ||||||
| Create Date: ${create_date} |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| from alembic import op |  | ||||||
| import sqlalchemy as sa |  | ||||||
| ${imports if imports else ""} |  | ||||||
|  |  | ||||||
| # revision identifiers, used by Alembic. |  | ||||||
| revision = ${repr(up_revision)} |  | ||||||
| down_revision = ${repr(down_revision)} |  | ||||||
| branch_labels = ${repr(branch_labels)} |  | ||||||
| depends_on = ${repr(depends_on)} |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def upgrade(): |  | ||||||
|     ${upgrades if upgrades else "pass"} |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def downgrade(): |  | ||||||
|     ${downgrades if downgrades else "pass"} |  | ||||||
| @@ -1,80 +0,0 @@ | |||||||
| """initial migration |  | ||||||
|  |  | ||||||
| Revision ID: 685dff1cc01b |  | ||||||
| Revises:  |  | ||||||
| Create Date: 2019-09-13 07:31:57.149510 |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| from alembic import op |  | ||||||
| import sqlalchemy as sa |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # revision identifiers, used by Alembic. |  | ||||||
| revision = '685dff1cc01b' |  | ||||||
| down_revision = None |  | ||||||
| branch_labels = None |  | ||||||
| depends_on = None |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def upgrade(): |  | ||||||
|     # ### commands auto generated by Alembic - please adjust! ### |  | ||||||
|     op.create_table('roles', |  | ||||||
|     sa.Column('id', sa.Integer(), nullable=False), |  | ||||||
|     sa.Column('default', sa.Boolean(), nullable=True), |  | ||||||
|     sa.Column('name', sa.String(length=64), nullable=True), |  | ||||||
|     sa.Column('permissions', sa.Integer(), nullable=True), |  | ||||||
|     sa.PrimaryKeyConstraint('id'), |  | ||||||
|     sa.UniqueConstraint('name') |  | ||||||
|     ) |  | ||||||
|     op.create_index(op.f('ix_roles_default'), 'roles', ['default'], unique=False) |  | ||||||
|     op.create_table('users', |  | ||||||
|     sa.Column('id', sa.Integer(), nullable=False), |  | ||||||
|     sa.Column('confirmed', sa.Boolean(), nullable=True), |  | ||||||
|     sa.Column('email', sa.String(length=254), nullable=True), |  | ||||||
|     sa.Column('password_hash', sa.String(length=128), nullable=True), |  | ||||||
|     sa.Column('registration_date', sa.DateTime(), nullable=True), |  | ||||||
|     sa.Column('role_id', sa.Integer(), nullable=True), |  | ||||||
|     sa.Column('username', sa.String(length=64), nullable=True), |  | ||||||
|     sa.ForeignKeyConstraint(['role_id'], ['roles.id'], ), |  | ||||||
|     sa.PrimaryKeyConstraint('id') |  | ||||||
|     ) |  | ||||||
|     op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True) |  | ||||||
|     op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) |  | ||||||
|     op.create_table('corpora', |  | ||||||
|     sa.Column('id', sa.Integer(), nullable=False), |  | ||||||
|     sa.Column('creation_date', sa.DateTime(), nullable=True), |  | ||||||
|     sa.Column('description', sa.String(length=255), nullable=True), |  | ||||||
|     sa.Column('title', sa.String(length=32), nullable=True), |  | ||||||
|     sa.Column('user_id', sa.Integer(), nullable=True), |  | ||||||
|     sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), |  | ||||||
|     sa.PrimaryKeyConstraint('id') |  | ||||||
|     ) |  | ||||||
|     op.create_table('jobs', |  | ||||||
|     sa.Column('id', sa.Integer(), nullable=False), |  | ||||||
|     sa.Column('creation_date', sa.DateTime(), nullable=True), |  | ||||||
|     sa.Column('description', sa.String(length=255), nullable=True), |  | ||||||
|     sa.Column('end_date', sa.DateTime(), nullable=True), |  | ||||||
|     sa.Column('mem_mb', sa.Integer(), nullable=True), |  | ||||||
|     sa.Column('n_cores', sa.Integer(), nullable=True), |  | ||||||
|     sa.Column('service', sa.String(length=64), nullable=True), |  | ||||||
|     sa.Column('service_args', sa.String(length=255), nullable=True), |  | ||||||
|     sa.Column('service_version', sa.String(length=16), nullable=True), |  | ||||||
|     sa.Column('status', sa.String(length=16), nullable=True), |  | ||||||
|     sa.Column('title', sa.String(length=32), nullable=True), |  | ||||||
|     sa.Column('user_id', sa.Integer(), nullable=True), |  | ||||||
|     sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), |  | ||||||
|     sa.PrimaryKeyConstraint('id') |  | ||||||
|     ) |  | ||||||
|     # ### end Alembic commands ### |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def downgrade(): |  | ||||||
|     # ### commands auto generated by Alembic - please adjust! ### |  | ||||||
|     op.drop_table('jobs') |  | ||||||
|     op.drop_table('corpora') |  | ||||||
|     op.drop_index(op.f('ix_users_username'), table_name='users') |  | ||||||
|     op.drop_index(op.f('ix_users_email'), table_name='users') |  | ||||||
|     op.drop_table('users') |  | ||||||
|     op.drop_index(op.f('ix_roles_default'), table_name='roles') |  | ||||||
|     op.drop_table('roles') |  | ||||||
|     # ### end Alembic commands ### |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| """empty message |  | ||||||
|  |  | ||||||
| Revision ID: f16b80c57038 |  | ||||||
| Revises: 685dff1cc01b |  | ||||||
| Create Date: 2019-10-09 09:34:37.616747 |  | ||||||
|  |  | ||||||
| """ |  | ||||||
| from alembic import op |  | ||||||
| import sqlalchemy as sa |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # revision identifiers, used by Alembic. |  | ||||||
| revision = 'f16b80c57038' |  | ||||||
| down_revision = '685dff1cc01b' |  | ||||||
| branch_labels = None |  | ||||||
| depends_on = None |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def upgrade(): |  | ||||||
|     # ### commands auto generated by Alembic - please adjust! ### |  | ||||||
|     op.add_column('users', sa.Column('is_dark', sa.Boolean(), nullable=True)) |  | ||||||
|     # ### end Alembic commands ### |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def downgrade(): |  | ||||||
|     # ### commands auto generated by Alembic - please adjust! ### |  | ||||||
|     op.drop_column('users', 'is_dark') |  | ||||||
|     # ### end Alembic commands ### |  | ||||||
		Reference in New Issue
	
	Block a user