Commit 6e6c64650c41261ac32c56957460440d42d38824

Authored by Zambom
1 parent 10867b62

Adding update user

users/forms.py
... ... @@ -89,15 +89,29 @@ class ProfileForm(Validation):
89 89 }
90 90  
91 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 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 110 def save(self, commit=True):
98 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 116 self.instance.save()
103 117  
... ...
users/templates/users/_form.html 0 → 100644
... ... @@ -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 63 \ No newline at end of file
... ...
users/templates/users/create.html
1 1 {% extends 'users/list.html' %}
2 2  
3   -{% load static i18n %}
4   -{% load widget_tweaks %}
5   -
6 3 {% load django_bootstrap_breadcrumbs %}
7 4  
8 5 {% block breadcrumbs %}
... ... @@ -14,65 +11,7 @@
14 11 <div class="card">
15 12 <div class="card-content">
16 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 15 </div>
77 16 </div>
78 17 </div>
... ...
users/templates/users/list.html
... ... @@ -62,7 +62,7 @@
62 62 </div>
63 63 <div class="col-md-3">
64 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 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 67 </div>
68 68 </div>
... ...
users/templates/users/update.html
1   -{% extends 'list_users.html' %}
  1 +{% extends 'users/list.html' %}
2 2  
3 3 {% load static i18n %}
4 4 {% load widget_tweaks %}
... ... @@ -28,63 +28,8 @@
28 28 <div class="card mg-b-5m">
29 29 <div class="card-content">
30 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 32 </div>
87 33 </div>
88 34 </div>
89   - <br clear="all" />
90 35 {% endblock %}
... ...
users/urls.py
... ... @@ -8,6 +8,7 @@ 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'),
11 12 url(r'^create/$', views.CreateView.as_view(), name = 'create'),
12 13 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
13 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 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 31 # class View(LoginRequiredMixin, generic.DetailView):
64 32  
... ... @@ -132,12 +100,10 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl
132 100  
133 101 # return context
134 102  
135   -class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
  103 +class UsersListView(LoginRequiredMixin, generic.ListView):
136 104 login_url = reverse_lazy("users:login")
137 105 redirect_field_name = 'next'
138 106  
139   - allowed_roles = ['system_admin']
140   -
141 107 template_name = 'users/list.html'
142 108 context_object_name = 'users'
143 109 paginate_by = 10
... ... @@ -153,11 +119,10 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
153 119  
154 120 return context
155 121  
156   -class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView):
  122 +class CreateView(LoginRequiredMixin, generic.edit.CreateView):
157 123 login_url = reverse_lazy("users:login")
158 124 redirect_field_name = 'next'
159 125  
160   - allowed_roles = ['system_admin']
161 126 template_name = 'users/create.html'
162 127 form_class = UserForm
163 128 context_object_name = 'acc'
... ... @@ -178,6 +143,42 @@ class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView):
178 143  
179 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 182 class Profile(LoginRequiredMixin, generic.DetailView):
182 183 login_url = reverse_lazy("users:login")
183 184 redirect_field_name = 'next'
... ...