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 | 119 | <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> |
120 | 120 | <li><a href="{% url 'users:edit_profile' %}">{% trans 'Edit Profile' %}</a></li> |
121 | 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 | 123 | </ul> |
124 | 124 | </li> |
125 | 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 | 70 | |
71 | 71 | def is_student(self): |
72 | 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 @@ |
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 @@ |
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 | 63 | <div class="col-md-3"> |
64 | 64 | <div align="right"> |
65 | 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 | 67 | </div> |
68 | 68 | </div> |
69 | 69 | </div> | ... | ... |
users/templates/users/profile.html
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | {% block content %} |
17 | 17 | {% if messages %} |
18 | 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 | 20 | <button type="button" class="close" data-dismiss="alert" aria-label="Close"> |
21 | 21 | <span aria-hidden="true">×</span> |
22 | 22 | </button> | ... | ... |
users/templates/users/remove_account.html
... | ... | @@ -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 | 8 | url(r'^logout/$', auth_views.logout, {'next_page': 'users:login'}, name='logout'), |
9 | 9 | url(r'^signup/$', views.RegisterUser.as_view(), name = 'signup'), |
10 | 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 | 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 | 14 | url(r'^profile/$', views.Profile.as_view(), name = 'profile'), |
14 | 15 | url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), |
15 | 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 | 179 | |
180 | 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 | 242 | class ChangePassView(LoginRequiredMixin, generic.UpdateView): |
183 | 243 | login_url = reverse_lazy("users:login") |
184 | 244 | redirect_field_name = 'next' | ... | ... |