social choices model
This commit is contained in:
parent
906ca921f5
commit
b94a6dfd62
|
|
@ -96,3 +96,14 @@ class MenuAdmin(BaseModelAdminMixin, admin.ModelAdmin):
|
|||
@admin.register(models.RatingStrategy)
|
||||
class RatingStrategyAdmin(BaseModelAdminMixin, admin.ModelAdmin):
|
||||
"""Admin conf for Rating Strategy model."""
|
||||
|
||||
|
||||
@admin.register(models.SocialChoice)
|
||||
class SocialChoiceAdmin(BaseModelAdminMixin, admin.ModelAdmin):
|
||||
"""Admin conf for SocialChoice model."""
|
||||
|
||||
|
||||
@admin.register(models.SocialNetwork)
|
||||
class SocialNetworkAdmin(BaseModelAdminMixin, admin.ModelAdmin):
|
||||
"""Admin conf for SocialNetwork model."""
|
||||
raw_id_fields = ('establishment',)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
|
||||
from establishment.models import Establishment, SocialNetwork
|
||||
from establishment.models import Establishment, SocialChoice, SocialNetwork
|
||||
from transfer.models import EstablishmentInfos
|
||||
|
||||
|
||||
|
|
@ -10,47 +10,48 @@ class Command(BaseCommand):
|
|||
def handle(self, *args, **kwargs):
|
||||
count = 0
|
||||
|
||||
facebook, _ = SocialChoice.objects.get_or_create(title='facebook')
|
||||
twitter, _ = SocialChoice.objects.get_or_create(title='twitter')
|
||||
instagram, _ = SocialChoice.objects.get_or_create(title='instagram')
|
||||
|
||||
queryset = EstablishmentInfos.objects.exclude(
|
||||
establishment_id__isnull=True
|
||||
).values_list('id', 'establishment_id', 'facebook', 'twitter', 'instagram')
|
||||
|
||||
for id, es_id, facebook, twitter, instagram in queryset:
|
||||
try:
|
||||
establishment = Establishment.objects.get(old_id=es_id)
|
||||
except Establishment.DoesNotExist:
|
||||
for id, es_id, facebook_url, twitter_url, instagram_url in queryset:
|
||||
establishment = Establishment.objects.filter(old_id=es_id).first()
|
||||
if not establishment:
|
||||
continue
|
||||
except Establishment.MultipleObjectsReturned:
|
||||
establishment = Establishment.objects.filter(old_id=es_id).first()
|
||||
else:
|
||||
if facebook:
|
||||
if 'facebook.com/' not in facebook:
|
||||
facebook = 'https://www.facebook.com/' + facebook
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
title='facebook',
|
||||
url=facebook,
|
||||
)
|
||||
count += 1
|
||||
if twitter:
|
||||
if 'twitter.com/' not in twitter:
|
||||
twitter = 'https://www.twitter.com/' + twitter
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
title='twitter',
|
||||
url=twitter,
|
||||
)
|
||||
count += 1
|
||||
if instagram:
|
||||
if 'instagram.com/' not in instagram:
|
||||
instagram = 'https://www.instagram.com/' + instagram
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
title='instagram',
|
||||
url=instagram,
|
||||
)
|
||||
count += 1
|
||||
|
||||
if facebook_url:
|
||||
if 'facebook.com/' not in facebook_url:
|
||||
facebook_url = 'https://www.facebook.com/' + facebook_url
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
network=facebook,
|
||||
url=facebook_url,
|
||||
)
|
||||
count += 1
|
||||
if twitter_url:
|
||||
if 'twitter.com/' not in twitter_url:
|
||||
twitter_url = 'https://www.twitter.com/' + twitter_url
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
network=twitter,
|
||||
url=twitter_url,
|
||||
)
|
||||
count += 1
|
||||
if instagram_url:
|
||||
if 'instagram.com/' not in instagram_url:
|
||||
instagram = 'https://www.instagram.com/' + instagram_url
|
||||
obj, _ = SocialNetwork.objects.get_or_create(
|
||||
old_id=id,
|
||||
establishment=establishment,
|
||||
network=instagram,
|
||||
url=instagram_url,
|
||||
)
|
||||
count += 1
|
||||
|
||||
self.stdout.write(self.style.WARNING(f'Created/updated {count} objects.'))
|
||||
|
|
|
|||
35
apps/establishment/migrations/0061_auto_20191114_0550.py
Normal file
35
apps/establishment/migrations/0061_auto_20191114_0550.py
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# Generated by Django 2.2.7 on 2019-11-14 05:50
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('establishment', '0060_auto_20191113_1512'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='SocialChoice',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=255, unique=True, verbose_name='title')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'social choice',
|
||||
'verbose_name_plural': 'social choices',
|
||||
},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='socialnetwork',
|
||||
name='title',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='socialnetwork',
|
||||
name='network',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='social_links', to='establishment.SocialChoice', verbose_name='social network'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
|
|
@ -97,7 +97,7 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
|
||||
def with_base_related(self):
|
||||
"""Return qs with related objects."""
|
||||
return self.select_related('address', 'establishment_type').\
|
||||
return self.select_related('address', 'establishment_type'). \
|
||||
prefetch_related('tags')
|
||||
|
||||
def with_schedule(self):
|
||||
|
|
@ -114,9 +114,9 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
'address__city__country')
|
||||
|
||||
def with_extended_related(self):
|
||||
return self.select_related('establishment_type').\
|
||||
return self.select_related('establishment_type'). \
|
||||
prefetch_related('establishment_subtypes', 'awards', 'schedule',
|
||||
'phones').\
|
||||
'phones'). \
|
||||
prefetch_actual_employees()
|
||||
|
||||
def with_type_related(self):
|
||||
|
|
@ -124,7 +124,7 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
|
||||
def with_es_related(self):
|
||||
"""Return qs with related for ES indexing objects."""
|
||||
return self.select_related('address', 'establishment_type', 'address__city', 'address__city__country').\
|
||||
return self.select_related('address', 'establishment_type', 'address__city', 'address__city__country'). \
|
||||
prefetch_related('tags', 'schedule')
|
||||
|
||||
def search(self, value, locale=None):
|
||||
|
|
@ -166,7 +166,7 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
"""
|
||||
Return QuerySet establishments with published reviews.
|
||||
"""
|
||||
return self.filter(reviews__status=Review.READY,)
|
||||
return self.filter(reviews__status=Review.READY, )
|
||||
|
||||
def annotate_distance(self, point: Point = None):
|
||||
"""
|
||||
|
|
@ -222,10 +222,10 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
.values('id')
|
||||
)
|
||||
return self.filter(id__in=subquery_filter_by_distance) \
|
||||
.annotate_intermediate_public_mark() \
|
||||
.annotate_mark_similarity(mark=establishment.public_mark) \
|
||||
.order_by('mark_similarity') \
|
||||
.distinct('mark_similarity', 'id')
|
||||
.annotate_intermediate_public_mark() \
|
||||
.annotate_mark_similarity(mark=establishment.public_mark) \
|
||||
.order_by('mark_similarity') \
|
||||
.distinct('mark_similarity', 'id')
|
||||
else:
|
||||
return self.none()
|
||||
|
||||
|
|
@ -242,7 +242,7 @@ class EstablishmentQuerySet(models.QuerySet):
|
|||
.values('id')
|
||||
)
|
||||
return self.filter(id__in=subquery_filter_by_distance) \
|
||||
.order_by('-reviews__published_at')
|
||||
.order_by('-reviews__published_at')
|
||||
|
||||
def prefetch_actual_employees(self):
|
||||
"""Prefetch actual employees."""
|
||||
|
|
@ -329,11 +329,11 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
|
|||
help_text='{"en-GB":"some text"}')
|
||||
public_mark = models.PositiveIntegerField(blank=True, null=True,
|
||||
default=None,
|
||||
verbose_name=_('public mark'),)
|
||||
verbose_name=_('public mark'), )
|
||||
# todo: set default 0
|
||||
toque_number = models.PositiveIntegerField(blank=True, null=True,
|
||||
default=None,
|
||||
verbose_name=_('toque number'),)
|
||||
verbose_name=_('toque number'), )
|
||||
establishment_type = models.ForeignKey(EstablishmentType,
|
||||
related_name='establishment',
|
||||
on_delete=models.PROTECT,
|
||||
|
|
@ -357,9 +357,9 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
|
|||
lafourchette = models.URLField(blank=True, null=True, default=None, max_length=255,
|
||||
verbose_name=_('Lafourchette URL'))
|
||||
guestonline_id = models.PositiveIntegerField(blank=True, verbose_name=_('guestonline id'),
|
||||
null=True, default=None,)
|
||||
null=True, default=None, )
|
||||
lastable_id = models.TextField(blank=True, verbose_name=_('lastable id'), unique=True,
|
||||
null=True, default=None,)
|
||||
null=True, default=None, )
|
||||
booking = models.URLField(blank=True, null=True, default=None, max_length=255,
|
||||
verbose_name=_('Booking URL'))
|
||||
is_publish = models.BooleanField(default=False, verbose_name=_('Publish status'))
|
||||
|
|
@ -505,13 +505,13 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
|
|||
@property
|
||||
def tags_indexing(self):
|
||||
return [{'id': tag.metadata.id,
|
||||
'label': tag.metadata.label} for tag in self.tags.all()]
|
||||
'label': tag.metadata.label} for tag in self.tags.all()]
|
||||
|
||||
@property
|
||||
def last_published_review(self):
|
||||
"""Return last published review"""
|
||||
return self.reviews.published()\
|
||||
.order_by('-published_at').first()
|
||||
return self.reviews.published() \
|
||||
.order_by('-published_at').first()
|
||||
|
||||
@property
|
||||
def location(self):
|
||||
|
|
@ -523,7 +523,7 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
|
|||
@property
|
||||
def the_most_recent_award(self):
|
||||
return Award.objects.filter(Q(establishment=self) | Q(employees__establishments=self)) \
|
||||
.latest(field_name='vintage_year')
|
||||
.latest(field_name='vintage_year')
|
||||
|
||||
@property
|
||||
def country_id(self):
|
||||
|
|
@ -608,7 +608,7 @@ class EstablishmentEmployee(BaseAttributes):
|
|||
employee = models.ForeignKey('establishment.Employee', on_delete=models.PROTECT,
|
||||
verbose_name=_('Employee'))
|
||||
from_date = models.DateTimeField(default=timezone.now, verbose_name=_('From date'),
|
||||
null=True, blank=True)
|
||||
null=True, blank=True)
|
||||
to_date = models.DateTimeField(blank=True, null=True, default=None,
|
||||
verbose_name=_('To date'))
|
||||
position = models.ForeignKey(Position, on_delete=models.PROTECT,
|
||||
|
|
@ -627,7 +627,7 @@ class Employee(BaseAttributes):
|
|||
verbose_name=_('User'))
|
||||
name = models.CharField(max_length=255, verbose_name=_('Last name'))
|
||||
establishments = models.ManyToManyField(Establishment, related_name='employees',
|
||||
through=EstablishmentEmployee,)
|
||||
through=EstablishmentEmployee, )
|
||||
awards = generic.GenericRelation(to='main.Award', related_query_name='employees')
|
||||
tags = models.ManyToManyField('tag.Tag', related_name='employees',
|
||||
verbose_name=_('Tags'))
|
||||
|
|
@ -740,12 +740,31 @@ class Menu(TranslatedFieldsMixin, BaseAttributes):
|
|||
verbose_name_plural = _('menu')
|
||||
|
||||
|
||||
class SocialChoice(models.Model):
|
||||
title = models.CharField(_('title'), max_length=255, unique=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('social choice')
|
||||
verbose_name_plural = _('social choices')
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
|
||||
class SocialNetwork(models.Model):
|
||||
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
|
||||
establishment = models.ForeignKey(
|
||||
'Establishment', verbose_name=_('establishment'),
|
||||
related_name='socials', on_delete=models.CASCADE)
|
||||
title = models.CharField(_('title'), max_length=255)
|
||||
'Establishment',
|
||||
verbose_name=_('establishment'),
|
||||
related_name='socials',
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
network = models.ForeignKey(
|
||||
SocialChoice,
|
||||
verbose_name=_('social network'),
|
||||
related_name='social_links',
|
||||
on_delete=models.CASCADE,
|
||||
)
|
||||
url = models.URLField(_('URL'), max_length=255)
|
||||
|
||||
class Meta:
|
||||
|
|
@ -753,7 +772,7 @@ class SocialNetwork(models.Model):
|
|||
verbose_name_plural = _('social networks')
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
return f'{self.network.title}: {self.url}'
|
||||
|
||||
|
||||
class RatingStrategyManager(models.Manager):
|
||||
|
|
@ -817,4 +836,4 @@ class RatingStrategy(ProjectBaseMixin):
|
|||
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}'
|
||||
f'{self.public_mark_max_value}'
|
||||
|
|
|
|||
18
apps/review/migrations/0015_review_mark.py
Normal file
18
apps/review/migrations/0015_review_mark.py
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 2.2.7 on 2019-11-13 09:44
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('review', '0014_auto_20191112_0538'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='review',
|
||||
name='mark',
|
||||
field=models.FloatField(blank=True, default=None, null=True, verbose_name='mark'),
|
||||
),
|
||||
]
|
||||
|
|
@ -70,6 +70,7 @@ class Review(BaseAttributes, TranslatedFieldsMixin):
|
|||
null=True)
|
||||
|
||||
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
|
||||
mark = models.FloatField(verbose_name=_('mark'), blank=True, null=True, default=None)
|
||||
|
||||
objects = ReviewQuerySet.as_manager()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user