From 36c199f8a9b23815f814f0a1ce9fd0876b99399d Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 18 Aug 2011 02:37:32 -0400 Subject: [PATCH] Added new app 'project_setup' to display a setup dashboard style view instead of a secondary action list --- .../templates/generic_list_horizontal.html | 28 +++ .../generic_list_horizontal_subtemplate.html | 191 ++++++++++++++++++ apps/documents/__init__.py | 6 +- apps/documents/static/images/icons/layout.png | Bin 0 -> 979 bytes apps/main/__init__.py | 23 +-- apps/main/static/images/icons/keyboard.png | Bin 0 -> 1197 bytes apps/metadata/__init__.py | 14 +- apps/metadata/static/images/icons/table.png | Bin 0 -> 920 bytes apps/metadata/static/images/icons/xhtml.png | Bin 0 -> 1074 bytes apps/permissions/__init__.py | 7 +- .../static/images/icons/medal_gold_1.png | Bin 0 -> 1528 bytes apps/project_setup/__init__.py | 6 + apps/project_setup/api.py | 5 + apps/project_setup/models.py | 3 + .../project_setup/static/images/icons/cog.png | Bin 0 -> 2104 bytes .../static/images/icons/link_button.png | Bin 0 -> 1250 bytes apps/project_setup/tests.py | 23 +++ apps/project_setup/urls.py | 5 + apps/project_setup/views.py | 16 ++ apps/project_setup/widgets.py | 29 +++ apps/smart_settings/__init__.py | 10 + .../static/images/icons/cog.png | Bin 0 -> 2104 bytes apps/sources/__init__.py | 9 +- .../static/images/icons/application_form.png | Bin 0 -> 999 bytes apps/user_management/__init__.py | 14 +- .../static/images/icons/group.png | Bin 0 -> 2088 bytes .../static/images/icons/user.png | Bin 0 -> 1582 bytes settings.py | 1 + urls.py | 1 + 29 files changed, 359 insertions(+), 32 deletions(-) create mode 100644 apps/common/templates/generic_list_horizontal.html create mode 100644 apps/common/templates/generic_list_horizontal_subtemplate.html create mode 100644 apps/documents/static/images/icons/layout.png create mode 100644 apps/main/static/images/icons/keyboard.png create mode 100644 apps/metadata/static/images/icons/table.png create mode 100644 apps/metadata/static/images/icons/xhtml.png create mode 100644 apps/permissions/static/images/icons/medal_gold_1.png create mode 100644 apps/project_setup/__init__.py create mode 100644 apps/project_setup/api.py create mode 100644 apps/project_setup/models.py create mode 100644 apps/project_setup/static/images/icons/cog.png create mode 100644 apps/project_setup/static/images/icons/link_button.png create mode 100644 apps/project_setup/tests.py create mode 100644 apps/project_setup/urls.py create mode 100644 apps/project_setup/views.py create mode 100644 apps/project_setup/widgets.py create mode 100644 apps/smart_settings/static/images/icons/cog.png create mode 100644 apps/sources/static/images/icons/application_form.png create mode 100644 apps/user_management/static/images/icons/group.png create mode 100644 apps/user_management/static/images/icons/user.png diff --git a/apps/common/templates/generic_list_horizontal.html b/apps/common/templates/generic_list_horizontal.html new file mode 100644 index 0000000000..c70d5299ec --- /dev/null +++ b/apps/common/templates/generic_list_horizontal.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% load i18n %} +{% load navigation_tags %} +{% load subtemplates_tags %} + +{% block title %} :: {% blocktrans with title|striptags as stripped_title %}List of {{ stripped_title }}{% endblocktrans %}{% endblock %} +{#{% block secondary_links %}{{ secondary_links|safe }}{% endblock %}#} + +{% block sidebar %} + {% for subtemplate in sidebar_subtemplates_list %} + {% if subtemplate.form %} + {% render_subtemplate subtemplate.name subtemplate.context as rendered_subtemplate %} +
+ {{ rendered_subtemplate }} +
+ {% else %} + {% render_subtemplate subtemplate.name subtemplate.context as rendered_subtemplate %} + {{ rendered_subtemplate }} + {% endif %} + {% endfor %} + +{% endblock %} + +{% block content %} + {% include "generic_list_horizontal_subtemplate.html" %} + +{% endblock %} + diff --git a/apps/common/templates/generic_list_horizontal_subtemplate.html b/apps/common/templates/generic_list_horizontal_subtemplate.html new file mode 100644 index 0000000000..ce613c43df --- /dev/null +++ b/apps/common/templates/generic_list_horizontal_subtemplate.html @@ -0,0 +1,191 @@ +{% load i18n %} +{% load attribute_tags %} +{% load pagination_tags %} +{% load navigation_tags %} +{% load non_breakable %} +{% load variable_tags %} +{% load main_settings_tags %} + +{% get_main_setting "DISABLE_ICONS" as disable_icons %} + +{% if side_bar %} +
+

+ {{ title|capfirst }} +

+
+

+{% else %} + {% autopaginate object_list %} +

+

+ {% ifnotequal page_obj.paginator.num_pages 1 %} + {% blocktrans with page_obj.start_index as start and page_obj.end_index as end and page_obj.paginator.object_list|length as total and page_obj.number as page_number and page_obj.paginator.num_pages as total_pages %}List of {{ title }} ({{ start }} - {{ end }} out of {{ total }}) (Page {{ page_number }} of {{ total_pages }}){% endblocktrans %} + {% else %} + {% blocktrans with page_obj.paginator.object_list|length as total %}List of {{ title }} ({{ total }}){% endblocktrans %} + {% endifnotequal %} +

+ +
+{% endif %} + +
+ + {% if object_list %} + {% if multi_select or multi_select_as_buttons %} + {% if multi_select_as_buttons %} + {% get_multi_item_links as multi_item_links %} + + {% else %} + {% with "true" as form_hide_required_text %} + {% get_multi_item_links_form %} + {% endwith %} + + {% endif %} + {% endif %} + {% endif %} + + {% if scrollable_content %} +
+ {% endif %} + +{% comment %} + + + {% if not hide_header %} + + {% if multi_select or multi_select_as_buttons %} + + {% endif %} + + {% if not hide_object %} + + {% endif %} + + {% for column in extra_columns_preffixed %} + + {% endfor %} + + {% for column in object_list.0|get_model_list_columns %} + + {% endfor %} + + {% for column in extra_columns %} + + {% endfor %} + + {% if not hide_links %} + + {% endif %} + + {% endif %} + {% for object in object_list %} + + {% if multi_select or multi_select_as_buttons %} + + {% endif %} + {% if not hide_object %} + {% if main_object %} + {% with object|object_property:main_object as object %} + + {% endwith %} + {% else %} + + {% endif %} + {% endif %} + {% for column in extra_columns_preffixed %} + {% if column.keep_together %} + + {% else %} + + {% endif %} + {% endfor %} + {% if not hide_columns %} + {% for column in object|get_model_list_columns %} + + {% endfor %} + {% endif %} + {% for column in extra_columns %} + {% if column.keep_together %} + + {% else %} + + {% endif %} + {% endfor %} + {% if not hide_links %} + {% if list_object_variable_name %} + {% copy_variable object as list_object_variable_name %} + {% copy_variable list_object_variable_name as "navigation_object_name" %} + {% endif %} + + {% endif %} + + {% empty %} + + {% endfor %} + +
{% trans "Identifier" %}{{ column.name|capfirst }}{{ column.name|capfirst }}{{ column.name|capfirst }} 
{% if not hide_link %}{{ object }}{% else %}{{ object }}{% endif %}{% if not hide_link %}{{ object }}{% else %}{{ object }}{% endif %} + {{ object|object_property:column.attribute|make_non_breakable }} + {{ object|object_property:column.attribute }}{{ object|object_property:column.attribute }} + {{ object|object_property:column.attribute|make_non_breakable }} + {{ object|object_property:column.attribute }} + {% if navigation_object_links %} + {% with navigation_object_links as overrided_object_links %} + {% object_navigation_template %} + {% endwith %} + {% else %} + {% object_navigation_template %} + {% endif %} +
{% blocktrans with title|striptags as stripped_title %}There are no {{ stripped_title }}{% endblocktrans %}
+{% endcomment %} + + + {% if scrollable_content %} +
+ {% endif %} + + {% if object_list %} + {% if multi_select or multi_select_as_buttons %} + {% if multi_select_as_buttons %} + {% get_multi_item_links as multi_item_links %} + + {% else %} + {% with "true" as form_hide_required_text %} + {% get_multi_item_links_form %} + {% endwith %} + + {% endif %} + {% endif %} + {% endif %} +
+ {% paginate %} + + {% if side_bar %} +

+ {% endif %} +
+
diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 748e84a3b5..dce591fed0 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -11,6 +11,7 @@ from permissions.api import register_permission, set_namespace_title from tags.widgets import get_tags_inline_widget_simple from history.api import register_history_type from metadata.api import get_metadata_string +from project_setup.api import register_setup from documents.models import Document, DocumentPage, \ DocumentPageTransformation, DocumentType, DocumentTypeFilename @@ -107,6 +108,7 @@ document_missing_list = {'text': _(u'Find missing document files'), 'view': 'doc # Document type related links document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +document_type_setup = {'text': _(u'document types'), 'view': 'document_type_list', 'famfam': 'layout', 'icon': 'layout.png', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_type_document_list = {'text': _(u'documents of this type'), 'view': 'document_type_document_list', 'args': 'document_type.id', 'famfam': 'page_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_type_edit = {'text': _(u'edit'), 'view': 'document_type_edit', 'args': 'document_type.id', 'famfam': 'layout_edit', 'permissions': [PERMISSION_DOCUMENT_TYPE_EDIT]} document_type_delete = {'text': _(u'delete'), 'view': 'document_type_delete', 'args': 'document_type.id', 'famfam': 'layout_delete', 'permissions': [PERMISSION_DOCUMENT_TYPE_DELETE]} @@ -123,7 +125,7 @@ document_type_views = ['setup_document_type_metadata', 'document_type_list', 'do register_links(DocumentType, [document_type_document_list, document_type_filename_list, document_type_edit, document_type_delete]) register_links(DocumentTypeFilename, [document_type_filename_edit, document_type_filename_delete]) -register_links(['setup_document_type_metadata', 'document_type_filename_delete', 'document_type_create', 'document_type_filename_create', 'document_type_filename_edit', 'document_type_filename_list', 'document_type_list', 'document_type_document_list', 'document_type_edit', 'document_type_delete'], [document_type_create], menu_name='sidebar') +register_links(['setup_document_type_metadata', 'document_type_filename_delete', 'document_type_create', 'document_type_filename_create', 'document_type_filename_edit', 'document_type_filename_list', 'document_type_list', 'document_type_document_list', 'document_type_edit', 'document_type_delete'], [document_type_list, document_type_create], menu_name='sidebar') register_links(['document_type_filename_create', 'document_type_filename_list', 'document_type_filename_edit', 'document_type_filename_delete'], [document_type_filename_create], menu_name='sidebar') # Register document links @@ -199,3 +201,5 @@ register_links(Document, [document_history_view], menu_name='form_header') if (validate_path(document_settings.CACHE_PATH) == False) or (not document_settings.CACHE_PATH): setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp()) + +register_setup(document_type_setup) diff --git a/apps/documents/static/images/icons/layout.png b/apps/documents/static/images/icons/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2bb814c2783f87dbc11fc97f7b2335b238e96b GIT binary patch literal 979 zcmV;^11$WBP)?*_qwhG}-2t9oRP6?9BV#_rCAVECPTSdbIxHPZj4Yz62@ZzYatIk0JDMxxTwR zf0OR@pMAI?PkT^IiY?Ti3}sH^{pKck96>Mu1+uGyLLB)3m8yivsVOiqGXwxF?dg<& zXWJ59?MPtI-CFp7aD5oz{&b`_TlB%11&yuJUn+H0}rON@a4x2l=sTea?4Z;X0wBk&*$p_ zkOlyUjn9AK$(^h50BZ8$>K3fboP%=tC)}8wQ$NcV<0F(xB^VhQ1~=w$8)CrM>h`Yg zhLrv7@gaR*aBk?7@ZsYpa`(yQ(E5>Z`O-x_kC`;tYV% z01dB3U{Y^oyv8xDkGeLLkbLIB#1Hg_3pEP{*Z-pMDz&@sp{2>{cb zj}DMMDXudQwq+J}L}@JOrM#9;L;(w!%)s4=94tJ48#|Dwa|GO*%<0dgqoYtP7TcJsz{*v~GP`YKgFw)_2$LH&(_Q_NpR5d-QP zQ`cY@UISWrU7$CgZxoQ^+)Mk4 literal 0 HcmV?d00001 diff --git a/apps/main/__init__.py b/apps/main/__init__.py index e6225b1c9b..cc0d1d74f3 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -1,15 +1,10 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import register_top_menu -from permissions import role_list, permission_views -from user_management import user_list, group_list, user_management_views from navigation.api import register_links from history import history_list from converter import formats_list -from documents import document_type_views -from metadata import setup_metadata_type_list, metadata_type_setup_views -from metadata import setup_metadata_set_list, metadata_set_setup_views -from sources import source_list, source_views +from project_setup.api import register_setup from main.conf.settings import SIDE_BAR_SEARCH from main.conf.settings import DISABLE_HOME_VIEW @@ -22,7 +17,7 @@ check_settings = {'text': _(u'settings'), 'view': 'setting_list', 'famfam': 'cog statistics = {'text': _(u'statistics'), 'view': 'statistics', 'famfam': 'table'} diagnostics = {'text': _(u'diagnostics'), 'view': 'diagnostics', 'famfam': 'pill'} tools_menu = {'text': _(u'tools'), 'view': 'tools_menu', 'famfam': 'wrench'} -admin_site = {'text': _(u'admin site'), 'url': '/admin', 'famfam': 'keyboard', 'condition': is_superuser} +admin_site = {'text': _(u'admin site'), 'url': '/admin', 'famfam': 'keyboard', 'icon': 'keyboard.png', 'condition': is_superuser} sentry = {'text': _(u'sentry'), 'url': '/sentry', 'famfam': 'bug', 'condition': is_superuser} document_types = {'text': _(u'document types'), 'view': 'document_type_list', 'famfam': 'layout', 'children_view_regex': ['document_type', 'setup_document_type']} @@ -45,20 +40,8 @@ if not SIDE_BAR_SEARCH: register_top_menu('search', link={'text': _(u'search'), 'view': 'search', 'famfam': 'zoom'}, children_path_regex=[r'^search/']) register_top_menu('tools', link=tools_menu, children_views=['statistics', 'history_list', 'formats_list'], position=-3) -#register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children=setup_views) -register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setting_list', 'famfam': 'cog'}, children_path_regex=[r'^settings/', r'^user_management/', r'^permissions', r'^documents/type', r'^metadata/setup', r'sources/setup'], position=-2) - register_links(['tools_menu', 'statistics', 'history_list', 'history_view', 'formats_list'], [tools_menu, statistics, history_list, formats_list, sentry], menu_name='secondary_menu') -setup_links = [check_settings, role_list, user_list, group_list, document_types, setup_metadata_type_list, setup_metadata_set_list, source_list, admin_site] -register_links(['setting_list'], setup_links, menu_name='secondary_menu') -register_links(permission_views, setup_links, menu_name='secondary_menu') -register_links(user_management_views, setup_links, menu_name='secondary_menu') -register_links(document_type_views, setup_links, menu_name='secondary_menu') -register_links(metadata_type_setup_views, setup_links, menu_name='secondary_menu') -register_links(metadata_set_setup_views, setup_links, menu_name='secondary_menu') -register_links(source_views, setup_links, menu_name='secondary_menu') - def get_version(): """ @@ -73,3 +56,5 @@ def get_version(): return ''.join(vers) __version__ = get_version() + +register_setup(admin_site) diff --git a/apps/main/static/images/icons/keyboard.png b/apps/main/static/images/icons/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..882d48bd34c2790307d6fa0616eb567655d41b5c GIT binary patch literal 1197 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 e*CX(c00RK!@u#s8?*T*r0000w{P) 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 1 + 1 == 2 +True +"""} + diff --git a/apps/project_setup/urls.py b/apps/project_setup/urls.py new file mode 100644 index 0000000000..c78f55eaab --- /dev/null +++ b/apps/project_setup/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('project_setup.views', + url(r'^list/$', 'setup_list', (), 'setup_list'), +) diff --git a/apps/project_setup/views.py b/apps/project_setup/views.py new file mode 100644 index 0000000000..757b78326f --- /dev/null +++ b/apps/project_setup/views.py @@ -0,0 +1,16 @@ +from django.shortcuts import render_to_response, get_object_or_404 +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _ + +from project_setup.api import setup_items +from project_setup.widgets import setup_button_widget + + +def setup_list(request): + context = { + 'object_list': [setup_button_widget(request, item) for item in setup_items], + 'title': _(u'setup items'), + } + + return render_to_response('generic_list_horizontal.html', context, + context_instance=RequestContext(request)) diff --git a/apps/project_setup/widgets.py b/apps/project_setup/widgets.py new file mode 100644 index 0000000000..8ed77c2fe9 --- /dev/null +++ b/apps/project_setup/widgets.py @@ -0,0 +1,29 @@ +from django.utils.safestring import mark_safe +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse +from django.template.defaultfilters import capfirst +from django.core.exceptions import PermissionDenied + +from permissions.api import check_permissions + + +def setup_button_widget(request, setup_link): + if 'permissions' in setup_link: + try: + check_permissions(request.user, setup_link['permissions']) + return render_widget(setup_link) + except PermissionDenied: + return u'' + else: + return render_widget(setup_link) + + +def render_widget(setup_link): + return mark_safe(u'' % { + 'url': reverse(setup_link['view']) if 'view' in setup_link else setup_link['url'], + 'icon': setup_link.get('icon', 'link_button.png'), + 'static_url': settings.STATIC_URL, + 'string': capfirst(setup_link['text']), + 'image_alt': _(u'icon'), + }) diff --git a/apps/smart_settings/__init__.py b/apps/smart_settings/__init__.py index e69de29bb2..5926e68754 100644 --- a/apps/smart_settings/__init__.py +++ b/apps/smart_settings/__init__.py @@ -0,0 +1,10 @@ +from django.utils.translation import ugettext_lazy as _ + +from project_setup.api import register_setup + +def is_superuser(context): + return context['request'].user.is_staff or context['request'].user.is_superuser + +check_settings = {'text': _(u'settings'), 'view': 'setting_list', 'famfam': 'cog', 'icon': 'cog.png', 'condition': is_superuser} + +register_setup(check_settings) diff --git a/apps/smart_settings/static/images/icons/cog.png b/apps/smart_settings/static/images/icons/cog.png new file mode 100644 index 0000000000000000000000000000000000000000..d53ebf1c3d85bd8965ee1a2fe3ff32ad585f53dd GIT binary patch literal 2104 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 VQXN}0`|$t(002ovPDHLkV1ig=yf^>= literal 0 HcmV?d00001 diff --git a/apps/user_management/__init__.py b/apps/user_management/__init__.py index 69f89919a3..6b2bc6aa82 100644 --- a/apps/user_management/__init__.py +++ b/apps/user_management/__init__.py @@ -3,6 +3,7 @@ from django.contrib.auth.models import User, Group from navigation.api import register_links, register_multi_item_links from permissions.api import register_permission, set_namespace_title +from project_setup.api import register_setup PERMISSION_USER_CREATE = {'namespace': 'user_management', 'name': 'user_create', 'label': _(u'Create new users')} PERMISSION_USER_EDIT = {'namespace': 'user_management', 'name': 'user_edit', 'label': _(u'Edit existing users')} @@ -24,7 +25,8 @@ register_permission(PERMISSION_GROUP_EDIT) register_permission(PERMISSION_GROUP_VIEW) register_permission(PERMISSION_GROUP_DELETE) -user_list = {'text': _(u'user list'), 'view': 'user_list', 'famfam': 'user', 'permissions': [PERMISSION_USER_VIEW], 'children_view_regex': ['user']} +user_list = {'text': _(u'user list'), 'view': 'user_list', 'famfam': 'user', 'permissions': [PERMISSION_USER_VIEW]} +user_setup = {'text': _(u'users'), 'view': 'user_list', 'famfam': 'user', 'icon': 'user.png', 'permissions': [PERMISSION_USER_VIEW]} user_edit = {'text': _(u'edit'), 'view': 'user_edit', 'args': 'object.id', 'famfam': 'user_edit', 'permissions': [PERMISSION_USER_EDIT]} user_add = {'text': _(u'create new user'), 'view': 'user_add', 'famfam': 'user_add', 'permissions': [PERMISSION_USER_CREATE]} user_delete = {u'text': _('delete'), 'view': 'user_delete', 'args': 'object.id', 'famfam': 'user_delete', 'permissions': [PERMISSION_USER_DELETE]} @@ -32,7 +34,8 @@ user_multiple_delete = {u'text': _('delete'), 'view': 'user_multiple_delete', 'f user_set_password = {u'text': _('reset password'), 'view': 'user_set_password', 'args': 'object.id', 'famfam': 'lock_edit', 'permissions': [PERMISSION_USER_EDIT]} user_multiple_set_password = {u'text': _('reset password'), 'view': 'user_multiple_set_password', 'famfam': 'lock_edit', 'permissions': [PERMISSION_USER_EDIT]} -group_list = {'text': _(u'group list'), 'view': 'group_list', 'famfam': 'group', 'permissions': [PERMISSION_GROUP_VIEW], 'children_view_regex': ['group']} +group_list = {'text': _(u'group list'), 'view': 'group_list', 'famfam': 'group', 'permissions': [PERMISSION_GROUP_VIEW]} +group_setup = {'text': _(u'groups'), 'view': 'group_list', 'famfam': 'group', 'icon': 'group.png', 'permissions': [PERMISSION_GROUP_VIEW]} group_edit = {'text': _(u'edit'), 'view': 'group_edit', 'args': 'object.id', 'famfam': 'group_edit', 'permissions': [PERMISSION_GROUP_EDIT]} group_add = {'text': _(u'create new group'), 'view': 'group_add', 'famfam': 'group_add', 'permissions': [PERMISSION_GROUP_CREATE]} group_delete = {u'text': _('delete'), 'view': 'group_delete', 'args': 'object.id', 'famfam': 'group_delete', 'permissions': [PERMISSION_GROUP_DELETE]} @@ -40,11 +43,11 @@ group_multiple_delete = {u'text': _('delete'), 'view': 'group_multiple_delete', group_members = {'text': _(u'members'), 'view': 'group_members', 'args': 'object.id', 'famfam': 'group_link', 'permissions': [PERMISSION_GROUP_EDIT]} register_links(User, [user_edit, user_set_password, user_delete]) -register_links(['user_multiple_set_password', 'user_set_password', 'user_multiple_delete', 'user_delete', 'user_edit', 'user_list', 'user_add'], [user_add], menu_name=u'sidebar') +register_links(['user_multiple_set_password', 'user_set_password', 'user_multiple_delete', 'user_delete', 'user_edit', 'user_list', 'user_add'], [user_list, user_add], menu_name=u'sidebar') register_multi_item_links(['user_list'], [user_multiple_set_password, user_multiple_delete]) register_links(Group, [group_edit, group_members, group_delete]) -register_links(['group_multiple_delete', 'group_delete', 'group_edit', 'group_list', 'group_add', 'group_members'], [group_add], menu_name=u'sidebar') +register_links(['group_multiple_delete', 'group_delete', 'group_edit', 'group_list', 'group_add', 'group_members'], [group_list, group_add], menu_name=u'sidebar') register_multi_item_links(['group_list'], [group_multiple_delete]) user_management_views = [ @@ -53,3 +56,6 @@ user_management_views = [ 'user_multiple_set_password', 'group_list', 'group_edit', 'group_add', 'group_delete', 'group_multiple_delete', 'group_members' ] + +register_setup(user_setup) +register_setup(group_setup) diff --git a/apps/user_management/static/images/icons/group.png b/apps/user_management/static/images/icons/group.png new file mode 100644 index 0000000000000000000000000000000000000000..bea24889d1f1e26920eeb028f4050383d725c6f8 GIT binary patch literal 2088 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 literal 0 HcmV?d00001 diff --git a/settings.py b/settings.py index 7f84463082..d40a1b900b 100644 --- a/settings.py +++ b/settings.py @@ -125,6 +125,7 @@ INSTALLED_APPS = ( 'django.contrib.admindocs', 'django.contrib.comments', 'django.contrib.staticfiles', + 'project_setup', 'smart_settings', 'navigation', 'web_theme', diff --git a/urls.py b/urls.py index 8410576200..b5449b71ef 100644 --- a/urls.py +++ b/urls.py @@ -26,6 +26,7 @@ urlpatterns = patterns('', (r'^history/', include('history.urls')), (r'^converter/', include('converter.urls')), (r'^sources/', include('sources.urls')), + (r'^project_setup/', include('project_setup.urls')), )