invitations pour acces aux sources (suite)
[mw_sourceml] / app / controllers / users / sources_invitations.php
1 <?php
2
3   class mw_users_sources_invitations 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(!isset($this->album_status_id) || !isset($this->morceau_status_id) || !isset($this->album_status_id)){
25         $inconnus = "";
26         if(!isset($this->album_status_id)) $inconnus .= ($inconnus ? ", " : "")."album";
27         if(!isset($this->morceau_status_id)) $inconnus .= ($inconnus ? ", " : "")."morceau";
28         if(!isset($this->piste_status_id)) $inconnus .= ($inconnus ? ", " : "")."piste";
29         return "Types de source inconnu: ".$inconnus;
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(($sources_access = $data->sources_access()) === false){
41         $env->erreur("Impossible de lire les types d'access");
42         return;
43       }
44       if(($groupes = $data->groupes($this->user["id"])) === false){
45         $env->erreur("Impossible de lire la liste des groupes");
46         return;
47       }
48       $groupes_in = "";
49       foreach($groupes["list"] as $id_groupe => $groupe) $groupes_in .= ($groupes_in ? "," : "").$id_groupe;
50       $invitations = array("list" => array(), "total" => 0);
51       if($groupes_in){
52         if(
53           (
54             $invitations = $data->list_sml_sources_invitations(
55               array(
56                 "index_name" => "id",
57                 "where"=> "id_author IN(".$groupes_in.") OR id_user=".$this->user["id"],
58                 "order_by" => "date_invitation",
59                 "order" => "DESC"
60               )
61             )
62           ) === false
63         ){
64           $env->erreur("Impossible de lire la liste des invitations");
65           return;
66         }
67       }
68       foreach($invitations["list"] as $id_invitation => $invitation){
69         if(!($user = $data->user_by_id($invitation["id_user"]))){
70           $env->erreur("impossible de lire les informations de l'utilisateur pour une invitation");
71           return;
72         }
73         $invitations["list"][$id_invitation]["user"] = $user;
74         if(!($source = $data->source($invitation["id_source"]))){
75           $env->erreur("impossible de lire les informations de la source pour une invitation");
76           return;
77         }
78         $invitations["list"][$id_invitation]["source"] = $source;
79       }
80       if(($groupes = $data->groupes()) === false){
81         $env->erreur("Impossible de lire la liste des groupes");
82         return;
83       }
84       $env->set_out("user", $this->user);
85       $env->set_out("groupes", $groupes);
86       $env->set_out("sources_access", $sources_access);
87       $env->set_out("invitations", $invitations);
88       $env->set_out("status", $this->status);
89     }
90
91     function source_groupes(){
92       $env = $this->env();
93       $data = $env->data();
94       if(!($source = $data->source($_GET[$env->param("id")], true))){
95         $env->erreur("Impossible de lire les informations de la source");
96         return;
97       }
98       $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
99       if(!$source["permissions"]["admin"]){
100         $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
101         return;
102       }
103       if(($sources_access = $data->sources_access()) === false){
104         $env->erreur("Impossible de lire les types d'access");
105         return;
106       }
107       if(($groupes = $data->groupes()) === false){
108         $env->erreur("Impossible de lire la liste des groupes");
109         return;
110       }
111       if(($invitations = $data->list_sml_sources_invitations(array("index_name" => "id", "where"=> "id_source=".$source["id"]))) === false){
112         $env->erreur("Impossible de lire la liste des invitations pour cette source");
113         return;
114       }
115       foreach($invitations["list"] as $id_invitation => $invitation){
116         if(isset($groupes["list"][$invitation["id_author"]])){
117           $invitations["list"][$id_invitation]["author"] = $groupes["list"][$invitation["id_author"]];
118           unset($groupes["list"][$invitation["id_author"]]);
119           $groupes["total"]--;
120         }
121       }
122       foreach($source["groupes"] as $id_groupe => $groupe){
123         if(isset($groupes["list"][$id_groupe])){
124           unset($groupes["list"][$id_groupe]);
125           $groupes["total"]--;
126         }
127       }
128       $env->set_out("groupes", $groupes);
129       $env->set_out("sources_access", $sources_access);
130       $env->set_out("source", $source);
131       $env->set_out("invitations", $invitations);
132     }
133
134     function invite_groupe(){
135       $env = $this->env();
136       $data = $env->data();
137       if(!($source = $data->source($_GET[$env->param("id")], true))){
138         $env->erreur("Impossible de lire les informations de la source");
139         return;
140       }
141       $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
142       if(!$source["permissions"]["admin"]){
143         $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
144         return;
145       }
146       if(($sources_access = $data->sources_access()) === false){
147         $env->erreur("Impossible de lire les types d'access");
148         return;
149       }
150       if(!($groupe = $data->groupe($_POST["id_groupe"]))){
151         $env->erreur("impossible de lire les informations du groupe");
152       }
153       if(!$_POST["id_sources_access"] || !isset($sources_access[$_POST["id_sources_access"]])){
154         $env->erreur("identifiant d'access de source incorrect");
155       }
156       if(
157         !$data->add_sml_sources_invitations(
158           array(
159             "id_user" => $this->user["id"],
160             "id_source" => $source["id"],
161             "id_author" => $groupe["id"],
162             "id_sources_access" => $_POST["id_sources_access"],
163             "date_invitation" => date("Y-m-d H:i:s")
164           )
165         )
166       ){
167         $env->erreur("Impossible d'ajouter l'invitation");
168         return;
169       }
170       $env->redirect(
171         $env->url("users/sources_invitations"),
172         "l'invitation a été ajoutée"
173       );
174     }
175
176     function annule_invitation_groupe(){
177       $env = $this->env();
178       $data = $env->data();
179       if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
180         $env->erreur("Impossible de lire les informations de l'invitation");
181         return;
182       }
183       if(!($morceau = $data->source($invitation["id_source"], true))){
184         $env->erreur("Impossible de lire les informations du morceau");
185         return;
186       }
187       $morceau["permissions"] = $data->source_permissions($morceau, $this->user["id"]);
188       if(!$morceau["permissions"]["admin"]){
189         $env->erreur("vous n'avez pas la permission d'editer les groupes du morceau");
190         return;
191       }
192       if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
193         $env->erreur("Impossible d'annuler l'invitation");
194         return;
195       }
196       $env->redirect(
197         $env->url("users/sources_invitations"),
198         "l'invitation a été annulée"
199       );
200     }
201
202     function accepter_invitation_groupe(){
203       $env = $this->env();
204       $data = $env->data();
205       if(($groupes = $data->groupes($this->user["id"])) === false){
206         $env->erreur("Impossible de lire la liste des groupes");
207         return;
208       }
209       if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
210         $env->erreur("Impossible de lire les informations de l'invitation");
211         return;
212       }
213       if(!($source = $data->source($invitation["id_source"], true))){
214         $env->erreur("Impossible de lire les informations de la source pour cette invitation");
215         return;
216       }
217       if(!isset($groupes["list"][$invitation["id_author"]])){
218         $env->erreur("l'invitation s'adresse a un groupe qui n'appartient pas à votre utilisateur");
219         return;
220       }
221       $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
222       if($source["permissions"]["contributeur"]){
223         $env->erreur("vous avez déjà accès à cette source");
224         return;
225       }
226       if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
227         $env->erreur("Impossible d'effacer l'invitation");
228         return;
229       }
230       if(!$data->add_source_groupe($source["id"], $invitation["id_author"], $invitation["id_sources_access"])){
231         $env->erreur("Impossible de vous ajouter des droits sur la source");
232         return;
233       }
234       $env->redirect(
235         $env->url("users/sources_invitations"),
236         "l'invitation a été acceptée"
237       );
238     }
239
240     function refuser_invitation_groupe(){
241       $env = $this->env();
242       $data = $env->data();
243       if(($groupes = $data->groupes($this->user["id"])) === false){
244         $env->erreur("Impossible de lire la liste des groupes");
245         return;
246       }
247       if(!($invitation = $data->get_sml_sources_invitations("id", $_GET[$env->param("id")]))){
248         $env->erreur("Impossible de lire les informations de l'invitation");
249         return;
250       }
251       if(!($source = $data->source($invitation["id_source"], true))){
252         $env->erreur("Impossible de lire les informations de la source pour cette invitation");
253         return;
254       }
255       if(!isset($groupes["list"][$invitation["id_author"]])){
256         $env->erreur("l'invitation s'adresse a un groupe qui n'appartient pas à votre utilisateur");
257         return;
258       }
259       if(!$data->del_sml_sources_invitations("id", $invitation["id"])){
260         $env->erreur("Impossible d'effacer l'invitation");
261         return;
262       }
263       $env->redirect(
264         $env->url("users/sources_invitations"),
265         "l'invitation a été refusée"
266       );
267     }
268
269     function del_groupe(){
270       $env = $this->env();
271       $data = $env->data();
272       if(!($source = $data->source($_GET[$env->param("id")], true))){
273         $env->erreur("Impossible de lire les informations de la source");
274         return;
275       }
276       $source["permissions"] = $data->source_permissions($source, $this->user["id"]);
277       if(!$source["permissions"]["admin"]){
278         $env->erreur("vous n'avez pas la permission d'editer les groupes de la source");
279         return;
280       }
281       $source_class = $this->status[$source["status"]]["nom"];
282       if($source_class == "album"){
283         $redirect = $env->url("users/albums/groupes", array("id" => $source["id"]));
284       }
285       elseif($source_class == "morceau"){
286         $redirect = $env->url("users/morceaux/groupes", array("id" => $source["id"]));
287       }
288       elseif($source_class == "piste"){
289         $redirect = $env->url("users/pistes/groupes", array("id" => $source["id"]));
290       }
291       else{
292         $env->erreur("type de source inconnu");
293         return;
294       }
295       if(!($groupe = $data->groupe($_GET[$env->param("groupe")]))){
296         $env->erreur("impossible de lire les informations du groupe");
297         return;
298       }
299       $ID_UNIQUE_ADMIN = false;
300       foreach($source["groupes"] as $id_groupe => $source_groupe){
301         if($source_groupe["id_groupe_status"] == $data->id_groupe_status_admin()){
302           if(!$ID_UNIQUE_ADMIN) $ID_UNIQUE_ADMIN = $id_groupe;
303           else{
304             $ID_UNIQUE_ADMIN = true;
305             break;
306           }
307         }
308       }
309       if(!$ID_UNIQUE_ADMIN){
310         $env->erreur("aucun administrateur sur cette source");
311         return;
312       }
313       if($ID_UNIQUE_ADMIN !== true){
314         if($groupe["id"] == $ID_UNIQUE_ADMIN){
315           $env->erreur("vous ne pouvez pas enlever l'unique administrateur");
316           return;
317         }
318       }
319       if(!$data->del_source_groupe($source["id"], $groupe["id"])){
320         $env->erreur("Impossible d'enlever le groupe");
321         return;
322       }
323       $env->redirect(
324         $redirect,
325         "le groupe a été enlevé"
326       );
327     }
328
329   }
330
331 ?>