diff --git a/apps/collection/migrations/0027_auto_20191218_0753.py b/apps/collection/migrations/0027_auto_20191218_0753.py new file mode 100644 index 00000000..3314a01f --- /dev/null +++ b/apps/collection/migrations/0027_auto_20191218_0753.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.7 on 2019-12-18 07:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('gallery', '0007_auto_20191211_1528'), + ('collection', '0026_merge_20191217_1151'), + ] + + operations = [ + migrations.RemoveField( + model_name='advertorial', + name='gallery', + ), + migrations.AddField( + model_name='guideelement', + name='label_photo', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='gallery.Image', verbose_name='label photo'), + ), + migrations.DeleteModel( + name='AdvertorialGallery', + ), + ] diff --git a/apps/collection/models.py b/apps/collection/models.py index df570c0f..90837cd7 100644 --- a/apps/collection/models.py +++ b/apps/collection/models.py @@ -227,7 +227,7 @@ class AdvertorialQuerySet(models.QuerySet): """QuerySet for model Advertorial.""" -class Advertorial(GalleryModelMixin, ProjectBaseMixin): +class Advertorial(ProjectBaseMixin): """Guide advertorial model.""" number_of_pages = models.PositiveIntegerField( verbose_name=_('number of pages'), @@ -239,7 +239,6 @@ class Advertorial(GalleryModelMixin, ProjectBaseMixin): related_name='advertorial', verbose_name=_('guide element')) old_id = models.IntegerField(blank=True, null=True) - gallery = models.ManyToManyField('gallery.Image', through='AdvertorialGallery') objects = AdvertorialQuerySet.as_manager() @@ -249,24 +248,6 @@ class Advertorial(GalleryModelMixin, ProjectBaseMixin): verbose_name_plural = _('advertorials') -class AdvertorialGallery(IntermediateGalleryModelMixin): - """Advertorial gallery model.""" - advertorial = models.ForeignKey(Advertorial, null=True, - related_name='advertorial_gallery', - on_delete=models.CASCADE, - verbose_name=_('advertorial')) - image = models.ForeignKey('gallery.Image', null=True, - related_name='advertorial_gallery', - on_delete=models.CASCADE, - verbose_name=_('image')) - - class Meta: - """Meta class.""" - verbose_name = _('advertorial gallery') - verbose_name_plural = _('advertorial galleries') - unique_together = (('advertorial', 'image'), ) - - class GuideFilterQuerySet(models.QuerySet): """QuerySet for model GuideFilter.""" @@ -411,6 +392,9 @@ class GuideElement(ProjectBaseMixin, MPTTModel): parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') + label_photo = models.ForeignKey('gallery.Image', on_delete=models.SET_NULL, + null=True, blank=True, default=None, + verbose_name=_('label photo')) old_id = models.PositiveIntegerField(blank=True, null=True, default=None, verbose_name=_('old id')) diff --git a/apps/collection/transfer_data.py b/apps/collection/transfer_data.py index 64131493..a268f62b 100644 --- a/apps/collection/transfer_data.py +++ b/apps/collection/transfer_data.py @@ -4,7 +4,7 @@ from tqdm import tqdm from collection.models import GuideElementSection, GuideElementSectionCategory, \ GuideWineColorSection, GuideElementType, GuideElement, \ - Guide, Advertorial, AdvertorialGallery + Guide, Advertorial from establishment.models import Establishment from gallery.models import Image from location.models import WineRegion, City @@ -13,6 +13,7 @@ from review.models import Review from transfer.models import Guides, GuideFilters, GuideSections, GuideElements, \ GuideAds, LabelPhotos from transfer.serializers.guide import GuideSerializer, GuideFilterSerializer +from django.db.models import Subquery def transfer_guide(): @@ -255,7 +256,7 @@ def transfer_guide_element_advertorials(): 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) + .filter(id=old_id) if qs.exists() and legacy_qs.exists(): return qs.first() elif legacy_qs.exists() and not qs.exists(): @@ -288,40 +289,53 @@ def transfer_guide_element_advertorials(): print(f'COUNT OF CREATED OBJECTS: {len(objects_to_update)}') -def transfer_guide_element_advertorial_galleries(): +def transfer_guide_element_label_photo(): """Transfer galleries for Guide Advertorial model.""" - def get_guide_element_advertorial(old_id: int): - if old_id: - qs = Advertorial.objects.filter(old_id=old_id) - legacy_qs = GuideAds.objects.filter(id=old_id) - if qs.exists() and legacy_qs.exists(): - return qs.first() - elif legacy_qs.exists() and not qs.exists(): - raise ValueError(f'Guide element advertorials was not transfer correctly - {old_id}.') + def get_guide_element(guide_ad): + legacy_guide_element_id = guide_ad.guide_ad_node.id - created_counter = 0 - gallery_obj_exists_counter = 0 - advertorial_galleries = LabelPhotos.objects.exclude(guide_ad__isnull=False) \ - .values_list('guide_ad', 'attachment_suffix_url') - for guide_ad, attachment_suffix_url in tqdm(advertorial_galleries): - advertorial = get_guide_element_advertorial(guide_ad.id) - image, _ = Image.objects.get_or_create(image=attachment_suffix_url, - defaults={ - 'image': attachment_suffix_url, - 'orientation': Image.HORIZONTAL, - 'title': f'{advertorial.name} - ' - f'{attachment_suffix_url}', - }) - city_gallery, created = AdvertorialGallery.objects.get_or_create(image=image, - advertorial=advertorial, - is_main=True) - if created: - created_counter += 1 + legacy_guide_element_qs = GuideElements.objects.filter(id=legacy_guide_element_id) + guide_element_qs = GuideElement.objects.filter(old_id=legacy_guide_element_id) + + if guide_element_qs.exists() and legacy_guide_element_qs.exists(): + return guide_element_qs.first() else: - gallery_obj_exists_counter += 1 + raise ValueError(f'Guide element was not transfer correctly - ' + f'{legacy_guide_element_id}.') - print(f'Created: {created_counter}\n' - f'Already added: {gallery_obj_exists_counter}') + to_update = [] + not_updated = 0 + guide_element_label_photos = LabelPhotos.objects.exclude(guide_ad__isnull=True) \ + .filter(guide_ad__type='GuideAdLabel') \ + .distinct() \ + .values_list('guide_ad', 'attachment_suffix_url') + for guide_ad_id, attachment_suffix_url in tqdm(guide_element_label_photos): + legacy_guide_element_ids = Subquery( + GuideElements.objects.exclude(guide__isnull=True) + .exclude(guide__title__icontains='test') + .values_list('id', flat=True) + ) + legacy_guide_ad_qs = GuideAds.objects.filter(id=guide_ad_id, + guide_ad_node_id__in=legacy_guide_element_ids) + if legacy_guide_ad_qs.exists(): + guide_element = get_guide_element(legacy_guide_ad_qs.first()) + if guide_element: + image, _ = Image.objects.get_or_create(image=attachment_suffix_url, + defaults={ + 'image': attachment_suffix_url, + 'orientation': Image.HORIZONTAL, + 'title': f'{guide_element.__str__()} ' + f'{guide_element.id} - ' + f'{attachment_suffix_url}'}) + if not guide_element.label_photo: + guide_element.label_photo = image + to_update.append(guide_element) + else: + not_updated += 1 + + GuideElement.objects.bulk_update(to_update, ['label_photo', ]) + print(f'Added label photo to {len(to_update)} objects\n' + f'Objects {not_updated} not updated') data_types = { @@ -344,10 +358,10 @@ data_types = { transfer_guide_elements_bulk, ], 'guide_element_advertorials': [ - transfer_guide_element_advertorials + transfer_guide_element_advertorials, ], - 'guide_element_advertorial_galleries': [ - + 'guide_element_label_photo': [ + transfer_guide_element_label_photo, ], 'guide_complete': [ transfer_guide, # transfer guides from Guides @@ -357,6 +371,6 @@ data_types = { 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 - transfer_guide_element_advertorial_galleries, # transfer advertorial galleries + transfer_guide_element_label_photo, # transfer guide element label photos ] } diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index 4e849b13..0c28a581 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -48,6 +48,7 @@ class Command(BaseCommand): 'guide_element_types', 'guide_elements_bulk', 'guide_element_advertorials', + 'guide_element_label_photo', 'guide_complete', 'languages', # №4 - перенос языков ] diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 8879ef8e..6a9ba3af 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -343,7 +343,7 @@ class GuideAds(MigrateMixin): nb_right_pages = models.IntegerField(blank=True, null=True) created_at = models.DateTimeField() updated_at = models.DateTimeField() - guide_ad_node_id = models.IntegerField(blank=True, null=True) + guide_ad_node = models.ForeignKey('GuideElements', on_delete=models.DO_NOTHING, blank=True, null=True) type = models.CharField(max_length=255, blank=True, null=True) class Meta: @@ -1232,7 +1232,7 @@ class LabelPhotos(MigrateMixin): attachment_content_type = models.CharField(max_length=255) attachment_file_size = models.IntegerField() attachment_updated_at = models.DateTimeField() - attachment_suffix_url = models.DateTimeField() + attachment_suffix_url = models.CharField(max_length=255) geometries = models.CharField(max_length=1024) class Meta: