Browse Source

Evolution #567: Pouvoir exclure des partages de son groupe

Sevajol Bastien 12 years ago
parent
commit
a976f9291a

+ 7 - 0
app/Resources/translations/elements.fr.yml View File

@@ -32,6 +32,13 @@ element:
32 32
       sentence:         Vraiment supprimer ?
33 33
       yes:              Oui
34 34
       no:               Non
35
+  group:
36
+    remove_from:
37
+      title:            Retirer du groupe %group_name%
38
+      confirm:
39
+        title:          Retirer du groupe ?
40
+        yes:            Oui
41
+        no:             Non
35 42
   tag:
36 43
     addtofav:
37 44
       title:            Ajouter a vos tags favoris

+ 25 - 0
src/Muzich/CoreBundle/Controller/ElementController.php View File

@@ -1167,4 +1167,29 @@ class ElementController extends Controller
1167 1167
     ));
1168 1168
   }
1169 1169
   
1170
+  public function removeFromGroupAction($group_id, $element_id, $token)
1171
+  {
1172
+    if (!($group = $this->getDoctrine()->getRepository('MuzichCoreBundle:Group')
1173
+      ->findOneById($group_id))
1174
+        || !($element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
1175
+      ->findOneById($element_id)))
1176
+    {
1177
+      return $this->jsonNotFoundResponse();
1178
+    }
1179
+    
1180
+    if ($token != $this->getUser()->getPersonalHash('remove_from_group_'.$element->getId())
1181
+      || $group->getOwner()->getId() != $this->getUserId())
1182
+    {
1183
+      return $this->jsonNotFoundResponse();
1184
+    }
1185
+    
1186
+    $element->setGroup(null);
1187
+    $this->persist($element);
1188
+    $this->flush();
1189
+    
1190
+    return $this->jsonResponse(array(
1191
+      'status' => 'success'
1192
+    ));
1193
+  }
1194
+  
1170 1195
 }

+ 4 - 0
src/Muzich/CoreBundle/Resources/config/routing.yml View File

@@ -104,6 +104,10 @@ element_new_get:
104 104
   pattern: /ajax/element/new/get/{refid}
105 105
   defaults: { _controller: MuzichCoreBundle:Element:getNews, refid: null }
106 106
   
107
+element_remove_from_group:
108
+  pattern: /ajax/group/{group_id}/remove-element/{element_id}/{token}
109
+  defaults: { _controller: MuzichCoreBundle:Element:removeFromGroup }
110
+  
107 111
 ##
108 112
 
109 113
 ajax_tag_add_to_favorites:

+ 33 - 2
src/Muzich/CoreBundle/Resources/public/js/muzich.js View File

@@ -11,7 +11,7 @@ var myMessages = ['info','warning','error','success']; // define the messages ty
11 11
 function hideAllMessages()
12 12
 {
13 13
   var messagesHeights = new Array(); // this array will store height for each
14
-	 
14
+  
15 15
  for (i=0; i<myMessages.length; i++)
16 16
  {
17 17
     messagesHeights[i] = $('.' + myMessages[i]).outerHeight();
@@ -639,7 +639,7 @@ $(document).ready(function(){
639 639
     
640 640
   }); 
641 641
   
642
- // Suppression d'un element
642
+  // Suppression d'un element
643 643
   $('a.element_remove_link').jConfirmAction({
644 644
     question : string_element_delete_confirm_sentence, 
645 645
     yesAnswer : string_element_delete_confirm_yes, 
@@ -678,6 +678,37 @@ $(document).ready(function(){
678 678
       li.find('a.element_edit_link').hide();
679 679
       li.find('a.element_remove_link').hide();
680 680
     }
681
+    
682
+    
683
+  });
684
+  
685
+  // Retrait d'un element d'un groupe
686
+  $('a.element_remove_from_group_link').jConfirmAction({
687
+    question : string_removefromgroup_sentence, 
688
+    yesAnswer : string_removefromgroup_confirm_yes, 
689
+    cancelAnswer : string_removefromgroup_confirm_no,
690
+    onYes: function(link){
691
+      
692
+      var li = link.parents('li.element');
693
+      li.find('img.element_loader').show();
694
+      $.getJSON(link.attr('href'), function(response){
695
+        if (response.status == 'mustbeconnected')
696
+        {
697
+          $(location).attr('href', url_index);
698
+        }
699
+        
700
+        if (response.status == 'success')
701
+        {
702
+          li.remove();
703
+        }
704
+        else
705
+        {
706
+          li.find('img.element_loader').hide();
707
+        }
708
+      });
709
+
710
+      return false;
711
+    }
681 712
   });
682 713
 
683 714
  var elements_edited = new Array();

+ 3 - 0
src/Muzich/CoreBundle/Resources/views/Layout/head_js.html.twig View File

@@ -56,6 +56,9 @@
56 56
   {% autoescape false %}
57 57
   string_search_tag_title = "{{ 'search_tag.title'|trans({}, 'userui') }}";
58 58
   {% endautoescape %}
59
+  string_removefromgroup_sentence = "{{ 'element.group.remove_from.confirm.title'|trans({}, 'elements') }}";
60
+  string_removefromgroup_confirm_yes = "{{ 'element.group.remove_from.confirm.yes'|trans({}, 'elements') }}";
61
+  string_removefromgroup_confirm_no = "{{ 'element.group.remove_from.confirm.no'|trans({}, 'elements') }}";
59 62
 
60 63
   url_index = "{{ path('index') }}";
61 64
   url_search_tag = "{{ path('search_tag') }}";

+ 16 - 0
src/Muzich/CoreBundle/Resources/views/SearchElement/element.html.twig View File

@@ -7,6 +7,9 @@
7 7
 {% if display_comments is not defined %}
8 8
   {% set display_comments = true %}
9 9
 {% endif %}
10
+{% if his_group is not defined %}
11
+  {% set his_group = false %}
12
+{% endif %}
10 13
 
11 14
 <table>
12 15
   <tr>
@@ -152,6 +155,19 @@
152 155
 
153 156
         {% endif %}
154 157
         
158
+        {% if his_group %}
159
+          <li class="remove_from_group">
160
+            <a title="{{ 'element.group.remove_from.title'|trans({'%group_name%':group.name}, 'elements') }}"
161
+              class="element_remove_from_group_link"
162
+              href="{{ path('element_remove_from_group', {
163
+                 'element_id' : element.id,
164
+                 'group_id'   : group.id,
165
+                 'token'      : app.user.getPersonalHash('remove_from_group_'~element.id)
166
+              })  }}">
167
+              <img src="{{ asset('/img/1360779431_Remove_gray.png') }}" alt="remove from group" />
168
+            </a>
169
+          </li>
170
+        {% endif %}
155 171
       </ul>
