Commit 59782ae94461bc59aeb9c7138f231684536c4a16

Authored by Matheus Lins
2 parents 7e1a89ac dae43d29

Merge branch 'master' of https://github.com/amadeusproject/amadeuslms

amadeus/settings.py
@@ -58,6 +58,9 @@ MIDDLEWARE_CLASSES = [ @@ -58,6 +58,9 @@ MIDDLEWARE_CLASSES = [
58 'django.contrib.messages.middleware.MessageMiddleware', 58 'django.contrib.messages.middleware.MessageMiddleware',
59 'django.middleware.clickjacking.XFrameOptionsMiddleware', 59 'django.middleware.clickjacking.XFrameOptionsMiddleware',
60 'django.middleware.locale.LocaleMiddleware', 60 'django.middleware.locale.LocaleMiddleware',
  61 +
  62 + #libs-middleware
  63 +
61 ] 64 ]
62 65
63 ROOT_URLCONF = 'amadeus.urls' 66 ROOT_URLCONF = 'amadeus.urls'
app/templates/home_student.html
@@ -4,12 +4,10 @@ @@ -4,12 +4,10 @@
4 4
5 {% block breadcrumbs %} 5 {% block breadcrumbs %}
6 <div class="row"> 6 <div class="row">
7 - <div class="col-md-12">  
8 - <ul class="breadcrumb">  
9 - <li><a href="{% url 'core:home' %}">{% trans 'Home' %} {{ logged }}</a></li>  
10 - </ul>  
11 - </div>  
12 - </div> 7 + {% for breadcrumb in breadcrumbs %}
  8 + <a href="{{ breadcrumb.url }}">{{ breadcrumb.text }}</a>
  9 + {% endfor %}
  10 + </div>
13 {% endblock %} 11 {% endblock %}
14 12
15 {% block sidebar %} 13 {% block sidebar %}
@@ -29,6 +27,16 @@ @@ -29,6 +27,16 @@
29 27
30 {% block content %} 28 {% block content %}
31 <h3>{% trans 'Notifications' %}</h3> 29 <h3>{% trans 'Notifications' %}</h3>
  30 + {% if messages %}
  31 + {% for message in messages %}
  32 + <div class="alert alert-success alert-dismissible" role="alert">
  33 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  34 + <span aria-hidden="true">&times;</span>
  35 + </button>
  36 + <p>{{ message }}</p>
  37 + </div>
  38 + {% endfor %}
  39 + {% endif %}
32 <div class="panel panel-default"> 40 <div class="panel panel-default">
33 <div class="panel-body"> 41 <div class="panel-body">
34 His course has notified a new activity! 42 His course has notified a new activity!
1 from django import forms 1 from django import forms
2 - 2 +from django.utils.translation import ugettext_lazy as _
3 from users.models import User 3 from users.models import User
4 4
5 class RegisterUserForm(forms.ModelForm): 5 class RegisterUserForm(forms.ModelForm):
@@ -12,7 +12,7 @@ class RegisterUserForm(forms.ModelForm): @@ -12,7 +12,7 @@ class RegisterUserForm(forms.ModelForm):
12 def clean_email(self): 12 def clean_email(self):
13 email = self.cleaned_data['email'] 13 email = self.cleaned_data['email']
14 if User.objects.filter(email = email).exists(): 14 if User.objects.filter(email = email).exists():
15 - raise forms.ValidationError('Ja existe um usuario cadastrado com este E-mail') 15 + raise forms.ValidationError(_('There is already a registered User with this e-mail'))
16 return email 16 return email
17 17
18 def clean_password(self): 18 def clean_password(self):
@@ -20,13 +20,13 @@ class RegisterUserForm(forms.ModelForm): @@ -20,13 +20,13 @@ class RegisterUserForm(forms.ModelForm):
20 20
21 # At least MIN_LENGTH long 21 # At least MIN_LENGTH long
22 if len(password) < self.MIN_LENGTH: 22 if len(password) < self.MIN_LENGTH:
23 - raise forms.ValidationError("A senha deve conter no minimo %d caracteres." % self.MIN_LENGTH) 23 + raise forms.ValidationError(_("The password must contain at least % d characters." % self.MIN_LENGTH))
24 24
25 # At least one letter and one non-letter 25 # At least one letter and one non-letter
26 first_isalpha = password[0].isalpha() 26 first_isalpha = password[0].isalpha()
27 if all(c.isalpha() == first_isalpha for c in password): 27 if all(c.isalpha() == first_isalpha for c in password):
28 - raise forms.ValidationError("A senha deve conter pelo menos uma letra e pelo menos um digito ou "\  
29 - "um caractere de pontuacao.") 28 + raise forms.ValidationError(_('The password must contain at least one letter and at least one digit or '\
  29 + "a punctuation character."))
