Initial commit

This commit is contained in:
2024-08-27 20:33:44 +02:00
commit 1f1832267d
14794 changed files with 1599592 additions and 0 deletions

View File

@@ -0,0 +1,291 @@
from django.conf import settings
from django.db import migrations, models
import wagtail.search.index
def set_page_path_collation(apps, schema_editor):
"""
Treebeard's path comparison logic can fail on certain locales such as sk_SK, which
sort numbers after letters. To avoid this, we explicitly set the collation for the
'path' column to the (non-locale-specific) 'C' collation.
See: https://groups.google.com/d/msg/wagtail/q0leyuCnYWI/I9uDvVlyBAAJ
"""
if schema_editor.connection.vendor == "postgresql":
schema_editor.execute(
"""
ALTER TABLE wagtailcore_page ALTER COLUMN path TYPE VARCHAR(255) COLLATE "C"
"""
)
class Migration(migrations.Migration):
dependencies = [
("auth", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("contenttypes", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="GroupPagePermission",
fields=[
(
"id",
models.AutoField(
serialize=False,
verbose_name="ID",
primary_key=True,
auto_created=True,
),
),
(
"permission_type",
models.CharField(
choices=[
("add", "Add"),
("edit", "Edit"),
("publish", "Publish"),
],
max_length=20,
),
),
(
"group",
models.ForeignKey(
on_delete=models.CASCADE,
to="auth.Group",
related_name="page_permissions",
),
),
],
options={},
bases=(models.Model,),
),
migrations.CreateModel(
name="Page",
fields=[
(
"id",
models.AutoField(
serialize=False,
verbose_name="ID",
primary_key=True,
auto_created=True,
),
),
("path", models.CharField(max_length=255, unique=True)),
("depth", models.PositiveIntegerField()),
("numchild", models.PositiveIntegerField(default=0)),
(
"title",
models.CharField(
max_length=255,
help_text="The page title as you'd like it to be seen by the public",
),
),
(
"slug",
models.SlugField(
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/"
),
),
("live", models.BooleanField(default=True, editable=False)),
(
"has_unpublished_changes",
models.BooleanField(default=False, editable=False),
),
(
"url_path",
models.CharField(blank=True, max_length=255, editable=False),
),
(
"seo_title",
models.CharField(
blank=True,
max_length=255,
help_text=(
"Optional. 'Search Engine Friendly' title."
" This will appear at the top of the browser window."
),
verbose_name="Page title",
),
),
(
"show_in_menus",
models.BooleanField(
default=False,
help_text="Whether a link to this page will appear in automatically generated menus",
),
),
("search_description", models.TextField(blank=True)),
(
"go_live_at",
models.DateTimeField(
blank=True,
verbose_name="Go live date/time",
null=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm:ss.",
),
),
(
"expire_at",
models.DateTimeField(
blank=True,
verbose_name="Expiry date/time",
null=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm:ss.",
),
),
("expired", models.BooleanField(default=False, editable=False)),
(
"content_type",
models.ForeignKey(
on_delete=models.CASCADE,
to="contenttypes.ContentType",
related_name="pages",
),
),
(
"owner",
models.ForeignKey(
on_delete=models.CASCADE,
blank=True,
null=True,
to=settings.AUTH_USER_MODEL,
editable=False,
related_name="owned_pages",
),
),
],
options={
"abstract": False,
},
bases=(wagtail.search.index.Indexed, models.Model),
),
migrations.RunPython(set_page_path_collation, migrations.RunPython.noop),
migrations.CreateModel(
name="PageRevision",
fields=[
(
"id",
models.AutoField(
serialize=False,
verbose_name="ID",
primary_key=True,
auto_created=True,
),
),
("submitted_for_moderation", models.BooleanField(default=False)),
("created_at", models.DateTimeField(auto_now_add=True)),
("content_json", models.TextField()),
("approved_go_live_at", models.DateTimeField(blank=True, null=True)),
(
"page",
models.ForeignKey(
on_delete=models.CASCADE,
to="wagtailcore.Page",
related_name="revisions",
),
),
(
"user",
models.ForeignKey(
on_delete=models.CASCADE,
blank=True,
null=True,
to=settings.AUTH_USER_MODEL,
),
),
],
options={},
bases=(models.Model,),
),
migrations.CreateModel(
name="PageViewRestriction",
fields=[
(
"id",
models.AutoField(
serialize=False,
verbose_name="ID",
primary_key=True,
auto_created=True,
),
),
("password", models.CharField(max_length=255)),
(
"page",
models.ForeignKey(
on_delete=models.CASCADE,
to="wagtailcore.Page",
related_name="view_restrictions",
),
),
],
options={},
bases=(models.Model,),
),
migrations.CreateModel(
name="Site",
fields=[
(
"id",
models.AutoField(
serialize=False,
verbose_name="ID",
primary_key=True,
auto_created=True,
),
),
("hostname", models.CharField(max_length=255, db_index=True)),
(
"port",
models.IntegerField(
default=80,
help_text=(
"Set this to something other than 80 if you need a specific port number"
" to appear in URLs (e.g. development on port 8000)."
" Does not affect request handling (so port forwarding still works)."
),
),
),
(
"is_default_site",
models.BooleanField(
default=False,
help_text=(
"If true, this site will handle requests for all other hostnames"
" that do not have a site entry of their own"
),
),
),
(
"root_page",
models.ForeignKey(
on_delete=models.CASCADE,
to="wagtailcore.Page",
related_name="sites_rooted_here",
),
),
],
options={},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name="site",
unique_together={("hostname", "port")},
),
migrations.AddField(
model_name="grouppagepermission",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
to="wagtailcore.Page",
related_name="group_permissions",
),
preserve_default=True,
),
]

View File

@@ -0,0 +1,496 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import wagtail.search.index
def initial_data(apps, schema_editor):
ContentType = apps.get_model("contenttypes.ContentType")
Group = apps.get_model("auth.Group")
Page = apps.get_model("wagtailcore.Page")
Site = apps.get_model("wagtailcore.Site")
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
# Create page content type
page_content_type, created = ContentType.objects.get_or_create(
model="page", app_label="wagtailcore"
)
# Create root page
root = Page.objects.create(
title="Root",
slug="root",
content_type=page_content_type,
path="0001",
depth=1,
numchild=1,
url_path="/",
)
# Create homepage
homepage = Page.objects.create(
title="Welcome to your new Wagtail site!",
slug="home",
content_type=page_content_type,
path="00010001",
depth=2,
numchild=0,
url_path="/home/",
)
# Create default site
Site.objects.get_or_create(
hostname="localhost", root_page_id=homepage.id, is_default_site=True
)
# Create auth groups
moderators_group, created = Group.objects.get_or_create(name="Moderators")
editors_group, created = Group.objects.get_or_create(name="Editors")
# Create group permissions
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="add",
)
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="edit",
)
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="publish",
)
GroupPagePermission.objects.create(
group=editors_group,
page=root,
permission_type="add",
)
GroupPagePermission.objects.create(
group=editors_group,
page=root,
permission_type="edit",
)
# 0005 - add_page_lock_permission_to_moderators
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="lock",
)
def remove_initial_data(apps, schema_editor):
"""This function does nothing. The below code is commented out together
with an explanation of why we don't need to bother reversing any of the
initial data"""
pass
# This does not need to be deleted, Django takes care of it.
# page_content_type = ContentType.objects.get(
# model='page',
# app_label='wagtailcore',
# )
# Page objects: Do nothing, the table will be deleted when reversing 0001
# Do not reverse Site creation since other models might depend on it
# Remove auth groups -- is this safe? External objects might depend
# on these groups... seems unsafe.
# Group.objects.filter(
# name__in=('Moderators', 'Editors')
# ).delete()
#
# Likewise, we're leaving all GroupPagePermission unchanged as users may
# have been assigned such permissions and its harmless to leave them.
def set_page_path_collation(apps, schema_editor):
"""
Treebeard's path comparison logic can fail on certain locales such as sk_SK, which
sort numbers after letters. To avoid this, we explicitly set the collation for the
'path' column to the (non-locale-specific) 'C' collation.
See: https://groups.google.com/d/msg/wagtail/q0leyuCnYWI/I9uDvVlyBAAJ
"""
if schema_editor.connection.vendor == "postgresql":
schema_editor.execute(
"""
ALTER TABLE wagtailcore_page ALTER COLUMN path TYPE VARCHAR(255) COLLATE "C"
"""
)
class Migration(migrations.Migration):
replaces = [
("wagtailcore", "0001_initial"),
("wagtailcore", "0002_initial_data"),
("wagtailcore", "0003_add_uniqueness_constraint_on_group_page_permission"),
("wagtailcore", "0004_page_locked"),
("wagtailcore", "0005_add_page_lock_permission_to_moderators"),
("wagtailcore", "0006_add_lock_page_permission"),
("wagtailcore", "0007_page_latest_revision_created_at"),
("wagtailcore", "0008_populate_latest_revision_created_at"),
("wagtailcore", "0009_remove_auto_now_add_from_pagerevision_created_at"),
("wagtailcore", "0010_change_page_owner_to_null_on_delete"),
("wagtailcore", "0011_page_first_published_at"),
("wagtailcore", "0012_extend_page_slug_field"),
("wagtailcore", "0013_update_golive_expire_help_text"),
("wagtailcore", "0014_add_verbose_name"),
("wagtailcore", "0015_add_more_verbose_names"),
("wagtailcore", "0016_change_page_url_path_to_text_field"),
]
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("auth", "0001_initial"),
("contenttypes", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Page",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
serialize=False,
primary_key=True,
),
),
("path", models.CharField(unique=True, max_length=255)),
("depth", models.PositiveIntegerField()),
("numchild", models.PositiveIntegerField(default=0)),
(
"title",
models.CharField(
verbose_name="Title",
max_length=255,
help_text="The page title as you'd like it to be seen by the public",
),
),
(
"slug",
models.SlugField(
verbose_name="Slug",
max_length=255,
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/",
),
),
(
"live",
models.BooleanField(
default=True, verbose_name="Live", editable=False
),
),
(
"has_unpublished_changes",
models.BooleanField(
default=False,
verbose_name="Has unpublished changes",
editable=False,
),
),
(
"url_path",
models.TextField(
verbose_name="URL path", blank=True, editable=False
),
),
(
"seo_title",
models.CharField(
verbose_name="Page title",
max_length=255,
blank=True,
help_text=(
"Optional. 'Search Engine Friendly' title."
" This will appear at the top of the browser window."
),
),
),
(
"show_in_menus",
models.BooleanField(
default=False,
verbose_name="Show in menus",
help_text="Whether a link to this page will appear in automatically generated menus",
),
),
(
"search_description",
models.TextField(verbose_name="Search description", blank=True),
),
(
"go_live_at",
models.DateTimeField(
null=True,
verbose_name="Go live date/time",
blank=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
),
),
(
"expire_at",
models.DateTimeField(
null=True,
verbose_name="Expiry date/time",
blank=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
),
),
(
"expired",
models.BooleanField(
default=False, verbose_name="Expired", editable=False
),
),
(
"content_type",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Content type",
related_name="pages",
to="contenttypes.ContentType",
),
),
(
"owner",
models.ForeignKey(
null=True,
verbose_name="Owner",
blank=True,
editable=False,
related_name="owned_pages",
to=settings.AUTH_USER_MODEL,
on_delete=django.db.models.deletion.SET_NULL,
),
),
(
"locked",
models.BooleanField(
default=False, verbose_name="Locked", editable=False
),
),
(
"latest_revision_created_at",
models.DateTimeField(
null=True,
verbose_name="Latest revision created at",
editable=False,
),
),
(
"first_published_at",
models.DateTimeField(
null=True, verbose_name="First published at", editable=False
),
),
],
options={
"abstract": False,
},
bases=(wagtail.search.index.Indexed, models.Model),
),
migrations.RunPython(set_page_path_collation, migrations.RunPython.noop),
migrations.CreateModel(
name="GroupPagePermission",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
serialize=False,
primary_key=True,
),
),
(
"permission_type",
models.CharField(
verbose_name="Permission type",
choices=[
("add", "Add/edit pages you own"),
("edit", "Add/edit any page"),
("publish", "Publish any page"),
("lock", "Lock/unlock any page"),
],
max_length=20,
),
),
(
"group",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Group",
related_name="page_permissions",
to="auth.Group",
),
),
(
"page",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Page",
related_name="group_permissions",
to="wagtailcore.Page",
),
),
],
),
migrations.AlterUniqueTogether(
name="grouppagepermission",
unique_together={("group", "page", "permission_type")},
),
migrations.AlterModelOptions(
name="grouppagepermission",
options={"verbose_name": "Group Page Permission"},
),
migrations.CreateModel(
name="PageRevision",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
serialize=False,
primary_key=True,
),
),
(
"submitted_for_moderation",
models.BooleanField(
default=False, verbose_name="Submitted for moderation"
),
),
("created_at", models.DateTimeField(verbose_name="Created at")),
("content_json", models.TextField(verbose_name="Content JSON")),
(
"approved_go_live_at",
models.DateTimeField(
null=True, verbose_name="Approved go live at", blank=True
),
),
(
"page",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Page",
related_name="revisions",
to="wagtailcore.Page",
),
),
(
"user",
models.ForeignKey(
on_delete=models.CASCADE,
null=True,
verbose_name="User",
blank=True,
to=settings.AUTH_USER_MODEL,
),
),
],
),
migrations.AlterModelOptions(
name="pagerevision",
options={"verbose_name": "Page Revision"},
),
migrations.CreateModel(
name="PageViewRestriction",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
serialize=False,
primary_key=True,
),
),
("password", models.CharField(verbose_name="Password", max_length=255)),
(
"page",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Page",
related_name="view_restrictions",
to="wagtailcore.Page",
),
),
],
),
migrations.AlterModelOptions(
name="pageviewrestriction",
options={"verbose_name": "Page View Restriction"},
),
migrations.CreateModel(
name="Site",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
serialize=False,
primary_key=True,
),
),
(
"hostname",
models.CharField(
verbose_name="Hostname", db_index=True, max_length=255
),
),
(
"port",
models.IntegerField(
default=80,
verbose_name="Port",
help_text=(
"Set this to something other than 80 if you need a specific port number"
" to appear in URLs (e.g. development on port 8000)."
" Does not affect request handling (so port forwarding still works)."
),
),
),
(
"is_default_site",
models.BooleanField(
default=False,
verbose_name="Is default site",
help_text=(
"If true, this site will handle requests for all other hostnames"
" that do not have a site entry of their own"
),
),
),
(
"root_page",
models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Root page",
related_name="sites_rooted_here",
to="wagtailcore.Page",
),
),
],
),
migrations.AlterUniqueTogether(
name="site",
unique_together={("hostname", "port")},
),
migrations.AlterModelOptions(
name="site",
options={"verbose_name": "Site"},
),
migrations.RunPython(initial_data, remove_initial_data),
]

