Commit f90589bf9ee699dbae2d8fe3bcf14c89f2d5da51

Authored by Matheus Lins
2 parents 5309b7f9 a05687ab

conflit

app/forms.py 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +from django import forms
  2 +from .models import EmailBackend
  3 +from django.utils.translation import ugettext_lazy as _
  4 +
  5 +class EmailBackendForm(forms.ModelForm):
  6 +
  7 + class Meta:
  8 + model = EmailBackend
  9 + fields = ('description', 'host', 'port', 'username', 'password', 'safe_conection', 'default_from_email')
  10 + help_texts = {
  11 + 'host': _('A host name. Example: smtp.gmail.com'),
  12 + 'port': _('A port number'),
  13 + 'usermane': _('Your host username'),
  14 + 'password': _('Your host password'),
  15 + }
  16 +
  17 +
0 \ No newline at end of file 18 \ No newline at end of file
1 from django.db import models 1 from django.db import models
2 - 2 +from django.utils.translation import ugettext_lazy as _
3 # Create your models here. 3 # Create your models here.
  4 +
  5 +class EmailBackend(models.Model):
  6 +
  7 + SAFE_CONECTIONS = (
  8 + (0, _('No')),
  9 + (1, _('TLS, if available')),
  10 + (2, 'TLS'),
  11 + (3, 'SSL'),
  12 +
  13 + )
  14 + description = models.CharField(_('Description'), max_length=100)
  15 + host = models.URLField(_('E-mail Host'))
  16 + port = models.CharField(_('Email Port'), max_length=4, blank=True)
  17 + username = models.CharField(_('Email host username'), max_length=30)
  18 + password = models.CharField(_('Email host password'), max_length=30, blank=True)
  19 + safe_conection = models.IntegerField(_('Use safe conection'), choices=SAFE_CONECTIONS, default=0)
  20 + default_from_email = models.EmailField(_('Default from email'), blank=True)
  21 +
  22 + class Meta:
  23 + verbose_name = _('Amadeus SMTP setting')
  24 + verbose_name_plural = _('Amadeus SMTP settings')
  25 +
  26 + def __str__(self):
  27 + return _('Custom email Backend')
app/templates/admin_settings.html 0 → 100644
@@ -0,0 +1,135 @@ @@ -0,0 +1,135 @@
  1 +{% extends "home.html" %}
  2 +
  3 +{% load static i18n django_bootstrap_breadcrumbs permission_tags %}
  4 +
  5 +{% block breadcrumbs %}
  6 + {{ block.super }}
  7 + {% breadcrumb 'Settings' 'app:settings' %}
  8 +{% endblock %}
  9 +
  10 +{% block content %}
  11 + <!-- Nav tabs -->
  12 + <ul class="nav nav-tabs md-pills pills-ins" role="tablist">
  13 + <li class="nav-item">
  14 + <a class="nav-link active" data-toggle="tab" href="#panel1" role="tab"><i class="fa fa-cog"></i> System</a>
  15 + </li>
  16 + <li class="nav-item">
  17 + <a class="nav-link" data-toggle="tab" href="#panel2" role="tab"><i class="fa fa-envelope"></i> Mail Sender</a>
  18 + </li>
  19 + <li class="nav-item">
  20 + <a class="nav-link" data-toggle="tab" href="#panel3" role="tab"><i class="fa fa-lock"></i> Security</a>
  21 + </li>
  22 + </ul>
  23 +
  24 + <!-- Tab panels -->
  25 + <div class="tab-content">
  26 + <!--Panel 1-->
  27 + <div class="tab-pane fade in active" id="panel1" role="tabpanel">
  28 + <div class="panel panel-default">
  29 + <div class="panel-body">
  30 + <h3><b>General</b></h3>
  31 + <div class="panel panel-default">
  32 + <div class="panel-body">
  33 + Content
  34 + <hr>
  35 + </div>
  36 + </div>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <!--/.Panel 1-->
  41 +
  42 + <!--Panel 2-->
  43 + <div class="tab-pane fade" id="panel2" role="tabpanel">
  44 + <div class="panel panel-default">
  45 + <div class="panel-body">
  46 + <h3><b>Outgoing Server (SMTP)</b></h3>
  47 + <div class="panel panel-default">
  48 + <div class="panel-body">
  49 + <h4><b>Settings</b></b></h4>
  50 + <hr>
  51 + <div class="form-group label-floating">
  52 + <label class="control-label" for="focusedInput1">Description</label>
  53 + <input class="form-control" id="focusedInput1" type="text">
  54 + </div>
  55 + <div class="form-group label-floating">
  56 + <label class="control-label" for="focusedInput1">Server</label>
  57 + <input class="form-control" id="focusedInput1" type="text">
  58 + </div>
  59 + <div class="form-group label-floating">
  60 + <label for="number" class="col-md_10 control-label">Port</label>
  61 + <div class="col-md-2">
  62 + <input type="number" class="form-control" id="inputNumber">
  63 + </div>
  64 + <div>
  65 + <label for="number">Deafault:</label> 25
  66 + </div>
  67 + </div>
  68 + </div>
  69 + </div>
  70 + </div>
  71 + <div class="panel-body">
  72 + <div class="panel panel-default">
  73 + <div class="panel-body">
  74 + <h4><b>Security and Authentication</b></h4>
  75 + <hr>
  76 + <div class="form-group label-floating">
  77 + <label class="control-label" for="focusedInput1">User Name</label>
  78 + <input class="form-control" id="focusedInput1" type="text">
  79 + </div>
  80 + <div class="form-group label-floating">
  81 + <label class="control-label" for="focusedInput1">Password</label>
  82 + <input class="form-control" id="focusedInput1" type="password">
  83 + </div>
  84 + <div class="form-group">
  85 + <p><b>Use safe contection</b></p>
  86 + <div class="col-md-10">
  87 + <div class="radio radio-primary">
  88 + <label>
  89 + <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1">
  90 + No
  91 + </label>
  92 + <label>
  93 + <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2">
  94 + TSL, If available
  95 + </label>
  96 + <label>
  97 + <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3">
  98 + TSL
  99 + </label>
  100 + <label>
  101 + <input type="radio" name="optionsRadios" id="optionsRadios4" value="option4" checked="">
  102 + SSL
  103 + </label>
  104 + </div>
  105 + </div>
  106 + </div>
  107 + </div>
  108 + </div>
  109 + <button type="button" class="btn btn-success btn-raised">Save changes</button>
  110 + </div>
  111 + </div>
  112 + </div>
  113 +
  114 + <!--/.Panel 2-->
  115 +
  116 + <!--Panel 3-->
  117 + <div class="tab-pane fade" id="panel3" role="tabpanel">
  118 + <div class="panel panel-default">
  119 + <div class="panel-body">
  120 + <div class="togglebutton">
  121 + <label>
  122 + <input type="checkbox" checked> <b>Allow users self-enroll.</b>
  123 + </label>
  124 + </div>
  125 + <div class="togglebutton">
  126 + <label>
  127 + <input type="checkbox"> <b>Put the system in maintenance mode.</b>
  128 + </label>
  129 + </div>
  130 + <button type="button" class="btn btn-primary">Save changes</button>
  131 + </div>
  132 + </div>
  133 + </div>
  134 + </div>
  135 +{% endblock content %}
0 \ No newline at end of file 136 \ No newline at end of file
app/templates/home.html
@@ -5,8 +5,14 @@ @@ -5,8 +5,14 @@
5 {% block javascript %} 5 {% block javascript %}
6 {% if page_obj %} 6 {% if page_obj %}
7 <script type="text/javascript"> 7 <script type="text/javascript">
8 - var pageNum = {{ page_obj.number }}; // The latest page loaded  
9 - var numberPages = {{ paginator.num_pages }}; // Indicates the number of pages 8 + {% if page_obj and paginator %}
  9 + var pageNum = {{ page_obj.number }}; // The latest page loaded
  10 + var numberPages = {{ paginator.num_pages }}; // Indicates the number of pages
  11 + {% else %}
  12 + var pageNum = 0 ; // The latest page loaded
  13 + var numberPages = 0 ; // Indicates the number of pages
  14 + {% endif %}
  15 +
10 var baseUrl = '{% url "app:index" %}'; 16 var baseUrl = '{% url "app:index" %}';
11 17
12 // loadOnScroll handler 18 // loadOnScroll handler
@@ -79,6 +85,7 @@ @@ -79,6 +85,7 @@
79 <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li> 85 <li><a href="{% url 'core:guest' %}">{% trans 'Courses' %}</a></li>
80 {% if user|has_role:'system_admin' %} 86 {% if user|has_role:'system_admin' %}
81 <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> 87 <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li>
  88 + <li> <a href="{% url 'app:settings' %}">{% trans 'Settings' %}</a></li>
82 {% endif %} 89 {% endif %}
83 {% if user|has_role:'system_admin' or user|has_role:'professor' %} 90 {% if user|has_role:'system_admin' or user|has_role:'professor' %}
84 <li> 91 <li>
@@ -4,4 +4,5 @@ from . import views @@ -4,4 +4,5 @@ from . import views
4 4
5 urlpatterns = [ 5 urlpatterns = [
6 url(r'^$', views.AppIndex.as_view(), name='index'), 6 url(r'^$', views.AppIndex.as_view(), name='index'),
  7 + url(r'^settings$', views.AmadeusSettings.as_view(), name='settings'),
7 ] 8 ]
1 from django.shortcuts import render 1 from django.shortcuts import render
2 from django.views.generic import ListView 2 from django.views.generic import ListView
  3 +from django.views import View
  4 +from rolepermissions.mixins import HasRoleMixin
3 from django.contrib.auth.mixins import LoginRequiredMixin 5 from django.contrib.auth.mixins import LoginRequiredMixin
4 from django.core.urlresolvers import reverse_lazy 6 from django.core.urlresolvers import reverse_lazy
5 from core.mixins import LogMixin, NotificationMixin 7 from core.mixins import LogMixin, NotificationMixin
6 from core.models import Notification, Action, Resource, Action_Resource 8 from core.models import Notification, Action, Resource, Action_Resource
7 from users.models import User 9 from users.models import User
  10 +from .models import EmailBackend
  11 +from .forms import EmailBackendForm
8 from courses.models import Course 12 from courses.models import Course
9 13
10 class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): 14 class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
@@ -42,4 +46,17 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin): @@ -42,4 +46,17 @@ class AppIndex(LoginRequiredMixin, LogMixin, ListView, NotificationMixin):
42 46
43 return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs) 47 return self.response_class(request = self.request, template = self.template_name, context = context, using = self.template_engine, **response_kwargs)
44 48
  49 +class AmadeusSettings(LoginRequiredMixin, HasRoleMixin, View):
  50 + allowed_roles = ['system_admin']
  51 + login_url = reverse_lazy("core:home")
  52 + redirect_field_name = 'next'
  53 + model = EmailBackend
  54 + template_name = 'admin_settings.html'
  55 + form_class = EmailBackendForm
  56 + success_url = reverse_lazy('app:settings')
  57 +
  58 + def get(self, request):
  59 + return render(request, self.template_name, )
  60 +
  61 +
45 62
core/static/css/base/amadeus.css
@@ -2,6 +2,10 @@ @@ -2,6 +2,10 @@
2 clear: both; 2 clear: both;
3 } 3 }
4 4
  5 +.mg-b-5m{
  6 + margin-bottom: 5em;
  7 +}
  8 +
5 .navbar .logo {position: absolute; top: 6px; text-align: center; height: 48px; width: 48px;} 9 .navbar .logo {position: absolute; top: 6px; text-align: center; height: 48px; width: 48px;}
6 10
7 /* Modal */ 11 /* Modal */
@@ -404,6 +408,7 @@ ul, li { @@ -404,6 +408,7 @@ ul, li {
404 .dropdown-menu .pull-right { 408 .dropdown-menu .pull-right {
405 right: 0; 409 right: 0;
406 } 410 }
  411 + .editation{display: none}
407 .moreAccordion{ padding-left: 0px; padding-right: 0px;} 412 .moreAccordion{ padding-left: 0px; padding-right: 0px;}
408 .moreAccordion div button{ padding-left: 0px; padding-right: 0px;} 413 .moreAccordion div button{ padding-left: 0px; padding-right: 0px;}
409 .cards-content{ padding-left: 0px; padding-right: 0px; } 414 .cards-content{ padding-left: 0px; padding-right: 0px; }
core/static/js/base/amadeus.js
@@ -14,6 +14,7 @@ function campoNumerico(campo, evento){ @@ -14,6 +14,7 @@ function campoNumerico(campo, evento){
14 return true; 14 return true;
15 } else { 15 } else {
16 evento.returnValue = false; 16 evento.returnValue = false;
  17 + evento.preventDefault();
17 return false; 18 return false;
18 } 19 }
19 }; 20 };
@@ -28,7 +29,7 @@ function formatarCpf(campo, evento){ @@ -28,7 +29,7 @@ function formatarCpf(campo, evento){
28 } 29 }
29 else if( evento ) { // Firefox 30 else if( evento ) { // Firefox
30 codTecla = evento.which; 31 codTecla = evento.which;
31 - } 32 + }
32 tamanho = campo.value.length; 33 tamanho = campo.value.length;
33 if( (codTecla > 47 && codTecla < 58) || codTecla== 8 || codTecla == 0){ 34 if( (codTecla > 47 && codTecla < 58) || codTecla== 8 || codTecla == 0){
34 if(tamanho < 14 ){ 35 if(tamanho < 14 ){
@@ -41,8 +42,8 @@ function formatarCpf(campo, evento){ @@ -41,8 +42,8 @@ function formatarCpf(campo, evento){
41 } 42 }
42 }else{ 43 }else{
43 evento.returnValue = false; 44 evento.returnValue = false;
  45 + return false;
44 } 46 }
45 - return true;  
46 } else { 47 } else {
47 return false; 48 return false;
48 } 49 }
@@ -61,30 +62,28 @@ function formatarTelefone(campo, evento){ @@ -61,30 +62,28 @@ function formatarTelefone(campo, evento){
61 } 62 }
62 tamanho = campo.value.length; 63 tamanho = campo.value.length;
63 64
64 - if(((codTecla > 47 && codTecla < 58) || (codTecla == 8)) && tamanho < 15){ 65 + if(((codTecla > 47 && codTecla < 58) && tamanho < 15)){
65 66
66 if(tamanho == 0){ 67 if(tamanho == 0){
67 campo.value = "(" + campo.value; 68 campo.value = "(" + campo.value;
68 }else if( tamanho == 3 ){ 69 }else if( tamanho == 3 ){
69 campo.value = campo.value + ") "; 70 campo.value = campo.value + ") ";
70 - }else if(tamanho == 9){ 71 + }else if(tamanho == 10){
71 campo.value = campo.value + "-"; 72 campo.value = campo.value + "-";
72 - }else if(tamanho == 14){  
73 - // alert('oi');  
74 - campo.value = campo.value.slice(0, 4) + campo.value.slice(5, 14);  
75 - campo.value = campo.value.slice(0, 8) + campo.value.slice(9, 10) + campo.value.slice(8, 9) + campo.value.slice(10, 14)  
76 } 73 }
77 return true; 74 return true;
78 75
  76 +
79 } else if(codTecla == 0 || codTecla == 8){ 77 } else if(codTecla == 0 || codTecla == 8){
80 return true; 78 return true;
81 } else { 79 } else {
82 evento.returnValue = false; 80 evento.returnValue = false;
  81 + evento.preventDefault()
83 return false; 82 return false;
84 } 83 }
  84 + evento.preventDefault()
85 return false; 85 return false;
86 -}  
87 - 86 +};
88 /* 87 /*
89 This functions get the next 5 notifications from the user given a "step"(an amount) of previous notifications 88 This functions get the next 5 notifications from the user given a "step"(an amount) of previous notifications
90 */ 89 */
core/templates/base.html
@@ -20,21 +20,27 @@ @@ -20,21 +20,27 @@
20 20
21 <!-- Bootstrap and themes (material) --> 21 <!-- Bootstrap and themes (material) -->
22 <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}"> 22 <link rel="stylesheet" type="text/css" href="{% static 'bootstrap-3.3.7/css/bootstrap.css' %}">
23 - <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/material.min.css' %}">  
24 - <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/ripples.min.css' %}"> 23 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.css' %}">
  24 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/bootstrap-material-design.min.css' %}">
  25 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.css' %}">
  26 + <link rel="stylesheet" type="text/css" href="{% static 'material/css/ripples.min.css' %}">
  27 +
  28 +