156 172
       
157 173
       <span class="element_name">

+ 109 - 0
src/Muzich/CoreBundle/Tests/Controller/GroupControllerTest.php View File

@@ -231,4 +231,113 @@ class GroupControllerTest extends FunctionalTest
231 231
     $this->exist('h1:contains("Les Fans de Psytrance")');
232 232
   }
233 233
   
234
+  public function testRemoveElementFromGroup()
235
+  {
236
+    $this->client = self::createClient();
237
+    $this->connectUser('bob', 'toor');
238
+    
239
+    // Elements que l'on va retirer pour le test
240
+    $element_1 = $this->findOneBy('Element', 'Infected mushroom - Muse Breaks');
241
+    $element_2 = $this->findOneBy('Element', 'Infected Mushroom - Psycho');
242
+    $element_3 = $this->findOneBy('Element', 'DUDELDRUM'); 
243
+    $group_fdp = $this->findOneBy('Group', 'Fans de psytrance');
244
+    $group_dud = $this->findOneBy('Group', 'DUDELDRUM');
245
+    
246
+    $this->assertTrue(!is_null($element_1));
247
+    $this->assertTrue(!is_null($element_2));
248
+    $this->assertTrue(!is_null($element_3));
249
+    
250
+    $this->assertTrue(!is_null($element_1->getGroup()));
251
+    $this->assertTrue(!is_null($element_2->getGroup()));
252
+    $this->assertTrue(!is_null($element_3->getGroup()));
253
+    
254
+    $this->assertEquals($group_fdp->getName(), $element_1->getGroup()->getName());
255
+    $this->assertEquals($group_fdp->getName(), $element_2->getGroup()->getName());
256
+    $this->assertEquals($group_dud->getName(), $element_3->getGroup()->getName());
257
+    
258
+    // On retire le premier element
259
+    $this->crawler = $this->client->request(
260
+      'POST', 
261
+      $this->generateUrl('element_remove_from_group', array(
262
+        'group_id'   => $group_fdp->getId(),
263
+        'element_id' => $element_1->getId(),
264
+        'token'      => $this->getUser()->getPersonalHash('remove_from_group_'.$element_1->getId())
265
+      )), 
266
+      array(), 
267
+      array(), 
268
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
269
+    );
270
+    $this->isResponseSuccess();
271
+    $response = json_decode($this->client->getResponse()->getContent(), true);
272
+    $this->assertEquals($response['status'], 'success');
273
+    
274
+    $element_1 = $this->findOneBy('Element', 'Infected mushroom - Muse Breaks');
275
+    $element_2 = $this->findOneBy('Element', 'Infected Mushroom - Psycho');
276
+    $element_3 = $this->findOneBy('Element', 'DUDELDRUM'); 
277
+    
278
+    $this->assertTrue(!is_null($element_1));
279
+    $this->assertTrue(!is_null($element_2));
280
+    $this->assertTrue(!is_null($element_3));
281
+    
282
+    $this->assertTrue(is_null($element_1->getGroup()));
283
+    $this->assertTrue(!is_null($element_2->getGroup()));
284
+    $this->assertTrue(!is_null($element_3->getGroup()));
285
+    
286
+    // On retire le deuxieme element
287
+    $this->crawler = $this->client->request(
288
+      'POST', 
289
+      $this->generateUrl('element_remove_from_group', array(
290
+        'group_id'   => $group_fdp->getId(),
291
+        'element_id' => $element_2->getId(),
292
+        'token'      => $this->getUser()->getPersonalHash('remove_from_group_'.$element_2->getId())
293
+      )), 
294
+      array(), 
295
+      array(), 
296
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
297
+    );
298
+    $this->isResponseSuccess();
299
+    $response = json_decode($this->client->getResponse()->getContent(), true);
300
+    $this->assertEquals($response['status'], 'success');
301
+    
302
+    $element_1 = $this->findOneBy('Element', 'Infected mushroom - Muse Breaks');
303
+    $element_2 = $this->findOneBy('Element', 'Infected Mushroom - Psycho');
304
+    $element_3 = $this->findOneBy('Element', 'DUDELDRUM'); 
305
+    
306
+    $this->assertTrue(!is_null($element_1));
307
+    $this->assertTrue(!is_null($element_2));
308
+    $this->assertTrue(!is_null($element_3));
309
+    
310
+    $this->assertTrue(is_null($element_1->getGroup()));
311
+    $this->assertTrue(is_null($element_2->getGroup()));
312
+    $this->assertTrue(!is_null($element_3->getGroup()));
313
+    
314
+    // On va maintenant essayer d'enlever un element d'un autre groupe, ce ne sera pas possible
315
+    $this->crawler = $this->client->request(
316
+      'POST', 
317
+      $this->generateUrl('element_remove_from_group', array(
318
+        'group_id'   => $group_dud->getId(),
319
+        'element_id' => $element_3->getId(),
320
+        'token'      => $this->getUser()->getPersonalHash('remove_from_group_'.$element_3->getId())
321
+      )), 
322
+      array(), 
323
+      array(), 
324
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
325
+    );
326
+    $this->isResponseSuccess();
327
+    $response = json_decode($this->client->getResponse()->getContent(), true);
328
+    $this->assertEquals($response['status'], 'error');
329
+    
330
+    $element_1 = $this->findOneBy('Element', 'Infected mushroom - Muse Breaks');
331
+    $element_2 = $this->findOneBy('Element', 'Infected Mushroom - Psycho');
332
+    $element_3 = $this->findOneBy('Element', 'DUDELDRUM'); 
333
+    
334
+    $this->assertTrue(!is_null($element_1));
335
+    $this->assertTrue(!is_null($element_2));
336
+    $this->assertTrue(!is_null($element_3));
337
+    
338
+    $this->assertTrue(is_null($element_1->getGroup()));
339
+    $this->assertTrue(is_null($element_2->getGroup()));
340
+    $this->assertTrue(!is_null($element_3->getGroup()));
341
+  }
342
+  
234 343
 }

