Skip to content

Transfer meeting ownership - #391

Open
SbirLobo wants to merge 48 commits into
numerique-gouv:mainfrom
yaal-coop:329-transfer-meeting-ownership
Open

Transfer meeting ownership#391
SbirLobo wants to merge 48 commits into
numerique-gouv:mainfrom
yaal-coop:329-transfer-meeting-ownership

Conversation

@SbirLobo

@SbirLobo SbirLobo commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Cette PR est basée sur a #401

fix #329
fix #393

CHANGES

A meeting owner or an admin can transfer ownership of the meeting to a delegate.

  • The new owner is notified by email.

  • The previous owner becomes a delegate for the meeting.

@Mdl-ac-toulouse

Mdl-ac-toulouse commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

Attention, la grosse difficulté de ce ticket va être de ne pas perdre la continuité de la salle :

  • Les anciens liens/code connexion/code PIN déjà diffusés doivent fonctionner
  • L'accès aux enregistrements doit être le même (même emplacement avec getRecordings)

Il y a peut-être d'autres points que j'oublie.

@azmeuk

azmeuk commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

Il faudrait que les admins puissent transférer des salon, soit par l'interface, soit par CLI.

SbirLobo added 24 commits July 9, 2026 13:28
There's no revision depth left to target once a UUID-backed meeting is in the database
now, we can read meeting.quick
avoid to generate url for each use
make meeting url persistents
  group_member table wasn't registered when test_join.py ran in isolation,
  causing User mapper configuration to fail on the group relationship.
@SbirLobo
SbirLobo requested a review from azmeuk August 18, 2026 06:58
@azmeuk azmeuk self-assigned this Aug 31, 2026
Comment on lines +491 to +527
new_owner = delegate
if new_owner is None or new_owner not in meeting.get_all_delegates:
abort(404)

previous_owner = meeting.owner
meeting.owner = new_owner
meeting.owner_id = new_owner.id
new_access = MeetingAccess(
meeting_id=meeting.id,
user_id=previous_owner.id,
level=AccessLevel.DELEGATE,
)
removed_access = MeetingAccess.query.filter_by(
user_id=new_owner.id, meeting_id=meeting.id
).one()
db.session.add(new_access)
db.session.delete(removed_access)
db.session.commit()
current_app.logger.info(
"Meeting %s %s have a new owner : %s %s",
meeting.id,
meeting.name,
new_owner.id,
new_owner.fullname,
)
current_app.logger.info(
"%s became delegate of meeting %s %s",
previous_owner.email,
meeting.id,
meeting.name,
)
current_app.logger.info(
"%s removed from delegates of meeting %s %s",
new_owner.email,
meeting.id,
meeting.name,
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'extrairais ça dans une méthode dédiée pour alléger la vue.

MeetingAccess.meeting_id == self.id,
MeetingAccess.level == AccessLevel.DELEGATE,
)
.order_by(User.family_name, User.given_name)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est un peu hors PR, tu peux pousser des choses comme ça directement sur main :) (mais ce n'est pas grave)

@azmeuk
azmeuk marked this pull request as ready for review September 1, 2026 13:16
@azmeuk

azmeuk commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

@Mdl-ac-toulouse pour revue fonctionnelle

@check_oidc_connection(auth)
@auth.oidc_auth("default")
@meeting_access_required()
def transfert_meeting_ownership(meeting: Meeting, user: User, delegate: User):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

À la réflexion, les changements d'état devraient plutôt être derrière des requêtes POST.

@auth.oidc_auth("default")
@meeting_access_required()
def transfert_meeting_ownership(meeting: Meeting, user: User, delegate: User):
"""Display the page for manage meeting delegation."""

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça ne semble pas être la bonne docstring :)

}
text = render_template(f"meeting/mailto/{body_file}.txt", **context)
html = render_template(f"meeting/mailto/{body_file}.html", **context)
msg["Subject"] = str(_(f"Transfert de {meeting.name}"))

@azmeuk azmeuk Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas de f-string dans _(...), il faut utiliser _(...).format(...)

Comment thread web/b3desk/forms.py
)


class TransferMeetingOwnership(FlaskForm):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cette classe n'est jamais appelée non ?

Comment thread web/b3desk/forms.py
select = SelectField(
label=_("Sélectionner un délégataire"),
description=_(
"Transférer la propriété d'une réunion est action définitive. Vous deviendrez délégataire de cette réunion."

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

est une action définitive

{% include 'meeting/delegation-management.html' %}
{% endblock %}

{#

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est du code commenté.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Action ADMIN : Transférer un salon vers un autre utilisateur Délégation de salon : transfert de salon

3 participants