From 90c9e321f7a627512aadf1274ac537c2bd767fd8 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 25 Sep 2019 13:05:07 +0300 Subject: [PATCH] fixed similar establishments --- apps/establishment/models.py | 30 ++++++++++++++++++++++-------- apps/establishment/views/web.py | 7 +++++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 4731a212..2fbff239 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -101,6 +101,22 @@ class EstablishmentQuerySet(models.QuerySet): DistanceMeasure(Distance('address__coordinates', point, srid=4236)).m, output_field=models.FloatField())) + def annotate_intermediate_public_mark(self): + """ + Return QuerySet with annotated field - intermediate_public_mark. + Description: + If establishments in collection POP and its mark is null, then + intermediate_mark is set to 10; + """ + return self.annotate(intermediate_public_mark=models.Case( + models.When( + collections__collection_type=Collection.POP, + public_mark__isnull=True, + then=10 + ), + default='public_mark', + output_field=models.FloatField())) + def annotate_mark_similarity(self, mark): """ Return a QuerySet with annotated field - mark_similarity @@ -108,7 +124,7 @@ class EstablishmentQuerySet(models.QuerySet): Similarity mark determined by comparison with compared establishment mark """ return self.annotate(mark_similarity=models.ExpressionWrapper( - mark - models.F('mark'), + mark - models.F('intermediate_public_mark'), output_field=models.FloatField() )) @@ -117,7 +133,8 @@ class EstablishmentQuerySet(models.QuerySet): Return QuerySet with objects that similar to Establishment. :param establishment_slug: str Establishment slug """ - establishment_qs = Establishment.objects.filter(slug=establishment_slug) + establishment_qs = Establishment.objects.filter(slug=establishment_slug, + public_mark__isnull=False) if establishment_qs.exists(): establishment = establishment_qs.first() return self.exclude(slug=establishment_slug) \ @@ -127,11 +144,8 @@ class EstablishmentQuerySet(models.QuerySet): reviews__status=Review.READY, public_mark__gte=10) \ .annotate_distance(point=establishment.address.coordinates) \ - .annotate_mark_similarity(establishment_qs.first().public_mark) - # .annotate_distance_mark() \ - # .annotate_intermediate_public_mark() \ - # .annotate_additional_mark(public_mark=establishment.public_mark) \ - # .annotate_total_mark() + .annotate_intermediate_public_mark() \ + .annotate_mark_similarity(mark=establishment.public_mark) else: return self.none() @@ -225,7 +239,7 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin): preview_image_url = models.URLField(verbose_name=_('Preview image URL path'), blank=True, null=True, default=None) slug = models.SlugField(unique=True, max_length=50, null=True, - verbose_name=_('Establishment slug'), editable=True) + verbose_name=_('Establishment slug'), editable=True) awards = generic.GenericRelation(to='main.Award') tags = generic.GenericRelation(to='main.MetaDataContent') diff --git a/apps/establishment/views/web.py b/apps/establishment/views/web.py index ce2bed05..fef7fd5b 100644 --- a/apps/establishment/views/web.py +++ b/apps/establishment/views/web.py @@ -30,8 +30,11 @@ class EstablishmentSimilarListView(EstablishmentListView): def get_queryset(self): """Override get_queryset method""" - return super().get_queryset().similar(establishment_slug=self.kwargs.get('slug'))\ - .order_by('-total_mark')[:13] + number_objects = 12 # Count of similar objects + return super().get_queryset().similar(establishment_slug=self.kwargs.get('slug')) \ + .order_by('distance')[:number_objects * 3] \ + .order_by('mark_similarity')[:number_objects] + class EstablishmentRetrieveView(EstablishmentMixin, generics.RetrieveAPIView): """Resource for getting a establishment."""