Commit 98e11391eb7ce7da77996ef0438bc01464e1a51f

Authored by Zambom
1 parent b47acb09

Adding group delete

amadeus/static/css/themes/green.css
@@ -67,6 +67,11 @@ a, a:focus, a:hover { @@ -67,6 +67,11 @@ a, a:focus, a:hover {
67 color: #000000 !important; 67 color: #000000 !important;
68 } 68 }
69 69
  70 +.group-panel-body {
  71 + background: #FFFFFF !important;
  72 + border-top: 1px solid #CCCCCC;
  73 +}
  74 +
70 .topic-panel > .panel-heading { 75 .topic-panel > .panel-heading {
71 background-color: #7BA5B9 !important; 76 background-color: #7BA5B9 !important;
72 } 77 }
amadeus/static/js/course.js
@@ -193,4 +193,14 @@ $('.collapse').on('hide.bs.collapse', function (e) { @@ -193,4 +193,14 @@ $('.collapse').on('hide.bs.collapse', function (e) {
193 }); 193 });
194 } 194 }
195 } 195 }
196 -});  
197 \ No newline at end of file 196 \ No newline at end of file
  197 +});
  198 +
  199 +function delete_group(url) {
  200 + $('.modal').remove();
  201 +
  202 + $.get(url, function (modal) {
  203 + $("#group-accordion").after(modal);
  204 +
  205 + $('.modal').modal('show');
  206 + });
  207 +}
198 \ No newline at end of file 208 \ No newline at end of file
students_group/models.py
@@ -17,6 +17,7 @@ class StudentsGroup(models.Model): @@ -17,6 +17,7 @@ class StudentsGroup(models.Model):
17 class Meta: 17 class Meta:
18 verbose_name = _('Students Group') 18 verbose_name = _('Students Group')
19 verbose_name_plural = _('Students Groups') 19 verbose_name_plural = _('Students Groups')
  20 + ordering = ['name']
20 21
21 def __str__(self): 22 def __str__(self):
22 return self.name 23 return self.name
23 \ No newline at end of file 24 \ No newline at end of file
students_group/templates/groups/delete.html 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +{% load i18n %}
  2 +
  3 +<div class="modal fade" id="topic" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  4 + <div class="modal-dialog" role="document">
  5 + <div class="modal-content">
  6 + <div class="modal-body">
  7 + <form id="delete_form" action="{% url 'groups:delete' group.slug %}" method="post">
  8 + {% csrf_token %}
  9 + <h3>{% trans 'Are you sure you want delete the group' %}: {{ group }}?</h3>
  10 + <p>{% trans 'With this action the group will no longer exist but your participants will still be attached to the subject.' %}</p>
  11 + </form>
  12 + </div>
  13 + <div class="modal-footer">
  14 + <div class="pull-right">
  15 + <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
  16 + </div>
  17 + <div class="pull-left">
  18 + <button type="submit" form="delete_form" class="btn btn-success btn-raised">{% trans "Delete" %}</button>
  19 + </div>
  20 + </div>
  21 + </div>
  22 + </div>
  23 +</div>
0 \ No newline at end of file 24 \ No newline at end of file
students_group/templates/groups/index.html
@@ -33,15 +33,15 @@ @@ -33,15 +33,15 @@
33 </div> 33 </div>
34 34
35 <div class="col-md-12 cards-content"> 35 <div class="col-md-12 cards-content">
36 - <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true"> 36 + <div class="panel-group" id="group-accordion" role="tablist" aria-multiselectable="true">
37 {% for group in groups %} 37 {% for group in groups %}
38 <div class="panel panel-info group-panel"> 38 <div class="panel panel-info group-panel">
39 <div class="panel-heading"> 39 <div class="panel-heading">
40 <div class="row"> 40 <div class="row">
41 <div class="col-md-12 category-header"> 41 <div class="col-md-12 category-header">
42 <h4 class="panel-title"> 42 <h4 class="panel-title">
43 - <a class="category-course-link pull-left" data-parent="#accordion" data-toggle="collapse" href="#{{group.slug}}">  
44 - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{ group }} 43 + <a class="category-course-link pull-left" data-parent="#group-accordion" data-toggle="collapse" href="#{{group.slug}}">
  44 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> {{ group }} ({{ group.participants.count }})
45 </a> 45 </a>
46 </h4> 46 </h4>
47 47
@@ -56,18 +56,34 @@ @@ -56,18 +56,34 @@
56 </a> 56 </a>
57 </li> 57 </li>
58 <li><a href="{% url 'groups:update' subject.slug group.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans 'Edit' %}</a></li> 58 <li><a href="{% url 'groups:update' subject.slug group.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans 'Edit' %}</a></li>
59 - <li><a href=""><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li> 59 + <li><a href="javascript:delete_group('{% url 'groups:delete' group.slug %}')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li>
60 </ul> 60 </ul>
61 </div> 61 </div>
62 </div> 62 </div>
63 </div> 63 </div>
64 </div> 64 </div>
65 - </div> 65 + <div id="{{ group.slug }}" class="panel-collapse panel-body collapse category-panel-content group-panel-body">
  66 + {% autoescape off %}
  67 + {{ group.description }}
  68 + {% endautoescape %}