30 30
31 return password 31 return password
32 32
@@ -35,7 +35,7 @@ class RegisterUserForm(forms.ModelForm): @@ -35,7 +35,7 @@ class RegisterUserForm(forms.ModelForm):
35 password2 = self.cleaned_data.get("password2") 35 password2 = self.cleaned_data.get("password2")
36 36
37 if password and password2 and password != password2: 37 if password and password2 and password != password2:
38 - raise forms.ValidationError('A confirmacao da senha esta incorreta') 38 + raise forms.ValidationError(_('The confirmation password is incorrect.'))
39 return password2 39 return password2
40 40
41 def save(self, commit=True): 41 def save(self, commit=True):
core/static/css/base/amadeus.css
@@ -40,6 +40,7 @@ h5{ @@ -40,6 +40,7 @@ h5{
40 } 40 }
41 41
42 #logo{ 42 #logo{
  43 + max-width: 30%;
43 margin-top: 2em; 44 margin-top: 2em;
44 margin-bottom: 2em; 45 margin-bottom: 2em;
45 } 46 }
core/templates/index.html
@@ -11,11 +11,16 @@ @@ -11,11 +11,16 @@
11 11
12 {% block content %} 12 {% block content %}
13 <div class="row logo-row"> 13 <div class="row logo-row">
14 - <div class="col-md-offset-4 col-md-4 col-xs-4 col-xs-offset-4 logoLogin">  
15 - <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus">  
16 - </div> 14 + <div class="col-lg-offset-2 col-lg-9">
  15 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo">
17 </div> 16 </div>
18 17
  18 + <div class="row">
  19 + {% for breadcrumb in breadcrumbs %}
  20 + <a href="{{ breadcrumb.url }}">{{ breadcrumb.text }}</a>
  21 + {% endfor %}
  22 + </div>
  23 +
19 <div class="row "> 24 <div class="row ">
20 <div class="col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3"> 25 <div class="col-md-8 col-md-offset-2 col-sm-6 col-sm-offset-3">
21 <div class="card"> 26 <div class="card">
core/templates/register_user.html
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 </div> 14 </div>
15 {% endif %} 15 {% endif %}
16 <div class="row logo-row"> 16 <div class="row logo-row">
17 - <div class="col-lg-offset-4 col-md-4"> 17 + <div class="col-lg-offset-2 col-lg-9">
18 <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo"> 18 <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo">
19 </div> 19 </div>
20 </div> 20 </div>
@@ -28,11 +28,26 @@ @@ -28,11 +28,26 @@
28 {% csrf_token %} 28 {% csrf_token %}
29 <legend>{% trans 'User Register' %}</legend> 29 <legend>{% trans 'User Register' %}</legend>
30 {% for field in form %} 30 {% for field in form %}
31 - <div class="form-group is-empy{% if form.has_error %} has-error {% endif %}"> 31 + <div class="form-group is-empy{% if form.has_error %} has-error {% endif %} is-fileinput">
32 <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}</label> 32 <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}</label>
33 <div class="col-md-8"> 33 <div class="col-md-8">
34 - {% render_field field class='form-control input-sm' %}  
35 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> 34 + {% if field.auto_id == 'id_birth_date' %}
  35 + {% render_field field class='form-control input-sm' type='date' %}
  36 + <span id="helpBlock" class="help-block">{{ field.help_text }}</span>
  37 + {% elif field.auto_id == 'id_image' %}
  38 + {% render_field field class='form-control input-sm' %}
  39 + <div class="input-group">
  40 + <input type="text" readonly="" class="form-control" placeholder="Choose your photo...">
  41 + <span class="input-group-btn input-group-sm">
  42 + <button type="button" class="btn btn-fab btn-fab-mini">
  43 + <i class="material-icons">attach_file</i>
  44 + </button>
  45 + </span>
  46 + </div>
  47 + {% else %}
  48 + {% render_field field class='form-control input-sm' %}
  49 + <span id="helpBlock" class="help-block">{{ field.help_text }}</span>
  50 + {% endif %}
36 </div> 51 </div>
37 52
38 {% if field.errors %} 53 {% if field.errors %}
@@ -49,9 +64,12 @@ @@ -49,9 +64,12 @@
49 {% endif %} 64 {% endif %}
50 </div> 65 </div>
51 {% endfor %} 66 {% endfor %}
52 - <div class="col-md-offset-4"> 67 + <div class="col-md-offset-4 col-md-2 col-sm-2 col-xs-2">
53 <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> 68 <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />
54 </div> 69 </div>
  70 + <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2">
  71 + <a href="{% url 'core:home' %}" class="btn btn-sm btn-success" >{% trans 'Login' %}</a>
  72 + </div>
