From 5225450545fd99ebb5d6dc83fdff23adfedae454 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sun, 26 Apr 2026 12:13:32 +0330 Subject: [PATCH] blogs schema changed title and slogan required now script added for making default title and slogan for required objects --- apps/blog/admin.py | 7 +++++ .../commands/fix_empty_blog_fields.py | 30 +++++++++++++++++++ ...0002_alter_blog_slogan_alter_blog_title.py | 23 ++++++++++++++ apps/blog/models.py | 4 +-- 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 apps/blog/management/commands/fix_empty_blog_fields.py create mode 100644 apps/blog/migrations/0002_alter_blog_slogan_alter_blog_title.py diff --git a/apps/blog/admin.py b/apps/blog/admin.py index 9850a9c..734fcea 100644 --- a/apps/blog/admin.py +++ b/apps/blog/admin.py @@ -31,6 +31,13 @@ class BlogAdminForm(forms.ModelForm): 'summary': MultiLanguageJSONWidget(input_widget_class=WysiwygWidget), 'slug': MultiLanguageJSONWidget(input_widget_class=UnfoldAdminTextInputWidget), } + # ADD THIS METHOD: + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Explicitly tell the form these fields are required + # so the admin template renders the red star + self.fields['title'].required = True + self.fields['slogan'].required = True class BlogContentInline(StackedInline): diff --git a/apps/blog/management/commands/fix_empty_blog_fields.py b/apps/blog/management/commands/fix_empty_blog_fields.py new file mode 100644 index 0000000..becdca3 --- /dev/null +++ b/apps/blog/management/commands/fix_empty_blog_fields.py @@ -0,0 +1,30 @@ +from django.core.management.base import BaseCommand +from apps.blog.models import Blog + +class Command(BaseCommand): + help = 'Populate empty title and slogan fields in Blog records with default JSON structures.' + + def handle(self, *args, **kwargs): + blogs = Blog.objects.all() + updated_count = 0 + + for blog in blogs: + needs_update = False + + # Check if title is logically empty (None, [], {}, or "") + if not blog.title: + # Setting a default structure based on your model's docstring + blog.title = [{"title": "Default Blog Title", "language_code": "en"}] + needs_update = True + + # Check if slogan is logically empty + if not blog.slogan: + blog.slogan = [{"text": "Default Blog Slogan", "language_code": "en"}] + needs_update = True + + if needs_update: + # Use update_fields for performance and to prevent overriding other concurrent saves + blog.save(update_fields=['title', 'slogan']) + updated_count += 1 + + self.stdout.write(self.style.SUCCESS(f'Successfully checked all blogs and updated {updated_count} records.')) \ No newline at end of file diff --git a/apps/blog/migrations/0002_alter_blog_slogan_alter_blog_title.py b/apps/blog/migrations/0002_alter_blog_slogan_alter_blog_title.py new file mode 100644 index 0000000..b129cf1 --- /dev/null +++ b/apps/blog/migrations/0002_alter_blog_slogan_alter_blog_title.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.12 on 2026-04-26 11:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='slogan', + field=models.JSONField(default=list, verbose_name='slogan'), + ), + migrations.AlterField( + model_name='blog', + name='title', + field=models.JSONField(default=list, verbose_name='title'), + ), + ] diff --git a/apps/blog/models.py b/apps/blog/models.py index ba24d59..b8bc186 100644 --- a/apps/blog/models.py +++ b/apps/blog/models.py @@ -9,13 +9,13 @@ class Blog(models.Model): """ Blog model with title, thumbnail, slogan, summary, views count and timestamps """ - title = models.JSONField(default=list, null=True, blank=True, verbose_name=_('title')) # [{"title": "", "language_code": "en"},{"title": "", "language_code": "fa"},...] + title = models.JSONField(default=list, null=False, blank=False, verbose_name=_('title')) # [{"title": "", "language_code": "en"},{"title": "", "language_code": "fa"},...] thumbnail = models.ImageField( upload_to='blog/thumbnails/%Y/%m/', verbose_name=_('Thumbnail'), help_text=_('Blog thumbnail image') ) - slogan = models.JSONField(default=list, null=True, blank=True, verbose_name=_('slogan')) + slogan = models.JSONField(default=list, null=False, blank=False, verbose_name=_('slogan')) summary = models.JSONField(default=list, null=True, blank=True, verbose_name=_('summary')) views_count = models.PositiveIntegerField( default=0,