Dokos - Automatiser la gestion des rĂ´les

Bonjour Ă  tous,

Je suis en train de mettre en place Dokos dans le cadre d’une association (un FunLab).

On fonctionne sur un système d’abonnement et on voudrait laisser la gestion des adhésions entre les mains de nos usagers.
Créer un compte sur Dokos n’est pas verrouillé, et cela permet d’accéder a un menu du portail que j’ai rendu beaucoup plus léger.
Afin de pouvoir accéder aux outils (réservation de machine, demande de matériel …) j’ai compris qu’un rôle était la solution pour cacher/afficher les éléments. Bien que la gestion des droits et des rôles soient encore confus pour moi, j’ai réussi a atteindre une partie de ce que je cherchait a faire, j’ai donc espoir qu’en me confrontant plus longtemps face a ces config je vais réussir a organiser les rôles comme je l’entends

Cependant je n’ai pas compris comment assigner un rôle à un utilisateur automatiquement lors du règlement/confirmation d’un abonnement. Dois-je passer par la création d’un script ?

Ainsi je viens vous demander si vous êtes déjà passé par là, si vous avez des tips, si j’ai manqué une option ou si vous avez de bonnes adresses pour m’aider a créer le script qu’il me faudrait.

User case -
> Je suis intéressé par l’association, je vais sur leur site internet.
> Je m’inscrit et cherche a cotiser pour pouvoir faire une réservation.
> Je créer un compte sur Dokos, achète un abonnement afin d’avoir accès aux menus de réservation.
> Après confirmation d’achat (1h ?), j’ai accès aux menus de réservation et l’accès a ces pages me sont autorisés. En tant qu’adhérent, je peux réserver un créneau sans intervention des administrateurs.

J’aimerais a termes automatiser un maximum la gestion des adhérents, des réservation, des crédits, des commandes pour que l’intervention admin ne soit nécessaire que en cas de problème/bug.

Merci de votre attention :slight_smile:

Bonjour,

Dans les paramètres du portail il est possible de définir le rôle attribué par défaut à un utilisateur lorsqu’il crée son compte.
Pour créer des règles plus complexes il faudra passer par un script.

Si je comprend bien le cas d’usage, il va probablement falloir faire des scripts qui donnent/enlèvent des rôles en fonction du statut de l’abonnement.
Ensuite les différentes pages du portail pouvant être restreintes en fonction des rôles, cela donnera accès ou non à certaines sections dans le portail.
Par contre les pages de réservation d’article standards ne sont pas prévues pour être restreintes par rôle actuellement. Il faudrait ouvrir un ticket sur Gitlab pour permettre ce comportement. En attendant il va falloir développer vos propres pages de réservation…

Une solution en attendant pourrait être de créer deux groupes de clients (Adhérents/Non adhérents) et d’associer un tarif de réservation prohibitif au groupe “Non adhérents”.
Dans ce cas le script ne devra pas donner un rôle à l’utilisateur mais associé le client avec le bon groupe de clients.

Enfin pour la confirmation d’achats, si Dokos est lié avec Stripe par exemple, la confirmation de paiement est quasi instantanée. Avec GoCardless la confirmation est immédiate, mais s’agissant d’un virement SEPA, celui-ci ne sera effectif que plusieurs jours plus tard.

Bonne journée !

Bonjour,
c’est dans les grandes lignes ce que nous sommes en train de mettre en place pour notre association https://www.hatlab.fr. hébergé sous dokos. ne pas faire attention à l’esthétique, c’est encore en cours d’évolution.
je pourrais te montrer ce qui a été fait et les projets que nous avons,
Cordialement

Merci a vous pour vos réponses :hugs:

Étant assez novice sur le framework Frappe et sur python (a moins que ce soit du JS qu’il faille injecter ?), je ne sais pas vers quelle ressource me tourner pour comprendre comment exploiter les informations contenues dans la base de données du bureau.

Suite a la réponse de @chdecultot je pense recréer une page de réservation paramétrable et cacher la page par défaut afin de pouvoir contrôler l’accès à la liste des produits réservables par rôle.

Je serais bien content de pouvoir te contacter @PhilippeG afin de comprendre certaines logiques et peut être pouvoir échanger des scripts/conseils sur l’usage de ce merveilleux outil

Bonne journée et merci encore, je posterais mon script sur ce post quand j’arriverais a mes fins pour les rôles :slight_smile:

Bonjour Ă  tous,
Je déterre ce sujet que j’ai mis de coté pendant quelques mois…
J’ai tenté cette semaine de mettre cela en place et viens ici pour demander un petit coup de main pour m’aider a conclure cette fonctionnalité

Pour ce faire j’ai essayer de comprendre comment fonctionnaient les scripts serveurs (qui me semblent mieux adaptés que les scripts clients pour ce que je veux faire)
Mais je n’ai ni expérience en python, ni avec le framework frappe. Je suis donc un peu perdu sur les méthodes a utiliser pour manipuler les données comme je le souhaite…

