Source code for kadi.modules.groups.forms

# Copyright 2020 Karlsruhe Institute of Technology
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from flask import current_app
from flask_babel import lazy_gettext as _l
from wtforms.validators import DataRequired
from wtforms.validators import Length

from .models import Group
from .models import GroupVisibility
from kadi.lib.conversion import empty_str
from kadi.lib.conversion import lower
from kadi.lib.conversion import normalize
from kadi.lib.conversion import strip
from kadi.lib.forms import BooleanField
from kadi.lib.forms import check_duplicate_identifier
from kadi.lib.forms import FileField
from kadi.lib.forms import KadiForm
from kadi.lib.forms import LFTextAreaField
from kadi.lib.forms import SelectField
from kadi.lib.forms import StringField
from kadi.lib.forms import SubmitField
from kadi.lib.forms import validate_identifier
from kadi.lib.resources.forms import RolesField


[docs]class BaseGroupForm(KadiForm): """Base form class for use in creating or updating groups.""" title = StringField( _l("Title"), filters=[normalize], validators=[ DataRequired(), Length(max=Group.Meta.check_constraints["title"]["length"]["max"]), ], ) identifier = StringField( _l("Identifier"), filters=[lower, strip], validators=[ DataRequired(), Length(max=Group.Meta.check_constraints["identifier"]["length"]["max"]), validate_identifier, ], description=_l("Unique identifier of this group."), ) description = LFTextAreaField( _l("Description"), filters=[empty_str], validators=[ Length(max=Group.Meta.check_constraints["description"]["length"]["max"]) ], ) visibility = SelectField( _l("Visibility"), choices=[ (GroupVisibility.PRIVATE, _l("Private")), (GroupVisibility.PUBLIC, _l("Public")), ], description=_l( "Public visibility automatically grants EVERY logged-in user read" " permissions for this group." ), ) image = FileField(_l("Image"))
[docs]class NewGroupForm(BaseGroupForm): """A form for use in creating new groups.""" submit = SubmitField(_l("Create group")) def validate_identifier(self, identifier): # pylint: disable=missing-function-docstring check_duplicate_identifier(Group, identifier.data)
[docs]class EditGroupForm(BaseGroupForm): """A form for use in editing existing groups. :param group: The group to edit, used for prefilling the form. """ remove_image = BooleanField(_l("Remove current image")) submit = SubmitField(_l("Save changes")) submit_quit = SubmitField(_l("Save changes and quit")) def __init__(self, group, *args, **kwargs): self.group = group super().__init__(*args, obj=group, **kwargs) def validate_identifier(self, identifier): # pylint: disable=missing-function-docstring check_duplicate_identifier(Group, identifier.data, exclude=self.group)
[docs]class AddMembersForm(KadiForm): """A form for use in adding members (i.e. user roles) to a group.""" roles = RolesField( _l("New members"), roles=[(r, r.capitalize()) for r, _ in Group.Meta.permissions["roles"]], ) submit = SubmitField(_l("Add members"))
[docs] def validate(self, extra_validators=None): success = super().validate(extra_validators=extra_validators) if success and self.roles.data: return True return False
[docs]class AddRulesForm(KadiForm): """A form for use in adding new username role rules for groups.""" role = SelectField( _l("Role"), choices=[(r, r.capitalize()) for r, _ in Group.Meta.permissions["roles"]], ) identity_type = SelectField(_l("Account type"), choices=[]) username = StringField( _l("Username"), validators=[DataRequired()], description=_l("Supports wildcards (e.g. *@*.example.edu)."), ) retroactive = BooleanField(_l("Apply retroactively")) submit = SubmitField(_l("Add rule")) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) choices = [] for provider_type, config in current_app.config["AUTH_PROVIDERS"].items(): choices.append( ( provider_type, str(config["identity_class"].Meta.identity_type["name"]), ) ) self.identity_type.choices = choices