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