fix: Fix time filtering of relationships on MySQL

Resolves #31
This commit is contained in:
James Graham
2020-05-28 13:51:00 +01:00
parent 8bc82b2a15
commit c6eda514ca

View File

@@ -2,15 +2,18 @@
Views for displaying networks of :class:`People` and :class:`Relationship`s. Views for displaying networks of :class:`People` and :class:`Relationship`s.
""" """
import logging
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q from django.db.models import Q
from django.forms import ValidationError from django.forms import ValidationError
from django.utils import timezone from django.utils import timezone
from django.views.generic import FormView from django.views.generic import FormView
from people import forms, models, serializers from people import forms, models, serializers
logger = logging.getLogger(__name__) # pylint: disable=invalid-name
class NetworkView(LoginRequiredMixin, FormView): class NetworkView(LoginRequiredMixin, FormView):
""" """
@@ -47,29 +50,39 @@ class NetworkView(LoginRequiredMixin, FormView):
if not at_date: if not at_date:
at_date = timezone.now().date() at_date = timezone.now().date()
# Filter on timestamp__date doesn't seem to work on MySQL
# To compare datetimes we need at_date to be midnight at
# the *end* of the day in question - so add one day here
at_date += timezone.timedelta(days=1)
relationship_answerset_set = models.RelationshipAnswerSet.objects.filter( relationship_answerset_set = models.RelationshipAnswerSet.objects.filter(
Q(replaced_timestamp__date__gte=at_date) | Q(replaced_timestamp__isnull=True), Q(replaced_timestamp__gte=at_date)
timestamp__date__lte=at_date | Q(replaced_timestamp__isnull=True),
) timestamp__lte=at_date)
logger.info('Found %d relationship answer sets for %s',
relationship_answerset_set.count(), at_date)
# Filter answers to relationship questions # Filter answers to relationship questions
for field, values in form.cleaned_data.items(): for field, values in form.cleaned_data.items():
if field.startswith('question_') and values: if field.startswith('question_') and values:
relationship_answerset_set = relationship_answerset_set.filter( relationship_answerset_set = relationship_answerset_set.filter(
question_answers__in=values question_answers__in=values)
)
logger.info('Found %d relationship answer sets matching filters',
relationship_answerset_set.count())
context['person_set'] = serializers.PersonSerializer( context['person_set'] = serializers.PersonSerializer(
models.Person.objects.all(), models.Person.objects.all(), many=True).data
many=True
).data
context['relationship_set'] = serializers.RelationshipSerializer( context['relationship_set'] = serializers.RelationshipSerializer(
models.Relationship.objects.filter( models.Relationship.objects.filter(
pk__in=relationship_answerset_set.values_list('relationship', flat=True) pk__in=relationship_answerset_set.values_list('relationship',
), flat=True)),
many=True many=True).data
).data
logger.info('Found %d distinct relationships matching filters',
len(context['relationship_set']))
return context return context