diff --git a/app/models.py b/app/models.py index 8ab09e6d..38c44020 100644 --- a/app/models.py +++ b/app/models.py @@ -127,6 +127,8 @@ class IntEnumColumn(db.TypeDecorator): return value.value elif isinstance(value, int): return self.enum_type(value).value + elif isinstance(value, str): + return self.enum_type[value].value else: return TypeError() @@ -144,8 +146,7 @@ class ContainerColumn(db.TypeDecorator): def process_bind_param(self, value, dialect): if isinstance(value, self.container_type): return json.dumps(value) - elif (isinstance(value, str) - and isinstance(json.loads(value), self.container_type)): + elif isinstance(value, str) and isinstance(json.loads(value), self.container_type): return value else: return TypeError() diff --git a/app/services/routes.py b/app/services/routes.py index 24688c88..0fb4b168 100644 --- a/app/services/routes.py +++ b/app/services/routes.py @@ -125,6 +125,8 @@ def transkribus_htr_pipeline(): if r.status_code != 200: abort(500) transkribus_htr_pipeline_models = r.json()['trpModelMetadata'] + transkribus_htr_pipeline_models.append({'modelId': 48513, 'name': 'Caroline Minuscle', 'language': 'lat', 'isoLanguages': ['lat']}) + print(transkribus_htr_pipeline_models[len(transkribus_htr_pipeline_models)-1]) form = CreateTranskribusHTRPipelineJobForm( transkribus_htr_pipeline_models=transkribus_htr_pipeline_models, prefix='create-job-form', diff --git a/app/settings/forms.py b/app/settings/forms.py index 55279927..e90d9dda 100644 --- a/app/settings/forms.py +++ b/app/settings/forms.py @@ -1,24 +1,7 @@ from flask_wtf import FlaskForm -from wtforms import ( - BooleanField, - FileField, - PasswordField, - SelectField, - StringField, - SubmitField, - TextAreaField, - ValidationError -) -from wtforms.validators import ( - DataRequired, - InputRequired, - Email, - EqualTo, - Length, - Regexp -) -from app.models import User, UserSettingJobStatusMailNotificationLevel -from app.auth import USERNAME_REGEX +from wtforms import PasswordField, SelectField, SubmitField, ValidationError +from wtforms.validators import DataRequired, EqualTo +from app.models import UserSettingJobStatusMailNotificationLevel class ChangePasswordForm(FlaskForm): @@ -47,18 +30,14 @@ class ChangePasswordForm(FlaskForm): if not self.user.verify_password(field.data): raise ValidationError('Invalid password') + class EditNotificationSettingsForm(FlaskForm): job_status_mail_notification_level = SelectField( 'Job status mail notification level', - choices=[('', 'Choose your option')], + choices=[ + (x.name, x.name.capitalize()) + for x in UserSettingJobStatusMailNotificationLevel + ], validators=[DataRequired()] ) submit = SubmitField() - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.job_status_mail_notification_level.choices += [ - (x.name, x.name.capitalize()) - for x in UserSettingJobStatusMailNotificationLevel - ] - diff --git a/app/settings/routes.py b/app/settings/routes.py index 754a98cd..a07869b8 100644 --- a/app/settings/routes.py +++ b/app/settings/routes.py @@ -1,12 +1,9 @@ -from flask import abort, flash, redirect, render_template, url_for +from flask import flash, redirect, render_template, url_for from flask_login import current_user, login_required from app import db -from app.models import ProfilePrivacySettings, UserSettingJobStatusMailNotificationLevel +from app.models import UserSettingJobStatusMailNotificationLevel from . import bp -from .forms import ( - ChangePasswordForm, - EditNotificationSettingsForm -) +from .forms import ChangePasswordForm, EditNotificationSettingsForm @bp.route('', methods=['GET', 'POST']) @@ -20,22 +17,20 @@ def settings(): data=current_user.to_json_serializeable(), prefix='edit-notification-settings-form' ) + # region handle change_password_form POST if change_password_form.submit.data and change_password_form.validate(): current_user.password = change_password_form.new_password.data db.session.commit() flash('Your changes have been saved') - return redirect(url_for('.index')) - - if (edit_notification_settings_form.submit - and edit_notification_settings_form.validate()): - current_user.setting_job_status_mail_notification_level = ( - UserSettingJobStatusMailNotificationLevel[ - edit_notification_settings_form.job_status_mail_notification_level.data # noqa - ] - ) + return redirect(url_for('.settings')) + # endregion handle change_password_form POST + # region handle edit_notification_settings_form POST + if edit_notification_settings_form.submit and edit_notification_settings_form.validate(): + current_user.setting_job_status_mail_notification_level = edit_notification_settings_form.job_status_mail_notification_level.data db.session.commit() flash('Your changes have been saved') return redirect(url_for('.settings')) + # endregion handle edit_notification_settings_form POST return render_template( 'settings/settings.html.j2', change_password_form=change_password_form, diff --git a/app/static/js/App.js b/app/static/js/App.js index c7a372f8..532bff5c 100644 --- a/app/static/js/App.js +++ b/app/static/js/App.js @@ -8,33 +8,20 @@ class App { this.socket.on('PATCH', (patch) => {this.onPatch(patch);}); } - getUser(userId) { + getUser(userId, backrefs=false, relationships=false) { if (userId in this.data.promises.getUser) { return this.data.promises.getUser[userId]; } this.data.promises.getUser[userId] = new Promise((resolve, reject) => { - fetch(`/users/${userId}?backrefs=true&relationships=true`, {headers: {Accept: 'application/json'}}) - .then( - (response) => { - if (response.status === 403) {this.flash('Forbidden', 'error'); reject(response);} - return response.json(); - }, - (response) => { - this.flash('Something went wrong', 'error'); - reject(response); - } - ) - .then( - (user) => { - this.data.users[userId] = user; - resolve(this.data.users[userId]); - }, - (error) => { - console.error(error, 'error'); - reject(error); - } - ); + this.socket.emit('GET /users/', userId, backrefs, relationships, (response) => { + if (response.status !== 200) { + reject(response); + return; + } + this.data.users[userId] = response.body; + resolve(this.data.users[userId]); + }); }); return this.data.promises.getUser[userId]; @@ -47,11 +34,11 @@ class App { this.data.promises.subscribeUser[userId] = new Promise((resolve, reject) => { this.socket.emit('SUBSCRIBE /users/', userId, (response) => { - if (response.code === 200) { - resolve(response); - } else { + if (response.status !== 200) { reject(response); + return; } + resolve(response); }); }); diff --git a/app/users/events.py b/app/users/events.py index 7cab2199..532bf42d 100644 --- a/app/users/events.py +++ b/app/users/events.py @@ -5,17 +5,55 @@ from app.decorators import socketio_login_required from app.models import User +@socketio.on('GET /users/') +@socketio_login_required +def get_user(user_hashid, backrefs=False, relationships=False): + user_id = hashids.decode(user_hashid) + user = User.query.get(user_id) + if user is None: + return {'status': 404, 'statusText': 'Not found'} + if not (user == current_user or current_user.is_administrator): + return {'status': 403, 'statusText': 'Forbidden'} + return { + 'body': user.to_json_serializeable( + backrefs=backrefs, + relationships=relationships + ), + 'status': 200, + 'statusText': 'OK', + } + + +# @socketio.on('GET /users/') +# @socketio_login_required +# def get_user(user_hashid): +# user_id = hashids.decode(user_hashid) +# user = User.query.get(user_id) +# if user is None: +# return {'options': {'status': 404, 'statusText': 'Not found'}} +# if not (user == current_user or current_user.is_administrator): +# return {'options': {'status': 403, 'statusText': 'Forbidden'}} +# return { +# 'body': user.to_json_serializable2(), +# 'options': { +# 'status': 200, +# 'statusText': 'OK', +# 'headers': {'Content-Type: application/json'} +# } +# } + + @socketio.on('SUBSCRIBE /users/') @socketio_login_required def subscribe_user(user_hashid): user_id = hashids.decode(user_hashid) user = User.query.get(user_id) if user is None: - return {'code': 404, 'msg': 'Not found'} + return {'status': 404, 'statusText': 'Not found'} if not (user == current_user or current_user.is_administrator): - return {'code': 403, 'msg': 'Forbidden'} + return {'status': 403, 'statusText': 'Forbidden'} join_room(f'/users/{user.hashid}') - return {'code': 200, 'msg': 'OK'} + return {'status': 200, 'statusText': 'OK'} @socketio.on('UNSUBSCRIBE /users/') @@ -24,8 +62,8 @@ def unsubscribe_user(user_hashid): user_id = hashids.decode(user_hashid) user = User.query.get(user_id) if user is None: - return {'code': 404, 'msg': 'Not found'} + return {'status': 404, 'statusText': 'Not found'} if not (user == current_user or current_user.is_administrator): - return {'code': 403, 'msg': 'Forbidden'} + return {'status': 403, 'statusText': 'Forbidden'} leave_room(f'/users/{user.hashid}') - return {'code': 200, 'msg': 'OK'} + return {'status': 200, 'statusText': 'OK'} diff --git a/app/users/routes.py b/app/users/routes.py index 968806ac..4c06cad3 100644 --- a/app/users/routes.py +++ b/app/users/routes.py @@ -1,4 +1,4 @@ -from flask import abort, current_app, request +from flask import abort, current_app from flask_login import current_user, login_required from threading import Thread from app import db @@ -9,13 +9,7 @@ from . import bp @bp.route('/') @login_required def user(user_id): - user = User.query.get_or_404(user_id) - if not (user == current_user or current_user.is_administrator()): - abort(403) - backrefs = request.args.get('backrefs', 'false').lower() == 'true' - relationships = ( - request.args.get('relationships', 'false').lower() == 'true') - return user.to_json_serializeable(backrefs=backrefs, relationships=relationships), 200 + abort(503) @bp.route('/', methods=['DELETE'])