This is a demonstration project for the amazing Wagtail CMS.
 
 
 
 
 
 
Go to file
Sage Abdullah ae3f2f2396 Enable scheduled publishing feature for FooterText snippet 2022-10-20 15:00:43 +01:00
.github/workflows Add GitHub Actions workflow configuration 2022-08-18 12:51:17 +01:00
bakerydemo Enable scheduled publishing feature for FooterText snippet 2022-10-20 15:00:43 +01:00
requirements Upgrade to Wagtail 4 2022-08-31 16:08:04 +01:00
vagrant Add a section to bashrc idempotently 2020-05-06 22:54:20 +01:00
.dockerignore Add Dockerfile, docker-compose.yml, S3 uploaded media settings (configurable via the environment), Docker instructions, and a .travis.yml to build/test the Docker image. 2017-02-19 11:46:34 -05:00
.editorconfig Update and add linting config to better match Wagtail 2022-08-18 12:51:17 +01:00
.eslintignore Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.eslintrc Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.git-blame-ignore-revs Add .git-blame-ignore-revs for reformatting commits 2022-08-19 11:44:27 +01:00
.gitignore Add package.json for front-end linters 2022-08-18 12:51:17 +01:00
.gitpod.dockerfile Fix and update Gitpod (#327) 2022-03-28 13:27:38 +02:00
.gitpod.yml Format code with Prettier 2022-08-18 12:51:17 +01:00
.pre-commit-config.yaml Bump flake8-print to 5.0.0 and add to pre-commit config 2022-08-19 11:44:27 +01:00
.prettierignore Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.prettierrc Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.stylelintignore Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.stylelintrc Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
.travis.yml copy files from fixtures dir to MEDIA_ROOT (or remote storage) during load_initial_data (#255) 2019-11-05 21:29:52 -05:00
Dockerfile Update docker to current/supported tool versions (#323) 2022-03-04 12:13:31 +00:00
LICENSE Add BSD licence 2021-08-09 11:14:33 +01:00
Makefile Add ESLint, Prettier, and Stylelint config files 2022-08-18 12:51:17 +01:00
Procfile Upgrade whitenoise to 5.0.x for Django 3.0 compatibility 2020-02-03 16:33:42 +00:00
Vagrantfile Upgrade base image to wagtail/buster64 2022-06-20 11:20:52 +01:00
app.json Format code with Prettier 2022-08-18 12:51:17 +01:00
contributing.md Add punctuation. 2017-02-20 05:47:26 -05:00
docker-compose.yml Format code with Prettier 2022-08-18 12:51:17 +01:00
docker-entrypoint.sh Add Dockerfile, docker-compose.yml, S3 uploaded media settings (configurable via the environment), Docker instructions, and a .travis.yml to build/test the Docker image. 2017-02-19 11:46:34 -05:00
manage.py Format code with isort 2022-08-18 12:51:17 +01:00
package-lock.json Add package.json for front-end linters 2022-08-18 12:51:17 +01:00
package.json Add package.json for front-end linters 2022-08-18 12:51:17 +01:00
readme.md Add requirements for development 2022-08-18 12:51:17 +01:00
requirements.txt Add Dockerfile, docker-compose.yml, S3 uploaded media settings (configurable via the environment), Docker instructions, and a .travis.yml to build/test the Docker image. 2017-02-19 11:46:34 -05:00
runtime.txt Bump python version 2022-02-08 19:03:33 +00:00
setup.cfg Update and add linting config to better match Wagtail 2022-08-18 12:51:17 +01:00
stellar.yaml Add initial demo scaffold without any site apps 2017-02-09 12:20:21 +00:00

readme.md

Wagtail demo project

This is a demonstration project for the amazing Wagtail CMS.

The demo site is designed to provide examples of common features and recipes to introduce you to Wagtail development. Beyond the code, it will also let you explore the admin / editorial interface of the CMS.

Note we do not recommend using this project to start your own site - the demo is intended to be a springboard to get you started. Feel free to copy code from the demo into your own project.

Wagtail Features Demonstrated in This Demo

This demo is aimed primarily at developers wanting to learn more about the internals of Wagtail, and assumes you'll be reading its source code. After browsing the features, pay special attention to code we've used for:

  • Dividing a project up into multiple apps
  • Custom content models and "contexts" in the "breads" and "locations" apps
  • A typical weblog in the "blog" app
  • Example of using a "base" app to contain misc additional functionality (e.g. Contact Form, About, etc.)
  • "StandardPage" model using mixins borrowed from other apps
  • Example of customizing the Wagtail Admin via wagtail_hooks
  • Example of using the Wagtail "snippets" system to represent bread categories, countries and ingredients
  • Example of a custom "Galleries" feature that pulls in images used in other content types in the system
  • Example of creating ManyToMany relationships via the Ingredients feature on BreadPage
  • Lots more

Document contents

Installation

If you want to see what Wagtail is all about, we suggest trying it out through Gitpod. If you want to set up Wagtail locally instead, and you're new to Python and/or Django, we suggest you run this project on a Virtual Machine using Vagrant or Docker (whichever you're most comfortable with). Both Vagrant and Docker will help resolve common software dependency issues. Developers more familiar with virtualenv and traditional Django app setup instructions should skip to Setup with virtualenv. If you want a publicly accessible demo site, deploy to Heroku.

Setup with Gitpod

Setup a development environment and run this demo website with a single click (requires a Github account):

Open in Gitpod

Once Gitpod has fully started, and a preview of the bakery website has appeared in the "Simple Browser" panel, click the arrow button to the right of the URL bar to open the website in a new tab. Go to /admin/ and login with admin / changeme.

Setup with Vagrant

Dependencies

Installation

Once you've installed the necessary dependencies run the following commands:

git clone https://github.com/wagtail/bakerydemo.git
cd bakerydemo
vagrant up
vagrant ssh
# then, within the SSH session:
./manage.py runserver 0.0.0.0:8000

The demo site will now be accessible at http://localhost:8000/ and the Wagtail admin interface at http://localhost:8000/admin/.

Log into the admin with the credentials admin / changeme.

Use Ctrl+c to stop the local server. To stop the Vagrant environment, run exit then vagrant halt.

Setup with Docker

Dependencies

Installation

Run the following commands:

git clone https://github.com/wagtail/bakerydemo.git
cd bakerydemo
docker-compose up --build -d
docker-compose run app /venv/bin/python manage.py load_initial_data
docker-compose up

The demo site will now be accessible at http://localhost:8000/ and the Wagtail admin interface at http://localhost:8000/admin/.

Log into the admin with the credentials admin / changeme.

Important: This docker-compose.yml is configured for local testing only, and is not intended for production use.

Debugging

To tail the logs from the Docker containers in realtime, run:

docker-compose logs -f

Setup with Virtualenv

You can run the Wagtail demo locally without setting up Vagrant or Docker and simply use Virtualenv, which is the recommended installation approach for Django itself.

Dependencies

Installation

With PIP and virtualenvwrapper installed, run:

mkvirtualenv wagtailbakerydemo
python --version

Confirm that this is showing a compatible version of Python 3.x. If not, and you have multiple versions of Python installed on your system, you may need to specify the appropriate version when creating the virtualenv:

deactivate
rmvirtualenv wagtailbakerydemo
mkvirtualenv wagtailbakerydemo --python=python3.9
python --version

Now we're ready to set up the bakery demo project itself:

cd ~/dev [or your preferred dev directory]
git clone https://github.com/wagtail/bakerydemo.git
cd bakerydemo
pip install -r requirements/development.txt

Next, we'll set up our local environment variables. We use django-dotenv to help with this. It reads environment variables located in a file name .env in the top level directory of the project. The only variable we need to start is DJANGO_SETTINGS_MODULE:

$ cp bakerydemo/settings/local.py.example bakerydemo/settings/local.py
$ echo "DJANGO_SETTINGS_MODULE=bakerydemo.settings.local" > .env

To set up your database and load initial data, run the following commands:

./manage.py migrate
./manage.py load_initial_data
./manage.py runserver

Log into the admin with the credentials admin / changeme.

Deploy to Heroku

If you want a publicly accessible demo site, use Heroku's one-click deployment solution to the free 'Hobby' tier:

Deploy

If you do not have a Heroku account, clicking the above button will walk you through the steps to generate one. At this point you will be presented with a screen to configure your app. For our purposes, we will accept all of the defaults and click Deploy. The status of the deployment will dynamically update in the browser. Once finished, click View to see the public site.

Log into the admin with the credentials admin / changeme.

To prevent the demo site from regenerating a new Django SECRET_KEY each time Heroku restarts your site, you should set a DJANGO_SECRET_KEY environment variable in Heroku using the web interace or the CLI. If using the CLI, you can set a SECRET_KEY like so:

heroku config:set DJANGO_SECRET_KEY=changeme

To learn more about Heroku, read Deploying Python and Django Apps on Heroku.

Storing Wagtail Media Files on AWS S3

If you have deployed the demo site to Heroku or via Docker, you may want to perform some additional setup. Heroku uses an ephemeral filesystem, and Docker-based hosting environments typically work in the same manner. In laymen's terms, this means that uploaded images will disappear at a minimum of once per day, and on each application deployment. To mitigate this, you can host your media on S3.

This documentation assumes that you have an AWS account, an IAM user, and a properly configured S3 bucket. These topics are outside of the scope of this documentation; the following blog post will walk you through those steps.

This demo site comes preconfigured with a production settings file that will enable S3 for uploaded media storage if AWS_STORAGE_BUCKET_NAME is defined in the shell environment. All you need to do is set the following environment variables. If using Heroku, you will first need to install and configure the Heroku CLI. Then, execute the following commands to set the aforementioned environment variables:

heroku config:set AWS_STORAGE_BUCKET_NAME=changeme
heroku config:set AWS_ACCESS_KEY_ID=changeme
heroku config:set AWS_SECRET_ACCESS_KEY=changeme

Do not forget to replace the changeme with the actual values for your AWS account. If you're using a different hosting environment, set the same environment variables there using the method appropriate for your environment.

Once Heroku restarts your application or your Docker container is refreshed, you should have persistent media storage!

Running ./manage.py load_initial_data will copy local images to S3, but if you set up S3 after you ran it the first time you might need to run it again.

Next steps

Hopefully after you've experimented with the demo you'll want to create your own site. To do that you'll want to run the wagtail start command in your environment of choice. You can find more information in the getting started Wagtail CMS docs.

Contributing

If you're a Python or Django developer, fork the repo and get stuck in! If you'd like to get involved you may find our contributing guidelines a useful read.

Preparing this archive for distribution

If you change content or images in this repo and need to prepare a new fixture file for export, do the following on a branch:

./manage.py dumpdata --natural-foreign --indent 2 -e auth.permission -e contenttypes -e wagtailcore.GroupCollectionPermission -e wagtailimages.filter -e wagtailcore.pagerevision -e wagtailimages.rendition -e sessions > bakerydemo/base/fixtures/bakerydemo.json

Please optimize any included images to 1200px wide with JPEG compression at 60%. Note that media/images is ignored in the repo by .gitignore but media/original_images is not. Wagtail's local image "renditions" are excluded in the fixture recipe above.

Make a pull request to https://github.com/wagtail/bakerydemo

Other notes

Because we can't (easily) use ElasticSearch for this demo, we use wagtail's native DB search. However, native DB search can't search specific fields in our models on a generalized Page query. So for demo purposes ONLY, we hard-code the model names we want to search into search.views, which is not ideal. In production, use ElasticSearch and a simplified search query, per https://docs.wagtail.org/en/stable/topics/search/searching.html.

Sending email from the contact form

The following setting in base.py and production.py ensures that live email is not sent by the demo contact form.

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

In production on your own site, you'll need to change this to:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

and configure SMTP settings appropriate for your email provider.

Ownership of demo content

All content in the demo is public domain. Textual content in this project is either sourced from Wikipedia or is lorem ipsum. All images are from either Wikimedia Commons or other copyright-free sources.