Initial import 0.5.2

This commit is contained in:
Jérôme Schneider 2015-02-16 16:47:01 +01:00
commit 546ad07f2b
204 changed files with 11609 additions and 0 deletions

8
AUTHORS Normal file
View File

@ -0,0 +1,8 @@
The primary author of django-admin-tools is David Jean Louis <izimobil@gmail.com>.
I'd like to thanks the following people in no particular order:
- creators of the mockup of the initial django-cms dashboard proposal;
- all the people that gave me feedback on the django-cms mailing list;
- ojii and its django-dashboard draft from which I borrowed some concepts;
- James Bennett and its excellent django-registration pluggable app from
which I borrowed many things, especially from the documentation.

222
CHANGELOG Normal file
View File

@ -0,0 +1,222 @@
============================
django-admin-tools changelog
============================
Version 0.5.2, 11 August 2014:
------------------------------
* Added django 1.5 and 1.6 support
* Django 1.7 is supported but migrations still using south
* Added python 3 support
* Add some blocks to facilitate template inheritance
* Add management command to remove the dashboard preferences
* Fixed issue #126 (feedparser deprecation warning)
* Fixed issue #133 (recent Actions links have an unecessary /admin/ prefix)
* Use i18n app name in app_list, menu and breadcrumb of app_index
* Use user.get_short_name and user.get_username in admin header (fixes #121)
* Better docstring for AppList and ModelList modules
* Eliminated jumping to top of page when clicking collapse/add/remove buttons on dashboard modules
Thanks to all the folks who contributed to this release.
Version 0.5.1, 13 March 2013:
-----------------------------
Bugfix release, everyone using django < 1.5 should upgrade
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This release fixes a bug that was breaking the LinkList dashboard module
(thanks Iacopo Spalletti for the pull request).
Version 0.5.0, 06 March 2013:
-----------------------------
Important information if you are upgrading from a previous version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Starting from this version, django-admin-tools requires Django 1.3 or
superior. If you're running Django < 1.3, DO NOT UPGRADE and stay with
the 0.4.1 version.
* Compatibility with Django 1.4 and Django 1.5
* Upgraded to latest jQuery / jQuery-ui
* Many bug fixes and small improvements
Version 0.4.1, 15 November 2011:
--------------------------------
* Static files and django 1.3 support
* Fixed modules instanciation issues (fixes #65)
* Nested groups support & better html id generation (fixes issue #70)
* Fixed various js and css problems
* Added translation for Finnish + updates on other languages
* More robust dashboard layout
* Added force_show_title property to Group module
Version 0.4.0, 13 December 2010:
--------------------------------
Important information if you are upgrading from a previous version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This release of django-admin-tools introduces support for south database
migrations, if you are **not** using south you can skip this step.
Existing django-admin-tools should do the following::
python manage.py migrate --fake admin_tools.dashboard
python manage.py migrate --fake admin_tools.menu
New users should do::
python manage.py migrate admin_tools.dashboard
python manage.py migrate admin_tools.menu
Major changes
~~~~~~~~~~~~~
* big improvements of the API (see the dashboard and menu documentation for
details), the old API is still supported but now deprecated;
* added a ModelList menu item;
* custom and multiple admin sites basic support;
* better integration with django-grappelli;
* django south support.
Bugfixes and minor changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Fixed issue #40 (python 2.5 compatibility);
* Fixed issue #49: disable rendering of empty group modules;
* Fixed issue #51: more robust test runner;
* Fixed issues #57 and #58: updated custom dashboard and menu template files
to reflect the current code;
* Fixed issue #60: explicitely set color for links in module content;
* Some fixes for the future django 1.3;
* Fixes issue #61: Create empty preferences instance if user has no
preferences saved yet.
* Fixed issue #62: updated base template to reflect django 1.2 changes;
* Fixed various js namespace pollutions;
* Improved docs;
* CZ locale support.
For more informations please see:
http://bitbucket.org/izi/django-admin-tools/changesets
Version 0.3.0, 16 July 2010:
----------------------------
Major changes
~~~~~~~~~~~~~
* added tests infrastructure, code coverage is around 70%;
* import paths and class names are changed. Old class names and paths are
deprecated but still work;
* ``dashboard.modules.AppList``, ``dashboard.modules.ModelList`` and
``menu.items.AppList`` now have ability to display any models from different
apps (using glob syntax) via ``models`` and ``exclude`` parameters.
The order is now preserved. See #15;
* implemented dashboard module groups : you can now group modules in tabs,
accordion or in a stacked layout.
Bugfixes and minor changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* moved the menu and dashboard template dirs in a "admin_tools" directory to
avoid name conflicts with other apps, for example: django-cms
(see: http://github.com/digi604/django-cms-2.0/issues/issue/397/);
* fixed bookmark bugs. The saved url was urlencoded, so we need to decode it
before we save it. Added a clean_url method to the ``BookmarkForm``.
Fixes #25;
* build urlpatterns conditionally regarding the content of ``INSTALLED_APPS``;
* better display of selected menu items;
* avoid a useless ajax GET request for retrieving dashboard preferences;
* upgraded jquery and jquery ui and renamed the files to more generic names;
* don't show bookmark form if ``NoReverseError``. This was breaking the
``django.contrib.auth`` unit tests;
* fixed url lookup for remove bookmark form;
* fixed issue #26 (menu bar showing for non-staff users) and also updated
templates to match the django 1.2 templates;
* fixed issue #29 : Django 1.2 admin base template change;
* changed the way js files are loaded, hopefully now they are loaded
syncronously (fixes issue #32);
* fixed issue #33: empty applist menu items should not be displayed;
* fixed issue #34: can't drag modules into an empty column;
* fixed issue #35 (wrong docstring for menu).
New class names and paths
~~~~~~~~~~~~~~~~~~~~~~~~~
**admin_tools.dashboard**:
- admin_tools.dashboard.models.Dashboard => admin_tools.dashboard.Dashboard
- admin_tools.dashboard.models.DefaultIndexDashboard => admin_tools.dashboard.DefaultIndexDashboard
- admin_tools.dashboard.models.DefaultAppIndexDashboard => admin_tools.dashboard.DefaultAppIndexDashboard
- admin_tools.dashboard.models.AppIndexDashboard => admin_tools.dashboard.AppIndexDashboard
- admin_tools.dashboard.models.DashboardModule => admin_tools.dashboard.modules.DashboardModule
- admin_tools.dashboard.models.AppListDashboardModule => admin_tools.dashboard.modules.AppList
- admin_tools.dashboard.models.ModelListDashboardModule => admin_tools.dashboard.modules.ModelList
- admin_tools.dashboard.models.LinkListDashboardModule => admin_tools.dashboard.modules.LinkList
- admin_tools.dashboard.models.FeedDashboardModule => admin_tools.dashboard.modules.Feed
**admin_tools.menu**:
- admin_tools.menu.models.Menu => admin_tools.menu.Menu
- admin_tools.menu.models.DefaultMenu => admin_tools.menu.DefaultMenu
- admin_tools.menu.models.MenuItem => admin_tools.menu.items.MenuItem
- admin_tools.menu.models.AppListMenuItem => admin_tools.menu.items.AppList
- admin_tools.menu.models.BookmarkMenuItem => admin_tools.menu.items.Bookmarks
Version 0.2.0, 15 March 2010:
-----------------------------
* bookmarks are now being saved in the database
(fixes issue #20, thanks @alexrobbins);
* dashboard preferences are also saved in the database;
* added support for django-staticfiles STATIC_URL settings
(fixes issue #21, thanks @dstufft);
* fixed issue #23: render_theming_css tag does not work on windows;
* added polish, italian, greek and brazilian locales;
* updated docs.
Backwards incompatible changes in 0.2.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Now, django-admin-tools stores menu and dashboard preferences in the database,
so you'll need to run syncdb and to add the django-admin-tools urls to your
urlconf. These steps are described in details in the documentation.
You'll also need to add ``admin_tools`` to your ``INSTALLED_APPS`` for the
locales to work (this was not documented in previous versions).
Version 0.1.2, 13 February 2010:
--------------------------------
* fixed documentation issues;
* added locales;
* fixed issue #9: don't fail when feedparser is not installed;
* fixed issue #5: implemented dashboard layout persistence in cookies;
* enable all modules by default in the default dashboard;
* fixed recent actions log entry urls when displayed in app_index;
* added a "bookmarks" menu item and the code to manage bookmarks;
* fixed jquery issues with django 1.2.
Version 0.1.1, 10 February 2010:
--------------------------------
* fixed issue #2: template tag libraries have generic names;
* changed the way dashboards are selected, don't rely on request variables but
pass an extra argument to the template tag instead (fixes issue #3);
* fixed MANIFEST.in (fixes issue #1);
* better setup.py file.
Version 0.1.0, 10 February 2010:
--------------------------------
* Initial release

22
INSTALL Normal file
View File

@ -0,0 +1,22 @@
Thanks for downloading django-admin-tools.
This application requires Python 2.4 or later and Django 1.1.0 or newer.
It is also recommended that you install the FeedParser module
(http://www.feedparser.org/) if you want to use the feed dashboard module.
To install django-admin-tools, run the following command inside this directory::
python setup.py install
If you have the Python ``easy_install`` utility available, you can also type
the following to download and install in one step::
easy_install django-admin-tools
Or if you're using ``pip``::
pip install django-admin-tools
Or if you'd prefer you can simply place the included ``admin_tools`` directory
somewhere on your Python path, or symlink to it from somewhere on your Python
path; this is useful if you're working from a Mercurial checkout.

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
copyright (c) 2010 David JEAN LOUIS
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

10
MANIFEST.in Normal file
View File

@ -0,0 +1,10 @@
include CHANGELOG INSTALL LICENSE MANIFEST.in README AUTHORS
recursive-include docs *
recursive-include admin_tools/locale *
recursive-include admin_tools/static *
recursive-include admin_tools/dashboard/templates *
recursive-include admin_tools/menu/templates *
recursive-include admin_tools/theming/templates *
recursive-include admin_tools/dashboard/static *
recursive-include admin_tools/menu/static *
recursive-include admin_tools/theming/static *

266
PKG-INFO Normal file
View File

@ -0,0 +1,266 @@
Metadata-Version: 1.1
Name: django-admin-tools
Version: 0.5.2
Summary: A collection of tools for the django administration interface
Home-page: http://bitbucket.org/izi/django-admin-tools/
Author: David Jean Louis
Author-email: izimobil@gmail.com
License: MIT License
Download-URL: https://pypi.python.org/packages/source/d/django-admin-tools/django-admin-tools-0.5.2.tar.gz
Description:
==================
django-admin-tools
==================
django-admin-tools is a collection of extensions/tools for the default django
administration interface, it includes:
* a full featured and customizable dashboard,
* a customizable menu bar,
* tools to make admin theming easier.
The project code and bugtracker is hosted on
`Bitbucket <http://bitbucket.org/izi/django-admin-tools/>`_.
Django-admin-tools is generously documented, you can
`browse the documentation online
<http://django-admin-tools.readthedocs.org/>`_.
a good start is to read `the quickstart guide
<http://django-admin-tools.readthedocs.org/quickstart.html>`_.
Thanks for downloading django-admin-tools.
============================
django-admin-tools changelog
============================
Version 0.5.2, 11 August 2014:
------------------------------
* Added django 1.5 and 1.6 support
* Django 1.7 is supported but migrations still using south
* Added python 3 support
* Add some blocks to facilitate template inheritance
* Add management command to remove the dashboard preferences
* Fixed issue #126 (feedparser deprecation warning)
* Fixed issue #133 (recent Actions links have an unecessary /admin/ prefix)
* Use i18n app name in app_list, menu and breadcrumb of app_index
* Use user.get_short_name and user.get_username in admin header (fixes #121)
* Better docstring for AppList and ModelList modules
* Eliminated jumping to top of page when clicking collapse/add/remove buttons on dashboard modules
Thanks to all the folks who contributed to this release.
Version 0.5.1, 13 March 2013:
-----------------------------
Bugfix release, everyone using django < 1.5 should upgrade
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This release fixes a bug that was breaking the LinkList dashboard module
(thanks Iacopo Spalletti for the pull request).
Version 0.5.0, 06 March 2013:
-----------------------------
Important information if you are upgrading from a previous version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Starting from this version, django-admin-tools requires Django 1.3 or
superior. If you're running Django < 1.3, DO NOT UPGRADE and stay with
the 0.4.1 version.
* Compatibility with Django 1.4 and Django 1.5
* Upgraded to latest jQuery / jQuery-ui
* Many bug fixes and small improvements
Version 0.4.1, 15 November 2011:
--------------------------------
* Static files and django 1.3 support
* Fixed modules instanciation issues (fixes #65)
* Nested groups support & better html id generation (fixes issue #70)
* Fixed various js and css problems
* Added translation for Finnish + updates on other languages
* More robust dashboard layout
* Added force_show_title property to Group module
Version 0.4.0, 13 December 2010:
--------------------------------
Important information if you are upgrading from a previous version
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This release of django-admin-tools introduces support for south database
migrations, if you are **not** using south you can skip this step.
Existing django-admin-tools should do the following::
python manage.py migrate --fake admin_tools.dashboard
python manage.py migrate --fake admin_tools.menu
New users should do::
python manage.py migrate admin_tools.dashboard
python manage.py migrate admin_tools.menu
Major changes
~~~~~~~~~~~~~
* big improvements of the API (see the dashboard and menu documentation for
details), the old API is still supported but now deprecated;
* added a ModelList menu item;
* custom and multiple admin sites basic support;
* better integration with django-grappelli;
* django south support.
Bugfixes and minor changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* Fixed issue #40 (python 2.5 compatibility);
* Fixed issue #49: disable rendering of empty group modules;
* Fixed issue #51: more robust test runner;
* Fixed issues #57 and #58: updated custom dashboard and menu template files
to reflect the current code;
* Fixed issue #60: explicitely set color for links in module content;
* Some fixes for the future django 1.3;
* Fixes issue #61: Create empty preferences instance if user has no
preferences saved yet.
* Fixed issue #62: updated base template to reflect django 1.2 changes;
* Fixed various js namespace pollutions;
* Improved docs;
* CZ locale support.
For more informations please see:
http://bitbucket.org/izi/django-admin-tools/changesets
Version 0.3.0, 16 July 2010:
----------------------------
Major changes
~~~~~~~~~~~~~
* added tests infrastructure, code coverage is around 70%;
* import paths and class names are changed. Old class names and paths are
deprecated but still work;
* ``dashboard.modules.AppList``, ``dashboard.modules.ModelList`` and
``menu.items.AppList`` now have ability to display any models from different
apps (using glob syntax) via ``models`` and ``exclude`` parameters.
The order is now preserved. See #15;
* implemented dashboard module groups : you can now group modules in tabs,
accordion or in a stacked layout.
Bugfixes and minor changes
~~~~~~~~~~~~~~~~~~~~~~~~~~
* moved the menu and dashboard template dirs in a "admin_tools" directory to
avoid name conflicts with other apps, for example: django-cms
(see: http://github.com/digi604/django-cms-2.0/issues/issue/397/);
* fixed bookmark bugs. The saved url was urlencoded, so we need to decode it
before we save it. Added a clean_url method to the ``BookmarkForm``.
Fixes #25;
* build urlpatterns conditionally regarding the content of ``INSTALLED_APPS``;
* better display of selected menu items;
* avoid a useless ajax GET request for retrieving dashboard preferences;
* upgraded jquery and jquery ui and renamed the files to more generic names;
* don't show bookmark form if ``NoReverseError``. This was breaking the
``django.contrib.auth`` unit tests;
* fixed url lookup for remove bookmark form;
* fixed issue #26 (menu bar showing for non-staff users) and also updated
templates to match the django 1.2 templates;
* fixed issue #29 : Django 1.2 admin base template change;
* changed the way js files are loaded, hopefully now they are loaded
syncronously (fixes issue #32);
* fixed issue #33: empty applist menu items should not be displayed;
* fixed issue #34: can't drag modules into an empty column;
* fixed issue #35 (wrong docstring for menu).
New class names and paths
~~~~~~~~~~~~~~~~~~~~~~~~~
**admin_tools.dashboard**:
- admin_tools.dashboard.models.Dashboard => admin_tools.dashboard.Dashboard
- admin_tools.dashboard.models.DefaultIndexDashboard => admin_tools.dashboard.DefaultIndexDashboard
- admin_tools.dashboard.models.DefaultAppIndexDashboard => admin_tools.dashboard.DefaultAppIndexDashboard
- admin_tools.dashboard.models.AppIndexDashboard => admin_tools.dashboard.AppIndexDashboard
- admin_tools.dashboard.models.DashboardModule => admin_tools.dashboard.modules.DashboardModule
- admin_tools.dashboard.models.AppListDashboardModule => admin_tools.dashboard.modules.AppList
- admin_tools.dashboard.models.ModelListDashboardModule => admin_tools.dashboard.modules.ModelList
- admin_tools.dashboard.models.LinkListDashboardModule => admin_tools.dashboard.modules.LinkList
- admin_tools.dashboard.models.FeedDashboardModule => admin_tools.dashboard.modules.Feed
**admin_tools.menu**:
- admin_tools.menu.models.Menu => admin_tools.menu.Menu
- admin_tools.menu.models.DefaultMenu => admin_tools.menu.DefaultMenu
- admin_tools.menu.models.MenuItem => admin_tools.menu.items.MenuItem
- admin_tools.menu.models.AppListMenuItem => admin_tools.menu.items.AppList
- admin_tools.menu.models.BookmarkMenuItem => admin_tools.menu.items.Bookmarks
Version 0.2.0, 15 March 2010:
-----------------------------
* bookmarks are now being saved in the database
(fixes issue #20, thanks @alexrobbins);
* dashboard preferences are also saved in the database;
* added support for django-staticfiles STATIC_URL settings
(fixes issue #21, thanks @dstufft);
* fixed issue #23: render_theming_css tag does not work on windows;
* added polish, italian, greek and brazilian locales;
* updated docs.
Backwards incompatible changes in 0.2.0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Now, django-admin-tools stores menu and dashboard preferences in the database,
so you'll need to run syncdb and to add the django-admin-tools urls to your
urlconf. These steps are described in details in the documentation.
You'll also need to add ``admin_tools`` to your ``INSTALLED_APPS`` for the
locales to work (this was not documented in previous versions).
Version 0.1.2, 13 February 2010:
--------------------------------
* fixed documentation issues;
* added locales;
* fixed issue #9: don't fail when feedparser is not installed;
* fixed issue #5: implemented dashboard layout persistence in cookies;
* enable all modules by default in the default dashboard;
* fixed recent actions log entry urls when displayed in app_index;
* added a "bookmarks" menu item and the code to manage bookmarks;
* fixed jquery issues with django 1.2.
Version 0.1.1, 10 February 2010:
--------------------------------
* fixed issue #2: template tag libraries have generic names;
* changed the way dashboards are selected, don't rely on request variables but
pass an extra argument to the template tag instead (fixes issue #3);
* fixed MANIFEST.in (fixes issue #1);
* better setup.py file.
Version 0.1.0, 10 February 2010:
--------------------------------
* Initial release
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules

21
README Normal file
View File

@ -0,0 +1,21 @@
==================
django-admin-tools
==================
django-admin-tools is a collection of extensions/tools for the default django
administration interface, it includes:
* a full featured and customizable dashboard,
* a customizable menu bar,
* tools to make admin theming easier.
The project code and bugtracker is hosted on
`Bitbucket <http://bitbucket.org/izi/django-admin-tools/>`_.
Django-admin-tools is generously documented, you can
`browse the documentation online
<http://django-admin-tools.readthedocs.org/>`_.
a good start is to read `the quickstart guide
<http://django-admin-tools.readthedocs.org/quickstart.html>`_.
Thanks for downloading django-admin-tools.

9
admin_tools/__init__.py Normal file
View File

@ -0,0 +1,9 @@
"""
django-admin-tools is a collection of extensions/tools for the default django
administration interface, it includes:
* a full featured and customizable dashboard,
* a customizable menu bar,
* tools to make admin theming easier.
"""
VERSION = '0.5.2'

View File

@ -0,0 +1,2 @@
from admin_tools.dashboard.dashboards import *
from admin_tools.dashboard.registry import *

View File

@ -0,0 +1,313 @@
"""
Module where admin tools dashboard classes are defined.
"""
from django.template.defaultfilters import slugify
from django.utils.importlib import import_module
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.contrib.contenttypes.models import ContentType
try:
from django.utils.encoding import force_text
except ImportError:
# Django < 1.5
from django.utils.encoding import force_unicode as force_text
from admin_tools.dashboard import modules
from admin_tools.utils import get_admin_site_name, uniquify
class Dashboard(object):
"""
Base class for dashboards.
The Dashboard class is a simple python list that has three additional
properties:
``title``
The dashboard title, by default, it is displayed above the dashboard
in a ``h2`` tag. Default value: 'Dashboard'.
``template``
The template to use to render the dashboard.
Default value: 'admin_tools/dashboard/dashboard.html'
``columns``
An integer that represents the number of columns for the dashboard.
Default value: 2.
If you want to customize the look of your dashboard and it's modules, you
can declare css stylesheets and/or javascript files to include when
rendering the dashboard (these files should be placed in your
media path), for example::
from admin_tools.dashboard import Dashboard
class MyDashboard(Dashboard):
class Media:
css = ('css/mydashboard.css',)
js = ('js/mydashboard.js',)
Here's an example of a custom dashboard::
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
# we want a 3 columns layout
columns = 3
def __init__(self, **kwargs):
# append an app list module for "Applications"
self.children.append(modules.AppList(
title=_('Applications'),
exclude=('django.contrib.*',),
))
# append an app list module for "Administration"
self.children.append(modules.AppList(
title=_('Administration'),
models=('django.contrib.*',),
))
# append a recent actions module
self.children.append(modules.RecentActions(
title=_('Recent Actions'),
limit=5
))
Below is a screenshot of the resulting dashboard:
.. image:: images/dashboard_example.png
"""
title = _('Dashboard')
template = 'admin_tools/dashboard/dashboard.html'
columns = 2
children = None
class Media:
css = ()
js = ()
def __init__(self, **kwargs):
for key in kwargs:
if hasattr(self.__class__, key):
setattr(self, key, kwargs[key])
self.children = self.children or []
def init_with_context(self, context):
"""
Sometimes you may need to access context or request variables to build
your dashboard, this is what the ``init_with_context()`` method is for.
This method is called just before the display with a
``django.template.RequestContext`` as unique argument, so you can
access to all context variables and to the ``django.http.HttpRequest``.
"""
pass
def get_id(self):
"""
Internal method used to distinguish different dashboards in js code.
"""
return 'dashboard'
def _prepare_children(self):
""" Enumerates children without explicit id """
seen = set()
for id, module in enumerate(self.children):
module.id = uniquify(module.id or str(id+1), seen)
module._prepare_children()
class AppIndexDashboard(Dashboard):
"""
Class that represents an app index dashboard, app index dashboards are
displayed in the applications index page.
:class:`~admin_tools.dashboard.AppIndexDashboard` is very similar to the
:class:`~admin_tools.dashboard.Dashboard` class except
that its constructor receives two extra arguments:
``app_title``
The title of the application
``models``
A list of strings representing the available models for the current
application, example::
['yourproject.app.Model1', 'yourproject.app.Model2']
It also provides two helper methods:
``get_app_model_classes()``
Method that returns the list of model classes for the current app.
``get_app_content_types()``
Method that returns the list of content types for the current app.
If you want to provide custom app index dashboard, be sure to inherit from
this class instead of the :class:`~admin_tools.dashboard.Dashboard` class.
Here's an example of a custom app index dashboard::
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from admin_tools.dashboard import modules, AppIndexDashboard
class MyAppIndexDashboard(AppIndexDashboard):
# we don't want a title, it's redundant
title = ''
def __init__(self, app_title, models, **kwargs):
AppIndexDashboard.__init__(self, app_title, models, **kwargs)
# append a model list module that lists all models
# for the app and a recent actions module for the current app
self.children += [
modules.ModelList(self.app_title, self.models),
modules.RecentActions(
include_list=self.models,
limit=5
)
]
Below is a screenshot of the resulting dashboard:
.. image:: images/dashboard_app_index_example.png
"""
models = None
app_title = None
def __init__(self, app_title, models, **kwargs):
kwargs.update({'app_title': app_title, 'models': models})
super(AppIndexDashboard, self).__init__(**kwargs)
def get_app_model_classes(self):
"""
Helper method that returns a list of model classes for the current app.
"""
models = []
for m in self.models:
mod, cls = m.rsplit('.', 1)
mod = import_module(mod)
models.append(getattr(mod, cls))
return models
def get_app_content_types(self):
"""
Return a list of all content_types for this app.
"""
return [ContentType.objects.get_for_model(c) for c \
in self.get_app_model_classes()]
def get_id(self):
"""
Internal method used to distinguish different dashboards in js code.
"""
return '%s-dashboard' % slugify(force_text(self.app_title))
class DefaultIndexDashboard(Dashboard):
"""
The default dashboard displayed on the admin index page.
To change the default dashboard you'll have to type the following from the
commandline in your project root directory::
python manage.py customdashboard
And then set the ``ADMIN_TOOLS_INDEX_DASHBOARD`` settings variable to
point to your custom index dashboard class.
"""
def init_with_context(self, context):
site_name = get_admin_site_name(context)
# append a link list module for "quick links"
self.children.append(modules.LinkList(
_('Quick links'),
layout='inline',
draggable=False,
deletable=False,
collapsible=False,
children=[
[_('Return to site'), '/'],
[_('Change password'),
reverse('%s:password_change' % site_name)],
[_('Log out'), reverse('%s:logout' % site_name)],
]
))
# append an app list module for "Applications"
self.children.append(modules.AppList(
_('Applications'),
exclude=('django.contrib.*',),
))
# append an app list module for "Administration"
self.children.append(modules.AppList(
_('Administration'),
models=('django.contrib.*',),
))
# append a recent actions module
self.children.append(modules.RecentActions(_('Recent Actions'), 5))
# append a feed module
self.children.append(modules.Feed(
_('Latest Django News'),
feed_url='http://www.djangoproject.com/rss/weblog/',
limit=5
))
# append another link list module for "support".
self.children.append(modules.LinkList(
_('Support'),
children=[
{
'title': _('Django documentation'),
'url': 'http://docs.djangoproject.com/',
'external': True,
},
{
'title': _('Django "django-users" mailing list'),
'url': 'http://groups.google.com/group/django-users',
'external': True,
},
{
'title': _('Django irc channel'),
'url': 'irc://irc.freenode.net/django',
'external': True,
},
]
))
class DefaultAppIndexDashboard(AppIndexDashboard):
"""
The default dashboard displayed on the applications index page.
To change the default dashboard you'll have to type the following from the
commandline in your project root directory::
python manage.py customdashboard
And then set the ``ADMIN_TOOLS_APP_INDEX_DASHBOARD`` settings variable to
point to your custom app index dashboard class.
"""
# we disable title because its redundant with the model list module
title = ''
def __init__(self, *args, **kwargs):
AppIndexDashboard.__init__(self, *args, **kwargs)
# append a model list module and a recent actions module
self.children += [
modules.ModelList( self.app_title,self.models),
modules.RecentActions(
_('Recent Actions'),
include_list=self.get_app_content_types(),
limit=5
)
]

View File

@ -0,0 +1,30 @@
from django import forms
from admin_tools.dashboard.models import DashboardPreferences
class DashboardPreferencesForm(forms.ModelForm):
"""
This form allows the user to edit dashboard preferences. It doesn't show
the user field. It expects the user to be passed in from the view.
"""
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
self.dashboard_id = kwargs.pop('dashboard_id', None)
super(DashboardPreferencesForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
preferences = super(DashboardPreferencesForm, self).save(
commit=False,
*args,
**kwargs
)
preferences.user = self.user
preferences.dashboard_id = self.dashboard_id
preferences.save()
return preferences
class Meta:
fields = ('data',)
model = DashboardPreferences

View File

@ -0,0 +1,8 @@
from django.core.management import BaseCommand
from admin_tools.dashboard.models import DashboardPreferences
class Command(BaseCommand):
help = """Clears dashboard preferences."""
def handle(self, *args, **options):
DashboardPreferences._default_manager.all().delete()

View File

@ -0,0 +1,23 @@
import os
from django.core.management.base import BaseCommand, CommandError
from django.template.loader import render_to_string
DEFAULT_FILE = 'dashboard.py'
class Command(BaseCommand):
help = ('Creates a template file containing the base code to get you '
'started with your custom dashboard.')
args = '[file]'
label = 'application name'
def handle(self, file=None, **options):
context = {}
context['project'] = os.path.basename(os.getcwd())
tpl = ['dashboard/dashboard.txt', 'admin_tools/dashboard/dashboard.txt']
dst = file is not None and file or DEFAULT_FILE
if os.path.exists(dst):
raise CommandError('file "%s" already exists' % dst)
context['file'] = os.path.basename(dst).split('.')[0]
open(dst, 'w').write(render_to_string(tpl, context))
self.stdout.write('"%s" written.' % os.path.join(dst))

View File

@ -0,0 +1,75 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
from django.conf import settings
user_model = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'DashboardPreferences'
db.create_table('admin_tools_dashboard_preferences', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[user_model])),
('data', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('dashboard', ['DashboardPreferences'])
def backwards(self, orm):
# Deleting model 'DashboardPreferences'
db.delete_table('admin_tools_dashboard_preferences')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
user_model: {
'Meta': {'object_name': user_model.split('.')[1]},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'dashboard.dashboardpreferences': {
'Meta': {'ordering': "('user',)", 'object_name': 'DashboardPreferences', 'db_table': "'admin_tools_dashboard_preferences'"},
'data': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['%s']" % user_model})
}
}
complete_apps = ['dashboard']

View File

@ -0,0 +1,71 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
from django.conf import settings
user_model = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'DashboardPreferences.dashboard_id'
db.add_column('admin_tools_dashboard_preferences', 'dashboard_id', self.gf('django.db.models.fields.CharField')(default='dashboard', max_length=100), keep_default=False)
def backwards(self, orm):
# Deleting field 'DashboardPreferences.dashboard_id'
db.delete_column('admin_tools_dashboard_preferences', 'dashboard_id')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
user_model: {
'Meta': {'object_name': user_model.split('.')[1]},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'dashboard.dashboardpreferences': {
'Meta': {'ordering': "('user',)", 'object_name': 'DashboardPreferences', 'db_table': "'admin_tools_dashboard_preferences'"},
'dashboard_id': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'data': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['%s']" % user_model})
}
}
complete_apps = ['dashboard']

View File

@ -0,0 +1,71 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
from django.conf import settings
user_model = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding unique constraint on 'DashboardPreferences', fields ['dashboard_id', 'user']
db.create_unique('admin_tools_dashboard_preferences', ['dashboard_id', 'user_id'])
def backwards(self, orm):
# Removing unique constraint on 'DashboardPreferences', fields ['dashboard_id', 'user']
db.delete_unique('admin_tools_dashboard_preferences', ['dashboard_id', 'user_id'])
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
user_model: {
'Meta': {'object_name': user_model.split('.')[1]},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'dashboard.dashboardpreferences': {
'Meta': {'ordering': "('user',)", 'unique_together': "(('user', 'dashboard_id'),)", 'object_name': 'DashboardPreferences', 'db_table': "'admin_tools_dashboard_preferences'"},
'dashboard_id': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'data': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['%s']" % user_model})
}
}
complete_apps = ['dashboard']

View File

@ -0,0 +1,103 @@
"""
This module contains the base classes for the dashboard and dashboard modules.
"""
from django.conf import settings
from django.db import models
user_model = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
class DashboardPreferences(models.Model):
"""
This model represents the dashboard preferences for a user.
"""
user = models.ForeignKey(user_model)
data = models.TextField()
dashboard_id = models.CharField(max_length=100)
def __unicode__(self):
return "%s dashboard preferences" % self.user.username
class Meta:
db_table = 'admin_tools_dashboard_preferences'
unique_together = ('user', 'dashboard_id',)
ordering = ('user',)
# warnings for deprecated imports
from admin_tools.deprecate_utils import import_path_is_changed
from admin_tools.dashboard import dashboards
from admin_tools.dashboard import modules
class Dashboard(
import_path_is_changed(
'admin_tools.dashboard.models.Dashboard',
'admin_tools.dashboard.Dashboard'
),
dashboards.Dashboard
): pass
class DefaultIndexDashboard(
import_path_is_changed(
'admin_tools.dashboard.models.DefaultIndexDashboard',
'admin_tools.dashboard.DefaultIndexDashboard',
),
dashboards.DefaultIndexDashboard
):pass
class DefaultAppIndexDashboard(
import_path_is_changed(
'admin_tools.dashboard.models.DefaultAppIndexDashboard',
'admin_tools.dashboard.DefaultAppIndexDashboard'
),
dashboards.DefaultAppIndexDashboard
):pass
class AppIndexDashboard(
import_path_is_changed(
'admin_tools.dashboard.models.AppIndexDashboard',
'admin_tools.dashboard.AppIndexDashboard'
),
dashboards.AppIndexDashboard
):pass
class DashboardModule(
import_path_is_changed(
'admin_tools.dashboard.models.DashboardModule',
'admin_tools.dashboard.modules.DashboardModule',
),
modules.DashboardModule
):pass
class AppListDashboardModule(
import_path_is_changed(
'admin_tools.dashboard.models.AppListDashboardModule',
'admin_tools.dashboard.modules.AppList',
),
modules.AppList
): pass
class ModelListDashboardModule(
import_path_is_changed(
'admin_tools.dashboard.models.ModelListDashboardModule',
'admin_tools.dashboard.modules.ModelList',
),
modules.ModelList
): pass
class LinkListDashboardModule(
import_path_is_changed(
'admin_tools.dashboard.models.LinkListDashboardModule',
'admin_tools.dashboard.modules.LinkList',
),
modules.LinkList
): pass
class FeedDashboardModule(
import_path_is_changed(
'admin_tools.dashboard.models.FeedDashboardModule',
'admin_tools.dashboard.modules.Feed',
),
modules.Feed
): pass

View File

@ -0,0 +1,729 @@
"""
Module where admin tools dashboard modules classes are defined.
"""
from django.utils.text import capfirst
from django.core.urlresolvers import reverse
from django.contrib.contenttypes.models import ContentType
from django.forms.util import flatatt
from django.utils.translation import ugettext_lazy as _
from django.utils.itercompat import is_iterable
from admin_tools.utils import AppListElementMixin, uniquify
class DashboardModule(object):
"""
Base class for all dashboard modules.
Dashboard modules have the following properties:
``enabled``
Boolean that determines whether the module should be enabled in
the dashboard by default or not. Default value: ``True``.
``draggable``
Boolean that determines whether the module can be draggable or not.
Draggable modules can be re-arranged by users. Default value: ``True``.
``collapsible``
Boolean that determines whether the module is collapsible, this
allows users to show/hide module content. Default: ``True``.
``deletable``
Boolean that determines whether the module can be removed from the
dashboard by users or not. Default: ``True``.
``title``
String that contains the module title, make sure you use the django
gettext functions if your application is multilingual.
Default value: ''.
``title_url``
String that contains the module title URL. If given the module
title will be a link to this URL. Default value: ``None``.
``css_classes``
A list of css classes to be added to the module ``div`` class
attribute. Default value: ``None``.
``pre_content``
Text or HTML content to display above the module content.
Default value: ``None``.
``content``
The module text or HTML content. Default value: ``None``.
``post_content``
Text or HTML content to display under the module content.
Default value: ``None``.
``template``
The template to use to render the module.
Default value: 'admin_tools/dashboard/module.html'.
"""
template = 'admin_tools/dashboard/module.html'
enabled = True
draggable = True
collapsible = True
deletable = True
show_title = True
title = ''
title_url = None
css_classes = None
pre_content = None
post_content = None
children = None
id = None
def __init__(self, title=None, **kwargs):
if title is not None:
self.title = title
for key in kwargs:
if hasattr(self.__class__, key):
setattr(self, key, kwargs[key])
self.children = self.children or []
self.css_classes = self.css_classes or []
# boolean flag to ensure that the module is initialized only once
self._initialized = False
def init_with_context(self, context):
"""
Like for the :class:`~admin_tools.dashboard.Dashboard` class, dashboard
modules have a ``init_with_context`` method that is called with a
``django.template.RequestContext`` instance as unique argument.
This gives you enough flexibility to build complex modules, for
example, let's build a "history" dashboard module, that will list the
last ten visited pages::
from admin_tools.dashboard import modules
class HistoryDashboardModule(modules.LinkList):
title = 'History'
def init_with_context(self, context):
request = context['request']
# we use sessions to store the visited pages stack
history = request.session.get('history', [])
for item in history:
self.children.append(item)
# add the current page to the history
history.insert(0, {
'title': context['title'],
'url': request.META['PATH_INFO']
})
if len(history) > 10:
history = history[:10]
request.session['history'] = history
Here's a screenshot of our history item:
.. image:: images/history_dashboard_module.png
"""
pass
def is_empty(self):
"""
Return True if the module has no content and False otherwise.
>>> mod = DashboardModule()
>>> mod.is_empty()
True
>>> mod.pre_content = 'foo'
>>> mod.is_empty()
False
>>> mod.pre_content = None
>>> mod.is_empty()
True
>>> mod.children.append('foo')
>>> mod.is_empty()
False
>>> mod.children = []
>>> mod.is_empty()
True
"""
return self.pre_content is None and \
self.post_content is None and \
len(self.children) == 0
def render_css_classes(self):
"""
Return a string containing the css classes for the module.
>>> mod = DashboardModule(enabled=False, draggable=True,
... collapsible=True, deletable=True)
>>> mod.render_css_classes()
'dashboard-module disabled draggable collapsible deletable'
>>> mod.css_classes.append('foo')
>>> mod.render_css_classes()
'dashboard-module disabled draggable collapsible deletable foo'
>>> mod.enabled = True
>>> mod.render_css_classes()
'dashboard-module draggable collapsible deletable foo'
"""
ret = ['dashboard-module']
if not self.enabled:
ret.append('disabled')
if self.draggable:
ret.append('draggable')
if self.collapsible:
ret.append('collapsible')
if self.deletable:
ret.append('deletable')
ret += self.css_classes
return ' '.join(ret)
def _prepare_children(self):
pass
class Group(DashboardModule):
"""
Represents a group of modules, the group can be displayed in tabs,
accordion, or just stacked (default).
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.Group`
has two extra properties:
``display``
A string determining how the group should be rendered, this can be one
of the following values: 'tabs' (default), 'accordion' or 'stacked'.
``force_show_title``
Default behaviour for Group module is to force children to always show
the title if Group has ``display`` = ``stacked``. If this flag is set
to ``False``, children title is shown according to their``show_title``
property. Note that in this case is children responsibility to have
meaningful content if no title is shown.
Here's an example of modules group::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
self.children.append(modules.Group(
title="My group",
display="tabs",
children=[
modules.AppList(
title='Administration',
models=('django.contrib.*',)
),
modules.AppList(
title='Applications',
exclude=('django.contrib.*',)
)
]
))
The screenshot of what this code produces:
.. image:: images/dashboard_module_group.png
"""
force_show_title = True
template = 'admin_tools/dashboard/modules/group.html'
display = 'tabs'
def init_with_context(self, context):
if self._initialized:
return
for module in self.children:
# to simplify the whole stuff, modules have some limitations,
# they cannot be dragged, collapsed or closed
module.collapsible = False
module.draggable = False
module.deletable = False
if self.force_show_title:
module.show_title = (self.display == 'stacked')
module.init_with_context(context)
self._initialized = True
def is_empty(self):
"""
A group of modules is considered empty if it has no children or if
all its children are empty.
>>> from admin_tools.dashboard.modules import DashboardModule, LinkList
>>> mod = Group()
>>> mod.is_empty()
True
>>> mod.children.append(DashboardModule())
>>> mod.is_empty()
True
>>> mod.children.append(LinkList('links', children=[
... {'title': 'example1', 'url': 'http://example.com'},
... {'title': 'example2', 'url': 'http://example.com'},
... ]))
>>> mod.is_empty()
False
"""
if super(Group, self).is_empty():
return True
for child in self.children:
if not child.is_empty():
return False
return True
def _prepare_children(self):
# computes ids for children: generates them if they are not set
# and then prepends them with this group's id
seen = set()
for id, module in enumerate(self.children):
proposed_id = "%s_%s" % (self.id, module.id or id+1)
module.id = uniquify(proposed_id, seen)
module._prepare_children()
class LinkList(DashboardModule):
"""
A module that displays a list of links.
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.LinkList` takes
an extra keyword argument:
``layout``
The layout of the list, possible values are ``stacked`` and ``inline``.
The default value is ``stacked``.
Link list modules children are simple python dictionaries that can have the
following keys:
``title``
The link title.
``url``
The link URL.
``external``
Boolean that indicates whether the link is an external one or not.
``description``
A string describing the link, it will be the ``title`` attribute of
the html ``a`` tag.
``attrs``
Hash comprising attributes of the html ``a`` tag.
Children can also be iterables (lists or tuples) of length 2, 3, 4 or 5.
Here's a small example of building a link list module::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
self.children.append(modules.LinkList(
layout='inline',
children=(
{
'title': 'Python website',
'url': 'http://www.python.org',
'external': True,
'description': 'Python programming language rocks !',
'attrs': {'target': '_blank'},
},
['Django website', 'http://www.djangoproject.com', True],
['Some internal link', '/some/internal/link/'],
)
))
The screenshot of what this code produces:
.. image:: images/linklist_dashboard_module.png
"""
title = _('Links')
template = 'admin_tools/dashboard/modules/link_list.html'
layout = 'stacked'
def init_with_context(self, context):
if self._initialized:
return
new_children = []
for link in self.children:
if isinstance(link, (tuple, list,)):
link_dict = {'title': link[0], 'url': link[1]}
if len(link) >= 3:
link_dict['external'] = link[2]
if len(link) >= 4:
link_dict['description'] = link[3]
if len(link) >= 5:
link_dict['attrs'] = link[4]
link = link_dict
if 'attrs' not in link:
link['attrs'] = {}
link['attrs']['href'] = link['url']
if link.get('description', ''):
link['attrs']['title'] = link['description']
if link.get('external', False):
link['attrs']['class'] = ' '.join(['external-link']
+ link['attrs'].get('class', '').split(' ')).strip()
link['attrs'] = flatatt(link['attrs'])
new_children.append(link)
self.children = new_children
self._initialized = True
class AppList(DashboardModule, AppListElementMixin):
"""
Module that lists installed apps and their models.
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.AppList`
has two extra properties:
``models``
A list of models to include, only models whose name (e.g.
"blog.comments.models.Comment") match one of the strings (e.g. "blog.*")
in the models list will appear in the dashboard module.
``exclude``
A list of models to exclude, if a model name (e.g.
"blog.comments.models.Comment") match an element of this list (e.g.
"blog.comments.*") it won't appear in the dashboard module.
If no models/exclude list is provided, **all apps** are shown.
Here's a small example of building an app list module::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
# will only list the django.contrib apps
self.children.append(modules.AppList(
title='Administration',
models=('django.contrib.*',)
))
# will list all apps except the django.contrib ones
self.children.append(modules.AppList(
title='Applications',
exclude=('django.contrib.*',)
))
The screenshot of what this code produces:
.. image:: images/applist_dashboard_module.png
.. note::
Note that this module takes into account user permissions, for
example, if a user has no rights to change or add a ``Group``, then
the django.contrib.auth.Group model line will not be displayed.
"""
title = _('Applications')
template = 'admin_tools/dashboard/modules/app_list.html'
models = None
exclude = None
include_list = None
exclude_list = None
def __init__(self, title=None, **kwargs):
self.models = list(kwargs.pop('models', []))
self.exclude = list(kwargs.pop('exclude', []))
self.include_list = kwargs.pop('include_list', []) # deprecated
self.exclude_list = kwargs.pop('exclude_list', []) # deprecated
super(AppList, self).__init__(title, **kwargs)
def init_with_context(self, context):
if self._initialized:
return
items = self._visible_models(context['request'])
apps = {}
for model, perms in items:
app_label = model._meta.app_label
if app_label not in apps:
apps[app_label] = {
'title': capfirst(app_label.title()),
'url': self._get_admin_app_list_url(model, context),
'models': []
}
model_dict = {}
model_dict['title'] = capfirst(model._meta.verbose_name_plural)
if perms['change']:
model_dict['change_url'] = self._get_admin_change_url(model, context)
if perms['add']:
model_dict['add_url'] = self._get_admin_add_url(model, context)
apps[app_label]['models'].append(model_dict)
for app in sorted(apps.keys()):
# sort model list alphabetically
apps[app]['models'].sort(key=lambda x: x['title'])
self.children.append(apps[app])
self._initialized = True
class ModelList(DashboardModule, AppListElementMixin):
"""
Module that lists a set of models.
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.ModelList` takes
two extra arguments:
``models``
A list of models to include, only models whose name (e.g.
"blog.comments.models.Comment") match one of the strings (e.g. "blog.*")
in the models list will appear in the dashboard module.
``exclude``
A list of models to exclude, if a model name (e.g.
"blog.comments.models.Comment") match an element of this list (e.g.
"blog.comments.*") it won't appear in the dashboard module.
Here's a small example of building a model list module::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
# will only list the django.contrib.auth models
self.children += [
modules.ModelList(
title='Authentication',
models=['django.contrib.auth.*',]
)
]
The screenshot of what this code produces:
.. image:: images/modellist_dashboard_module.png
.. note::
Note that this module takes into account user permissions, for
example, if a user has no rights to change or add a ``Group``, then
the django.contrib.auth.Group model line will not be displayed.
"""
template = 'admin_tools/dashboard/modules/model_list.html'
models = None
exclude = None
include_list = None
exclude_list = None
def __init__(self, title=None, models=None, exclude=None, **kwargs):
self.models = list(models or [])
self.exclude = list(exclude or [])
self.include_list = kwargs.pop('include_list', []) # deprecated
self.exclude_list = kwargs.pop('exclude_list', []) # deprecated
if 'extra' in kwargs:
self.extra = kwargs.pop('extra')
else:
self.extra = []
super(ModelList, self).__init__(title, **kwargs)
def init_with_context(self, context):
if self._initialized:
return
items = self._visible_models(context['request'])
if not items:
return
for model, perms in items:
model_dict = {}
model_dict['title'] = capfirst(model._meta.verbose_name_plural)
if perms['change']:
model_dict['change_url'] = self._get_admin_change_url(model, context)
if perms['add']:
model_dict['add_url'] = self._get_admin_add_url(model, context)
self.children.append(model_dict)
if self.extra:
# TODO - permissions support
for extra_url in self.extra:
model_dict = {}
model_dict['title'] = extra_url['title']
model_dict['change_url'] = extra_url['change_url']
model_dict['add_url'] = extra_url.get('add_url', None)
self.children.append(model_dict)
self._initialized = True
class RecentActions(DashboardModule):
"""
Module that lists the recent actions for the current user.
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.RecentActions`
takes three extra keyword arguments:
``include_list``
A list of contenttypes (e.g. "auth.group" or "sites.site") to include,
only recent actions that match the given contenttypes will be
displayed.
``exclude_list``
A list of contenttypes (e.g. "auth.group" or "sites.site") to exclude,
recent actions that match the given contenttypes will not be
displayed.
``limit``
The maximum number of children to display. Default value: 10.
Here's a small example of building a recent actions module::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
# will only list the django.contrib apps
self.children.append(modules.RecentActions(
title='Django CMS recent actions',
include_list=('cms.page', 'cms.cmsplugin',)
))
The screenshot of what this code produces:
.. image:: images/recentactions_dashboard_module.png
"""
title = _('Recent Actions')
template = 'admin_tools/dashboard/modules/recent_actions.html'
limit = 10
include_list = None
exclude_list = None
def __init__(self, title=None, limit=10, include_list=None,
exclude_list=None, **kwargs):
self.include_list = include_list or []
self.exclude_list = exclude_list or []
kwargs.update({'limit': limit})
super(RecentActions, self).__init__(title, **kwargs)
def init_with_context(self, context):
if self._initialized:
return
from django.db.models import Q
from django.contrib.admin.models import LogEntry
request = context['request']
def get_qset(list):
qset = None
for contenttype in list:
if isinstance(contenttype, ContentType):
current_qset = Q(content_type__id=contenttype.id)
else:
try:
app_label, model = contenttype.split('.')
except:
raise ValueError('Invalid contenttype: "%s"' % contenttype)
current_qset = Q(
content_type__app_label=app_label,
content_type__model=model
)
if qset is None:
qset = current_qset
else:
qset = qset | current_qset
return qset
if request.user is None:
qs = LogEntry.objects.all()
else:
qs = LogEntry.objects.filter(user__id__exact=request.user.id)
if self.include_list:
qs = qs.filter(get_qset(self.include_list))
if self.exclude_list:
qs = qs.exclude(get_qset(self.exclude_list))
self.children = qs.select_related('content_type', 'user')[:self.limit]
if not len(self.children):
self.pre_content = _('No recent actions.')
self._initialized = True
class Feed(DashboardModule):
"""
Class that represents a feed dashboard module.
.. important::
This class uses the
`Universal Feed Parser module <http://www.feedparser.org/>`_ to parse
the feeds, so you'll need to install it, all feeds supported by
FeedParser are thus supported by the Feed
As well as the :class:`~admin_tools.dashboard.modules.DashboardModule`
properties, the :class:`~admin_tools.dashboard.modules.Feed` takes two
extra keyword arguments:
``feed_url``
The URL of the feed.
``limit``
The maximum number of feed children to display. Default value: None,
which means that all children are displayed.
Here's a small example of building a recent actions module::
from admin_tools.dashboard import modules, Dashboard
class MyDashboard(Dashboard):
def __init__(self, **kwargs):
Dashboard.__init__(self, **kwargs)
# will only list the django.contrib apps
self.children.append(modules.Feed(
title=_('Latest Django News'),
feed_url='http://www.djangoproject.com/rss/weblog/',
limit=5
))
The screenshot of what this code produces:
.. image:: images/feed_dashboard_module.png
"""
title = _('RSS Feed')
template = 'admin_tools/dashboard/modules/feed.html'
feed_url = None
limit = None
def __init__(self, title=None, feed_url=None, limit=None, **kwargs):
kwargs.update({'feed_url': feed_url, 'limit': limit})
super(Feed, self).__init__(title, **kwargs)
def init_with_context(self, context):
if self._initialized:
return
import datetime
if self.feed_url is None:
raise ValueError('You must provide a valid feed URL')
try:
import feedparser
except ImportError:
self.children.append({
'title': ('You must install the FeedParser python module'),
'warning': True,
})
return
feed = feedparser.parse(self.feed_url)
if self.limit is not None:
entries = feed['entries'][:self.limit]
else:
entries = feed['entries']
for entry in entries:
entry.url = entry.link
try:
entry.date = datetime.date(*entry.published_parsed[0:3])
except:
# no date for certain feeds
pass
self.children.append(entry)
self._initialized = True

View File

@ -0,0 +1,59 @@
#coding: utf-8
class Registry(object):
"""
Registry for application dashboards.
"""
registry = {}
def register(cls, klass, app_name):
from admin_tools.dashboard.dashboards import Dashboard
if not issubclass(klass, Dashboard):
raise ValueError('%s is not an instance of Dashboard' % klass)
if app_name in cls.registry:
raise ValueError('A dashboard has already been registered for '
'the application "%s"', app_name)
cls.registry[app_name] = klass
register = classmethod(register)
def register(cls, *args, **kwargs):
"""
Register a custom dashboard into the global registry.
"""
Registry.register(cls, *args, **kwargs)
def autodiscover(blacklist=[]):
"""
Automagically discover custom dashboards and menus for installed apps.
Optionally you can pass a ``blacklist`` of apps that you don't want to
provide their own app index dashboard.
"""
import imp
from django.conf import settings
from django.utils.importlib import import_module
blacklist.append('admin_tools.dashboard')
blacklist.append('admin_tools.menu')
blacklist.append('admin_tools.theming')
for app in settings.INSTALLED_APPS:
# skip blacklisted apps
if app in blacklist:
continue
# try to import the app
try:
app_path = import_module(app).__path__
except AttributeError:
continue
# try to find a app.dashboard module
try:
imp.find_module('dashboard', app_path)
except ImportError:
continue
# looks like we found it so import it !
import_module('%s.dashboard' % app)

View File

@ -0,0 +1,32 @@
/* todo: ie6 doesn't want the dashboard to take full width... */
html, body {
_overflow: auto;
_width: 100%;
}
#content {
*width: 98% !important;
_width: 96% !important;
margin: 1%;
}
#container {
_margin: 0;
}
.dashboard-module h2 a.toggle-icon,
.dashboard-module h2 a.close-icon {
margin-top: -16px;
}
.dashboard-module ul li ul {
margin-top: -25px;
}
.dashboard-module h3 {
clear: both;
}
.dashboard-column {
}

View File

@ -0,0 +1,294 @@
/* Utilities {{{ */
.float-right {
float: right;
}
/* }}} */
/* Dashboard general styles {{{ */
.warning {
color: red;
background: transparent url(../images/admin-tools.png) 0 -412px no-repeat;
padding-left: 25px;
}
.dashboard #content {
display: block;
width: auto; !important;
}
.dashboard-container {
clear: both;
}
h1.dashboard-title {
float: left;
}
#dashboard-panel {
margin: 0 10px 0 0;
float: right;
}
#dashboard-panel h3 a {
padding: 5px;
min-width: 100px;
display: block;
text-align: center;
border: 1px solid #e5e5e5;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
}
#dashboard-panel ul {
display: none;
position: absolute;
top: auto;
right: 25px;
margin-top: -1px;
}
#dashboard-panel ul li {
padding: 5px;
border: 1px solid #e5e5e5;
background-color: white;
}
#dashboard-panel ul li a {
display: block;
}
#dashboard-panel:hover ul {
display: block;
}
.dashboard ul {
margin: 0;
padding: 0;
list-style: none;
}
.dashboard ul li {
list-style: none;
}
.dashboard-column {
width: 49.9%;
float: left;
min-height: 200px;
}
.dashboard-module {
margin: 10px 10px 5px 10px;
padding: 1px;
border: 1px solid #e5e5e5;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
}
.dashboard-placeholder {
border: 2px dashed #cbe0ff;
background-color: #fafafa;
margin: 10px 10px 5px 10px;
}
.dashboard-module h2 {
margin: 0;
padding: 7px 5px 8px 8px;
text-align: left;
font-weight: normal;
background: url(../images/admin-tools.png) repeat-x 0 -245px;
height: 20px;
color: #555;
}
.dashboard-module.draggable h2 {
cursor: move;
}
.dashboard-module h2 a.toggle-icon,
.dashboard-module h2 a.close-icon {
text-indent: -9999px;
display: block;
float: right;
height: 20px;
width: 17px;
margin: 0 0 0 5px;
cursor: pointer;
background-image: url(../images/admin-tools.png);
background-repeat: no-repeat;
}
.dashboard-module h2 a.toggle-icon {
background-position: 0 -45px;
}
.dashboard-module h2 a.toggle-icon:hover {
background-position: 0 -65px;
}
.dashboard-module h2 a.toggle-icon.collapsed {
background-position: 0 -85px;
}
.dashboard-module h2 a.toggle-icon.collapsed:hover {
background-position: 0 -105px;
}
.dashboard-module h2 a.close-icon {
background-position: 0 -125px;
}
.dashboard-module h2 a.close-icon:hover {
background-position: 0 -145px;
}
.fixed h2 span.toggle-icon,
.fixed h2 span.close-icon {
display: none;
}
.dashboard-module h3 {
padding: 5px 10px;
margin: 0;
background: transparent url(../images/admin-tools.png) repeat-x 0 -325px;
text-indent: 12px;
height: 22px;
}
.dashboard-module h3 a {
color: #808080;
font-size: 13px;
font-weight: 600;
}
.dashboard-module-content {
border-top: 1px solid #ececec;
}
.dashboard-module-content a {
color: #5B80B2;
}
.dashboard-module-content p {
margin: 10px;
}
.dashboard-module ul li {
vertical-align: top;
padding: 5px 8px;
line-height: 20px;
}
.dashboard-module ul li.odd {
background: #f5f5f5;
}
.dashboard-module ul li.even {
background: #ffffff;
}
.dashboard-module ul li a.external-link {
background-image: url(../images/admin-tools.png);
background-repeat: no-repeat;
background-position: -5px -168px;
padding-left: 15px;
}
.dashboard-module ul li ul {
float: right;
}
.dashboard-module ul li ul li {
display: block;
float: left;
border: 0;
padding: 0 5px;
vertical-align: top;
height: auto;
line-height: auto;
}
.dashboard-module ul li:hover {
background: #fffff4;
}
/* }}} */
/* link list specific styles {{{ */
.dashboard-module ul.inline {
display: block;
height: auto;
padding: 15px;
text-align: center;
}
.dashboard-module ul.inline li {
display: inline;
margin: 10px auto;
}
.dashboard-module ul.inline li.odd,
.dashboard-module ul.inline li.even {
background: none;
}
/* }}} */
/* Dashboard groups {{{ */
.group {
border: 0;
margin: 0;
padding: 0;
}
.group ul {
background: none;
background-color: #fafafa;
border-width: 0 0 1px 0;
border-color: #d3d3d3;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
}
.group ul li.group-tabs-link {
margin-top: 7px;
}
.group ul li.group-tabs-link a:focus,
.group ul li.group-tabs-link a:active {
border: none;
outline: none;
}
.group .dashboard-module {
padding: 5px;
margin: 0;
}
.group-accordion .group-accordion-header {
display: block;
clear: both;
border: none;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
border-bottom: 1px solid #d3d3d3;
margin: 0;
background: none;
background-color: #f6f6f6;
}
.group-accordion .group-accordion-header.ui-state-default {
background-color: #f0f0f0;
}
.group-accordion .dashboard-module {
border: 0;
}
/* }}} */

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
var init_dashboard = function(id, columns, preferences, url) {
jQuery('#'+id).dashboard({
'columns': columns,
'load_preferences_function': function(options) {
return preferences;
},
'save_preferences_function': function(options, preferences) {
jQuery.post(url, { data: JSON.stringify(preferences) });
}
});
jQuery(".group-tabs").tabs();
jQuery(".group-accordion").accordion({header: '.group-accordion-header'});
};

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
// Copyright (c) 2006 Klaus Hartl (stilbuero.de)
jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options.expires=-1;}
var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
expires='; expires='+date.toUTCString();}
var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
return cookieValue;}};

View File

@ -0,0 +1,343 @@
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Dashboard plugin.
* This plugin is not yet released, but should be when it will be finished.
*
* copyright (c) 2010 David Jean Louis <izimobil@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
(function($) {
$.fn.extend({
//pass the options variable to the function
dashboard: function(options) {
//Set the default values, use comma to separate the settings, example:
var defaults = {
panel_id: 'dashboard-panel',
dashboard_id: this.attr('id'),
dashboard_module_class: 'dashboard-module',
columns: 2,
load_preferences_function: false,
save_preferences_function: false
}
var options = $.extend(defaults, options);
return this.each(function() {
// set ids for dashboard modules
_initialize($(this), options);
// restore positions, must be done *before* columnize
_restore_positions($(this), options);
// columnize the dashboard modules
_columnize($(this), options);
// add draggable behaviour
_set_draggable($(this), options);
// add collapsible behaviour
_set_collapsible($(this), options);
// add deletable behaviour
_set_deletable($(this), options);
// add addable behaviour to dashboard panel items
_set_addable($(this), options);
// restore user preferences
_restore_preferences($(this), options);
});
}
});
var preferences = false;
var _initialize = function(elt, options) {
// load preferences
if (preferences === false) {
if (options.load_preferences_function) {
preferences = options.load_preferences_function(options);
} else {
var json_str = $.cookie('admin-tools.' + options.dashboard_id);
preferences = json_str ? JSON.parse(json_str) : {};
}
}
// set ids if not set
elt.children('div[id!=' + options.panel_id +']').each(function(index) {
if (!$(this).attr('id')) {
$(this).attr('id', 'module_' + index);
}
});
};
var _restore_positions = function(elt, options) {
// restore positions
try {
var saved_positions = _get_preference(options, 'positions');
} catch (e) {
return;
}
var current_positions = _get_positions(elt, options);
var new_positions = [];
for(var v = 0; v < current_positions.length; v++) {
new_positions[current_positions[v]] = current_positions[v];
}
for(var i = 0; i < saved_positions.length; i++) {
// item id from saved order
var id = saved_positions[i];
if (id in new_positions) {
var item = new_positions[id];
var child = elt.children('#'+item);
// select the item according to the saved order
var saved = elt.children('#'+item);
child.remove();
elt.append(saved);
}
}
};
var _columnize = function(elt, options) {
var elts = elt.children('div[id!=' + options.panel_id +']');
var size = Math.ceil(elts.length / options.columns);
var sizes = _get_preference(options, 'columns');
var percent = Math.floor(100 / options.columns);
var start = 0;
var stop = 0;
var last_stop = 0;
// don't break layout if columns count or elts count changed
var elts_count = 0;
for (var i in sizes) {
elts_count += sizes[i];
}
if (options.columns != sizes.length || elts_count != elts.length) {
// reset sizes so we don't break
sizes = [];
}
for (var i = 0; i < options.columns; i++) {
if (typeof(sizes[i]) == 'undefined') {
start = i * size;
stop = start + size;
last_stop = stop;
} else if (sizes[i] == 0) {
var empty_col = '<div class="dashboard-column" style="float:left;width:'+percent+'%;"/>';
if ($('.dashboard-column').last().length) {
$('.dashboard-column').last().after(empty_col);
} else {
elt.prepend(empty_col);
}
continue;
} else {
start = (i == 0) ? 0 : start + last_stop;
stop = start + sizes[i];
last_stop = sizes[i];
}
elts.slice(start, stop).wrapAll(
'<div class="dashboard-column" style="float:left;width:'+percent+'%;"/>'
);
}
};
var _restore_preferences = function(elt, options) {
elt.children().children('.disabled').each(function() {
_delete_element($(this), options);
});
if (_get_preference(options, 'disabled')) {
$.each(_get_preference(options, 'disabled'), function(k, v) {
v ? _delete_element($('#'+k), options) : _add_element($('#'+k), options);
});
}
if (_get_preference(options, 'collapsed')) {
$.each(_get_preference(options, 'collapsed'), function(k, v) {
if (v) {
_toggle_element($('#'+k), options);
}
});
}
// if there's no element in the panel, hide it
if (!$('#' + options.panel_id).find('li').length) {
$('#' + options.panel_id).hide();
}
};
var _set_draggable = function(elt, options) {
// the dashboard column
elt.children('.dashboard-column').sortable({
handle: 'h2',
items: '.draggable',
connectWith: '.dashboard-column',
placeholder: 'dashboard-placeholder',
forcePlaceholderSize: true,
cursor: 'crosshair',
opacity: 0.7,
update: function() {
_set_preference(options, 'positions', false, _get_positions(elt, options));
var columns = [];
elt.children('.dashboard-column').each(function() {
columns.push($(this).children().length);
});
_set_preference(options, 'columns', false, columns, true);
}
});
};
var _set_collapsible = function(elt, options) {
elt.find('> .dashboard-column > .collapsible > h2').each(function() {
$(this).append('<a href="#" class="toggle-icon">Toggle</a>').find('a.toggle-icon').click(function(ev) {
ev.preventDefault();
var prnt = $(this).parent().parent();
_toggle_element(prnt, options, true);
});
});
};
var _toggle_element = function(elt, options, save_preference) {
elt.find('h2 a.toggle-icon').toggleClass('collapsed');
elt.children('div').slideToggle();
if (save_preference) {
_set_preference(options, 'collapsed', elt.attr('id'), elt.find('h2 a.toggle-icon').hasClass('collapsed'), true);
}
};
var _set_deletable = function(elt, options) {
elt.find('> .dashboard-column > .deletable > h2').each(function() {
$(this).append('<a href="#" class="close-icon">Close</a>').find('a.close-icon').click(function(ev) {
ev.preventDefault();
var prnt = $(this).parent().parent();
_delete_element(prnt, options, true);
});
});
};
var _delete_element = function(elt, options, save_preference) {
var existing = $('#'+options.panel_id).find('li a[rel='+elt.attr('id')+']');
if (!existing.length) {
var panel_ul = $('#' + options.panel_id).find('ul');
if (!panel_ul.length) {
$('#' + options.panel_id).append('<ul/>');
panel_ul = $('#' + options.panel_id).find('ul');
}
panel_ul.append(
'<li><a href="#" rel="'
+ elt.attr('id')
+ '" class="addlink dashboard-module-add">'
+ elt.find('h2').contents().first().text()
+ '</a></li>'
);
_set_addable(elt, options, $('#'+options.panel_id).find('li a[rel='+elt.attr('id')+']'));
} else {
existing.parent().show();
}
elt.fadeOut('fast');
$('#' + options.panel_id).show();
if (save_preference) {
_set_preference(options, 'disabled', elt.attr('id'), true, true);
}
};
var _set_addable = function(elt, options, elts) {
if (!elts) {
elts = $('#'+options.panel_id).find('li a');
}
elts.click(function(ev) {
ev.preventDefault();
_add_element($('#'+$(this).attr('rel')), options, true);
});
};
var _add_element = function(elt, options, save_preference) {
var panel_elt = $('#'+options.panel_id).find('li a[rel='+elt.attr('id')+']');
panel_elt.parent().remove();
elt.removeClass('disabled');
elt.fadeIn('fast');
if (save_preference) {
_set_preference(options, 'disabled', elt.attr('id'), false, true);
}
// if there's no element in the panel, hide it
if (!$('#' + options.panel_id).find('li').length) {
$('#' + options.panel_id).hide();
}
};
var load_preferences = function(options) {
if (options.load_preferences_function) {
return options.load_preferences_function(options);
}
if (preferences === false) {
var json_str = $.cookie('admin-tools.' + options.dashboard_id);
preferences = json_str ? JSON.parse(json_str) : {};
}
return preferences;
}
var _get_preference = function(options, cat, id, defaultval) {
try {
if (preferences[cat] == undefined) {
preferences[cat] = {};
}
if (id) {
return preferences[cat][id];
}
return preferences[cat];
} catch (e) {
return defaultval ? defaultval : null;
}
};
// quick hack to ensure that we do not save preferences if they are
// not modified...
var last_saved_preferences = null;
var _set_preference = function(options, cat, id, val, save) {
try {
if (preferences[cat] == undefined) {
preferences[cat] = {};
}
if (id) {
preferences[cat][id] = val;
} else {
preferences[cat] = val;
}
} catch (e) {
}
// save preferences
if (save && JSON.stringify(preferences) != last_saved_preferences) {
if (options.save_preferences_function) {
options.save_preferences_function(options, preferences);
} else {
$.cookie(cookie_name, JSON.stringify(preferences), {expires: 1825});
}
last_saved_preferences = JSON.stringify(preferences);
}
};
var _get_positions = function(elt, options) {
var modules = [];
if (!elt.children('.dashboard-column').length) {
elt.children('div[id!=' + options.panel_id +']').each(function() {
modules.push($(this).attr('id'));
});
} else {
elt.children('.dashboard-column').each(function() {
$.each($(this).sortable('toArray'), function(index, item) {
modules.push(item);
});
});
}
return modules;
}
})(jQuery);

View File

@ -0,0 +1,19 @@
{% extends "admin/index.html" %}
{% load i18n admin_tools_dashboard_tags %}
{% if not is_popup %}
{% block dashboard_css %}{% admin_tools_render_dashboard_css 'app_index' %}{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs"><a href="../">
{% trans "Home" %}</a> &rsaquo;
{% for app in app_list %}
{% trans app.name %}
{% endfor %}</div>{% endblock %}
{% endif %}
{% block content %}
{% admin_tools_render_dashboard 'app_index' %}
{% endblock %}
{% block sidebar %}{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends "admin/base_site.html" %}
{% load i18n admin_tools_dashboard_tags %}
{% block extrastyle %}
{{ block.super }}
{% block dashboard_css %}{% admin_tools_render_dashboard_css %}{% endblock %}
{% endblock %}
{% block bodyclass %}dashboard{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block content_title %}{% endblock %}
{% block content %}
{% admin_tools_render_dashboard %}
{% endblock %}

View File

@ -0,0 +1,7 @@
<link rel="stylesheet" href="{{ media_url }}/admin_tools/css/jquery/jquery-ui.css" type="text/css" media="screen, projection"/>
<link rel="stylesheet" href="{{ media_url }}/admin_tools/css/dashboard.css" type="text/css" media="screen, projection"/>
<!--[if lt IE 8]>
<link rel="stylesheet" href="{{ media_url }}/admin_tools/css/dashboard-ie.css" type="text/css" media="screen, projection"/>
<![endif]-->
{% for css in css_files %}
<link rel="stylesheet" href="{{ media_url }}/{{ css }}" type="text/css" media="screen, projection"/>{% endfor %}

View File

@ -0,0 +1,82 @@
{% load i18n admin_tools_dashboard_tags %}
{% load url from future %}
{% block dashboard_scripts %}
<script type="text/javascript" src="{{ media_url }}/admin_tools/js/utils.js"></script>
<script type="text/javascript" charset="utf-8">
// Load js files syncronously and conditionally
var js_files = [
{
src : '{{ media_url }}/admin_tools/js/jquery/jquery.min.js',
test: function() { return typeof(jQuery) == 'undefined'; }
},
{
src : '{{ media_url }}/admin_tools/js/jquery/jquery-ui.min.js',
test: function() { return typeof(jQuery.ui) == 'undefined'; }
},
{
src : '{{ media_url }}/admin_tools/js/json.min.js',
test: function() { return typeof(JSON.stringify) == 'undefined'; }
},
{
src : '{{ media_url }}/admin_tools/js/jquery/jquery.cookie.min.js',
test: function() { return typeof(jQuery.cookie) == 'undefined'; }
},
{
src : '{{ media_url }}/admin_tools/js/jquery/jquery.dashboard.js',
test: function() { return true; }
},
{
src : '{{ media_url }}/admin_tools/js/dashboard.js',
test: function() { return true; }
}{% for js in dashboard.Media.js %},
{
src : '{{ media_url }}/{{ js }}',
test: function() { return true; }
}{% endfor %}
];
loadScripts(js_files, function(){
jQuery(function($) {
init_dashboard(
'{{ dashboard.get_id }}',
{{ dashboard.columns }},
{% autoescape off %}{{ dashboard_preferences }}{% endautoescape %},
'{% url 'admin-tools-dashboard-set-preferences' dashboard.get_id %}'
);
});
});
</script>
{% endblock %}
{% block dashboard_title %}
{% if dashboard.title %}
<h1 class="dashboard-title">{{ dashboard.title }}</h1>
{% endif %}
{% endblock %}
{% block dashboard_panel %}
<div id="dashboard-panel">
<h3><a href="#">{% trans "Modules" %}</a></h3>
{% if has_disabled_modules %}
<ul>
{% spaceless %}
{% for module in dashboard.children %}
{% if not module.enabled %}
<li><a href="#" rel="module_{{ module.id }}" class="addlink add-dashboard-module">{{ module.title }}</a></li>
{% endif %}
{% endfor %}
{% endspaceless %}
</ul>
{% endif %}
</div>
{% endblock %}
{% block dashboard_container %}
<div id="{{ dashboard.get_id }}" class="dashboard-container">
{% for module in dashboard.children %}
{% admin_tools_render_dashboard_module module %}{% endfor %}
</div>
{% endblock %}

View File

@ -0,0 +1,111 @@
"""
This file was generated with the customdashboard management command, it
contains the two classes for the main dashboard and app index dashboard.
You can customize these classes as you want.
To activate your index dashboard add the following to your settings.py::
ADMIN_TOOLS_INDEX_DASHBOARD = '{{ project }}.{{ file }}.CustomIndexDashboard'
And to activate the app index dashboard::
ADMIN_TOOLS_APP_INDEX_DASHBOARD = '{{ project }}.{{ file }}.CustomAppIndexDashboard'
"""
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from admin_tools.dashboard import modules, Dashboard, AppIndexDashboard
from admin_tools.utils import get_admin_site_name
class CustomIndexDashboard(Dashboard):
"""
Custom index dashboard for {{ project }}.
"""
def init_with_context(self, context):
site_name = get_admin_site_name(context)
# append a link list module for "quick links"
self.children.append(modules.LinkList(
_('Quick links'),
layout='inline',
draggable=False,
deletable=False,
collapsible=False,
children=[
[_('Return to site'), '/'],
[_('Change password'),
reverse('%s:password_change' % site_name)],
[_('Log out'), reverse('%s:logout' % site_name)],
]
))
# append an app list module for "Applications"
self.children.append(modules.AppList(
_('Applications'),
exclude=('django.contrib.*',),
))
# append an app list module for "Administration"
self.children.append(modules.AppList(
_('Administration'),
models=('django.contrib.*',),
))
# append a recent actions module
self.children.append(modules.RecentActions(_('Recent Actions'), 5))
# append a feed module
self.children.append(modules.Feed(
_('Latest Django News'),
feed_url='http://www.djangoproject.com/rss/weblog/',
limit=5
))
# append another link list module for "support".
self.children.append(modules.LinkList(
_('Support'),
children=[
{
'title': _('Django documentation'),
'url': 'http://docs.djangoproject.com/',
'external': True,
},
{
'title': _('Django "django-users" mailing list'),
'url': 'http://groups.google.com/group/django-users',
'external': True,
},
{
'title': _('Django irc channel'),
'url': 'irc://irc.freenode.net/django',
'external': True,
},
]
))
class CustomAppIndexDashboard(AppIndexDashboard):
"""
Custom app index dashboard for {{ project }}.
"""
# we disable title because its redundant with the model list module
title = ''
def __init__(self, *args, **kwargs):
AppIndexDashboard.__init__(self, *args, **kwargs)
# append a model list module and a recent actions module
self.children += [
modules.ModelList(self.app_title, self.models),
modules.RecentActions(
_('Recent Actions'),
include_list=self.get_app_content_types(),
limit=5
)
]
def init_with_context(self, context):
"""
Use this method if you need to access the request context.
"""
return super(CustomAppIndexDashboard, self).init_with_context(context)

View File

@ -0,0 +1,29 @@
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from admin_tools.dashboard import modules, AppIndexDashboard
# create your custom modules here if you want, for example:
#
# class CustomDashboardModule(modules.DashboardModule):
# pass
#
{% if warning %}
# WARNING: you've changed the default file name 'dashboard.py' to '{{ file }}.py',
# so, you will need to tell django-admin-tools about this, just add this line
# to your settings.py file:
# ADMIN_TOOLS_APP_INDEX_DASHBOARD_MODULE = '{{ file }}'
{% endif %}
# Your {{ app }} dashboard class
class {{ app|capfirst }}Dashboard(AppIndexDashboard):
"""
Document your custom app index dashboard.
"""
def __init__(self, app_title, models, *args, **kwargs):
super(CustomAppIndexDashboard, self).__init__(*args, **kwargs)
# append your modules here, example:
# self.append(modules.RecentActionsDashboardModule(
# title=_('Recent Actions'),
# limit=5,
# include_list=models,
# ))

View File

@ -0,0 +1 @@
{% extends template %}

View File

@ -0,0 +1,21 @@
{% load i18n %}
{% if not module.is_empty %}
<div id="module_{{ module.id }}" class="{{ module.render_css_classes }}">
{% if module.show_title and module.title %}<h2>{% if module.title_url %}<a href="{{ module.title_url }}">{% trans module.title %}</a>{% else %}{% trans module.title %}{% endif %}</h2>{% endif %}
<div class="dashboard-module-content">
{% spaceless %}
{% if module.pre_content %}
<p>{{ module.pre_content }}</p>
{% endif %}
{% block module_content %}
{% for child in module.children %}
{{ child }}
{% endfor %}
{% endblock %}
{% if module.post_content %}
<p>{{ module.post_content }}</p>
{% endif %}
{% endspaceless %}
</div>
</div>
{% endif %}

View File

@ -0,0 +1,22 @@
{% extends "admin_tools/dashboard/module.html" %}
{% load i18n %}
{% block module_content %}
{% for child in module.children %}
<h3><a href="{{ child.url }}">{% trans child.title %}</a></h3>
<ul>
{% for model in child.models %}
{% spaceless %}
<li>
{% if model.change_url %}<a href="{{ model.change_url }}">{{ model.title }}</a>{% else %}{{ model.title }}{% endif %}
{% if model.add_url or model.change_url %}
<ul>
{% if model.add_url %}<li><a class="addlink" href="{{ model.add_url }}"><span class="icon">{% trans "Add" %}</span></a></li>{% endif %}
{% if model.change_url %}<li><a class="changelink" href="{{ model.change_url }}"><span class="icon">{% trans "Change" %}</span></a></li>{% endif %}
</ul>
{% endif %}
</li>
{% endspaceless %}
{% endfor %}
</ul>
{% endfor %}
{% endblock %}

View File

@ -0,0 +1,13 @@
{% extends "admin_tools/dashboard/module.html" %}
{% block module_content %}
<ul>
{% spaceless %}
{% for child in module.children %}
<li class="{% cycle 'odd' 'even' %}">
{% if child.date %}<span class="float-right">{{ child.date|date }}&nbsp;</span>{% endif %}
{% if child.warning %}<span class="warning">{{ child.title }}</span>{% else %}<a class="external-link" href="{{ child.url }}">{{ child.title }}</a>{% endif %}
</li>
{% endfor %}
{% endspaceless %}
</ul>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "admin_tools/dashboard/module.html" %}
{% load admin_tools_dashboard_tags %}
{% block module_content %}
<div class="group group-{{ module.display }}">
{% spaceless %}
{% ifequal module.display "tabs" %}
<ul>
{% for sub_module in module.children %}
{% if not sub_module.is_empty %}<li class="group-tabs-link"><a href="#module_{{ sub_module.id }}">{{ sub_module.title }}</a></li>{% endif %}
{% endfor %}
</ul>
{% endifequal %}
{% ifequal module.display "accordion" %}
{% for sub_module in module.children %}
{% if not sub_module.is_empty %}<span class="group-accordion-header"><a href="#">{{ sub_module.title }}</a></span>{% endif %}
{% admin_tools_render_dashboard_module sub_module %}
{% endfor %}
{% else %}
{% for sub_module in module.children %}
{% admin_tools_render_dashboard_module sub_module %}
{% endfor %}
{% endifequal %}
{% endspaceless %}
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "admin_tools/dashboard/module.html" %}
{% block module_content %}
<ul class="{{ module.layout }}">
{% spaceless %}
{% for child in module.children %}
<li class="{% cycle 'odd' 'even' %}">
<a{{ child.attrs|safe }}>{{ child.title }}</a>
</li>
{% endfor %}
{% endspaceless %}
</ul>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% extends "admin_tools/dashboard/module.html" %}
{% load i18n %}
{% block module_content %}
<ul>
{% for child in module.children %}
{% spaceless %}
<li>
{% if child.change_url %}<a href="{{ child.change_url }}">{{ child.title }}</a>{% else %}{{ child.title }}{% endif %}
{% if child.add_url or child.change_url %}
<ul>
{% if child.add_url %}<li><a class="addlink" href="{{ child.add_url }}"><span class="icon">{% trans "Add" %}</span></a></li>{% endif %}
{% if child.change_url %}<li><a class="changelink" href="{{ child.change_url }}"><span class="icon">{% trans "Change" %}</span></a></li>{% endif %}
</ul>
{% endif %}
</li>
{% endspaceless %}
{% endfor %}
</ul>
{% endblock %}

View File

@ -0,0 +1,18 @@
{% extends "admin_tools/dashboard/module.html" %}
{% load i18n %}
{% block module_content %}
<ul>
{% spaceless %}
{% for child in module.children %}
<li class="{% cycle 'odd' 'even' %}">
<span class="float-right">{{ child.action_time|date }}</span>
{% if child.is_deletion %}
<span class="deletelink">{% if child.content_type %}{% filter capfirst %}{% trans child.content_type.name %}{% endfilter %}&nbsp;{% endif %}{{ child.object_repr }}</span>
{% else %}
<a href="{{ child.get_admin_url }}" class="{% if child.is_addition %} addlink{% endif %}{% if child.is_change %} changelink{% endif %}">{% if child.content_type %}{% filter capfirst %}{% trans child.content_type.name %}{% endfilter %}&nbsp;{% endif %}{{ child.object_repr }}</a>
{% endif %}
</li>
{% endfor %}
{% endspaceless %}
</ul>
{% endblock %}

View File

@ -0,0 +1,10 @@
{% extends "admin/base_site.html" %}
{% block content %}
<form action="." method="POST">
{{ form.as_p }}
<p><input type="submit" value="Save" /></p>
</form>
{% endblock %}

View File

@ -0,0 +1,114 @@
"""
Dashboard template tags, the following dashboard tags are available:
* ``{% admin_tools_render_dashboard %}``
* ``{% admin_tools_render_dashboard_module %}``
* ``{% admin_tools_render_dashboard_css %}``
To load the dashboard tags: ``{% load admin_tools_dashboard_tags %}``.
"""
import math
from django import template
from django.db import IntegrityError
from django.core.urlresolvers import reverse
from admin_tools.utils import get_media_url, get_admin_site_name
from admin_tools.dashboard.utils import get_dashboard
from admin_tools.dashboard.models import DashboardPreferences
register = template.Library()
tag_func = register.inclusion_tag('admin_tools/dashboard/dummy.html', takes_context=True)
def admin_tools_render_dashboard(context, location='index', dashboard=None):
"""
Template tag that renders the dashboard, it takes two optional arguments:
``location``
The location of the dashboard, it can be 'index' (for the admin index
dashboard) or 'app_index' (for the app index dashboard), the default
value is 'index'.
``dashboard``
An instance of ``Dashboard``, if not given, the dashboard is retrieved
with the ``get_index_dashboard`` or ``get_app_index_dashboard``
functions, depending on the ``location`` argument.
"""
if dashboard is None:
dashboard = get_dashboard(context, location)
dashboard.init_with_context(context)
dashboard._prepare_children()
try:
preferences = DashboardPreferences.objects.get(
user=context['request'].user,
dashboard_id=dashboard.get_id()
).data
except DashboardPreferences.DoesNotExist:
preferences = '{}'
try:
DashboardPreferences(
user=context['request'].user,
dashboard_id=dashboard.get_id(),
data=preferences
).save()
except IntegrityError:
# dashboard already was saved for that (user, dashboard)
pass
context.update({
'template': dashboard.template,
'dashboard': dashboard,
'dashboard_preferences': preferences,
'split_at': math.ceil(float(len(dashboard.children))/float(dashboard.columns)),
'media_url': get_media_url(),
'has_disabled_modules': len([m for m in dashboard.children \
if not m.enabled]) > 0,
'admin_url': reverse('%s:index' % get_admin_site_name(context)),
})
return context
admin_tools_render_dashboard = tag_func(admin_tools_render_dashboard)
def admin_tools_render_dashboard_module(context, module):
"""
Template tag that renders a given dashboard module, it takes a
``DashboardModule`` instance as first parameter.
"""
module.init_with_context(context)
context.update({
'template': module.template,
'module': module,
'admin_url': reverse('%s:index' % get_admin_site_name(context)),
})
return context
admin_tools_render_dashboard_module = tag_func(admin_tools_render_dashboard_module)
def admin_tools_render_dashboard_css(context, location='index', dashboard=None):
"""
Template tag that renders the dashboard css files, it takes two optional
arguments:
``location``
The location of the dashboard, it can be 'index' (for the admin index
dashboard) or 'app_index' (for the app index dashboard), the default
value is 'index'.
``dashboard``
An instance of ``Dashboard``, if not given, the dashboard is retrieved
with the ``get_index_dashboard`` or ``get_app_index_dashboard``
functions, depending on the ``location`` argument.
"""
if dashboard is None:
dashboard = get_dashboard(context, location)
context.update({
'template' : 'admin_tools/dashboard/css.html',
'css_files': dashboard.Media.css,
'media_url': get_media_url(),
})
return context
admin_tools_render_dashboard_css = tag_func(admin_tools_render_dashboard_css)

View File

@ -0,0 +1,34 @@
from tempfile import mktemp
from unittest import TestCase
from django.test import TestCase as DjangoTestCase
from django.core import management
from django.contrib.auth import models as auth_models
from admin_tools.dashboard import AppIndexDashboard
from admin_tools.dashboard.modules import DashboardModule, Group
class ManagementCommandTest(DjangoTestCase):
def test_customdashboard(self):
# check that customdashboard command doesn't raise exceptions
file_name = mktemp()
management.call_command('customdashboard', file=file_name)
# and fails if file is already here
try:
management.call_command('customdashboard', file=file_name)
assert False
except:
pass
class AppIndexDashboardTest(TestCase):
def test_models(self):
models = ['django.contrib.auth.models.User',
'django.contrib.auth.models.Group']
board = AppIndexDashboard('Auth', models)
self.assertEqual(board.get_app_model_classes(),
[auth_models.User, auth_models.Group])
__test__ = {
'DashboardModule.is_empty': DashboardModule.is_empty,
'DashboardModule.render_css_classes': DashboardModule.render_css_classes,
'Group.is_empty': Group.is_empty,
}

View File

@ -0,0 +1,8 @@
try:
from django.conf.urls import patterns, url
except ImportError: # django < 1.4
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('admin_tools.dashboard.views',
url(r'^set_preferences/(?P<dashboard_id>.+)/$', 'set_preferences', name='admin-tools-dashboard-set-preferences'),
)

View File

@ -0,0 +1,82 @@
"""
Dashboard utilities.
"""
from django.conf import settings
from django.utils.importlib import import_module
from django.utils.text import capfirst
from django.core.urlresolvers import reverse
from admin_tools.dashboard.registry import Registry
from admin_tools.utils import get_admin_site
def get_dashboard(context, location):
"""
Returns the dashboard that match the given ``location``
(index or app_index).
"""
if location == 'index':
return get_index_dashboard(context)
elif location == 'app_index':
return get_app_index_dashboard(context)
raise ValueError('Invalid dashboard location: "%s"' % location)
def _get_dashboard_cls(dashboard_cls, context):
if isinstance(dashboard_cls, dict):
curr_url = context.get('request').path
for key in dashboard_cls:
admin_site_mod, admin_site_inst = key.rsplit('.', 1)
admin_site_mod = import_module(admin_site_mod)
admin_site = getattr(admin_site_mod, admin_site_inst)
admin_url = reverse('%s:index' % admin_site.name)
if curr_url.startswith(admin_url):
mod, inst = dashboard_cls[key].rsplit('.', 1)
mod = import_module(mod)
return getattr(mod, inst)
else:
mod, inst = dashboard_cls.rsplit('.', 1)
mod = import_module(mod)
return getattr(mod, inst)
raise ValueError('Dashboard matching "%s" not found' % dashboard_cls)
def get_index_dashboard(context):
"""
Returns the admin dashboard defined by the user or the default one.
"""
return _get_dashboard_cls(getattr(
settings,
'ADMIN_TOOLS_INDEX_DASHBOARD',
'admin_tools.dashboard.dashboards.DefaultIndexDashboard'
), context)()
def get_app_index_dashboard(context):
"""
Returns the admin dashboard defined by the user or the default one.
"""
# this is a mess, needs cleanup !
app = context['app_list'][0]
model_list = []
app_label = None
app_title = app['name']
admin_site = get_admin_site(context=context)
for model, model_admin in admin_site._registry.items():
if app['name'] == model._meta.app_label.title():
split = model.__module__.find(model._meta.app_label)
app_label = model.__module__[0:split] + model._meta.app_label
app_title = model._meta.app_label.title()
for m in app['models']:
if m['name'] == capfirst(model._meta.verbose_name_plural):
mod = '%s.%s' % (model.__module__, model.__name__)
model_list.append(mod)
# if an app has registered its own dashboard, use it
if app_label is not None and app_label in Registry.registry:
return Registry.registry[app_label](app_title, model_list)
# try to discover a general app_index dashboard (with fallback to the
# default dashboard)
return _get_dashboard_cls(getattr(
settings,
'ADMIN_TOOLS_APP_INDEX_DASHBOARD',
'admin_tools.dashboard.dashboards.DefaultAppIndexDashboard'
), context)(app_title, model_list)

View File

@ -0,0 +1,50 @@
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.contrib import messages
try:
from django.views.decorators.csrf import csrf_exempt
except ImportError:
from django.contrib.csrf.middleware import csrf_exempt
from .forms import DashboardPreferencesForm
from .models import DashboardPreferences
@login_required
@csrf_exempt
def set_preferences(request, dashboard_id):
"""
This view serves and validates a preferences form.
"""
try:
preferences = DashboardPreferences.objects.get(
user=request.user,
dashboard_id=dashboard_id
)
except DashboardPreferences.DoesNotExist:
preferences = None
if request.method == "POST":
form = DashboardPreferencesForm(
user=request.user,
dashboard_id=dashboard_id,
data=request.POST,
instance=preferences
)
if form.is_valid():
preferences = form.save()
if request.is_ajax():
return HttpResponse('true')
messages.success(request, 'Preferences saved')
elif request.is_ajax():
return HttpResponse('false')
else:
form = DashboardPreferencesForm(
user=request.user,
dashboard_id=dashboard_id,
instance=preferences
)
return render_to_response('admin_tools/dashboard/preferences_form.html',
RequestContext(request, {'form': form}))

View File

@ -0,0 +1,15 @@
"""
This module contains some utils for easy deprecation warnings.
"""
import warnings
def import_path_is_changed(old_name, new_name):
class ImportDeprecationMixin(object):
def __new__(cls, *args, **kwargs):
klass = super(ImportDeprecationMixin, cls).__new__(cls)
msg = '%s: %s is deprecated. Please use %s instead.' % (klass, old_name, new_name)
warnings.warn(msg, DeprecationWarning)
return klass
return ImportDeprecationMixin

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,130 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Dashboard"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Rychlé odkazy"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Zpět na stránky"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Změnit heslo"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Odhlásit se"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Aplikace"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Administrace"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Poslední akce"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Nejnovější Django zprávy"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Podpora"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Django dokumentace"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Django \"django-users\" mailing list"
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Django IRC kanál"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Odkazy"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Žádné akce"
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "RSS Feed"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Domovská stránka"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Moduly"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Přidat"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Změnit"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "Záložky"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Django administrace"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Django administrace"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "Prosím zadejte jméno záložky"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Vítejte,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Dokumentace"

Binary file not shown.

View File

@ -0,0 +1,133 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Dashboard"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Hurtige links"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Returner til sitet"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Skift password"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Log ud"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Applikationer"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Administration"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Nyeste handlinger"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Nyeste Django nyheder"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Support"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Django dokumentationen"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Django \"django-users\" mailinglist"
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Django irc kanal "
#: dashboard/modules.py:314
msgid "Links"
msgstr "Links"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Ingen nylige handlinger"
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "RSS Feed"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Hjem"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Moduler"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Tilføj"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Skift"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "Bogmærker"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Django admin"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Djangoadministration"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "Skriv venligst et navn for bogmærket"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Velkommen, "
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Doumentation"
#~ msgid "Bookmark this page"
#~ msgstr "Tilføj bogmærke for denne side"

Binary file not shown.

View File

@ -0,0 +1,130 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Kontrollzentrum"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Quick-Links"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Zurück zur Seite"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Password ändern"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Abmelden"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Applikationen"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Administration"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Letzte Aktionen"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Letzte Django News"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Support"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Django Dokumentation"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr " Django \"django-users\" Mailingliste"
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Django IRC Kanal"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Links"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Noch keine Aktionen."
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "RSS Feed"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Start"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Module"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Hinzufügen"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Ändern"
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Django Seiten Administration"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Django Administration"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Willkommen,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Dokumentation"

Binary file not shown.

View File

@ -0,0 +1,130 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Ταμπλό"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Γρήγοροι σύνδεσμοι"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Επιστροφή στον ιστότοπο"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Αλλαγή συνθηματικού"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Αποσύνδεση"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Εφαρμογές"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Διαχείριση"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Πρόσφατες ενέργειες"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Τελευταία νέα του Django"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Υποστήριξη"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Τεκμηρίωση Django"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Ομάδα συζήτησης Django \"django-users\""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Κανάλι irc Django"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Σύνδεσμοι"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Δεν υπάρχουν πρόσφατες ενέργειες."
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "Ροή RSS"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Αρχική"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Αρθρώματα"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Προσθήκη"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Αλλαγή"
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Ιστότοπος διαχείρισης Django"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Διαχείριση Django"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Καλώς ήρθατε,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Τεκμηρίωση"

Binary file not shown.

View File

@ -0,0 +1,130 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Dashboard"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,133 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: 2010-02-10 08:21+01\n"
"Last-Translator: Pedro Gracia <lasarux@neuroomante.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Panel de Control"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Enlaces rápidos"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Volver al sitio"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Cambiar la contraseña"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Salir"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Aplicaciones"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Administración"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Acciones recientes"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Últimas noticias de Django"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Soporte"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Documentación de Django"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Lista de correo de Django \"django-users\""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Canal de IRC de Django"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Enlaces"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "No hay acciones recientes."
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "\"Feed\" RSS"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Inicio"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Módulos"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Añadir"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Cambiar"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "Marcadores"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Administrador de Django"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Administración de Django"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "Ingrese un nombre para el marcador"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Bienvenido,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Documentación"
#~ msgid "Bookmark this page"
#~ msgstr "Marcar esta página"

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,133 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: django-admin-tools 0.4.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: 2011-01-27 06:11+0200\n"
"Last-Translator: Ville Korhonen <ville@xd.fi>\n"
"Language-Team: FINNISH <ville@xd.fi>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Finnish\n"
"X-Poedit-Country: FINLAND\n"
"X-Poedit-SourceCharset: utf-8\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Dashboard"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Pikalinkit"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Palaa sivustolle"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Vaihda salasana"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Kirjaudu ulos"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Sovellukset"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Hallinta"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Viimeaikaiset tapahtumat"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Uusimmat Django-uutiset"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Tuki"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Django-ohjeet"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Djangon \"django-users\" -postituslista"
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Djangon IRC-kanava"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Linkit"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Ei viimeaikaisia tapahtumia"
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "RSS-syöte"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Etusivu"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Modulit"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Lisää"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Vaihda"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "Kirjanmerkit"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Djangon hallintapaneeli"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Djangon hallinta"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "Ole hyvä ja kirjoita nimi kirjanmerkille"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Tervetuloa,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Dokumentaatio"

Binary file not shown.

View File

@ -0,0 +1,133 @@
# django-admin-tools french translation.
# Copyright (C) 2010 David Jean Louis <izimobil@gmail.com>
# This file is distributed under the same license as the django-admin-tools package.
# FIRST AUTHOR <izimobil@gmail.com>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: 2010-02-08\n"
"Last-Translator: David Jean Louis <izimobil@gmail.com>\n"
"Language-Team: French <LL@li.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Tableau de bord"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "Liens rapides"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Retour au site"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Modifier votre mot de passe"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Se déconnecter"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Applications"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Administration"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Actions Récentes"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Les dernières nouvelles de Django"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Aide"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Documentation de Django"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Liste de diffusion \"django-users\""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Canal IRC Django"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Liens"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Aucune action récente"
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "Flux RSS"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Accueil"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Modules"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Ajouter"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Modifier"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "Marque-pages"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Administration de Django"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Administration de Django"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "Veuillez fournir un nom pour le marque-page"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Bienvenue,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Documentation"
#~ msgid "Bookmark this page"
#~ msgstr "Marquer cette page"

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr ""
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr ""
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr ""
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr ""
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr ""
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr ""
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr ""
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr ""
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr ""
#: dashboard/dashboards.py:254
msgid "Support"
msgstr ""
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr ""
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr ""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr ""
#: dashboard/modules.py:314
msgid "Links"
msgstr ""
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr ""
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr ""
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr ""
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr ""
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr ""
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr ""
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr ""
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr ""
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr ""

Binary file not shown.

View File

@ -0,0 +1,131 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "Dashboard"
#: dashboard/dashboards.py:217
#, fuzzy
msgid "Quick links"
msgstr "Quick links"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "Ritorna al sito"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "Cambia password"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "Log out"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "Applicazioni"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "Amministrazione"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "Azioni Recenti"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "Ultime news su Django"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "Assistenza"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Documentazione su Django"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Mailing list Django \\ \"django-users \""
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Canale IRC Django"
#: dashboard/modules.py:314
msgid "Links"
msgstr "Links"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "Nessuna azione recente."
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "Feed RSS"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "Home"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr " %(name)s "
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "Moduli"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "Aggiungi"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "Modifica"
#: menu/items.py:328
msgid "Bookmarks"
msgstr ""
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Amministrazione sito Django"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Amministrazione Django"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr ""
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "Benvenuto,"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "Documentazione"

Binary file not shown.

View File

@ -0,0 +1,133 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-27 08:34+0100\n"
"PO-Revision-Date: 2010-06-14 14:32+0900\n"
"Last-Translator: zundoya <zundoya@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: dashboard/dashboards.py:81 menu/menus.py:100
msgid "Dashboard"
msgstr "ダッシュボード"
#: dashboard/dashboards.py:217
msgid "Quick links"
msgstr "クイックリンク"
#: dashboard/dashboards.py:223
msgid "Return to site"
msgstr "サイトに戻る。"
#: dashboard/dashboards.py:224 theming/templates/admin/base.html:43
msgid "Change password"
msgstr "パスワードの変更"
#: dashboard/dashboards.py:226 theming/templates/admin/base.html:50
msgid "Log out"
msgstr "ログアウト"
#: dashboard/dashboards.py:232 dashboard/modules.py:385 menu/menus.py:103
msgid "Applications"
msgstr "アプリケーション"
#: dashboard/dashboards.py:238 menu/menus.py:107
msgid "Administration"
msgstr "サイト管理"
#: dashboard/dashboards.py:243 dashboard/dashboards.py:297
#: dashboard/modules.py:538
msgid "Recent Actions"
msgstr "最近行った操作"
#: dashboard/dashboards.py:247
msgid "Latest Django News"
msgstr "最新Djangoニュース"
#: dashboard/dashboards.py:254
msgid "Support"
msgstr "サポート"
#: dashboard/dashboards.py:257
msgid "Django documentation"
msgstr "Djangoドキュメント"
#: dashboard/dashboards.py:262
msgid "Django \"django-users\" mailing list"
msgstr "Django \"django-users\" メーリングリスト"
#: dashboard/dashboards.py:267
msgid "Django irc channel"
msgstr "Django irc チャンネル"
#: dashboard/modules.py:314
msgid "Links"
msgstr "リンク"
#: dashboard/modules.py:591
msgid "No recent actions."
msgstr "最近行った操作がありません。"
#: dashboard/modules.py:637
msgid "RSS Feed"
msgstr "RSSフィード"
#: dashboard/templates/admin/app_index.html:9
#: theming/templates/admin/base.html:57
msgid "Home"
msgstr "ホーム"
#: dashboard/templates/admin/app_index.html:11
#, python-format
msgid "%(name)s"
msgstr "%(name)s"
#: dashboard/templates/admin_tools/dashboard/dashboard.html:55
msgid "Modules"
msgstr "モジュール"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:13
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:11
msgid "Add"
msgstr "追加"
#: dashboard/templates/admin_tools/dashboard/modules/app_list.html:14
#: dashboard/templates/admin_tools/dashboard/modules/model_list.html:12
msgid "Change"
msgstr "変更"
#: menu/items.py:328
msgid "Bookmarks"
msgstr "ブックマーク"
#: menu/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Django サイト管理"
#: menu/templates/admin/base_site.html:16
msgid "Django administration"
msgstr "Django 管理サイト"
#: menu/templates/admin_tools/menu/menu.html:32
msgid "Please enter a name for the bookmark"
msgstr "新しいブックマーク名をいれてください。"
#: theming/templates/admin/base.html:30
msgid "Welcome,"
msgstr "ようこそ"
#: theming/templates/admin/base.html:35
msgid "Documentation"
msgstr "ドキュメント"
#~ msgid "Bookmark this page"
#~ msgstr "このページをブックマーク"

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More