Le concept de Rédacteur
L'Éditeur d'une page en devient en quelque sorte le Rédacteur-en-Chef. Il peut décider de confier la rédaction de la page à des Contributeurs (groupes ou utilisateurs).
Ces Contributeurs peuvent créer des éléments, à partir de modules préalablement adaptés.
L'Éditeur accorde ou non le droit de publication à un élément. Tant que le droit de publication n'est pas accordé, seuls le Contributeur et l'Éditeur peuvent voir l'élément en question affiché dans la page, en fond grisé (avec une interface de prise de décision pour le l'Éditeur).
Utilisation
L'Éditeur de la page, dans l'interface de gestion des droits de celle-ci, désigne les groupes et les utilisateurs qui en seront Rédacteurs.
Par exemple, pour cette page, nommée "Rédacteurs" :
Clic sur DROITS :

Clic sur le nom de la page :

Choix des utilisateurs/groupes de visiteurs/éditeurs/rédacteurs :

Claudiux est donc éditeur, totoche est rédacteur. Les membres du groupe Développeurs sont éditeurs, ceux du groupe CLASSE1 sont rédacteurs ; ceci est résumé dans la carte des droits :

Lorsque totoche arrive sur la page Rédacteurs, une icone lui signale qu'il en est rédacteur :
En cliquant sur cette icone, totoche accède à une interface de rédaction, qui est un modèle simplifié de l'interface d'édition :

Totoche crée un élément de type text (Texte brut / HTML) :

Totoche n'a accès qu'aux éléments qu'il a lui-même créés. Il peut aussi, toutefois, modifier l'espacement (saut de ligne, etc.) à la suite de l'élément précédent, même si celui-ci ne lui appartient pas.
Si totoche visite la page Rédacteur, voici ce qu'il voit :

Sa proposition est en fond grisé. Il est le seul, avec le Rédacteur-en-Chef (l'éditeur de la page), à la voir. Elle est invisible pour les autres visiteurs.
Le Rédacteur-en-Chef claudiux visite la page, voici ce qu'il voit :

La proposition de totoche est accompagnée d'une interface de prise de décision. Un message automatique sera envoyé à totoche pour l'avertir de cette décision.
Remarque : Si le Rédacteur-en-Chef désire voir la page sans les propositions des rédacteurs (comme la voient les visiteurs), un lien en bas de page le lui permet.
Dans l'interface d'édition du Back-Office, le Rédacteur-en-Chef voit ceci (en supposant qu'il n'ait pas encore pris de décision) :

Il sait que l'élément text_0 a été proposé par totoche, et en passant la souris dessus, il fait afficher la date de proposition.
Après avoir accepté la proposition (c'est-à-dire accordé l'imprimatur), le Rédacteur-en-Chef la voit ainsi, sur la page Rédacteurs :

Et dans le Back-Office, la date d'édition apparaît :

Totoche a reçu le message automatique :

Et lorsque totoche revient sur la page Rédacteurs, son texte est bien visible (comme par tout autre visiteur), mais il n'a plus le droit de le modifier...

...comme le lui confirme son interface de rédaction (absence de case à cocher en face de text_0) :

Le Rédacteur-en-Chef claudiux peut éditer l'élément (dans le Back-Office d'édition), pour en changer le rédacteur et l'imprimatur :

S'il supprime l'imprimatur, l'élément devient à nouveau invisible par les visiteurs, visible et éditable par le rédacteur.
Comment adapter un module aux Rédacteurs
Vous pouvez vous référer aux modules text et image.
Property access_redac
Ajouter au module la property access_redac, de type string (on peut y mettre "utilisable par un redacteur", mais seule l'existence de la property est importante).
script zwo_view_html
En début de script, remplacer :
if mem['droit_vue_dossier']<>1: return 'Vous n\'avez pas les droits pour cette action !'
par
dr_vue = context.zwo_lib.droit_vue(mem,instance) if dr_vue == 0: return ''
En fin de script, remplacer l'éventuel:
return printed
par
message = printed
supprimer :
return message
et ajouter:
if dr_vue!=1: return context.zwo_lib.view_content_submited_by_redac(mem, instance,message, dr_vue,container['icone.png'].absolute_url()) else: return message Si le script fait afficher le contenu d'un document.src(), il faut lui donner le proxy Manager.
script zwo_new_html
En début de script:
if mem['droit_edit_dossier']<>1 and mem['droit_redac']!=1: return "Vous n'avez pas les droits pour cette action !"
script new_ok
En début de script, après la ligne d'affectation de mem :
if mem['droit_edit_dossier']<>1 and mem['droit_redac']!=1: return "Vous n'avez pas les droits pour cette action !"
En milieu de script, après la ligne :
obj.manage_addProperty('element',modname,'string')
ajouter :
# Ajouté pour rédacteur : if mem['droit_redac']==1: obj.manage_addProperty('redacteur',mem['user_id'],'string') obj.manage_addProperty('imprimatur',"0",'string') obj.manage_addProperty('redac_time',DateTime(),'date') Donner à ce script le proxy Manager.
À partir de maintenant, un Rédacteur peut créer un élément sur sa page.
script zwo_config_html
En début de script :
if mem['droit_edit_dossier']<>1 and not context.zwo_lib.droit_redac(mem,instance): return "Vous n'avez pas les droits pour cette action !"
Et vers la fin, juste avant la "fin du formulaire":
# Rédacteurs: if mem['droit_edit_dossier']==1: redacteur='' if instance.hasProperty('redacteur'): redacteur=instance.redacteur c_ok='';c_no=' checked="checked"' if instance.hasProperty('imprimatur') and int(instance.imprimatur)==1: c_ok=' checked="checked"';c_no='' message.extend(['''Rédacteur : <input type="text" name="redacteur:string" value="%s"/> (un seul identifiant) <br/> Publication :<br/><input type="radio" name="imprimatur:string" value="1"%s/>oui, élément visible par les visiteurs et inéditable par son rédacteur.<br/><input type="radio" name="imprimatur:string" value="0"%s/>non, élément visible et éditable uniquement par son rédacteur.<hr/>'''% (redacteur,c_ok,c_no)]) en remplaçant éventuellement "message.extend" par "print " et en supprimant "([" et "])", si le script s'achève par "return printed".
script config_ok
Dans les parameters du script, ajouter à la fin : ", redacteur='', imprimatur='0'".
En début de script, il y a en général les lignes servant à déterminer si l'on est sur une page ou un skin :
if type_rep=="skin": skin=context.zwo_info.skins[nom_rep] obj=skin[nom_ins] else: dossier=mem['rep_obj'] obj=dossier[nom_ins] Il faut les déplacer juste après la ligne d'affectation de mem (la 1ère ligne), de façon à ce que obj soit défini.
Et juste après ces lignes, placer :
if mem['droit_edit_dossier']<>1 and not context.zwo_lib.droit_redac(mem,obj): return 'Vous n\'avez pas les droits pour cette action !'
En fin de script, avant la redirection, insérer :
# Rédacteurs: if mem['droit_redac']==1: if not obj.hasProperty('redacteur'): obj.manage_addProperty('redacteur', mem['user_id'], 'string') if not obj.hasProperty('imprimatur'): obj.manage_addProperty('imprimatur', "0", 'string') if obj.hasProperty('redac_time'): obj.manage_changeProperties(redac_time=DateTime()) else: obj.manage_addProperty('redac_time',DateTime(),'date') elif mem['droit_edit_dossier']==1: context.zwo_lib.check_content_submited_by_redac(obj.getId(), obj.absolute_url(), 'chown', redacteur, imprimatur)
Les lignes en italique ci-dessus ne sont nécessaires que si l'élément est recréé durant le script(ce qui est le cas, par ex., pour un élément image, dont on change l'image). Elles recréent les properties redacteur et imprimatur. Vérifier aussi, si un newobj a été créé, que l'instruction :
obj=newobj
soit présente à la fin de la création du newobj. cf. module image.
Donner à ce script le proxy Manager.
autres scripts éventuels
Si d'autres scripts entrent en jeu (rapidedit_html, etc.), il faut aussi les modifier pour vérifier les droits et changements de properties. Inspirez-vous des modules text, image, album_photo, text_fck.
|