finalizing transfer guides
This commit is contained in:
parent
076d14fd5b
commit
627f7562ec
|
|
@ -1,4 +1,6 @@
|
||||||
from django.contrib.gis import admin
|
from django.contrib.gis import admin
|
||||||
|
from mptt.admin import DraggableMPTTAdmin, TreeRelatedFieldListFilter
|
||||||
|
from utils.admin import BaseModelAdminMixin
|
||||||
|
|
||||||
from collection import models
|
from collection import models
|
||||||
|
|
||||||
|
|
@ -11,3 +13,22 @@ class CollectionAdmin(admin.ModelAdmin):
|
||||||
@admin.register(models.Guide)
|
@admin.register(models.Guide)
|
||||||
class GuideAdmin(admin.ModelAdmin):
|
class GuideAdmin(admin.ModelAdmin):
|
||||||
"""Guide admin."""
|
"""Guide admin."""
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.GuideElementType)
|
||||||
|
class GuideElementType(admin.ModelAdmin):
|
||||||
|
"""Guide element admin."""
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(models.GuideElement)
|
||||||
|
class GuideElementAdmin(DraggableMPTTAdmin, BaseModelAdminMixin, admin.ModelAdmin):
|
||||||
|
"""Guide element admin."""
|
||||||
|
raw_id_fields = [
|
||||||
|
'guide_element_type', 'establishment', 'review',
|
||||||
|
'wine_region', 'product', 'city',
|
||||||
|
'wine_color_section', 'section', 'guide',
|
||||||
|
'parent',
|
||||||
|
]
|
||||||
|
# list_filter = (
|
||||||
|
# ('parent', TreeRelatedFieldListFilter),
|
||||||
|
# )
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-02 14:05
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('collection', '0019_advertorial_guidefilter'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='GuideElementSectionCategory',
|
||||||
|
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')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='category name')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'guide element section category',
|
||||||
|
'verbose_name_plural': 'guide element section categories',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='GuideWineColorSection',
|
||||||
|
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')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='section name')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'guide wine color section',
|
||||||
|
'verbose_name_plural': 'guide wine color sections',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='GuideElementSection',
|
||||||
|
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')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='section name')),
|
||||||
|
('old_id', models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id')),
|
||||||
|
('category', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='collection.GuideElementSectionCategory', verbose_name='category')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'guide element section',
|
||||||
|
'verbose_name_plural': 'guide element sections',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
24
apps/collection/migrations/0021_guideelementtype.py
Normal file
24
apps/collection/migrations/0021_guideelementtype.py
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-02 14:35
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('collection', '0020_guideelementsection_guideelementsectioncategory_guidewinecolorsection'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='GuideElementType',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50, verbose_name='name')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'guide element type',
|
||||||
|
'verbose_name_plural': 'guide element types',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
48
apps/collection/migrations/0022_guideelement.py
Normal file
48
apps/collection/migrations/0022_guideelement.py
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-02 14:44
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
import mptt.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('review', '0018_auto_20191117_1117'),
|
||||||
|
('product', '0018_purchasedproduct'),
|
||||||
|
('location', '0030_auto_20191120_1010'),
|
||||||
|
('establishment', '0067_auto_20191122_1244'),
|
||||||
|
('collection', '0021_guideelementtype'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='GuideElement',
|
||||||
|
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')),
|
||||||
|
('priority', models.IntegerField(blank=True, default=None, null=True)),
|
||||||
|
('old_id', models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id')),
|
||||||
|
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
|
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
|
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
|
('level', models.PositiveIntegerField(db_index=True, editable=False)),
|
||||||
|
('city', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='location.City')),
|
||||||
|
('establishment', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='establishment.Establishment')),
|
||||||
|
('guide', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='collection.Guide')),
|
||||||
|
('guide_element_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='collection.GuideElementType', verbose_name='guide element type')),
|
||||||
|
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='collection.GuideElement')),
|
||||||
|
('product', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='product.Product')),
|
||||||
|
('review', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='review.Review')),
|
||||||
|
('section', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='collection.GuideElementSection')),
|
||||||
|
('wine_color_section', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='collection.GuideWineColorSection')),
|
||||||
|
('wine_region', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='location.WineRegion')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'guide element',
|
||||||
|
'verbose_name_plural': 'guide elements',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
31
apps/collection/migrations/0023_advertorial.py
Normal file
31
apps/collection/migrations/0023_advertorial.py
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-03 13:20
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('collection', '0022_guideelement'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Advertorial',
|
||||||
|
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')),
|
||||||
|
('number_of_pages', models.PositiveIntegerField(help_text='the total number of reserved pages', verbose_name='number of pages')),
|
||||||
|
('right_pages', models.PositiveIntegerField(help_text='the number of right pages (which are part of total number).', verbose_name='number of right pages')),
|
||||||
|
('old_id', models.IntegerField(blank=True, null=True)),
|
||||||
|
('guide_element', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='advertorial', to='collection.GuideElement', verbose_name='guide element')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'advertorial',
|
||||||
|
'verbose_name_plural': 'advertorials',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
|
import re
|
||||||
|
from mptt.models import MPTTModel, TreeForeignKey
|
||||||
from django.contrib.contenttypes.fields import ContentType
|
from django.contrib.contenttypes.fields import ContentType
|
||||||
from django.contrib.postgres.fields import JSONField
|
from django.contrib.postgres.fields import JSONField
|
||||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
import re
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from utils.models import ProjectBaseMixin, URLImageMixin
|
from utils.models import ProjectBaseMixin, URLImageMixin
|
||||||
|
|
@ -170,6 +171,9 @@ class Advertorial(ProjectBaseMixin):
|
||||||
right_pages = models.PositiveIntegerField(
|
right_pages = models.PositiveIntegerField(
|
||||||
verbose_name=_('number of right pages'),
|
verbose_name=_('number of right pages'),
|
||||||
help_text=_('the number of right pages (which are part of total number).'))
|
help_text=_('the number of right pages (which are part of total number).'))
|
||||||
|
guide_element = models.OneToOneField('GuideElement', on_delete=models.CASCADE,
|
||||||
|
related_name='advertorial',
|
||||||
|
verbose_name=_('guide element'))
|
||||||
old_id = models.IntegerField(blank=True, null=True)
|
old_id = models.IntegerField(blank=True, null=True)
|
||||||
|
|
||||||
objects = AdvertorialQuerySet.as_manager()
|
objects = AdvertorialQuerySet.as_manager()
|
||||||
|
|
@ -220,3 +224,123 @@ class GuideFilter(ProjectBaseMixin):
|
||||||
"""Meta class."""
|
"""Meta class."""
|
||||||
verbose_name = _('guide filter')
|
verbose_name = _('guide filter')
|
||||||
verbose_name_plural = _('guide filters')
|
verbose_name_plural = _('guide filters')
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementType(models.Model):
|
||||||
|
"""Model for type of guide elements."""
|
||||||
|
|
||||||
|
name = models.CharField(max_length=50,
|
||||||
|
verbose_name=_('name'))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name = _('guide element type')
|
||||||
|
verbose_name_plural = _('guide element types')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
"""Overridden str dunder."""
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class GuideWineColorSectionQuerySet(models.QuerySet):
|
||||||
|
"""QuerySet for model GuideWineColorSection."""
|
||||||
|
|
||||||
|
|
||||||
|
class GuideWineColorSection(ProjectBaseMixin):
|
||||||
|
"""Sections for wine colors."""
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255, verbose_name=_('section name'))
|
||||||
|
|
||||||
|
objects = GuideWineColorSectionQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name = _('guide wine color section')
|
||||||
|
verbose_name_plural = _('guide wine color sections')
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementSectionCategoryQuerySet(models.QuerySet):
|
||||||
|
"""QuerySet for model GuideElementSectionCategory."""
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementSectionCategory(ProjectBaseMixin):
|
||||||
|
"""Section category for guide element."""
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255,
|
||||||
|
verbose_name=_('category name'))
|
||||||
|
|
||||||
|
objects = GuideElementSectionCategoryQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name = _('guide element section category')
|
||||||
|
verbose_name_plural = _('guide element section categories')
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementSectionQuerySet(models.QuerySet):
|
||||||
|
"""QuerySet for model GuideElementSection."""
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementSection(ProjectBaseMixin):
|
||||||
|
"""Sections for guide element."""
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255, verbose_name=_('section name'))
|
||||||
|
category = models.ForeignKey(GuideElementSectionCategory, on_delete=models.PROTECT,
|
||||||
|
verbose_name=_('category'))
|
||||||
|
old_id = models.PositiveIntegerField(blank=True, null=True, default=None,
|
||||||
|
verbose_name=_('old id'))
|
||||||
|
|
||||||
|
objects = GuideElementSectionQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name = _('guide element section')
|
||||||
|
verbose_name_plural = _('guide element sections')
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElementQuerySet(models.QuerySet):
|
||||||
|
"""QuerySet for model Guide elements."""
|
||||||
|
|
||||||
|
|
||||||
|
class GuideElement(ProjectBaseMixin, MPTTModel):
|
||||||
|
"""Frozen state of elements of guide instance."""
|
||||||
|
|
||||||
|
guide_element_type = models.ForeignKey('GuideElementType', on_delete=models.SET_NULL,
|
||||||
|
null=True,
|
||||||
|
verbose_name=_('guide element type'))
|
||||||
|
establishment = models.ForeignKey('establishment.Establishment', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
review = models.ForeignKey('review.Review', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
wine_region = models.ForeignKey('location.WineRegion', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
product = models.ForeignKey('product.Product', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
priority = models.IntegerField(null=True, blank=True, default=None)
|
||||||
|
city = models.ForeignKey('location.City', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
wine_color_section = models.ForeignKey('GuideWineColorSection', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
section = models.ForeignKey('GuideElementSection', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
guide = models.ForeignKey('Guide', on_delete=models.SET_NULL,
|
||||||
|
null=True, blank=True, default=None)
|
||||||
|
parent = TreeForeignKey('self', on_delete=models.CASCADE,
|
||||||
|
null=True, blank=True,
|
||||||
|
related_name='children')
|
||||||
|
old_id = models.PositiveIntegerField(blank=True, null=True, default=None,
|
||||||
|
verbose_name=_('old id'))
|
||||||
|
|
||||||
|
objects = GuideElementQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
"""Meta class."""
|
||||||
|
verbose_name = _('guide element')
|
||||||
|
verbose_name_plural = _('guide elements')
|
||||||
|
|
||||||
|
class MPTTMeta:
|
||||||
|
order_insertion_by = ['guide_element_type']
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
"""Overridden dunder method."""
|
||||||
|
return self.guide_element_type.name if self.guide_element_type else self.id
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,15 @@
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from transfer.models import Guides, GuideFilters
|
from tqdm import tqdm
|
||||||
|
from establishment.models import Establishment
|
||||||
|
from review.models import Review
|
||||||
|
from location.models import WineRegion, City
|
||||||
|
from product.models import Product
|
||||||
|
from transfer.models import Guides, GuideFilters, GuideSections, GuideElements, \
|
||||||
|
GuideAds
|
||||||
from transfer.serializers.guide import GuideSerializer, GuideFilterSerializer
|
from transfer.serializers.guide import GuideSerializer, GuideFilterSerializer
|
||||||
|
from collection.models import GuideElementSection, GuideElementSectionCategory, \
|
||||||
|
GuideWineColorSection, GuideElementType, GuideElement, \
|
||||||
|
Guide, Advertorial
|
||||||
|
|
||||||
|
|
||||||
def transfer_guide():
|
def transfer_guide():
|
||||||
|
|
@ -14,14 +23,15 @@ def transfer_guide():
|
||||||
serialized_data.save()
|
serialized_data.save()
|
||||||
else:
|
else:
|
||||||
for d in serialized_data.errors: errors.append(d) if d else None
|
for d in serialized_data.errors: errors.append(d) if d else None
|
||||||
pprint(f"transfer_guide errors: {errors}")
|
pprint(f"ERRORS: {errors}")
|
||||||
|
print(f'COUNT OF SERIALIZED OBJECTS: {queryset.values().count()}')
|
||||||
|
|
||||||
|
|
||||||
def transfer_guide_filter():
|
def transfer_guide_filter():
|
||||||
"""Transfer GuideFilter model."""
|
"""Transfer GuideFilter model."""
|
||||||
errors = []
|
errors = []
|
||||||
queryset = GuideFilters.objects.exclude(guide__title__icontains='test') \
|
queryset = GuideFilters.objects.exclude(guide__title__icontains='test') \
|
||||||
.exclude(guide__id__isnull=True)
|
.exclude(guide__isnull=True)
|
||||||
serialized_data = GuideFilterSerializer(
|
serialized_data = GuideFilterSerializer(
|
||||||
data=list(queryset.values()),
|
data=list(queryset.values()),
|
||||||
many=True)
|
many=True)
|
||||||
|
|
@ -29,8 +39,250 @@ def transfer_guide_filter():
|
||||||
serialized_data.save()
|
serialized_data.save()
|
||||||
else:
|
else:
|
||||||
for d in serialized_data.errors: errors.append(d) if d else None
|
for d in serialized_data.errors: errors.append(d) if d else None
|
||||||
pprint(f"transfer_guide_filter errors: {errors}\n"
|
pprint(f'ERRORS: {errors}')
|
||||||
f"COUNT: {len(errors)}")
|
print(f"COUNT: {len(errors)}")
|
||||||
|
print(f'COUNT OF SERIALIZED OBJECTS: {queryset.values().count()}')
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_guide_element_section():
|
||||||
|
"""Transfer GuideSections model."""
|
||||||
|
created_count = 0
|
||||||
|
category, _ = GuideElementSectionCategory.objects.get_or_create(
|
||||||
|
name='shop_category')
|
||||||
|
queryset_values = GuideSections.objects.values_list('id', 'value_name')
|
||||||
|
for old_id, section_name in tqdm(queryset_values):
|
||||||
|
obj, created = GuideElementSection.objects.get_or_create(
|
||||||
|
name=section_name,
|
||||||
|
category=category,
|
||||||
|
old_id=old_id,
|
||||||
|
)
|
||||||
|
if created: created_count += 1
|
||||||
|
print(f'OBJECTS CREATED: {created_count}')
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_guide_wine_color_section():
|
||||||
|
"""Transfer GuideElements model (only wine color sections)."""
|
||||||
|
created_count = 0
|
||||||
|
queryset_values = GuideElements.objects.raw(
|
||||||
|
"""
|
||||||
|
select distinct(color),
|
||||||
|
1 as id
|
||||||
|
from guide_elements where color is not null;
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
for section_name in tqdm([i.color for i in queryset_values]):
|
||||||
|
obj, created = GuideWineColorSection.objects.get_or_create(
|
||||||
|
name=section_name
|
||||||
|
)
|
||||||
|
if created: created_count += 1
|
||||||
|
print(f'OBJECTS CREATED: {created_count}')
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_guide_element_type():
|
||||||
|
"""Transfer GuideElements model (only element types)."""
|
||||||
|
created_count = 0
|
||||||
|
queryset_values = GuideElements.objects.raw(
|
||||||
|
"""
|
||||||
|
select distinct(type),
|
||||||
|
1 as id
|
||||||
|
from guide_elements;
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
for element_type in tqdm([i.type for i in queryset_values]):
|
||||||
|
obj, created = GuideElementType.objects.get_or_create(
|
||||||
|
name=element_type
|
||||||
|
)
|
||||||
|
if created: created_count += 1
|
||||||
|
print(f'OBJECTS CREATED: {created_count}')
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_guide_elements_bulk():
|
||||||
|
"""Transfer Guide elements via bulk_create."""
|
||||||
|
def get_guide_element_type(guide_element_type: str):
|
||||||
|
if guide_element_type:
|
||||||
|
qs = GuideElementType.objects.filter(name__iexact=guide_element_type)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_establishment(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = Establishment.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_review(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = Review.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_wine_region(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = WineRegion.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_wine(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = Product.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_wine_color_section(color_section: str):
|
||||||
|
if color_section:
|
||||||
|
qs = GuideWineColorSection.objects.filter(name__iexact=color_section)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_city(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = City.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_guide_element_section(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = GuideElementSection.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_guide(old_id):
|
||||||
|
if old_id:
|
||||||
|
qs = Guide.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
def get_parent(old_id):
|
||||||
|
if old_id:
|
||||||
|
qs = GuideElement.objects.filter(old_id=old_id)
|
||||||
|
if qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
|
||||||
|
objects_to_update = []
|
||||||
|
base_queryset = GuideElements.objects.all()
|
||||||
|
|
||||||
|
for old_id, type, establishment_id, review_id, wine_region_id, \
|
||||||
|
wine_id, color, order_number, city_id, section_id, guide_id \
|
||||||
|
in tqdm(base_queryset.filter(parent_id__isnull=True)
|
||||||
|
.values_list('id', 'type', 'establishment_id',
|
||||||
|
'review_id', 'wine_region_id', 'wine_id',
|
||||||
|
'color', 'order_number', 'city_id',
|
||||||
|
'section_id', 'guide_id'),
|
||||||
|
desc='Check parent guide elements'):
|
||||||
|
if not GuideElement.objects.filter(old_id=old_id).exists():
|
||||||
|
guide = GuideElement(
|
||||||
|
old_id=old_id,
|
||||||
|
guide_element_type=get_guide_element_type(type),
|
||||||
|
establishment=get_establishment(establishment_id),
|
||||||
|
review=get_review(review_id),
|
||||||
|
wine_region=get_wine_region(wine_region_id),
|
||||||
|
product=get_wine(wine_id),
|
||||||
|
wine_color_section=get_wine_color_section(color),
|
||||||
|
priority=order_number,
|
||||||
|
city=get_city(city_id),
|
||||||
|
section=get_guide_element_section(section_id),
|
||||||
|
parent=None,
|
||||||
|
lft=1,
|
||||||
|
rght=1,
|
||||||
|
tree_id=1,
|
||||||
|
level=1,
|
||||||
|
)
|
||||||
|
# check old guide
|
||||||
|
if not guide_id:
|
||||||
|
objects_to_update.append(guide)
|
||||||
|
else:
|
||||||
|
old_guide = Guides.objects.exclude(title__icontains='test') \
|
||||||
|
.filter(id=guide_id)
|
||||||
|
if old_guide.exists():
|
||||||
|
guide.guide = get_guide(guide_id)
|
||||||
|
objects_to_update.append(guide)
|
||||||
|
|
||||||
|
# create parents
|
||||||
|
GuideElement.objects.bulk_create(objects_to_update)
|
||||||
|
pprint(f'CREATED PARENT GUIDE ELEMENTS W/ OLD_ID: {[i.old_id for i in objects_to_update]}')
|
||||||
|
print(f'COUNT OF CREATED OBJECTS: {len(objects_to_update)}')
|
||||||
|
|
||||||
|
# attach child guide elements
|
||||||
|
queryset_values = base_queryset.filter(parent_id__isnull=False) \
|
||||||
|
.order_by('-parent_id') \
|
||||||
|
.values_list('id', 'type', 'establishment_id',
|
||||||
|
'review_id', 'wine_region_id', 'wine_id',
|
||||||
|
'color', 'order_number', 'city_id',
|
||||||
|
'section_id', 'guide_id', 'parent_id')
|
||||||
|
for old_id, type, establishment_id, review_id, wine_region_id, \
|
||||||
|
wine_id, color, order_number, city_id, section_id, guide_id, parent_id \
|
||||||
|
in tqdm(sorted(queryset_values, key=lambda value: value[len(value)-1]),
|
||||||
|
desc='Check child guide elements'):
|
||||||
|
if not GuideElement.objects.filter(old_id=old_id).exists():
|
||||||
|
# check old guide
|
||||||
|
if guide_id:
|
||||||
|
old_guide = Guides.objects.exclude(title__icontains='test') \
|
||||||
|
.filter(id=guide_id)
|
||||||
|
if old_guide.exists():
|
||||||
|
GuideElement.objects.create(
|
||||||
|
old_id=old_id,
|
||||||
|
guide_element_type=get_guide_element_type(type),
|
||||||
|
establishment=get_establishment(establishment_id),
|
||||||
|
review=get_review(review_id),
|
||||||
|
wine_region=get_wine_region(wine_region_id),
|
||||||
|
product=get_wine(wine_id),
|
||||||
|
wine_color_section=get_wine_color_section(color),
|
||||||
|
priority=order_number,
|
||||||
|
city=get_city(city_id),
|
||||||
|
section=get_guide_element_section(section_id),
|
||||||
|
parent=get_parent(parent_id),
|
||||||
|
lft=1,
|
||||||
|
rght=1,
|
||||||
|
tree_id=1,
|
||||||
|
level=1,
|
||||||
|
guide=get_guide(guide_id),
|
||||||
|
)
|
||||||
|
|
||||||
|
pprint(f'CREATED CHILD GUIDE ELEMENTS W/ OLD_ID: {[i.old_id for i in objects_to_update]}')
|
||||||
|
print(f'COUNT OF CREATED OBJECTS: {len(objects_to_update)}')
|
||||||
|
|
||||||
|
# rebuild trees
|
||||||
|
GuideElement._tree_manager.rebuild()
|
||||||
|
|
||||||
|
|
||||||
|
def transfer_guide_element_advertorials():
|
||||||
|
"""Transfer Guide Advertorials model."""
|
||||||
|
def get_guide_element(old_id: int):
|
||||||
|
if old_id:
|
||||||
|
qs = GuideElement.objects.filter(old_id=old_id)
|
||||||
|
legacy_qs = GuideElements.objects.exclude(guide__isnull=True) \
|
||||||
|
.exclude(guide__title__icontains='test') \
|
||||||
|
.filter(id=guide_ad_node_id)
|
||||||
|
if qs.exists() and legacy_qs.exists():
|
||||||
|
return qs.first()
|
||||||
|
elif legacy_qs.exists() and not qs.exists():
|
||||||
|
raise ValueError(f'Guide element was not transfer correctly - {old_id}.')
|
||||||
|
|
||||||
|
objects_to_update = []
|
||||||
|
advertorials = GuideAds.objects.exclude(nb_pages__isnull=True) \
|
||||||
|
.exclude(nb_right_pages__isnull=True) \
|
||||||
|
.exclude(guide_ad_node_id__isnull=True) \
|
||||||
|
.values_list('id', 'nb_pages', 'nb_right_pages',
|
||||||
|
'guide_ad_node_id')
|
||||||
|
for old_id, nb_pages, nb_right_pages, guide_ad_node_id in tqdm(advertorials):
|
||||||
|
# check guide element
|
||||||
|
guide_element = get_guide_element(guide_ad_node_id)
|
||||||
|
|
||||||
|
if not Advertorial.objects.filter(old_id=old_id).exists() and guide_element:
|
||||||
|
objects_to_update.append(
|
||||||
|
Advertorial(
|
||||||
|
old_id=old_id,
|
||||||
|
number_of_pages=nb_pages,
|
||||||
|
right_pages=nb_right_pages,
|
||||||
|
guide_element=guide_element,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# create related child
|
||||||
|
Advertorial.objects.bulk_create(objects_to_update)
|
||||||
|
|
||||||
|
pprint(f'CREATED ADVERTORIALS W/ OLD_ID: {[i.old_id for i in objects_to_update]}')
|
||||||
|
print(f'COUNT OF CREATED OBJECTS: {len(objects_to_update)}')
|
||||||
|
|
||||||
|
|
||||||
data_types = {
|
data_types = {
|
||||||
|
|
@ -39,5 +291,29 @@ data_types = {
|
||||||
],
|
],
|
||||||
'guide_filters': [
|
'guide_filters': [
|
||||||
transfer_guide_filter,
|
transfer_guide_filter,
|
||||||
|
],
|
||||||
|
'guide_element_sections': [
|
||||||
|
transfer_guide_element_section,
|
||||||
|
],
|
||||||
|
'guide_wine_color_sections': [
|
||||||
|
transfer_guide_wine_color_section,
|
||||||
|
],
|
||||||
|
'guide_element_types': [
|
||||||
|
transfer_guide_element_type,
|
||||||
|
],
|
||||||
|
'guide_elements_bulk': [
|
||||||
|
transfer_guide_elements_bulk,
|
||||||
|
],
|
||||||
|
'guide_element_advertorials': [
|
||||||
|
transfer_guide_element_advertorials
|
||||||
|
],
|
||||||
|
'guide_complete': [
|
||||||
|
transfer_guide, # transfer guides from Guides
|
||||||
|
transfer_guide_filter, # transfer guide filters from GuideFilters
|
||||||
|
transfer_guide_element_section, # partial transfer element section from GuideSections
|
||||||
|
transfer_guide_wine_color_section, # partial transfer wine color section from GuideSections
|
||||||
|
transfer_guide_element_type, # partial transfer section types from GuideElements
|
||||||
|
transfer_guide_elements_bulk, # transfer result of GuideFilters from GuideElements
|
||||||
|
transfer_guide_element_advertorials, # transfer advertorials that linked to GuideElements
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,12 @@ class Command(BaseCommand):
|
||||||
'fill_city_gallery', # №3 - перенос галереи городов
|
'fill_city_gallery', # №3 - перенос галереи городов
|
||||||
'guides',
|
'guides',
|
||||||
'guide_filters',
|
'guide_filters',
|
||||||
|
'guide_element_sections',
|
||||||
|
'guide_wine_color_sections',
|
||||||
|
'guide_element_types',
|
||||||
|
'guide_elements_bulk',
|
||||||
|
'guide_element_advertorials',
|
||||||
|
'guide_complete',
|
||||||
]
|
]
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,6 @@ class TransferSerializerMixin(serializers.ModelSerializer):
|
||||||
qs = self.Meta.model.objects.filter(**validated_data)
|
qs = self.Meta.model.objects.filter(**validated_data)
|
||||||
if not qs.exists():
|
if not qs.exists():
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
# try:
|
|
||||||
# qs = self.Meta.model.objects.filter(**validated_data)
|
|
||||||
# if not qs.exists():
|
|
||||||
# return super().create(validated_data)
|
|
||||||
# except Exception:
|
|
||||||
# breakpoint()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def tag_category(self):
|
def tag_category(self):
|
||||||
|
|
|
||||||
|
|
@ -389,7 +389,7 @@ class GuideSections(MigrateMixin):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
managed = False
|
managed = False
|
||||||
db_table = 'guide_elements'
|
db_table = 'guide_sections'
|
||||||
|
|
||||||
|
|
||||||
class GuideElements(MigrateMixin):
|
class GuideElements(MigrateMixin):
|
||||||
|
|
@ -406,7 +406,7 @@ class GuideElements(MigrateMixin):
|
||||||
guide_ad = models.ForeignKey(GuideAds, models.DO_NOTHING, blank=True, null=True)
|
guide_ad = models.ForeignKey(GuideAds, models.DO_NOTHING, blank=True, null=True)
|
||||||
city = models.ForeignKey(Cities, models.DO_NOTHING, blank=True, null=True)
|
city = models.ForeignKey(Cities, models.DO_NOTHING, blank=True, null=True)
|
||||||
section = models.ForeignKey('GuideSections', models.DO_NOTHING, blank=True, null=True)
|
section = models.ForeignKey('GuideSections', models.DO_NOTHING, blank=True, null=True)
|
||||||
guide_id = models.IntegerField(blank=True, null=True)
|
guide = models.ForeignKey('Guides', models.DO_NOTHING, blank=True, null=True)
|
||||||
parent = models.ForeignKey('self', models.DO_NOTHING, blank=True, null=True)
|
parent = models.ForeignKey('self', models.DO_NOTHING, blank=True, null=True)
|
||||||
lft = models.IntegerField()
|
lft = models.IntegerField()
|
||||||
rgt = models.IntegerField()
|
rgt = models.IntegerField()
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,17 @@
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from django.utils.text import slugify
|
|
||||||
import yaml
|
import yaml
|
||||||
|
from django.utils.text import slugify
|
||||||
from pycountry import countries, subdivisions
|
from pycountry import countries, subdivisions
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from collection.models import Guide, GuideType, GuideFilter
|
from collection import models
|
||||||
from establishment.models import EstablishmentType
|
from establishment.models import EstablishmentType
|
||||||
from location.models import Country, Region, WineRegion
|
from location.models import Country, Region, WineRegion
|
||||||
from main.models import SiteSettings
|
from main.models import SiteSettings
|
||||||
|
from review.models import Review
|
||||||
from transfer.mixins import TransferSerializerMixin
|
from transfer.mixins import TransferSerializerMixin
|
||||||
from translation.models import Language
|
from translation.models import Language
|
||||||
from review.models import Review
|
|
||||||
|
|
||||||
|
|
||||||
class GuideSerializer(TransferSerializerMixin):
|
class GuideSerializer(TransferSerializerMixin):
|
||||||
|
|
@ -23,7 +24,7 @@ class GuideSerializer(TransferSerializerMixin):
|
||||||
inserter_field = serializers.CharField()
|
inserter_field = serializers.CharField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Guide
|
model = models.Guide
|
||||||
fields = (
|
fields = (
|
||||||
'id',
|
'id',
|
||||||
'title',
|
'title',
|
||||||
|
|
@ -46,13 +47,13 @@ class GuideSerializer(TransferSerializerMixin):
|
||||||
|
|
||||||
def get_state(self, state: str):
|
def get_state(self, state: str):
|
||||||
if state == 'built':
|
if state == 'built':
|
||||||
return Guide.BUILT
|
return models.Guide.BUILT
|
||||||
elif state == 'removing':
|
elif state == 'removing':
|
||||||
return Guide.REMOVING
|
return models.Guide.REMOVING
|
||||||
elif state == 'building':
|
elif state == 'building':
|
||||||
return Guide.BUILDING
|
return models.Guide.BUILDING
|
||||||
else:
|
else:
|
||||||
return Guide.WAITING
|
return models.Guide.WAITING
|
||||||
|
|
||||||
def get_site(self, site_id):
|
def get_site(self, site_id):
|
||||||
qs = SiteSettings.objects.filter(old_id=site_id)
|
qs = SiteSettings.objects.filter(old_id=site_id)
|
||||||
|
|
@ -60,7 +61,7 @@ class GuideSerializer(TransferSerializerMixin):
|
||||||
return qs.first()
|
return qs.first()
|
||||||
|
|
||||||
def get_guide_type(self, inserter_field):
|
def get_guide_type(self, inserter_field):
|
||||||
guide_type, _ = GuideType.objects.get_or_create(name=inserter_field)
|
guide_type, _ = models.GuideType.objects.get_or_create(name=inserter_field)
|
||||||
return guide_type
|
return guide_type
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -81,7 +82,7 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
||||||
guide_id = serializers.IntegerField()
|
guide_id = serializers.IntegerField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = GuideFilter
|
model = models.GuideFilter
|
||||||
fields = (
|
fields = (
|
||||||
'id',
|
'id',
|
||||||
'year',
|
'year',
|
||||||
|
|
@ -98,6 +99,11 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
||||||
'guide_id',
|
'guide_id',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def create(self, validated_data):
|
||||||
|
qs = self.Meta.model.objects.filter(guide=validated_data.get('guide'))
|
||||||
|
if not qs.exists():
|
||||||
|
return super().create(validated_data)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_ruby_helper(raw_value: str):
|
def parse_ruby_helper(raw_value: str):
|
||||||
"""Parse RubyActiveSupport records"""
|
"""Parse RubyActiveSupport records"""
|
||||||
|
|
@ -345,6 +351,6 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
||||||
return {'state': list(set(review_states))}
|
return {'state': list(set(review_states))}
|
||||||
|
|
||||||
def get_guide(self, old_guide_id: int):
|
def get_guide(self, old_guide_id: int):
|
||||||
qs = Guide.objects.filter(old_id=old_guide_id)
|
qs = models.Guide.objects.filter(old_id=old_guide_id)
|
||||||
if qs.exists():
|
if qs.exists():
|
||||||
return qs.first()
|
return qs.first()
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@ EXTERNAL_APPS = [
|
||||||
'storages',
|
'storages',
|
||||||
'sorl.thumbnail',
|
'sorl.thumbnail',
|
||||||
'timezonefinder',
|
'timezonefinder',
|
||||||
|
'mptt',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,3 +60,6 @@ celery==4.3.0
|
||||||
|
|
||||||
# country information
|
# country information
|
||||||
pycountry==19.8.18
|
pycountry==19.8.18
|
||||||
|
|
||||||
|
# sql-tree
|
||||||
|
django-mptt==0.9.1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user