Commit 10867b6240955bc052bf083e2965e2194092e3a3

Authored by Zambom
1 parent ede23711

Adding create user

amadeus/templates/base.html
@@ -169,6 +169,11 @@ @@ -169,6 +169,11 @@
169 169
170 <!-- Init material Bootstrap --> 170 <!-- Init material Bootstrap -->
171 <script type="text/javascript">$.material.init()</script> 171 <script type="text/javascript">$.material.init()</script>
  172 + <script type="text/javascript">
  173 + $('.text_wysiwyg').summernote({
  174 + height: 200
  175 + });
  176 + </script>
172 </body> 177 </body>
173 178
174 </html> 179 </html>
175 \ No newline at end of file 180 \ No newline at end of file
users/forms.py
@@ -86,4 +86,26 @@ class ProfileForm(Validation): @@ -86,4 +86,26 @@ class ProfileForm(Validation):
86 fields = ['social_name', 'description', 'show_email', 'image'] 86 fields = ['social_name', 'description', 'show_email', 'image']
87 widgets = { 87 widgets = {
88 'description': forms.Textarea, 88 'description': forms.Textarea,
89 - }  
90 \ No newline at end of file 89 \ No newline at end of file
  90 + }
  91 +
  92 +class UserForm(Validation):
  93 + password = forms.CharField(label=_('Password'), widget = forms.PasswordInput, required = False)
  94 + password2 = forms.CharField(label = _('Confirm Password'), widget = forms.PasswordInput, required = False)
  95 +
  96 + is_edit = False
  97 +
  98 + def save(self, commit=True):
  99 + super(UserForm, self).save(commit=False)
  100 +
  101 + self.instance.set_password(self.cleaned_data['password'])
  102 +
  103 + self.instance.save()
  104 +
  105 + return self.instance
  106 +
  107 + class Meta:
  108 + model = User
  109 + fields = ['email', 'username', 'last_name', 'social_name', 'description', 'show_email', 'image', 'is_staff', 'is_active']
  110 + widgets = {
  111 + 'description': forms.Textarea,
  112 + }
