mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-10-31 02:32:45 +00:00 
			
		
		
		
	Merge branch 'development' of gitlab.ub.uni-bielefeld.de:sfb1288inf/nopaque into development
share toggle update in contributions
This commit is contained in:
		| @@ -6,7 +6,6 @@ from app.decorators import admin_required | ||||
| from app.models import Role, User, UserSettingJobStatusMailNotificationLevel | ||||
| from app.settings.forms import ( | ||||
|     EditGeneralSettingsForm, | ||||
|     EditInterfaceSettingsForm, | ||||
|     EditNotificationSettingsForm | ||||
| ) | ||||
| from . import bp | ||||
| @@ -55,9 +54,6 @@ def edit_user(user_id): | ||||
|         user, | ||||
|         prefix='edit-general-settings-form' | ||||
|     ) | ||||
|     edit_interface_settings_form = EditInterfaceSettingsForm( | ||||
|         prefix='edit-interface-settings-form' | ||||
|     ) | ||||
|     edit_notification_settings_form = EditNotificationSettingsForm( | ||||
|         prefix='edit-notification-settings-form' | ||||
|     ) | ||||
| @@ -76,12 +72,6 @@ def edit_user(user_id): | ||||
|         db.session.commit() | ||||
|         flash('Your changes have been saved') | ||||
|         return redirect(url_for('.edit_user', user_id=user.id)) | ||||
|     if (edit_interface_settings_form.submit.data | ||||
|             and edit_interface_settings_form.validate()): | ||||
|         user.setting_dark_mode = edit_interface_settings_form.dark_mode.data | ||||
|         db.session.commit() | ||||
|         flash('Your changes have been saved') | ||||
|         return redirect(url_for('.edit_user', user_id=user.id)) | ||||
|     if (edit_notification_settings_form.submit.data | ||||
|             and edit_notification_settings_form.validate()): | ||||
|         user.setting_job_status_mail_notification_level = \ | ||||
| @@ -93,13 +83,11 @@ def edit_user(user_id): | ||||
|         return redirect(url_for('.edit_user', user_id=user.id)) | ||||
|     admin_edit_user_form.prefill(user) | ||||
|     edit_general_settings_form.prefill(user) | ||||
|     edit_interface_settings_form.prefill(user) | ||||
|     edit_notification_settings_form.prefill(user) | ||||
|     return render_template( | ||||
|         'admin/edit_user.html.j2', | ||||
|         admin_edit_user_form=admin_edit_user_form, | ||||
|         edit_general_settings_form=edit_general_settings_form, | ||||
|         edit_interface_settings_form=edit_interface_settings_form, | ||||
|         edit_notification_settings_form=edit_notification_settings_form, | ||||
|         title='Edit user', | ||||
|         user=user | ||||
|   | ||||
| @@ -150,7 +150,6 @@ class UserSchema(ma.SQLAlchemySchema): | ||||
|     last_seen = ma.auto_field(dump_only=True) | ||||
|     password = ma.String(load_only=True) | ||||
|     last_seen = ma.auto_field(dump_only=True) | ||||
|     setting_dark_mode = ma.auto_field() | ||||
|     setting_job_status_mail_notification_level = ma.String( | ||||
|         validate=validate.OneOf(list(UserSettingJobStatusMailNotificationLevel.__members__.keys())) | ||||
|     ) | ||||
|   | ||||
| @@ -13,7 +13,7 @@ from wtforms.validators import InputRequired, Length | ||||
| from app.services import SERVICES | ||||
|  | ||||
|  | ||||
| class CreateContributionBaseForm(FlaskForm): | ||||
| class ContributionBaseForm(FlaskForm): | ||||
|     title = StringField( | ||||
|         'Title', | ||||
|         validators=[InputRequired(), Length(max=64)] | ||||
| @@ -48,7 +48,7 @@ class CreateContributionBaseForm(FlaskForm): | ||||
|     submit = SubmitField() | ||||
|  | ||||
|  | ||||
| class CreateTesseractOCRPipelineModelForm(CreateContributionBaseForm): | ||||
| class CreateTesseractOCRPipelineModelForm(ContributionBaseForm): | ||||
|     tesseract_model_file = FileField( | ||||
|         'File', | ||||
|         validators=[FileRequired()] | ||||
| @@ -72,7 +72,7 @@ class CreateTesseractOCRPipelineModelForm(CreateContributionBaseForm): | ||||
|         self.compatible_service_versions.default = '' | ||||
|  | ||||
|  | ||||
| class CreateSpaCyNLPPipelineModelForm(CreateContributionBaseForm): | ||||
| class CreateSpaCyNLPPipelineModelForm(ContributionBaseForm): | ||||
|     spacy_model_file = FileField( | ||||
|         'File', | ||||
|         validators=[FileRequired()] | ||||
| @@ -100,17 +100,8 @@ class CreateSpaCyNLPPipelineModelForm(CreateContributionBaseForm): | ||||
|         self.compatible_service_versions.default = '' | ||||
|  | ||||
|  | ||||
| class EditContributionBaseForm(CreateContributionBaseForm): | ||||
|     def prefill(self, model_file): | ||||
|         ''' Pre-fill the form with data of an exististing corpus file ''' | ||||
|         self.title.data = model_file.title | ||||
|         self.description.data = model_file.description | ||||
|         self.publisher.data = model_file.publisher | ||||
|         self.publishing_year.data = model_file.publishing_year | ||||
|         self.publisher_url.data = model_file.publisher_url | ||||
|         self.publishing_url.data = model_file.publishing_url | ||||
|         self.version.data = model_file.version | ||||
|         self.shared.data = model_file.shared | ||||
| class EditContributionBaseForm(ContributionBaseForm): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class EditTesseractOCRPipelineModelForm(EditContributionBaseForm): | ||||
| @@ -122,7 +113,3 @@ class EditSpaCyNLPPipelineModelForm(EditContributionBaseForm): | ||||
|         'Pipeline name', | ||||
|         validators=[InputRequired(), Length(max=64)] | ||||
|     ) | ||||
|  | ||||
|     def prefill(self, model_file): | ||||
|         super().prefill(model_file) | ||||
|         self.pipeline_name.data = model_file.pipeline_name | ||||
|   | ||||
| @@ -1,4 +1,12 @@ | ||||
| from flask import abort, current_app, flash, Markup, render_template, url_for | ||||
| from flask import ( | ||||
|     abort, | ||||
|     current_app, | ||||
|     flash, | ||||
|     Markup, | ||||
|     redirect, | ||||
|     render_template, | ||||
|     url_for | ||||
| ) | ||||
| from flask_login import login_required, current_user | ||||
| from threading import Thread | ||||
| from app import db | ||||
| @@ -43,33 +51,17 @@ def tesseract_ocr_pipeline_models(): | ||||
| @bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['GET', 'POST']) | ||||
| def tesseract_ocr_pipeline_model(tesseract_ocr_pipeline_model_id): | ||||
|     tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id) | ||||
|     form = EditTesseractOCRPipelineModelForm(prefix='edit-tesseract-ocr-pipeline-model-form') | ||||
|     form = EditTesseractOCRPipelineModelForm( | ||||
|         obj=tesseract_ocr_pipeline_model, | ||||
|         prefix='edit-tesseract-ocr-pipeline-model-form' | ||||
|     ) | ||||
|     if form.validate_on_submit(): | ||||
|         if tesseract_ocr_pipeline_model.title != form.title.data: | ||||
|             tesseract_ocr_pipeline_model.title = form.title.data | ||||
|         if tesseract_ocr_pipeline_model.description != form.description.data: | ||||
|             tesseract_ocr_pipeline_model.description = form.description.data | ||||
|         if tesseract_ocr_pipeline_model.publisher != form.publisher.data: | ||||
|             tesseract_ocr_pipeline_model.publisher = form.publisher.data | ||||
|         if tesseract_ocr_pipeline_model.publishing_year != form.publishing_year.data: | ||||
|             tesseract_ocr_pipeline_model.publishing_year = form.publishing_year.data | ||||
|         if tesseract_ocr_pipeline_model.publisher_url != form.publisher_url.data: | ||||
|             tesseract_ocr_pipeline_model.publisher_url = form.publisher_url.data | ||||
|         if tesseract_ocr_pipeline_model.publishing_url != form.publishing_url.data: | ||||
|             tesseract_ocr_pipeline_model.publishing_url = form.publishing_url.data | ||||
|         if tesseract_ocr_pipeline_model.version != form.version.data: | ||||
|             tesseract_ocr_pipeline_model.version = form.version.data | ||||
|         if tesseract_ocr_pipeline_model.shared != form.shared.data: | ||||
|             tesseract_ocr_pipeline_model.shared = form.shared.data | ||||
|         db.session.commit() | ||||
|         tesseract_ocr_pipeline_model_url = url_for( | ||||
|             '.tesseract_ocr_pipeline_model', | ||||
|             tesseract_ocr_pipeline_model_id=tesseract_ocr_pipeline_model.id | ||||
|         ) | ||||
|         message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model_url}">{tesseract_ocr_pipeline_model.title}</a>" updated') | ||||
|         flash(message) | ||||
|         return {}, 201, {'Location': tesseract_ocr_pipeline_model_url} | ||||
|     form.prefill(tesseract_ocr_pipeline_model) | ||||
|         form.populate_obj(tesseract_ocr_pipeline_model) | ||||
|         if db.session.is_modified(tesseract_ocr_pipeline_model): | ||||
|             message = Markup(f'Tesseract OCR Pipeline model "<a href="{tesseract_ocr_pipeline_model.url}">{tesseract_ocr_pipeline_model.title}</a>" updated') | ||||
|             flash(message) | ||||
|             db.session.commit() | ||||
|         return redirect(url_for('.tesseract_ocr_pipeline_models')) | ||||
|     return render_template( | ||||
|         'contributions/tesseract_ocr_pipeline_model.html.j2', | ||||
|         form=form, | ||||
| @@ -155,36 +147,17 @@ def spacy_nlp_pipeline_models(): | ||||
| @bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>', methods=['GET', 'POST']) | ||||
| def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id): | ||||
|     spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id) | ||||
|     form = EditSpaCyNLPPipelineModelForm(prefix='edit-spacy-nlp-pipeline-model-form') | ||||
|     form = EditSpaCyNLPPipelineModelForm( | ||||
|         obj=spacy_nlp_pipeline_model, | ||||
|         prefix='edit-spacy-nlp-pipeline-model-form' | ||||
|     ) | ||||
|     if form.validate_on_submit(): | ||||
|         if spacy_nlp_pipeline_model.title != form.title.data: | ||||
|             spacy_nlp_pipeline_model.title = form.title.data | ||||
|         if spacy_nlp_pipeline_model.description != form.description.data: | ||||
|             spacy_nlp_pipeline_model.description = form.description.data | ||||
|         if spacy_nlp_pipeline_model.pipeline_name != form.pipeline_name.data: | ||||
|             spacy_nlp_pipeline_model.pipeline_name = form.pipeline_name.data | ||||
|         if spacy_nlp_pipeline_model.publisher != form.publisher.data: | ||||
|             spacy_nlp_pipeline_model.publisher = form.publisher.data | ||||
|         if spacy_nlp_pipeline_model.publishing_year != form.publishing_year.data: | ||||
|             spacy_nlp_pipeline_model.publishing_year = form.publishing_year.data | ||||
|         if spacy_nlp_pipeline_model.publisher_url != form.publisher_url.data: | ||||
|             spacy_nlp_pipeline_model.publisher_url = form.publisher_url.data | ||||
|         if spacy_nlp_pipeline_model.publishing_url != form.publishing_url.data: | ||||
|             spacy_nlp_pipeline_model.publishing_url = form.publishing_url.data | ||||
|         if spacy_nlp_pipeline_model.version != form.version.data: | ||||
|             spacy_nlp_pipeline_model.version = form.version.data | ||||
|         if spacy_nlp_pipeline_model.shared != form.shared.data: | ||||
|             spacy_nlp_pipeline_model.shared = form.shared.data | ||||
|         current_app.logger.warning(db.session.dirty) | ||||
|         db.session.commit() | ||||
|         spacy_nlp_pipeline_model_url = url_for( | ||||
|             '.spacy_nlp_pipeline_model', | ||||
|             spacy_nlp_pipeline_model_id=spacy_nlp_pipeline_model.id | ||||
|         ) | ||||
|         message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model_url}">{spacy_nlp_pipeline_model.title}</a>" updated') | ||||
|         flash(message) | ||||
|         return {}, 201, {'Location': url_for('.contributions')} | ||||
|     form.prefill(spacy_nlp_pipeline_model) | ||||
|         form.populate_obj(spacy_nlp_pipeline_model) | ||||
|         if db.session.is_modified(spacy_nlp_pipeline_model): | ||||
|             message = Markup(f'SpaCy NLP Pipeline model "<a href="{spacy_nlp_pipeline_model.url}">{spacy_nlp_pipeline_model.title}</a>" updated') | ||||
|             flash(message) | ||||
|             db.session.commit() | ||||
|         return redirect(url_for('.spacy_nlp_pipeline_models')) | ||||
|     return render_template( | ||||
|         'contributions/spacy_nlp_pipeline_model.html.j2', | ||||
|         form=form, | ||||
|   | ||||
| @@ -47,20 +47,7 @@ class CreateCorpusFileForm(CorpusFileBaseForm): | ||||
|  | ||||
|  | ||||
| class EditCorpusFileForm(CorpusFileBaseForm): | ||||
|     def prefill(self, corpus_file): | ||||
|         ''' Pre-fill the form with data of an exististing corpus file ''' | ||||
|         self.address.data = corpus_file.address | ||||
|         self.author.data = corpus_file.author | ||||
|         self.booktitle.data = corpus_file.booktitle | ||||
|         self.chapter.data = corpus_file.chapter | ||||
|         self.editor.data = corpus_file.editor | ||||
|         self.institution.data = corpus_file.institution | ||||
|         self.journal.data = corpus_file.journal | ||||
|         self.pages.data = corpus_file.pages | ||||
|         self.publisher.data = corpus_file.publisher | ||||
|         self.publishing_year.data = corpus_file.publishing_year | ||||
|         self.school.data = corpus_file.school | ||||
|         self.title.data = corpus_file.title | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class ImportCorpusForm(FlaskForm): | ||||
|   | ||||
| @@ -176,52 +176,15 @@ def corpus_file(corpus_id, corpus_file_id): | ||||
|         abort(404) | ||||
|     if not (corpus_file.corpus.user == current_user or current_user.is_administrator()): | ||||
|         abort(403) | ||||
|     form = EditCorpusFileForm(prefix='edit-corpus-file-form') | ||||
|     form = EditCorpusFileForm(obj=corpus_file, prefix='edit-corpus-file-form') | ||||
|     if form.validate_on_submit(): | ||||
|         has_changes = False | ||||
|         if corpus_file.address != form.address.data: | ||||
|             corpus_file.address = form.address.data | ||||
|             has_changes = True | ||||
|         if corpus_file.author != form.author.data: | ||||
|             corpus_file.author = form.author.data | ||||
|             has_changes = True | ||||
|         if corpus_file.booktitle != form.booktitle.data: | ||||
|             corpus_file.booktitle = form.booktitle.data | ||||
|             has_changes = True | ||||
|         if corpus_file.chapter != form.chapter.data: | ||||
|             corpus_file.chapter = form.chapter.data | ||||
|             has_changes = True | ||||
|         if corpus_file.editor != form.editor.data: | ||||
|             corpus_file.editor = form.editor.data | ||||
|             has_changes = True | ||||
|         if corpus_file.institution != form.institution.data: | ||||
|             corpus_file.institution = form.institution.data | ||||
|             has_changes = True | ||||
|         if corpus_file.journal != form.journal.data: | ||||
|             corpus_file.journal = form.journal.data | ||||
|             has_changes = True | ||||
|         if corpus_file.pages != form.pages.data: | ||||
|             corpus_file.pages = form.pages.data | ||||
|             has_changes = True | ||||
|         if corpus_file.publisher != form.publisher.data: | ||||
|             corpus_file.publisher = form.publisher.data | ||||
|             has_changes = True | ||||
|         if corpus_file.publishing_year != form.publishing_year.data: | ||||
|             corpus_file.publishing_year = form.publishing_year.data | ||||
|             has_changes = True | ||||
|         if corpus_file.school != form.school.data: | ||||
|             corpus_file.school = form.school.data | ||||
|             has_changes = True | ||||
|         if corpus_file.title != form.title.data: | ||||
|             corpus_file.title = form.title.data | ||||
|             has_changes = True | ||||
|         if has_changes: | ||||
|         form.populate_obj(corpus_file) | ||||
|         if db.session.is_modified(corpus_file): | ||||
|             corpus_file.corpus.status = CorpusStatus.UNPREPARED | ||||
|         db.session.commit() | ||||
|         message = Markup(f'Corpus file "<a href="{corpus_file.url}">{corpus_file.filename}</a>" updated') | ||||
|         flash(message, category='corpus') | ||||
|             db.session.commit() | ||||
|             message = Markup(f'Corpus file "<a href="{corpus_file.url}">{corpus_file.filename}</a>" updated') | ||||
|             flash(message, category='corpus') | ||||
|         return redirect(corpus_file.corpus.url) | ||||
|     form.prefill(corpus_file) | ||||
|     return render_template( | ||||
|         'corpora/corpus_file.html.j2', | ||||
|         corpus=corpus_file.corpus, | ||||
|   | ||||
| @@ -263,7 +263,6 @@ class User(HashidMixin, UserMixin, db.Model): | ||||
|     password_hash = db.Column(db.String(128)) | ||||
|     confirmed = db.Column(db.Boolean, default=False) | ||||
|     member_since = db.Column(db.DateTime(), default=datetime.utcnow) | ||||
|     setting_dark_mode = db.Column(db.Boolean, default=False) | ||||
|     setting_job_status_mail_notification_level = db.Column( | ||||
|         IntEnumColumn(UserSettingJobStatusMailNotificationLevel), | ||||
|         default=UserSettingJobStatusMailNotificationLevel.END | ||||
| @@ -500,7 +499,6 @@ class User(HashidMixin, UserMixin, db.Model): | ||||
|             'member_since': f'{self.member_since.isoformat()}Z', | ||||
|             'username': self.username, | ||||
|             'settings': { | ||||
|                 'dark_mode': self.setting_dark_mode, | ||||
|                 'job_status_mail_notification_level': \ | ||||
|                     self.setting_job_status_mail_notification_level.name | ||||
|             } | ||||
| @@ -552,6 +550,13 @@ class TesseractOCRPipelineModel(FileMixin, HashidMixin, db.Model): | ||||
|             str(self.id) | ||||
|         ) | ||||
|  | ||||
|     @property | ||||
|     def url(self): | ||||
|         return url_for( | ||||
|             'contributions.tesseract_ocr_pipeline_model', | ||||
|             tesseract_ocr_pipeline_model_id=self.id | ||||
|         ) | ||||
|  | ||||
|     @staticmethod | ||||
|     def insert_defaults(): | ||||
|         nopaque_user = User.query.filter_by(username='nopaque').first() | ||||
| @@ -660,6 +665,13 @@ class SpaCyNLPPipelineModel(FileMixin, HashidMixin, db.Model): | ||||
|             str(self.id) | ||||
|         ) | ||||
|  | ||||
|     @property | ||||
|     def url(self): | ||||
|         return url_for( | ||||
|             'contributions.spacy_nlp_pipeline_model', | ||||
|             spacy_nlp_pipeline_model_id=self.id | ||||
|         ) | ||||
|  | ||||
|     @staticmethod | ||||
|     def insert_defaults(): | ||||
|         nopaque_user = User.query.filter_by(username='nopaque').first() | ||||
|   | ||||
| @@ -1,58 +0,0 @@ | ||||
| class QueryResult(FileMixin, HashidMixin, db.Model): | ||||
|     __tablename__ = 'query_results' | ||||
|     # Primary key | ||||
|     id = db.Column(db.Integer, primary_key=True) | ||||
|     # Foreign keys | ||||
|     user_id = db.Column(db.Integer, db.ForeignKey('users.id')) | ||||
|     # Fields | ||||
|     description = db.Column(db.String(255)) | ||||
|     query_metadata = db.Column(db.JSON()) | ||||
|     title = db.Column(db.String(32)) | ||||
|     # Backrefs: user: User | ||||
|  | ||||
|     def __repr__(self): | ||||
|         ''' | ||||
|         String representation of the QueryResult. For human readability. | ||||
|         ''' | ||||
|         return f'<QueryResult {self.title}>' | ||||
|  | ||||
|     @property | ||||
|     def download_url(self): | ||||
|         return url_for( | ||||
|             'corpora.download_query_result', query_result_id=self.id) | ||||
|  | ||||
|     @property | ||||
|     def jsonpatch_path(self): | ||||
|         return f'{self.user.jsonpatch_path}/query_results/{self.hashid}' | ||||
|  | ||||
|     @property | ||||
|     def path(self): | ||||
|         return os.path.join( | ||||
|             self.user.path, 'query_results', str(self.id), self.filename) | ||||
|  | ||||
|     @property | ||||
|     def url(self): | ||||
|         return url_for('corpora.query_result', query_result_id=self.id) | ||||
|  | ||||
|     @property | ||||
|     def user_hashid(self): | ||||
|         return self.user.hashid | ||||
|  | ||||
|     def delete(self): | ||||
|         shutil.rmtree(self.path, ignore_errors=True) | ||||
|         db.session.delete(self) | ||||
|  | ||||
|     def to_json(self, backrefs=False, relationships=False): | ||||
|         _json = { | ||||
|             'id': self.hashid, | ||||
|             'corpus_title': self.query_metadata['corpus_name'], | ||||
|             'description': self.description, | ||||
|             'filename': self.filename, | ||||
|             'query': self.query_metadata['query'], | ||||
|             'query_metadata': self.query_metadata, | ||||
|             'title': self.title, | ||||
|             **self.file_mixin_to_json( | ||||
|                 backrefs=backrefs, relationships=relationships) | ||||
|         } | ||||
|         if backrefs: | ||||
|             _json['user'] = self.user.to_json(backrefs=True, relationships=False) | ||||
| @@ -72,11 +72,9 @@ class CreateTesseractOCRPipelineJobForm(CreateJobBaseForm): | ||||
|         self.ocropus_nlbin_threshold.render_kw['disabled'] = True | ||||
|         if 'methods' in service_info: | ||||
|             if 'binarization' in service_info['methods']: | ||||
|                 if 'disabled' in self.binarization.render_kw: | ||||
|                     del self.binarization.render_kw['disabled'] | ||||
|                 del self.binarization.render_kw['disabled'] | ||||
|             if 'ocropus_nlbin_threshold' in service_info['methods']: | ||||
|                 if 'disabled' in self.ocropus_nlbin_threshold.render_kw: | ||||
|                     del self.ocropus_nlbin_threshold.render_kw['disabled'] | ||||
|                 del self.ocropus_nlbin_threshold.render_kw['disabled'] | ||||
|         models = [ | ||||
|             x for x in TesseractOCRPipelineModel.query.order_by(TesseractOCRPipelineModel.title).all() | ||||
|             if version in x.compatible_service_versions and (x.shared == True or x.user == current_user) | ||||
| @@ -118,8 +116,7 @@ class CreateTranskribusHTRPipelineJobForm(CreateJobBaseForm): | ||||
|         self.binarization.render_kw['disabled'] = True | ||||
|         if 'methods' in service_info: | ||||
|             if 'binarization' in service_info['methods']: | ||||
|                 if 'disabled' in self.binarization.render_kw: | ||||
|                     del self.binarization.render_kw['disabled'] | ||||
|                 del self.binarization.render_kw['disabled'] | ||||
|         self.model.choices = [('', 'Choose your option')] | ||||
|         self.model.choices += [(x['modelId'], x['name']) for x in transkribus_htr_pipeline_models] | ||||
|         self.model.default = '' | ||||
| @@ -157,8 +154,7 @@ class CreateSpacyNLPPipelineJobForm(CreateJobBaseForm): | ||||
|         self.encoding_detection.render_kw['disabled'] = True | ||||
|         if 'methods' in service_info: | ||||
|             if 'encoding_detection' in service_info['methods']: | ||||
|                 if 'disabled' in self.encoding_detection.render_kw: | ||||
|                     del self.encoding_detection.render_kw['disabled'] | ||||
|                 del self.encoding_detection.render_kw['disabled'] | ||||
|         models = [ | ||||
|             x for x in SpaCyNLPPipelineModel.query.order_by(SpaCyNLPPipelineModel.title).all() | ||||
|             if version in x.compatible_service_versions and (x.shared == True or x.user == current_user) | ||||
|   | ||||
| @@ -71,10 +71,6 @@ class EditGeneralSettingsForm(FlaskForm): | ||||
|         super().__init__(*args, **kwargs) | ||||
|         self.user = user | ||||
|  | ||||
|     def prefill(self, user): | ||||
|         self.email.data = user.email | ||||
|         self.username.data = user.username | ||||
|  | ||||
|     def validate_email(self, field): | ||||
|         if (field.data != self.user.email | ||||
|                 and User.query.filter_by(email=field.data).first()): | ||||
| @@ -86,13 +82,6 @@ class EditGeneralSettingsForm(FlaskForm): | ||||
|             raise ValidationError('Username already in use') | ||||
|  | ||||
|  | ||||
| class EditInterfaceSettingsForm(FlaskForm): | ||||
|     dark_mode = BooleanField('Dark mode') | ||||
|     submit = SubmitField() | ||||
|  | ||||
|     def prefill(self, user): | ||||
|         self.dark_mode.data = user.setting_dark_mode | ||||
|  | ||||
| class EditNotificationSettingsForm(FlaskForm): | ||||
|     job_status_mail_notification_level = SelectField( | ||||
|         'Job status mail notification level', | ||||
|   | ||||
| @@ -6,7 +6,6 @@ from . import bp | ||||
| from .forms import ( | ||||
|     ChangePasswordForm, | ||||
|     EditGeneralSettingsForm, | ||||
|     EditInterfaceSettingsForm, | ||||
|     EditNotificationSettingsForm | ||||
| ) | ||||
|  | ||||
| @@ -20,11 +19,9 @@ def settings(): | ||||
|     ) | ||||
|     edit_general_settings_form = EditGeneralSettingsForm( | ||||
|         current_user, | ||||
|         obj=current_user, | ||||
|         prefix='edit-general-settings-form' | ||||
|     ) | ||||
|     edit_interface_settings_form = EditInterfaceSettingsForm( | ||||
|         prefix='edit-interface-settings-form' | ||||
|     ) | ||||
|     edit_notification_settings_form = EditNotificationSettingsForm( | ||||
|         prefix='edit-notification-settings-form' | ||||
|     ) | ||||
| @@ -41,13 +38,6 @@ def settings(): | ||||
|         db.session.commit() | ||||
|         flash('Your changes have been saved') | ||||
|         return redirect(url_for('.settings')) | ||||
|     if (edit_interface_settings_form.submit.data | ||||
|             and edit_interface_settings_form.validate()): | ||||
|         current_user.setting_dark_mode = ( | ||||
|             edit_interface_settings_form.dark_mode.data) | ||||
|         db.session.commit() | ||||
|         flash('Your changes have been saved') | ||||
|         return redirect(url_for('.settings')) | ||||
|     if (edit_notification_settings_form.submit.data | ||||
|             and edit_notification_settings_form.validate()): | ||||
|         current_user.setting_job_status_mail_notification_level = ( | ||||
| @@ -58,14 +48,11 @@ def settings(): | ||||
|         db.session.commit() | ||||
|         flash('Your changes have been saved') | ||||
|         return redirect(url_for('.settings')) | ||||
|     edit_general_settings_form.prefill(current_user) | ||||
|     edit_interface_settings_form.prefill(current_user) | ||||
|     edit_notification_settings_form.prefill(current_user) | ||||
|     return render_template( | ||||
|         'settings/settings.html.j2', | ||||
|         change_password_form=change_password_form, | ||||
|         edit_general_settings_form=edit_general_settings_form, | ||||
|         edit_interface_settings_form=edit_interface_settings_form, | ||||
|         edit_notification_settings_form=edit_notification_settings_form, | ||||
|         title='Settings' | ||||
|     ) | ||||
|   | ||||
| @@ -27,38 +27,6 @@ | ||||
|       </div> | ||||
|     </form> | ||||
|  | ||||
|     <form method="POST"> | ||||
|       {{ edit_interface_settings_form.hidden_tag() }} | ||||
|       <div class="card"> | ||||
|         <div class="card-content"> | ||||
|           <span class="card-title">Interface settings</span> | ||||
|           <div class="row"> | ||||
|             <div class="col s12"><p> </p></div> | ||||
|             <div class="col s1"> | ||||
|               <p><i class="material-icons">brightness_3</i></p> | ||||
|             </div> | ||||
|             <div class="col s8"> | ||||
|               <p>{{ edit_interface_settings_form.dark_mode.label.text }}</p> | ||||
|               <p class="light">Enable dark mode to ease your eyes.</p> | ||||
|             </div> | ||||
|             <div class="col s3 right-align"> | ||||
|               <div class="switch"> | ||||
|                 <label> | ||||
|                   {{ edit_interface_settings_form.dark_mode() }} | ||||
|                   <span class="lever"></span> | ||||
|                 </label> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="card-action"> | ||||
|           <div class="right-align"> | ||||
|             {{ wtf.render_field(edit_interface_settings_form.submit, material_icon='send') }} | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </form> | ||||
|  | ||||
|     <form method="POST"> | ||||
|       {{ edit_notification_settings_form.hidden_tag() }} | ||||
|       <div class="card"> | ||||
|   | ||||
| @@ -5,12 +5,6 @@ | ||||
| {% block head %} | ||||
| {{ super() }} | ||||
| <link href="{{ url_for('static', filename='images/nopaque_-_favicon.png') }}" rel="icon"> | ||||
| {% if current_user.setting_dark_mode %} | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/darkreader/4.9.40/darkreader.min.js" integrity="sha512-0Jbi9gWSyU5SvNS16za0aILl6l+MgM8N+TGlZxy4qPQEzqKoU9egh4h56Kz0xp2R+ZFPQMfeDn26Gh6cqu2WAg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> | ||||
| <script> | ||||
|   DarkReader.enable(); | ||||
| </script> | ||||
| {% endif %} | ||||
| {% endblock head %} | ||||
|  | ||||
| {% block metas %} | ||||
|   | ||||
| @@ -87,6 +87,7 @@ | ||||
|               <div class="col s12"> | ||||
|                 <span class="card-title">Preprocessing</span> | ||||
|               </div> | ||||
|               {% if 'disabled' not in form.encoding_detection.render_kw or not form.encoding_detection.render_kw['disabled'] %} | ||||
|               <div class="col s9"> | ||||
|                 <p>{{ form.encoding_detection.label.text }}</p> | ||||
|                 <p class="light">If the input files are not created with the nopaque OCR service or you do not know if your text files are UTF-8 encoded, check this switch. We will try to automatically determine the right encoding for your texts to process them.</p> | ||||
| @@ -99,6 +100,7 @@ | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               {% endif %} | ||||
|               <!-- | ||||
|               Seperate each setting with the following | ||||
|               <div class="col s12"><p> </p></div> | ||||
|   | ||||
| @@ -72,6 +72,7 @@ | ||||
|               <div class="col s12"> | ||||
|                 <span class="card-title">Preprocessing</span> | ||||
|               </div> | ||||
|               {% if 'disabled' not in form.binarization.render_kw or not form.binarization.render_kw['disabled'] %} | ||||
|               <div class="col s9"> | ||||
|                 <p>{{ form.binarization.label.text }}</p> | ||||
|                 <p class="light">Based on a brightness threshold pixels are converted into either black or white. It is useful to reduce noise in images. (<b>longer duration</b>)</p> | ||||
| @@ -84,56 +85,14 @@ | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div>   | ||||
|               <div class="col s9"> | ||||
|               {% if 'disabled' not in form.ocropus_nlbin_threshold.render_kw or not form.ocropus_nlbin_threshold.render_kw['disabled'] %} | ||||
|               <div class="col s9 hide" id="create-job-form-ocropus_nlbin_threshold-container"> | ||||
|                 <br> | ||||
|                 <p>Intensity (between 0 and 1)</p> | ||||
|                 <p class="range-field">{{ form.ocropus_nlbin_threshold() }}</p> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page range</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page rotation</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page split</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               {% endif %} | ||||
|               {% endif %} | ||||
|               <!-- | ||||
|               Seperate each setting with the following | ||||
|               <div class="col s12"><p> </p></div> | ||||
| @@ -185,3 +144,12 @@ | ||||
|   </div> | ||||
| </div> | ||||
| {% endblock modals %} | ||||
|  | ||||
| {% block scripts %} | ||||
| {{ super() }} | ||||
| <script> | ||||
| document.querySelector('#create-job-form-binarization').addEventListener('change', (event) => { | ||||
|   document.querySelector('#create-job-form-ocropus_nlbin_threshold-container').classList.toggle('hide'); | ||||
| }); | ||||
| </script> | ||||
| {% endblock scripts %} | ||||
|   | ||||
| @@ -76,6 +76,7 @@ | ||||
|               <div class="col s12"> | ||||
|                 <span class="card-title">Preprocessing</span> | ||||
|               </div> | ||||
|               {% if 'disabled' not in form.binarization.render_kw or not form.binarization.render_kw['disabled'] %} | ||||
|               <div class="col s9"> | ||||
|                 <p>{{ form.binarization.label.text }}</p> | ||||
|                 <p class="light">Based on a brightness threshold pixels are converted into either black or white. It is useful to reduce noise in images. (<b>longer duration</b>)</p> | ||||
| @@ -88,51 +89,7 @@ | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page range</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page rotation</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s12 divider"></div> | ||||
|               <div class="col s12"><p> </p></div> | ||||
|               <div class="col s9"> | ||||
|                 <p>Page split</p> | ||||
|                 <p class="light"></p> | ||||
|               </div> | ||||
|               <div class="col s3 right-align"> | ||||
|                 <div class="switch"> | ||||
|                   <label> | ||||
|                     <input disabled type="checkbox"> | ||||
|                     <span class="lever"></span> | ||||
|                   </label> | ||||
|                 </div> | ||||
|               </div> | ||||
|               {% endif %} | ||||
|               <!-- | ||||
|               Seperate each setting with the following | ||||
|               <div class="col s12"><p> </p></div> | ||||
|   | ||||
| @@ -27,38 +27,6 @@ | ||||
|       </div> | ||||
|     </form> | ||||
|  | ||||
|     <form method="POST"> | ||||
|       {{ edit_interface_settings_form.hidden_tag() }} | ||||
|       <div class="card"> | ||||
|         <div class="card-content"> | ||||
|           <span class="card-title">Interface settings</span> | ||||
|           <div class="row"> | ||||
|             <div class="col s12"><p> </p></div> | ||||
|             <div class="col s1"> | ||||
|               <p><i class="material-icons">brightness_3</i></p> | ||||
|             </div> | ||||
|             <div class="col s8"> | ||||
|               <p>{{ edit_interface_settings_form.dark_mode.label.text }}</p> | ||||
|               <p class="light">Enable dark mode to ease your eyes.</p> | ||||
|             </div> | ||||
|             <div class="col s3 right-align"> | ||||
|               <div class="switch"> | ||||
|                 <label> | ||||
|                   {{ edit_interface_settings_form.dark_mode() }} | ||||
|                   <span class="lever"></span> | ||||
|                 </label> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="card-action"> | ||||
|           <div class="right-align"> | ||||
|             {{ wtf.render_field(edit_interface_settings_form.submit, material_icon='send') }} | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </form> | ||||
|  | ||||
|     <form method="POST"> | ||||
|       {{ edit_notification_settings_form.hidden_tag() }} | ||||
|       <div class="card"> | ||||
|   | ||||
							
								
								
									
										26
									
								
								migrations/versions/89e9526089bf_.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								migrations/versions/89e9526089bf_.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| """Remove setting_dark_mode column from users table | ||||
|  | ||||
| Revision ID: 89e9526089bf | ||||
| Revises: 721829b5dd25 | ||||
| Create Date: 2022-11-17 09:47:27.724692 | ||||
|  | ||||
| """ | ||||
| from alembic import op | ||||
| import sqlalchemy as sa | ||||
|  | ||||
|  | ||||
| # revision identifiers, used by Alembic. | ||||
| revision = '89e9526089bf' | ||||
| down_revision = '721829b5dd25' | ||||
| branch_labels = None | ||||
| depends_on = None | ||||
|  | ||||
|  | ||||
| def upgrade(): | ||||
|     op.drop_column('users', 'setting_dark_mode') | ||||
|  | ||||
|  | ||||
| def downgrade(): | ||||
|     op.add_column('users', | ||||
|         sa.Column('setting_dark_mode', sa.Boolean(), nullable=True) | ||||
|     ) | ||||
		Reference in New Issue
	
	Block a user