Source code for dal_queryset_sequence.views
"""View that supports QuerySetSequence."""
from dal.views import BaseQuerySetView
from django.contrib.contenttypes.models import ContentType
from queryset_sequence import QuerySetSequence
[docs]
class BaseQuerySetSequenceView(BaseQuerySetView):
"""
Base view that uses a QuerySetSequence.
Compatible with form fields which use a ContentType id as well as a model
pk to identify a value.
.. py:attribute:: mixup
Cause the autocomplete to show a few results of each querysets.
"""
mixup = True
paginate_by = 10
[docs]
def get_paginate_by(self, queryset):
"""Don't paginate if :py:attr:`mixup`."""
return self.paginate_by if not self.mixup else None
[docs]
def has_more(self, context):
"""Return False if :py:attr:`mixup`."""
if self.mixup:
return False
return super(BaseQuerySetSequenceView, self).has_more(context)
[docs]
def mixup_querysets(self, qs):
"""Return a queryset with different model types."""
querysets = list(qs.get_querysets())
queryset_count = len(querysets)
if queryset_count:
limit = int(self.paginate_by / queryset_count)
qs = QuerySetSequence(*[q[:limit] for q in querysets])
return qs
[docs]
def get_queryset(self):
"""Mix results from all querysets in QuerySetSequence if self.mixup."""
qs = super(BaseQuerySetSequenceView, self).get_queryset()
if self.mixup:
qs = self.mixup_querysets(qs)
return qs
[docs]
def get_result_value(self, result):
"""Return ctypeid-objectid for result."""
return '%s-%s' % (ContentType.objects.get_for_model(result).pk,
result.pk)
[docs]
def get_model_name(self, model):
"""Return the name of the model, fetch parent if model is a proxy."""
if model._meta.proxy:
try:
model = list(model._meta.parents.keys())[0]
except IndexError:
pass
return model._meta.verbose_name
[docs]
def lookup_needs_distinct(self, queryset, orm_lookups):
"""Return True if a orm_lookups requires calling qs.distinct()."""
for qs in queryset._querysets:
if super().lookup_needs_distinct(qs, orm_lookups):
return True