diff --git a/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po b/conf/templates/reporter/translations/cs/LC_MESSAGES/messages.po index dfb488b4a463fbd2b1c647852536b38c820348df..0c25fd38c6210bd30773047641d18435dfb4070e 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 658ba5f5dfd30f13ff7a301d010808823867f92a..b9e9aea1d26e3410d4602479f36ec1d7c06d87f7 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 d0b33e5f20f3db7a0e96aba1e61a61da5561092e..f9e8bc8a69a970d7fe29e88ad49b965eb9d171c9 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 0f4771dd0ec29489ef4ea9c57b852b383abd30d5..bba25f90e3bb007b8b50bdc3b79c5e2e0c63e2a1 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 4dbd8b9bc179edd20175d9821004759f33d14121..6ba2a27db39dccad38af65202434db6336f97498 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 0000000000000000000000000000000000000000..bb277922cfdd1d043542d1c57a899d78f73d0327 --- /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 c715aa8ea6e96fe2df4db5cc6113fd3cd4c38649..6cb67be767452aff4f00fb465c5a309fe0f0c1ff 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 ff49e150556528ad96a679f651f5f728c1d1afa1..be9d1851050d5d2e0bddbd7e68fed9214c20250f 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 d8ea863aaa18207b94534e97c2d7c2343e67697b..7e1fc0c2ad9f029b5c2c3089cbe7ffa1388999ee 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 e0829ea4d444d1f860fbee5178302f3d902098b2..65f1f75d687208aabf1dfb94e3e2e4118d259ff3 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 cfb5463539832cd38fd18d58ce6b9ae57d7cf285..505f0f4054d9c1de47982bf9f27d93a32d1f4988 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 be5319f8c69e4740b0be0806c746f27eb580de34..7439892f64e48b0e1a0a0f8920b6b4f777272a06 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 d43ecf73c1899965ceab1cde67a516106bc77d97..616015b790f723bec7b36123190ca32425bcc1e2 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 0000000000000000000000000000000000000000..62c7a1e4368e4c8174f0e33a1a30f24f31585ae7 --- /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 8bacf04d984d9c4fa6781e9945c06e80958f9ad7..ecfebe8a7651017f16f6e7c09444f14b7256b442 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 "%(item)s"" msgstr "Aktualizovat detaily uĹľivatelskĂ©ho účtu "%(item)s"" #: 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 "%(item)s"" msgstr "Deaktivovat uĹľivatelskĂ˝ účet "%(item)s"" #: 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 "%(item)s"" msgstr "Aktivovat uĹľivatelskĂ˝ účet "%(item)s"" #: 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 "%(item)s"" msgstr "Smazat uĹľivatelskĂ˝ účet "%(item)s"" @@ -893,8 +914,8 @@ msgstr "Smazat uĹľivatelskĂ˝ účet "%(item)s"" #: 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 "%(item)s"" msgstr "Zobrazit detaily skupiny "%(item)s"" #: 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 "%(item)s"" msgstr "Aktualizovat detaily skupiny "%(item)s"" #: 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 "%(item)s"" msgstr "Deaktivovat skupinu "%(item)s"" #: 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 "%(item)s"" msgstr "Aktivovat group "%(item)s"" #: 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 "%(item)s"" msgstr "Smazat skupinu "%(item)s"" @@ -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 "%(user_id)s" to group "%(group_id)s"" msgstr "" "PĹ™idat uĹľivatele "%(user_id)s" do skupiny " ""%(group_id)s"" -#: 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 "%(user_id)s" membership request for group " +""%(group_id)s"" +msgstr "OdmĂtnout žádost uĹľivatele "%(user_id)s" o ÄŤlenstvĂ ve skupinÄ› "%(group_id)s"" + +#: 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 "%(user_id)s" from group "%(group_id)s"" msgstr "" "Odebrat uĹľivatele "%(user_id)s" ze skupiny group " ""%(group_id)s"" -#: 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 "%(item)s"" msgstr "Zobrazit detaily nastavenĂ reportovánĂ pro skupinu "%(item)s"" -#: 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 "%(item)s"" 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 4f9d13da736f83c786a0852713f4dba5264de107..5c57a655312a10e1833dc00e9136eb7d4b2aaf49 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 234f2104196c2692bedb5a2b694c40bbafeda1b8..25d3f975a6012d297ac0da8468afbaec9011b72f 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],