Initial import 0.5.2
|
@ -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.
|
|
@ -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
|
|
@ -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.
|
|
@ -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.
|
|
@ -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 *
|
|
@ -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
|
|
@ -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.
|
|
@ -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'
|
|
@ -0,0 +1,2 @@
|
|||
from admin_tools.dashboard.dashboards import *
|
||||
from admin_tools.dashboard.registry import *
|
|
@ -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
|
||||
)
|
||||
]
|
|
@ -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
|
|
@ -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()
|
|
@ -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))
|
||||
|
|
@ -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']
|
|
@ -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']
|
|
@ -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']
|
|
@ -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
|
|
@ -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
|
||||
|
|
@ -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)
|
|
@ -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 {
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
/* }}} */
|
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 212 B |
After Width: | Height: | Size: 208 B |
After Width: | Height: | Size: 335 B |
After Width: | Height: | Size: 207 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 262 B |
After Width: | Height: | Size: 332 B |
After Width: | Height: | Size: 280 B |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 4.4 KiB |
|
@ -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'});
|
||||
};
|
|
@ -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;}};
|
|
@ -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);
|
|
@ -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> ›
|
||||
{% for app in app_list %}
|
||||
{% trans app.name %}
|
||||
{% endfor %}</div>{% endblock %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% block content %}
|
||||
{% admin_tools_render_dashboard 'app_index' %}
|
||||
{% endblock %}
|
||||
{% block sidebar %}{% endblock %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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)
|
|
@ -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,
|
||||
# ))
|
|
@ -0,0 +1 @@
|
|||
{% extends template %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 }} </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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %} {% 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 %} {% endif %}{{ child.object_repr }}</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endspaceless %}
|
||||
</ul>
|
||||
{% endblock %}
|
|
@ -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 %}
|
|
@ -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)
|
|
@ -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,
|
||||
}
|
|
@ -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'),
|
||||
)
|
|
@ -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)
|
|
@ -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}))
|
|
@ -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
|
||||
|
||||
|
|
@ -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 ""
|
|
@ -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 ""
|
|
@ -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 ""
|
|
@ -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 ""
|
|
@ -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"
|
|
@ -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"
|
|
@ -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"
|
|
@ -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 "Τεκμηρίωση"
|
|
@ -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 ""
|
|
@ -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"
|
|
@ -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 ""
|
|
@ -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"
|
|
@ -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"
|
|
@ -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 ""
|
|
@ -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 ""
|
|
@ -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"
|
|
@ -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 "このページをブックマーク"
|