Skip to content

Extension of the default template system to make templates inheritance more flexible.

License

Notifications You must be signed in to change notification settings

zerc/django-vest

Repository files navigation

django-vest

Latest PyPI version Build status

Extension of default template system what makes inheritance more flexible through add themes.

Usage

Imagine that you have several sites on different hosts. They differ by visually and functionally a bit. django-vest provides the way to use the same code base in such kind of situations.

It allows splitting templates into themes - for one per site. Also, it provides the extended inheritance between these themes through DEFAULT_THEME keyword. Using this keyword in templates we can override each template. For example:

{% extends 'DEFAULT_THEME/index.html' %}
{% block page_title %}Dark theme{% endblock %}

django-vest has several ways to split a logic according to CURRENT_THEME in views. Assume that you have some form class which is different for each theme. Then your code may look like:

# forms.py
from django_vest.decorators import themeble

@themeble(name='Form', themes=('dark_theme',))
class DarkThemeForm(object):
    ''' Some kind of logic/fields for dark_theme form
    '''
    name = 'DarkThemeForm'


@themeble(name='Form')
class DefaultForm(object):
    ''' Default logic/fields for all themes
    '''
    name = 'Default form'


# views.py
from .forms import Form

In example above Form class will be an alias for DarkThemeForm if settings.CURRENT_THEME == 'dark_theme', otherwise it is DefaultForm.

You can use only_for decorator to restrict access to particular view according to value of CURRENT_THEME:

# views.py
from django.http import Http404
from django.views.generic.base import TemplateView

from django_vest import only_for

@only_for('black_theme')
def my_view(request):
    ...

# Redirect for special page
dark_theme_page = only_for('dark_theme', redirect_to='restict_access')(
    TemplateView.as_view(template_name='dark_theme_page.html'))

# Raise Http404 when user trying to open page with invalid theme
dark_theme_page_not_found = \
    only_for('dark_theme', raise_error=Http404)(
        TemplateView.as_view(template_name='dark_theme_page.html'))

Extends of default templates

Version 0.1.3 has a new template loader django_vest.templates_loaders.AppsLoader and new keyword DJANGO_ORIGIN.

Now you can override default django admin template without copy&pasting of whole origin file.

Example:

File: templates/main_theme/admin/change_list.html

{% extends "DJANGO_ORIGIN/admin/change_list.html" %}
{% load i18n admin_urls admin_static admin_list %}

{% block breadcrumbs %}
  <div>Template has been overridden</div>
  {{ block.super }}
{% endblock %}

Installation

$ pip install django_vest

Add next setting options to your settings.py:

TEMPLATE_LOADERS = (
    'django_vest.templates_loaders.Loader',
    'django_vest.templates_loaders.AppsLoader',
)

DEFAULT_THEME = 'main_theme'

# Unique for each host
CURRENT_THEME = 'dark_theme'

Or you can set the OS environment:

export DJANGO_VEST_CURRENT_THEME=dark_theme

You can specify a list of backends for getting settings. Default is:

VEST_SETTINGS_BACKENDS_LIST = (
    'django_vest.config.backends.simple',
    'django_vest.config.backends.env'
)
  • django_vest.config.backends.simple - getting settings about theme from project`s settings file.
  • django_vest.config.backends.env - from os envirom

Then you need to update a structure of your templates like this:

exampleproject/templates/
| - dark_theme
    | - index.html
| - main_theme
    | - index.html

IMPORTANT: theme folder must ends with _theme suffix (example: my_super_mega_theme)

Other config backends (Experimental)

Django-vest have are several other backends like:

django_vest.config.backends.database. If you have some singleton model to store settings of your site you can use django_vest.fields.VestField to store value of CURRENT_THEME in database.

To activate this feature you have to do next:

  • Add django_vest.fields.VestField to your settings model and do migrate.
  • Add django_vest.config.backends.database backend to the top of VEST_SETTINGS_BACKENDS_LIST setting. Example:
VEST_SETTINGS_BACKENDS_LIST = (
    'django_vest.config.backends.database',
    'django_vest.config.backends.simple',
    'django_vest.config.backends.env',
)

Contributing

  1. Fork the django-vest repo on GitHub.
  2. Clone your fork locally:
$ git clone [email protected]:your_name_here/django-vest.git
  1. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:
$ mkvirtualenv django-vest
$ cd django-vest/
$ python setup.py develop
  1. Create a branch for local development:
 $ git checkout -b name-of-your-bugfix-or-feature

Now you can make your changes locally.
  1. When you're done making changes, check that your changes pass the tests, including testing other Python versions with tox:
$ make test-all
  1. Commit your changes and push your branch to GitHub:
$ git add .
$ git commit -m "Your detailed description of your changes."
$ git push origin name-of-your-bugfix-or-feature
  1. Submit a pull request through the GitHub website.

Licence & Authors

The MIT License (MIT)

Copyright (c) 2015 Vladimir Savin.

About

Extension of the default template system to make templates inheritance more flexible.

Resources

License

Stars

Watchers

Forks

Packages

No packages published