25 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/bootstrap-datepicker.standalone.css' %}"> 29 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/bootstrap-datepicker.standalone.css' %}">
26 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/alertify.min.css' %}"> 30 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/alertify.min.css' %}">
27 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}"> 31 <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}">
28 <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script> 32 <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script>
29 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script> 33 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script>
30 - <script type="text/javascript" src="{% static 'js/vendor/material.min.js' %}"></script>  
31 - <script type="text/javascript" src="{% static 'js/vendor/ripples.min.js' %}"></script> 34 + <script type="text/javascript" src="{% static 'material/js/material.js' %}"></script>
  35 + <script type="text/javascript" src="{% static 'material/js/material.min.js' %}"></script>
  36 + <script type="text/javascript" src="{% static 'material/js/ripples.js' %}"></script>
  37 + <script type="text/javascript" src="{% static 'material/js/ripples.min.js' %}"></script>
32 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script> 38 <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script>
33 39
34 {% with "js/vendor/locales/bootstrap-datepicker."|add:LANGUAGE_CODE|add:".js" as locale_datepicker %} 40 {% with "js/vendor/locales/bootstrap-datepicker."|add:LANGUAGE_CODE|add:".js" as locale_datepicker %}
35 <script type="text/javascript" src="{% static locale_datepicker %}"></script> 41 <script type="text/javascript" src="{% static locale_datepicker %}"></script>
36 {% endwith %} 42 {% endwith %}
37 - 43 +
38 <script type="text/javascript" src="{% static 'js/vendor/alertify.min.js' %}"></script> 44 <script type="text/javascript" src="{% static 'js/vendor/alertify.min.js' %}"></script>
39 <script type="text/javascript" src="{% static 'js/vendor/jscookie.js' %}"></script> 45 <script type="text/javascript" src="{% static 'js/vendor/jscookie.js' %}"></script>
40 46
@@ -140,7 +146,7 @@ @@ -140,7 +146,7 @@
140 </ul> 146 </ul>
141 </div> 147 </div>
142 </div> 148 </div>
143 - 149 +
144 {% endif %} 150 {% endif %}
145 {% endblock %} 151 {% endblock %}
146 </div> 152 </div>
@@ -158,6 +164,10 @@ @@ -158,6 +164,10 @@
158 {% block script_file %} 164 {% block script_file %}
159 165
160 {% endblock script_file %} 166 {% endblock script_file %}
  167 +
  168 + {% block script_link %}
  169 +
  170 + {% endblock script_link %}
161 </body> 171 </body>
162 172
163 </html> 173 </html>
core/templates/register_user.html
@@ -6,6 +6,10 @@ @@ -6,6 +6,10 @@
6 {% block nav %} 6 {% block nav %}
7 {% endblock %} 7 {% endblock %}
8 8
  9 +{% block sidebar %}
  10 +
  11 +{% endblock sidebar %}
  12 +
9 13
10 {% block content %} 14 {% block content %}
11 {% if messages %} 15 {% if messages %}
@@ -19,85 +23,79 @@ @@ -19,85 +23,79 @@
19 {% endfor %} 23 {% endfor %}
20 {% endif %} 24 {% endif %}
21 <div class="row"> 25 <div class="row">
22 - <div class="col-sm-6 col-sm-offset-4 col-md-6 col-md-offset-4 col-xs-6 col-xs-offset-4 col-lg-6 col-lg-offset-4 col-xl-6 col-xl-offset-4 ">  
23 - <div class="col-sm-8 col-sm-offset-2 col-md-8 col-md-offset-2 col-xs-8 col-xs-offset-2 col-lg-8 col-lg-offset-2 col-xl-8 col-xl-offset-2">  
24 - <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block logo-login " alt="logo amadeus">  
25 - </div>  
26 - </div> 26 + <div class="col-lg-offset-4 col-lg-8 col-md-offset-4 col-md-8 col-xs-offset-4 col-xs-8 col-sm-offset-4 col-sm-8">
  27 + <div class="col-lg-8 col-md-8 col-xs-8 col-sm-8">
  28 + <img src="{% static 'img/amadeus.png' %}" class="img-responsive center-block " alt="logo amadeus" id="logo">
  29 + </div>
  30 + </div>