View File

@@ -0,0 +1,109 @@
from django.db import migrations
def initial_data(apps, schema_editor):
ContentType = apps.get_model("contenttypes.ContentType")
Group = apps.get_model("auth.Group")
Page = apps.get_model("wagtailcore.Page")
Site = apps.get_model("wagtailcore.Site")
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
# Create page content type
page_content_type, created = ContentType.objects.get_or_create(
model="page", app_label="wagtailcore"
)
# Create root page
root = Page.objects.create(
title="Root",
slug="root",
content_type=page_content_type,
path="0001",
depth=1,
numchild=1,
url_path="/",
)
# Create homepage
homepage = Page.objects.create(
title="Welcome to your new Wagtail site!",
slug="home",
content_type=page_content_type,
path="00010001",
depth=2,
numchild=0,
url_path="/home/",
)
# Create default site
Site.objects.create(
hostname="localhost", root_page_id=homepage.id, is_default_site=True
)
# Create auth groups
moderators_group = Group.objects.create(name="Moderators")
editors_group = Group.objects.create(name="Editors")
# Create group permissions
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="add",
)
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="edit",
)
GroupPagePermission.objects.create(
group=moderators_group,
page=root,
permission_type="publish",
)
GroupPagePermission.objects.create(
group=editors_group,
page=root,
permission_type="add",
)
GroupPagePermission.objects.create(
group=editors_group,
page=root,
permission_type="edit",
)
def remove_initial_data(apps, schema_editor):
"""This function does nothing. The below code is commented out together
with an explanation of why we don't need to bother reversing any of the
initial data"""
pass
# This does not need to be deleted, Django takes care of it.
# page_content_type = ContentType.objects.get(
# model='page',
# app_label='wagtailcore',
# )
# Page objects: Do nothing, the table will be deleted when reversing 0001
# Do not reverse Site creation since other models might depend on it
# Remove auth groups -- is this safe? External objects might depend
# on these groups... seems unsafe.
# Group.objects.filter(
# name__in=('Moderators', 'Editors')
# ).delete()
#
# Likewise, we're leaving all GroupPagePermission unchanged as users may
# have been assigned such permissions and its harmless to leave them.
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0001_initial"),
]
operations = [
migrations.RunPython(initial_data, remove_initial_data),
]

View File

@@ -0,0 +1,27 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0002_initial_data"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
max_length=20,
choices=[
(b"add", b"Add/edit pages you own"),
(b"edit", b"Add/edit any page"),
(b"publish", b"Publish any page"),
],
),
),
migrations.AlterUniqueTogether(
name="grouppagepermission",
unique_together={("group", "page", "permission_type")},
),
]

View File

@@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0003_add_uniqueness_constraint_on_group_page_permission"),
]
operations = [
migrations.AddField(
model_name="page",
name="locked",
field=models.BooleanField(default=False, editable=False),
preserve_default=True,
),
]

View File

@@ -0,0 +1,31 @@
from django.db import migrations
def add_page_lock_permission_to_moderators(apps, schema_editor):
Group = apps.get_model("auth.Group")
Page = apps.get_model("wagtailcore.Page")
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
root_pages = Page.objects.filter(depth=1)
try:
moderators_group = Group.objects.get(name="Moderators")
for page in root_pages:
GroupPagePermission.objects.create(
group=moderators_group, page=page, permission_type="lock"
)
except Group.DoesNotExist:
pass
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0004_page_locked"),
]
operations = [
migrations.RunPython(add_page_lock_permission_to_moderators),
]

View File

@@ -0,0 +1,24 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0005_add_page_lock_permission_to_moderators"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
max_length=20,
choices=[
("add", "Add/edit pages you own"),
("edit", "Add/edit any page"),
("publish", "Publish any page"),
("lock", "Lock/unlock any page"),
],
),
),
]

View File

@@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0006_add_lock_page_permission"),
]
operations = [
migrations.AddField(
model_name="page",
name="latest_revision_created_at",
field=models.DateTimeField(editable=False, null=True),
preserve_default=True,
),
]

View File

@@ -0,0 +1,23 @@
from django.db import migrations
def populate_latest_revision_created_at(apps, schema_editor):
Page = apps.get_model("wagtailcore.Page")
for page in Page.objects.all():
latest_revision = page.revisions.order_by("-created_at").first()
if latest_revision is not None:
page.latest_revision_created_at = latest_revision.created_at
page.save(update_fields=["latest_revision_created_at"])
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0007_page_latest_revision_created_at"),
]
operations = [
migrations.RunPython(populate_latest_revision_created_at),
]

View File

@@ -0,0 +1,16 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0008_populate_latest_revision_created_at"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="created_at",
field=models.DateTimeField(),
),
]

View File

@@ -0,0 +1,25 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0009_remove_auto_now_add_from_pagerevision_created_at"),
]
operations = [
migrations.AlterField(
model_name="page",
name="owner",
field=models.ForeignKey(
related_name="owned_pages",
on_delete=django.db.models.deletion.SET_NULL,
blank=True,
editable=False,
to=settings.AUTH_USER_MODEL,
null=True,
),
),
]

View File

@@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0010_change_page_owner_to_null_on_delete"),
]
operations = [
migrations.AddField(
model_name="page",
name="first_published_at",
field=models.DateTimeField(editable=False, null=True),
preserve_default=True,
),
]

View File

@@ -0,0 +1,20 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0011_page_first_published_at"),
]
operations = [
migrations.AlterField(
model_name="page",
name="slug",
field=models.SlugField(
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/",
max_length=255,
),
preserve_default=True,
),
]

View File

@@ -0,0 +1,33 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0012_extend_page_slug_field"),
]
operations = [
migrations.AlterField(
model_name="page",
name="expire_at",
field=models.DateTimeField(
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
null=True,
verbose_name="Expiry date/time",
blank=True,
),
preserve_default=True,
),
migrations.AlterField(
model_name="page",
name="go_live_at",
field=models.DateTimeField(
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
null=True,
verbose_name="Go live date/time",
blank=True,
),
preserve_default=True,
),
]

View File

@@ -0,0 +1,143 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0013_update_golive_expire_help_text"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="group",
field=models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Group",
related_name="page_permissions",
to="auth.Group",
),
preserve_default=True,
),
migrations.AlterField(
model_name="grouppagepermission",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Page",
related_name="group_permissions",
to="wagtailcore.Page",
),
preserve_default=True,
),
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
choices=[
("add", "Add/edit pages you own"),
("edit", "Add/edit any page"),
("publish", "Publish any page"),
("lock", "Lock/unlock any page"),
],
max_length=20,
verbose_name="Permission type",
),
preserve_default=True,
),
migrations.AlterField(
model_name="page",
name="search_description",
field=models.TextField(blank=True, verbose_name="Search description"),
preserve_default=True,
),
migrations.AlterField(
model_name="page",
name="show_in_menus",
field=models.BooleanField(
default=False,
help_text="Whether a link to this page will appear in automatically generated menus",
verbose_name="Show in menus",
),
preserve_default=True,
),
migrations.AlterField(
model_name="page",
name="slug",
field=models.SlugField(
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/",
max_length=255,
verbose_name="Slug",
),
preserve_default=True,
),
migrations.AlterField(
model_name="page",
name="title",
field=models.CharField(
help_text="The page title as you'd like it to be seen by the public",
max_length=255,
verbose_name="Title",
),
preserve_default=True,
),
migrations.AlterField(
model_name="pageviewrestriction",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Page",
related_name="view_restrictions",
to="wagtailcore.Page",
),
preserve_default=True,
),
migrations.AlterField(
model_name="pageviewrestriction",
name="password",
field=models.CharField(max_length=255, verbose_name="Password"),
preserve_default=True,
),
migrations.AlterField(
model_name="site",
name="hostname",
field=models.CharField(
db_index=True, max_length=255, verbose_name="Hostname"
),
preserve_default=True,
),
migrations.AlterField(
model_name="site",
name="is_default_site",
field=models.BooleanField(
default=False,
help_text="If true, this site will handle requests for all other hostnames"
" that do not have a site entry of their own",
verbose_name="Is default site",
),
preserve_default=True,
),
migrations.AlterField(
model_name="site",
name="port",
field=models.IntegerField(
default=80,
help_text="Set this to something other than 80 if you need a specific port number"
" to appear in URLs (e.g. development on port 8000). Does not affect request handling"
" (so port forwarding still works).",
verbose_name="Port",
),
preserve_default=True,
),
migrations.AlterField(
model_name="site",
name="root_page",
field=models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="Root page",
related_name="sites_rooted_here",
to="wagtailcore.Page",
),
preserve_default=True,
),
]

