Files
vapemap/app/stores/views/mixins.py

91 lines
2.7 KiB
Python

from django.http import Http404
from haystack.query import SearchQuerySet
from haystack.inputs import AutoQuery
from waffle import switch_is_active, flag_is_active
class WaffleSwitchMixin(object):
"""
Checks that as switch is active, or 404. Operates like the FBV decorator waffle_switch
"""
waffle_switch = None
def dispatch(self, request, *args, **kwargs):
if self.waffle_switch.startswith('!'):
active = not switch_is_active(self.waffle_switch[1:])
else:
active = switch_is_active(self.waffle_switch)
if not active:
raise Http404
return super(WaffleSwitchMixin, self).dispatch(request, *args, **kwargs)
class WaffleFlagMixin(object):
"""
Checks that as flag is active, or 404. Operates like the FBV decorator waffle_flag
"""
waffle_flag = None
def dispatch(self, request, *args, **kwargs):
if self.waffle_flag.startswith('!'):
active = not flag_is_active(request, self.waffle_flag[1:])
else:
active = flag_is_active(request, self.waffle_flag)
if not active:
raise Http404
return super(WaffleFlagMixin, self).dispatch(request, *args, **kwargs)
class EditorCheckMixin(object):
"""
A mixin to check if the object is inactive to only show it to editors or superusers
"""
def is_editor(self, object):
if self.request.user.is_superuser or self.request.user == object.editor:
return True
return False
def get_object(self, queryset=None):
obj = super(EditorCheckMixin, self).get_object(queryset)
if not obj.active:
if not self.is_editor(obj):
raise Http404
return obj
def get_context_data(self, **kwargs):
ctx = super(EditorCheckMixin, self).get_context_data(**kwargs)
ctx.update({
'is_editor': self.is_editor(self.object)
})
return ctx
class HaystackSearchListMixin(object):
"""
Adds searching via Haystack to a regular ListView
"""
search_parameter = 'q'
def get_search_terms(self):
return self.request.GET.get(self.search_parameter, None)
def get_search_filter(self):
return {
'content': AutoQuery(self.get_search_terms())
}
def haystack_search(self):
return SearchQuerySet().filter(**self.get_search_filter()).models(self.model)
def get_queryset(self):
if self.get_search_terms():
res = self.haystack_search()
if res.count() == 0:
return self.model.objects.none()
return self.model.objects.filter(pk__in=[r.object.pk for r in res.load_all()])
else:
return super(HaystackSearchListMixin, self).get_queryset()