55 73
56 </form> 74 </form>
57 </div> 75 </div>
@@ -75,7 +75,7 @@ class RegisterUserTestCase(TestCase): @@ -75,7 +75,7 @@ class RegisterUserTestCase(TestCase):
75 'gender': 'F', 75 'gender': 'F',
76 } 76 }
77 response = self.client.post(self.url, data) 77 response = self.client.post(self.url, data)
78 - self.assertFormError(response, 'form', 'password2', 'A confirmacão da senha está incorreta') 78 + self.assertFormError(response, 'form', 'password2', 'The confirmation password is incorrect.')
79 79
80 data = { 80 data = {
81 'username': 'testeamadeus', 81 'username': 'testeamadeus',
@@ -87,6 +87,7 @@ class RegisterUserTestCase(TestCase): @@ -87,6 +87,7 @@ class RegisterUserTestCase(TestCase):
87 'state': 'PE', 87 'state': 'PE',
88 'gender': 'F', 88 'gender': 'F',
89 } 89 }
  90 +
90 response = self.client.post(self.url, data) 91 response = self.client.post(self.url, data)
91 self.assertFormError(response, 'form', 'email', 'Insira um endereço de email válido.') 92 self.assertFormError(response, 'form', 'email', 'Insira um endereço de email válido.')
92 93
@@ -141,9 +142,25 @@ class UpdateUserTestCase(TestCase): @@ -141,9 +142,25 @@ class UpdateUserTestCase(TestCase):
141 def setUp(self): 142 def setUp(self):
142 self.client = Client() 143 self.client = Client()
143 144
144 - self.url = reverse('users:update_user') 145 + self.user = User.objects.create_user(
  146 + username = 'test',
  147 + email = 'testing@amadeus.com',
  148 + is_staff = False,
  149 + is_active = True,
  150 + password = 'testing1'
  151 + )
  152 +
  153 + assign_role(self.user, 'student')
  154 +
  155 + self.url = reverse('users:update_profile')
  156 +
  157 + def test_update_ok(self):
  158 + #LOGGING USER TO TEST
  159 + data = {'username': 'test', 'password': 'testing1'}
  160 + response = self.client.post(reverse('core:home'), data)
  161 + self.assertRedirects(response, reverse('app:index'))
  162 +
145 163
146 - def test_get_post(self):  
147 data={ 164 data={
148 'username': 'testeamadeus', 165 'username': 'testeamadeus',
149 'email': 'teste@amadeus.com', 166 'email': 'teste@amadeus.com',
@@ -153,7 +170,52 @@ class UpdateUserTestCase(TestCase): @@ -153,7 +170,52 @@ class UpdateUserTestCase(TestCase):
153 'gender': 'F', 170 'gender': 'F',
154 } 171 }
155 # self.assertRedirects(response1, reverse('app:index')) 172 # self.assertRedirects(response1, reverse('app:index'))
  173 + response = self.client.get(self.url)
  174 + self.assertEqual(response.status_code, 200)
156 response = self.client.post(self.url, data) 175 response = self.client.post(self.url, data)
157 self.assertEqual(response.status_code, 302) 176 self.assertEqual(response.status_code, 302)
  177 +
  178 + def test_update_error(self):
  179 +
  180 + #LOGING USER TO TEST
  181 + data = {'username': 'test', 'password': 'testing1'}
  182 + response = self.client.post(reverse('core:home'), data)
  183 + self.assertRedirects(response, reverse('app:index'))
  184 +
158 response = self.client.get(self.url) 185 response = self.client.get(self.url)
159 - self.assertEqual(response.status_code, 302) 186 + self.assertEquals(response.status_code, 200)
  187 +
  188 + data = {
  189 + 'username': '',
  190 + 'email': 'teste@amadeus.com',
  191 + 'name': 'Teste Amadeus',
  192 + 'city': 'Praia',
  193 + 'state': 'PE',
  194 + 'gender': 'F',
  195 + }
  196 + response = self.client.post(self.url, data)
  197 + self.assertFormError(response, 'form', 'username', 'Este campo é obrigatório.')
  198 +
  199 +
  200 +class DeleteUserTestCase(TestCase):
  201 + def setUp(self):
  202 + self.client = Client()
  203 +
  204 + self.user = User.objects.create_user(
  205 + username = 'test',
  206 + email = 'testing@amadeus.com',
  207 + is_staff = True,
  208 + is_active = True,
  209 + password = 'testing'
  210 + )
  211 +
  212 + assign_role(self.user, 'student')
  213 + self.url = reverse('core:home')
  214 +
  215 + def tearDown(test):
  216 + User.objects.get(email='testing@amadeus.com').delete()
  217 +
  218 + def test_delete_ok(self):
  219 + pass
  220 +
  221 +
requirements.txt
  1 +click==6.6