27 </div> 31 </div>
28 32
29 <div class="row"> 33 <div class="row">
30 - <div class="col-md-6 col-md-offset-4 col-sm-6 col-sm-offset-4 col-xs-6 col-xs-offset-4 col-lg-6 col-lg-offset-4 col-xl-6 col-xl-offset-3"> 34 + <div class="col-lg-8 col-lg-offset-3 col-md-8 col-md-offset-3 col-sm-8 col-sm-offset-3 col-xs-8 col-xs-offset-3">
31 <div class="card"> 35 <div class="card">
32 - <div class="card-content">  
33 <div class="card-body"> 36 <div class="card-body">
34 - <form class="form-horizontal" name="registerForm" method="post" id="register-user" enctype="multipart/form-data"> 37 + <form class="form-horizontal" name="registerForm" method="post" action="" enctype="multipart/form-data">
35 {% csrf_token %} 38 {% csrf_token %}
36 - <h2>{% trans 'User Register' %}</h2>  
37 - <hr>  
38 - <div class="row">  
39 - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">  
40 - {% for field in form %}  
41 - <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput block-register-inline">  
42 - {% if field.field.required %}  
43 - <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}<span>*</span></label>  
44 - {% else %}  
45 - <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}</label>  
46 - {% endif %}  
47 - <div class="col-md-10 col-md-offset-2 col-lg-10 col-lg-offset-2 col-sm-10  
48 - col-sm-offset-2 col-xs-10 col-xs-offset-2">  
49 - {% if field.auto_id == 'id_birth_date' %}  
50 - {% render_field field class='form-control input-sm date-picker' %}  
51 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span>  
52 - {% elif field.auto_id == 'id_image' %}  
53 - {% render_field field class='form-control input-sm' %}  
54 - <div class="input-group">  
55 - <input type="text" readonly="" class="form-control" placeholder="Choose your photo...">  
56 - <span class="input-group-btn input-group-sm">  
57 - <button type="button" class="btn btn-fab btn-fab-mini">  
58 - <i class="material-icons">attach_file</i>  
59 - </button>  
60 - </span>  
61 - </div>  
62 - {% elif field.auto_id == 'id_cpf' %}  
63 - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarCpf(this,event);' %}  
64 -  
65 - {% elif field.auto_id == 'id_phone' %}  
66 - {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %}  
67 - {% else %}  
68 - {% render_field field class='form-control' %}  
69 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span>  
70 - {% endif %}  
71 - </div> 39 + <legend>{% trans 'User Register' %}</legend>
  40 + {% for field in form %}
  41 + <div class="form-group is-empy{% if form.has_error %} has-error {% endif %} is-fileinput">
  42 + {% if field.field.required %}
  43 + <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}<span>*</span></label>
  44 + {% else %}
  45 + <label for="{{ field.auto_id }}" class="col-md-4 control-label">{{ field.label }}</label>
  46 + {% endif %}
  47 + <div class="col-md-8">
  48 + {% if field.auto_id == 'id_birth_date' %}
  49 + {% render_field field class='form-control input-sm date-picker' %}
  50 +
  51 + <span id="helpBlock" class="help-block">{{ field.help_text }}</span>
  52 + {% elif field.auto_id == 'id_image' %}
  53 + {% render_field field class='form-control input-sm' %}
  54 + <div class="input-group">
  55 + <input type="text" readonly="" class="form-control" placeholder="Choose your photo...">
  56 + <span class="input-group-btn input-group-sm">
  57 + <button type="button" class="btn btn-fab btn-fab-mini">
  58 + <i class="material-icons">attach_file</i>
  59 + </button>
  60 + </span>
  61 + </div>
  62 + {% elif field.auto_id == 'id_cpf' %}
  63 + {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarCpf(this,event);' %}
72 64
73 - {% if field.errors %}  
74 - <div class="alert alert-danger alert-dismissible col-md-offset-4 col-md-8" role="alert">  
75 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
76 - <span aria-hidden="true">&times;</span>  
77 - </button>  
78 - <ul>  
79 - {% for error in field.errors %}  
80 - <li>{{ error }}</li>  
81 - {% endfor %}  
82 - </ul>  
83 - </div>  
84 - {% endif %}  
85 - </div> 65 + {% elif field.auto_id == 'id_phone' %}
  66 + {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %}
  67 + {% else %}
  68 + {% render_field field class='form-control' %}
  69 + <span id="helpBlock" class="help-block">{{ field.help_text }}</span>
  70 + {% endif %}
  71 + </div>
  72 +
  73 + {% if field.errors %}
  74 + <div class="alert alert-danger alert-dismissible col-md-offset-4 col-md-8" role="alert">
  75 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  76 + <span aria-hidden="true">&times;</span>
  77 + </button>
  78 + <ul>
  79 + {% for error in field.errors %}
  80 + <li>{{ error }}</li>
86 {% endfor %} 81 {% endfor %}
87 - <div class="col-md-6 col-xs-6 col-sm-6 col-lg-5 col-lg-offset-1 text-center">  
88 - <input type="submit" value="{% trans 'Save' %}" class="btn btn-success btn-raised" />  
89 - </div>  
90 - <div class="col-md-6 col-xs-6 col-sm-6 col-lg-5 text-center">  
91 - <a href="{% url 'core:home' %}" class="btn btn-default btn-raised" >{% trans 'Cancel' %}</a>  
92 - </div> 82 + </ul>
93 </div> 83 </div>
  84 + {% endif %}
94 </div> 85 </div>
  86 + {% endfor %}
  87 + <div class="col-md-offset-4 col-md-2 col-sm-2 col-xs-2">
  88 + <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />
  89 + </div>
  90 + <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2">
  91 + <a href="{% url 'core:home' %}" class="btn btn-sm btn-success" >{% trans 'Cancel' %}</a>
  92 + </div>
  93 +
95 </form> 94 </form>
96 </div> 95 </div>
97 - </div>  
98 </div> 96 </div>
99 </div> 97 </div>
100 </div> 98 </div>
101 - 99 +
102 <br clear="all" /> 100 <br clear="all" />
103 {% endblock %} 101 {% endblock %}
courses/locale/he_il/LC_MESSAGES/django.po
@@ -1,229 +0,0 @@ @@ -1,229 +0,0 @@
1 -# SOME DESCRIPTIVE TITLE.  
2 -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER  
3 -# This file is distributed under the same license as the PACKAGE package.  
4 -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.  
5 -#  
6 -#, fuzzy  
7 -msgid ""  
8 -msgstr ""  
9 -"Project-Id-Version: PACKAGE VERSION\n"  
10 -"Report-Msgid-Bugs-To: \n"  
11 -"POT-Creation-Date: 2016-09-16 02:41-0300\n"  
12 -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"  
13 -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"  
14 -"Language-Team: LANGUAGE <LL@li.org>\n"  
15 -"Language: \n"  
16 -"MIME-Version: 1.0\n"  
17 -"Content-Type: text/plain; charset=UTF-8\n"  
18 -"Content-Transfer-Encoding: 8bit\n"  
19 -  
20 -#: courses/templates/category/create.html:8  
21 -#: courses/templates/category/delete.html:7  
22 -#: courses/templates/category/index.html:7  
23 -#: courses/templates/category/update.html:8  
24 -#: courses/templates/category/view.html:7  
25 -#: courses/templates/course/create.html:8  
26 -#: courses/templates/course/delete.html:7 courses/templates/course/home.html:8  
27 -#: courses/templates/course/update.html:8  
28 -#: courses/templates/course/view.html:39  
29 -#: courses/templates/subject/index.html:8  
30 -msgid "Home"  
31 -msgstr ""  
32 -  
33 -#: courses/templates/category/create.html:9  
34 -#: courses/templates/category/delete.html:18  
35 -#: courses/templates/category/index.html:18  
36 -#: courses/templates/category/view.html:18  
37 -msgid "Create Category"  
38 -msgstr ""  
39 -  
40 -#: courses/templates/category/create.html:16  
41 -#: courses/templates/category/delete.html:15  
42 -#: courses/templates/category/index.html:15  
43 -#: courses/templates/category/update.html:16  
44 -#: courses/templates/category/view.html:15  
45 -msgid "Categories"  
46 -msgstr ""  
47 -  
48 -#: courses/templates/category/create.html:26  
49 -#: courses/templates/category/update.html:26  
50 -#: courses/templates/course/create.html:26  
51 -#: courses/templates/course/update.html:32  
52 -msgid "All fields are required"  
53 -msgstr ""  
54 -  
55 -#: courses/templates/category/create.html:51  
56 -#: courses/templates/category/update.html:51  
57 -#: courses/templates/course/create.html:51  
58 -#: courses/templates/course/update.html:57  
59 -msgid "Save"  
60 -msgstr ""  
61 -  
62 -#: courses/templates/category/delete.html:8  
63 -#: courses/templates/category/index.html:8  
64 -msgid "Manage Categories"  
65 -msgstr ""  
66 -  
67 -#: courses/templates/category/delete.html:26  
68 -#: courses/templates/subject/delete.html:11  
69 -msgid "Are you sure you want to delete the category"  
70 -msgstr ""  
71 -  
72 -#: courses/templates/category/delete.html:27  
73 -#: courses/templates/course/delete.html:28  
74 -#: courses/templates/subject/delete.html:12  
75 -msgid "Yes"  
76 -msgstr ""  
77 -  
78 -#: courses/templates/category/delete.html:28  
79 -#: courses/templates/course/delete.html:29  
80 -#: courses/templates/subject/delete.html:13  
81 -msgid "No"  
82 -msgstr ""  
83 -  
84 -#: courses/templates/category/index.html:38  
85 -msgid "Name"  
86 -msgstr ""  
87 -  
88 -#: courses/templates/category/index.html:39  
89 -msgid "Slug"  
90 -msgstr ""  
91 -  
92 -#: courses/templates/category/index.html:40  
93 -msgid "Actions"  
94 -msgstr ""  
95 -  
96 -#: courses/templates/category/index.html:59  
97 -msgid "No categories found"  
98 -msgstr ""  
99 -  
100 -#: courses/templates/category/update.html:9  
101 -#: courses/templates/category/view.html:21  
102 -msgid "Edit Category"  
103 -msgstr ""  
104 -  
105 -#: courses/templates/category/view.html:24  
106 -msgid "Remove Category"  
107 -msgstr ""  
108 -  
109 -#: courses/templates/category/view.html:32  
110 -msgid "Name:"  
111 -msgstr ""  
112 -  
113 -#: courses/templates/category/view.html:33  
114 -msgid "Slug:"  
115 -msgstr ""  
116 -  
117 -#: courses/templates/course/create.html:9  
118 -#: courses/templates/course/delete.html:18  
119 -#: courses/templates/course/filtered.html:11  
120 -#: courses/templates/course/index.html:19  
121 -msgid "Create Course"  
122 -msgstr ""  
123 -  
124 -#: courses/templates/course/create.html:16  
125 -#: courses/templates/course/delete.html:15  
126 -#: courses/templates/course/filtered.html:8  
127 -#: courses/templates/course/home.html:16  
128 -#: courses/templates/course/index.html:16  
129 -#: courses/templates/course/update.html:16  
130 -#: courses/templates/course/view.html:48  
131 -msgid "Courses"  
132 -msgstr ""  
133 -  
134 -#: courses/templates/course/delete.html:27  
135 -msgid "Are you sure you want to delete the couse"  
136 -msgstr ""  
137 -  
138 -#: courses/templates/course/filtered.html:19  
139 -#: courses/templates/course/index.html:27  
140 -msgid "Categories:"  
141 -msgstr ""  
142 -  
143 -#: courses/templates/course/home.html:9  
144 -msgid "Home Course"  
145 -msgstr ""  
146 -  
147 -#: courses/templates/course/index.html:81  
148 -msgid "students tops"  
149 -msgstr ""  
150 -  
151 -#: courses/templates/course/index.html:87  
152 -msgid "Subscribe Period:"  
153 -msgstr ""  
154 -  
155 -#: courses/templates/course/index.html:89  
156 -msgid "Period:"  
157 -msgstr ""  
158 -  
159 -#: courses/templates/course/index.html:105  
160 -msgid "No courses found"  
161 -msgstr ""  
162 -  
163 -#: courses/templates/course/update.html:9  
164 -msgid "Edit Course"  
165 -msgstr ""  
166 -  
167 -#: courses/templates/course/update.html:19  
168 -msgid "Manage Modules"  
169 -msgstr ""  
170 -  
171 -#: courses/templates/course/update.html:22  
172 -msgid "Participants"  
173 -msgstr ""  
174 -  
175 -#: courses/templates/course/view.html:40  
176 -msgid "Profile"  
177 -msgstr ""  
178 -  
179 -#: courses/templates/course/view.html:62  
180 -msgid "Subjects"  
181 -msgstr ""  
182 -  
183 -#: courses/templates/course/view.html:85  
184 -msgid "Professor"  
185 -msgstr ""  
186 -  
187 -#: courses/templates/course/view.html:88  
188 -msgid "Description"  
189 -msgstr ""  
190 -  
191 -#: courses/templates/course/view.html:110  
192 -#: courses/templates/subject/index.html:78  
193 -msgid "Pending Stuffs"  
194 -msgstr ""  
195 -  
196 -#: courses/templates/course/view.html:113  
197 -msgid "No pending tasks at the moment."  
198 -msgstr ""  
199 -  
200 -#: courses/templates/subject/create.html:20  
201 -#: courses/templates/topic/create.html:20  
202 -msgid "Create"  
203 -msgstr ""  
204 -  
205 -#: courses/templates/subject/form_view_teacher.html:10  
206 -#: courses/templates/subject/index.html:47  
207 -msgid "edit"  
208 -msgstr ""  
209 -  
210 -#: courses/templates/subject/index.html:10  
211 -msgid "Manage Subjects"  
212 -msgstr ""  
213 -  
214 -#: courses/templates/subject/index.html:34  
215 -msgid "Create Subject"  
216 -msgstr ""  
217 -  
218 -#: courses/templates/subject/index.html:52  
219 -msgid "delete"  
220 -msgstr ""  
221 -  
222 -#: courses/templates/subject/index.html:71  
223 -msgid "Create Topic"  
224 -msgstr ""  
225 -  
226 -#: courses/templates/subject/update.html:20  
227 -#: courses/templates/topic/update.html:20  
228 -msgid "Update"  
229 -msgstr ""  
courses/static/js/topic_editation_presentation.js
1 -$(".edit_card").on('click', function() {  
2 - $(".presentation").css('display','none');  
3 - $(".editation").css('display','block');  
4 -})  
5 -$(".edit_card_end").on('click', function() {  
6 - $(".editation").css('display','none');  
7 - $(".presentation").css('display','block');  
8 -})  
9 \ No newline at end of file 1 \ No newline at end of file
  2 +function show_editation(id_topic){
  3 + $("#presentation_"+ id_topic).css('display','none');
  4 + $("#editation_"+ id_topic).css('display','block');
  5 +}
  6 +
  7 +function show_presentation(id_topic){
  8 + $("#editation_"+ id_topic).css('display','none');
  9 + $("#presentation_"+ id_topic).css('display','block');
  10 +}
10 \ No newline at end of file 11 \ No newline at end of file
courses/templates/subject/form_view_teacher.html
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> 4 <script type="text/javascript" src="{% static 'js/forum.js' %}"></script>
5 <script src="{% static 'js/file.js' %}"></script> 5 <script src="{% static 'js/file.js' %}"></script>
6 <script type="text/javascript" src="{% static 'js/material.js' %}"></script> 6 <script type="text/javascript" src="{% static 'js/material.js' %}"></script>
7 - <script type = "text/javascript" src="{% static 'links.js' %}"></script> 7 + <script type = "text/javascript" src="{% static 'js/links.js' %}"></script>
8 {% endblock %} 8 {% endblock %}
9 <div class="panel panel-default cards-detail"> 9 <div class="panel panel-default cards-detail">
10 <div class="panel-heading topic"> 10 <div class="panel-heading topic">
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 <a role="button"> 16 <a role="button">
17 <h4>{{topic}}</h4> 17 <h4>{{topic}}</h4>
18 </a> 18 </a>
19 - </div><!--column--> 19 + </div><!--column -->
20 <div class="col-xs-3 col-md-2 divMoreActions"> 20 <div class="col-xs-3 col-md-2 divMoreActions">
21 <div class="btn-group"> 21 <div class="btn-group">
22 <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible"> 22 <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible">
@@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
31 {% if dropdown_topic %} 31 {% if dropdown_topic %}
32 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> 32 <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
33 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li> 33 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Replicate" %}</a></li>
34 - <li><a href="javascript:void(0)" class="edit_card"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li> 34 + <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Edit" %}</a></li>
35 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li> 35 <li><a href="javascript:void(0)" data-toggle="modal" data-target="#removeTopic"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp; {% trans "Remove" %}</a></li>
36 </ul> 36 </ul>
37 {% endif %} 37 {% endif %}
@@ -39,9 +39,9 @@ @@ -39,9 +39,9 @@
39 </div><!--column--> 39 </div><!--column-->
40 </div><!--row--> 40 </div><!--row-->
41 </div> 41 </div>
42 - <div class="panel-collapse collapseTopic-{{topic.slug}} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.id}}" aria-expanded="true" aria-hidden="false"> 42 + <div class="panel-collapse collapseTopic-{{topic.slug}} topic_{{ topic.id }} collapse in" role="tabpanel" aria-labelledby="heading_{{topic.id}}" aria-expanded="true" aria-hidden="false">
43 <div class="panel-body"> 43 <div class="panel-body">
44 - <div class="presentation"> 44 + <div class="presentation" id="presentation_{{topic.slug}}">
45 <p> 45 <p>
46 <i> 46 <i>
47 {{topic.description|linebreaks}} 47 {{topic.description|linebreaks}}
@@ -86,7 +86,7 @@ @@ -86,7 +86,7 @@
86 </div> 86 </div>
87 </div> 87 </div>
88 </div><!--EndPresentation--> 88 </div><!--EndPresentation-->
89 - <div class="editation"> 89 + <div class="editation topic_{{ topic.id }}" id="editation_{{topic.slug}}">
90 <div class="form-group"> 90 <div class="form-group">
91 <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label> 91 <label class="control-label" for="focusedInput2">{% trans 'Name Topic' %}</label>
92 <input type="text" class="form-control" value="{{topic}}"> 92 <input type="text" class="form-control" value="{{topic}}">
@@ -135,16 +135,12 @@ @@ -135,16 +135,12 @@
135 </div> 135 </div>
136 <div class="form-group"> 136 <div class="form-group">
137 <div class="col-md-10"> 137 <div class="col-md-10">
138 - <button type="button" class="btn btn-raised btn-default edit_card_end">{% trans 'Cancel' %}</button>  
139 - <button type="submit" class="btn btn-raised btn-primary edit_card_end">{% trans 'Submit' %}</button> 138 + <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-default">{% trans 'Cancel' %}</a>
  139 + <a href="javascript:show_presentation('{{topic.slug}}')" class="btn btn-raised btn-primary">{% trans 'Submit' %}</a>
140 </div> 140 </div>
141 </div> 141 </div>
142 </div><!--EndEditation--> 142 </div><!--EndEditation-->
143 - {% professor_subject topic.subject user as professor_links %}  
144 - {% if professor_links%}  
145 - {% include "links/create_link.html" %}  
146 - {% include "links/delete_link.html" %}  
147 - {% endif %} 143 +
148 </div> 144 </div>
149 </div> 145 </div>
150 </div> 146 </div>
@@ -287,10 +283,7 @@ @@ -287,10 +283,7 @@
287 <!--EndModal--> 283 <!--EndModal-->
288 284
289 <!-- MODAL LINK EDIT--> 285 <!-- MODAL LINK EDIT-->
290 -{% professor_subject topic.subject user as links_update %}  
291 -{% if links_update%}  
292 - {% include "links/update_link.html" %}  
293 -{% endif %} 286 +
294 287
295 <!-- EndModal --> 288 <!-- EndModal -->
296 289
@@ -313,5 +306,3 @@ @@ -313,5 +306,3 @@
313 </div> 306 </div>
314 </div> 307 </div>
315 </div> 308 </div>
316 -  
317 -  
courses/templates/topic/link_topic_list.html
1 {% load static i18n list_topic_foruns permission_tags %} 1 {% load static i18n list_topic_foruns permission_tags %}
2 <div id="list-topic{{ topic.id }}-links"> 2 <div id="list-topic{{ topic.id }}-links">
3 {% for link in links%} 3 {% for link in links%}
4 - <li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> 4 + <li id = "link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li>
5 {% endfor %} 5 {% endfor %}
6 </div> 6 </div>
7 <div class = 'row' id ="divModalLink"> 7 <div class = 'row' id ="divModalLink">
courses/templates/topic/link_topic_list_edit.html
@@ -2,8 +2,12 @@ @@ -2,8 +2,12 @@
2 <div id="list-topic{{ topic.id }}-links-edit"> 2 <div id="list-topic{{ topic.id }}-links-edit">
3 {% for link in links%} 3 {% for link in links%}
4 4
5 - <li class="icon_edit_remove"> <a href="#" data-toggle="modal" data-target="#linksModalEdit"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="#" data-toggle="modal" data-target="#removeLink"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>  
6 - <li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> 5 + <li class="icon_edit_remove" id = "link_edit_icon_{{ link.slug }}"> <a href="javascript:get_modal_link('{% url 'course:links:update_link' link.slug %}', '#linksModalEdit', '#divModalLinkUpdate')"><i class="fa fa-pencil fa-lg" aria-hidden="true"></i></a> <a href="javascript:get_modal_link('{% url 'course:links:delete_link' link.slug %}', '#linkDeleteModal', '#divModalLinkUpdate')"><i class="fa fa-trash fa-lg" aria-hidden="true"></i></a></li>
  6 + <li id="link_edit_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li>
7 7
8 {% endfor %} 8 {% endfor %}
9 </div> 9 </div>
  10 +
  11 +<div class="row" id="divModalLinkUpdate">
  12 +
  13 +</div>
exam/locale/pt_BR/LC_MESSAGES/django.po
@@ -24,119 +24,119 @@ msgstr &quot;&quot; @@ -24,119 +24,119 @@ msgstr &quot;&quot;
24 24
25 #: exam/forms.py:33 25 #: exam/forms.py:33
26 msgid "Start date to resolve the exam" 26 msgid "Start date to resolve the exam"
27 -msgstr "" 27 +msgstr "Data de início para resolver o exame"
28 28
29 #: exam/forms.py:35 29 #: exam/forms.py:35
30 msgid "Maximum date permited to resolve the exam" 30 msgid "Maximum date permited to resolve the exam"
31 -msgstr "" 31 +msgstr "Data máxima permitida para resolver o exame"
32 32
33 #: exam/models.py:9 33 #: exam/models.py:9
34 msgid "Begin of Course Date" 34 msgid "Begin of Course Date"
35 -msgstr "" 35 +msgstr "Data de início do curso"
36 36
37 #: exam/models.py:10 37 #: exam/models.py:10
38 msgid "Exibe?" 38 msgid "Exibe?"
39 -msgstr "" 39 +msgstr "Exibir?"
40 40
41 #: exam/models.py:13 exam/models.py:35 41 #: exam/models.py:13 exam/models.py:35
42 msgid "Exam" 42 msgid "Exam"
43 -msgstr "" 43 +msgstr "Exame"
44 44
45 #: exam/models.py:14 45 #: exam/models.py:14
46 msgid "Exams" 46 msgid "Exams"
47 -msgstr "" 47 +msgstr "Exames"
48 48
49 #: exam/models.py:21 exam/models.py:27 49 #: exam/models.py:21 exam/models.py:27
50 msgid "Answer" 50 msgid "Answer"
51 -msgstr "" 51 +msgstr "Resposta"
52 52
53 #: exam/models.py:22 53 #: exam/models.py:22
54 msgid "Order" 54 msgid "Order"
55 -msgstr "" 55 +msgstr "Ordem"
56 56
57 #: exam/models.py:23 exam/models.py:28 57 #: exam/models.py:23 exam/models.py:28
58 msgid "Answers" 58 msgid "Answers"
59 -msgstr "" 59 +msgstr "Respostas"
60 60
61 #: exam/models.py:34 61 #: exam/models.py:34
62 msgid "Answered" 62 msgid "Answered"
63 -msgstr "" 63 +msgstr "Respondida"
64 64
65 #: exam/models.py:36 65 #: exam/models.py:36
66 msgid "Answers Students" 66 msgid "Answers Students"
67 -msgstr "" 67 +msgstr "Resposta dos estudantes"
68 68
69 #: exam/models.py:37 69 #: exam/models.py:37
70 msgid "Student" 70 msgid "Student"
71 -msgstr "" 71 +msgstr "Estudante"
72 72
73 #: exam/models.py:38 73 #: exam/models.py:38
74 msgid "Answered Date" 74 msgid "Answered Date"
75 -msgstr "" 75 +msgstr "Data da resposta"
76 76
77 #: exam/models.py:41 77 #: exam/models.py:41
78 msgid "Answer Stundent" 78 msgid "Answer Stundent"
79 -msgstr "" 79 +msgstr "Resposta do estudante"
80 80
81 #: exam/models.py:42 81 #: exam/models.py:42
82 msgid "Answers Student" 82 msgid "Answers Student"
83 -msgstr "" 83 +msgstr "Respostas dos estudantes"
84 84
85 #: exam/templates/exam/create.html:9 85 #: exam/templates/exam/create.html:9
86 msgid "New Exam" 86 msgid "New Exam"
87 -msgstr "" 87 +msgstr "Novo exame"
88 88
89 #: exam/templates/exam/create.html:14 exam/templates/exam/create.html:16 89 #: exam/templates/exam/create.html:14 exam/templates/exam/create.html:16
90 msgid "Exam Name" 90 msgid "Exam Name"
91 -msgstr "" 91 +msgstr "Nome do exame"
92 92
93 #: exam/templates/exam/create.html:20 93 #: exam/templates/exam/create.html:20
94 msgid "Exam's begin date" 94 msgid "Exam's begin date"
95 -msgstr "" 95 +msgstr "Data de início do exame"
96 96
97 #: exam/templates/exam/create.html:22 97 #: exam/templates/exam/create.html:22
98 msgid "Begin Date" 98 msgid "Begin Date"
99 -msgstr "" 99 +msgstr "Data de início"
100 100
101 #: exam/templates/exam/create.html:26 101 #: exam/templates/exam/create.html:26
102 msgid "Exam's end date" 102 msgid "Exam's end date"
103 -msgstr "" 103 +msgstr "Data final do exame"
104 104
105 #: exam/templates/exam/create.html:28 105 #: exam/templates/exam/create.html:28
106 msgid "End Date" 106 msgid "End Date"
107 -msgstr "" 107 +msgstr "Data final"
108 108
109 #: exam/templates/exam/create.html:35 109 #: exam/templates/exam/create.html:35
110 msgid "Allow submissions after deadline?" 110 msgid "Allow submissions after deadline?"
111 -msgstr "" 111 +msgstr "Permitir submissões após o prazo?"
112 112
113 #: exam/templates/exam/create.html:44 exam/templates/exam/create.html:47 113 #: exam/templates/exam/create.html:44 exam/templates/exam/create.html:47
114 msgid "Question Type" 114 msgid "Question Type"
115 -msgstr "" 115 +msgstr "Tipo de questão"
116 116
117 #: exam/templates/exam/create.html:48 117 #: exam/templates/exam/create.html:48
118 msgid "Multiple Choice" 118 msgid "Multiple Choice"
119 -msgstr "" 119 +msgstr "Múltipla escolha"
120 120
121 #: exam/templates/exam/create.html:49 121 #: exam/templates/exam/create.html:49
122 msgid "True or False" 122 msgid "True or False"
123 -msgstr "" 123 +msgstr "Verdadeiro ou falso"
124 124
125 #: exam/templates/exam/create.html:50 125 #: exam/templates/exam/create.html:50
126 msgid "Gap Filling" 126 msgid "Gap Filling"
127 -msgstr "" 127 +msgstr "Preenchimento de lacunas"
128 128
129 #: exam/templates/exam/create.html:51 129 #: exam/templates/exam/create.html:51
130 msgid "Discursive Question" 130 msgid "Discursive Question"
131 -msgstr "" 131 +msgstr "Questão discursiva"
132 132
133 #: exam/templates/exam/create.html:57 133 #: exam/templates/exam/create.html:57
134 msgid "add question" 134 msgid "add question"
135 -msgstr "" 135 +msgstr "Adicionar questão"
136 136
137 #: exam/templates/exam/create.html:62 137 #: exam/templates/exam/create.html:62
138 msgid "Create" 138 msgid "Create"
139 -msgstr "" 139 +msgstr "Criar"
140 140
141 #: exam/templates/exam/discursive_question.html:2 141 #: exam/templates/exam/discursive_question.html:2
142 #: exam/templates/exam/discursive_question.html:4 142 #: exam/templates/exam/discursive_question.html:4
@@ -144,24 +144,24 @@ msgstr &quot;&quot; @@ -144,24 +144,24 @@ msgstr &quot;&quot;
144 #: exam/templates/exam/true_or_false_question.html:20 144 #: exam/templates/exam/true_or_false_question.html:20
145 #: exam/templates/exam/true_or_false_question.html:25 145 #: exam/templates/exam/true_or_false_question.html:25
146 msgid "Question" 146 msgid "Question"
147 -msgstr "" 147 +msgstr "Questão"
148 148
149 #: exam/templates/exam/gap_filling_question.html:2 149 #: exam/templates/exam/gap_filling_question.html:2
150 msgid "Gap Filling Question" 150 msgid "Gap Filling Question"
151 -msgstr "" 151 +msgstr "Questão de preenchimento de lacunas"
152 152
153 #: exam/templates/exam/multiple_choice_question.html:15 153 #: exam/templates/exam/multiple_choice_question.html:15
154 msgid "Alternatives" 154 msgid "Alternatives"
155 -msgstr "" 155 +msgstr "Alternativas"
156 156
157 #: exam/templates/exam/true_or_false_answer.html:9 157 #: exam/templates/exam/true_or_false_answer.html:9
158 msgid "Write your alternative" 158 msgid "Write your alternative"
159 -msgstr "" 159 +msgstr "Escreva sua alternativa"
160 160
161 #: exam/templates/exam/true_or_false_question.html:37 161 #: exam/templates/exam/true_or_false_question.html:37
162 msgid "Alternatives: T/F" 162 msgid "Alternatives: T/F"
163 -msgstr "" 163 +msgstr "Alternativas: V/F"
164 164
165 #: exam/templates/exam/true_or_false_question.html:45 165 #: exam/templates/exam/true_or_false_question.html:45
166 msgid "New Alternative" 166 msgid "New Alternative"
167 -msgstr "" 167 +msgstr "Nova alternativa"
files/locale/pt_BR/LC_MESSAGES/django.po
@@ -20,69 +20,69 @@ msgstr &quot;&quot; @@ -20,69 +20,69 @@ msgstr &quot;&quot;
20 20
21 #: files/forms.py:12 files/forms.py:29 21 #: files/forms.py:12 files/forms.py:29
22 msgid "File too large (Max 10MB)" 22 msgid "File too large (Max 10MB)"
23 -msgstr "" 23 +msgstr "Arquivo muito grande (máximo de 10MB)"
24 24
25 #: files/models.py:20 25 #: files/models.py:20
26 msgid "Professors" 26 msgid "Professors"
27 -msgstr "" 27 +msgstr "Professores"
28 28
29 #: files/models.py:21 29 #: files/models.py:21
30 msgid "Description" 30 msgid "Description"
31 -msgstr "" 31 +msgstr "Descrição"
32 32
33 #: files/models.py:22 files/models.py:27 33 #: files/models.py:22 files/models.py:27
34 msgid "File" 34 msgid "File"
35 -msgstr "" 35 +msgstr "Arquivo"
36 36
37 #: files/models.py:23 37 #: files/models.py:23
38 msgid "Type file" 38 msgid "Type file"
39 -msgstr "" 39 +msgstr "Tipo de arquivo"
40 40
41 #: files/models.py:28 41 #: files/models.py:28
42 msgid "Files" 42 msgid "Files"
43 -msgstr "" 43 +msgstr "Arquivos"
44 44
45 #: files/templates/files/create_file.html:10 45 #: files/templates/files/create_file.html:10
46 msgid "Add File" 46 msgid "Add File"
47 -msgstr "" 47 +msgstr "Adicionar arquivo"
48 48
49 #: files/templates/files/create_file.html:38 49 #: files/templates/files/create_file.html:38
50 #: files/templates/files/update_file.html:40 50 #: files/templates/files/update_file.html:40
51 msgid "Choose your file..." 51 msgid "Choose your file..."
52 -msgstr "" 52 +msgstr "Escolha seu arquivo..."
53 53
54 #: files/templates/files/create_file.html:68 54 #: files/templates/files/create_file.html:68
55 #: files/templates/files/update_file.html:73 55 #: files/templates/files/update_file.html:73
56 msgid "The file size shouldnt exceed 10MB" 56 msgid "The file size shouldnt exceed 10MB"
57 -msgstr "" 57 +msgstr "O tamanho máximo não pode exceder 10MB"
58 58
59 #: files/templates/files/create_file.html:74 59 #: files/templates/files/create_file.html:74
60 #: files/templates/files/delete_file.html:34 60 #: files/templates/files/delete_file.html:34
61 #: files/templates/files/update_file.html:79 61 #: files/templates/files/update_file.html:79
62 msgid "Close" 62 msgid "Close"
63 -msgstr "" 63 +msgstr "Fechar"
64 64
65 #: files/templates/files/create_file.html:75 65 #: files/templates/files/create_file.html:75
66 #: files/templates/files/update_file.html:80 66 #: files/templates/files/update_file.html:80
67 msgid "Submit" 67 msgid "Submit"
68 -msgstr "" 68 +msgstr "Enviar"
69 69
70 #: files/templates/files/delete_file.html:12 70 #: files/templates/files/delete_file.html:12
71 msgid "Delete File" 71 msgid "Delete File"
72 -msgstr "" 72 +msgstr "Deletar arquivo"
73 73
74 #: files/templates/files/delete_file.html:30 74 #: files/templates/files/delete_file.html:30
75 msgid "Are you sure to delete " 75 msgid "Are you sure to delete "
76 -msgstr "" 76 +msgstr "Tem certeza que deseja deletar "
77 77
78 #: files/templates/files/delete_file.html:35 78 #: files/templates/files/delete_file.html:35
79 msgid "Delete" 79 msgid "Delete"
80 -msgstr "" 80 +msgstr "Deletar"
81 81
82 #: files/templates/files/update_file.html:12 82 #: files/templates/files/update_file.html:12
83 msgid "Edit File" 83 msgid "Edit File"
84 -msgstr "" 84 +msgstr "Editar arquivo"
85 85
86 #: files/templates/files/update_file.html:48 86 #: files/templates/files/update_file.html:48
87 msgid "See current file" 87 msgid "See current file"
88 -msgstr "" 88 +msgstr "Visualizar arquivo atual"
forum/locale/pt_BR/LC_MESSAGES/django.po
@@ -20,88 +20,88 @@ msgstr &quot;&quot; @@ -20,88 +20,88 @@ msgstr &quot;&quot;
20 20
21 #: forum/forms.py:11 21 #: forum/forms.py:11
22 msgid "Title" 22 msgid "Title"
23 -msgstr "" 23 +msgstr "Título"
24 24
25 #: forum/forms.py:12 forum/models.py:14 25 #: forum/forms.py:12 forum/models.py:14
26 #: forum/templates/forum/forum_list.html:23 26 #: forum/templates/forum/forum_list.html:23
27 #: forum/templates/forum/forum_view.html:58 27 #: forum/templates/forum/forum_view.html:58
28 #: forum/templates/forum/render_forum.html:4 28 #: forum/templates/forum/render_forum.html:4
29 msgid "Description" 29 msgid "Description"
30 -msgstr "" 30 +msgstr "Descrição"
31 31
32 #: forum/forms.py:13 32 #: forum/forms.py:13
33 msgid "Limit Date" 33 msgid "Limit Date"
34 -msgstr "" 34 +msgstr "Data limite"
35 35
36 #: forum/forms.py:16 36 #: forum/forms.py:16
37 msgid "Forum title" 37 msgid "Forum title"
38 -msgstr "" 38 +msgstr "Título do fórum"
39 39
40 #: forum/forms.py:17 40 #: forum/forms.py:17
41 msgid "What is this forum about?" 41 msgid "What is this forum about?"
42 -msgstr "" 42 +msgstr "Qual o assunto deste fórum?"
43 43
44 #: forum/forms.py:18 44 #: forum/forms.py:18
45 msgid "Limit date for students post on this forum" 45 msgid "Limit date for students post on this forum"
46 -msgstr "" 46 +msgstr "Data limite para estudantes postarem neste fórum"
47 47
48 #: forum/forms.py:33 forum/forms.py:46 48 #: forum/forms.py:33 forum/forms.py:46
49 msgid "Message" 49 msgid "Message"
50 -msgstr "" 50 +msgstr "Mensagem"
51 51
52 #: forum/models.py:15 forum/models.py:33 forum/models.py:61 52 #: forum/models.py:15 forum/models.py:33 forum/models.py:61
53 msgid "Modification Date" 53 msgid "Modification Date"
54 -msgstr "" 54 +msgstr "Data de modificação"
55 55
56 #: forum/models.py:16 56 #: forum/models.py:16
57 msgid "Create Date" 57 msgid "Create Date"
58 -msgstr "" 58 +msgstr "Data de criação"
59 59
60 #: forum/models.py:19 forum/models.py:35 60 #: forum/models.py:19 forum/models.py:35
61 #: forum/templates/forum/forum_view.html:16 61 #: forum/templates/forum/forum_view.html:16
62 #: forum/templates/forum/forum_view.html:116 62 #: forum/templates/forum/forum_view.html:116
63 msgid "Forum" 63 msgid "Forum"
64 -msgstr "" 64 +msgstr "Fórum"
65 65
66 #: forum/models.py:20 66 #: forum/models.py:20
67 msgid "Foruns" 67 msgid "Foruns"
68 -msgstr "" 68 +msgstr "Fóruns"
69 69
70 #: forum/models.py:31 forum/models.py:58 70 #: forum/models.py:31 forum/models.py:58
71 msgid "Autor" 71 msgid "Autor"
72 -msgstr "" 72 +msgstr "Autor"
73 73
74 #: forum/models.py:32 74 #: forum/models.py:32
75 msgid "Post message" 75 msgid "Post message"
76 -msgstr "" 76 +msgstr "Postar mensagem"
77 77
78 #: forum/models.py:34 78 #: forum/models.py:34
79 msgid "Post Date" 79 msgid "Post Date"
80 -msgstr "" 80 +msgstr "Data de postagem"
81 81
82 #: forum/models.py:38 forum/models.py:59 82 #: forum/models.py:38 forum/models.py:59
83 msgid "Post" 83 msgid "Post"
84 -msgstr "" 84 +msgstr "Postar"
85 85
86 #: forum/models.py:39 86 #: forum/models.py:39
87 msgid "Posts" 87 msgid "Posts"
88 -msgstr "" 88 +msgstr "Postagens"
89 89
90 #: forum/models.py:60 90 #: forum/models.py:60
91 msgid "Answer message" 91 msgid "Answer message"
92 -msgstr "" 92 +msgstr "Resposta"
93 93
94 #: forum/models.py:62 94 #: forum/models.py:62
95 msgid "Answer Date" 95 msgid "Answer Date"
96 -msgstr "" 96 +msgstr "Data da resposta"
97 97
98 #: forum/models.py:65 98 #: forum/models.py:65
99 msgid "Post Answer" 99 msgid "Post Answer"
100 -msgstr "" 100 +msgstr "Postar resposta"
101 101
102 #: forum/models.py:66 102 #: forum/models.py:66
103 msgid "Post Answers" 103 msgid "Post Answers"
104 -msgstr "" 104 +msgstr "Postar respostas"
105 105
106 #: forum/templates/forum/forum_list.html:16 106 #: forum/templates/forum/forum_list.html:16
107 #: forum/templates/forum/forum_view.html:44 107 #: forum/templates/forum/forum_view.html:44
@@ -112,73 +112,73 @@ msgstr &quot;&quot; @@ -112,73 +112,73 @@ msgstr &quot;&quot;
112 #: forum/templates/post_answers/post_answer_load_more_render.html:17 112 #: forum/templates/post_answers/post_answer_load_more_render.html:17
113 #: forum/templates/post_answers/post_answer_render.html:15 113 #: forum/templates/post_answers/post_answer_render.html:15
114 msgid "Edit" 114 msgid "Edit"
115 -msgstr "" 115 +msgstr "Editar"
116 116
117 #: forum/templates/forum/forum_list.html:17 117 #: forum/templates/forum/forum_list.html:17
118 #: forum/templates/forum/forum_view.html:45 118 #: forum/templates/forum/forum_view.html:45
119 msgid "Are you sure you want to delete this forum?" 119 msgid "Are you sure you want to delete this forum?"
120 -msgstr "" 120 +msgstr "Tem certeza que deseja deletar este fórum?"
121 121
122 #: forum/templates/forum/forum_list.html:17 122 #: forum/templates/forum/forum_list.html:17
123 #: forum/templates/forum/forum_view.html:45 123 #: forum/templates/forum/forum_view.html:45
124 msgid "Delete" 124 msgid "Delete"
125 -msgstr "" 125 +msgstr "Deletar"
126 126
127 #: forum/templates/forum/forum_list.html:24 127 #: forum/templates/forum/forum_list.html:24
128 #: forum/templates/forum/forum_view.html:59 128 #: forum/templates/forum/forum_view.html:59
129 #: forum/templates/forum/render_forum.html:5 129 #: forum/templates/forum/render_forum.html:5
130 msgid "Opened in" 130 msgid "Opened in"
131 -msgstr "" 131 +msgstr "Aberto em"
132 132
133 #: forum/templates/forum/forum_list.html:59 133 #: forum/templates/forum/forum_list.html:59
134 #: forum/templates/forum/forum_view.html:91 134 #: forum/templates/forum/forum_view.html:91
135 #: forum/templates/post_answers/post_answer_form.html:38 135 #: forum/templates/post_answers/post_answer_form.html:38
136 msgid "send" 136 msgid "send"
137 -msgstr "" 137 +msgstr "Enviar"
138 138
139 #: forum/templates/forum/forum_view.html:13 139 #: forum/templates/forum/forum_view.html:13
140 msgid "Home" 140 msgid "Home"
141 -msgstr "" 141 +msgstr "Início"
142 142
143 #: forum/templates/forum/forum_view.html:27 143 #: forum/templates/forum/forum_view.html:27
144 msgid "Menu" 144 msgid "Menu"
145 -msgstr "" 145 +msgstr "Menu"
146 146
147 #: forum/templates/forum/forum_view.html:31 147 #: forum/templates/forum/forum_view.html:31
148 msgid "Profile" 148 msgid "Profile"
149 -msgstr "" 149 +msgstr "Perfil"
150 150
151 #: forum/templates/forum/forum_view.html:32 151 #: forum/templates/forum/forum_view.html:32
152 msgid "My Courses" 152 msgid "My Courses"
153 -msgstr "" 153 +msgstr "Meus cursos"
154 154
155 #: forum/templates/forum/forum_view.html:40 155 #: forum/templates/forum/forum_view.html:40
156 msgid "Actions" 156 msgid "Actions"
157 -msgstr "" 157 +msgstr "Ações"
158 158
159 #: forum/templates/forum/forum_view.html:44 159 #: forum/templates/forum/forum_view.html:44
160 msgid "Forum edited successfully!" 160 msgid "Forum edited successfully!"
161 -msgstr "" 161 +msgstr "Fórum editado com sucesso!"
162 162
163 #: forum/templates/forum/forum_view.html:124 163 #: forum/templates/forum/forum_view.html:124
164 msgid "Close" 164 msgid "Close"
165 -msgstr "" 165 +msgstr "Fechar"
166 166
167 #: forum/templates/forum/forum_view.html:125 167 #: forum/templates/forum/forum_view.html:125
168 msgid "Update" 168 msgid "Update"
169 -msgstr "" 169 +msgstr "Atualizar"
170 170
171 #: forum/templates/post/post_list.html:11 171 #: forum/templates/post/post_list.html:11
172 #: forum/templates/post/post_load_more_render.html:11 172 #: forum/templates/post/post_load_more_render.html:11
173 #: forum/templates/post/post_render.html:9 173 #: forum/templates/post/post_render.html:9
174 msgid "reply" 174 msgid "reply"
175 -msgstr "" 175 +msgstr "Responder"
176 176
177 #: forum/templates/post/post_list.html:20 177 #: forum/templates/post/post_list.html:20
178 #: forum/templates/post/post_load_more_render.html:20 178 #: forum/templates/post/post_load_more_render.html:20
179 #: forum/templates/post/post_render.html:18 179 #: forum/templates/post/post_render.html:18
180 msgid "Post edited successfully!" 180 msgid "Post edited successfully!"
181 -msgstr "" 181 +msgstr "Post editado com sucesso!"
182 182
183 #: forum/templates/post/post_list.html:21 183 #: forum/templates/post/post_list.html:21
184 #: forum/templates/post/post_load_more_render.html:21 184 #: forum/templates/post/post_load_more_render.html:21
@@ -187,7 +187,7 @@ msgstr &quot;&quot; @@ -187,7 +187,7 @@ msgstr &quot;&quot;
187 #: forum/templates/post_answers/post_answer_load_more_render.html:18 187 #: forum/templates/post_answers/post_answer_load_more_render.html:18
188 #: forum/templates/post_answers/post_answer_render.html:16 188 #: forum/templates/post_answers/post_answer_render.html:16
189 msgid "Remove" 189 msgid "Remove"
190 -msgstr "" 190 +msgstr "Remover"
191 191
192 #: forum/templates/post/post_list.html:30 192 #: forum/templates/post/post_list.html:30
193 #: forum/templates/post/post_load_more_render.html:30 193 #: forum/templates/post/post_load_more_render.html:30
@@ -196,7 +196,7 @@ msgstr &quot;&quot; @@ -196,7 +196,7 @@ msgstr &quot;&quot;
196 #: forum/templates/post_answers/post_answer_load_more_render.html:26 196 #: forum/templates/post_answers/post_answer_load_more_render.html:26
197 #: forum/templates/post_answers/post_answer_render.html:24 197 #: forum/templates/post_answers/post_answer_render.html:24
198 msgid "ago" 198 msgid "ago"
199 -msgstr "" 199 +msgstr "atrás"
200 200
201 #: forum/templates/post/post_list.html:32 201 #: forum/templates/post/post_list.html:32
202 #: forum/templates/post/post_load_more_render.html:32 202 #: forum/templates/post/post_load_more_render.html:32
@@ -205,46 +205,46 @@ msgstr &quot;&quot; @@ -205,46 +205,46 @@ msgstr &quot;&quot;
205 #: forum/templates/post_answers/post_answer_load_more_render.html:28 205 #: forum/templates/post_answers/post_answer_load_more_render.html:28
206 #: forum/templates/post_answers/post_answer_render.html:26 206 #: forum/templates/post_answers/post_answer_render.html:26
207 msgid "Edited" 207 msgid "Edited"
208 -msgstr "" 208 +msgstr "Editado"
209 209
210 #: forum/templates/post/post_list.html:54 forum/views.py:196 210 #: forum/templates/post/post_list.html:54 forum/views.py:196
211 msgid "Load more posts" 211 msgid "Load more posts"
212 -msgstr "" 212 +msgstr "Carregar mais postagens"
213 213
214 #: forum/templates/post/post_update_form.html:32 214 #: forum/templates/post/post_update_form.html:32
215 #: forum/templates/post_answers/post_answer_form.html:32 215 #: forum/templates/post_answers/post_answer_form.html:32
216 msgid "Cancel" 216 msgid "Cancel"
217 -msgstr "" 217 +msgstr "Cancelar"
218 218
219 #: forum/templates/post/post_update_form.html:33 219 #: forum/templates/post/post_update_form.html:33
220 #: forum/templates/post_answers/post_answer_form.html:33 220 #: forum/templates/post_answers/post_answer_form.html:33
221 msgid "Save changes" 221 msgid "Save changes"
222 -msgstr "" 222 +msgstr "Salvar mudanças"
223 223
224 #: forum/templates/post_answers/post_answer_list.html:17 224 #: forum/templates/post_answers/post_answer_list.html:17
225 #: forum/templates/post_answers/post_answer_load_more_render.html:17 225 #: forum/templates/post_answers/post_answer_load_more_render.html:17
226 #: forum/templates/post_answers/post_answer_render.html:15 226 #: forum/templates/post_answers/post_answer_render.html:15
227 msgid "Answer edited sucessfully!" 227 msgid "Answer edited sucessfully!"
228 -msgstr "" 228 +msgstr "Resposta editada com sucesso!"
229 229
230 #: forum/templates/post_answers/post_answer_list.html:18 230 #: forum/templates/post_answers/post_answer_list.html:18
231 #: forum/templates/post_answers/post_answer_load_more_render.html:18 231 #: forum/templates/post_answers/post_answer_load_more_render.html:18
232 #: forum/templates/post_answers/post_answer_render.html:16 232 #: forum/templates/post_answers/post_answer_render.html:16
233 msgid "Are you sure you want to delete this answer?" 233 msgid "Are you sure you want to delete this answer?"
234 -msgstr "" 234 +msgstr "Tem certeza que deseja deletar esta resposta?"
235 235
236 #: forum/templates/post_answers/post_answer_list.html:42 forum/views.py:295 236 #: forum/templates/post_answers/post_answer_list.html:42 forum/views.py:295
237 msgid "Load more answers" 237 msgid "Load more answers"
238 -msgstr "" 238 +msgstr "Carregar mais respostas"
239 239
240 #: forum/views.py:130 240 #: forum/views.py:130
241 msgid "Forum deleted successfully." 241 msgid "Forum deleted successfully."
242 -msgstr "" 242 +msgstr "Fórum deletado com sucesso."
243 243
244 #: forum/views.py:253 244 #: forum/views.py:253
245 msgid "Post deleted successfully." 245 msgid "Post deleted successfully."
246 -msgstr "" 246 +msgstr "Postagem deletada com sucesso."
247 247
248 #: forum/views.py:365 248 #: forum/views.py:365
249 msgid "Post answer deleted successfully." 249 msgid "Post answer deleted successfully."
250 -msgstr "" 250 +msgstr "Resposta deletada com sucesso."
forum/static/js/forum.js
@@ -47,7 +47,7 @@ function createForum(url, topic) { @@ -47,7 +47,7 @@ function createForum(url, topic) {
47 $(".forum_form").html(data); 47 $(".forum_form").html(data);
48 $("#id_topic").val(topic); 48 $("#id_topic").val(topic);
49 49
50 - setForumCreateFormSubmit(); 50 + setForumCreateFormSubmit(topic);
51 } 51 }
52 }); 52 });
53 53
@@ -59,7 +59,7 @@ function createForum(url, topic) { @@ -59,7 +59,7 @@ function createForum(url, topic) {
59 * Function to set the forum's create form submit function 59 * Function to set the forum's create form submit function
60 * 60 *
61 */ 61 */
62 -function setForumCreateFormSubmit() { 62 +function setForumCreateFormSubmit(topic) {
63 $('.date-picker').datepicker({ 63 $('.date-picker').datepicker({
64 language: locale, 64 language: locale,
65 }); 65 });
@@ -72,13 +72,13 @@ function setForumCreateFormSubmit() { @@ -72,13 +72,13 @@ function setForumCreateFormSubmit() {
72 data: frm.serialize(), 72 data: frm.serialize(),
73 dataType: "json", 73 dataType: "json",
74 success: function (data) { 74 success: function (data) {
75 - $('.foruns_list').append("<li><i class='fa fa-commenting' aria-hidden='true'></i> <a id='forum_"+data.forum_id+"' href='"+data.url+"'> "+data.name+"</a></li>"); 75 + $(".topic_" + topic).find('.foruns_list').append("<li><i class='fa fa-commenting' aria-hidden='true'></i> <a id='forum_"+data.forum_id+"' href='"+data.url+"'> "+data.name+"</a></li>");
76 76
77 $("#createForum").modal('hide'); 77 $("#createForum").modal('hide');
78 }, 78 },
79 error: function(data) { 79 error: function(data) {
80 $(".forum_form").html(data.responseText); 80 $(".forum_form").html(data.responseText);
81 - setForumCreateFormSubmit(); 81 + setForumCreateFormSubmit(topic);
82 } 82 }
83 }); 83 });
84 return false; 84 return false;
forum/tests/test_view_forum.py
@@ -120,22 +120,16 @@ class ForumViewTestCase (TestCase): @@ -120,22 +120,16 @@ class ForumViewTestCase (TestCase):
120 self.assertEquals(response.status_code, 200) 120 self.assertEquals(response.status_code, 200)
121 121
122 response = self.client_professor.get(url) 122 response = self.client_professor.get(url)
123 - self.assertEquals(response.status_code, 200) 123 + self.assertEquals(response.status_code, 302)
124 124
125 response = self.client_student.get(url) 125 response = self.client_student.get(url)
126 - self.assertEquals(response.status_code, 200) 126 + self.assertEquals(response.status_code, 302)
127 127
128 def test_ForumDetail_context(self): 128 def test_ForumDetail_context(self):
129 url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) 129 url = reverse('course:forum:view', kwargs={'slug':self.forum.slug})
130 130
131 response = self.client.get(url) 131 response = self.client.get(url)
132 - self.assertTrue('forum' in response.context)  
133 -  
134 - response = self.client_professor.get(url)  
135 - self.assertTrue('forum' in response.context)  
136 -  
137 - response = self.client_student.get(url)  
138 - self.assertTrue('forum' in response.context) 132 + self.assertTrue('form' in response.context)
139 133
140 134
141 ######################### CreateForumView ######################### 135 ######################### CreateForumView #########################
links/admin.py
@@ -3,8 +3,8 @@ from django.contrib import admin @@ -3,8 +3,8 @@ from django.contrib import admin
3 from .models import Link 3 from .models import Link
4 4
5 class LinkAdmin(admin.ModelAdmin): 5 class LinkAdmin(admin.ModelAdmin):
6 - list_display = ['name', 'link_url','link_description']  
7 - search_fields = ['name', 'link_url','link_description'] 6 + list_display = ['name', 'slug','link_url','link_description']
  7 + search_fields = ['name','slug' ,'link_url','link_description']
8 8
9 9
10 admin.site.register(Link, LinkAdmin) 10 admin.site.register(Link, LinkAdmin)
links/forms.py
1 from django import forms 1 from django import forms
2 from .models import Link 2 from .models import Link
3 -import validators 3 +from django.utils.translation import ugettext_lazy as _
  4 +from django.core.exceptions import ValidationError, FieldError
  5 +import requests
4 6
5 class CreateLinkForm(forms.ModelForm): 7 class CreateLinkForm(forms.ModelForm):
6 8
7 - def clean_link(self): 9 + def clean_link_url(self):
8 link_url = self.cleaned_data['link_url'] 10 link_url = self.cleaned_data['link_url']
9 - if not validators.url(link_url):  
10 - raise forms.ValidationError(_('Please enter a valid URL')) 11 + try:
  12 + response = requests.head(link_url)
  13 + if response.status_code >= 400:
  14 + raise forms.ValidationError(_('Invalid url!'))
  15 + except requests.ConnectionError:
  16 + raise forms.ValidationError(_('Invalid url!'))
11 return link_url 17 return link_url
12 18
13 class Meta: 19 class Meta:
@@ -15,6 +21,15 @@ class CreateLinkForm(forms.ModelForm): @@ -15,6 +21,15 @@ class CreateLinkForm(forms.ModelForm):
15 fields = ['name','link_url','link_description'] 21 fields = ['name','link_url','link_description']
16 22
17 class UpdateLinkForm(forms.ModelForm): 23 class UpdateLinkForm(forms.ModelForm):
  24 + def clean_link_url(self):
  25 + link_url = self.cleaned_data['link_url']
  26 + try:
  27 + resposta = requests.head(link_url)
  28 + if resposta.status_code >= 400:
  29 + raise forms.ValidationError(_('Invalid url!'))
  30 + except requests.ConnectionError:
  31 + raise forms.ValidationError(_('Invalid url!'))
  32 + return link_url
18 class Meta: 33 class Meta:
19 model = Link 34 model = Link
20 fields = ['name','link_url','link_description'] 35 fields = ['name','link_url','link_description']
links/image-crawler.py
@@ -1,53 +0,0 @@ @@ -1,53 +0,0 @@
1 -from bs4 import BeautifulSoup  
2 -from urllib.request import urlopen  
3 -import urllib.request  
4 -  
5 -  
6 -def make_soup(url):  
7 - try:  
8 - html = urlopen(url).read()  
9 - return BeautifulSoup(html,"lxml")  
10 - except urllib.error.HTTPError as e:  
11 - return "Use default image"  
12 -  
13 -def get_images(url):  
14 - try:  
15 - soup = make_soup(url)  
16 - except:  
17 - return("Use default image")  
18 - if soup == None or type(soup) == str:  
19 - return "Use default image"  
20 - images = [img for img in soup.findAll('img')]  
21 - image_links = [each.get('src') for each in images]  
22 - contador = 0  
23 - for each in image_links:  
24 - booleano = False  
25 - if each != "":  
26 - if each == None:  
27 - continue  
28 - if 'jpg' in each:  
29 - booleano = True  
30 - pos = each.index("jpg")  
31 - each = each[0:pos+3]  
32 - elif 'png' in each:  
33 - booleano = True  
34 - pos = each.index("png")  
35 - each = each[0:pos+3]  
36 - elif 'jpeg' in each:  
37 - booleano = True  
38 - pos = each.index('jpeg')  
39 - each = each[0:pos+4]  
40 - if not booleano:  
41 - continue  
42 -  
43 - if each[0] + each[1] == '//' or each[0] == '/':  
44 - each = 'http:'+each  
45 - if each[0:4] != 'http' and each[0:5] != 'https':  
46 - each = url[0:url.index('/',8)] + each  
47 - contador += 1  
48 - caminho = ""  
49 - filename=each.split('/')[-1]  
50 - try:  
51 - urllib.request.urlretrieve(each,"%s"%(caminho)+str(contador)+filename)  
52 - except Exception:  
53 - continue  
links/image_crawler.py 0 → 100644
@@ -0,0 +1,60 @@ @@ -0,0 +1,60 @@
  1 +from bs4 import BeautifulSoup
  2 +from urllib.request import urlopen
  3 +import urllib.request
  4 +
  5 +def make_soup(url):
  6 + try:
  7 + html = urlopen(url).read()
  8 + return BeautifulSoup(html,"lxml")
  9 +
  10 + except urllib.error.HTTPError as e:
  11 + return "Use default image"
  12 +
  13 +def get_images(url,slug):
  14 + downloaded = False
  15 + try:
  16 + soup = make_soup(url)
  17 + except:
  18 + return("Use default image",downloaded)
  19 + if soup == None or type(soup) == str:
  20 + return ("Use default image",downloaded)
  21 + images = [img for img in soup.findAll('img')]
  22 + image_links = [each.get('src') for each in images]
  23 + link_slug = slug
  24 + filename = ''
  25 + for each in image_links:
  26 + if downloaded:
  27 + break
  28 + booleano = False
  29 + if each != "":
  30 + if each == None:
  31 + continue
  32 + if 'jpg' in each:
  33 + booleano = True
  34 + pos = each.index("jpg")
  35 + each = each[0:pos+3]
  36 + filename = '.jpg'
  37 + elif 'png' in each:
  38 + booleano = True
  39 + pos = each.index("png")
  40 + each = each[0:pos+3]
  41 + filename = '.png'
  42 + elif 'jpeg' in each:
  43 + booleano = True
  44 + pos = each.index('jpeg')
  45 + each = each[0:pos+4]
  46 + filename = '.jpeg'
  47 + if not booleano:
  48 + continue
  49 +
  50 + if each[0] + each[1] == '//' or each[0] == '/':
  51 + each = 'http:'+each
  52 + if each[0:4] != 'http' and each[0:5] != 'https':
  53 + each = url[0:url.index('/',8)] + each
  54 + caminho = "links/static/images/"
  55 + try:
  56 + urllib.request.urlretrieve(each,"%s"%(caminho)+str(link_slug)+filename)
  57 + downloaded = True
  58 + except Exception:
  59 + continue
  60 + return filename,downloaded
links/locale/pt_BR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid &quot;&quot; @@ -8,7 +8,7 @@ msgid &quot;&quot;
8 msgstr "" 8 msgstr ""
9 "Project-Id-Version: PACKAGE VERSION\n" 9 "Project-Id-Version: PACKAGE VERSION\n"
10 "Report-Msgid-Bugs-To: \n" 10 "Report-Msgid-Bugs-To: \n"
11 -"POT-Creation-Date: 2016-10-26 14:47-0300\n" 11 +"POT-Creation-Date: 2016-10-27 23:54-0300\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n" 14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,64 +18,63 @@ msgstr &quot;&quot; @@ -18,64 +18,63 @@ msgstr &quot;&quot;
18 "Content-Transfer-Encoding: 8bit\n" 18 "Content-Transfer-Encoding: 8bit\n"
19 "Plural-Forms: nplurals=2; plural=(n > 1);\n" 19 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
20 20
21 -#: links/forms.py:10  
22 -msgid "Please enter a valid URL"  
23 -msgstr "" 21 +#: .\forms.py:16 .\forms.py:22
  22 +msgid "Invalid url!"
  23 +msgstr "Url inválida!"
24 24
25 -#: links/templates/links/create_link.html:9 25 +#: .\templates\links\create_link.html:9
26 msgid "Create a New Link" 26 msgid "Create a New Link"
27 -msgstr "" 27 +msgstr "Criar um novo link"
28 28
29 -#: links/templates/links/create_link.html:34  
30 -#: links/templates/links/delete_link.html:15  
31 -#: links/templates/links/update_link.html:25 29 +#: .\templates\links\create_link.html:46 .\templates\links\delete_link.html:15
  30 +#: .\templates\links\update_link.html:25
32 msgid "Cancel" 31 msgid "Cancel"
33 -msgstr "" 32 +msgstr "Cancelar"
34 33
35 -#: links/templates/links/delete_link.html:11 34 +#: .\templates\links\delete_link.html:11
36 msgid "Do you really want to delete this link?" 35 msgid "Do you really want to delete this link?"
37 -msgstr "" 36 +msgstr "Você realmente deseja apagar este link?"
38 37
39 -#: links/templates/links/delete_link.html:16 38 +#: .\templates\links\delete_link.html:16
40 msgid "Confirm" 39 msgid "Confirm"
41 -msgstr "" 40 +msgstr "Confirmar"
42 41
43 -#: links/templates/links/update_link.html:8 42 +#: .\templates\links\update_link.html:8
44 msgid "Links" 43 msgid "Links"
45 -msgstr "" 44 +msgstr "Links"
46 45
47 -#: links/templates/links/update_link.html:13 46 +#: .\templates\links\update_link.html:13
48 msgid "Name" 47 msgid "Name"
49 -msgstr "" 48 +msgstr "Nome"
50 49
51 -#: links/templates/links/update_link.html:17 50 +#: .\templates\links\update_link.html:17
52 msgid "URL" 51 msgid "URL"
53 -msgstr "" 52 +msgstr "URL"
54 53
55 -#: links/templates/links/update_link.html:21  
56 -msgid "Descrição"  
57 -msgstr "" 54 +#: .\templates\links\update_link.html:21
  55 +msgid "Description"
  56 +msgstr "Descrição"
58 57
59 -#: links/templates/links/update_link.html:26 58 +#: .\templates\links\update_link.html:26
60 msgid "Submit" 59 msgid "Submit"
61 -msgstr "" 60 +msgstr "Enviar"
62 61
63 -#: links/templates/links/view_link.html:8 62 +#: .\templates\links\view_link.html:8
64 msgid "Link" 63 msgid "Link"
65 -msgstr "" 64 +msgstr "Link"
66 65
67 -#: links/templates/links/view_link.html:17 66 +#: .\templates\links\view_link.html:17
68 msgid "Read more" 67 msgid "Read more"
69 -msgstr "" 68 +msgstr "Ler mais"
70 69
71 -#: links/views.py:28 70 +#: .\views.py:28
72 msgid "Link created successfully!" 71 msgid "Link created successfully!"
73 -msgstr "" 72 +msgstr "Link criado com sucesso!"
74 73
75 -#: links/views.py:50 74 +#: .\views.py:50
76 msgid "Link deleted Successfully!" 75 msgid "Link deleted Successfully!"
77 -msgstr "" 76 +msgstr "Link apagado com sucesso!"
78 77
79 -#: links/views.py:69 78 +#: .\views.py:69
80 msgid "Link updated successfully!" 79 msgid "Link updated successfully!"
81 -msgstr "" 80 +msgstr "Link atualizado com sucesso!"
links/migrations/0002_link_image.py 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2016-10-28 18:34
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('links', '0001_initial'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AddField(
  16 + model_name='link',
  17 + name='image',
  18 + field=models.ImageField(blank=True, upload_to='links/'),
  19 + ),
  20 + ]
links/models.py
@@ -5,6 +5,7 @@ from autoslug.fields import AutoSlugField @@ -5,6 +5,7 @@ from autoslug.fields import AutoSlugField
5 class Link(Material): 5 class Link(Material):
6 link_url = models.URLField() 6 link_url = models.URLField()
7 link_description = models.CharField(max_length=200) 7 link_description = models.CharField(max_length=200)
  8 + image = models.ImageField(upload_to = 'links/',blank = True)
8 class Meta: 9 class Meta:
9 verbose_name = 'Link' 10 verbose_name = 'Link'
10 verbose_name_plural = "Links" 11 verbose_name_plural = "Links"
links/static/css/link.css 0 → 100644
@@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
  1 +.modal-backdrop{
  2 + z-index: 0;
  3 +}
0 \ No newline at end of file 4 \ No newline at end of file
links/static/images/default.jpg 0 → 100644

19.5 KB

links/static/js/links.js 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +function get_modal_link(url, id,div_content){
  2 + $.get(url, function (data) {
  3 + $(div_content).empty();
  4 + $(div_content).append(data);
  5 + $(id).modal('show');
  6 + });
  7 +
  8 +}
links/templates/links/create_link.html
@@ -12,27 +12,29 @@ @@ -12,27 +12,29 @@
12 <!-- Card --> 12 <!-- Card -->
13 <form method="post" action="" id="form-link" enctype="multipart/form-data"> 13 <form method="post" action="" id="form-link" enctype="multipart/form-data">
14 {% csrf_token %} 14 {% csrf_token %}
15 - {% if messages %}  
16 - {% for message in messages %}  
17 - <div class="alert alert-{{ message.tags }} alert-dismissible" role="alert">  
18 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
19 - <span aria-hidden="true">&times;</span>  
20 - </button>  
21 - <p>{{ message }}</p>  
22 - </div>  
23 - {% endfor %}  
24 - {% endif %}  
25 {% for field in form %} 15 {% for field in form %}
  16 + <div class ="form-group">
26 {% if field.field.required %} 17 {% if field.field.required %}
27 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> 18 <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label>
28 - {% else %}  
29 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
30 {% endif %} 19 {% endif %}
31 - {% render_field field class='form-control' %} 20 + {% render_field field class='form-control input-sm' %}
  21 + {% if field.errors %}
  22 + <div class="alert alert-danger alert-dismissible clearfix" role="alert">
  23 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  24 + <span aria-hidden="true">&times;</span>
  25 + </button>
  26 + <ul>
  27 + {% for error in field.errors %}
  28 + <li>{{ error }}</li>
  29 + {% endfor %}
  30 + </ul>
  31 + </div>
  32 + {% endif %}
  33 + </div>
32 {% endfor %} 34 {% endfor %}
33 <div class="form-group"> 35 <div class="form-group">
34 - <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a>  
35 - <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %]</button> 36 + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Cancel" %}</button>
  37 + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button>
