From 6e0f177850be4b17603ae744c25ac38d03904f9e Mon Sep 17 00:00:00 2001
From: Jan Mach <jan.mach@cesnet.cz>
Date: Mon, 9 Sep 2019 18:27:58 +0200
Subject: [PATCH] Improved group self-management feature.

Each group has an attribute indicating self-management. When enabled, notice about group membership requests is sent to all group managers. (Redmine issue: #5832)
---
 .../translations/cs/LC_MESSAGES/messages.po   |  46 +-
 doc/sphinx/_doclib/development.rst            |   7 +
 lib/hawat/app.py                              |  10 +
 lib/hawat/blueprints/auth_dev/__init__.py     | 132 +++--
 lib/hawat/blueprints/auth_env/__init__.py     | 130 +++--
 .../auth_env/email_registration_managers.txt  |  20 +
 .../design/templates/_macros_form.html        |   2 +-
 .../design/templates/_macros_site.html        |   1 +
 lib/hawat/blueprints/groups/__init__.py       |  38 +-
 lib/hawat/blueprints/groups/forms.py          | 127 ++---
 .../groups/templates/groups/creatupdate.html  |  17 +-
 .../groups/templates/groups/show.html         |   8 +
 lib/hawat/blueprints/users/__init__.py        |  28 +-
 .../d0f8c8c546dd_added_groups_managed.py      |  24 +
 .../translations/cs/LC_MESSAGES/messages.po   | 472 +++++++++++-------
 lib/mentat/__init__.py                        |   2 +-
 lib/mentat/datatype/sqldb.py                  |   2 +
 17 files changed, 672 insertions(+), 394 deletions(-)
 create mode 100644 lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt
 create mode 100644 lib/hawat/migrations/versions/d0f8c8c546dd_added_groups_managed.py

diff --git a/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po b/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po
index dfb488b4a..0c25fd38c 100644
--- a/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po
+++ b/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-06-07 12:50+0200\n"
+"POT-Creation-Date: 2019-09-09 18:11+0200\n"
 "PO-Revision-Date: 2017-09-22 15:33+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: cs\n"
@@ -12,7 +12,7 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.6.0\n"
+"Generated-By: Babel 2.7.0\n"
 
 #: conf/templates/reporter/_macros.common.txt.j2:13
 msgid ""
@@ -431,87 +431,87 @@ msgstr "pozdrĹľeno"
 msgid "relapsed"
 msgstr "znovu objeveno"
 
-#: lib/mentat/const.py:113
+#: lib/mentat/const.py:119
 msgid "low"
 msgstr "nízká"
 
-#: lib/mentat/const.py:114
+#: lib/mentat/const.py:120
 msgid "medium"
 msgstr "střední"
 
-#: lib/mentat/const.py:115
+#: lib/mentat/const.py:121
 msgid "high"
 msgstr "vysoká"
 
-#: lib/mentat/const.py:116
+#: lib/mentat/const.py:122
 msgid "critical"
 msgstr "kritická"
 
-#: lib/mentat/const.py:120
+#: lib/mentat/const.py:126
 msgid "summary"
 msgstr "souhrn"
 
-#: lib/mentat/const.py:121
+#: lib/mentat/const.py:127
 msgid "extra"
 msgstr "extra"
 
-#: lib/mentat/const.py:122
+#: lib/mentat/const.py:128
 msgid "both"
 msgstr "oboje"
 
-#: lib/mentat/const.py:123 lib/mentat/const.py:130 lib/mentat/const.py:148
+#: lib/mentat/const.py:129 lib/mentat/const.py:136 lib/mentat/const.py:154
 msgid "none"
 msgstr "nic"
 
-#: lib/mentat/const.py:127
+#: lib/mentat/const.py:133
 msgid "json"
 msgstr "json"
 
-#: lib/mentat/const.py:128
+#: lib/mentat/const.py:134
 msgid "csv"
 msgstr "csv"
 
-#: lib/mentat/const.py:129
+#: lib/mentat/const.py:135
 msgid "all"
 msgstr "vše"
 
-#: lib/mentat/const.py:134
+#: lib/mentat/const.py:140
 msgid "default"
 msgstr "výchozí"
 
-#: lib/mentat/const.py:135
+#: lib/mentat/const.py:141
 msgid "custom"
 msgstr "vlastnĂ­"
 
-#: lib/mentat/const.py:137 lib/mentat/const.py:144
+#: lib/mentat/const.py:143 lib/mentat/const.py:150
 msgid "1day"
 msgstr "1den"
 
-#: lib/mentat/const.py:138 lib/mentat/const.py:141
+#: lib/mentat/const.py:144 lib/mentat/const.py:147
 msgid "6days"
 msgstr "6dnĂ­"
 
-#: lib/mentat/const.py:139 lib/mentat/const.py:142
+#: lib/mentat/const.py:145 lib/mentat/const.py:148
 msgid "2days"
 msgstr "2dny"
 
-#: lib/mentat/const.py:140 lib/mentat/const.py:147
+#: lib/mentat/const.py:146 lib/mentat/const.py:153
 msgid "2hrs"
 msgstr "2hod"
 
-#: lib/mentat/const.py:143 lib/mentat/const.py:146
+#: lib/mentat/const.py:149 lib/mentat/const.py:152
 msgid "10mins"
 msgstr "10min"
 
-#: lib/mentat/const.py:145
+#: lib/mentat/const.py:151
 msgid "12hrs"
 msgstr "12hod"
 
-#: lib/mentat/const.py:167
+#: lib/mentat/const.py:173
 msgid "basic"
 msgstr "základní"
 
-#: lib/mentat/const.py:168
+#: lib/mentat/const.py:174
 msgid "advanced"
 msgstr "pokročilé"
 
diff --git a/doc/sphinx/_doclib/development.rst b/doc/sphinx/_doclib/development.rst
index 658ba5f5d..b9e9aea1d 100644
--- a/doc/sphinx/_doclib/development.rst
+++ b/doc/sphinx/_doclib/development.rst
@@ -521,6 +521,13 @@ Important resources:
 * `Alembic <https://alembic.sqlalchemy.org/en/latest/index.html>`__
 * `Flask-Migrate <https://flask-migrate.readthedocs.io/en/latest/>`__
 
+Creating new database migration::
+
+1. Perform requested changes in ``lib/mentat/datatype/sqldb.py`` and ``lib/mentat/datatype/test_sqldb.py``
+2. Execute ``hawat-cli db migrate`` to autogenerate migration script
+3. Review and update autogenerated migration script in ``lib/hawat/migrations/versions`` directory
+4. Execute ``hawat-cli db upgrade`` aply locally your migration
+
 
 Versioning
 --------------------------------------------------------------------------------
diff --git a/lib/hawat/app.py b/lib/hawat/app.py
index d0b33e5f2..f9e8bc8a6 100644
--- a/lib/hawat/app.py
+++ b/lib/hawat/app.py
@@ -538,6 +538,16 @@ def _setup_app_core(app):
     jsglue = hawat.jsglue.JSGlue()
     jsglue.init_app(app)
 
+    @app.template_filter()
+    def pprint_item(item):  # pylint: disable=locally-disabled,unused-variable
+        """
+        Custom Jinja2 filter for full object attribute dump/pretty-print.
+        """
+        res = []
+        for key in dir(item):
+            res.append('%r: %r' % (key, getattr(item, key)))
+        return '\n'.join(res)
+
     return app
 
 
diff --git a/lib/hawat/blueprints/auth_dev/__init__.py b/lib/hawat/blueprints/auth_dev/__init__.py
index 0f4771dd0..bba25f90e 100644
--- a/lib/hawat/blueprints/auth_dev/__init__.py
+++ b/lib/hawat/blueprints/auth_dev/__init__.py
@@ -257,6 +257,92 @@ class RegisterView(HTMLMixin, SQLAlchemyMixin, RenderableView):
         self.dbsession.add(chlog)
         self.dbsession.commit()
 
+    @classmethod
+    def inform_admins(cls, account, form_data):
+        """
+        Send information about new account registration to system
+        admins. Use default locale for email content translations.
+        """
+        mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+        with force_locale(mail_locale):
+            msg = flask_mail.Message(
+                gettext(
+                    "[Mentat] Account registration - %(item_id)s",
+                    item_id = account.login
+                ),
+                recipients = flask.current_app.config['HAWAT_ADMINS']
+            )
+            msg.body = flask.render_template(
+                'auth_env/email_registration_admins.txt',
+                account = account,
+                justification = form_data['justification']
+            )
+            flask.current_app.mailer.send(msg)
+
+    @classmethod
+    def inform_managers(cls, account, form_data):
+        """
+        Send information about new account registration to the user.
+        Use manager`s locale for email content translations.
+        """
+        for group in account.memberships_wanted:
+            if not group.managed:
+                return
+
+            if not group.managers:
+                flask.current_app.logger.error(
+                    "Group '{}' is marked as self-managed, but there are no managers.".format(
+                        group.name
+                    )
+                )
+                return
+
+            for manager in group.managers:
+                mail_locale = manager.locale
+                if not mail_locale:
+                    mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+                with force_locale(mail_locale):
+                    msg = flask_mail.Message(
+                        gettext(
+                            "[Mentat] Account registration - %(item_id)s",
+                            item_id = account.login
+                        ),
+                        recipients = [manager.email],
+                        bcc = flask.current_app.config['HAWAT_ADMINS']
+                    )
+                    msg.body = flask.render_template(
+                        'auth_env/email_registration_managers.txt',
+                        account = account,
+                        group = group,
+                        justification = form_data['justification']
+                    )
+                    flask.current_app.mailer.send(msg)
+
+    @classmethod
+    def inform_user(cls, account, form_data):
+        """
+        Send information about new account registration to the user.
+        Use user`s locale for email content translations.
+        """
+        mail_locale = account.locale
+        if not mail_locale:
+            mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+        with force_locale(mail_locale):
+            msg = flask_mail.Message(
+                gettext(
+                    "[Mentat] Account registration - %(item_id)s",
+                    item_id = account.login
+                ),
+                recipients = [account.email],
+                bcc = flask.current_app.config['HAWAT_ADMINS']
+            )
+            msg.body = flask.render_template(
+                'auth_env/email_registration_user.txt',
+                account = account,
+                justification = form_data['justification']
+            )
+            flask.current_app.mailer.send(msg)
+
     def dispatch_request(self):
         """
         Mandatory interface required by the :py:func:`flask.views.View.dispatch_request`.
@@ -293,43 +379,9 @@ class RegisterView(HTMLMixin, SQLAlchemyMixin, RenderableView):
                     # Log the item creation into changelog.
                     self.changelog_log(item, '', item.to_json())
 
-                    # Send information about new account registration to system
-                    # admins. Use default locale for email content translations.
-                    mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
-                    with force_locale(mail_locale):
-                        msg = flask_mail.Message(
-                            gettext(
-                                "[Mentat] Account registration (dev) - %(item_id)s",
-                                item_id = item.login
-                            ),
-                            recipients = flask.current_app.config['HAWAT_ADMINS']
-                        )
-                        msg.body = flask.render_template(
-                            'auth_env/email_registration_admins.txt',
-                            account = item,
-                            justification = form_data['justification']
-                        )
-                        flask.current_app.mailer.send(msg)
-
-                    # Send information about new account registration to the user.
-                    # Use user`s locale for email content translations.
-                    mail_locale = item.locale
-                    if not mail_locale:
-                        mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
-                    with force_locale(mail_locale):
-                        msg = flask_mail.Message(
-                            gettext(
-                                "[Mentat] Account registration (dev) - %(item_id)s",
-                                item_id = item.login
-                            ),
-                            recipients = [item.email]
-                        )
-                        msg.body = flask.render_template(
-                            'auth_env/email_registration_user.txt',
-                            account = item,
-                            justification = form_data['justification']
-                        )
-                        flask.current_app.mailer.send(msg)
+                    self.inform_admins(item, form_data)
+                    self.inform_managers(item, form_data)
+                    self.inform_user(item, form_data)
 
                     self.flash(
                         flask.Markup(gettext(
@@ -339,7 +391,11 @@ class RegisterView(HTMLMixin, SQLAlchemyMixin, RenderableView):
                         )),
                         hawat.const.HAWAT_FLASH_SUCCESS
                     )
-                    return self.redirect(default_url = self.get_url_next())
+                    return self.redirect(
+                        default_url = flask.url_for(
+                            flask.current_app.config['HAWAT_ENDPOINT_HOME']
+                        )
+                    )
 
                 except Exception:  # pylint: disable=locally-disabled,broad-except
                     self.flash(
diff --git a/lib/hawat/blueprints/auth_env/__init__.py b/lib/hawat/blueprints/auth_env/__init__.py
index 4dbd8b9bc..6ba2a27db 100644
--- a/lib/hawat/blueprints/auth_env/__init__.py
+++ b/lib/hawat/blueprints/auth_env/__init__.py
@@ -351,6 +351,92 @@ class RegisterView(HTMLMixin, SQLAlchemyMixin, RenderableView):
         self.dbsession.add(chlog)
         self.dbsession.commit()
 
+    @classmethod
+    def inform_admins(cls, account, form_data):
+        """
+        Send information about new account registration to system
+        admins. Use default locale for email content translations.
+        """
+        mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+        with force_locale(mail_locale):
+            msg = flask_mail.Message(
+                gettext(
+                    "[Mentat] Account registration - %(item_id)s",
+                    item_id = account.login
+                ),
+                recipients = flask.current_app.config['HAWAT_ADMINS']
+            )
+            msg.body = flask.render_template(
+                'auth_env/email_registration_admins.txt',
+                account = account,
+                justification = form_data['justification']
+            )
+            flask.current_app.mailer.send(msg)
+
+    @classmethod
+    def inform_managers(cls, account, form_data):
+        """
+        Send information about new account registration to the user.
+        Use manager`s locale for email content translations.
+        """
+        for group in account.memberships_wanted:
+            if not group.managed:
+                return
+
+            if not group.managers:
+                flask.current_app.logger.error(
+                    "Group '{}' is marked as self-managed, but there are no managers.".format(
+                        group.name
+                    )
+                )
+                return
+
+            for manager in group.managers:
+                mail_locale = manager.locale
+                if not mail_locale:
+                    mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+                with force_locale(mail_locale):
+                    msg = flask_mail.Message(
+                        gettext(
+                            "[Mentat] Account registration - %(item_id)s",
+                            item_id = account.login
+                        ),
+                        recipients = [manager.email],
+                        bcc = flask.current_app.config['HAWAT_ADMINS']
+                    )
+                    msg.body = flask.render_template(
+                        'auth_env/email_registration_managers.txt',
+                        account = account,
+                        group = group,
+                        justification = form_data['justification']
+                    )
+                    flask.current_app.mailer.send(msg)
+
+    @classmethod
+    def inform_user(cls, account, form_data):
+        """
+        Send information about new account registration to the user.
+        Use user`s locale for email content translations.
+        """
+        mail_locale = account.locale
+        if not mail_locale:
+            mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
+        with force_locale(mail_locale):
+            msg = flask_mail.Message(
+                gettext(
+                    "[Mentat] Account registration - %(item_id)s",
+                    item_id = account.login
+                ),
+                recipients = [account.email],
+                bcc = flask.current_app.config['HAWAT_ADMINS']
+            )
+            msg.body = flask.render_template(
+                'auth_env/email_registration_user.txt',
+                account = account,
+                justification = form_data['justification']
+            )
+            flask.current_app.mailer.send(msg)
+
     def dispatch_request(self):
         """
         Mandatory interface required by the :py:func:`flask.views.View.dispatch_request`.
@@ -414,43 +500,9 @@ class RegisterView(HTMLMixin, SQLAlchemyMixin, RenderableView):
                     # Log the item creation into changelog.
                     self.changelog_log(item, '', item.to_json())
 
-                    # Send information about new account registration to system
-                    # admins. Use default locale for email content translations.
-                    mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
-                    with force_locale(mail_locale):
-                        msg = flask_mail.Message(
-                            gettext(
-                                "[Mentat] Account registration - %(item_id)s",
-                                item_id = item.login
-                            ),
-                            recipients = flask.current_app.config['HAWAT_ADMINS']
-                        )
-                        msg.body = flask.render_template(
-                            'auth_env/email_registration_admins.txt',
-                            account = item,
-                            justification = form_data['justification']
-                        )
-                        flask.current_app.mailer.send(msg)
-
-                    # Send information about new account registration to the user.
-                    # Use user`s locale for email content translations.
-                    mail_locale = item.locale
-                    if not mail_locale:
-                        mail_locale = flask.current_app.config['BABEL_DEFAULT_LOCALE']
-                    with force_locale(mail_locale):
-                        msg = flask_mail.Message(
-                            gettext(
-                                "[Mentat] Account registration - %(item_id)s",
-                                item_id = item.login
-                            ),
-                            recipients = [item.email]
-                        )
-                        msg.body = flask.render_template(
-                            'auth_env/email_registration_user.txt',
-                            account = item,
-                            justification = form_data['justification']
-                        )
-                        flask.current_app.mailer.send(msg)
+                    self.inform_admins(item, form_data)
+                    self.inform_managers(item, form_data)
+                    self.inform_user(item, form_data)
 
                     self.flash(
                         flask.Markup(gettext(
@@ -522,6 +574,10 @@ class EnvAuthBlueprint(HawatBlueprint):
             hidelegend = True
         )
 
+        app.set_infomailer('auth_env.register', RegisterView.inform_admins)
+        app.set_infomailer('auth_env.register', RegisterView.inform_managers)
+        app.set_infomailer('auth_env.register', RegisterView.inform_user)
+
 
 #-------------------------------------------------------------------------------
 
diff --git a/lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt b/lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt
new file mode 100644
index 000000000..bb277922c
--- /dev/null
+++ b/lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt
@@ -0,0 +1,20 @@
+{{ _('Dear group manager,') | wordwrap }}
+
+{{ _('a new account "%(item_id)s" was just registered to Mentat system and user requested membership in your group "%(group_id)s". Please review the following information and approve or reject the request:', item_id = account.login, group_id = group.name) | wordwrap }}
+
+    {{ '{:16s}'.format(_('Login:')) }} {{ account.login }}
+    {{ '{:16s}'.format(_('Full name:')) }} {{ account.fullname }}
+    {{ '{:16s}'.format(_('Email:')) }} {{ account.email }}
+    {{ '{:16s}'.format(_('Organization:')) }} {{ account.organization }}
+
+{{ _('User has provided following justification to be given access to the system:') | wordwrap }}
+
+{{ justification | wordwrap(width=75, break_long_words=False) | indent(width=4, indentfirst=True) }}
+
+{{ _('Management page for your group can be found here:') | wordwrap }}
+
+  {{ url_for('groups.show', _external = True, item_id = group.id ) }}
+
+{{ _('Have a nice day') | wordwrap }}
+
+{{ _('-- Mentat System') | wordwrap }}
diff --git a/lib/hawat/blueprints/design/templates/_macros_form.html b/lib/hawat/blueprints/design/templates/_macros_form.html
index c715aa8ea..6cb67be76 100644
--- a/lib/hawat/blueprints/design/templates/_macros_form.html
+++ b/lib/hawat/blueprints/design/templates/_macros_form.html
@@ -88,7 +88,7 @@
 {%- macro render_form_item_radiobutton(form_item, with_errors = True) %}
                                 <div class="form-group{% if form_item.errors %}{{ ' has-error' }}{% endif %}">
                                     <div>
-                                        {{ form_item.label }}
+                                        {{ render_form_label_help(form_item) }}
                                     </div>
                                     <div class="btn-group btn-group-justified" data-toggle="buttons">
     {%- for subfield in form_item %}
diff --git a/lib/hawat/blueprints/design/templates/_macros_site.html b/lib/hawat/blueprints/design/templates/_macros_site.html
index ff49e1505..be9d18510 100644
--- a/lib/hawat/blueprints/design/templates/_macros_site.html
+++ b/lib/hawat/blueprints/design/templates/_macros_site.html
@@ -326,6 +326,7 @@
                         <hr>
 <pre>
 {{ item | pprint }}
+{{ item | pprint_item }}
 </pre>
                     </div> <!-- /.well -->
 {%- endmacro %}
diff --git a/lib/hawat/blueprints/groups/__init__.py b/lib/hawat/blueprints/groups/__init__.py
index d8ea863aa..7e1fc0c2a 100644
--- a/lib/hawat/blueprints/groups/__init__.py
+++ b/lib/hawat/blueprints/groups/__init__.py
@@ -9,19 +9,19 @@
 
 
 """
-Description
------------
-
-This pluggable module provides access to group account management features. These
-features include:
-
-* general group account listing
-* detailed group account view
-* creating new group accounts
-* updating existing group accounts
-* deleting existing group accounts
-* enabling existing group accounts
-* disabling existing group accounts
+This file contains pluggable module for Hawat web interface containing features
+related to user group management. These features include:
+
+* general group listing
+* detailed group view
+* creating new groups
+* updating existing groups
+* deleting existing groups
+* enabling existing groups
+* disabling existing groups
+* adding group members
+* removing group members
+* rejecting group membership requests
 """
 
 
@@ -53,8 +53,8 @@ from hawat.base import HTMLMixin, SQLAlchemyMixin, ItemListView,\
     ItemDisableView, ItemObjectRelationView, ItemDeleteView, HawatBlueprint,\
     URLParamsBuilder
 
-from hawat.blueprints.groups.forms import CreateGroupForm, UpdateGroupForm,\
-    AdminUpdateGroupForm
+from hawat.blueprints.groups.forms import AdminCreateGroupForm, AdminUpdateGroupForm,\
+    UpdateGroupForm
 
 
 BLUEPRINT_NAME = 'groups'
@@ -406,7 +406,7 @@ class CreateView(HTMLMixin, SQLAlchemyMixin, ItemCreateView):  # pylint: disable
     @staticmethod
     def get_item_form():
         """*Implementation* of :py:func:`hawat.base.ItemCreateView.get_item_form`."""
-        return CreateGroupForm()
+        return AdminCreateGroupForm()
 
     def do_before_action(self, item):
         """
@@ -488,7 +488,7 @@ class UpdateView(HTMLMixin, SQLAlchemyMixin, ItemUpdateView):  # pylint: disable
 
 class AddMemberView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for enabling existing groups.
+    View for adding group members.
     """
     methods = ['GET','POST']
 
@@ -699,7 +699,7 @@ class RejectMemberView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # p
 
 class RemoveMemberView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for removing users from existing groups.
+    View for removing group members.
     """
     methods = ['GET','POST']
 
@@ -841,7 +841,7 @@ class EnableView(HTMLMixin, SQLAlchemyMixin, ItemEnableView):  # pylint: disable
 
 class DisableView(HTMLMixin, SQLAlchemyMixin, ItemDisableView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for deleting existing user accounts.
+    View for disabling groups.
     """
     methods = ['GET','POST']
 
diff --git a/lib/hawat/blueprints/groups/forms.py b/lib/hawat/blueprints/groups/forms.py
index e0829ea4d..65f1f75d6 100644
--- a/lib/hawat/blueprints/groups/forms.py
+++ b/lib/hawat/blueprints/groups/forms.py
@@ -99,14 +99,37 @@ class BaseGroupForm(hawat.forms.BaseItemForm):
         lazy_gettext('Description:'),
         validators = [
             wtforms.validators.DataRequired()
-        ]
+        ],
+        description = lazy_gettext('Additional and more extensive group description.')
     )
     source = wtforms.HiddenField(
         default = 'manual',
         validators = [
             wtforms.validators.DataRequired(),
             wtforms.validators.Length(min = 3, max = 50)
-        ]
+        ],
+        description = lazy_gettext('Origin of the group record, whether it was added manually, or via some automated mechanism from data from some third party system.')
+    )
+    managed = wtforms.RadioField(
+        lazy_gettext('Self management:'),
+        validators = [
+            wtforms.validators.InputRequired(),
+        ],
+        choices = [
+            (True,  lazy_gettext('Enabled')),
+            (False, lazy_gettext('Disabled'))
+        ],
+        filters = [hawat.forms.str_to_bool],
+        coerce = hawat.forms.str_to_bool,
+        description = lazy_gettext('Boolean flag whether the group is self managed by group managers. When enabled group managers are expected to take care of the group management tasks and they get notifications about important events like group membership requests, etc.')
+    )
+    members = QuerySelectMultipleField(
+        lazy_gettext('Members:'),
+        query_factory = get_available_users,
+        get_label = format_select_option_label_user,
+        allow_blank = True,
+        blank_text = lazy_gettext('<< no selection >>'),
+        description = lazy_gettext('List of group members.')
     )
     submit = wtforms.SubmitField(
         lazy_gettext('Submit')
@@ -116,18 +139,16 @@ class BaseGroupForm(hawat.forms.BaseItemForm):
     )
 
 
