Commit dfcfc5330f24f562e8d5e65b7c56a3c942f392ce

Authored by Zambom
1 parent 7aba1d6f

Adding remove user/account

amadeus/templates/base.html
@@ -119,7 +119,7 @@ @@ -119,7 +119,7 @@
119 <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> 119 <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li>
120 <li><a href="{% url 'users:edit_profile' %}">{% trans 'Edit Profile' %}</a></li> 120 <li><a href="{% url 'users:edit_profile' %}">{% trans 'Edit Profile' %}</a></li>
121 <li><a href="{% url 'users:change_pass' %}">{% trans 'Change Password' %}</a></li> 121 <li><a href="{% url 'users:change_pass' %}">{% trans 'Change Password' %}</a></li>
122 - <li><a href="#">{% trans 'Delete Account' %}</a></li> 122 + <li><a href="{% url 'users:remove_acc' %}">{% trans 'Delete Account' %}</a></li>
123 </ul> 123 </ul>
124 </li> 124 </li>
125 <li data-toggle="tooltip" data-placement="bottom" title data-original-title="log out"> 125 <li data-toggle="tooltip" data-placement="bottom" title data-original-title="log out">
users/models.py
@@ -70,3 +70,15 @@ class User(AbstractBaseUser, PermissionsMixin): @@ -70,3 +70,15 @@ class User(AbstractBaseUser, PermissionsMixin):
70 70
71 def is_student(self): 71 def is_student(self):
72 return _('Is not a student') 72 return _('Is not a student')
  73 +
  74 + def has_dependencies(self):
  75 + if self.is_staff:
  76 + return True
  77 +
  78 + #Check if is coordinator of something
  79 +
  80 + #Check if is professor of something
  81 +
  82 + #Check if is student of something
  83 +
  84 + return False
users/templates/users/delete.html 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +{% extends 'users/list.html' %}
  2 +
  3 +{% load static i18n %}
  4 +{% load widget_tweaks %}
  5 +{% load django_bootstrap_breadcrumbs %}
  6 +
  7 +{% block breadcrumbs %}
  8 + {{ block.super }}
  9 + {% breadcrumb 'Delete User' 'users:delete' %}
  10 +{% endblock %}
  11 +
  12 +{% block content %}
  13 + <div class="row">
  14 + <div class="col-md-12">
  15 + <div class="well well-lg">
  16 + <form action="" method="post">
  17 + {% csrf_token %}
  18 + <h2>{% trans 'Are you sure you want delete the user' %}: {{ acc }}?</h2>
  19 + <p>{% trans 'All data will be lost and havent how recover it.' %}</p>
  20 + <div class="row">
  21 + <div class="col-md-12">
  22 + <div class="pull-left">
  23 + <input type="submit" class="btn btn-raised btn-block btn-primary" value="{% trans 'Remove' %}" />
  24 + </div>
  25 + <div class="pull-right">
  26 + <a href="{% url 'users:manage' %}" class="btn btn-raised btn-block btn-default" >{% trans 'Cancel' %}</a>
  27 + </div>
  28 + </div>
  29 + </div>
  30 + </form>
  31 + </div>
  32 + </div>
  33 + </div>
  34 + <br clear="all" />
  35 +{% endblock %}
users/templates/users/delete_account.html 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +{% extends 'users/profile.html' %}
  2 +
  3 +{% load static i18n %}
  4 +{% load widget_tweaks %}
  5 +{% load django_bootstrap_breadcrumbs %}
  6 +
  7 +{% block breadcrumbs %}
  8 + {{ block.super }}
  9 + {% breadcrumb 'Remove Account' 'users:remove_acc' %}
  10 +{% endblock %}
  11 +
  12 +{% block content %}
  13 + <div class="row">
  14 + <div class="col-md-12">
  15 + <div class="well well-lg">
  16 + <form action="" method="post">
  17 + {% csrf_token %}
  18 + <h2>{% trans 'Are you sure you want delete your account?' %}</h2>
  19 + <p>{% trans 'All data will be lost and havent how recover it.' %}</p>
  20 + <div class="row">
  21 + <div class="col-md-12">
  22 + <div class="pull-left">
  23 + <input type="submit" class="btn btn-raised btn-block btn-primary" value="{% trans 'Remove' %}" />
  24 + </div>
  25 + <div class="pull-right">
  26 + <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-default" >{% trans 'Cancel' %}</a>
  27 + </div>
  28 + </div>
  29 + </div>
  30 + </form>
  31 + </div>
  32 + </div>
  33 + </div>
  34 + <br clear="all" />
  35 +{% endblock %}
