Short tutorial

Installation

pip install horizon-contrib

pip install git+https://github.com/michaelkuty/horizon-contrib.git@develop

Configuration

INSTALLED_APPS += ('horizon_contrib',)

Optionaly include horizon_contrib.urls with namespace='horizon'. This is only for generic functionality like a index,create,update,delete views.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    ...
    url(r'^contrib/', include('horizon_contrib.urls', namespace='horizon'), ),
    ...
)

Note

namespace is important for url reverse

Django example

Your models.py

from django import models

class Project(models.Model):

    name = models.CharField..
    description = models.CharField..
    ...

    class Meta:
        verbose_name = 'Project'

Include our urls.

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    ...
    url(r'^contrib/', include('horizon_contrib.urls', namespace='horizon'), ),
    ...
)

Visit these urls

/contrib/models/<model_name>/index/
/contrib/models/<model_name>/create/
/contrib/models/<model_name>/<model_id>/update/

Note

For these purpose must be django.contrib.contenttypes in INSTALLED_APPS.

REST API Dashboards

Dashboard structure:

my_dashboard
    |-- __init__.py
    |-- projects
        |-- __init__.py
        |-- managers.py
        |-- models.py
        |-- panel.py
    |-- dashboard.py

Your models.py

from horizon_contrib.api import APIModel
from horizon_contrib.common import register_model

class Project(APIModel):

    name = models.CharField('id', primary_key=True)  # default primary is id
    description = models.CharField..
    ...

    objects = Manager()  # see below

    class Meta:
        verbose_name = 'Project'
        abstract = True

register_model(Project)  # supply Django Content Type framework

New managers.py

from horizon_contrib.api import Manager

class Manager(Manager):

    def all(self, *args, **kwargs):
        return self.request('/projects')

Finally panel.py

from horizon_contrib.panel import ModelPanel
from horizon_redmine.dashboard import RedmineDashboard

class ProjectPanel(ModelPanel):
    name = "Projects"
    slug = 'projects'
    model_class = 'project'

RedmineDashboard.register(ProjectPanel)

navigate your browser to /contrib/models/project/index ! or /contrib/models/project/create

Manager usual usage.

utils/redmine_client.py

from django.conf import settings
from horizon_contrib.api import Manager

class RedmineManager(Manager):

    # here will change client behaviour

    # def request(...)

    def set_api(self):
        self.api = '%s://%s:%s' % (
            settings.REDMINE_PROTOCOL,
            settings.REDMINE_HOST,
            settings.REDMINE_PORT)

managers.py

from django.conf import settings
from ..utils.redmine_client import RedmineManager

class ProjectManager(RedmineManager):

    def all(self, *args, **kwargs):
        return self.request('/projects')