91 \ No newline at end of file 113 \ No newline at end of file
users/migrations/0003_auto_20161222_1505.py 0 → 100644
@@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-12-22 18:05
  3 +from __future__ import unicode_literals
  4 +
  5 +import django.core.validators
  6 +from django.db import migrations, models
  7 +import re
  8 +import users.models
  9 +
  10 +
  11 +class Migration(migrations.Migration):
  12 +
  13 + dependencies = [
  14 + ('users', '0002_auto_20161220_1700'),
  15 + ]
  16 +
  17 + operations = [
  18 + migrations.AlterField(
  19 + model_name='user',
  20 + name='email',
  21 + field=models.EmailField(help_text='Your email address that will be used to access the platform', max_length=254, unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[\\w.@+-]+$', 32), 'Type a valid email. This fields should only contain letters, numbers and the characteres: @/./+/-/_ .', 'invalid')], verbose_name='Mail'),
  22 + ),
  23 + migrations.AlterField(
  24 + model_name='user',
  25 + name='image',
  26 + field=models.ImageField(blank=True, null=True, upload_to='users/', validators=[users.models.validate_img_extension], verbose_name='Photo'),
  27 + ),
  28 + migrations.AlterField(
  29 + model_name='user',
  30 + name='show_email',
  31 + field=models.IntegerField(blank=True, choices=[(1, 'Allow everyone to see my address'), (2, 'Only classmates can see my address'), (3, 'Nobody can see my address')], default=1, null=True, verbose_name='Show email?'),
  32 + ),
  33 + ]
users/models.py
@@ -29,7 +29,7 @@ class User(AbstractBaseUser, PermissionsMixin): @@ -29,7 +29,7 @@ class User(AbstractBaseUser, PermissionsMixin):
29 image = models.ImageField(verbose_name = _('Photo'), null=True, blank = True, upload_to = 'users/', validators = [validate_img_extension]) 29 image = models.ImageField(verbose_name = _('Photo'), null=True, blank = True, upload_to = 'users/', validators = [validate_img_extension])
30 date_created = models.DateTimeField(_('Create Date'), auto_now_add = True) 30 date_created = models.DateTimeField(_('Create Date'), auto_now_add = True)
31 last_update = models.DateTimeField(_('Last Update'), auto_now = True) 31 last_update = models.DateTimeField(_('Last Update'), auto_now = True)
32 - show_email = models.IntegerField(_('Show email?'), null = True, blank = True, choices = ((1, _('Allow everyone to see my address')), (2, _('Only classmates can see my address')), (3, _('Nobody can see my address')))) 32 + show_email = models.IntegerField(_('Show email?'), null = True, blank = True, choices = ((1, _('Allow everyone to see my address')), (2, _('Only classmates can see my address')), (3, _('Nobody can see my address'))), default = 1)
33 is_staff = models.BooleanField(_('Administrator'), default = False) 33 is_staff = models.BooleanField(_('Administrator'), default = False)
34 is_active = models.BooleanField(_('Active'), default = True) 34 is_active = models.BooleanField(_('Active'), default = True)
35 35
@@ -46,7 +46,7 @@ class User(AbstractBaseUser, PermissionsMixin): @@ -46,7 +46,7 @@ class User(AbstractBaseUser, PermissionsMixin):
46 return self.social_name or self.username 46 return self.social_name or self.username
47 47
48 def get_short_name(self): 48 def get_short_name(self):
49 - return self.username 49 + return str(self)
50 50
51 @property 51 @property
52 def image_url(self): 52 def image_url(self):
users/templates/users/create.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 %}
@@ -6,25 +6,11 @@ @@ -6,25 +6,11 @@
6 {% load django_bootstrap_breadcrumbs %} 6 {% load django_bootstrap_breadcrumbs %}
7 7
8 {% block breadcrumbs %} 8 {% block breadcrumbs %}
9 -  
10 - {{ block.super }} 9 + {{ block.super }}
11 {% breadcrumb 'Add User' 'users:create' %} 10 {% breadcrumb 'Add User' 'users:create' %}
12 -  
13 {% endblock %} 11 {% endblock %}
14 12
15 -  
16 {% block content %} 13 {% block content %}
17 - {% if messages %}  
18 - {% for message in messages %}  
19 - <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">  
20 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
21 - <span aria-hidden="true">&times;</span>  
22 - </button>  
23 - <p>{{ message }}</p>  
24 - </div>  
25 - {% endfor %}  
26 - {% endif %}  
27 -  
28 <div class="card"> 14 <div class="card">
29 <div class="card-content"> 15 <div class="card-content">
30 <div class="card-body"> 16 <div class="card-body">
@@ -32,15 +18,7 @@ @@ -32,15 +18,7 @@
32 {% csrf_token %} 18 {% csrf_token %}
33 {% for field in form %} 19 {% for field in form %}
34 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> 20 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
35 - {% if field.auto_id == 'id_birth_date' %}  
36 - {% if field.field.required %}  
37 - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>  
38 - {% else %}  
39 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
40 - {% endif %}  
41 -  
42 - {% render_field field class='form-control date-picker' %}  
43 - {% elif field.auto_id == 'id_image' %} 21 + {% if field.auto_id == 'id_image' %}
44 {% if field.field.required %} 22 {% if field.field.required %}
45 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> 23 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
46 {% else %} 24 {% else %}
@@ -55,51 +33,19 @@ @@ -55,51 +33,19 @@
55 </button> 33 </button>
56 </span> 34 </span>
57 </div> 35 </div>
58 -  
59 - {% elif field.auto_id == 'id_curriculum' %}  
60 - {% if field.field.required %} 36 + {% elif field.auto_id == 'id_description' %}
  37 + {% if field.field.required %}
