Commit f90589bf9ee699dbae2d8fe3bcf14c89f2d5da51
Exists in
master
and in
5 other branches
conflit
Showing
45 changed files
with
933 additions
and
717 deletions
Show diff stats
@@ -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 |
app/models.py
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') |
@@ -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> |
app/urls.py
@@ -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 | ] |
app/views.py
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">×</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">×</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> {% 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> {% 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> {% trans "Edit" %}</a></li> | 34 | + <li><a href="javascript:show_editation('{{topic.slug}}')"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% 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> {% 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> {% 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 "" | @@ -24,119 +24,119 @@ msgstr "" | ||
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 "" | @@ -144,24 +144,24 @@ msgstr "" | ||
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 "" | @@ -20,69 +20,69 @@ msgstr "" | ||
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 "" | @@ -20,88 +20,88 @@ msgstr "" | ||
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 "" | @@ -112,73 +112,73 @@ msgstr "" | ||
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 "" | @@ -187,7 +187,7 @@ msgstr "" | ||
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 "" | @@ -196,7 +196,7 @@ msgstr "" | ||
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 "" | @@ -205,46 +205,46 @@ msgstr "" | ||
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 |
@@ -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 "" | @@ -8,7 +8,7 @@ msgid "" | ||
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 "" | @@ -18,64 +18,63 @@ msgstr "" | ||
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!" |
@@ -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" |
19.5 KB
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">×</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">×</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">×</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) |
links/urls.py
@@ -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 "" | @@ -24,108 +24,108 @@ msgstr "" | ||
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!')) |