diff --git a/apps/main/transfer.py b/apps/main/transfer.py new file mode 100644 index 00000000..0d22ef72 --- /dev/null +++ b/apps/main/transfer.py @@ -0,0 +1,146 @@ +""" + +Структура записи в card: +Название таблицы в postgresql: { + "data_type": "тип данных в таблице (словарь, объект, дочерний объект и так далее)", + "dependencies": кортеж с зависимостями от других таблиц в postgresql, + "fields": список полей для таблицы postgresql, пример: + { + "название legacy таблицы": { + список полей для переноса, пример структуры описан далее + }, + "relations": список зависимостей legacy-таблицы, пример: + { + # имеет внешний ключ на "название legacy таблицы" из "fields" + "название legacy таблицы": { + "key": ключ для связи. Строка, если тип поля в legacy таблице - ForeignKey, или кортеж из названия поля + в дочерней таблице и названия поля в родительской таблице в ином случае + "fields": { + список полей для переноса, пример структуры описан далее + } + } + } + }, + "relations": список внешних ключей таблицы postgresql, пример структуры описан далее + { + "Cities": [( + (None, "region_code"), + ("Region", "region", "code", "CharField")), + ((None, "country_code_2"), + ("Country", "country", "code", "CharField")) + ] + } +}, + + +Структура fields: +key - поле в таблице postgres +value - поле или группа полей в таблице legacy + +В случае передачи группы полей каждое поле представляет собой кортеж, где: +field[0] - название аргумента +field[1] - название поля в таблице legacy +Опционально: field[2] - тип данных для преобразования + +Структура внешних ключей: +"legacy_table" - спикок кортежей для сопоставления полей +"legacy_table": [ + (("legacy_key", "legacy_field"), + ("psql_table", "psql_key", "psql_field", "psql_field_type")) +], где: +legacy_table - название модели legacy +legacy_key - ForeignKey в legacy +legacy_field - уникальное поле в модели legacy для сопоставления с postgresql +psql_table - название модели psql +psql_key - ForeignKey в postgresql +psql_field - уникальное поле в модели postgresql для сопоставления с legacy +psql_field_type - тип уникального поля в postgresql + + +""" + +card = { + "SiteSettings": { + "data_type": "objects", + "dependencies": ("Country",), + "fields": { + "SiteSettings": { + "subdomain": "country_code_2", + "pinterest_page_url": "pinterest_page_url", + "twitter_page_url": "twitter_page_url", + "facebook_page_url": "facebook_page_url", + "instagram_page_url": "instagram_page_url", + "contact_email": "contact_email", + "config": ("config", "JSONField") #TODO в качесте ключа использовать country_code_2 из legacy - ? + }, + # "relations": { + # # Как работать c отношение OneToOneField + # } + } + + }, + "Feature": { + "data_type": "objects", + "dependencies": ("SiteSettings",), + "fields": { + "Features": { + "slug": "slug" + } + }, + # поле "site_settings" ManyToManyField имеет through='SiteFeature' в postgres + # "relations": { # как работать с ManyToManyField + # + # } + }, + "SiteFeature": { + "data_type": "objects", + "dependencies": ("SiteSettings", "Feature"), + "fields": { + "SiteFeatures": { + "published": ("state", "BooleanField") + } + }, + "relations": { + "Sites": [( + ("site", None), + ("SiteSettings", "site_settings", None, None)) + ], + "Features": [( + ("feature", None), + ("Feature", "feature", None, None)) + ] + } + }, + "AwardType": { + "data_type": "objects", + "dependencies": ("Country",), + "fields": { + "AwardTypes": { + "name": "title" + } + }, + # вопрос с ForeignKey на Country + # "relations": { + # + # } + }, + "Award": { + "data_type": "objects", + "dependencies": ("AwardType", "ContentType"), + "fields": { + "Awards": { + "title": ("title", "TJSONField"), + "vintage_year": "year", + } + }, + #TODO вопрос с content_type + "relations": { + "AwardTypes": [( + ("award_type", None), + ("AwardType", "award_type", None, None)) + ] + } + } +} + +used_apps = ("locations", ) \ No newline at end of file diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 2789427e..673966d6 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -10,6 +10,84 @@ from django.contrib.gis.db import models from transfer.mixins import MigrateMixin +class Sites(MigrateMixin): + using = 'legacy' + + country_code_2 = models.CharField(max_length=255, blank=True, null=True) + pinterest_page_url = models.CharField(max_length=255, blank=True, null=True) + twitter_page_url = models.CharField(max_length=255, blank=True, null=True) + facebook_page_url = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + contact_email = models.CharField(max_length=255, blank=True, null=True) + config = models.CharField(max_length=3000, blank=True, null=True) + released = models.IntegerField(blank=True, null=True) + instagram_page_url = models.CharField(max_length=255, blank=True, null=True) + ad_config = models.TextField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'sites' + + +class Features(MigrateMixin): + using = 'legacy' + + slug = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'features' + + +class SiteFeatures(MigrateMixin): + using = 'legacy' + + site = models.ForeignKey('Sites', models.DO_NOTHING, blank=True, null=True) + feature = models.ForeignKey(Features, models.DO_NOTHING, blank=True, null=True) + state = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'site_features' + + +class AwardTypes(MigrateMixin): + using = 'legacy' + + site = models.ForeignKey('Sites', models.DO_NOTHING, blank=True, null=True) + title = models.CharField(max_length=255, blank=True, null=True) + region = models.IntegerField(blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'award_types' + + +class Awards(MigrateMixin): + using = 'legacy' + + profile_id = models.IntegerField(blank=True, null=True) + award_type = models.ForeignKey(AwardTypes, models.DO_NOTHING, blank=True, null=True) + award = models.CharField(max_length=255, blank=True, null=True) + title = models.CharField(max_length=255, blank=True, null=True) + region_code = models.CharField(max_length=255, blank=True, null=True) + year = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + state = models.CharField(max_length=255, blank=True, null=True) + + class Meta: + managed = False + db_table = 'awards' + + class Ezuser(MigrateMixin): using = 'legacy'