Sujet sur Discussion Gestion:Tâches/Liste/291

Antoine Mercier-Linteau (discussioncontributions)

Voici le plan pour le Front-end:

  • Développement en tant que gadget (MediaWiki-Gadget-edit-conflict-prevention.js)
  • Une page est considérée mise en mode édition lorsqu'un URL d'édition est affiché ou un certain bouton est cliqué
  • Les items qui seront surveillés:
    • Édition par l'Éditeur Visuel (?veaction=edit)
    • Édition par l'ancien éditeur de Wikicode et le nouvel éditeur de Wikicode (?action=edit)
    • Édition d'une publication dans le système de discussion (?action=edit-post)
    • Modification d'une page avec un formulaire (Spécial:AjouterDonnées)

Pour l'éditeur voulant éditer une page

  1. Le code surveille les actions sus-mentionnées
  2. Fait une requête d'API pour confirmer que quelqu'un n'est pas en train d'éditer la page
    1. Si c'est le cas, un message d'avertissement est envoyé (avec le nom de l'éditeur qui est en train d'éditer)
      1. L'éditeur peut forcer l'édition de la page
        1. Lorsque l'éditeur fera sa première modification sur la page, un message de perte de contrôle sera envoyé à l'éditeur d'origine
      2. L'éditeur peut demander à être informé lorsque la page ne sera plus en mode édition (feature futur)
      3. L'éditeur peut soit annuler, soit poursuivre pour voir le wikicode ou l'éditeur visuel (sans pouvoir sauvegarder)

Pour l'éditeur éditant une page

  1. Lorsqu'un premier changement est fait au contenu de la page, une requête est envoyée à l'API avec comme information:
    1. L'heure GMT
    2. Le nom de l'utilisateur
    3. L'ID de la page
  2. Cette requête est envoyée à tous les 2 minutes
  3. Le système répond indiquant si
    1. tout va bien
    2. un autre éditeur a pris le contrôle de la page et la sauvegarde entraînera probablement un conflit d'édition
Charles-Éric Noël Laflamme (discussioncontributions)

J'ai effectuer un premier jet du front end.

Si je comprends bien, tu aimerais que l'éditeur voulant éditer une page (si elle est déjà en train d'être éditer) soit offert 3 options différentes soit:

  1. forcer l'édition de la page (et un message sera envoyé aux autres éditeurs concomittans à la premère modification);
  2. poursuivre l'ouverture de l'éditeur, mais en lecture seulement en désactivant l'option de sauvegarde;
  3. annuler l'ouverture de l'éditeur.

Pour l'instant, j'ai programmé une fenêtre contextuel qui apparaît lorsqu'une page voulant être édité est déjà en train d'être éditer par quelqu'un d'autre et qui offre l'option "Ok", soit l'option #1 et l'option annuler, soit l'option #3.

Bien que je n'ai pas prévu de bouton à l'heure actuelle, j'ai tout de même laissé en commentaire le code pour désactiver la sauvegarde, soit option #2.

J'ai par ailleurs seulement fait l'exercice pour le Visual Editor.

J'ai par ailleurs actuellement complètement omis la fonctionnalité d'être informé lorsque la page ne sera plus en mode édition.


Bref, fais-moi savoir si j'ai bien compris la fonctionnalité et si cela fonctionne bien de ton côté.

Côté Back end, je crois qu'il resterait à:

  1. vérifier si une page est déjà en train d'être modifiée pour l'éditeur voulant éditer une page;
  2. envoyer périodiquement aux Back end différents paramètres (temps, utilisateur, page) lorsqu'une page est en train d'être éditée;
  3. envoyer une notification aux utilisateurs étant déjà en train d'éditer une page lorsque le nombre total d'utilisateur change (1 utilisateur de plus ou de moins).
Antoine Mercier-Linteau (discussioncontributions)

Tu as bien compris pour les options.

Concernant la fonctionnalité d'être informé lorsque la page ne sera plus en mode édition, fais juste garder ça en tête dans ton design, mais ne fais pas d'implantation car je ne prévois pas développer ce feature tout suite.

Il n'y aura non plus qu'un seul autre éditeur qui sera en train d'éditer la page (mais il existe du code expérimental dans l'Éditeur Visuel pour de l'édition simultanée comme sur Google Docs [mais ça se prête mal au versionnage des pages]).

Comment je fais pour tester ton code ?

Michaël St-Gelais (discussioncontributions)

Est-ce nécessaire de pouvoir forcer l'édition ? Je comprends pourquoi on le ferait (un éditeur qui a oublié une page ouverte dans son navigateur depuis 1 semaine et qui ne fout rien), mais ça l'a le risque quand même d'être irritant si jo-blo modifie une page que je suis en train d'écrire et qu'il force la fin de ma rédaction.

Si qqn veut ABSOLUMENT commencer à éditer STAT, ce serait possible d'obliger la personne en cours d'édition à enregistrer ? Que le système enregistre la version qui est en cours automatiquement et ferme l'interface d'édition de la personne qui modifiait initialement pour laisser l'opportunité à la personne qui veut modifier la page ?

Antoine Mercier-Linteau (discussioncontributions)

On peut limiter la capacité de forcer l'éditon aux administrateurs. Il faut quand même prévoir cette option. Pour la sauvegarde automatique, c'est quelque chose qui serait quand même difficile à implanter car ça demanderait de coordonner les états de l'éditeur visuel entre les deux utilisateurs.

Antoine Mercier-Linteau (discussioncontributions)

@Charles-Éric Noël Laflamme j'ai vérifié ton prototype et ça me semble un excellent départ. Je te recontacte lorsque j'aurais implanté le back-end.

Entre-temps, j'ai pensé à une manière de facilement implanter le mécanisme de sécurité ailleurs que dans l'éditeur visuel. On pourrait l'attacher directement aux boutons de l'interface. Voici une démo:

$("#ca-ve-edit").on('click', function(ev) { 
    ev.stopImmediatePropagation();  // Do not run the following events
    ev.preventDefault();// Do not follow the link
});
jQuery._data($("#ca-ve-edit")[0]).events.click.reverse(); // Invert the event processing order so our event is run fists.


Dans les faits, la fonction n'a pas besoin d'être super sécuritaire. Un utilisateur qui veut délibérément créer des conflits pourra toujours passer par l'API. On travaille avec de la bonne foi ici.