finalizing transfer guides
This commit is contained in:
parent
076d14fd5b
commit
627f7562ec
|
|
@ -1,4 +1,6 @@
|
|||
from django.contrib.gis import admin
|
||||
from mptt.admin import DraggableMPTTAdmin, TreeRelatedFieldListFilter
|
||||
from utils.admin import BaseModelAdminMixin
|
||||
|
||||
from collection import models
|
||||
|
||||
|
|
@ -11,3 +13,22 @@ class CollectionAdmin(admin.ModelAdmin):
|
|||
@admin.register(models.Guide)
|
||||
class GuideAdmin(admin.ModelAdmin):
|
||||
"""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.postgres.fields import JSONField
|
||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||
from django.db import models
|
||||
import re
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from utils.models import ProjectBaseMixin, URLImageMixin
|
||||
|
|
@ -170,6 +171,9 @@ class Advertorial(ProjectBaseMixin):
|
|||
right_pages = models.PositiveIntegerField(
|
||||
verbose_name=_('number of right pages'),
|
||||
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)
|
||||
|
||||
objects = AdvertorialQuerySet.as_manager()
|
||||
|
|
@ -220,3 +224,123 @@ class GuideFilter(ProjectBaseMixin):
|
|||
"""Meta class."""
|
||||
verbose_name = _('guide filter')
|
||||
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 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 collection.models import GuideElementSection, GuideElementSectionCategory, \
|
||||
GuideWineColorSection, GuideElementType, GuideElement, \
|
||||
Guide, Advertorial
|
||||
|
||||
|
||||
def transfer_guide():
|
||||
|
|
@ -14,14 +23,15 @@ def transfer_guide():
|
|||
serialized_data.save()
|
||||
else:
|
||||
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():
|
||||
"""Transfer GuideFilter model."""
|
||||
errors = []
|
||||
queryset = GuideFilters.objects.exclude(guide__title__icontains='test') \
|
||||
.exclude(guide__id__isnull=True)
|
||||
.exclude(guide__isnull=True)
|
||||
serialized_data = GuideFilterSerializer(
|
||||
data=list(queryset.values()),
|
||||
many=True)
|
||||
|
|
@ -29,8 +39,250 @@ def transfer_guide_filter():
|
|||
serialized_data.save()
|
||||
else:
|
||||
for d in serialized_data.errors: errors.append(d) if d else None
|
||||
pprint(f"transfer_guide_filter errors: {errors}\n"
|
||||
f"COUNT: {len(errors)}")
|
||||
pprint(f'ERRORS: {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 = {
|
||||
|
|
@ -39,5 +291,29 @@ data_types = {
|
|||
],
|
||||
'guide_filters': [
|
||||
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 - перенос галереи городов
|
||||
'guides',
|
||||
'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):
|
||||
|
|
|
|||
|
|
@ -39,12 +39,6 @@ class TransferSerializerMixin(serializers.ModelSerializer):
|
|||
qs = self.Meta.model.objects.filter(**validated_data)
|
||||
if not qs.exists():
|
||||
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
|
||||
def tag_category(self):
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ class GuideSections(MigrateMixin):
|
|||
|
||||
class Meta:
|
||||
managed = False
|
||||
db_table = 'guide_elements'
|
||||
db_table = 'guide_sections'
|
||||
|
||||
|
||||
class GuideElements(MigrateMixin):
|
||||
|
|
@ -406,7 +406,7 @@ class GuideElements(MigrateMixin):
|
|||
guide_ad = models.ForeignKey(GuideAds, 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)
|
||||
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)
|
||||
lft = models.IntegerField()
|
||||
rgt = models.IntegerField()
|
||||
|
|
|
|||
|
|
@ -1,16 +1,17 @@
|
|||
from itertools import chain
|
||||
from django.utils.text import slugify
|
||||
|
||||
import yaml
|
||||
from django.utils.text import slugify
|
||||
from pycountry import countries, subdivisions
|
||||
from rest_framework import serializers
|
||||
|
||||
from collection.models import Guide, GuideType, GuideFilter
|
||||
from collection import models
|
||||
from establishment.models import EstablishmentType
|
||||
from location.models import Country, Region, WineRegion
|
||||
from main.models import SiteSettings
|
||||
from review.models import Review
|
||||
from transfer.mixins import TransferSerializerMixin
|
||||
from translation.models import Language
|
||||
from review.models import Review
|
||||
|
||||
|
||||
class GuideSerializer(TransferSerializerMixin):
|
||||
|
|
@ -23,7 +24,7 @@ class GuideSerializer(TransferSerializerMixin):
|
|||
inserter_field = serializers.CharField()
|
||||
|
||||
class Meta:
|
||||
model = Guide
|
||||
model = models.Guide
|
||||
fields = (
|
||||
'id',
|
||||
'title',
|
||||
|
|
@ -46,13 +47,13 @@ class GuideSerializer(TransferSerializerMixin):
|
|||
|
||||
def get_state(self, state: str):
|
||||
if state == 'built':
|
||||
return Guide.BUILT
|
||||
return models.Guide.BUILT
|
||||
elif state == 'removing':
|
||||
return Guide.REMOVING
|
||||
return models.Guide.REMOVING
|
||||
elif state == 'building':
|
||||
return Guide.BUILDING
|
||||
return models.Guide.BUILDING
|
||||
else:
|
||||
return Guide.WAITING
|
||||
return models.Guide.WAITING
|
||||
|
||||
def get_site(self, site_id):
|
||||
qs = SiteSettings.objects.filter(old_id=site_id)
|
||||
|
|
@ -60,7 +61,7 @@ class GuideSerializer(TransferSerializerMixin):
|
|||
return qs.first()
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -81,7 +82,7 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
|||
guide_id = serializers.IntegerField()
|
||||
|
||||
class Meta:
|
||||
model = GuideFilter
|
||||
model = models.GuideFilter
|
||||
fields = (
|
||||
'id',
|
||||
'year',
|
||||
|
|
@ -98,6 +99,11 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
|||
'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
|
||||
def parse_ruby_helper(raw_value: str):
|
||||
"""Parse RubyActiveSupport records"""
|
||||
|
|
@ -345,6 +351,6 @@ class GuideFilterSerializer(TransferSerializerMixin):
|
|||
return {'state': list(set(review_states))}
|
||||
|
||||
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():
|
||||
return qs.first()
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ EXTERNAL_APPS = [
|
|||
'storages',
|
||||
'sorl.thumbnail',
|
||||
'timezonefinder',
|
||||
'mptt',
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -60,3 +60,6 @@ celery==4.3.0
|
|||
|
||||
# country information
|
||||
pycountry==19.8.18
|
||||
|
||||
# sql-tree
|
||||
django-mptt==0.9.1
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user