Merge branch 'dj17_2' of https://github.com/kaedroho/wagtail into kaedroho-dj17_2

pull/572/merge
Matt Westcott 2014-08-27 14:19:51 +01:00
commit b7a435d2cf
67 zmienionych plików z 1775 dodań i 164 usunięć

Wyświetl plik

@ -1,29 +1,38 @@
language: python
# Test matrix
python:
- 2.7
- 3.2
- 3.4
env:
- DJANGO_VERSION=Django==1.6.5
#- DJANGO_VERSION=Django==1.7.0
# - TOXENV=py26-dj16-postgres
- TOXENV=py26-dj16-sqlite
- TOXENV=py27-dj16-postgres
# - TOXENV=py27-dj16-sqlite
- TOXENV=py32-dj16-postgres
# - TOXENV=py33-dj16-postgres
- TOXENV=py34-dj16-postgres
- TOXENV=py27-dj17-postgres
# - TOXENV=py27-dj17-sqlite
# - TOXENV=py32-dj17-postgres
# - TOXENV=py33-dj17-postgres
- TOXENV=py34-dj17-postgres
# Services
services:
- redis-server
- elasticsearch
# Package installation
install:
- python setup.py install
- pip install psycopg2 elasticsearch wand embedly mock python-dateutil
- pip install coveralls
- pip install tox coveralls
# Pre-test configuration
before_script:
- psql -c 'create database wagtaildemo;' -U postgres
# Run the tests
script:
coverage run runtests.py
tox
after_success:
coveralls
# Who to notify about build results
notifications:
email:

Wyświetl plik

@ -2,6 +2,7 @@
import sys
import os
import shutil
import warnings
from django.core.management import execute_from_command_line
@ -12,6 +13,9 @@ os.environ['DJANGO_SETTINGS_MODULE'] = 'wagtail.tests.settings'
def runtests():
# Don't ignore DeprecationWarnings
warnings.simplefilter('default', DeprecationWarning)
argv = sys.argv[:1] + ['test'] + sys.argv[1:]
try:
execute_from_command_line(argv)

Wyświetl plik

@ -23,12 +23,12 @@ PY3 = sys.version_info[0] == 3
install_requires = [
"Django>=1.6.2,<1.7",
"Django>=1.6.2,<1.8",
"South==1.0.0",
"django-compressor>=1.4",
"django-libsass>=0.2",
"django-modelcluster>=0.3",
"django-taggit==0.12.0",
"django-taggit==0.12.1",
"django-treebeard==2.0",
"Pillow>=2.3.0",
"beautifulsoup4>=4.3.2",

154
tox.ini
Wyświetl plik

@ -1,11 +1,40 @@
[deps]
dj16=
Django>=1.6,<1.7
base =
South==1.0.0
django-compressor>=1.4
django-libsass>=0.2
django-modelcluster>=0.3
django-taggit==0.12.1
django-treebeard==2.0
Pillow>=2.3.0
beautifulsoup4>=4.3.2
html5lib==0.999
Unidecode>=0.04.14
six==1.7.3
requests==2.3.0
elasticsearch==1.1.0
mock==1.0.1
python-dateutil==2.2
Embedly
coverage
dj16 =
Django>=1.6,<1.7
dj17 =
https://github.com/django/django/archive/stable/1.7.x.zip#egg=django
py2 =
unicodecsv>=0.9.4
py3 =
[tox]
skipsdist = True
usedevelop = True
envlist =
py26-dj16-postgres,
py26-dj16-sqlite,
@ -13,7 +42,13 @@ envlist =
py27-dj16-sqlite,
py32-dj16-postgres,
py33-dj16-postgres,
py34-dj16-postgres
py34-dj16-postgres,
py27-dj17-postgres,
py27-dj17-sqlite,
py32-dj17-postgres,
py33-dj17-postgres,
py34-dj17-postgres
# mysql not currently supported
# (wagtail.wagtailimages.tests.TestImageEditView currently fails with a
@ -28,11 +63,13 @@ envlist =
[testenv]
commands=./runtests.py
commands=coverage run runtests.py
[testenv:py26-dj16-postgres]
basepython=python2.6
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
psycopg2==2.5.3
setenv =
@ -41,6 +78,8 @@ setenv =
[testenv:py26-dj16-sqlite]
basepython=python2.6
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
@ -48,6 +87,8 @@ setenv =
[testenv:py26-dj16-mysql]
basepython=python2.6
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
MySQL-python==1.2.5
setenv =
@ -57,6 +98,8 @@ setenv =
[testenv:py27-dj16-postgres]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
psycopg2==2.5.3
setenv =
@ -65,6 +108,8 @@ setenv =
[testenv:py27-dj16-sqlite]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
@ -72,6 +117,8 @@ setenv =
[testenv:py27-dj16-mysql]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj16}
MySQL-python==1.2.5
setenv =
@ -81,6 +128,8 @@ setenv =
[testenv:py32-dj16-postgres]
basepython=python3.2
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
psycopg2==2.5.3
setenv =
@ -89,6 +138,8 @@ setenv =
[testenv:py32-dj16-sqlite]
basepython=python3.2
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
@ -96,6 +147,8 @@ setenv =
[testenv:py33-dj16-postgres]
basepython=python3.3
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
psycopg2==2.5.3
setenv =
@ -104,6 +157,8 @@ setenv =
[testenv:py33-dj16-sqlite]
basepython=python3.3
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
@ -111,6 +166,8 @@ setenv =
[testenv:py34-dj16-postgres]
basepython=python3.4
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
psycopg2==2.5.3
setenv =
@ -119,6 +176,95 @@ setenv =
[testenv:py34-dj16-sqlite]
basepython=python3.4
deps =
{[deps]base}
{[deps]py3}
{[deps]dj16}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
[testenv:py27-dj17-postgres]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj17}
psycopg2==2.5.3
setenv =
DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
[testenv:py27-dj17-sqlite]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj17}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
[testenv:py27-dj17-mysql]
basepython=python2.7
deps =
{[deps]base}
{[deps]py2}
{[deps]dj17}
MySQL-python==1.2.5
setenv =
DATABASE_ENGINE=django.db.backends.mysql
DATABASE_USER=wagtail
[testenv:py32-dj17-postgres]
basepython=python3.2
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
psycopg2==2.5.3
setenv =
DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
[testenv:py32-dj17-sqlite]
basepython=python3.2
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
[testenv:py33-dj17-postgres]
basepython=python3.3
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
psycopg2==2.5.3
setenv =
DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
[testenv:py33-dj17-sqlite]
basepython=python3.3
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3
[testenv:py34-dj17-postgres]
basepython=python3.4
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
psycopg2==2.5.3
setenv =
DATABASE_ENGINE=django.db.backends.postgresql_psycopg2
[testenv:py34-dj17-sqlite]
basepython=python3.4
deps =
{[deps]base}
{[deps]py3}
{[deps]dj17}
setenv =
DATABASE_ENGINE=django.db.backends.sqlite3

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.contrib.wagtailfrontendcache.apps.WagtailFrontendCacheAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailFrontendCacheAppConfig(AppConfig):
name = 'wagtail.contrib.wagtailfrontendcache'
label = 'wagtailfrontendcache'
verbose_name = "Wagtail frontend cache"

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.contrib.wagtailmedusa.apps.WagtailMedusaAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailMedusaAppConfig(AppConfig):
name = 'wagtail.contrib.wagtailmedusa'
label = 'wagtailmedusa'
verbose_name = "Wagtail medusa"

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.contrib.wagtailroutablepage.apps.WagtailRoutablePageAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailRoutablePageAppConfig(AppConfig):
name = 'wagtail.contrib.wagtailroutablepage'
label = 'wagtailroutablepage'
verbose_name = "Wagtail routablepage"

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.contrib.wagtailsitemaps.apps.WagtailSitemapsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailSitemapsAppConfig(AppConfig):
name = 'wagtail.contrib.wagtailsitemaps'
label = 'wagtailsitemaps'
verbose_name = "Wagtail sitemaps"

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.contrib.wagtailstyleguide.apps.WagtailStyleGuideAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailStyleGuideAppConfig(AppConfig):
name = 'wagtail.contrib.wagtailstyleguide'
label = 'wagtailstyleguide'
verbose_name = "Wagtail style guide"

