Commit e4873697bb9876d1b01e2fab05f37197eaaade60
Exists in
master
and in
5 other branches
conflit
Showing
35 changed files
with
610 additions
and
587 deletions
Show diff stats
app/templates/home.html
@@ -78,26 +78,27 @@ | @@ -78,26 +78,27 @@ | ||
78 | </div> | 78 | </div> |
79 | <div class="panel-body"> | 79 | <div class="panel-body"> |
80 | <ul class="nav nav-pills nav-stacked"> | 80 | <ul class="nav nav-pills nav-stacked"> |
81 | - {% if user|has_role:'student' or not user.is_staff %} | ||
82 | - <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> | ||
83 | - <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li> | ||
84 | - {% endif %} | 81 | + <li> |
82 | + <a href="#menu_courses" class="accordion" data-toggle="collapse">{% trans 'Courses' %}<span class="pull-right glyphicon glyphicon-chevron-down"></span></a> | ||
83 | + <div id="menu_courses" class="collapse"> | ||
84 | + <ul class="nav nav-pill nav-stacked accordion_list"> | ||
85 | + <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> | ||
86 | + <li><a href="{% url 'course:all_courses' %}">{% trans 'All Courses' %}</a></li> | ||
87 | + {% if user|has_role:'system_admin' or user|has_role:'professor'%} | ||
88 | + <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li> | ||
89 | + <li><a href="{% url 'course:create' %}">{% trans 'Create Course' %}</a></li> | ||
90 | + <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category' %}</a></li> | ||
91 | + {% endif %} | ||
92 | + </ul> | ||
93 | + </div> | ||
94 | + </li> | ||
95 | + {% block menu %} | ||
96 | + | ||
97 | + {% endblock %} | ||
85 | {% if user|has_role:'system_admin' %} | 98 | {% if user|has_role:'system_admin' %} |
86 | <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> | 99 | <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> |
87 | <li> <a href="{% url 'app:settings' %}">{% trans 'Settings' %}</a></li> | 100 | <li> <a href="{% url 'app:settings' %}">{% trans 'Settings' %}</a></li> |
88 | {% endif %} | 101 | {% endif %} |
89 | - {% if user|has_role:'system_admin' or user|has_role:'professor' %} | ||
90 | - <li> | ||
91 | - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a> | ||
92 | - <div id="courses_list" class="collapse"> | ||
93 | - <ul class="nav nav-pill nav-stacked accordion_list"> | ||
94 | - {% for course in courses_list %} | ||
95 | - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li> | ||
96 | - {% endfor %} | ||
97 | - </ul> | ||
98 | - </div> | ||
99 | - </li> | ||
100 | - {% endif %} | ||
101 | </ul> | 102 | </ul> |
102 | </div> | 103 | </div> |
103 | </div> | 104 | </div> |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-11-10 15:15 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +import django.contrib.postgres.fields.jsonb | ||
6 | +from django.db import migrations | ||
7 | + | ||
8 | + | ||
9 | +class Migration(migrations.Migration): | ||
10 | + | ||
11 | + dependencies = [ | ||
12 | + ('core', '0003_auto_20161101_1457'), | ||
13 | + ] | ||
14 | + | ||
15 | + operations = [ | ||
16 | + migrations.AlterField( | ||
17 | + model_name='log', | ||
18 | + name='context', | ||
19 | + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, verbose_name='Context'), | ||
20 | + ), | ||
21 | + ] |
core/templates/base.html
@@ -8,9 +8,9 @@ | @@ -8,9 +8,9 @@ | ||
8 | <head> | 8 | <head> |
9 | <title>{{ title }}</title> | 9 | <title>{{ title }}</title> |
10 | 10 | ||
11 | - <!-- jQuery & jQuery UI --> | ||
12 | - <script type="text/javascript" src="{% static 'js/vendor/jquery-3.1.0.min.js' %}"></script> | ||
13 | - <script type="text/javascript" src="{% static 'js/vendor/jquery-ui.js' %}"></script> | 11 | + <!-- jQuery & jQuery UI --> |
12 | + <script type="text/javascript" src="{% static 'js/vendor/jquery-3.1.0.min.js' %}"></script> | ||
13 | + <script type="text/javascript" src="{% static 'js/vendor/jquery-ui.js' %}"></script> | ||
14 | 14 | ||
15 | <meta http-equiv="Cache-Control" content="no-cache, no-store" /> | 15 | <meta http-equiv="Cache-Control" content="no-cache, no-store" /> |
16 | <link href="{% static 'img/topo-amadeus.png' %}" rel="shortcut icon" /> | 16 | <link href="{% static 'img/topo-amadeus.png' %}" rel="shortcut icon" /> |
@@ -30,9 +30,7 @@ | @@ -30,9 +30,7 @@ | ||
30 | <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}"> | 30 | <link rel="stylesheet" type="text/css" href="{% static 'css/vendor/alertifyjs/themes/bootstrap.css' %}"> |
31 | <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script> | 31 | <script type="text/javascript" src="{% static 'bootstrap-3.3.7/js/bootstrap.js' %}"></script> |
32 | <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script> | 32 | <script type="text/javascript" src="{% static 'js/vendor/bootstrap-acessibility.min.js' %}"></script> |
33 | - <script type="text/javascript" src="{% static 'material/js/material.js' %}"></script> | ||
34 | <script type="text/javascript" src="{% static 'material/js/material.min.js' %}"></script> | 33 | <script type="text/javascript" src="{% static 'material/js/material.min.js' %}"></script> |
35 | - <script type="text/javascript" src="{% static 'material/js/ripples.js' %}"></script> | ||
36 | <script type="text/javascript" src="{% static 'material/js/ripples.min.js' %}"></script> | 34 | <script type="text/javascript" src="{% static 'material/js/ripples.min.js' %}"></script> |
37 | <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script> | 35 | <script type="text/javascript" src="{% static 'js/vendor/bootstrap-datepicker.js' %}"></script> |
38 | {% with "js/vendor/locales/bootstrap-datepicker."|add:LANGUAGE_CODE|add:".js" as locale_datepicker %} | 36 | {% with "js/vendor/locales/bootstrap-datepicker."|add:LANGUAGE_CODE|add:".js" as locale_datepicker %} |
@@ -62,84 +60,88 @@ | @@ -62,84 +60,88 @@ | ||
62 | 60 | ||
63 | </head> | 61 | </head> |
64 | <body> | 62 | <body> |
65 | - {% block nav %} | ||
66 | - <div class="navbar navbar-default"> | ||
67 | - <div class="navbar-header"> | ||
68 | - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse"> | ||
69 | - <span class="icon-bar"></span> | ||
70 | - <span class="icon-bar"></span> | ||
71 | - <span class="icon-bar"></span> | ||
72 | - </button> | ||
73 | - <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a> | ||
74 | - </div> | ||
75 | - <div class="navbar-collapse collapse navbar-responsive-collapse"> | ||
76 | - <div class="col-md-5 cards-content" id= 'NavBarSearch'> | ||
77 | - <form id="SearchForm" action="{% url 'users:search' %}" method="get" accept-charset="utf-8"> | ||
78 | - <div class="input-group"> | ||
79 | - <div class="form-group is-empty" > | ||
80 | - <input type="text" class="form-control" placeholder="{% trans 'Search Files (.pdf, others) and/or activities' %}" name="search"> | ||
81 | - </div> | ||
82 | - <span class="input-group-btn input-group-sm"> | ||
83 | - <button type="submit" class="btn btn-primary" id="btn-search"> | ||
84 | - <i class="fa fa-search fa-2x" aria-hidden="true" style="color:#93C741"></i> | ||
85 | - </button> | ||
86 | - </span> | ||
87 | - | ||
88 | - | ||
89 | - </div> | ||
90 | - </form> | ||
91 | - </div> | ||
92 | - | ||
93 | - <ul class="nav navbar-nav navbar-right notifications"> | ||
94 | - <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> | ||
95 | - <a class="dropdown-toggle" data-toggle="dropdown"> <span id="notification-count" class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell" aria-hidden="true"></i></a> | ||
96 | - <ul id="notification-dropdown" class="dropdown-menu"> | ||
97 | - <li class="dropdown-header"> {% trans 'Notifications' %}</li> | ||
98 | - {% include "notifications.html" %} | ||
99 | - | ||
100 | - <li> | ||
101 | - <a onclick="getNotifications(5)"> | ||
102 | - <div id="notification-see-more" class="list-group-item"> | ||
103 | - <div class="row-content"> | ||
104 | - <p class="list-group-item-text">{% trans 'See More' %}</p> | ||
105 | - </div> | ||
106 | - </a> | ||
107 | - </li> | ||
108 | - </ul> | ||
109 | - </li> | ||
110 | - | ||
111 | - <li data-toggle="tooltip" data-placement="bottom" title data-original-title="{% trans 'messages' %}"> <a href="#"><i class="fa fa-comments" aria-hidden="true"></i></a> </li> | ||
112 | - <li > <a class="link" href="{% url 'users:profile' %}">{{ user }}</a></li> | ||
113 | - <li data-toggle="tooltip" data-placement="bottom" title data-original-title="log out"> <a href="{% url 'core:logout' %}"><i class="fa fa-sign-out" aria-hidden="true"></i></a></li> | ||
114 | - </ul> | ||
115 | - </div> | ||
116 | - </div> | ||
117 | - {% endblock %} | ||
118 | - <div class="container-fluid"> | ||
119 | - <div class="row"> | ||
120 | - <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2"> | ||
121 | - {% block sidebar %} | ||
122 | - {% endblock %} | ||
123 | - </div> | ||
124 | - <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | ||
125 | - {% block breadcrumbs %}{% endblock %} | ||
126 | - {% block render_breadcrumbs %}{% endblock %} | ||
127 | - </div> | ||
128 | - <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | ||
129 | - {% block content %}{% endblock %} | ||
130 | - </div> | ||
131 | - </div> | ||
132 | - </div> | ||
133 | - | ||
134 | - {% block script_file %} | ||
135 | - | ||
136 | - {% endblock script_file %} | ||
137 | - | ||
138 | - {% block script_link %} | ||
139 | - | ||
140 | - {% endblock script_link %} | ||
141 | - <!-- Init material Bootstrap --> | ||
142 | - <script type="text/javascript">$.material.init()</script> | 63 | + {% block nav %} |
64 | + <div class="navbar navbar-default"> | ||
65 | + <div class="navbar-header"> | ||
66 | + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse"> | ||
67 | + <span class="icon-bar"></span> | ||
68 | + <span class="icon-bar"></span> | ||
69 | + <span class="icon-bar"></span> | ||
70 | + </button> | ||
71 | + <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a> | ||
72 | + </div> | ||
73 | + <div class="navbar-collapse collapse navbar-responsive-collapse"> | ||
74 | + <div class="col-md-5 cards-content" id= 'NavBarSearch'> | ||
75 | + <form id="SearchForm" action="{% url 'users:search' %}" method="get" accept-charset="utf-8"> | ||
76 | + <div class="input-group"> | ||
77 | + <div class="form-group is-empty" > | ||
78 | + <input type="text" class="form-control" placeholder="{% trans 'Search Files (.pdf, others) and/or activities' %}" name="search"> | ||
79 | + </div> | ||
80 | + <span class="input-group-btn input-group-sm"> | ||
81 | + <button type="submit" class="btn btn-primary" id="btn-search"> | ||
82 | + <i class="fa fa-search fa-2x" aria-hidden="true" style="color:#93C741"></i> | ||
83 | + </button> | ||
84 | + </span> | ||
85 | + </div> | ||
86 | + </form> | ||
87 | + </div> | ||
88 | + <ul class="nav navbar-nav navbar-right notifications"> | ||
89 | + <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> | ||
90 | + <a class="dropdown-toggle" data-toggle="dropdown"> <span id="notification-count" class="badge notification-count">{{notifications.count}}</span><i class="fa fa-bell" aria-hidden="true"></i></a> | ||
91 | + <ul id="notification-dropdown" class="dropdown-menu"> | ||
92 | + <li class="dropdown-header"> {% trans 'Notifications' %}</li> | ||
93 | + {% include "notifications.html" %} | ||
94 | + <li> | ||
95 | + <a onclick="getNotifications(5)"> | ||
96 | + <div id="notification-see-more" class="list-group-item"> | ||
97 | + <div class="row-content"> | ||
98 | + <p class="list-group-item-text">{% trans 'See More' %}</p> | ||
99 | + </div> | ||
100 | + </div> | ||
101 | + </a> | ||
102 | + </li> | ||
103 | + </ul> | ||
104 | + </li> | ||
105 | + <li data-toggle="tooltip" data-placement="bottom" title data-original-title="{% trans 'messages' %}"> <a href="#"><i class="fa fa-comments" aria-hidden="true"></i></a> </li> | ||
106 | + <li> | ||
107 | + <a href="" data-toggle="dropdown">{{ user }}</a> | ||
108 | + <ul class="dropdown-menu pull-right"> | ||
109 | + <li><a href="{% url 'users:profile' %}">{% trans 'Perfil' %}</a></li> | ||
110 | + <li><a href="{% url 'users:update_profile' %}">{% trans 'Edit Profile' %}</a></li> | ||
111 | + <li><a href="{% url 'users:change_password' %}">{% trans 'Change password' %}</a></li> | ||
112 | + <li><a href="{% url 'users:remove_account' %}">{% trans 'Remove account' %}</a></li> | ||
113 | + </ul> | ||
114 | + </li> | ||
115 | + <li data-toggle="tooltip" data-placement="bottom" title data-original-title="log out"> <a href="{% url 'core:logout' %}"><i class="fa fa-sign-out" aria-hidden="true"></i></a></li> | ||
116 | + </ul> | ||
117 | + </div> | ||
118 | + </div> | ||
119 | + {% endblock %} | ||
120 | + <div class="container-fluid"> | ||
121 | + <div class="row"> | ||
122 | + <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2"> | ||
123 | + {% block sidebar %} | ||
124 | + {% endblock %} | ||
125 | + </div> | ||
126 | + <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | ||
127 | + {% block breadcrumbs %}{% endblock %} | ||
128 | + {% block render_breadcrumbs %}{% endblock %} | ||
129 | + </div> | ||
130 | + <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | ||
131 | + {% block content %}{% endblock %} | ||
132 | + </div> | ||
133 | + </div> | ||
134 | + </div> | ||
135 | + | ||
136 | + {% block script_file %} | ||
137 | + | ||
138 | + {% endblock script_file %} | ||
139 | + | ||
140 | + {% block script_link %} | ||
141 | + | ||
142 | + {% endblock script_link %} | ||
143 | + <!-- Init material Bootstrap --> | ||
144 | + <script type="text/javascript">$.material.init()</script> | ||
143 | </body> | 145 | </body> |
144 | 146 | ||
145 | </html> | 147 | </html> |
courses/templates/category/create.html
@@ -10,38 +10,6 @@ | @@ -10,38 +10,6 @@ | ||
10 | </ol> | 10 | </ol> |
11 | {% endblock %} | 11 | {% endblock %} |
12 | 12 | ||
13 | -{% block sidebar %} | ||
14 | -{{block.super}} | ||
15 | - | ||
16 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
17 | - | ||
18 | - <div class="panel panel-primary navigation"> | ||
19 | - <div class="panel-heading"> | ||
20 | - <h3 class="panel-title">{% trans 'Actions' %}</h3> | ||
21 | - </div> | ||
22 | - <div class="panel-body"> | ||
23 | - <ul class="nav nav-pills nav-stacked"> | ||
24 | - <li><a href="{% url 'course:create' %}">{% trans 'Create Course' %}</a></li> | ||
25 | - </ul> | ||
26 | - </div> | ||
27 | - </div> | ||
28 | - | ||
29 | - | ||
30 | - <div class="panel panel-primary navigation"> | ||
31 | - <div class="panel-heading"> | ||
32 | - <h3 class="panel-title">{% trans 'Category' %}</h3> | ||
33 | - </div> | ||
34 | - <div class="panel-body"> | ||
35 | - <ul class="nav nav-pills nav-stacked"> | ||
36 | - <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category' %}</a></li> | ||
37 | - <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li> | ||
38 | - </ul> | ||
39 | - </div> | ||
40 | - </div> | ||
41 | -{% endif %} | ||
42 | - | ||
43 | -{% endblock %} | ||
44 | - | ||
45 | {% block content %} | 13 | {% block content %} |
46 | <div class="card card-content"> | 14 | <div class="card card-content"> |
47 | <div class="card-body"> | 15 | <div class="card-body"> |
courses/templates/category/index.html
@@ -11,36 +11,6 @@ | @@ -11,36 +11,6 @@ | ||
11 | </ol> | 11 | </ol> |
12 | {% endblock %} | 12 | {% endblock %} |
13 | 13 | ||
14 | -{% block sidebar %} | ||
15 | -{{block.super}} | ||
16 | - | ||
17 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
18 | - | ||
19 | - <div class="panel panel-primary navigation"> | ||
20 | - <div class="panel-heading"> | ||
21 | - <h3 class="panel-title">{% trans 'Actions' %}</h3> | ||
22 | - </div> | ||
23 | - <div class="panel-body"> | ||
24 | - <ul class="nav nav-pills nav-stacked"> | ||
25 | - <li><a href="{% url 'course:create' %}">{% trans 'Create Course' %}</a></li> | ||
26 | - </ul> | ||
27 | - </div> | ||
28 | - </div> | ||
29 | - | ||
30 | - <div class="panel panel-primary navigation"> | ||
31 | - <div class="panel-heading"> | ||
32 | - <h3 class="panel-title">{% trans 'Category' %}</h3> | ||
33 | - </div> | ||
34 | - <div class="panel-body"> | ||
35 | - <ul class="nav nav-pills nav-stacked"> | ||
36 | - <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category' %}</a></li> | ||
37 | - <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li> | ||
38 | - </ul> | ||
39 | - </div> | ||
40 | - </div> | ||
41 | -{% endif %} | ||
42 | -{% endblock %} | ||
43 | - | ||
44 | {% block content %} | 14 | {% block content %} |
45 | {% if messages %} | 15 | {% if messages %} |
46 | {% for message in messages %} | 16 | {% for message in messages %} |
@@ -104,4 +74,4 @@ | @@ -104,4 +74,4 @@ | ||
104 | </div> | 74 | </div> |
105 | <div class="row" id="modal_category"> | 75 | <div class="row" id="modal_category"> |
106 | <script src="{% static 'js/modal_category.js' %}"></script> | 76 | <script src="{% static 'js/modal_category.js' %}"></script> |
107 | -{% endblock %} | ||
108 | \ No newline at end of file | 77 | \ No newline at end of file |
78 | +{% endblock %} |
courses/templates/category/update.html
1 | -{% extends 'Home.html' %} | 1 | +{% extends 'home.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | {% load static i18n permission_tags %} | 4 | {% load static i18n permission_tags %} |
@@ -11,35 +11,6 @@ | @@ -11,35 +11,6 @@ | ||
11 | </ol> | 11 | </ol> |
12 | {% endblock %} | 12 | {% endblock %} |
13 | 13 | ||
14 | -{% block sidebar %} | ||
15 | -{{block.super}} | ||
16 | - | ||
17 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
18 | - | ||
19 | - <div class="panel panel-primary navigation"> | ||
20 | - <div class="panel-heading"> | ||
21 | - <h3 class="panel-title">{% trans 'Actions' %}</h3> | ||
22 | - </div> | ||
23 | - <div class="panel-body"> | ||
24 | - <ul class="nav nav-pills nav-stacked"> | ||
25 | - <li><a href="{% url 'course:create' %}">{% trans 'Create Course' %}</a></li> | ||
26 | - </ul> | ||
27 | - </div> | ||
28 | - </div> | ||
29 | - <div class="panel panel-primary navigation"> | ||
30 | - <div class="panel-heading"> | ||
31 | - <h3 class="panel-title">{% trans 'Category' %}</h3> | ||
32 | - </div> | ||
33 | - <div class="panel-body"> | ||
34 | - <ul class="nav nav-pills nav-stacked"> | ||
35 | - <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category' %}</a></li> | ||
36 | - <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li> | ||
37 | - </ul> | ||
38 | - </div> | ||
39 | - </div> | ||
40 | -{% endif %} | ||
41 | -{% endblock %} | ||
42 | - | ||
43 | {% block content %} | 14 | {% block content %} |
44 | {% if messages %} | 15 | {% if messages %} |
45 | {% for message in messages %} | 16 | {% for message in messages %} |
courses/templates/course/course_card.html
@@ -7,13 +7,13 @@ | @@ -7,13 +7,13 @@ | ||
7 | <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{course.slug}}" href=".collapseOne-{{course.slug}}" aria-expanded="false" aria-controls="collapseOne-{{course.slug}}"> | 7 | <div class="col-md-1 moreAccordion" data-toggle="collapse" data-parent="#accordion-{{course.slug}}" href=".collapseOne-{{course.slug}}" aria-expanded="false" aria-controls="collapseOne-{{course.slug}}"> |
8 | <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> | 8 | <button class="btn btn-default btn-sm caret-square"><i class="fa fa-caret-square-o-down fa-2x" aria-hidden="true"></i></button> |
9 | </div> | 9 | </div> |
10 | - <div class="col-xs-9 col-md-4 titleTopic"> | 10 | + <div class="col-xs-5 col-md-5 titleTopic"> |
11 | <a role="button" href="{% url 'course:view' course.slug %}"> | 11 | <a role="button" href="{% url 'course:view' course.slug %}"> |
12 | <h4>{{course.name}}</h4> | 12 | <h4>{{course.name}}</h4> |
13 | </a> | 13 | </a> |
14 | </div> | 14 | </div> |
15 | {% if user|has_role:'professor' or user|has_role:'system_admin' %} | 15 | {% if user|has_role:'professor' or user|has_role:'system_admin' %} |
16 | - <div class="col-xs-4 col-md-6 divMoreActions" > | 16 | + <div class="col-xs-6 col-md-6 divMoreActions" > |
17 | <div class="btn-group"> | 17 | <div class="btn-group"> |
18 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 18 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
19 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | 19 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> |
@@ -55,11 +55,11 @@ | @@ -55,11 +55,11 @@ | ||
55 | </div> | 55 | </div> |
56 | </div> | 56 | </div> |
57 | 57 | ||
58 | -<div class="modal fade" id="replicateCourse" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | 58 | +<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
59 | <div class="modal-dialog" role="document"> | 59 | <div class="modal-dialog" role="document"> |
60 | <div class="modal-content"> | 60 | <div class="modal-content"> |
61 | <div class="modal-header"> | 61 | <div class="modal-header"> |
62 | - <h4 class="modal-title" id="myModalLabel">{% trans 'Repicate Course' %}</h4> | 62 | + <h4 class="modal-title">{% trans 'Repicate Course' %}</h4> |
63 | </div> | 63 | </div> |
64 | <div class="modal-body"> | 64 | <div class="modal-body"> |
65 | <section> | 65 | <section> |
@@ -73,4 +73,4 @@ | @@ -73,4 +73,4 @@ | ||
73 | </div> | 73 | </div> |
74 | </div> | 74 | </div> |
75 | </div> | 75 | </div> |
76 | - <script type="text/javascript" src="{% static 'js/course.js' %}"></script> | ||
77 | \ No newline at end of file | 76 | \ No newline at end of file |
77 | + <script type="text/javascript" src="{% static 'js/course.js' %}"></script> |
courses/templates/course/create.html
@@ -43,7 +43,7 @@ | @@ -43,7 +43,7 @@ | ||
43 | </div> | 43 | </div> |
44 | {% endfor %} | 44 | {% endfor %} |
45 | <div class="row text-center"> | 45 | <div class="row text-center"> |
46 | - <input type="submit" value="{% trans 'Create' %}" class="btn btn-primary" /> | 46 | + <input type="submit" value="{% trans 'Create' %}" class="btn btn-primary btn-raised" /> |
47 | </div> | 47 | </div> |
48 | </form> | 48 | </form> |
49 | </div> | 49 | </div> |
courses/templates/course/delete.html
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | <!-- Modal Footer --> | 20 | <!-- Modal Footer --> |
21 | <div class="modal-footer"> | 21 | <div class="modal-footer"> |
22 | <!-- Don't remove that!!! --> | 22 | <!-- Don't remove that!!! --> |
23 | - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | 23 | + <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> |
24 | <button type="submit" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> | 24 | <button type="submit" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> |
25 | <script> | 25 | <script> |
26 | $("#delete_form").submit(function(event) { | 26 | $("#delete_form").submit(function(event) { |
courses/templates/course/home.html
@@ -1,23 +0,0 @@ | @@ -1,23 +0,0 @@ | ||
1 | -{% extends 'app/base.html' %} | ||
2 | - | ||
3 | -{% load static i18n %} | ||
4 | -{% load widget_tweaks %} | ||
5 | - | ||
6 | -{% block breadcrumbs %} | ||
7 | - <ol class="breadcrumb"> | ||
8 | - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
9 | - <li class="active">{% trans 'Home Course' %}</li> | ||
10 | - </ol> | ||
11 | -{% endblock %} | ||
12 | - | ||
13 | -{% block sidebar %} | ||
14 | - <div class="list-group"> | ||
15 | - <a href="{% url 'course:manage' %}" class="list-group-item"> | ||
16 | - {% trans 'Courses' %} | ||
17 | - </a> | ||
18 | - </div> | ||
19 | -{% endblock %} | ||
20 | - | ||
21 | -{% block content %} | ||
22 | - | ||
23 | -{% endblock %} |
courses/templates/course/index.html
@@ -10,47 +10,6 @@ | @@ -10,47 +10,6 @@ | ||
10 | 10 | ||
11 | {% endblock %} | 11 | {% endblock %} |
12 | 12 | ||
13 | -{% block sidebar %} | ||
14 | -{{block.super}} | ||
15 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
16 | - <div class="panel panel-primary"> | ||
17 | - <div class="panel-heading"> | ||
18 | - <h3 class="panel-title">{% trans 'Category' %}</h3> | ||
19 | - </div> | ||
20 | - <div class="panel-body"> | ||
21 | - <ul class="nav nav-pills nav-stacked"> | ||
22 | - <li><a href="{% url 'course:create_cat' %}">{% trans 'Create Category' %}</a></li> | ||
23 | - <li><a href="{% url 'course:manage_cat' %}">{% trans 'List Category' %}</a></li> | ||
24 | - </ul> | ||
25 | - </div> | ||
26 | - </div> | ||
27 | - {% endif %} | ||
28 | - <div class="panel-group" id="accordion"> | ||
29 | - <div class="panel panel-primary"> | ||
30 | - <div class="panel-heading"> | ||
31 | - <h4 class="panel-title"> | ||
32 | - <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> | ||
33 | - </span>{% trans 'Categorys' %}</a> | ||
34 | - </h4> | ||
35 | - </div> | ||
36 | - <div id="collapseOne" class="panel-collapse collapse in"> | ||
37 | - <div class="panel-body"> | ||
38 | - <table class="table"> | ||
39 | - {% for category in categorys_courses %} | ||
40 | - <tr> | ||
41 | - <td> | ||
42 | - <a href="?category={{category.name}}">{{category.name}}</a> | ||
43 | - </td> | ||
44 | - </tr> | ||
45 | - {% endfor %} | ||
46 | - </table> | ||
47 | - </div> | ||
48 | - </div> | ||
49 | - </div> | ||
50 | - </div> | ||
51 | - | ||
52 | -{% endblock %} | ||
53 | - | ||
54 | {% block content %} | 13 | {% block content %} |
55 | {% if messages %} | 14 | {% if messages %} |
56 | {% for message in messages %} | 15 | {% for message in messages %} |
@@ -64,7 +23,7 @@ | @@ -64,7 +23,7 @@ | ||
64 | {% endif %} | 23 | {% endif %} |
65 | 24 | ||
66 | <div class="col-md-12 cards-content"> | 25 | <div class="col-md-12 cards-content"> |
67 | - <form id="searchform" action="{% url 'course:manage' %}" method="get" accept-charset="utf-8"> | 26 | + <form id="searchform" method="get" accept-charset="utf-8"> |
68 | <div class="input-group"> | 27 | <div class="input-group"> |
69 | <div class="form-group is-empty"> | 28 | <div class="form-group is-empty"> |
70 | <input type="text" class="form-control" placeholder="Search Courses" name="q"></div> | 29 | <input type="text" class="form-control" placeholder="Search Courses" name="q"></div> |
@@ -92,10 +51,10 @@ | @@ -92,10 +51,10 @@ | ||
92 | </div> | 51 | </div> |
93 | </div> | 52 | </div> |
94 | <div id="{{category.slug}}" class="panel-collapse collapse"> | 53 | <div id="{{category.slug}}" class="panel-collapse collapse"> |
95 | - {% for course in category.course_category.all %} | ||
96 | - {% if user in course.students.all or user in course.professors.all or user|has_role:'system_admin' %} | 54 | + {% for course in category.course_category %} |
55 | + {# {% if user in course.students.all or user in course.professors.all or user|has_role:'system_admin' %}#} | ||
97 | {% include "course/course_card.html" %} | 56 | {% include "course/course_card.html" %} |
98 | - {% endif %} | 57 | + {# {% endif %}#} |
99 | {% endfor %} | 58 | {% endfor %} |
100 | </div> | 59 | </div> |
101 | </div> | 60 | </div> |
@@ -104,9 +63,6 @@ | @@ -104,9 +63,6 @@ | ||
104 | 63 | ||
105 | {% endfor %} | 64 | {% endfor %} |
106 | </div> | 65 | </div> |
107 | - {% if user|has_role:'professor' or user|has_role:'system_admin' %} | ||
108 | - <a href="{% url 'course:create' %}" class="btn btn-primary btn-fab float-button"><i class="fa fa-plus material-icons"></i></a> | ||
109 | - {% endif %} | ||
110 | <div class="col-md-12"> | 66 | <div class="col-md-12"> |
111 | <nav aria-label="Page navigation"> | 67 | <nav aria-label="Page navigation"> |
112 | <ul class="pagination"> | 68 | <ul class="pagination"> |
courses/templates/course/replicate.html
@@ -4,132 +4,139 @@ | @@ -4,132 +4,139 @@ | ||
4 | {% load widget_tweaks %} | 4 | {% load widget_tweaks %} |
5 | 5 | ||
6 | {% block breadcrumbs %} | 6 | {% block breadcrumbs %} |
7 | - <ol class="breadcrumb"> | ||
8 | - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
9 | - <li class="active">{% trans 'Replicate Course' %}</li> | ||
10 | - </ol> | 7 | +<ol class="breadcrumb"> |
8 | + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | ||
9 | + <li class="active">{% trans 'Replicate Course' %}</li> | ||
10 | +</ol> | ||
11 | {% endblock %} | 11 | {% endblock %} |
12 | 12 | ||
13 | {% block content %} | 13 | {% block content %} |
14 | <div class="card card-content"> | 14 | <div class="card card-content"> |
15 | - <div class="card-body"> | ||
16 | - <form method="post" action="" enctype="multipart/form-data">{% csrf_token %} | ||
17 | - <div class="form-group is-fileinput"> | ||
18 | - <label for="id_name">{% trans 'Name' %}</label> | ||
19 | - | ||
20 | - | ||
21 | - <input class="form-control" id="id_name" maxlength="100" name="name" type="text" required="" value="{{course.name}}"> | ||
22 | - | ||
23 | - <span class="help-block">{% trans 'Course name' %}</span> | ||
24 | - | ||
25 | - </div> | ||
26 | - | ||
27 | - <div class="form-group is-fileinput"> | ||
28 | - <label for="id_objectivies">{% trans 'Objectives' %}</label> | ||
29 | - | ||
30 | - <textarea class="form-control" cols="80" id="id_objectivies" name="objectivies" rows="5">{{course.objectivies}}</textarea> | ||
31 | - | ||
32 | - <span class="help-block">{% trans 'Course objective' %}</span> | ||
33 | - | ||
34 | - </div> | ||
35 | - | ||
36 | - <div class="form-group is-fileinput"> | ||
37 | - <label for="id_content">{% trans 'Content' %}</label> | ||
38 | - | ||
39 | - | ||
40 | - <textarea class="form-control" cols="80" id="id_content" name="content" rows="5">{{course.content}}</textarea> | ||
41 | - | ||
42 | - <span class="help-block">{% trans 'Course modules' %}</span> | ||
43 | - | ||
44 | - </div> | ||
45 | - | ||
46 | - <div class="form-group is-fileinput"> | ||
47 | - <label for="id_max_students">{% trans 'Number of studets maximum' %}</label> | ||
48 | - | ||
49 | - | ||
50 | - <input class="form-control" id="id_max_students" min="0" name="max_students" type="number" value="{{course.max_students}}"> | ||
51 | - | ||
52 | - <span class="help-block">{% trans 'Max number of students that a class can have' %}</span> | ||
53 | - | ||
54 | - </div> | ||
55 | - | ||
56 | - <div class="form-group is-fileinput"> | ||
57 | - <label for="id_init_register_date">{% trans 'Course registration start date' %}</label> | ||
58 | - | ||
59 | - | ||
60 | - <input type="text" class="form-control date-picker" name="init_register_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
61 | - | ||
62 | - <span class="help-block">{% trans 'Date that starts the registration period of the course (dd/mm/yyyy)' %}</span> | ||
63 | - | ||
64 | - </div> | ||
65 | - | ||
66 | - <div class="form-group is-fileinput"> | ||
67 | - <label for="id_end_register_date">{% trans 'Course registration end date' %}</label> | ||
68 | - | ||
69 | - | ||
70 | - <input type="text" class="form-control date-picker" name="end_register_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
71 | - | ||
72 | - <span class="help-block">{% trans 'Date that ends the registration period of the course (dd/mm/yyyy)' %}</span> | ||
73 | - | ||
74 | - </div> | ||
75 | - | ||
76 | - <div class="form-group is-fileinput"> | ||
77 | - <label for="id_init_date">{% trans 'Course start date' %}</label> | ||
78 | - | ||
79 | - | ||
80 | - <input type="text" class="form-control date-picker" name="init_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
81 | - | ||
82 | - <span class="help-block">{% trans 'Date that the course starts (dd/mm/yyyy)' %}</span> | ||
83 | - | ||
84 | - </div> | ||
85 | - | ||
86 | - <div class="form-group is-fileinput"> | ||
87 | - <label for="id_end_date">{% trans 'Course end date' %}</label> | ||
88 | - | ||
89 | - | ||
90 | - <input type="text" class="form-control date-picker" name="end_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
91 | - | ||
92 | - <span class="help-block">{% trans 'Date that the course ends (dd/mm/yyyy)' %}</span> | ||
93 | - | ||
94 | - </div> | ||
95 | - | ||
96 | - <div class="form-group is-fileinput"> | ||
97 | - <label for="id_image">{% trans 'Imagem' %}</label> | ||
98 | - | ||
99 | - | ||
100 | - <input class="form-control" id="id_image" name="image" type="file"> | ||
101 | - <div class="input-group"> | ||
102 | - <input type="text" readonly="" class="form-control" placeholder="Choose your photo..."> | ||
103 | - <span class="input-group-btn input-group-sm"> | ||
104 | - <button type="button" class="btn btn-fab btn-fab-mini"> | ||
105 | - <i class="material-icons">{% trans 'attach_file' %}</i> | ||
106 | - </button> | ||
107 | - </span> | ||
108 | - </div> | ||
109 | - | ||
110 | - <span class="help-block">{% trans 'Representative image of the course' %}</span> | ||
111 | - | ||
112 | - </div> | ||
113 | - | ||
114 | - <div class="form-group is-fileinput"> | ||
115 | - <label for="id_category">{% trans 'CourseCategory' %}</label> | ||
116 | - | ||
117 | - | ||
118 | - <select class="form-control" id="id_category" name="category" required=""> | ||
119 | - {% for category in categorys_courses %} | ||
120 | - <option value="{{category.id}}">{{category}}</option> | ||
121 | - {% endfor %} | ||
122 | - </select> | ||
123 | - | ||
124 | - <span class="help-block">{% trans 'CourseCategory which the course belongs' %}</span> | ||
125 | - | ||
126 | - </div> | ||
127 | - | ||
128 | - <div class="row text-center"> | ||
129 | - <input type="submit" value="Create" class="btn btn-primary"> | ||
130 | - </div> | ||
131 | - </form> | ||
132 | - </div> | 15 | + <div class="card-body"> |
16 | + <form method="post" action="" enctype="multipart/form-data"> | ||
17 | + {% csrf_token %} | ||
18 | + <div class="form-group is-fileinput"> | ||
19 | + <label for="id_name">{% trans 'Name' %}</label> | ||
20 | + | ||
21 | + | ||
22 | + <input class="form-control" id="id_name" maxlength="100" name="name" type="text" required="" value="{{course.name}}"> | ||
23 | + | ||
24 | + <span class="help-block">{% trans 'Course name' %}</span> | ||
25 | + | ||
26 | + </div> | ||
27 | + | ||
28 | + <div class="form-group is-fileinput"> | ||
29 | + <label for="id_objectivies">{% trans 'Objectives' %}</label> | ||
30 | + | ||
31 | + <textarea class="form-control" cols="80" id="id_objectivies" name="objectivies" rows="5">{{ course.objectivies }}</textarea> | ||
32 | + | ||
33 | + <span class="help-block">{% trans 'Course objective' %}</span> | ||
34 | + | ||
35 | + </div> | ||
36 | + | ||
37 | + <div class="form-group is-fileinput"> | ||
38 | + <label for="id_content">{% trans 'Content' %}</label> | ||
39 | + | ||
40 | + | ||
41 | + <textarea class="form-control" cols="80" id="id_content" name="content" rows="5">{{course.content}}</textarea> | ||
42 | + | ||
43 | + <span class="help-block">{% trans 'Course modules' %}</span> | ||
44 | + | ||
45 | + </div> | ||
46 | + | ||
47 | + <div class="form-group is-fileinput"> | ||
48 | + <label for="id_max_students">{% trans 'Number of studets maximum' %}</label> | ||
49 | + | ||
50 | + | ||
51 | + <input class="form-control" id="id_max_students" min="0" name="max_students" type="number" value="{{course.max_students}}"> | ||
52 | + | ||
53 | + <span class="help-block">{% trans 'Max number of students that a class can have' %}</span> | ||
54 | + | ||
55 | + </div> | ||
56 | + | ||
57 | + <div class="form-group is-fileinput"> | ||
58 | + <label for="id_init_register_date">{% trans 'Course registration start date' %}</label> | ||
59 | + | ||
60 | + | ||
61 | + <input type="text" class="form-control date-picker" name="init_register_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
62 | + | ||
63 | + <span class="help-block">{% trans 'Date that starts the registration period of the course (dd/mm/yyyy)' %}</span> | ||
64 | + | ||
65 | + </div> | ||
66 | + | ||
67 | + <div class="form-group is-fileinput"> | ||
68 | + <label for="id_end_register_date">{% trans 'Course registration end date' %}</label> | ||
69 | + | ||
70 | + | ||
71 | + <input type="text" class="form-control date-picker" name="end_register_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
72 | + | ||
73 | + <span class="help-block">{% trans 'Date that ends the registration period of the course (dd/mm/yyyy)' %}</span> | ||
74 | + | ||
75 | + </div> | ||
76 | + | ||
77 | + <div class="form-group is-fileinput"> | ||
78 | + <label for="id_init_date">{% trans 'Course start date' %}</label> | ||
79 | + | ||
80 | + | ||
81 | + <input type="text" class="form-control date-picker" name="init_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
82 | + | ||
83 | + <span class="help-block">{% trans 'Date that the course starts (dd/mm/yyyy)' %}</span> | ||
84 | + | ||
85 | + </div> | ||
86 | + | ||
87 | + <div class="form-group is-fileinput"> | ||
88 | + <label for="id_end_date">{% trans 'Course end date' %}</label> | ||
89 | + | ||
90 | + | ||
91 | + <input type="text" class="form-control date-picker" name="end_date" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | ||
92 | + | ||
93 | + <span class="help-block">{% trans 'Date that the course ends (dd/mm/yyyy)' %}</span> | ||
94 | + | ||
95 | + </div> | ||
96 | + | ||
97 | + <div class="form-group is-fileinput"> | ||
98 | + <label for="id_image">{% trans 'Imagem' %}</label> | ||
99 | + | ||
100 | + | ||
101 | + <input class="form-control" id="id_image" name="image" type="file"> | ||
102 | + <div class="input-group"> | ||
103 | + <input type="text" readonly="" class="form-control" placeholder="Choose your photo..."> | ||
104 | + <span class="input-group-btn input-group-sm"> | ||
105 | + <button type="button" class="btn btn-fab btn-fab-mini"> | ||
106 | + <i class="material-icons">{% trans 'attach_file' %}</i> | ||
107 | + </button> | ||
108 | + </span> | ||
109 | + </div> | ||
110 | + | ||
111 | + <span class="help-block">{% trans 'Representative image of the course' %}</span> | ||
112 | + | ||
113 | + </div> | ||
114 | + | ||
115 | + <div class="form-group is-fileinput"> | ||
116 | + <label for="id_category">{% trans 'CourseCategory' %}</label> | ||
117 | + | ||
118 | + | ||
119 | + <select class="form-control" id="id_category" name="category" required=""> | ||
120 | + {% for category in categorys_courses %} | ||
121 | + <option value="{{category.id}}">{{category}}</option> | ||
122 | + {% endfor %} | ||
123 | + </select> | ||
124 | + | ||
125 | + <span class="help-block">{% trans 'CourseCategory which the course belongs' %}</span> | ||
126 | + | ||
127 | + </div> | ||
128 | + | ||
129 | + <div class="row text-center"> | ||
130 | + <input type="submit" value="Create" class="btn btn-primary btn-raised"> | ||
131 | + </div> | ||
132 | + </form> | ||
133 | + </div> | ||
133 | </div> | 134 | </div> |
134 | -</br> | ||
135 | -{% endblock %} | ||
136 | \ No newline at end of file | 135 | \ No newline at end of file |
136 | + <script> | ||
137 | + $(document).ready(function() { | ||
138 | + $('#id_objectivies').summernote(); | ||
139 | + $('#id_content').summernote(); | ||
140 | + }); | ||
141 | + </script> | ||
142 | +</br></br></br> | ||
143 | +{% endblock %} |
courses/templates/course/update.html
@@ -41,7 +41,7 @@ | @@ -41,7 +41,7 @@ | ||
41 | </div> | 41 | </div> |
42 | {% endfor %} | 42 | {% endfor %} |
43 | <div class="row text-center"> | 43 | <div class="row text-center"> |
44 | - <input type="submit" value="{% trans 'Update' %}" class="btn btn-primary" /> | 44 | + <input type="submit" value="{% trans 'Update' %}" class="btn btn-primary btn-raised" /> |
45 | </div> | 45 | </div> |
46 | </form> | 46 | </form> |
47 | </div> | 47 | </div> |
@@ -56,4 +56,4 @@ | @@ -56,4 +56,4 @@ | ||
56 | language: locale, | 56 | language: locale, |
57 | }); | 57 | }); |
58 | </script> | 58 | </script> |
59 | -{% endblock %} | ||
60 | \ No newline at end of file | 59 | \ No newline at end of file |
60 | +{% endblock %} |
courses/templates/course/view.html
@@ -21,23 +21,6 @@ | @@ -21,23 +21,6 @@ | ||
21 | </ol> | 21 | </ol> |
22 | {% endblock %} | 22 | {% endblock %} |
23 | 23 | ||
24 | -{% block sidebar %} | ||
25 | -{{ block.super}} | ||
26 | - <div class="panel panel-primary"> | ||
27 | - <div class="panel-heading"> | ||
28 | - <h5>{% trans 'Categories' %}</h5> | ||
29 | - </div> | ||
30 | - <div class="panel-body"> | ||
31 | - <ul class="nav nav-pills nav-stacked"> | ||
32 | - <li {% if category is None %}class="active"{% endif %}><a href="{% url 'course:view' course.slug %}">{% trans 'All' %}</a></li> | ||
33 | - {% for cat in categorys_subjects %} | ||
34 | - <li {% if category == cat.slug %}class="active"{% endif %}><a href="{% url 'course:view_filter' course.slug cat.slug %}">{{ cat }}</a></li> | ||
35 | - {% endfor %} | ||
36 | - </ul> | ||
37 | - </div> | ||
38 | - </div> | ||
39 | -{% endblock %} | ||
40 | - | ||
41 | {% block content %} | 24 | {% block content %} |
42 | 25 | ||
43 | <div class="col-md-12 cards-content"> | 26 | <div class="col-md-12 cards-content"> |
@@ -94,8 +77,8 @@ | @@ -94,8 +77,8 @@ | ||
94 | <div> | 77 | <div> |
95 | </div> | 78 | </div> |
96 | <div class="modal-footer"> | 79 | <div class="modal-footer"> |
97 | - <button type="button" data-dismiss="modal" class="btn btn-default">{% trans "Cancel" %}</button> | ||
98 | - <a href="#" target="_self"><button type="button" class="btn btn-primary"> {% trans "Confirm" %}</button></a> | 80 | + <button type="button" data-dismiss="modal" class="btn btn-default btn-raised">{% trans "Cancel" %}</button> |
81 | + <a href="#" target="_self"><button type="button" class="btn btn-primary btn-raised"> {% trans "Confirm" %}</button></a> | ||
99 | </div> | 82 | </div> |
100 | </div> | 83 | </div> |
101 | </div> | 84 | </div> |
@@ -132,7 +115,7 @@ | @@ -132,7 +115,7 @@ | ||
132 | <li><a href="{% url 'course:update_subject' subject.slug %}"> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans "Edit" %}</a></li> | 115 | <li><a href="{% url 'course:update_subject' subject.slug %}"> <i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans "Edit" %}</a></li> |
133 | <li><a href="{% url 'course:delete_subject' subject.slug %}" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans "Remove" %}</a></li> | 116 | <li><a href="{% url 'course:delete_subject' subject.slug %}" ><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans "Remove" %}</a></li> |
134 | </ul> | 117 | </ul> |
135 | - | 118 | + |
136 | </div> | 119 | </div> |
137 | </div> | 120 | </div> |
138 | {% endif %} | 121 | {% endif %} |
@@ -0,0 +1,74 @@ | @@ -0,0 +1,74 @@ | ||
1 | +{% load widget_tweaks i18n %} | ||
2 | +<!--MODAL CREATE LINK--> | ||
3 | +<div class="modal fade" id="createLinksModal" tabindex="-1" role="dialog" aria-labelledby="createLink"> | ||
4 | + <div class="modal-dialog" role="document"> | ||
5 | + <div class="modal-content"> | ||
6 | + <div class="modal-header"> | ||
7 | + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | ||
8 | + <h4 class="modal-title" id="createLink">{% trans 'Create a New Exercise' %}</h4> | ||
9 | + </div> | ||
10 | + <div class="modal-body"> | ||
11 | + <!-- Card --> | ||
12 | + <form method="post" action="" id="form-link" enctype="multipart/form-data"> | ||
13 | + {% csrf_token %} | ||
14 | + {% for field in form %} | ||
15 | + <div class ="form-group"> | ||
16 | + {% if field.field.required %} | ||
17 | + <label for="{{ field.auto_id }}">{{ field.label }}<span>*</span></label> | ||
18 | + {% endif %} | ||
19 | + {% render_field field class='form-control input-sm' %} | ||
20 | + {% if field.errors %} | ||
21 | + <div class="alert alert-danger alert-dismissible clearfix" role="alert"> | ||
22 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
23 | + <span aria-hidden="true">×</span> | ||
24 | + </button> | ||
25 | + <ul> | ||
26 | + {% for error in field.errors %} | ||
27 | + <li>{{ error }}</li> | ||
28 | + {% endfor %} | ||
29 | + </ul> | ||
30 | + </div> | ||
31 | + {% endif %} | ||
32 | + </div> | ||
33 | + {% endfor %} | ||
34 | + <div class="form-group"> | ||
35 | + <button type="button" class="btn btn-raised btn-default " data-dismiss="modal">{% trans "Cancel" %}</button> | ||
36 | + <button class="btn btn-raised btn-primary" type="submit">{% trans 'Submit' %}</button> | ||
37 | + </div> | ||
38 | + <!-- .end Card --> | ||
39 | + </div> | ||
40 | + </div> | ||
41 | + </div> | ||
42 | +</div> | ||
43 | +<!-- EndModal --> | ||
44 | +{% block script_link %} | ||
45 | + {# // <script src="{% static 'js/links.js' %}"></script> #} | ||
46 | + <script type="text/javascript"> | ||
47 | + $("#form-link").submit(function(event) { | ||
48 | + $("#createLinksModal").modal("hide"); | ||
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 | + $('#requisicoes_ajax').empty(); | ||
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 | + $("div.modal-backdrop.fade.in").remove(); | ||
65 | + $('#requisicoes_ajax').empty(); | ||
66 | + $('#requisicoes_ajax').append(data.responseText); | ||
67 | + $('#createLinksModal').modal('show'); | ||
68 | + alertify.alert('Invalid link, insert a valid one!'); | ||
69 | + } | ||
70 | + }); | ||
71 | + event.preventDefault(); | ||
72 | + }); | ||
73 | + </script> | ||
74 | +{% endblock script_link %} | ||
0 | \ No newline at end of file | 75 | \ No newline at end of file |
courses/templates/subject/delete.html
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | <!-- Modal Footer --> | 20 | <!-- Modal Footer --> |
21 | <div class="modal-footer"> | 21 | <div class="modal-footer"> |
22 | <!-- Don't remove that!!! --> | 22 | <!-- Don't remove that!!! --> |
23 | - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | 23 | + <button type="button" class="btn btn-raised btn-default" data-dismiss="modal">{% trans "Close" %}</button> |
24 | <button type="submit" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> | 24 | <button type="submit" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> |
25 | <script> | 25 | <script> |
26 | $("#delete_form").submit(function(event) { | 26 | $("#delete_form").submit(function(event) { |
courses/templates/subject/form_view_student.html
@@ -42,6 +42,8 @@ | @@ -42,6 +42,8 @@ | ||
42 | {% if professor_links%} | 42 | {% if professor_links%} |
43 | {% include "links/create_link.html" %} | 43 | {% include "links/create_link.html" %} |
44 | {% include "links/delete_link.html" %} | 44 | {% include "links/delete_link.html" %} |
45 | + {% else %} | ||
46 | + {% include "exercise/create_exercise.html" %} | ||
45 | {% endif %} | 47 | {% endif %} |
46 | 48 | ||
47 | 49 |
courses/templates/subject/index.html
@@ -21,11 +21,6 @@ | @@ -21,11 +21,6 @@ | ||
21 | <li class="active">{{ subject }}</li> | 21 | <li class="active">{{ subject }}</li> |
22 | </ol> | 22 | </ol> |
23 | {% endblock %} | 23 | {% endblock %} |
24 | -{% block sidebar %} | ||
25 | -{{block.super}} | ||
26 | - | ||
27 | - | ||
28 | -{% endblock %} | ||
29 | 24 | ||
30 | {% block content %} | 25 | {% block content %} |
31 | <div class="panel panel-info"> | 26 | <div class="panel panel-info"> |
courses/templates/subject/replicate.html
@@ -19,7 +19,7 @@ | @@ -19,7 +19,7 @@ | ||
19 | <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label> | 19 | <label for="{{ field.auto_id }}" class="control-label label-static"> {{ field.label }}</label> |
20 | 20 | ||
21 | {% if field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%} | 21 | {% if field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%} |
22 | - <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DATE_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> | 22 | + <input type="text" class="form-control date-picker" name="{{field.name}}" value="{{field.value|date:'SHORT_DA E_FORMAT'}}" min="{{now|date:'SHORT_DATE_FORMAT'}}"> |
23 | {% else %} | 23 | {% else %} |
24 | {% render_field field class='form-control' placeholder=field.label%} | 24 | {% render_field field class='form-control' placeholder=field.label%} |
25 | {% endif %} | 25 | {% endif %} |
courses/templates/subject_category/index.html
@@ -11,10 +11,6 @@ | @@ -11,10 +11,6 @@ | ||
11 | </ol> | 11 | </ol> |
12 | {% endblock %} | 12 | {% endblock %} |
13 | 13 | ||
14 | -{% block sidebar %} | ||
15 | -{{block.super}} | ||
16 | -{% endblock %} | ||
17 | - | ||
18 | {% block content %} | 14 | {% block content %} |
19 | <div class="panel panel-info"> | 15 | <div class="panel panel-info"> |
20 | <div class="panel-heading"> | 16 | <div class="panel-heading"> |
courses/templates/topic/delete.html
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | <!-- Modal Footer --> | 20 | <!-- Modal Footer --> |
21 | <div class="modal-footer"> | 21 | <div class="modal-footer"> |
22 | <!-- Don't remove that!!! --> | 22 | <!-- Don't remove that!!! --> |
23 | - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | 23 | + <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> |
24 | <button type="submit" id="button" form="delete_topic_{{topic.slug}}" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> | 24 | <button type="submit" id="button" form="delete_topic_{{topic.slug}}" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> |
25 | <script> | 25 | <script> |
26 | $("#delete_topic_{{topic.slug}}").submit(function(event) { | 26 | $("#delete_topic_{{topic.slug}}").submit(function(event) { |
courses/templates/topic/index.html
@@ -26,10 +26,6 @@ | @@ -26,10 +26,6 @@ | ||
26 | </ol> | 26 | </ol> |
27 | {% endblock %} | 27 | {% endblock %} |
28 | 28 | ||
29 | -{% block sidebar %} | ||
30 | -{{block.super}} | ||
31 | -{% endblock %} | ||
32 | - | ||
33 | {% block content %} | 29 | {% block content %} |
34 | <div class="col-md-12 col-xs-12 col-sm-12"> | 30 | <div class="col-md-12 col-xs-12 col-sm-12"> |
35 | <div class="panel panel-info"> | 31 | <div class="panel panel-info"> |
courses/views.py
@@ -31,6 +31,33 @@ import time | @@ -31,6 +31,33 @@ import time | ||
31 | from rest_framework import viewsets, permissions | 31 | from rest_framework import viewsets, permissions |
32 | from .serializers import * | 32 | from .serializers import * |
33 | 33 | ||
34 | +class Category: | ||
35 | + name = None | ||
36 | + slug = None | ||
37 | + course_category = [] | ||
38 | + | ||
39 | +def course_category(list_courses): | ||
40 | + | ||
41 | + list_courses = list_courses.distinct().order_by('category','name') | ||
42 | + categorys_courses = [] | ||
43 | + cat_slug = None | ||
44 | + cat = None | ||
45 | + for course in list_courses: | ||
46 | + if (course.category.slug != cat_slug): | ||
47 | + if (cat != None): | ||
48 | + categorys_courses.append(cat) | ||
49 | + cat_slug = course.category.slug | ||
50 | + cat = Category() | ||
51 | + cat.name = course.category.name | ||
52 | + cat.slug = cat_slug | ||
53 | + cat.course_category = [] | ||
54 | + cat.course_category.append(course) | ||
55 | + | ||
56 | + if (cat): | ||
57 | + categorys_courses.append(cat) | ||
58 | + | ||
59 | + return categorys_courses | ||
60 | + | ||
34 | class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | 61 | class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): |
35 | 62 | ||
36 | login_url = reverse_lazy("core:home") | 63 | login_url = reverse_lazy("core:home") |
@@ -38,8 +65,6 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -38,8 +65,6 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
38 | queryset = Course.objects.all() | 65 | queryset = Course.objects.all() |
39 | template_name = 'course/index.html' | 66 | template_name = 'course/index.html' |
40 | context_object_name = 'courses' | 67 | context_object_name = 'courses' |
41 | - paginate_by = 10 | ||
42 | - aparece = True | ||
43 | 68 | ||
44 | 69 | ||
45 | def get_queryset(self): | 70 | def get_queryset(self): |
@@ -48,14 +73,12 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -48,14 +73,12 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
48 | course_search = self.request.GET.get('q', None) | 73 | course_search = self.request.GET.get('q', None) |
49 | category_search = self.request.GET.get('category', None) | 74 | category_search = self.request.GET.get('category', None) |
50 | if course_search: | 75 | if course_search: |
51 | - self.aparece = False | ||
52 | query_list = course_search.split() | 76 | query_list = course_search.split() |
53 | result = result.filter( | 77 | result = result.filter( |
54 | reduce(operator.and_, | 78 | reduce(operator.and_, |
55 | (Q(name__icontains=q) for q in query_list)) | 79 | (Q(name__icontains=q) for q in query_list)) |
56 | ) | 80 | ) |
57 | if category_search: | 81 | if category_search: |
58 | - self.aparece = False | ||
59 | query_list = category_search.split() | 82 | query_list = category_search.split() |
60 | result = result.filter( | 83 | result = result.filter( |
61 | reduce(operator.and_, | 84 | reduce(operator.and_, |
@@ -66,58 +89,40 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -66,58 +89,40 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
66 | def get_context_data(self, **kwargs): | 89 | def get_context_data(self, **kwargs): |
67 | context = super(IndexView, self).get_context_data(**kwargs) | 90 | context = super(IndexView, self).get_context_data(**kwargs) |
68 | list_courses = None | 91 | list_courses = None |
69 | - categorys_courses = None | ||
70 | - if has_role(self.request.user,'professor'): | ||
71 | - list_courses = Course.objects.filter(Q(professors = True)|Q(professors__name = self.request.user.name)).order_by('name') | ||
72 | - categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct() | ||
73 | - elif has_role(self.request.user,'system_admin'): | ||
74 | - list_courses = queryset.order_by('name') | ||
75 | - categorys_courses = CourseCategory.objects.all() | 92 | + if has_role(self.request.user,'system_admin'): |
93 | + list_courses = self.get_queryset().order_by('name') | ||
94 | + # categorys_courses = CourseCategory.objects.all() | ||
95 | + elif has_role(self.request.user,'professor'): | ||
96 | + list_courses = self.get_queryset().filter(professors__in = [self.request.user]) | ||
97 | + # categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct() | ||
76 | elif has_role(self.request.user, 'student'): | 98 | elif has_role(self.request.user, 'student'): |
77 | - list_courses = Course.objects.filter(Q(students = True)|Q(students__name = self.request.user.name)).order_by('name') | ||
78 | - categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() | ||
79 | - | ||
80 | - paginator = Paginator(list_courses, self.paginate_by) | ||
81 | - page = self.request.GET.get('page') | ||
82 | - | ||
83 | - try: | ||
84 | - list_courses = paginator.page(page) | ||
85 | - except PageNotAnInteger: | ||
86 | - list_courses = paginator.page(1) | ||
87 | - except EmptyPage: | ||
88 | - list_courses = paginator.page(paginator.num_pages) | ||
89 | - | ||
90 | - context['list_courses'] = list_courses | ||
91 | - context['categorys_courses'] = categorys_courses | ||
92 | - context['aparece'] = self.aparece | 99 | + list_courses = self.get_queryset().filter(students__in = [self.request.user]) |
93 | 100 | ||
101 | + context['categorys_courses'] = course_category(list_courses) | ||
94 | return context | 102 | return context |
95 | 103 | ||
96 | class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView): | 104 | class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView): |
97 | 105 | ||
98 | login_url = reverse_lazy("core:home") | 106 | login_url = reverse_lazy("core:home") |
99 | redirect_field_name = 'next' | 107 | redirect_field_name = 'next' |
100 | - queryset = Course.objects.all() | ||
101 | template_name = 'course/index.html' | 108 | template_name = 'course/index.html' |
102 | context_object_name = 'courses' | 109 | context_object_name = 'courses' |
103 | - paginate_by = 5 | ||
104 | - aparece = True | ||
105 | 110 | ||
106 | 111 | ||
107 | def get_queryset(self): | 112 | def get_queryset(self): |
108 | - result = super(AllCoursesView, self).get_queryset() | 113 | + result = Course.objects.all() |
109 | 114 | ||
110 | course_search = self.request.GET.get('q', None) | 115 | course_search = self.request.GET.get('q', None) |
111 | category_search = self.request.GET.get('category', None) | 116 | category_search = self.request.GET.get('category', None) |
112 | if course_search: | 117 | if course_search: |
113 | - self.aparece = False | 118 | + # self.aparece = False |
114 | query_list = course_search.split() | 119 | query_list = course_search.split() |
115 | result = result.filter( | 120 | result = result.filter( |
116 | reduce(operator.and_, | 121 | reduce(operator.and_, |
117 | (Q(name__icontains=q) for q in query_list)) | 122 | (Q(name__icontains=q) for q in query_list)) |
118 | ) | 123 | ) |
119 | if category_search: | 124 | if category_search: |
120 | - self.aparece = False | 125 | + # self.aparece = False |
121 | query_list = category_search.split() | 126 | query_list = category_search.split() |
122 | result = result.filter( | 127 | result = result.filter( |
123 | reduce(operator.and_, | 128 | reduce(operator.and_, |
@@ -127,25 +132,10 @@ class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -127,25 +132,10 @@ class AllCoursesView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
127 | 132 | ||
128 | def get_context_data(self, **kwargs): | 133 | def get_context_data(self, **kwargs): |
129 | context = super(AllCoursesView, self).get_context_data(**kwargs) | 134 | context = super(AllCoursesView, self).get_context_data(**kwargs) |
130 | - list_courses = None | ||
131 | - categorys_courses = None | ||
132 | - list_courses = Course.objects.all().order_by('name') | ||
133 | - #categorys_courses = CourseCategory.objects.all().distinct().order_by('name') | ||
134 | - categorys_courses = CourseCategory.objects.all() | ||
135 | - paginator = Paginator(list_courses, self.paginate_by) | ||
136 | - page = self.request.GET.get('page') | ||
137 | 135 | ||
138 | - try: | ||
139 | - list_courses = paginator.page(page) | ||
140 | - except PageNotAnInteger: | ||
141 | - list_courses = paginator.page(1) | ||
142 | - except EmptyPage: | ||
143 | - list_courses = paginator.page(paginator.num_pages) | ||
144 | - | ||
145 | - context['list_courses'] = list_courses | ||
146 | - context['categorys_courses'] = categorys_courses | ||
147 | - context['aparece'] = self.aparece | 136 | + list_courses = self.get_queryset() |
148 | 137 | ||
138 | + context['categorys_courses'] = course_category(list_courses) | ||
149 | return context | 139 | return context |
150 | 140 | ||
151 | class CreateCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView): | 141 | class CreateCourseView(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView): |
@@ -1029,4 +1019,3 @@ class TopicViewSet(viewsets.ModelViewSet): | @@ -1029,4 +1019,3 @@ class TopicViewSet(viewsets.ModelViewSet): | ||
1029 | queryset = Topic.objects.all() | 1019 | queryset = Topic.objects.all() |
1030 | serializer_class = TopicSerializer | 1020 | serializer_class = TopicSerializer |
1031 | permissions_class = (permissions.IsAuthenticatedOrReadOnly) | 1021 | permissions_class = (permissions.IsAuthenticatedOrReadOnly) |
1032 | - |
@@ -0,0 +1,183 @@ | @@ -0,0 +1,183 @@ | ||
1 | +from django.test import TestCase, Client | ||
2 | +from django.core.urlresolvers import reverse | ||
3 | +from django.core.files.uploadedfile import SimpleUploadedFile | ||
4 | +from rolepermissions.shortcuts import assign_role | ||
5 | +from django.utils.translation import ugettext_lazy as _ | ||
6 | +from core.models import MimeType | ||
7 | +from users.models import User | ||
8 | +from files.models import TopicFile | ||
9 | +from files.forms import FileForm, UpdateFileForm | ||
10 | +from courses.models import CourseCategory, Course, Subject, Topic | ||
11 | + | ||
12 | +class FileTestCase(TestCase): | ||
13 | + | ||
14 | + def setUp(self): | ||
15 | + self.client = Client() | ||
16 | + | ||
17 | + self.admin = User.objects.create_user( | ||
18 | + username = 'admin', | ||
19 | + email = 'testing@amadeus.com', | ||
20 | + is_staff = True, | ||
21 | + is_active = True, | ||
22 | + password = 'testing123' | ||
23 | + ) | ||
24 | + assign_role(self.admin, 'system_admin') | ||
25 | + | ||
26 | + self.teacher = User.objects.create_user( | ||
27 | + username = 'teacher', | ||
28 | + email = 'teacherg@school.com', | ||
29 | + is_staff = False, | ||
30 | + is_active = True, | ||
31 | + password = 'teaching123' | ||
32 | + ) | ||
33 | + assign_role(self.teacher, 'professor') | ||
34 | + | ||
35 | + self.student = User.objects.create_user( | ||
36 | + username = 'student', | ||
37 | + email = 'student@amadeus.com', | ||
38 | + is_staff = False, | ||
39 | + is_active = True, | ||
40 | + password = 'testing123', | ||
41 | + type_profile = 2 | ||
42 | + ) | ||
43 | + assign_role(self.student, 'student') | ||
44 | + | ||
45 | + self.category = CourseCategory( | ||
46 | + name = 'Categoria Teste', | ||
47 | + slug = 'categoria_teste' | ||
48 | + ) | ||
49 | + self.category.save() | ||
50 | + | ||
51 | + self.course = Course( | ||
52 | + name = 'Curso Teste', | ||
53 | + slug = 'curso_teste', | ||
54 | + max_students = 50, | ||
55 | + init_register_date = '2016-08-26', | ||
56 | + end_register_date = '2016-10-01', | ||
57 | + init_date = '2016-10-05', | ||
58 | + end_date = '2017-10-05', | ||
59 | + category = self.category, | ||
60 | + public = True, | ||
61 | + ) | ||
62 | + self.course.save() | ||
63 | + | ||
64 | + self.subject = Subject( | ||
65 | + name = 'Subject Test', | ||
66 | + description = "description of the subject test file", | ||
67 | + visible = True, | ||
68 | + init_date = '2016-10-05', | ||
69 | + end_date = '2017-10-05', | ||
70 | + course = self.course, | ||
71 | + ) | ||
72 | + self.subject.save() | ||
73 | + | ||
74 | + self.subject.professors.add(self.teacher) | ||
75 | + | ||
76 | + self.topic = Topic( | ||
77 | + name = 'Topic Test', | ||
78 | + description = "description of the topic test file", | ||
79 | + subject = self.subject, | ||
80 | + owner = self.teacher, | ||
81 | + ) | ||
82 | + self.topic.save() | ||
83 | + | ||
84 | + """ | ||
85 | + Manual upload file | ||
86 | + Change directory for a file in your computer and be happy... | ||
87 | + """ | ||
88 | + upload_file = open('/home/ailson/Pictures/teste.png', 'rb') | ||
89 | + self.file = SimpleUploadedFile(upload_file.name, upload_file.read()) | ||
90 | + | ||
91 | + def test_create_file_ok(self): | ||
92 | + self.client.login(username='admin', password = 'testing123') | ||
93 | + | ||
94 | + files = TopicFile.objects.all().count() | ||
95 | + self.assertEqual(TopicFile.objects.all().count(), files) #Macthing no file | ||
96 | + | ||
97 | + topic = Topic.objects.get(name = 'Topic Test') | ||
98 | + | ||
99 | + url = reverse('course:file:create_file', kwargs={'slug': topic.slug}) | ||
100 | + data = { | ||
101 | + 'name' : 'testFile', | ||
102 | + "file_url" : self.file | ||
103 | + } | ||
104 | + data['topic'] = topic | ||
105 | + | ||
106 | + # Get modal | ||
107 | + response = self.client.get(url) | ||
108 | + self.assertEqual(response.status_code, 200) | ||
109 | + | ||
110 | + # Create file | ||
111 | + response = self.client.post(url, data) | ||
112 | + file_created = TopicFile.objects.get(name = data['name']) | ||
113 | + self.assertEqual(TopicFile.objects.filter(name= file_created.name).exists(),True) | ||
114 | + self.assertEqual(TopicFile.objects.all().count(), files + 1) | ||
115 | + self.assertEqual(response.status_code, 302) | ||
116 | + self.assertTemplateUsed(template_name = 'files/create_file.html') | ||
117 | + | ||
118 | + def test_update_file_ok(self): | ||
119 | + self.client.login(username='admin', password = 'testing123') | ||
120 | + | ||
121 | + topic = Topic.objects.get(name = 'Topic Test') | ||
122 | + | ||
123 | + # File type | ||
124 | + mime_type = MimeType.objects.create( | ||
125 | + typ = 'image/png', | ||
126 | + icon = 'photo' | ||
127 | + ) | ||
128 | + self.file_update = TopicFile.objects.create( | ||
129 | + name = 'testinglink', | ||
130 | + file_url = self.file, | ||
131 | + file_type = mime_type, | ||
132 | + topic = topic | ||
133 | + ) | ||
134 | + | ||
135 | + url = reverse('course:file:update_file',kwargs={'slug': self.file_update.slug}) | ||
136 | + | ||
137 | + upload_file_update = open('/home/ailson/Pictures/update.png', 'rb') | ||
138 | + new_file = SimpleUploadedFile(upload_file_update.name, upload_file_update.read()) | ||
139 | + data = { | ||
140 | + 'name' : 'updated', | ||
141 | + 'file_url': new_file | ||
142 | + } | ||
143 | + | ||
144 | + # Get modal | ||
145 | + response = self.client.get(url) | ||
146 | + self.assertEqual(response.status_code, 200) | ||
147 | + | ||
148 | + response = self.client.post(url, data) | ||
149 | + self.assertEqual(TopicFile.objects.all()[0].name, 'updated') # new file name | ||
150 | + self.assertEqual(response.status_code, 302) | ||
151 | + self.assertTemplateUsed(template_name = 'files/update_file.html') | ||
152 | + | ||
153 | + def test_delete_file(self): | ||
154 | + self.client.login(username='admin', password = 'testing123') | ||
155 | + | ||
156 | + topic = Topic.objects.get(name = 'Topic Test') | ||
157 | + | ||
158 | + # File type | ||
159 | + mime_type = MimeType.objects.create( | ||
160 | + typ = 'image/png', | ||
161 | + icon = 'photo' | ||
162 | + ) | ||
163 | + self.file_delete = TopicFile.objects.create( | ||
164 | + name = 'testinglink', | ||
165 | + file_url = self.file, | ||
166 | + file_type = mime_type, | ||
167 | + topic = topic | ||
168 | + ) | ||
169 | + | ||
170 | + url = reverse('course:file:delete_file',kwargs={'slug': self.file_delete.slug}) | ||
171 | + | ||
172 | + # Get modal | ||
173 | + response = self.client.get(url) | ||
174 | + self.assertEqual(response.status_code, 200) | ||
175 | + | ||
176 | + response = self.client.post(url) | ||
177 | + self.assertEqual(TopicFile.objects.all().count(), 0) # new file name | ||
178 | + self.assertEqual(response.status_code, 302) | ||
179 | + self.assertTemplateUsed(template_name = 'files/delete_file.html') | ||
180 | + | ||
181 | + | ||
182 | + | ||
183 | + |
forum/templates/forum/forum_view.html
1 | -{% extends 'base.html' %} | 1 | +{% extends 'home.html' %} |
2 | 2 | ||
3 | {% load static i18n permission_tags list_post %} | 3 | {% load static i18n permission_tags list_post %} |
4 | {% load widget_tweaks %} | 4 | {% load widget_tweaks %} |
@@ -21,32 +21,19 @@ | @@ -21,32 +21,19 @@ | ||
21 | </ol> | 21 | </ol> |
22 | {% endblock %} | 22 | {% endblock %} |
23 | 23 | ||
24 | -{% block sidebar %} | ||
25 | - <div class="panel panel-primary navigation"> | ||
26 | - <div class="panel-heading"> | ||
27 | - <h5>{% trans 'Menu' %}</h5> | ||
28 | - </div> | ||
29 | - <div class="panel-body"> | ||
30 | - <ul class="nav nav-pills nav-stacked"> | ||
31 | - <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
32 | - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
33 | - </ul> | ||
34 | - </div> | ||
35 | - </div> | ||
36 | 24 | ||
37 | - {% if request.user|has_role:'system_admin' or request.user|has_role:'professor' and request.user in forum.topic.subject.professors.all %} | ||
38 | - <div class="panel panel-primary navigation"> | ||
39 | - <div class="panel-heading"> | ||
40 | - <h3 class="panel-title">{% trans 'Actions' %}</h3> | ||
41 | - </div> | ||
42 | - <div class="panel-body"> | ||
43 | - <ul class="nav nav-pills nav-stacked"> | ||
44 | - <li><a href="javascript:editForum('{% url 'course:forum:update' forum.id %}', '{{ forum.id }}', '{% trans 'Forum edited successfully!' %}')">{% trans 'Edit' %}</a></li> | ||
45 | - <li><a href="javascript:delete_forum('{% url 'course:forum:delete' forum.id %}', '{{ forum.id }}', '{% trans "Are you sure you want to delete this forum?" %}', '{% url 'course:view_subject' forum.topic.subject.slug %}')">{% trans 'Delete' %}</a></li> | ||
46 | - </ul> | ||
47 | - </div> | 25 | +{% block menu %} |
26 | + {% if user|has_role:'system_admin' or user|has_role:'professor'%} | ||
27 | + <li> | ||
28 | + <a href="#menu_forum" class="accordion" data-toggle="collapse">{% trans 'Forum' %}<span class="pull-right glyphicon glyphicon-chevron-down"></span></a> | ||
29 | + <div id="menu_forum" class="collapse"> | ||
30 | + <ul class="nav nav-pill nav-stacked accordion_list"> | ||
31 | + <li><a href="javascript:editForum('{% url 'course:forum:update' forum.id %}', '{{ forum.id }}', '{% trans 'Forum edited successfully!' %}')">{% trans 'Edit' %}</a></li> | ||
32 | + <li><a href="javascript:delete_forum('{% url 'course:forum:delete' forum.id %}', '{{ forum.id }}', '{% trans "Are you sure you want to delete this forum?" %}', '{% url 'course:view_subject' forum.topic.subject.slug %}')">{% trans 'Delete' %}</a></li> | ||
33 | + </ul> | ||
48 | </div> | 34 | </div> |
49 | - {% endif %} | 35 | + </li> |
36 | + {% endif %} | ||
50 | {% endblock %} | 37 | {% endblock %} |
51 | 38 | ||
52 | {% block content %} | 39 | {% block content %} |
@@ -130,4 +117,3 @@ | @@ -130,4 +117,3 @@ | ||
130 | </div> | 117 | </div> |
131 | </div> | 118 | </div> |
132 | {% endblock %} | 119 | {% endblock %} |
133 | - |
poll/templates/poll/create.html
@@ -144,7 +144,7 @@ | @@ -144,7 +144,7 @@ | ||
144 | <div class="modal-footer"> | 144 | <div class="modal-footer"> |
145 | 145 | ||
146 | <!-- Don't remove that!!! --> | 146 | <!-- Don't remove that!!! --> |
147 | - <button type="button" class="btn btn-danger btn-raised" data-dismiss="modal">{% trans "Close" %}</button> | 147 | + <button type="button" class="btn btn-default btn-raised" data-dismiss="modal">{% trans "Close" %}</button> |
148 | {% block button_save %} | 148 | {% block button_save %} |
149 | <!-- Put curtom buttons here!!! --> | 149 | <!-- Put curtom buttons here!!! --> |
150 | <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Create" %}</button> | 150 | <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Create" %}</button> |
users/templates/list_users.html
@@ -9,23 +9,11 @@ | @@ -9,23 +9,11 @@ | ||
9 | 9 | ||
10 | {% endblock %} | 10 | {% endblock %} |
11 | 11 | ||
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> | ||
25 | - </div> | ||
26 | - {% endblock %} | ||
27 | -{% endif %} | ||
28 | - | 12 | +{% block menu %} |
13 | + {% if user|has_role:'system_admin' %} | ||
14 | + <li> <a href="{% url 'users:create' %}">{% trans 'Add User' %}</a></li> | ||
15 | + {% endif %} | ||
16 | +{% endblock %} | ||
29 | 17 | ||
30 | {% block content %} | 18 | {% block content %} |
31 | {% if messages %} | 19 | {% if messages %} |
@@ -73,7 +61,7 @@ | @@ -73,7 +61,7 @@ | ||
73 | <p>{% trans 'Contact' %}: {{ acc.phone }}</p> | 61 | <p>{% trans 'Contact' %}: {{ acc.phone }}</p> |
74 | <div align="right"> | 62 | <div align="right"> |
75 | <a href="{% url 'users:update' acc.username %}" class="btn btn-raised btn-success">{% trans 'Edit' %}</a> | 63 | <a href="{% url 'users:update' acc.username %}" class="btn btn-raised btn-success">{% trans 'Edit' %}</a> |
76 | - <a href="javascript:void(0)" class="btn btn-danger btn-raised btn-lg" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}">{% trans 'Delete' %}</a> | 64 | + <a href="javascript:void(0)" class="btn btn-default btn-raised btn-lg" data-toggle="modal" data-target="#DeleteModal{{ forloop.counter }}">{% trans 'Delete' %}</a> |
77 | </div> | 65 | </div> |
78 | </div> | 66 | </div> |
79 | 67 | ||
@@ -90,7 +78,7 @@ | @@ -90,7 +78,7 @@ | ||
90 | {% trans 'Are you sure you want to delete the user' %} <b>{{acc.name}}</b>? | 78 | {% trans 'Are you sure you want to delete the user' %} <b>{{acc.name}}</b>? |
91 | </div> | 79 | </div> |
92 | <div class="modal-footer"> | 80 | <div class="modal-footer"> |
93 | - <a href="#" class="btn btn-raised btn-danger" data-dismiss="modal">{% trans 'Cancel' %}</a> | 81 | + <a href="#" class="btn btn-raised btn-default" data-dismiss="modal">{% trans 'Cancel' %}</a> |
94 | <a href="{% url 'users:delete' acc.username %}" class="btn btn-raised btn-success" style="margin-top: 0">{% trans 'Delete' %}</a> | 82 | <a href="{% url 'users:delete' acc.username %}" class="btn btn-raised btn-success" style="margin-top: 0">{% trans 'Delete' %}</a> |
95 | </div> | 83 | </div> |
96 | </div> | 84 | </div> |
@@ -108,4 +96,3 @@ | @@ -108,4 +96,3 @@ | ||
108 | </div> | 96 | </div> |
109 | {% endif %} | 97 | {% endif %} |
110 | {% endblock %} | 98 | {% endblock %} |
111 | - |
users/templates/users/change_password.html
@@ -44,7 +44,7 @@ | @@ -44,7 +44,7 @@ | ||
44 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-block btn-success" /> | 44 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-block btn-success" /> |
45 | </div> | 45 | </div> |
46 | <div class="col-md-3 col-sm-2 col-xs-2"> | 46 | <div class="col-md-3 col-sm-2 col-xs-2"> |
47 | - <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-danger" >{% trans 'Cancel' %}</a> | 47 | + <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-default" >{% trans 'Cancel' %}</a> |
48 | </div> | 48 | </div> |
49 | </div> | 49 | </div> |
50 | </form> | 50 | </form> |
users/templates/users/edit_profile.html
@@ -99,7 +99,7 @@ | @@ -99,7 +99,7 @@ | ||
99 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" /> | 99 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" /> |
100 | </div> | 100 | </div> |
101 | <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2"> | 101 | <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2"> |
102 | - <a href="{% url 'users:profile' %}" class="btn btn-raised btn-danger" >{% trans 'Cancel' %}</a> | 102 | + <a href="{% url 'users:profile' %}" class="btn btn-raised btn-default" >{% trans 'Cancel' %}</a> |
103 | </div> | 103 | </div> |
104 | </form> | 104 | </form> |
105 | </div> | 105 | </div> |
users/templates/users/index.html
1 | -{% extends 'app/base.html' %} | 1 | +{% extends 'home.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | 4 | ||
@@ -9,18 +9,8 @@ | @@ -9,18 +9,8 @@ | ||
9 | </ol> | 9 | </ol> |
10 | {% endblock %} | 10 | {% endblock %} |
11 | 11 | ||
12 | -{% block sidebar %} | ||
13 | - <div class="list-group"> | ||
14 | - <a href="{% url 'users:manage' %}" class="list-group-item active"> | ||
15 | - {% trans 'System Users' %} | ||
16 | - </a> | ||
17 | - <a href="{% url 'users:create' %}" class="list-group-item"> | ||
18 | - {% trans 'New Account' %} | ||
19 | - </a> | ||
20 | - <a href="#" class="list-group-item"> | ||
21 | - {% trans 'Send Mail' %} | ||
22 | - </a> | ||
23 | - </div> | 12 | +{% block menu %} |
13 | + <li> <a href="{% url 'users:create' %}">{% trans 'Add User' %}</a></li> | ||
24 | {% endblock %} | 14 | {% endblock %} |
25 | 15 | ||
26 | {% block content %} | 16 | {% block content %} |
users/templates/users/profile.html
1 | -{% extends 'home_student.html' %} | 1 | +{% extends 'home.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | {% load widget_tweaks %} | 4 | {% load widget_tweaks %} |
5 | -{% load django_bootstrap_breadcrumbs %} | 5 | +{% load django_bootstrap_breadcrumbs permission_tags%} |
6 | 6 | ||
7 | {% block breadcrumbs %} | 7 | {% block breadcrumbs %} |
8 | 8 | ||
@@ -11,21 +11,10 @@ | @@ -11,21 +11,10 @@ | ||
11 | 11 | ||
12 | {% endblock %} | 12 | {% endblock %} |
13 | 13 | ||
14 | -{% block sidebar %} | ||
15 | - <div class="panel panel-primary navigation"> | ||
16 | - <div class="panel-heading"> | ||
17 | - <h4>{% trans "Menu" %}</h4> | ||
18 | - </div> | ||
19 | - <div class="panel-body"> | ||
20 | - <ul class="nav nav-pills nav-stacked"> | ||
21 | - <li><a href="{% url 'app:index' %}">{% trans 'Home page' %}</a></li> | ||
22 | - <li><a href="{% url 'users:profile' %}">{% trans 'View Profile' %}</a></li> | ||
23 | - <li><a href="{% url 'users:update_profile' %}">{% trans 'Edit Profile' %}</a></li> | ||
24 | - <li><a href="{% url 'users:change_password' %}">{% trans 'Change Password' %}</a></li> | ||
25 | - <li><a href="{% url 'users:remove_account' %}">{% trans 'Remove account' %}</a></li> | ||
26 | - </ul> | ||
27 | - </div> | ||
28 | - </div> | 14 | +{% block menu %} |
15 | + {% if user|has_role:'system_admin' %} | ||
16 | + <li> <a href="{% url 'users:create' %}">{% trans 'Add User' %}</a></li> | ||
17 | + {% endif %} | ||
29 | {% endblock %} | 18 | {% endblock %} |
30 | 19 | ||
31 | {% block content %} | 20 | {% block content %} |
users/templates/users/remove_account.html
@@ -32,7 +32,7 @@ | @@ -32,7 +32,7 @@ | ||
32 | <a href="{% url 'users:remove' user.username %}" class="btn btn-raised btn-block btn-success" >{% trans 'Remove' %}</a> | 32 | <a href="{% url 'users:remove' user.username %}" class="btn btn-raised btn-block btn-success" >{% trans 'Remove' %}</a> |
33 | </div> | 33 | </div> |
34 | <div class="col-md-3 col-sm-2 col-xs-2"> | 34 | <div class="col-md-3 col-sm-2 col-xs-2"> |
35 | - <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-danger" >{% trans 'Cancel' %}</a> | 35 | + <a href="{% url 'users:profile' %}" class="btn btn-raised btn-block btn-default" >{% trans 'Cancel' %}</a> |
36 | </div> | 36 | </div> |
37 | </div> | 37 | </div> |
38 | </div> | 38 | </div> |
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 | - | 9 | + |
10 | {{ block.super }} | 10 | {{ block.super }} |
11 | {% breadcrumb 'Update User' 'users:update' %} | 11 | {% breadcrumb 'Update User' 'users:update' %} |
12 | - | 12 | + |
13 | {% endblock %} | 13 | {% endblock %} |
14 | 14 | ||
15 | 15 | ||
@@ -80,7 +80,7 @@ | @@ -80,7 +80,7 @@ | ||
80 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" /> | 80 | <input type="submit" value="{% trans 'Save' %}" class="btn btn-raised btn-success" /> |
81 | </div> | 81 | </div> |
82 | <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2"> | 82 | <div class="col-md-offset-3 col-md-2 col-sm-2 col-xs-2"> |
83 | - <a href="{% url 'users:manage' %}" class="btn btn-raised btn-danger" >{% trans 'Cancel' %}</a> | 83 | + <a href="{% url 'users:manage' %}" class="btn btn-raised btn-default" >{% trans 'Cancel' %}</a> |
84 | </div> | 84 | </div> |
85 | </form> | 85 | </form> |
86 | </div> | 86 | </div> |
users/templates/users/view.html
1 | -{% extends 'app/base.html' %} | 1 | +{% extends 'users/profile.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | 4 | ||
@@ -9,26 +9,6 @@ | @@ -9,26 +9,6 @@ | ||
9 | </ol> | 9 | </ol> |
10 | {% endblock %} | 10 | {% endblock %} |
11 | 11 | ||
12 | -{% block sidebar %} | ||
13 | - <div class="list-group"> | ||
14 | - <a href="{% url 'users:manage' %}" class="list-group-item"> | ||
15 | - {% trans 'System Users' %} | ||
16 | - </a> | ||
17 | - <a href="{% url 'users:create' %}" class="list-group-item"> | ||
18 | - {% trans 'New Account' %} | ||
19 | - </a> | ||
20 | - <a href="{% url 'users:view' acc.username %}" class="list-group-item active"> | ||
21 | - {% trans 'View User Account' %} | ||
22 | - </a> | ||
23 | - <a href="{% url 'users:update' acc.username %}" class="list-group-item"> | ||
24 | - {% trans 'Edit User Account' %} | ||
25 | - </a> | ||
26 | - <a href="#" class="list-group-item"> | ||
27 | - {% trans 'Send Mail' %} | ||
28 | - </a> | ||
29 | - </div> | ||
30 | -{% endblock %} | ||
31 | - | ||
32 | {% block content %} | 12 | {% block content %} |
33 | <div class="row"> | 13 | <div class="row"> |
34 | <div class="col-sm-3"> | 14 | <div class="col-sm-3"> |