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