From cd6821a31af3debb3972cf41f49ac34c9c46b6fc Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Thu, 28 Dec 2023 13:38:59 +0100 Subject: [PATCH] Add explanation for publishing workflow. Format uniformly. --- user-guide/requirements.in | 1 + user-guide/requirements.txt | 148 ++++++++------ .../{alias-note.rst => alias-note.include} | 0 user-guide/source/explanation/aliases.rst | 39 ++-- user-guide/source/explanation/index.rst | 7 +- .../source/explanation/placeholders.rst | 29 ++- user-guide/source/explanation/plugins.rst | 34 +++- user-guide/source/explanation/publishing.rst | 64 +++++- .../explanation/structure-content-modes.rst | 42 ++-- user-guide/source/explanation/touch.rst | 134 ++++++------- .../source/explanation/version-locking.rst | 4 - user-guide/source/how-to/index.rst | 4 +- user-guide/source/how-to/media-files.rst | 34 ++-- user-guide/source/how-to/pages.rst | 53 +++-- user-guide/source/how-to/redirects.rst | 46 +++-- user-guide/source/how-to/versions.rst | 64 +++--- user-guide/source/index.rst | 43 ++-- user-guide/source/reference/index.rst | 3 +- user-guide/source/reference/plugins.rst | 83 ++++---- user-guide/source/tutorial/01-login.rst | 24 ++- user-guide/source/tutorial/02-toolbar.rst | 189 +++++++++++------- user-guide/source/tutorial/03-sidebar.rst | 18 +- user-guide/source/tutorial/04-filer.rst | 33 +-- user-guide/source/tutorial/05-pagetree.rst | 112 +++++++---- user-guide/source/tutorial/06-content.rst | 103 +++++++--- user-guide/source/tutorial/07-plugins.rst | 123 +++++++----- user-guide/source/tutorial/08-publishing.rst | 99 +++++---- .../tutorial/images/08-version-states.png | Bin 0 -> 51889 bytes user-guide/source/tutorial/index.rst | 23 ++- 29 files changed, 962 insertions(+), 594 deletions(-) rename user-guide/source/{alias-note.rst => alias-note.include} (100%) delete mode 100644 user-guide/source/explanation/version-locking.rst create mode 100644 user-guide/source/tutorial/images/08-version-states.png diff --git a/user-guide/requirements.in b/user-guide/requirements.in index 210d535..e9a124a 100644 --- a/user-guide/requirements.in +++ b/user-guide/requirements.in @@ -13,3 +13,4 @@ django~=4.2 git+https://github.com/django-cms/django-cms@release/4.1.x codespell pip-tools +docstrfmt diff --git a/user-guide/requirements.txt b/user-guide/requirements.txt index e20e6a7..7420c80 100644 --- a/user-guide/requirements.txt +++ b/user-guide/requirements.txt @@ -1,34 +1,39 @@ # -# This file is autogenerated by pip-compile with python 3.10 -# To update, run: +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: # -# pip-compile +# pip-compile --output-file=requirements.txt requirements.in # -alabaster==0.7.12 +alabaster==0.7.13 # via sphinx -asgiref==3.5.2 +asgiref==3.7.2 # via django -babel==2.11.0 +babel==2.14.0 # via sphinx -beautifulsoup4==4.11.1 +beautifulsoup4==4.12.2 # via furo -build==0.9.0 +black==23.12.1 + # via docstrfmt +build==1.0.3 # via pip-tools -certifi==2022.12.7 +certifi==2023.11.17 # via requests -charset-normalizer==2.1.1 +charset-normalizer==3.3.2 # via requests -click==8.1.3 - # via pip-tools -codespell==2.2.2 +click==8.1.7 + # via + # black + # docstrfmt + # pip-tools +codespell==2.2.6 # via -r requirements.in colorama==0.4.6 # via sphinx-autobuild -coverage==6.5.0 +coverage==7.4.0 # via -r requirements.in -datetime==4.7 +datetime==5.4 # via -r requirements.in -django==3.2.16 +django==4.2.8 # via # -r requirements.in # django-classy-tags @@ -36,109 +41,140 @@ django==3.2.16 # django-formtools # django-sekizai # django-treebeard -django-classy-tags==3.0.1 + # djangocms-admin-style +django-classy-tags==4.1.0 # via # django-cms # django-sekizai -django-cms @ git+https://github.com/django-cms/django-cms@develop-4 +django-cms @ git+https://github.com/django-cms/django-cms@release/4.1.x # via -r requirements.in -django-formtools==2.4 +django-formtools==2.5.1 # via django-cms -django-sekizai==3.0.1 +django-sekizai==4.1.0 # via django-cms -django-treebeard==4.5.1 +django-treebeard==4.7 # via django-cms -djangocms-admin-style==3.2.0 +djangocms-admin-style==3.2.6 # via django-cms -docutils==0.19 - # via sphinx -furo==2022.12.7 +docstrfmt==1.6.1 # via -r requirements.in -idna==3.4 +docutils==0.20.1 + # via + # docstrfmt + # sphinx +furo==2023.9.10 + # via -r requirements.in +idna==3.6 # via requests imagesize==1.4.1 # via sphinx jinja2==3.1.2 # via sphinx +libcst==1.1.0 + # via docstrfmt livereload==2.6.3 # via sphinx-autobuild -markupsafe==2.1.1 +markupsafe==2.1.3 # via # -r requirements.in # jinja2 -packaging==21.3 +mypy-extensions==1.0.0 + # via + # black + # typing-inspect +packaging==23.2 # via + # black # build # django-cms # sphinx -pep517==0.13.0 - # via build -pip-tools==6.9.0 +pathspec==0.12.1 + # via black +pip-tools==7.3.0 # via -r requirements.in +platformdirs==4.1.0 + # via + # black + # docstrfmt pyenchant==3.2.2 # via # -r requirements.in # sphinxcontrib-spelling -pygments==2.13.0 +pygments==2.17.2 # via # -r requirements.in # furo # sphinx -pyparsing==3.0.9 - # via packaging -pytz==2022.6 - # via - # babel - # datetime - # django -requests==2.28.1 +pyproject-hooks==1.0.0 + # via build +pytz==2023.3.post1 + # via datetime +pyyaml==6.0.1 + # via libcst +requests==2.31.0 # via sphinx six==1.16.0 # via livereload snowballstemmer==2.2.0 # via sphinx -soupsieve==2.3.2.post1 +soupsieve==2.5 # via beautifulsoup4 -sphinx==5.3.0 +sphinx==7.2.6 # via # -r requirements.in + # docstrfmt # furo # sphinx-autobuild # sphinx-basic-ng # sphinx-copybutton + # sphinxcontrib-applehelp + # sphinxcontrib-devhelp + # sphinxcontrib-htmlhelp + # sphinxcontrib-qthelp + # sphinxcontrib-serializinghtml # sphinxcontrib-spelling # sphinxext-opengraph sphinx-autobuild==2021.3.14 # via -r requirements.in -sphinx-basic-ng==1.0.0b1 +sphinx-basic-ng==1.0.0b2 # via furo -sphinx-copybutton==0.5.1 +sphinx-copybutton==0.5.2 # via -r requirements.in -sphinxcontrib-applehelp==1.0.2 +sphinxcontrib-applehelp==1.0.7 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==1.0.5 # via sphinx -sphinxcontrib-htmlhelp==2.0.0 +sphinxcontrib-htmlhelp==2.0.4 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==1.0.6 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==1.1.9 # via sphinx -sphinxcontrib-spelling==7.6.2 +sphinxcontrib-spelling==8.0.0 # via -r requirements.in -sphinxext-opengraph==0.7.5 +sphinxext-opengraph==0.9.1 # via -r requirements.in -sqlparse==0.4.3 +sqlparse==0.4.4 # via django -tornado==6.2 +tabulate==0.9.0 + # via docstrfmt +toml==0.10.2 + # via docstrfmt +tornado==6.4 # via livereload -urllib3==1.26.12 +typing-extensions==4.9.0 + # via + # libcst + # typing-inspect +typing-inspect==0.9.0 + # via libcst +urllib3==2.1.0 # via requests -wheel==0.38.3 +wheel==0.42.0 # via pip-tools -zope-interface==5.5.1 +zope-interface==6.1 # via datetime # The following packages are considered to be unsafe in a requirements file: diff --git a/user-guide/source/alias-note.rst b/user-guide/source/alias-note.include similarity index 100% rename from user-guide/source/alias-note.rst rename to user-guide/source/alias-note.include diff --git a/user-guide/source/explanation/aliases.rst b/user-guide/source/explanation/aliases.rst index 7f6b7c7..02d0289 100644 --- a/user-guide/source/explanation/aliases.rst +++ b/user-guide/source/explanation/aliases.rst @@ -1,21 +1,30 @@ Aliases -####### +======= -.. include:: ../alias-note.rst +.. include:: ../alias-note.include - -In Django CMS, the Alias plugin is a powerful tool that enables content editors to display in as many places as they like without duplicating it. Essentially, it creates a reference or link to content that resides in a separate place - called an "Alias". +In Django CMS, the Alias plugin is a powerful tool that enables content editors to +display in as many places as they like without duplicating it. Essentially, it creates a +reference or link to content that resides in a separate place - called an "Alias". Key aspects of the Alias plugin include: -1. **Content Replication:** Rather than copying content, the alias content is referenced either in a page template or by using the Alias plugin. - -2. **Cross-Page Content Sharing:** It facilitates sharing content across different pages within the site. For instance, if there's a section that needs to appear in multiple places but should have consistent content, the aliases can be employed to achieve this. - -3. **Maintaining Consistency:** Using aliases ensures consistency in content across various parts of the website. If the original content gets updated, all aliases referencing it will reflect those changes instantly. - -4. **Saves Effort and Reduces Errors:** Instead of manually replicating content across multiple pages (which could lead to discrepancies or errors), the Alias plugin streamlines the process and reduces the chance of inconsistencies. - -5. **Ease of Management:** Content editors can manage content in one place while displaying it in multiple locations, making it easier to maintain and update information without having to navigate through numerous pages. - -In essence, aliases in Django CMS serves as a smart reference system, allowing content editors to reuse existing content across the site while maintaining consistency and efficiency in content management. +1. **Content Replication:** Rather than copying content, the alias content is referenced + either in a page template or by using the Alias plugin. +2. **Cross-Page Content Sharing:** It facilitates sharing content across different pages + within the site. For instance, if there's a section that needs to appear in multiple + places but should have consistent content, the aliases can be employed to achieve + this. +3. **Maintaining Consistency:** Using aliases ensures consistency in content across + various parts of the website. If the original content gets updated, all aliases + referencing it will reflect those changes instantly. +4. **Saves Effort and Reduces Errors:** Instead of manually replicating content across + multiple pages (which could lead to discrepancies or errors), the Alias plugin + streamlines the process and reduces the chance of inconsistencies. +5. **Ease of Management:** Content editors can manage content in one place while + displaying it in multiple locations, making it easier to maintain and update + information without having to navigate through numerous pages. + +In essence, aliases in Django CMS serves as a smart reference system, allowing content +editors to reuse existing content across the site while maintaining consistency and +efficiency in content management. diff --git a/user-guide/source/explanation/index.rst b/user-guide/source/explanation/index.rst index 1d38408..f017e85 100644 --- a/user-guide/source/explanation/index.rst +++ b/user-guide/source/explanation/index.rst @@ -1,12 +1,12 @@ .. _user-explanation: -######## Concepts -######## +======== .. include:: ../contribute-note.include -django CMS uses some specific concepts. This section explains those concepts from a content editor perspective. +django CMS uses some specific concepts. This section explains those concepts from a +content editor perspective. .. toctree:: :maxdepth: 1 @@ -14,7 +14,6 @@ django CMS uses some specific concepts. This section explains those concepts fro placeholders plugins publishing - version-locking aliases structure-content-modes touch diff --git a/user-guide/source/explanation/placeholders.rst b/user-guide/source/explanation/placeholders.rst index b5b8746..c386294 100644 --- a/user-guide/source/explanation/placeholders.rst +++ b/user-guide/source/explanation/placeholders.rst @@ -1,12 +1,29 @@ Placeholders -############ +============ -In Django CMS, placeholders are special markers within templates that define regions where content can be edited and managed by content editors. These placeholders act as slots or containers within a template where various types of content can be added, modified, and rearranged through django CMS' frontend editor and its structure board. +In Django CMS, placeholders are special markers within templates that define regions +where content can be edited and managed by content editors. These placeholders act as +slots or containers within a template where various types of content can be added, +modified, and rearranged through django CMS' frontend editor and its structure board. Here's how placeholders work: -1. **Defined Areas in a page:** Designers identify specific areas within their HTML templates where content can be dynamically inserted. Editors can access these defined placeholders and add or edit content directly through the user-friendly frontend editing interface without needing to touch the underlying code. Pages can be rendered using different templates. -2. **Content Manipulation:** Editors interact with placeholders to add various types of content elements or plugins (such as text, images, videos, forms, etc.) to these designated areas. They can modify existing content, rearrange elements, or remove content as needed. -3. **Flexibility and Customization:** Django CMS allows for the creation of custom plugins that can be inserted into placeholders. These plugins offer a wide range of functionalities and content types, giving content editors the flexibility to create diverse and engaging web pages without requiring developer intervention for each content update. +1. **Defined Areas in a page:** Designers identify specific areas within their HTML + templates where content can be dynamically inserted. Editors can access these defined + placeholders and add or edit content directly through the user-friendly frontend + editing interface without needing to touch the underlying code. Pages can be rendered + using different templates. +2. **Content Manipulation:** Editors interact with placeholders to add various types of + content elements or plugins (such as text, images, videos, forms, etc.) to these + designated areas. They can modify existing content, rearrange elements, or remove + content as needed. +3. **Flexibility and Customization:** Django CMS allows for the creation of custom + plugins that can be inserted into placeholders. These plugins offer a wide range of + functionalities and content types, giving content editors the flexibility to create + diverse and engaging web pages without requiring developer intervention for each + content update. -Ultimately, placeholders in Django CMS facilitate a clear separation between the presentation layer (templates) and the content, enabling content editors to manage and update website content easily without needing extensive technical knowledge or modifying the underlying code. +Ultimately, placeholders in Django CMS facilitate a clear separation between the +presentation layer (templates) and the content, enabling content editors to manage and +update website content easily without needing extensive technical knowledge or modifying +the underlying code. diff --git a/user-guide/source/explanation/plugins.rst b/user-guide/source/explanation/plugins.rst index 968e59d..64461ec 100644 --- a/user-guide/source/explanation/plugins.rst +++ b/user-guide/source/explanation/plugins.rst @@ -1,14 +1,30 @@ Plugins -####### +======= -Django CMS plugins are modular components that represent content. In Django CMS, content components are organized into placeholders within templates. These placeholders can be filled with various plugins to add diverse content components. +Django CMS plugins are modular components that represent content. In Django CMS, content +components are organized into placeholders within templates. These placeholders can be +filled with various plugins to add diverse content components. -Django CMS plugins offer content editors an intuitive way to manage and enrich the content of web pages without needing technical expertise or diving into code. Here's how they benefit content editors: +Django CMS plugins offer content editors an intuitive way to manage and enrich the +content of web pages without needing technical expertise or diving into code. Here's how +they benefit content editors: -1. **Ease of Use:** Content editors can work inside the frontend editor and use the structure board, where they can see available placeholders on a page. They can easily add, edit, or remove content elements (plugins) within these placeholders using a simple drag-and-drop interface or form-based interactions. +1. **Ease of Use:** Content editors can work inside the frontend editor and use the + structure board, where they can see available placeholders on a page. They can easily + add, edit, or remove content elements (plugins) within these placeholders using a + simple drag-and-drop interface or form-based interactions. +2. **Content Variety:** Plugins provide a wide range of content types that can be + inserted into placeholders, such as text, images, videos, galleries, sliders, forms, + maps, and more. This variety enables editors to create rich and diverse web pages + without relying on developers for every content update. +3. **Customization:** While there's a set of default plugins available, each + installation has its own set of plugins activated and might also use custom plugins + tailored to specific needs. These custom plugins can encapsulate complex + functionalities or unique design elements that content editors might require for + their content. Those custom plugins are not within the scope of this user guide. -2. **Content Variety:** Plugins provide a wide range of content types that can be inserted into placeholders, such as text, images, videos, galleries, sliders, forms, maps, and more. This variety enables editors to create rich and diverse web pages without relying on developers for every content update. - -3. **Customization:** While there's a set of default plugins available, each installation has its own set of plugins activated and might also use custom plugins tailored to specific needs. These custom plugins can encapsulate complex functionalities or unique design elements that content editors might require for their content. Those custom plugins are not within the scope of this user guide. - -In essence, Django CMS plugins empower content editors to manage and present content effectively, providing them with the tools to create engaging and dynamic web experiences without needing to delve into the technical intricacies of web development. These plugins empower editors to create and manage content without needing to write code or modify templates each time they want to add specific elements to a webpage. +In essence, Django CMS plugins empower content editors to manage and present content +effectively, providing them with the tools to create engaging and dynamic web +experiences without needing to delve into the technical intricacies of web development. +These plugins empower editors to create and manage content without needing to write code +or modify templates each time they want to add specific elements to a webpage. diff --git a/user-guide/source/explanation/publishing.rst b/user-guide/source/explanation/publishing.rst index 00bcba6..bd6dfba 100644 --- a/user-guide/source/explanation/publishing.rst +++ b/user-guide/source/explanation/publishing.rst @@ -1,5 +1,67 @@ Publishing -########## +========== .. include:: ../versioning-note.include +In Django CMS, publishing and versioning are crucial aspects for editors managing +content. Here's a breakdown of how they work: + +Publishing +---------- + +Publishing refers to making content available to website visitors. In Django CMS, you +typically create or edit content using a **draft**, which means the unfinished content +or changes are not immediately visible to the public. Editors can work on content +privately until it's ready for publication. + +This is the typical workflow: + +1. **Create Draft:** Editors create or modify content only in a draft version within the + CMS admin interface. +2. **Preview:** They can preview how the content will appear on the live site before + publishing. +3. **Publish:** When ready, editors can publish the changes to make them visible on the + live website for visitors to see. + +Published content cannot be changed any more. To make additional changes, create a start +over the process and create a new draft based on the published version. + +Managing versions +----------------- + +Versions in Django CMS keep track of changes made to content over time. This feature +allows editors to revert to earlier versions of content if needed and view the history +of modifications: + +1. **Version History:** Django CMS maintains a history of all changes made to a + particular piece of content. +2. **Compare Versions:** Editors can compare different versions of content to see what + changes were made between each iteration. +3. **Rollback:** If necessary, editors can revert to a previous version of the content, + effectively undoing recent changes. + +These functionalities empower editors to manage content effectively, ensuring quality +and control over what gets published on the live site while maintaining a history of +changes for reference or restoration purposes. + +.. figure:: ../tutorial/images/08-version-states.png + :alt: Version states and the editing process + + This diagram summarizes the possible states and the actions which create a change in + the state of a version. + +Locked versions +--------------- + +.. note:: + + This feature is not enabled in all installations of django CMS. See `django CMS + Versioning documentation + `_ + for more information. + +Version locking in Django CMS is a feature that automatically locks each draft version +of a content item to prevent unintended modifications or edits. A locked draft can only +be changed by the person who created the draft. This functionality is particularly +useful when you want to ensure that not two editors make changes to a specific content, +ensuring changes do not interfere with each other. diff --git a/user-guide/source/explanation/structure-content-modes.rst b/user-guide/source/explanation/structure-content-modes.rst index aca9f91..92b8601 100644 --- a/user-guide/source/explanation/structure-content-modes.rst +++ b/user-guide/source/explanation/structure-content-modes.rst @@ -1,10 +1,11 @@ -########################### Structure and content modes -########################### +=========================== -In Django CMS, the concepts of "structure" and "content" modes refer to different aspects of managing and arranging the plugins when editing a page (or other content). +In Django CMS, the concepts of "structure" and "content" modes refer to different +aspects of managing and arranging the plugins when editing a page (or other content). -You can toggle between structure and content mode by clicking the button on the far right of the toolbar. +You can toggle between structure and content mode by clicking the button on the far +right of the toolbar. .. image:: ../tutorial/images/07-structure-toggle.jpg :scale: 50 @@ -12,18 +13,27 @@ You can toggle between structure and content mode by clicking the button on the 1. **Structure Mode:** - - **Purpose:** Structure mode is primarily concerned with the arrangement and organization of the different plugins within placeholders. - - - **Functionality:** In structure mode, you can define the overall layout of your pages by creating plugins (regions within a template where content can be placed) and arranging these plugins within the placeholders of your page. - - - **Usage:** This mode is used for setting up the basic plugin structure of a page, determining where various types of content (text, images, videos, etc.) are placed within the layout. + - **Purpose:** Structure mode is primarily concerned with the arrangement and + organization of the different plugins within placeholders. + - **Functionality:** In structure mode, you can define the overall layout of your + pages by creating plugins (regions within a template where content can be placed) + and arranging these plugins within the placeholders of your page. + - **Usage:** This mode is used for setting up the basic plugin structure of a page, + determining where various types of content (text, images, videos, etc.) are placed + within the layout. 2. **Content Mode:** - - **Purpose:** Content mode focuses on the actual content that fills the placeholders created in structure mode. - - - **Functionality:** When in content mode, you can add, edit, and manage the specific plugins by double-clicking. This includes text, images, videos, widgets, and any other content types supported by Django CMS. - - - **Usage:** Content mode is used for changing or populating the placeholders with actual content. Users typically work in content mode when they want to add or modify text, images, or any other elements on the pages. - -In summary, structure mode deals with the layout and arrangement of placeholders on a page, while content mode involves filling those placeholders with actual content. These modes work together to provide a structured yet flexible way of managing the overall structure and content of a website within Django CMS. + - **Purpose:** Content mode focuses on the actual content that fills the placeholders + created in structure mode. + - **Functionality:** When in content mode, you can add, edit, and manage the specific + plugins by double-clicking. This includes text, images, videos, widgets, and any + other content types supported by Django CMS. + - **Usage:** Content mode is used for changing or populating the placeholders with + actual content. Users typically work in content mode when they want to add or + modify text, images, or any other elements on the pages. + +In summary, structure mode deals with the layout and arrangement of placeholders on a +page, while content mode involves filling those placeholders with actual content. These +modes work together to provide a structured yet flexible way of managing the overall +structure and content of a website within Django CMS. diff --git a/user-guide/source/explanation/touch.rst b/user-guide/source/explanation/touch.rst index 5931ce7..7264605 100644 --- a/user-guide/source/explanation/touch.rst +++ b/user-guide/source/explanation/touch.rst @@ -1,118 +1,106 @@ .. _touch: -########################################## Using touch-screen devices with django CMS -########################################## - +========================================== .. important:: - These notes about touch interface support apply only to the **django CMS admin and editing - interfaces**. The visitor-facing published site is **wholly independent** of this, and the - responsibility of the site developer. - + These notes about touch interface support apply only to the **django CMS admin and + editing interfaces**. The visitor-facing published site is **wholly independent** of + this, and the responsibility of the site developer. -******* General -******* +------- -django CMS has made extensive use of double-click functionality, which lacks an exact equivalent in -touch-screen interfaces. The touch interface will interpret taps and touches in an intelligent way. +django CMS has made extensive use of double-click functionality, which lacks an exact +equivalent in touch-screen interfaces. The touch interface will interpret taps and +touches in an intelligent way. -Depending on the context, a tap will be interpreted to mean *open for editing* (that is, the -equivalent of a double-click), or to mean *select* (the equivalent of a single click), according to -what makes sense in that context. +Depending on the context, a tap will be interpreted to mean *open for editing* (that is, +the equivalent of a double-click), or to mean *select* (the equivalent of a single +click), according to what makes sense in that context. -Similarly, in some contexts similar interactions may *drag* objects, or may *scroll* them, -depending on what makes most sense. Sometimes, the two behaviours will be present in the same view, -for example in the page list, where certain areas are draggable (for page re-ordering) while other -parts of the page can be used for scrolling. +Similarly, in some contexts similar interactions may *drag* objects, or may *scroll* +them, depending on what makes most sense. Sometimes, the two behaviours will be present +in the same view, for example in the page list, where certain areas are draggable (for +page re-ordering) while other parts of the page can be used for scrolling. -In general, the chosen behaviour is reasonable for a particular object, context or portion of the -screen, and in practice is quicker and easier to apprehend simply by using it than it is to explain. +In general, the chosen behaviour is reasonable for a particular object, context or +portion of the screen, and in practice is quicker and easier to apprehend simply by +using it than it is to explain. Pop-up help text will refer to clicking or tapping depending on the device being used. -Be aware that some hover-related user hints are simply not available to touch interface users. - +Be aware that some hover-related user hints are simply not available to touch interface +users. .. _device-support: -************** Device support -************** +-------------- -Smaller devices such as most phones are too small to be adequately usable. For example, your Apple -Watch is sadly unlikely to provide a very good django CMS editing experience. +Smaller devices such as most phones are too small to be adequately usable. For example, +your Apple Watch is sadly unlikely to provide a very good django CMS editing experience. Older devices will often lack the performance to support a usefully responsive frontend editing/administration interface. -The following devices are known to work well, so newer devices and more powerful models should also -be suitable: +The following devices are known to work well, so newer devices and more powerful models +should also be suitable: -* iOS: Apple iPad Air 1, Mini 4 -* Android: Sony Xperia Z2 Tablet, Samsung Galaxy Tab 4 -* Windows 10: Microsoft Surface +- iOS: Apple iPad Air 1, Mini 4 +- Android: Sony Xperia Z2 Tablet, Samsung Galaxy Tab 4 +- Windows 10: Microsoft Surface We welcome feedback about specific devices. - -******************** Your site's frontend -******************** - -django CMS's toolbar and frontend editing architecture rely on good practices in your own frontend -code. To work well with django CMS's responsive management framework, your own site should be -friendly towards multiple devices. +-------------------- -Whether you use your own frontend code or a framework such as Bootstrap 3 or Foundation, be aware -that problems in your CSS or markup can affect django CMS editing modes, and this will become -especially apparent to users of mobile/hand-held devices. +django CMS's toolbar and frontend editing architecture rely on good practices in your +own frontend code. To work well with django CMS's responsive management framework, your +own site should be friendly towards multiple devices. +Whether you use your own frontend code or a framework such as Bootstrap 3 or Foundation, +be aware that problems in your CSS or markup can affect django CMS editing modes, and +this will become especially apparent to users of mobile/hand-held devices. -************ Known issues -************ +------------ General issues --------------- +~~~~~~~~~~~~~~ -* Editing links that lack sufficient padding is currently difficult or impossible using +- Editing links that lack sufficient padding is currently difficult or impossible using touch-screens. - -* Similarly, other areas of a page where the visible content is composed entirely of links with - minimal padding around them can be difficult or impossible to open for editing by tapping. This - can affect the navigation menu (double-clicking on the navigation menu opens the page list). - -* Adding links is known to be problematic on some Android devices, because of the behaviour of the - keyboard. - -* On some devices, managing django CMS in the browser's *private* (also known as *incognito*) - mode can have significant performance implications. - - This is because local storage is not available in this mode, and user state must be stored in a - Django session, which is much less efficient. +- Similarly, other areas of a page where the visible content is composed entirely of + links with minimal padding around them can be difficult or impossible to open for + editing by tapping. This can affect the navigation menu (double-clicking on the + navigation menu opens the page list). +- Adding links is known to be problematic on some Android devices, because of the + behaviour of the keyboard. +- On some devices, managing django CMS in the browser's *private* (also known as + *incognito*) mode can have significant performance implications. + + This is because local storage is not available in this mode, and user state must be + stored in a Django session, which is much less efficient. This is an unusual use case, and should not affect many users. - CKEditor issues ---------------- - -* Scrolling on narrow devices, especially when opening the keyboard inside the CKEditor, does not - always work ideally - sometimes the keyboard can appear in the wrong place on-screen. - -* Sometimes the CKEditor moves unexpectedly on-screen in use. - -* Sometimes in Safari on iOS devices, a rendering bug will apparently truncate or reposition - portions of the toolbar when the CKEditor is opened - even though sections may appear to missing - or moved, they can still be activated by touching the part of the screen where they should have - been found. +~~~~~~~~~~~~~~~ +- Scrolling on narrow devices, especially when opening the keyboard inside the CKEditor, + does not always work ideally - sometimes the keyboard can appear in the wrong place + on-screen. +- Sometimes the CKEditor moves unexpectedly on-screen in use. +- Sometimes in Safari on iOS devices, a rendering bug will apparently truncate or + reposition portions of the toolbar when the CKEditor is opened - even though sections + may appear to missing or moved, they can still be activated by touching the part of + the screen where they should have been found. Django Admin issues -------------------- +~~~~~~~~~~~~~~~~~~~ -* In the page tree, the first touch on the page opens the keyboard which may be undesirable. This - happens because Django automatically focuses the search form input. +- In the page tree, the first touch on the page opens the keyboard which may be + undesirable. This happens because Django automatically focuses the search form input. diff --git a/user-guide/source/explanation/version-locking.rst b/user-guide/source/explanation/version-locking.rst deleted file mode 100644 index dd343a1..0000000 --- a/user-guide/source/explanation/version-locking.rst +++ /dev/null @@ -1,4 +0,0 @@ -Locking versions -################ - -.. include:: ../versioning-note.include diff --git a/user-guide/source/how-to/index.rst b/user-guide/source/how-to/index.rst index 79ede3d..71c7a3c 100644 --- a/user-guide/source/how-to/index.rst +++ b/user-guide/source/how-to/index.rst @@ -1,14 +1,12 @@ .. _user-how-to: -############# How-to-guides -############# +============= .. include:: ../contribute-note.include Use our guides to learn how to do a specific task in the CMS. - .. toctree:: :maxdepth: 1 diff --git a/user-guide/source/how-to/media-files.rst b/user-guide/source/how-to/media-files.rst index 2872879..173caed 100644 --- a/user-guide/source/how-to/media-files.rst +++ b/user-guide/source/how-to/media-files.rst @@ -1,17 +1,25 @@ Managing media files -#################### +==================== -In Django CMS, managing media files such as images, videos, documents, etc., is often handled using a popular Django package called "django-filer." This package integrates seamlessly with Django CMS to handle file management efficiently. Here's a step-by-step guide on managing media files in Django CMS using django-filer: +In Django CMS, managing media files such as images, videos, documents, etc., is often +handled using a popular Django package called "django-filer." This package integrates +seamlessly with Django CMS to handle file management efficiently. Here's a step-by-step +guide on managing media files in Django CMS using django-filer: -1. **Accessing Filer in Django CMS Admin:** - Once installed, you can access the django-filer functionalities through the Django CMS admin interface. +1. **Accessing Filer in Django CMS Admin:** Once installed, you can access the + django-filer functionalities through the Django CMS admin interface. +2. **Uploading Files:** Content editors can navigate to the Filer section within the CMS + admin to upload new files (images, documents, videos, etc.). They can create folders, + upload files, and organize them within the file manager provided by django-filer. +3. **Inserting Files into Content:** When editing content in Django CMS, content editors + can easily insert files (images, documents) stored in django-filer using plugins or + specific placeholders designed to handle media elements. For instance, they might use + a "File" or "Image" plugin that allows them to select files from the django-filer + library and place them within the content area. +4. **File Management:** Django-filer provides features for renaming, deleting, moving, + and organizing files and folders within the file manager interface, ensuring a + well-structured and manageable collection of media files. -2. **Uploading Files:** - Content editors can navigate to the Filer section within the CMS admin to upload new files (images, documents, videos, etc.). They can create folders, upload files, and organize them within the file manager provided by django-filer. - -3. **Inserting Files into Content:** - When editing content in Django CMS, content editors can easily insert files (images, documents) stored in django-filer using plugins or specific placeholders designed to handle media elements. For instance, they might use a "File" or "Image" plugin that allows them to select files from the django-filer library and place them within the content area. -4. **File Management:** - Django-filer provides features for renaming, deleting, moving, and organizing files and folders within the file manager interface, ensuring a well-structured and manageable collection of media files. - -By using django-filer, content editors can easily manage media files directly within the CMS interface, simplifying the process of adding and organizing various types of content elements throughout the website. +By using django-filer, content editors can easily manage media files directly within the +CMS interface, simplifying the process of adding and organizing various types of content +elements throughout the website. diff --git a/user-guide/source/how-to/pages.rst b/user-guide/source/how-to/pages.rst index c9cbfe3..442a4f9 100644 --- a/user-guide/source/how-to/pages.rst +++ b/user-guide/source/how-to/pages.rst @@ -1,45 +1,58 @@ Managing pages -############## +============== -Managing pages in Django CMS involves creating, organizing, and editing the structure and content of your website. Here's a step-by-step guide: - -1. **Accessing the Page Admin Interface:** - Select "Pages..." in the page menu of the toolbar. +Managing pages in Django CMS involves creating, organizing, and editing the structure +and content of your website. Here's a step-by-step guide: +1. **Accessing the Page Admin Interface:** Select "Pages..." in the page menu of the + toolbar. 2. **Creating a New Page:** - * Click on "Add Page" to create a new page. - * Enter the page title, select the page type (if applicable), and define the URL and other settings. + - Click on "Add Page" to create a new page. + - Enter the page title, select the page type (if applicable), and define the URL and + other settings. 3. **Organizing Page Hierarchy:** - * Arrange the page hierarchy by creating parent-child relationships between pages. - * Use drag-and-drop functionality to organize pages in a tree-like structure. + - Arrange the page hierarchy by creating parent-child relationships between pages. + - Use drag-and-drop functionality to organize pages in a tree-like structure. 4. **Managing Page Content:** - * Click on the settings icon of a page to access its settings - * Click on the eye icon of a page to access its content. - * Use placeholders to add content. Edit or add plugins (text, images, forms, etc.) into these placeholders. + - Click on the settings icon of a page to access its settings + - Click on the eye icon of a page to access its content. + - Use placeholders to add content. Edit or add plugins (text, images, forms, etc.) + into these placeholders. 5. **Editing Page Settings:** - Adjust page settings such as metadata (SEO-related information like meta titles, descriptions, keywords), publication dates, permissions, etc. + Adjust page settings such as metadata (SEO-related information like meta titles, + descriptions, keywords), publication dates, permissions, etc. + 6. **Preview and Publish:** - * Preview the page to see how it will look to visitors. - * Once satisfied, publish the page to make it live on the website. + - Preview the page to see how it will look to visitors. + - Once satisfied, publish the page to make it live on the website. + 7. **Managing Existing Pages:** - To edit an existing page, navigate to the Pages section, locate the page, and click on its eye icon to access its content. + To edit an existing page, navigate to the Pages section, locate the page, and click + on its eye icon to access its content. Make necessary changes to the content, settings, or structure. .. tip:: - **Permissions:** Adjust user permissions in Django CMS to control who can create, edit, or publish pages. - **URL Handling:** Django CMS often handles URL routing automatically, but you can customize URLs and slugs within the page settings. + **Permissions:** Adjust user permissions in Django CMS to control who can create, + edit, or publish pages. + + **URL Handling:** Django CMS often handles URL routing automatically, but you can + customize URLs and slugs within the page settings. - **Versioning and Revisions:** Django CMS keeps track of page revisions, allowing you to revert to previous versions if needed. + **Versioning and Revisions:** Django CMS keeps track of page revisions, allowing you + to revert to previous versions if needed. -Managing pages in Django CMS involves a mix of structural organization, content creation, and configuration adjustments. The system is designed to provide a user-friendly interface for content editors to manage the website's structure and content efficiently. +Managing pages in Django CMS involves a mix of structural organization, content +creation, and configuration adjustments. The system is designed to provide a +user-friendly interface for content editors to manage the website's structure and +content efficiently. diff --git a/user-guide/source/how-to/redirects.rst b/user-guide/source/how-to/redirects.rst index 9c8bd10..426b336 100644 --- a/user-guide/source/how-to/redirects.rst +++ b/user-guide/source/how-to/redirects.rst @@ -1,43 +1,49 @@ Managing redirects -################## +================== -By implementing redirects, you can retain the SEO rankings and authority of the old URL, transferring it to the new one. This helps to ensure that your website maintains its search engine visibility. +By implementing redirects, you can retain the SEO rankings and authority of the old URL, +transferring it to the new one. This helps to ensure that your website maintains its +search engine visibility. -Django CMS supports redirects as part of the :ref:`Page settings `. It happens on a per-language level. This means you can select different redirect targets for the different language contents of a page. +Django CMS supports redirects as part of the :ref:`Page settings `. It +happens on a per-language level. This means you can select different redirect targets +for the different language contents of a page. The simplest way to set redirects is: -1. **Accessing the Page Admin Interface:** - Select "Pages..." in the page menu of the toolbar. - +1. **Accessing the Page Admin Interface:** Select "Pages..." in the page menu of the + toolbar. 2. **Opening the page settings:** - * Find the page you want to redirect in the page tree. + - Find the page you want to redirect in the page tree. .. image:: ../tutorial/images/05-pagetree-form.jpg - :alt: django CMS page tree + :alt: django CMS page tree - * If the page is published, select "Create new draft" from the dropdown menu of the page status indicator (number 7). - * Click on the page settings icon (number 9: three horizontal sliders), + - If the page is published, select "Create new draft" from the dropdown menu of the + page status indicator (number 7). + - Click on the page settings icon (number 9: three horizontal sliders), 3. **Changing the redirect setting:** .. image:: ./images/redirect-settings.jpg - :alt: django CMS page settings + :alt: django CMS page settings - * Find the "URL options" section. - * Click "Show" to open the "URL options" section - * Change the "Redirect" setting by selecting the page which the current one should be redirected to - * Close the setting by clicking "Save" at the bottom + - Find the "URL options" section. + - Click "Show" to open the "URL options" section + - Change the "Redirect" setting by selecting the page which the current one should be + redirected to + - Close the setting by clicking "Save" at the bottom 4. **Publishing the change:** - * Select "Publish" from the dropdown menu of the page status indicator (number 7) + - Select "Publish" from the dropdown menu of the page status indicator (number 7) .. note:: - Changes can only be made to draft page contents and will only take effect once published. - - -Managing redirects in Django CMS happens on page level. The system is designed to provide a user-friendly interface for content editors to manage redirects and thereby ensure keeping SEO rankings. + Changes can only be made to draft page contents and will only take effect once + published. +Managing redirects in Django CMS happens on page level. The system is designed to +provide a user-friendly interface for content editors to manage redirects and thereby +ensure keeping SEO rankings. diff --git a/user-guide/source/how-to/versions.rst b/user-guide/source/how-to/versions.rst index 57cf0aa..77a98c2 100644 --- a/user-guide/source/how-to/versions.rst +++ b/user-guide/source/how-to/versions.rst @@ -1,60 +1,64 @@ Managing versions -################# +================= .. include:: ../versioning-note.include -Django CMS keeps track of page revisions, allowing you to revert to previous versions if needed. Here's a step-by-step guide on how to manage versions: +Django CMS keeps track of page revisions, allowing you to revert to previous versions if +needed. Here's a step-by-step guide on how to manage versions: 1. **Accessing the "manage versions" view:** Either - * Select "Pages..." in the page menu of the toolbar and look for the page the versions of which you want to manage. - * Click on the status indicator to open the dropdown menu - * Select "Manage versions..." + - Select "Pages..." in the page menu of the toolbar and look for the page the + versions of which you want to manage. + - Click on the status indicator to open the dropdown menu + - Select "Manage versions..." or - * Preview or edit the page the versions of which you want to manage. - * Click on the version menu and chose "Manage versions..." + - Preview or edit the page the versions of which you want to manage. + - Click on the version menu and chose "Manage versions..." .. image:: ../tutorial/images/08-version-menu-open.jpg - :scale: 50 - + :scale: 50 2. **Inspecting all versions:** .. image:: ./images/versions-changelist.jpg - :alt: Versions of a page content + :alt: Versions of a page content - * Created and modified dates - * Title and language - * Username of the author - * Status: Draft, Published, Unpublished, and Archived - * Action buttons + - Created and modified dates + - Title and language + - Username of the author + - Status: Draft, Published, Unpublished, and Archived + - Action buttons -3. **Acting upon versions:** - Actions differ by status of the version. They include +3. **Acting upon versions:** Actions differ by status of the version. They include - * Edit (pencil): Edit this version (draft) or create a new draft from this version (published) - * Archive: Mark this draft as archived for later usage - * Revert: Create new draft from this archived or unpublished version - * Publish: Publish this draft - * Unpublish: Make this published version unavailable - * Delete: Delete this draft version - * View: Preview this version + - Edit (pencil): Edit this version (draft) or create a new draft from this version + (published) + - Archive: Mark this draft as archived for later usage + - Revert: Create new draft from this archived or unpublished version + - Publish: Publish this draft + - Unpublish: Make this published version unavailable + - Delete: Delete this draft version + - View: Preview this version 4. **Comparing two versions:** - * Select exactly two versions to compare by checking the box on their left side - * From the pull-down menu marked ``-------`` select "Compare versions" - * Click "Go" + - Select exactly two versions to compare by checking the box on their left side + - From the pull-down menu marked ``-------`` select "Compare versions" + - Click "Go" .. image:: ../tutorial/images/08-comparing-versions.jpg - :alt: Comparing two versions + :alt: Comparing two versions .. note:: - Only draft versions can be deleted. Outdated versions are kept on purpose. + Only draft versions can be deleted. Outdated versions are kept on purpose. -Managing versions in Django CMS allows to unterstand the history of the page content. Drafts can be archived for later reuse. All versions currently public or once public are marked "published" or "unpublished", respectively. The content of versions can be compared with each other. +Managing versions in Django CMS allows to unterstand the history of the page content. +Drafts can be archived for later reuse. All versions currently public or once public are +marked "published" or "unpublished", respectively. The content of versions can be +compared with each other. diff --git a/user-guide/source/index.rst b/user-guide/source/index.rst index 208bbb2..3716d1d 100644 --- a/user-guide/source/index.rst +++ b/user-guide/source/index.rst @@ -45,61 +45,66 @@ .. _user-manual: -################ Using django CMS -################ +================ .. note:: - This is a new section in the django CMS documentation, and a priority - for the project. If you'd like to contribute to it, we'd love to hear - from you - join us on `our friendly Slack group - `_. + This is a new section in the django CMS documentation, and a priority for the + project. If you'd like to contribute to it, we'd love to hear from you - join us on + `our friendly Slack group `_. -This is a user guide for django CMS. The intended audience for this guide are content creators and site administrators. +This is a user guide for django CMS. The intended audience for this guide are content +creators and site administrators. -Django CMS sites are highly customisable and varied. The examples here follow the `quickstart project from Github `_. This provides certain features, which are entirely optional for your own site, and the features provided in the quickstart are used in this guide to demonstrate how django CMS can be used. +Django CMS sites are highly customisable and varied. The examples here follow the +`quickstart project from Github `_. +This provides certain features, which are entirely optional for your own site, and the +features provided in the quickstart are used in this guide to demonstrate how django CMS +can be used. -The origin of this document is a guide provided by `Kapt.mobi `_. It has been translated from the native French and extended. +The origin of this document is a guide provided by `Kapt.mobi +`_. It has been translated from the +native French and extended. Guide for content editors -######################### +------------------------- .. rst-class:: clearfix row .. rst-class:: column column2 top-left :ref:`user-tutorial` -==================== +~~~~~~~~~~~~~~~~~~~~ **Start here as a new django CMS content editor**: -* Getting to know the user interface -* Understanding the page tree -* Creating content +- Getting to know the user interface +- Understanding the page tree +- Creating content .. rst-class:: column column2 top-right :ref:`user-how-to` -================== +~~~~~~~~~~~~~~~~~~ -Practical **step-by-step guides** to get things done in the most simple way as a content editor +Practical **step-by-step guides** to get things done in the most simple way as a content +editor .. rst-class:: column column2 bottom-left :ref:`user-explanation` -======================= +~~~~~~~~~~~~~~~~~~~~~~~ What's a placeholder? What's a plugin? Understand key concepts of django CMS. .. rst-class:: column column2 bottom-right :ref:`user-reference` -===================== +~~~~~~~~~~~~~~~~~~~~~ Reference material for installed plugins. - .. rst-class:: clearfix row .. toctree:: diff --git a/user-guide/source/reference/index.rst b/user-guide/source/reference/index.rst index 8e9b274..a77b5ca 100644 --- a/user-guide/source/reference/index.rst +++ b/user-guide/source/reference/index.rst @@ -1,8 +1,7 @@ .. _user-reference: -############################# Reference for content editors -############################# +============================= .. include:: ../contribute-note.include diff --git a/user-guide/source/reference/plugins.rst b/user-guide/source/reference/plugins.rst index 9c66794..08904c3 100644 --- a/user-guide/source/reference/plugins.rst +++ b/user-guide/source/reference/plugins.rst @@ -1,97 +1,108 @@ Standard plugins -################ +================ -Each site has its own set of installed plugins. This reference is based on the plugins installed with django CMS quickstart. +Each site has its own set of installed plugins. This reference is based on the plugins +installed with django CMS quickstart. django CMS groups its plugins into categories. We list the plugins by category. Generic -======= +------- **Text** - The text plugin is a simple yet versatile plugin used for adding and editing text content. It allows you to directly insert formatted text, such as paragraphs, headings, lists, and links. - + The text plugin is a simple yet versatile plugin used for adding and editing text + content. It allows you to directly insert formatted text, such as paragraphs, + headings, lists, and links. **Alias** - The Alias plugin is a powerful tool that enables content editors to display certain content on many pages without duplicating it. The Alias plugin let predefined content blocks appear at its position by linking them. If the alias content is updated, the linked content also changes. - + The Alias plugin is a powerful tool that enables content editors to display certain + content on many pages without duplicating it. The Alias plugin let predefined + content blocks appear at its position by linking them. If the alias content is + updated, the linked content also changes. Frontend -======== +-------- .. include:: ../frontend-note.include - -The frontend plugins are part of the djangocms-frontend package, which might (or might not) be installed on your site. Its purpose is to provide web site components like sliders, accordions, etc. for content editors. Thóse components in most cases are implemented by the deisnger of the web site. The contend editors can use the component at any place on the site. +The frontend plugins are part of the djangocms-frontend package, which might (or might +not) be installed on your site. Its purpose is to provide web site components like +sliders, accordions, etc. for content editors. Thóse components in most cases are +implemented by the deisnger of the web site. The contend editors can use the component +at any place on the site. **Accordion** - Use the Accordion plugin to build vertically collapsing accordions. - + Use the Accordion plugin to build vertically collapsing accordions. **Alert** - Provide contextual feedback messages for typical user actions for a handful of contexts: success, warning, danger, info, .... + Provide contextual feedback messages for typical user actions for a handful of + contexts: success, warning, danger, info, .... **Badge** - Provide small counters or pieces of information for a handful of contexts: success, warning, danger, info, .... + Provide small counters or pieces of information for a handful of contexts: success, + warning, danger, info, .... **Blockquote** - Quote blocks of content from another source. Optionally provide a source. + Quote blocks of content from another source. Optionally provide a source. **Card** - Structure content with a flexible and extensible container with multiple variants and options + Structure content with a flexible and extensible container with multiple variants + and options **Card layout** - Organize several cards into one layout + Organize several cards into one layout **Carousel** - Cycle through elements, images or slides of text, like a carousel. + Cycle through elements, images or slides of text, like a carousel. **Code** - Present (computer) code blocks + Present (computer) code blocks **Collapse** - Toggle the visibility of content + Toggle the visibility of content **Container** - Contain, pad, and align your content within a given device or viewport for responsive designs + Contain, pad, and align your content within a given device or viewport for + responsive designs **Editor note** - Mark contents visible to editors only + Mark contents visible to editors only **Figure** - Display related images and text + Display related images and text **Heading** - Add headline with optional anchor. + Add headline with optional anchor. **Icon** - Give visual clues by adding icons + Give visual clues by adding icons **Jumbotron (deprecated)** - Showcase your hero unit + Showcase your hero unit **Link / Button** - Reference and link other contents + Reference and link other contents **List group** - Displaying a series of content flexibly. Modify and extend them to support just about any content within. + Displaying a series of content flexibly. Modify and extend them to support just + about any content within. **Media** - Construct highly repetitive components like blog comments, tweets, and the like + Construct highly repetitive components like blog comments, tweets, and the like **Picture / Image** - Show images from the media library + Show images from the media library **Row** and **Column** - Build responsive layouts of all shapes and sizes thanks to a twelve column system, six default responsive tiers + Build responsive layouts of all shapes and sizes thanks to a twelve column system, + six default responsive tiers **Spacing** - Add horizontal spaces around the child content + Add horizontal spaces around the child content **Table of contents** - Create a table of contents for all sections starting with the "Heading" plugin. + Create a table of contents for all sections starting with the "Heading" plugin. **Tabs** - Creat a tabbed interface for content that is only shown when the corresponding tab is activated. - - + Creat a tabbed interface for content that is only shown when the corresponding tab + is activated. diff --git a/user-guide/source/tutorial/01-login.rst b/user-guide/source/tutorial/01-login.rst index c09e8e5..c85b173 100644 --- a/user-guide/source/tutorial/01-login.rst +++ b/user-guide/source/tutorial/01-login.rst @@ -1,17 +1,27 @@ .. _editing: Logging-in -########## +========== -Once you have :ref:`created your site ` with the django CMS components you will want to customise the site and add content. To this you will need to log in and edit it. +Once you have :ref:`created your site ` with the django CMS +components you will want to customise the site and add content. To this you will need to +log in and edit it. -There are different ways of accessing your user account in django CMS. Please refer to what the respective developer of your project has told you. +There are different ways of accessing your user account in django CMS. Please refer to +what the respective developer of your project has told you. -The default way is to add ``/?toolbar_on`` to the end of your URL and use the toolbar to log in. The banner or login page will appear, asking you for your username and password. When you first log in, these two elements have been set by the developers. Therefore, if you are not sure how to fill in these fields, please contact them. +The default way is to add ``/?toolbar_on`` to the end of your URL and use the toolbar to +log in. The banner or login page will appear, asking you for your username and password. +When you first log in, these two elements have been set by the developers. Therefore, if +you are not sure how to fill in these fields, please contact them. -Logging in will allow you to access your site to add, modify or delete content. You will be able to perform a lot of actions using the django CMS menu bar, which is present when you are logged in to your site. +Logging in will allow you to access your site to add, modify or delete content. You will +be able to perform a lot of actions using the django CMS menu bar, which is present when +you are logged in to your site. .. image:: ./images/01-toolbar-on.jpg - :alt: django CMS toolbar login + :alt: django CMS toolbar login -Upon logging into your site, you will be able to see your site's pages and other content with a toolbar at the top of the visible area. This toolbar is used to make changes to your site. +Upon logging into your site, you will be able to see your site's pages and other content +with a toolbar at the top of the visible area. This toolbar is used to make changes to +your site. diff --git a/user-guide/source/tutorial/02-toolbar.rst b/user-guide/source/tutorial/02-toolbar.rst index 22945cb..b2d073a 100644 --- a/user-guide/source/tutorial/02-toolbar.rst +++ b/user-guide/source/tutorial/02-toolbar.rst @@ -1,137 +1,182 @@ .. _toolbar: The toolbar -########### +=========== Overview -======== +-------- -When connected to your site, the Django CMS toolbar appears. It can also be called a menu bar since it offers you several menus performing various actions. +When connected to your site, the Django CMS toolbar appears. It can also be called a +menu bar since it offers you several menus performing various actions. .. image:: ./images/02-toolbar.jpg - :alt: The django CMS toolbar + :alt: The django CMS toolbar -Depending on the modules present on your site and the page you are on, you can find various elements. The only ones that will always be present are "Project", "Page" and "Language". The other proposals that may appear depend on the CMS modules present on your website and where you are located. For example, "Blog" will only be displayed if you have this module and you are on your blog page or article pages. +Depending on the modules present on your site and the page you are on, you can find +various elements. The only ones that will always be present are "Project", "Page" and +"Language". The other proposals that may appear depend on the CMS modules present on +your website and where you are located. For example, "Blog" will only be displayed if +you have this module and you are on your blog page or article pages. -Another element that is constantly present in your toolbar: the django CMS logo. If you click on it, it will simply take you back to your home page. +Another element that is constantly present in your toolbar: the django CMS logo. If you +click on it, it will simply take you back to your home page. -To the right of the logo follows the project menu, the page menu and potentially some more menus: Here the version and language menu. The language menu will be missing in single-language configurations. +To the right of the logo follows the project menu, the page menu and potentially some +more menus: Here the version and language menu. The language menu will be missing in +single-language configurations. -On the right handside you see the color scheme toggle which you can use to switch the color scheme of django CMS interface elements between light and dark. It is followed by action buttons which are highly context dependent. Finally, on the right hand corner, there is the structure board toggle which might be disabled. It is central to editing content. +On the right handside you see the color scheme toggle which you can use to switch the +color scheme of django CMS interface elements between light and dark. It is followed by +action buttons which are highly context dependent. Finally, on the right hand corner, +there is the structure board toggle which might be disabled. It is central to editing +content. The Project menu -================== +---------------- -This is the part of the django CMS toolbar that corresponds to your site. Normally, the name of your website is displayed instead of "example.com". +This is the part of the django CMS toolbar that corresponds to your site. Normally, the +name of your website is displayed instead of "example.com". .. image:: ./images/02-project-menu.jpg - :alt: The Project menu - :scale: 50 + :alt: The Project menu + :scale: 50 .. note:: - You might not see all of the elements described here, or even more elements. This strongly depends on your django CMS setup. - -* **Pages...** - allows you to access the page tree of your site by opening the side bar. -* **Users...** - gives you access to the user management panel in the side bar. -* **Administration...** - Allows you to manage various features via the administration window. -* **Aliases...** - Allows you to access content elements which are re-used within your sites, such as footers or announcements. -* **User settings** - Allows you to change the language of the administrator interface and the menu/toolbar. -* **Disable Toolbar** - allows you to completely disable the toolbar and the front-end editor, regardless of the login and status of the person logged in. -* **Shortcuts** - gives access to your shortcuts. -* **Logout ** - the user will be logged out. - -Generally, by choosing one of the items of this menu, the content will be displayed in the sidebar overlay or in a new page. In the case of the sidebar, you can close it with the cross at the top right. + You might not see all of the elements described here, or even more elements. This + strongly depends on your django CMS setup. + +- **Pages...** - allows you to access the page tree of your site by opening the side + bar. +- **Users...** - gives you access to the user management panel in the side bar. +- **Administration...** - Allows you to manage various features via the administration + window. +- **Aliases...** - Allows you to access content elements which are re-used within your + sites, such as footers or announcements. +- **User settings** - Allows you to change the language of the administrator interface + and the menu/toolbar. +- **Disable Toolbar** - allows you to completely disable the toolbar and the front-end + editor, regardless of the login and status of the person logged in. +- **Shortcuts** - gives access to your shortcuts. +- **Logout ** - the user will be logged out. + +Generally, by choosing one of the items of this menu, the content will be displayed in +the sidebar overlay or in a new page. In the case of the sidebar, you can close it with +the cross at the top right. .. note:: - If you disable the toolbar, you can only make it reappear by adding ``?toolbar_on`` to the end of the URL in your browser window. + If you disable the toolbar, you can only make it reappear by adding ``?toolbar_on`` + to the end of the URL in your browser window. The "Page" menu -=============== +--------------- .. image:: ./images/02-page-menu.jpg - :alt: The Page menu - :scale: 50 + :alt: The Page menu + :scale: 50 The "Page" menu allows you to perform the following actions: -* **Create new pages** - you have the choice to create a new page, a new sub-page or to duplicate the page you are on. +- **Create new pages** - you have the choice to create a new page, a new sub-page or to + duplicate the page you are on. .. note:: - A parent page is a page that contains a group of several other pages of which your page is part. + A parent page is a page that contains a group of several other pages of which your + page is part. - A sibling page is a page of the same level as your current page: they belong to the same group. Sibling pages either have both no parents or the same parent page. + A sibling page is a page of the same level as your current page: they belong to + the same group. Sibling pages either have both no parents or the same parent page. - A sub page is a page nested within the parent page group. A parent page is the "parent" of the sub page which if also called child page. + A sub page is a page nested within the parent page group. A parent page is the + "parent" of the sub page which if also called child page. - This is called page inheritance.and explained in more detail in the `section on the tree structure `_ of your site later in this document. + This is called page inheritance.and explained in more detail in the `section on + the tree structure `_ of your site later in this document. -* **Edit this page** - allows you to edit the page you are on. Changes to a page are only possible if your are in edit mode. -* **Page settings…** - gives you access to the settings of the current page. -* **Advanced settings** - allows you to access the advanced settings of the page. Amongst the advanced settings of a page are their permissions. -* **Templates** - allows you to choose the template of your page. You can also choose to have your page inherit the template of the "closest parent", i.e. apply the template of its parent or sister page. -* **Hide/show in navigation** - toggles if the page should appear in the sites navigation -* **Delete page** - deletes the page. +- **Edit this page** - allows you to edit the page you are on. Changes to a page are + only possible if your are in edit mode. +- **Page settings…** - gives you access to the settings of the current page. +- **Advanced settings** - allows you to access the advanced settings of the page. + Amongst the advanced settings of a page are their permissions. +- **Templates** - allows you to choose the template of your page. You can also choose to + have your page inherit the template of the "closest parent", i.e. apply the template + of its parent or sister page. +- **Hide/show in navigation** - toggles if the page should appear in the sites + navigation +- **Delete page** - deletes the page. Page settings -------------- +~~~~~~~~~~~~~ -The screenshot below give you a quick overview of the basic settings dialogs for your page. +The screenshot below give you a quick overview of the basic settings dialogs for your +page. -We will see them in more detail when we create your page, but here are some important information: +We will see them in more detail when we create your page, but here are some important +information: -* **Title:** field dedicated to the title of your page that you enter when creating your page. -* **Slug:** automatically generated, it is what appears at the end of the URL. +- **Title:** field dedicated to the title of your page that you enter when creating your + page. +- **Slug:** automatically generated, it is what appears at the end of the URL. -You will probably not use the advanced settings because they are mainly used for redirects. +You will probably not use the advanced settings because they are mainly used for +redirects. .. image:: ./images/02-page-settings.jpg - :alt: The page settings dialogue + :alt: The page settings dialogue -Note that the page settings are available separately for all languages of the page. Use the language tabs to navigate between settings in different languages. +Note that the page settings are available separately for all languages of the page. Use +the language tabs to navigate between settings in different languages. The version menu -================ +---------------- .. image:: ./images/02-version-menu.jpg - :alt: The version menu - :scale: 50 + :alt: The version menu + :scale: 50 -The version menu allows you to manage current and past versions of the page you are viewing. The menu title includes the version number of the current page (counted by language) and its status: -* Draft: The copy you are currently editing -* Published: The version that currently is publicly visible. -* Unpublished: Any version that once was publicly visible but now is not any more. -* Archived: Any draft version that has been archived for later use. +The version menu allows you to manage current and past versions of the page you are +viewing. The menu title includes the version number of the current page (counted by +language) and its status: * Draft: The copy you are currently editing * Published: The +version that currently is publicly visible. * Unpublished: Any version that once was +publicly visible but now is not any more. * Archived: Any draft version that has been +archived for later use. You can perform the following actions: -* **Manage versions...** - get a list of all versions of this page in the sidebar. -* **Compare to version ...** - get a visual comparison on how the currently viewed version differs from any other version of the pasge. Difference are highlighted by colors either on the page or the page's source code. -* **Discard Changes** - makes all changes of the current draft undone - +- **Manage versions...** - get a list of all versions of this page in the sidebar. +- **Compare to version ...** - get a visual comparison on how the currently viewed + version differs from any other version of the pasge. Difference are highlighted by + colors either on the page or the page's source code. +- **Discard Changes** - makes all changes of the current draft undone The language menu -================= +----------------- .. image:: ./images/02-language-menu.jpg - :alt: The language menu - :scale: 50 + :alt: The language menu + :scale: 50 -The "Language" menu allows you to switch between the different language versions on the page you are viewing, and to manage the different translations. +The "Language" menu allows you to switch between the different language versions on the +page you are viewing, and to manage the different translations. -You can add a missing translation, delete an existing one or copy all plugins and their content from an existing translation to the current one. +You can add a missing translation, delete an existing one or copy all plugins and their +content from an existing translation to the current one. The action buttons -================== +------------------ On the right hand side are the action buttons. -* The **Create** button opens up the content creation wizard which allows you to easily create a new page or potentially other content elements installed at your site. -* The **Edit** button to open the page to make changes in editing mode, (appearance of the structure menu & possibility to double-click to modify the content), -* The **New Draft** button to create a new draft copy of the page end open it in edit mode. -* The **Preview** button switches to the preview mode. Here, no changes are possible. Also works for non-public content, such as unpublished pages. -* The **View published** button redirects to the currently visible version of the page. -* The **Publish** button which makes the current draft the new published content. A previously published version of the page becomes unpublished. - +- The **Create** button opens up the content creation wizard which allows you to easily + create a new page or potentially other content elements installed at your site. +- The **Edit** button to open the page to make changes in editing mode, (appearance of + the structure menu & possibility to double-click to modify the content), +- The **New Draft** button to create a new draft copy of the page end open it in edit + mode. +- The **Preview** button switches to the preview mode. Here, no changes are possible. + Also works for non-public content, such as unpublished pages. +- The **View published** button redirects to the currently visible version of the page. +- The **Publish** button which makes the current draft the new published content. A + previously published version of the page becomes unpublished. diff --git a/user-guide/source/tutorial/03-sidebar.rst b/user-guide/source/tutorial/03-sidebar.rst index 4564769..c4fda4d 100644 --- a/user-guide/source/tutorial/03-sidebar.rst +++ b/user-guide/source/tutorial/03-sidebar.rst @@ -1,15 +1,21 @@ .. _sidebar: Administration side bar -####################### +======================= Introduction -============ +------------ -When you click on "Administration" in the project menu, the administration or admin window opens. It covers most the content of your page. If you want to go back to your page, just click the close button or into the area outside the side bar. It covers the full administration interface of your site, including those added by django CMS. Depending on the modules installed on your site, its content may vary. It is identical to the content on the sites admin pages. +When you click on "Administration" in the project menu, the administration or admin +window opens. It covers most the content of your page. If you want to go back to your +page, just click the close button or into the area outside the side bar. It covers the +full administration interface of your site, including those added by django CMS. +Depending on the modules installed on your site, its content may vary. It is identical +to the content on the sites admin pages. -From this page, you can access the different administration sections of your site: management of pages, media files, users, ... +From this page, you can access the different administration sections of your site: +management of pages, media files, users, ... .. image:: ./images/03-sidebar.jpg - :alt: Example sidebar - :width: 800 + :alt: Example sidebar + :width: 800 diff --git a/user-guide/source/tutorial/04-filer.rst b/user-guide/source/tutorial/04-filer.rst index 56b8fd8..e661843 100644 --- a/user-guide/source/tutorial/04-filer.rst +++ b/user-guide/source/tutorial/04-filer.rst @@ -1,32 +1,41 @@ - The media library -################# +================= -The Media library allows you to access all your files, folders and images on your site. You reach the media library through the Administration menu entry in the project menu. It opens in the sidebar. +The Media library allows you to access all your files, folders and images on your site. +You reach the media library through the Administration menu entry in the project menu. +It opens in the sidebar. -By accessing it, you will be able to modify the titles, alt tags, captions and other information of your images, and also manage your folders and files. +By accessing it, you will be able to modify the titles, alt tags, captions and other +information of your images, and also manage your folders and files. Access the Media library -======================== +------------------------ + To manage the files on your site, look for the Filer section and click on "Folders": .. image:: ./images/04-filer-section.jpg - :scale: 50 - :alt: The filer section of the admin sidebar contains the media library + :scale: 50 + :alt: The filer section of the admin sidebar contains the media library Description of the Media library -================================ +-------------------------------- Media files live in folders just like in a regular file system. -The greyed out "Unsorted uploads" file contains all the images that do not belong to any folder and that have been directly uploaded to a CMS page or a blog post. +The greyed out "Unsorted uploads" file contains all the images that do not belong to any +folder and that have been directly uploaded to a CMS page or a blog post. -The blue folder "Blog" might contain all your picture folders used in your blog. You will be able to manage all the photo folders, add or delete them... +The blue folder "Blog" might contain all your picture folders used in your blog. You +will be able to manage all the photo folders, add or delete them... .. warning:: - Important: Before deleting a folder or an image, make sure that the contents of the folder or the image are not used on your site. If, for example, you delete an image while it is present in an article, it will disappear from this same article. + Important: Before deleting a folder or an image, make sure that the contents of the + folder or the image are not used on your site. If, for example, you delete an image + while it is present in an article, it will disappear from this same article. .. warning:: - Would you like to see more content here? Please `join us on Slack `_ and the Slack ``#workgroup-documentation`` to add content here. + Would you like to see more content here? Please `join us on Slack + `_ and the Slack ``#workgroup-documentation`` to + add content here. diff --git a/user-guide/source/tutorial/05-pagetree.rst b/user-guide/source/tutorial/05-pagetree.rst index b086781..5d649c0 100644 --- a/user-guide/source/tutorial/05-pagetree.rst +++ b/user-guide/source/tutorial/05-pagetree.rst @@ -1,81 +1,113 @@ .. _pagetree: The page tree structure -####################### +======================= -The tree structure of your site allows you to access all your pages. Many features and information are present in this part of your site. To better understand them, we suggest you look at how to access your tree structure, and understand the principles that are linked to it and its features. +The tree structure of your site allows you to access all your pages. Many features and +information are present in this part of your site. To better understand them, we suggest +you look at how to access your tree structure, and understand the principles that are +linked to it and its features. See the page tree -================= +----------------- -To access the tree structure of your site, go to the project menu (which has the name of your site, or "example.com" on the screenshots here), and choose "Pages...". The side bar opens and shows the complete tree structure of your site. That is to say, all the pages that make up your site: visible and non-visible, pages and sub-pages, published or not. +To access the tree structure of your site, go to the project menu (which has the name of +your site, or "example.com" on the screenshots here), and choose "Pages...". The side +bar opens and shows the complete tree structure of your site. That is to say, all the +pages that make up your site: visible and non-visible, pages and sub-pages, published or +not. -Alternatively, you can reach the page tree by clicking "Page contents" in the admin sidebar, which you find in the "Django CMS" section. +Alternatively, you can reach the page tree by clicking "Page contents" in the admin +sidebar, which you find in the "Django CMS" section. Principles of the parent, child and sibling pages -================================================= +------------------------------------------------- -This section is intended to give you a better understanding of what is meant by page inheritance and the names given to it. +This section is intended to give you a better understanding of what is meant by page +inheritance and the names given to it. -The page tree structure is divided into different sections: these are the pages at different levels. Each page can be nested in another one, i.e. a page can contain several sub-pages. This page is then called the "parent page" and its sub-pages are its "child pages". A child page can also have its own child pages. The idea is to organize your site in several different levels so that it is clearer for the user. +The page tree structure is divided into different sections: these are the pages at +different levels. Each page can be nested in another one, i.e. a page can contain +several sub-pages. This page is then called the "parent page" and its sub-pages are its +"child pages". A child page can also have its own child pages. The idea is to organize +your site in several different levels so that it is clearer for the user. To better understand, let us take the image of a tree as a metaphor: -* Your **home page** is the trunk, it presents all the thematic pages of your site. -* The **top-level pages** are the branches of your tree and have other small branches. We call these top-level pages "parent pages". -* The small branches correspond to the **child pages** of your top-level pages (the "parents"). Each parent page may or may not have child pages, just as the branch of a tree may or may not have smaller branches. -* The leaves of your tree represent the content of your pages or the sub-pages of your child pages, which do not have any child pages of their own. +- Your **home page** is the trunk, it presents all the thematic pages of your site. +- The **top-level pages** are the branches of your tree and have other small branches. + We call these top-level pages "parent pages". +- The small branches correspond to the **child pages** of your top-level pages (the + "parents"). Each parent page may or may not have child pages, just as the branch of a + tree may or may not have smaller branches. +- The leaves of your tree represent the content of your pages or the sub-pages of your + child pages, which do not have any child pages of their own. .. figure:: images/05-pagetree.jpg - :alt: The page tree structure of django CMS + :alt: The page tree structure of django CMS - The page tree structure: Related pages, child and sibling pages. A small branch is composed of pages 3, 4 and 5. The leaves are in this example are pages 2, 4 and 5. + The page tree structure: Related pages, child and sibling pages. A small branch is + composed of pages 3, 4 and 5. The leaves are in this example are pages 2, 4 and 5. -Each page is thus nested in the others when they have a common point: all your blog posts correspond to the parent page "Blog" for example. All your pages having the same the same central goal can be grouped together in a group and form the set of child pages of a parent page bearing the name of this topic. Thus, your parent page allows access to the content of your daughter pages and helps the user to better find his way around your site in relation to what he is looking for and wants to do. +Each page is thus nested in the others when they have a common point: all your blog +posts correspond to the parent page "Blog" for example. All your pages having the same +the same central goal can be grouped together in a group and form the set of child pages +of a parent page bearing the name of this topic. Thus, your parent page allows access to +the content of your daughter pages and helps the user to better find his way around your +site in relation to what he is looking for and wants to do. -As for a sibling page, it is simply a page at the same level as those around it in the tree. In a group of child pages, all pages are siblings. The same applies to parent pages. +As for a sibling page, it is simply a page at the same level as those around it in the +tree. In a group of child pages, all pages are siblings. The same applies to parent +pages. Managing the page tree -====================== +---------------------- -The page tree is a list of all the pages of your site. It gives you an overview of your pages and their status. +The page tree is a list of all the pages of your site. It gives you an overview of your +pages and their status. By default, the following information is displayed: .. image:: ./images/05-pagetree-form.jpg - :alt: The django CMS page tree form + :alt: The django CMS page tree form From left to right, you will find the following items: 1. The **language menu** which decides which language version of the page tree you see 2. The dotted bar on the left to **move the pages** using Drag & Drop -3. The **hide arrow**, present only in the case of a parent page. It shows or hides the page's child pages. -4. The **title of the page** in the selected language. If this says "Empty title" there is no version of that page in the selected language, yet. -5. The **root indicator** (house) indicating which page is presented at the root URL of the site. A puzzle symbol at this place indicates that the page is handled by a third-party application. +3. The **hide arrow**, present only in the case of a parent page. It shows or hides the + page's child pages. +4. The **title of the page** in the selected language. If this says "Empty title" there + is no version of that page in the selected language, yet. +5. The **root indicator** (house) indicating which page is presented at the root URL of + the site. A puzzle symbol at this place indicates that the page is handled by a + third-party application. 6. The **eye icon** allows you to preview the page 7. The **publication status menu** menu. Its color provides the following information: - * **Blank**: the translation of the page into this language does not exist. - * **White with blue border**: An unpublished draft of the page exists. There is not public version of the page. - * **Green**: the translation exists and the page is published, - * **Blue**: changes on the page have not been published. If you go to this page, the button at the top right will suggest you to publish the changes so that they are visible to the user. + - **Blank**: the translation of the page into this language does not exist. + - **White with blue border**: An unpublished draft of the page exists. There is + not public version of the page. + - **Green**: the translation exists and the page is published, + - **Blue**: changes on the page have not been published. If you go to this page, + the button at the top right will suggest you to publish the changes so that + they are visible to the user. 8. **"Menu"** indicates whether the page appears in the navigation menu of your site or not, - * Green / check: the page is visible in the navigation menu - * Gray / unchecked: the page does not appear + - Green / check: the page is visible in the navigation menu + - Gray / unchecked: the page does not appear 9. The **settings button** opens the page settings. 10. The **add button** adds a child page. -11. The **hamburger context menu** offers additional actions: - * Copy - * Cut - * Paste - * Delete... - * Set as home - * Advanced settings - * Miscellaneous information: the date of the last change, the access (restricted or not), the author of the last modifications. +11. The **hamburger context menu** offers additional actions: * Copy * Cut * Paste * + Delete... * Set as home * Advanced settings * Miscellaneous information: the date of + the last change, the access (restricted or not), the author of the last + modifications. -At the top right is a small menu, composed of a search button allowing you to find a specific page in your tree, a "..." button to choose the site whose tree you want to see (in many installations you will only see one site), and a button to add a new page. +At the top right is a small menu, composed of a search button allowing you to find a +specific page in your tree, a "..." button to choose the site whose tree you want to see +(in many installations you will only see one site), and a button to add a new page. -At the bottom right there is the legend with a complete list of all symbols used in the page tree view. Open it by clicking on the information icon: +At the bottom right there is the legend with a complete list of all symbols used in the +page tree view. Open it by clicking on the information icon: .. image:: ./images/05-pagetree-legend.jpg - :scale: 50 - :alt: Legend for the page tree + :scale: 50 + :alt: Legend for the page tree diff --git a/user-guide/source/tutorial/06-content.rst b/user-guide/source/tutorial/06-content.rst index 5ede463..1bb6e7e 100644 --- a/user-guide/source/tutorial/06-content.rst +++ b/user-guide/source/tutorial/06-content.rst @@ -1,76 +1,113 @@ .. _content: -########################### Creating places for content -########################### +=========================== -Content needs a place to live. Typically those are pages, but you also may have other content models, like aliases (chunks of content that are re-used elsewhere) or blog posts. +Content needs a place to live. Typically those are pages, but you also may have other +content models, like aliases (chunks of content that are re-used elsewhere) or blog +posts. We will work with pages in this guide. Create a page -############# +------------- To create a new page, you have three options: -1. Go to the **project menu**, select "Pages...". The sidebar will appear. Click on the button "New page" to open the page dialog box. +1. Go to the **project menu**, select "Pages...". The sidebar will appear. Click on the + button "New page" to open the page dialog box. +2. Use the **wizard** by clicking on the "Create" button at the top right of the + toolbar. The wizard dialog appears, where you can select "New page" or "New sub page" -2. Use the **wizard** by clicking on the "Create" button at the top right of the toolbar. The wizard dialog appears, where you can select "New page" or "New sub page" - .. image:: ./images/06-wizard-1.jpg - :alt: Step 1 of the wizard dialog + .. image:: ./images/06-wizard-1.jpg + :alt: Step 1 of the wizard dialog -3. In the **"Page" menu**, select "Create a page" then "New page..." (or "New sub-page...). The page dialog box appears. +3. In the **"Page" menu**, select "Create a page" then "New page..." (or "New + sub-page...). The page dialog box appears. -The page dialog is more extensive than the wizard dialog and contains all elements of the page settings. +The page dialog is more extensive than the wizard dialog and contains all elements of +the page settings. .. image:: ./images/06-create-page.jpg - :alt: aAge dialog box + :alt: aAge dialog box -In the page dialog box, give a title and possibly a menu and page title then save. The slug field will be filled automatically based on the page title. Of course, you can manually change it. +In the page dialog box, give a title and possibly a menu and page title then save. The +slug field will be filled automatically based on the page title. Of course, you can +manually change it. -Your newly created page is displayed, as well as the Django CMS menu/toolbar with the main content management tools. A newly created page is empty. Adding content is done via the structure board, in the upper right corner. +Your newly created page is displayed, as well as the Django CMS menu/toolbar with the +main content management tools. A newly created page is empty. Adding content is done via +the structure board, in the upper right corner. -The color, the size of the text... everything is generated automatically according to the page template of your site which in turn should be based on your individual graphics design. To change the design, there are options to modify the page template. If you want to change the design, talk to the developers to review it. +The color, the size of the text... everything is generated automatically according to +the page template of your site which in turn should be based on your individual graphics +design. To change the design, there are options to modify the page template. If you want +to change the design, talk to the developers to review it. .. _page-settings: Change page settings -#################### +-------------------- To view the page settings, go to "Page Settings..." in the Page menu. -These are the same parameters that are displayed when you create a page using the page dialog box. You can also access them by selecting the settings icon that appears in the page tree. +These are the same parameters that are displayed when you create a page using the page +dialog box. You can also access them by selecting the settings icon that appears in the +page tree. Required fields -=============== +~~~~~~~~~~~~~~~ -* **Title**: it will be used by the template of your site and displayed at the top of the page, in the tab of the site on the browser, and in the favorites. Search engines will also use it. It is therefore a field that must be filled in. - -* **Slug**: this is part of the URL of your page. In general, you will want it to reflect the title of your page, and it will be automatically generated from it in an appropriate format. Keep in mind that it is always valuable to keep your slugs as short and sweet / pleasant / concise as possible. +- **Title**: it will be used by the template of your site and displayed at the top of + the page, in the tab of the site on the browser, and in the favorites. Search engines + will also use it. It is therefore a field that must be filled in. +- **Slug**: this is part of the URL of your page. In general, you will want it to + reflect the title of your page, and it will be automatically generated from it in an + appropriate format. Keep in mind that it is always valuable to keep your slugs as + short and sweet / pleasant / concise as possible. .. note:: - For your SEO, it is essential that the title and slug of your page contain words related to the content of your page. + For your SEO, it is essential that the title and slug of your page contain words + related to the content of your page. Optional fields -=============== -* **Menu title**: If set this is used in your site's navigation menu otherwise the title field of the page is used. This useful if the entire title is too long to be used in navigation. For example, the title "Partner Company:Our Story" will be far too long to work well in the navigation menu, especially for your users on smartphones. "Our Story" would make a more appropriate menu title. -* **Page title**: If set it replaces the title which is displayed in search engine results and in the browser tab. +~~~~~~~~~~~~~~~ + +- **Menu title**: If set this is used in your site's navigation menu otherwise the title + field of the page is used. This useful if the entire title is too long to be used in + navigation. For example, the title "Partner Company:Our Story" will be far too long to + work well in the navigation menu, especially for your users on smartphones. "Our + Story" would make a more appropriate menu title. +- **Page title**: If set it replaces the title which is displayed in search engine + results and in the browser tab. Brief review of the different title fields -========================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -1. The **title** field is mandatory, it is the default title that is displayed on your page. It contains the keywords and is reused for menus and as page title of those fields do not overwrite it. +1. The **title** field is mandatory, it is the default title that is displayed on your + page. It contains the keywords and is reused for menus and as page title of those + fields do not overwrite it. 2. The **menu title** is only used in menus where titles should be shorter. -3. The **page title** appears in the search engine results and in the browser tab. It is longer, and contains a maximum of keywords. Be careful, however, not to go too far beyond the 60 characters, which seems to be the current display limit on Google. +3. The **page title** appears in the search engine results and in the browser tab. It is + longer, and contains a maximum of keywords. Be careful, however, not to go too far + beyond the 60 characters, which seems to be the current display limit on Google. URL options -=========== +~~~~~~~~~~~ -The URL options appear as a section a bit down in the page settings dialog. You might need to click "show" to make them visible. +The URL options appear as a section a bit down in the page settings dialog. You might +need to click "show" to make them visible. .. image:: ./images/06-url-options.jpg - :alt: URL options in the page settings dialog - -* **Overwrite URL**: allows you to modify the URL. By default, the URL of the page is the slug of your current page, placed after the slug of its parent pages. For example, its default URL could be: ``/a-propos/company/our-vision/``. Overwriting the URL would allow you to shorten it to ``/our-vision/``, even though the page still keeps its parents and children organized in the same way (About page, Company daughter page, Our Vision grandchild page). We do not recommend using this function. -* **Redirect**: Allows you to redirect the user to a different page. This is useful if you've moved content to another page but don't want to break the URL that your users may have bookmarked or affect the rank of that page in search engine results. + :alt: URL options in the page settings dialog + +- **Overwrite URL**: allows you to modify the URL. By default, the URL of the page is + the slug of your current page, placed after the slug of its parent pages. For example, + its default URL could be: ``/a-propos/company/our-vision/``. Overwriting the URL would + allow you to shorten it to ``/our-vision/``, even though the page still keeps its + parents and children organized in the same way (About page, Company daughter page, Our + Vision grandchild page). We do not recommend using this function. +- **Redirect**: Allows you to redirect the user to a different page. This is useful if + you've moved content to another page but don't want to break the URL that your users + may have bookmarked or affect the rank of that page in search engine results. diff --git a/user-guide/source/tutorial/07-plugins.rst b/user-guide/source/tutorial/07-plugins.rst index 91affa6..7d2be5b 100644 --- a/user-guide/source/tutorial/07-plugins.rst +++ b/user-guide/source/tutorial/07-plugins.rst @@ -1,115 +1,144 @@ .. _plugins: -################## Filling in content -################## +================== -Now that you have created a place where your content can live, you can start filling in actual content. Like the page tree, content is structured in so called "plugins" which live in plugin trees inside placeholders. +Now that you have created a place where your content can live, you can start filling in +actual content. Like the page tree, content is structured in so called "plugins" which +live in plugin trees inside placeholders. Structure board -############### +--------------- -Your page will have one or more placeholders to fill with content. They are displayed in the **structure board**. +Your page will have one or more placeholders to fill with content. They are displayed in +the **structure board**. -To add plugins to your page (or alias, or blog), you need go to open the structure board by clicking the button on the far right side of the menu bar. +To add plugins to your page (or alias, or blog), you need go to open the structure board +by clicking the button on the far right side of the menu bar. .. image:: ./images/07-structure-toggle.jpg - :alt: Toggle button for the structure board - :scale: 50 + :alt: Toggle button for the structure board + :scale: 50 -There are different types of plugins for adding content, each with a specific purpose. The ones you will mainly need are the "classic" rich text, image, video, link and button plugins. +There are different types of plugins for adding content, each with a specific purpose. +The ones you will mainly need are the "classic" rich text, image, video, link and button +plugins. .. note:: - Which plugins are available on your site strongly depends on the installation. Take this guide as a blueprint on how to interact with plugins. Even if you have different plugin options installed the editing process is always the same. + Which plugins are available on your site strongly depends on the installation. Take + this guide as a blueprint on how to interact with plugins. Even if you have + different plugin options installed the editing process is always the same. -Once you have clicked on the structure board button, the structure board will open on the right side of your browser window. It will show one or more placeholders. +Once you have clicked on the structure board button, the structure board will open on +the right side of your browser window. It will show one or more placeholders. .. image:: ./images/07-structure-board.jpg - :alt: django CMS structure board - :scale: 50 + :alt: django CMS structure board + :scale: 50 Adding plugins -############## +-------------- -To add content to a page, click on the button . A dialog box will open, showing you the list of content you can add. Make your choice, a new dialog box opens. +To add content to a page, click on the button . A dialog box will open, showing you the +list of content you can add. Make your choice, a new dialog box opens. .. image:: ./images/07-add-plugin.jpg - :scale: 50 - :alt: Select a plugin to add + :scale: 50 + :alt: Select a plugin to add -Fill in the fields (in the container example below you do not have to fill any fields - all are optional), and save. The new content is displayed on your page. +Fill in the fields (in the container example below you do not have to fill any fields - +all are optional), and save. The new content is displayed on your page. .. image:: ./images/07-add-container.jpg - :scale: 50 - :alt: Add container dialog box + :scale: 50 + :alt: Add container dialog box .. note:: - The exact content of the add or edit plugin depends on the plugin itself. The container plugin in the example is one of many plugins provided by the django CMS Frontend package which are designed to structure your page. + The exact content of the add or edit plugin depends on the plugin itself. The + container plugin in the example is one of many plugins provided by the django CMS + Frontend package which are designed to structure your page. - Those plugins do have a set of tabs (colored in blue) at the top of the dialog and offer a wide set of design options, most of which are optional. + Those plugins do have a set of tabs (colored in blue) at the top of the dialog and + offer a wide set of design options, most of which are optional. Repeat the operation as many times as you want and for as much content as you want. -If you want to move content to arrange their layout, for example to move an image before or after text, use the "drag & drop" function of the CMS via the notch on the left of the content type. +If you want to move content to arrange their layout, for example to move an image before +or after text, use the "drag & drop" function of the CMS via the notch on the left of +the content type. +You can also add content to change your layout; some of this content is nestable (you +can put text in columns, which are themselves inserted in a section). -You can also add content to change your layout; some of this content is nestable (you can put text in columns, which are themselves inserted in a section). - -If this element allows the addition of nestable content, the add plugin button will be available at the same level as the module title. The triangle icon will appear next to the dotted line of the drag and drop button to show or hide the nested content: +If this element allows the addition of nestable content, the add plugin button will be +available at the same level as the module title. The triangle icon will appear next to +the dotted line of the drag and drop button to show or hide the nested content: .. image:: ./images/07-nested-plugins.jpg - :scale: 50 - :alt: Nested plugins in a placeholder + :scale: 50 + :alt: Nested plugins in a placeholder .. tip:: - If you **hover** over the structure menu items while pressing the **SHIFT** key, the content displayed on the CMS page will be highlighted, so you can see what each plugin corresponds to. + If you **hover** over the structure menu items while pressing the **SHIFT** key, the + content displayed on the CMS page will be highlighted, so you can see what each + plugin corresponds to. Editing plugins -############### +--------------- You can change existing plugins by either -* **double clicking** on the content in the page (when in edit mode) -* **clicking the pencil icon** of the plugin in the structure board. +- **double clicking** on the content in the page (when in edit mode) +- **clicking the pencil icon** of the plugin in the structure board. Editing works exactly like creating a plugin - Integrating content -################### +------------------- -When you add content to your page, you may want to integrate text, a video, clickable buttons or links into your text. +When you add content to your page, you may want to integrate text, a video, clickable +buttons or links into your text. Text -==== +~~~~ -django CMS includes a rich text editor. Its interface is particularly simple, since it only consists of the text you want to enter: +django CMS includes a rich text editor. Its interface is particularly simple, since it +only consists of the text you want to enter: .. image:: ./images/07-ckeditor.jpg - :alt: django CMS' integrated rich text editor + :alt: django CMS' integrated rich text editor .. tip:: - If your installation has inline editing enabled, you can even edit text right on the web page if the pencil button in the toolbar is activated: + If your installation has inline editing enabled, you can even edit text right on the + web page if the pencil button in the toolbar is activated: - .. image:: ./images/07-inline-editing.jpg - :alt: django CMS text inline editing + .. image:: ./images/07-inline-editing.jpg + :alt: django CMS text inline editing .. tip:: - All plugins show a few words of summary in the plugin tree. Those plugin trees can get huge, though. To keep an overview, use a feature of the Container plugin: + All plugins show a few words of summary in the plugin tree. Those plugin trees can + get huge, though. To keep an overview, use a feature of the Container plugin: - The title field is a text field to briefly describe the container content. It will be displayed in the plugin tree. It is a good practice to use separate containers for different sections of your page and fill the title for quick navigation in the plugin tree. + The title field is a text field to briefly describe the container content. It will + be displayed in the plugin tree. It is a good practice to use separate containers + for different sections of your page and fill the title for quick navigation in the + plugin tree. -Some plugins can even be added directly to a text plugin using the "CMS Plugins" menu within the text editor. This is useful for adding dynamic links to your text. Dynamic links are links to other pages of your site which - should the destination change its URL - will be automatically kept up-to-date. +Some plugins can even be added directly to a text plugin using the "CMS Plugins" menu +within the text editor. This is useful for adding dynamic links to your text. Dynamic +links are links to other pages of your site which - should the destination change its +URL - will be automatically kept up-to-date. .. image:: ./images/07-text-enabled-plugins.jpg - :alt: The CMS Plugins menu in the rich text editor - + :alt: The CMS Plugins menu in the rich text editor .. warning:: - Would you like to see more content here, e.g. on images, videos, links and buttons? Please `join us on Slack `_ and the Slack ``#workgroup-documentation`` to add content here. + Would you like to see more content here, e.g. on images, videos, links and buttons? + Please `join us on Slack `_ and the Slack + ``#workgroup-documentation`` to add content here. diff --git a/user-guide/source/tutorial/08-publishing.rst b/user-guide/source/tutorial/08-publishing.rst index e138c16..f0c9b31 100644 --- a/user-guide/source/tutorial/08-publishing.rst +++ b/user-guide/source/tutorial/08-publishing.rst @@ -1,89 +1,108 @@ .. _publishing: -################## Publishing content -################## +================== .. include:: ../versioning-note.include -Once you have finished filling in your newly created page (or blog post), it is saved as a draft. It will not be published until you decide to do so. As an editor, you can view drafts, but any site visitors will only see published pages. +Once you have finished filling in your newly created page (or blog post), it is saved as +a draft. It will not be published until you decide to do so. As an editor, you can view +drafts, but any site visitors will only see published pages. -To publish a page, click on the highlighted "Publish" button in the toolbar. This button is visible in the page's edit mode. (If there is a highlighted "Edit" button instead, click it first to get to edit mode.) +To publish a page, click on the highlighted "Publish" button in the toolbar. This button +is visible in the page's edit mode. (If there is a highlighted "Edit" button instead, +click it first to get to edit mode.) .. image:: ./images/08-publish-button.jpg - :scale: 50 - :alt: The version menu showing "published" state. + :scale: 50 + :alt: The version menu showing "published" state. -When published you will be taken to the published page or the "manage versions" dialog, depending on the setup of your site. If you're taken to the manage versions dialog, click on the eye button of the top listed version to get back to the page you just published. +When published you will be taken to the published page or the "manage versions" dialog, +depending on the setup of your site. If you're taken to the manage versions dialog, +click on the eye button of the top listed version to get back to the page you just +published. -You will see in the toolbar that the version menu now shows that the content is "published". +You will see in the toolbar that the version menu now shows that the content is +"published". .. image:: ./images/08-version-menu.jpg - :scale: 50 - :alt: The version menu showing "published" state. - + :scale: 50 + :alt: The version menu showing "published" state. Version states -============== +-------------- -Since django CMS 4, pages and other publishable content can have more than the two states "draft" and "published". +Since django CMS 4, pages and other publishable content can have more than the two +states "draft" and "published". .. note:: - Versioning is managed by an optional package like django CMS Versioning. Your installation might manage versions differently. This guide assumes that django CMS Versioning is installed. -The **"published" state** marks the only version of the page that is currently visible to web site visitors. + Versioning is managed by an optional package like django CMS Versioning. Your + installation might manage versions differently. This guide assumes that django CMS + Versioning is installed. + +The **"published" state** marks the only version of the page that is currently visible +to web site visitors. The **"draft" state** of a page is the one which the editor can change. -Any version that has been published at any point in time will get the **"unpublished" state** once it is either unpublished manually or implicitly when another version of the page is published. +Any version that has been published at any point in time will get the **"unpublished" +state** once it is either unpublished manually or implicitly when another version of the +page is published. -Versions in the **"archived" state** have not been published but retained by a user for later use. +Versions in the **"archived" state** have not been published but retained by a user for +later use. -.. figure:: /images/version-states.png - :alt: Version states and the editing process +.. figure:: images/08-version-states.png + :alt: Version states and the editing process - This diagram summarizes the possible states and the actions which create a change in the state of a version. + This diagram summarizes the possible states and the actions which create a change in + the state of a version. Managing versions -================= +----------------- -To manage versions of the currently displayed page, go to the Version menu and select "Manage Versions...": +To manage versions of the currently displayed page, go to the Version menu and select +"Manage Versions...": .. image:: ./images/08-version-menu-open.jpg - :alt: open version menu - :scale: 50 + :alt: open version menu + :scale: 50 This opens the sidebar with the manage versions dialog: .. image:: ./images/08-manage-versions.jpg - :alt: Manage versions dialog + :alt: Manage versions dialog -You will see (a potentially long) list of all versions created, ever. On the right side of the list you see the action buttons. You can +You will see (a potentially long) list of all versions created, ever. On the right side +of the list you see the action buttons. You can -* **Pencil**: Go back to the **edit** view of a draft -* **Archive**: Archive a draft version for later re-use. -* **Antenna**: Publish a draft -* **Litter bin**: Delete a draft -* **Eye**: View an old version. Note: Those cannot be edited any more. -* **No-antenna**: Unpublish a currently public version -* **Undo**: Revert an archived or unpublished version into a new draft version +- **Pencil**: Go back to the **edit** view of a draft +- **Archive**: Archive a draft version for later re-use. +- **Antenna**: Publish a draft +- **Litter bin**: Delete a draft +- **Eye**: View an old version. Note: Those cannot be edited any more. +- **No-antenna**: Unpublish a currently public version +- **Undo**: Revert an archived or unpublished version into a new draft version Comparing versions -================== +------------------ -With many versions being available, it sometimes is difficult to keep track of changes. You can visually compare two versions by +With many versions being available, it sometimes is difficult to keep track of changes. +You can visually compare two versions by -* Either selecting two versions in the manage versions dialog and the choosing the "Compare versions" from the actions dropdown and hitting "Go". -* From the Version menu +- Either selecting two versions in the manage versions dialog and the choosing the + "Compare versions" from the actions dropdown and hitting "Go". +- From the Version menu An example of a visual comparison is shown here: .. image:: ./images/08-comparing-versions.jpg - :alt: Visual comparison of versions + :alt: Visual comparison of versions Added content is marked green, deleted content is marked red. .. tip:: - If you want to see the changes in the generate HTML code you can select "Source" in the upper right of the compare view. - + If you want to see the changes in the generate HTML code you can select "Source" in + the upper right of the compare view. diff --git a/user-guide/source/tutorial/images/08-version-states.png b/user-guide/source/tutorial/images/08-version-states.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b8af84bc4c6201b642c247624bce83de9280b8 GIT binary patch literal 51889 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 QvkXAs>FVdQ&MBb@09UF6F8}}l literal 0 HcmV?d00001 diff --git a/user-guide/source/tutorial/index.rst b/user-guide/source/tutorial/index.rst index a1a51a5..6010645 100644 --- a/user-guide/source/tutorial/index.rst +++ b/user-guide/source/tutorial/index.rst @@ -1,14 +1,13 @@ .. _user-tutorial: -######## Tutorial -######## +======== .. include:: ../contribute-note.include -It's strongly recommended that you follow this tutorial step-by-step. It has -been designed to introduce you to the system in a methodical way, and each -step builds on the previous one. +It's strongly recommended that you follow this tutorial step-by-step. It has been +designed to introduce you to the system in a methodical way, and each step builds on the +previous one. .. toctree:: :maxdepth: 1 @@ -22,11 +21,15 @@ step builds on the previous one. 07-plugins 08-publishing -.. note:: **Touch-screen users** +.. note:: - django CMS supports touch-screen interfaces, though there are currently some limitations in - support. You will be able to complete the tutorial using a touch-screen device, but please - consult :ref:`touch`, and see the notes on :ref:`device-support`. + **Touch-screen users** + + django CMS supports touch-screen interfaces, though there are currently some + limitations in support. You will be able to complete the tutorial using a + touch-screen device, but please consult :ref:`touch`, and see the notes on + :ref:`device-support`. .. _django-cms-developers: https://groups.google.com/group/django-cms-developers -.. _freenode : http://freenode.net/ + +.. _freenode: http://freenode.net/