From c6eda514caa7809c1d6a841afbccaa2d6edf1843 Mon Sep 17 00:00:00 2001 From: James Graham Date: Thu, 28 May 2020 13:51:00 +0100 Subject: [PATCH] fix: Fix time filtering of relationships on MySQL Resolves #31 --- people/views/network.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/people/views/network.py b/people/views/network.py index a17ab9e..58addd2 100644 --- a/people/views/network.py +++ b/people/views/network.py @@ -2,15 +2,18 @@ Views for displaying networks of :class:`People` and :class:`Relationship`s. """ +import logging + from django.contrib.auth.mixins import LoginRequiredMixin from django.db.models import Q from django.forms import ValidationError from django.utils import timezone from django.views.generic import FormView - from people import forms, models, serializers +logger = logging.getLogger(__name__) # pylint: disable=invalid-name + class NetworkView(LoginRequiredMixin, FormView): """ @@ -47,35 +50,45 @@ class NetworkView(LoginRequiredMixin, FormView): if not at_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( - Q(replaced_timestamp__date__gte=at_date) | Q(replaced_timestamp__isnull=True), - timestamp__date__lte=at_date - ) + Q(replaced_timestamp__gte=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 for field, values in form.cleaned_data.items(): if field.startswith('question_') and values: 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( - models.Person.objects.all(), - many=True - ).data + models.Person.objects.all(), many=True).data context['relationship_set'] = serializers.RelationshipSerializer( models.Relationship.objects.filter( - pk__in=relationship_answerset_set.values_list('relationship', flat=True) - ), - many=True - ).data + pk__in=relationship_answerset_set.values_list('relationship', + flat=True)), + many=True).data + + logger.info('Found %d distinct relationships matching filters', + len(context['relationship_set'])) return context def form_valid(self, form): try: return self.render_to_response(self.get_context_data()) - + except ValidationError: return self.form_invalid(form)