61 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> 38 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
62 {% else %} 39 {% else %}
63 <label for="{{ field.auto_id }}">{{ field.label }}</label> 40 <label for="{{ field.auto_id }}">{{ field.label }}</label>
64 {% endif %} 41 {% endif %}
65 - {% render_field field class='form-control' %}  
66 - <div class="input-group">  
67 - <input type="text" readonly="" class="form-control" placeholder="{% trans 'Choose your file...' %}">  
68 - <span class="input-group-btn input-group-sm">  
69 - <button type="button" class="btn btn-fab btn-fab-mini">  
70 - <i class="material-icons">attach_file</i>  
71 - </button>  
72 - </span>  
73 - </div> 42 + {% render_field field class='form-control text_wysiwyg' %}
74 {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %} 43 {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %}
75 <div class="checkbox"> 44 <div class="checkbox">
76 <label for="{{ field.auto_id }}"> 45 <label for="{{ field.auto_id }}">
77 {% render_field field %} {{field.label}} 46 {% render_field field %} {{field.label}}
78 </label> 47 </label>
79 </div> 48 </div>
80 - {% elif field.auto_id == 'id_cpf' %}  
81 - {% if field.field.required %}  
82 - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>  
83 - {% else %}  
84 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
85 - {% endif %}  
86 - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarCpf(this,event);' %}  
87 -  
88 - {% elif field.auto_id == 'id_year_titration' %}  
89 - {% if field.field.required %}  
90 - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>  
91 - {% else %}  
92 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
93 - {% endif %}  
94 - {% render_field field class='form-control' onkeypress='campoNumerico(this,event);' %}  
95 -  
96 - {% elif field.auto_id == 'id_phone' %}  
97 - {% if field.field.required %}  
98 - <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>  
99 - {% else %}  
100 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
101 - {% endif %}  
102 - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %}  
103 {% else %} 49 {% else %}
104 {% if field.field.required %} 50 {% if field.field.required %}
105 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> 51 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
@@ -123,24 +69,11 @@ @@ -123,24 +69,11 @@
123 {% endif %} 69 {% endif %}
124 </div> 70 </div>
125 {% endfor %} 71 {% endfor %}
126 - <div class="col-md-5 col-xs-6 col-sm-6 col-lg-5 text-center">  
127 - <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" onclick="validarCpfSemAlert(id_cpf, CPF, idElementoMensagemErro)'" />  
128 - </div>  
129 - <div class="col-md-5 col-xs-6 col-sm-6 col-lg-5 text-center">  
130 - <a href="{% url 'users:manage' %}" class="btn btn-raised btn-danger" >{% trans 'Cancel' %}</a> 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" />
131 </div> 74 </div>
132 </form> 75 </form>
133 </div> 76 </div>
134 </div> 77 </div>
135 - </div>  
136 -</br>  
137 -</br>  
138 -</br>  
139 -<script type="text/javascript">  
140 -var locale = navigator.language || navigator.userLanguage;  
141 -  
142 -$('.date-picker').datepicker({  
143 - language: locale,  
144 -});  
145 -</script> 78 + </div>
146 {% endblock %} 79 {% endblock %}
users/templates/users/edit_profile.html
@@ -69,11 +69,5 @@ @@ -69,11 +69,5 @@
69 </form> 69 </form>
70 </div> 70 </div>
71 </div> 71 </div>
72 - </div>  
73 - <br clear="all" />  
74 - <script type="text/javascript">  
75 - $('.text_wysiwyg').summernote({  
76 - height: 200  
77 - });  
78 - </script> 72 + </div>
79 {% endblock %} 73 {% endblock %}
users/templates/users/list.html
@@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
38 </form> 38 </form>
39 </div> 39 </div>
40 <div class="col-md-3"> 40 <div class="col-md-3">
41 - <a href="#" class="pull-right btn btn-primary btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create User' %}</a> 41 + <a href="{% url 'users:create' %}" class="pull-right btn btn-primary btn-raised btn-md"><i class="fa fa-plus"></i> {% trans 'Create User' %}</a>
42 </div> 42 </div>
43 </div> 43 </div>
44 44
@@ -54,7 +54,11 @@ @@ -54,7 +54,11 @@
54 <div class="col-md-6"> 54 <div class="col-md-6">
55 <p><b>{% trans 'Name' %}:</b> {{ acc }}</p> 55 <p><b>{% trans 'Name' %}:</b> {{ acc }}</p>
56 <p><b>{% trans 'Email' %}:</b> {{ acc.email }}</p> 56 <p><b>{% trans 'Email' %}:</b> {{ acc.email }}</p>
57 - <p><b>{% trans 'Description' %}:</b> {{ acc.description|truncatechars:100|default:_("Not Informed") }}</p> 57 + <p><b>{% trans 'Description' %}:</b>
  58 + {% autoescape off %}
  59 + {{ acc.description|default:_("Not Informed")|striptags|truncatechars:300 }}
  60 + {% endautoescape %}
  61 + </p>