-class CreateGroupForm(BaseGroupForm):
+class UpdateGroupForm(BaseGroupForm):
+    """
+    Class representing group update form for regular users.
+    """
+
+
+class AdminBaseGroupForm(BaseGroupForm):
     """
     Class representing group create form.
     """
-    name = wtforms.StringField(
-        lazy_gettext('Name:'),
-        validators = [
-            wtforms.validators.DataRequired(),
-            wtforms.validators.Length(min = 3, max = 100),
-            check_name_existence
-        ]
-    )
     enabled = wtforms.RadioField(
         lazy_gettext('State:'),
         validators = [
@@ -138,21 +159,16 @@ class CreateGroupForm(BaseGroupForm):
             (False, lazy_gettext('Disabled'))
         ],
         filters = [hawat.forms.str_to_bool],
-        coerce = hawat.forms.str_to_bool
-    )
-    members = QuerySelectMultipleField(
-        lazy_gettext('Members:'),
-        query_factory = get_available_users,
-        get_label = format_select_option_label_user,
-        allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
+        coerce = hawat.forms.str_to_bool,
+        description = lazy_gettext('Boolean flag whether the group is enabled or disabled. Disabled groups are hidden to the most of the system features.')
     )
     managers = QuerySelectMultipleField(
         lazy_gettext('Managers:'),
         query_factory = get_available_users,
         get_label = format_select_option_label_user,
         allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
+        blank_text = lazy_gettext('<< no selection >>'),
+        description = lazy_gettext('List of users acting as group managers. These users may change various group settings.')
     )
     parent = QuerySelectField(
         lazy_gettext('Parent group:'),
@@ -162,26 +178,32 @@ class CreateGroupForm(BaseGroupForm):
         ],
         query_factory = get_available_groups,
         allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
