plusieurs auteurs pour les sources
[mw_sourceml] / app / controllers / users / pistes.php
1 <?php
2
3   class mw_users_pistes extends mw_controller{
4
5     var $user;
6
7     var $status;
8     var $album_status_id;
9     var $morceau_status_id;
10     var $piste_status_id;
11
12     function validate(){
13       $env = $this->env();
14       $data = $env->data();
15       if(($this->status = $data->source_status()) === false){
16         return "Impossible de lire la liste des status de source";
17       }
18       foreach($this->status as $id_source_status => $source_status){
19         if($source_status["nom"] == "album") $this->album_status_id = $id_source_status;
20         if($source_status["nom"] == "morceau") $this->morceau_status_id = $id_source_status;
21         if($source_status["nom"] == "piste") $this->piste_status_id = $id_source_status;
22         if(isset($this->album_status_id) && isset($this->morceau_status_id) && isset($this->piste_status_id)) break;
23       }
24       if(
25             !isset($this->album_status_id)
26         ||  !isset($this->morceau_status_id)
27         ||  !isset($this->piste_status_id)
28       ){
29         return "liste des status de source incomplète";
30       }
31       if(!($this->user = $env->user())){
32         return "Vous devez être identifié pour accéder à cette page";
33       }
34       return true;
35     }
36
37     function index(){
38       $env = $this->env();
39       $data = $env->data();
40       if(($groupes = $data->groupes($this->user["id"])) === false){
41         $env->erreur("Impossible de lire la liste des groupes");
42         return;
43       }
44       $morceaux_groupes = $groupes["list"];
45       $id_groupe = false;
46       if(isset($_GET[$env->param("groupe")])){
47         $id_groupe = $_GET[$env->param("groupe")];
48         if(!isset($groupes["list"][$id_groupe])){
49           $env->erreur("Impossible de lire les informations du groupe");
50           return;
51         }
52       }
53       if($id_groupe){
54         $morceaux_groupes = array($id_groupe => $groupes["list"][$id_groupe]);
55       }
56       if(
57         (
58           $morceaux = $data->groupes_sources(
59             array(
60               "groupes" => $morceaux_groupes,
61               "id_class" => $this->morceau_status_id,
62               // on veut les morceaux pour lesquels au moins un groupe (et pas tous) ...
63               "satisfy_all_groupes_access" => false,
64               // ... a le droit de contribution
65               "id_source_access" => $data->id_groupe_status_contributeur()
66             )
67           )
68         ) === false
69       ) return "impossible de lire la liste des morceaux";
70       if($id_morceau = isset($_GET[$env->param("morceau")]) ? $_GET[$env->param("morceau")] : false){
71         if(!($morceau = $data->source($id_morceau, true))){
72           $env->erreur("Impossible de lire les informations du morceau");
73           return;
74         }
75       }
76       $select = array(
77         "status" => $this->piste_status_id,
78         "id_user" => $this->user["id"],
79         "order_by" => "ordre",
80         "start" => isset($_GET[$env->param("start")]) && $_GET[$env->param("start")] ? $_GET[$env->param("start")] : 0
81       );
82       if($id_groupe) $select["id_groupe"] = $id_groupe;
83       if($id_morceau !== false) $select["id_composition"] = $id_morceau;
84       if(($pistes = $data->sources($select)) === false){
85         $env->erreur("impossible de lire la liste des pistes");
86         return;
87       }
88       foreach($pistes["list"] as $id_piste => $piste){
89         $pistes["list"][$id_piste]["permissions"] = $data->source_permissions($piste, $this->user["id"]);
90       }
91       if($_POST){
92         foreach($pistes["list"] as $id_piste => $piste){
93           if(isset($_POST["ordre_".$id_piste])){
94             if($data->set_source_info($piste["id"], "ordre", $_POST["ordre_".$id_piste]) === false){
95               $env->erreur("Impossible d'enregistrer l'ordre des pistes");
96               return;
97             }
98           }
99         }
100         $get_params = array();
101         if($id_groupe) $get_params["groupe"] = $id_groupe;
102         if($id_morceau) $get_params["morceau"] = $id_morceau;
103         $env->redirect(
104           $env->url("users/pistes", $get_params),
105           "l'ordre des pistes a été enregistré"
106         );
107       }
108       $env->set_out("groupes", $groupes);
109       $env->set_out("morceaux", $morceaux);
110       $env->set_out("pistes", $pistes);
111     }
112
113     function add(){
114       $env = $this->env();
115       $data = $env->data();
116       $piste = $data->empty_source();
117       $source_infos = array(
118         "date_inscription" => date("Y-m-d"),
119         "ordre" => 0
120       );
121       $groupe = false;
122       $morceau = false;
123       if(($groupes = $data->groupes($this->user["id"])) === false){
124         $env->erreur("Impossible de lire la liste des groupes");
125         return;
126       }
127       $morceaux = array();
128       if($groupes["total"] > 0){
129         $select = array(
130           "status" => $this->morceau_status_id,
131           "id_user" => $this->user["id"]
132         );
133         foreach($groupes["list"] as $id_groupe => $groupe){
134           $select["id_groupe"] = $id_groupe;
135           if(($groupes_morceaux = $data->sources($select)) === false){
136             $env->erreur("impossible de lire la liste des morceaux");
137             return;
138           }
139           $morceaux[$id_groupe] = $groupes_morceaux["list"];
140         }
141       }
142       if(($licences = $data->licences()) === false){
143         return "Impossible de lire la liste des licences";
144       }
145       if(!$data->check_user_uploads_dir()){
146         $env->erreur("Impossible de creer le repertoire utilisateur");
147         return;
148       }
149       $web_path = $env->path("web");
150       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
151       $users_sources_mod = $env->get_controller("users/sources");
152       if($_POST){
153         if(!($groupe = $data->groupe($_POST["id_groupe"]))){
154           $env->erreur("Impossible de lire les informations du groupe");
155           return;
156         }
157         $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
158         $piste["groupes"] = array($groupe["id"] => $groupe);
159         if($_POST["morceau"]){
160           if(!($morceau = $data->source($_POST["morceau"], true))){
161             $env->erreur("Impossible de lire les informations du morceau");
162             return;
163           }
164           $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
165           if(!$morceau["permissions"]["contributeur"]){
166             $env->erreur("vous n'avez pas la permission d'ajouter une piste dans ce morceau");
167             return;
168           }
169           $piste["morceau"] = $morceau["id"];
170         }
171         if(isset($_POST["is_derivation"])){
172           foreach($_POST as $key => $value){
173             if(substr($key, 0, 14) == "derivation_id_"){
174               $id_source_derivation = substr($key, 14);
175               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
176               $piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
177                 $env,
178                 $xml_url,
179                 (
180                   $_POST["use_edit_derivation_content_".$id_source_derivation] ?
181                     $_POST["edit_derivation_content_".$id_source_derivation]
182                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
183                 ),
184                 $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
185               );
186             }
187           }
188         }
189         if(isset($_POST["is_reference"])){
190           $xml_url = trim($_POST["reference"]);
191           $piste["reference"] = $users_sources_mod->get_source_from_xml(
192             $env,
193             $xml_url,
194             (
195               $_POST["use_edit_reference_content"] ?
196                 $_POST["edit_reference_content"]
197               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
198             ),
199             $_POST["use_edit_reference_content"] ? true : false
200           );
201         }
202         else{
203           if(!($piste["titre"] = trim($_POST["titre"]))){
204             $env->message("merci de pr&eacute;ciser un titre pour la piste");
205           }
206           $piste["licence"] = array(
207             "id" => $_POST["licence"]
208           );
209           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
210           $source_infos["description"] = $_POST["description"];
211           foreach($_POST as $post_key => $post_value){
212             if(substr($post_key, 0, 13) == "document_nom_"){
213               if($id_document = substr($post_key, 13)){
214                 $piste["documents"][$id_document] = array(
215                   "nom" => $_POST["document_nom_".$id_document],
216                   "url" => $_POST["document_url_".$id_document]
217                 );
218               }
219             }
220           }
221         }
222         if(!$env->messages()){
223           if(
224             (
225               $id_source = $data->add_source(
226                 $piste["groupes"],
227                 $piste["titre"],
228                 $this->piste_status_id,
229                 $piste["licence"]["id"],
230                 $piste["documents"],
231                 $piste["reference"],
232                 $piste["derivations"],
233                 $source_infos
234               )
235             ) === false
236           ){
237             $env->erreur("Impossible d'ajouter la piste");
238             return;
239           }
240           if($morceau){
241             if(!$data->set_source_composition($id_source, $morceau["id"])){
242               $env->erreur("La piste a été ajoutée mais impossible de l'associer au morceau");
243               return;
244             }
245           }
246           $env->redirect(
247             $env->url("users/pistes"),
248             "la piste a été ajoutée"
249           );
250         }
251       }
252       $env->set_out("groupes", $groupes);
253       $env->set_out("morceaux", $morceaux);
254       $env->set_out("licences", $licences);
255       $env->set_out("piste", $piste);
256       $env->set_out("source_infos", $source_infos);
257       $env->set_out("groupe", $groupe);
258       $env->set_out("morceau", $morceau);
259     }
260
261     function edit(){
262       $env = $this->env();
263       $data = $env->data();
264       if(($groupes = $data->groupes($this->user["id"])) === false){
265         $env->erreur("Impossible de lire la liste des groupes");
266         return;
267       }
268       if(($licences = $data->licences()) === false){
269         $env->erreur("Impossible de lire la liste des licences");
270         return;
271       }
272       if(($sources_access = $data->sources_access()) === false){
273         $env->erreur("Impossible de lire les types d'access");
274         return;
275       }
276       if(!($piste = $data->source($_GET[$env->param("id")], true))){
277         $env->erreur("Impossible de lire les informations de la piste");
278         return;
279       }
280       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
281       if(!$piste["permissions"]["editeur"]){
282         $env->erreur("vous n'avez pas la permission d'editer cette piste");
283         return;
284       }
285       if(
286         (
287           $morceaux = $data->groupes_sources(
288             array(
289               "groupes" => $piste["groupes"],
290               "id_class" => $this->morceau_status_id,
291               // on veut les morceaux pour lesquels chaque groupe du morceau ...
292               "satisfy_all_groupes_access" => true,
293               // ... a le droit de contribution
294               "id_source_access" => $data->id_groupe_status_contributeur()
295             )
296           )
297         ) === false
298       ) return "impossible de lire la liste des morceaux";
299       if(!$data->check_user_uploads_dir()){
300         $env->erreur("Impossible de creer le repertoire utilisateur");
301         return;
302       }
303       $web_path = $env->path("web");
304       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
305       if(($compositions = $data->source_compositions(array("id_source" => $piste["id"]))) === false){
306         $env->erreur("Impossible de lire la liste des compositions");
307         return;
308       }
309       if($compositions) foreach($compositions[$piste["id"]] as $id_morceau) { $piste["morceau"] = $id_morceau; break; }
310       if($_POST){
311         $source_infos = array(
312           "date_inscription" => $_POST["date_inscription"],
313           "ordre" => isset($piste["ordre"]) ? $piste["ordre"] : 0
314         );
315         $piste = $data->empty_source(
316           array(
317             "id" => $piste["id"],
318             "groupes" => $piste["groupes"]
319           )
320         );
321         $users_sources_mod = $env->get_controller("users/sources");
322         if($_POST["morceau"]){
323           if($morceau = $data->source($_POST["morceau"], true)){
324             $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
325             if(!$morceau["permissions"]["contributeur"]){
326               $env->erreur("vous n'avez pas la permission d'ajouter une  piste dans ce morceau");
327               return;
328             }
329           }
330           else{
331             $env->erreur("Impossible de lire les informations du morceau");
332             return;
333           }
334           $piste["morceau"] = $morceau["id"];
335         }
336         if(isset($_POST["is_derivation"])){
337           foreach($_POST as $key => $value){
338             if(substr($key, 0, 14) == "derivation_id_"){
339               $id_source_derivation = substr($key, 14);
340               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
341               $piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
342                 $env,
343                 $xml_url,
344                 (
345                   $_POST["use_edit_derivation_content_".$id_source_derivation] ?
346                     $_POST["edit_derivation_content_".$id_source_derivation]
347                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
348                 ),
349                 $_POST["use_edit_derivation_content_".$id_source_derivation] ? true : false
350               );
351             }
352           }
353         }
354         if(isset($_POST["is_reference"])){
355           $xml_url = trim($_POST["reference"]);
356           $piste["reference"] = $users_sources_mod->get_source_from_xml(
357             $env,
358             $xml_url,
359             (
360               $_POST["use_edit_reference_content"] ?
361                 $_POST["edit_reference_content"]
362               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
363             ),
364             $_POST["use_edit_reference_content"] ? true : false
365           );
366         }
367         else{
368           if(!($piste["titre"] = trim($_POST["titre"]))){
369             $env->message("merci de pr&eacute;ciser un titre pour la piste");
370           }
371           $piste["licence"] = array(
372             "id" => $_POST["licence"]
373           );
374           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
375           $source_infos["description"] = $_POST["description"];
376           foreach($_POST as $post_key => $post_value){
377             if(substr($post_key, 0, 13) == "document_nom_"){
378               if($id_document = substr($post_key, 13)){
379                 $piste["documents"][$id_document] = array(
380                   "nom" => $_POST["document_nom_".$id_document],
381                   "url" => $_POST["document_url_".$id_document]
382                 );
383               }
384             }
385           }
386         }
387         if(!$env->messages()){
388           if(
389             (
390               $data->set_source(
391                 $piste["id"],
392                 $piste["groupes"],
393                 $piste["titre"],
394                 $this->piste_status_id,
395                 $piste["licence"]["id"],
396                 $piste["documents"],
397                 $piste["reference"],
398                 $piste["derivations"],
399                 $source_infos
400               )
401             ) === false
402           ){
403             $env->erreur("Impossible de modifier la piste");
404             return;
405           }
406           if(!$data->del_source_compositions(array("id_source" => $piste["id"]))){
407             $env->erreur("La piste a été modifiée mais impossible de l'associer à ce morceau");
408             return;
409           }
410           if($_POST["morceau"]){
411             if(!$data->set_source_composition($piste["id"], $_POST["morceau"])){
412               $env->erreur("La piste a été modifiée mais impossible de l'associer à ce morceau");
413               return;
414             }
415           }
416           $env->redirect(
417             $env->url("users/pistes/edit", array("id" => $piste["id"])),
418             "la piste a été modifiée"
419           );
420         }
421       }
422       $env->set_out("groupes", $groupes);
423       $env->set_out("sources_access", $sources_access);
424       $env->set_out("licences", $licences);
425       $env->set_out("morceaux", $morceaux);
426       $env->set_out("piste", $piste);
427     }
428
429     function maj_xml(){
430       $data = $env->data();
431       if(!($piste = $data->source($_GET[$env->param("id")], true))){
432         $env->erreur("Impossible de lire les informations de la piste");
433         return;
434       }
435       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
436       if(!$piste["permissions"]["editeur"]){
437         $env->erreur("vous n'avez pas la permission d'editer cette piste");
438         return;
439       }
440       if
441       (    isset($_GET[$env->param("id")])
442         && isset($_GET[$env->param("xml")])
443         && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
444       ){
445         $env->erreur("parametre de fichier xml manquant");
446         return;
447       }
448       $xml_url = "";
449       if($_GET[$env->param("xml")] == "derivation"){
450         if(isset($piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
451         $xml_url = $piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
452       }
453       elseif($_GET[$env->param("xml")] == "reference"){
454         if(isset($piste["reference"]["xml"]["url"]))
455         $xml_url = $piste["reference"]["xml"]["url"];
456       }
457       if(!$xml_url){
458         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
459         return;
460       }
461       if(!$env->messages()){
462         if(($res = $data->maj_source_cache($xml_url)) === false){
463           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
464           return;
465         }
466         if($res === true){
467           if($piste = $data->source($piste["id"])){
468             $env->redirect(
469               $env->url("users/pistes/edit", array("id" => $piste["id"])),
470               "Les informations du fichier XML ont été mises à jour",
471               2
472             );
473           }
474           else{
475             $env->erreur(
476              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
477             .", mais impossible de lire les informations de la piste"
478             );
479           }
480           return;
481         }
482         switch($res){
483           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
484           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
485           default: $env->erreur("Erreur inconnue (?)"); return;
486         }
487       }
488       $env->run("users/pistes/edit", array("get" => array("id" => $piste["id"])));
489     }
490
491     function del(){
492       $env = $this->env();
493       $data = $env->data();
494       if(!($piste = $data->source($_GET[$env->param("id")], true))){
495         $env->erreur("Impossible de lire les informations de la piste");
496         return;
497       }
498       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
499       if(!$piste["permissions"]["admin"]){
500         $env->erreur("vous n'avez pas la permission d'effacer cette piste");
501         return;
502       }
503       if(!$data->del_source($piste["id"])){
504         $env->erreur("Impossible de supprimer la piste");
505         return;
506       }
507       $env->redirect(
508         $env->url("users/pistes"),
509         "la piste a été supprimée"
510       );
511     }
512
513   }
514
515 ?>