Source code for search.controllers.util

"""Controller helpers."""

import re
from typing import Tuple

from wtforms import Form, StringField, validators

from search.domain import Query

CLASSIC_AUTHOR = r'([A-Za-z]+)_([a-zA-Z])(?=$|\s)'


[docs]def does_not_start_with_wildcard(form: Form, field: StringField) -> None: """Check that ``value`` does not start with a wildcard character.""" if not field.data: return if field.data.startswith('?') or field.data.startswith('*'): raise validators.ValidationError( 'Search cannot start with a wildcard (? *).') if any([part.startswith('?') or part.startswith('*') for part in field.data.split()]): raise validators.ValidationError('Search terms cannot start with a' ' wildcard (? *).')
[docs]def has_balanced_quotes(form: Form, field: StringField) -> None: """Check that ``value`` has balanced (paired) quotes.""" if not field.data: return if '"' in field.data and field.data.count('"') % 2 != 0: raise validators.ValidationError('Missing closing quote (").')
[docs]def strip_white_space(value: str) -> str: """Strip whitespace from form input.""" if not value: return value return value.strip()
[docs]def paginate(query: Query, data: dict) -> Query: """ Update pagination parameters on a :class:`.Query` from request parameters. Parameters ---------- query : :class:`.Query` data : dict Returns ------- :class:`.Query` """ query.page_start = max(int(data.get('start', 0)), 0) query.size = min(int(data.get('size', 50)), Query.MAXIMUM_size) return query
[docs]def catch_underscore_syntax(term: str) -> Tuple[str, bool]: """Rewrite author name strings in `surname_f` format to use commas.""" match = re.search(CLASSIC_AUTHOR, term) if not match: return term, False return re.sub(CLASSIC_AUTHOR, r'\g<1>, \g<2>;', term).rstrip(';'), True