Skip to content
Snippets Groups Projects
Select Git revision
  • 77e5c1a1b0c77082903bbd00544b26368f53d155
  • test default protected
  • master protected
  • feat/custom-css
  • feat/redesign-improvements-10
  • feat/redesign-improvements-8
  • feat/redesign-fixes-3
  • feat/pirstan-changes
  • feat/separate-import-thread
  • feat/dary-improvements
  • features/add-pdf-page
  • features/add-typed-table
  • features/fix-broken-calendar-categories
  • features/add-embed-to-articles
  • features/create-mastodon-feed-block
  • features/add-custom-numbering-for-candidates
  • features/add-timeline
  • features/create-wordcloud-from-article-page
  • features/create-collapsible-extra-legal-info
  • features/extend-hero-banner
  • features/add-link-to-images
21 results

base.py

Blame
  • 0022_remove_uniwebarticlepage_text_and_more.py 3.91 KiB
    # Generated by Django 3.2.11 on 2022-03-13 16:19
    
    # -*- coding: utf-8 -*-
    import json
    
    import wagtail.blocks
    import wagtail.fields
    from django.core.serializers.json import DjangoJSONEncoder
    from django.db import migrations
    from wagtail.rich_text import RichText
    
    
    def page_to_streamfield(page):
        changed = False
        if page.text and not page.content:
            page.content = [("text", RichText(page.text))]
            changed = True
        return page, changed
    
    
    def pagerevision_to_streamfield(revision_data):
        changed = False
        body = revision_data.get("text")
        if body:
            try:
                json.loads(body)
            except ValueError:
                revision_data["content"] = json.dumps(
                    [{"value": body, "type": "text"}], cls=DjangoJSONEncoder
                )
                changed = True
            else:
                # It's already valid JSON. Leave it.
                pass
        return revision_data, changed
    
    
    def page_to_richtext(page):
        changed = False
        if page.content.raw_text is None:
            raw_text = "".join(
                [child.value.source for child in page.content if child.block_type == "text"]
            )
            page.text = raw_text
            changed = True
        return page, changed
    
    
    def pagerevision_to_richtext(revision_data):
        changed = False
        body = revision_data.get("content", "definitely non-JSON string")
        if body:
            try:
                body_data = json.loads(body)
            except ValueError:
                # It's not apparently a StreamField. Leave it.
                pass
            else:
                raw_text = "".join(
                    [child["value"] for child in body_data if child["type"] == "text"]
                )
                revision_data["text"] = raw_text
                changed = True
        return revision_data, changed
    
    
    def convert(apps, schema_editor, page_converter, pagerevision_converter):
        UniwebArticlePage = apps.get_model("uniweb", "UniwebArticlePage")
        for page in UniwebArticlePage.objects.all():
            page, changed = page_converter(page)
            if changed:
                page.save()
    
            for revision in page.revisions.all():
                revision_data = json.loads(revision.content_json)
                revision_data, changed = pagerevision_converter(revision_data)
                if changed:
                    revision.content_json = json.dumps(revision_data, cls=DjangoJSONEncoder)
                    revision.save()
    
    
    def convert_to_streamfield(apps, schema_editor):
        return convert(
            apps, schema_editor, page_to_streamfield, pagerevision_to_streamfield
        )
    
    
    def convert_to_richtext(apps, schema_editor):
        return convert(apps, schema_editor, page_to_richtext, pagerevision_to_richtext)
    
    
    class Migration(migrations.Migration):
        dependencies = [
            ("uniweb", "0021_alter_uniwebarticletag_tag"),
        ]
    
        operations = [
            migrations.AddField(
                model_name="uniwebarticlepage",
                name="content",
                field=wagtail.fields.StreamField(
                    [
                        (
                            "text",
                            wagtail.blocks.RichTextBlock(
                                features=[
                                    "h2",
                                    "h3",
                                    "h4",
                                    "bold",
                                    "italic",
                                    "ol",
                                    "ul",
                                    "link",
                                    "document-link",
                                    "image",
                                ],
                                label="Textový editor",
                            ),
                        )
                    ],
                    blank=True,
                    verbose_name="Článek",
                ),
            ),
            migrations.RunPython(
                convert_to_streamfield,
                convert_to_richtext,
            ),
            migrations.RemoveField(
                model_name="uniwebarticlepage",
                name="text",
            ),
        ]