diff --git a/app/main/views/corpus.py b/app/main/views/corpus.py index 04766b49..dd11ea8c 100644 --- a/app/main/views/corpus.py +++ b/app/main/views/corpus.py @@ -6,7 +6,9 @@ from app import db + from app.models import CorpusUser, ControlLists, ControlListsUser, WordToken, ChangeRecord, Bookmark, Favorite, User + from .utils import render_template_with_nav_info from app.utils import ValidationError from app.utils.forms import create_input_format_convertion, read_input_tokens @@ -17,6 +19,7 @@ from ...errors import MissingTokenColumnValue, NoTokensInput from .utils import requires_corpus_admin_access, requires_corpus_access from ..forms import Delete +from app.utils import PreferencesUpdateError AUTOCOMPLETE_LIMIT = 20 @@ -342,3 +345,40 @@ def search_value_api(corpus_id, allowed_type): if result is not None ] ) + + +@main.route("/corpus//preferences", methods=["GET", "POST"]) +@login_required +@requires_corpus_access("corpus_id") +def preferences(corpus_id: int): + """Show preferences view.""" + corpus = Corpus.query.get_or_404(corpus_id) + corpus_user = CorpusUser.query.filter( + CorpusUser.corpus_id == corpus_id, + CorpusUser.user_id == current_user.id + ).one_or_none() + if corpus_user: + is_owner = corpus_user.is_owner + else: + is_owner = current_user.id in (admin.id for admin in User.get_admins()) + if is_owner and request.method == "POST": + try: + corpus.update_delimiter_token( + delimiter_token=request.form.get("sep_token", "").strip() + ) + except PreferencesUpdateError as exception: + flash( + f"Faild to update preferences: {exception}", + category="error" + ) + else: + flash( + f"Updated preferences", + category="success" + ) + return render_template_with_nav_info( + "main/corpus_preferences.html", + sep_token=corpus.delimiter_token or "", + read_only=not is_owner, + corpus_id=corpus_id + ) diff --git a/app/models/corpus.py b/app/models/corpus.py index ee243103..b057ee8d 100644 --- a/app/models/corpus.py +++ b/app/models/corpus.py @@ -16,6 +16,7 @@ from ..utils.forms import strip_or_none from ..utils.tsv import TSV_CONFIG from ..errors import MissingTokenColumnValue, NoTokensInput +from app.utils import PreferencesUpdateError # Models from .user import User from .control_lists import ControlLists, AllowedPOS, AllowedMorph, AllowedLemma, PublicationStatus @@ -398,6 +399,23 @@ def toggle_favorite(self, user_id: int) -> bool: ) db.session.commit() + def update_delimiter_token(self, delimiter_token: Optional[str] = None): + """Update delimiter token. + + :param str delimiter_token: token + """ + if delimiter_token != self.delimiter_token: + try: + self.delimiter_token = delimiter_token + db.session.commit() + except Exception: + db.session.rollback() + raise PreferencesUpdateError( + f"cannot set delimiter token to '{delimiter_token}'" + ) + + + class WordToken(db.Model): """ A word token is a word from a corpus with primary annotation diff --git a/app/templates/macros/nav_macros.html b/app/templates/macros/nav_macros.html index 6febb912..d8dea52b 100644 --- a/app/templates/macros/nav_macros.html +++ b/app/templates/macros/nav_macros.html @@ -166,6 +166,9 @@ {{corpus.name}} + + Preferences + Quick links