Commits

Frank Becker  committed abefd66

added v0.1a of work shop documents

  • Participants
  • Parent commits 8d6cb8b

Comments (0)

Files changed (13)

File docs/Makefile

+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Foo.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Foo.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/Foo"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Foo"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."

File docs/_templates/layout.html

+{% extends "!layout.html" %} 
+
+{%- block footer %}
+    <div class="footer">
+    {%- if hasdoc('copyright') %}
+      {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
+    {%- else %}
+      {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
+    {%- endif %}
+    <br />Dieses Werk ist unter einem <a href="http://creativecommons.org/licenses/by-sa/3.0/de/">Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenzvertrag</a> lizenziert.<br />
+    {%- if last_updated %}
+      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
+    {%- endif %}
+    {%- if show_sphinx %}
+      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
+    {%- endif %}
+    </div>
+{%- endblock %}

File docs/app/index.rst

+..  _app:
+
+Aufgabe 5: CMS Applikation
+**************************
+
+Django versucht nach dem *Don't repeat yourself* Prinzip doppelten Code zu vermeiden.
+Es bietet über die Möglichkeit externe `Erweiterungen (*Apps*) <http://djangopackages.com/>`_
+sehr einfach wie Plugins in seine Projekte einzuklinken. Diese Möglichkeit gibt es auch
+in Django-CMS, nachfolgend erklärt als *Aufgabe 5*.
+
+Ziel
+====
+
+Unsere Seite ist so gut wie fertig. Nur die Startseite soll noch etwas aufgepeppt
+werden. Dazu soll ein Slider die Galerie 'Start' im mittleren Seitenbereich durch
+scrollen. Das wird mittels einer eigenen Django Applikation realisiert, auch wenn
+man es hätte anders machen können.
+
+Applikation
+===========
+
+Da wir entgegen einer entkoppelten App das Datenmodell des Plugins aus Aufgabe 4
+verwenden, benötigen wir keine ``models.py``. Auch die ``admin.py`` ist leer.
+Also reduziert es sich auf die ``urls.py`` welche per Generic View die Galerie mit
+dem Titel 'Start' zurück gibt. Da wir den Generic View erweitern, packen wir das
+in ``view.py``. Der eigentliche `Slider in Javascript
+<http://flowplayer.org/tools/demos/scrollable/>`_ ist im Template eingebunden.
+
+Registrierung
+=============
+
+Da Django-CMS nichts von der App weiß, muss diese registriert werden. Wie schon beim
+Plugin wird diesmal von ``CMSApp`` geerbt und hinterher diese Klasse registriert.
+Das war es schon.
+
+Beispiel
+========
+
+Legen Sie eine Galerie mit dem Titel "Start" an. Jetzt müssen wir die App noch in der
+Startseite auswählen. Dazu gibt es in den *Erweiterte Einstellungen* Bereich der
+CMS Seitenkonfiguration ein Dropdown-Menü. Das war es schon.
+
+
+

File docs/autoren.rst

+..  _autoren:
+
+Autoren
+*******
+
+`Frank Becker`_ hat Spaß daran in Python und Django zu programmieren.
+Da er oft nach einem CMS gefragt wurde, ist er auf Django-CMS
+gekommen.
+
+..  _Frank Becker: http://www.alien8.de/
+
+`Markus Zapke-Gründemann`_ kann auf neun Jahre Erfahrung in der
+Softwareentwicklung zurückblicken und arbeitet seit zwei Jahren als
+selbständiger Softwareentwickler, Berater und Trainer. Schwerpunkt seiner
+Arbeit ist die Entwicklung von Web Applikationen für Intra- und Internet mit
+verschiedenen Frameworks.
+
+..  _Markus Zapke-Gründemann: http://www.keimlink.de/

File docs/conf.py

+# -*- coding: utf-8 -*-
+#
+# Django-CMS Workshop documentation build configuration file, created by
+# sphinx-quickstart on Tue May 11 17:00:19 2010.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.doctest', 'sphinx.ext.extlinks', 'sphinx.ext.graphviz']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'Django-CMS Workshop'
+copyright = u'2011, Markus Zapke-Gründemann, Frank Becker'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.1'
+# The full version, including alpha/beta/rc tags.
+release = '0.1'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+language = 'de'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+html_title = project + ' v' + release + ' Dokumentation'
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'DjangoWorkshopdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+latex_paper_size = 'a4'
+
+# The font size ('10pt', '11pt' or '12pt').
+latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'DjangoWorkshop.tex', u'Django Workshop Dokumentation',
+   u'Markus Zapke-Gründemann', 'manual', True),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+latex_show_urls = True
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'djangoworkshop', u'Django Workshop Documentation',
+     [u'Markus Zapke-Gründemann'], 1)
+]
+
+extlinks = {
+    'djangodocs': ('http://docs.djangoproject.com/en/1.3/%s', None),
+    'djangocmsdocs': ('http://readthedocs.org/docs/django-cms/', None),
+}
+
+rst_prolog = """
+.. |djangocmsversion| replace:: 2.2
+"""

