From 6af7a7da5bb6bbe211025ad86f053c52d11ca687 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Mon, 9 Dec 2019 17:47:37 +0300 Subject: [PATCH] add footer migrations and api --- apps/main/management/commands/add_footers.py | 32 ++++++++++++++++++++ apps/main/migrations/0040_footer.py | 29 ++++++++++++++++++ apps/main/models.py | 9 ++++++ apps/main/serializers.py | 30 ++++++++++++++++++ apps/main/urls/back.py | 2 ++ apps/main/views/back.py | 16 +++++++++- apps/transfer/models.py | 14 +++++++++ make_data_migration.sh | 3 ++ 8 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 apps/main/management/commands/add_footers.py create mode 100644 apps/main/migrations/0040_footer.py diff --git a/apps/main/management/commands/add_footers.py b/apps/main/management/commands/add_footers.py new file mode 100644 index 00000000..5982fd43 --- /dev/null +++ b/apps/main/management/commands/add_footers.py @@ -0,0 +1,32 @@ +from django.core.management.base import BaseCommand +from tqdm import tqdm + +from main.models import SiteSettings, Footer +from transfer.models import Footers + + +class Command(BaseCommand): + help = '''Add footers from legacy DB.''' + + def handle(self, *args, **kwargs): + objects = [] + deleted = 0 + footers_list = Footers.objects.all() + + for old_footer in tqdm(footers_list, desc='Add footers'): + site = SiteSettings.objects.filter(old_id=old_footer.site_id).first() + if site: + if site.footers.exists(): + site.footers.all().delete() + deleted += 1 + footer = Footer( + site=site, + about_us=old_footer.about_us, + copyright=old_footer.copyright, + created=old_footer.created_at, + modified=old_footer.updated_at + ) + objects.append(footer) + Footer.objects.bulk_create(objects) + self.stdout.write( + self.style.WARNING(f'Created {len(objects)}/Deleted {deleted} footer objects.')) diff --git a/apps/main/migrations/0040_footer.py b/apps/main/migrations/0040_footer.py new file mode 100644 index 00000000..688e76d1 --- /dev/null +++ b/apps/main/migrations/0040_footer.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.7 on 2019-12-09 13:21 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0039_sitefeature_old_id'), + ] + + operations = [ + migrations.CreateModel( + name='Footer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('about_us', models.TextField(verbose_name='about_us')), + ('copyright', models.TextField(verbose_name='copyright')), + ('site', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='footers', to='main.SiteSettings', verbose_name='footer')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index f9c1225f..0869169e 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -351,3 +351,12 @@ class PageType(ProjectBaseMixin): def __str__(self): """Overridden dunder method.""" return self.name + + +class Footer(ProjectBaseMixin): + site = models.ForeignKey( + 'main.SiteSettings', related_name='footers', verbose_name=_('footer'), + on_delete=models.PROTECT + ) + about_us = models.TextField(_('about_us')) + copyright = models.TextField(_('copyright')) diff --git a/apps/main/serializers.py b/apps/main/serializers.py index a41a643f..033da976 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -22,6 +22,7 @@ class FeatureSerializer(serializers.ModelSerializer): 'site_settings', ) + class CurrencySerializer(ProjectModelSerializer): """Currency serializer.""" @@ -36,6 +37,33 @@ class CurrencySerializer(ProjectModelSerializer): ] +class FooterSerializer(serializers.ModelSerializer): + """Footer serializer.""" + + class Meta: + model = models.Footer + fields = [ + 'id', + 'about_us', + 'copyright', + 'created', + 'modified', + ] + + +class FooterBackSerializer(FooterSerializer): + site_id = serializers.PrimaryKeyRelatedField( + queryset=models.SiteSettings.objects.all(), + source='site' + ) + + class Meta: + model = models.Footer + fields = FooterSerializer.Meta.fields + [ + 'site_id' + ] + + class SiteFeatureSerializer(serializers.ModelSerializer): id = serializers.IntegerField(source='feature.id') slug = serializers.CharField(source='feature.slug') @@ -68,6 +96,7 @@ class SiteSettingsSerializer(serializers.ModelSerializer): country_name = serializers.CharField(source='country.name_translated', read_only=True) time_format = serializers.CharField(source='country.time_format', read_only=True) + footers = FooterSerializer(many=True, read_only=True) class Meta: """Meta class.""" @@ -87,6 +116,7 @@ class SiteSettingsSerializer(serializers.ModelSerializer): 'published_features', 'currency', 'country_name', + 'footers', ] diff --git a/apps/main/urls/back.py b/apps/main/urls/back.py index 609e61f7..a9e55311 100644 --- a/apps/main/urls/back.py +++ b/apps/main/urls/back.py @@ -18,6 +18,8 @@ urlpatterns = [ name='site-feature-list-create'), path('site-feature//', views.SiteFeatureRUDBackView.as_view(), name='site-feature-rud'), + path('footer/', views.FooterBackView.as_view(), name='footer-list-create'), + path('footer//', views.FooterRUDBackView.as_view(), name='footer-rud'), ] diff --git a/apps/main/views/back.py b/apps/main/views/back.py index 1faf79a0..3d73f88c 100644 --- a/apps/main/views/back.py +++ b/apps/main/views/back.py @@ -4,7 +4,7 @@ from rest_framework import generics, permissions from main import serializers from main.filters import AwardFilter -from main.models import Award +from main.models import Award, Footer from main.views import SiteSettingsView, SiteListView @@ -67,3 +67,17 @@ class SiteSettingsBackOfficeView(SiteSettingsView): class SiteListBackOfficeView(SiteListView): """Site settings View.""" serializer_class = serializers.SiteSerializer + + +class FooterBackView(generics.ListCreateAPIView): + """Footer back list/create view.""" + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + serializer_class = serializers.FooterBackSerializer + queryset = Footer.objects.all() + + +class FooterRUDBackView(generics.RetrieveUpdateDestroyAPIView): + """Footer back RUD view.""" + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + serializer_class = serializers.FooterBackSerializer + queryset = Footer.objects.all() diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 019f38aa..d8268d6d 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -1208,3 +1208,17 @@ class NewsletterSubscriber(MigrateMixin): class Meta: managed = False db_table = 'newsletter_subscriptions' + + +class Footers(MigrateMixin): + using = 'legacy' + + about_us = models.TextField(blank=True, null=True) + copyright = models.TextField(blank=True, null=True) + site = models.ForeignKey('Sites', models.DO_NOTHING, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'footers' diff --git a/make_data_migration.sh b/make_data_migration.sh index 50be7fc4..965eac19 100755 --- a/make_data_migration.sh +++ b/make_data_migration.sh @@ -8,9 +8,12 @@ ./manage.py transfer --fill_city_gallery ./manage.py transfer -l ./manage.py transfer --product +# Утеряна четкая связь между последовательностью миграций для импорта тегов продуктов, +# что может привести к удалению уже импортированных тегов командой выше. ./manage.py transfer --souvenir ./manage.py transfer --establishment_note ./manage.py transfer --product_note +./manage.py transfer --check_serial_number ./manage.py transfer --wine_characteristics ./manage.py transfer --inquiries ./manage.py transfer --assemblage