View File

@@ -0,0 +1,146 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0014_add_verbose_name"),
]
operations = [
migrations.AlterModelOptions(
name="grouppagepermission",
options={"verbose_name": "Group Page Permission"},
),
migrations.AlterModelOptions(
name="pagerevision",
options={"verbose_name": "Page Revision"},
),
migrations.AlterModelOptions(
name="pageviewrestriction",
options={"verbose_name": "Page View Restriction"},
),
migrations.AlterModelOptions(
name="site",
options={"verbose_name": "Site"},
),
migrations.AlterField(
model_name="page",
name="content_type",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="pages",
verbose_name="Content type",
to="contenttypes.ContentType",
),
),
migrations.AlterField(
model_name="page",
name="expired",
field=models.BooleanField(
default=False, verbose_name="Expired", editable=False
),
),
migrations.AlterField(
model_name="page",
name="first_published_at",
field=models.DateTimeField(
verbose_name="First published at", null=True, editable=False
),
),
migrations.AlterField(
model_name="page",
name="has_unpublished_changes",
field=models.BooleanField(
default=False, verbose_name="Has unpublished changes", editable=False
),
),
migrations.AlterField(
model_name="page",
name="latest_revision_created_at",
field=models.DateTimeField(
verbose_name="Latest revision created at", null=True, editable=False
),
),
migrations.AlterField(
model_name="page",
name="live",
field=models.BooleanField(
default=True, verbose_name="Live", editable=False
),
),
migrations.AlterField(
model_name="page",
name="locked",
field=models.BooleanField(
default=False, verbose_name="Locked", editable=False
),
),
migrations.AlterField(
model_name="page",
name="owner",
field=models.ForeignKey(
related_name="owned_pages",
on_delete=django.db.models.deletion.SET_NULL,
blank=True,
editable=False,
to=settings.AUTH_USER_MODEL,
null=True,
verbose_name="Owner",
),
),
migrations.AlterField(
model_name="page",
name="url_path",
field=models.CharField(
verbose_name="URL path", max_length=255, editable=False, blank=True
),
),
migrations.AlterField(
model_name="pagerevision",
name="approved_go_live_at",
field=models.DateTimeField(
null=True, verbose_name="Approved go live at", blank=True
),
),
migrations.AlterField(
model_name="pagerevision",
name="content_json",
field=models.TextField(verbose_name="Content JSON"),
),
migrations.AlterField(
model_name="pagerevision",
name="created_at",
field=models.DateTimeField(verbose_name="Created at"),
),
migrations.AlterField(
model_name="pagerevision",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="revisions",
verbose_name="Page",
to="wagtailcore.Page",
),
),
migrations.AlterField(
model_name="pagerevision",
name="submitted_for_moderation",
field=models.BooleanField(
default=False, verbose_name="Submitted for moderation"
),
),
migrations.AlterField(
model_name="pagerevision",
name="user",
field=models.ForeignKey(
on_delete=models.CASCADE,
verbose_name="User",
blank=True,
to=settings.AUTH_USER_MODEL,
null=True,
),
),
]

View File

@@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0015_add_more_verbose_names"),
]
operations = [
migrations.AlterField(
model_name="page",
name="url_path",
field=models.TextField(verbose_name="URL path", editable=False, blank=True),
preserve_default=True,
),
]

View File

@@ -0,0 +1,26 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0016_change_page_url_path_to_text_field"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
choices=[
("add", "Add/edit pages you own"),
("edit", "Edit any page"),
("publish", "Publish any page"),
("lock", "Lock/unlock any page"),
],
max_length=20,
verbose_name="Permission type",
),
preserve_default=True,
),
]

View File

@@ -0,0 +1,18 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0017_change_edit_page_permission_description"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="submitted_for_moderation",
field=models.BooleanField(
default=False, db_index=True, verbose_name="Submitted for moderation"
),
),
]

View File

@@ -0,0 +1,40 @@
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0018_pagerevision_submitted_for_moderation_index"),
]
operations = [
migrations.AlterModelOptions(
name="grouppagepermission",
options={
"verbose_name": "group page permission",
"verbose_name_plural": "group page permissions",
},
),
migrations.AlterModelOptions(
name="page",
options={"verbose_name": "page", "verbose_name_plural": "pages"},
),
migrations.AlterModelOptions(
name="pagerevision",
options={
"verbose_name": "page revision",
"verbose_name_plural": "page revisions",
},
),
migrations.AlterModelOptions(
name="pageviewrestriction",
options={
"verbose_name": "page view restriction",
"verbose_name_plural": "page view restrictions",
},
),
migrations.AlterModelOptions(
name="site",
options={"verbose_name": "site", "verbose_name_plural": "sites"},
),
]

View File

@@ -0,0 +1,21 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0019_verbose_names_cleanup"),
]
operations = [
migrations.AlterField(
model_name="page",
name="first_published_at",
field=models.DateTimeField(
editable=False,
null=True,
verbose_name="First published at",
db_index=True,
),
),
]

View File

@@ -0,0 +1,272 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0020_add_index_on_page_first_published_at"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="group",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="page_permissions",
to="auth.Group",
verbose_name="group",
),
),
migrations.AlterField(
model_name="grouppagepermission",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="group_permissions",
to="wagtailcore.Page",
verbose_name="page",
),
),
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
max_length=20,
verbose_name="permission type",
choices=[
("add", "Add/edit pages you own"),
("edit", "Edit any page"),
("publish", "Publish any page"),
("lock", "Lock/unlock any page"),
],
),
),
migrations.AlterField(
model_name="page",
name="content_type",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="pages",
to="contenttypes.ContentType",
verbose_name="content type",
),
),
migrations.AlterField(
model_name="page",
name="expire_at",
field=models.DateTimeField(
null=True,
blank=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
verbose_name="expiry date/time",
),
),
migrations.AlterField(
model_name="page",
name="expired",
field=models.BooleanField(
default=False, editable=False, verbose_name="expired"
),
),
migrations.AlterField(
model_name="page",
name="first_published_at",
field=models.DateTimeField(
null=True,
db_index=True,
editable=False,
verbose_name="first published at",
),
),
migrations.AlterField(
model_name="page",
name="go_live_at",
field=models.DateTimeField(
null=True,
blank=True,
help_text="Please add a date-time in the form YYYY-MM-DD hh:mm.",
verbose_name="go live date/time",
),
),
migrations.AlterField(
model_name="page",
name="has_unpublished_changes",
field=models.BooleanField(
default=False, editable=False, verbose_name="has unpublished changes"
),
),
migrations.AlterField(
model_name="page",
name="latest_revision_created_at",
field=models.DateTimeField(
null=True, editable=False, verbose_name="latest revision created at"
),
),
migrations.AlterField(
model_name="page",
name="live",
field=models.BooleanField(
default=True, editable=False, verbose_name="live"
),
),
migrations.AlterField(
model_name="page",
name="locked",
field=models.BooleanField(
default=False, editable=False, verbose_name="locked"
),
),
migrations.AlterField(
model_name="page",
name="owner",
field=models.ForeignKey(
blank=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="owned_pages",
null=True,
to=settings.AUTH_USER_MODEL,
editable=False,
verbose_name="owner",
),
),
migrations.AlterField(
model_name="page",
name="search_description",
field=models.TextField(blank=True, verbose_name="search description"),
),
migrations.AlterField(
model_name="page",
name="seo_title",
field=models.CharField(
max_length=255,
blank=True,
help_text="Optional. 'Search Engine Friendly' title. This will appear at the top of the browser window.",
verbose_name="page title",
),
),
migrations.AlterField(
model_name="page",
name="show_in_menus",
field=models.BooleanField(
default=False,
help_text="Whether a link to this page will appear in automatically generated menus",
verbose_name="show in menus",
),
),
migrations.AlterField(
model_name="page",
name="slug",
field=models.SlugField(
max_length=255,
verbose_name="slug",
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/",
),
),
migrations.AlterField(
model_name="page",
name="title",
field=models.CharField(
max_length=255,
help_text="The page title as you'd like it to be seen by the public",
verbose_name="title",
),
),
migrations.AlterField(
model_name="pagerevision",
name="approved_go_live_at",
field=models.DateTimeField(
null=True, blank=True, verbose_name="approved go live at"
),
),
migrations.AlterField(
model_name="pagerevision",
name="content_json",
field=models.TextField(verbose_name="content JSON"),
),
migrations.AlterField(
model_name="pagerevision",
name="created_at",
field=models.DateTimeField(verbose_name="created at"),
),
migrations.AlterField(
model_name="pagerevision",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="revisions",
to="wagtailcore.Page",
verbose_name="page",
),
),
migrations.AlterField(
model_name="pagerevision",
name="submitted_for_moderation",
field=models.BooleanField(
default=False, db_index=True, verbose_name="submitted for moderation"
),
),
migrations.AlterField(
model_name="pagerevision",
name="user",
field=models.ForeignKey(
on_delete=models.CASCADE,
blank=True,
null=True,
to=settings.AUTH_USER_MODEL,
verbose_name="user",
),
),
migrations.AlterField(
model_name="pageviewrestriction",
name="page",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="view_restrictions",
to="wagtailcore.Page",
verbose_name="page",
),
),
migrations.AlterField(
model_name="pageviewrestriction",
name="password",
field=models.CharField(max_length=255, verbose_name="password"),
),
migrations.AlterField(
model_name="site",
name="hostname",
field=models.CharField(
max_length=255, db_index=True, verbose_name="hostname"
),
),
migrations.AlterField(
model_name="site",
name="is_default_site",
field=models.BooleanField(
default=False,
help_text="If true, this site will handle requests for all other hostnames that do not have a site entry of their own",
verbose_name="is default site",
),
),
migrations.AlterField(
model_name="site",
name="port",
field=models.IntegerField(
default=80,
help_text="Set this to something other than 80 if you need a specific port number to appear in URLs (e.g. development on port 8000). Does not affect request handling (so port forwarding still works).",
verbose_name="port",
),
),
migrations.AlterField(
model_name="site",
name="root_page",
field=models.ForeignKey(
on_delete=models.CASCADE,
related_name="sites_rooted_here",
to="wagtailcore.Page",
verbose_name="root page",
),
),
]

View File