File docs/erste_seite/index.rst

+..  _firstpage:
+
+Aufgabe 2: Die erste Seite
+**************************
+
+.. contents::
+   :depth: 2
+
+Ziel
+====
+
+Ziel ist es ein einfaches Template zu generieren. Grundlage ist das Beispiel 2.
+
+
+Admin
+=====
+
+Einloggen in die `Admin Oberfläche <http://localhost/admin>`_.
+
+.. code-block:: bash
+
+    User: admin
+    Passwort: admin
+
+Startseite anlegen
+==================
+
+Legen Sie die Startseite an. Das Template ist *Start*.
+
+Seitenstruktur anlegen
+======================
+
+Bitte legen Sie einige weitere Seiten an. Diese sollten auch wieder Unterseiten haben.
+Verwenden Sie das Template *Standard*. Das Menü wird in der nächsten Aufgabe gesondert
+behandelt.
+Versuchen Sie folgende Dinge auszuprobieren:
+* Seiten verschieben
+* Seiten in das Menü aufnehmen
+* Seiten aktivieren und deaktivieren
+
+Inhalte einpflegen
+==================
+
+Pflegen Sie in der mittleren Spalte der Seite Inhalte mit den Plugins
+
+* Text
+* Bild
+* Snippet
+
+ein.
+
+
+Seitenmoderation
+================
+
+Aktivieren Sie die Variable ``CMS_MODERATOR = True`` in ``local_settings.py``.
+Das Datenbankschema muss noch angepasst werden:
+
+.. code-block:: bash
+
+    python manage.py syncdb
+    python manage.py migrate
+    python manage.py cms moderator on
+
+Anschließend gibt es einen Moderatorworkflow im Admininterface. Die Rechte der Benutzer
+werden in der Nutzerkonfiguration gesetzt.
+
+Anzeigedauer der Seiten
+=======================
+
+Aktivieren Sie die Variable ``CMS_SHOW_START_DATE = True`` und ``CMS_SHOW_END_DATE = True`` in ``local_settings.py``.
+Anschließend können sie den Publikationszeitraum der Seiten einstellen.

File docs/images/cc-by-sa.png

Added
New image

File docs/index.rst

+Django-CMS Workshop
+*******************
+
+Der *Django-CMS Workshop* ist ein freies deutsches `Django <http://www.django-cms.org>`_
+|djangocmsversion| Tutorial.
+
+Der Workshop besteht aus mehreren Aufgaben, die unter Anleitung gelöst werden.
+Jede Aufgabe hat ein eigenes Verzeichnis für Beispieldateien. Es ist ausdrücklich
+erwünscht, dass der Teilnehmer viel eigenständig probiert und auch mal Dinge falsch
+macht. Dieser Workshop ist begleitend zur `Django-CMS Dokumentation
+<http://readthedocs.org/docs/django-cms/en/2.2/>`_.
+
+Mehr Informationen zum Projekt finden sich auf der Seite :ref:`projekt`.
+
+Inhaltsverzeichnis:
+
+.. toctree::
+   :maxdepth: 2
+   
+   installation/index
+   erste_seite/index
+   menu/index
+   plugin/index
+   app/index
+   projekt
+   autoren
+   lizenz

