Local development tutorial
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. warn:: I reverse-engineered this from the source code I inherited, I might
          not be doing the right way nor be able to defend all of technical
          decisions.

This tutorial drives through a local installation of the project for
development on Linux. It requires git, a fairly recent version of nodejs (see
:file:`.openshift/action_hooks/deploy` for a way to install it), python2 and
virtualenv.

Make a virtual environment
==========================

For the sake of the tutorial, we'll do this in the temporary directory, but you
could do it anywhere::

    $ cd /tmp

Create a python virtual environment and activate it::

    $ virtualenv memopol_env
    Using real prefix '/usr'
    New python executable in memopol_env/bin/python2
    Also creating executable in memopol_env/bin/python
    Installing setuptools, pip, wheel...done.

    $ source memopol_env/bin/activate

Clone the repository
====================

You should fork the project on github and use the fork's clone url. For the
sake of the demo, we'll use the main repository URL::

    $ git clone https://github.com/political-memory/political_memory.git
    Cloning into 'political_memory'...
    remote: Counting objects: 2516, done.
    remote: Compressing objects: 100% (109/109), done.
    remote: Total 2516 (delta 44), reused 0 (delta 0), pack-reused 2402
    Receiving objects: 100% (2516/2516), 4.40 MiB | 79.00 KiB/s, done.
    Resolving deltas: 100% (1103/1103), done.
    Checking connectivity... done.

    $ cd political_memory/

Create your own branch, ie::

    $ git checkout -b yourbranch origin/pr
    Branch yourbranch set up to track remote branch pr from origin.
    Switched to a new branch 'yourbranch'

Install Python dependencies
===========================

Then, install the package for development::

    $ pip install -e .
    Obtaining file:///tmp/political_memory
    Collecting django (from political-memory==0.0.1)
      Using cached Django-1.9-py2.py3-none-any.whl

    [output snipped for readability]

    Installing collected packages: django, sqlparse, django-debug-toolbar, django-pdb, six, django-extensions, werkzeug, south, pygments, markdown, hamlpy, django-coffeescript, ijson, python-dateutil, pytz, political-memory
      Running setup.py develop for political-memory
    Successfully installed django-1.9 django-coffeescript-0.7.2 django-debug-toolbar-1.4 django-extensions-1.5.9 django-pdb-0.4.2 hamlpy-0.82.2 ijson-2.2 markdown-2.6.5 political-memory pygments-2.0.2 python-dateutil-2.4.2 pytz-2015.7 six-1.10.0 south-1.0.2 sqlparse-0.1.18 werkzeug-0.11.2

Install NodeJS dependencies
===========================

We'll also need to install bower for the staticfiles::

    $ npm install bower
    memopol@3.0.0 /tmp/political_memory
    └── bower@1.7.0  extraneous

As well as all the requirements from :file:`package.json`::

    $ npm install
    memopol@3.0.0 /tmp/political_memory
    ├── bower@1.7.0  extraneous
    ├─┬ gulp@3.9.0

    [output snipped for readability]

    npm WARN In bower@1.7.0 replacing bundled version of configstore with configstore@0.3.2
    npm WARN In bower@1.7.0 replacing bundled version of latest-version with latest-version@1.0.1
    npm WARN In bower@1.7.0 replacing bundled version of update-notifier with update-notifier@0.3.2

Don't worry about the warnings, for they are non-critical (as all warnings).
Then, install the bower packages::

    $ node_modules/.bin/bower install
    bower bootstrap#~3.3.5          cached git://github.com/twbs/bootstrap.git#3.3.6
    bootstrap#3.3.6 static/libs/bootstrap
    └── jquery#2.1.4

    [output snipped for readability]

    jquery#2.1.4 static/libs/jquery

Build the static files with gulp::

    $ node_modules/gulp/bin/gulp.js less
    [22:26:42] Using gulpfile /tmp/political_memory/gulpfile.js
    [22:26:42] Starting 'less'...
    [22:26:44] Finished 'less' after 1.54 s

.. note:: The ``node_modules/gulp/bin/gulp.js watch`` command may be used to
          have gulp watching for changes and rebuilding static files
          automatically.

Activate ``DJANGO_DEBUG``
=========================

``DEBUG`` is disabled by default, the development server
won't run properly by default thnen, to enable it export
the ``DJANGO_DEBUG`` variable in the current shell::

    $ export DJANGO_DEBUG=True

Run the development server
==========================

Run the development server::

    $ ./manage.py runserver

    Performing system checks...

    System check identified no issues (0 silenced).
    December 09, 2015 - 21:26:47
    Django version 1.8.7, using settings 'memopol.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    [09/Dec/2015 21:26:48] "GET / HTTP/1.1" 200 13294

The website is running on ``http://127.0.0.1:8000/``.

Database migrations
===================

The repo comes with a pre-configured SQLite db with sample data so that you can
start hacking right away. However, if you were to use a local postgresql
database ie. with this sort of environment::

    export DJANGO_DATABASE_DEFAULT_NAME=memopol
    export DJANGO_DATABASE_DEFAULT_USER=postgres
    export DJANGO_DATABASE_DEFAULT_ENGINE=django.db.backends.postgresql_psycopg2
    export DJANGO_DEBUG=1
    export DJANGO_SETTINGS_MODULE=memopol.settings

Then you could run database migrations::

    $ ./manage.py migrate
    Operations to perform:
      Synchronize unmigrated apps: django_filters, staticfiles, datetimewidget, autocomplete_light, messages, adminplus, compressor, humanize, django_extensions, constance, bootstrap3
      Apply all migrations: legislature, votes, database, admin, positions, sessions, representatives, auth, contenttypes, representatives_votes, taggit
    Synchronizing apps without migrations:
      Creating tables...
        Running deferred SQL...
      Installing custom SQL...
    Running migrations:
      Rendering model states... DONE
      Applying contenttypes.0001_initial... OK

    [output snipped for readability]

      Applying taggit.0002_auto_20150616_2121... OK

Provision with data
===================

Again, the repo comes with a pre-configured SQLite db with sample data so that
you can start hacking right away. However, you could still reload sample data::

    $ ./manage.py loaddata memopol/fixtures/small_sample.json

Or actual data (takes a while)::

    $ bin/update_all

Continue to :doc:`administration`.