# Django settings for evap project.

# automatically determine SITE_ROOT, used for absolute paths below
import os.path
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(SITE_ROOT, 'database.sqlite3'), # Or path to database file if using sqlite3.
        'USER': '',                             # Not used with sqlite3.
        'PASSWORD': '',                         # Not used with sqlite3.
        'HOST': '',                             # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                             # Set to empty string for default. Not used with sqlite3.
    }
}

CACHES = {
    'default': {
    #    'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

# config for feedback links
FEEDBACK_EMAIL = "webmaster@localhost"
TRACKER_URL = "https://github.com/fsr-itse/EvaP"

# config for mail system
DEFAULT_FROM_EMAIL = "webmaster@localhost"
REPLY_TO_EMAIL = DEFAULT_FROM_EMAIL
if DEBUG:
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# key authentication settings
LOGIN_KEY_VALIDITY = 210 # days, so roughly 7 months

# minimum answers needed for publishing
MIN_ANSWER_COUNT = 2
MIN_ANSWER_PERCENTAGE = 0.2

# days before end date to send reminder
REMIND_X_DAYS_AHEAD_OF_END_DATE = 2

# email domains for the internal users of the hosting institution used to
# figure out who can login with username and password and who needs a login key
INSTITUTION_EMAIL_DOMAINS = ["hpi.uni-potsdam.de", "student.hpi.uni-potsdam.de"]

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Europe/Berlin'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', "English"),
    ('de', "Deutsch"),
)

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Locale paths
LOCALE_PATHS = (
    os.path.join(SITE_ROOT, "locale"),
)

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(SITE_ROOT, "upload")

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(SITE_ROOT, "staticfiles")

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, "static"),
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'k9-)vh3c_dtm6bpi7j(!*s_^91v0!ekjt_#o&0i$e22tnn^-vb'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.request",
    "django.contrib.messages.context_processors.messages",
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'evap.evaluation.auth.RequestAuthMiddleware',
    'evap.evaluation.403.Django403Middleware',
)

AUTHENTICATION_BACKENDS = (
    'evap.evaluation.auth.RequestAuthUserBackend',
    'django.contrib.auth.backends.ModelBackend',
)

LOGIN_URL = "/"

ROOT_URLCONF = 'evap.urls'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, "templates"),
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'south',
    'widget_tweaks',
    'evap.evaluation',
    'evap.fsr',
    'evap.results',
    'evap.student',
    'evap.contributor',
)
if not DEBUG:
    INSTALLED_APPS += (
        'raven.contrib.django.raven_compat',
    )

RAVEN_CONFIG = {
    'dsn': 'http://public:secret@example.com/1',
}

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        'sentry': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.handlers.SentryHandler',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'evap.evaluation.management.commands.import_evaj': {
            'handlers': ['console'],
            'level': 'INFO'
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        }
    }
}

# Create a local_settings.py if you want to override settings per machine
# or user, e.g. for development or different settings in deployments using
# multiple servers.
_LOCAL_SETTINGS_FILENAME = os.path.join(SITE_ROOT, "localsettings.py")
if os.path.exists(_LOCAL_SETTINGS_FILENAME):
    execfile(_LOCAL_SETTINGS_FILENAME)
del _LOCAL_SETTINGS_FILENAME

evap/settings.py
# Django settings for evap project.

# automatically determine SITE_ROOT, used for absolute paths below
import os.path
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': os.path.join(SITE_ROOT, 'database.sqlite3'), # Or path to database file if using sqlite3.
        'USER': '',                             # Not used with sqlite3.
        'PASSWORD': '',                         # Not used with sqlite3.
        'HOST': '',                             # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                             # Set to empty string for default. Not used with sqlite3.
    }
}

CACHES = {
    'default': {
    #    'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    }
}

# config for feedback links
FEEDBACK_EMAIL = "webmaster@localhost"
TRACKER_URL = "https://github.com/fsr-itse/EvaP"

# config for mail system
DEFAULT_FROM_EMAIL = "webmaster@localhost"
REPLY_TO_EMAIL = DEFAULT_FROM_EMAIL
if DEBUG:
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# key authentication settings
LOGIN_KEY_VALIDITY = 210 # days, so roughly 7 months

# minimum answers needed for publishing
MIN_ANSWER_COUNT = 2
MIN_ANSWER_PERCENTAGE = 0.2

# days before end date to send reminder
REMIND_X_DAYS_AHEAD_OF_END_DATE = 2

# email domains for the internal users of the hosting institution used to
# figure out who can login with username and password and who needs a login key
INSTITUTION_EMAIL_DOMAINS = ["hpi.uni-potsdam.de", "student.hpi.uni-potsdam.de"]

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Europe/Berlin'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', "English"),
    ('de', "Deutsch"),
)

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Locale paths
LOCALE_PATHS = (
    os.path.join(SITE_ROOT, "locale"),
)

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = os.path.join(SITE_ROOT, "upload")

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = os.path.join(SITE_ROOT, "staticfiles")

# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'