36 </div> 38 </div>
37 <!-- .end Card --> 39 <!-- .end Card -->
38 </div> 40 </div>
@@ -40,29 +42,32 @@ @@ -40,29 +42,32 @@
40 </div> 42 </div>
41 </div> 43 </div>
42 <!-- EndModal --> 44 <!-- EndModal -->
43 -  
44 -{# // <script src="{% static '/links.js' %}"></script> #}  
45 -<script type="text/javascript">  
46 - $("#form-link").submit(function(event) {  
47 - var data = new FormData($('#form-link').get(0));  
48 - $.ajax({  
49 - url: "{% url 'course:links:create_link' topic.slug %}",  
50 - type: $("#form-link").attr('method'),  
51 - data: data,  
52 - cache: false,  
53 - processData: false,  
54 - contentType: false,  
55 - success: function(data) {  
56 - $('#createLinksModal').modal('hide');  
57 - $('#list-topic{{ topic.id }}-links').append(data);  
58 - $('#list-topic{{ topic.id }}-links-edit').append(data);  
59 - },  
60 - error: function(data){  
61 - $('.erro').html(data.responseText);  
62 - $('.modal-backdrop').remove();  
63 - $('#createLinksModal').modal();  
64 - }  
65 - });  
66 - event.preventDefault();  
67 - });  
68 -</script> 45 +{% block script_link %}
  46 + {# // <script src="{% static 'js/links.js' %}"></script> #}
  47 + <script type="text/javascript">
  48 + $("#form-link").submit(function(event) {
  49 + var data = new FormData($('#form-link').get(0));
  50 + $.ajax({
  51 + url: "{% url 'course:links:create_link' topic.slug %}",
  52 + type: $("#form-link").attr('method'),
  53 + data: data,
  54 + cache: false,
  55 + processData: false,
  56 + contentType: false,
  57 + success: function(data) {
  58 + $('#createLinksModal').modal('hide');
  59 + $('#list-topic{{ topic.id }}-links').append(data);
  60 + $('#list-topic{{ topic.id }}-links-edit').append(data);
  61 + alertify.alert('Link successfully created!')
  62 + },
  63 + error: function(data){
  64 + $('.erro').html(data.responseText);
  65 + $('.modal-backdrop').remove();
  66 + $('#createLinksModal').modal();
  67 + alertify.alert('Invalid link, insert a valid one!');
  68 + }
  69 + });
  70 + event.preventDefault();
  71 + });
  72 + </script>
  73 +{% endblock script_link %}
links/templates/links/delete_link.html
1 -{% load widget_tweaks i18n %}  
2 -<!-- MODAL REMOVE LINK -->  
3 -<div class="modal" id="removeLink">  
4 - <div class="modal-dialog">  
5 - <div class="modal-content">  
6 - <div class="modal-header">  
7 - <button type="button" class="close" data-dismiss="modal" aria-hidden="true">X</button>  
8 - <h4 class="modal-title"></h4>  
9 - </div>  
10 - <div class="modal-body">  
11 - <p>{% trans 'Do you really want to delete this link?' %}</p>  
12 - </div>  
13 - <div class="modal-footer">  
14 - <!-- -->  
15 - <button type="button" class="btn btn-primary btn-default" data-dismiss="modal">{% trans 'Cancel' %}</button>  
16 - <a href="http://www.google.com" target="_self"><button type="button" class="btn btn-primary" data-dismiss="modal" aria-hidden="true">{% trans 'Confirm' %}</button></a> 1 +{% load static widget_tweaks i18n %}
17 2
18 - </div> 3 +<!-- MODAL DELETE LINK -->
  4 +<link rel="stylesheet" type="text/css" href="{% static 'css/link.css' %}">
  5 +
  6 +<div class="erro-update">
  7 + <div class="modal fade" id="linkDeleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteLinkLabel" style="z-index: 10">
  8 + <div class="modal-dialog" role="document">
  9 + <div class="modal-content">
  10 + <div class="modal-header">
  11 + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
  12 + <h4 class="modal-title" id="deleteLinkLabel">{% trans 'Delete Link' %}</h4>
  13 + </div>
  14 + <div class="modal-body">
  15 + <!-- Card -->
  16 + <form class="form-horizontal" method="post" id="form-delete-link" enctype="multipart/form-data">
  17 + {% csrf_token %}
  18 + <fieldset>
  19 + <div class="col-md-12">
  20 + {% trans "Are you sure to delete the link " %} <strong>"{{ link.name }}"</strong> </a> of {{ link.topic.name }}?
  21 + </div>
  22 + <div class="form-group">
  23 + <div class="col-md-12">
  24 + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button>
  25 + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Delete' %}</button>
  26 + </div>
  27 + </div>
  28 + </fieldset>
  29 + </form>
  30 + <!-- .end Card -->
  31 + </div>
  32 + </div>
  33 + </div>
19 </div> 34 </div>
20 - </div>  
21 </div> 35 </div>
22 -<!-- END --> 36 +
  37 +{% block script_link %}
  38 +
  39 + {# // <script src="{% static 'js/link.js' %}"></script> #}
  40 + <script type="text/javascript">
  41 + $("#form-delete-link").submit(function(event) {
  42 + var data = new FormData($('#form-delete-link').get(0));
  43 + $.ajax({
  44 + url: "{% url 'course:links:delete_link' link.slug %}",
  45 + type: $("#form-delete-link").attr('method'),
  46 + data: data,
  47 + cache: false,
  48 + processData: false,
  49 + contentType: false,
  50 + success: function(data) {
  51 + $('#linkDeleteModal').modal('hide');
  52 + $('#link_{{ link.slug }}').remove();
  53 + $('#link_edit_icon_{{ link.slug }}').remove();
  54 + $('#link_edit_{{ link.slug }}').remove();
  55 + alertify.alert('Link successfully deleted!')
  56 + },
  57 + error: function(data){
  58 + // $('.erro-update').html(data.responseText);
  59 + $('.modal-backdrop').remove();
  60 + $('#linkDeteleModal').modal();
  61 + alertify.alert('Error when trying to delete.');
  62 + }
  63 + });
  64 + event.preventDefault();
  65 + });
  66 + </script>
  67 +{% endblock script_link %}
  68 +<!-- EndModal -->
links/templates/links/render_link.html
1 -<li><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link}}</a></li> 1 +<li id="link_{{ link.slug }}"><i class="fa fa-link" aria-hidden="true"></i> <a href="javascript:get_modal_link('{% url 'course:links:view_link' link.slug %}', '#viewLinkModal','#divModalLink')">{{link.name}}</a></li>
links/templates/links/update_link.html
@@ -5,29 +5,73 @@ @@ -5,29 +5,73 @@
5 <div class="modal-content"> 5 <div class="modal-content">
6 <div class="modal-header"> 6 <div class="modal-header">
7 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> 7 <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
8 - <h4 class="modal-title" id="myModalLabel">{% trans 'Links' %}</h4> 8 + <h4 class="modal-title" id="myModalLabel">{% trans 'Edit Link' %}</h4>
9 </div> 9 </div>
10 <div class="modal-body"> 10 <div class="modal-body">
11 <!-- Card --> 11 <!-- Card -->
  12 + <form class="form-horizontal" method="post" id="form-update-link" enctype="multipart/form-data">
  13 + {% csrf_token %}
  14 + {% for field in form %}
  15 + <div class="form-group is-empty">
  16 + <div class="col-md-12">
  17 + {% if field.field.required %}
  18 + <label for="{{ field.auto_id }}" class="control-label">{{ field.label }}<span>*</span></label>
  19 + {% else %}
  20 + <label for="{{ field.auto_id }}" class=" control-label">{{ field.label }}</label>
  21 + {% endif %}
  22 + {% render_field field class='form-control input-sm' %}
  23 + </div>
  24 + </div>
  25 + {% if field.errors %}
  26 + <div class="alert alert-danger alert-dismissible clearfix" role="alert">
  27 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  28 + <span aria-hidden="true">&times;</span>
  29 + </button>
  30 + <ul>
  31 + {% for error in field.errors %}
  32 + <li>{{ error }}</li>
  33 + {% endfor %}
  34 + </ul>
  35 + </div>
  36 + {% endif %}
  37 + {% endfor %}
12 <div class="form-group"> 38 <div class="form-group">
13 - <label class="control-label" for="inputDefault">{% trans 'Name' %}</label>  
14 - <input value="Python" type="text" class="form-control" id="inputDefault"> 39 + <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Cancel" %}</button>
  40 + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button>
15 </div> 41 </div>
16 - <div class="form-group">  
17 - <label class="control-label" for="inputDefault">{% trans 'URL' %}</label>  
18 - <input value="https://www.python.org/" type="text" class="form-control" id="inputDefault">  
19 - </div>  
20 - <div class="form-group is-empty">  
21 - <label class="control-label" for="inputDefault">{% trans 'Descrição' %}</label>  
22 - <textarea class="form-control" rows="3"></textarea>  
23 - </div>  
24 - <div class="form-group">  
25 - <a href="javascript:void(0)" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a>  
26 - <a href="javascript:void(0)" class="btn btn-raised btn-primary">{% trans 'Submit' %}</a>  
27 - </div>  
28 <!-- .end Card --> 42 <!-- .end Card -->
29 </div> 43 </div>
30 </div> 44 </div>
31 </div> 45 </div>
32 </div> 46 </div>
33 <!-- EndModal --> 47 <!-- EndModal -->
  48 +{% block script_link %}
  49 +
  50 + {# // <script src="{% static 'js/links.js' %}"></script> #}
  51 + <script type="text/javascript">
  52 + $("#form-update-link").submit(function(event) {
  53 + var data = new FormData($('#form-update-link').get(0));
  54 + $.ajax({
  55 + url: "{% url 'course:links:update_link' link.slug %}",
  56 + type: $("#form-update-link").attr('method'),
  57 + data: data,
  58 + cache: false,
  59 + processData: false,
  60 + contentType: false,
  61 + success: function(data) {
  62 + $('#linksModalEdit').modal('hide');
  63 + $('#link_edit_{{ link.slug }}').replaceWith(data);
  64 + $('#link_{{ link.slug }}').replaceWith(data);
  65 + alertify.alert("Sucessfully Updated!")
  66 + },
  67 + error: function(data){
  68 + $('.erro-update').html(data.responseText);
  69 + $('.modal-backdrop').remove();
  70 + $('#linksModalEdit').modal();
  71 + alertify.alert('Invalid link, insert a valid one!');
  72 + }
  73 + });
  74 + event.preventDefault();
  75 + });
  76 + </script>
  77 +{% endblock script_link %}
links/templates/links/view_link.html
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <div class="modal-body"> 10 <div class="modal-body">
11 <!-- Card --> 11 <!-- Card -->
12 <article class="card animated fadeInLeft"> 12 <article class="card animated fadeInLeft">
13 - <img class="card-img-top img-responsive" src="https://www.python.org/static/opengraph-icon-200x200.png" align="left"> 13 + <img class="card-img-top img-responsive" src="{{ link.image.url}}" width="200" height="200" align="left">
14 <div class="card-block"> 14 <div class="card-block">
15 <b class="card-title">{{link.name}}</b><p></p> 15 <b class="card-title">{{link.name}}</b><p></p>
16 <p class="card-text"> </p><p>{{link.link_description}}</p> 16 <p class="card-text"> </p><p>{{link.link_description}}</p>
links/tests.py
@@ -154,7 +154,9 @@ class LinkTestCase(TestCase): @@ -154,7 +154,9 @@ class LinkTestCase(TestCase):
154 url = reverse('course:links:update_link',kwargs={'slug': self.link.slug}) 154 url = reverse('course:links:update_link',kwargs={'slug': self.link.slug})
155 print("slug",self.link.slug) 155 print("slug",self.link.slug)
156 data = { 156 data = {
  157 + "name" : 'testinglink',
157 "link_description":'new description', 158 "link_description":'new description',
  159 + "link_url" : 'teste.com',
158 } 160 }
159 self.assertEqual(Link.objects.all()[0].link_description, "testdescription") # old description 161 self.assertEqual(Link.objects.all()[0].link_description, "testdescription") # old description
160 response = self.client.post(url, data) 162 response = self.client.post(url, data)
@@ -3,8 +3,8 @@ from . import views @@ -3,8 +3,8 @@ from . import views
3 3
4 urlpatterns = [ 4 urlpatterns = [
5 url(r'^create_link/(?P<slug>[\w_-]+)/$', views.CreateLink.as_view(), name='create_link'), 5 url(r'^create_link/(?P<slug>[\w_-]+)/$', views.CreateLink.as_view(), name='create_link'),
6 - url(r'^deletelink/(?P<linkname>[\w_-]+)/$', views.deleteLink,name = 'delete_link'),  
7 - url(r'^updatelink/(?P<slug>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'),  
8 - url(r'^render-link/(?P<id>[0-9]+)/$', views.render_link, name='render_link'), 6 + url(r'^delete_link/(?P<slug>[\w_-]+)/$', views.DeleteLink.as_view(),name = 'delete_link'),
  7 + url(r'^update_link/(?P<slug>[\w_-]+)/$', views.UpdateLink.as_view(),name = 'update_link'),
  8 + url(r'^render-link/(?P<slug>[\w_-]+)/$', views.render_link, name='render_link'),
9 url(r'^view_link/(?P<slug>[\w_-]+)/$',views.ViewLink.as_view(),name = 'view_link') 9 url(r'^view_link/(?P<slug>[\w_-]+)/$',views.ViewLink.as_view(),name = 'view_link')
10 ] 10 ]
links/views.py
@@ -6,12 +6,16 @@ from django.utils.translation import ugettext_lazy as _ @@ -6,12 +6,16 @@ from django.utils.translation import ugettext_lazy as _
6 from django.shortcuts import get_object_or_404,redirect 6 from django.shortcuts import get_object_or_404,redirect
7 from django.contrib.auth.mixins import LoginRequiredMixin 7 from django.contrib.auth.mixins import LoginRequiredMixin
8 from rolepermissions.mixins import HasRoleMixin 8 from rolepermissions.mixins import HasRoleMixin
  9 +from core.mixins import NotificationMixin
  10 +from django.urls import reverse
  11 +from django.core.files.base import ContentFile
  12 +from rolepermissions.verifications import has_role
9 13
  14 +from .image_crawler import *
10 from courses.models import Topic 15 from courses.models import Topic
11 from .models import Link 16 from .models import Link
12 from .forms import * 17 from .forms import *
13 -from core.mixins import NotificationMixin  
14 -from django.urls import reverse 18 +
15 19
16 # Create your views here. 20 # Create your views here.
17 class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.CreateView): 21 class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.CreateView):
@@ -20,19 +24,36 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr @@ -20,19 +24,36 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr
20 form_class = CreateLinkForm 24 form_class = CreateLinkForm
21 success_url = reverse_lazy('course:manage') 25 success_url = reverse_lazy('course:manage')
22 context_object_name = 'form' 26 context_object_name = 'form'
  27 + def form_invalid(self,form):
  28 + context = super(CreateLink, self).form_invalid(form)
  29 + context.status_code = 400
  30 +
  31 + return context
