Commit 6e6c64650c41261ac32c56957460440d42d38824

Authored by Zambom
1 parent 10867b62

Adding update user

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
users/templates/users/_form.html 0 → 100644
@@ -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">&times;</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">&times;</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">&times;</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 %}
@@ -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'