Wyświetl plik

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('auth', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='CustomUser',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(unique=True, max_length=100)),
('email', models.EmailField(max_length=255, blank=True)),
('is_staff', models.BooleanField(default=True)),
('is_active', models.BooleanField(default=True)),
('first_name', models.CharField(max_length=50, blank=True)),
('last_name', models.CharField(max_length=50, blank=True)),
('groups', models.ManyToManyField(to='auth.Group', verbose_name='groups', blank=True)),
('user_permissions', models.ManyToManyField(to='auth.Permission', verbose_name='user permissions', blank=True)),
],
options={
'abstract': False,
},
bases=(models.Model,),
),
]

Wyświetl plik

@ -0,0 +1,341 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import django.db.models.deletion
import taggit.models
import wagtail.wagtailsearch.indexed
import modelcluster.fields
import wagtail.wagtailcore.fields
import modelcluster.tags
import wagtail.tests.models
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0002_initial_data'),
('wagtaildocs', '0002_initial_data'),
('wagtailimages', '0002_initial_data'),
('taggit', '0001_initial'),
('tests', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Advert',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('url', models.URLField(null=True, blank=True)),
('text', models.CharField(max_length=255)),
],
options={
},
bases=(models.Model,),
),
migrations.CreateModel(
name='AlphaSnippet',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('text', models.CharField(max_length=255)),
],
options={
},
bases=(models.Model,),
),
migrations.CreateModel(
name='BusinessChild',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='BusinessIndex',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='BusinessSubIndex',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='EventIndex',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('intro', wagtail.wagtailcore.fields.RichTextField(blank=True)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='EventPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('date_from', models.DateField(null=True, verbose_name=b'Start date')),
('date_to', models.DateField(help_text=b'Not required if event is on a single day', null=True, verbose_name=b'End date', blank=True)),
('time_from', models.TimeField(null=True, verbose_name=b'Start time', blank=True)),
('time_to', models.TimeField(null=True, verbose_name=b'End time', blank=True)),
('audience', models.CharField(max_length=255, choices=[(b'public', b'Public'), (b'private', b'Private')])),
('location', models.CharField(max_length=255)),
('body', wagtail.wagtailcore.fields.RichTextField(blank=True)),
('cost', models.CharField(max_length=255)),
('signup_link', models.URLField(blank=True)),
('feed_image', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wagtailimages.Image', null=True)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='EventPageCarouselItem',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('sort_order', models.IntegerField(null=True, editable=False, blank=True)),
('link_external', models.URLField(verbose_name=b'External link', blank=True)),
('embed_url', models.URLField(verbose_name=b'Embed URL', blank=True)),
('caption', models.CharField(max_length=255, blank=True)),
('image', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wagtailimages.Image', null=True)),
('link_document', models.ForeignKey(blank=True, to='wagtaildocs.Document', null=True)),
('link_page', models.ForeignKey(blank=True, to='wagtailcore.Page', null=True)),
('page', modelcluster.fields.ParentalKey(to='tests.EventPage')),
],
options={
'ordering': [b'sort_order'],
'abstract': False,
},
bases=(models.Model,),
),
migrations.CreateModel(
name='EventPageRelatedLink',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('sort_order', models.IntegerField(null=True, editable=False, blank=True)),
('link_external', models.URLField(verbose_name=b'External link', blank=True)),
('title', models.CharField(help_text=b'Link title', max_length=255)),
('link_document', models.ForeignKey(blank=True, to='wagtaildocs.Document', null=True)),
('link_page', models.ForeignKey(blank=True, to='wagtailcore.Page', null=True)),
('page', modelcluster.fields.ParentalKey(to='tests.EventPage')),
],
options={
'ordering': [b'sort_order'],
'abstract': False,
},
bases=(models.Model,),
),
migrations.CreateModel(
name='EventPageSpeaker',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('sort_order', models.IntegerField(null=True, editable=False, blank=True)),
('link_external', models.URLField(verbose_name=b'External link', blank=True)),
('first_name', models.CharField(max_length=255, verbose_name=b'Name', blank=True)),
('last_name', models.CharField(max_length=255, verbose_name=b'Surname', blank=True)),
('image', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wagtailimages.Image', null=True)),
('link_document', models.ForeignKey(blank=True, to='wagtaildocs.Document', null=True)),
('link_page', models.ForeignKey(blank=True, to='wagtailcore.Page', null=True)),
('page', modelcluster.fields.ParentalKey(to='tests.EventPage')),
],
options={
'ordering': [b'sort_order'],
'abstract': False,
},
bases=(models.Model,),
),
migrations.CreateModel(
name='FormField',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('sort_order', models.IntegerField(null=True, editable=False, blank=True)),
('label', models.CharField(help_text='The label of the form field', max_length=255)),
('field_type', models.CharField(max_length=16, choices=[(b'singleline', 'Single line text'), (b'multiline', 'Multi-line text'), (b'email', 'Email'), (b'number', 'Number'), (b'url', 'URL'), (b'checkbox', 'Checkbox'), (b'checkboxes', 'Checkboxes'), (b'dropdown', 'Drop down'), (b'radio', 'Radio buttons'), (b'date', 'Date'), (b'datetime', 'Date/time')])),
('required', models.BooleanField(default=True)),
('choices', models.CharField(help_text='Comma seperated list of choices. Only applicable in checkboxes, radio and dropdown.', max_length=512, blank=True)),
('default_value', models.CharField(help_text='Default value. Comma seperated values supported for checkboxes.', max_length=255, blank=True)),
('help_text', models.CharField(max_length=255, blank=True)),
],
options={
'ordering': [b'sort_order'],
'abstract': False,
},
bases=(models.Model,),
),
migrations.CreateModel(
name='FormPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('to_address', models.CharField(help_text='Optional - form submissions will be emailed to this address', max_length=255, blank=True)),
('from_address', models.CharField(max_length=255, blank=True)),
('subject', models.CharField(max_length=255, blank=True)),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.AddField(
model_name='formfield',
name='page',
field=modelcluster.fields.ParentalKey(to='tests.FormPage'),
preserve_default=True,
),
migrations.CreateModel(
name='PageWithOldStyleRouteMethod',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('content', models.TextField()),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='RoutablePageTest',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='SearchTest',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=255)),
('content', models.TextField()),
('live', models.BooleanField(default=False)),
('published_date', models.DateField(null=True)),
],
options={
},
bases=(models.Model, wagtail.wagtailsearch.indexed.Indexed),
),
migrations.CreateModel(
name='SearchTestChild',
fields=[
('searchtest_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='tests.SearchTest')),
('subtitle', models.CharField(max_length=255, null=True, blank=True)),
('extra_content', models.TextField()),
],
options={
},
bases=('tests.searchtest',),
),
migrations.CreateModel(
name='SearchTestOldConfig',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
],
options={
},
bases=(models.Model, wagtail.wagtailsearch.indexed.Indexed),
),
migrations.CreateModel(
name='SearchTestOldConfigList',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
],
options={
},
bases=(models.Model, wagtail.wagtailsearch.indexed.Indexed),
),
migrations.CreateModel(
name='SimplePage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
('content', models.TextField()),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='StandardChild',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='StandardIndex',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='TaggedPage',
fields=[
('page_ptr', models.OneToOneField(auto_created=True, primary_key=True, serialize=False, to='wagtailcore.Page')),
],
options={
'abstract': False,
},
bases=('wagtailcore.page',),
),
migrations.CreateModel(
name='TaggedPageTag',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
],
options={
'abstract': False,
},
bases=(models.Model,),
),
migrations.AddField(
model_name='taggedpage',
name='tags',
field=modelcluster.tags.ClusterTaggableManager(to=taggit.models.Tag, through=wagtail.tests.models.TaggedPageTag, blank=True, help_text='A comma-separated list of tags.', verbose_name='Tags'),
preserve_default=True,
),
migrations.AddField(
model_name='taggedpagetag',
name='content_object',
field=modelcluster.fields.ParentalKey(to='tests.TaggedPage'),
preserve_default=True,
),
migrations.AddField(
model_name='taggedpagetag',
name='tag',
field=models.ForeignKey(to='taggit.Tag'),
preserve_default=True,
),
migrations.CreateModel(
name='ZuluSnippet',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('text', models.CharField(max_length=255)),
],
options={
},
bases=(models.Model,),
),
]

