diff --git a/rhodecode/apps/my_account/__init__.py b/rhodecode/apps/my_account/__init__.py --- a/rhodecode/apps/my_account/__init__.py +++ b/rhodecode/apps/my_account/__init__.py @@ -70,6 +70,11 @@ def includeme(config): name='my_account_ssh_keys_delete', pattern=ADMIN_PREFIX + '/my_account/ssh_keys/delete') + # my account user group membership + config.add_route( + name='my_account_user_group_membership', + pattern=ADMIN_PREFIX + '/my_account/user_group_membership') + # my account emails config.add_route( name='my_account_emails', diff --git a/rhodecode/apps/my_account/views/my_account.py b/rhodecode/apps/my_account/views/my_account.py --- a/rhodecode/apps/my_account/views/my_account.py +++ b/rhodecode/apps/my_account/views/my_account.py @@ -48,6 +48,7 @@ from rhodecode.model.pull_request import from rhodecode.model.scm import RepoList from rhodecode.model.user import UserModel from rhodecode.model.repo import RepoModel +from rhodecode.model.user_group import UserGroupModel from rhodecode.model.validation_schema.schemas import user_schema log = logging.getLogger(__name__) @@ -583,3 +584,16 @@ class MyAccountView(BaseAppView, DataGri data = self._get_pull_requests_list(statuses=statuses) return data + @LoginRequired() + @NotAnonymous() + @view_config( + route_name='my_account_user_group_membership', + request_method='GET', + renderer='rhodecode:templates/admin/my_account/my_account.mako') + def my_account_user_group_membership(self): + c = self.load_default_context() + c.active = 'user_group_membership' + groups = [UserGroupModel.get_user_groups_as_dict(group.users_group) + for group in self._rhodecode_db_user.group_member] + c.user_groups = json.dumps(groups) + return self._get_template_context(c) diff --git a/rhodecode/templates/admin/my_account/my_account.mako b/rhodecode/templates/admin/my_account/my_account.mako --- a/rhodecode/templates/admin/my_account/my_account.mako +++ b/rhodecode/templates/admin/my_account/my_account.mako @@ -30,6 +30,8 @@ <li class="${'active' if c.active=='password' else ''}"><a href="${h.route_path('my_account_password')}">${_('Password')}</a></li> <li class="${'active' if c.active=='auth_tokens' else ''}"><a href="${h.route_path('my_account_auth_tokens')}">${_('Auth Tokens')}</a></li> <li class="${'active' if c.active in ['ssh_keys', 'ssh_keys_generate'] else ''}"><a href="${h.route_path('my_account_ssh_keys')}">${_('SSH Keys')}</a></li> + <li class="${'active' if c.active=='user_group_membership' else ''}"><a href="${h.route_path('my_account_user_group_membership')}">${_('User Group Membership')}</a></li> + ## TODO: Find a better integration of oauth views into navigation. <% my_account_oauth_url = h.route_path_or_none('my_account_oauth') %> % if my_account_oauth_url: diff --git a/rhodecode/templates/admin/my_account/my_account_user_group_membership.mako b/rhodecode/templates/admin/my_account/my_account_user_group_membership.mako new file mode 100644 --- /dev/null +++ b/rhodecode/templates/admin/my_account/my_account_user_group_membership.mako @@ -0,0 +1,75 @@ +## -*- coding: utf-8 -*- + +<div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">${_('User Group Membership')}</h3> + </div> + + <div class="panel-body"> + <div class="groups_management"> + <div id="repos_list_wrap"> + <table id="user_group_list_table" class="display"></table> + </div> + </div> + </div> +</div> + + +<script> +var api; +$(document).ready(function() { + + var get_datatable_count = function(){ + $('#user_group_count').text(api.page.info().recordsDisplay); + }; + + $('#user_group_list_table').on('click', 'a.editor_remove', function (e) { + e.preventDefault(); + var row = api.row($(this).closest('tr')); + row.remove().draw(); + } ); + + $('#user_group_list_table').DataTable({ + data: ${c.user_groups|n}, + dom: 'rtp', + pageLength: ${c.visual.admin_grid_items}, + order: [[ 0, "asc" ]], + columns: [ + { data: {"_": "group_name", + "sort": "group_name"}, title: "${_('Name')}", className: "td-componentname," , + render: function (data,type,full,meta) + {return '<div><i class="icon-group" title="User group">'+data+'</i></div>'}}, + + { data: {"_": "group_description", + "sort": "group_description"}, title: "${_('Description')}", className: "td-description" }, + { data: {"_": "users_group_id"}, className: "td-user", + render: function (data,type,full,meta) + {return '<input type="hidden" name="users_group_id" value="'+data+'">'}}, + { data: {"_": "active", + "sort": "active"}, title: "${_('Active')}", className: "td-active"}, + { data: {"_": "owner_data"}, title: "${_('Owner')}", className: "td-user", + render: function (data,type,full,meta) + {return '<div class="rc-user tooltip">'+ + '<img class="gravatar" src="'+ data.owner_icon +'" height="16" width="16">'+ + data.owner +'</div>' + } + } + ], + language: { + paginate: DEFAULT_GRID_PAGINATION, + emptyTable: _gettext("No user groups available yet.") + }, + "initComplete": function( settings, json ) { + var data_grid = $('#user_group_list_table').dataTable(); + api = data_grid.api(); + get_datatable_count(); + } + }); + + // update the counter when doing search + $('#user_group_list_table').on( 'search.dt', function (e,settings) { + get_datatable_count(); + }); + + }); +</script> \ No newline at end of file