@@ -0,0 +1,22 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0021_capitalizeverbose"),
]
operations = [
migrations.AddField(
model_name="site",
name="site_name",
field=models.CharField(
verbose_name="site name",
null=True,
blank=True,
max_length=255,
help_text="Human-readable name for the site.",
),
),
]

View File

@@ -0,0 +1,24 @@
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0022_add_site_name"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="user",
field=models.ForeignKey(
on_delete=django.db.models.deletion.SET_NULL,
verbose_name="user",
blank=True,
to=settings.AUTH_USER_MODEL,
null=True,
),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 1.9 on 2015-12-22 09:34
from django.db import migrations, models
import wagtail.models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0023_alter_page_revision_on_delete_behaviour"),
]
operations = [
migrations.AlterField(
model_name="page",
name="content_type",
field=models.ForeignKey(
on_delete=models.SET(wagtail.models.get_default_page_content_type),
related_name="pages",
to="contenttypes.ContentType",
verbose_name="content type",
),
),
]

View File

@@ -0,0 +1,34 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0023_alter_page_revision_on_delete_behaviour"),
]
operations = [
migrations.CreateModel(
name="Collection",
fields=[
(
"id",
models.AutoField(
auto_created=True,
verbose_name="ID",
primary_key=True,
serialize=False,
),
),
("path", models.CharField(max_length=255, unique=True)),
("depth", models.PositiveIntegerField()),
("numchild", models.PositiveIntegerField(default=0)),
("name", models.CharField(max_length=255, verbose_name="name")),
],
options={
"verbose_name": "collection",
"verbose_name_plural": "collections",
},
bases=(models.Model,),
),
]

View File

@@ -0,0 +1,24 @@
from django.db import migrations
def initial_data(apps, schema_editor):
Collection = apps.get_model("wagtailcore.Collection")
# Create root page
Collection.objects.create(
name="Root",
path="0001",
depth=1,
numchild=0,
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0024_collection"),
]
operations = [
migrations.RunPython(initial_data, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,60 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("auth", "0001_initial"),
("wagtailcore", "0025_collection_initial_data"),
]
operations = [
migrations.CreateModel(
name="GroupCollectionPermission",
fields=[
(
"id",
models.AutoField(
serialize=False,
primary_key=True,
auto_created=True,
verbose_name="ID",
),
),
(
"collection",
models.ForeignKey(
related_name="group_permissions",
verbose_name="collection",
to="wagtailcore.Collection",
on_delete=models.CASCADE,
),
),
(
"group",
models.ForeignKey(
related_name="collection_permissions",
verbose_name="group",
to="auth.Group",
on_delete=models.CASCADE,
),
),
(
"permission",
models.ForeignKey(
to="auth.Permission",
verbose_name="permission",
on_delete=models.CASCADE,
),
),
],
options={
"verbose_name": "group collection permission",
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name="groupcollectionpermission",
unique_together={("group", "collection", "permission")},
),
]

View File

@@ -0,0 +1,28 @@
from django.db import migrations
def set_collection_path_collation(apps, schema_editor):
"""
Treebeard's path comparison logic can fail on certain locales such as sk_SK, which
sort numbers after letters. To avoid this, we explicitly set the collation for the
'path' column to the (non-locale-specific) 'C' collation.
See: https://groups.google.com/d/msg/wagtail/q0leyuCnYWI/I9uDvVlyBAAJ
"""
if schema_editor.connection.vendor == "postgresql":
schema_editor.execute(
"""
ALTER TABLE wagtailcore_collection ALTER COLUMN path TYPE VARCHAR(255) COLLATE "C"
"""
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0026_group_collection_permission"),
]
operations = [
migrations.RunPython(set_collection_path_collation, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,12 @@
# Generated by Django 1.9.1 on 2016-02-03 13:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0024_alter_page_content_type_on_delete_behaviour"),
("wagtailcore", "0027_fix_collection_path_collation"),
]
operations = []

View File

@@ -0,0 +1,22 @@
# Generated by Django 1.9.4 on 2016-04-27 22:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0028_merge"),
]
operations = [
migrations.AlterField(
model_name="page",
name="slug",
field=models.SlugField(
allow_unicode=True,
help_text="The name of the page as it will appear in URLs e.g http://domain.com/blog/[my-slug]/",
max_length=255,
verbose_name="slug",
),
),
]

View File

@@ -0,0 +1,16 @@
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0029_unicode_slugfield_dj19"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="created_at",
field=models.DateTimeField(db_index=True, verbose_name="created at"),
),
]

View File

@@ -0,0 +1,38 @@
# Generated by Django 1.10.2 on 2016-10-07 15:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("auth", "0001_initial"),
("wagtailcore", "0030_index_on_pagerevision_created_at"),
]
operations = [
migrations.AddField(
model_name="pageviewrestriction",
name="groups",
field=models.ManyToManyField(blank=True, to="auth.Group"),
),
migrations.AddField(
model_name="pageviewrestriction",
name="restriction_type",
field=models.CharField(
choices=[
("none", "Public"),
("login", "Private, accessible to logged-in users"),
("password", "Private, accessible with the following password"),
("groups", "Private, accessible to users in specific groups"),
],
default="password",
max_length=20,
),
preserve_default=False,
),
migrations.AlterField(
model_name="pageviewrestriction",
name="password",
field=models.CharField(blank=True, max_length=255, verbose_name="password"),
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 1.10.1 on 2016-09-27 14:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0031_add_page_view_restriction_types"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
choices=[
("add", "Add/edit pages you own"),
("edit", "Edit any page"),
("publish", "Publish any page"),
("bulk_delete", "Delete pages with children"),
("lock", "Lock/unlock any page"),
],
max_length=20,
verbose_name="permission type",
),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.10.6 on 2017-03-31 14:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0032_add_bulk_delete_page_permission"),
]
operations = [
migrations.AlterField(
model_name="page",
name="expire_at",
field=models.DateTimeField(
blank=True, null=True, verbose_name="expiry date/time"
),
),
migrations.AlterField(
model_name="page",
name="go_live_at",
field=models.DateTimeField(
blank=True, null=True, verbose_name="go live date/time"
),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.10.4 on 2017-01-26 21:32
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0033_remove_golive_expiry_help_text"),
]
operations = [
migrations.AddField(
model_name="page",
name="live_revision",
field=models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtailcore.PageRevision",
verbose_name="live revision",
),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 1.11.1 on 2017-05-22 13:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0034_page_live_revision"),
]
operations = [
migrations.AddField(
model_name="page",
name="last_published_at",
field=models.DateTimeField(
editable=False, null=True, verbose_name="last published at"
),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 1.11.1 on 2017-06-01 11:03
from django.db import migrations
from django.db.models import F
def forwards_func(apps, schema_editor):
Page = apps.get_model("wagtailcore", "Page")
Page.objects.filter(has_unpublished_changes=False).update(
last_published_at=F("latest_revision_created_at")
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0035_page_last_published_at"),
]
operations = [
migrations.RunPython(forwards_func, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.10.7 on 2017-05-03 12:05
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0036_populate_page_last_published_at"),
]
operations = [
migrations.AlterField(
model_name="page",
name="owner",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="owned_pages",
to=settings.AUTH_USER_MODEL,
verbose_name="owner",
),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 1.10.6 on 2017-03-24 09:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0037_set_page_owner_editable"),
]
operations = [
migrations.AlterField(
model_name="page",
name="first_published_at",
field=models.DateTimeField(
blank=True, db_index=True, null=True, verbose_name="first published at"
),
),
]

View File

@@ -0,0 +1,77 @@
# Generated by Django 1.10.4 on 2016-12-19 15:32
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0038_make_first_published_at_editable"),
]
operations = [
migrations.CreateModel(
name="CollectionViewRestriction",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"restriction_type",
models.CharField(
choices=[
("none", "Public"),
("login", "Private, accessible to logged-in users"),
(
"password",
"Private, accessible with the following password",
),
(
"groups",
"Private, accessible to users in specific groups",
),
],
max_length=20,
),
),
(
"password",
models.CharField(
blank=True, max_length=255, verbose_name="password"
),
),
(
"collection",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="view_restrictions",
to="wagtailcore.Collection",
verbose_name="collection",
),
),
(
"groups",
models.ManyToManyField(
blank=True, to="auth.Group", verbose_name="groups"
),
),
],
options={
"verbose_name": "collection view restriction",
"verbose_name_plural": "collection view restrictions",
},
),
migrations.AlterField(
model_name="pageviewrestriction",
name="groups",
field=models.ManyToManyField(
blank=True, to="auth.Group", verbose_name="groups"
),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 1.10.2 on 2017-01-20 15:34
from django.db import migrations, models
from django.db.models import F
def draft_title(apps, schema_editor):
Page = apps.get_model("wagtailcore", "Page")
Page.objects.all().update(draft_title=F("title"))
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0039_collectionviewrestriction"),
]
operations = [
migrations.AddField(
model_name="page",
name="draft_title",
field=models.CharField(default="", editable=False, max_length=255),
preserve_default=False,
),
migrations.RunPython(draft_title, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 2.2.dev20181026000358 on 2018-10-27 09:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0040_page_draft_title"),
]
operations = [
migrations.AlterModelOptions(
name="groupcollectionpermission",
options={
"verbose_name": "group collection permission",
"verbose_name_plural": "group collection permissions",
},
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-11-29 10:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0041_group_collection_permissions_verbose_name_plural"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="approved_go_live_at",
field=models.DateTimeField(
blank=True, db_index=True, null=True, verbose_name="approved go live at"
),
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 2.2.6 on 2019-10-16 08:30
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0042_index_on_pagerevision_approved_go_live_at"),
]
operations = [
migrations.AddField(
model_name="page",
name="locked_at",
field=models.DateTimeField(
editable=False, null=True, verbose_name="locked at"
),
),
migrations.AddField(
model_name="page",
name="locked_by",
field=models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="locked_%(class)ss",
to=settings.AUTH_USER_MODEL,
verbose_name="locked by",
),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 2.1.13 on 2019-10-17 13:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0043_lock_fields"),
]
operations = [
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
choices=[
("add", "Add/edit pages you own"),
("edit", "Edit any page"),
("publish", "Publish any page"),
("bulk_delete", "Delete pages with children"),
("lock", "Lock/unlock pages you've locked"),
("unlock", "Unlock any page"),
],
max_length=20,
verbose_name="permission type",
),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 2.1.13 on 2019-10-17 13:25
from django.db import migrations
def assign_unlock_grouppagepermission(apps, schema_editor):
# Assign Unlock permission to all groups that currently have the lock permission
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
for lock_permission in GroupPagePermission.objects.filter(permission_type="lock"):
GroupPagePermission.objects.create(
group=lock_permission.group,
page=lock_permission.page,
permission_type="unlock",
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0044_add_unlock_grouppagepermission"),
]
operations = [
migrations.RunPython(
assign_unlock_grouppagepermission, migrations.RunPython.noop
)
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 3.0.6 on 2020-05-27 15:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0045_assign_unlock_grouppagepermission"),
]
operations = [
migrations.AlterField(
model_name="site",
name="site_name",
field=models.CharField(
blank=True,
default="",
help_text="Human-readable name for the site.",
max_length=255,
verbose_name="site name",
),
preserve_default=False,
),
]

View File

@@ -0,0 +1,347 @@
# Generated by Django 3.0.3 on 2020-03-03 15:26
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import modelcluster.fields
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0046_site_name_remove_null"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("auth", "0011_update_proxy_permissions"),
]
operations = [
migrations.CreateModel(
name="Task",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255, verbose_name="name")),
(
"active",
models.BooleanField(
default=True,
help_text="Active tasks can be added to workflows. Deactivating a task does not remove it from existing workflows.",
verbose_name="active",
),
),
(
"content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="wagtail_tasks",
to="contenttypes.ContentType",
verbose_name="content type",
),
),
],
options={
"verbose_name": "task",
"verbose_name_plural": "tasks",
},
),
migrations.CreateModel(
name="TaskState",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"status",
models.CharField(
choices=[
("in_progress", "In progress"),
("approved", "Approved"),
("rejected", "Rejected"),
("skipped", "Skipped"),
("cancelled", "Cancelled"),
],
default="in_progress",
max_length=50,
verbose_name="status",
),
),
(
"started_at",
models.DateTimeField(auto_now_add=True, verbose_name="started at"),
),
(
"finished_at",
models.DateTimeField(
blank=True, null=True, verbose_name="finished at"
),
),
(
"content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="wagtail_task_states",
to="contenttypes.ContentType",
verbose_name="content type",
),
),
(
"page_revision",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="task_states",
to="wagtailcore.PageRevision",
verbose_name="revision",
),
),
(
"task",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="task_states",
to="wagtailcore.Task",
verbose_name="task",
),
),
],
options={
"verbose_name": "Task state",
"verbose_name_plural": "Task states",
},
),
migrations.CreateModel(
name="Workflow",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255, verbose_name="name")),
(
"active",
models.BooleanField(
default=True,
help_text="Active workflows can be added to pages/snippets. Deactivating a workflow does not remove it from existing pages/snippets.",
verbose_name="active",
),
),
],
options={
"verbose_name": "workflow",
"verbose_name_plural": "workflows",
},
),
migrations.CreateModel(
name="GroupApprovalTask",
fields=[
(
"task_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="wagtailcore.Task",
),
),
],
options={
"verbose_name": "Group approval task",
"verbose_name_plural": "Group approval tasks",
},
bases=("wagtailcore.task",),
),
migrations.CreateModel(
name="WorkflowState",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"status",
models.CharField(
choices=[
("in_progress", "In progress"),
("approved", "Approved"),
("rejected", "Rejected"),
("cancelled", "Cancelled"),
],
default="in_progress",
max_length=50,
verbose_name="status",
),
),
(
"created_at",
models.DateTimeField(auto_now_add=True, verbose_name="created at"),
),
(
"current_task_state",
models.OneToOneField(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to="wagtailcore.TaskState",
verbose_name="current task state",
),
),
(
"page",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_states",
to="wagtailcore.Page",
verbose_name="page",
),
),
(
"requested_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="requested_workflows",
to=settings.AUTH_USER_MODEL,
verbose_name="requested by",
),
),
(
"workflow",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_states",
to="wagtailcore.Workflow",
verbose_name="workflow",
),
),
],
options={
"verbose_name": "Workflow state",
"verbose_name_plural": "Workflow states",
},
),
migrations.CreateModel(
name="WorkflowPage",
fields=[
(
"page",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
primary_key=True,
serialize=False,
to="wagtailcore.Page",
verbose_name="page",
),
),
(
"workflow",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_pages",
to="wagtailcore.Workflow",
verbose_name="workflow",
),
),
],
options={
"verbose_name": "workflow page",
"verbose_name_plural": "workflow pages",
},
),
migrations.AddField(
model_name="taskstate",
name="workflow_state",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="task_states",
to="wagtailcore.WorkflowState",
verbose_name="workflow state",
),
),
migrations.CreateModel(
name="WorkflowTask",
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),
),
(
"task",
models.ForeignKey(
limit_choices_to={"active": True},
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_tasks",
to="wagtailcore.Task",
verbose_name="task",
),
),
(
"workflow",
modelcluster.fields.ParentalKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_tasks",
to="wagtailcore.Workflow",
verbose_name="workflow_tasks",
),
),
],
options={
"verbose_name": "workflow task order",
"verbose_name_plural": "workflow task orders",
"ordering": ["sort_order"],
"abstract": False,
"unique_together": {("workflow", "task")},
},
),
migrations.AddConstraint(
model_name="workflowstate",
constraint=models.UniqueConstraint(
condition=models.Q(status="in_progress"),
fields=("page",),
name="unique_in_progress_workflow",
),
),
migrations.AddField(
model_name="groupapprovaltask",
name="groups",
field=models.ManyToManyField(
help_text="Pages/snippets at this step in a workflow will be moderated or approved by these groups of users",
to="auth.Group",
verbose_name="groups",
),
),
]

