c1a70dfbfffa69b74ba2f22ef41b82e37b5c22f2
[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       $upload_dir = $env->path("content")."uploads/".$this->user["id"];
151       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
152       $users_sources_mod = $env->get_controller("users/sources");
153       if(isset($_POST["button_derive"])){
154         if(
155               ($origin_source_id = $_POST["button_derive"])
156           &&  ($origin_source_xml_url = $data->source_xml_url($origin_source_id))
157           &&  ($origin_source_xml_content = $data->get_source_xml($origin_source_id))
158         ){
159           $piste["derivations"][$origin_source_id] = $users_sources_mod->get_source_from_xml(
160             $env,
161             $origin_source_xml_url,
162             $origin_source_xml_content,
163             true
164           );
165         }
166       }
167       elseif($_POST){
168         if(!($groupe = $data->groupe($_POST["id_groupe"]))){
169           $env->erreur("Impossible de lire les informations du groupe");
170           return;
171         }
172         $groupe["id_groupe_status"] = $data->id_groupe_status_admin();
173         $piste["groupes"] = array($groupe["id"] => $groupe);
174         if($_POST["morceau"]){
175           if(!($morceau = $data->source($_POST["morceau"], true))){
176             $env->erreur("Impossible de lire les informations du morceau");
177             return;
178           }
179           $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
180           if(!$morceau["permissions"]["contributeur"]){
181             $env->erreur("vous n'avez pas la permission d'ajouter une piste dans ce morceau");
182             return;
183           }
184           $piste["morceau"] = $morceau["id"];
185         }
186         if(isset($_POST["is_derivation"])){
187           foreach($_POST as $key => $value){
188             if(substr($key, 0, 14) == "derivation_id_"){
189               $id_source_derivation = substr($key, 14);
190               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
191               $piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
192                 $env,
193                 $xml_url,
194                 (
195                   isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ?
196                     $_POST["edit_derivation_content_".$id_source_derivation]
197                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
198                 ),
199                 isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ? true : false
200               );
201             }
202           }
203         }
204         if(isset($_POST["is_reference"])){
205           $xml_url = trim($_POST["reference"]);
206           $piste["reference"] = $users_sources_mod->get_source_from_xml(
207             $env,
208             $xml_url,
209             (
210               isset($_POST["use_edit_reference_content"]) ?
211                 $_POST["edit_reference_content"]
212               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
213             ),
214             isset($_POST["use_edit_reference_content"]) ? true : false
215           );
216         }
217         else{
218           if(!($piste["titre"] = trim($_POST["titre"]))){
219             $env->message("merci de pr&eacute;ciser un titre pour la piste");
220           }
221           $piste["licence"] = array(
222             "id" => $_POST["licence"]
223           );
224           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
225           $source_infos["description"] = $_POST["description"];
226           foreach($_POST as $post_key => $post_value){
227             if(substr($post_key, 0, 13) == "document_nom_"){
228               if($id_document = substr($post_key, 13)){
229                 $piste["documents"][$id_document] = array(
230                   "nom" => $_POST["document_nom_".$id_document],
231                   "url" => $_POST["document_url_".$id_document]
232                 );
233               }
234             }
235           }
236         }
237         if(!$env->messages()){
238           if(($image = $data->upload("image", $upload_dir)) === false){
239             $env->erreur("erreur lors de l'envoi de l'image. la piste n'a pas été ajoutée");
240             return;
241           }
242           if($image) $source_infos["image"] = $this->user["id"]."/".$image;
243           if(
244             (
245               $id_source = $data->add_source(
246                 $piste["groupes"],
247                 $piste["titre"],
248                 $this->piste_status_id,
249                 $piste["licence"]["id"],
250                 $piste["documents"],
251                 $piste["reference"],
252                 $piste["derivations"],
253                 $source_infos
254               )
255             ) === false
256           ){
257             $env->erreur("Impossible d'ajouter la piste");
258             return;
259           }
260           if($morceau){
261             if(!$data->set_source_composition($id_source, $morceau["id"])){
262               $env->erreur("La piste a été ajoutée mais impossible de l'associer au morceau");
263               return;
264             }
265           }
266           $env->redirect(
267             $env->url("users/pistes"),
268             "la piste a été ajoutée"
269           );
270         }
271       }
272       $env->set_out("groupes", $groupes);
273       $env->set_out("morceaux", $morceaux);
274       $env->set_out("licences", $licences);
275       $env->set_out("piste", $piste);
276       $env->set_out("source_infos", $source_infos);
277       $env->set_out("groupe", $groupe);
278       $env->set_out("morceau", $morceau);
279     }
280
281     function edit(){
282       $env = $this->env();
283       $data = $env->data();
284       if(($groupes = $data->groupes($this->user["id"])) === false){
285         $env->erreur("Impossible de lire la liste des groupes");
286         return;
287       }
288       if(($licences = $data->licences()) === false){
289         $env->erreur("Impossible de lire la liste des licences");
290         return;
291       }
292       if(($sources_access = $data->sources_access()) === false){
293         $env->erreur("Impossible de lire les types d'access");
294         return;
295       }
296       if(!($piste = $data->source($_GET[$env->param("id")], true))){
297         $env->erreur("Impossible de lire les informations de la piste");
298         return;
299       }
300       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
301       if(!$piste["permissions"]["editeur"]){
302         $env->erreur("vous n'avez pas la permission d'editer cette piste");
303         return;
304       }
305       if(
306         (
307           $morceaux = $data->groupes_sources(
308             array(
309               "groupes" => $piste["groupes"],
310               "id_class" => $this->morceau_status_id,
311               // on veut les morceaux pour lesquels chaque groupe du morceau ...
312               "satisfy_all_groupes_access" => true,
313               // ... a le droit de contribution
314               "id_source_access" => $data->id_groupe_status_contributeur()
315             )
316           )
317         ) === false
318       ) return "impossible de lire la liste des morceaux";
319       if(!$data->check_user_uploads_dir()){
320         $env->erreur("Impossible de creer le repertoire utilisateur");
321         return;
322       }
323       $web_path = $env->path("web");
324       $upload_dir = $env->path("content")."uploads/".$this->user["id"];
325       $_SESSION["upload_dir"] = $web_path.($web_path ? "" : "/").$env->path("content")."uploads/".$this->user["id"];
326       if(($compositions = $data->source_compositions(array("id_source" => $piste["id"]))) === false){
327         $env->erreur("Impossible de lire la liste des compositions");
328         return;
329       }
330       if($compositions) foreach($compositions[$piste["id"]] as $id_morceau) { $piste["morceau"] = $id_morceau; break; }
331       if($_POST){
332         $source_infos = array(
333           "date_inscription" => $_POST["date_inscription"],
334           "ordre" => isset($piste["ordre"]) ? $piste["ordre"] : 0
335         );
336         $piste = $data->empty_source(
337           array(
338             "id" => $piste["id"],
339             "groupes" => $piste["groupes"],
340             "image" => isset($piste["image"]) ? $piste["image"] : ""
341           )
342         );
343         $users_sources_mod = $env->get_controller("users/sources");
344         if($_POST["morceau"]){
345           if($morceau = $data->source($_POST["morceau"], true)){
346             $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
347             if(!$morceau["permissions"]["contributeur"]){
348               $env->erreur("vous n'avez pas la permission d'ajouter une  piste dans ce morceau");
349               return;
350             }
351           }
352           else{
353             $env->erreur("Impossible de lire les informations du morceau");
354             return;
355           }
356           $piste["morceau"] = $morceau["id"];
357         }
358         if(isset($_POST["is_derivation"])){
359           foreach($_POST as $key => $value){
360             if(substr($key, 0, 14) == "derivation_id_"){
361               $id_source_derivation = substr($key, 14);
362               $xml_url = trim($_POST["derivation_".$id_source_derivation]);
363               $piste["derivations"][$id_source_derivation] = $users_sources_mod->get_source_from_xml(
364                 $env,
365                 $xml_url,
366                 (
367                   isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ?
368                     $_POST["edit_derivation_content_".$id_source_derivation]
369                   : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
370                 ),
371                 isset($_POST["use_edit_derivation_content_".$id_source_derivation]) ? true : false
372               );
373             }
374           }
375         }
376         if(isset($_POST["is_reference"])){
377           $xml_url = trim($_POST["reference"]);
378           $piste["reference"] = $users_sources_mod->get_source_from_xml(
379             $env,
380             $xml_url,
381             (
382               isset($_POST["use_edit_reference_content"]) ?
383                 $_POST["edit_reference_content"]
384               : ($xml_url ? $data->get_source_xml_from_url($xml_url) : "")
385             ),
386             isset($_POST["use_edit_reference_content"]) ? true : false
387           );
388         }
389         else{
390           if(!($piste["titre"] = trim($_POST["titre"]))){
391             $env->message("merci de pr&eacute;ciser un titre pour la piste");
392           }
393           $piste["licence"] = array(
394             "id" => $_POST["licence"]
395           );
396           $source_infos["date_creation"] = $_POST["annee_date_creation"]."-".$_POST["mois_date_creation"]."-".$_POST["jour_date_creation"];
397           $source_infos["description"] = $_POST["description"];
398           foreach($_POST as $post_key => $post_value){
399             if(substr($post_key, 0, 13) == "document_nom_"){
400               if($id_document = substr($post_key, 13)){
401                 $piste["documents"][$id_document] = array(
402                   "nom" => $_POST["document_nom_".$id_document],
403                   "url" => $_POST["document_url_".$id_document]
404                 );
405               }
406             }
407           }
408         }
409         if(!$env->messages()){
410           if(isset($_POST["del_image"])){
411             if($piste["image"]){
412               if(!@unlink($env->path("content")."uploads/".$piste["image"])){
413                 $env->erreur("Impossible d'effacer l'image de la piste");
414                 return;
415               }
416             }
417             $piste["image"] = "";
418           }
419           else{
420             if(($up_image = $data->upload("image", $upload_dir)) === false){
421               $env->erreur("Impossible d'uploader l'image");
422               return;
423             }
424             if($up_image) $piste["image"] = $this->user["id"]."/".$up_image;
425           }
426           if($piste["image"]) $source_infos["image"] = $piste["image"];
427           if(
428             (
429               $data->set_source(
430                 $piste["id"],
431                 $piste["groupes"],
432                 $piste["titre"],
433                 $this->piste_status_id,
434                 $piste["licence"]["id"],
435                 $piste["documents"],
436                 $piste["reference"],
437                 $piste["derivations"],
438                 $source_infos
439               )
440             ) === false
441           ){
442             $env->erreur("Impossible de modifier la piste");
443             return;
444           }
445           if(!$data->del_source_compositions(array("id_source" => $piste["id"]))){
446             $env->erreur("La piste a été modifiée mais impossible de l'associer à ce morceau");
447             return;
448           }
449           if($_POST["morceau"]){
450             if(!$data->set_source_composition($piste["id"], $_POST["morceau"])){
451               $env->erreur("La piste a été modifiée mais impossible de l'associer à ce morceau");
452               return;
453             }
454           }
455           $env->redirect(
456             $env->url("users/pistes/edit", array("id" => $piste["id"])),
457             "la piste a été modifiée"
458           );
459         }
460       }
461       $env->set_out("groupes", $groupes);
462       $env->set_out("sources_access", $sources_access);
463       $env->set_out("licences", $licences);
464       $env->set_out("morceaux", $morceaux);
465       $env->set_out("piste", $piste);
466     }
467
468     function maj_xml(){
469       $data = $env->data();
470       if(!($piste = $data->source($_GET[$env->param("id")], true))){
471         $env->erreur("Impossible de lire les informations de la piste");
472         return;
473       }
474       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
475       if(!$piste["permissions"]["editeur"]){
476         $env->erreur("vous n'avez pas la permission d'editer cette piste");
477         return;
478       }
479       if
480       (    isset($_GET[$env->param("id")])
481         && isset($_GET[$env->param("xml")])
482         && ($_GET[$env->param("xml")] == "derviation" ? isset($_GET[$env->param("derivation")]) : true)
483       ){
484         $env->erreur("parametre de fichier xml manquant");
485         return;
486       }
487       $xml_url = "";
488       if($_GET[$env->param("xml")] == "derivation"){
489         if(isset($piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"]))
490         $xml_url = $piste["derivations"][$_GET[$env->param("derivation")]]["xml"]["url"];
491       }
492       elseif($_GET[$env->param("xml")] == "reference"){
493         if(isset($piste["reference"]["xml"]["url"]))
494         $xml_url = $piste["reference"]["xml"]["url"];
495       }
496       if(!$xml_url){
497         $env->message("Pas d'URL pour ce fichier XML. Impossible de recharger les informations");
498         return;
499       }
500       if(!$env->messages()){
501         if(($res = $data->maj_source_cache($xml_url)) === false){
502           $env->erreur("Impossible de mettre à jour le contenu du fichier XML dans le cache");
503           return;
504         }
505         if($res === true){
506           if($piste = $data->source($piste["id"])){
507             $env->redirect(
508               $env->url("users/pistes/edit", array("id" => $piste["id"])),
509               "Les informations du fichier XML ont été mises à jour",
510               2
511             );
512           }
513           else{
514             $env->erreur(
515              "le contenu du fichier XML a &eacute;t&eacute; mis &agrave; jour"
516             .", mais impossible de lire les informations de la piste"
517             );
518           }
519           return;
520         }
521         switch($res){
522           case -1: $env->message("Impossible de lire le contenu du fichier XML"); break;
523           case -2: $env->message("Le fichier XML indiqu&eacute; ne contient pas un fichier de source valide"); break;
524           default: $env->erreur("Erreur inconnue (?)"); return;
525         }
526       }
527       $env->run("users/pistes/edit", array("get" => array("id" => $piste["id"])));
528     }
529
530     function del(){
531       $env = $this->env();
532       $data = $env->data();
533       if(!($piste = $data->source($_GET[$env->param("id")], true))){
534         $env->erreur("Impossible de lire les informations de la piste");
535         return;
536       }
537       $piste["permissions"] = $data->source_permissions($piste, $this->user["id"]);
538       if(!$piste["permissions"]["admin"]){
539         $env->erreur("vous n'avez pas la permission d'effacer cette piste");
540         return;
541       }
542       if(!$data->del_source($piste["id"])){
543         $env->erreur("Impossible de supprimer la piste");
544         return;
545       }
546       $env->redirect(
547         $env->url("users/pistes"),
548         "la piste a été supprimée"
549       );
550     }
551
552     function groupes(){
553       $env = $this->env();
554       if(
555             !($sources_invitations_controller = $env->get_controller("users/sources_invitations"))
556         ||  !$sources_invitations_controller->validate()
557       ){
558         $env->erreur("impossible de valider le controleur users/sources_invitations");
559         return;
560       }
561       $sources_invitations_controller->source_groupes();
562     }
563
564   }
565
566 ?>