aboutsummaryrefslogtreecommitdiffstats
path: root/lib/srtgui/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/srtgui/widgets.py')
-rw-r--r--lib/srtgui/widgets.py26
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