# URL prefix for admin static files -- CSS, JavaScript and images.
# Make sure to use a trailing slash.
# Examples: "http://foo.com/static/admin/", "/static/admin/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, "static"),
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'k9-)vh3c_dtm6bpi7j(!*s_^91v0!ekjt_#o&0i$e22tnn^-vb'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.request",
    "django.contrib.messages.context_processors.messages",
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'evap.evaluation.auth.RequestAuthMiddleware',
    'evap.evaluation.403.Django403Middleware',
)

AUTHENTICATION_BACKENDS = (
    'evap.evaluation.auth.RequestAuthUserBackend',
    'django.contrib.auth.backends.ModelBackend',
)

LOGIN_URL = "/"

ROOT_URLCONF = 'evap.urls'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(SITE_ROOT, "templates"),
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'south',
    'widget_tweaks',
    'evap.evaluation',
    'evap.fsr',
    'evap.results',
    'evap.student',
    'evap.contributor',
)
if not DEBUG:
    INSTALLED_APPS += (
        'raven.contrib.django.raven_compat',
    )

RAVEN_CONFIG = {
    'dsn': 'http://public:secret@example.com/1',
}

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        'sentry': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.handlers.SentryHandler',
        },
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        'evap.evaluation.management.commands.import_evaj': {
            'handlers': ['console'],
            'level': 'INFO'
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        }
    }
}

# Create a localsettings.py if you want to override settings per machine
# or user, e.g. for development or different settings in deployments using
# multiple servers.
_LOCAL_SETTINGS_FILENAME = os.path.join(SITE_ROOT, "localsettings.py")
if os.path.exists(_LOCAL_SETTINGS_FILENAME):
    execfile(_LOCAL_SETTINGS_FILENAME)
del _LOCAL_SETTINGS_FILENAME

evap/settings.py
diff --git a/README.rst b/README.rst
index 631fb7e7ed..e165d2d10f 100644
--- a/README.rst
+++ b/README.rst
@@ -14,25 +14,47 @@ documentation at ReadTheDocs: https://evap.readthedocs.org.
 
 Installation
 ------------
+The vagrant setup and a quick manual install are shown here. For more detailed instructions (including production deployment) see http://evap.readthedocs.org/en/latest/installation.html.
 
-EvaP is a plain Django application leveraging South for database migrations. In order to start hacking away,
+(0) Checkout EvaP and its submodules::
 
-(1) simply install the requirements::
+        git clone --recurse-submodules git@github.com:fsr-itse/EvaP.git
 
-        pip install -r requirements.txt
+Vagrant
+~~~~~~~
+(1) After installing Vagrant_, run in your EvaP root directory::
+
+        vagrant up
+
+(2) create yourself an admin account::
+
+        vagrant ssh
+        cd /vagrant
+        python manage.py createsuperuser
+        
+(3) and open your browser::
+
+        http://localhost:8000/
+
+Manual Install
+~~~~~~~~~~~~~~
 
-(2) go into the evap folder::
+(1) simply install the requirements::
 
-        cd evap
+        pip install -r requirements.txt
 
-(3) run the database initialization and migrations (this will use the defautl SQLite DB)::
+(2) run the database initialization and migrations::
 
         python manage.py syncdb
         python manage.py migrate
 
-(4) create yourself some users::
+(3) make the translations work::
+
+        python manage.py compilemessages
+
+(4) create yourself an admin account::
 
-        python manage.py create_user -p
+        python manage.py createsuperuser
 
 (5) start the development server::
 
@@ -104,3 +126,4 @@ these elements still apply and are not touched by the software license.
 
 .. |build| image:: https://travis-ci.org/fsr-itse/EvaP.png
 .. _build: https://travis-ci.org/fsr-itse/EvaP
+.. _Vagrant: http://www.vagrantup.com/
diff --git a/docs/installation.rst b/docs/installation.rst
index 912522418b..60447a7339 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -1,24 +1,24 @@
 Installation
 ============
 
-Dependencies
+Vagrant
 ------------
 
-EvaP is written in Python using the Django framework and you need at least
-Python 2.6 to run it. Apart from Python and Django there are some other
-dependencies that are listed in the file ``requirements.txt``. The file is
-in a format that `pip <http://www.pip-installer.org/en/latest/installing.html>`_
-can use to automatically install all the requirements. This can be performed on
-the command line with ``pip install -r requirements.txt``.
+Usually it's easiest to just use the Vagrant VM. Since we use puppet in git 
+submodules for easier configuration of the VM, you'll need to clone with 
+``--recurse-submodules`` or run ``git submodule update --init`` after checking 
+out EvaP, and of yourse you need to have Vagrant_ installed. Then you can run 
+``vagrant up`` in your EvaP root directory; this builds you a fully working 
+EvaP installation with PostgreSQL as database and Apache as webserver.
 
-*For Windows users:* Some dependencies have native code, such as lxml and PIL
-(Python Imaging Library). As compiling these with your installed compiler
-usually fails, you need to install the precompiled packages from
-`lfd.uci.edu <http://www.lfd.uci.edu/~gohlke/pythonlibs/>`_.
+You can use EvaP at ``http://localhost:8000/`` on your host, write code in your
+git repo, and access the VM with ``vagrant ssh``. Your git checkout is mounted
+in ``/vagrant`` there.
 