Mais j’ai fait une version du script que je recherche (non fonctionnel) pour peut-être trouver de l’aide auprès de vous pour le rédiger correctement…

VoilĂ  mon script actuellement :

Type de script = Evenement déclencheur (lorsqu’il s’abonne)
Type de document de référence = Subscriptions ( lorsqu’une entrée dans le doctype Abonnement se fait)
Evenement déclencheur : Après enregistrement (Devrait être après validation car une fois payé c’est automatiquement validé mais je suis encore en phases de test)

code :

// Permet de trouver l'utilisateur
user = frappe.get_doc({
    "doctype": "User",
    "first_name": doc.first_name,
    "last_name": doc.last_name,
    "birth_date": doc.bith_date,
    "email": doc.email,
})

// Puis le role que l'on veut inserer
role = frappe.get_doc({
	"doctype": "Role",
	"role_name": "Abonné"
})

//On modifie la fiche de l'utilisateur avec le nouveau role
user.roles.append(role);

//J'envoi l'entrée dans la base de donnée
user.insert(ignore_permissions=True)

Est ce que vous pourriez m’apporter votre regard sur ce que j’essaye de faire et peut être me diriger vers les ressources adéquates…

Bonne journée, merci de m’avoir lu,

Bonjour @ObsidienStudio,

Si je comprends bien tu souhaites donner le rôle “Abonné” (ou autre) aux utilisateurs associés à un client qui souscrit à un abonnement ?

J’imagine que tu vas utiliser ce rôle ensuite pour donner accès à certaines ressources spécifiques sur le portail par exemple ?

Dans ce cas il possible d’utiliser un script du style:

users = frappe.get_all("Contact", filters=[["Dynamic Link", "link_doctype", "=", "Customer"], ["Dynamic Link", "link_name", "=", doc.customer]], fields=["user"])

for user in users:
    frappe.get_doc("User", user.name).add_roles("Abonné")

Par rapport Ă  ton code:

  • On peut imaginer qu’à la crĂ©ation de l’abonnement, si c’est l’utilisateur qui le crĂ©e, la fiche utilisateur est dĂ©jĂ  crĂ©Ă©e. On a donc pas besoin de l’insĂ©rer Ă  nouveau dans la base de donnĂ©es.
    Ca peut être différent si l’abonnement est créé par un administrateur.

  • Le rĂ´le est probablement dĂ©jĂ  crĂ©Ă©, donc on peut juste faire une insertion d’une rĂ©fĂ©rence Ă  ce rĂ´le dans la table enfant “roles” associĂ©e Ă  la fiche Utilisateur.
    add_roles revient Ă  faire:

for role in roles:
    user.append("roles", {"role": role})

En espérant que ça puisse t’aider.

Bonne journée !

Bonjour,

En effet vous avez bien compris ce que je cherchais.
J’ai préparer le rôle et ses accès, il me suffit de déclencher le script a l’abonnement d’un utilisateur depuis le site web. (et le second script qui va retirer les roles pour les abonnements qui se finissent)

Cependant j’aurais aimé (et pour que ce post puisse être référence) des indications pour peut-être comprendre ce que je fais.
si c’est possible, existe-t-il un “console.log()” pour les scripts python ? J’ai l’impression de travailler dans le noir en testant sans comprendre.

Selon moi le script

users = frappe.get_all("Contact", filters=[["Dynamic Link", "link_doctype", "=", "Customer"], ["Dynamic Link", "link_name", "=", doc.customer]], fields=["user"])

for user in users:
   frappe.get_doc("User", user.name).add_roles("Abonné")

Ne me permettra pas de gérer mon exemple (et de fait, après tests, il ne fait pas ce que je veux)

frappe.get_all(…) > On est peut être obligé de “tout” récupérer mais je souhaite simplement récupérer l’utilisateur en cours, celui qui est sur le point de s’abonner.
J’ai l’impression que dans ce script on récupère TOUT les utilisateurs “clients”

On passe ensuite dans une boucle pour une seule action, je pense que le script devrait plutĂ´t ressembler Ă  :

user = frappe.get_doc("User", this.name)
user.add_roles("Abonné")

Mais le this n’est pas reconnu dans python et je ne sais pas comment lui designer le contexte du client qui exécute l’action…

L’ajout du rôle cependant est exactement ce que je cherchais et me permet d’avoir une ligne de code a atteindre, plus qu’a trouver les paramètres a lui fournir :slight_smile:

Merci encore,
Bonne journée

Bonjour @ObsidienStudio,

Dans les scripts Python, il est possible d’utiliser log(value) (en activant la variable d’environnement logging: 1 dans le fichier site_config.json pour voir le résultat dans la console JS) ou bien frappe.log_error(value, title) pour avoir un résultat dans le journal des erreurs.

Pour récupérer l’identifiant de l’utilisateur actif, il est possible de passer la variable suivante dans le script: frappe.session.user

Du coup ça pourrait donner:

user = frappe.get_doc("User", frappe.session.user)
user.add_roles("Abonné")

Bonne journée !

1 « J'aime »