Code source de geonature.core.gn_permissions.commands
importclickfromclickimportUsageErrorimportsqlalchemyassafromsqlalchemy.ormimportcontains_eager,joinedloadfromsqlalchemy.orm.excimportMultipleResultsFound,NoResultFoundfromsqlalchemyimportselectfrompypnusershub.db.modelsimportUserfromgeonature.utils.envimportdbfromgeonature.core.gn_permissions.modelsimportPermission,PermissionAvailable@click.command(help="Ajouter des permissions administrateurs sur tous les modules pour un utilisateur ou un groupe.")@click.option("--id","id_role",type=int)@click.option("--nom","nom_role")@click.option("--prenom","prenom_role")@click.option("--group","groupe",flag_value=True,default=None,help="Le rôle est un groupe.")@click.option("--user","groupe",flag_value=False,default=None,help="Le rôle est un utilisateur.")@click.option("--skip-existing",is_flag=True,help="Ne pas ajouter de permission administrateur s’il existe déjà une permission",)@click.option("--dry-run",is_flag=True,help="Uniquement afficher les permissions nécessaires, sans les ajouter en base",)@click.option("--yes",is_flag=True,help="Répond automatiquement oui à la confirmation",)
[docs]defsupergrant(skip_existing,dry_run,yes,**filters):filters={k:vfork,vinfilters.items()ifvisnotNone}ifnotfilters:raiseUsageError("Veuillez sélectionner le rôle à promouvoir.")try:role=db.session.execute(select(User).filter_by(**filters)).scalar_one()exceptMultipleResultsFound:raiseUsageError("Plusieurs rôles correspondent à vos filtres, veuillez les affiner.")exceptNoResultFound:raiseUsageError("Aucun rôle ne correspond à vos filtres, veuillez les corriger.")ifnotyes:ifnotclick.confirm(f"Ajouter les permissions administrateur au rôle {role.id_role} ({role.nom_complet}) ?",):raiseclick.Abort()permission_available=(db.session.scalars(select(PermissionAvailable).outerjoin(Permission,sa.and_(PermissionAvailable.permissions,Permission.id_role==role.id_role),).options(contains_eager(PermissionAvailable.permissions,),joinedload(PermissionAvailable.module),joinedload(PermissionAvailable.object),joinedload(PermissionAvailable.action),)).unique().all())forapinpermission_available:forperminap.permissions:ifskip_existingornotperm.filters:breakelse:# The role does not have any permission of this type,# or only permissions with at least one filter.# We add an new permission without any filters.click.echo(f"Nouvelle permission : module '{ap.module.module_code}', "f"objet '{ap.object.code_object}', action '{ap.action.code_action}'")db.session.add(Permission(availability=ap,role=role))ifnotdry_run:db.session.commit()