23 32
24 def form_valid(self, form): 33 def form_valid(self, form):
25 self.object = form.save(commit = False) 34 self.object = form.save(commit = False)
26 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) 35 topic = get_object_or_404(Topic, slug = self.kwargs.get('slug'))
27 self.object.topic = topic 36 self.object.topic = topic
28 - messages.success(self.request, _('Link created successfully!'))  
29 -  
30 self.object.save() 37 self.object.save()
  38 + self.link = Link.objects.get(slug = self.object.slug)
  39 + self.formato,self.baixado = get_images(self.link.link_url,self.link.slug)
  40 + self.caminho = 'links/static/images/%s'%(self.link.slug)+'%s'%(self.formato)
  41 +
31 super(CreateLink, self).createNotification(message="created a Link at "+ self.object.topic.name, actor=self.request.user, 42 super(CreateLink, self).createNotification(message="created a Link at "+ self.object.topic.name, actor=self.request.user,
32 - resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), 43 + resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]),
33 users=self.object.topic.subject.students.all()) 44 users=self.object.topic.subject.students.all())
34 - 45 + self.setImage()
35 return self.get_success_url() 46 return self.get_success_url()
  47 + def setImage(self):
  48 + if self.baixado:
  49 + with open(self.caminho,'rb') as f:
  50 + data = f.read()
  51 + nome = '%s'%(self.link.slug)+"%s"%(self.formato)
  52 + self.link.image.save(nome,ContentFile(data))
  53 + else:
  54 + with open('links/static/images/default.jpg','rb') as f:
  55 + data = f.read()
  56 + self.link.image.save('default.jpg',ContentFile(data))