Wyświetl plik

@ -0,0 +1,259 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import modelcluster.fields
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0002_initial_data'),
('tests', '0002_auto_20140728_1636'),
]
operations = [
migrations.CreateModel(
name='AdvertPlacement',
fields=[
('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)),
('advert', models.ForeignKey(to='tests.Advert', related_name='+')),
('page', modelcluster.fields.ParentalKey(to='wagtailcore.Page', related_name='advert_placements')),
],
options={
},
bases=(models.Model,),
),
migrations.AlterModelOptions(
name='eventpagecarouselitem',
options={'ordering': ['sort_order']},
),
migrations.AlterModelOptions(
name='eventpagerelatedlink',
options={'ordering': ['sort_order']},
),
migrations.AlterModelOptions(
name='eventpagespeaker',
options={'ordering': ['sort_order']},
),
migrations.AlterModelOptions(
name='formfield',
options={'ordering': ['sort_order']},
),
migrations.AlterField(
model_name='businesschild',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='businessindex',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='businesssubindex',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='customuser',
name='groups',
field=models.ManyToManyField(help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', to='auth.Group', related_name='user_set', related_query_name='user', blank=True, verbose_name='groups'),
),
migrations.AlterField(
model_name='customuser',
name='user_permissions',
field=models.ManyToManyField(help_text='Specific permissions for this user.', to='auth.Permission', related_name='user_set', related_query_name='user', blank=True, verbose_name='user permissions'),
),
migrations.AlterField(
model_name='eventindex',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='eventpage',
name='audience',
field=models.CharField(choices=[('public', 'Public'), ('private', 'Private')], max_length=255),
),
migrations.AlterField(
model_name='eventpage',
name='date_from',
field=models.DateField(verbose_name='Start date', null=True),
),
migrations.AlterField(
model_name='eventpage',
name='date_to',
field=models.DateField(help_text='Not required if event is on a single day', verbose_name='End date', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpage',
name='feed_image',
field=models.ForeignKey(to='wagtailimages.Image', on_delete=django.db.models.deletion.SET_NULL, related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpage',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='eventpage',
name='time_from',
field=models.TimeField(verbose_name='Start time', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpage',
name='time_to',
field=models.TimeField(verbose_name='End time', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='embed_url',
field=models.URLField(verbose_name='Embed URL', blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='image',
field=models.ForeignKey(to='wagtailimages.Image', on_delete=django.db.models.deletion.SET_NULL, related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='link_document',
field=models.ForeignKey(to='wagtaildocs.Document', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='link_external',
field=models.URLField(verbose_name='External link', blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='link_page',
field=models.ForeignKey(to='wagtailcore.Page', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagecarouselitem',
name='page',
field=modelcluster.fields.ParentalKey(to='tests.EventPage', related_name='carousel_items'),
),
migrations.AlterField(
model_name='eventpagerelatedlink',
name='link_document',
field=models.ForeignKey(to='wagtaildocs.Document', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagerelatedlink',
name='link_external',
field=models.URLField(verbose_name='External link', blank=True),
),
migrations.AlterField(
model_name='eventpagerelatedlink',
name='link_page',
field=models.ForeignKey(to='wagtailcore.Page', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagerelatedlink',
name='page',
field=modelcluster.fields.ParentalKey(to='tests.EventPage', related_name='related_links'),
),
migrations.AlterField(
model_name='eventpagerelatedlink',
name='title',
field=models.CharField(max_length=255, help_text='Link title'),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='first_name',
field=models.CharField(max_length=255, verbose_name='Name', blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='image',
field=models.ForeignKey(to='wagtailimages.Image', on_delete=django.db.models.deletion.SET_NULL, related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='last_name',
field=models.CharField(max_length=255, verbose_name='Surname', blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='link_document',
field=models.ForeignKey(to='wagtaildocs.Document', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='link_external',
field=models.URLField(verbose_name='External link', blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='link_page',
field=models.ForeignKey(to='wagtailcore.Page', related_name='+', null=True, blank=True),
),
migrations.AlterField(
model_name='eventpagespeaker',
name='page',
field=modelcluster.fields.ParentalKey(to='tests.EventPage', related_name='speakers'),
),
migrations.AlterField(
model_name='formfield',
name='field_type',
field=models.CharField(choices=[('singleline', 'Single line text'), ('multiline', 'Multi-line text'), ('email', 'Email'), ('number', 'Number'), ('url', 'URL'), ('checkbox', 'Checkbox'), ('checkboxes', 'Checkboxes'), ('dropdown', 'Drop down'), ('radio', 'Radio buttons'), ('date', 'Date'), ('datetime', 'Date/time')], max_length=16),
),
migrations.AlterField(
model_name='formfield',
name='page',
field=modelcluster.fields.ParentalKey(to='tests.FormPage', related_name='form_fields'),
),
migrations.AlterField(
model_name='formpage',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='pagewitholdstyleroutemethod',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='routablepagetest',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='searchtestchild',
name='searchtest_ptr',
field=models.OneToOneField(serialize=False, to='tests.SearchTest', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='simplepage',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='standardchild',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='standardindex',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='taggedpage',
name='page_ptr',
field=models.OneToOneField(serialize=False, to='wagtailcore.Page', parent_link=True, auto_created=True, primary_key=True),
),
migrations.AlterField(
model_name='taggedpagetag',
name='content_object',
field=modelcluster.fields.ParentalKey(to='tests.TaggedPage', related_name='tagged_items'),
),
migrations.AlterField(
model_name='taggedpagetag',
name='tag',
field=models.ForeignKey(to='taggit.Tag', related_name='tests_taggedpagetag_items'),
),
]

Wyświetl plik

@ -1,5 +1,6 @@
import os
import django
from django.conf import global_settings
@ -57,7 +58,6 @@ INSTALLED_APPS = [
'django.contrib.admin',
'taggit',
'south',
'compressor',
'wagtail.wagtailcore',
@ -68,7 +68,6 @@ INSTALLED_APPS = [
'wagtail.wagtailimages',
'wagtail.wagtailembeds',
'wagtail.wagtailsearch',
'wagtail.wagtailredirects',
'wagtail.wagtailforms',
'wagtail.contrib.wagtailstyleguide',
'wagtail.contrib.wagtailsitemaps',
@ -76,6 +75,27 @@ INSTALLED_APPS = [
'wagtail.tests',
]
# If we are using Django 1.6, add South to INSTALLED_APPS
if django.VERSION[:2] == (1, 6):
INSTALLED_APPS.append('south')
# If we are using Django 1.7 install wagtailredirects with its appconfig
# Theres nothing special about wagtailredirects, we just need to have one
# app which uses AppConfigs to test that hooks load properly
if django.VERSION[:2] == (1, 6):
INSTALLED_APPS.append('wagtail.wagtailredirects')
else:
INSTALLED_APPS.append('wagtail.wagtailredirects.apps.WagtailRedirectsAppConfig')
# As we don't have south migrations for tests, South thinks
# the Django 1.7 migrations are South migrations.
SOUTH_MIGRATION_MODULES = {
'tests': 'ignore',
}
# Using DatabaseCache to make sure that the cache is cleared between tests.
# This prevents false-positives in some wagtail core tests where we are
# changing the 'wagtail_root_paths' key which may cause future tests to fail.

Wyświetl plik

@ -0,0 +1,35 @@
try:
from importlib import import_module
except ImportError:
# for Python 2.6, fall back on django.utils.importlib (deprecated as of Django 1.7)
from django.utils.importlib import import_module
import django
from django.conf import settings
from django.utils.module_loading import module_has_submodule
def get_app_modules():
"""
Generator function that yields a module object for each installed app
yields tuples of (app_name, module)
"""
if django.VERSION[:2] == (1, 6):
# Django 1.6
for app in settings.INSTALLED_APPS:
yield app, import_module(app)
else:
# Django 1.7+
from django.apps import apps
for app in apps.get_app_configs():
yield app.name, app.module
def get_app_submodules(submodule_name):
"""
Searches each app module for the specified submodule
yields tuples of (app_name, module)
"""
for name, module in get_app_modules():
if module_has_submodule(module, submodule_name):
yield name, import_module('%s.%s' % (name, submodule_name))

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailadmin.apps.WagtailAdminAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailAdminAppConfig(AppConfig):
name = 'wagtail.wagtailadmin'
label = 'wagtailadmin'
verbose_name = "Wagtail admin"

Wyświetl plik

@ -491,7 +491,11 @@ class BasePageChooserPanel(BaseChooserPanel):
except ValueError:
raise ImproperlyConfigured("The page_type passed to PageChooserPanel must be of the form 'app_label.model_name'")
page_type = get_model(app_label, model_name)
try:
page_type = get_model(app_label, model_name)
except LookupError:
page_type = None
if page_type is None:
raise ImproperlyConfigured("PageChooserPanel refers to model '%s' that has not been installed" % cls.page_type)
else:

Wyświetl plik

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def create_admin_access_permissions(apps, schema_editor):
ContentType = apps.get_model('contenttypes.ContentType')
Permission = apps.get_model('auth.Permission')
Group = apps.get_model('auth.Group')
# Add a fake content type to hang the 'can access Wagtail admin' permission off.
# The fact that this doesn't correspond to an actual defined model shouldn't matter, I hope...
wagtailadmin_content_type = ContentType.objects.create(
app_label='wagtailadmin',
model='admin',
name='Wagtail admin'
)
# Create admin permission
admin_permission = Permission.objects.create(
content_type=wagtailadmin_content_type,
codename='access_admin',
name='Can access Wagtail admin'
)
# Assign it to Editors and Moderators groups
for group in Group.objects.filter(name__in=['Editors', 'Moderators']):
group.permissions.add(admin_permission)
class Migration(migrations.Migration):
dependencies = [
# Need to run wagtailcores initial data migration to make sure the groups are created
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.RunPython(create_admin_access_permissions),
]

Wyświetl plik

@ -43,9 +43,6 @@ class TestGetFormForModel(TestCase):
class TestExtractPanelDefinitionsFromModelClass(TestCase):
class FakePage(Page):
pass
def test_can_extract_panels(self):
mock = MagicMock()
mock.panels = 'foo'
@ -58,7 +55,7 @@ class TestExtractPanelDefinitionsFromModelClass(TestCase):
self.assertNotEqual(panel.field_name, 'hostname')
def test_extracted_objects_are_panels(self):
panels = extract_panel_definitions_from_model_class(self.FakePage)
panels = extract_panel_definitions_from_model_class(Page)
for panel in panels:
self.assertTrue(issubclass(panel, BaseFieldPanel))
@ -346,11 +343,27 @@ class TestInlinePanel(TestCase):
fake_page = self.FakePage()
self.barbecue = fake_page
class FakePanel(object):
name = 'mock panel'
class FakeChild(object):
def render_js(self):
return "rendered js"
def rendered_fields(self):
return ["rendered fields"]
def init(*args, **kwargs):
pass
def __call__(self, *args, **kwargs):
fake_child = self.FakeChild()
return fake_child
def setUp(self):
self.fake_field = self.FakeField()
self.fake_instance = self.FakeInstance()
self.mock_panel = MagicMock()
self.mock_panel.name = 'mock panel'
self.mock_panel = self.FakePanel()
self.mock_model = MagicMock()
self.mock_model.formset.related.model.panels = [self.mock_panel]

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailcore.apps.WagtailCoreAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailCoreAppConfig(AppConfig):
name = 'wagtail.wagtailcore'
label = 'wagtailcore'
verbose_name = "Wagtail core"

Wyświetl plik

@ -1,9 +1,5 @@
from django.conf import settings
try:
from importlib import import_module
except ImportError:
# for Python 2.6, fall back on django.utils.importlib (deprecated as of Django 1.7)
from django.utils.importlib import import_module
from wagtail.utils.apps import get_app_submodules
_hooks = {}
@ -40,12 +36,7 @@ _searched_for_hooks = False
def search_for_hooks():
global _searched_for_hooks
if not _searched_for_hooks:
for app_module in settings.INSTALLED_APPS:
try:
import_module('%s.wagtail_hooks' % app_module)
except ImportError:
continue
list(get_app_submodules('wagtail_hooks'))
_searched_for_hooks = True

Wyświetl plik

@ -0,0 +1,104 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings
import wagtail.wagtailsearch.index
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(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(to='contenttypes.ContentType', related_name='pages')),
('owner', models.ForeignKey(blank=True, null=True, to=settings.AUTH_USER_MODEL, editable=False, related_name='owned_pages')),
],
options={
'abstract': False,
},
bases=(models.Model, wagtail.wagtailsearch.index.Indexed),
),
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(to='wagtailcore.Page', related_name='revisions')),
('user', models.ForeignKey(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(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(to='wagtailcore.Page', related_name='sites_rooted_here')),
],
options={
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='site',
unique_together=set([('hostname', 'port')]),
),
migrations.AddField(
model_name='grouppagepermission',
name='page',
field=models.ForeignKey(to='wagtailcore.Page', related_name='group_permissions'),
preserve_default=True,
),
]

Wyświetl plik

@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, 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',
defaults={'name': 'page'}
)
# 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',
)
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0001_initial'),
]
operations = [
migrations.RunPython(initial_data),
]

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtaildocs.apps.WagtailDocsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailDocsAppConfig(AppConfig):
name = 'wagtail.wagtaildocs'
label = 'wagtaildocs'
verbose_name = "Wagtail documents"

Wyświetl plik

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import taggit.managers
from django.conf import settings
import wagtail.wagtailadmin.taggable
class Migration(migrations.Migration):
dependencies = [
('taggit', '__latest__'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Document',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='Title')),
('file', models.FileField(upload_to='documents', verbose_name='File')),
('created_at', models.DateTimeField(auto_now_add=True)),
('tags', taggit.managers.TaggableManager(to='taggit.Tag', verbose_name='Tags', help_text=None, blank=True, through='taggit.TaggedItem')),
('uploaded_by_user', models.ForeignKey(editable=False, null=True, blank=True, to=settings.AUTH_USER_MODEL)),
],
options={
},
bases=(models.Model, wagtail.wagtailadmin.taggable.TagSearchable),
),
]

Wyświetl plik

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def add_document_permissions_to_admin_groups(apps, schema_editor):
ContentType = apps.get_model('contenttypes.ContentType')
Permission = apps.get_model('auth.Permission')
Group = apps.get_model('auth.Group')
Document = apps.get_model('wagtaildocs.Document')
# Get document permissions
document_content_type, _created = ContentType.objects.get_or_create(
model='document',
app_label='wagtaildocs',
defaults={'name': 'document'}
)
add_document_permission, _created = Permission.objects.get_or_create(
content_type=document_content_type,
codename='add_document',
defaults={'name': 'Can add document'}
)
change_document_permission, _created = Permission.objects.get_or_create(
content_type=document_content_type,
codename='change_document',
defaults={'name': 'Can change document'}
)
delete_document_permission, _created = Permission.objects.get_or_create(
content_type=document_content_type,
codename='delete_document',
defaults={'name': 'Can delete document'}
)
# Assign it to Editors and Moderators groups
for group in Group.objects.filter(name__in=['Editors', 'Moderators']):
group.permissions.add(add_document_permission, change_document_permission, delete_document_permission)
class Migration(migrations.Migration):
dependencies = [
('wagtaildocs', '0001_initial'),
# Need to run wagtailcores initial data migration to make sure the groups are created
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.RunPython(add_document_permissions_to_admin_groups),
]

Wyświetl plik

@ -1,2 +1,4 @@
from .models import Embed
from .embeds import get_embed
default_app_config = 'wagtail.wagtailembeds.apps.WagtailEmbedsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailEmbedsAppConfig(AppConfig):
name = 'wagtail.wagtailembeds'
label = 'wagtailembeds'
verbose_name = "Wagtail embeds"

Wyświetl plik

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Embed',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True, serialize=False)),
('url', models.URLField()),
('max_width', models.SmallIntegerField(null=True, blank=True)),
('type', models.CharField(max_length=10, choices=[('video', 'Video'), ('photo', 'Photo'), ('link', 'Link'), ('rich', 'Rich')])),
('html', models.TextField(blank=True)),
('title', models.TextField(blank=True)),
('author_name', models.TextField(blank=True)),
('provider_name', models.TextField(blank=True)),
('thumbnail_url', models.URLField(null=True, blank=True)),
('width', models.IntegerField(null=True, blank=True)),
('height', models.IntegerField(null=True, blank=True)),
('last_updated', models.DateTimeField(auto_now=True)),
],
options={
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='embed',
unique_together=set([('url', 'max_width')]),
),
]

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailforms.apps.WagtailFormsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailFormsAppConfig(AppConfig):
name = 'wagtail.wagtailforms'
label = 'wagtailforms'
verbose_name = "Wagtail forms"

Wyświetl plik

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.CreateModel(
name='FormSubmission',
fields=[
('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)),
('form_data', models.TextField()),
('submit_time', models.DateTimeField(auto_now_add=True)),
('page', models.ForeignKey(to='wagtailcore.Page')),
],
options={
},
bases=(models.Model,),
),
]

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailimages.apps.WagtailImagesAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailImagesAppConfig(AppConfig):
name = 'wagtail.wagtailimages'
label = 'wagtailimages'
verbose_name = "Wagtail images"

Wyświetl plik

@ -1,11 +1,6 @@
from django.conf import settings
from django.utils.html import escape
try:
from importlib import import_module
except ImportError:
# for Python 2.6, fall back on django.utils.importlib (deprecated as of Django 1.7)
from django.utils.importlib import import_module
from wagtail.utils.apps import get_app_submodules
class Format(object):
@ -85,12 +80,7 @@ _searched_for_image_formats = False
def search_for_image_formats():
global _searched_for_image_formats
if not _searched_for_image_formats:
for app_module in settings.INSTALLED_APPS:
try:
import_module('%s.image_formats' % app_module)
except ImportError:
continue
list(get_app_submodules('image_formats'))
_searched_for_image_formats = True

Wyświetl plik

@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import wagtail.wagtailimages.utils.validators
import wagtail.wagtailimages.models
import taggit.managers
from django.conf import settings
import wagtail.wagtailadmin.taggable
class Migration(migrations.Migration):
dependencies = [
('taggit', '__latest__'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Filter',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
('spec', models.CharField(db_index=True, max_length=255)),
],
options={
},
bases=(models.Model,),
),
migrations.CreateModel(
name='Image',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
('title', models.CharField(verbose_name='Title', max_length=255)),
('file', models.ImageField(width_field='width', upload_to=wagtail.wagtailimages.models.get_upload_to, verbose_name='File', height_field='height', validators=[wagtail.wagtailimages.utils.validators.validate_image_format])),
('width', models.IntegerField(editable=False)),
('height', models.IntegerField(editable=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('focal_point_x', models.PositiveIntegerField(editable=False, null=True)),
('focal_point_y', models.PositiveIntegerField(editable=False, null=True)),
('focal_point_width', models.PositiveIntegerField(editable=False, null=True)),
('focal_point_height', models.PositiveIntegerField(editable=False, null=True)),
('tags', taggit.managers.TaggableManager(verbose_name='Tags', blank=True, help_text=None, to='taggit.Tag', through='taggit.TaggedItem')),
('uploaded_by_user', models.ForeignKey(editable=False, blank=True, null=True, to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
bases=(models.Model, wagtail.wagtailadmin.taggable.TagSearchable),
),
migrations.CreateModel(
name='Rendition',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
('file', models.ImageField(width_field='width', upload_to='images', height_field='height')),
('width', models.IntegerField(editable=False)),
('height', models.IntegerField(editable=False)),
('focal_point_key', models.CharField(editable=False, max_length=255, null=True)),
('filter', models.ForeignKey(related_name='+', to='wagtailimages.Filter')),
('image', models.ForeignKey(related_name='renditions', to='wagtailimages.Image')),
],
options={
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='rendition',
unique_together=set([('image', 'filter', 'focal_point_key')]),
),
]

Wyświetl plik

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def add_image_permissions_to_admin_groups(apps, schema_editor):
ContentType = apps.get_model('contenttypes.ContentType')
Permission = apps.get_model('auth.Permission')
Group = apps.get_model('auth.Group')
Image = apps.get_model('wagtailimages.Image')
# Get image permissions
image_content_type, _created = ContentType.objects.get_or_create(
model='image',
app_label='wagtailimages',
defaults={'name': 'image'}
)
add_image_permission, _created = Permission.objects.get_or_create(
content_type=image_content_type,
codename='add_image',
defaults={'name': 'Can add image'}
)
change_image_permission, _created = Permission.objects.get_or_create(
content_type=image_content_type,
codename='change_image',
defaults={'name': 'Can change image'}
)
delete_image_permission, _created = Permission.objects.get_or_create(
content_type=image_content_type,
codename='delete_image',
defaults={'name': 'Can delete image'}
)
# Assign it to Editors and Moderators groups
for group in Group.objects.filter(name__in=['Editors', 'Moderators']):
group.permissions.add(add_image_permission, change_image_permission, delete_image_permission)
class Migration(migrations.Migration):
dependencies = [
('wagtailimages', '0001_initial'),
# Need to run wagtailcores initial data migration to make sure the groups are created
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.RunPython(add_image_permissions_to_admin_groups),
]

Wyświetl plik

@ -29,23 +29,23 @@ from wagtail.wagtailimages.utils.feature_detection import FeatureDetector, openc
from wagtail.wagtailadmin.utils import get_object_usage
def get_upload_to(self, filename):
folder_name = 'original_images'
filename = self.file.field.storage.get_valid_name(filename)
# do a unidecode in the filename and then
# replace non-ascii characters in filename with _ , to sidestep issues with filesystem encoding
filename = "".join((i if ord(i) < 128 else '_') for i in unidecode(filename))
while len(os.path.join(folder_name, filename)) >= 95:
prefix, dot, extension = filename.rpartition('.')
filename = prefix[:-1] + dot + extension
return os.path.join(folder_name, filename)
@python_2_unicode_compatible
class AbstractImage(models.Model, TagSearchable):
title = models.CharField(max_length=255, verbose_name=_('Title') )
def get_upload_to(self, filename):
folder_name = 'original_images'
filename = self.file.field.storage.get_valid_name(filename)
# do a unidecode in the filename and then
# replace non-ascii characters in filename with _ , to sidestep issues with filesystem encoding
filename = "".join((i if ord(i) < 128 else '_') for i in unidecode(filename))
while len(os.path.join(folder_name, filename)) >= 95:
prefix, dot, extension = filename.rpartition('.')
filename = prefix[:-1] + dot + extension
return os.path.join(folder_name, filename)
file = models.ImageField(verbose_name=_('File'), upload_to=get_upload_to, width_field='width', height_field='height', validators=[validate_image_format])
width = models.IntegerField(editable=False)
height = models.IntegerField(editable=False)

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailredirects.apps.WagtailRedirectsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailRedirectsAppConfig(AppConfig):
name = 'wagtail.wagtailredirects'
label = 'wagtailredirects'
verbose_name = "Wagtail redirects"

Wyświetl plik

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.CreateModel(
name='Redirect',
fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)),
('old_path', models.CharField(verbose_name='Redirect from', max_length=255, unique=True, db_index=True)),
('is_permanent', models.BooleanField(verbose_name='Permanent', default=True, help_text="Recommended. Permanent redirects ensure search engines forget the old page (the 'Redirect from') and index the new page instead.")),
('redirect_link', models.URLField(blank=True, verbose_name='Redirect to any URL')),
('redirect_page', models.ForeignKey(blank=True, null=True, verbose_name='Redirect to a page', to='wagtailcore.Page')),
('site', models.ForeignKey(blank=True, to='wagtailcore.Site', editable=False, null=True, related_name='redirects')),
],
options={
},
bases=(models.Model,),
),
]

Wyświetl plik

@ -1,3 +1,5 @@
from wagtail.wagtailsearch.index import Indexed
from wagtail.wagtailsearch.signal_handlers import register_signal_handlers
from wagtail.wagtailsearch.backends import get_search_backend
from wagtail.wagtailsearch.backends import get_search_backend
default_app_config = 'wagtail.wagtailsearch.apps.WagtailSearchAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailSearchAppConfig(AppConfig):
name = 'wagtail.wagtailsearch'
label = 'wagtailsearch'
verbose_name = "Wagtail search"

Wyświetl plik

@ -5,7 +5,13 @@ import json
from six.moves.urllib.parse import urlparse
from django.db import models
from django.db.models.sql.where import SubqueryConstraint
from django.db.models.sql.where import SubqueryConstraint, WhereNode
# Django 1.7 lookups
try:
from django.db.models.lookups import Lookup
except ImportError:
Lookup = None
from elasticsearch import Elasticsearch, NotFoundError, RequestError
from elasticsearch.helpers import bulk
@ -125,118 +131,133 @@ class ElasticSearchQuery(object):
self.query_string = query_string
self.fields = fields
def _process_lookup(self, field_attname, lookup, value):
# Get field
field = dict(
(field.get_attname(self.queryset.model), field)
for field in self.queryset.model.get_filterable_search_fields()
).get(field_attname, None)
# Give error if the field doesn't exist
if field is None:
raise FieldError('Cannot filter ElasticSearch results with field "' + field_name + '". Please add FilterField(\'' + field_name + '\') to ' + self.queryset.model.__name__ + '.search_fields.')
# Get the name of the field in the index
field_index_name = field.get_index_name(self.queryset.model)
if lookup == 'exact':
if value is None:
return {
'missing': {
'field': field_index_name,
}
}
else:
return {
'term': {
field_index_name: value,
}
}
if lookup == 'isnull':
if value:
return {
'missing': {
'field': field_index_name,
}
}
else:
return {
'not': {
'missing': {
'field': field_index_name,
}
}
}
if lookup in ['startswith', 'prefix']:
return {
'prefix': {
field_index_name: value,
}
}
if lookup in ['gt', 'gte', 'lt', 'lte']:
return {
'range': {
field_index_name: {
lookup: value,
}
}
}
if lookup == 'range':
lower, upper = value
return {
'range': {
field_index_name: {
'gte': lower,
'lte': upper,
}
}
}
if lookup == 'in':
return {
'terms': {
field_index_name: value,
}
}
raise FilterError('Could not apply filter on ElasticSearch results: "' + field_name + '__' + lookup + ' = ' + unicode(value) + '". Lookup "' + lookup + '"" not recognosed.')
def _get_filters_from_where(self, where_node):
# Check if this is a leaf node
if isinstance(where_node, tuple):
field_name = where_node[0].col
if isinstance(where_node, tuple): # Django 1.6 and below
field_attname = where_node[0].col
lookup = where_node[1]
value = where_node[3]
# Get field
field = dict(
(field.get_attname(self.queryset.model), field)
for field in self.queryset.model.get_filterable_search_fields()
).get(field_name, None)
# Process the filter
return self._process_lookup(field_attname, lookup, value)
# Give error if the field doesn't exist
if field is None:
raise FieldError('Cannot filter ElasticSearch results with field "' + field_name + '". Please add FilterField(\'' + field_name + '\') to ' + self.queryset.model.__name__ + '.search_fields.')
elif Lookup is not None and isinstance(where_node, Lookup): # Django 1.7 and above
field_attname = where_node.lhs.target.attname
lookup = where_node.lookup_name
value = where_node.rhs
# Get the name of the field in the index
field_index_name = field.get_index_name(self.queryset.model)
# Process the filter
return self._process_lookup(field_attname, lookup, value)
# Find lookup
if lookup == 'exact':
if value is None:
return {
'missing': {
'field': field_index_name,
}
}
else:
return {
'term': {
field_index_name: value,
}
}
if lookup == 'isnull':
if value:
return {
'missing': {
'field': field_index_name,
}
}
else:
return {
'not': {
'missing': {
'field': field_index_name,
}
}
}
if lookup in ['startswith', 'prefix']:
return {
'prefix': {
field_index_name: value,
}
}
if lookup in ['gt', 'gte', 'lt', 'lte']:
return {
'range': {
field_index_name: {
lookup: value,
}
}
}
if lookup == 'range':
lower, upper = value
return {
'range': {
field_index_name: {
'gte': lower,
'lte': upper,
}
}
}
if lookup == 'in':
return {
'terms': {
field_index_name: value,
}
}
raise FilterError('Could not apply filter on ElasticSearch results: "' + field_name + '__' + lookup + ' = ' + unicode(value) + '". Lookup "' + lookup + '"" not recognosed.')
elif isinstance(where_node, SubqueryConstraint):
raise FilterError('Could not apply filter on ElasticSearch results: Subqueries are not allowed.')
# Get child filters
connector = where_node.connector
child_filters = [self._get_filters_from_where(child) for child in where_node.children]
child_filters = [child_filter for child_filter in child_filters if child_filter]
elif isinstance(where_node, WhereNode):
# Get child filters
connector = where_node.connector
child_filters = [self._get_filters_from_where(child) for child in where_node.children]
child_filters = [child_filter for child_filter in child_filters if child_filter]
# Connect them
if child_filters:
if len(child_filters) == 1:
filter_out = child_filters[0]
else:
filter_out = {
connector.lower(): [
fil for fil in child_filters if fil is not None
]
}
# Connect them
if child_filters:
if len(child_filters) == 1:
filter_out = child_filters[0]
else:
filter_out = {
connector.lower(): [
fil for fil in child_filters if fil is not None
]
}
if where_node.negated:
filter_out = {
'not': filter_out
}
if where_node.negated:
filter_out = {
'not': filter_out
}
return filter_out
return filter_out
else:
raise FilterError('Could not apply filter on ElasticSearch results: Unknown where node: ' + str(type(where_node)))
def _get_filters(self):
# Filters

Wyświetl plik

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('wagtailcore', '0002_initial_data'),
]
operations = [
migrations.CreateModel(
name='EditorsPick',
fields=[
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
('sort_order', models.IntegerField(blank=True, null=True, editable=False)),
('description', models.TextField(blank=True)),
('page', models.ForeignKey(to='wagtailcore.Page')),
],
options={
'ordering': ('sort_order',),
},
bases=(models.Model,),
),
migrations.CreateModel(
name='Query',
fields=[
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
('query_string', models.CharField(unique=True, max_length=255)),
],
options={
},
bases=(models.Model,),
),
migrations.CreateModel(
name='QueryDailyHits',
fields=[
('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)),
('date', models.DateField()),
('hits', models.IntegerField(default=0)),
('query', models.ForeignKey(to='wagtailsearch.Query', related_name='daily_hits')),
],
options={
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='querydailyhits',
unique_together=set([('query', 'date')]),
),
migrations.AddField(
model_name='editorspick',
name='query',
field=models.ForeignKey(to='wagtailsearch.Query', related_name='editors_picks'),
preserve_default=True,
),
]

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailsnippets.apps.WagtailSnippetsAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailSnippetsAppConfig(AppConfig):
name = 'wagtail.wagtailsnippets'
label = 'wagtailsnippets'
verbose_name = "Wagtail snippets"

Wyświetl plik

@ -0,0 +1 @@
default_app_config = 'wagtail.wagtailusers.apps.WagtailUsersAppConfig'

Wyświetl plik

@ -0,0 +1,7 @@
from django.apps import AppConfig
class WagtailUsersAppConfig(AppConfig):
name = 'wagtail.wagtailusers'
label = 'wagtailusers'
verbose_name = "Wagtail users"

Wyświetl plik

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='UserProfile',
fields=[
('id', models.AutoField(serialize=False, verbose_name='ID', auto_created=True, primary_key=True)),
('submitted_notifications', models.BooleanField(default=True, help_text='Receive notification when a page is submitted for moderation')),
('approved_notifications', models.BooleanField(default=True, help_text='Receive notification when your page edit is approved')),
('rejected_notifications', models.BooleanField(default=True, help_text='Receive notification when your page edit is rejected')),
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
],
options={
},
bases=(models.Model,),
),
]