social choices model

This commit is contained in:
alex 2019-11-14 09:14:36 +03:00
parent 906ca921f5
commit b94a6dfd62
6 changed files with 148 additions and 63 deletions

View File

@ -96,3 +96,14 @@ class MenuAdmin(BaseModelAdminMixin, admin.ModelAdmin):
@admin.register(models.RatingStrategy) @admin.register(models.RatingStrategy)
class RatingStrategyAdmin(BaseModelAdminMixin, admin.ModelAdmin): class RatingStrategyAdmin(BaseModelAdminMixin, admin.ModelAdmin):
"""Admin conf for Rating Strategy model.""" """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',)

View File

@ -1,6 +1,6 @@
from django.core.management.base import BaseCommand 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 from transfer.models import EstablishmentInfos
@ -10,46 +10,47 @@ class Command(BaseCommand):
def handle(self, *args, **kwargs): def handle(self, *args, **kwargs):
count = 0 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( queryset = EstablishmentInfos.objects.exclude(
establishment_id__isnull=True establishment_id__isnull=True
).values_list('id', 'establishment_id', 'facebook', 'twitter', 'instagram') ).values_list('id', 'establishment_id', 'facebook', 'twitter', 'instagram')
for id, es_id, facebook, twitter, instagram in queryset: for id, es_id, facebook_url, twitter_url, instagram_url in queryset:
try:
establishment = Establishment.objects.get(old_id=es_id)
except Establishment.DoesNotExist:
continue
except Establishment.MultipleObjectsReturned:
establishment = Establishment.objects.filter(old_id=es_id).first() establishment = Establishment.objects.filter(old_id=es_id).first()
else: if not establishment:
if facebook: continue
if 'facebook.com/' not in facebook:
facebook = 'https://www.facebook.com/' + facebook if facebook_url:
if 'facebook.com/' not in facebook_url:
facebook_url = 'https://www.facebook.com/' + facebook_url
obj, _ = SocialNetwork.objects.get_or_create( obj, _ = SocialNetwork.objects.get_or_create(
old_id=id, old_id=id,
establishment=establishment, establishment=establishment,
title='facebook', network=facebook,
url=facebook, url=facebook_url,
) )
count += 1 count += 1
if twitter: if twitter_url:
if 'twitter.com/' not in twitter: if 'twitter.com/' not in twitter_url:
twitter = 'https://www.twitter.com/' + twitter twitter_url = 'https://www.twitter.com/' + twitter_url
obj, _ = SocialNetwork.objects.get_or_create( obj, _ = SocialNetwork.objects.get_or_create(
old_id=id, old_id=id,
establishment=establishment, establishment=establishment,
title='twitter', network=twitter,
url=twitter, url=twitter_url,
) )
count += 1 count += 1
if instagram: if instagram_url:
if 'instagram.com/' not in instagram: if 'instagram.com/' not in instagram_url:
instagram = 'https://www.instagram.com/' + instagram instagram = 'https://www.instagram.com/' + instagram_url
obj, _ = SocialNetwork.objects.get_or_create( obj, _ = SocialNetwork.objects.get_or_create(
old_id=id, old_id=id,
establishment=establishment, establishment=establishment,
title='instagram', network=instagram,
url=instagram, url=instagram_url,
) )
count += 1 count += 1

View 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,
),
]

View File

@ -97,7 +97,7 @@ class EstablishmentQuerySet(models.QuerySet):
def with_base_related(self): def with_base_related(self):
"""Return qs with related objects.""" """Return qs with related objects."""
return self.select_related('address', 'establishment_type').\ return self.select_related('address', 'establishment_type'). \
prefetch_related('tags') prefetch_related('tags')
def with_schedule(self): def with_schedule(self):
@ -114,9 +114,9 @@ class EstablishmentQuerySet(models.QuerySet):
'address__city__country') 'address__city__country')
def with_extended_related(self): def with_extended_related(self):
return self.select_related('establishment_type').\ return self.select_related('establishment_type'). \
prefetch_related('establishment_subtypes', 'awards', 'schedule', prefetch_related('establishment_subtypes', 'awards', 'schedule',
'phones').\ 'phones'). \
prefetch_actual_employees() prefetch_actual_employees()
def with_type_related(self): def with_type_related(self):
@ -124,7 +124,7 @@ class EstablishmentQuerySet(models.QuerySet):
def with_es_related(self): def with_es_related(self):
"""Return qs with related for ES indexing objects.""" """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') prefetch_related('tags', 'schedule')
def search(self, value, locale=None): def search(self, value, locale=None):
@ -166,7 +166,7 @@ class EstablishmentQuerySet(models.QuerySet):
""" """
Return QuerySet establishments with published reviews. 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): def annotate_distance(self, point: Point = None):
""" """
@ -329,11 +329,11 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
help_text='{"en-GB":"some text"}') help_text='{"en-GB":"some text"}')
public_mark = models.PositiveIntegerField(blank=True, null=True, public_mark = models.PositiveIntegerField(blank=True, null=True,
default=None, default=None,
verbose_name=_('public mark'),) verbose_name=_('public mark'), )
# todo: set default 0 # todo: set default 0
toque_number = models.PositiveIntegerField(blank=True, null=True, toque_number = models.PositiveIntegerField(blank=True, null=True,
default=None, default=None,
verbose_name=_('toque number'),) verbose_name=_('toque number'), )
establishment_type = models.ForeignKey(EstablishmentType, establishment_type = models.ForeignKey(EstablishmentType,
related_name='establishment', related_name='establishment',
on_delete=models.PROTECT, 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, lafourchette = models.URLField(blank=True, null=True, default=None, max_length=255,
verbose_name=_('Lafourchette URL')) verbose_name=_('Lafourchette URL'))
guestonline_id = models.PositiveIntegerField(blank=True, verbose_name=_('guestonline id'), 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, 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, booking = models.URLField(blank=True, null=True, default=None, max_length=255,
verbose_name=_('Booking URL')) verbose_name=_('Booking URL'))
is_publish = models.BooleanField(default=False, verbose_name=_('Publish status')) is_publish = models.BooleanField(default=False, verbose_name=_('Publish status'))
@ -510,7 +510,7 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin):
@property @property
def last_published_review(self): def last_published_review(self):
"""Return last published review""" """Return last published review"""
return self.reviews.published()\ return self.reviews.published() \
.order_by('-published_at').first() .order_by('-published_at').first()
@property @property
@ -627,7 +627,7 @@ class Employee(BaseAttributes):
verbose_name=_('User')) verbose_name=_('User'))
name = models.CharField(max_length=255, verbose_name=_('Last name')) name = models.CharField(max_length=255, verbose_name=_('Last name'))
establishments = models.ManyToManyField(Establishment, related_name='employees', establishments = models.ManyToManyField(Establishment, related_name='employees',
through=EstablishmentEmployee,) through=EstablishmentEmployee, )
awards = generic.GenericRelation(to='main.Award', related_query_name='employees') awards = generic.GenericRelation(to='main.Award', related_query_name='employees')
tags = models.ManyToManyField('tag.Tag', related_name='employees', tags = models.ManyToManyField('tag.Tag', related_name='employees',
verbose_name=_('Tags')) verbose_name=_('Tags'))
@ -740,12 +740,31 @@ class Menu(TranslatedFieldsMixin, BaseAttributes):
verbose_name_plural = _('menu') 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): class SocialNetwork(models.Model):
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
establishment = models.ForeignKey( establishment = models.ForeignKey(
'Establishment', verbose_name=_('establishment'), 'Establishment',
related_name='socials', on_delete=models.CASCADE) verbose_name=_('establishment'),
title = models.CharField(_('title'), max_length=255) 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) url = models.URLField(_('URL'), max_length=255)
class Meta: class Meta:
@ -753,7 +772,7 @@ class SocialNetwork(models.Model):
verbose_name_plural = _('social networks') verbose_name_plural = _('social networks')
def __str__(self): def __str__(self):
return self.title return f'{self.network.title}: {self.url}'
class RatingStrategyManager(models.Manager): class RatingStrategyManager(models.Manager):

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

View File

@ -70,6 +70,7 @@ class Review(BaseAttributes, TranslatedFieldsMixin):
null=True) null=True)
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) 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() objects = ReviewQuerySet.as_manager()