recipe transfer

This commit is contained in:
alex 2019-12-16 17:02:20 +03:00
parent a120ea1f1b
commit 6c483dd228
6 changed files with 136 additions and 58 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.7 on 2019-12-16 06:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('recipe', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='recipe',
name='old_id',
field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id'),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.7 on 2019-12-16 13:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('recipe', '0002_recipe_old_id'),
]
operations = [
migrations.AddField(
model_name='recipe',
name='slug',
field=models.SlugField(max_length=255, null=True, unique=True, verbose_name='Slug'),
),
]

View File

@ -43,22 +43,19 @@ class Recipe(TranslatedFieldsMixin, ImageMixin, BaseAttributes):
STR_FIELD_NAME = 'title' STR_FIELD_NAME = 'title'
title = TJSONField(blank=True, null=True, default=None, verbose_name=_('Title'), title = TJSONField(blank=True, null=True, default=None, verbose_name=_('Title'), help_text='{"en-GB": "some text"}')
help_text='{"en-GB": "some text"}')
subtitle = TJSONField(blank=True, null=True, default=None, verbose_name=_('Subtitle'), subtitle = TJSONField(blank=True, null=True, default=None, verbose_name=_('Subtitle'),
help_text='{"en-GB": "some text"}') help_text='{"en-GB": "some text"}')
description = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'), description = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'),
help_text='{"en-GB": "some text"}') help_text='{"en-GB": "some text"}')
state = models.PositiveSmallIntegerField(default=WAITING, choices=STATE_CHOICES, state = models.PositiveSmallIntegerField(default=WAITING, choices=STATE_CHOICES, verbose_name=_('State'))
verbose_name=_('State')) author = models.CharField(max_length=255, blank=True, null=True, default=None, verbose_name=_('Author'))
author = models.CharField(max_length=255, blank=True, null=True, default=None, published_at = models.DateTimeField(verbose_name=_('Published at'), blank=True, default=None, null=True,
verbose_name=_('Author'))
published_at = models.DateTimeField(verbose_name=_('Published at'),
blank=True, default=None, null=True,
help_text=_('Published at')) help_text=_('Published at'))
published_scheduled_at = models.DateTimeField(verbose_name=_('Published scheduled at'), published_scheduled_at = models.DateTimeField(verbose_name=_('Published scheduled at'), blank=True, default=None,
blank=True, default=None, null=True, null=True, help_text=_('Published scheduled at'))
help_text=_('Published scheduled at')) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
slug = models.SlugField(unique=True, max_length=255, null=True, verbose_name=_('Slug'))
objects = RecipeQuerySet.as_manager() objects = RecipeQuerySet.as_manager()

View File

@ -1,19 +1,32 @@
from django.db.models import Value, IntegerField, F
from pprint import pprint from pprint import pprint
from transfer.models import PageTexts from transfer.models import PageTexts
from transfer.serializers.recipe import RecipeSerializer from transfer.serializers.recipe import RecipeSerializer
def transfer_recipe(): def transfer_recipe():
queryset = PageTexts.objects.filter(page__type="Recipe") queryset = PageTexts.objects.filter(
page__type='Recipe',
).values(
'id',
'title',
'summary',
'body',
'locale',
'state',
'slug',
'created_at',
'page__attachment_suffix_url',
'page__account_id',
)
serialized_data = RecipeSerializer(data=list(queryset.values()), many=True) serialized_data = RecipeSerializer(data=list(queryset), many=True)
if serialized_data.is_valid(): if serialized_data.is_valid():
serialized_data.save() serialized_data.save()
else: else:
pprint(f"News serializer errors: {serialized_data.errors}") pprint(f'Recipe serializer errors: {serialized_data.errors}')
data_types = { data_types = {
"recipe": [transfer_recipe] 'recipe': [transfer_recipe]
} }

View File