36 def get_context_data(self,**kwargs): 57 def get_context_data(self,**kwargs):
37 context = {} 58 context = {}
38 context['links'] = Link.objects.all() 59 context['links'] = Link.objects.all()
@@ -41,20 +62,37 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr @@ -41,20 +62,37 @@ class CreateLink(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.Cr
41 context["topic"] = topic 62 context["topic"] = topic
42 return context 63 return context
43 def get_success_url(self): 64 def get_success_url(self):
44 - self.success_url = redirect('course:links:render_link', id = self.object.id) 65 + self.success_url = redirect('course:links:render_link', slug = self.object.slug)
45 return self.success_url 66 return self.success_url
46 -def deleteLink(request,linkname):  
47 - link = get_object_or_404(Link,name = linkname)  
48 - link.delete()  
49 - template_name = 'links/delete_link.html'  
50 - messages.success(request,_("Link deleted Successfully!"))  
51 -  
52 - return redirect('course:manage')  
53 67
54 -def render_link(request, id): 68 +class DeleteLink(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
  69 + allowed_roles = ['professor', 'system_admin']
  70 + login_url = reverse_lazy("core:home")
  71 + redirect_field_name = 'next'
  72 + model = Link
  73 + template_name = 'links/delete_link.html'
  74 +
  75 + def dispatch(self, *args, **kwargs):
  76 + link = get_object_or_404(Link, slug = self.kwargs.get('slug'))
  77 + if(not (link.topic.owner == self.request.user) and not(has_role(self.request.user, 'system_admin')) ):
  78 + return self.handle_no_permission()
  79 + return super(DeleteLink, self).dispatch(*args, **kwargs)
  80 +
  81 + def get_context_data(self, **kwargs):
  82 + context = super(DeleteLink, self).get_context_data(**kwargs)
  83 + context['course'] = self.object.topic.subject.course
  84 + context['subject'] = self.object.topic.subject
  85 + context['link'] = self.object
  86 + context["topic"] = self.object.topic
  87 + return context
  88 +
  89 + def get_success_url(self):
  90 + return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})
  91 +
  92 +def render_link(request, slug):
