Commit 10867b6240955bc052bf083e2965e2194092e3a3

Authored by Zambom
1 parent ede23711

Adding create user

amadeus/templates/base.html
... ... @@ -169,6 +169,11 @@
169 169  
170 170 <!-- Init material Bootstrap -->
171 171 <script type="text/javascript">$.material.init()</script>
  172 + <script type="text/javascript">
  173 + $('.text_wysiwyg').summernote({
  174 + height: 200
  175 + });
  176 + </script>
172 177 </body>
173 178  
174 179 </html>
175 180 \ No newline at end of file
... ...
users/forms.py
... ... @@ -86,4 +86,26 @@ class ProfileForm(Validation):
86 86 fields = ['social_name', 'description', 'show_email', 'image']
87 87 widgets = {
88 88 'description': forms.Textarea,
89   - }
90 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 113 \ No newline at end of file
... ...
users/migrations/0003_auto_20161222_1505.py 0 → 100644
... ... @@ -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 29 image = models.ImageField(verbose_name = _('Photo'), null=True, blank = True, upload_to = 'users/', validators = [validate_img_extension])
30 30 date_created = models.DateTimeField(_('Create Date'), auto_now_add = True)
31 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 33 is_staff = models.BooleanField(_('Administrator'), default = False)
34 34 is_active = models.BooleanField(_('Active'), default = True)
35 35  
... ... @@ -46,7 +46,7 @@ class User(AbstractBaseUser, PermissionsMixin):
46 46 return self.social_name or self.username
47 47  
48 48 def get_short_name(self):
49   - return self.username
  49 + return str(self)
50 50  
51 51 @property
52 52 def image_url(self):
... ...
users/templates/users/create.html
1   -{% extends 'list_users.html' %}
  1 +{% extends 'users/list.html' %}
2 2  
3 3 {% load static i18n %}
4 4 {% load widget_tweaks %}
... ... @@ -6,25 +6,11 @@
6 6 {% load django_bootstrap_breadcrumbs %}
7 7  
8 8 {% block breadcrumbs %}
9   -
10   - {{ block.super }}
  9 + {{ block.super }}
11 10 {% breadcrumb 'Add User' 'users:create' %}
12   -
13 11 {% endblock %}
14 12  
15   -
16 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 14 <div class="card">
29 15 <div class="card-content">
30 16 <div class="card-body">
... ... @@ -32,15 +18,7 @@
32 18 {% csrf_token %}
33 19 {% for field in form %}
34 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 22 {% if field.field.required %}
45 23 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
46 24 {% else %}
... ... @@ -55,51 +33,19 @@
55 33 </button>
56 34 </span>
57 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 38 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
62 39 {% else %}
63 40 <label for="{{ field.auto_id }}">{{ field.label }}</label>
64 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 43 {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %}
75 44 <div class="checkbox">
76 45 <label for="{{ field.auto_id }}">
77 46 {% render_field field %} {{field.label}}
78 47 </label>
79 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 49 {% else %}
104 50 {% if field.field.required %}
105 51 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
... ... @@ -123,24 +69,11 @@
123 69 {% endif %}
124 70 </div>
125 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 74 </div>
132 75 </form>
133 76 </div>
134 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 79 {% endblock %}
... ...
users/templates/users/edit_profile.html
... ... @@ -69,11 +69,5 @@
69 69 </form>
70 70 </div>
71 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 73 {% endblock %}
... ...
users/templates/users/list.html
... ... @@ -38,7 +38,7 @@
38 38 </form>
39 39 </div>
40 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 42 </div>
43 43 </div>
44 44  
... ... @@ -54,7 +54,11 @@
54 54 <div class="col-md-6">
55 55 <p><b>{% trans 'Name' %}:</b> {{ acc }}</p>
56 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 62 </div>
59 63 <div class="col-md-3">
60 64 <div align="right">
... ...
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'^create/$', views.CreateView.as_view(), name = 'create'),
11 12 url(r'^profile/$', views.Profile.as_view(), name = 'profile'),
12 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 14 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
15 15  
16 16 from .models import User
17   -from .forms import RegisterUserForm, ProfileForm
  17 +from .forms import RegisterUserForm, ProfileForm, UserForm
18 18  
19 19 #API IMPORTS
20 20 from rest_framework import viewsets
... ... @@ -24,35 +24,7 @@ from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnl
24 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 29 # class Update(HasRoleMixin, LoginRequiredMixin, generic.UpdateView):
58 30  
... ... @@ -181,6 +153,31 @@ class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
181 153  
182 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 181 class Profile(LoginRequiredMixin, generic.DetailView):
185 182 login_url = reverse_lazy("users:login")
186 183 redirect_field_name = 'next'
... ...