|
@@ -1,11 +1,11 @@
|
|
|
-# Generated by Django 4.0.8 on 2022-11-17 15:14
|
|
|
+# Generated by Django 4.1.4 on 2022-12-20 14:17
|
|
|
|
|
|
from django.db import migrations, models
|
|
|
import django.db.models.deletion
|
|
|
import modelcluster.fields
|
|
|
import wagtail.blocks
|
|
|
+import wagtail.contrib.table_block.blocks
|
|
|
import wagtail.contrib.typed_table_block.blocks
|
|
|
-import wagtail.documents.blocks
|
|
|
import wagtail.embeds.blocks
|
|
|
import wagtail.fields
|
|
|
import wagtail.images.blocks
|
|
@@ -16,10 +16,35 @@ class Migration(migrations.Migration):
|
|
|
initial = True
|
|
|
|
|
|
dependencies = [
|
|
|
+ ("base", "0012_person_expire_at_person_expired_and_more"),
|
|
|
("wagtailcore", "0078_referenceindex"),
|
|
|
]
|
|
|
|
|
|
operations = [
|
|
|
+ migrations.CreateModel(
|
|
|
+ name="RecipeIndexPage",
|
|
|
+ fields=[
|
|
|
+ (
|
|
|
+ "page_ptr",
|
|
|
+ models.OneToOneField(
|
|
|
+ auto_created=True,
|
|
|
+ on_delete=django.db.models.deletion.CASCADE,
|
|
|
+ parent_link=True,
|
|
|
+ primary_key=True,
|
|
|
+ serialize=False,
|
|
|
+ to="wagtailcore.page",
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "introduction",
|
|
|
+ models.TextField(blank=True, help_text="Text to describe the page"),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ options={
|
|
|
+ "abstract": False,
|
|
|
+ },
|
|
|
+ bases=("wagtailcore.page",),
|
|
|
+ ),
|
|
|
migrations.CreateModel(
|
|
|
name="RecipePage",
|
|
|
fields=[
|
|
@@ -34,368 +59,301 @@ class Migration(migrations.Migration):
|
|
|
to="wagtailcore.page",
|
|
|
),
|
|
|
),
|
|
|
- ("title_1", models.CharField(default="Title 1", max_length=255)),
|
|
|
(
|
|
|
- "section_1",
|
|
|
+ "date_published",
|
|
|
+ models.DateField(
|
|
|
+ blank=True, null=True, verbose_name="Date article published"
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ("subtitle", models.CharField(blank=True, max_length=255)),
|
|
|
+ ("introduction", models.TextField(blank=True, max_length=500)),
|
|
|
+ (
|
|
|
+ "backstory",
|
|
|
wagtail.fields.StreamField(
|
|
|
[
|
|
|
- ("char", wagtail.blocks.CharBlock()),
|
|
|
- (
|
|
|
- "choice",
|
|
|
- wagtail.blocks.ChoiceBlock(
|
|
|
- choices=[
|
|
|
- ("M", "Medium"),
|
|
|
- ("L", "Large"),
|
|
|
- ("XL", "Extra large"),
|
|
|
- ]
|
|
|
- ),
|
|
|
- ),
|
|
|
- (
|
|
|
- "list",
|
|
|
- wagtail.blocks.ListBlock(
|
|
|
- child_block=wagtail.blocks.CharBlock()
|
|
|
- ),
|
|
|
- ),
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("text", wagtail.blocks.TextBlock()),
|
|
|
- ("rich_text", wagtail.blocks.RichTextBlock()),
|
|
|
- ("url", wagtail.blocks.URLBlock()),
|
|
|
(
|
|
|
- "document",
|
|
|
- wagtail.documents.blocks.DocumentChooserBlock(),
|
|
|
- ),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
- ("image", wagtail.images.blocks.ImageChooserBlock()),
|
|
|
- (
|
|
|
- "table",
|
|
|
+ "heading_block",
|
|
|
wagtail.blocks.StructBlock(
|
|
|
[
|
|
|
- ("title", wagtail.blocks.CharBlock()),
|
|
|
- ("description", wagtail.blocks.TextBlock()),
|
|
|
(
|
|
|
- "table",
|
|
|
- wagtail.contrib.typed_table_block.blocks.TypedTableBlock(
|
|
|
- [
|
|
|
- (
|
|
|
- "text",
|
|
|
- wagtail.blocks.CharBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "numeric",
|
|
|
- wagtail.blocks.FloatBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "rich_text",
|
|
|
- wagtail.blocks.RichTextBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
- ),
|
|
|
- ]
|
|
|
+ "heading_text",
|
|
|
+ wagtail.blocks.CharBlock(
|
|
|
+ form_classname="title", required=True
|
|
|
),
|
|
|
),
|
|
|
- ]
|
|
|
- ),
|
|
|
- ),
|
|
|
- (
|
|
|
- "stream",
|
|
|
- wagtail.blocks.StreamBlock(
|
|
|
- [
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
(
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
+ "size",
|
|
|
+ wagtail.blocks.ChoiceBlock(
|
|
|
+ blank=True,
|
|
|
+ choices=[
|
|
|
+ ("", "Select a header size"),
|
|
|
+ ("h2", "H2"),
|
|
|
+ ("h3", "H3"),
|
|
|
+ ("h4", "H4"),
|
|
|
+ ],
|
|
|
+ required=False,
|
|
|
+ ),
|
|
|
),
|
|
|
]
|
|
|
),
|
|
|
),
|
|
|
- ],
|
|
|
- blank=True,
|
|
|
- help_text="Section 1 is a StreamField in a regular FieldPanel",
|
|
|
- use_json_field=True,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ("title_2", models.CharField(default="Title 2", max_length=255)),
|
|
|
- (
|
|
|
- "section_2",
|
|
|
- wagtail.fields.StreamField(
|
|
|
- [
|
|
|
- ("char", wagtail.blocks.CharBlock()),
|
|
|
(
|
|
|
- "choice",
|
|
|
- wagtail.blocks.ChoiceBlock(
|
|
|
- choices=[
|
|
|
- ("M", "Medium"),
|
|
|
- ("L", "Large"),
|
|
|
- ("XL", "Extra large"),
|
|
|
- ]
|
|
|
+ "paragraph_block",
|
|
|
+ wagtail.blocks.RichTextBlock(
|
|
|
+ icon="pilcrow",
|
|
|
+ template="blocks/paragraph_block.html",
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "list",
|
|
|
- wagtail.blocks.ListBlock(
|
|
|
- child_block=wagtail.blocks.CharBlock()
|
|
|
- ),
|
|
|
- ),
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("text", wagtail.blocks.TextBlock()),
|
|
|
- ("rich_text", wagtail.blocks.RichTextBlock()),
|
|
|
- ("url", wagtail.blocks.URLBlock()),
|
|
|
- (
|
|
|
- "document",
|
|
|
- wagtail.documents.blocks.DocumentChooserBlock(),
|
|
|
- ),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
- ("image", wagtail.images.blocks.ImageChooserBlock()),
|
|
|
- (
|
|
|
- "table",
|
|
|
+ "image_block",
|
|
|
wagtail.blocks.StructBlock(
|
|
|
[
|
|
|
- ("title", wagtail.blocks.CharBlock()),
|
|
|
- ("description", wagtail.blocks.TextBlock()),
|
|
|
(
|
|
|
- "table",
|
|
|
- wagtail.contrib.typed_table_block.blocks.TypedTableBlock(
|
|
|
- [
|
|
|
- (
|
|
|
- "text",
|
|
|
- wagtail.blocks.CharBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "numeric",
|
|
|
- wagtail.blocks.FloatBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "rich_text",
|
|
|
- wagtail.blocks.RichTextBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
- ),
|
|
|
- ]
|
|
|
+ "image",
|
|
|
+ wagtail.images.blocks.ImageChooserBlock(
|
|
|
+ required=True
|
|
|
),
|
|
|
),
|
|
|
+ (
|
|
|
+ "caption",
|
|
|
+ wagtail.blocks.CharBlock(required=False),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "attribution",
|
|
|
+ wagtail.blocks.CharBlock(required=False),
|
|
|
+ ),
|
|
|
]
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "stream",
|
|
|
- wagtail.blocks.StreamBlock(
|
|
|
+ "block_quote",
|
|
|
+ wagtail.blocks.StructBlock(
|
|
|
[
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
+ ("text", wagtail.blocks.TextBlock()),
|
|
|
(
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
+ "attribute_name",
|
|
|
+ wagtail.blocks.CharBlock(
|
|
|
+ blank=True,
|
|
|
+ label="e.g. Mary Berry",
|
|
|
+ required=False,
|
|
|
+ ),
|
|
|
),
|
|
|
]
|
|
|
),
|
|
|
),
|
|
|
+ (
|
|
|
+ "embed_block",
|
|
|
+ wagtail.embeds.blocks.EmbedBlock(
|
|
|
+ help_text="Insert an embed URL e.g https://www.youtube.com/watch?v=SGJFWirQ3ks",
|
|
|
+ icon="media",
|
|
|
+ template="blocks/embed_block.html",
|
|
|
+ ),
|
|
|
+ ),
|
|
|
],
|
|
|
blank=True,
|
|
|
- help_text="Section 2 is a StreamField in a MultiFieldPanel",
|
|
|
+ help_text="Use only a minimum number of headings and large blocks.",
|
|
|
use_json_field=True,
|
|
|
),
|
|
|
),
|
|
|
- ],
|
|
|
- options={
|
|
|
- "abstract": False,
|
|
|
- },
|
|
|
- bases=("wagtailcore.page",),
|
|
|
- ),
|
|
|
- migrations.CreateModel(
|
|
|
- name="Item",
|
|
|
- fields=[
|
|
|
(
|
|
|
- "id",
|
|
|
- models.AutoField(
|
|
|
- auto_created=True,
|
|
|
- primary_key=True,
|
|
|
- serialize=False,
|
|
|
- verbose_name="ID",
|
|
|
+ "recipe_headline",
|
|
|
+ wagtail.fields.RichTextField(
|
|
|
+ blank=True, help_text="Keep to a single line", max_length=120
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "sort_order",
|
|
|
- models.IntegerField(blank=True, editable=False, null=True),
|
|
|
- ),
|
|
|
- ("title_1", models.CharField(default="Title 1", max_length=255)),
|
|
|
- (
|
|
|
- "section_1",
|
|
|
+ "body",
|
|
|
wagtail.fields.StreamField(
|
|
|
[
|
|
|
- ("char", wagtail.blocks.CharBlock()),
|
|
|
(
|
|
|
- "choice",
|
|
|
- wagtail.blocks.ChoiceBlock(
|
|
|
- choices=[
|
|
|
- ("M", "Medium"),
|
|
|
- ("L", "Large"),
|
|
|
- ("XL", "Extra large"),
|
|
|
- ]
|
|
|
+ "heading_block",
|
|
|
+ wagtail.blocks.StructBlock(
|
|
|
+ [
|
|
|
+ (
|
|
|
+ "heading_text",
|
|
|
+ wagtail.blocks.CharBlock(
|
|
|
+ form_classname="title", required=True
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "size",
|
|
|
+ wagtail.blocks.ChoiceBlock(
|
|
|
+ blank=True,
|
|
|
+ choices=[
|
|
|
+ ("", "Select a header size"),
|
|
|
+ ("h2", "H2"),
|
|
|
+ ("h3", "H3"),
|
|
|
+ ("h4", "H4"),
|
|
|
+ ],
|
|
|
+ required=False,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ group="Content",
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "list",
|
|
|
- wagtail.blocks.ListBlock(
|
|
|
- child_block=wagtail.blocks.CharBlock()
|
|
|
+ "paragraph_block",
|
|
|
+ wagtail.blocks.RichTextBlock(
|
|
|
+ group="Content",
|
|
|
+ icon="pilcrow",
|
|
|
+ template="blocks/paragraph_block.html",
|
|
|
),
|
|
|
),
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("text", wagtail.blocks.TextBlock()),
|
|
|
- ("rich_text", wagtail.blocks.RichTextBlock()),
|
|
|
- ("url", wagtail.blocks.URLBlock()),
|
|
|
(
|
|
|
- "document",
|
|
|
- wagtail.documents.blocks.DocumentChooserBlock(),
|
|
|
- ),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
- ("image", wagtail.images.blocks.ImageChooserBlock()),
|
|
|
- (
|
|
|
- "table",
|
|
|
+ "block_quote",
|
|
|
wagtail.blocks.StructBlock(
|
|
|
[
|
|
|
- ("title", wagtail.blocks.CharBlock()),
|
|
|
- ("description", wagtail.blocks.TextBlock()),
|
|
|
+ ("text", wagtail.blocks.TextBlock()),
|
|
|
(
|
|
|
- "table",
|
|
|
- wagtail.contrib.typed_table_block.blocks.TypedTableBlock(
|
|
|
- [
|
|
|
- (
|
|
|
- "text",
|
|
|
- wagtail.blocks.CharBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "numeric",
|
|
|
- wagtail.blocks.FloatBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "rich_text",
|
|
|
- wagtail.blocks.RichTextBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
- ),
|
|
|
- ]
|
|
|
+ "attribute_name",
|
|
|
+ wagtail.blocks.CharBlock(
|
|
|
+ blank=True,
|
|
|
+ label="e.g. Mary Berry",
|
|
|
+ required=False,
|
|
|
),
|
|
|
),
|
|
|
- ]
|
|
|
+ ],
|
|
|
+ group="Content",
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "stream",
|
|
|
- wagtail.blocks.StreamBlock(
|
|
|
+ "table_block",
|
|
|
+ wagtail.contrib.table_block.blocks.TableBlock(
|
|
|
+ group="Content"
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "typed_table_block",
|
|
|
+ wagtail.contrib.typed_table_block.blocks.TypedTableBlock(
|
|
|
[
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
+ ("text", wagtail.blocks.CharBlock()),
|
|
|
+ ("numeric", wagtail.blocks.FloatBlock()),
|
|
|
+ ("rich_text", wagtail.blocks.RichTextBlock()),
|
|
|
(
|
|
|
"image",
|
|
|
wagtail.images.blocks.ImageChooserBlock(),
|
|
|
),
|
|
|
- ]
|
|
|
+ ],
|
|
|
+ group="Content",
|
|
|
),
|
|
|
),
|
|
|
- ],
|
|
|
- blank=True,
|
|
|
- help_text="Section 1 is a StreamField in a regular FieldPanel",
|
|
|
- use_json_field=True,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ("title_2", models.CharField(default="Title 2", max_length=255)),
|
|
|
- (
|
|
|
- "section_2",
|
|
|
- wagtail.fields.StreamField(
|
|
|
- [
|
|
|
- ("char", wagtail.blocks.CharBlock()),
|
|
|
(
|
|
|
- "choice",
|
|
|
- wagtail.blocks.ChoiceBlock(
|
|
|
- choices=[
|
|
|
- ("M", "Medium"),
|
|
|
- ("L", "Large"),
|
|
|
- ("XL", "Extra large"),
|
|
|
- ]
|
|
|
+ "image_block",
|
|
|
+ wagtail.blocks.StructBlock(
|
|
|
+ [
|
|
|
+ (
|
|
|
+ "image",
|
|
|
+ wagtail.images.blocks.ImageChooserBlock(
|
|
|
+ required=True
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "caption",
|
|
|
+ wagtail.blocks.CharBlock(required=False),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "attribution",
|
|
|
+ wagtail.blocks.CharBlock(required=False),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ group="Media",
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "list",
|
|
|
- wagtail.blocks.ListBlock(
|
|
|
- child_block=wagtail.blocks.CharBlock()
|
|
|
+ "embed_block",
|
|
|
+ wagtail.embeds.blocks.EmbedBlock(
|
|
|
+ group="Media",
|
|
|
+ help_text="Insert an embed URL e.g https://www.youtube.com/watch?v=SGJFWirQ3ks",
|
|
|
+ icon="media",
|
|
|
+ template="blocks/embed_block.html",
|
|
|
),
|
|
|
),
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("text", wagtail.blocks.TextBlock()),
|
|
|
- ("rich_text", wagtail.blocks.RichTextBlock()),
|
|
|
- ("url", wagtail.blocks.URLBlock()),
|
|
|
- (
|
|
|
- "document",
|
|
|
- wagtail.documents.blocks.DocumentChooserBlock(),
|
|
|
- ),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
- ("image", wagtail.images.blocks.ImageChooserBlock()),
|
|
|
(
|
|
|
- "table",
|
|
|
- wagtail.blocks.StructBlock(
|
|
|
- [
|
|
|
- ("title", wagtail.blocks.CharBlock()),
|
|
|
- ("description", wagtail.blocks.TextBlock()),
|
|
|
- (
|
|
|
- "table",
|
|
|
- wagtail.contrib.typed_table_block.blocks.TypedTableBlock(
|
|
|
- [
|
|
|
- (
|
|
|
- "text",
|
|
|
- wagtail.blocks.CharBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "numeric",
|
|
|
- wagtail.blocks.FloatBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "rich_text",
|
|
|
- wagtail.blocks.RichTextBlock(),
|
|
|
- ),
|
|
|
- (
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
- ),
|
|
|
- ]
|
|
|
- ),
|
|
|
- ),
|
|
|
- ]
|
|
|
+ "ingredients_list",
|
|
|
+ wagtail.blocks.ListBlock(
|
|
|
+ wagtail.blocks.RichTextBlock(
|
|
|
+ features=["bold", "italic", "link"]
|
|
|
+ ),
|
|
|
+ group="Cooking",
|
|
|
+ icon="list-ol",
|
|
|
+ max_num=10,
|
|
|
+ min_num=2,
|
|
|
),
|
|
|
),
|
|
|
(
|
|
|
- "stream",
|
|
|
- wagtail.blocks.StreamBlock(
|
|
|
- [
|
|
|
- ("page", wagtail.blocks.PageChooserBlock()),
|
|
|
- ("embed", wagtail.embeds.blocks.EmbedBlock()),
|
|
|
- (
|
|
|
- "image",
|
|
|
- wagtail.images.blocks.ImageChooserBlock(),
|
|
|
- ),
|
|
|
- ]
|
|
|
+ "steps_list",
|
|
|
+ wagtail.blocks.ListBlock(
|
|
|
+ wagtail.blocks.StructBlock(
|
|
|
+ [
|
|
|
+ (
|
|
|
+ "text",
|
|
|
+ wagtail.blocks.RichTextBlock(
|
|
|
+ features=["bold", "italic", "link"]
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "difficulty",
|
|
|
+ wagtail.blocks.ChoiceBlock(
|
|
|
+ choices=[
|
|
|
+ ("S", "Small"),
|
|
|
+ ("M", "Medium"),
|
|
|
+ ("L", "Large"),
|
|
|
+ ]
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ ),
|
|
|
+ group="Cooking",
|
|
|
+ icon="tasks",
|
|
|
+ max_num=10,
|
|
|
+ min_num=2,
|
|
|
),
|
|
|
),
|
|
|
],
|
|
|
blank=True,
|
|
|
- help_text="Section 2 is a StreamField in a MultiFieldPanel",
|
|
|
+ help_text="The recipe’s step-by-step instructions and any other relevant information.",
|
|
|
use_json_field=True,
|
|
|
),
|
|
|
),
|
|
|
+ ],
|
|
|
+ options={
|
|
|
+ "abstract": False,
|
|
|
+ },
|
|
|
+ bases=("wagtailcore.page",),
|
|
|
+ ),
|
|
|
+ migrations.CreateModel(
|
|
|
+ name="RecipePersonRelationship",
|
|
|
+ fields=[
|
|
|
+ (
|
|
|
+ "id",
|
|
|
+ models.AutoField(
|
|
|
+ auto_created=True,
|
|
|
+ primary_key=True,
|
|
|
+ serialize=False,
|
|
|
+ verbose_name="ID",
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ (
|
|
|
+ "sort_order",
|
|
|
+ models.IntegerField(blank=True, editable=False, null=True),
|
|
|
+ ),
|
|
|
(
|
|
|
"page",
|
|
|
modelcluster.fields.ParentalKey(
|
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
|
- related_name="items",
|
|
|
+ related_name="recipe_person_relationship",
|
|
|
to="recipes.recipepage",
|
|
|
),
|
|
|
),
|
|
|
+ (
|
|
|
+ "person",
|
|
|
+ models.ForeignKey(
|
|
|
+ on_delete=django.db.models.deletion.CASCADE,
|
|
|
+ related_name="person_recipe_relationship",
|
|
|
+ to="base.person",
|
|
|
+ ),
|
|
|
+ ),
|
|
|
],
|
|
|
options={
|
|
|
"ordering": ["sort_order"],
|