View File

@@ -0,0 +1,95 @@
from django.db import migrations
from django.db.models import Count, Q
from wagtail.models import Page as RealPage
def ancestor_of_q(page):
paths = [page.path[0:pos] for pos in range(0, len(page.path) + 1, page.steplen)[1:]]
q = Q(path__in=paths)
return q
def create_default_workflows(apps, schema_editor):
# This will recreate the existing publish-permission based moderation setup in the new workflow system, by creating new workflows
# Get models
ContentType = apps.get_model("contenttypes.ContentType")
Workflow = apps.get_model("wagtailcore.Workflow")
GroupApprovalTask = apps.get_model("wagtailcore.GroupApprovalTask")
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
WorkflowPage = apps.get_model("wagtailcore.WorkflowPage")
WorkflowTask = apps.get_model("wagtailcore.WorkflowTask")
Page = apps.get_model("wagtailcore.Page")
Group = apps.get_model("auth.Group")
# Get this from real page model just in case it has been overridden
Page.steplen = RealPage.steplen
# Create content type for GroupApprovalTask model
group_approval_content_type, __ = ContentType.objects.get_or_create(
model="groupapprovaltask", app_label="wagtailcore"
)
publish_permissions = GroupPagePermission.objects.filter(permission_type="publish")
for permission in publish_permissions:
# find groups with publish permission over this page or its ancestors (and therefore this page by descent)
page = permission.page
page = Page.objects.get(pk=page.pk)
ancestors = Page.objects.filter(ancestor_of_q(page))
ancestor_permissions = publish_permissions.filter(page__in=ancestors)
groups = Group.objects.filter(
Q(page_permissions__in=ancestor_permissions)
| Q(page_permissions__pk=permission.pk)
).distinct()
# get a GroupApprovalTask with groups matching these publish permission groups (and no others)
task = (
GroupApprovalTask.objects.filter(groups__id__in=groups.all())
.annotate(count=Count("groups"))
.filter(count=groups.count())
.filter(active=True)
.first()
)
if not task:
# if no such task exists, create it
group_names = " ".join([group.name for group in groups])
task = GroupApprovalTask.objects.create(
name=group_names + " approval",
content_type=group_approval_content_type,
active=True,
)
task.groups.set(groups)
# get a Workflow containing only this task if it exists, otherwise create it
workflow = (
Workflow.objects.annotate(task_number=Count("workflow_tasks"))
.filter(task_number=1)
.filter(workflow_tasks__task=task)
.filter(active=True)
.first()
)
if not workflow:
workflow = Workflow.objects.create(name=task.name, active=True)
WorkflowTask.objects.create(
workflow=workflow,
task=task,
sort_order=0,
)
# if the workflow is not linked by a WorkflowPage to the permission's linked page, link it by creating a new WorkflowPage now
if not WorkflowPage.objects.filter(workflow=workflow, page=page).exists():
WorkflowPage.objects.create(workflow=workflow, page=page)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0047_add_workflow_models"),
]
operations = [
migrations.RunPython(create_default_workflows, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 3.0.3 on 2020-03-10 11:01
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0048_add_default_workflows"),
]
operations = [
migrations.AddField(
model_name="taskstate",
name="finished_by",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="finished_task_states",
to=settings.AUTH_USER_MODEL,
verbose_name="finished by",
),
),
]

View File

@@ -0,0 +1,40 @@
# Generated by Django 3.0.5 on 2020-05-20 10:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0049_taskstate_finished_by"),
]
operations = [
migrations.RemoveConstraint(
model_name="workflowstate",
name="unique_in_progress_workflow",
),
migrations.AlterField(
model_name="workflowstate",
name="status",
field=models.CharField(
choices=[
("in_progress", "In progress"),
("approved", "Approved"),
("needs_changes", "Needs changes"),
("cancelled", "Cancelled"),
],
default="in_progress",
max_length=50,
verbose_name="status",
),
),
migrations.AddConstraint(
model_name="workflowstate",
constraint=models.UniqueConstraint(
condition=models.Q(status__in=("in_progress", "needs_changes")),
fields=("page",),
name="unique_in_progress_workflow",
),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.0.5 on 2020-05-28 10:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0050_workflow_rejected_to_needs_changes"),
]
operations = [
migrations.AddField(
model_name="taskstate",
name="comment",
field=models.TextField(blank=True),
),
]

View File

@@ -0,0 +1,84 @@
# Generated by Django 3.0.5 on 2020-07-09 21:07
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0051_taskstate_comment"),
]
operations = [
migrations.CreateModel(
name="PageLogEntry",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("label", models.TextField()),
("action", models.CharField(blank=True, db_index=True, max_length=255)),
("data_json", models.TextField(blank=True)),
("timestamp", models.DateTimeField(verbose_name="timestamp (UTC)")),
("content_changed", models.BooleanField(db_index=True, default=False)),
("deleted", models.BooleanField(default=False)),
(
"content_type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="contenttypes.ContentType",
verbose_name="content type",
),
),
(
"page",
models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="wagtailcore.Page",
),
),
(
"revision",
models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="wagtailcore.PageRevision",
),
),
(
"user",
models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "page log entry",
"verbose_name_plural": "page log entries",
"ordering": ["-timestamp", "-id"],
},
),
]

View File

