recalculate toque number

This commit is contained in:
evgeniy-st 2019-10-31 19:09:57 +03:00
parent a44081c2e7
commit 6d34e406db
4 changed files with 113 additions and 2 deletions

View File

@ -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."""

View File

@ -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()

View File

@ -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')},
},
),
]

View File

@ -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')