From 26e04719c35005dbccd9803fa75c08fa509aff72 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Wed, 16 Oct 2019 14:11:07 +0300 Subject: [PATCH 1/3] Index name for tags --- apps/tag/serializers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/tag/serializers.py b/apps/tag/serializers.py index c4811f7a..f9bab992 100644 --- a/apps/tag/serializers.py +++ b/apps/tag/serializers.py @@ -15,6 +15,7 @@ class TagBaseSerializer(serializers.ModelSerializer): # todo: refactor this # label_translated = TranslatedField() label_translated = serializers.CharField(source='value', read_only=True, allow_null=True) + index_name = serializers.CharField(source='value', read_only=True, allow_null=True) class Meta: """Meta class.""" @@ -23,6 +24,7 @@ class TagBaseSerializer(serializers.ModelSerializer): fields = ( 'id', 'label_translated', + 'index_name', ) From 6d34e406db9ba2fff446f6b64133b6cf052de3b7 Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Thu, 31 Oct 2019 19:09:57 +0300 Subject: [PATCH 2/3] recalculate toque number --- apps/establishment/admin.py | 5 ++ .../commands/recalculate_toque_number.py | 16 +++++ .../migrations/0048_ratingstrategy.py | 33 ++++++++++ apps/establishment/models.py | 61 ++++++++++++++++++- 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 apps/establishment/management/commands/recalculate_toque_number.py create mode 100644 apps/establishment/migrations/0048_ratingstrategy.py diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 62b8a8da..95ee81e2 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -87,3 +87,8 @@ class MenuAdmin(BaseModelAdminMixin, admin.ModelAdmin): return obj.category_translated category_translated.short_description = _('category') + + +@admin.register(models.RatingStrategy) +class RatingStrategyAdmin(BaseModelAdminMixin, admin.ModelAdmin): + """Admin conf for Rating Strategy model.""" diff --git a/apps/establishment/management/commands/recalculate_toque_number.py b/apps/establishment/management/commands/recalculate_toque_number.py new file mode 100644 index 00000000..00e6eb69 --- /dev/null +++ b/apps/establishment/management/commands/recalculate_toque_number.py @@ -0,0 +1,16 @@ +"""Run recalculating toque number for establishments.""" +from django.core.management.base import BaseCommand +from establishment.models import Establishment + + +class Command(BaseCommand): + + help = 'Recalculation toque number for all establishments.' + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def handle(self, *args, **options): + for establishment in Establishment.objects.select_related('address__city__country'): + print(f'Recalculate for {establishment.name} ({establishment.id})') + establishment.recalculate_toque_number() diff --git a/apps/establishment/migrations/0048_ratingstrategy.py b/apps/establishment/migrations/0048_ratingstrategy.py new file mode 100644 index 00000000..06cbc9ee --- /dev/null +++ b/apps/establishment/migrations/0048_ratingstrategy.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.4 on 2019-10-31 15:55 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('location', '0020_merge_20191030_1714'), + ('establishment', '0047_merge_20191030_1714'), + ] + + operations = [ + migrations.CreateModel( + name='RatingStrategy', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('toque_number', models.IntegerField(choices=[(1, 'One'), (2, 'Two'), (3, 'Three'), (4, 'Four'), (5, 'Five')])), + ('public_mark_min_value', models.IntegerField()), + ('public_mark_max_value', models.IntegerField()), + ('country', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='location.Country', verbose_name='Country')), + ], + options={ + 'verbose_name': 'Rating strategy', + 'verbose_name_plural': 'Rating strategy', + 'unique_together': {('country', 'toque_number')}, + }, + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 981f9bb3..d83b8b81 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -14,7 +14,6 @@ from django.db.models import When, Case, F, ExpressionWrapper, Subquery, Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ from phonenumber_field.modelfields import PhoneNumberField -from pytz import timezone as ptz from timezone_field import TimeZoneField from collection.models import Collection @@ -384,7 +383,14 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin): # todo: recalculate toque_number def recalculate_toque_number(self): - self.toque_number = 4 + import ipdb; ipdb.set_trace() + toque_number = None + if self.address and self.public_mark: + toque_number = RatingStrategy.objects. \ + get_toque_number(country=self.address.city.country, + public_mark=self.public_mark) + self.toque_number = toque_number + self.save() def recalculate_price_level(self, low_price=None, high_price=None): if low_price is None or high_price is None: @@ -669,3 +675,54 @@ class SocialNetwork(models.Model): def __str__(self): return self.title + +class RatingStrategyManager(models.Manager): + """Extended manager for RatingStrategy.""" + + def get_toque_number(self, country, public_mark): + """Get toque number for country and public_mark.""" + obj = self.model.objects.by_country(country). \ + for_public_mark(public_mark).first() + if obj: + return obj.toque_number + return None + + +class RatingStrategyQuerySet(models.QuerySet): + """Extended queryset for RatingStrategy.""" + + def by_country(self, country): + """Filter by country.""" + return self.filter(country=country) + + def for_public_mark(self, public_mark): + """Filter for value.""" + return self.filter(public_mark_min_value__lte=public_mark, + public_mark_max_value__gte=public_mark) + + +class RatingStrategy(ProjectBaseMixin): + """Rating Strategy model.""" + + TOQUE_NUMBER_CHOICES = ( + (1, _('One')), + (2, _('Two')), + (3, _('Three')), + (4, _('Four')), + (5, _('Five')), + ) + + country = models.ForeignKey('location.Country', on_delete=models.CASCADE, + verbose_name=_('Country')) + toque_number = models.IntegerField(choices=TOQUE_NUMBER_CHOICES) + public_mark_min_value = models.IntegerField() + public_mark_max_value = models.IntegerField() + + objects = RatingStrategyManager.from_queryset(RatingStrategyQuerySet)() + + class Meta: + """Meta class.""" + + verbose_name = _('Rating strategy') + verbose_name_plural = _('Rating strategy') + unique_together = ('country', 'toque_number') \ No newline at end of file From 972e456f2026eaab919bd081a855558ad5bda1fb Mon Sep 17 00:00:00 2001 From: evgeniy-st Date: Thu, 31 Oct 2019 19:21:06 +0300 Subject: [PATCH 3/3] recalculate toque_number for other countries --- .../migrations/0049_auto_20191031_1616.py | 19 +++++++++++++++++++ apps/establishment/models.py | 17 ++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 apps/establishment/migrations/0049_auto_20191031_1616.py diff --git a/apps/establishment/migrations/0049_auto_20191031_1616.py b/apps/establishment/migrations/0049_auto_20191031_1616.py new file mode 100644 index 00000000..aced02d9 --- /dev/null +++ b/apps/establishment/migrations/0049_auto_20191031_1616.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.4 on 2019-10-31 16:16 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0048_ratingstrategy'), + ] + + operations = [ + migrations.AlterField( + model_name='ratingstrategy', + name='country', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='location.Country', verbose_name='Country'), + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index d83b8b81..957333ac 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -383,7 +383,6 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin): # todo: recalculate toque_number def recalculate_toque_number(self): - import ipdb; ipdb.set_trace() toque_number = None if self.address and self.public_mark: toque_number = RatingStrategy.objects. \ @@ -681,8 +680,10 @@ class RatingStrategyManager(models.Manager): def get_toque_number(self, country, public_mark): """Get toque number for country and public_mark.""" - obj = self.model.objects.by_country(country). \ - for_public_mark(public_mark).first() + qs = self.model.objects.by_country(country) + if not qs.exists(): + qs = self.model.objects.by_country(None) + obj = qs.for_public_mark(public_mark).first() if obj: return obj.toque_number return None @@ -712,7 +713,8 @@ class RatingStrategy(ProjectBaseMixin): (5, _('Five')), ) - country = models.ForeignKey('location.Country', on_delete=models.CASCADE, + country = models.ForeignKey('location.Country', null=True, blank=True, + default=None, on_delete=models.CASCADE, verbose_name=_('Country')) toque_number = models.IntegerField(choices=TOQUE_NUMBER_CHOICES) public_mark_min_value = models.IntegerField() @@ -725,4 +727,9 @@ class RatingStrategy(ProjectBaseMixin): verbose_name = _('Rating strategy') verbose_name_plural = _('Rating strategy') - unique_together = ('country', 'toque_number') \ No newline at end of file + unique_together = ('country', 'toque_number') + + def __str__(self): + return f'{self.country.code if self.country else "Other country"}. ' \ + f'"{self.toque_number}": {self.public_mark_min_value}-' \ + f'{self.public_mark_max_value}' \ No newline at end of file