Leonardo Module

Leonardo module is standard Django application with many additional posibilities. In Leonardo module just type your needs and develop your application.

pip install cookiecutter
git clone https://github.com/django-leonardo/cookiecutter-module.git cookiecutter-leonardo-module
cookiecutter cookiecutter-leonardo-module

start module directory structure:

leonardo_module_blog
    |-- __init__.py
    |-- settings.py

Application

As Django documentations says, you can define your apps in apps.py or anywhere, in Leonardo we use __init__.py for simplicity. But you can define it where you want.

Redirect configurations to any other location, like:

# Django stuff
default_app_config = 'leonardo_module_blog.apps.BlogConfig'
leonardo_module_conf = 'leonardo_module_blog.apps'

Required setup for Django Application are defined AppConfig which has basic attributes described in Django Documentation. For Leonardo Module are required one options with prefix LEONARDO or default attribute which specify Leonardo Module stuff.

from django.apps import AppConfig

default_app_config = 'leonardo_module_blog.BlogConfig'

class Default(object):

    optgroup = 'Blog'

    apps = [
        'leonardo_module_blog',
        'elephantblog',
        'leonardo_module_analytics',
    ]

    js_files = [
        'js/redactor.js'
    ]

    css_files = [
        'css/redactor.css'
    ]

    config = {
        'BLOG_PAGINATE_BY': (10, _('Blog Entries Pagination')),
        'DISQUS_COMMENTS': (False, _('Enable Disqus comments')),
        'DISQUS_SHORTNAME': ('michaelkuty', _('Disqus shortname identificator.')),

    }

    navigation_extensions = [
        'elephantblog.navigation_extensions.treeinfo',
    ]

    absolute_url_overrides = {
        'elephantblog.entry': 'leonardo_store.overrides.elephantblog_entry_url_app',
        'elephantblog.categorytranslation':
        'leonardo_store.overrides.elephantblog_categorytranslation_url_app',
    }


# standard django Application
class BlogConfig(AppConfig, Default):
    name = 'leonardo_module_blog'
    verbose_name = ("Blog")

default = Default()  # define module configuration

That’s all.. Leonardo go throught every module defined in your APPS and merge all items to main settings file. Complete reference you can see below.

Note

Leonardo supports two syntax. One Pythonic way which is described upstair. default attribute which respect simple Python Object.

For some users are Python way unnecessarily complicated, for this people leonardo supports another config syntax:

LEONARDO_APPS = ['app1']

LEONARDO_ABSOLUTE_URL_OVERRIDES = {
    'elephantblog.entry': 'leonardo_store.overrides.elephantblog_entry_url_app',
    'elephantblog.categorytranslation':
    'leonardo_store.overrides.elephantblog_categorytranslation_url_app',
}

Note

Just use same keys with prefix and uppercase LEONARDO_

Tip

For all possibility settings keys see Module Reference

Settings

in the settings you may have something like this

BLOG_TITLE = 'name'

# whatever

As you expext every key from settings will be inported and merged into main settings file.

Warning

Be careful if you declare keys in the module/settings.py. Every key is imported without special merging process which may override your global settings ! It was designed only for module/app specific defaults.

Release

For releasing big amount of pip packages we use PBR which was developed for OpenStack and we have tunned version which lives here https://github.com/michaelkuty/pbr.

PBR can and does do a bunch of things for you:

  • Version: Manage version number based on git revisions and tags
  • AUTHORS: Generate AUTHORS file from git log
  • ChangeLog: Generate ChangeLog from git log
  • Sphinx Autodoc: Generate autodoc stub files for your whole module
  • Requirements: Store your dependencies in a pip requirements file (install from vcs)
  • long_description: Use your README file as a long_description
  • Smart find_packages: Smartly find packages under your root package

With this tool is managing python module pretty simple. Add these lines to your setup.py:

import setuptools

# In python < 2.7.4, a lazy loading of package `pbr` will break
# setuptools if some other modules registered functions in `atexit`.
# solution from: http://bugs.python.org/issue15881#msg170215
try:
    import multiprocessing  # noqa
except ImportError:
    pass

setuptools.setup(
    setup_requires=['pbr'],
    pbr=True)

and write meta to setup.cfg

[metadata]
name = leonardo-team
summary = Team Application for Leonardo CMS or plain FeinCMS
description-file =
    README.rst
author = Michael Kuty
author-email = kutymichael@gmail.com
home-page = https://github.com/leonardo-modules/leonardo-team.git
classifier =
    Development Status :: 5 - Production/Stable
    Framework :: Django
    Intended Audience :: Developers
    License :: OSI Approved :: BSD License
    Operating System :: OS Independent
    Programming Language :: Python
    Programming Language :: Python :: 2.6
    Programming Language :: Python :: 2.7
    Programming Language :: Python :: 3
    Programming Language :: Python :: 3.3
    Programming Language :: Python :: 3.4
    Topic :: Software Development
    Topic :: Software Development :: Libraries :: Application Frameworks

[files]
packages =
    team

and run

python setup.py sdist register

PBR is GIT driven if you want add new version for release just create new tag like:

git tag v1.4

and then upload new release to pip:

python setup.py sdist upload

Note

Full documnetation of PBR lives there http://docs.openstack.org/developer/pbr/