Commit 6e6c64650c41261ac32c56957460440d42d38824
1 parent
10867b62
Exists in
master
and in
3 other branches
Adding update user
Showing
7 changed files
with
123 additions
and
161 deletions
Show diff stats
users/forms.py
@@ -89,15 +89,29 @@ class ProfileForm(Validation): | @@ -89,15 +89,29 @@ class ProfileForm(Validation): | ||
89 | } | 89 | } |
90 | 90 | ||
91 | class UserForm(Validation): | 91 | class UserForm(Validation): |
92 | - password = forms.CharField(label=_('Password'), widget = forms.PasswordInput, required = False) | ||
93 | - password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput, required = False) | ||
94 | - | ||
95 | is_edit = False | 92 | is_edit = False |
96 | 93 | ||
94 | + def __init__(self, *args, **kwargs): | ||
95 | + is_update = kwargs.pop('is_edit', False) | ||
96 | + | ||
97 | + super(UserForm, self).__init__(*args, **kwargs) | ||
98 | + | ||
99 | + self.is_edit = is_update | ||
100 | + | ||
101 | + if self.is_edit: | ||
102 | + del self.fields['password'] | ||
103 | + del self.fields['password2'] | ||
104 | + | ||
105 | + if not is_edit: | ||
106 | + password = forms.CharField(label=_('Password'), widget = forms.PasswordInput, required = False) | ||
107 | + password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput, required = False) | ||
108 | + | ||
109 | + | ||
97 | def save(self, commit=True): | 110 | def save(self, commit=True): |
98 | super(UserForm, self).save(commit=False) | 111 | super(UserForm, self).save(commit=False) |
99 | 112 | ||
100 | - self.instance.set_password(self.cleaned_data['password']) | 113 | + if not self.is_edit: |
114 | + self.instance.set_password(self.cleaned_data['password']) | ||
101 | 115 | ||
102 | self.instance.save() | 116 | self.instance.save() |
103 | 117 |
@@ -0,0 +1,62 @@ | @@ -0,0 +1,62 @@ | ||
1 | +{% load static i18n %} | ||
2 | +{% load widget_tweaks %} | ||
3 | + | ||
4 | +<form method="post" action="" enctype="multipart/form-data"> | ||
5 | + {% csrf_token %} | ||
6 | + {% for field in form %} | ||
7 | + <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> | ||
8 | + {% if field.auto_id == 'id_image' %} | ||
9 | + {% if field.field.required %} | ||
10 | + <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
11 | + {% else %} | ||
12 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
13 | + {% endif %} | ||
14 | + {% render_field field class='form-control' %} | ||
15 | + <div class="input-group"> | ||
16 | + <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your photo...' %}"> | ||
17 | + <span class="input-group-btn input-group-sm"> | ||
18 | + <button type="button" class="btn btn-fab btn-fab-mini"> | ||
19 | + <i class="material-icons">attach_file</i> | ||
20 | + </button> | ||
21 | + </span> | ||
22 | + </div> | ||
23 | + {% elif field.auto_id == 'id_description' %} | ||
24 | + {% if field.field.required %} | ||
25 | + <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
26 | + {% else %} | ||
27 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
28 | + {% endif %} | ||
29 | + {% render_field field class='form-control text_wysiwyg' %} | ||
30 | + {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %} | ||
31 | + <div class="checkbox"> | ||
32 | + <label for="{{ field.auto_id }}"> | ||
33 | + {% render_field field %} {{field.label}} | ||
34 | + </label> | ||
35 | + </div> | ||
36 | + {% else %} | ||
37 | + {% if field.field.required %} | ||
38 | + <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
39 | + {% else %} | ||
40 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
41 | + {% endif %} | ||
42 | + {% render_field field class='form-control' %} | ||
43 | + {% endif %} | ||
44 | + <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
45 | + {% if field.errors %} | ||
46 | + <div class="alert alert-danger alert-dismissible" role="alert"> | ||
47 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
48 | + <span aria-hidden="true">×</span> | ||
49 | + </button> | ||
50 | + <ul> | ||
51 | + {% for error in field.errors %} | ||
52 | + <li>{{ error }}</li> | ||
53 | + {% endfor %} | ||
54 | + </ul> | ||
55 | + </div> | ||
56 | + {% endif %} | ||
57 | + </div> | ||
58 | + {% endfor %} | ||
59 | + <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12 text-center"> | ||
60 | + <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-primary" /> | ||
61 | + </div> | ||
62 | +</form> | ||
0 | \ No newline at end of file | 63 | \ No newline at end of file |
users/templates/users/create.html
1 | {% extends 'users/list.html' %} | 1 | {% extends 'users/list.html' %} |
2 | 2 | ||
3 | -{% load static i18n %} | ||
4 | -{% load widget_tweaks %} | ||
5 | - | ||
6 | {% load django_bootstrap_breadcrumbs %} | 3 | {% load django_bootstrap_breadcrumbs %} |
7 | 4 | ||
8 | {% block breadcrumbs %} | 5 | {% block breadcrumbs %} |
@@ -14,65 +11,7 @@ | @@ -14,65 +11,7 @@ | ||
14 | <div class="card"> | 11 | <div class="card"> |
15 | <div class="card-content"> | 12 | <div class="card-content"> |
16 | <div class="card-body"> | 13 | <div class="card-body"> |
17 | - <form method="post" action="" enctype="multipart/form-data"> | ||
18 | - {% csrf_token %} | ||
19 | - {% for field in form %} | ||
20 | - <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> | ||
21 | - {% if field.auto_id == 'id_image' %} | ||
22 | - {% if field.field.required %} | ||
23 | - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
24 | - {% else %} | ||
25 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
26 | - {% endif %} | ||
27 | - {% render_field field class='form-control' %} | ||
28 | - <div class="input-group"> | ||
29 | - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your photo...' %}"> | ||
30 | - <span class="input-group-btn input-group-sm"> | ||
31 | - <button type="button" class="btn btn-fab btn-fab-mini"> | ||
32 | - <i class="material-icons">attach_file</i> | ||
33 | - </button> | ||
34 | - </span> | ||
35 | - </div> | ||
36 | - {% elif field.auto_id == 'id_description' %} | ||
37 | - {% if field.field.required %} | ||
38 | - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
39 | - {% else %} | ||
40 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
41 | - {% endif %} | ||
42 | - {% render_field field class='form-control text_wysiwyg' %} | ||
43 | - {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %} | ||
44 | - <div class="checkbox"> | ||
45 | - <label for="{{ field.auto_id }}"> | ||
46 | - {% render_field field %} {{field.label}} | ||
47 | - </label> | ||
48 | - </div> | ||
49 | - {% else %} | ||
50 | - {% if field.field.required %} | ||
51 | - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
52 | - {% else %} | ||
53 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
54 | - {% endif %} | ||
55 | - {% render_field field class='form-control' %} | ||
56 | - {% endif %} | ||
57 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
58 | - {% if field.errors %} | ||
59 | - <div class="alert alert-danger alert-dismissible" role="alert"> | ||
60 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
61 | - <span aria-hidden="true">×</span> | ||
62 | - </button> | ||
63 | - <ul> | ||
64 | - {% for error in field.errors %} | ||
65 | - <li>{{ error }}</li> | ||
66 | - {% endfor %} | ||
67 | - </ul> | ||
68 | - </div> | ||
69 | - {% endif %} | ||
70 | - </div> | ||
71 | - {% endfor %} | ||
72 | - <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12 text-center"> | ||
73 | - <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-primary" /> | ||
74 | - </div> | ||
75 | - </form> | 14 | + {% include 'users/_form.html' %} |
76 | </div> | 15 | </div> |
77 | </div> | 16 | </div> |
78 | </div> | 17 | </div> |
users/templates/users/list.html
@@ -62,7 +62,7 @@ | @@ -62,7 +62,7 @@ | ||
62 | </div> | 62 | </div> |
63 | <div class="col-md-3"> | 63 | <div class="col-md-3"> |
64 | <div align="right"> | 64 | <div align="right"> |
65 | - <a href="#" 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="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> |
67 | </div> | 67 | </div> |
68 | </div> | 68 | </div> |
users/templates/users/update.html
1 | -{% extends 'list_users.html' %} | 1 | +{% extends 'users/list.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | {% load widget_tweaks %} | 4 | {% load widget_tweaks %} |
@@ -28,63 +28,8 @@ | @@ -28,63 +28,8 @@ | ||
28 | <div class="card mg-b-5m"> | 28 | <div class="card mg-b-5m"> |
29 | <div class="card-content"> | 29 | <div class="card-content"> |
30 | <div class="card-body"> | 30 | <div class="card-body"> |
31 | - <form method="post" action="" enctype="multipart/form-data"> | ||
32 | - {% csrf_token %} | ||
33 | - {% for field in form %} | ||
34 | - <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> | ||
35 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
36 | - {% if field.auto_id == 'id_birth_date' %} | ||
37 | - <input type="text" class="form-control date-picker"name="{{field.name}}" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}" id="{{ field.auto_id }}"> | ||
38 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
39 | - {% elif field.auto_id == 'id_image' or field.auto_id == 'id_curriculum'%} | ||
40 | - {% render_field field class='form-control input-sm' %} | ||
41 | - <div class="input-group"> | ||
42 | - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your file...' %}"> | ||
43 | - <span class="input-group-btn input-group-sm"> | ||
44 | - <button type="button" class="btn btn-fab btn-fab-mini"> | ||
45 | - <i class="material-icons">attach_file</i> | ||
46 | - </button> | ||
47 | - </span> | ||
48 | - </div> | ||
49 | - {% elif field.auto_id == 'id_cpf' %} | ||
50 | - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarCpf(this,event);' %} | ||
51 | - | ||
52 | - {% elif field.auto_id == 'id_phone' %} | ||
53 | - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %} | ||
54 | - | ||
55 | - {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %} | ||
56 | - <div class="checkbox"> | ||
57 | - <label for="{{ field.auto_id }}"> | ||
58 | - {% render_field field %}<span class="checkbox-material"><span class="check"></span></span> {{field.label}} | ||
59 | - </label> | ||
60 | - </div> | ||
61 | - {% else %} | ||
62 | - {% render_field field class='form-control' %} | ||
63 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
64 | - {% endif %} | ||
65 | - {% if field.errors %} | ||
66 | - <div class="alert alert-danger alert-dismissible" role="alert"> | ||
67 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
68 | - <span aria-hidden="true">×</span> | ||
69 | - </button> | ||
70 | - <ul> | ||
71 | - {% for error in field.errors %} | ||
72 | - <li>{{ error }}</li> | ||
73 | - {% endfor %} | ||
74 | - </ul> | ||
75 | - </div> | ||
76 | - {% endif %} | ||
77 | - </div> | ||
78 | - {% endfor %} | ||
79 | - <div class="col-md-offset-2 col-md-2 col-sm-2 col-xs-2"> | ||
80 | - <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" /> | ||
81 | - </div> | ||
82 | - <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2"> | ||
83 | - <a href="{% url 'users:manage' %}" class="btn btn-raised btn-default" >{% trans 'Cancel' %}</a> | ||
84 | - </div> | ||
85 | - </form> | 31 | + {% include 'users/_form.html' %} |
86 | </div> | 32 | </div> |
87 | </div> | 33 | </div> |
88 | </div> | 34 | </div> |
89 | - <br clear="all" /> | ||
90 | {% endblock %} | 35 | {% endblock %} |
users/urls.py
@@ -8,6 +8,7 @@ urlpatterns = [ | @@ -8,6 +8,7 @@ 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'), | ||
11 | url(r'^create/$', views.CreateView.as_view(), name = 'create'), | 12 | url(r'^create/$', views.CreateView.as_view(), name = 'create'), |
12 | url(r'^profile/$', views.Profile.as_view(), name = 'profile'), | 13 | url(r'^profile/$', views.Profile.as_view(), name = 'profile'), |
13 | url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), | 14 | url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), |
users/views.py
@@ -26,39 +26,7 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl | @@ -26,39 +26,7 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl | ||
26 | 26 | ||
27 | 27 | ||
28 | 28 | ||
29 | -# class Update(HasRoleMixin, LoginRequiredMixin, generic.UpdateView): | ||
30 | 29 | ||
31 | -# allowed_roles = ['system_admin'] | ||
32 | -# #login_url = reverse_lazy("core:home") | ||
33 | -# redirect_field_name = 'next' | ||
34 | -# template_name = 'users/update.html' | ||
35 | -# slug_field = 'username' | ||
36 | -# slug_url_kwarg = 'username' | ||
37 | -# context_object_name = 'acc' | ||
38 | -# model = User | ||
39 | -# form_class = UserForm | ||
40 | -# success_url = reverse_lazy('users:manage') | ||
41 | - | ||
42 | -# def form_valid(self, form): | ||
43 | -# self.object = form.save(commit = False) | ||
44 | - | ||
45 | -# if self.object.type_profile == 2: | ||
46 | -# assign_role(self.object, 'student') | ||
47 | -# elif self.object.type_profile == 1: | ||
48 | -# assign_role(self.object, 'professor') | ||
49 | -# elif self.object.is_staff: | ||
50 | -# assign_role(self.object, 'system_admin') | ||
51 | - | ||
52 | -# self.object.save() | ||
53 | - | ||
54 | -# messages.success(self.request, _('User ')+self.object.name+_(' updated successfully!')) | ||
55 | - | ||
56 | -# return super(Update, self).form_valid(form) | ||
57 | - | ||
58 | -# def get_context_data (self, **kwargs): | ||
59 | -# context = super(Update, self).get_context_data(**kwargs) | ||
60 | -# context['title'] = "Update User" | ||
61 | -# return context | ||
62 | 30 | ||
63 | # class View(LoginRequiredMixin, generic.DetailView): | 31 | # class View(LoginRequiredMixin, generic.DetailView): |
64 | 32 | ||
@@ -132,12 +100,10 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl | @@ -132,12 +100,10 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl | ||
132 | 100 | ||
133 | # return context | 101 | # return context |
134 | 102 | ||
135 | -class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): | 103 | +class UsersListView(LoginRequiredMixin, generic.ListView): |
136 | login_url = reverse_lazy("users:login") | 104 | login_url = reverse_lazy("users:login") |
137 | redirect_field_name = 'next' | 105 | redirect_field_name = 'next' |
138 | 106 | ||
139 | - allowed_roles = ['system_admin'] | ||
140 | - | ||
141 | template_name = 'users/list.html' | 107 | template_name = 'users/list.html' |
142 | context_object_name = 'users' | 108 | context_object_name = 'users' |
143 | paginate_by = 10 | 109 | paginate_by = 10 |
@@ -153,11 +119,10 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): | @@ -153,11 +119,10 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): | ||
153 | 119 | ||
154 | return context | 120 | return context |
155 | 121 | ||
156 | -class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView): | 122 | +class CreateView(LoginRequiredMixin, generic.edit.CreateView): |
157 | login_url = reverse_lazy("users:login") | 123 | login_url = reverse_lazy("users:login") |
158 | redirect_field_name = 'next' | 124 | redirect_field_name = 'next' |
159 | 125 | ||
160 | - allowed_roles = ['system_admin'] | ||
161 | template_name = 'users/create.html' | 126 | template_name = 'users/create.html' |
162 | form_class = UserForm | 127 | form_class = UserForm |
163 | context_object_name = 'acc' | 128 | context_object_name = 'acc' |
@@ -178,6 +143,42 @@ class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView): | @@ -178,6 +143,42 @@ class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView): | ||
178 | 143 | ||
179 | return context | 144 | return context |
180 | 145 | ||
146 | +class UpdateView(LoginRequiredMixin, generic.UpdateView): | ||
147 | + login_url = reverse_lazy("users:login") | ||
148 | + redirect_field_name = 'next' | ||
149 | + | ||
150 | + template_name = 'users/update.html' | ||
151 | + slug_field = 'email' | ||
152 | + slug_url_kwarg = 'email' | ||
153 | + context_object_name = 'acc' | ||
154 | + model = User | ||
155 | + form_class = UserForm | ||
156 | + success_url = reverse_lazy('users:manage') | ||
157 | + | ||
158 | + def get_form_kwargs(self): | ||
159 | + kwargs = super(UpdateView, self).get_form_kwargs() | ||
160 | + | ||
161 | + kwargs.update({'is_edit': True}) | ||
162 | + | ||
163 | + return kwargs | ||
164 | + | ||
165 | + def form_valid(self, form): | ||
166 | + self.object = form.save(commit = False) | ||
167 | + | ||
168 | + self.object.save() | ||
169 | + | ||
170 | + msg = _("User %s updated successfully" % self.object.get_short_name()) | ||
171 | + | ||
172 | + messages.success(self.request, msg) | ||
173 | + | ||
174 | + return super(UpdateView, self).form_valid(form) | ||
175 | + | ||
176 | + def get_context_data (self, **kwargs): | ||
177 | + context = super(UpdateView, self).get_context_data(**kwargs) | ||
178 | + context['title'] = _("Update User") | ||
179 | + | ||
180 | + return context | ||
181 | + | ||
181 | class Profile(LoginRequiredMixin, generic.DetailView): | 182 | class Profile(LoginRequiredMixin, generic.DetailView): |
182 | login_url = reverse_lazy("users:login") | 183 | login_url = reverse_lazy("users:login") |
183 | redirect_field_name = 'next' | 184 | redirect_field_name = 'next' |