فهرست منبع

Documentation (#45)

* Adding initial sphinx docs

* Additional style and content updates to docs

* Additional docs style changes

* Adding additional documentation

* Update to docs versions.js to cache versions locally in browser to avoid ajax calls
Vince Salvino 6 سال پیش
والد
کامیت
a1b39874b4

+ 1 - 0
.gitignore

@@ -6,6 +6,7 @@
 *.tgz
 media/
 build/
+_build/
 dist/
 __pycache__
 codered_cms.egg-info/

+ 0 - 220
DOCS.md

@@ -1,220 +0,0 @@
-# Documentation
-
-[< Back to README](README.md)
-
-Table of Contents:
-* [Quick Start](#quick-start)
-* [Customizing your website](#customizing-your-website)
-* [Searching](#searching)
-* [Hooks](#hooks)
-* [Settings](#codered-cms-settings)
-* [Developing coderedcms](#developing-and-testing-codered-cms)
-* [Additional Features](#additional-features)
-
-
-
-
-## Quick start
-1. Run `pip install coderedcms`
-
-2. Run `coderedcms start mysite`
-
-3. Run `python manage.py migrate` to create the core models.
-
-4. Run `python manage.py createsuperuser` to create the initial admin user.
-
-5. Run `python manage.py runserver` to launch the development server, and go to `http://localhost:8000` in your browser, or `http://localhost:8000/admin/` to log in with your admin account.
-
-
-
-## Customizing your website
-After following the quickstart, you are greeted by a barebones website. There are a few settings you will want to change to add your own branding.
-
-### Site name
-This is shown by default in the navbar, and also added to the title attribute of each page. This can be changed in Settings > Sites > localhost. Hostname and port only need to be changed when running in  production.
-
-### Site settings
-Under Settings > Sites in the Wagtail Admin, you will want to make sure this setting is up to date with the proper Hostname and Port. Failure to do so can cause the Preview button on pages to return a 500 error.
-
-### Logo & icon
-The logo that appears in the navbar, the wagtail admin, and your favicon can be set in Settings > Layout. Here you can also change navbar settings (based on Bootstrap CSS framework).
-
-### Navigation bars
-Navbars are top navigation elements that create a "main menu" experience. Navbars are managed as snippets. They render from top down based on the order they were created in.
-
-### Footers
-Similar to Navbars, footers are also managed as snippets and also render top down based on the order they were created in.
-
-### Custom CSS
-A django app called `website` has been created to hold your custom changes. In website/static/ there are custom.css and custom.js files that get loaded on every page by default. Adding anything to these files will automatically populate on the site and override any default styles. By default, Bootstrap 4 and jQuery are already included on the site.
-
-### Custom templates
-The templates directory inside the `website` app is empty by default. Any templates you put in here will override the default coderedcms templates if they follow the same name and diretory structure. This uses the standard Django template rendering engine. For example, to change the formatting of the article page, copy `coderedcms/templates/coderedcms/pages/article_page.html` to `website/templates/coderedcms/pages/article_page.html` and modify it.
-
-### Custom models
-The django app `website` has been created with default models based on pre-built abstract CodeRed CMS models. You can use these as-is, override existing fields and function, and add custom fields to these models. After making a change to any of these models, be sure to run `python manage.py makemigrations` and `python manage.py migrate` to apply the database changes.
-
-
-## Searching
-A search page is available by default at the `/search/` URL, which can be customized in the `urls.py` file in your project. To enable a search bar in the navigation bar, check Settings > Layout > Search box. Search results are paginated; to specify the number of results per page, edit the value in Settings > General > Search Settings.
-
-### Search result formatting
-Each search result is rendered using the template at `coderedcms/pages/search_result.html`. The template can be overriden per model with the `search_template` attribute.
-
-### Search result filtering
-To enable additional filtering by page type, add `search_filterable = True` to the page model. The `search_name` and `search_name_plural` fields are then used to display the labels for these filters (defaults to `verbose_name` and `verbose_name_plural` if not specified). For example, to enable search filtering by Blog or by Products in addition to All Results:
-```
-class BlogPage(CoderedArticlePage):
-    search_filterable = True
-    search_name = 'Blog Post'
-    search_name_plural = 'Blog'
-
-class Product(CoderedWebPage):
-    search_filterable = True
-    search_name = 'Product'
-    search_name_plural = 'Products'
-```
-Would enable the following filter options on the search page: All Results, Blog, Products.
-
-### Search fields
-If using the Wagtail DatabaseSearch backend (default), only page Title and Search Description fields are searched upon. This is due to a limitation in the DatabaseSearch backend; other backends such as PostgreSQL and Elasticsearch will search on additional specific fields such as body, article captions, etc. To enable more specific searching while still using the database backend, the specific models can be flagged for inclusion in search by setting `search_db_include = True` on the page model. Note that this must be set on every type of page model you wish to include in search. When setting this flag, search is performed independently on each page type, and the results are combined. So you may want to also specify `search_db_boost` (int) to control the order in which the pages are searched. Pages with a higher `search_db_boost` are searched first, and results are shown higher in the list. For example:
-```
-class Article(CoderedArticlePage):
-    search_db_include = True
-    search_db_boost = 10
-    ...
-
-class WebPage(CoderedWebPage):
-    search_db_include = True
-    search_db_boost = 9
-    ...
-
-class FormPage(CoderedFormPage):
-    ...
-```
-In this example, Article search results will be shown before WebPage results when using the DatabaseSearch backend. FormPage results will not be shown at all, due to the absence `search_db_include`. If no models have `search_db_include = True`, All CoderedPages will be searched by title and description. When using any search backend other than database, `search_db_*` variables are ignored.
-
-
-
-## Hooks
-Building on the concept of wagtail hooks, there are some additional hooks in CodeRed CMS
-
-### `is_request_cacheable`
-The callable passed into this hook should take a `request` argument, and return a `bool` indicating whether or not the response to this request should be cached (served from the cache if it is already cached). Not returning, or returning anything other than a bool will not affect the caching decision. For example:
-```
-from wagtail.core import hooks
-
-@hooks.register('is_request_cacheable')
-def nocache_in_query(request):
-    # if the querystring contains a "nocache" key, return False to forcibly not cache.
-    # otherwise, do not return to let the CMS decide how to cache.
-    if 'nocache' in request.GET:
-        return False
-```
-
-
-
-## CodeRed CMS Settings
-Default settings are loaded from coderedcms/settings.py. Available settings for CodeRed CMS:
-
-### CODERED_CACHE_PAGES
-Boolean on whether or not to load the page caching machinery and enable cache settings in the wagtail admin.
-
-### CODERED_CACHE_BACKEND
-The name of the django cache backend to use for CodeRed CMS. Defaults to `'default'` which is required by Django when using the cache.
-
-### CODERED_PROTECTED_MEDIA_ROOT
-The directory where files from File Upload fields on Form Pages are saved. These files are served through django using `PROTECTED_MEDIA_URL` and require login to access. Defaults to `protected/` in your project directory.
-
-### CODERED_PROTECTED_MEDIA_URL
-The url for protected media files from form file uploads. Defaults to '/protected/'
-
-### CODERED_PROTECTED_MEDIA_UPLOAD_WHITELIST
-The allowed filetypes for media upload in the form of a list of file type extensions. Default is blank. For example, to only allow documents and images: `['.pdf', '.doc', '.docx', '.txt', '.rtf', '.jpg', '.jpeg', '.png', '.gif']`
-
-### CODERED_PROTECTED_MEDIA_UPLOAD_BLACKLIST
-The disallowed filetypes for media upload in the form of a list of file type extensions. Defaults to `['.sh', '.exe', '.bat', '.app', '.jar', '.py', '.php']`
-
-### CODERED_FRONTEND_\*
-Various frontend settings to specify defaults and choices used in the wagtail admin related to rendering blocks, pages, and templates. By default, all CODERED_FRONTEND_\* settings are designed to work with Bootstrap 4 CSS framework, but these can be customized if using a different CSS framework or theme variant.
-
-
-
-## Developing and testing codered-cms
-To create a test project locally before committing your changes:
-
-1. Run `pip install -e ./` from the codered-cms directory. The -e flag makes the install editable, which is relevant when running makemigrations in test project to actually generate the migration files in the codered-cms pip package.
-
-2. Follow steps 3 through 5 in the quickstart above. Use "testproject" or "testapp" for your project name to ensure it is ignored by git.
-
-3. When making model or block changes whithin coderedcms, run `makemigrations coderedcms` in the test project to generate the relevant migration files for the pip package. ALWAYS follow steps 3 and 4 in the quickstart above with a fresh database before making migrations.
-
-4. When model or block changes affect the local test project (i.e. the "website" app), run `makemigrations website` in the test project to generate the relevant migration files locally. Apply and test the migrations. When satisfied, copy the new migration files to the `project_template/website/migrations/` directory.
-
-When making changes that are potentially destructive or backwards incompatible, increment the minor version number until coderedcms reaches a stable `1.0` release. Each production project that uses coderedcms should specify the appropriate version in its requirements.txt to prevent breakage.
-
-### Building pip packages
-To build a publicly consumable pip package, run:
-
-    python setup.py sdist bdist_wheel
-
-which will build a source distribution and a wheel in the `dist/` directory.
-
-
-### Additional Features
-
-#### Import/Export
-
-`wagtail-import-export` is included in the CMS.  You can find documentation for it [here](https://github.com/torchbox/wagtail-import-export).  In addition to the JSON import/export functionality that the package includes, we have added the ability to create pages by importing csv's.  In the csv each row will be a new page and each column header will correspond to an attribute of that page.  On the import csv page, you will select where you want the pages to live and what page type they should be created as.  A use case for this functionality would be if your site needs to add several hundred locations as pages.  These locations come from a csv dump from some report generating software.  Your csv could look something like this:
-```
-title       address         latitude    longitude
-Store 1     123 Street      20.909      -15.32
-Store 2     456 Avenue      34.223      87.2331
-...
-...
-```
-`title`, `address`, `latitude`, `longitude` are all fields on your Page model that you will be importing as.
-
-### Additional Page Types
-
-When you start a project, you will have a generated `models.py` file with some implementations of the CMS's base pages.  There exist additional base pages that we feel are useful, but not needed for most projects.  Below you can see basic, recommended implmentations of those base pages.
-
-#### Location
-```
-from django.utils.translation import ugettext_lazy as _
-from coderedcms.models import (
-    CoderedLocationIndexPage,
-    CoderedLocationPage,
-)
-
-class LocationPage(CoderedLocationPage):
-    """
-    A page that holds a location.  This could be a store, a restaurant, etc.
-    """
-    class Meta:
-        verbose_name = _('Location Page')
-
-    template = 'coderedcms/pages/location_page.html'
-
-    # Only allow LocationIndexPages above this page.
-    parent_page_types = ['website.LocationIndexPage']
-
-
-class LocationIndexPage(CoderedLocationIndexPage):
-    """
-    A page that holds a list of locations and displays them with a Google Map.
-    This does require a Google Maps API Key that can be defined in your 
-    wagtail settings.
-    """
-    class Meta:
-        verbose_name =_('Location Landing Page')
-
-    # Override to specify custom index ordering choice/default.
-    index_query_pagemodel = 'website.LocationPage'
-
-    # Only allow LocationPages beneath this page.
-    subpage_types = ['website.LocationPage']
-
-    template = 'coderedcms/pages/location_index_page.html'
-
-```

+ 7 - 5
README.md

@@ -8,7 +8,7 @@
 <p align="center">
   <a href="https://www.coderedcorp.com/cms/">Website</a>
   |
-  <a href="https://github.com/coderedcorp/coderedcms/blob/master/DOCS.md">Documentation</a>  
+  <a href="https://docs.coderedcorp.com/cms/">Documentation</a>
   |
   <a href="https://www.coderedcorp.com/blog/tag/django-wagtail/">Blog</a>
 </p>
@@ -23,13 +23,15 @@
 
 2. Run `coderedcms start mysite`
 
-3. Run `python manage.py migrate` to create the core models.
+3. Enter the project `cd mysite/`
 
-4. Run `python manage.py createsuperuser` to create the initial admin user.
+4. Run `python manage.py migrate` to create the core models.
 
-5. Run `python manage.py runserver` to launch the development server, and go to `http://localhost:8000` in your browser, or `http://localhost:8000/admin/` to log in with your admin account.
+5. Run `python manage.py createsuperuser` to create the initial admin user.
 
-See the [documentation](https://github.com/coderedcorp/coderedcms/blob/master/DOCS.md) for next steps and customizing your new site.
+6. Run `python manage.py runserver` to launch the development server, and go to `http://localhost:8000` in your browser, or `http://localhost:8000/admin/` to log in with your admin account.
+
+See the [documentation](https://docs.coderedcorp.com/cms/) for next steps and customizing your new site.
 
 
 

+ 19 - 0
docs/Makefile

@@ -0,0 +1,19 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+SOURCEDIR     = .
+BUILDDIR      = _build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

BIN
docs/_static/coderedcms_light.png


+ 237 - 0
docs/_static/docs.css

@@ -0,0 +1,237 @@
+body {
+    font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol",sans-serif;
+    line-height: 1.4em;
+}
+
+code, pre {
+    background-color:#f0f0f3;
+    font-family: SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
+    font-size: 0.85em;
+    line-height: unset;
+}
+
+div.body {
+    padding: 0 40px 40px 40px;
+    line-height: unset;
+    min-height: 100vh;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    border: none;
+    font-weight: 600;
+    margin: unset;
+    padding: 0;
+}
+div.body h1 {
+    font-weight: 300;
+    font-size: 2.5em;
+    padding-top: 1em;
+    margin-bottom: 1em;
+    line-height: 1;
+}
+div.body h2 {
+    font-size: 1.5em;
+}
+div.body h3 {
+    font-size: 1.2em;
+}
+
+div.body p,
+div.body dd,
+div.body li,
+div.body blockquote {
+    line-height: unset;
+    text-align: unset;
+}
+div.body li {
+    margin: 0.5em 0;
+}
+div.body li li {
+    margin: 0.1em 0;
+}
+
+div.bodywrapper {
+    background-color:#f0f0f3;
+    margin: 0 0 0 300px;
+}
+
+div.related {
+    line-height: unset;
+    padding: 20px 0;
+    border-bottom: 1px solid #ddd;
+}
+div.related ul {
+    padding: 0;
+}
+
+div.body li.nav-item {
+    margin-left: 0.5em;
+}
+div.body li.nav-item a {
+    margin-right: 0.5em;
+}
+
+div.related a,
+div.sphinxsidebar .toctree-l1 a,
+div.sphinxsidebar .topless a,
+div.prevnext a {
+    border-bottom: 3px solid transparent;
+    transition: 0.2s ease all;
+}
+div.related a:hover,
+div.sphinxsidebar .toctree-l1 a:hover,
+div.sphinxsidebar .topless a:hover,
+div.prevnext a:hover {
+    border-bottom: 3px solid #0aa;
+    text-decoration: none;
+    transition: 0.2s ease all;
+}
+
+div.logowrapper {
+    margin: -20px -20px 40px -20px;
+    padding: 20px;
+    background-color: #d33;
+    text-align: center;
+}
+
+p.logo {
+    padding: 10px 20px;
+}
+
+p.version {
+    margin: 0 0 10px 0;
+    font-size: 1rem;
+}
+
+code {
+    padding: 0.1em 0.5em;
+    border-radius: 4px;
+}
+
+pre {
+    padding: 15px;
+    border: none;
+    border-radius: 4px;
+    line-height: 1.2em;
+}
+
+a.headerlink {
+    color: #0aa;
+    margin-left: 0.3em;
+}
+a.headerlink:hover {
+    background-color: #0aa;
+    color: #fff;
+}
+
+div.sphinxsidebarwrapper {
+    padding: 0;
+}
+
+div.sphinxsidebar {
+    padding: 20px;
+}
+div.sphinxsidebar h3 {
+    margin-top: 40px;
+    font-size: 1.6em;
+    font-weight: 300;
+}
+div.sphinxsidebar input {
+    font-family: inherit;
+    border: none;
+}
+div.sphinxsidebar #searchbox input[type='text'] {
+    background-color: rgba(255,255,255,0.1);
+    color: #fff;
+    padding: 0.5em 0.8em;
+    transition: .2s ease all;
+}
+div.sphinxsidebar #searchbox input[type='text']:focus {
+    background-color: rgba(255,255,255,0.2);
+    transition: .2s ease all;
+}
+div.sphinxsidebar #searchbox input[type='text']::placeholder {
+    color: #fff;
+    opacity: .7;
+}
+div.sphinxsidebar #searchbox input[type='text']::-ms-input-placeholder {
+    color: #fff;
+    opacity: .7;
+}
+div.sphinxsidebar #searchbox input[type='submit'] {
+    background-color: rgba(255,255,255,0.3);
+    color: #fff;
+    padding: 0.5em 0.8em;
+    font-weight: 600;
+    transition: .2s ease all;
+}
+div.sphinxsidebar #searchbox input[type='submit']:hover,
+div.sphinxsidebar #searchbox input[type='submit']:focus {
+    background-color: #0aa;
+    transition: .2s ease all;
+}
+
+div.sphinxsidebar ul {
+    line-height: 1em;
+    margin: 0;
+}
+div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points {
+    list-style-type: disc;
+}
+div.sphinxsidebar ul ul li {
+    margin-top: 0.7em;
+    margin-bottom: 0.7em;
+}
+div.sphinxsidebar li.toctree-l1,
+div.sphinxsidebar p.topless {
+    margin: 1em 0;
+}
+div.sphinxsidebar li.toctree-l1.current > a,
+div.sphinxsidebar a.current.reference {
+    color: #fff;
+    font-weight: 600;
+}
+
+#other-versions a {
+    background-color: rgba(255,255,255,0.1);
+    border-radius: 4px;
+    font-weight: 600;
+    padding: 0.1em 0.5em;
+    margin: 0.25em;
+    transition: .2s ease all;
+}
+#other-versions a:hover {
+    background-color: rgba(255,255,255,0.2);
+    transition: .2s ease all;
+}
+
+div.prevnext {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 40px 0;
+    padding: 20px 0;
+}
+div.prevnext a {
+    color:#888;
+}
+div.prevnext .item.right {
+    float: right;
+    text-align: right;
+}
+div.prevnext .item.left {
+    float: left;
+    text-align: left;
+}
+
+div.footer {
+    font-size: 0.8em;
+}
+
+.clearfix {
+    clear: both;
+}

+ 27 - 0
docs/_static/versions.js

@@ -0,0 +1,27 @@
+vfile = '/cms/versions.txt';
+
+function setversions(data) {
+    data.split('\n').forEach((item, index) => {
+        if(item.trim() != '') {
+            newa = document.createElement('a', );
+            newa.setAttribute('href', '/cms/' + item + '/');
+            newa.innerHTML = item;
+            document.getElementById("other-versions").appendChild(newa);
+        }
+    });
+}
+
+$(document).ready(function() {
+    if(sessionStorage.getItem(vfile)) {
+        setversions(sessionStorage.getItem(vfile));
+    }
+    else {
+        $.ajax({
+            url: '/cms/versions.txt',
+            success: function(data) {
+                sessionStorage.setItem(vfile, data);
+                setversions(data);
+            }
+        });
+    }
+});

+ 11 - 0
docs/_templates/globaltoc.html

@@ -0,0 +1,11 @@
+{#
+    basic/globaltoc.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Sphinx sidebar template: global table of contents.
+
+    :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+#}
+<h3>{{ _('Table of Contents') }}</h3>
+{{ toctree() }}

+ 86 - 0
docs/_templates/layout.html

@@ -0,0 +1,86 @@
+{%- extends "basic/layout.html" %}
+
+{%- macro custom_relbar() %}
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>{{ _('Navigation') }}</h3>
+      <ul>
+        {%- block rootrellink %}
+        <li class="nav-item nav-item-0"><a href="{{ pathto(master_doc) }}">Docs</a>{{ reldelim1 }}</li>
+        {%- endblock %}
+        {%- for parent in parents %}
+          <li class="nav-item nav-item-{{ loop.index }}"><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
+        {%- endfor %}
+        <li class="nav-item">{{ title|striptags|e }}</li>
+        {%- block relbaritems %} {% endblock %}
+      </ul>
+    </div>
+{%- endmacro %}
+
+{%- macro custom_prevnext() %}
+<div class="prevnext">
+  {%- if prev %}
+  <div class="item left">
+    <a href="{{ prev.link|e }}">← {{ prev.title }}</a>
+  </div>
+  {%- endif %}
+  {%- if next %}
+  <div class="item right">
+    <a href="{{ next.link|e }}">{{ next.title }} →</a>
+  </div>
+  {%- endif %}
+  <div class="clearfix"></div>
+</div>
+{%- endmacro %}
+
+{%- block sidebarlogo %}
+<div class="logowrapper">
+  <p class="logo"><a href="{{ pathto(master_doc) }}" title="{{ project }}">
+    {%- if logo %}
+      <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="{{ project }}"/>
+    {%- else %}
+      <span>{{ project }}</span>
+    {%- endif %}
+  </a></p>
+  <p class="version">v {{release}}</p>
+</div>
+{%- endblock %}
+
+{%- block relbar1 %}{% endblock %}
+{%- block relbar2 %}{% endblock %}
+
+{%- block document %}
+  <div class="documentwrapper">
+  {%- if render_sidebar %}
+    <div class="bodywrapper">
+  {%- endif %}
+      <div class="body" role="main">
+
+        {{ custom_relbar() }}
+
+        {% block body %} {% endblock %}
+
+        {{ custom_prevnext() }}
+
+        <div class="footer" role="contentinfo">
+            {%- if show_copyright %}
+              {%- if hasdoc('copyright') %}
+                {% trans path=pathto('copyright'), copyright=copyright|e %}&#169; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+              {%- else %}
+                {% trans copyright=copyright|e %}&#169; Copyright {{ copyright }}.{% endtrans %}
+              {%- endif %}
+            {%- endif %}
+            {%- if last_updated %}
+              {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+            {%- endif %}
+            {%- if show_sphinx %}
+              {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a>.{% endtrans %}
+            {%- endif %}
+            </div>
+      </div>
+  {%- if render_sidebar %}
+    </div>
+  {%- endif %}
+  </div>
+{%- endblock %}
+
+{%- block footer %}{%- endblock %}

+ 19 - 0
docs/_templates/relations.html

@@ -0,0 +1,19 @@
+{#
+    basic/relations.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Sphinx sidebar template: relation links.
+
+    :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+#}
+{%- if prev %}
+  <h3>{{ _('Previous topic') }}</h3>
+  <p class="topless">← <a href="{{ prev.link|e }}"
+                        title="{{ _('previous chapter') }}">{{ prev.title }}</a></p>
+{%- endif %}
+{%- if next %}
+  <h3>{{ _('Next topic') }}</h3>
+  <p class="topless">→ <a href="{{ next.link|e }}"
+                        title="{{ _('next chapter') }}">{{ next.title }}</a></p>
+{%- endif %}

+ 22 - 0
docs/_templates/searchbox.html

@@ -0,0 +1,22 @@
+{#
+    basic/searchbox.html
+    ~~~~~~~~~~~~~~~~~~~~
+
+    Sphinx sidebar template: quick search box.
+
+    :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS.
+    :license: BSD, see LICENSE for details.
+#}
+{%- if pagename != "search" and builder != "singlehtml" %}
+<div id="searchbox" style="display: none" role="search">
+    <div class="searchformwrapper">
+    <form class="search" action="{{ pathto('search') }}" method="get">
+      <input type="text" name="q" placeholder="{{ _('Search the docs') }}" />
+      <input type="submit" value="{{ _('Go') }}" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    </div>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+{%- endif %}

+ 3 - 0
docs/_templates/versions.html

@@ -0,0 +1,3 @@
+<h3>Versions</h3>
+<p id="other-versions"></p>
+{{ js_tag('_static/versions.js') }}

+ 201 - 0
docs/conf.py

@@ -0,0 +1,201 @@
+# -*- coding: utf-8 -*-
+#
+# Configuration file for the Sphinx documentation builder.
+#
+# This file does only contain a selection of the most common options. For a
+# full list see the documentation:
+# http://www.sphinx-doc.org/en/master/config
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+from coderedcms import __shortversion__
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'CodeRed CMS'
+copyright = '2018, CodeRed LLC'
+author = 'CodeRed LLC'
+
+# The short X.Y version
+version = __shortversion__
+# The full version, including alpha/beta/rc tags
+release = __shortversion__
+
+
+# -- General configuration ---------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#
+# needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+#
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'default'
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'classic'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#
+html_theme_options = {
+    'sidebarwidth': '260px',
+    'bodyfont': 'initial',
+    'headfont': 'inherit',
+    'footerbgcolor': 'inherit',
+    'footertextcolor': '#888',
+    'sidebarbgcolor': '#001834',
+    'sidebartextcolor': 'rgba(255,255,255,0.7)',
+    'sidebarlinkcolor': 'rgba(255,255,255,0.7)',
+    'relbarbgcolor': 'inherit',
+    'relbartextcolor': '#888',
+    'relbarlinkcolor': '#888',
+    'bgcolor': '#fff',
+    'textcolor': '#000',
+    'linkcolor': '#0aa',
+    'visitedlinkcolor': '#0aa',
+    'headbgcolor': 'inherit',
+    'headtextcolor': 'inherit',
+}
+
+html_logo = '_static/coderedcms_light.png'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Custom sidebar templates, must be a dictionary that maps document names
+# to template names.
+#
+# The default sidebars (for documents that don't match any pattern) are
+# defined by theme itself.  Builtin themes are using these templates by
+# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
+# 'searchbox.html']``.
+#
+html_sidebars = { '**': ['searchbox.html', 'globaltoc.html', 'relations.html', 'versions.html'] }
+
+html_context = {
+    'css_files': ['_static/docs.css'],
+}
+
+html_last_updated_fmt = ''
+
+
+# -- Options for HTMLHelp output ---------------------------------------------
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'CodeRedCMSdoc'
+
+
+# -- Options for LaTeX output ------------------------------------------------
+
+latex_elements = {
+    # The paper size ('letterpaper' or 'a4paper').
+    #
+    # 'papersize': 'letterpaper',
+
+    # The font size ('10pt', '11pt' or '12pt').
+    #
+    # 'pointsize': '10pt',
+
+    # Additional stuff for the LaTeX preamble.
+    #
+    # 'preamble': '',
+
+    # Latex figure (float) alignment
+    #
+    # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+latex_documents = [
+    (master_doc, 'CodeRedCMS.tex', 'CodeRed CMS Documentation',
+     'CodeRed LLC', 'manual'),
+]
+
+
+# -- Options for manual page output ------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'coderedcms', 'CodeRed CMS Documentation',
+     [author], 1)
+]
+
+
+# -- Options for Texinfo output ----------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (master_doc, 'CodeRedCMS', 'CodeRed CMS Documentation',
+     author, 'CodeRedCMS', 'One line description of project.',
+     'Miscellaneous'),
+]
+
+
+# -- Options for Epub output -------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = project
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#
+# epub_identifier = ''
+
+# A unique identification for the text.
+#
+# epub_uid = ''
+
+# A list of files that should not be packed into the epub file.
+epub_exclude_files = ['search.html']

+ 69 - 0
docs/contributing/index.rst

@@ -0,0 +1,69 @@
+Contributing
+============
+
+Developing and testing coderedcms
+---------------------------------
+To create a test project locally before committing your changes:
+
+#. Run ``pip install -e ./[dev]`` from the coderedcms directory. The -e flag makes the install editable,
+   which is relevant when running makemigrations in test project to actually generate the migration
+   files in the coderedcms pip package. The ``[dev]`` installs extras such as sphinx for generating docs.
+#. Follow steps 4 through 6 in :doc:`/getting_started/index`. Use "testproject" or "testapp" for
+   your project name to ensure it is ignored by git.
+#. When making model or block changes within coderedcms, run ``makemigrations coderedcms`` in the
+   test project to generate the relevant migration files for the pip package. ALWAYS follow steps
+   4 and 5 in :doc:`/getting_started/index` with a fresh database before making migrations.
+#. When model or block changes affect the local test project (i.e. the "website" app), run
+   ``makemigrations website`` in the test project to generate the relevant migration files locally.
+   Apply and test the migrations. When satisfied, copy the new migration files to the
+   ``project_template/website/migrations/`` directory.
+
+When making changes that are potentially destructive or backwards incompatible, increment the minor
+version number until coderedcms reaches a stable 1.0 release. Each production project that uses
+coderedcms should specify the appropriate version in its requirements.txt to prevent breakage.
+
+Contributor guidelines
+----------------------
+
+We are happy to accept pull requests from the community if it aligns with our vision for coderedcms.
+When created a pull request, please make sure you include the following:
+
+* A description in the pull request of what this change does and how it works.
+* Reference to an issue if the change is related to one of the issues on our github page.
+* Documentation updates describing your change.
+
+Following submission of your pull request, a CodeRed member will review and test your change.
+
+**All changes, even by CodeRed members, must go through a pull request process to ensure quality.**
+
+Building pip packages
+---------------------
+
+To build a publicly consumable pip package and upload to pypi, run::
+
+    python setup.py sdist bdist_wheel
+    twine upload dist/*
+
+Building & publishing documentation
+-----------------------------------
+
+For every code or feature change, be sure to update the docs in the repository. To build and publish
+the documentation run::
+
+    cd docs/
+    make clean
+    make html
+
+Output will be in ``docs/_build/html/`` directory. To publish:
+
+* If updating docs for an existing minor version release:
+    #. Copy the contents of ``docs/_build/html/`` to the CodeRed docs server under the existing version directory.
+
+* If this is a new major or minor version release:
+    #. Create a new major.minor directory on the CodeRed docs server.
+    #. Update the ``.htaccess`` file to point to the new version directory.
+    #. Add the new version to the ``versions.txt`` file on the docs server.
+    #. Copy the contents of ``docs/_build/html`` to the CodeRed docs server under the new version directory.
+
+Note that we do not release separate documentation for maintenance releases. Just update the existing minor
+version docs if there are any maintenance release doc changes.

+ 22 - 0
docs/features/import_export.rst

@@ -0,0 +1,22 @@
+Import/Export
+=============
+
+``wagtail-import-export`` is included in the CMS. You can find documentation for it
+`here <https://github.com/torchbox/wagtail-import-export>`_.  In addition to the JSON
+import/export functionality that the package includes, we have added the ability to create
+pages by importing CSV files.
+
+In the CSV each row will be a new page and each column header will correspond to an attribute
+of that page. On the import CSV page, you will select where you want the pages to live and what
+page type they should be created as. A use case for this functionality would be if your site needs
+to add several hundred locations as pages. These locations come from a CSV dump from some report
+generating software. Your CSV could look something like this::
+
+    title       address         latitude    longitude
+    Store 1     123 Street      20.909      -15.32
+    Store 2     456 Avenue      34.223      87.2331
+    ...
+    ...
+
+``title``, ``address``, ``latitude``, ``longitude`` are all fields on your Page model that you will
+be importing as.

+ 8 - 0
docs/features/index.rst

@@ -0,0 +1,8 @@
+Features
+========
+
+.. toctree::
+    :maxdepth: 1
+
+    import_export
+    store_locator

+ 46 - 0
docs/features/store_locator.rst

@@ -0,0 +1,46 @@
+Store Locator
+=============
+
+The store locator provides pages for individual locations. These could be stores, distributors,
+facilities, etc. An index page aggregates these location pages using an interactive Google Map.
+
+The store locator is built-in to CodeRed CMS but is not enabled by default. To implement, add
+the following to your ``website/models.py``::
+
+    from coderedcms.models import CoderedLocationIndexPage, CoderedLocationPage
+
+
+    class LocationPage(CoderedLocationPage):
+        """
+        A page that holds a location.  This could be a store, a restaurant, etc.
+        """
+        class Meta:
+            verbose_name = 'Location Page'
+
+        template = 'coderedcms/pages/location_page.html'
+
+        # Only allow LocationIndexPages above this page.
+        parent_page_types = ['website.LocationIndexPage']
+
+
+    class LocationIndexPage(CoderedLocationIndexPage):
+        """
+        A page that holds a list of locations and displays them with a Google Map.
+        This does require a Google Maps API Key that can be defined in Settings > Google API Settings
+        """
+        class Meta:
+            verbose_name = 'Location Landing Page'
+
+        # Override to specify custom index ordering choice/default.
+        index_query_pagemodel = 'website.LocationPage'
+
+        # Only allow LocationPages beneath this page.
+        subpage_types = ['website.LocationPage']
+
+        template = 'coderedcms/pages/location_index_page.html'
+
+Next run ``python manage.py makemigrations`` and ``python manage.py migrate`` to create the new pages
+in your project.
+
+Now when going to the wagtail admin, you can create a Location Index Page, and child Location Pages.
+Also be sure to add a Google Maps API key under Settings > Google API Settings.

+ 54 - 0
docs/getting_started/customize_design.rst

@@ -0,0 +1,54 @@
+Customize the design of your website
+====================================
+
+After installation, you are greeted by a barebones website.
+There are a few settings you will want to change to add your own branding.
+
+Site name
+---------
+
+This is shown by default in the navbar, and also added to the title attribute of each page.
+This can be changed in Settings > Sites > localhost. Hostname and port only need to be changed
+when running in  production.
+
+Site settings
+-------------
+
+Under Settings > Sites in the Wagtail Admin, you will want to make sure this setting is up
+to date with the proper Hostname and Port. Failure to do so can cause the Preview button on
+pages to return a 500 error.
+
+Logo & icon
+-----------
+
+The logo that appears in the navbar, the wagtail admin, and your favicon can be set in
+Settings > Layout. Here you can also change navbar settings (based on Bootstrap CSS framework).
+
+Menu / navigation bars
+----------------------
+
+Navbars are top navigation elements that create a "main menu" experience. Navbars are managed
+as snippets. They render from top down based on the order they were created in.
+
+Footers
+-------
+
+Similar to Navbars, footers are also managed as snippets and also render top down based on
+the order they were created in.
+
+Custom CSS
+----------
+
+A django app called ``website`` has been created to hold your custom changes. In website/static/
+there are custom.css and custom.js files that get loaded on every page by default. Adding
+anything to these files will automatically populate on the site and override any default styles.
+By default, Bootstrap 4 and jQuery are already included on the site.
+
+Custom HTML templates
+---------------------
+
+The templates directory inside the ``website`` app is empty by default. Any templates you put
+in here will override the default coderedcms templates if they follow the same name and directory
+structure. This uses the standard Django template rendering engine. For example, to change the
+formatting of the article page, copy ``coderedcms/templates/coderedcms/pages/article_page.html``
+to ``website/templates/coderedcms/pages/article_page.html`` and modify it.

+ 33 - 0
docs/getting_started/customize_develop.rst

@@ -0,0 +1,33 @@
+Developing your website
+=======================
+
+Page models
+-------------
+
+The django app ``website`` has been created with default models based on pre-built abstract
+CodeRed CMS models. You can use these as-is, override existing fields and function, and add
+custom fields to these models. After making a change to any of these models, be sure to run
+``python manage.py makemigrations`` and ``python manage.py migrate`` to apply the database changes.
+
+Hooks
+-----
+
+Building on the concept of wagtail hooks, there are some additional hooks in CodeRed CMS
+
+is_request_cacheable
+^^^^^^^^^^^^^^^^^^^^
+
+The callable passed into this hook should take a ``request`` argument, and return a ``bool``
+indicating whether or not the response to this request should be cached (served from the
+cache if it is already cached). Not returning, or returning anything other than a bool will
+not affect the caching decision. For example::
+
+    from wagtail.core import hooks
+
+    @hooks.register('is_request_cacheable')
+    def nocache_in_query(request):
+        # if the querystring contains a "nocache" key, return False to forcibly not cache.
+        # otherwise, do not return to let the CMS decide how to cache.
+        if 'nocache' in request.GET:
+            return False
+

+ 48 - 0
docs/getting_started/django_settings.rst

@@ -0,0 +1,48 @@
+CodeRed CMS Django Settings
+===========================
+
+Default settings are loaded from ``coderedcms/settings.py``. Available settings for CodeRed CMS:
+
+CODERED_CACHE_PAGES
+-------------------
+
+Boolean on whether or not to load the page caching machinery and enable cache settings in the
+wagtail admin.
+
+CODERED_CACHE_BACKEND
+---------------------
+
+The name of the Django cache backend to use for CodeRed CMS. Defaults to ``'default'`` which is
+required by Django when using the cache.
+
+CODERED_PROTECTED_MEDIA_ROOT
+----------------------------
+
+The directory where files from File Upload fields on Form Pages are saved. These files are
+served through Django using ``CODERED_PROTECTED_MEDIA_URL`` and require login to access.
+Defaults to ``protected/`` in your project directory.
+
+CODERED_PROTECTED_MEDIA_URL
+---------------------------
+The URL for protected media files from form file uploads. Defaults to ``'/protected/'``
+
+CODERED_PROTECTED_MEDIA_UPLOAD_WHITELIST
+----------------------------------------
+
+The allowed filetypes for media upload in the form of a list of file type extensions.
+Default is blank. For example, to only allow documents and images, set to:
+``['.pdf', '.doc', '.docx', '.txt', '.rtf', '.jpg', '.jpeg', '.png', '.gif']``
+
+CODERED_PROTECTED_MEDIA_UPLOAD_BLACKLIST
+----------------------------------------
+
+The disallowed filetypes for media upload in the form of a list of file type extensions.
+Defaults to ``['.sh', '.exe', '.bat', '.ps1', '.app', '.jar', '.py', '.php', '.pl', '.rb']``
+
+CODERED_FRONTEND_*
+------------------
+
+Various frontend settings to specify defaults and choices used in the wagtail admin related
+to rendering blocks, pages, and templates. By default, all CODERED_FRONTEND_* settings are
+designed to work with Bootstrap 4 CSS framework, but these can be customized if using a
+different CSS framework or theme variant.

+ 11 - 0
docs/getting_started/index.rst

@@ -0,0 +1,11 @@
+Getting Started
+===============
+
+.. toctree::
+    :maxdepth: 1
+
+    install
+    customize_design
+    customize_develop
+    searching
+    django_settings

+ 13 - 0
docs/getting_started/install.rst

@@ -0,0 +1,13 @@
+Installation
+============
+
+#. Run ``pip install coderedcms``
+#. Run ``coderedcms start mysite``
+#. Enter the mysite project with ``cd mysite/``.
+#. Run ``python manage.py migrate`` to create the core models.
+#. Run ``python manage.py createsuperuser`` to create the initial admin user.
+#. Run ``python manage.py runserver`` to launch the development server, and go to
+   http://localhost:8000 in your browser, or http://localhost:8000/admin/ to log in
+   with your admin account.
+
+You now have CodeRed CMS up and running. Next, :doc:`customize_design`

+ 66 - 0
docs/getting_started/searching.rst

@@ -0,0 +1,66 @@
+Searching
+=========
+
+A search page is available by default at the ``/search/`` URL, which can be customized in the
+``urls.py`` file in your project. To enable a search bar in the navigation bar, check
+Settings > Layout > Search box. Search results are paginated; to specify the number of results
+per page, edit the value in Settings > General > Search Settings.
+
+Search result formatting
+------------------------
+
+Each search result is rendered using the template at ``coderedcms/pages/search_result.html``.
+The template can be overridden per model with the ``search_template`` attribute.
+
+Search result filtering
+-----------------------
+
+To enable additional filtering by page type, add ``search_filterable = True`` to the page model.
+The ``search_name`` and ``search_name_plural`` fields are then used to display the labels for
+these filters (defaults to ``verbose_name`` and ``verbose_name_plural`` if not specified).
+For example, to enable search filtering by Blog or by Products in addition to All Results::
+
+    class BlogPage(CoderedArticlePage):
+        search_filterable = True
+        search_name = 'Blog Post'
+        search_name_plural = 'Blog'
+
+    class Product(CoderedWebPage):
+        search_filterable = True
+        search_name = 'Product'
+        search_name_plural = 'Products'
+
+Would enable the following filter options on the search page: All Results, Blog, Products.
+
+Search fields
+-------------
+
+If using the Wagtail DatabaseSearch backend (default), only page Title and Search Description
+fields are searched upon. This is due to a limitation in the DatabaseSearch backend;
+other backends such as PostgreSQL and Elasticsearch will search on additional specific fields
+such as body, article captions, etc. To enable more specific searching while still using the
+database backend, the specific models can be flagged for inclusion in search by setting
+``search_db_include = True`` on the page model. Note that this must be set on every type of page
+model you wish to include in search. When setting this flag, search is performed independently on
+each page type, and the results are combined. So you may want to also specify ``search_db_boost`` (int)
+to control the order in which the pages are searched. Pages with a higher ``search_db_boost``
+are searched first, and results are shown higher in the list. For example::
+
+    class Article(CoderedArticlePage):
+        search_db_include = True
+        search_db_boost = 10
+        ...
+
+    class WebPage(CoderedWebPage):
+        search_db_include = True
+        search_db_boost = 9
+        ...
+
+    class FormPage(CoderedFormPage):
+        ...
+
+In this example, Article search results will be shown before WebPage results when using the
+DatabaseSearch backend. FormPage results will not be shown at all, due to the absence
+``search_db_include``. If no models have ``search_db_include = True``, All CoderedPages
+will be searched by title and description. When using any search backend other than database,
+``search_db_*`` variables are ignored.

+ 26 - 0
docs/index.rst

@@ -0,0 +1,26 @@
+CodeRed CMS Documentation
+=======================================
+
+`Official website <https://www.coderedcorp.com/cms/>`_ | `Source code on GitHub <https://github.com/coderedcorp/coderedcms>`_
+
+CodeRed CMS is a fully featured content management system for building marketing websites.
+It aims to be general purpose and ready to use out of the box as a more professional and performant
+alternative to WordPress.
+
+Written in Python, and heavily based on `Wagtail <https://wagtail.io>`_,
+it is extremely quick and easy to customize the website's design due to a responsive grid-based
+editing interface and a pure Bootstrap 4 front-end. Features needed by marketing teams are also
+built-in including proper SEO tagging, Google Analytics tracking, and publishing tools.
+
+
+Index
+-----
+
+.. toctree::
+   :maxdepth: 2
+   :titlesonly:
+
+   getting_started/index
+   features/index
+   contributing/index
+   releases/index

+ 35 - 0
docs/make.bat

@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+	echo.
+	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+	echo.installed, then set the SPHINXBUILD environment variable to point
+	echo.to the full path of the 'sphinx-build' executable. Alternatively you
+	echo.may add the Sphinx directory to PATH.
+	echo.
+	echo.If you don't have Sphinx installed, grab it from
+	echo.http://sphinx-doc.org/
+	exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
+
+:end
+popd

+ 9 - 0
docs/releases/index.rst

@@ -0,0 +1,9 @@
+Release Notes
+=============
+
+.. toctree::
+    :maxdepth: 1
+
+    v0.10.0
+    v0.9.1
+    v0.9.0

+ 13 - 0
docs/releases/v0.10.0.rst

@@ -0,0 +1,13 @@
+CodeRed CMS 0.10.0 release notes
+================================
+
+New features:
+
+* Updated to Wagtail 2.3.
+* Added support for Django 2.1. Supports Django 1.11 through 2.1.
+* Added new template blocks in ``base.html`` for easier extending.
+* NEW documentation! Available at https://docs.coderedcorp.com/cms/.
+
+Maintenance:
+
+* Replace Wagtail version in admin with CodeRed CMS version.

+ 15 - 0
docs/releases/v0.9.0.rst

@@ -0,0 +1,15 @@
+CodeRed CMS 0.9.0 release notes
+===============================
+
+New Features:
+
+* NEW Store Locator feature powered by Google Maps. See :doc:`/features/store_locator`.
+* NEW import export functionality. Import or export existing pages as JSON. Import new pages from CSV files. See :doc:`/features/import_export`.
+* Replaced Google Analytics with Google Tag Manager.
+* Added additional blocks to WebPage HTML template to ease template extending.
+
+Maintenance:
+
+* Updated Bootstrap to 4.1.3.
+* Added additional trove classifiers.
+* Updated readme and documentation.

+ 6 - 0
docs/releases/v0.9.1.rst

@@ -0,0 +1,6 @@
+CodeRed CMS 0.9.1 release notes
+===============================
+
+Bug Fixes:
+
+* Moved Google Tag Manager tracking code to <head> per Google documentation.

+ 5 - 0
setup.py

@@ -48,6 +48,11 @@ setup(
         'geocoder>=1.38.1,<2.0',
         'wagtail-import-export>=0.1,<0.2'
     ],
+    extras_require={
+        'dev': [
+            'sphinx',
+        ]
+    },
     entry_points="""
             [console_scripts]
             coderedcms=coderedcms.bin.coderedcms:main