+        blank_text = lazy_gettext('<< no selection >>'),
+        description = lazy_gettext('Parent group for this group. This feature enables the posibility to create structured group hierarchy.')
+    )
+
+
+class AdminCreateGroupForm(AdminBaseGroupForm):
+    """
+    Class representing group create form for administrators.
+    """
+    name = wtforms.StringField(
+        lazy_gettext('Name:'),
+        validators = [
+            wtforms.validators.DataRequired(),
+            wtforms.validators.Length(min = 3, max = 100),
+            check_name_existence
+        ],
+        description = lazy_gettext('System-wide unique name for the group.')
     )
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-        #
-        # Handle additional custom keywords.
-        #
-
         self.db_item_id = None
 
 
-class UpdateGroupForm(BaseGroupForm):
-    """
-    Class representing group update form for regular users.
-    """
-
-
-class AdminUpdateGroupForm(BaseGroupForm):
+class AdminUpdateGroupForm(AdminBaseGroupForm):
     """
     Class representing group update form for administrators.
     """
@@ -191,52 +213,13 @@ class AdminUpdateGroupForm(BaseGroupForm):
             wtforms.validators.DataRequired(),
             wtforms.validators.Length(min = 3, max = 100),
             check_name_uniqueness
-        ]
-    )
-    enabled = wtforms.RadioField(
-        lazy_gettext('State:'),
-        validators = [
-            wtforms.validators.InputRequired(),
         ],
-        choices = [
-            (True,  lazy_gettext('Enabled')),
-            (False, lazy_gettext('Disabled'))
-        ],
-        filters = [hawat.forms.str_to_bool],
-        coerce = hawat.forms.str_to_bool
-    )
-    members = QuerySelectMultipleField(
-        lazy_gettext('Members:'),
-        query_factory = get_available_users,
-        get_label = format_select_option_label_user,
-        allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
-    )
-    managers = QuerySelectMultipleField(
-        lazy_gettext('Managers:'),
-        query_factory = get_available_users,
-        get_label = format_select_option_label_user,
-        allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
-    )
-    parent = QuerySelectField(
-        lazy_gettext('Parent group:'),
-        validators = [
-            wtforms.validators.Optional(),
-            check_parent_not_self
-        ],
-        query_factory = get_available_groups,
-        allow_blank = True,
-        blank_text = lazy_gettext('<< no selection >>')
+        description = lazy_gettext('System-wide unique name for the group.')
     )
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-        #
-        # Handle additional custom keywords.
-        #
-
         # Store the ID of original item in database to enable the ID uniqueness
         # check with check_name_uniqueness() validator.
         self.db_item_id = kwargs['db_item_id']
diff --git a/lib/hawat/blueprints/groups/templates/groups/creatupdate.html b/lib/hawat/blueprints/groups/templates/groups/creatupdate.html
index cfb546353..505f0f405 100644
--- a/lib/hawat/blueprints/groups/templates/groups/creatupdate.html
+++ b/lib/hawat/blueprints/groups/templates/groups/creatupdate.html
@@ -31,18 +31,23 @@
 
                                 {{ macros_form.render_form_item_default(form.description) }}
 
-    {%- if item_action == 'create' or current_user.has_role('admin') %}
-
                                 <hr>
 
+        {%- if form | attr('enabled') %}
                                 {{ macros_form.render_form_item_radiobutton(form.enabled) }}
-
+        {%- endif %}
+        {%- if form | attr('managed') %}
+                                {{ macros_form.render_form_item_radiobutton(form.managed) }}
+        {%- endif %}
+        {%- if form | attr('members') %}
                                 {{ macros_form.render_form_item_select(form.members) }}
-
+        {%- endif %}
+        {%- if form | attr('managers') %}
                                 {{ macros_form.render_form_item_select(form.managers) }}
-
+        {%- endif %}
+        {%- if form | attr('parent') %}
                                 {{ macros_form.render_form_item_select(form.parent) }}
-    {%- endif %}
+        {%- endif %}
 
                                 <hr>
 
diff --git a/lib/hawat/blueprints/groups/templates/groups/show.html b/lib/hawat/blueprints/groups/templates/groups/show.html
index be5319f8c..7439892f6 100644
--- a/lib/hawat/blueprints/groups/templates/groups/show.html
+++ b/lib/hawat/blueprints/groups/templates/groups/show.html
@@ -86,6 +86,14 @@
                                                     {{ macros_site.render_label_item_state(item.enabled, True) }}
                                                 </td>
                                             </tr>
+                                            <tr>
+                                                <th>
+                                                    {{ _('Self management') }}:
+                                                </th>
+                                                <td>
+                                                    {{ macros_site.render_label_item_state(item.managed, True) }}
+                                                </td>
+                                            </tr>
                                             <tr>
                                                 <th>
                                                     {{ _('Reporting settings') }}:
diff --git a/lib/hawat/blueprints/users/__init__.py b/lib/hawat/blueprints/users/__init__.py
index d43ecf73c..616015b79 100644
--- a/lib/hawat/blueprints/users/__init__.py
+++ b/lib/hawat/blueprints/users/__init__.py
@@ -9,11 +9,8 @@
 
 
 """
-Description
------------
-
-This pluggable module provides access to user account management features. These
-features include:
+This file contains pluggable module for Hawat web interface containing features
+related to user account management. These features include:
 
 * general user account listing
 * detailed user account view
@@ -22,6 +19,9 @@ features include:
 * deleting existing user accounts
 * enabling existing user accounts
 * disabling existing user accounts
+* adding group memberships
+* removing group memberships
+* rejecting group membership requests
 """
 
 