users/templates/users/list.html
@@ -63,7 +63,7 @@ @@ -63,7 +63,7 @@
63 <div class="col-md-3"> 63 <div class="col-md-3">
64 <div align="right"> 64 <div align="right">
65 <a href="{% url 'users:update' acc.email %}" class="btn btn-primary btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a> 65 <a href="{% url 'users:update' acc.email %}" class="btn btn-primary btn-raised btn-sm"><i class="fa fa-edit"></i> {% trans 'Edit' %}</a>
66 - <a href="javascript:void(0)" class="btn btn-default btn-raised btn-sm" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a> 66 + <a href="{% url 'users:delete' acc.email %}" class="btn btn-default btn-raised btn-sm"><i class="fa fa-trash"></i> {% trans 'Delete' %}</a>
67 </div> 67 </div>
68 </div> 68 </div>
69 </div> 69 </div>
users/templates/users/profile.html
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 {% block content %} 16 {% block content %}
17 {% if messages %} 17 {% if messages %}
18 {% for message in messages %} 18 {% for message in messages %}
19 - <div class="alert alert-success alert-dismissible" role="alert"> 19 + <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">
20 <button type="button" class="close" data-dismiss="alert" aria-label="Close"> 20 <button type="button" class="close" data-dismiss="alert" aria-label="Close">
21 <span aria-hidden="true">&times;</span> 21 <span aria-hidden="true">&times;</span>
22 </button> 22 </button>
users/templates/users/remove_account.html
@@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
1 -{% extends 'users/profile.html' %}  
2 -  
3 -{% load static i18n %}  
4 -{% load widget_tweaks %}  
5 -{% load django_bootstrap_breadcrumbs %}  
6 -  
7 -{% block breadcrumbs %}  
8 -  
9 - {{ block.super }}  
10 - {% breadcrumb 'Edit' 'users:update_profile' %}  
11 -  
12 -{% endblock %}  
13 -  
14 -{% block content %}  
15 - {% if messages %}  
16 - {% for message in messages %}  
17 - <div class="alert alert-success alert-dismissible" role="alert">  
18 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
19 - <span aria-hidden="true">&times;</span>  
20 - </button>  
21 - <p>{{ message }}</p>  
22 - </div>  
23 - {% endfor %}  
24 - {% endif %}  
25 - <div class="row">  
26 - <div class="col-md-12">  
27 - <div class="well well-lg">  
28 - <h2>{% trans 'Are you sure you want delete this account?' %}</h2>  
29 - <p>{% trans 'All data will be lost and havent how recover it.' %}</p>  
30 - <div class="row">  
31 - <div class="col-md-3 col-sm-2 col-xs-2">  
32 - <a href="{% url 'users:remove' user.username %}" class="btn btn-raised btn-block btn-success" >{% trans 'Remove' %}</a>  
33 - </div>  
34 - <div class="col-md-3 col-sm-2 col-xs-2">  
35 - <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-default" >{% trans 'Cancel' %}</a>  
36 - </div>  
37 - </div>  
38 - </div>  
39 - </div>  
40 - </div>  
41 -  
42 -  
43 - <br clear="all" />  
44 -{% endblock %}  
@@ -8,9 +8,11 @@ urlpatterns = [ @@ -8,9 +8,11 @@ urlpatterns = [
8 url(r'^logout/$', auth_views.logout, {'next_page': 'users:login'}, name='logout'), 8 url(r'^logout/$', auth_views.logout, {'next_page': 'users:login'}, name='logout'),
9 url(r'^signup/$', views.RegisterUser.as_view(), name = 'signup'), 9 url(r'^signup/$', views.RegisterUser.as_view(), name = 'signup'),
10 url(r'^$', views.UsersListView.as_view(), name = 'manage'), 10 url(r'^$', views.UsersListView.as_view(), name = 'manage'),
11 - url(r'^edit/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.UpdateView.as_view(), name='update'),  
12 url(r'^create/$', views.CreateView.as_view(), name = 'create'), 11 url(r'^create/$', views.CreateView.as_view(), name = 'create'),
  12 + url(r'^edit/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.UpdateView.as_view(), name='update'),
  13 + url(r'^delete/(?P<email>[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.DeleteView.as_view(), name='delete'),
13 url(r'^profile/$', views.Profile.as_view(), name = 'profile'), 14 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
14 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), 15 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'),
15 url(r'^change_pass/$', views.ChangePassView.as_view(), name='change_pass'), 16 url(r'^change_pass/$', views.ChangePassView.as_view(), name='change_pass'),
  17 + url(r'^remove_account/$', views.DeleteView.as_view(), name='remove_acc'),
16 ] 18 ]
users/views.py
@@ -179,6 +179,66 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): @@ -179,6 +179,66 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
179 179
180 return context 180 return context
181 181
  182 +class DeleteView(LoginRequiredMixin, generic.DeleteView):
  183 + login_url = reverse_lazy("users:login")
  184 + redirect_field_name = 'next'
  185 +
  186 + template_name = 'users/delete.html'
  187 + model = User
  188 + slug_url_kwarg = 'email'
  189 + context_object_name = 'acc'
  190 +
  191 + def get_object(self):
  192 + email = self.kwargs.get('email', None)
  193 +
  194 + if email is None:
  195 + user = get_object_or_404(User, email = self.request.user.email)
  196 + else:
  197 + user = get_object_or_404(User, email = email)
  198 +
  199 + return user
  200 +
  201 + def delete(self, request, *args, **kwargs):
  202 + email = self.kwargs.get('email', None)
  203 + user = self.get_object()
  204 +
  205 + if email is None:
  206 + success_url = reverse_lazy('users:login')
  207 + error_url = reverse_lazy('users:profile')
  208 + else:
  209 + success_url = reverse_lazy('users:manage')
  210 + error_url = reverse_lazy('users:manage')
  211 +
  212 + success_msg = _('User removed successfully!')
  213 + error_msg = _('Could not remove the account. The user is attach to one or more functions (administrator, coordinator, professor ou student) in the system.')
  214 +
  215 + if user.has_dependencies():
  216 + messages.error(self.request, error_msg)
  217 +
  218 + return redirect(error_url)
  219 + else:
  220 + user.delete()
  221 +
  222 + messages.success(self.request, success_msg)
  223 +
  224 + return redirect(success_url)
  225 +
  226 + def get_context_data(self, **kwargs):
  227 + context = super(DeleteView, self).get_context_data(**kwargs)
  228 + context['title'] = _('Delete Account')
  229 +
  230 + return context
  231 +
  232 + def render_to_response(self, context, **response_kwargs):
  233 + email = self.kwargs.get('email', None)
  234 +
  235 + if email is None:
  236 + template = 'users/delete_account.html'
  237 + else:
  238 + template = 'users/delete.html'
  239 +
  240 + return self.response_class(request = self.request, template = template, context = context, using = self.template_engine, **response_kwargs)
  241 +
182 class ChangePassView(LoginRequiredMixin, generic.UpdateView): 242 class ChangePassView(LoginRequiredMixin, generic.UpdateView):
183 login_url = reverse_lazy("users:login") 243 login_url = reverse_lazy("users:login")
184 redirect_field_name = 'next' 244 redirect_field_name = 'next'