Commit a8f59598d7733762fc7db654837a89810951c2db
Exists in
master
and in
5 other branches
Merge ...
Showing
23 changed files
with
512 additions
and
240 deletions
Show diff stats
amadeus/settings.py
app/templates/home.html
... | ... | @@ -31,11 +31,11 @@ |
31 | 31 | // Configure the url we're about to hit |
32 | 32 | setTimeout(function (){ |
33 | 33 | $.ajax({ |
34 | - url: baseUrl, | |
34 | + url: baseUrl, | |
35 | 35 | data: {'page': pageNum}, |
36 | 36 | success: function(data) { |
37 | 37 | $("#loading").hide(); |
38 | - | |
38 | + | |
39 | 39 | $("#timeline").append(data); |
40 | 40 | }, |
41 | 41 | complete: function(data, textStatus){ |
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 | }, 1000) |
47 | 47 | }; |
48 | 48 | |
49 | - $(document).ready(function(){ | |
49 | + $(document).ready(function(){ | |
50 | 50 | $(window).bind('scroll', loadOnScroll); |
51 | 51 | }); |
52 | 52 | </script> |
... | ... | @@ -62,70 +62,48 @@ |
62 | 62 | {% endblock %} |
63 | 63 | |
64 | 64 | {% block sidebar %} |
65 | - <div class="panel panel-primary"> | |
65 | + <div class="panel panel-primary navigation"> | |
66 | 66 | <div class="panel-heading"> |
67 | - <img src="{{ user.image_url }}" id="img" class="img-rounded"> | |
68 | - <p></p> | |
69 | - <div class="row"> | |
70 | - <div class="col-xs-3 col-md-3"> | |
71 | - <i class="fa fa-facebook-official fa-2x" aria-hidden="true"></i> | |
72 | - </div> | |
73 | - <div class="col-xs-3 col-md-3"> | |
74 | - <i class="fa fa-twitter fa-2x" aria-hidden="true"></i> | |
75 | - </div> | |
76 | - <div class="col-xs-3 col-md-3"> | |
77 | - <i class="fa fa-linkedin-square fa-2x" aria-hidden="true"></i> | |
78 | - </div> | |
79 | - <div class="col-xs-3 col-md-3"> | |
80 | - <i class="fa fa-google-plus-official fa-2x" aria-hidden="true"></i> | |
81 | - </div> | |
82 | - </div> | |
83 | - </div> | |
84 | - <div class="panel-body"> | |
85 | - <ul class="nav nav-pills nav-stacked"> | |
86 | - <li> <a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | |
87 | - <li> <a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | |
88 | - <li> <a href="#">{% trans 'Pending Tasks' %}</a></li> | |
89 | - {% if user|has_role:'student' and not user.is_staff %} | |
90 | - <li> <a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> | |
91 | - {% endif %} | |
92 | - {% if user|has_role:'system_admin' %} | |
93 | - <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> | |
94 | - {% endif %} | |
95 | - {% if user|has_role:'system_admin' or user|has_role:'professor' %} | |
96 | - <li> | |
97 | - <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a> | |
98 | - | |
99 | - <div id="courses_list" class="collapse"> | |
100 | - <ul class="nav nav-pill nav-stacked accordion_list"> | |
101 | - {% for course in courses_list %} | |
102 | - <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li> | |
103 | - {% endfor %} | |
104 | - </ul> | |
105 | - </div> | |
106 | - </li> | |
107 | - {% endif %} | |
108 | - </ul> | |
109 | - </div> | |
110 | - </div> | |
67 | + <h4>Menu</h4> | |
68 | + </div> | |
69 | + <div class="panel-body"> | |
70 | + <ul class="nav nav-pills nav-stacked"> | |
71 | + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | |
72 | + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | |
73 | + {% if user|has_role:'student' or not user.is_staff %} | |
74 | + <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> | |
75 | + {% endif %} | |
76 | + {% if user|has_role:'system_admin' %} | |
77 | + <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> | |
78 | + {% endif %} | |
79 | + {% if user|has_role:'system_admin' or user|has_role:'professor' %} | |
80 | + <li> | |
81 | + <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a> | |
82 | + <div id="courses_list" class="collapse"> | |
83 | + <ul class="nav nav-pill nav-stacked accordion_list"> | |
84 | + {% for course in courses_list %} | |
85 | + <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li> | |
86 | + {% endfor %} | |
87 | + </ul> | |
88 | + </div> | |
89 | + </li> | |
90 | + {% endif %} | |
91 | + </ul> | |
92 | + </div> | |
93 | + </div> | |
111 | 94 | {% endblock %} |
112 | 95 | |
113 | 96 | {% block content %} |
114 | 97 | {% if user|has_role:'system_admin' %} |
115 | - <h3>{% trans 'Courses' %}</h3> | |
116 | - | |
117 | - <div id="timeline"> | |
118 | - {% include page_template %} | |
119 | - </div> | |
120 | - | |
98 | + <h3>{% trans 'Courses' %}</h3> | |
99 | + <div id="timeline"> | |
100 | + {% include page_template %} | |
101 | + </div> | |
121 | 102 | {% else %} |
122 | - | |
123 | - <div id="timeline"> | |
124 | - {% include page_template %} | |
125 | - </div> | |
126 | - | |
103 | + <div id="timeline"> | |
104 | + {% include page_template %} | |
105 | + </div> | |
127 | 106 | {% endif %} |
128 | - | |
129 | 107 | <div id="loading" class="alert alert-primary" role="alert" style="display: none"> |
130 | 108 | <center> |
131 | 109 | <span class="fa fa-spin fa-circle-o-notch"></span> | ... | ... |
app/templates/home_student.html
core/templates/base.html
... | ... | @@ -47,77 +47,60 @@ |
47 | 47 | {% endblock %} |
48 | 48 | </head> |
49 | 49 | <body> |
50 | + {% block nav %} | |
51 | + <div class="navbar navbar-default"> | |
52 | + <div class="navbar-header"> | |
53 | + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse"> | |
54 | + <span class="icon-bar"></span> | |
55 | + <span class="icon-bar"></span> | |
56 | + <span class="icon-bar"></span> | |
57 | + </button> | |
58 | + <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a> | |
59 | + </div> | |
60 | + <div class="navbar-collapse collapse navbar-responsive-collapse"> | |
61 | + <ul class="nav navbar-nav navbar-right notifications"> | |
62 | + <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> | |
63 | + <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> | |
64 | + <ul id="notification-dropdown" class="dropdown-menu"> | |
65 | + <li class="dropdown-header">Notifications</li> | |
66 | + {% include "notifications.html" %} | |
67 | + | |
68 | + <li> | |
69 | + <a onclick="getNotifications(5)"> | |
70 | + <div id="notification-see-more" class="list-group-item"> | |
71 | + <div class="row-content"> | |
72 | + <p class="list-group-item-text">See More</p> | |
73 | + </div> | |
74 | + </a> | |
75 | + </li> | |
76 | + </ul> | |
77 | + </li> | |
78 | + | |
79 | + <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> | |
80 | + <li > <a class="link" href="{% url 'users:profile' %}">{{ user }}</a></li> | |
81 | + <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> | |
82 | + </ul> | |
83 | + </div> | |
84 | + </div> | |
85 | + {% endblock %} | |
50 | 86 | <div class="container-fluid"> |
51 | - {% block nav %} | |
52 | - <div class="row"> | |
53 | - <div class="navbar navbar-default"> | |
54 | - <div class="navbar-header"> | |
55 | - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-responsive-collapse"> | |
56 | - <span class="icon-bar"></span> | |
57 | - <span class="icon-bar"></span> | |
58 | - <span class="icon-bar"></span> | |
59 | - </button> | |
60 | - <a class="navbar-brand" href="{% url 'app:index' %}"><img class="logo" src="{% static 'img/topo-amadeus-white.png' %}" alt="Logo"/></a> | |
61 | - </div> | |
62 | - <div class="navbar-collapse collapse navbar-responsive-collapse"> | |
63 | - <ul class="nav navbar-nav navbar-right notifications"> | |
64 | - <li class="" data-toggle="tooltip" data-placement="bottom" title data-original-title="notifications"> | |
65 | - <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> | |
66 | - <ul id="notification-dropdown" class="dropdown-menu"> | |
67 | - <li class="dropdown-header">Notifications</li> | |
68 | - {% include "notifications.html" %} | |
69 | - | |
70 | - <li> | |
71 | - <a onclick="getNotifications(5)"> | |
72 | - <div id="notification-see-more" class="list-group-item"> | |
73 | - <div class="row-content"> | |
74 | - <p class="list-group-item-text">See More</p> | |
75 | - </div> | |
76 | - </a> | |
77 | - </li> | |
78 | - </ul> | |
79 | - </li> | |
80 | - | |
81 | - <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> | |
82 | - <li > <a class="link" href="{% url 'users:profile' %}">{{ user }}</a></li> | |
83 | - <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> | |
84 | - </ul> | |
85 | - </div> | |
86 | - </div> | |
87 | - </div> | |
88 | - {% endblock %} | |
89 | - | |
90 | 87 | <div class="row"> |
91 | - <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2"> | |
92 | - {% block sidebar %} | |
93 | - | |
94 | - {% endblock %} | |
95 | - </div> | |
96 | - | |
97 | - <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | |
98 | - {% block breadcrumbs %} | |
99 | - | |
100 | - {% endblock %} | |
101 | - | |
102 | - {% block render_breadcrumbs %} | |
103 | - | |
104 | - {% endblock %} | |
105 | - <div class="row"> | |
106 | - <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 col-xl-12"> | |
107 | - {% block content %} | |
108 | - | |
109 | - {% endblock %} | |
110 | - </div> | |
111 | - | |
112 | - | |
113 | - </div> | |
114 | - </div> | |
88 | + <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2 col-xl-2"> | |
89 | + {% block sidebar %}{% endblock %} | |
90 | + </div> | |
91 | + <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | |
92 | + {% block breadcrumbs %}{% endblock %} | |
93 | + {% block render_breadcrumbs %}{% endblock %} | |
94 | + </div> | |
95 | + <div class="col-xs-10 col-sm-10 col-md-10 col-lg-10 col-xl-10"> | |
96 | + {% block content %}{% endblock %} | |
97 | + </div> | |
115 | 98 | </div> |
116 | 99 | </div> |
117 | 100 | <script src="{% static 'js/main.js' %}"></script> |
118 | 101 | <script type="text/javascript" src="{% static 'js/topic_editation_presentation.js' %}"></script> |
119 | 102 | {% block script_file %} |
120 | - | |
103 | + | |
121 | 104 | {% endblock script_file %} |
122 | 105 | </body> |
123 | 106 | ... | ... |
courses/static/js/course.js
... | ... | @@ -0,0 +1,21 @@ |
1 | +/* | |
2 | +* | |
3 | +* Function to subscribe (works for courses and subjects) | |
4 | +* | |
5 | +*/ | |
6 | +function subscribe(elem, url, confirm_message) { | |
7 | + alertify.confirm(confirm_message, function(){ | |
8 | + $.ajax({ | |
9 | + dataType: "json", | |
10 | + url: url, | |
11 | + success: function (data) { | |
12 | + if (data.status == "ok") { | |
13 | + elem.disabled(true); | |
14 | + alertify.success(data.message); | |
15 | + } else { | |
16 | + alertify.error(data.message); | |
17 | + } | |
18 | + } | |
19 | + }); | |
20 | + }); | |
21 | +} | |
0 | 22 | \ No newline at end of file | ... | ... |
... | ... | @@ -0,0 +1,30 @@ |
1 | + | |
2 | +var Submite = { | |
3 | + remove: function(url,dados,id_li_link){ | |
4 | + $('#category').modal('hide'); | |
5 | + $.post(url,dados, function(data){ | |
6 | + $(id_li_link).remove(); | |
7 | + $("#modal_category").empty(); | |
8 | + $("div.modal-backdrop.fade.in").remove(); | |
9 | + alertify.success("Category removed successfully!"); | |
10 | + }).fail(function(){ | |
11 | + $("#modal_category").empty(); | |
12 | + $("#modal_category").append(data); | |
13 | + $('#category').modal('show'); | |
14 | + }); | |
15 | + } | |
16 | +} | |
17 | + | |
18 | +var modal = { | |
19 | + get: function (url, id_modal, id_div_modal){ | |
20 | + $.get(url, function(data){ | |
21 | + if($(id_modal).length){ | |
22 | + $(id_div_modal).empty(); | |
23 | + $(id_div_modal).append(data); | |
24 | + } else { | |
25 | + $(id_div_modal).append(data); | |
26 | + } | |
27 | + $(id_modal).modal('show'); | |
28 | + }); | |
29 | + } | |
30 | +}; | |
0 | 31 | \ No newline at end of file | ... | ... |
courses/templates/category/delete.html
1 | -{% extends 'base.html' %} | |
2 | - | |
3 | -{% load static i18n %} | |
4 | 1 | {% load static i18n permission_tags %} |
5 | 2 | |
6 | -{% block breadcrumbs %} | |
7 | - <ol class="breadcrumb"> | |
8 | - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | |
9 | - <li class="active">{% trans 'Manage Categories' %}</li> | |
10 | - </ol> | |
11 | -{% endblock %} | |
3 | +<!-- Modal (remember to change the ids!!!) --> | |
4 | +<div class="modal fade" id="category" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | |
5 | + <div class="modal-dialog" role="document"> | |
6 | + <div class="modal-content"> | |
7 | + <!-- Modal Header --> | |
8 | + <div class="modal-header"> | |
12 | 9 | |
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 'users:profile' %}">{% trans 'Profile' %}</a></li> | |
21 | - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | |
22 | - </ul> | |
23 | - </div> | |
10 | + <h4 class="modal-title" id="myModalLabel">{% trans "Delete Category" %}</h4> | |
11 | + </div> | |
12 | + <!-- Modal Body --> | |
13 | + <div class="modal-body"> | |
14 | + <!-- Put ONLY your content here!!! --> | |
15 | + <form id="delete_form" action="" method="post"> | |
16 | + {% csrf_token %} | |
17 | + <p>{% trans 'Are you sure you want to delete the subject' %} "{{category.name}}"?</p> | |
18 | + </form> | |
19 | + </div> | |
20 | + <!-- Modal Footer --> | |
21 | + <div class="modal-footer"> | |
22 | + <!-- Don't remove that!!! --> | |
23 | + <button type="button" class="btn btn-danger 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> | |
25 | + <script> | |
26 | + $("#delete_form").submit(function(event) { | |
27 | + Submite.remove("{% url 'course:delete_cat' category.slug %}",$(this).serialize(),"#category_{{category.slug}}"); | |
28 | + event.preventDefault(); | |
29 | + }); | |
30 | + </script> | |
31 | + </div> | |
24 | 32 | </div> |
25 | - | |
26 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | |
27 | - | |
28 | - <div class="panel panel-primary navigation"> | |
29 | - <div class="panel-heading"> | |
30 | - <h3 class="panel-title">Actions</h3> | |
31 | - </div> | |
32 | - <div class="panel-body"> | |
33 | - <ul class="nav nav-pills nav-stacked"> | |
34 | - <li><a href="javascript:void(0)">Replicate Course</a></li> | |
35 | - <li><a href="{% url 'course:create' %}">Create Course</a></li> | |
36 | - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | |
37 | - </ul> | |
38 | - </div> | |
39 | - </div> | |
40 | - <div class="panel panel-primary navigation"> | |
41 | - <div class="panel-heading"> | |
42 | - <h3 class="panel-title">Category</h3> | |
43 | - </div> | |
44 | - <div class="panel-body"> | |
45 | - <ul class="nav nav-pills nav-stacked"> | |
46 | - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | |
47 | - <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | |
48 | - </ul> | |
49 | - </div> | |
50 | - </div> | |
51 | -{% endif %} | |
52 | -{% endblock %} | |
53 | - | |
54 | -{% block content %} | |
55 | - <div class="card card-content"> | |
56 | - <div class="card-body"> | |
57 | - <form action="" method="post">{% csrf_token %} | |
58 | - <h1>{% trans 'Are you sure you want to delete the category' %} "{{ object }}"?</h1> | |
59 | - <input type="submit" class="btn btn-success btn-sm" value="{% trans 'Yes' %}" /> | |
60 | - <a href="{% url 'course:manage_cat' %}" class="btn btn-danger btn-sm">{% trans 'No' %}</a> | |
61 | - </form> | |
62 | - </div> | |
63 | - </div> | |
64 | -{% endblock %} | |
33 | + </div> | |
34 | +</div> | |
35 | +<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> | |
36 | +<script src="{% static 'js/modal_category.js' %}"></script> | ... | ... |
courses/templates/category/index.html
... | ... | @@ -82,7 +82,8 @@ |
82 | 82 | <td class="text-center"> |
83 | 83 | <a href="{% url 'course:view_cat' category.slug %}" class="btn btn-info btn-sm"><span class="glyphicon glyphicon-eye-open"></span></a> |
84 | 84 | <a href="{% url 'course:update_cat' category.slug %}" class="btn btn-primary btn-sm"><span class="glyphicon glyphicon-edit"></span></a> |
85 | - <a href="{% url 'course:delete_cat' category.slug %}" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a> | |
85 | + <a href="javascript:modal.get('{% url 'course:delete_cat' category.slug %}','#category','#modal_category');" class="btn btn-danger btn-sm"><span class="glyphicon glyphicon-trash"></span></a> | |
86 | + | |
86 | 87 | </td> |
87 | 88 | </tr> |
88 | 89 | {% endfor %} |
... | ... | @@ -96,4 +97,6 @@ |
96 | 97 | </tbody> |
97 | 98 | </table> |
98 | 99 | </div> |
99 | -{% endblock %} | |
100 | + <div class="row" id="modal_category"> | |
101 | +<script src="{% static 'js/modal_category.js' %}"></script> | |
102 | +{% endblock %} | |
100 | 103 | \ No newline at end of file | ... | ... |
courses/templates/course/index.html
... | ... | @@ -11,47 +11,35 @@ |
11 | 11 | {% endblock %} |
12 | 12 | |
13 | 13 | {% block sidebar %} |
14 | - <div class="panel panel-primary navigation"> | |
14 | + <div class="panel panel-primary navigation"> | |
15 | 15 | <div class="panel-heading"> |
16 | - <h5>{% trans 'Menu' %}</h5> | |
16 | + <h4>Menu</h4> | |
17 | 17 | </div> |
18 | 18 | <div class="panel-body"> |
19 | 19 | <ul class="nav nav-pills nav-stacked"> |
20 | - <li><a href="{% url 'core:home' %}">{% trans 'Home' %}</a></li> | |
20 | + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | |
21 | 21 | <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> |
22 | - <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | |
22 | + {% if user|has_role:'student' or not user.is_staff %} | |
23 | + <li><a href="{% url 'course:manage' %}">{% trans 'My courses' %}</a></li> | |
24 | + {% endif %} | |
25 | + {% if user|has_role:'system_admin' %} | |
26 | + <li> <a href="{% url 'users:manage' %}">{% trans 'Manage Users' %}</a></li> | |
27 | + {% endif %} | |
28 | + {% if user|has_role:'system_admin' or user|has_role:'professor' %} | |
29 | + <li> | |
30 | + <a href="#courses_list" class="accordion" data-toggle="collapse">{% trans 'Manage Courses' %}</a> | |
31 | + <div id="courses_list" class="collapse"> | |
32 | + <ul class="nav nav-pill nav-stacked accordion_list"> | |
33 | + {% for course in courses_list %} | |
34 | + <li><a href="{% url 'course:view' course.slug %}">{{ course }}</a></li> | |
35 | + {% endfor %} | |
36 | + </ul> | |
37 | + </div> | |
38 | + </li> | |
39 | + {% endif %} | |
23 | 40 | </ul> |
24 | 41 | </div> |
25 | 42 | </div> |
26 | - | |
27 | -{% if user|has_role:'professor' or user|has_role:'system_admin' %} | |
28 | - | |
29 | - <div class="panel panel-primary navigation"> | |
30 | - <div class="panel-heading"> | |
31 | - <h3 class="panel-title">Actions</h3> | |
32 | - </div> | |
33 | - <div class="panel-body"> | |
34 | - <ul class="nav nav-pills nav-stacked"> | |
35 | - <li><a href="javascript:void(0)">Replicate Course</a></li> | |
36 | - <li><a href="{% url 'course:create' %}">Create Course</a></li> | |
37 | - </ul> | |
38 | - </div> | |
39 | - </div> | |
40 | - | |
41 | - <div class="panel panel-primary navigation"> | |
42 | - <div class="panel-heading"> | |
43 | - <h3 class="panel-title">Category</h3> | |
44 | - </div> | |
45 | - <div class="panel-body"> | |
46 | - <ul class="nav nav-pills nav-stacked"> | |
47 | - <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | |
48 | - <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | |
49 | - </ul> | |
50 | - </div> | |
51 | - </div> | |
52 | - | |
53 | -{% endif %} | |
54 | - | |
55 | 43 | {% endblock %} |
56 | 44 | |
57 | 45 | {% block content %} |
... | ... | @@ -98,13 +86,13 @@ |
98 | 86 | <div class="panel panel-info"> |
99 | 87 | <div class="panel-heading" role="tab"> |
100 | 88 | <div class="row"> |
101 | - <div class="col-xs-9 col-md-9 titleTopic"> | |
89 | + <div class="col-xs-9 col-md-10 titleTopic"> | |
102 | 90 | <a role="button" data-toggle="collapse" data-parent="#accordion" href=".collapseOne" aria-expanded="false" aria-controls="collapseOne" class="collapsed"> |
103 | 91 | <h4 style="color:white">{{course.name}}</h4> |
104 | 92 | </a> |
105 | 93 | </div> |
106 | 94 | {% if user|has_role:'professor' or user|has_role:'system_admin' %} |
107 | - <div class="col-xs-4 col-md-3" id="divMoreActions"> | |
95 | + <div class="col-xs-4 col-md-2" id="divMoreActions"> | |
108 | 96 | <div class="btn-group"> |
109 | 97 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
110 | 98 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ... | ... |
courses/templates/subject/index.html
... | ... | @@ -36,12 +36,12 @@ |
36 | 36 | <div class="panel panel-info"> |
37 | 37 | <div class="panel-heading"> |
38 | 38 | <div class="row"> |
39 | - <div class="col-md-10 col-sm-9"> | |
39 | + <div class="col-md-10 col-sm-10"> | |
40 | 40 | <h3>{{subject}}</h3> |
41 | 41 | </div> |
42 | 42 | {% professor_subject subject user as subject_professor%} |
43 | 43 | {% if subject_professor %} |
44 | - <div class="col-xs-4 col-md-3 divMoreActions"> | |
44 | + <div class="col-xs-4 col-md-2 divMoreActions"> | |
45 | 45 | <div class="btn-group"> |
46 | 46 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
47 | 47 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ... | ... |
courses/urls.py
... | ... | @@ -29,7 +29,7 @@ urlpatterns = [ |
29 | 29 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
30 | 30 | url(r'^forum/', include('forum.urls', namespace = 'forum')), |
31 | 31 | url(r'^poll/', include('poll.urls', namespace = 'poll')), |
32 | - # url(r'^exam/', include('exam.urls', namespace = 'exam')), | |
32 | + url(r'^exam/', include('exam.urls', namespace = 'exam')), | |
33 | 33 | url(r'^files/', include('files.urls', namespace = 'file')), |
34 | 34 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), |
35 | 35 | url(r'^links/',include('links.urls',namespace = 'links')), | ... | ... |
courses/views.py
... | ... | @@ -35,10 +35,10 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): |
35 | 35 | list_courses = None |
36 | 36 | categorys_courses = None |
37 | 37 | if has_role(self.request.user,'professor') or has_role(self.request.user,'system_admin'): |
38 | - list_courses = Course.objects.filter(professors__name = self.request.user.name).order_by('name') | |
38 | + list_courses = Course.objects.filter(Q(professors = True)|Q(professors__name = self.request.user.name)).order_by('name') | |
39 | 39 | categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct() |
40 | 40 | else: |
41 | - list_courses = Course.objects.filter(students__name = self.request.user.name) | |
41 | + list_courses = Course.objects.filter(Q(students = True)|Q(students__name = self.request.user.name)).order_by('name') | |
42 | 42 | categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() |
43 | 43 | |
44 | 44 | courses_category = Course.objects.filter(category__name = self.request.GET.get('category')) |
... | ... | @@ -305,6 +305,19 @@ class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): |
305 | 305 | model = CourseCategory |
306 | 306 | template_name = 'category/delete.html' |
307 | 307 | |
308 | + def dispatch(self, *args, **kwargs): | |
309 | + category = get_object_or_404(CourseCategory, slug = self.kwargs.get('slug')) | |
310 | + if(not has_object_permission('delete_category', self.request.user, category)): | |
311 | + return self.handle_no_permission() | |
312 | + return super(DeleteCatView, self).dispatch(*args, **kwargs) | |
313 | + | |
314 | + | |
315 | + def get_context_data(self, **kwargs): | |
316 | + context = super(DeleteCatView, self).get_context_data(**kwargs) | |
317 | + context['course'] = self.object.course_category | |
318 | + context['category'] = self.object | |
319 | + return context | |
320 | + | |
308 | 321 | def get_success_url(self): |
309 | 322 | messages.success(self.request, _('Category deleted successfully!')) |
310 | 323 | return reverse_lazy('course:manage_cat') | ... | ... |
exam/templates/exam/create.html
... | ... | @@ -0,0 +1,116 @@ |
1 | +{% extends "base.html" %} | |
2 | + | |
3 | +{% load i18n %} | |
4 | + | |
5 | +{% block content %} | |
6 | +<div class="panel panel-info"> | |
7 | + <div class="panel-heading"> | |
8 | + {% block title_poll %} | |
9 | + <h1 class="panel-title">{% trans "New Exam" %}</h1> | |
10 | + {% endblock title_poll %} | |
11 | + </div> | |
12 | + <div class="panel-body"> | |
13 | + <div class="row form-group"> | |
14 | + <label for="exam_name" class="col-md-2 control-label">{% trans "Exam Name" %}</label> | |
15 | + <div class="col-md-10"> | |
16 | + <input type="text" name="exam_name" class="form-control" id="exam_name" placeholder="{% trans 'Exam Name' %}"> | |
17 | + </div> | |
18 | + </div> | |
19 | + <div class="row form-group"> | |
20 | + <label for="begin_date" class="col-md-2 control-label">{% trans "Exam's begin date" %}</label> | |
21 | + <div class="col-md-10"> | |
22 | + <input type="date" name="begin_date" class="form-control" id="begin_date" placeholder='{% trans "Begin Date" %}'> | |
23 | + </div> | |
24 | + </div> | |
25 | + <div class="row form-group"> | |
26 | + <label for="end_date" class="col-md-2 control-label">{% trans "Exam's end date" %}</label> | |
27 | + <div class="col-md-10"> | |
28 | + <input type="text" name="end_date" class="form-control" id="end_date" placeholder='{% trans "End Date" %}'> | |
29 | + </div> | |
30 | + </div> | |
31 | + <div class="row form-group"> | |
32 | + <div class="col-md-10"> | |
33 | + <div class="checkbox"> | |
34 | + <label> | |
35 | + <input type="checkbox" name="checkbox"><span class="checkbox-material"><span class="check"></span></span> {% trans "Allow submissions after deadline?" %} | |
36 | + </label> | |
37 | + </div> | |
38 | + </div> | |
39 | + </div> | |
40 | + <div class="row form-group" id="questions"> | |
41 | + | |
42 | + </div> | |
43 | + <div class="row form-group"> | |
44 | + <label for="questionType" class="col-md-2 control-label">{% trans "Question Type" %}</label> | |
45 | + <div class="col-md-10"> | |
46 | + <select id="questionType" class="form-control" name="option_question" onchange="showDiv (this)"> | |
47 | + <option selected disabled>{% trans "Question Type" %}</option> | |
48 | + <option value="0">{% trans "Multiple Choice" %}</option> | |
49 | + <option value="1">{% trans "True or False" %}</option> | |
50 | + <option value="2">{% trans "Gap Filling" %}</option> | |
51 | + <option value="3">{% trans "Discursive Question" %}</option> | |
52 | + </select> | |
53 | + </div> | |
54 | + </div> | |
55 | + <div class="row"> | |
56 | + <div class="col-md-12"> | |
57 | + <button type="button" class="btn btn-primary btn-raised" id="add_question">{% trans "add question" %}</button> | |
58 | + </div> | |
59 | + </div> | |
60 | + </div> | |
61 | + <div class="panel-footer text-right"> | |
62 | + <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Create" %}</button> | |
63 | + </div> | |
64 | +</div> | |
65 | +<script> | |
66 | +var id = 1; | |
67 | +$("#add_question").click(function(){ | |
68 | + $.get("{% url 'course:exam:true_or_false_question' %}", function(data){ | |
69 | + // var teste = String(data); | |
70 | + // teste.replace("#radiosTF", "W3Schools"); | |
71 | + // alert(teste); | |
72 | + $("#questions").append(data); | |
73 | + // $("#radiosTF").attr("id", "true_id_" + id); | |
74 | + $("#0").attr("id","true_" + id++); | |
75 | + }); | |
76 | +}); | |
77 | + | |
78 | +var alternativeValue = 3; | |
79 | + | |
80 | +$('#newAlternative').click(function () { | |
81 | + var element = '<div class="radio radio-primary">' + | |
82 | + '<label>' + | |
83 | + '<input type="radio" name="alternatives" id="alternative4"' + 'value="' +alternativeValue + '">' + | |
84 | + '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>' + | |
85 | + '</label>' + | |
86 | + '</div>'; | |
87 | + $('#radios').append(element); | |
88 | + | |
89 | + alternativeValue++; | |
90 | +}); | |
91 | + | |
92 | +var tfAlternativeValue = 3; | |
93 | + | |
94 | +$('#tfAlternative').click(function () { | |
95 | + var element = '<div class="radio radio-primary">' + | |
96 | + '<label>' + | |
97 | + '<textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea>' + | |
98 | + '</label>' + | |
99 | + '<label>' + | |
100 | + '<input type="radio" name="alternative' + tfAlternativeValue +'" value="T">' + | |
101 | + '</label>' + | |
102 | + '<label>' + | |
103 | + '<input type="radio" name="alternative2" value="F">' + | |
104 | + '</label>' + | |
105 | + '</div>'; | |
106 | + $('#radiosTF').append(element); | |
107 | + | |
108 | + tfAlternativeValue++; | |
109 | +}); | |
110 | + | |
111 | +$(function() { | |
112 | + $( "#begin_date,#end_date" ).datepicker(); | |
113 | +}); | |
114 | +</script> | |
115 | + | |
116 | +{% endblock content %} | ... | ... |
... | ... | @@ -0,0 +1,6 @@ |
1 | +<div class="form-group" id="discursiveQuestion"> | |
2 | + <label for="question" class="col-md-2 control-label">{% trans "Question" %}</label> | |
3 | + <div class="col-md-10"> | |
4 | + <textarea class="form-control" rows="1" id="question" placeholder="{% trans 'Question' %}"></textarea> | |
5 | + </div> | |
6 | +</div> | ... | ... |
... | ... | @@ -0,0 +1,40 @@ |
1 | +<div class="form-group" id="multipleChoice"> | |
2 | + | |
3 | + <label for="questionName" class="col-md-2 control-label">Question</label> | |
4 | + | |
5 | + | |
6 | + <div class="col-md-10"> | |
7 | + <textarea class="form-control" rows="1" id="questionName" placeholder="Wording"></textarea> | |
8 | + </div> | |
9 | + | |
10 | + | |
11 | +</div> | |
12 | +<div class="form-group"> | |
13 | + <label for="alternative" class="col-md-2 control-label">Alternatives</label> | |
14 | + <div class="col-md-10" id="radios"> | |
15 | + <div class="radio radio-primary"> | |
16 | + <label> | |
17 | + <input checked type="radio" name="alternatives" id="alternative1" value="1"> | |
18 | + <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea> | |
19 | + </label> | |
20 | + </div> | |
21 | + <div class="radio radio-primary"> | |
22 | + <label> | |
23 | + <input type="radio" name="alternatives" id="alternative2" value="2"> | |
24 | + <textarea class="form-control" rows="1" placeholder="Write your alternative"></textarea> | |
25 | + </label> | |
26 | + </div> | |
27 | + </div> | |
28 | +</div> | |
29 | +<!-- new alternative button --> | |
30 | +<div class="form-group"> | |
31 | + <div class="col-md-12 col-md-offset-2"> | |
32 | + <button type="button" class="btn btn-primary" id="newAlternative">New Alternative</button> | |
33 | + </div> | |
34 | +</div> | |
35 | +<div class="form-group"> | |
36 | + <div class="col-md-12 col-md-offset-2"> | |
37 | + <button type="submit" class="btn btn-primary">Save</button> | |
38 | + <button type="cancel" class="btn btn-default">Cancel</button> | |
39 | + </div> | |
40 | +</div> | ... | ... |
... | ... | @@ -0,0 +1,15 @@ |
1 | +{% load i18n %} | |
2 | + | |
3 | +<div class="row form-group" > | |
4 | + <div class="col-md-1"> | |
5 | + </br> | |
6 | + <label><span class="glyphicon glyphicon-move"></span></label> | |
7 | + </div> | |
8 | + <div class="col-md-10"> | |
9 | + <input class="form-control" placeholder='{% trans "Write your alternative" %}'></input> | |
10 | + </div> | |
11 | + <div class="col-md-1"> | |
12 | + </br> | |
13 | + <label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label> | |
14 | + </div> | |
15 | +</div> | ... | ... |
... | ... | @@ -0,0 +1,67 @@ |
1 | +{# {% extends "base.html" %} #} | |
2 | + | |
3 | +{% load i18n %} | |
4 | +{# {% block content %} #} | |
5 | +<style> | |
6 | + .glyphicon-remove:hover { | |
7 | + cursor: pointer; | |
8 | + } | |
9 | + .glyphicon-move:hover { | |
10 | + cursor: move; | |
11 | + } | |
12 | +</style> | |
13 | +<div class="" id="0"> | |
14 | + <div class="row form-group"> | |
15 | + <div class="col-md-1"> | |
16 | + </br> | |
17 | + <label><span class="glyphicon glyphicon-move"></span></label> | |
18 | + </div> | |
19 | + <div class="col-md-2"> | |
20 | + <label for="questionName" class="control-label">{% trans "Question" %}</label> | |
21 | + </div> | |
22 | + <div class="col-md-9"> | |
23 | + <div class="row"> | |
24 | + <div class="col-md-11"> | |
25 | + <input class="form-control" id="questionName" placeholder="{% trans 'Question' %}"></input> | |
26 | + </div> | |
27 | + <div class="col-md-1"> | |
28 | + </br> | |
29 | + <label><span class="glyphicon glyphicon-remove"></span></label> | |
30 | + </div> | |
31 | + </div> | |
32 | + </div> | |
33 | + | |
34 | + </div> | |
35 | + <div class="row"> | |
36 | + <div class="col-md-offset-1 col-md-2"> | |
37 | + <label class="control-label">{% trans "Alternatives: T/F" %}</label> | |
38 | + </div> | |
39 | + <div class="col-md-9" id="radiosTF"> | |
40 | + {% include "exam/true_or_false_answer.html" %} | |
41 | + </div> | |
42 | + </div> | |
43 | + <div class="form-group"> | |
44 | + <div class="col-md-9 col-md-offset-3"> | |
45 | + <button type="button" class="btn btn-primary btn-raised" id="new_alternative">{% trans "New Alternative" %}</button> | |
46 | + </div> | |
47 | + </div> | |
48 | +</div> | |
49 | +<script type="text/javascript"> | |
50 | + $("#new_alternative").click(function(){ | |
51 | + $.get("{% url 'course:exam:true_or_false_answer' %}", function(data){ | |
52 | + $("#radiosTF").append(data); | |
53 | + }); | |
54 | + }); | |
55 | + //deve ser importado apenas depois do html | |
56 | + $( "#radiosTF" ).sortable({ // utilizado para fazer a re-organização das respostas | |
57 | + delay: 100, | |
58 | + distance: 5, | |
59 | + update: function( event, ui ) { | |
60 | + var cont = 1; | |
61 | + $("#radiosTF div div input").each(function(){ | |
62 | + $(this).attr('name',cont++); | |
63 | + }); | |
64 | + }, | |
65 | + }); | |
66 | +</script> | |
67 | +{# {% endblock content %} #} | ... | ... |
exam/urls.py
1 | -# from django.conf.urls import url | |
2 | -# | |
3 | -# from . import views | |
4 | -# | |
5 | -# urlpatterns = [ | |
6 | -# url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), # exam slug | |
7 | -# url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), # topic slug | |
8 | -# url(r'^view/(?P<slug>[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), # exam slug | |
9 | -# url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), # exam | |
10 | -# url(r'^answer/$', views.AnswerExam.as_view(), name='answer_exam'), # exam | |
11 | -# url(r'^answer-exam/(?P<slug>[\w\-_]+)/$', views.AnswerStudentExam.as_view(), name='answer_student_exam'), # exam slug | |
12 | -# ] | |
1 | +from django.conf.urls import url | |
2 | + | |
3 | +from . import views | |
4 | + | |
5 | +urlpatterns = [ | |
6 | + url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), # exam slug | |
7 | + url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), # topic slug | |
8 | + url(r'^view/(?P<slug>[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), # exam slug | |
9 | + url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), # exam | |
10 | + url(r'^answer/$', views.AnswerExam.as_view(), name='answer_exam'), # exam | |
11 | + url(r'^answer-exam/(?P<slug>[\w\-_]+)/$', views.AnswerStudentExam.as_view(), name='answer_student_exam'), # exam slug | |
12 | + | |
13 | + | |
14 | + url(r'^discursive-question/$',views.DiscursiveQuestion.as_view(), name="discursive_question"), | |
15 | + url(r'^gap-filling-question/$',views.GapFillingQuestion.as_view(), name="gap_filling_question"), | |
16 | + url(r'^gap-filling-answer/$',views.GapFillingAnswer.as_view(), name="gap_filling_answer"), | |
17 | + url(r'^multiple-choice-question/$',views.MultipleChoiceQuestion.as_view(), name="multiple_choice_question"), | |
18 | + url(r'^multiple-choice-answer/$',views.MultipleChoiceAnswer.as_view(), name="multiple_choice_answer"), | |
19 | + url(r'^true-or-false-question/$',views.TrueOrFalseQuestion.as_view(), name="true_or_false_question"), | |
20 | + url(r'^true-or-false-answer/$',views.TrueOrFalseAnswer.as_view(), name="true_or_false_answer"), | |
21 | +] | ... | ... |
exam/views.py
... | ... | @@ -24,7 +24,7 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): |
24 | 24 | template_name = 'exam/view.html' |
25 | 25 | |
26 | 26 | def get_object(self, queryset=None): |
27 | - return get_object_or_404(Exam, slug = self.kwargs.get('slug')) | |
27 | + return get_object_or_404(Topic, slug = self.kwargs.get('slug')) | |
28 | 28 | |
29 | 29 | def get_context_data(self, **kwargs): |
30 | 30 | context = super(ViewExam, self).get_context_data(**kwargs) |
... | ... | @@ -227,3 +227,29 @@ class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): |
227 | 227 | context['keys'] = keys |
228 | 228 | |
229 | 229 | return context |
230 | + | |
231 | +class MultipleChoiceQuestion(generic.TemplateView): | |
232 | + template_name = 'exam/multiple_choice_question.html' | |
233 | + | |
234 | + | |
235 | +class MultipleChoiceAnswer(generic.TemplateView): | |
236 | + template_name = 'exam/multiple_choice_answer.html' | |
237 | + | |
238 | + | |
239 | +class DiscursiveQuestion(generic.TemplateView): | |
240 | + template_name = 'exam/discursive_question.html' | |
241 | + | |
242 | + | |
243 | +class TrueOrFalseQuestion(generic.TemplateView): | |
244 | + template_name = 'exam/true_or_false_question.html' | |
245 | + | |
246 | + | |
247 | +class TrueOrFalseAnswer(generic.TemplateView): | |
248 | + template_name = 'exam/true_or_false_answer.html' | |
249 | + | |
250 | + | |
251 | +class GapFillingQuestion(generic.TemplateView): | |
252 | + template_name = 'exam/gap_filling_question.html' | |
253 | + | |
254 | +class GapFillingAnswer(generic.TemplateView): | |
255 | + template_name = 'exam/gap_filling_answer.html' | ... | ... |
files/templates/files/delete_file.html