-*For Windows users:* For the translation of texts gettext is used.
-This can be downloaded as a precompiled package from
-`the GnuWin project <http://sourceforge.net/projects/gnuwin32/files/gettext/>`_.
+Use ``vagrant halt`` to shutdown the VM, and ``vagrant destroy`` to delete it.
+
+If you don't want to use Vagrant, you can use the following instructions to 
+manually set up EvaP.
 
 Filesystem Structure
 --------------------
@@ -33,23 +33,23 @@ file has the path ``/opt/evap/evap/settings.py``. Make sure that all files and
 directories are readable by the Apache web server. Additionally please make sure
 that the directory ``/opt/evap/evap/upload`` is writable by the web server.
 
-Settings
---------
+Dependencies
+------------
 
-The configuration of the application is done by modifying the ``settings.py``
-in the ``evap`` folder. For a production environment you should change the
-following settings:
+EvaP is written in Python using the Django framework and you need at least
+Python 2.6 to run it. Apart from Python and Django there are some other
+dependencies that are listed in the file ``requirements.txt``. The file is
+in a format that `pip <http://www.pip-installer.org/en/latest/installing.html>`_
+can use to automatically install all the requirements. This can be performed on
+the command line with ``pip install -r requirements.txt``.
 
-- Choose an appropriate database and modify the ``default`` entry in the
-  ``DATABASES`` settings. Please make sure that you use a database that
-  supports transactions.
-- Change the ``DEFAULT_FROM_EMAIL`` to an administrative mail address that is
-  used as the sender of the mails generated by the system.
-- Change ``MEDIA_ROOT`` to a directory that is writable by the web application.
-  This directory will hold user-uploaded files like photos.
-- You might want to change the ``SECRET_KEY``.
-- Modify the ``LOGGING`` configuration so that it suits your needs.
-- Finally, set ``DEBUG`` to ``False``.
+*For Windows users:* As ``lxml`` has native code and compiling it with your
+installed compiler usually fails, you need to install a precompiled package from
+`lfd.uci.edu <http://www.lfd.uci.edu/~gohlke/pythonlibs/>`_.
+
+*For Windows users:* For the compilation of translation files gettext is used.
+This can be downloaded as a precompiled package from
+`the GnuWin project <http://sourceforge.net/projects/gnuwin32/files/gettext/>`_.
 
 Database Initialization
 -----------------------
@@ -57,13 +57,13 @@ Database Initialization
 To initialize the database during the installation you have to perform the
 following command in ``/opt/evap`` directory:
 
-- ``python manage.py syncdb`` to initialize the database.
+- ``python manage.py syncdb``
 
 File Refresh
 ------------
 
 You have to run some additional commands during the installation and whenever
-you upgrade the software. Perform these steps in the ``/opt/evap``
+you update EvaP. Perform these steps in the ``/opt/evap``
 directory after you have upgraded the files:
 
 - ``python manage.py migrate`` to perform any potential database updates.
@@ -89,6 +89,25 @@ A login in a development environment can be simulated by setting the variable
 The server for this environment can be started from within the ``/opt/evap``
 directory with ``python manage.py runserver``.
 
+Productive Environment: Settings
+--------
+
+The configuration of the application is done by creating a ``local_settings.py``
+in the ``evap`` folder and overwriting the defaults from ``settings.py`` there.
+The defaults should be OK for most development purposes.
+For a production environment you should change the following settings:
+
+- Choose an appropriate database and modify the ``default`` entry in the
+  ``DATABASES`` settings. Please make sure that you use a database that
+  supports transactions.
+- Change the ``DEFAULT_FROM_EMAIL`` to an administrative mail address that is
+  used as the sender of the mails generated by the system.
+- Change ``MEDIA_ROOT`` to a directory that is writable by the web application.
+  This directory will hold user-uploaded files like photos.
+- You might want to change the ``SECRET_KEY``.
+- Modify the ``LOGGING`` configuration so that it suits your needs.
+- Finally, set ``DEBUG`` to ``False``.
+
 Productive Environment: Apache 2 Configuration
 ----------------------------------------------
 
@@ -141,3 +160,5 @@ And a /etc/cron.daily/evap like
     pushd  /opt/evap
     /usr/bin/python manage.py run_tasks daily
     popd
+
+.. _Vagrant: http://www.vagrantup.com/
diff --git a/evap/settings.py b/evap/settings.py
index 84973afd29..a1e0c551d6 100644
--- a/evap/settings.py
+++ b/evap/settings.py
@@ -251,7 +251,7 @@
     }
 }
 
-# Create a local_settings.py if you want to override settings per machine
+# Create a localsettings.py if you want to override settings per machine
 # or user, e.g. for development or different settings in deployments using
 # multiple servers.
 _LOCAL_SETTINGS_FILENAME = os.path.join(SITE_ROOT, "localsettings.py")

Update installation instructions
https://evap.readthedocs.org/en/latest/installation.html

Someone should follow these instructions and see if they are correct and complete.

The short version at https://github.com/fsr-itse/EvaP should also be checked again.

