On 05/15/2015 10:59 AM, Petr Vobornik wrote:
Stage User Web UI is actually just the last four patches(847-850).
I expect that patch 848 - deleter dialog needs some adjustments (was
discussed offline).
The rest are prerequisites, namely:
- update of patternfly
- update navigation code to support multiple entities under one entity
tree (it broke a "memory feature/bug" of the navigation)
- support for "facet tabs" in sidebar
Attaching new version of 847-1. The old version did not apply because I
had also a new version of topology plugin UI (will be send later today)
in my git tree.
--
Petr Vobornik
From 4fd0856a3f0a278d44b7dd9501508ab7afc0b58d Mon Sep 17 00:00:00 2001
From: Petr Vobornik <pvobo...@redhat.com>
Date: Wed, 22 Apr 2015 14:57:26 +0200
Subject: [PATCH] webui: stageuser plugin
---
install/ui/doc/categories.json | 1 +
install/ui/src/freeipa/app.js | 1 +
install/ui/src/freeipa/navigation/menu_spec.js | 17 +-
install/ui/src/freeipa/stageuser.js | 351 +++++++++++++++++++++++++
install/ui/src/freeipa/user.js | 17 +-
install/ui/test/data/ipa_init.json | 10 +
ipalib/plugins/internal.py | 11 +
7 files changed, 406 insertions(+), 2 deletions(-)
create mode 100644 install/ui/src/freeipa/stageuser.js
diff --git a/install/ui/doc/categories.json b/install/ui/doc/categories.json
index c84077682eafa42981e8a1c1a2f93c712e6421fd..9de673593765fc828cca07b4ad133ea16a5ccd76 100644
--- a/install/ui/doc/categories.json
+++ b/install/ui/doc/categories.json
@@ -250,6 +250,7 @@
"idviews",
"otptoken",
"radiusproxy",
+ "stageuser",
"user",
"plugins.load",
"plugins.login",
diff --git a/install/ui/src/freeipa/app.js b/install/ui/src/freeipa/app.js
index 46752fa09e47be9e14e5fa37ce1bd1cbd0b0afdf..140fe938f68975310175fb9fadf0ec36db048b72 100644
--- a/install/ui/src/freeipa/app.js
+++ b/install/ui/src/freeipa/app.js
@@ -48,6 +48,7 @@ define([
'./sudo',
'./trust',
'./user',
+ './stageuser',
'dojo/domReady!'
],function(app_container) {
return app_container;
diff --git a/install/ui/src/freeipa/navigation/menu_spec.js b/install/ui/src/freeipa/navigation/menu_spec.js
index ca1a290f479fd0cc6a399e6bc93bd3e8ed1fca40..13f533d1a6fbb21c73e1f0e5fe1df2836c99f832 100644
--- a/install/ui/src/freeipa/navigation/menu_spec.js
+++ b/install/ui/src/freeipa/navigation/menu_spec.js
@@ -36,7 +36,22 @@ var nav = {};
name: 'identity',
label: '@i18n:tabs.identity',
children: [
- { entity: 'user' },
+ {
+ entity: 'user',
+ facet: 'search',
+ children: [
+ {
+ entity: 'stageuser',
+ facet: 'search',
+ hidden: true
+ },
+ {
+ entity: 'user',
+ facet: 'search_preserved',
+ hidden: true
+ }
+ ]
+ },
{ entity: 'group' },
{ entity: 'host' },
{ entity: 'hostgroup' },
diff --git a/install/ui/src/freeipa/stageuser.js b/install/ui/src/freeipa/stageuser.js
new file mode 100644
index 0000000000000000000000000000000000000000..8334d556551f2b35a41aa59429d1b9e37995b3b7
--- /dev/null
+++ b/install/ui/src/freeipa/stageuser.js
@@ -0,0 +1,351 @@
+//
+// Copyright (C) 2015 FreeIPA Contributors see COPYING for license
+//
+
+define([
+ 'dojo/on',
+ './ipa',
+ './jquery',
+ './menu',
+ './phases',
+ './reg',
+ './rpc',
+ './text',
+ './details',
+ './facet',
+ './user',
+ './search',
+ './entity'],
+ function(
+ on, IPA, $, menu, phases, reg, rpc, text, mod_details, mod_facet, mod_user) {
+/**
+ * Stage user module
+ * @class
+ * @singleton
+ */
+var stageuser = IPA.stageuser = {
+
+ search_facet_group: {
+ name: 'search',
+ label: '@i18n:objects.stageuser.user_categories',
+ facets: {
+ search_normal: 'user_search',
+ search: 'stageuser_search',
+ search_preserved: 'user_search_preserved'
+ }
+ }
+};
+
+var make_stageuser_spec = function() {
+return {
+ name: 'stageuser',
+ facet_groups: ['settings'],
+ facets: [
+ {
+ $type: 'search',
+ disable_facet_tabs: false,
+ tabs_in_sidebar: true,
+ tab_label: '@i18n:objects.stageuser.label',
+ facet_groups: [stageuser.search_facet_group],
+ facet_group: 'search',
+ columns: [
+ 'uid',
+ 'givenname',
+ 'sn',
+ 'uidnumber',
+ 'mail',
+ 'telephonenumber',
+ 'title'
+ ],
+ actions: [
+ {
+ $type: 'batch_activate'
+ }
+ ],
+ control_buttons: [
+ {
+ name: 'activate',
+ label: '@i18n:buttons.activate',
+ icon: 'fa-plus'
+ }
+ ]
+ },
+ {
+ $type: 'details',
+ disable_facet_tabs: true,
+ sections: [
+ {
+ name: 'identity',
+ label: '@i18n:details.identity',
+ fields: [
+ 'title',
+ 'givenname',
+ 'sn',
+ 'cn',
+ 'displayname',
+ 'initials',
+ 'gecos',
+ {
+ name: 'userclass',
+ flags: ['w_if_no_aci']
+ }
+ ]
+ },
+ {
+ name: 'account',
+ label: '@i18n:objects.user.account',
+ fields: [
+ 'uid',
+ {
+ $factory: mod_user.password_widget,
+ name: 'has_password',
+ metadata: '@mo-param:user:userpassword'
+ },
+ {
+ $type: 'datetime',
+ name: 'krbpasswordexpiration',
+ label: '@i18n:objects.user.krbpasswordexpiration',
+ read_only: true
+ },
+ {
+ name: 'uidnumber',
+ minvalue: -1
+ },
+ {
+ name: 'gidnumber',
+ minvalue: -1
+ },
+ 'krbprincipalname',
+ {
+ $type: 'datetime',
+ name: 'krbprincipalexpiration'
+ },
+ 'loginshell',
+ 'homedirectory',
+ {
+ $type: 'sshkeys',
+ name: 'ipasshpubkey',
+ label: '@i18n:objects.sshkeystore.keys'
+ },
+ {
+ $type: 'checkboxes',
+ name: 'ipauserauthtype',
+ flags: ['w_if_no_aci'],
+ options: [
+ { label: '@i18n:authtype.type_password', value: 'password' },
+ { label: '@i18n:authtype.type_radius', value: 'radius' },
+ { label: '@i18n:authtype.type_otp', value: 'otp' }
+ ],
+ tooltip: '@i18n:authtype.user_tooltip'
+ },
+ {
+ $type: 'entity_select',
+ name: 'ipatokenradiusconfiglink',
+ flags: ['w_if_no_aci'],
+ other_entity: 'radiusproxy',
+ other_field: 'cn'
+ },
+ {
+ name: 'ipatokenradiususername',
+ flags: ['w_if_no_aci']
+ }
+ ]
+ },
+ {
+ name: 'contact',
+ label: '@i18n:objects.user.contact',
+ fields: [
+ { $type: 'multivalued', name: 'mail' },
+ { $type: 'multivalued', name: 'telephonenumber' },
+ { $type: 'multivalued', name: 'pager' },
+ { $type: 'multivalued', name: 'mobile' },
+ { $type: 'multivalued', name: 'facsimiletelephonenumber' }
+ ]
+ },
+ {
+ name: 'mailing',
+ label: '@i18n:objects.user.mailing',
+ fields: ['street', 'l', 'st', 'postalcode']
+ },
+ {
+ name: 'employee',
+ label: '@i18n:objects.user.employee',
+ fields: [
+ 'ou',
+ {
+ $type: 'entity_select',
+ name: 'manager',
+ other_entity: 'user',
+ other_field: 'uid'
+ },
+ { $type: 'multivalued', name: 'departmentnumber' },
+ 'employeenumber',
+ 'employeetype',
+ 'preferredlanguage'
+ ]
+ },
+ {
+ name: 'misc',
+ label: '@i18n:objects.user.misc',
+ fields: [
+ { $type: 'multivalued', name: 'carlicense' }
+ ]
+ }
+ ],
+ actions: [
+ 'delete'
+ ],
+ header_actions: ['delete'],
+ state: {
+ evaluators: [
+ {
+ $factory: IPA.enable_state_evaluator,
+ field: 'nsaccountlock',
+ adapter: { $type: 'batch', result_index: 0 },
+ invert_value: true
+ },
+ {
+ $factory: IPA.acl_state_evaluator,
+ name: 'reset_password_acl_evaluator',
+ adapter: { $type: 'batch', result_index: 0 },
+ attribute: 'userpassword'
+ },
+ IPA.user.self_service_other_user_evaluator
+ ],
+ summary_conditions: [
+ IPA.enabled_summary_cond,
+ IPA.disabled_summary_cond
+ ]
+ }
+ }
+ ],
+ adder_dialog: {
+ sections: [
+ {
+ fields: [
+ {
+ name: 'uid',
+ required: false
+ },
+ 'givenname',
+ 'sn',
+ 'userclass'
+ ]
+ },
+ {
+ fields: [
+ {
+ name: 'userpassword',
+ label: '@i18n:password.new_password',
+ $type: 'password'
+ },
+ {
+ name: 'userpassword2',
+ label: '@i18n:password.verify_password',
+ $type: 'password',
+ flags: ['no_command'],
+ validators: [{
+ $type: 'same_password',
+ other_field: 'userpassword'
+ }]
+ }
+ ]
+ }
+ ]
+ }
+};};
+
+stageuser.search_preserved_facet_spec = {
+ $type: 'search',
+ $pre_ops: [
+ { $del: [[ 'control_buttons', [{ name: 'add'}, { name: 'delete'}] ]] }
+ ],
+ disable_facet_tabs: false,
+ tabs_in_sidebar: true,
+ entity: 'user',
+ managed_entity: 'user',
+ name: 'search_preserved',
+ label: '@i18n:objects.stageuser.preserved_label',
+ tab_label: '@i18n:objects.stageuser.preserved_label',
+ facet_groups: [stageuser.search_facet_group],
+ facet_group: 'search',
+ command_options: {
+ 'preserved': true
+ },
+ columns: [
+ 'uid',
+ 'givenname',
+ 'sn',
+ 'uidnumber',
+ 'mail',
+ 'telephonenumber',
+ 'title'
+ ],
+ actions: [
+ {
+ $type: 'batch_undel'
+ }
+ ],
+ control_buttons: [
+ {
+ name: 'undel',
+ label: '@i18n:buttons.restore',
+ icon: 'fa-plus'
+ }
+ ]
+};
+
+stageuser.batch_activate_action = function(spec) {
+
+ spec = spec || {};
+
+ spec.name = spec.name || 'activate';
+ spec.method = spec.method || 'activate';
+ spec.needs_confirm = spec.needs_confirm === undefined ? true : spec.needs_confirm;
+ spec.enabled = spec.enabled === undefined ? false : spec.enabled;
+ spec.enable_cond = spec.enable_cond || ['item-selected'];
+ spec.success_msg = spec.success_msg || '@i18n:objects.stageuser.activate_success';
+ spec.confirm_msg = spec.confirm_msg || '@i18n:objects.stageuser.activate_confirm';
+
+ return IPA.batch_items_action(spec);
+};
+
+stageuser.batch_undel_action = function(spec) {
+
+ spec = spec || {};
+
+ spec.name = spec.name || 'undel';
+ spec.method = spec.method || 'undel';
+ spec.needs_confirm = spec.needs_confirm === undefined ? true : spec.needs_confirm;
+ spec.enabled = spec.enabled === undefined ? false : spec.enabled;
+ spec.enable_cond = spec.enable_cond || ['item-selected'];
+ spec.success_msg = spec.success_msg || '@i18n:objects.stageuser.undel_success';
+ spec.confirm_msg = spec.confirm_msg || '@i18n:objects.stageuser.undel_confirm';
+
+ return IPA.batch_items_action(spec);
+};
+
+/**
+ * Stage user entity specification object
+ * @member stageuser
+ */
+stageuser.stageuser_spec = make_stageuser_spec();
+
+/**
+ * Register entity
+ * @member stageuser
+ */
+stageuser.register = function() {
+ var a = reg.action;
+ var e = reg.entity;
+ var f = reg.facet;
+ a.register('batch_activate', stageuser.batch_activate_action);
+ a.register('batch_undel', stageuser.batch_undel_action);
+ e.register({type: 'stageuser', spec: stageuser.stageuser_spec});
+ f.register_from_spec('user_search_preserved', stageuser.search_preserved_facet_spec);
+};
+
+phases.on('registration', stageuser.register);
+
+return stageuser;
+});
diff --git a/install/ui/src/freeipa/user.js b/install/ui/src/freeipa/user.js
index 72d295020ce812d30abda359a2dbdf6ef88dd833..787e95f8ffde7a9266adfe197579b9de12ab6164 100644
--- a/install/ui/src/freeipa/user.js
+++ b/install/ui/src/freeipa/user.js
@@ -43,7 +43,17 @@ define([
* @alternateClassName IPA.user
* @singleton
*/
-var exp = IPA.user = {};
+var exp = IPA.user = {
+ search_facet_group: {
+ name: 'search',
+ label: '@i18n:objects.stageuser.user_categories',
+ facets: {
+ search_normal: 'user_search',
+ search: 'stageuser_search',
+ search_preserved: 'user_search_preserved'
+ }
+ }
+};
var make_spec = function() {
return {
@@ -51,6 +61,11 @@ return {
facets: [
{
$type: 'search',
+ label: '@i18n:objects.user.activeuser_label',
+ tab_label: '@i18n:objects.user.activeuser_label',
+ disable_facet_tabs: false,
+ tabs_in_sidebar: true,
+ facet_groups: [exp.search_facet_group],
row_disabled_attribute: 'nsaccountlock',
columns: [
'uid',
diff --git a/install/ui/test/data/ipa_init.json b/install/ui/test/data/ipa_init.json
index f969a874f84da5e9bff36d6b33678b5e908df852..b17bf777fb665a77b31505f79149902ba7fd3ede 100644
--- a/install/ui/test/data/ipa_init.json
+++ b/install/ui/test/data/ipa_init.json
@@ -508,6 +508,15 @@
"status_new_ns": "New: key not set",
"status_new_s": "New: key set"
},
+ "stageuser": {
+ "activate_confirm": "Are you sure you want to activate selected users?",
+ "activate_success": "${count} user(s) activated",
+ "label": "Stage users",
+ "preserved_label": "Preserved users",
+ "undel_confirm": "Are you sure you want to restore selected users?",
+ "undel_success": "${count} user(s) restored",
+ "user_categories": "User categories",
+ },
"sudocmd": {
"groups": "Groups"
},
@@ -556,6 +565,7 @@
"user": {
"account": "Account Settings",
"account_status": "Account Status",
+ "activeuser_label": "Active users",
"contact": "Contact Settings",
"employee": "Employee Information",
"error_changing_status": "Error changing account status",
diff --git a/ipalib/plugins/internal.py b/ipalib/plugins/internal.py
index a76a3180dde01211d291e55922da57b7f8b4f7ba..56d271b4a7a9f3abe9167f7a273b48df7979c552 100644
--- a/ipalib/plugins/internal.py
+++ b/ipalib/plugins/internal.py
@@ -200,6 +200,7 @@ class i18n_messages(Command):
},
"buttons": {
"about": _("About"),
+ "activate": _("Activate"),
"add": _("Add"),
"add_and_add_another": _("Add and Add Another"),
"add_and_close": _("Add and Close"),
@@ -653,6 +654,15 @@ class i18n_messages(Command):
"status_new_ns": _("New: key not set"),
"status_new_s": _("New: key set"),
},
+ "stageuser": {
+ "activate_confirm": _("Are you sure you want to activate selected users?"),
+ "activate_success": _("${count} user(s) activated"),
+ "label": _("Stage users"),
+ "preserved_label": _("Preserved users"),
+ "undel_confirm": _("Are you sure you want to restore selected users?"),
+ "undel_success": _("${count} user(s) restored"),
+ "user_categories": _("User categories"),
+ },
"sudocmd": {
"groups": _("Groups"),
},
@@ -701,6 +711,7 @@ class i18n_messages(Command):
"user": {
"account": _("Account Settings"),
"account_status": _("Account Status"),
+ "activeuser_label": _("Active users"),
"contact": _("Contact Settings"),
"employee": _("Employee Information"),
"error_changing_status": _("Error changing account status"),
--
2.1.0
--
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code