Commit dfcfc5330f24f562e8d5e65b7c56a3c942f392ce
1 parent
7aba1d6f
Exists in
master
and in
3 other branches
Adding remove user/account
Showing
9 changed files
with
148 additions
and
48 deletions
Show diff stats
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 |
@@ -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 %} |
@@ -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">×</span> | 21 | <span aria-hidden="true">×</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">×</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 %} |
users/urls.py
@@ -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' |