kopia lustrzana https://github.com/wagtail/wagtail
commit
33ddcb8395
|
@ -0,0 +1,163 @@
|
|||
.. _getting_started:
|
||||
|
||||
===============
|
||||
Getting started
|
||||
===============
|
||||
|
||||
Before you start
|
||||
================
|
||||
|
||||
A basic Wagtail setup can be installed on your machine with only a few prerequisites - see `A basic Wagtail installation`_. However, there are various optional components that will improve the performance and feature set of Wagtail, and our recommended software stack includes the PostgreSQL database, ElasticSearch (for free-text searching), the OpenCV library (for image feature detection), and Redis (as a cache and message queue backend). This would be a lot to install in one go, and for this reason, we provide a virtual machine image, for use with `Vagrant <http://www.vagrantup.com/>`__, with all of these components ready installed.
|
||||
|
||||
Whether you just want to try out the demo site, or you're ready to dive in and create a Wagtail site with all bells and whistles enabled, we strongly recommend the Vagrant approach. Nevertheless, if you're the sort of person who balks at the idea of downloading a whole operating system just to run a web app, we've got you covered too. Start from `A basic Wagtail installation`_ below.
|
||||
|
||||
|
||||
The no-installation route
|
||||
=========================
|
||||
|
||||
If you're happy to use Vagrant, and you just want to set up the Wagtail demo site, or any other pre-existing Wagtail site that ships with Vagrant support, you don't need to install Wagtail at all. Install `Vagrant <http://www.vagrantup.com/>`__ and `VirtualBox <https://www.virtualbox.org/>`__, and run::
|
||||
|
||||
git clone https://github.com/torchbox/wagtaildemo.git
|
||||
cd wagtaildemo
|
||||
vagrant up
|
||||
vagrant ssh
|
||||
|
||||
|
||||
Then, within the SSH session::
|
||||
|
||||
./manage.py createsuperuser
|
||||
./manage.py runserver 0.0.0.0:8000
|
||||
|
||||
|
||||
This will make the demo site available on your host machine at the URL http://localhost:8111/ - you can access the Wagtail admin interface at http://localhost:8111/admin/ .
|
||||
|
||||
Once you’ve experimented with the demo site and are ready to build your own site, it's time to install Wagtail on your host machine. Even if you intend to do all further Wagtail work within Vagrant, installing the Wagtail package on your host machine will provide the ``wagtail start`` command that sets up the initial file structure for your project.
|
||||
|
||||
|
||||
A basic Wagtail installation
|
||||
============================
|
||||
|
||||
You will need Python's `pip <http://pip.readthedocs.org/en/latest/installing.html>`__ package manager. We also recommend `virtualenvwrapper <http://virtualenvwrapper.readthedocs.org/en/latest/>`_ so that you can manage multiple independent Python environments for different projects - although this is not strictly necessary if you intend to do all your development under Vagrant.
|
||||
|
||||
Wagtail is based on the Django web framework and various other Python libraries. Most of these are pure Python and will install automatically using ``pip``, but there are a few native-code components that require further attention:
|
||||
|
||||
* libsass-python (for compiling SASS stylesheets) - requires a C++ compiler and the Python development headers.
|
||||
* Pillow (for image processing) - additionally requires libjpeg and zlib.
|
||||
|
||||
On Debian or Ubuntu, these can be installed with the command::
|
||||
|
||||
sudo apt-get install python-dev python-pip g++ libjpeg62-dev zlib1g-dev
|
||||
|
||||
With these dependencies installed, Wagtail can then be installed with the command::
|
||||
|
||||
pip install wagtail
|
||||
|
||||
(or if you're not using virtualenvwrapper: ``sudo pip install wagtail``.)
|
||||
|
||||
You will now be able to run the following command to set up an initial file structure for your Wagtail project (replace ``myprojectname`` with a name of your choice)::
|
||||
|
||||
wagtail start myprojectname
|
||||
|
||||
**Without Vagrant:** Run the following steps to complete setup of your project (the ``migrate`` step will prompt you to set up a superuser account)::
|
||||
|
||||
cd myprojectname
|
||||
./manage.py syncdb
|
||||
./manage.py migrate
|
||||
./manage.py runserver
|
||||
|
||||
Your site is now accessible at http://localhost:8000, with the admin backend available at http://localhost:8000/admin/ .
|
||||
|
||||
**With Vagrant:** Run the following steps to bring up the virtual machine and complete setup of your project (the ``createsuperuser`` step will prompt you to set up a superuser account)::
|
||||
|
||||
cd myprojectname
|
||||
vagrant up
|
||||
vagrant ssh
|
||||
./manage.py createsuperuser
|
||||
./manage.py runserver 0.0.0.0:8000
|
||||
|
||||
Your site is now accessible at http://localhost:8111, with the admin backend available at http://localhost:8111/admin/ .
|
||||
|
||||
Optional extras
|
||||
===============
|
||||
|
||||
For the best possible performance and feature set, we recommend setting up the following components. If you're using Vagrant, these are provided as part of the virtual machine image and just need to be enabled in the settings for your project. If you're using Wagtail without Vagrant, this will involve additional installation.
|
||||
|
||||
|
||||
PostgreSQL
|
||||
----------
|
||||
PostgreSQL is a mature database engine suitable for production use, and is recommended by the Django development team. Non-Vagrant users will need to install the PostgreSQL development headers in addition to Postgres itself; on Debian or Ubuntu, this can be done with the following command::
|
||||
|
||||
sudo apt-get install postgresql postgresql-server-dev-all
|
||||
|
||||
To enable Postgres for your project, uncomment the ``psycopg2`` line from your project's requirements.txt, and in ``myprojectname/settings/base.py``, uncomment the DATABASES section for PostgreSQL, commenting out the SQLite one instead. Then run::
|
||||
|
||||
pip install -r requirements.txt
|
||||
createdb -Upostgres myprojectname
|
||||
./manage.py syncdb
|
||||
./manage.py migrate
|
||||
|
||||
This assumes that your PostgreSQL instance is configured to allow you to connect as the 'postgres' user - if not, you'll need to adjust the ``createdb`` line and the database settings in settings/base.py accordingly.
|
||||
|
||||
|
||||
ElasticSearch
|
||||
-------------
|
||||
Wagtail integrates with ElasticSearch to provide full-text searching of your content, both within the Wagtail interface and on your site's front-end. If ElasticSearch is not available, Wagtail will fall back to much more basic search functionality using database queries. ElasticSearch is pre-installed as part of the Vagrant virtual machine image; non-Vagrant users can use the `debian.sh <https://github.com/torchbox/wagtail/blob/master/scripts/install/debian.sh>`__ or `ubuntu.sh <https://github.com/torchbox/wagtail/blob/master/scripts/install/ubuntu.sh>`__ installation scripts as a guide.
|
||||
|
||||
To enable ElasticSearch for your project, uncomment the ``elasticsearch`` line from your project's requirements.txt, and in ``myprojectname/settings/base.py``, uncomment the WAGTAILSEARCH_BACKENDS section. Then run::
|
||||
|
||||
pip install -r requirements.txt
|
||||
./manage.py update_index
|
||||
|
||||
|
||||
Image feature detection
|
||||
-----------------------
|
||||
Wagtail can use the OpenCV computer vision library to detect faces and other features in images, and use this information to select the most appropriate centre point when cropping the image. OpenCV is pre-installed as part of the Vagrant virtual machine image, and Vagrant users can enable this by setting ``WAGTAILIMAGES_FEATURE_DETECTION_ENABLED`` to True in ``myprojectname/settings/base.py``. For installation outside of Vagrant, see :ref:`image_feature_detection`.
|
||||
|
||||
|
||||
Alternative installation methods
|
||||
================================
|
||||
|
||||
Ubuntu
|
||||
------
|
||||
|
||||
If you have a fresh instance of Ubuntu 13.04 or later, you can install Wagtail,
|
||||
along with a demonstration site containing a set of standard templates and page
|
||||
types, in one step. As the root user::
|
||||
|
||||
curl -O https://wagtail.io/ubuntu.sh; bash ubuntu.sh
|
||||
|
||||
This script installs all the dependencies for a production-ready Wagtail site,
|
||||
including PostgreSQL, Redis, Elasticsearch, Nginx and uwsgi. We
|
||||
recommend you check through the script before running it, and adapt it according
|
||||
to your deployment preferences. The canonical version is at
|
||||
`github.com/torchbox/wagtail/blob/master/scripts/install/ubuntu.sh
|
||||
<https://github.com/torchbox/wagtail/blob/master/scripts/install/ubuntu.sh>`_.
|
||||
|
||||
|
||||
Debian
|
||||
------
|
||||
|
||||
If you have a fresh instance of Debian 7, you can install Wagtail, along with a
|
||||
demonstration site containing a set of standard templates and page types, in one
|
||||
step. As the root user::
|
||||
|
||||
curl -O https://wagtail.io/debian.sh; bash debian.sh
|
||||
|
||||
This script installs all the dependencies for a production-ready Wagtail site,
|
||||
including PostgreSQL, Redis, Elasticsearch, Nginx and uwsgi. We
|
||||
recommend you check through the script before running it, and adapt it according
|
||||
to your deployment preferences. The canonical version is at
|
||||
`github.com/torchbox/wagtail/blob/master/scripts/install/debian.sh
|
||||
<https://github.com/torchbox/wagtail/blob/master/scripts/install/debian.sh>`_.
|
||||
|
||||
Docker
|
||||
------
|
||||
|
||||
`@oyvindsk <https://github.com/oyvindsk>`_ has built a Dockerfile for the Wagtail demo. Simply run::
|
||||
|
||||
docker run -p 8000:8000 -d oyvindsk/wagtail-demo
|
||||
|
||||
then access the site at http://your-ip:8000 and the admin
|
||||
interface at http://your-ip:8000/admin using admin / test.
|
||||
|
||||
See https://index.docker.io/u/oyvindsk/wagtail-demo/ for more details.
|
|
@ -1,169 +0,0 @@
|
|||
Getting Started
|
||||
---------------
|
||||
|
||||
On Ubuntu
|
||||
~~~~~~~~~
|
||||
|
||||
If you have a fresh instance of Ubuntu 13.04 or later, you can install Wagtail,
|
||||
along with a demonstration site containing a set of standard templates and page
|
||||
types, in one step. As the root user::
|
||||
|
||||
curl -O https://wagtail.io/ubuntu.sh; bash ubuntu.sh
|
||||
|
||||
This script installs all the dependencies for a production-ready Wagtail site,
|
||||
including PostgreSQL, Redis, Elasticsearch, Nginx and uwsgi. We
|
||||
recommend you check through the script before running it, and adapt it according
|
||||
to your deployment preferences. The canonical version is at
|
||||
`github.com/torchbox/wagtail/blob/master/scripts/install/ubuntu.sh
|
||||
<https://github.com/torchbox/wagtail/blob/master/scripts/install/ubuntu.sh>`_.
|
||||
|
||||
Once you've experimented with the demo app and are ready to build your pages via your own app you can `remove the demo app`_ if you choose.
|
||||
|
||||
On Debian
|
||||
~~~~~~~~~
|
||||
|
||||
If you have a fresh instance of Debian 7, you can install Wagtail, along with a
|
||||
demonstration site containing a set of standard templates and page types, in one
|
||||
step. As the root user::
|
||||
|
||||
curl -O https://wagtail.io/debian.sh; bash debian.sh
|
||||
|
||||
This script installs all the dependencies for a production-ready Wagtail site,
|
||||
including PostgreSQL, Redis, Elasticsearch, Nginx and uwsgi. We
|
||||
recommend you check through the script before running it, and adapt it according
|
||||
to your deployment preferences. The canonical version is at
|
||||
`github.com/torchbox/wagtail/blob/master/scripts/install/debian.sh
|
||||
<https://github.com/torchbox/wagtail/blob/master/scripts/install/debian.sh>`_.
|
||||
|
||||
Once you've experimented with the demo app and are ready to build your pages via your own app you can `remove the demo app`_ if you choose.
|
||||
|
||||
On OS X
|
||||
~~~~~~~
|
||||
|
||||
Install `pip <http://pip.readthedocs.org/en/latest/installing.html>`__ and `virtualenvwrapper <http://virtualenvwrapper.readthedocs.org/en/latest/>`_ if you don't have them already. Then, in your terminal::
|
||||
|
||||
mkvirtualenv wagtaildemo
|
||||
git clone https://github.com/torchbox/wagtaildemo.git
|
||||
cd wagtaildemo
|
||||
pip install -r requirements/dev.txt
|
||||
|
||||
Edit ``wagtaildemo/settings/base.py``, changing ENGINE to django.db.backends.sqlite3 and NAME to wagtail.db. Finally, setup the database and run the local server::
|
||||
|
||||
./manage.py syncdb
|
||||
./manage.py migrate
|
||||
./manage.py runserver
|
||||
|
||||
Using Vagrant
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
We provide a Vagrant box which includes all the dependencies for a fully-fledged
|
||||
Wagtail environment, bundled with a demonstration site containing a set of
|
||||
standard templates and page types. If you have a good internet connection we recommend
|
||||
the following steps, which will download the 650MB Vagrant box and make a running
|
||||
Wagtail instance available as the basis for your new site:
|
||||
|
||||
- Install `Vagrant <http://www.vagrantup.com/>`_ 1.1+
|
||||
- Clone the demonstration site, create the Vagrant box and initialise Wagtail::
|
||||
|
||||
git clone https://github.com/torchbox/wagtaildemo.git
|
||||
cd wagtaildemo
|
||||
vagrant up
|
||||
vagrant ssh
|
||||
# within the SSH session
|
||||
./manage.py createsuperuser
|
||||
./manage.py update_index
|
||||
./manage.py runserver 0.0.0.0:8000
|
||||
|
||||
- This will make the app accessible on the host machine as
|
||||
`localhost:8111 <http://localhost:8111>`_ - you can access the Wagtail admin
|
||||
interface at `localhost:8111/admin <http://localhost:8111/admin>`_. The codebase
|
||||
is located on the host machine, exported to the VM as a shared folder; code
|
||||
editing and Git operations will generally be done on the host.
|
||||
|
||||
Using Docker
|
||||
~~~~~~~~~~~~
|
||||
|
||||
`@oyvindsk <https://github.com/oyvindsk>`_ has built a Dockerfile for the Wagtail demo. Simply run::
|
||||
|
||||
docker run -p 8000:8000 -d oyvindsk/wagtail-demo
|
||||
|
||||
then access the site at http://your-ip:8000 and the admin
|
||||
interface at http://your-ip:8000/admin using admin / test.
|
||||
|
||||
See https://index.docker.io/u/oyvindsk/wagtail-demo/ for more details.
|
||||
|
||||
Other platforms
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
If you're not using Ubuntu or Debian, or if you prefer to install Wagtail manually,
|
||||
use the following steps:
|
||||
|
||||
Required dependencies
|
||||
=====================
|
||||
|
||||
- `pip <https://github.com/pypa/pip>`__
|
||||
- `libjpeg <http://ijg.org/>`_
|
||||
- `libxml2 <http://xmlsoft.org/>`_
|
||||
- `libxslt <http://xmlsoft.org/XSLT/>`_
|
||||
- `zlib <http://www.zlib.net/>`_
|
||||
|
||||
Optional dependencies
|
||||
=====================
|
||||
|
||||
- `PostgreSQL`_
|
||||
- `Elasticsearch`_
|
||||
- `Redis`_
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
With PostgreSQL running (and configured to allow you to connect as the
|
||||
'postgres' user - if not, you'll need to adjust the ``createdb`` line
|
||||
and the database settings in wagtaildemo/settings/base.py accordingly),
|
||||
run the following commands::
|
||||
|
||||
git clone https://github.com/torchbox/wagtaildemo.git
|
||||
cd wagtaildemo
|
||||
pip install -r requirements/dev.txt
|
||||
createdb -Upostgres wagtaildemo
|
||||
./manage.py syncdb
|
||||
./manage.py migrate
|
||||
./manage.py runserver
|
||||
|
||||
SQLite support
|
||||
==============
|
||||
|
||||
SQLite is supported as an alternative to PostgreSQL - update the DATABASES setting
|
||||
in wagtaildemo/settings/base.py to use 'django.db.backends.sqlite3', as you would
|
||||
with a regular Django project.
|
||||
|
||||
.. _Wagtail: http://wagtail.io
|
||||
.. _VirtualBox: https://www.virtualbox.org/
|
||||
.. _the Wagtail codebase: https://github.com/torchbox/wagtail
|
||||
.. _PostgreSQL: http://www.postgresql.org
|
||||
.. _Elasticsearch: http://www.elasticsearch.org
|
||||
.. _Redis: http://redis.io/
|
||||
|
||||
_`Remove the demo app`
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Once you've experimented with the demo app and are ready to build your pages via your own app you can remove the demo app if you choose.
|
||||
|
||||
``PROJECT_ROOT`` should be where your project is located (e.g. /usr/local/django) and ``PROJECT`` is the name of your project (e.g. mywagtail)::
|
||||
|
||||
export PROJECT_ROOT=/usr/local/django
|
||||
export PROJECT=mywagtail
|
||||
cd $PROJECT_ROOT/$PROJECT
|
||||
./manage.py sqlclear demo | psql -Upostgres $PROJECT -f -
|
||||
psql -Upostgres $PROJECT << EOF
|
||||
BEGIN;
|
||||
DELETE FROM wagtailcore_site WHERE root_page_id IN (SELECT id FROM wagtailcore_page WHERE content_type_id IN (SELECT id FROM django_content_type where app_label='demo'));
|
||||
DELETE FROM wagtailcore_page WHERE content_type_id IN (SELECT id FROM django_content_type where app_label='demo');
|
||||
DELETE FROM auth_permission WHERE content_type_id IN (SELECT id FROM django_content_type where app_label='demo');
|
||||
DELETE FROM django_content_type WHERE app_label='demo';
|
||||
DELETE FROM wagtailimages_rendition;
|
||||
DELETE FROM wagtailimages_image;
|
||||
COMMIT;
|
||||
EOF
|
||||
rm -r demo media/images/* media/original_images/*
|
||||
perl -pi -e"s/('demo',|WAGTAILSEARCH_RESULTS_TEMPLATE)/#\1/" $PROJECT/settings/base.py
|
|
@ -13,7 +13,7 @@ We have tried to minimise external dependencies for a working installation of Wa
|
|||
Cache
|
||||
-----
|
||||
|
||||
We recommend `Redis <http://redis.io/>`_ as a fast, persistent cache. Install Redis through package manager and enable it as a cache backend::
|
||||
We recommend `Redis <http://redis.io/>`_ as a fast, persistent cache. Install Redis through your package manager (on Debian or Ubuntu: ``sudo apt-get install redis-server``), add ``django-redis-cache`` to your requirements.txt, and enable it as a cache backend::
|
||||
|
||||
CACHES = {
|
||||
'default': {
|
||||
|
@ -25,7 +25,22 @@ We recommend `Redis <http://redis.io/>`_ as a fast, persistent cache. Install Re
|
|||
}
|
||||
}
|
||||
|
||||
Without a persistent cache, Wagtail will recreate all compressable assets at each server start, e.g. when any files change under ```./manage.py runserver```.
|
||||
Without a persistent cache, Wagtail will recreate all compressable assets at each server start, e.g. when any files change under ``./manage.py runserver``.
|
||||
|
||||
|
||||
Sending emails in the background using Celery
|
||||
---------------------------------------------
|
||||
|
||||
Various actions in the Wagtail admin backend can trigger notification emails - for example, submitting a page for moderation. In Wagtail's default configuration, these are sent as part of the page request/response cycle, which means that web server threads can get tied up for long periods if many emails are being sent. To avoid this, Wagtail can be configured to do this as a background task, using `Celery <http://www.celeryproject.org/>`_ as a task queue. To install Celery, add ``django-celery`` to your requirements.txt. A sample configuration, using Redis as the queue backend, would look like::
|
||||
|
||||
import djcelery
|
||||
|
||||
djcelery.setup_loader()
|
||||
|
||||
CELERY_SEND_TASK_ERROR_EMAILS = True
|
||||
BROKER_URL = 'redis://'
|
||||
|
||||
See the Celery documentation for instructions on running the worker process in development or production.
|
||||
|
||||
|
||||
Search
|
||||
|
|
|
@ -8,7 +8,7 @@ It supports Django 1.6.2+ and 1.7rc3+ on Python 2.6, 2.7, 3.2, 3.3 and 3.4.
|
|||
.. toctree::
|
||||
:maxdepth: 3
|
||||
|
||||
gettingstarted
|
||||
getting_started
|
||||
core_components/index
|
||||
contrib_components/index
|
||||
howto/index
|
||||
|
|
17
setup.py
17
setup.py
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import sys
|
||||
import sys, os
|
||||
|
||||
from wagtail.wagtailcore import __version__
|
||||
|
||||
|
@ -11,16 +11,19 @@ except ImportError:
|
|||
from distutils.core import setup
|
||||
|
||||
|
||||
# Hack to prevent stupid TypeError: 'NoneType' object is not callable error on
|
||||
# exit of python setup.py test # in multiprocessing/util.py _exit_function when
|
||||
# running python setup.py test (see
|
||||
# http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
|
||||
# Hack to prevent "TypeError: 'NoneType' object is not callable" error
|
||||
# in multiprocessing/util.py _exit_function when setup.py exits
|
||||
# (see http://www.eby-sarna.com/pipermail/peak/2010-May/003357.html)
|
||||
try:
|
||||
import multiprocessing
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
# Disable parallel builds, because Pillow 2.5.3 does some crazy monkeypatching of
|
||||
# the build process on multicore systems, which breaks installation of libsass
|
||||
os.environ['MAX_CONCURRENCY'] = '1'
|
||||
|
||||
PY3 = sys.version_info[0] == 3
|
||||
|
||||
|
||||
|
@ -76,5 +79,9 @@ setup(
|
|||
'Topic :: Internet :: WWW/HTTP :: Site Management',
|
||||
],
|
||||
install_requires=install_requires,
|
||||
entry_points="""
|
||||
[console_scripts]
|
||||
wagtail=wagtail.bin.wagtail:main
|
||||
""",
|
||||
zip_safe=False,
|
||||
)
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
#!/usr/bin/env python
|
||||
from __future__ import print_function, absolute_import
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import errno
|
||||
import sys
|
||||
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
def create_project(parser, options, args):
|
||||
# Validate args
|
||||
if len(args) < 2:
|
||||
parser.error("Please specify a name for your wagtail installation")
|
||||
elif len(args) > 2:
|
||||
parser.error("Too many arguments")
|
||||
|
||||
project_name = args[1]
|
||||
|
||||
# Make sure given name is not already in use by another python package/module.
|
||||
try:
|
||||
__import__(project_name)
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
parser.error("'%s' conflicts with the name of an existing "
|
||||
"Python module and cannot be used as a project "
|
||||
"name. Please try another name." % project_name)
|
||||
|
||||
# Make sure directory does not already exist
|
||||
if os.path.exists(project_name):
|
||||
print('A directory called %(project_name)s already exists. \
|
||||
Please choose another name for your wagtail project or remove the existing directory.' % {'project_name': project_name})
|
||||
sys.exit(errno.EEXIST)
|
||||
|
||||
print("Creating a wagtail project called %(project_name)s" % {'project_name': project_name})
|
||||
|
||||
# Create the project from the wagtail template using startapp
|
||||
|
||||
# First find the path to wagtail
|
||||
import wagtail
|
||||
wagtail_path = os.path.dirname(wagtail.__file__)
|
||||
template_path = os.path.join(wagtail_path, 'project_template')
|
||||
|
||||
# Call django-admin startproject
|
||||
result = subprocess.call([
|
||||
'django-admin.py', 'startproject',
|
||||
'--template=' + template_path,
|
||||
'--name=Vagrantfile', '--ext=html,rst',
|
||||
project_name
|
||||
])
|
||||
|
||||
if result == 0:
|
||||
print("Success! %(project_name)s is created" % {'project_name': project_name})
|
||||
|
||||
|
||||
COMMANDS = {
|
||||
'start': create_project,
|
||||
}
|
||||
|
||||
def main():
|
||||
# Parse options
|
||||
parser = OptionParser(usage="Usage: %prog start project_name")
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
# Find command
|
||||
try:
|
||||
command = args[0]
|
||||
except IndexError:
|
||||
parser.print_help()
|
||||
return
|
||||
|
||||
if command in COMMANDS:
|
||||
COMMANDS[command](parser, options, args)
|
||||
else:
|
||||
parser.error("Unrecognised command: " + command)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,10 @@
|
|||
*.pyc
|
||||
.DS_Store
|
||||
/.venv/
|
||||
/*/settings/local.py
|
||||
/static/
|
||||
/media/
|
||||
/.vagrant/
|
||||
Vagrantfile.local
|
||||
/docs/_build/
|
||||
/db.sqlite3
|
|
@ -0,0 +1,27 @@
|
|||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
Vagrant::Config.run do |config|
|
||||
# Base box to build off, and download URL for when it doesn't exist on the user's system already
|
||||
config.vm.box = "wagtail-base-v0.3"
|
||||
config.vm.box_url = "http://downloads.torchbox.com/wagtail-base-v0.3.box"
|
||||
|
||||
# Forward a port from the guest to the host, which allows for outside
|
||||
# computers to access the VM, whereas host only networking does not.
|
||||
config.vm.forward_port 8000, 8111
|
||||
|
||||
# Share an additional folder to the guest VM. The first argument is
|
||||
# an identifier, the second is the path on the guest to mount the
|
||||
# folder, and the third is the path on the host to the actual folder.
|
||||
config.vm.share_folder "project", "/home/vagrant/{{ project_name }}", "."
|
||||
|
||||
# Enable provisioning with a shell script.
|
||||
config.vm.provision :shell, :path => "vagrant/provision.sh", :args => "{{ project_name }}"
|
||||
|
||||
# If a 'Vagrantfile.local' file exists, import any configuration settings
|
||||
# defined there into here. Vagrantfile.local is ignored in version control,
|
||||
# so this can be used to add configuration specific to this computer.
|
||||
if File.exist? "Vagrantfile.local"
|
||||
instance_eval File.read("Vagrantfile.local"), "Vagrantfile.local"
|
||||
end
|
||||
end
|
|
@ -0,0 +1,87 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Adding model 'HomePage'
|
||||
db.create_table('core_homepage', (
|
||||
('page_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['wagtailcore.Page'], unique=True, primary_key=True)),
|
||||
))
|
||||
db.send_create_signal('core', ['HomePage'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
# Deleting model 'HomePage'
|
||||
db.delete_table('core_homepage')
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'user_set'", 'blank': 'True', 'to': "orm['auth.Group']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'user_set'", 'blank': 'True', 'to': "orm['auth.Permission']"}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'core.homepage': {
|
||||
'Meta': {'object_name': 'HomePage', '_ormbases': ['wagtailcore.Page']},
|
||||
'page_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['wagtailcore.Page']", 'unique': 'True', 'primary_key': 'True'})
|
||||
},
|
||||
'wagtailcore.page': {
|
||||
'Meta': {'object_name': 'Page'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pages'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
|
||||
'expire_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'expired': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'go_live_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'has_unpublished_changes': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'live': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_pages'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
|
||||
'search_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'seo_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'show_in_menus': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'url_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['core']
|
|
@ -0,0 +1,114 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from south.utils import datetime_utils as datetime
|
||||
from south.db import db
|
||||
from south.v2 import DataMigration
|
||||
from django.db import models, connection
|
||||
from django.db.transaction import set_autocommit
|
||||
|
||||
|
||||
class Migration(DataMigration):
|
||||
|
||||
depends_on = (
|
||||
('wagtailcore', '0002_initial_data'),
|
||||
)
|
||||
|
||||
def forwards(self, orm):
|
||||
if connection.vendor == 'sqlite':
|
||||
set_autocommit(True)
|
||||
|
||||
orm['wagtailcore.Page'].objects.get(id=2).delete()
|
||||
|
||||
homepage_content_type, created = orm['contenttypes.contenttype'].objects.get_or_create(
|
||||
model='homepage', app_label='core', defaults={'name': 'Homepage'})
|
||||
|
||||
homepage = orm['core.HomePage'].objects.create(
|
||||
title="Homepage",
|
||||
slug='home',
|
||||
content_type=homepage_content_type,
|
||||
path='00010001',
|
||||
depth=2,
|
||||
numchild=0,
|
||||
url_path='/home/',
|
||||
)
|
||||
|
||||
orm['wagtailcore.site'].objects.create(
|
||||
hostname='localhost', root_page=homepage, is_default_site=True)
|
||||
|
||||
def backwards(self, orm):
|
||||
pass
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'user_set'", 'blank': 'True', 'to': "orm['auth.Group']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'user_set'", 'blank': 'True', 'to': "orm['auth.Permission']"}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'core.homepage': {
|
||||
'Meta': {'object_name': 'HomePage', '_ormbases': ['wagtailcore.Page']},
|
||||
'page_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['wagtailcore.Page']", 'unique': 'True', 'primary_key': 'True'})
|
||||
},
|
||||
'wagtailcore.page': {
|
||||
'Meta': {'object_name': 'Page'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pages'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
|
||||
'expire_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'expired': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'go_live_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'has_unpublished_changes': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'live': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_pages'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
|
||||
'search_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'seo_title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'show_in_menus': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'url_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
|
||||
},
|
||||
'wagtailcore.site': {
|
||||
'Meta': {'unique_together': "(('hostname', 'port'),)", 'object_name': 'Site'},
|
||||
'hostname': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_default_site': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'port': ('django.db.models.fields.IntegerField', [], {'default': '80'}),
|
||||
'root_page': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sites_rooted_here'", 'to': "orm['wagtailcore.Page']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['core']
|
||||
symmetrical = True
|
|
@ -0,0 +1,7 @@
|
|||
from django.db import models
|
||||
|
||||
from wagtail.wagtailcore.models import Page
|
||||
|
||||
|
||||
class HomePage(Page):
|
||||
pass
|
|
@ -0,0 +1,9 @@
|
|||
{% templatetag openblock %} extends "base.html" {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block body_class {% templatetag closeblock %}template-404{% templatetag openblock %} endblock {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block content {% templatetag closeblock %}
|
||||
<h1>Page not found</h1>
|
||||
|
||||
<h2>Sorry, this page could not be found.</h2>
|
||||
{% templatetag openblock %} endblock {% templatetag closeblock %}
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<title>Internal server error</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Internal server error</h1>
|
||||
|
||||
<h2>Sorry, there seems to be an error. Please try again soon.</h2>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,40 @@
|
|||
{% templatetag openblock %} load compress static wagtailuserbar {% templatetag closeblock %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<title>{% templatetag openblock %} block title %}{% templatetag openblock %} if self.seo_title %}{% templatetag openvariable %} self.seo_title {% templatetag closevariable %}{% templatetag openblock %} else %}{% templatetag openvariable %} self.title {% templatetag closevariable %}{% templatetag openblock %} endif {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %}{% templatetag openblock %} block title_suffix {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %}</title>
|
||||
<meta name="description" content="" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
{% templatetag openblock %} compress css {% templatetag closeblock %}
|
||||
{# Global stylesheets #}
|
||||
<link rel="stylesheet" type="text/x-scss" href="{% templatetag openblock %} static 'css/{{ project_name }}.scss' {% templatetag closeblock %}">
|
||||
{% templatetag openblock %} endcompress {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block extra_css {% templatetag closeblock %}
|
||||
{# Override this in templates to add extra stylesheets #}
|
||||
{% templatetag openblock %} endblock {% templatetag closeblock %}
|
||||
</head>
|
||||
|
||||
<body class="{% templatetag openblock %} block body_class {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %}">
|
||||
{% templatetag openblock %} wagtailuserbar {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block content {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} compress js {% templatetag closeblock %}
|
||||
{# Global javascript #}
|
||||
<script type="text/javascript" src="{% templatetag openblock %} static 'js/{{ project_name }}.js' {% templatetag closeblock %}"></script>
|
||||
{% templatetag openblock %} endcompress {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block extra_js {% templatetag closeblock %}
|
||||
{# Override this in templates to add extra javascript #}
|
||||
{% templatetag openblock %} endblock {% templatetag closeblock %}
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,13 @@
|
|||
{% templatetag openblock %} extends "base.html" {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} load static core_tags {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block body_class {% templatetag closeblock %}template-{% templatetag openvariable %} self|content_type|slugify {% templatetag closevariable %}{% templatetag openblock %} endblock {% templatetag closeblock %}
|
||||
|
||||
{% templatetag openblock %} block content {% templatetag closeblock %}
|
||||
<h1>Welcome to your new Wagtail site!</h1>
|
||||
|
||||
<p>You can access the admin interface <a href="{% templatetag openblock %} url 'wagtailadmin_home' {% templatetag closeblock %}">here</a> (make sure you have run "./manage.py createsuperuser" in the console first).
|
||||
|
||||
<p>If you haven't already given the documentation a read, head over to <a href="http://wagtail.readthedocs.org/">http://wagtail.readthedocs.org</a> to start building on Wagtail</p>
|
||||
{% templatetag openblock %} endblock {% templatetag closeblock %}
|
|
@ -0,0 +1,12 @@
|
|||
from django import template
|
||||
from django.conf import settings
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
# Return the model name/"content type" as a string e.g BlogPage, NewsListingPage.
|
||||
# Can be used with "slugify" to create CSS-friendly classnames
|
||||
# Usage: {% verbatim %}{{ self|content_type|slugify }}{% endverbatim %}
|
||||
@register.filter
|
||||
def content_type(model):
|
||||
return model.__class__.__name__
|
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import sys
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
|
||||
|
||||
from django.core.management import execute_from_command_line
|
||||
|
||||
execute_from_command_line(sys.argv)
|
|
@ -0,0 +1 @@
|
|||
from .dev import *
|
|
@ -0,0 +1,164 @@
|
|||
"""
|
||||
Django settings for {{ project_name }} project.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/{{ docs_version }}/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/
|
||||
"""
|
||||
|
||||
from os.path import abspath, dirname, join
|
||||
|
||||
# Absolute filesystem path to the Django project directory:
|
||||
PROJECT_ROOT = dirname(dirname(dirname(abspath(__file__))))
|
||||
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = '{{ secret_key }}'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
TEMPLATE_DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = (
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
|
||||
'south',
|
||||
'compressor',
|
||||
'taggit',
|
||||
'modelcluster',
|
||||
|
||||
'wagtail.wagtailcore',
|
||||
'wagtail.wagtailadmin',
|
||||
'wagtail.wagtaildocs',
|
||||
'wagtail.wagtailsnippets',
|
||||
'wagtail.wagtailusers',
|
||||
'wagtail.wagtailimages',
|
||||
'wagtail.wagtailembeds',
|
||||
'wagtail.wagtailsearch',
|
||||
'wagtail.wagtailredirects',
|
||||
'wagtail.wagtailforms',
|
||||
|
||||
'core',
|
||||
)
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
|
||||
'wagtail.wagtailcore.middleware.SiteMiddleware',
|
||||
'wagtail.wagtailredirects.middleware.RedirectMiddleware',
|
||||
)
|
||||
|
||||
ROOT_URLCONF = '{{ project_name }}.urls'
|
||||
WSGI_APPLICATION = '{{ project_name }}.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/#databases
|
||||
|
||||
# SQLite (simplest install)
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': join(PROJECT_ROOT, 'db.sqlite3'),
|
||||
}
|
||||
}
|
||||
|
||||
# PostgreSQL (Recommended, but requires the psycopg2 library and Postgresql development headers)
|
||||
# DATABASES = {
|
||||
# 'default': {
|
||||
# 'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
# 'NAME': '{{ project_name }}',
|
||||
# 'USER': 'postgres',
|
||||
# 'PASSWORD': '',
|
||||
# 'HOST': '', # Set to empty string for localhost.
|
||||
# 'PORT': '', # Set to empty string for default.
|
||||
# 'CONN_MAX_AGE': 600, # number of seconds database connections should persist for
|
||||
# }
|
||||
# }
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/{{ docs_version }}/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-gb'
|
||||
TIME_ZONE = 'UTC'
|
||||
USE_I18N = True
|
||||
USE_L10N = True
|
||||
USE_TZ = True
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/{{ docs_version }}/howto/static-files/
|
||||
|
||||
STATIC_ROOT = join(PROJECT_ROOT, 'static')
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
STATICFILES_FINDERS = (
|
||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||
'compressor.finders.CompressorFinder',
|
||||
)
|
||||
|
||||
MEDIA_ROOT = join(PROJECT_ROOT, 'media')
|
||||
MEDIA_URL = '/media/'
|
||||
|
||||
|
||||
# Django compressor settings
|
||||
# http://django-compressor.readthedocs.org/en/latest/settings/
|
||||
|
||||
COMPRESS_PRECOMPILERS = (
|
||||
('text/x-scss', 'django_libsass.SassCompiler'),
|
||||
)
|
||||
|
||||
|
||||
# Template configuration
|
||||
|
||||
from django.conf import global_settings
|
||||
|
||||
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
|
||||
'django.core.context_processors.request',
|
||||
)
|
||||
|
||||
|
||||
# Wagtail settings
|
||||
|
||||
LOGIN_URL = 'wagtailadmin_login'
|
||||
LOGIN_REDIRECT_URL = 'wagtailadmin_home'
|
||||
|
||||
WAGTAIL_SITE_NAME = "{{ project_name }}"
|
||||
|
||||
# Use Elasticsearch as the search backend for extra performance and better search results:
|
||||
# http://wagtail.readthedocs.org/en/latest/howto/performance.html#search
|
||||
# http://wagtail.readthedocs.org/en/latest/core_components/search/backends.html#elasticsearch-backend
|
||||
#
|
||||
# WAGTAILSEARCH_BACKENDS = {
|
||||
# 'default': {
|
||||
# 'BACKEND': 'wagtail.wagtailsearch.backends.elasticsearch.ElasticSearch',
|
||||
# 'INDEX': '{{ project_name }}',
|
||||
# },
|
||||
# }
|
||||
|
||||
|
||||
# Whether to use face/feature detection to improve image cropping - requires OpenCV
|
||||
WAGTAILIMAGES_FEATURE_DETECTION_ENABLED = False
|
|
@ -0,0 +1,13 @@
|
|||
from .base import *
|
||||
|
||||
|
||||
DEBUG = True
|
||||
TEMPLATE_DEBUG = True
|
||||
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
||||
|
||||
|
||||
try:
|
||||
from .local import *
|
||||
except ImportError:
|
||||
pass
|
|
@ -0,0 +1,48 @@
|
|||
from .base import *
|
||||
|
||||
|
||||
# Disable debug mode
|
||||
|
||||
DEBUG = False
|
||||
TEMPLATE_DEBUG = False
|
||||
|
||||
|
||||
# Compress static files offline
|
||||
# http://django-compressor.readthedocs.org/en/latest/settings/#django.conf.settings.COMPRESS_OFFLINE
|
||||
|
||||
COMPRESS_OFFLINE = True
|
||||
|
||||
|
||||
# Send notification emails as a background task using Celery,
|
||||
# to prevent this from blocking web server threads
|
||||
# (requires the django-celery package):
|
||||
# http://celery.readthedocs.org/en/latest/configuration.html
|
||||
|
||||
# import djcelery
|
||||
#
|
||||
# djcelery.setup_loader()
|
||||
#
|
||||
# CELERY_SEND_TASK_ERROR_EMAILS = True
|
||||
# BROKER_URL = 'redis://'
|
||||
|
||||
|
||||
# Use Redis as the cache backend for extra performance
|
||||
# (requires the django-redis-cache package):
|
||||
# http://wagtail.readthedocs.org/en/latest/howto/performance.html#cache
|
||||
|
||||
# CACHES = {
|
||||
# 'default': {
|
||||
# 'BACKEND': 'redis_cache.cache.RedisCache',
|
||||
# 'LOCATION': '127.0.0.1:6379',
|
||||
# 'KEY_PREFIX': '{{ project_name }}',
|
||||
# 'OPTIONS': {
|
||||
# 'CLIENT_CLASS': 'redis_cache.client.DefaultClient',
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
|
||||
|
||||
try:
|
||||
from .local import *
|
||||
except ImportError:
|
||||
pass
|
|
@ -0,0 +1,37 @@
|
|||
import os
|
||||
|
||||
from django.conf.urls import patterns, include, url
|
||||
from django.conf.urls.static import static
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
|
||||
from wagtail.wagtailadmin import urls as wagtailadmin_urls
|
||||
from wagtail.wagtailsearch import urls as wagtailsearch_urls
|
||||
from wagtail.wagtaildocs import urls as wagtaildocs_urls
|
||||
from wagtail.wagtailcore import urls as wagtail_urls
|
||||
|
||||
|
||||
admin.autodiscover()
|
||||
|
||||
|
||||
# Register search signal handlers
|
||||
from wagtail.wagtailsearch.signal_handlers import register_signal_handlers as wagtailsearch_register_signal_handlers
|
||||
wagtailsearch_register_signal_handlers()
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^django-admin/', include(admin.site.urls)),
|
||||
|
||||
url(r'^admin/', include(wagtailadmin_urls)),
|
||||
url(r'^search/', include(wagtailsearch_urls)),
|
||||
url(r'^documents/', include(wagtaildocs_urls)),
|
||||
|
||||
url(r'', include(wagtail_urls)),
|
||||
)
|
||||
|
||||
|
||||
if settings.DEBUG:
|
||||
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||
|
||||
urlpatterns += staticfiles_urlpatterns()
|
||||
urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images'))
|
|
@ -0,0 +1,14 @@
|
|||
"""
|
||||
WSGI config for {{ project_name }} project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings.production")
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
application = get_wsgi_application()
|
|
@ -0,0 +1,3 @@
|
|||
==================
|
||||
{{ project_name }}
|
||||
==================
|
|
@ -0,0 +1,12 @@
|
|||
# Minimal requirements
|
||||
Django>=1.6.2,<1.7
|
||||
South==1.0.0
|
||||
wagtail==0.5
|
||||
|
||||
# Recommended components (require additional setup):
|
||||
# psycopg2==2.5.2
|
||||
# elasticsearch==1.1.1
|
||||
|
||||
# Recommended components to improve performance in production:
|
||||
# django-redis-cache==0.13.0
|
||||
# django-celery==3.1.10
|
|
@ -0,0 +1,34 @@
|
|||
#!/bin/bash
|
||||
|
||||
PROJECT_NAME=$1
|
||||
|
||||
PROJECT_DIR=/home/vagrant/$PROJECT_NAME
|
||||
VIRTUALENV_DIR=/home/vagrant/.virtualenvs/$PROJECT_NAME
|
||||
|
||||
PYTHON=$VIRTUALENV_DIR/bin/python
|
||||
PIP=$VIRTUALENV_DIR/bin/pip
|
||||
|
||||
|
||||
# Virtualenv setup for project
|
||||
su - vagrant -c "/usr/local/bin/virtualenv --system-site-packages $VIRTUALENV_DIR && \
|
||||
echo $PROJECT_DIR > $VIRTUALENV_DIR/.project && \
|
||||
PIP_DOWNLOAD_CACHE=/home/vagrant/.pip_download_cache $PIP install -r $PROJECT_DIR/requirements.txt"
|
||||
|
||||
echo "workon $PROJECT_NAME" >> /home/vagrant/.bashrc
|
||||
|
||||
|
||||
# Set execute permissions on manage.py as they get lost if we build from a zip file
|
||||
chmod a+x $PROJECT_DIR/manage.py
|
||||
|
||||
|
||||
# Run syncdb/migrate/update_index
|
||||
su - vagrant -c "$PYTHON $PROJECT_DIR/manage.py syncdb --noinput && \
|
||||
$PYTHON $PROJECT_DIR/manage.py migrate --noinput && \
|
||||
$PYTHON $PROJECT_DIR/manage.py update_index"
|
||||
|
||||
|
||||
# Add a couple of aliases to manage.py into .bashrc
|
||||
cat << EOF >> /home/vagrant/.bashrc
|
||||
alias dj="$PYTHON $PROJECT_DIR/manage.py"
|
||||
alias djrun="dj runserver 0.0.0.0:8000"
|
||||
EOF
|
|
@ -1,16 +1,23 @@
|
|||
import os
|
||||
from django.conf import settings
|
||||
|
||||
try:
|
||||
import cv
|
||||
|
||||
opencv_available = True
|
||||
except ImportError:
|
||||
# only try to import OpenCV if WAGTAILIMAGES_FEATURE_DETECTION_ENABLED is True -
|
||||
# avoids spurious "libdc1394 error: Failed to initialize libdc1394" errors on sites that
|
||||
# don't even use OpenCV
|
||||
if getattr(settings, 'WAGTAILIMAGES_FEATURE_DETECTION_ENABLED', False):
|
||||
try:
|
||||
import cv2.cv as cv
|
||||
import cv
|
||||
|
||||
opencv_available = True
|
||||
except ImportError:
|
||||
opencv_available = False
|
||||
try:
|
||||
import cv2.cv as cv
|
||||
|
||||
opencv_available = True
|
||||
except ImportError:
|
||||
opencv_available = False
|
||||
else:
|
||||
opencv_available = False
|
||||
|
||||
|
||||
from wagtail.wagtailimages.utils.focal_point import FocalPoint, combine_focal_points
|
||||
|
|
Ładowanie…
Reference in New Issue