55 template_name = 'links/render_link.html' 93 template_name = 'links/render_link.html'
56 context = { 94 context = {
57 - 'link': get_object_or_404(Link, id = id) 95 + 'link': get_object_or_404(Link, slug = slug)
58 } 96 }
59 return render(request, template_name, context) 97 return render(request, template_name, context)
60 98
@@ -64,18 +102,41 @@ class UpdateLink(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): @@ -64,18 +102,41 @@ class UpdateLink(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
64 template_name = 'links/update_link.html' 102 template_name = 'links/update_link.html'
65 form_class = UpdateLinkForm 103 form_class = UpdateLinkForm
66 success_url = reverse_lazy('course:links:render_link') 104 success_url = reverse_lazy('course:links:render_link')
67 - def form_valid(self, form):  
68 - form.save()  
69 - messages.success(self.request, _('Link updated successfully!'))  
70 105
71 - return super(UpdateLink, self).form_valid(form) 106 + def form_invalid(self,form):
  107 + context = super(UpdateLink, self).form_invalid(form)
  108 + context.status_code = 400
72 109
  110 + return context
  111 + def form_valid(self, form):
  112 + formulario = form
  113 + if formulario.has_changed():
  114 + if 'link_url' in formulario.changed_data:
  115 + self.object = form.save()
  116 + self.link = Link.objects.get(slug = self.object.slug)
  117 + self.formato,self.baixado = get_images(self.link.link_url,self.link.slug)
  118 + self.caminho = 'links/static/images/%s'%(self.link.slug)+'%s'%(self.formato)
  119 + self.setImage()
  120 + else:
  121 + form.save()
  122 + else:
  123 + form.save()
  124 + return super(UpdateLink, self).form_valid(form)
  125 + def setImage(self):
  126 + if self.baixado:
  127 + with open(self.caminho,'rb') as f:
  128 + data = f.read()
  129 + nome = '%s'%(self.link.slug)+"%s"%(self.formato)
  130 + self.object.image.save(nome,ContentFile(data))
  131 + else:
  132 + with open('links/static/images/default.jpg','rb') as f:
  133 + data = f.read()
  134 + self.object.image.save('default.jpg',ContentFile(data))
73 def get_object(self, queryset=None): 135 def get_object(self, queryset=None):
74 self.object = get_object_or_404(Link, slug = self.kwargs.get('slug')) 136 self.object = get_object_or_404(Link, slug = self.kwargs.get('slug'))
75 - print(self.object.link_description)  
76 return self.object 137 return self.object
77 def get_success_url(self): 138 def get_success_url(self):
78 - self.success_url = redirect('course:links:render_link', id = self.object.id) 139 + self.success_url = reverse_lazy('course:links:render_link', args = (self.object.slug, ))
79 return self.success_url 140 return self.success_url
80 class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): 141 class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView):
81 allowed_roles = ['professor', 'system_admin'] 142 allowed_roles = ['professor', 'system_admin']
@@ -88,7 +149,7 @@ class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView): @@ -88,7 +149,7 @@ class ViewLink(LoginRequiredMixin,HasRoleMixin,generic.DetailView):
88 context['link'] = link 149 context['link'] = link
89 return context 150 return context
90 def get_success_url(self): 151 def get_success_url(self):
91 - self.success_url = redirect('course:links:render_link', id = self.object.id) 152 + self.success_url = redirect('course:links:render_link', slug = self.object.slug)
92 return self.success_url 153 return self.success_url
93 def get_queryset(self): 154 def get_queryset(self):
94 self.queryset = Link.objects.filter(slug = self.kwargs.get('slug')) 155 self.queryset = Link.objects.filter(slug = self.kwargs.get('slug'))
poll/locale/pt_BR/LC_MESSAGES/django.po
@@ -24,108 +24,108 @@ msgstr &quot;&quot; @@ -24,108 +24,108 @@ msgstr &quot;&quot;
24 24
25 #: poll/models.py:11 poll/models.py:32 25 #: poll/models.py:11 poll/models.py:32
26 msgid "Poll" 26 msgid "Poll"
27 -msgstr "" 27 +msgstr "Enquete"
28 28
29 #: poll/models.py:12 29 #: poll/models.py:12
30 msgid "Polls" 30 msgid "Polls"
31 -msgstr "" 31 +msgstr "Enquetes"
32 32
33 #: poll/models.py:18 poll/models.py:24 poll/templates/poll/answer.html:11 33 #: poll/models.py:18 poll/models.py:24 poll/templates/poll/answer.html:11
34 #: poll/templates/poll/answer_student.html:27 34 #: poll/templates/poll/answer_student.html:27
35 #: poll/templates/poll/create.html:68 poll/templates/poll/create.html:85 35 #: poll/templates/poll/create.html:68 poll/templates/poll/create.html:85
36 #: poll/templates/poll/view.html:33 36 #: poll/templates/poll/view.html:33
37 msgid "Answer" 37 msgid "Answer"
38 -msgstr "" 38 +msgstr "Reposta"
39 39
40 #: poll/models.py:19 40 #: poll/models.py:19
41 msgid "Order" 41 msgid "Order"
42 -msgstr "" 42 +msgstr "Ordem"
43 43
44 #: poll/models.py:20 poll/models.py:25 44 #: poll/models.py:20 poll/models.py:25
45 msgid "Answers" 45 msgid "Answers"
46 -msgstr "" 46 +msgstr "Repostas"
47 47
48 #: poll/models.py:31 48 #: poll/models.py:31
49 msgid "Answered" 49 msgid "Answered"
50 -msgstr "" 50 +msgstr "Respondido"
51 51
52 #: poll/models.py:33 52 #: poll/models.py:33
53 msgid "Answers Students" 53 msgid "Answers Students"
54 -msgstr "" 54 +msgstr "Respostas dos estudantes"
55 55
56 #: poll/models.py:34 56 #: poll/models.py:34
57 msgid "Student" 57 msgid "Student"
58 -msgstr "" 58 +msgstr "Estudante"
59 59
60 #: poll/models.py:35 60 #: poll/models.py:35
61 msgid "Answered Date" 61 msgid "Answered Date"
62 -msgstr "" 62 +msgstr "Data de resposta"
63 63
64 #: poll/models.py:38 64 #: poll/models.py:38
65 msgid "Answer Stundent" 65 msgid "Answer Stundent"
66 -msgstr "" 66 +msgstr "Resposta do estudante"
67 67
68 #: poll/models.py:39 68 #: poll/models.py:39
69 msgid "Answers Student" 69 msgid "Answers Student"
70 -msgstr "" 70 +msgstr "Respostas dos estudantes"
71 71
72 #: poll/templates/poll/answer.html:12 poll/templates/poll/create.html:69 72 #: poll/templates/poll/answer.html:12 poll/templates/poll/create.html:69
73 #: poll/templates/poll/create.html:86 73 #: poll/templates/poll/create.html:86
74 msgid "Possible answer for the question" 74 msgid "Possible answer for the question"
75 -msgstr "" 75 +msgstr "Possível resposta para a questão"
76 76
77 #: poll/templates/poll/create.html:22 77 #: poll/templates/poll/create.html:22
78 msgid "Create a Poll" 78 msgid "Create a Poll"
79 -msgstr "" 79 +msgstr "Criar enquete"
80 80
81 #: poll/templates/poll/create.html:38 81 #: poll/templates/poll/create.html:38
82 msgid "Question?" 82 msgid "Question?"
83 -msgstr "" 83 +msgstr "Pergunta?"
84 84
85 #: poll/templates/poll/create.html:39 85 #: poll/templates/poll/create.html:39
86 msgid "A Question to be answered" 86 msgid "A Question to be answered"
87 -msgstr "" 87 +msgstr "A questão a ser respondida"
88 88
89 #: poll/templates/poll/create.html:154 89 #: poll/templates/poll/create.html:154
90 msgid "Close" 90 msgid "Close"
91 -msgstr "" 91 +msgstr "Fechar"
92 92
93 #: poll/templates/poll/create.html:157 93 #: poll/templates/poll/create.html:157
94 msgid "Create" 94 msgid "Create"
95 -msgstr "" 95 +msgstr "Criar"
96 96
97 #: poll/templates/poll/remove.html:7 97 #: poll/templates/poll/remove.html:7
98 msgid "Delete Poll" 98 msgid "Delete Poll"
99 -msgstr "" 99 +msgstr "Deletar enquete"
100 100
101 #: poll/templates/poll/remove.html:15 101 #: poll/templates/poll/remove.html:15
102 msgid "Are you sure you want to delete the subject" 102 msgid "Are you sure you want to delete the subject"
103 -msgstr "" 103 +msgstr "Tem certeza que deseja deletar este assunto"
104 104
105 #: poll/templates/poll/remove.html:19 105 #: poll/templates/poll/remove.html:19
106 msgid "Delete" 106 msgid "Delete"
107 -msgstr "" 107 +msgstr "Deletar"
108 108
109 #: poll/templates/poll/update.html:7 109 #: poll/templates/poll/update.html:7
110 msgid "Update a Poll" 110 msgid "Update a Poll"
111 -msgstr "" 111 +msgstr "Atualizar enquete"
112 112
113 #: poll/templates/poll/update.html:12 113 #: poll/templates/poll/update.html:12
114 msgid "Update" 114 msgid "Update"
115 -msgstr "" 115 +msgstr "Atualizar"
116 116
117 #: poll/templates/poll/view.html:17 117 #: poll/templates/poll/view.html:17
118 msgid "Limit date:" 118 msgid "Limit date:"
119 -msgstr "" 119 +msgstr "Data limite:"
120 120
121 #: poll/templates/poll/view.html:20 121 #: poll/templates/poll/view.html:20
122 msgid "Status:" 122 msgid "Status:"
123 -msgstr "" 123 +msgstr "Status:"
124 124
125 #: poll/templates/poll/view.html:22 125 #: poll/templates/poll/view.html:22
126 msgid "Poll answered" 126 msgid "Poll answered"
127 -msgstr "" 127 +msgstr "Enquete respondida"
128 128
129 #: poll/templates/poll/view.html:24 129 #: poll/templates/poll/view.html:24
130 msgid "Poll don't yet answered" 130 msgid "Poll don't yet answered"
131 -msgstr "" 131 +msgstr "A enquete não foi respondida ainda"
users/forms.py
@@ -63,7 +63,6 @@ class UpdateUserForm(forms.ModelForm): @@ -63,7 +63,6 @@ class UpdateUserForm(forms.ModelForm):
63 def clean_birth_date(self): 63 def clean_birth_date(self):
64 birth_date = self.cleaned_data['birth_date'] 64 birth_date = self.cleaned_data['birth_date']
65 if birth_date >= date.today(): 65 if birth_date >= date.today():
66 - print('===============' + date.today() + '================')  
67 raise forms.ValidationError(_('Please enter a valid date')) 66 raise forms.ValidationError(_('Please enter a valid date'))
68 return birth_date 67 return birth_date
69 68
@@ -73,10 +72,18 @@ class UpdateUserForm(forms.ModelForm): @@ -73,10 +72,18 @@ class UpdateUserForm(forms.ModelForm):
73 'state', 'gender', 'type_profile', 'cpf', 'phone', 'image', 'titration', 72 'state', 'gender', 'type_profile', 'cpf', 'phone', 'image', 'titration',
74 'year_titration', 'institution', 'curriculum', 'is_staff', 'is_active'] 73 'year_titration', 'institution', 'curriculum', 'is_staff', 'is_active']
75 74
76 -class UpdateProfileForm(UpdateUserForm): 75 +class UpdateProfileFormAdmin(UpdateUserForm):
77 76
78 class Meta: 77 class Meta:
79 model = User 78 model = User
80 fields = ['username', 'name', 'email', 'birth_date', 'city', 79 fields = ['username', 'name', 'email', 'birth_date', 'city',
81 'state', 'gender', 'type_profile', 'cpf', 'phone', 'image', 'titration', 80 'state', 'gender', 'type_profile', 'cpf', 'phone', 'image', 'titration',
82 'year_titration', 'institution', 'curriculum', 'is_staff', 'is_active'] 81 'year_titration', 'institution', 'curriculum', 'is_staff', 'is_active']
  82 +
  83 +class UpdateProfileForm(UpdateUserForm):
  84 +
  85 + class Meta:
  86 + model = User
  87 + fields = ['username', 'name', 'email', 'birth_date', 'city',
  88 + 'state', 'gender', 'cpf', 'phone', 'image', 'titration',
  89 + 'year_titration', 'institution', 'curriculum']