File docs/installation/index.rst

+..  _install:
+
+Aufgabe 1: Installation
+***********************
+
+Die `Django-CMS Doku <http://http://readthedocs.org/docs/django-cms/en>`_
+hat ein ausführliches `Kapitel <http://readthedocs.org/docs/django-cms/en/2.2/getting_started/installation.html>`_.
+zur Installation. Darin werden Abhängigkeiten etc. erläutert.
+
+In manchen Fällen mag es sinnvoll sein, die Installation in allen
+Schritten einzeln durchzuführen. Zum Glück gibt es aber auch
+Installer, welche das abkürzen. Wir verwenden den `django-cms-html5-1140px-boilerplate 
+<https://github.com/bitmazk/django-cms-html5-1140px-boilerplate>`_ 
+`Fork <https://github.com/a8/django-cms-html5-1140px-boilerplate>`_
+eines der :ref:`autoren`.
+
+Es wird davon ausgegangen, dass `virtualenv: <http://www.virtualenv.org/>`_ und
+`virtualenvwrapper <http://www.doughellmann.com/projects/virtualenvwrapper/>`_
+installiert sind. Als Datenbank wird `Sqlite <www.sqlite.org/>`_ im Workshop genutzt.
+
+Zuerst den Installer auschecken.
+
+.. code-block:: bash
+
+    git clone git://github.com/a8/django-cms-html5-1140px-boilerplate.git
+
+Dann in dem Verzeichnis *django-cms-html5-1140px-boilerplate.git* folgendes ausführen:
+
+.. code-block:: bash
+
+    bin/init.sh -v 2.2-workshop -p workshop -e djcms22
+
+Wenn alles gut geht sollte Django-CMS bereits laufen.
+
+.. code-block:: bash
+
+    workon workshop
+    cd webapps/django/workshop
+    python manage.py runserver
+    python -m webbrowser -n http://localhost:8000
+
+Login:
+
+.. code-block:: bash
+
+    python -m webbrowser -n http://localhost:8000/admin
+
+* User: admin
+* Passwort: admin
+
+Es folgt eine Vorstellung, was der Installer alles macht.

File docs/lizenz.rst

+..  _lizenz:
+
+Lizenz
+======
+
+Dieses Werk ist unter einem Creative Commons Namensnennung-Weitergabe unter
+gleichen Bedingungen 3.0 Deutschland Lizenzvertrag lizenziert. Um die Lizenz
+anzusehen, gehe bitte zu http://creativecommons.org/licenses/by-sa/3.0/de/
+oder schicke einen Brief an Creative Commons, 171 Second Street, Suite 300,
+San Francisco, California 94105, USA.
+
+.. |cc-by-sa| image:: /images/cc-by-sa.png
+.. centered:: |cc-by-sa|

File docs/menu/index.rst

