.. _ref-example:

=============
Demo projects
=============

There are three example projects available within django-comments-xtd:

1. **simple**: Provides non-threaded comment support to articles. It's an only-backend project, meant as a test case of the basic features (confirmation by mail, follow-up notifications, mute link).
2. **custom**: Provides threaded comment support to articles using a new Comment class that inherits from django-comments-xtd's. The new comment model adds a **title** field to the **XtdComment** class. Find more details in :ref:`ref-extending`.
3. **comp**: This example project provides comment support to several models, defining the maximum thread level on per app.model basis. It uses moderation, removal suggestion flag, like/dislike flags, and list of users who liked/disliked comments. Comment support for Articles are frontend based while comments for Quotes are backend based.

Visit the **example** directory within the repository `in GitHub <http://github.com/danirus/django-comments-xtd/tree/master/example>`_ for a quick look.

.. contents:: Table of Contents
   :depth: 1
   :local:

.. index::
   pair: Demo; Setup 
   
Setup
=====

The recommended way to run the demo sites is in its own `virtualenv <http://www.virtualenv.org/en/latest/>`_. Once in a new virtualenv, clone the code and cd into any of the 3 demo sites. Then run the migrate command and load the data in the fixtures directory:

   .. code-block:: bash

    $ virtualenv venv
    $ source venv/bin/activate
    (venv)$ git clone git://github.com/danirus/django-comments-xtd.git
    (venv)$ cd django-comments-xtd/
    (venv)$ python setup.py install
    (venv)$ npm install
    (venv)$ node_modules/webpack/bin/webpack.js -p
    (venv)$ cd django_comments_xtd
    (venv)$ django-admin compilemessages -l fi
    (venv)$ django-admin compilemessages -l fr
    (venv)$ django-admin compilemessages -l es
    (venv)$ cd ../example/[simple|custom|comp]
    (venv)$ pip install -r requirements.txt
    (venv)$ python manage.py migrate
    (venv)$ python manage.py loaddata ../fixtures/auth.json
    (venv)$ python manage.py loaddata ../fixtures/sites.json
    (venv)$ python manage.py loaddata ../fixtures/articles.json
    (venv)$ # The **comp** example project needs quotes.json too:
    (venv)$ python manage.py loaddata ../fixtures/quotes.json
    (venv)$ python manage.py runserver

Example projects make use of the package `django-markdown2 <https://github.com/svetlyak40wt/django-markdown2>`_, which in turn depends on `Markdown2 <https://github.com/trentm/python-markdown2>`_, to render comments using `Markdown <https://en.wikipedia.org/wiki/Markdown>`_ syntax.

Fixtures provide:
 * A User admin, with password admin.
 * A default Site with domain localhost:8000 so that comment confirmation URLs are ready to hit the Django development web server.
 * A couple of article objects to which the user can post comments.

By default mails are sent directly to the console using the ``console.EmailBackend``. Comment out ``EMAIL_BACKEND`` in the settings module to send actual mails. You will need to provide working values for all ``EMAIL_*`` settings.


.. index::
   single: Simple
   pair: Simple; Demo

Simple project
==============

The simple example project features:
  
 #. An Articles App, with a model ``Article`` whose instances accept comments.
 #. Confirmation by mail is required before the comment hit the database, unless ``COMMENTS_XTD_CONFIRM_EMAIL`` is set to False. Authenticated users don't have to confirm comments.
 #. Follow up notifications via mail.
 #. Mute links to allow cancellation of follow-up notifications.
 #. No nested comments.


This example project tests the initial features provided by django-comments-xtd. Setup the project as explained above.

Some hints:
 * Log out from the admin site to post comments, otherwise they will be automatically confirmed and no email will be sent.
 * When adding new articles in the admin interface be sure to tick the box *allow comments*, otherwise comments won't be allowed.
 * Send new comments with the Follow-up box ticked and a different email address. You won't receive follow-up notifications for comments posted from the same email address the new comment is being confirmed from.
 * Click on the Mute link on the Follow-up notification email and send another comment. You will not receive further notifications.


.. index::
   single: custom
   pair: custom; demo

Custom project
==============

The **custom** example project extends the **simple** project functionality featuring:

 * Thread support up to level 2
 * A new comment class that inherits from **XtdComment** with a new **Title** field and a new form class.

.. image:: images/extend-comments-app.png


.. index::
   single: Multiple
   pair: Multiple; Demo

Comp project
============

The Comp Demo implements two apps, each of which contains a model whose instances can received comments:

 * App **articles** with the model **Article**
 * App **quotes** with the model **Quote**

Features:
 #. Comments can be nested, and the maximum thread level is established to 2.
 #. Comment confirmation via mail when the users are not authenticated.
 #. Comments hit the database only after they have been confirmed.
 #. Follow up notifications via mail.
 #. Mute links to allow cancellation of follow-up notifications.
 #. Registered users can like/dislike comments and can suggest comments removal.
 #. Registered users can see the list of users that liked/disliked comments.
 #. The homepage presents the last 5 comments posted either to the `articles.Article` or the `quotes.Quote` model.


Threaded comments
-----------------

The setting `COMMENTS_XTD_MAX_THREAD_LEVEL` is set to 2, meaning that comments may be threaded up to 2 levels below the the first level (internally known as level 0)::
    
    First comment (level 0)
        |-- Comment to "First comment" (level 1)
            |-- Comment to "Comment to First comment" (level 2)

render_xtdcomment_tree
----------------------

By using the `render_xtdcomment_tree` templatetag, both, `article_detail.html` and `quote_detail.html`, show the tree of comments posted. `article_detail.html` makes use of the arguments `allow_feedback`, `show_feedback` and `allow_flagging`, while `quote_detail.html` only show the list of comments, with no extra arguments, so users can't flag comments for removal, and neither can submit like/dislike feedback.

render_last_xtdcomments
-----------------------

The **Last 5 Comments** shown in the block at the rigght uses the templatetag `render_last_xtdcomments` to show the last 5 comments posted to either `articles.Article` or `quotes.Quote` instances. The templatetag receives the list of pairs `app.model` from which we want to gather comments and shows the given N last instances posted. The templatetag renders the template `django_comments_xtd/comment.html` for each comment retrieve.
