Repository: fidals/shopelectro

Issue:
Change 1C export algo for Tags
В этой задаче речь идёт только о файле тегов:
shopelectro/management/commands/_update_catalog/update_tags.py

27.11.18 Произошла неприятная история.
Контентщик выгрузил нес-ко тегов для гирлянд, но они пропали от нашей выгрузки.
Сейчас выгрузка Тегов просто сносит всё что есть и заново накатывает из 1С. Мы немного изменим эту политику.

Реализуй такой алгоритм:
- все Теги, что зашли из 1С, заливаем в базу с перезаписью
- все Теги, что есть в базе, но нет в 1С, не трогаем




Discussion:
@artemiy312 , видел, что ты замержил нынешний код выгрузки 11.04.17
Нужно понять один момент. Есть надежда, что ты помнишь о нём:

Зачем нужен delete() всех тегов, что были в базе, да не были в 1С?
Это чисто для бизнес-логики или из-за каких-то кривых данных в файлах 1С?

Resolving patch:
diff --git a/shopelectro/management/commands/_update_catalog/update_tags.py b/shopelectro/management/commands/_update_catalog/update_tags.py
--- a/shopelectro/management/commands/_update_catalog/update_tags.py
+++ b/shopelectro/management/commands/_update_catalog/update_tags.py
@@ -1,13 +1,12 @@
 import logging
 from copy import deepcopy
-from itertools import chain
 from typing import Iterator, Dict
 from xml.etree.ElementTree import Element
 
 from django.db import transaction
 
 from shopelectro.management.commands._update_catalog.utils import (
-    XmlFile, is_correct_uuid, UUID, Data,
+    Data, is_correct_uuid, UUID_TYPE, XmlFile
 )
 from shopelectro.models import Tag, TagGroup
 
@@ -63,7 +62,7 @@ def get_uuid_name_pair(
 
 
 @transaction.atomic
-def create_or_update(data: Dict[UUID, Data]):
+def create_or_update(data: Dict[UUID_TYPE, Data]):
     group_data = deepcopy(data)
 
     created_groups_count = 0
@@ -90,26 +89,7 @@ def create_or_update(data: Dict[UUID, Data]):
     logger.info(f'{created_tags_count} tags were created.')
 
 
-@transaction.atomic
-def delete(group_data: Dict[UUID, Data]):
-    group_data = deepcopy(group_data)
-
-    group_uuids = group_data.keys()
-    tag_uuids = set(chain.from_iterable(
-        data['tags'].keys()
-        for data in group_data.values()
-    ))
-
-    if not (group_uuids and tag_uuids):
-        return
-
-    group_count, _ = TagGroup.objects.exclude(uuid__in=group_uuids).delete()
-    tag_count, _ = Tag.objects.exclude(uuid__in=tag_uuids).delete()
-
-    logger.info(f'{group_count} tag groups and {tag_count} tags were deleted.')
-
-
-def prepare_data(group_data: Iterator) -> Dict[UUID, Data]:
+def prepare_data(group_data: Iterator) -> Dict[UUID_TYPE, Data]:
     def assembly_structure(group_uuid: str, group_data_: dict):
         tags_data = group_data_.pop('tags_data', [])
         tags = {
@@ -135,4 +115,3 @@ def assembly_structure(group_uuid: str, group_data_: dict):
 def main(*args, **kwargs):
     cleared_group_data = prepare_data(tag_file.get_data())
     create_or_update(cleared_group_data)
-    delete(cleared_group_data)
diff --git a/shopelectro/management/commands/_update_catalog/utils.py b/shopelectro/management/commands/_update_catalog/utils.py
--- a/shopelectro/management/commands/_update_catalog/utils.py
+++ b/shopelectro/management/commands/_update_catalog/utils.py
@@ -15,7 +15,8 @@
 
 
 logger = logging.getLogger(__name__)
-Data = Dict[str, str]
+UUID_TYPE = str
+Data = Dict[str, Dict[str, dict]]
 NOT_SAVE_TEMPLATE = '{entity} with name="{name}" has no {field}. It\'ll not be' \
                     ' saved'
 


Test patch:
diff --git a/shopelectro/tests/tests_commands.py b/shopelectro/tests/tests_commands.py
--- a/shopelectro/tests/tests_commands.py
+++ b/shopelectro/tests/tests_commands.py
@@ -125,26 +125,6 @@ def test_update_or_create_tags(self):
         self.assertEqual(updated_groups_count + create_count, TagGroup.objects.count())
         self.assertEqual(updated_tags_count + create_count, Tag.objects.count())
 
-    def test_delete_tags(self):
-        groups_count = 2
-
-        tag_data = {
-            str(group.uuid): {
-                'name': 'some name',
-                'tags': {
-                    tag.uuid: {'name': tag.name}
-                    for tag in Tag.objects.filter(group=group)
-                }
-            } for group in TagGroup.objects.all()[:groups_count]
-        }
-
-        tag_count = sum(len(data['tags']) for data in tag_data.values())
-
-        update_tags.delete(tag_data)
-
-        self.assertEqual(Tag.objects.count(), tag_count)
-        self.assertEqual(TagGroup.objects.count(), groups_count)
-
 
 class GeneratePrices(TestCase):