66 69
  70 + <h3>{% trans 'Participant(s)' %}: </h3>
  71 +
  72 + <ul class="list-inline">
  73 + {% for user in group.participants.all %}
  74 + <li class="list-inline-item text-center col-lg-2 col-md-2 col-sm-2 col-xs-3">
  75 + <img src="{{ user.image_url }}" class="img-responsive" />
  76 + <p><small>{{ user }}</small></p>
  77 + </li>
  78 + {% endfor %}
  79 + </ul>
  80 + </div>
  81 + </div>
67 {% endfor %} 82 {% endfor %}
68 83
69 {% pagination request paginator page_obj %} 84 {% pagination request paginator page_obj %}
70 </div> 85 </div>
71 </div> 86 </div>
72 87
  88 + <script type="text/javascript" src="{% static 'js/course.js' %}"></script>
73 {% endblock %} 89 {% endblock %}
74 \ No newline at end of file 90 \ No newline at end of file
students_group/urls.py
@@ -6,4 +6,5 @@ urlpatterns = [ @@ -6,4 +6,5 @@ urlpatterns = [
6 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name='create'), 6 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name='create'),
7 url(r'^update/(?P<sub_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'), 7 url(r'^update/(?P<sub_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'),
8 url(r'^replicate/(?P<slug>[\w_-]+)/(?P<group_slug>[\w_-]+)/$', views.CreateView.as_view(), name='replicate'), 8 url(r'^replicate/(?P<slug>[\w_-]+)/(?P<group_slug>[\w_-]+)/$', views.CreateView.as_view(), name='replicate'),
  9 + url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'),
9 ] 10 ]
10 \ No newline at end of file 11 \ No newline at end of file
students_group/views.py
@@ -149,4 +149,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): @@ -149,4 +149,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
149 def get_success_url(self): 149 def get_success_url(self):
150 messages.success(self.request, _('The group "%s" was updated successfully!')%(self.object.name)) 150 messages.success(self.request, _('The group "%s" was updated successfully!')%(self.object.name))
151 151
  152 + return reverse_lazy('groups:index', kwargs = {'slug': self.object.subject.slug})
  153 +
  154 +class DeleteView(LoginRequiredMixin, generic.DeleteView):
  155 + login_url = reverse_lazy("users:login")
  156 + redirect_field_name = 'next'
  157 +
  158 + template_name = 'groups/delete.html'
  159 + model = StudentsGroup
  160 + context_object_name = 'group'
  161 +
  162 + def dispatch(self, request, *args, **kwargs):
  163 + slug = self.kwargs.get('slug', '')
  164 + group = get_object_or_404(StudentsGroup, slug = slug)
  165 +
  166 + if not has_subject_permissions(request.user, group.subject):
  167 + return redirect(reverse_lazy('subjects:home'))
  168 +
  169 + return super(DeleteView, self).dispatch(request, *args, **kwargs)
  170 +
  171 + def get_success_url(self):
  172 + messages.success(self.request, _('The group "%s" was removed successfully!')%(self.object.name))
  173 +
152 return reverse_lazy('groups:index', kwargs = {'slug': self.object.subject.slug}) 174 return reverse_lazy('groups:index', kwargs = {'slug': self.object.subject.slug})
153 \ No newline at end of file 175 \ No newline at end of file
users/templates/users/search.html
@@ -29,7 +29,7 @@ @@ -29,7 +29,7 @@
29 </form> 29 </form>
30 </div> 30 </div>
31 <div class="col-md-3"> 31 <div class="col-md-3">
32 - <a href="{% url 'users:create' %}" class="pull-right btn btn-primary btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create User' %}</a> 32 + <a href="{% url 'users:create' %}" class="pull-right btn btn-success btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create User' %}</a>
33 </div> 33 </div>
34 </div> 34 </div>
35 35
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 </div> 53 </div>
54 <div class="col-md-3"> 54 <div class="col-md-3">
55 <div align="right"> 55 <div align="right">
56 - <a href="{% url 'users:update' acc.email %}" class="btn btn-primary btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a> 56 + <a href="{% url 'users:update' acc.email %}" class="btn btn-success btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
57 <a href="{% url 'users:delete' acc.email %}" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a> 57 <a href="{% url 'users:delete' acc.email %}" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
58 </div> 58 </div>
59 </div> 59 </div>
users/views.py
@@ -72,7 +72,7 @@ class SearchView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir @@ -72,7 +72,7 @@ class SearchView(braces_mixins.LoginRequiredMixin, braces_mixins.StaffuserRequir
72 def get_queryset(self): 72 def get_queryset(self):
73 search = self.request.GET.get('search', '') 73 search = self.request.GET.get('search', '')
74 74
75 - users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).order_by('social_name','username').exclude(email = self.request.user.email) 75 + users = User.objects.filter(Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)).distinct().order_by('social_name','username').exclude(email = self.request.user.email)
76 76
77 return users 77 return users
78 78