Merge remote-tracking branch 'origin/feature/migrate-city-objects' into feature/migrate-city-objects
This commit is contained in:
commit
6142508421
|
|
@ -25,21 +25,23 @@ psql_field_type - тип уникального поля в postgresql
|
||||||
"""
|
"""
|
||||||
|
|
||||||
card = {
|
card = {
|
||||||
|
# как работать с GenericForeignKey(content_type) - ?
|
||||||
"Comment": {
|
"Comment": {
|
||||||
"data_type": "objects",
|
"data_type": "objects",
|
||||||
"dependencies": ("User",),
|
"dependencies": ("User",),
|
||||||
"fields": {
|
"fields": {
|
||||||
"text": "comment",
|
"Comments": {
|
||||||
"mark": "mark"
|
"text": "comment",
|
||||||
# как работать с GenericForeignKey - ?
|
"mark": ("mark", "PositiveIntegerField")
|
||||||
# "content_object" : ""
|
# как работать с GenericForeignKey - ?
|
||||||
|
# "content_object" : ""
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"relations": {
|
"relations": {
|
||||||
# нужен ответ по вопросу Как поступать со сбором данных
|
"Accounts": [
|
||||||
# "Accounts": [
|
(("account", None),
|
||||||
# (("account_id", "account_id"),
|
("User", "user", None, None))
|
||||||
# ("User", "id", "user", "PositiveIntegerField"))
|
]
|
||||||
# ]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,29 @@ NOTE: среди legacy таблиц совпадение для таблицы
|
||||||
|
|
||||||
card = {
|
card = {
|
||||||
# нету аналога для NewsType
|
# нету аналога для NewsType
|
||||||
|
"NewsType": {
|
||||||
|
"data_type": "dictionaries",
|
||||||
|
"dependencies": None,
|
||||||
|
"fields": {
|
||||||
|
"Pages": {
|
||||||
|
# будет только один тип новости "News"
|
||||||
|
# значения для поля "name" берутся из поля "type" legacy модели "Pages", притом type="News"
|
||||||
|
# Mysql - select distinct(type) from pages;
|
||||||
|
"name": "name"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
"News": {
|
"News": {
|
||||||
"data_type": "objects",
|
"data_type": "objects",
|
||||||
"dependencies": ("NewsType", "MetaDataContent", "Country", "Address"),
|
"dependencies": ("NewsType", "MetaDataContent", "Country", "Address"),
|
||||||
"fields": {
|
"fields": {
|
||||||
"NewsOlds": {
|
# нету аналогов для start, end, playlist
|
||||||
"title": ("title", "TJSONField"),
|
"Pages": {
|
||||||
|
"state": ("state", "PositiveSmallIntegerField"),
|
||||||
|
"template": ("template", "PositiveIntegerField"),
|
||||||
|
"image_url": ("attachment_file_name", "URLField"),
|
||||||
|
"preview_image_url": ("attachment_file_name", "URLField"),
|
||||||
|
|
||||||
# в NewsOlds нету аналога для поля subtitle модели News, также нет аналогов для полей start, end, playlist
|
# в NewsOlds нету аналога для поля subtitle модели News, также нет аналогов для полей start, end, playlist
|
||||||
# "subtitle": ""
|
# "subtitle": ""
|
||||||
|
|
@ -44,12 +61,22 @@ card = {
|
||||||
# с вставками шаблонизатора Ruby
|
# с вставками шаблонизатора Ruby
|
||||||
# "description" : "body"
|
# "description" : "body"
|
||||||
},
|
},
|
||||||
"relations":[
|
"relations": {
|
||||||
# "address": "",
|
"PageTexts": {
|
||||||
# "country": "",
|
"key": "page_id",
|
||||||
# "tags": "",
|
"fields": {
|
||||||
# "news_type": ""
|
"title": ("title", "TJSONField"),
|
||||||
# отложено до выяснения Уточнения и вопросы по мигратору(Как поступать со сбором данных)
|
"description": ("body", "TJSONField"),
|
||||||
|
"slug": ("slug", "SlugField")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# нету аналога для поля tags
|
||||||
|
"relations": {
|
||||||
|
"Pages": [
|
||||||
|
((None, "type"),
|
||||||
|
("NewsType", "news_type", "name", "CharField"))
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ card = {
|
||||||
"data_type": "objects",
|
"data_type": "objects",
|
||||||
"dependencies": None,
|
"dependencies": None,
|
||||||
"fields": {
|
"fields": {
|
||||||
|
# из EstablishmentBacklinks выбирать только те у которых type="Partner"
|
||||||
"EstablishmentBacklinks": {
|
"EstablishmentBacklinks": {
|
||||||
"url": "backlink_url",
|
"url": "backlink_url",
|
||||||
},
|
},
|
||||||
|
|
|
||||||
86
apps/recipe/transfer.py
Normal file
86
apps/recipe/transfer.py
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
"""
|
||||||
|
|
||||||
|
Структура записи в 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
|
||||||
|
|
||||||
|
|
||||||
|
NOTE: среди legacy таблиц совпадение для таблицы Address не найдено (Возможно для Address подходит Locations в legacy)
|
||||||
|
"""
|
||||||
|
|
||||||
|
# значения берутся из legacy модели "Pages", притом type="Recipe"
|
||||||
|
card = {
|
||||||
|
"Recipe": {
|
||||||
|
"data_type": "objects",
|
||||||
|
"dependencies": None,
|
||||||
|
"fields": {
|
||||||
|
"Pages": {
|
||||||
|
"state": ("state", "PositiveSmallIntegerField")
|
||||||
|
},
|
||||||
|
"relations": {
|
||||||
|
"PageTexts": {
|
||||||
|
"key": "page_id",
|
||||||
|
"fields": {
|
||||||
|
"title": ("title", "TJSONField"),
|
||||||
|
"description": ("body", "TJSONField")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
used_apps = None
|
||||||
|
|
@ -26,33 +26,39 @@ psql_field_type - тип уникального поля в postgresql
|
||||||
"""
|
"""
|
||||||
|
|
||||||
card = {
|
card = {
|
||||||
|
# как работать с GenericForeignKey(content_type) - ?
|
||||||
|
# как работать с ForeignKey на самого себя(self), поле "child"
|
||||||
|
# вопрос с внешним ключом language на таблицу Language
|
||||||
"Review": {
|
"Review": {
|
||||||
"data_type": "objects",
|
"data_type": "objects",
|
||||||
"dependencies": ("User",),
|
"dependencies": ("User", "Language", "Review"),
|
||||||
"fields": {
|
"fields": {
|
||||||
"Reviews": {
|
"Reviews": {
|
||||||
"published_at": "published_at",
|
"published_at": "published_at",
|
||||||
"vintage": "vintage",
|
"vintage": "vintage",
|
||||||
# как работать с GenericForeignKey - ?
|
"status": ("aasm_state", "PositiveSmallIntegerField")
|
||||||
|
|
||||||
# "content_object": ""
|
# "content_object": ""
|
||||||
},
|
},
|
||||||
"ReviewTexts": {
|
"relations": {
|
||||||
# полу text в модели Review имеет тип TJSONField, а поле text в модели ReviewTexts имеет тип TextField
|
"ReviewTexts": {
|
||||||
# при их сопоставлении использовать поле locale модели ReviewTexts
|
"key": "review",
|
||||||
"text": "text"
|
"fields": {
|
||||||
}
|
# полу text в модели Review имеет тип TJSONField, а поле text в модели ReviewTexts имеет тип TextField
|
||||||
|
# при их сопоставлении использовать поле locale модели ReviewTexts
|
||||||
|
"text": ("text", "TJSONField")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"relations": {
|
"relations": {
|
||||||
# вопрос с внешним ключом language
|
"Accounts": [
|
||||||
|
(("account", None),
|
||||||
# нужен ответ по вопросу как поступать со сбором данных
|
("User", "reviewer", None, None))
|
||||||
# "Accounts": [
|
]
|
||||||
# (("account_id", "account_id"),
|
|
||||||
# ("User", "id", "reviewer", "PositiveIntegerField"))
|
|
||||||
# ]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
used_apps = ("account", )
|
used_apps = ("account", "translation")
|
||||||
|
|
@ -629,4 +629,77 @@ class Comments(MigrateMixin):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
managed = False
|
managed = False
|
||||||
db_table = 'comments'
|
db_table = 'comments'
|
||||||
|
|
||||||
|
|
||||||
|
class Pages(MigrateMixin):
|
||||||
|
using = 'legacy'
|
||||||
|
|
||||||
|
root_title = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
site_id = models.IntegerField()
|
||||||
|
account_id = models.IntegerField(blank=True, null=True)
|
||||||
|
state = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
template = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
attachment_file_name = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
attachment_content_type = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
attachment_file_size = models.IntegerField(blank=True, null=True)
|
||||||
|
attachment_updated_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
geometries = models.CharField(max_length=1024, blank=True, null=True)
|
||||||
|
scheduled_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
created_at = models.DateTimeField()
|
||||||
|
published_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
updated_at = models.DateTimeField()
|
||||||
|
type = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
is_main = models.IntegerField(blank=True, null=True)
|
||||||
|
related_pages_id = models.TextField(blank=True, null=True)
|
||||||
|
config = models.CharField(max_length=1000, blank=True, null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'pages'
|
||||||
|
|
||||||
|
|
||||||
|
class PageTexts(MigrateMixin):
|
||||||
|
using = 'legacy'
|
||||||
|
|
||||||
|
title = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
slug = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
body = models.TextField(blank=True, null=True)
|
||||||
|
locale = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
state = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
page_id = models.IntegerField()
|
||||||
|
created_at = models.DateTimeField()
|
||||||
|
updated_at = models.DateTimeField()
|
||||||
|
summary = models.TextField(blank=True, null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'page_texts'
|
||||||
|
|
||||||
|
|
||||||
|
class PageCounters(MigrateMixin):
|
||||||
|
using = 'legacy'
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
count = models.IntegerField(blank=True, null=True)
|
||||||
|
page = models.ForeignKey('Pages', models.DO_NOTHING, blank=True, null=True)
|
||||||
|
created_at = models.DateTimeField()
|
||||||
|
updated_at = models.DateTimeField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'page_counters'
|
||||||
|
|
||||||
|
|
||||||
|
class PageMetadata(MigrateMixin):
|
||||||
|
using = 'legacy'
|
||||||
|
|
||||||
|
key = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
value = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
page_id = models.IntegerField(blank=True, null=True)
|
||||||
|
created_at = models.DateTimeField()
|
||||||
|
updated_at = models.DateTimeField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'page_metadata'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user