mirror of
https://github.com/nikdoof/vapemap.git
synced 2025-12-18 20:29:27 +00:00
91 lines
2.7 KiB
Python
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() |