@@ -277,7 +277,7 @@ class ShowView(HTMLMixin, SQLAlchemyMixin, ItemShowView):
 
 class MeView(ShowView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    Detailed user account view for currently logged-in user.
+    Detailed user account view for currently logged-in user (profile page).
     """
     methods = ['GET']
 
@@ -514,7 +514,7 @@ class UpdateView(HTMLMixin, SQLAlchemyMixin, ItemUpdateView):  # pylint: disable
 
 class AddMembershipView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for enabling existing groups.
+    View for adding group memberships.
     """
     methods = ['GET','POST']
 
@@ -623,7 +623,7 @@ class AddMembershipView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  #
 
 class RejectMembershipView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for enabling existing groups.
+    View for rejecting group membership requests.
     """
     methods = ['GET','POST']
 
@@ -725,7 +725,7 @@ class RejectMembershipView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):
 
 class RemoveMembershipView(HTMLMixin, SQLAlchemyMixin, ItemObjectRelationView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for removing users from existing groups.
+    View for removing group memberships.
     """
     methods = ['GET','POST']
 
@@ -875,7 +875,7 @@ class EnableView(HTMLMixin, SQLAlchemyMixin, ItemEnableView):  # pylint: disable
     #---------------------------------------------------------------------------
 
     @classmethod
-    def send_infomail(cls, account):
+    def inform_user(cls, account):
         """Send infomail about user account activation."""
         mail_locale = account.locale
         if not mail_locale:
@@ -903,7 +903,7 @@ class EnableView(HTMLMixin, SQLAlchemyMixin, ItemEnableView):  # pylint: disable
 
 class DisableView(HTMLMixin, SQLAlchemyMixin, ItemDisableView):  # pylint: disable=locally-disabled,too-many-ancestors
     """
-    View for deleting existing user accounts.
+    View for disabling user accounts.
     """
     methods = ['GET','POST']
 
@@ -996,13 +996,13 @@ class DeleteView(HTMLMixin, SQLAlchemyMixin, ItemDeleteView):  # pylint: disable
 
 class UsersBlueprint(HawatBlueprint):
     """
-    Hawat pluggable module - users.
+    Hawat pluggable module - user accounts.
     """
 
     @classmethod
     def get_module_title(cls):
         """*Implementation* of :py:func:`hawat.base.HawatBlueprint.get_module_title`."""
-        return lazy_gettext('User account management pluggable module')
+        return lazy_gettext('User account management')
 
     def register_app(self, app):
         """
@@ -1029,7 +1029,7 @@ class UsersBlueprint(HawatBlueprint):
             params = lambda: {'item': flask_login.current_user}
         )
 
-        app.set_infomailer('users.enable', EnableView.send_infomail)
+        app.set_infomailer('users.enable', EnableView.inform_user)
 
 
 #-------------------------------------------------------------------------------
diff --git a/lib/hawat/migrations/versions/d0f8c8c546dd_added_groups_managed.py b/lib/hawat/migrations/versions/d0f8c8c546dd_added_groups_managed.py
new file mode 100644
index 000000000..62c7a1e43
--- /dev/null
+++ b/lib/hawat/migrations/versions/d0f8c8c546dd_added_groups_managed.py
@@ -0,0 +1,24 @@
+"""Added managed column to GroupModel
+
+Revision ID: d0f8c8c546dd
+Revises: 4046ff1bdace
+Create Date: 2019-09-03 13:24:55.299237
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision      = 'd0f8c8c546dd'  # pylint: disable=locally-disabled,invalid-name
+down_revision = '4046ff1bdace'  # pylint: disable=locally-disabled,invalid-name
+branch_labels = None            # pylint: disable=locally-disabled,invalid-name
+depends_on    = None            # pylint: disable=locally-disabled,invalid-name
+
+
+def upgrade():  # pylint: disable=locally-disabled,missing-docstring
+    op.add_column('groups', sa.Column('managed', sa.Boolean(), nullable=False, default=False, server_default='f'))
+
+
+def downgrade():  # pylint: disable=locally-disabled,missing-docstring
+    op.drop_column('groups', 'managed')  # pylint: disable=locally-disabled,no-member
diff --git a/lib/hawat/translations/cs/LC_MESSAGES/messages.po b/lib/hawat/translations/cs/LC_MESSAGES/messages.po
index 8bacf04d9..ecfebe8a7 100644
--- a/lib/hawat/translations/cs/LC_MESSAGES/messages.po
+++ b/lib/hawat/translations/cs/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2019-09-03 11:34+0200\n"
+"POT-Creation-Date: 2019-09-09 18:11+0200\n"
 "PO-Revision-Date: 2017-09-22 15:33+0200\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language: cs\n"
@@ -18,15 +18,15 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 2.7.0\n"
 
-#: lib/hawat/app.py:606
+#: lib/hawat/app.py:616
 msgid "Please log in to access this page."
 msgstr "Pro přístup k této stránce se prosím přihlaste."
 
-#: lib/hawat/app.py:631
+#: lib/hawat/app.py:641
 msgid "You have been successfully logged out."
 msgstr "Odhlášení proběhlo úspěšně."
 
-#: lib/hawat/app.py:791
+#: lib/hawat/app.py:801
 #, python-format
 msgid "Locale was succesfully changed to <strong>%(lcln)s (%(lclc)s)</strong>."
 msgstr "Lokalizace byla úspěšně změněna na <strong>%(lcln)s (%(lclc)s)</strong>."
@@ -122,7 +122,7 @@ msgid "Create"
 msgstr "Vytvořit"
 
 #: lib/hawat/base.py:2197 lib/hawat/base.py:2202 lib/hawat/base.py:2278
-#: lib/hawat/blueprints/groups/__init__.py:428
+#: lib/hawat/blueprints/groups/__init__.py:432
 msgid "Update"
 msgstr "Upravit"
 
@@ -227,7 +227,7 @@ msgstr "Potvrdit"
 #: lib/hawat/blueprints/auth_dev/forms.py:60
 #: lib/hawat/blueprints/auth_pwd/forms.py:55
 #: lib/hawat/blueprints/filters/forms.py:171
-#: lib/hawat/blueprints/groups/forms.py:115
+#: lib/hawat/blueprints/groups/forms.py:138
 #: lib/hawat/blueprints/networks/forms.py:76
 #: lib/hawat/blueprints/settings_reporting/forms.py:337
 #: lib/hawat/blueprints/users/forms.py:119 lib/hawat/forms.py:535
@@ -359,19 +359,23 @@ msgstr "Registrace (dev)"
 msgid "User account registration (dev)"
 msgstr "Registrace uživatelského účtu (dev)"
 
-#: lib/hawat/blueprints/auth_dev/__init__.py:272
-#: lib/hawat/blueprints/auth_env/__init__.py:394
+#: lib/hawat/blueprints/auth_dev/__init__.py:269
+#: lib/hawat/blueprints/auth_dev/__init__.py:306
+#: lib/hawat/blueprints/auth_dev/__init__.py:332
+#: lib/hawat/blueprints/auth_env/__init__.py:363
+#: lib/hawat/blueprints/auth_env/__init__.py:400
+#: lib/hawat/blueprints/auth_env/__init__.py:426
+#, python-format
+msgid "[Mentat] Account registration - %(item_id)s"
+msgstr "[Mentat] Registrace uĹľivatele - %(item_id)s"
+
+#: lib/hawat/blueprints/auth_dev/__init__.py:358
+#: lib/hawat/blueprints/auth_env/__init__.py:480
 msgid "Account registration canceled."
 msgstr "Registrace uživatelského účtu byla zrušena"
 
-#: lib/hawat/blueprints/auth_dev/__init__.py:301
-#: lib/hawat/blueprints/auth_dev/__init__.py:321
-#, python-format
-msgid "[Mentat] Account registration (dev) - %(item_id)s"
-msgstr "[Mentat] Registrace účtu (dev) - %(item_id)s"
-
-#: lib/hawat/blueprints/auth_dev/__init__.py:335
-#: lib/hawat/blueprints/auth_env/__init__.py:456
+#: lib/hawat/blueprints/auth_dev/__init__.py:387
+#: lib/hawat/blueprints/auth_env/__init__.py:508
 #, python-format
 msgid ""
 "User account <strong>%(login)s (%(name)s)</strong> was successfully "
@@ -380,12 +384,12 @@ msgstr ""
 "Uživatelský účet <strong>%(login)s (%(name)s)</strong> byl úspěšně "
 "zaregistrován."
 
-#: lib/hawat/blueprints/auth_dev/__init__.py:346
-#: lib/hawat/blueprints/auth_env/__init__.py:469
+#: lib/hawat/blueprints/auth_dev/__init__.py:402
+#: lib/hawat/blueprints/auth_env/__init__.py:521
 msgid "Unable to register new user account."
 msgstr "Nelze zaregistrovat nový uživatelský účet."
 
-#: lib/hawat/blueprints/auth_dev/__init__.py:375
+#: lib/hawat/blueprints/auth_dev/__init__.py:431
 msgid "Developer authentication service"
 msgstr "Autentizační služba pro vývojáře"
 
@@ -403,6 +407,7 @@ msgstr "Přihlášení"
 
 #: lib/hawat/blueprints/auth_dev/forms.py:88
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:5
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:5
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:7
 #: lib/hawat/blueprints/auth_env/templates/auth_env/registration.html:18
 #: lib/hawat/blueprints/auth_env/templates/auth_env/registration_show.html:14
@@ -488,18 +493,12 @@ msgstr "Registrace uživatelského účtu."
 msgid "Unable to retrieve account login from your authentication provider."
 msgstr "Nelze získat uživatelské jméno od Vašeho poskytovatele identity."
 
-#: lib/hawat/blueprints/auth_env/__init__.py:378
+#: lib/hawat/blueprints/auth_env/__init__.py:464
 #, python-format
 msgid "User account <strong>%(item_id)s</strong> already exists."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> již existuje."
 
-#: lib/hawat/blueprints/auth_env/__init__.py:422
-#: lib/hawat/blueprints/auth_env/__init__.py:442
-#, python-format
-msgid "[Mentat] Account registration - %(item_id)s"
-msgstr "[Mentat] Registrace uĹľivatele - %(item_id)s"
-
-#: lib/hawat/blueprints/auth_env/__init__.py:498
+#: lib/hawat/blueprints/auth_env/__init__.py:550
 msgid "Environment authentication service"
 msgstr "Autentizační služba prostředí"
 
@@ -519,6 +518,7 @@ msgstr ""
 "aktivujte, nebo smaĹľte."
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:6
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:6
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:8
 #: lib/hawat/blueprints/auth_env/templates/auth_env/registration_show.html:18
 #: lib/hawat/blueprints/reports/templates/reports/email_report_feedback.txt:6
@@ -527,6 +527,7 @@ msgid "Full name:"
 msgstr "Celé jméno:"
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:7
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:7
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:9
 #: lib/hawat/blueprints/auth_env/templates/auth_env/registration_show.html:22
 #: lib/hawat/blueprints/reports/templates/reports/email_report_feedback.txt:7
@@ -535,6 +536,7 @@ msgid "Email:"
 msgstr "Email:"
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:8
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:8
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:10
 #: lib/hawat/blueprints/auth_env/templates/auth_env/registration_show.html:26
 #: lib/hawat/blueprints/reports/templates/reports/email_report_feedback.txt:8
@@ -546,6 +548,7 @@ msgid "User has requested membership in following groups:"
 msgstr "Uživatel požádal o členství v následujících skupinách:"
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:17
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:10
 msgid ""
 "User has provided following justification to be given access to the "
 "system:"
@@ -556,6 +559,7 @@ msgid "Account details can be found here:"
 msgstr "Detaily uživatelského účtu lze nalézt zde:"
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:25
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:18
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:29
 #: lib/hawat/blueprints/reports/templates/reports/email_report_feedback.txt:18
 #: lib/hawat/blueprints/users/templates/users/email_activation.txt:7
@@ -563,12 +567,29 @@ msgid "Have a nice day"
 msgstr "Hezký den přeje"
 
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_admins.txt:27
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:20
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:31
 #: lib/hawat/blueprints/reports/templates/reports/email_report_feedback.txt:20
 #: lib/hawat/blueprints/users/templates/users/email_activation.txt:9
 msgid "-- Mentat System"
 msgstr "-- Systém Mentat"
 
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:1
+msgid "Dear group manager,"
+msgstr "Vážený správče skupiny,"
+
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:3
+#, python-format
+msgid ""
+"a new account \"%(item_id)s\" was just registered to Mentat system and "
+"user requested membership in your group \"%(group_id)s\". Please review "
+"the following information and approve or reject the request:"
+msgstr "nový účet \"%(item_id)s\" byl právě registrován do systému Mentat a uživatel zažádal o členství ve vaší skupině \"%(group_id)s\". Prosím zkontrolujte následující informace a žádost schvalte, nebo zamítněte:"
+
+#: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_managers.txt:14
+msgid "Management page for your group can be found here:"
+msgstr "Stránka pro správu Vaší skupiny se nacházi zde:"
+
 #: lib/hawat/blueprints/auth_env/templates/auth_env/email_registration_user.txt:1
 #: lib/hawat/blueprints/users/templates/users/email_activation.txt:1
 msgid "Dear user,"
@@ -635,7 +656,7 @@ msgstr "Registrován v:"
 #: lib/hawat/blueprints/dbstatus/templates/dbstatus/view.html:154
 #: lib/hawat/blueprints/dbstatus/templates/dbstatus/view.html:166
 #: lib/hawat/blueprints/design/templates/_macros_page.html:154
-#: lib/hawat/blueprints/design/templates/_macros_site.html:432
+#: lib/hawat/blueprints/design/templates/_macros_site.html:433
 #: lib/hawat/blueprints/filters/templates/filters/show.html:18
 #: lib/hawat/blueprints/groups/templates/groups/show.html:18
 #: lib/hawat/blueprints/networks/templates/networks/show.html:18
@@ -721,8 +742,8 @@ msgstr "Prohledat záznamy změn položek"
 #: lib/hawat/blueprints/dbstatus/__init__.py:262
 #: lib/hawat/blueprints/dbstatus/__init__.py:304
 #: lib/hawat/blueprints/dbstatus/__init__.py:343
-#: lib/hawat/blueprints/groups/__init__.py:217
-#: lib/hawat/blueprints/groups/__init__.py:244
+#: lib/hawat/blueprints/groups/__init__.py:216
+#: lib/hawat/blueprints/groups/__init__.py:243
 #: lib/hawat/blueprints/reports/__init__.py:265
 #: lib/hawat/blueprints/users/__init__.py:221
 msgid "More actions"
@@ -854,7 +875,7 @@ msgid "Database status"
 msgstr "Stav databáze"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:153
-#: lib/hawat/blueprints/users/__init__.py:914
+#: lib/hawat/blueprints/users/__init__.py:1021
 msgid "Object management"
 msgstr "Správa objektů"
 
@@ -863,25 +884,25 @@ msgid "Object management dashboards"
 msgstr "Dasboard správy objektů"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:268
-#: lib/hawat/blueprints/users/__init__.py:445
+#: lib/hawat/blueprints/users/__init__.py:450
 #, python-format
 msgid "Update details of user account &quot;%(item)s&quot;"
 msgstr "Aktualizovat detaily uživatelského účtu &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:275
-#: lib/hawat/blueprints/users/__init__.py:815
+#: lib/hawat/blueprints/users/__init__.py:922
 #, python-format
 msgid "Disable user account &quot;%(item)s&quot;"
 msgstr "Deaktivovat uživatelský účet &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:282
-#: lib/hawat/blueprints/users/__init__.py:742
+#: lib/hawat/blueprints/users/__init__.py:849
 #, python-format
 msgid "Enable user account &quot;%(item)s&quot;"
 msgstr "Aktivovat uživatelský účet &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:289
-#: lib/hawat/blueprints/users/__init__.py:860
+#: lib/hawat/blueprints/users/__init__.py:967
 #, python-format
 msgid "Delete user account &quot;%(item)s&quot;"
 msgstr "Smazat uživatelský účet &quot;%(item)s&quot;"
@@ -893,8 +914,8 @@ msgstr "Smazat uživatelský účet &quot;%(item)s&quot;"
 #: lib/hawat/blueprints/dbstatus/templates/dbstatus/dashboard.html:521
 #: lib/hawat/blueprints/filters/templates/filters/list.html:35
 #: lib/hawat/blueprints/filters/templates/filters/show.html:58
+#: lib/hawat/blueprints/groups/__init__.py:149
 #: lib/hawat/blueprints/groups/__init__.py:150
-#: lib/hawat/blueprints/groups/__init__.py:151
 #: lib/hawat/blueprints/groups/templates/groups/show.html:65
 #: lib/hawat/blueprints/networks/templates/networks/list.html:32
 #: lib/hawat/blueprints/networks/templates/networks/show.html:51
@@ -905,25 +926,25 @@ msgid "View details of group &quot;%(item)s&quot;"
 msgstr "Zobrazit detaily skupiny &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:310
-#: lib/hawat/blueprints/groups/__init__.py:433
+#: lib/hawat/blueprints/groups/__init__.py:437
 #, python-format
 msgid "Update details of group &quot;%(item)s&quot;"
 msgstr "Aktualizovat detaily skupiny &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:316
-#: lib/hawat/blueprints/groups/__init__.py:749
+#: lib/hawat/blueprints/groups/__init__.py:855
 #, python-format
 msgid "Disable group &quot;%(item)s&quot;"
 msgstr "Deaktivovat skupinu &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:322
-#: lib/hawat/blueprints/groups/__init__.py:709
+#: lib/hawat/blueprints/groups/__init__.py:815
 #, python-format
 msgid "Enable group &quot;%(item)s&quot;"
 msgstr "Aktivovat group &quot;%(item)s&quot;"
 
 #: lib/hawat/blueprints/dbstatus/__init__.py:328
-#: lib/hawat/blueprints/groups/__init__.py:792
+#: lib/hawat/blueprints/groups/__init__.py:898
 #, python-format
 msgid "Delete group &quot;%(item)s&quot;"
 msgstr "Smazat skupinu &quot;%(item)s&quot;"
@@ -977,7 +998,7 @@ msgid "Filters"
 msgstr "Filtry"
 
 #: lib/hawat/blueprints/dbstatus/templates/dbstatus/dashboard.html:26
-#: lib/hawat/blueprints/groups/templates/groups/show.html:91
+#: lib/hawat/blueprints/groups/templates/groups/show.html:99
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:11
 msgid "Reporting settings"
 msgstr "Nastavení reportování"
@@ -1545,7 +1566,7 @@ msgstr "CESNET, z.s.p.o."
 #: lib/hawat/blueprints/events/templates/events/dashboard.html:24
 #: lib/hawat/blueprints/filters/templates/filters/creatupdate.html:74
 #: lib/hawat/blueprints/filters/templates/filters/playground.html:21
-#: lib/hawat/blueprints/groups/templates/groups/creatupdate.html:56
+#: lib/hawat/blueprints/groups/templates/groups/creatupdate.html:61
 #: lib/hawat/blueprints/hosts/templates/hosts/search.html:29
 #: lib/hawat/blueprints/networks/templates/networks/creatupdate.html:51
 #: lib/hawat/blueprints/reports/templates/reports/dashboard.html:29
@@ -2022,51 +2043,51 @@ msgstr "Přejít na následující"
 msgid "Raw item"
 msgstr "Surová položka"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:335
+#: lib/hawat/blueprints/design/templates/_macros_site.html:336
 msgid "Variable dump:"
 msgstr "Dump proměnné:"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:342
-#: lib/hawat/blueprints/design/templates/_macros_site.html:356
-#: lib/hawat/blueprints/design/templates/_macros_site.html:370
+#: lib/hawat/blueprints/design/templates/_macros_site.html:343
+#: lib/hawat/blueprints/design/templates/_macros_site.html:357
+#: lib/hawat/blueprints/design/templates/_macros_site.html:371
 msgid "Expand/Collapse"
 msgstr "Rozbalit/Sbalit"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:342
+#: lib/hawat/blueprints/design/templates/_macros_site.html:343
 msgid "PPRINT"
 msgstr "PPRINT"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:356
+#: lib/hawat/blueprints/design/templates/_macros_site.html:357
 msgid "REPR"
 msgstr "REPR"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:370
+#: lib/hawat/blueprints/design/templates/_macros_site.html:371
 msgid "STR"
 msgstr "STR"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:394
+#: lib/hawat/blueprints/design/templates/_macros_site.html:395
 msgid "Summary report"
 msgstr "SouhrnnĂ˝ report"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:394
+#: lib/hawat/blueprints/design/templates/_macros_site.html:395
 #: lib/hawat/blueprints/settings_reporting/forms.py:99 lib/mentat/const.py:126
 msgid "summary"
 msgstr "souhrn"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:396
+#: lib/hawat/blueprints/design/templates/_macros_site.html:397
 msgid "Extra report"
 msgstr "Extra report"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:396
+#: lib/hawat/blueprints/design/templates/_macros_site.html:397
 #: lib/hawat/blueprints/settings_reporting/forms.py:100 lib/mentat/const.py:127
 msgid "extra"
 msgstr "jednotlivÄ›"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:402
+#: lib/hawat/blueprints/design/templates/_macros_site.html:403
 msgid "Low severity"
 msgstr "Nízká závažnost"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:402
+#: lib/hawat/blueprints/design/templates/_macros_site.html:403
 #: lib/hawat/blueprints/events/templates/events/search.html:321
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:64
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/show.html:246
@@ -2074,11 +2095,11 @@ msgstr "Nízká závažnost"
 msgid "low"
 msgstr "nízká"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:404
+#: lib/hawat/blueprints/design/templates/_macros_site.html:405
 msgid "Medium severity"
 msgstr "Střední závažnost"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:404
+#: lib/hawat/blueprints/design/templates/_macros_site.html:405
 #: lib/hawat/blueprints/events/templates/events/search.html:323
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:76
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/show.html:252
@@ -2086,11 +2107,11 @@ msgstr "Střední závažnost"
 msgid "medium"
 msgstr "střední"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:406
+#: lib/hawat/blueprints/design/templates/_macros_site.html:407
 msgid "High severity"
 msgstr "Vysoká závažnost"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:406
+#: lib/hawat/blueprints/design/templates/_macros_site.html:407
 #: lib/hawat/blueprints/events/templates/events/search.html:325
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:88
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/show.html:258
@@ -2098,11 +2119,11 @@ msgstr "Vysoká závažnost"
 msgid "high"
 msgstr "vysoká"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:408
+#: lib/hawat/blueprints/design/templates/_macros_site.html:409
 msgid "Critical severity"
 msgstr "Kritická závažnost"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:408
+#: lib/hawat/blueprints/design/templates/_macros_site.html:409
 #: lib/hawat/blueprints/events/templates/events/search.html:327
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:100
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/show.html:264
@@ -2110,83 +2131,83 @@ msgstr "Kritická závažnost"
 msgid "critical"
 msgstr "kritická"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:414
+#: lib/hawat/blueprints/design/templates/_macros_site.html:415
 msgid "Low event count"
 msgstr "Nízký počet událostí"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:416
+#: lib/hawat/blueprints/design/templates/_macros_site.html:417
 msgid "Medium event count"
 msgstr "Střední počet událostí"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:418
+#: lib/hawat/blueprints/design/templates/_macros_site.html:419
 msgid "High event count"
 msgstr "Vysoký počet událostí"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:420
+#: lib/hawat/blueprints/design/templates/_macros_site.html:421
 msgid "Very high event count"
 msgstr "Velmi vysoký počet událostí"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:434
+#: lib/hawat/blueprints/design/templates/_macros_site.html:435
 #, python-format
 msgid "%(delta)s in future"
 msgstr "%(delta)s v budoucnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:441
+#: lib/hawat/blueprints/design/templates/_macros_site.html:442
 msgid "Unknown event severity"
 msgstr "Událost neznámé závažnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:443
+#: lib/hawat/blueprints/design/templates/_macros_site.html:444
 msgid "Low event severity"
 msgstr "Událost nízké závažnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:445
+#: lib/hawat/blueprints/design/templates/_macros_site.html:446
 msgid "Medium event severity"
 msgstr "Událost střední závažnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:447
+#: lib/hawat/blueprints/design/templates/_macros_site.html:448
 msgid "High event severity"
 msgstr "Událost vysoké závažnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:449
+#: lib/hawat/blueprints/design/templates/_macros_site.html:450
 msgid "Critical event severity"
 msgstr "Událost kritické závažnosti"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:478
-#: lib/hawat/blueprints/design/templates/_macros_site.html:713
+#: lib/hawat/blueprints/design/templates/_macros_site.html:479
+#: lib/hawat/blueprints/design/templates/_macros_site.html:714
 #: lib/hawat/blueprints/events/templates/events/search.html:533
 #: lib/hawat/blueprints/events/templates/events/search.html:560
 #: lib/hawat/blueprints/events/templates/events/show.html:199
 msgid "-- unassigned --"
 msgstr "-- nepřiřazeno --"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:485
+#: lib/hawat/blueprints/design/templates/_macros_site.html:486
 #: lib/hawat/blueprints/events/templates/events/show.html:284
 #: lib/hawat/blueprints/events/templates/events/show.html:316
 msgid "Please download raw message to view full list."
 msgstr "Prosím stáhněte si celou zprávu pro zobrazení úplných dat"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:485
+#: lib/hawat/blueprints/design/templates/_macros_site.html:486
 #: lib/hawat/blueprints/events/templates/events/show.html:285
 #: lib/hawat/blueprints/events/templates/events/show.html:317
 #, python-format
 msgid "%(count)s more"
 msgstr "%(count)s další(ch)"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:503
-#: lib/hawat/blueprints/design/templates/_macros_site.html:698
+#: lib/hawat/blueprints/design/templates/_macros_site.html:504
+#: lib/hawat/blueprints/design/templates/_macros_site.html:699
 msgid "Context search actions:"
 msgstr "Kontextové vyhledávací akce:"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:557
-#: lib/hawat/blueprints/design/templates/_macros_site.html:640
-#: lib/hawat/blueprints/design/templates/_macros_site.html:657
+#: lib/hawat/blueprints/design/templates/_macros_site.html:558
+#: lib/hawat/blueprints/design/templates/_macros_site.html:641
+#: lib/hawat/blueprints/design/templates/_macros_site.html:658
 msgid "-- undisclosed --"
 msgstr "-- nezveřejněno --"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:720
+#: lib/hawat/blueprints/design/templates/_macros_site.html:721
 #: lib/hawat/blueprints/filters/forms.py:158
-#: lib/hawat/blueprints/groups/forms.py:137
-#: lib/hawat/blueprints/groups/forms.py:202
+#: lib/hawat/blueprints/groups/forms.py:119
+#: lib/hawat/blueprints/groups/forms.py:158
 #: lib/hawat/blueprints/settings_reporting/forms.py:134
 #: lib/hawat/blueprints/settings_reporting/forms.py:147
 #: lib/hawat/blueprints/settings_reporting/forms.py:160
@@ -2194,10 +2215,10 @@ msgstr "-- nezveřejněno --"
 msgid "Enabled"
 msgstr "AktivnĂ­"
 
-#: lib/hawat/blueprints/design/templates/_macros_site.html:722
+#: lib/hawat/blueprints/design/templates/_macros_site.html:723
 #: lib/hawat/blueprints/filters/forms.py:159
-#: lib/hawat/blueprints/groups/forms.py:138
-#: lib/hawat/blueprints/groups/forms.py:203
+#: lib/hawat/blueprints/groups/forms.py:120
+#: lib/hawat/blueprints/groups/forms.py:159
 #: lib/hawat/blueprints/settings_reporting/forms.py:135
 #: lib/hawat/blueprints/settings_reporting/forms.py:148
 #: lib/hawat/blueprints/settings_reporting/forms.py:161
@@ -3590,8 +3611,8 @@ msgid "Event JSON parse error: \"%(error)s\"."
 msgstr "Chyba parsování JSONu: \"%(error)s\"."
 
 #: lib/hawat/blueprints/filters/forms.py:87
-#: lib/hawat/blueprints/groups/forms.py:124
-#: lib/hawat/blueprints/groups/forms.py:189
+#: lib/hawat/blueprints/groups/forms.py:191
+#: lib/hawat/blueprints/groups/forms.py:211
 #: lib/hawat/blueprints/groups/templates/groups/creatupdate.html:28
 msgid "Name:"
 msgstr "Název:"
@@ -3632,14 +3653,13 @@ msgid "Valid to:"
 msgstr "Platné do:"
 
 #: lib/hawat/blueprints/filters/forms.py:153
-#: lib/hawat/blueprints/groups/forms.py:132
-#: lib/hawat/blueprints/groups/forms.py:197
+#: lib/hawat/blueprints/groups/forms.py:153
 #: lib/hawat/blueprints/users/forms.py:144
 msgid "State:"
 msgstr "Stav:"
 
 #: lib/hawat/blueprints/filters/forms.py:165
-#: lib/hawat/blueprints/groups/forms.py:112
+#: lib/hawat/blueprints/groups/forms.py:135
 #: lib/hawat/blueprints/networks/forms.py:73
 #: lib/hawat/blueprints/settings_reporting/forms.py:334
 #: lib/hawat/blueprints/users/forms.py:116
@@ -3721,8 +3741,8 @@ msgstr "Akce"
 #: lib/hawat/blueprints/groups/templates/groups/list.html:32
 #: lib/hawat/blueprints/groups/templates/groups/list.html:35
 #: lib/hawat/blueprints/groups/templates/groups/show.html:78
-#: lib/hawat/blueprints/groups/templates/groups/show.html:193
-#: lib/hawat/blueprints/groups/templates/groups/show.html:220
+#: lib/hawat/blueprints/groups/templates/groups/show.html:201
+#: lib/hawat/blueprints/groups/templates/groups/show.html:228
 #: lib/hawat/blueprints/networks/templates/networks/list.html:37
 #: lib/hawat/blueprints/networks/templates/networks/list.html:40
 #: lib/hawat/blueprints/networks/templates/networks/list.html:43
@@ -3794,7 +3814,7 @@ msgid "Filter"
 msgstr "Filtr"
 
 #: lib/hawat/blueprints/filters/templates/filters/show.html:136
-#: lib/hawat/blueprints/groups/templates/groups/show.html:252
+#: lib/hawat/blueprints/groups/templates/groups/show.html:260
 #: lib/hawat/blueprints/networks/templates/networks/show.html:99
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/show.html:284
 #: lib/hawat/blueprints/users/templates/users/show.html:265
@@ -3963,70 +3983,70 @@ msgstr "Hledání v databázi ASN"
 msgid "City resolving"
 msgstr "Hledání v databázi měst"
 
-#: lib/hawat/blueprints/groups/__init__.py:79
+#: lib/hawat/blueprints/groups/__init__.py:78
 #: lib/hawat/blueprints/groups/templates/groups/creatupdate.html:10
 #: lib/hawat/blueprints/settings_reporting/templates/settings_reporting/creatupdate.html:9
 msgid "Group management"
 msgstr "Správa skupin"
 
-#: lib/hawat/blueprints/groups/__init__.py:156
+#: lib/hawat/blueprints/groups/__init__.py:155
 msgid "Show group details"
 msgstr "Zobrazit detaily skupiny"
 
-#: lib/hawat/blueprints/groups/__init__.py:371
+#: lib/hawat/blueprints/groups/__init__.py:375
 msgid "Create group"
 msgstr "Vytvořit skupinu"
 
-#: lib/hawat/blueprints/groups/__init__.py:376
+#: lib/hawat/blueprints/groups/__init__.py:380
 msgid "Create new group"
 msgstr "Vytvořit novou skupinu"
 
-#: lib/hawat/blueprints/groups/__init__.py:390
+#: lib/hawat/blueprints/groups/__init__.py:394
 #, python-format
 msgid "Group <strong>%(item_id)s</strong> was successfully created."
 msgstr "Skupina <strong>%(item_id)s</strong> byla úspěšně vytvořena."
 
-#: lib/hawat/blueprints/groups/__init__.py:395
+#: lib/hawat/blueprints/groups/__init__.py:399
 msgid "Unable to create new group."
 msgstr "Nelze vytvořit skupinu."
 
-#: lib/hawat/blueprints/groups/__init__.py:400
+#: lib/hawat/blueprints/groups/__init__.py:404
 msgid "Canceled creating new group."
 msgstr "Vytvoření nové skupiny bylo zrušeno."
 
-#: lib/hawat/blueprints/groups/__init__.py:438
+#: lib/hawat/blueprints/groups/__init__.py:442
 msgid "Update group details"
 msgstr "Aktualizovat detaily skupiny"
 
-#: lib/hawat/blueprints/groups/__init__.py:462
+#: lib/hawat/blueprints/groups/__init__.py:466
 #, python-format
 msgid "Group <strong>%(item_id)s</strong> was successfully updated."
 msgstr "Skupina <strong>%(item_id)s</strong> byla úspěšně aktualizována."
 
-#: lib/hawat/blueprints/groups/__init__.py:467
+#: lib/hawat/blueprints/groups/__init__.py:471
 #, python-format
 msgid "Unable to update group <strong>%(item_id)s</strong>."
 msgstr "Nelze aktualizovat skupinu <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:472
+#: lib/hawat/blueprints/groups/__init__.py:476
 #, python-format
 msgid "Canceled updating group <strong>%(item_id)s</strong>."
 msgstr "Aktualizace skupiny <strong>%(item_id)s</strong> byla zrušena."
 
-#: lib/hawat/blueprints/groups/__init__.py:500
+#: lib/hawat/blueprints/groups/__init__.py:504
 msgid "Add group member"
 msgstr "Přidat člena skupiny"
 
-#: lib/hawat/blueprints/groups/__init__.py:513
-#: lib/hawat/blueprints/users/__init__.py:538
+#: lib/hawat/blueprints/groups/__init__.py:517
+#: lib/hawat/blueprints/users/__init__.py:543
 #, python-format
 msgid "Add user &quot;%(user_id)s&quot; to group &quot;%(group_id)s&quot;"
 msgstr ""
 "Přidat uživatele &quot;%(user_id)s&quot; do skupiny "
 "&quot;%(group_id)s&quot;"
 
-#: lib/hawat/blueprints/groups/__init__.py:572
-#: lib/hawat/blueprints/users/__init__.py:597
+#: lib/hawat/blueprints/groups/__init__.py:576
+#: lib/hawat/blueprints/users/__init__.py:602
 #, python-format
 msgid ""
 "User <strong>%(user_id)s</strong> was successfully added as a member to "
@@ -4035,8 +4055,8 @@ msgstr ""
 "Uživatel <strong>%(user_id)s</strong> byl úspěšně přidán jako člen do "
 "skupiny <strong>%(group_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:581
-#: lib/hawat/blueprints/users/__init__.py:606
+#: lib/hawat/blueprints/groups/__init__.py:585
+#: lib/hawat/blueprints/users/__init__.py:611
 #, python-format
 msgid ""
 "Unable to add user <strong>%(user_id)s</strong> as a member to group "
@@ -4045,8 +4065,8 @@ msgstr ""
 "Nelze přidat uživatele <strong>%(user_id)s</strong> jako člena do skupiny"
 " <strong>%(group_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:590
-#: lib/hawat/blueprints/users/__init__.py:615
+#: lib/hawat/blueprints/groups/__init__.py:594
+#: lib/hawat/blueprints/users/__init__.py:620
 #, python-format
 msgid ""
 "Canceled adding user <strong>%(user_id)s</strong> as a member to group "
@@ -4055,20 +4075,56 @@ msgstr ""
 "Přidání uživatele <strong>%(user_id)s</strong> jako člena do skupiny "
 "<strong>%(group_id)s</strong> bylo zrušeno."
 
-#: lib/hawat/blueprints/groups/__init__.py:609
+#: lib/hawat/blueprints/groups/__init__.py:613
+msgid "Reject group member"
+msgstr "OdmĂ­tnout ÄŤlena skupiny"
+
+#: lib/hawat/blueprints/groups/__init__.py:626
+#: lib/hawat/blueprints/users/__init__.py:652
+#, python-format
+msgid ""
+"Reject user`s &quot;%(user_id)s&quot; membership request for group "
+"&quot;%(group_id)s&quot;"
+msgstr "Odmítnout žádost uživatele &quot;%(user_id)s&quot; o členství ve skupině &quot;%(group_id)s&quot;"
+
+#: lib/hawat/blueprints/groups/__init__.py:678
+#: lib/hawat/blueprints/users/__init__.py:704
+#, python-format
+msgid ""
+"User`s <strong>%(user_id)s</strong> membership request for group "
+"<strong>%(group_id)s</strong> was successfully rejected."
+msgstr "Žádost uživatele <strong>%(user_id)s</strong> o členství ve skupině <strong>%(group_id)s</strong> byla úspěšně zamítnuta."
+
+#: lib/hawat/blueprints/groups/__init__.py:687
+#: lib/hawat/blueprints/users/__init__.py:713
+#, python-format
+msgid ""
+"Unable to reject user`s <strong>%(user_id)s</strong> membership request "
+"for group <strong>%(group_id)s</strong>."
+msgstr "Nelze odmítnout žádost uživatele <strong>%(user_id)s</strong> o členství ve skupině <strong>%(group_id)s</strong>."
+
+#: lib/hawat/blueprints/groups/__init__.py:696
+#: lib/hawat/blueprints/users/__init__.py:722
+#, python-format
+msgid ""
+"Canceled rejecting user`s <strong>%(user_id)s</strong> membership request"
+" for group <strong>%(group_id)s</strong>."
+msgstr "Odmítnutí žádosti uživatele <strong>%(user_id)s</strong> o členství ve skupině <strong>%(group_id)s</strong> bylo zrušeno."
+
+#: lib/hawat/blueprints/groups/__init__.py:715
 msgid "Remove group member"
 msgstr "Odebrat ÄŤlena skupiny"
 
-#: lib/hawat/blueprints/groups/__init__.py:622
-#: lib/hawat/blueprints/users/__init__.py:647
+#: lib/hawat/blueprints/groups/__init__.py:728
+#: lib/hawat/blueprints/users/__init__.py:754
 #, python-format
 msgid "Remove user &quot;%(user_id)s&quot; from group &quot;%(group_id)s&quot;"
 msgstr ""
 "Odebrat uĹľivatele &quot;%(user_id)s&quot; ze skupiny group "
 "&quot;%(group_id)s&quot;"
 
-#: lib/hawat/blueprints/groups/__init__.py:674
-#: lib/hawat/blueprints/users/__init__.py:702
+#: lib/hawat/blueprints/groups/__init__.py:780
+#: lib/hawat/blueprints/users/__init__.py:809
 #, python-format
 msgid ""
 "User <strong>%(user_id)s</strong> was successfully removed as a member "
@@ -4077,8 +4133,8 @@ msgstr ""
 "Uživatel <strong>%(user_id)s</strong> byl úspěšně odebrán jako člen ze "
 "skupiny <strong>%(group_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:683
-#: lib/hawat/blueprints/users/__init__.py:711
+#: lib/hawat/blueprints/groups/__init__.py:789
+#: lib/hawat/blueprints/users/__init__.py:818
 #, python-format
 msgid ""
 "Unable to remove user <strong>%(user_id)s</strong> as a member from group"
@@ -4087,8 +4143,8 @@ msgstr ""
 "Nelze odebrat uĹľivatele <strong>%(user_id)s</strong> jako ÄŤlena ze "
 "skupiny <strong>%(group_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:692
-#: lib/hawat/blueprints/users/__init__.py:720
+#: lib/hawat/blueprints/groups/__init__.py:798
+#: lib/hawat/blueprints/users/__init__.py:827
 #, python-format
 msgid ""
 "Canceled removing user <strong>%(user_id)s</strong> as a member from "
@@ -4097,62 +4153,62 @@ msgstr ""
 "Odebrání uživatele <strong>%(user_id)s</strong> jako člena ze skupiny "
 "<strong>%(group_id)s</strong> bylo zrušeno."
 
-#: lib/hawat/blueprints/groups/__init__.py:723
+#: lib/hawat/blueprints/groups/__init__.py:829
 #, python-format
 msgid "Group <strong>%(item_id)s</strong> was successfully enabled."
 msgstr "Skupina <strong>%(item_id)s</strong> byla úspěšně aktivována."
 
-#: lib/hawat/blueprints/groups/__init__.py:728
+#: lib/hawat/blueprints/groups/__init__.py:834
 #, python-format
 msgid "Unable to enable group <strong>%(item_id)s</strong>."
 msgstr "Nelze aktivovat skupinu <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:733
+#: lib/hawat/blueprints/groups/__init__.py:839
 #, python-format
 msgid "Canceled enabling group <strong>%(item_id)s</strong>."
 msgstr "Aktivace skupiny <strong>%(item_id)s</strong> byla zrušena."
 
-#: lib/hawat/blueprints/groups/__init__.py:763
+#: lib/hawat/blueprints/groups/__init__.py:869
 #, python-format
 msgid "Group <strong>%(item_id)s</strong> was successfully disabled."
 msgstr "Skupina <strong>%(item_id)s</strong> byla úspěšně deaktivována."
 
-#: lib/hawat/blueprints/groups/__init__.py:768
+#: lib/hawat/blueprints/groups/__init__.py:874
 #, python-format
 msgid "Unable to disable group <strong>%(item_id)s</strong>."
 msgstr "Nelze deaktivovat skupinu <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:773
+#: lib/hawat/blueprints/groups/__init__.py:879
 #, python-format
 msgid "Canceled disabling group <strong>%(item_id)s</strong>."
 msgstr "Deaktivace skupiny <strong>%(item_id)s</strong> byla zrušena."
 
-#: lib/hawat/blueprints/groups/__init__.py:806
+#: lib/hawat/blueprints/groups/__init__.py:912
 #, python-format
 msgid ""
 "Group <strong>%(item_id)s</strong> was successfully and permanently "
 "deleted."
 msgstr "Skupina <strong>%(item_id)s</strong> byla úspěšně a trvale smazána."
 
-#: lib/hawat/blueprints/groups/__init__.py:811
+#: lib/hawat/blueprints/groups/__init__.py:917
 #, python-format
 msgid "Unable to delete group <strong>%(item_id)s</strong>."
 msgstr "Nelze smazat skupinu <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/groups/__init__.py:816
+#: lib/hawat/blueprints/groups/__init__.py:922
 #, python-format
 msgid "Canceled deleting group <strong>%(item_id)s</strong>."
 msgstr "Mazání skupiny <strong>%(item_id)s</strong> bylo zrušeno."
 
-#: lib/hawat/blueprints/groups/__init__.py:830
+#: lib/hawat/blueprints/groups/__init__.py:936
 msgid "Group management pluggable module"
 msgstr "Správa skupin (zásuvný modul)"
 
-#: lib/hawat/blueprints/groups/__init__.py:859
+#: lib/hawat/blueprints/groups/__init__.py:965
 msgid "My groups"
 msgstr "Moje skupiny"
 
-#: lib/hawat/blueprints/groups/__init__.py:870
+#: lib/hawat/blueprints/groups/__init__.py:976
 #, python-format
 msgid "View details of abuse group <strong>%(name)s</strong>"
 msgstr "Zobrazit detaily abuse skupiny <strong>%(name)s</strong>"
@@ -4166,30 +4222,73 @@ msgstr "Skupina s tímto jménem již existuje."
 msgid "You must not select a group as its own parent! Naughty, naughty you!"
 msgstr "Nelze zvolit stejnou skupinu jako rodiče sama sebe! Zvrhlé, velmi zvrhlé!"
 
-#: lib/hawat/blueprints/groups/forms.py:144
-#: lib/hawat/blueprints/groups/forms.py:209
+#: lib/hawat/blueprints/groups/forms.py:103
+msgid "Additional and more extensive group description."
+msgstr "Další a více obsáhlý popis skupiny."
+
+#: lib/hawat/blueprints/groups/forms.py:111
+msgid ""
+"Origin of the group record, whether it was added manually, or via some "
+"automated mechanism from data from some third party system."
+msgstr "Původ záznamu o skupině, zda byl vytvořen manuálně, nebo pomocí nějakého automatizovaného nástroje z dat služby třetí strany."
+
+#: lib/hawat/blueprints/groups/forms.py:114
+msgid "Self management:"
+msgstr "Samospráva:"
+
+#: lib/hawat/blueprints/groups/forms.py:124
+msgid ""
+"Boolean flag whether the group is self managed by group managers. When "
+"enabled group managers are expected to take care of the group management "
+"tasks and they get notifications about important events like group "
+"membership requests, etc."
+msgstr "Příznak, zda skupina je spravována samostatně označenými správci skupiny. Pokud je aktivován očekává se od správců skupiny, že se budou o správu skupiny starat sami a k tomuto účelu budou od systému dostávat hlášení o důležitých událostech jako žádosti o členství atd."
+
+#: lib/hawat/blueprints/groups/forms.py:127
 msgid "Members:"
 msgstr "Členové:"
 
-#: lib/hawat/blueprints/groups/forms.py:148
-#: lib/hawat/blueprints/groups/forms.py:155
-#: lib/hawat/blueprints/groups/forms.py:165
-#: lib/hawat/blueprints/groups/forms.py:213
-#: lib/hawat/blueprints/groups/forms.py:220
-#: lib/hawat/blueprints/groups/forms.py:230
+#: lib/hawat/blueprints/groups/forms.py:131
+#: lib/hawat/blueprints/groups/forms.py:170
+#: lib/hawat/blueprints/groups/forms.py:181
 msgid "<< no selection >>"
 msgstr "<< bez volby >>"
 
-#: lib/hawat/blueprints/groups/forms.py:151
-#: lib/hawat/blueprints/groups/forms.py:216
+#: lib/hawat/blueprints/groups/forms.py:132
+msgid "List of group members."
+msgstr ""
+
+#: lib/hawat/blueprints/groups/forms.py:163
+msgid ""
+"Boolean flag whether the group is enabled or disabled. Disabled groups "
+"are hidden to the most of the system features."
+msgstr "Příznak, zda skupina je aktivní, nebo neaktivní. Neaktivní skupiny jsou skryty pro velkou část funkcí systému."
+
+#: lib/hawat/blueprints/groups/forms.py:166
 msgid "Managers:"
 msgstr "Správci:"
 
-#: lib/hawat/blueprints/groups/forms.py:158
-#: lib/hawat/blueprints/groups/forms.py:223
+#: lib/hawat/blueprints/groups/forms.py:171
+msgid ""
+"List of users acting as group managers. These users may change various "
+"group settings."
+msgstr "Seznam uživatelů kteří jsou správci skupiny. Tito uživatelé mohou měnit četná nastavení skupiny."
+
+#: lib/hawat/blueprints/groups/forms.py:174
 msgid "Parent group:"
 msgstr "Nadřazená skupina:"
 
+#: lib/hawat/blueprints/groups/forms.py:182
+msgid ""
+"Parent group for this group. This feature enables the posibility to "
+"create structured group hierarchy."
+msgstr "Nadřazená skupina pro tuto skupinu. Tato vlastnost umožňuje vytvářet hierarchickou strukturu skupin."
+
+#: lib/hawat/blueprints/groups/forms.py:197
+#: lib/hawat/blueprints/groups/forms.py:217
+msgid "System-wide unique name for the group."
+msgstr "Jméno skupiny unikátní v rámci celého systému."
+
 #: lib/hawat/blueprints/groups/templates/groups/addmember.html:5
 #: lib/hawat/blueprints/users/templates/users/addmembership.html:5
 msgid "Are you really sure you want to add user"
@@ -4238,44 +4337,48 @@ msgstr "Nadřazená skupina"
 msgid "<< none >>"
 msgstr "<< nic >>"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:94
+#: lib/hawat/blueprints/groups/templates/groups/show.html:91
+msgid "Self management"
+msgstr "Samospráva"
+
+#: lib/hawat/blueprints/groups/templates/groups/show.html:102
 #, python-format
 msgid "View details of reporting settings for group &quot;%(item)s&quot;"
 msgstr "Zobrazit detaily nastavení reportování pro skupinu &quot;%(item)s&quot;"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:95
+#: lib/hawat/blueprints/groups/templates/groups/show.html:103
 msgid "View reporting settings"
 msgstr "Zobrazit nastavení reportování"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:106
+#: lib/hawat/blueprints/groups/templates/groups/show.html:114
 msgid "Membership requests"
 msgstr "Žádosti o členství"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:127
+#: lib/hawat/blueprints/groups/templates/groups/show.html:135
 msgid "Members"
 msgstr "Členové"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:149
+#: lib/hawat/blueprints/groups/templates/groups/show.html:157
 msgid "This group does not have any members defined at the moment."
 msgstr "Tato skupina nemá v tuto chvíli definovány žádné členy."
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:155
+#: lib/hawat/blueprints/groups/templates/groups/show.html:163
 msgid "Managers"
 msgstr "Správci"
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:176
+#: lib/hawat/blueprints/groups/templates/groups/show.html:184
 msgid "This group does not have any managers defined at the moment."
 msgstr "Tato skupina nemá v tuto chvíli definovány žádné správce."
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:207
+#: lib/hawat/blueprints/groups/templates/groups/show.html:215
 msgid "This group does not have any network records defined at the moment."
 msgstr "Tato skupina nemá v tuto chvíli definovány žádné síťové záznamy."
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:240
+#: lib/hawat/blueprints/groups/templates/groups/show.html:248
 msgid "This group does not have any reporting filters defined at the moment."
 msgstr "Tato skupina nemá v tuto chvíli definovány žádné reportovací filtry."
 
-#: lib/hawat/blueprints/groups/templates/groups/show.html:257
+#: lib/hawat/blueprints/groups/templates/groups/show.html:265
 msgid "This group does not have any changelog records at the moment."
 msgstr "Tato skupina nemá v tuto chvíli žádné záznamy změn."
 
@@ -5890,113 +5993,117 @@ msgstr "Zobrazit detaily uživatelského účtu &quot;%(item)s&quot;"
 msgid "Show user account details"
 msgstr "Zobrazit detaily uživatelského účtu"
 
-#: lib/hawat/blueprints/users/__init__.py:294
+#: lib/hawat/blueprints/users/__init__.py:299
 msgid "My account"
 msgstr "Můj účet"
 
-#: lib/hawat/blueprints/users/__init__.py:304
+#: lib/hawat/blueprints/users/__init__.py:309
 msgid "My user account"
 msgstr "Můj uživatelský účet"
 
-#: lib/hawat/blueprints/users/__init__.py:381
+#: lib/hawat/blueprints/users/__init__.py:386
 msgid "Create new user account"
 msgstr "Vytvořit nový uživatelský účet"
 
-#: lib/hawat/blueprints/users/__init__.py:395
+#: lib/hawat/blueprints/users/__init__.py:400
 #, python-format
 msgid "User account <strong>%(item_id)s</strong> was successfully created."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> byl úspěšně vytvořen."
 
-#: lib/hawat/blueprints/users/__init__.py:400
+#: lib/hawat/blueprints/users/__init__.py:405
 msgid "Unable to create new user account."
 msgstr "Nelze vytvořit nový uživatelský účet."
 
-#: lib/hawat/blueprints/users/__init__.py:405
+#: lib/hawat/blueprints/users/__init__.py:410
 msgid "Canceled creating new user account."
 msgstr "Vytváření nového uživatelského účtu bylo zrušeno."
 
-#: lib/hawat/blueprints/users/__init__.py:440
+#: lib/hawat/blueprints/users/__init__.py:445
 msgid "Update user account details"
 msgstr "Aktualizovat detaily uživatelského účtu"
 
-#: lib/hawat/blueprints/users/__init__.py:469
+#: lib/hawat/blueprints/users/__init__.py:474
 #, python-format
 msgid "User account <strong>%(item_id)s</strong> was successfully updated."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> byl úspěšně aktualizován."
 
-#: lib/hawat/blueprints/users/__init__.py:474
+#: lib/hawat/blueprints/users/__init__.py:479
 #, python-format
 msgid "Unable to update user account <strong>%(item_id)s</strong>."
 msgstr "Nelze aktualizovat uživatelský účet <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/users/__init__.py:479
+#: lib/hawat/blueprints/users/__init__.py:484
 #, python-format
 msgid "Canceled updating user account <strong>%(item_id)s</strong>."
 msgstr "Aktualizace uživatelského účtu <strong>%(item_id)s</strong> byla zrušena."
 
-#: lib/hawat/blueprints/users/__init__.py:525
+#: lib/hawat/blueprints/users/__init__.py:530
 msgid "Add group membership"
 msgstr "Přidat členství"
 
-#: lib/hawat/blueprints/users/__init__.py:634
+#: lib/hawat/blueprints/users/__init__.py:639
+msgid "Reject group membership"
+msgstr "OdmĂ­tnout ÄŤlenstvĂ­"
+
+#: lib/hawat/blueprints/users/__init__.py:741
 msgid "Remove group membership"
 msgstr "Odebrat ÄŤlenstvĂ­"
 
-#: lib/hawat/blueprints/users/__init__.py:756
+#: lib/hawat/blueprints/users/__init__.py:863
 #, python-format
 msgid "User account <strong>%(item_id)s</strong> was successfully enabled."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> byl úspěšně aktivován."
 
-#: lib/hawat/blueprints/users/__init__.py:761
+#: lib/hawat/blueprints/users/__init__.py:868
 #, python-format
 msgid "Unable to enable user account <strong>%(item_id)s</strong>."
 msgstr "Nelze aktivovat uživatelský účet <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/users/__init__.py:766
+#: lib/hawat/blueprints/users/__init__.py:873
 #, python-format
 msgid "Canceled enabling user account <strong>%(item_id)s</strong>."
 msgstr "Aktivace uživatelského účtu <strong>%(item_id)s</strong> byla přerušena."
 
-#: lib/hawat/blueprints/users/__init__.py:779
+#: lib/hawat/blueprints/users/__init__.py:886
 #, python-format
 msgid "[Mentat] Account activation - %(item_id)s"
 msgstr "[Mentat] Aktivace účtu - %(item_id)s"
 
-#: lib/hawat/blueprints/users/__init__.py:829
+#: lib/hawat/blueprints/users/__init__.py:936
 #, python-format
 msgid "User account <strong>%(item_id)s</strong> was successfully disabled."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> byl úspěšně deaktivován."
 
-#: lib/hawat/blueprints/users/__init__.py:834
+#: lib/hawat/blueprints/users/__init__.py:941
 #, python-format
 msgid "Unable to disable user account <strong>%(item_id)s</strong>."
 msgstr "Nelze deaktivovat uživatelský účet <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/users/__init__.py:839
+#: lib/hawat/blueprints/users/__init__.py:946
 #, python-format
 msgid "Canceled disabling user account <strong>%(item_id)s</strong>."
 msgstr "Deaktivace uživatelského účtu <strong>%(item_id)s</strong> byla přerušena."
 
-#: lib/hawat/blueprints/users/__init__.py:874
+#: lib/hawat/blueprints/users/__init__.py:981
 #, python-format
 msgid ""
 "User account <strong>%(item_id)s</strong> was successfully and "
 "permanently deleted."
 msgstr "Uživatelský účet <strong>%(item_id)s</strong> byl úspěšně a trvale smazán."
 
-#: lib/hawat/blueprints/users/__init__.py:879
+#: lib/hawat/blueprints/users/__init__.py:986
 #, python-format
 msgid "Unable to delete user account <strong>%(item_id)s</strong>."
 msgstr "Nelze smazat uživatelský účet <strong>%(item_id)s</strong>."
 
-#: lib/hawat/blueprints/users/__init__.py:884
+#: lib/hawat/blueprints/users/__init__.py:991
 #, python-format
 msgid "Canceled deleting user account <strong>%(item_id)s</strong>."
 msgstr "Mazání uživatelského účtu <strong>%(item_id)s</strong> bylo zrušeno."
 
-#: lib/hawat/blueprints/users/__init__.py:898
-msgid "User account management pluggable module"
-msgstr "Správa uživatelských účtů (zásuvný modul)"
+#: lib/hawat/blueprints/users/__init__.py:1005
+msgid "User account management"
+msgstr "Správa uživatelských účtů"
 
 #: lib/hawat/blueprints/users/forms.py:50
 #: lib/hawat/blueprints/users/forms.py:63
@@ -6244,4 +6351,3 @@ msgstr "__neznámo__"
 #: lib/mentat/reports/test_base.py:174 lib/mentat/reports/test_base.py:176
 msgid "Counter:"
 msgstr "ÄŚĂ­taÄŤ:"
-
diff --git a/lib/mentat/__init__.py b/lib/mentat/__init__.py
index 4f9d13da7..5c57a6553 100644
--- a/lib/mentat/__init__.py
+++ b/lib/mentat/__init__.py
@@ -20,4 +20,4 @@ open-source project.
 
 __author__  = "Jan Mach <jan.mach@cesnet.cz>"
 __credits__ = "Pavel Kácha <pavel.kacha@cesnet.cz>, Andrea Kropáčová <andrea.kropacova@cesnet.cz>"
-__version__ = "2.5.1"
+__version__ = "2.5.2"
diff --git a/lib/mentat/datatype/sqldb.py b/lib/mentat/datatype/sqldb.py
index 234f21041..25d3f975a 100644
--- a/lib/mentat/datatype/sqldb.py
+++ b/lib/mentat/datatype/sqldb.py
@@ -324,6 +324,7 @@ class GroupModel(MODEL):
     source      = sqlalchemy.Column(sqlalchemy.String(50), nullable = False)
     description = sqlalchemy.Column(sqlalchemy.String, nullable = False)
     enabled     = sqlalchemy.Column(sqlalchemy.Boolean, nullable = False, default = True)
+    managed     = sqlalchemy.Column(sqlalchemy.Boolean, nullable = False, default = False)
 
     members = sqlalchemy.orm.relationship('UserModel', secondary = _asoc_group_members, back_populates = 'memberships', order_by = 'UserModel.fullname')
     members_wanted = sqlalchemy.orm.relationship('UserModel', secondary = _asoc_group_members_wanted, back_populates = 'memberships_wanted', order_by = 'UserModel.fullname')
@@ -379,6 +380,7 @@ class GroupModel(MODEL):
             'source':         str(self.source),
             'description':    str(self.description),
             'enabled':        bool(self.enabled),
+            'managed':        bool(self.managed),
             'members':        [(x.id, x.login) for x in self.members],
             'members_wanted': [(x.id, x.login) for x in self.members_wanted],
             'managers':       [(x.id, x.login) for x in self.managers],
-- 
GitLab