from wtforms import fields from wtforms import validators from wtforms_alchemy.fields import QuerySelectField from wtforms_alchemy.validators import Unique from atlas_um import pgdb from atlas_um.auth.claims import ResourceGroups from atlas_um.auth.utils import current_user from atlas_um.helpers.forms import BaseForm from atlas_um.tokens.bearer_tokens import M2MBearerToken class ApplicationForm(BaseForm): name = fields.StringField( "Name", validators=[ validators.DataRequired(), Unique( pgdb.Application.name, message="Name should be unique across all apps", ), ], ) audience = fields.StringField( "Audience", validators=[validators.DataRequired()] ) resource_group = QuerySelectField( "Product", render_kw={"class": "ui dropdown"}, query_factory=lambda: ApplicationForm.get_resource_groups_queryset(), allow_blank=True, blank_text="N/A", validators=[validators.DataRequired()], ) ttl = fields.IntegerField( "TTL (seconds)", validators=[validators.DataRequired()], default=M2MBearerToken.DEFAULT_TIME_TO_LIVE, ) scope = fields.StringField("Scope", validators=[validators.Optional()]) @staticmethod def get_resource_groups_queryset(): """Queryset with control on permitted resource groups.""" if current_user.is_admin: return pgdb.ResourceGroup.query.active() namespace_urls = [] for claim in current_user.claims: if not isinstance(claim, ResourceGroups): continue namespace_urls.extend(claim.value) return pgdb.ResourceGroup.query.active().by_namespace_urls( namespace_urls )