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