+..  _menu:
+
+Aufgabe 3: Menü
+***************
+
+Die `Navigation Django-CMS Doku <http://readthedocs.org/docs/django-cms/en/2.2/getting_started/navigation.html>`_
+beschreibt dieses Thema ausführlich. Wir erstellen ein relativ einfaches Menü, welches aber das Prinzip
+veranschaulicht.
+
+Ziel
+====
+
+In der linken Spalte soll das Level 1 Menü erscheinen. Gibt es Unterseiten, so soll
+die 2. Ebene in der rechten Spalte eingeblendet werden. Die aktiven Menüpunkte sollen
+hervor gehoben werden.
+Es wird das Beispiel 3 verwendet.
+
+Templatetags
+============
+
+Öffnen Sie das *templates/base.html* Template und gehen Sie auf den ``{{ show_menu }}`` Tag.
+Sehen Sie sich auch das Template des eigentlichen Menüs in *templates/menu/menu.html* an.
+
+Verändern Sie Konfiguration (Tiefen) des ``{{ show_menu }}`` Templatetags.
+
+Menüobjekte
+===========
+
+Mit Hilfe eines Django-Template Debuggers kann man sich die einzelnen Attribute ansehen.
+

File docs/plugin/index.rst

+..  _plugin:
+
+Aufgabe 4: Plugins
+******************
+
+Bisher wurden `mitgelieferte Content Plugins
+<http://readthedocs.org/docs/django-cms/en/2.2/getting_started/plugin_reference.html>`_ verwendet.
+Oft reichen diese nicht. Wie man sich eigene baut zeigt diese Aufgabe 4.
+Die `erweiterte Django-CMS Doku
+<http://readthedocs.org/docs/django-cms/en/2.2/extending_cms/extending_examples.html#my-first-plugin>`_
+bietet einen Schnelleinstieg und widmet den Plugins noch ein
+`Kapitel <http://readthedocs.org/docs/django-cms/en/2.2/extending_cms/custom_plugins.html>`_.
+
+Ziel
+====
+
+Unsere Seite soll eine Bildergallerie mit folgenden Features bekommen:
+
+* beliebig viele Bildergallerien
+* beliebige Anzahl von Bildern
+* Thumbnails
+* einfache Sortierung von Bildern
+* Anzeige in einem 3x3 Raster
+* leere Bilder
+* Slider
+* Pagination
+
+So eine Gallerie soll sich an beliebigen Stellen in der Seite an Placeholdern
+einfügen lassen.
+
+Datenmodell
+===========
+
+Im Projektordner (kann überall im Python Pfad sein) benötigen wir das Modul
+``gallery`` und schauen in die ``models.py``. Dem Django-Programmierer wird
+die Klasse GalleryPlugin auffallen, welche von CMSPlugin erbt.
+
+Nun wird die Datenbank erweitert. Da wir South nutzen also die zwei Zeilen:
+
+.. code-block:: bash
+
+    python manage.py syncdb
+    python manage.py migrate gallery
+
+Django-Admin
+============
+
+In ``gallery/admin.py`` findet sich die nicht weiter spannende Konfiguration
+für das normale Admin Interface
+
+Plugin-Registrierung
+====================
+
+In der Datei ``gallery/cms_plugins.py`` wird das Plugin registriert. Das Plugin
+erbt von ``CMSPluginBase``. Es werden ein paar Dinge wie das Template konfiguriert
+und hier die Methode ``render()`` implementiert. Die abgeleitete Klasse wird
+zuletzt registriert.
+
+Beispiel
+========
+
+Wir legen eine Gallery auf einer neuen Seite an.

File docs/projekt.rst

+..  _projekt:
+
+Über dieses Projekt
+*******************
+
+Der *Django-CMS Workshop* soll beim Einstieg in die Arbeit mit demDjango
+basierten Content Management System Framework
+`Django-CMS <http://www.django-cms.org>`_ helfen. Er kann sowohl als
+Tutorial zum Selbststudium als auch für Schulungen benutzt werden.
+
+Das gesamte Material ist unter einer freien :ref:`lizenz` erschienen.
+Verbesserungen und Mitarbeit sind gerne gesehen.
+
+Das Projekt ist in einem `Mercurial-Repository auf Bitbucket verfügbar
+<https://bitbucket.org/alien8/django-cms-workshop/src>`_. Dort finden sich auch
+alle Code-Beispiele.
+
+Alle Autoren werden auf der Seite :ref:`autoren` genannt.