users/templates/list_users.html
1 {% extends 'home.html' %} 1 {% extends 'home.html' %}
2 2
3 -{% load i18n pagination django_bootstrap_breadcrumbs static %} 3 +{% load i18n pagination django_bootstrap_breadcrumbs permission_tags static %}
4 4
5 {% block breadcrumbs %} 5 {% block breadcrumbs %}
6 6
@@ -9,20 +9,23 @@ @@ -9,20 +9,23 @@
9 9
10 {% endblock %} 10 {% endblock %}
11 11
12 -{% block sidebar %}  
13 - <div class="panel panel-primary navigation">  
14 - <div class="panel-heading">  
15 - <h5>{% trans 'Menu' %}</h5>  
16 - </div>  
17 - <div class="panel-body">  
18 - <ul class="nav nav-pills nav-stacked">  
19 - <li><a href="{% url 'core:home' %}">{% trans "Home" %}</a></li>  
20 - <li><a href="{% url 'users:create' %}">{% trans 'Add user' %}</a></li>  
21 - <li><a href="javascript:void(0)">{% trans 'Send email' %}</a></li>  
22 - </ul> 12 +{% if user|has_role:'system_admin' %}
  13 + {% block sidebar %}
  14 + <div class="panel panel-primary navigation">
  15 + <div class="panel-heading">
  16 + <h5>{% trans 'Menu' %}</h5>
  17 + </div>
  18 + <div class="panel-body">
  19 + <ul class="nav nav-pills nav-stacked">
  20 + <li><a href="{% url 'core:home' %}">{% trans "Home" %}</a></li>
  21 + <li><a href="{% url 'users:create' %}">{% trans 'Add user' %}</a></li>
  22 + <li><a href="javascript:void(0)">{% trans 'Send email' %}</a></li>
  23 + </ul>
  24 + </div>
23 </div> 25 </div>
24 - </div>  
25 -{% endblock %} 26 + {% endblock %}
  27 +{% endif %}
  28 +
26 29
27 {% block content %} 30 {% block content %}
28 {% if messages %} 31 {% if messages %}
@@ -54,7 +57,7 @@ @@ -54,7 +57,7 @@
54 <div class="panel-body"> 57 <div class="panel-body">
55 <div class="col-md-4"> 58 <div class="col-md-4">
56 {% if acc.image %} 59 {% if acc.image %}
57 - <div style="background-image: url('{{ acc.image.url }}'); background-size: 100%" alt="photoUser" class="img-circle img-responsive img-list-user"></div> 60 + <div style="background-image: url('{{ acc.image.url }}'); background-size: 100% 100%; background-repeat: no-repeat;" alt="photoUser" class="img-circle img-responsive img-list-user"></div>
58 {% else %} 61 {% else %}
59 {% if acc.gender == 'M' %} 62 {% if acc.gender == 'M' %}
60 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user"> 63 <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user">
users/templates/users/edit_profile.html
1 -{% extends 'list_users.html' %} 1 +{% extends 'users/profile.html' %}
2 2
3 {% load static i18n permission_tags %} 3 {% load static i18n permission_tags %}
4 {% load widget_tweaks %} 4 {% load widget_tweaks %}
@@ -6,9 +6,13 @@ @@ -6,9 +6,13 @@
6 {% load django_bootstrap_breadcrumbs %} 6 {% load django_bootstrap_breadcrumbs %}
7 7
8 {% block breadcrumbs %} 8 {% block breadcrumbs %}
9 -  
10 - {{ block.super }}  
11 - {% breadcrumb 'Update User' 'users:update' %} 9 + {% if user|has_role:'system_admin' %}
  10 + {{ block.super }}
  11 + {% breadcrumb 'Update User' 'users:update' %}
  12 + {% else %}
  13 + {{ block.super }}
  14 + {% breadcrumb 'Update Profile' 'users:update' %}
  15 + {% endif %}
12 16
13 {% endblock %} 17 {% endblock %}
14 18
@@ -25,7 +29,7 @@ @@ -25,7 +29,7 @@
25 {% endfor %} 29 {% endfor %}
26 {% endif %} 30 {% endif %}
27 31
28 - <div class="card"> 32 + <div class="card mg-b-5m">
29 <div class="card-content"> 33 <div class="card-content">
30 <div class="card-body"> 34 <div class="card-body">
31 <form method="post" action="" enctype="multipart/form-data"> 35 <form method="post" action="" enctype="multipart/form-data">
@@ -53,6 +57,9 @@ @@ -53,6 +57,9 @@
53 57
54 {% elif field.auto_id == 'id_phone' %} 58 {% elif field.auto_id == 'id_phone' %}
55 {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %} 59 {% render_field field class='form-control' onkeypress='campoNumerico(this,event); formatarTelefone(this,event);' %}
  60 +
  61 + {% elif field.auto_id == 'id_year_titration' %}
  62 + {% render_field field class='form-control' onkeypress='campoNumerico(this,event);' %}
56 63
57 {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %} 64 {% elif field.auto_id == 'id_is_staff' or field.auto_id == 'id_is_active' %}
58 {% if user|has_role:'system_admin' %} 65 {% if user|has_role:'system_admin' %}
users/templates/users/profile.html
@@ -44,7 +44,15 @@ @@ -44,7 +44,15 @@
44 <div class="well well-lg"> 44 <div class="well well-lg">
45 <div class="row"> 45 <div class="row">
46 <div class="col-md-4"> 46 <div class="col-md-4">
47 - <img src="{{ user.image_url }}" class="img-responsive center-block img-circle" alt="foto perfil" style="max-height:174px"> 47 + {% if user.image %}
  48 + <div style="background-image: url('{{ user.image.url }}'); background-size: 100% 100%; background-repeat: no-repeat; margin-left: 8em;" alt="photoUser" class="img-circle img-responsive img-list-user"></div>
  49 + {% else %}
  50 + {% if usser.gender == 'M' %}
  51 + <img src="{% static 'img/male_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;">
  52 + {% else %}
  53 + <img src="{% static 'img/female_avatar.png' %}" alt="Avatar" class="img-circle img-responsive img-list-user" style="margin-left: 8em;">
  54 + {% endif %}
  55 + {% endif %}
48 </div> 56 </div>
49 <div class="col-md-8"> 57 <div class="col-md-8">
50 <table class="table table-hover table-edited"> 58 <table class="table table-hover table-edited">
@@ -123,22 +131,21 @@ @@ -123,22 +131,21 @@
123 </tr> 131 </tr>
124 <tr> 132 <tr>
125 <td>{% trans "Institution" %}:</td> 133 <td>{% trans "Institution" %}:</td>
126 - {% if user.institution %}  
127 - <td>{{user.institution}}</td>  
128 - {% else %}  
129 - <td>{% trans "Didn't inform institution" %}</td>  
130 - {% endif %}  
131 -  
132 - 134 + {% if user.institution %}
  135 + <td>{{user.institution}}</td>
  136 + {% else %}
  137 + <td>{% trans "Didn't inform institution" %}</td>
  138 + {% endif %}
133 </tr> 139 </tr>
134 <tr> 140 <tr>
135 <td>{% trans "Curriculum" %}:</td> 141 <td>{% trans "Curriculum" %}:</td>
136 {% if user.curriculum %} 142 {% if user.curriculum %}
137 - <td>{{user.curriculum}}</td> 143 + <td>
  144 + <a href="{{user.curriculum.url }}" target="_blank">link</a>
  145 + </td>
138 {% else %} 146 {% else %}
139 <td>{% trans "Didn't upload any curriculum" %}</td> 147 <td>{% trans "Didn't upload any curriculum" %}</td>
140 {% endif %} 148 {% endif %}
141 -  
142 </tr> 149 </tr>
143 </tbody> 150 </tbody>
144 </table> 151 </table>
users/templates/users/update.html
@@ -6,10 +6,10 @@ @@ -6,10 +6,10 @@
6 {% load django_bootstrap_breadcrumbs %} 6 {% load django_bootstrap_breadcrumbs %}
7 7
8 {% block breadcrumbs %} 8 {% block breadcrumbs %}
9 -  
10 - {{ block.super }}  
11 - {% breadcrumb 'Update User' 'users:update' %}  
12 - 9 +
  10 + {{ block.super }}
  11 + {% breadcrumb 'Update User' 'users:update' %}
  12 +
13 {% endblock %} 13 {% endblock %}
14 14
15 15
@@ -25,7 +25,7 @@ @@ -25,7 +25,7 @@
25 {% endfor %} 25 {% endfor %}
26 {% endif %} 26 {% endif %}
27 27
28 - <div class="card"> 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"> 31 <form method="post" action="" enctype="multipart/form-data">
users/views.py
@@ -7,8 +7,9 @@ from django.contrib.auth.mixins import LoginRequiredMixin @@ -7,8 +7,9 @@ from django.contrib.auth.mixins import LoginRequiredMixin
7 from django.core.urlresolvers import reverse_lazy 7 from django.core.urlresolvers import reverse_lazy
8 from django.utils.translation import ugettext_lazy as _ 8 from django.utils.translation import ugettext_lazy as _
9 from rolepermissions.shortcuts import assign_role 9 from rolepermissions.shortcuts import assign_role
  10 +from rolepermissions.verifications import has_role
10 from .models import User 11 from .models import User
11 -from .forms import UserForm, UpdateProfileForm, UpdateUserForm 12 +from .forms import UserForm, UpdateProfileForm, UpdateUserForm, UpdateProfileFormAdmin
12 13
13 # ================ ADMIN ======================= 14 # ================ ADMIN =======================
14 class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView): 15 class UsersListView(HasRoleMixin, LoginRequiredMixin, generic.ListView):
@@ -110,8 +111,6 @@ class Remove_account(generic.TemplateView): @@ -110,8 +111,6 @@ class Remove_account(generic.TemplateView):
110 111
111 112
112 class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView): 113 class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView):
113 -  
114 - allowed_roles = ['student']  
115 login_url = reverse_lazy("core:home") 114 login_url = reverse_lazy("core:home")
116 template_name = 'users/edit_profile.html' 115 template_name = 'users/edit_profile.html'
117 form_class = UpdateProfileForm 116 form_class = UpdateProfileForm
@@ -121,6 +120,14 @@ class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView): @@ -121,6 +120,14 @@ class UpdateProfile(LoginRequiredMixin, generic.edit.UpdateView):
121 user = get_object_or_404(User, username = self.request.user.username) 120 user = get_object_or_404(User, username = self.request.user.username)
122 return user 121 return user
123 122
  123 + def get_context_data(self, **kwargs):
  124 + context = super(UpdateProfile, self).get_context_data(**kwargs)
  125 + if has_role(self.request.user, 'system_admin'):
  126 + context['form'] = UpdateProfileFormAdmin(instance = self.object)
  127 + else:
  128 + context['form'] = UpdateProfileForm(instance = self.object)
  129 + return context
  130 +
124 def form_valid(self, form): 131 def form_valid(self, form):
125 form.save() 132 form.save()
126 messages.success(self.request, _('Profile edited successfully!')) 133 messages.success(self.request, _('Profile edited successfully!'))