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

Reply via email to