58 </div> 62 </div>
59 <div class="col-md-3"> 63 <div class="col-md-3">
60 <div align="right"> 64 <div align="right">
@@ -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'^create/$', views.CreateView.as_view(), name = 'create'),
11 url(r'^profile/$', views.Profile.as_view(), name = 'profile'), 12 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
12 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'), 13 url(r'^edit_profile/$', views.UpdateProfile.as_view(), name = 'edit_profile'),
13 ] 14 ]
users/views.py
@@ -14,7 +14,7 @@ from itertools import chain @@ -14,7 +14,7 @@ from itertools import chain
14 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 14 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
15 15
16 from .models import User 16 from .models import User
17 -from .forms import RegisterUserForm, ProfileForm 17 +from .forms import RegisterUserForm, ProfileForm, UserForm
18 18
19 #API IMPORTS 19 #API IMPORTS
20 from rest_framework import viewsets 20 from rest_framework import viewsets
@@ -24,35 +24,7 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl @@ -24,35 +24,7 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl
24 # ================ ADMIN ======================= 24 # ================ ADMIN =======================
25 25
26 26
27 -# class Create(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView):  
28 27
29 -# allowed_roles = ['system_admin']  
30 -# #login_url = reverse_lazy("core:home")  
31 -# redirect_field_name = 'next'  
32 -# template_name = 'users/create.html'  
33 -# form_class = UserForm  
34 -# context_object_name = 'acc'  
35 -# success_url = reverse_lazy('users:manage')  
36 -  
37 -# def form_valid(self, form):  
38 -# self.object = form.save()  
39 -  
40 -# if self.object.type_profile == 2:  
41 -# assign_role(self.object, 'student')  
42 -# elif self.object.type_profile == 1:  
43 -# assign_role(self.object, 'professor')  
44 -# elif self.object.is_staff:  
45 -# assign_role(self.object, 'system_admin')  
46 -  
47 -# self.object.save()  
48 -  
49 -# messages.success(self.request, ('User ')+self.object.name+(' created successfully!'))  
50 -  
51 -# return super(Create, self).form_valid(form)  
52 -# def get_context_data (self, **kwargs):  
53 -# context = super(Create, self).get_context_data(**kwargs)  
54 -# context['title'] = "Add User"  
55 -# return context  
56 28
57 # class Update(HasRoleMixin, LoginRequiredMixin, generic.UpdateView): 29 # class Update(HasRoleMixin, LoginRequiredMixin, generic.UpdateView):
58 30
@@ -181,6 +153,31 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): @@ -181,6 +153,31 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
181 153
182 return context 154 return context
183 155
  156 +class CreateView(HasRoleMixin, LoginRequiredMixin, generic.edit.CreateView):
  157 + login_url = reverse_lazy("users:login")
  158 + redirect_field_name = 'next'
  159 +
  160 + allowed_roles = ['system_admin']
  161 + template_name = 'users/create.html'
  162 + form_class = UserForm
  163 + context_object_name = 'acc'
  164 + success_url = reverse_lazy('users:manage')
  165 +
  166 + def form_valid(self, form):
  167 + self.object = form.save()
  168 +
  169 + msg = _("User %s created successfully" % self.object.get_short_name())
  170 +
  171 + messages.success(self.request, msg)
  172 +
  173 + return super(CreateView, self).form_valid(form)
  174 +
  175 + def get_context_data (self, **kwargs):
  176 + context = super(CreateView, self).get_context_data(**kwargs)
  177 + context['title'] = _("Add User")
  178 +
  179 + return context
  180 +
184 class Profile(LoginRequiredMixin, generic.DetailView): 181 class Profile(LoginRequiredMixin, generic.DetailView):
185 login_url = reverse_lazy("users:login") 182 login_url = reverse_lazy("users:login")
186 redirect_field_name = 'next' 183 redirect_field_name = 'next'