@ -13,7 +13,7 @@ class Command(BaseCommand):
'news', # перенос новостей (после №2) 'news', # перенос новостей (после №2)
'account', # №1 - перенос пользователей 'account', # №1 - перенос пользователей
'subscriber', 'subscriber',
'recipe', 'recipe', # №2 - рецепты
'partner', 'partner',
'establishment', # №3 - перенос заведений 'establishment', # №3 - перенос заведений
'gallery', 'gallery',

View File

@ -1,55 +1,87 @@
from rest_framework import serializers from rest_framework import serializers
from account.models import User
from recipe.models import Recipe from recipe.models import Recipe
from utils.legacy_parser import parse_legacy_news_content from utils.legacy_parser import parse_legacy_news_content
class RecipeSerializer(serializers.ModelSerializer): class RecipeSerializer(serializers.Serializer):
locale = serializers.CharField() id = serializers.IntegerField()
title = serializers.CharField(allow_null=True)
summary = serializers.CharField(allow_null=True, allow_blank=True)
body = serializers.CharField(allow_null=True) body = serializers.CharField(allow_null=True)
title = serializers.CharField() locale = serializers.CharField(allow_null=True)
state = serializers.CharField() state = serializers.CharField(allow_null=True)
created_at = serializers.DateTimeField(source="published_at", format='%m-%d-%Y %H:%M:%S') slug = serializers.CharField(allow_null=True)
created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S')
class Meta: page__attachment_suffix_url = serializers.CharField(allow_null=True)
model = Recipe page__account_id = serializers.IntegerField(allow_null=True)
fields = (
"body",
"title",
"state",
"created_at",
'locale',
)
def validate(self, data): def validate(self, data):
data["state"] = self.get_state(data) data.update({
data["title"] = self.get_title(data) 'old_id': data.pop('id'),
data["description"] = self.get_description(data) 'title': self.get_title(data),
data.pop("body") 'subtitle': self.get_subtitle(data),
data.pop("locale") 'description': self.get_description(data),
'state': self.get_state(data),
'created': data.pop('created_at'),
'image': self.get_image(data),
'created_by': self.get_account(data),
'modified_by': self.get_account(data),
})
data.pop('page__account_id')
data.pop('page__attachment_suffix_url')
data.pop('summary')
data.pop('body')
data.pop('locale')
return data return data
def create(self, validated_data): def create(self, validated_data):
return Recipe.objects.create(**validated_data) obj, _ = Recipe.objects.update_or_create(
old_id=validated_data['old_id'],
defaults=validated_data,
)
return obj
def get_state(self, obj): @staticmethod
if obj["state"] == "published": def get_title(data):
return Recipe.PUBLISHED if data.get('title') and data.get('locale'):
elif obj["state"] == "hidden": return {data['locale']: data['title']}
return Recipe.HIDDEN return None
elif obj["state"] == "published_exclusive":
return Recipe.PUBLISHED_EXCLUSIVE
else:
return Recipe.WAITING
def get_title(self, obj): @staticmethod
# tit = obj.get("title") def get_subtitle(data):
# return {"en-GB": tit} if data.get('summary') and data.get('locale'):
return {obj['locale']: obj['title']} return {data['locale']: data['summary']}
return None
def get_description(self, obj): @staticmethod
# desc = obj.get("body") def get_description(data):
# return {"en-GB": desc} if data.get('body') and data.get('locale'):
content = None content = parse_legacy_news_content(data['body'])
if obj['body']: return {data['locale']: content}
content = parse_legacy_news_content(obj['body']) return None
return {obj['locale']: content}
@staticmethod
def get_state(data):
value = data.get('state')
states = {
'published': Recipe.PUBLISHED,
'hidden': Recipe.HIDDEN,
'published_exclusive': Recipe.PUBLISHED_EXCLUSIVE
}
return states.get(value, Recipe.WAITING)
@staticmethod
def get_image(data):
values = (None, 'default/missing.png')
if data.get('page__attachment_suffix_url') not in values:
return data['page__attachment_suffix_url']
return None
@staticmethod
def get_account(data):
if data.get('page__account_id'):
return User.objects.filter(old_id=data['page__account_id']).first()
return None