@@ -0,0 +1,31 @@
# Generated by Django 2.2.10 on 2020-07-13 10:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0052_pagelogentry"),
]
operations = [
migrations.CreateModel(
name="Locale",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("language_code", models.CharField(max_length=100, unique=True)),
],
options={
"ordering": ["language_code"],
},
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 2.2.10 on 2020-07-13 10:13
from django.conf import settings
from django.db import migrations
from wagtail.coreutils import get_supported_content_language_variant
def initial_locale(apps, schema_editor):
Locale = apps.get_model("wagtailcore.Locale")
Locale.objects.create(
language_code=get_supported_content_language_variant(settings.LANGUAGE_CODE),
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0053_locale_model"),
]
operations = [
migrations.RunPython(initial_locale, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 2.2.10 on 2020-07-13 10:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0054_initial_locale"),
]
operations = [
migrations.AddField(
model_name="page",
name="translation_key",
field=models.UUIDField(editable=False, null=True),
),
migrations.AddField(
model_name="page",
name="locale",
field=models.ForeignKey(
editable=False,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="wagtailcore.Locale",
),
),
migrations.AlterUniqueTogether(
name="page",
unique_together={("translation_key", "locale")},
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 2.2.10 on 2020-07-13 10:13
from django.db import migrations
from wagtail.models import BootstrapTranslatableModel
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0055_page_locale_fields"),
]
operations = [
BootstrapTranslatableModel("wagtailcore.Page"),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 2.2.10 on 2020-07-13 10:17
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0056_page_locale_fields_populate"),
]
operations = [
migrations.AlterField(
model_name="page",
name="locale",
field=models.ForeignKey(
editable=False,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="wagtailcore.Locale",
),
),
migrations.AlterField(
model_name="page",
name="translation_key",
field=models.UUIDField(default=uuid.uuid4, editable=False),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 3.0.9 on 2020-08-04 12:38
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0057_page_locale_fields_notnull"),
]
operations = [
migrations.AddField(
model_name="page",
name="alias_of",
field=models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="aliases",
to="wagtailcore.Page",
),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 3.1.1 on 2020-09-30 10:14
from django.db import migrations
# import the real Collection model (as opposed to the frozen version we'd obtain with
# apps.get_model) so that we can use its fix_tree method. Importing real models in migrations is
# generally avoided since it's liable to generate SQL queries according to the final migrated
# database state which we haven't reached yet - however, in this case it should be safe because
# fix_tree only touches the Treebeard-specific fields via values_list and update, and shouldn't be
# sensitive to schema changes elsewhere.
from wagtail.models import Collection
def apply_collection_ordering(apps, schema_editor):
Collection.fix_tree(fix_paths=True)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0058_page_alias_of"),
]
operations = [
migrations.RunPython(apply_collection_ordering, migrations.RunPython.noop),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 3.1.3 on 2020-11-27 01:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0059_apply_collection_ordering"),
]
operations = [
migrations.RemoveConstraint(
model_name="workflowstate",
name="unique_in_progress_workflow",
),
migrations.AddConstraint(
model_name="workflowstate",
constraint=models.UniqueConstraint(
condition=models.Q(status__in=("in_progress", "needs_changes")),
fields=("page",),
name="unique_in_progress_workflow",
),
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 3.0.12 on 2021-02-04 15:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0060_fix_workflow_unique_constraint"),
]
operations = [
migrations.AlterField(
model_name="page",
name="search_description",
field=models.TextField(
blank=True,
help_text="The descriptive text displayed underneath a headline in search engine results.",
verbose_name="meta description",
),
),
migrations.AlterField(
model_name="page",
name="seo_title",
field=models.CharField(
blank=True,
help_text="The name of the page displayed on search engine results as the clickable headline.",
max_length=255,
verbose_name="title tag",
),
),
]

View File

@@ -0,0 +1,149 @@
# Generated by Django 3.0.3 on 2021-04-19 13:54
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import modelcluster.fields
from wagtail.models import COMMENTS_RELATION_NAME
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0061_change_promote_tab_helpt_text_and_verbose_names"),
]
operations = [
migrations.CreateModel(
name="Comment",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("text", models.TextField()),
("contentpath", models.TextField()),
("position", models.TextField(blank=True)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("resolved_at", models.DateTimeField(blank=True, null=True)),
(
"page",
modelcluster.fields.ParentalKey(
on_delete=django.db.models.deletion.CASCADE,
related_name=COMMENTS_RELATION_NAME,
to="wagtailcore.Page",
),
),
(
"resolved_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="comments_resolved",
to=settings.AUTH_USER_MODEL,
),
),
(
"revision_created",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="created_comments",
to="wagtailcore.PageRevision",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name=COMMENTS_RELATION_NAME,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "comment",
"verbose_name_plural": "comments",
},
),
migrations.CreateModel(
name="CommentReply",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("text", models.TextField()),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"comment",
modelcluster.fields.ParentalKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="replies",
to="wagtailcore.Comment",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="comment_replies",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "comment reply",
"verbose_name_plural": "comment replies",
},
),
migrations.CreateModel(
name="PageSubscription",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("comment_notifications", models.BooleanField()),
(
"page",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="subscribers",
to="wagtailcore.Page",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="page_subscriptions",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"unique_together": {("page", "user")},
},
),
]

View File

@@ -0,0 +1,65 @@
# Generated by Django 3.1.12 on 2021-06-16 14:08
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0062_comment_models_and_pagesubscription"),
]
operations = [
migrations.CreateModel(
name="ModelLogEntry",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("label", models.TextField()),
("action", models.CharField(blank=True, db_index=True, max_length=255)),
("data_json", models.TextField(blank=True)),
("timestamp", models.DateTimeField(verbose_name="timestamp (UTC)")),
("content_changed", models.BooleanField(db_index=True, default=False)),
("deleted", models.BooleanField(default=False)),
("object_id", models.CharField(db_index=True, max_length=255)),
(
"content_type",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="contenttypes.contenttype",
verbose_name="content type",
),
),
(
"user",
models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"verbose_name": "model log entry",
"verbose_name_plural": "model log entries",
"ordering": ["-timestamp", "-id"],
},
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 3.2.5 on 2021-07-20 12:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0063_modellogentry"),
]
operations = [
migrations.AlterField(
model_name="modellogentry",
name="timestamp",
field=models.DateTimeField(db_index=True, verbose_name="timestamp (UTC)"),
),
migrations.AlterField(
model_name="pagelogentry",
name="timestamp",
field=models.DateTimeField(db_index=True, verbose_name="timestamp (UTC)"),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 3.2.5 on 2021-09-01 14:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0064_log_timestamp_indexes"),
]
operations = [
migrations.AddField(
model_name="modellogentry",
name="uuid",
field=models.UUIDField(
blank=True,
editable=False,
help_text="Log entries that happened as part of the same user action are assigned the same UUID",
null=True,
),
),
migrations.AddField(
model_name="pagelogentry",
name="uuid",
field=models.UUIDField(
blank=True,
editable=False,
help_text="Log entries that happened as part of the same user action are assigned the same UUID",
null=True,
),
),
]

View File

@@ -0,0 +1,77 @@
from django.db import migrations
def grant_instance_level_collection_management_permissions(apps, schema_editor):
"""
Give the groups who currently manage all collections permission to manage root collections
"""
Collection = apps.get_model("wagtailcore.Collection")
Group = apps.get_model("auth.Group")
GroupCollectionPermission = apps.get_model("wagtailcore.GroupCollectionPermission")
Permission = apps.get_model("auth.Permission")
groups_w_permissions = Group.objects.filter(
permissions__content_type__app_label="wagtailcore",
permissions__content_type__model="collection",
permissions__codename__in=[
"add_collection",
"change_collection",
"delete_collection",
],
).values("id", "name", "permissions__id", "permissions__codename")
for root_collection in Collection.objects.filter(depth=1).all():
for row in groups_w_permissions:
GroupCollectionPermission.objects.create(
group_id=row["id"],
permission_id=row["permissions__id"],
collection_id=root_collection.id,
)
# Now remove the model-level permissions for collections
collection_permissions = Permission.objects.filter(
content_type__app_label="wagtailcore",
content_type__model="collection",
codename__in=["add_collection", "change_collection", "delete_collection"],
)
for perm in collection_permissions.all():
perm.group_set.clear()
def revert_to_model_level_collection_management_permissions(apps, schema_editor):
"""
Give model-level permission to all groups who have that permission on the root collection
"""
Collection = apps.get_model("wagtailcore.Collection")
GroupCollectionPermission = apps.get_model("wagtailcore.GroupCollectionPermission")
root_collections = Collection.objects.filter(depth=1).all()
group_collection_permissions = GroupCollectionPermission.objects.filter(
permission__content_type__app_label="wagtailcore",
permission__content_type__model="collection",
permission__codename__in=[
"add_collection",
"change_collection",
"delete_collection",
],
collection__in=root_collections,
).select_related("group", "permission")
for row in group_collection_permissions.all():
row.group.permissions.add(row.permission)
# Now delete the instance-level collection management permissions
group_collection_permissions.all().delete()
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0065_log_entry_uuid"),
]
operations = [
migrations.RunPython(
grant_instance_level_collection_management_permissions,
revert_to_model_level_collection_management_permissions,
)
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.0.2 on 2022-02-22 13:06
import django.core.serializers.json
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0066_collection_management_permissions"),
]
operations = [
migrations.AlterField(
model_name="pagerevision",
name="content_json",
field=models.JSONField(
encoder=django.core.serializers.json.DjangoJSONEncoder,
verbose_name="content JSON",
),
),
migrations.RenameField(
model_name="pagerevision",
old_name="content_json",
new_name="content",
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 4.0.2 on 2022-02-22 04:27
from django.db import migrations
def replace_empty_string_with_empty_object(apps, schema_editor):
ModelLogEntry = apps.get_model("wagtailcore.ModelLogEntry")
PageLogEntry = apps.get_model("wagtailcore.PageLogEntry")
ModelLogEntry.objects.filter(data_json='""').update(data_json="{}")
PageLogEntry.objects.filter(data_json='""').update(data_json="{}")
def revert_empty_object_to_empty_string(apps, schema_editor):
ModelLogEntry = apps.get_model("wagtailcore.ModelLogEntry")
PageLogEntry = apps.get_model("wagtailcore.PageLogEntry")
ModelLogEntry.objects.filter(data_json="{}").update(data_json='""')
PageLogEntry.objects.filter(data_json="{}").update(data_json='""')
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0067_alter_pagerevision_content_json"),
]
operations = [
migrations.RunPython(
replace_empty_string_with_empty_object, revert_empty_object_to_empty_string
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.0.2 on 2022-02-24 04:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0068_log_entry_empty_object"),
]
operations = [
migrations.AlterField(
model_name="modellogentry",
name="data_json",
field=models.JSONField(blank=True, default=dict),
),
migrations.AlterField(
model_name="pagelogentry",
name="data_json",
field=models.JSONField(blank=True, default=dict),
),
migrations.RenameField(
model_name="modellogentry",
old_name="data_json",
new_name="data",
),
migrations.RenameField(
model_name="pagelogentry",
old_name="data_json",
new_name="data",
),
]

View File

@@ -0,0 +1,79 @@
# Generated by Django 4.0.3 on 2022-04-26 12:31
from django.conf import settings
from django.db import migrations, models
def disable_sqlite_legacy_alter_table(apps, schema_editor):
# Fix for https://github.com/wagtail/wagtail/issues/8635
if schema_editor.connection.vendor == "sqlite":
schema_editor.execute("PRAGMA legacy_alter_table = OFF")
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0069_log_entry_jsonfield"),
]
atomic = False
operations = [
migrations.RunPython(
disable_sqlite_legacy_alter_table,
migrations.RunPython.noop,
),
migrations.RenameModel(
old_name="PageRevision",
new_name="Revision",
),
migrations.AlterModelOptions(
name="revision",
options={"verbose_name": "revision", "verbose_name_plural": "revisions"},
),
migrations.AlterField(
model_name="revision",
name="page",
field=models.CharField(max_length=255, verbose_name="object id"),
),
migrations.RenameField(
model_name="revision",
old_name="page",
new_name="object_id",
),
migrations.AddField(
model_name="revision",
name="content_type",
field=models.ForeignKey(
null=True,
on_delete=models.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AddField(
model_name="revision",
name="base_content_type",
field=models.ForeignKey(
null=True,
on_delete=models.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AddIndex(
model_name="revision",
index=models.Index(
fields=["content_type", "object_id"],
name="content_object_idx",
),
),
migrations.AddIndex(
model_name="revision",
index=models.Index(
fields=["base_content_type", "object_id"],
name="base_content_object_idx",
),
),
]

View File

@@ -0,0 +1,37 @@
# Generated by Django 4.0.3 on 2022-04-26 13:18
from django.db import migrations, models
from django.db.models.fields.json import KeyTextTransform
from django.db.models.functions import Cast
def populate_revision_content_type(apps, schema_editor):
ContentType = apps.get_model("contenttypes.ContentType")
Revision = apps.get_model("wagtailcore.Revision")
page_type = ContentType.objects.get(app_label="wagtailcore", model="page")
Revision.objects.all().update(
base_content_type=page_type,
content_type_id=Cast(
KeyTextTransform("content_type", models.F("content")),
output_field=models.PositiveIntegerField(),
),
)
def empty_revision_content_type(apps, schema_editor):
Revision = apps.get_model("wagtailcore.Revision")
Revision.objects.all().update(base_content_type=None, content_type=None)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0070_rename_pagerevision_revision"),
]
operations = [
migrations.RunPython(
populate_revision_content_type,
empty_revision_content_type,
)
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.0.3 on 2022-04-26 13:28
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0071_populate_revision_content_type"),
]
operations = [
migrations.AlterField(
model_name="revision",
name="content_type",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="contenttypes.contenttype",
related_name="+",
),
),
migrations.AlterField(
model_name="revision",
name="base_content_type",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="contenttypes.contenttype",
related_name="+",
),
),
]

View File

@@ -0,0 +1,27 @@
# Generated by Django 4.0.4 on 2022-05-25 15:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0072_alter_revision_content_type_notnull"),
]
operations = [
migrations.AddField(
model_name="page",
name="latest_revision",
field=models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="+",
to="wagtailcore.revision",
verbose_name="latest revision",
),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.0.4 on 2022-05-25 15:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0073_page_latest_revision"),
]
operations = [
migrations.AddField(
model_name="revision",
name="object_str",
field=models.TextField(default=""),
),
]

View File

@@ -0,0 +1,41 @@
# Generated by Django 4.0.3 on 2022-05-26 13:58
from django.db import migrations, models
from django.db.models.functions import Cast
def populate_latest_revision(apps, schema_editor):
Page = apps.get_model("wagtailcore.Page")
Revision = apps.get_model("wagtailcore.Revision")
latest_revision_id = models.Subquery(
Revision.objects.filter(
content_type_id=models.OuterRef("content_type_id"),
object_id=Cast(models.OuterRef("pk"), models.CharField()),
)
.order_by("-created_at", "-id")
.values("pk")[:1]
)
Page.objects.all().update(latest_revision_id=latest_revision_id)
def populate_revision_object_str(apps, schema_editor):
Revision = apps.get_model("wagtailcore.Revision")
Revision.objects.all().update(object_str=models.F("content__title"))
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0074_revision_object_str"),
]
operations = [
migrations.RunPython(
populate_latest_revision,
migrations.RunPython.noop,
),
migrations.RunPython(
populate_revision_object_str,
migrations.RunPython.noop,
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.0.3 on 2022-05-06 04:49
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0075_populate_latest_revision_and_revision_object_str"),
]
operations = [
migrations.AddField(
model_name="modellogentry",
name="revision",
field=models.ForeignKey(
blank=True,
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="wagtailcore.revision",
),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 3.2.15 on 2022-09-20 13:00
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("wagtailcore", "0076_modellogentry_revision"),
]
operations = [
migrations.AlterField(
model_name="revision",
name="user",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="wagtail_revisions",
to=settings.AUTH_USER_MODEL,
verbose_name="user",
),
),
]

View File

@@ -0,0 +1,75 @@
# Generated by Django 4.0.7 on 2022-09-06 14:26
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0077_alter_revision_user"),
]
operations = [
migrations.CreateModel(
name="ReferenceIndex",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"object_id",
models.CharField(max_length=255, verbose_name="object id"),
),
(
"to_object_id",
models.CharField(max_length=255, verbose_name="object id"),
),
("model_path", models.TextField()),
("content_path", models.TextField()),
("content_path_hash", models.UUIDField()),
(
"base_content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
(
"content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
(
"to_content_type",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
],
options={
"unique_together": {
(
"base_content_type",
"object_id",
"to_content_type",
"to_object_id",
"content_path_hash",
)
},
},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.dev20221212120043 on 2022-12-12 13:03
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0078_referenceindex"),
]
operations = [
migrations.RenameField(
model_name="taskstate",
old_name="page_revision",
new_name="revision",
),
]

View File

@@ -0,0 +1,69 @@
# Generated by Django 4.2.dev20221212145044 on 2022-12-12 15:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0079_rename_taskstate_page_revision"),
]
operations = [
migrations.RemoveConstraint(
model_name="workflowstate",
name="unique_in_progress_workflow",
),
migrations.AlterField(
model_name="workflowstate",
name="page",
field=models.CharField(max_length=255, verbose_name="object id"),
),
migrations.RenameField(
model_name="workflowstate",
old_name="page",
new_name="object_id",
),
migrations.AddField(
model_name="workflowstate",
name="content_type",
field=models.ForeignKey(
null=True,
on_delete=models.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AddField(
model_name="workflowstate",
name="base_content_type",
field=models.ForeignKey(
null=True,
on_delete=models.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AddIndex(
model_name="workflowstate",
index=models.Index(
fields=["content_type", "object_id"],
name="workflowstate_ct_id_idx",
),
),
migrations.AddIndex(
model_name="workflowstate",
index=models.Index(
fields=["base_content_type", "object_id"],
name="workflowstate_base_ct_id_idx",
),
),
migrations.AddConstraint(
model_name="workflowstate",
constraint=models.UniqueConstraint(
condition=models.Q(("status__in", ("in_progress", "needs_changes"))),
fields=("base_content_type", "object_id"),
name="unique_in_progress_workflow",
),
),
]

View File

@@ -0,0 +1,41 @@
# Generated by Django 4.2.dev20221212151407 on 2022-12-12 15:16
from django.db import migrations, models
from django.db.models.functions import Cast
def populate_workflowstate_content_type(apps, schema_editor):
ContentType = apps.get_model("contenttypes.ContentType")
WorkflowState = apps.get_model("wagtailcore.WorkflowState")
Page = apps.get_model("wagtailcore.Page")
page_type = ContentType.objects.get(app_label="wagtailcore", model="page")
content_type_id = models.Subquery(
Page.objects.filter(
pk=Cast(models.OuterRef("object_id"), models.PositiveIntegerField())
).values("content_type_id")
)
WorkflowState.objects.all().update(
base_content_type=page_type,
content_type_id=content_type_id,
)
def empty_workflowstate_content_type(apps, schema_editor):
WorkflowState = apps.get_model("wagtailcore.WorkflowState")
WorkflowState.objects.all().update(base_content_type=None, content_type=None)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0080_generic_workflowstate"),
]
operations = [
migrations.RunPython(
populate_workflowstate_content_type,
empty_workflowstate_content_type,
)
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.dev20221212151407 on 2022-12-12 15:38
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0081_populate_workflowstate_content_type"),
]
operations = [
migrations.AlterField(
model_name="workflowstate",
name="base_content_type",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
migrations.AlterField(
model_name="workflowstate",
name="content_type",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="+",
to="contenttypes.contenttype",
),
),
]

View File

@@ -0,0 +1,40 @@
# Generated by Django 4.2.dev20221214105556 on 2022-12-14 10:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0082_alter_workflowstate_content_type_notnull"),
]
operations = [
migrations.CreateModel(
name="WorkflowContentType",
fields=[
(
"content_type",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
primary_key=True,
related_name="wagtail_workflow_content_type",
serialize=False,
to="contenttypes.contenttype",
verbose_name="content type",
),
),
(
"workflow",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workflow_content_types",
to="wagtailcore.workflow",
verbose_name="workflow",
),
),
],
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.1 on 2023-06-14 15:43
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0083_workflowcontenttype"),
]
operations = [
migrations.AlterModelOptions(
name="page",
options={
"permissions": [
("bulk_delete_page", "Delete pages with children"),
("lock_page", "Lock/unlock pages you've locked"),
("publish_page", "Publish any page"),
("unlock_page", "Unlock any page"),
],
"verbose_name": "page",
"verbose_name_plural": "pages",
},
),
]

View File

@@ -0,0 +1,47 @@
# Generated by Django 4.2.1 on 2023-06-14 15:50
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0084_add_default_page_permissions"),
]
# Add a nullable permission ForeignKey and make the old permission_type
# field nullable so both formats still work for the duration of the
# deprecation period.
operations = [
migrations.AddField(
model_name="grouppagepermission",
name="permission",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="auth.permission",
verbose_name="permission",
),
),
migrations.AlterField(
model_name="grouppagepermission",
name="permission_type",
field=models.CharField(
verbose_name="permission type",
null=True,
blank=True,
max_length=20,
choices=[
("add", "Add/edit pages you own"),
("bulk_delete", "Delete pages with children"),
# Use "change" instead of "edit" to match Django's permission codename
("change", "Edit any page"),
("lock", "Lock/unlock pages you've locked"),
("publish", "Publish any page"),
("unlock", "Unlock any page"),
],
),
),
]

View File

@@ -0,0 +1,88 @@
# Generated by Django 4.2.1 on 2023-06-14 16:23
from django.contrib.auth.management import create_permissions
from django.db import migrations, models
from django.db.models.functions import Concat, Length, Substr
def add_permissions(apps, schema_editor):
# Ensure all the new permissions in Page.Meta.permissions are created
app_config = apps.get_app_config("wagtailcore")
app_config.models_module = True
create_permissions(app_config, verbosity=0)
app_config.models_module = None
def populate_grouppagepermission_permission(apps, schema_editor):
ContentType = apps.get_model("contenttypes.ContentType")
Permission = apps.get_model("auth.Permission")
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
page_type = ContentType.objects.get_by_natural_key("wagtailcore", "page")
# Normalise permission_type="edit" to permission_type="change"
# and backfill permission from permission_type
GroupPagePermission.objects.filter(
models.Q(permission__isnull=True) | models.Q(permission_type="edit")
).annotate(
normalised_permission_type=models.Case(
models.When(permission_type="edit", then=models.Value("change")),
default=models.F("permission_type"),
)
).update(
permission=Permission.objects.filter(
content_type=page_type,
codename=Concat(
models.OuterRef("normalised_permission_type"),
models.Value("_page"),
),
).values_list("pk", flat=True)[:1],
permission_type=models.F("normalised_permission_type"),
)
def revert_grouppagepermission_permission(apps, schema_editor):
GroupPagePermission = apps.get_model("wagtailcore.GroupPagePermission")
Permission = apps.get_model("auth.Permission")
permission_type = (
Permission.objects.filter(pk=models.OuterRef("permission"))
.annotate(
action=Substr(
models.F("codename"),
# Substr is 1-indexed
1,
# Length - 5 to remove "_page" suffix
Length(models.F("codename")) - 5,
)
)
.annotate(
# Replace "change" with "edit" to match old permission_type
permission_type=models.Case(
models.When(action="change", then=models.Value("edit")),
default=models.F("action"),
)
)
.values("permission_type")[:1]
)
# Backfill permission_type from permission foreign key and clear the foreign key
GroupPagePermission.objects.all().update(
permission_type=permission_type,
permission=None,
)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0085_add_grouppagepermission_permission"),
]
operations = [
migrations.RunPython(add_permissions, migrations.operations.RunPython.noop),
migrations.RunPython(
populate_grouppagepermission_permission,
revert_grouppagepermission_permission,
),
]

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.2.1 on 2023-06-21 11:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0086_populate_grouppagepermission_permission"),
]
operations = [
migrations.AlterUniqueTogether(
name="grouppagepermission",
unique_together=set(),
),
migrations.AddConstraint(
model_name="grouppagepermission",
constraint=models.CheckConstraint(
check=models.Q(
("permission__isnull", False),
("permission_type__isnull", False),
_connector="OR",
),
name="permission_or_permission_type_not_null",
),
),
migrations.AddConstraint(
model_name="grouppagepermission",
constraint=models.UniqueConstraint(
fields=("group", "page", "permission"),
name="unique_permission",
),
),
migrations.AddConstraint(
model_name="grouppagepermission",
constraint=models.UniqueConstraint(
fields=("group", "page", "permission_type"),
name="unique_permission_type",
),
),
]