1 Django==1.10 2 Django==1.10
2 -django-autoslug==1.9.3  
3 django-discover-runner==1.0 3 django-discover-runner==1.0
4 django-role-permissions==1.2.1 4 django-role-permissions==1.2.1
5 django-widget-tweaks==1.4.1 5 django-widget-tweaks==1.4.1
6 djangorestframework==3.4.6 6 djangorestframework==3.4.6
  7 +itsdangerous==0.24
  8 +Jinja2==2.8
  9 +MarkupSafe==0.23
7 Pillow==3.3.1 10 Pillow==3.3.1
8 psycopg2==2.6.2 11 psycopg2==2.6.2
9 six==1.10.0 12 six==1.10.0
10 slugify==0.0.1 13 slugify==0.0.1
  14 +Werkzeug==0.11.11
  15 +wheel==0.24.0
users/templates/users/edit_profile.html
@@ -22,12 +22,6 @@ @@ -22,12 +22,6 @@
22 {% endblock %} 22 {% endblock %}
23 23
24 {% block content %} 24 {% block content %}
25 - <div class="alert alert-info alert-dismissible" role="alert">  
26 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
27 - <span aria-hidden="true">&times;</span>  
28 - </button>  
29 - <p>{% trans 'All fields are required' %}</p>  
30 - </div>  
31 {% if messages %} 25 {% if messages %}
32 {% for message in messages %} 26 {% for message in messages %}
33 <div class="alert alert-success alert-dismissible" role="alert"> 27 <div class="alert alert-success alert-dismissible" role="alert">
users/templates/users/profile.html
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <a href="{% url 'users:profile' %}" class="list-group-item active"> 15 <a href="{% url 'users:profile' %}" class="list-group-item active">
16 {% trans 'Profile' %} 16 {% trans 'Profile' %}
17 </a> 17 </a>
18 - <a href="{% url 'users:edit_profile' user.id %}" class="list-group-item"> 18 + <a href="{% url 'users:update_profile' %}" class="list-group-item">
19 {% trans 'Edit Profile' %} 19 {% trans 'Edit Profile' %}
20 </a> 20 </a>
21 </div> 21 </div>
@@ -10,5 +10,6 @@ urlpatterns = [ @@ -10,5 +10,6 @@ urlpatterns = [
10 url(r'^profile/$', views.Profile.as_view(), name='profile'), 10 url(r'^profile/$', views.Profile.as_view(), name='profile'),
11 url(r'^profile/editar/(?P<username>[\w_-]+)/$', views.EditProfile.as_view(), name='edit_profile'), 11 url(r'^profile/editar/(?P<username>[\w_-]+)/$', views.EditProfile.as_view(), name='edit_profile'),
12 # 12 #
13 - url(r'^profile/update/$', views.UpdateUser.as_view(), name='update_user'), 13 + url(r'^profile/update/$', views.UpdateUser.as_view(), name='update_profile'),
  14 + url(r'^profile/delete/$', views.DeleteUser.as_view(), name='delete_profile'),
14 ] 15 ]
users/views.py
@@ -133,10 +133,11 @@ class EditProfile(LoginRequiredMixin, generic.UpdateView): @@ -133,10 +133,11 @@ class EditProfile(LoginRequiredMixin, generic.UpdateView):
133 133
134 return super(EditProfile, self).form_valid(form) 134 return super(EditProfile, self).form_valid(form)
135 135
  136 +
136 class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView): 137 class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView):
137 allowed_roles = ['student'] 138 allowed_roles = ['student']
138 login_url = reverse_lazy("core:home") 139 login_url = reverse_lazy("core:home")
139 - # template_name = 'users/edit_profile.html' 140 + template_name = 'users/edit_profile.html'
140 form_class = UpdateUserForm 141 form_class = UpdateUserForm
141 success_url = reverse_lazy('app:index') 142 success_url = reverse_lazy('app:index')
142 143
@@ -149,3 +150,14 @@ class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView): @@ -149,3 +150,14 @@ class UpdateUser(LoginRequiredMixin, generic.edit.UpdateView):
149 messages.success(self.request, _('Profile edited successfully!')) 150 messages.success(self.request, _('Profile edited successfully!'))
150 151
151 return super(UpdateUser, self).form_valid(form) 152 return super(UpdateUser, self).form_valid(form)
  153 +
  154 +class DeleteUser(LoginRequiredMixin, generic.edit.DeleteView):
  155 + allowed_roles = ['student']
  156 + login_url = reverse_lazy("core:home")
  157 + model = User
  158 + success_url = reverse_lazy('core:index')
  159 + success_message = "Deleted Successfully"
  160 +
  161 + def get_queryset(self):
  162 + user = get_object_or_404(User, username = self.request.user.username)
  163 + return user