+ 10 - 0
src/Muzich/CoreBundle/lib/Controller.php View File

@@ -350,6 +350,16 @@ class Controller extends BaseController
350 350
     return $response;
351 351
   }
352 352
   
353
+  protected function jsonNotFoundResponse()
354
+  {
355
+    $response = new Response(json_encode(array(
356
+      'status' => 'error',
357
+      'errors' => array('NotFound')
358
+    )));
359
+    $response->headers->set('Content-Type', 'application/json; charset=utf-8');
360
+    return $response;
361
+  }
362
+  
353 363
   /**
354 364
    * Permet d'utiliser la méthode Assert que l'on utilise dans les templates
355 365
    * afin d'avoir une url correcte vers une ressource web (img, js, ...)

+ 5 - 1
src/Muzich/CoreBundle/lib/FunctionalTest.php View File

@@ -523,8 +523,12 @@ class FunctionalTest extends WebTestCase
523 523
    * @param array $params
524 524
    * @return object 
525 525
    */
526
-  protected function findOneBy($entityName, array $params)
526
+  protected function findOneBy($entityName, $params)
527 527
   {
528
+    if (!is_array($params))
529
+    {
530
+      $params = array('name' => $params);
531
+    }
528 532
     return $this->getEntityManager()->getRepository('MuzichCoreBundle:'.$entityName)
529 533
       ->findOneBy($params);
530 534
   }

+ 5 - 1
src/Muzich/HomeBundle/Resources/views/Show/showGroup.html.twig View File

@@ -78,7 +78,11 @@
78 78
     
79 79
   </div>
80 80
   
81
-  {% include "MuzichCoreBundle:SearchElement:default.html.twig" with {'no_group_name' : true} %}
81
+  {% include "MuzichCoreBundle:SearchElement:default.html.twig" with {
82
+    'no_group_name' : true,
83
+    'his_group'     : his_group,
84
+    'group'         : group
85
+  }%}
82 86
   
83 87
   {% if more_count is defined %} 
84 88
     {% if elements|length %}

BIN
web/img/1360779431_Remove.png View File


BIN
web/img/1360779431_Remove_gray.png View File