View File

@@ -0,0 +1,175 @@
# Generated by Django 3.2.6 on 2022-11-09 07:50
import datetime
import logging
import django.core.serializers.json
from django.conf import settings
from django.db import migrations, models
from django.utils import timezone, dateparse
logger = logging.getLogger("wagtail.migrations")
def legacy_to_iso_format(date_string, tz=None):
dt = datetime.datetime.strptime(date_string, "%d %b %Y %H:%M")
if settings.USE_TZ:
dt = timezone.make_aware(dt, datetime.timezone.utc if tz is None else tz)
dt = timezone.localtime(dt, datetime.timezone.utc)
# We return the datetime object, so DjangoJSONEncoder will serialize it accordingly.
return dt
def iso_to_legacy_format(date_string, tz=None):
dt = dateparse.parse_datetime(date_string)
if dt is None:
raise ValueError("date isn't well formatted")
if settings.USE_TZ:
dt = timezone.localtime(dt, datetime.timezone.utc if tz is None else tz)
return dt.strftime("%d %b %Y %H:%M")
def migrate_logs_with_created_only(model, converter):
for item in (
model.objects.filter(
action__in=["wagtail.revert", "wagtail.rename", "wagtail.publish"]
)
.only("data")
.iterator()
):
try:
# If a previous_revision was available, the data contains "revision" with
# its created date.
# Also, there are "wagtail.publish" logs, which don't set data at all.
created = item.data["revision"]["created"]
# "created" is set to the previous revision's created_at, which is set
# to UTC by django.
item.data["revision"]["created"] = converter(created)
except ValueError:
logger.warning(
"Failed to migrate 'created' timestamp '%s' of %s %s (%s)",
item.data["revision"]["created"],
model.__name__,
item.pk,
converter.__name__,
)
continue
except (KeyError, TypeError):
# Empty `data` in logs created since Wagtail 3.0 normalises to the
# empty JSON object `{}`, so accessing unavailable data will raise
# a `KeyError`.
# However, old logs (e.g. "wagtail.publish" ones) may store the
# `data` as a JSON `null` instead of an empty JSON object `{}` in
# the database, which is deserialized to `None` by Python. So,
# it raises a `TypeError` instead of a `KeyError`.
continue
else:
item.save(update_fields=["data"])
def migrate_schedule_logs(model, converter):
for item in (
model.objects.filter(
action__in=["wagtail.publish.schedule", "wagtail.schedule.cancel"]
)
.only("data")
.iterator()
):
changed = False
try:
created = item.data["revision"]["created"]
# "created" is set to timezone.now() for new revisions ("wagtail.publish.schedule")
# and to self.created_at for "wagtail.schedule.cancel", which is set to UTC
# by django.
item.data["revision"]["created"] = converter(created)
changed = True
except ValueError:
logger.warning(
"Failed to migrate 'created' timestamp '%s' of %s %s (%s)",
created,
model.__name__,
item.pk,
converter.__name__,
)
except (KeyError, TypeError):
pass
# The go_live_at date is set to the revision object's "go_live_at".
# The revision's object is created by deserializing the json data (see wagtail.models.Revision.as_object()),
# and this process converts all datetime objects to the local timestamp (see https://github.com/wagtail/django-modelcluster/blob/8666f16eaf23ca98afc160b0a4729864411c0563/modelcluster/models.py#L109-L115).
# That's the reason, why this date is the only date, which is not stored in the log's JSON as UTC, but in the default timezone.
try:
# May be unset for "wagtail.schedule.cancel"-logs.
go_live_at = item.data["revision"].get("go_live_at")
if go_live_at:
item.data["revision"]["go_live_at"] = converter(
go_live_at, tz=timezone.get_default_timezone()
)
changed = True
except ValueError:
logger.warning(
"Failed to migrate 'go_live_at' timestamp '%s' of %s %s (%s)",
go_live_at,
model.__name__,
item.pk,
converter.__name__,
)
except (KeyError, TypeError):
pass
if changed:
item.save(update_fields=["data"])
def migrate_custom_to_iso_format(apps, schema_editor):
ModelLogEntry = apps.get_model("wagtailcore.ModelLogEntry")
PageLogEntry = apps.get_model("wagtailcore.PageLogEntry")
migrate_logs_with_created_only(ModelLogEntry, legacy_to_iso_format)
migrate_logs_with_created_only(PageLogEntry, legacy_to_iso_format)
migrate_schedule_logs(ModelLogEntry, legacy_to_iso_format)
migrate_schedule_logs(PageLogEntry, legacy_to_iso_format)
def migrate_iso_to_custom_format(apps, schema_editor):
ModelLogEntry = apps.get_model("wagtailcore.ModelLogEntry")
PageLogEntry = apps.get_model("wagtailcore.PageLogEntry")
migrate_logs_with_created_only(ModelLogEntry, iso_to_legacy_format)
migrate_logs_with_created_only(PageLogEntry, iso_to_legacy_format)
migrate_schedule_logs(ModelLogEntry, iso_to_legacy_format)
migrate_schedule_logs(PageLogEntry, iso_to_legacy_format)
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0087_alter_grouppagepermission_unique_together_and_more"),
]
operations = [
migrations.AlterField(
model_name="modellogentry",
name="data",
field=models.JSONField(
blank=True,
default=dict,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
migrations.AlterField(
model_name="pagelogentry",
name="data",
field=models.JSONField(
blank=True,
default=dict,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
migrations.RunPython(
migrate_custom_to_iso_format,
migrate_iso_to_custom_format,
),
]

View File

@@ -0,0 +1,53 @@
# Generated by Django 4.2.3 on 2023-07-31 11:00
from django import VERSION as DJANGO_VERSION
from django.db import migrations, models
def replace_json_null_with_empty_object(apps, schema_editor):
ModelLogEntry = apps.get_model("wagtailcore.ModelLogEntry")
PageLogEntry = apps.get_model("wagtailcore.PageLogEntry")
# https://github.com/django/django/pull/16245
# The way to express a JSON `null` value was changed in Django 4.2.
if DJANGO_VERSION >= (4, 2):
null = models.Value(None, models.JSONField())
else:
null = models.Value("null")
ModelLogEntry.objects.filter(data=null).update(data={})
PageLogEntry.objects.filter(data=null).update(data={})
class Migration(migrations.Migration):
"""
Replace JSON `null` values with empty JSON objects in the log entry models'
`data` field.
The 0068_log_entry_empty_object migration only handles the case where the
`data` (formerly `data_json`) was an empty string (`""`), which was the case
for some of the old logs when the field still used a `TextField`. However,
in some cases e.g. the `"wagtail.publish"` logs, the `data` was also set to
Python `None` that gets serialised to JSON `null`, which is not handled by
that migration.
Empty `data` in logs created after the 0069_log_entry_jsonfield migration
(and its accompanying code changes) is normalised to empty JSON objects.
So, this migration is only needed for logs created before that migration
(i.e. Wagtail 3.0).
"""
dependencies = [
("wagtailcore", "0088_fix_log_entry_json_timestamps"),
]
operations = [
migrations.RunPython(
replace_json_null_with_empty_object,
# No reverse operation because once the `null` values are replaced
# with empty objects, there's no way to tell which ones were
# originally `null` and which ones were originally empty objects.
# There is practically no reason to reverse this migration anyway.
migrations.RunPython.noop,
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 4.0.10 on 2023-10-30 11:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("auth", "0012_alter_user_first_name_max_length"),
("wagtailcore", "0089_log_entry_data_json_null_to_object"),
]
operations = [
migrations.RemoveConstraint(
model_name="grouppagepermission",
name="permission_or_permission_type_not_null",
),
migrations.RemoveConstraint(
model_name="grouppagepermission",
name="unique_permission_type",
),
migrations.RemoveField(
model_name="grouppagepermission",
name="permission_type",
),
migrations.AlterField(
model_name="grouppagepermission",
name="permission",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="auth.permission",
verbose_name="permission",
),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.6 on 2023-10-26 15:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("wagtailcore", "0090_remove_grouppagepermission_permission_type"),
]
operations = [
migrations.RemoveField(
model_name="revision",
name="submitted_for_moderation",
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.7 on 2024-02-01 21:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0091_remove_revision_submitted_for_moderation'),
]
operations = [
migrations.AlterField(
model_name='collectionviewrestriction',
name='password',
field=models.CharField(blank=True, help_text='Shared passwords should not be used to protect sensitive content. Anyone who has this password will be able to view the content.', max_length=255, verbose_name='shared password'),
),
migrations.AlterField(
model_name='collectionviewrestriction',
name='restriction_type',
field=models.CharField(choices=[('none', 'Public'), ('password', 'Private, accessible with a shared password'), ('login', 'Private, accessible to any logged-in users'), ('groups', 'Private, accessible to users in specific groups')], max_length=20),
),
migrations.AlterField(
model_name='pageviewrestriction',
name='password',
field=models.CharField(blank=True, help_text='Shared passwords should not be used to protect sensitive content. Anyone who has this password will be able to view the content.', max_length=255, verbose_name='shared password'),
),
migrations.AlterField(
model_name='pageviewrestriction',
name='restriction_type',
field=models.CharField(choices=[('none', 'Public'), ('password', 'Private, accessible with a shared password'), ('login', 'Private, accessible to any logged-in users'), ('groups', 'Private, accessible to users in specific groups')], max_length=20),
),
]

View File

@@ -0,0 +1,53 @@
# Generated by Django 4.2.7 on 2024-02-12 21:04
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("contenttypes", "0002_remove_content_type_name"),
("wagtailcore", "0092_alter_collectionviewrestriction_password_and_more"),
]
operations = [
migrations.CreateModel(
name="UploadedFile",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("file", models.FileField(max_length=200, upload_to="wagtail_uploads")),
(
"for_content_type",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="uploads",
to="contenttypes.contenttype",
verbose_name="for content type",
),
),
(
"uploaded_by_user",
models.ForeignKey(
blank=True,
editable=False,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
to=settings.AUTH_USER_MODEL,
verbose_name="uploaded by user",
),
),
],
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.0.6 on 2024-06-21 06:47
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0093_uploadedfile'),
]
operations = [
migrations.AlterField(
model_name='page',
name='locale',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='wagtailcore.locale', verbose_name='locale'),
),
]

Some files were not shown because too many files have changed in this diff Show More