diff --git a/app/__init__.py b/app/__init__.py index 4c2ef68ee1be236697cb0f620a37c05f65f97ac4..318502f4ae2a73ce005cf5b604374744481511c3 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -91,6 +91,7 @@ def create_app(config: Config = Config) -> Flask: app.register_blueprint(services_blueprint, url_prefix='/services') from .users import bp as users_blueprint + default_breadcrumb_root(users_blueprint, '.users') app.register_blueprint(users_blueprint, url_prefix='/users') return app diff --git a/app/contributions/spacy_nlp_pipeline_models/utils.py b/app/contributions/spacy_nlp_pipeline_models/utils.py index 204bc56db0454118f5a644d2d4548cc4d98182eb..e73bbfd6697718387427257c64dfa0b1d2124638 100644 --- a/app/contributions/spacy_nlp_pipeline_models/utils.py +++ b/app/contributions/spacy_nlp_pipeline_models/utils.py @@ -4,7 +4,7 @@ from app.models import SpaCyNLPPipelineModel def spacy_nlp_pipeline_model_dlc(): snpm_id = request.view_args['spacy_nlp_pipeline_model_id'] - snpm = SpaCyNLPPipelineModel.query.get(snpm_id) + snpm = SpaCyNLPPipelineModel.query.get_or_404(snpm_id) return [ { 'text': f'{snpm.title} {snpm.version}', diff --git a/app/contributions/tesseract_ocr_pipeline_models/utils.py b/app/contributions/tesseract_ocr_pipeline_models/utils.py index d957f2713809bfc8ea3153b039d89066e0bf5714..d0fcd7582e6e5579703f5850d1178889383a6c41 100644 --- a/app/contributions/tesseract_ocr_pipeline_models/utils.py +++ b/app/contributions/tesseract_ocr_pipeline_models/utils.py @@ -4,7 +4,7 @@ from app.models import TesseractOCRPipelineModel def tesseract_ocr_pipeline_model_dlc(): topm_id = request.view_args['tesseract_ocr_pipeline_model_id'] - topm = TesseractOCRPipelineModel.query.get(topm_id) + topm = TesseractOCRPipelineModel.query.get_or_404(topm_id) return [ { 'text': f'{topm.title} {topm.version}', diff --git a/app/corpora/utils.py b/app/corpora/utils.py index fd0e1c2aa523dc65d1de20ee3d88b55a451be32e..f5319dce4dcee2176cdeb7a235e3be6fc687dbc7 100644 --- a/app/corpora/utils.py +++ b/app/corpora/utils.py @@ -8,7 +8,7 @@ def corpus_endpoint_arguments_constructor(): def corpus_dynamic_list_constructor(): corpus_id = request.view_args['corpus_id'] - corpus = Corpus.query.get(corpus_id) + corpus = Corpus.query.get_or_404(corpus_id) return [ { 'text': f'<i class="material-icons left">book</i>{corpus.title}', diff --git a/app/jobs/routes.py b/app/jobs/routes.py index 0479cc5dd5296eb45b740b29ddfd8ffe107b2b4a..2533e01053676e3f9917cc095fa5c14693c38652 100644 --- a/app/jobs/routes.py +++ b/app/jobs/routes.py @@ -21,7 +21,7 @@ def corpora(): @bp.route('/<hashid:job_id>') -@register_breadcrumb(bp, '.job', '', dynamic_list_constructor=job_dlc) +@register_breadcrumb(bp, '.entity', '', dynamic_list_constructor=job_dlc) @login_required def job(job_id): job = Job.query.get_or_404(job_id) diff --git a/app/jobs/utils.py b/app/jobs/utils.py index 8417af042949dc2068238c26868968343c6427de..554db354b7c36faafa9b7986d2d549eb05d4eb52 100644 --- a/app/jobs/utils.py +++ b/app/jobs/utils.py @@ -4,7 +4,7 @@ from app.models import Job def job_dynamic_list_constructor(): job_id = request.view_args['job_id'] - job = Job.query.get(job_id) + job = Job.query.get_or_404(job_id) return [ { 'text': f'<i class="nopaque-icons left service-icons" data-service="{job.service}"></i>{job.title}', diff --git a/app/templates/main/social_area.html.j2 b/app/templates/main/social_area.html.j2 index 8aaeecfaea21e205bfa31c9edeea108379ee5cea..fc101aadbfb170831185b678117073a1c44e8dfc 100644 --- a/app/templates/main/social_area.html.j2 +++ b/app/templates/main/social_area.html.j2 @@ -36,7 +36,7 @@ </div> <div class="col s12"> - <h3>Other Users</h3> + <h3 id="users">Other Users</h3> <p>Find other users and see what corpora they have made public.</p> <div class="card"> <div class="card-content"> diff --git a/app/users/routes.py b/app/users/routes.py index 82d372475ea32a94627d1207a0af3312aeab9c2a..cd3f2ba4f1f34c8b3b5a3115335ea194c3aff245 100644 --- a/app/users/routes.py +++ b/app/users/routes.py @@ -1,16 +1,13 @@ -from datetime import datetime from flask import ( abort, - current_app, flash, - Markup, redirect, render_template, send_from_directory, url_for ) +from flask_breadcrumbs import register_breadcrumb from flask_login import current_user, login_required -from threading import Thread import os from app import db from app.models import Avatar, Corpus, ProfilePrivacySettings, User @@ -22,13 +19,21 @@ from .forms import ( EditProfileSettingsForm, EditPublicProfileInformationForm ) +from .utils import ( + user_endpoint_arguments_constructor as user_eac, + user_dynamic_list_constructor as user_dlc +) + -@bp.before_request +@bp.route('') +@register_breadcrumb(bp, '.', 'Users') @login_required -def before_request(): - pass +def users(): + return redirect(url_for('main.social_area', _anchor='users')) + @bp.route('/<hashid:user_id>') +@register_breadcrumb(bp, '.entity', '', dynamic_list_constructor=user_dlc) @login_required def user(user_id): user = User.query.get_or_404(user_id) @@ -50,12 +55,13 @@ def user(user_id): member_since=member_since, own_public_corpora=own_public_corpora, user=user.to_json_serializeable(), - user_id=user_id + user_id=user_id, + title=user.username ) - @bp.route('/<hashid:user_id>/avatar') +@login_required def profile_avatar(user_id): user = User.query.get_or_404(user_id) if user.avatar is None: @@ -72,6 +78,8 @@ def profile_avatar(user_id): @bp.route('/<hashid:user_id>/edit', methods=['GET', 'POST']) +@register_breadcrumb(bp, '.entity.edit', 'Edit', endpoint_arguments_constructor=user_eac) +@login_required def edit_profile(user_id): user = User.query.get_or_404(user_id) if not (user == current_user or current_user.is_administrator()): diff --git a/app/users/utils.py b/app/users/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..e352fe5c34d1f9c49f9934ca863700009ca546d9 --- /dev/null +++ b/app/users/utils.py @@ -0,0 +1,17 @@ +from flask import request, url_for +from app.models import User + + +def user_endpoint_arguments_constructor(): + return {'user_id': request.view_args['user_id']} + + +def user_dynamic_list_constructor(): + user_id = request.view_args['user_id'] + user = User.query.get_or_404(user_id) + return [ + { + 'text': user.username, + 'url': url_for('.user', user_id=user_id) + } + ]