Ajout d'un role "admin" pour les membres (auteurs) d'un article de type groupe :

* ajout d'un champ à la table de jointure auteurs_liens
* en même temps, ajout d'un champ "telephone" à la table auteurs
* mise à jour du formulaire d'édition d'un groupe et de ses membres / admins
* mise à jour des autorisations de modifier le groupe
This commit is contained in:
Pierre 2020-12-01 16:56:47 +01:00
parent b8cba88e47
commit d3f0f337da
8 changed files with 111 additions and 29 deletions

View file

@ -28,12 +28,12 @@ function balint_upgrade($nom_meta_base_version, $version_cible) {
$maj = array(); $maj = array();
$maj['create'] = array( $maj['create'] = array(
array('maj_tables', array('spip_articles')), array('maj_tables', array('spip_articles','spip_auteurs_liens')),
array('config_prive') array('config_prive')
); );
$maj['1.0.7'] = array( $maj['1.0.12'] = array(
array('maj_tables', array('spip_articles')), array('maj_tables', array('spip_articles','spip_auteurs_liens')),
array('config_prive') array('config_prive')
); );

View file

@ -118,6 +118,24 @@ function autoriser_article_lire($faire, $type, $id, $qui, $opt) {
function autoriser_article_modifier($faire, $type, $id, $qui, $opt) { function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
// Si l'article est un groupe, il faut être auteur et avoir le role "admin"
if ($opt AND in_array('groupe',$opt)){
$where = array(
'id_objet='.intval($id),
'objet="article"',
'id_auteur =' . $qui['id_auteur']
);
$role = sql_getfetsel('role','spip_auteurs_liens',$where);
if (in_array($qui['id_auteur'],auteurs_objet('article',$id)) AND $role == "admin"){
return true;
}
else {
return in_array($qui['statut'], array('0minirezo'));
}
}
// Sinon, seuls les auteurs et les admins peuvent le modifier
else{
if(in_array($qui['id_auteur'],auteurs_objet('article',$id))){ if(in_array($qui['id_auteur'],auteurs_objet('article',$id))){
return true; return true;
} }
@ -125,6 +143,7 @@ function autoriser_article_modifier($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo')); return in_array($qui['statut'], array('0minirezo'));
} }
} }
}
function autoriser_article_rediger($faire, $type, $id, $qui, $opt) { function autoriser_article_rediger($faire, $type, $id, $qui, $opt) {
// Si le membre est rédacteur, il doit être animateur d'au moins un groupe // Si le membre est rédacteur, il doit être animateur d'au moins un groupe
@ -158,7 +177,9 @@ function autoriser_sujet_editer($faire, $type, $id, $qui, $opt) {
} }
function autoriser_forum_voir($faire, $type, $id, $qui, $opt) { function autoriser_forum_voir($faire, $type, $id, $qui, $opt) {
$id_auteur = $qui['id_auteur']; return in_array($qui['statut'], array('0minirezo','1comite'));
/* $id_auteur = $qui['id_auteur'];
// Il faut être au moins membre // Il faut être au moins membre
if ($qui['statut']=='1comite'){ if ($qui['statut']=='1comite'){
// si le forum est privé, il faut être membre du bureau // si le forum est privé, il faut être membre du bureau
@ -178,4 +199,5 @@ function autoriser_forum_voir($faire, $type, $id, $qui, $opt) {
if ($qui['statut']=='0minirezo'){ if ($qui['statut']=='0minirezo'){
return true; return true;
} }
*/
} }

View file

@ -16,6 +16,13 @@ function balint_declarer_tables_principales($tables_principales){
return $tables_principales; return $tables_principales;
} }
function balint_declarer_tables_auxiliaires($tables_auxiliaires){
$tables_auxiliaires['spip_auteurs_liens']['field']['role'] = "text DEFAULT '' NOT NULL";
return $tables_auxiliaires;
}
function balint_declarer_champs_extras($champs = array()) { function balint_declarer_champs_extras($champs = array()) {
$champs['spip_groupes_mots']['grigri'] = array( $champs['spip_groupes_mots']['grigri'] = array(
'saisie' => 'input',//Type du champ (voir plugin Saisies) 'saisie' => 'input',//Type du champ (voir plugin Saisies)
@ -78,6 +85,21 @@ function balint_declarer_champs_extras($champs = array()) {
'modifier' => array('auteur' => '0minirezo')),//Seuls les admins peuvent modifier 'modifier' => array('auteur' => '0minirezo')),//Seuls les admins peuvent modifier
), ),
); );
$champs['spip_auteurs']['telephone'] = array(
'saisie' => 'input',//Type du champ (voir plugin Saisies)
'options' => array(
'nom' => 'telephone',
'label' => 'Téléphone',
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valeur par défaut
'restrictions'=>array(
'voir' => array('auteur' => ''),
'modifier' => array('auteur' => 'ominirezo','1comite')
)
),
);
/* /*
$champs['spip_auteurs']['bureau'] = array( $champs['spip_auteurs']['bureau'] = array(
'saisie' => 'case',//Type du champ (voir plugin Saisies) 'saisie' => 'case',//Type du champ (voir plugin Saisies)

View file

@ -11,7 +11,7 @@
<tr> <tr>
<th scope="col">Nom</th> <th scope="col">Nom</th>
<th scope="col">Statut</th> <th scope="col">Statut</th>
<th scope="col">Bureau</th> [(#REM)<th scope="col">Bureau</th>]
<th scope="col">Animateur</th> <th scope="col">Animateur</th>
<th scope="col">Email</th> <th scope="col">Email</th>
<th scope="col">Téléphone</th> <th scope="col">Téléphone</th>
@ -19,7 +19,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<BOUCLE_auteurs(AUTEURS){tous}{webmestre=non}{par nom}> <BOUCLE_auteurs(AUTEURS){tous}{par nom}>
<tr class="ligne-auteurs"> <tr class="ligne-auteurs">
<td class="cellule-tableau">#NOM</td> <td class="cellule-tableau">#NOM</td>
@ -28,13 +28,13 @@
[(#STATUT|=={1comite}|oui) Membre] [(#STATUT|=={1comite}|oui) Membre]
[(#STATUT|=={6forum}|oui) Inscrit] [(#STATUT|=={6forum}|oui) Inscrit]
</td> </td>
<td class="cellule-tableau"> [(#REM)<td class="cellule-tableau">
<INCLURE{fond=inclure/toggle_param,env,objet=auteur,id_objet=#ID_AUTEUR,param=bureau,ajax}> <INCLURE{fond=inclure/toggle_param,env,objet=auteur,id_objet=#ID_AUTEUR,param=bureau,ajax}>
</td> </td>]
<td class="cellule-tableau"> <td class="cellule-tableau">
<BOUCLE_groupes(ARTICLES){id_secteur=#CONFIG{balint/id_rub_groupes}}{id_auteur=#ID_AUTEUR}> <BOUCLE_groupes(ARTICLES){id_secteur=#CONFIG{balint/id_rub_groupes}}{id_auteur=#ID_AUTEUR}>
[(#REM) On affiche les villes dont on est animateur de groupe, ou le pays si on animateur de gps ponctuels] [(#REM) On affiche les villes dont on est animateur de groupe, ou le pays si on animateur de gps ponctuels]
[(#SURTITRE|sinon{#INFO_TITRE{rubrique,#ID_RUBRIQUE}}|unique)] #TITRE
</BOUCLE_groupes> </BOUCLE_groupes>
</td> </td>
<td class="cellule-tableau">#EMAIL</td> <td class="cellule-tableau">#EMAIL</td>

View file

@ -101,18 +101,30 @@
<div class="col-lg-3"> <div class="col-lg-3">
[(#SET{T_id_auteurs, #ENV{T_id_auteurs}|sinon{#ARRAY}})] [(#SET{T_id_auteurs, #ENV{T_id_auteurs}|sinon{#ARRAY}})]
[(#SET{T_id_admins, #ENV{T_id_admins}|sinon{#ARRAY}})]
<fieldset> <fieldset>
<legend><i class="fas fa-users"></i> Responsables</legend> <legend><i class="fas fa-users"></i> Membres</legend>
<label for="auteurs">Animateurs du groupe</label> <label for="auteurs">Membres du groupe</label>
<select id="auteurs" name="Tauteurs[]" class="chosen" multiple> <select id="auteurs" name="Tauteurs[]" class="chosen" multiple>
<option value="">&nbsp;</option> <option value="">&nbsp;</option>
<BOUCLE_auteurs(AUTEURS){tous}{par nom}{webmestre != oui}> <BOUCLE_auteurs(AUTEURS){tous}{statut IN '0minirezo','1comite'}{par nom}>
<option value="#ID_AUTEUR" [(#ID_AUTEUR|in_array{#GET{T_id_auteurs}}|oui) selected]>#NOM</option> <option value="#ID_AUTEUR" [(#ID_AUTEUR|in_array{#GET{T_id_auteurs}}|oui) selected]>#NOM</option>
</BOUCLE_auteurs> </BOUCLE_auteurs>
</select> </select>
</fieldset> </fieldset>
<fieldset>
<legend><i class="fas fa-star"></i> Admins</legend>
<label for="admins">Animateurs du groupe</label>
<select id="admins" name="Tadmins[]" class="chosen" multiple>
<option value="">&nbsp;</option>
<BOUCLE_admins(AUTEURS){tous}{statut IN '0minirezo','1comite'}{par nom}{id_auteur in #GET{T_id_auteurs}}>
<option value="#ID_AUTEUR" [(#ID_AUTEUR|in_array{#GET{T_id_admins}}|oui) selected]>#NOM</option>
</BOUCLE_admins>
</select>
</fieldset>
<div class="boutons text-center"> <div class="boutons text-center">
<button type="submit" class="submit btn"> <button type="submit" class="submit btn">
<i class="fas fa-save"></i> Enregistrer</a> <i class="fas fa-save"></i> Enregistrer</a>

View file

@ -32,16 +32,27 @@ function formulaires_editer_groupe_charger_dist($id_article=0, $redirect=''){
$valeurs = sql_fetsel('*', 'spip_articles', 'id_article='.intval($id_article)); $valeurs = sql_fetsel('*', 'spip_articles', 'id_article='.intval($id_article));
$where = array( // Liste des membres
$where1 = array(
'id_objet='.intval($id_article),
'objet="article"'
);
$res1 = sql_allfetsel('id_auteur','spip_auteurs_liens',$where1);
$valeurs['T_id_auteurs'] = array_column($res1,'id_auteur');
// Liste des admins
$where2 = array(
'id_objet='.intval($id_article), 'id_objet='.intval($id_article),
'objet="article"', 'objet="article"',
'role="admin"'
); );
$res = sql_allfetsel('id_auteur','spip_auteurs_liens',$where); $res2 = sql_allfetsel('id_auteur','spip_auteurs_liens',$where2);
$valeurs['T_id_admins'] = array_column($res2,'id_auteur');
$valeurs['T_id_auteurs'] = array_column($res,'id_auteur');
} }
else { else {
$valeurs['T_id_auteurs'] = array(); $valeurs['T_id_auteurs'] = array();
$valeurs['T_id_admins'] = array();
$valeurs['id_article'] = -1 * intval(session_get('id_auteur')); $valeurs['id_article'] = -1 * intval(session_get('id_auteur'));
} }
@ -128,11 +139,13 @@ function formulaires_editer_groupe_traiter_dist($id_article=0, $redirect=''){
include_spip('action/editer_liens'); include_spip('action/editer_liens');
$where = array( $where = array(
'id_objet='.intval($id_article), 'id_objet='.intval($id_article),
'objet="article"', 'objet="article"'
); );
$ids_auteurs = sql_allfetsel('id_auteur', 'spip_auteurs_liens', $where); $ids_auteurs = sql_allfetsel('id_auteur', 'spip_auteurs_liens', $where);
$ids_auteurs = array_column($ids_auteurs, 'id_auteur'); $ids_auteurs = array_column($ids_auteurs, 'id_auteur');
$Tauteurs = _request('Tauteurs'); $Tauteurs = _request('Tauteurs');
$Tadmins = _request('Tadmins');
if (count($Tauteurs)) { if (count($Tauteurs)) {
$associer = array_diff($Tauteurs, $ids_auteurs); $associer = array_diff($Tauteurs, $ids_auteurs);
@ -142,6 +155,16 @@ function formulaires_editer_groupe_traiter_dist($id_article=0, $redirect=''){
objet_dissocier( array('auteur' => $dissocier) , array('article' =>intval($id_article) )); objet_dissocier( array('auteur' => $dissocier) , array('article' =>intval($id_article) ));
} }
$liste_admins = implode(',' , $Tadmins);
$where2 = array(
'id_objet='.intval($id_article),
'objet="article"',
'id_auteur IN (' . $liste_admins . ')'
);
sql_updateq('spip_auteurs_liens', array('role' => ''), $where);
sql_updateq('spip_auteurs_liens', array('role' => 'admin'), $where2);
// maj des mots fermes // maj des mots fermes
$T_id_groupe = sql_allfetsel('id_groupe','spip_groupes_mots','grigri!="tags"'); $T_id_groupe = sql_allfetsel('id_groupe','spip_groupes_mots','grigri!="tags"');
$T_id_groupe = array_column($T_id_groupe,'id_groupe'); $T_id_groupe = array_column($T_id_groupe,'id_groupe');
@ -235,7 +258,7 @@ function formulaires_editer_groupe_traiter_dist($id_article=0, $redirect=''){
$retour['message_ok'] = "Le groupe est bien enregistré."; $retour['message_ok'] = "Le groupe est bien enregistré.";
// on redirige vers la ville // on redirige vers la ville
$retour['redirect'] = "spip.php?page=groupes&id_article=$id_article"; //$retour['redirect'] = "spip.php?page=groupes&id_article=$id_article";
$bigform = charger_fonction('bigform_traiter','inc'); $bigform = charger_fonction('bigform_traiter','inc');

View file

@ -5,16 +5,19 @@
[(#REM) S'il s'agit de la page d'un groupe :] [(#REM) S'il s'agit de la page d'un groupe :]
<BOUCLE_groupe(ARTICLES){id_article=#ENV{id_article}}{par rang}> <BOUCLE_groupe(ARTICLES){id_article=#ENV{id_article}}{par rang}>
[(#AUTORISER{modifier, article, #ID_ARTICLE}) <?php
include_spip('inc/autoriser');
if (autoriser('modifier','article', #ID_ARTICLE,$GLOBALS['visiteur_session']['id_auteur'], array('groupe'))){ ?>
<a class="btn" href="#URL_PAGE{editer_groupe,id_article=#ID_ARTICLE }"><i class="fas fa-edit"></i> Mettre à jour le groupe</a> <a class="btn" href="#URL_PAGE{editer_groupe,id_article=#ID_ARTICLE }"><i class="fas fa-edit"></i> Mettre à jour le groupe</a>
] <?php } ?>
[<h3 class="h4">(#TITRE)</h3>] [<h3 class="h4">(#TITRE)</h3>]
<strong>Responsables</strong> <strong>Contact</strong>
<BOUCLE_auteurs(AUTEURS){id_article=#ID_ARTICLE}> <BOUCLE_auteurs(AUTEURS){id_article=#ID_ARTICLE}{role=admin}>
<div>#NOM <div>
[(#EMAIL|ou{#TELEPHONE}|oui) [(#EMAIL|ou{#TELEPHONE}|oui)
<a href="[(#URL_PAGE{contacter_auteur}|parametre_url{id_auteur,#ID_AUTEUR})]" class="mediabox">&nbsp; (contact)</a> <a href="[(#URL_PAGE{contacter_auteur}|parametre_url{id_auteur,#ID_AUTEUR})]" class="mediabox">#NOM</a>
] ]
</div> </div>
</BOUCLE_auteurs> </BOUCLE_auteurs>

View file

@ -6,7 +6,7 @@
compatibilite="[3.1.7;3.3.*]" compatibilite="[3.1.7;3.3.*]"
logo="img/fede_64.jpg" logo="img/fede_64.jpg"
documentation="" documentation=""
schema="1.0.7" schema="1.0.12"
> >
<nom>Squelette Fédé</nom> <nom>Squelette Fédé</nom>