diff options
Diffstat (limited to 'lib/srtgui/widgets.py')
-rw-r--r-- | lib/srtgui/widgets.py | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/srtgui/widgets.py b/lib/srtgui/widgets.py index 9415a7a5..751f7f14 100644 --- a/lib/srtgui/widgets.py +++ b/lib/srtgui/widgets.py @@ -36,6 +36,7 @@ import types import json import collections import re +import shlex from srtgui.tablefilter import TableFilterMap from urllib.parse import unquote_plus @@ -254,18 +255,33 @@ class ToasterTable(TemplateView): raise Exception("Search fields aren't defined in the model %s" % self.queryset.model) + # HACK: Replace in case of manual page refresh submits URI encoded chars + search_term = search_term.replace('%20',' ').replace('%22','"').replace('%27','"').replace('+',' ') search_queries = None - for st in search_term.split(" "): + next_op = 'AND' + for st in shlex.split(search_term): queries = None + if 'OR' == st: + next_op = 'OR' + continue + if 'AND' == st: + next_op = 'AND' + continue for field in self.queryset.model.search_allowed_fields: - query = Q(**{field + '__icontains': st}) + if st.startswith('-'): + query = ~Q(**{field + '__icontains': st[1:]}) + else: + query = Q(**{field + '__icontains': st}) if queries: queries |= query else: queries = query if search_queries: - search_queries &= queries + if 'OR' == next_op: + search_queries |= queries + else: + search_queries &= queries else: search_queries = queries @@ -307,6 +323,8 @@ class ToasterTable(TemplateView): cache_name = cache_name + str(key) + str(val) # No special chars allowed in the cache name apart from dash + # (but keep quotes as dashes to support search string) + cache_name = re.sub(r'["\']', "-", cache_name) cache_name = re.sub(r'[^A-Za-z0-9-]', "", cache_name) if nocache: @@ -378,7 +396,7 @@ class ToasterTable(TemplateView): '<!--error-->' else: - # Traverse to any foriegn key in the field + # Traverse to any foreign key in the field # e.g. recipe__layer_version__name model_data = None |