Commit 6bb448e9292bae32f3e6bce4dbe21fe34a38efb3
Exists in
master
and in
5 other branches
Merge
Showing
48 changed files
with
948 additions
and
473 deletions
Show diff stats
courses/templates/category/create.html
@@ -37,34 +37,46 @@ | @@ -37,34 +37,46 @@ | ||
37 | </ul> | 37 | </ul> |
38 | </div> | 38 | </div> |
39 | </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> | ||
40 | {% endif %} | 52 | {% endif %} |
41 | 53 | ||
42 | {% endblock %} | 54 | {% endblock %} |
43 | 55 | ||
44 | {% block content %} | 56 | {% block content %} |
45 | - | ||
46 | - <form method="post" action=""> | ||
47 | - {% csrf_token %} | ||
48 | - {% for field in form %} | ||
49 | - <div class="form-group {% if form.has_error %}has-error{% endif %}"> | ||
50 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
51 | - {% render_field field class='form-control input-sm' %} | ||
52 | - </div> | ||
53 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
54 | - {% if field.errors.length > 0 %} | ||
55 | - <div class="alert alert-danger alert-dismissible" role="alert"> | ||
56 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
57 | - <span aria-hidden="true">×</span> | ||
58 | - </button> | ||
59 | - <ul> | ||
60 | - {% for error in field.errors %} | ||
61 | - <li>{{ error }}</li> | ||
62 | - {% endfor %} | ||
63 | - </ul> | ||
64 | - </div> | 57 | + <div class="card card-content"> |
58 | + <div class="card-body"> | ||
59 | + <form method="post" action="">{% csrf_token %} | ||
60 | + {% for field in form %} | ||
61 | + <div class="form-group {% if form.has_error %}has-error{% endif %}"> | ||
62 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
63 | + {% render_field field class='form-control input-sm' %} | ||
64 | + </div> | ||
65 | + {% if field.errors.length > 0 %} | ||
66 | + <div class="alert alert-danger alert-dismissible" role="alert"> | ||
67 | + <ul> | ||
68 | + {% for error in field.errors %} | ||
69 | + <li>{{ error }}</li> | ||
70 | + {% endfor %} | ||
71 | + </ul> | ||
72 | + </div> | ||
73 | + </div> | ||
74 | + {% endif %} | ||
75 | + {% endfor %} | ||
76 | + <div class="row text-center"> | ||
77 | + <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> | ||
78 | + </div> | ||
79 | + </form> | ||
65 | </div> | 80 | </div> |
66 | - {% endif %} | ||
67 | - {% endfor %} | ||
68 | - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> | ||
69 | - </form> | 81 | + </div> |
70 | {% endblock %} | 82 | {% endblock %} |
courses/templates/category/delete.html
1 | {% extends 'app/base.html' %} | 1 | {% extends 'app/base.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | +{% load static i18n permission_tags %} | ||
4 | 5 | ||
5 | {% block breadcrumbs %} | 6 | {% block breadcrumbs %} |
6 | <ol class="breadcrumb"> | 7 | <ol class="breadcrumb"> |
@@ -10,21 +11,54 @@ | @@ -10,21 +11,54 @@ | ||
10 | {% endblock %} | 11 | {% endblock %} |
11 | 12 | ||
12 | {% block sidebar %} | 13 | {% block sidebar %} |
13 | - <div class="list-group"> | ||
14 | - <a href="{% url 'course:manage_cat' %}" class="list-group-item active"> | ||
15 | - {% trans 'Categories' %} | ||
16 | - </a> | ||
17 | - <a href="{% url 'course:create_cat' %}" class="list-group-item"> | ||
18 | - {% trans 'Create Category' %} | ||
19 | - </a> | 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> | ||
24 | + </div> | ||
25 | + | ||
26 | +{% if user|has_role:'professor, 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> | ||
20 | </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 %} | ||
21 | {% endblock %} | 52 | {% endblock %} |
22 | 53 | ||
23 | {% block content %} | 54 | {% block content %} |
24 | - <form action="" method="post"> | ||
25 | - {% csrf_token %} | ||
26 | - <p>{% trans 'Are you sure you want to delete the category' %} "{{ object }}"?</p> | ||
27 | - <input type="submit" class="btn btn-success btn-sm" value="{% trans 'Yes' %}" /> | ||
28 | - <a href="{% url 'course:manage' %}" class="btn btn-danger btn-sm">{% trans 'No' %}</a> | ||
29 | - </form> | 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> | ||
30 | {% endblock %} | 64 | {% endblock %} |
courses/templates/category/index.html
1 | {% extends 'app/base.html' %} | 1 | {% extends 'app/base.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | +{% load static i18n permission_tags %} | ||
5 | +{% load widget_tweaks %} | ||
4 | 6 | ||
5 | {% block breadcrumbs %} | 7 | {% block breadcrumbs %} |
6 | <ol class="breadcrumb"> | 8 | <ol class="breadcrumb"> |
@@ -10,14 +12,45 @@ | @@ -10,14 +12,45 @@ | ||
10 | {% endblock %} | 12 | {% endblock %} |
11 | 13 | ||
12 | {% block sidebar %} | 14 | {% block sidebar %} |
13 | - <div class="list-group"> | ||
14 | - <a href="{% url 'course:manage_cat' %}" class="list-group-item active"> | ||
15 | - {% trans 'Categories' %} | ||
16 | - </a> | ||
17 | - <a href="{% url 'course:create_cat' %}" class="list-group-item"> | ||
18 | - {% trans 'Create Category' %} | ||
19 | - </a> | 15 | + <div class="panel panel-primary navigation"> |
16 | + <div class="panel-heading"> | ||
17 | + <h5>{% trans 'Menu' %}</h5> | ||
18 | + </div> | ||
19 | + <div class="panel-body"> | ||
20 | + <ul class="nav nav-pills nav-stacked"> | ||
21 | + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
22 | + <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
23 | + </ul> | ||
24 | + </div> | ||
25 | + </div> | ||
26 | + | ||
27 | + {% if user|has_role:'professor, 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 | + <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
38 | + </ul> | ||
39 | + </div> | ||
40 | + </div> | ||
41 | + | ||
42 | + <div class="panel panel-primary navigation"> | ||
43 | + <div class="panel-heading"> | ||
44 | + <h3 class="panel-title">Category</h3> | ||
45 | + </div> | ||
46 | + <div class="panel-body"> | ||
47 | + <ul class="nav nav-pills nav-stacked"> | ||
48 | + <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
49 | + <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | ||
50 | + </ul> | ||
51 | + </div> | ||
20 | </div> | 52 | </div> |
53 | +{% endif %} | ||
21 | {% endblock %} | 54 | {% endblock %} |
22 | 55 | ||
23 | {% block content %} | 56 | {% block content %} |
courses/templates/category/update.html
1 | {% extends 'app/base.html' %} | 1 | {% extends 'app/base.html' %} |
2 | 2 | ||
3 | {% load static i18n %} | 3 | {% load static i18n %} |
4 | +{% load static i18n permission_tags %} | ||
4 | {% load widget_tweaks %} | 5 | {% load widget_tweaks %} |
5 | 6 | ||
6 | {% block breadcrumbs %} | 7 | {% block breadcrumbs %} |
@@ -11,43 +12,84 @@ | @@ -11,43 +12,84 @@ | ||
11 | {% endblock %} | 12 | {% endblock %} |
12 | 13 | ||
13 | {% block sidebar %} | 14 | {% block sidebar %} |
14 | - <div class="list-group"> | ||
15 | - <a href="{% url 'course:manage_cat' %}" class="list-group-item"> | ||
16 | - {% trans 'Categories' %} | ||
17 | - </a> | 15 | + <div class="panel panel-primary navigation"> |
16 | + <div class="panel-heading"> | ||
17 | + <h5>{% trans 'Menu' %}</h5> | ||
18 | + </div> | ||
19 | + <div class="panel-body"> | ||
20 | + <ul class="nav nav-pills nav-stacked"> | ||
21 | + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
22 | + <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
23 | + </ul> | ||
24 | + </div> | ||
25 | + </div> | ||
26 | + | ||
27 | +{% if user|has_role:'professor, 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 | + <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
38 | + </ul> | ||
39 | + </div> | ||
40 | + </div> | ||
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> | ||
18 | </div> | 51 | </div> |
52 | +{% endif %} | ||
19 | {% endblock %} | 53 | {% endblock %} |
20 | 54 | ||
21 | {% block content %} | 55 | {% block content %} |
22 | - <div class="alert alert-info alert-dismissible" role="alert"> | ||
23 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
24 | - <span aria-hidden="true">×</span> | ||
25 | - </button> | ||
26 | - <p>{% trans 'All fields are required' %}</p> | ||
27 | - </div> | ||
28 | - | ||
29 | - <form method="post" action=""> | ||
30 | - {% csrf_token %} | ||
31 | - {% for field in form %} | ||
32 | - <div class="form-group {% if form.has_error %}has-error{% endif %}"> | ||
33 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
34 | - {% render_field field class='form-control input-sm' %} | 56 | + {% if messages %} |
57 | + {% for message in messages %} | ||
58 | + <div class="alert alert-success alert-dismissible" role="alert"> | ||
59 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
60 | + <span aria-hidden="true">×</span> | ||
61 | + </button> | ||
62 | + <p>{{ message }}</p> | ||
35 | </div> | 63 | </div> |
36 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | ||
37 | - {% if field.errors.length > 0 %} | ||
38 | - <div class="alert alert-danger alert-dismissible" role="alert"> | ||
39 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
40 | - <span aria-hidden="true">×</span> | ||
41 | - </button> | ||
42 | - <ul> | ||
43 | - {% for error in field.errors %} | ||
44 | - <li>{{ error }}</li> | ||
45 | - {% endfor %} | ||
46 | - </ul> | ||
47 | - </div> | ||
48 | - </div> | ||
49 | - {% endif %} | ||
50 | {% endfor %} | 64 | {% endfor %} |
51 | - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> | ||
52 | - </form> | 65 | + {% endif %} |
66 | + <div class="card card-content"> | ||
67 | + <div class="card-body"> | ||
68 | + <form method="post" action=""> | ||
69 | + {% csrf_token %} | ||
70 | + {% for field in form %} | ||
71 | + <div class="form-group {% if form.has_error %}has-error{% endif %}"> | ||
72 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | ||
73 | + {% render_field field class='form-control input-sm' %} | ||
74 | + </div> | ||
75 | + {% if field.errors.length > 0 %} | ||
76 | + <div class="alert alert-danger alert-dismissible" role="alert"> | ||
77 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | ||
78 | + <span aria-hidden="true">×</span> | ||
79 | + </button> | ||
80 | + <ul> | ||
81 | + {% for error in field.errors %} | ||
82 | + <li>{{ error }}</li> | ||
83 | + {% endfor %} | ||
84 | + </ul> | ||
85 | + </div> | ||
86 | + </div> | ||
87 | + {% endif %} | ||
88 | + {% endfor %} | ||
89 | + <div class="row text-center"> | ||
90 | + <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> | ||
91 | + </div> | ||
92 | + </form> | ||
93 | + </div> | ||
94 | + </div> | ||
53 | {% endblock %} | 95 | {% endblock %} |
courses/templates/category/view.html
1 | {% extends 'app/base.html' %} | 1 | {% extends 'app/base.html' %} |
2 | 2 | ||
3 | +{% load static i18n permission_tags %} | ||
4 | +{% load widget_tweaks %} | ||
3 | {% load static i18n %} | 5 | {% load static i18n %} |
4 | 6 | ||
7 | + | ||
5 | {% block breadcrumbs %} | 8 | {% block breadcrumbs %} |
6 | <ol class="breadcrumb"> | 9 | <ol class="breadcrumb"> |
7 | <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> | 10 | <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li> |
@@ -10,27 +13,57 @@ | @@ -10,27 +13,57 @@ | ||
10 | {% endblock %} | 13 | {% endblock %} |
11 | 14 | ||
12 | {% block sidebar %} | 15 | {% block sidebar %} |
13 | - <div class="list-group"> | ||
14 | - <a href="{% url 'course:manage_cat' %}" class="list-group-item"> | ||
15 | - {% trans 'Categories' %} | ||
16 | - </a> | ||
17 | - <a href="{% url 'course:create_cat' %}" class="list-group-item"> | ||
18 | - {% trans 'Create Category' %} | ||
19 | - </a> | ||
20 | - <a href="" class="list-group-item"> | ||
21 | - {% trans 'Edit Category' %} | ||
22 | - </a> | ||
23 | - <a href="" class="list-group-item"> | ||
24 | - {% trans 'Remove Category' %} | ||
25 | - </a> | ||
26 | - </div> | 16 | + <div class="panel panel-primary navigation"> |
17 | + <div class="panel-heading"> | ||
18 | + <h5>{% trans 'Menu' %}</h5> | ||
19 | + </div> | ||
20 | + <div class="panel-body"> | ||
21 | + <ul class="nav nav-pills nav-stacked"> | ||
22 | + <li><a href="{% url 'users:profile' %}">{% trans 'Profile' %}</a></li> | ||
23 | + <li><a href="{% url 'course:manage' %}">{% trans 'My Courses' %}</a></li> | ||
24 | + </ul> | ||
25 | + </div> | ||
26 | + </div> | ||
27 | + {% if user|has_role:'professor, 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 | + <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
38 | + </ul> | ||
39 | + </div> | ||
40 | + </div> | ||
41 | + | ||
42 | + <div class="panel panel-primary navigation"> | ||
43 | + <div class="panel-heading"> | ||
44 | + <h3 class="panel-title">Category</h3> | ||
45 | + </div> | ||
46 | + <div class="panel-body"> | ||
47 | + <ul class="nav nav-pills nav-stacked"> | ||
48 | + <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | ||
49 | + <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | ||
50 | + <li><a href="{% url 'course:delete_cat' category.slug %}">Remove Category</a></li> | ||
51 | + <li><a href="{% url 'course:update_cat' category.slug %}">Update Category</a></li> | ||
52 | + </ul> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + {% endif %} | ||
27 | {% endblock %} | 56 | {% endblock %} |
28 | 57 | ||
29 | {% block content %} | 58 | {% block content %} |
30 | - <div class="row"> | ||
31 | - <div class="col-sm-12"> | ||
32 | - <p><b>{% trans 'Name:' %} </b> {{ category }}</p> | ||
33 | - <p><b>{% trans 'Slug:' %} </b> {{ category.slug }}</p> | 59 | + <div class="card card-content"> |
60 | + <div class="card-body"> | ||
61 | + <div class="row"> | ||
62 | + <div class="col-sm-12"> | ||
63 | + <p><b>{% trans 'Name:' %} </b> {{ category }}</p> | ||
64 | + <p><b>{% trans 'Slug:' %} </b> {{ category.slug }}</p> | ||
65 | + </div> | ||
66 | + </div> | ||
34 | </div> | 67 | </div> |
35 | </div> | 68 | </div> |
36 | {% endblock %} | 69 | {% endblock %} |
courses/templates/course/index.html
@@ -33,7 +33,18 @@ | @@ -33,7 +33,18 @@ | ||
33 | <ul class="nav nav-pills nav-stacked"> | 33 | <ul class="nav nav-pills nav-stacked"> |
34 | <li><a href="javascript:void(0)">Replicate Course</a></li> | 34 | <li><a href="javascript:void(0)">Replicate Course</a></li> |
35 | <li><a href="{% url 'course:create' %}">Create Course</a></li> | 35 | <li><a href="{% url 'course:create' %}">Create Course</a></li> |
36 | + </ul> | ||
37 | + </div> | ||
38 | + </div> | ||
39 | + | ||
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"> | ||
36 | <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> | 46 | <li><a href="{% url 'course:create_cat' %}">Create Category</a></li> |
47 | + <li><a href="{% url 'course:manage_cat' %}">List Category</a></li> | ||
37 | </ul> | 48 | </ul> |
38 | </div> | 49 | </div> |
39 | </div> | 50 | </div> |
@@ -55,40 +66,32 @@ | @@ -55,40 +66,32 @@ | ||
55 | {% endif %} | 66 | {% endif %} |
56 | 67 | ||
57 | <div class="col-md-12"> | 68 | <div class="col-md-12"> |
58 | - <div class="input-group"> | ||
59 | - <div class="form-group is-empty"><input type="search" class="form-control" placeholder="Search Courses"></div> | ||
60 | - <span class="input-group-btn input-group-sm"> | ||
61 | - <button type="button" class="btn btn-fab btn-fab-mini"> | ||
62 | - <i class="material-icons">search</i> | ||
63 | - </button> | ||
64 | - </span> | ||
65 | - </div> | 69 | + <form id="searchform" action="{% url 'course:manage' %}" method="get" accept-charset="utf-8"> |
70 | + <div class="input-group"> | ||
71 | + <div class="form-group is-empty"> | ||
72 | + <input type="search" class="form-control" placeholder="Search Courses" name="q" id="searchbox"></div> | ||
73 | + <span class="input-group-btn input-group-sm"> | ||
74 | + <button type="button" class="btn btn-fab btn-fab-mini"> | ||
75 | + <i class="material-icons">search</i> | ||
76 | + </button> | ||
77 | + </span> | ||
78 | + </div> | ||
79 | + </form> | ||
66 | </div> | 80 | </div> |
67 | <div class="col-md-12"> | 81 | <div class="col-md-12"> |
68 | - {% if user|has_role:'professor, system_admin' %} | ||
69 | - <div class="btn-group btn-group-justified btn-group-raised"> | ||
70 | - <a href="?category=all" class="btn btn-raised btn-info">Todos</a> | ||
71 | - {% for category_course in categorys_courses_professor %} | ||
72 | - <a href="?category={{category_course.name}}" class="btn btn-raised btn-primary">{{category_course.name}}</a> | ||
73 | - {% endfor %} | ||
74 | - </div> | ||
75 | - {% else%} | ||
76 | - <div class="btn-group btn-group-justified btn-group-raised"> | ||
77 | - <a href="?category=all" class="btn btn-raised btn-info">Todos</a> | ||
78 | - {% for category_course in categorys_courses %} | ||
79 | - <a href="?category={{category_course.name}}" class="btn btn-raised btn-primary">{{category_course.name}}</a> | ||
80 | - {% endfor %} | ||
81 | - </div> | ||
82 | - {% endif %} | 82 | + <div class="btn-group btn-group-justified btn-group-raised"> |
83 | + <a href="?category=all" class="btn btn-raised btn-info">Todos</a> | ||
84 | + {% for category_course in categorys_courses %} | ||
85 | + <a href="?category={{category_course.name}}" class="btn btn-raised btn-primary">{{category_course.name}}</a> | ||
86 | + {% endfor %} | ||
87 | + </div> | ||
83 | </div> | 88 | </div> |
84 | 89 | ||
85 | </fieldset> | 90 | </fieldset> |
86 | -{% if user|has_role:'professor, system_admin' %} | ||
87 | <div class="col-md-12"> | 91 | <div class="col-md-12"> |
88 | {% if courses|length > 0 %} | 92 | {% if courses|length > 0 %} |
89 | {% if request.GET.category == 'all' or none or request.GET.category == '' %} | 93 | {% if request.GET.category == 'all' or none or request.GET.category == '' %} |
90 | - {% for course in courses_teacher %} | ||
91 | - <!-- Put your content here! --> | 94 | + {% for course in list_courses %} |
92 | <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> | 95 | <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> |
93 | <div class="group"> | 96 | <div class="group"> |
94 | <div class="panel panel-info"> | 97 | <div class="panel panel-info"> |
@@ -101,12 +104,6 @@ | @@ -101,12 +104,6 @@ | ||
101 | </div> | 104 | </div> |
102 | <div class="col-xs-4 col-md-3" id="divMoreActions"> | 105 | <div class="col-xs-4 col-md-3" id="divMoreActions"> |
103 | <div class="btn-group"> | 106 | <div class="btn-group"> |
104 | - <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible"> | ||
105 | - <i class="fa fa-eye fa-2x" aria-hidden="true"></i> | ||
106 | - </button> | ||
107 | - | ||
108 | - </div> | ||
109 | - <div class="btn-group"> | ||
110 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 107 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
111 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | 108 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> |
112 | </button> | 109 | </button> |
@@ -137,7 +134,7 @@ | @@ -137,7 +134,7 @@ | ||
137 | </div> | 134 | </div> |
138 | {% endfor %} | 135 | {% endfor %} |
139 | {% else %} | 136 | {% else %} |
140 | - {% for course in courses_teacher %} | 137 | + {% for course in courses_category %} |
141 | {% if course.category.name == request.GET.category %} | 138 | {% if course.category.name == request.GET.category %} |
142 | <!-- Put your content here! --> | 139 | <!-- Put your content here! --> |
143 | <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> | 140 | <div class="panel-group ui-accordion ui-widget ui-helper-reset ui-sortable" id="accordion" role="tablist" aria-multiselectable="false"> |
@@ -210,125 +207,28 @@ | @@ -210,125 +207,28 @@ | ||
210 | </div> | 207 | </div> |
211 | </div> | 208 | </div> |
212 | </div> | 209 | </div> |
213 | - </div> | ||
214 | </div> | 210 | </div> |
215 | </div> | 211 | </div> |
216 | -{% else %} | ||
217 | - {% if courses|length > 0 %} | ||
218 | - {% if request.GET.category == 'all' or none or request.GET.category == '' %} | ||
219 | - {% for course in courses_student %} | ||
220 | - <div class="col-md-12"> | ||
221 | - <div class="panel panel-info"> | ||
222 | - <!--{% if course.image %} | ||
223 | - <img src="{{ course.image_url }}" class="img-responsive" /> | ||
224 | - {% else %} | ||
225 | - <img src="" class="img-responsive" /> | ||
226 | - {% endif %} --> | ||
227 | - <div class="panel-heading"> | ||
228 | - <div class="row"> | ||
229 | - <div class="col-md-9"> | ||
230 | - <h3 class="panel-title">{{course.name}}</h3> | ||
231 | - </div> | ||
232 | - <div class="col-md-3"> | ||
233 | - <span class="label label-info">{{ course.category }}</span> | ||
234 | - <span class="label label-warning">{{ course.max_students }} {% trans 'students tops' %}</span> | ||
235 | - </div> | ||
236 | - </div> | ||
237 | - </div> | ||
238 | - <div class="panel-body"> | ||
239 | - <p><b>Course Name: </b>{{ course.name }}</p> | ||
240 | - <p><b>Duration (in semesters): </b>09</p> | ||
241 | - <p><b>Coordinator: </b>{{course.professors}}</p> | ||
242 | - <p> | ||
243 | - <b>Description:</b> | ||
244 | - <i> | ||
245 | - {% if couse.description %} | ||
246 | - {{course.description|linebreaks}} | ||
247 | - {% else %} | ||
248 | - {% trans 'No description' %} | ||
249 | - {% endif %} | ||
250 | - </i> | ||
251 | - </p> | ||
252 | - | ||
253 | - <!--{% if user|has_role:'professor, system_admin' %} | ||
254 | - <a href="{% url 'course:update' course.slug %}" class="btn btn-sm btn-primary"> | ||
255 | - <span class="glyphicon glyphicon-edit"></span> | ||
256 | - </a> | ||
257 | - <a href="{% url 'course:delete' course.slug %}" class="btn btn-sm btn-danger"> | ||
258 | - <span class="glyphicon glyphicon-trash"></span> | ||
259 | - </a> | ||
260 | - {% endif %}--> | ||
261 | - | ||
262 | - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">View Course</a> | ||
263 | - </div> | ||
264 | - </div> | ||
265 | - </div> | ||
266 | - {% endfor %} | ||
267 | - {% else %} | ||
268 | - {% for course in courses_student %} | ||
269 | - {% if course.category.name == request.GET.category %} | ||
270 | - <div class="col-md-12"> | ||
271 | - <div class="panel panel-info"> | ||
272 | - <!--{% if course.image %} | ||
273 | - <img src="{{ course.image_url }}" class="img-responsive" /> | ||
274 | - {% else %} | ||
275 | - <img src="" class="img-responsive" /> | ||
276 | - {% endif %} --> | ||
277 | - <div class="panel-heading"> | ||
278 | - <div class="row"> | ||
279 | - <div class="col-md-9"> | ||
280 | - <h3 class="panel-title">{{course.name}}</h3> | ||
281 | - </div> | ||
282 | - <div class="col-md-3"> | ||
283 | - <span class="label label-info">{{ course.category }}</span> | ||
284 | - <span class="label label-warning">{{ course.max_students }} {% trans 'students tops' %}</span> | ||
285 | - </div> | ||
286 | - </div> | ||
287 | - </div> | ||
288 | - <div class="panel-body"> | ||
289 | - <p><b>Course Name: </b>{{ course.name }}</p> | ||
290 | - <p><b>Duration (in semesters): </b>09</p> | ||
291 | - <p><b>Coordinator: </b>{{course.professors}}</p> | ||
292 | - <p> | ||
293 | - <b>Description:</b> | ||
294 | - <i> | ||
295 | - {% if couse.description %} | ||
296 | - {{course.description|linebreaks}} | ||
297 | - {% else %} | ||
298 | - {% trans 'No description' %} | ||
299 | - {% endif %} | ||
300 | - </i> | ||
301 | - </p> | ||
302 | - | ||
303 | - <!--{% if user|has_role:'professor, system_admin' %} | ||
304 | - <a href="{% url 'course:update' course.slug %}" class="btn btn-sm btn-primary"> | ||
305 | - <span class="glyphicon glyphicon-edit"></span> | ||
306 | - </a> | ||
307 | - <a href="{% url 'course:delete' course.slug %}" class="btn btn-sm btn-danger"> | ||
308 | - <span class="glyphicon glyphicon-trash"></span> | ||
309 | - </a> | ||
310 | - {% endif %}--> | ||
311 | - | ||
312 | - <a href="{% url 'course:view' course.slug %}" class="btn btn-raised btn-default center-block">View Course</a> | ||
313 | - </div> | ||
314 | - </div> | ||
315 | - </div> | 212 | + </div> |
213 | + <div class="col-md-12"> | ||
214 | + <nav aria-label="Page navigation"> | ||
215 | + <ul class="pagination"> | ||
216 | + {% if page_obj.has_previous %} | ||
217 | + <li> | ||
218 | + <a href="?page={{ page_obj.previous_page_number }}"><span><<</span></a> | ||
219 | + </li> | ||
316 | {% endif %} | 220 | {% endif %} |
317 | - {% endfor %} | ||
318 | - {% endif %} | ||
319 | - | ||
320 | - <nav aria-label="Page navigation"> | ||
321 | - <ul class="pagination"> | ||
322 | - {% for page_number in paginator.page_range %} | ||
323 | - <li{% if page_obj.number == page_number %} class="active"{% endif %}> | ||
324 | - <a href="?page={{ page_number }}">{{ page_number }}</a> | ||
325 | - </li> | ||
326 | - {% endfor %} | ||
327 | - </ul> | 221 | + {% for page_number in paginator.page_range %} |
222 | + <li{% if page_obj.number == page_number %} class="active"{% endif %}> | ||
223 | + <a href="?page={{ page_number }}">{{ page_number }}</a> | ||
224 | + </li> | ||
225 | + {% endfor %} | ||
226 | + {% if page_obj.has_next %} | ||
227 | + <li> | ||
228 | + <a href="?page={{ page_obj.next_page_number }}"><span>>></span></a> | ||
229 | + </li> | ||
230 | + {% endif %} | ||
231 | + </ul> | ||
328 | </nav> | 232 | </nav> |
329 | - {% else %} | ||
330 | - {% trans 'No courses found' %} | ||
331 | - {% endif %} | ||
332 | -{% endif %} | ||
333 | - | 233 | + </div> |
334 | {% endblock %} | 234 | {% endblock %} |
courses/templates/course/view.html
@@ -55,19 +55,21 @@ | @@ -55,19 +55,21 @@ | ||
55 | <div class="col-xs-8 col-md-10 titleTopic"> | 55 | <div class="col-xs-8 col-md-10 titleTopic"> |
56 | <h4>{{course}}</h4> | 56 | <h4>{{course}}</h4> |
57 | </div> | 57 | </div> |
58 | - <div class="col-xs-4 col-md-2" id="divMoreActions"> | ||
59 | - <div class="btn-group"> | ||
60 | - <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
61 | - <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
62 | - <div class="ripple-container"></div></button> | ||
63 | - <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
64 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#createSubject"><i class="fa fa-plus-square-o" aria-hidden="true"></i> Create Subject</a></li> | ||
65 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
66 | - <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Edit</a></li> | ||
67 | - <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
68 | - </ul> | 58 | + {% if user|has_role:'professor, system_admin' %} |
59 | + <div class="col-xs-4 col-md-2" id="divMoreActions"> | ||
60 | + <div class="btn-group"> | ||
61 | + <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||
62 | + <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | ||
63 | + <div class="ripple-container"></div></button> | ||
64 | + <ul class="dropdown-menu" aria-labelledby="moreActions"> | ||
65 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#createSubject"><i class="fa fa-plus-square-o" aria-hidden="true"></i> Create Subject</a></li> | ||
66 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal4"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i> Replicate</a></li> | ||
67 | + <li><a href="{% url 'course:update' course.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> Edit</a></li> | ||
68 | + <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myModal2"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> Remove</a></li> | ||
69 | + </ul> | ||
70 | + </div> | ||
69 | </div> | 71 | </div> |
70 | - </div> | 72 | + {% endif %} |
71 | </div> | 73 | </div> |
72 | </div> | 74 | </div> |
73 | <div class="panel-body"> | 75 | <div class="panel-body"> |
courses/templates/subject/form_view_student.html
@@ -17,7 +17,8 @@ | @@ -17,7 +17,8 @@ | ||
17 | </div> | 17 | </div> |
18 | <div class="panel-body"> | 18 | <div class="panel-body"> |
19 | <p>{{topic.description|linebreaks}}</p> | 19 | <p>{{topic.description|linebreaks}}</p> |
20 | - {% list_topic_foruns request topic %} | 20 | + {% list_topic_foruns request topic %} |
21 | + {% list_topic_poll request topic %} | ||
21 | </div> | 22 | </div> |
22 | 23 | ||
23 | <div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | 24 | <div class="modal fade" id="forumModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
@@ -37,4 +38,4 @@ | @@ -37,4 +38,4 @@ | ||
37 | </div> | 38 | </div> |
38 | </div> | 39 | </div> |
39 | </div> | 40 | </div> |
40 | -</div> | ||
41 | \ No newline at end of file | 41 | \ No newline at end of file |
42 | +</div> |
courses/templates/subject/form_view_teacher.html
1 | -{% load static i18n list_topic_foruns %} | 1 | +{% load static i18n list_topic_foruns%} |
2 | 2 | ||
3 | {% block javascript %} | 3 | {% block javascript %} |
4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> | 4 | <script type="text/javascript" src="{% static 'js/forum.js' %}"></script> |
@@ -15,9 +15,11 @@ | @@ -15,9 +15,11 @@ | ||
15 | </div> | 15 | </div> |
16 | <div class="col-xs-3 col-md-2 divMoreActions"> | 16 | <div class="col-xs-3 col-md-2 divMoreActions"> |
17 | <div class="btn-group"> | 17 | <div class="btn-group"> |
18 | - <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible"> | 18 | + <a href="{% url 'course:view_topic' topic.slug %}"> |
19 | + <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible"> | ||
19 | <i class="fa fa-eye fa-2x" aria-hidden="true"></i> | 20 | <i class="fa fa-eye fa-2x" aria-hidden="true"></i> |
20 | - </button> | 21 | + </button> |
22 | + </a> | ||
21 | </div> | 23 | </div> |
22 | <div class="btn-group"> | 24 | <div class="btn-group"> |
23 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 25 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
@@ -54,6 +56,7 @@ | @@ -54,6 +56,7 @@ | ||
54 | <ul> | 56 | <ul> |
55 | <li><i class="material-icons">description</i> <a href="#" data-toggle="modal" data-target="#ActivityModal">Activitie 1</a></li> | 57 | <li><i class="material-icons">description</i> <a href="#" data-toggle="modal" data-target="#ActivityModal">Activitie 1</a></li> |
56 | <li><i class="material-icons">list</i> <a href="#" data-toggle="modal" data-target="#forumModal">Forum</a></li> | 58 | <li><i class="material-icons">list</i> <a href="#" data-toggle="modal" data-target="#forumModal">Forum</a></li> |
59 | + {% list_topic_poll request topic %} | ||
57 | </ul> | 60 | </ul> |
58 | 61 | ||
59 | 62 | ||
@@ -426,7 +429,7 @@ | @@ -426,7 +429,7 @@ | ||
426 | </div> | 429 | </div> |
427 | <div class="modal-body"> | 430 | <div class="modal-body"> |
428 | <form class="form-horizontal"> | 431 | <form class="form-horizontal"> |
429 | - | 432 | + |
430 | <fieldset> | 433 | <fieldset> |
431 | <legend>Atividade Proposta</legend> | 434 | <legend>Atividade Proposta</legend> |
432 | <div class="form-group is-empty"> | 435 | <div class="form-group is-empty"> |
@@ -660,4 +663,4 @@ | @@ -660,4 +663,4 @@ | ||
660 | </div> | 663 | </div> |
661 | </div> | 664 | </div> |
662 | </div> | 665 | </div> |
663 | -</div> | ||
664 | \ No newline at end of file | 666 | \ No newline at end of file |
667 | +</div> |
courses/templates/subject/index.html
@@ -36,16 +36,11 @@ | @@ -36,16 +36,11 @@ | ||
36 | <div class="panel panel-info"> | 36 | <div class="panel panel-info"> |
37 | <div class="panel-heading"> | 37 | <div class="panel-heading"> |
38 | <div class="row"> | 38 | <div class="row"> |
39 | - <div class="col-md-9 col-sm-7"> | 39 | + <div class="col-md-9 col-sm-9"> |
40 | <h3>{{subject}}</h3> | 40 | <h3>{{subject}}</h3> |
41 | </div> | 41 | </div> |
42 | - <div class="col-xs-4 col-md-3 divMoreActions"> | ||
43 | - <div class="btn-group"> | ||
44 | - <button type="button" class="btn btn-default btn-sm eye" data-toggle="tooltip" data-placement="bottom" title="Visible"> | ||
45 | - <i class="fa fa-eye fa-2x" aria-hidden="true"></i> | ||
46 | - </button> | ||
47 | - </div> | ||
48 | - {% if user|has_role:'system_admin' or user in subject.professors %} | 42 | + {% if user|has_role:'system_admin' or user in subject.professors %} |
43 | + <div class="col-xs-4 col-md-3 divMoreActions"> | ||
49 | <div class="btn-group"> | 44 | <div class="btn-group"> |
50 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 45 | <button class="btn btn-default btn-sm dropdown-toggle" type="button" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
51 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> | 46 | <i class="fa fa-ellipsis-v fa-2x" aria-hidden="true"></i> |
@@ -56,8 +51,8 @@ | @@ -56,8 +51,8 @@ | ||
56 | <li><a href="{% url 'course:delete_subject' subject.slug %}" data-toggle="modal" data-target="#removeSubject"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans "Remove" %}</a></li> | 51 | <li><a href="{% url 'course:delete_subject' subject.slug %}" data-toggle="modal" data-target="#removeSubject"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans "Remove" %}</a></li> |
57 | </ul> | 52 | </ul> |
58 | </div> | 53 | </div> |
59 | - {% endif %} | ||
60 | - </div> | 54 | + </div> |
55 | + {% endif %} | ||
61 | </div> | 56 | </div> |
62 | </div> | 57 | </div> |
63 | <div class="panel-body"> | 58 | <div class="panel-body"> |
@@ -0,0 +1,18 @@ | @@ -0,0 +1,18 @@ | ||
1 | +{% load static i18n permission_tags%} | ||
2 | + | ||
3 | +<script src="{% static 'js/modals_requisitions.js'%}"></script> | ||
4 | +<script src="{% static 'js/modal_poll.js'%}"></script> | ||
5 | + | ||
6 | +{% if request.user|has_role:'professor, system_admin'%} | ||
7 | +{% for poll in polls %} | ||
8 | + <li id="poll_{{poll.slug}}"><i class="material-icons">poll</i> <a href="javascript:get('{% url 'course:poll:update_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a><a href="javascript:get('{% url 'course:poll:delete_poll' poll.slug %}','#poll','#modal_poll');"><span class="glyphicon glyphicon-remove"></span></a></li> | ||
9 | +{% endfor %} | ||
10 | +<button class="btn btn-primary btn-raised" onclick="javascript:get('{% url 'course:poll:create_poll' topic.slug%}','#poll','#modal_poll');">{% trans '+ Create Poll' %}</button> | ||
11 | +{% else %} | ||
12 | +{% for poll in polls %} | ||
13 | + <li id="poll_{{poll.slug}}"><i class="material-icons">poll</i> <a href="javascript:get('{% url 'course:poll:view_poll' poll.slug %}','#poll','#modal_poll');">{{ poll.name }}</a></li> | ||
14 | +{% endfor %} | ||
15 | +{% endif %} | ||
16 | +<div class="row" id="modal_poll"> | ||
17 | + | ||
18 | +</div> |
courses/templates/topic/index.html
@@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
12 | {% else %} | 12 | {% else %} |
13 | <li class="active">{{ topic.name }}</li> | 13 | <li class="active">{{ topic.name }}</li> |
14 | {% endif %} | 14 | {% endif %} |
15 | - | 15 | + |
16 | </ol> | 16 | </ol> |
17 | {% endblock %} | 17 | {% endblock %} |
18 | 18 | ||
@@ -103,7 +103,7 @@ | @@ -103,7 +103,7 @@ | ||
103 | <div class="panel-body"> | 103 | <div class="panel-body"> |
104 | <div class="row"> | 104 | <div class="row"> |
105 | <div class="col-md-4"> | 105 | <div class="col-md-4"> |
106 | - <i class="fa fa-file-archive-o fa-lg" aria-hidden="true">Atividade.doc</i> | 106 | + <i class="fa fa-file-archive-o fa-lg" aria-hidden="true">Atividade.doc</i> |
107 | </div> | 107 | </div> |
108 | {% if user|has_role:'professor, system_admin' %} | 108 | {% if user|has_role:'professor, system_admin' %} |
109 | <div class="col-md-4"> | 109 | <div class="col-md-4"> |
courses/templatetags/list_topic_foruns.py
1 | from django import template | 1 | from django import template |
2 | 2 | ||
3 | from forum.models import Forum | 3 | from forum.models import Forum |
4 | - | 4 | +from poll.models import Poll |
5 | register = template.Library() | 5 | register = template.Library() |
6 | 6 | ||
7 | """ | 7 | """ |
@@ -16,4 +16,15 @@ def list_topic_foruns(request, topic): | @@ -16,4 +16,15 @@ def list_topic_foruns(request, topic): | ||
16 | 16 | ||
17 | context['foruns'] = Forum.objects.filter(topic = topic) | 17 | context['foruns'] = Forum.objects.filter(topic = topic) |
18 | 18 | ||
19 | - return context | ||
20 | \ No newline at end of file | 19 | \ No newline at end of file |
20 | + return context | ||
21 | + | ||
22 | +@register.inclusion_tag('subject/poll_item_actions.html') | ||
23 | +def list_topic_poll(request, topic): | ||
24 | + context = { | ||
25 | + 'request': request, | ||
26 | + } | ||
27 | + | ||
28 | + context['polls'] = Poll.objects.filter(topic = topic) | ||
29 | + context['topic'] = topic | ||
30 | + | ||
31 | + return context |
courses/urls.py
1 | from django.conf.urls import url, include | 1 | from django.conf.urls import url, include |
2 | 2 | ||
3 | from . import views | 3 | from . import views |
4 | +from links import views as linkviews | ||
4 | urlpatterns = [ | 5 | urlpatterns = [ |
5 | url(r'^$', views.IndexView.as_view(), name='manage'), | 6 | url(r'^$', views.IndexView.as_view(), name='manage'), |
6 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), | 7 | url(r'^create/$', views.CreateCourseView.as_view(), name='create'), |
@@ -19,9 +20,10 @@ urlpatterns = [ | @@ -19,9 +20,10 @@ urlpatterns = [ | ||
19 | url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), | 20 | url(r'^subjects/delete/(?P<slug>[\w_-]+)/$', views.DeleteSubjectView.as_view(), name='delete_subject'), |
20 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), | 21 | url(r'^topics/create/(?P<slug>[\w_-]+)/$', views.CreateTopicView.as_view(), name='create_topic'), |
21 | url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), | 22 | url(r'^topics/update/(?P<slug>[\w_-]+)/$', views.UpdateTopicView.as_view(), name='update_topic'), |
23 | + url(r'^topics/createlink/$', linkviews.CreateLink.as_view(),name = 'create_link'), | ||
24 | + url(r'^topics/deletelink/(?P<linkname>[\w_-]+)/$', linkviews.deleteLink,name = 'delete_link'), | ||
22 | url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), | 25 | url(r'^topics/(?P<slug>[\w_-]+)/$', views.TopicsView.as_view(), name='view_topic'), |
23 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), | 26 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
24 | - url(r'^topics/update/(?P<slug>[\w_-]+)/createlink/', include('links.urls',namespace='links')), | ||
25 | url(r'^forum/', include('forum.urls', namespace = 'forum')), | 27 | url(r'^forum/', include('forum.urls', namespace = 'forum')), |
26 | url(r'^poll/', include('poll.urls', namespace = 'poll')), | 28 | url(r'^poll/', include('poll.urls', namespace = 'poll')), |
27 | 29 |
courses/views.py
@@ -2,7 +2,7 @@ from django.shortcuts import render, get_object_or_404, redirect | @@ -2,7 +2,7 @@ from django.shortcuts import render, get_object_or_404, redirect | ||
2 | from django.views import generic | 2 | from django.views import generic |
3 | from django.contrib import messages | 3 | from django.contrib import messages |
4 | from django.contrib.auth.decorators import login_required | 4 | from django.contrib.auth.decorators import login_required |
5 | -from django.core.paginator import Paginator, EmptyPage | 5 | +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger |
6 | from django.contrib.auth.mixins import LoginRequiredMixin | 6 | from django.contrib.auth.mixins import LoginRequiredMixin |
7 | from rolepermissions.mixins import HasRoleMixin | 7 | from rolepermissions.mixins import HasRoleMixin |
8 | from django.core.urlresolvers import reverse_lazy | 8 | from django.core.urlresolvers import reverse_lazy |
@@ -10,6 +10,7 @@ from django.utils.translation import ugettext_lazy as _ | @@ -10,6 +10,7 @@ from django.utils.translation import ugettext_lazy as _ | ||
10 | from rolepermissions.verifications import has_role | 10 | from rolepermissions.verifications import has_role |
11 | from django.db.models import Q | 11 | from django.db.models import Q |
12 | from rolepermissions.verifications import has_object_permission | 12 | from rolepermissions.verifications import has_object_permission |
13 | +from django.http import HttpResponseRedirect | ||
13 | 14 | ||
14 | from .forms import CourseForm, UpdateCourseForm, CategoryCourseForm, SubjectForm,TopicForm,ActivityForm | 15 | from .forms import CourseForm, UpdateCourseForm, CategoryCourseForm, SubjectForm,TopicForm,ActivityForm |
15 | from .models import Course, Subject, CourseCategory,Topic, SubjectCategory,Activity | 16 | from .models import Course, Subject, CourseCategory,Topic, SubjectCategory,Activity |
@@ -25,23 +26,41 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | @@ -25,23 +26,41 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): | ||
25 | queryset = Course.objects.all() | 26 | queryset = Course.objects.all() |
26 | template_name = 'course/index.html' | 27 | template_name = 'course/index.html' |
27 | context_object_name = 'courses' | 28 | context_object_name = 'courses' |
28 | - paginate_by = 3 | 29 | + paginate_by = 2 |
29 | 30 | ||
30 | def get_context_data(self, **kwargs): | 31 | def get_context_data(self, **kwargs): |
31 | context = super(IndexView, self).get_context_data(**kwargs) | 32 | context = super(IndexView, self).get_context_data(**kwargs) |
32 | - context['categories'] = CourseCategory.objects.all() | ||
33 | - context['courses_teacher'] = Course.objects.filter(professors__name = self.request.user.name) | ||
34 | - context['courses_student'] = Course.objects.filter(students__name = self.request.user.name) | ||
35 | - context['categorys_courses'] = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() | ||
36 | - context['categorys_courses_professor'] = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct() | 33 | + list_courses = None |
34 | + categorys_courses = None | ||
35 | + if has_role(self.request.user,'professor') or has_role(self.request.user,'system_admin'): | ||
36 | + list_courses = Course.objects.filter(professors__name = self.request.user.name) | ||
37 | + categorys_courses = CourseCategory.objects.filter(course_category__professors__name = self.request.user.name).distinct() | ||
38 | + else: | ||
39 | + list_courses = Course.objects.filter(students__name = self.request.user.name) | ||
40 | + categorys_courses = CourseCategory.objects.filter(course_category__students__name = self.request.user.name).distinct() | ||
41 | + | ||
37 | courses_category = Course.objects.filter(category__name = self.request.GET.get('category')) | 42 | courses_category = Course.objects.filter(category__name = self.request.GET.get('category')) |
38 | - context['courses_category'] = courses_category | 43 | + |
39 | none = None | 44 | none = None |
40 | q = self.request.GET.get('category', None) | 45 | q = self.request.GET.get('category', None) |
41 | if q is None: | 46 | if q is None: |
42 | none = True | 47 | none = True |
43 | context['none'] = none | 48 | context['none'] = none |
44 | 49 | ||
50 | + paginator = Paginator(list_courses, self.paginate_by) | ||
51 | + page = self.request.GET.get('page') | ||
52 | + | ||
53 | + try: | ||
54 | + list_courses = paginator.page(page) | ||
55 | + except PageNotAnInteger: | ||
56 | + list_courses = paginator.page(1) | ||
57 | + except EmptyPage: | ||
58 | + list_courses = paginator.page(paginator.num_pages) | ||
59 | + | ||
60 | + context['courses_category'] = courses_category | ||
61 | + context['list_courses'] = list_courses | ||
62 | + context['categorys_courses'] = categorys_courses | ||
63 | + | ||
45 | return context | 64 | return context |
46 | 65 | ||
47 | class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): | 66 | class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): |
@@ -215,6 +234,10 @@ class CreateCatView(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | @@ -215,6 +234,10 @@ class CreateCatView(LoginRequiredMixin, HasRoleMixin, generic.edit.CreateView): | ||
215 | form_class = CategoryCourseForm | 234 | form_class = CategoryCourseForm |
216 | success_url = reverse_lazy('course:manage_cat') | 235 | success_url = reverse_lazy('course:manage_cat') |
217 | 236 | ||
237 | + def get_success_url(self): | ||
238 | + messages.success(self.request, _('Category created successfully!')) | ||
239 | + return reverse_lazy('course:manage_cat') | ||
240 | + | ||
218 | class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | 241 | class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): |
219 | 242 | ||
220 | allowed_roles = ['professor', 'system_admin'] | 243 | allowed_roles = ['professor', 'system_admin'] |
@@ -223,7 +246,10 @@ class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | @@ -223,7 +246,10 @@ class UpdateCatView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): | ||
223 | template_name = 'category/update.html' | 246 | template_name = 'category/update.html' |
224 | model = CourseCategory | 247 | model = CourseCategory |
225 | form_class = CategoryCourseForm | 248 | form_class = CategoryCourseForm |
226 | - success_url = reverse_lazy('course:manage_cat') | 249 | + |
250 | + def get_success_url(self): | ||
251 | + messages.success(self.request, _('Category updated successfully!')) | ||
252 | + return reverse_lazy('course:update_cat', kwargs={'slug' : self.object.slug}) | ||
227 | 253 | ||
228 | class ViewCat(LoginRequiredMixin, generic.DetailView): | 254 | class ViewCat(LoginRequiredMixin, generic.DetailView): |
229 | login_url = reverse_lazy("core:home") | 255 | login_url = reverse_lazy("core:home") |
@@ -239,12 +265,10 @@ class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | @@ -239,12 +265,10 @@ class DeleteCatView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | ||
239 | redirect_field_name = 'next' | 265 | redirect_field_name = 'next' |
240 | model = CourseCategory | 266 | model = CourseCategory |
241 | template_name = 'category/delete.html' | 267 | template_name = 'category/delete.html' |
242 | - success_url = reverse_lazy('course:manage_cat') | ||
243 | 268 | ||
244 | - def render_to_response(self, context, **response_kwargs): | 269 | + def get_success_url(self): |
245 | messages.success(self.request, _('Category deleted successfully!')) | 270 | messages.success(self.request, _('Category deleted successfully!')) |
246 | - | ||
247 | - return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine) | 271 | + return reverse_lazy('course:manage_cat') |
248 | 272 | ||
249 | class SubjectsView(LoginRequiredMixin, generic.ListView): | 273 | class SubjectsView(LoginRequiredMixin, generic.ListView): |
250 | 274 |
@@ -0,0 +1,25 @@ | @@ -0,0 +1,25 @@ | ||
1 | +from django.db import models | ||
2 | +from django.utils.translation import ugettext_lazy as _ | ||
3 | + | ||
4 | +from courses.models import Activity | ||
5 | + | ||
6 | +""" | ||
7 | + Function to return the path where the file should be saved | ||
8 | +""" | ||
9 | +def file_path(instance, filename): | ||
10 | + return '/'.join([instance.topic.subject.course.slug, instance.topic.subject.slug, instance.topic.slug, filename]) | ||
11 | + | ||
12 | + | ||
13 | +""" | ||
14 | + It's one kind of activity available for a Topic. | ||
15 | + It's like a support material for the students. | ||
16 | +""" | ||
17 | +class TopicFiles(Activity): | ||
18 | + file_url = models.FileField(verbose_name = _("File"), upload_to = file_path) | ||
19 | + | ||
20 | + class Meta: | ||
21 | + verbose_name = _("File") | ||
22 | + verbose_name_plural = _("Files") | ||
23 | + | ||
24 | + def __str__(self): | ||
25 | + return self.name | ||
0 | \ No newline at end of file | 26 | \ No newline at end of file |
forum/static/js/forum.js
@@ -46,7 +46,7 @@ $(document).ready(function (){ | @@ -46,7 +46,7 @@ $(document).ready(function (){ | ||
46 | 46 | ||
47 | /* | 47 | /* |
48 | * | 48 | * |
49 | -* Function to load create forum's form and set the submit function | 49 | +* Function to load create forum's form |
50 | * | 50 | * |
51 | */ | 51 | */ |
52 | function createForum(url, topic) { | 52 | function createForum(url, topic) { |
@@ -57,35 +57,45 @@ function createForum(url, topic) { | @@ -57,35 +57,45 @@ function createForum(url, topic) { | ||
57 | $(".forum_form").html(data); | 57 | $(".forum_form").html(data); |
58 | $("#id_topic").val(topic); | 58 | $("#id_topic").val(topic); |
59 | 59 | ||
60 | - $('.date-picker').datepicker({ | ||
61 | - format: 'dd/mm/yyyy', | ||
62 | - }); | 60 | + setForumCreateFormSubmit(); |
61 | + } | ||
62 | + }); | ||
63 | 63 | ||
64 | - var frm = $('#forum_create'); | ||
65 | - frm.submit(function () { | ||
66 | - $.ajax({ | ||
67 | - type: frm.attr('method'), | ||
68 | - url: frm.attr('action'), | ||
69 | - data: frm.serialize(), | ||
70 | - success: function (data) { | ||
71 | - data = data.split('-'); | 64 | + $("#createForum").modal(); |
65 | +} | ||
72 | 66 | ||
73 | - $('.foruns_list').append("<a id='forum_"+data[1]+"' href='"+data[0]+"'>"+data[2]+"<br /></a>"); | 67 | +/* |
68 | +* | ||
69 | +* Function to set the forum's create form submit function | ||
70 | +* | ||
71 | +*/ | ||
72 | +function setForumCreateFormSubmit() { | ||
73 | + $('.date-picker').datepicker({ | ||
74 | + format: 'dd/mm/yyyy', | ||
75 | + }); | ||
74 | 76 | ||
75 | - $("#createForum").modal('hide'); | 77 | + var frm = $('#forum_create'); |
78 | + frm.submit(function () { | ||
79 | + $.ajax({ | ||
80 | + type: frm.attr('method'), | ||
81 | + url: frm.attr('action'), | ||
82 | + data: frm.serialize(), | ||
83 | + success: function (data) { | ||
84 | + data = data.split('-'); | ||
76 | 85 | ||
77 | - showForum(data[0], data[1]); | ||
78 | - }, | ||
79 | - error: function(data) { | ||
80 | - $(".forum_form").html(data.responseText); | ||
81 | - } | ||
82 | - }); | ||
83 | - return false; | ||
84 | - }); | ||
85 | - } | ||
86 | - }); | 86 | + $('.foruns_list').append("<a id='forum_"+data[1]+"' href='"+data[0]+"'>"+data[2]+"<br /></a>"); |
87 | 87 | ||
88 | - $("#createForum").modal(); | 88 | + $("#createForum").modal('hide'); |
89 | + | ||
90 | + showForum(data[0], data[1]); | ||
91 | + }, | ||
92 | + error: function(data) { | ||
93 | + $(".forum_form").html(data.responseText); | ||
94 | + setForumCreateFormSubmit(); | ||
95 | + } | ||
96 | + }); | ||
97 | + return false; | ||
98 | + }); | ||
89 | } | 99 | } |
90 | 100 | ||
91 | /* | 101 | /* |
@@ -100,29 +110,7 @@ function editForum(url, forum, success_message) { | @@ -100,29 +110,7 @@ function editForum(url, forum, success_message) { | ||
100 | success: function(data) { | 110 | success: function(data) { |
101 | $(".forum_form").html(data); | 111 | $(".forum_form").html(data); |
102 | 112 | ||
103 | - $('.date-picker').datepicker({ | ||
104 | - format: 'dd/mm/yyyy', | ||
105 | - }); | ||
106 | - | ||
107 | - var frm = $('#forum_create'); | ||
108 | - frm.submit(function () { | ||
109 | - $.ajax({ | ||
110 | - type: frm.attr('method'), | ||
111 | - url: frm.attr('action'), | ||
112 | - data: frm.serialize(), | ||
113 | - success: function (data) { | ||
114 | - $('.forum_view').html(data); | ||
115 | - | ||
116 | - alertify.success(success_message); | ||
117 | - | ||
118 | - $("#editForum").modal('hide'); | ||
119 | - }, | ||
120 | - error: function(data) { | ||
121 | - $(".forum_form").html(data.responseText); | ||
122 | - } | ||
123 | - }); | ||
124 | - return false; | ||
125 | - }); | 113 | + setForumUpdateFormSubmit(success_message); |
126 | } | 114 | } |
127 | }); | 115 | }); |
128 | 116 | ||
@@ -131,6 +119,39 @@ function editForum(url, forum, success_message) { | @@ -131,6 +119,39 @@ function editForum(url, forum, success_message) { | ||
131 | 119 | ||
132 | /* | 120 | /* |
133 | * | 121 | * |
122 | +* Function to set the forum's update form submit function | ||
123 | +* | ||
124 | +*/ | ||
125 | +function setForumUpdateFormSubmit(success_message) { | ||
126 | + $('.date-picker').datepicker({ | ||
127 | + format: 'dd/mm/yyyy', | ||
128 | + }); | ||
129 | + | ||
130 | + var frm = $('#forum_create'); | ||
131 | + frm.submit(function () { | ||
132 | + $.ajax({ | ||
133 | + type: frm.attr('method'), | ||
134 | + url: frm.attr('action'), | ||
135 | + data: frm.serialize(), | ||
136 | + success: function (data) { | ||
137 | + $('.forum_view').html(data); | ||
138 | + | ||
139 | + alertify.success(success_message); | ||
140 | + | ||
141 | + $("#editForum").modal('hide'); | ||
142 | + }, | ||
143 | + error: function(data) { | ||
144 | + $(".forum_form").html(data.responseText); | ||
145 | + | ||
146 | + setForumUpdateFormSubmit(success_message); | ||
147 | + } | ||
148 | + }); | ||
149 | + return false; | ||
150 | + }); | ||
151 | +} | ||
152 | + | ||
153 | +/* | ||
154 | +* | ||
134 | * Function to delete a forum | 155 | * Function to delete a forum |
135 | * | 156 | * |
136 | */ | 157 | */ |
forum/templates/forum/forum_view.html
@@ -50,7 +50,7 @@ | @@ -50,7 +50,7 @@ | ||
50 | {% endblock %} | 50 | {% endblock %} |
51 | 51 | ||
52 | {% block content %} | 52 | {% block content %} |
53 | - <div class="row panel panel-default"> | 53 | + <div class="panel panel-default"> |
54 | <div class="panel-body"> | 54 | <div class="panel-body"> |
55 | <div class="comments-list"> | 55 | <div class="comments-list"> |
56 | <div class="section-heading forum_view"> | 56 | <div class="section-heading forum_view"> |
forum/templates/post/post_list.html
@@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
16 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 16 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
17 | <i class="material-icons">more_horiz</i> | 17 | <i class="material-icons">more_horiz</i> |
18 | </a> | 18 | </a> |
19 | - <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 19 | + <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> |
20 | <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | 20 | <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
21 | <li><a href="javascript:javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 21 | <li><a href="javascript:javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
22 | </ul> | 22 | </ul> |
forum/templates/post/post_render.html
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 14 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
15 | <i class="material-icons">more_horiz</i> | 15 | <i class="material-icons">more_horiz</i> |
16 | </a> | 16 | </a> |
17 | - <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 17 | + <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> |
18 | <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"></li> | 18 | <li><a href="javascript:edit_post('{% url 'course:forum:update_post' post.id %}', '{{ post.id }}', '{% trans 'Post edited successfully!' %}')"></li> |
19 | <li><a href="javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 19 | <li><a href="javascript:delete_post('{% url 'course:forum:delete_post' post.id %}', '{{ post.id }}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
20 | </ul> | 20 | </ul> |
forum/templates/post_answers/post_answer_list.html
@@ -13,7 +13,7 @@ | @@ -13,7 +13,7 @@ | ||
13 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 13 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
14 | <i class="material-icons">more_horiz</i> | 14 | <i class="material-icons">more_horiz</i> |
15 | </a> | 15 | </a> |
16 | - <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 16 | + <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> |
17 | <li><a href="javascript:edit_post_answer('{% url 'course:forum:update_post_answer' answer.id %}', '{{ answer.id }}', '{% trans 'Answer edited sucessfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | 17 | <li><a href="javascript:edit_post_answer('{% url 'course:forum:update_post_answer' answer.id %}', '{{ answer.id }}', '{% trans 'Answer edited sucessfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
18 | <li><a href="javascript:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 18 | <li><a href="javascript:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
19 | </ul> | 19 | </ul> |
forum/templates/post_answers/post_answer_render.html
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 11 | <a class="btn btn-default btn-xs dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
12 | <i class="material-icons">more_horiz</i> | 12 | <i class="material-icons">more_horiz</i> |
13 | </a> | 13 | </a> |
14 | - <ul class="dropdown-menu" aria-labelledby="dropdownMenu1"> | 14 | + <ul class="dropdown-menu pull-right" aria-labelledby="dropdownMenu1"> |
15 | <li><a href="javascript:edit_post_answer('{% url 'course:forum:update_post_answer' answer.id %}', '{{ answer.id }}', '{% trans 'Answer edited sucessfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> | 15 | <li><a href="javascript:edit_post_answer('{% url 'course:forum:update_post_answer' answer.id %}', '{{ answer.id }}', '{% trans 'Answer edited sucessfully!' %}')"><i class="material-icons">create</i> {% trans 'Edit' %}</a></li> |
16 | <li><a href="javascript:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> | 16 | <li><a href="javascript:delete_answer('{% url 'course:forum:delete_answer' answer.id %}', '{{ answer.id }}', '{% trans "Are you sure you want to delete this answer?" %}')"><i class="material-icons">delete_sweep</i> {% trans 'Remove' %}</a></li> |
17 | </ul> | 17 | </ul> |
forum/tests/test_view_forum.py
@@ -4,10 +4,10 @@ from django.core.urlresolvers import reverse | @@ -4,10 +4,10 @@ from django.core.urlresolvers import reverse | ||
4 | from rolepermissions.shortcuts import assign_role | 4 | from rolepermissions.shortcuts import assign_role |
5 | 5 | ||
6 | from users.models import User | 6 | from users.models import User |
7 | -from courses.models import Category, Course, Subject, Topic | 7 | +from courses.models import CourseCategory, Course, Subject, Topic |
8 | from forum.models import Forum | 8 | from forum.models import Forum |
9 | 9 | ||
10 | -class ForumDetailViewTestCase (TestCase): | 10 | +class ForumViewTestCase (TestCase): |
11 | 11 | ||
12 | def setUp(self): | 12 | def setUp(self): |
13 | self.client = Client() | 13 | self.client = Client() |
@@ -21,7 +21,7 @@ class ForumDetailViewTestCase (TestCase): | @@ -21,7 +21,7 @@ class ForumDetailViewTestCase (TestCase): | ||
21 | ) | 21 | ) |
22 | assign_role(self.user, 'system_admin') | 22 | assign_role(self.user, 'system_admin') |
23 | 23 | ||
24 | - self.category = Category.objects.create( | 24 | + self.category = CourseCategory.objects.create( |
25 | name = 'Category test', | 25 | name = 'Category test', |
26 | slug = 'category_test' | 26 | slug = 'category_test' |
27 | ) | 27 | ) |
@@ -69,22 +69,78 @@ class ForumDetailViewTestCase (TestCase): | @@ -69,22 +69,78 @@ class ForumDetailViewTestCase (TestCase): | ||
69 | ) | 69 | ) |
70 | self.forum.save() | 70 | self.forum.save() |
71 | 71 | ||
72 | - self.url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) | ||
73 | - | ||
74 | - def test_view_ok (self): | 72 | + |
75 | self.client.login(username='test', password='testing') | 73 | self.client.login(username='test', password='testing') |
74 | + self.index_url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) | ||
75 | + self.create_url = reverse('course:forum:create') | ||
76 | + self.update_url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) | ||
77 | + | ||
78 | +######################### ForumDetailView ######################### | ||
76 | 79 | ||
77 | - response = self.client.get(self.url) | 80 | + def test_ForumDetail_view_ok (self): |
81 | + response = self.client.get(self.index_url) | ||
78 | self.assertEquals(response.status_code, 200) | 82 | self.assertEquals(response.status_code, 200) |
79 | self.assertTemplateUsed(response, 'forum/forum_view.html') | 83 | self.assertTemplateUsed(response, 'forum/forum_view.html') |
80 | 84 | ||
81 | - def test_context(self): | ||
82 | - self.client.login(username='test', password='testing') | 85 | + def test_ForumDetail_context(self): |
86 | + response = self.client.get(self.index_url) | ||
87 | + self.assertTrue('forum' in response.context) | ||
83 | 88 | ||
84 | - response = self.client.get(self.url) | 89 | +######################### CreateForumView ######################### |
90 | + | ||
91 | + def test_CreateForum_view_ok (self): | ||
92 | + response = self.client.get(self.create_url) | ||
93 | + self.assertEquals(response.status_code, 200) | ||
94 | + self.assertTemplateUsed(response, 'forum/forum_form.html') | ||
85 | 95 | ||
96 | + def test_CreateForum_context(self): | ||
97 | + response = self.client.get(self.create_url) | ||
86 | self.assertTrue('form' in response.context) | 98 | self.assertTrue('form' in response.context) |
87 | - self.assertTrue('forum' in response.context) | ||
88 | - self.assertTrue('title' in response.context) | ||
89 | 99 | ||
100 | + def test_CreateForum_form_error (self): | ||
101 | + data = {'name':'', 'limit_date': '', 'description':'', 'topic':''} | ||
102 | + response = self.client.post(self.create_url, data) | ||
103 | + self.assertEquals (response.status_code, 400) | ||
104 | + | ||
105 | + def test_CreateForum_form_ok (self): | ||
106 | + data = { | ||
107 | + 'name':'Forum Test2', | ||
108 | + 'limit_date': '2017-10-05', | ||
109 | + 'description':'Test', | ||
110 | + 'topic':str(self.topic.id) | ||
111 | + } | ||
112 | + | ||
113 | + response = self.client.post(self.create_url, data) | ||
114 | + self.assertEquals (response.status_code, 302) | ||
115 | + | ||
116 | + forum = Forum.objects.get(name='Forum Test2') | ||
117 | + | ||
118 | +######################### UpdateForumView ######################### | ||
119 | + | ||
120 | + def test_UpdateForum_view_ok (self): | ||
121 | + response = self.client.get(self.update_url) | ||
122 | + self.assertEquals(response.status_code, 200) | ||
123 | + self.assertTemplateUsed(response, 'forum/forum_form.html') | ||
124 | + | ||
125 | + def test_UpdateForum_context(self): | ||
126 | + response = self.client.get(self.update_url) | ||
127 | + self.assertTrue('form' in response.context) | ||
128 | + | ||
129 | + def test_UpdateForum_form_error (self): | ||
130 | + data = {'name':'', 'limit_date': '', 'description':''} | ||
131 | + | ||
132 | + response = self.client.post(self.update_url, data) | ||
133 | + self.assertEquals (response.status_code, 400) | ||
134 | + | ||
135 | + def test_UpdateForum_form_ok (self): | ||
136 | + data = { | ||
137 | + 'name':'Forum Updated', | ||
138 | + 'limit_date': '2017-10-05', | ||
139 | + 'description':'Test', | ||
140 | + 'topic':str(self.topic.id) | ||
141 | + } | ||
142 | + | ||
143 | + response = self.client.post(self.update_url, data) | ||
144 | + self.assertEquals (response.status_code, 302) | ||
90 | 145 | ||
146 | + forum = Forum.objects.get(name='Forum Updated') | ||
91 | \ No newline at end of file | 147 | \ No newline at end of file |
forum/views.py
@@ -44,7 +44,10 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | @@ -44,7 +44,10 @@ class CreateForumView(LoginRequiredMixin, generic.edit.CreateView): | ||
44 | form_class = ForumForm | 44 | form_class = ForumForm |
45 | 45 | ||
46 | def form_invalid(self, form): | 46 | def form_invalid(self, form): |
47 | - return self.render_to_response(self.get_context_data(form = form), status = 400) | 47 | + context = super(CreateForumView, self).form_invalid(form) |
48 | + context.status_code = 400 | ||
49 | + | ||
50 | + return context | ||
48 | 51 | ||
49 | def get_success_url(self): | 52 | def get_success_url(self): |
50 | self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) | 53 | self.success_url = reverse('course:forum:render_forum', args = (self.object.id, )) |
links/tests.py
@@ -21,14 +21,28 @@ class LinkTestCase(TestCase): | @@ -21,14 +21,28 @@ class LinkTestCase(TestCase): | ||
21 | self.client.login(username='user', password = 'testing') | 21 | self.client.login(username='user', password = 'testing') |
22 | links = Link.objects.all().count() | 22 | links = Link.objects.all().count() |
23 | self.assertEqual(Link.objects.all().count(),links) #Before creating the link | 23 | self.assertEqual(Link.objects.all().count(),links) #Before creating the link |
24 | - self.link = Link.objects.create( | ||
25 | - name = 'testinglink', | ||
26 | - description = 'testdescription', | ||
27 | - link = 'teste' | ||
28 | - ) | 24 | + url = reverse('course:create_link') |
25 | + data = { | ||
26 | + 'name' : 'testinglink', | ||
27 | + "description" : 'testdescription', | ||
28 | + "link" : 'teste.com' | ||
29 | + } | ||
30 | + response = self.client.post(url, data) | ||
29 | self.assertEqual(Link.objects.all().count(),links+1) #After creating one link, if OK, the link was created successfully. | 31 | self.assertEqual(Link.objects.all().count(),links+1) #After creating one link, if OK, the link was created successfully. |
32 | + self.assertEqual(response.status_code, 200) | ||
30 | self.assertTemplateUsed(template_name = 'links/link_modal.html') | 33 | self.assertTemplateUsed(template_name = 'links/link_modal.html') |
31 | # def test_update_link(): | 34 | # def test_update_link(): |
32 | # pass | 35 | # pass |
33 | - # def test_delete_link(): | ||
34 | - # pass | 36 | + def test_delete_link(self): |
37 | + self.link = Link.objects.create( | ||
38 | + name = 'testinglink', | ||
39 | + description = 'testdescription', | ||
40 | + link = 'teste.com' | ||
41 | + ) | ||
42 | + self.client.login(username='user', password = 'testing') | ||
43 | + links = Link.objects.all().count() | ||
44 | + url = reverse('course:delete_link',kwargs={'linkname': self.link.name}) | ||
45 | + self.assertEqual(Link.objects.all().count(),links) | ||
46 | + response = self.client.get(url) | ||
47 | + self.assertEqual(Link.objects.all().count(),links - 1) | ||
48 | + self.assertEqual(response.status_code, 200) |
links/views.py
@@ -3,7 +3,7 @@ from django.views import generic | @@ -3,7 +3,7 @@ from django.views import generic | ||
3 | from django.core.urlresolvers import reverse_lazy | 3 | from django.core.urlresolvers import reverse_lazy |
4 | from django.contrib import messages | 4 | from django.contrib import messages |
5 | from django.utils.translation import ugettext_lazy as _ | 5 | from django.utils.translation import ugettext_lazy as _ |
6 | - | 6 | +from django.shortcuts import get_object_or_404,redirect |
7 | 7 | ||
8 | from .models import Link | 8 | from .models import Link |
9 | from .forms import * | 9 | from .forms import * |
@@ -25,8 +25,11 @@ class CreateLink(generic.CreateView): | @@ -25,8 +25,11 @@ class CreateLink(generic.CreateView): | ||
25 | return context | 25 | return context |
26 | 26 | ||
27 | 27 | ||
28 | -class DeleteLink(generic.DeleteView): | ||
29 | - pass | 28 | +def deleteLink(request,linkname): |
29 | + link = get_object_or_404(Link,name = linkname) | ||
30 | + link.delete() | ||
31 | + messages.success(request,_("Link deleted Successfully!")) | ||
32 | + return redirect('course:update_topic') | ||
30 | class UpdateLink(generic.UpdateView): | 33 | class UpdateLink(generic.UpdateView): |
31 | template_name = 'links/' | 34 | template_name = 'links/' |
32 | form_class = UpdateLinkForm | 35 | form_class = UpdateLinkForm |
poll/admin.py
1 | from django.contrib import admin | 1 | from django.contrib import admin |
2 | 2 | ||
3 | -from .models import Poll, Answer | 3 | +from .models import Poll, Answer, AnswersStudent |
4 | 4 | ||
5 | class PollAdmin(admin.ModelAdmin): | 5 | class PollAdmin(admin.ModelAdmin): |
6 | list_display = ['name', 'slug','limit_date'] | 6 | list_display = ['name', 'slug','limit_date'] |
@@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | ||
10 | list_display = ['answer','order'] | 10 | list_display = ['answer','order'] |
11 | search_fields = ['answer'] | 11 | search_fields = ['answer'] |
12 | 12 | ||
13 | +class AnswersStudentAdmin(admin.ModelAdmin): | ||
14 | + list_display = ['student','poll','answered_in'] | ||
15 | + search_fields = ['student','poll'] | ||
16 | + | ||
13 | admin.site.register(Poll, PollAdmin) | 17 | admin.site.register(Poll, PollAdmin) |
14 | admin.site.register(Answer, AnswerAdmin) | 18 | admin.site.register(Answer, AnswerAdmin) |
19 | +admin.site.register(AnswersStudent, AnswersStudentAdmin) |
@@ -0,0 +1,33 @@ | @@ -0,0 +1,33 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-12 18:26 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.conf import settings | ||
6 | +from django.db import migrations, models | ||
7 | +import django.db.models.deletion | ||
8 | + | ||
9 | + | ||
10 | +class Migration(migrations.Migration): | ||
11 | + | ||
12 | + dependencies = [ | ||
13 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
14 | + ('poll', '0001_initial'), | ||
15 | + ] | ||
16 | + | ||
17 | + operations = [ | ||
18 | + migrations.CreateModel( | ||
19 | + name='AnswersStudent', | ||
20 | + fields=[ | ||
21 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
22 | + ('status', models.BooleanField(default=False, verbose_name='Answered')), | ||
23 | + ('answered_in', models.DateTimeField(auto_now=True, verbose_name='Answered Date')), | ||
24 | + ('answer', models.ManyToManyField(related_name='answers_stundet', to='poll.Answer', verbose_name='Answers Students')), | ||
25 | + ('poll', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Answers')), | ||
26 | + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundent', to=settings.AUTH_USER_MODEL, verbose_name='Student')), | ||
27 | + ], | ||
28 | + options={ | ||
29 | + 'verbose_name': 'Answer Stundent', | ||
30 | + 'verbose_name_plural': 'Answers Student', | ||
31 | + }, | ||
32 | + ), | ||
33 | + ] |
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2016-10-12 19:38 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | +import django.db.models.deletion | ||
7 | + | ||
8 | + | ||
9 | +class Migration(migrations.Migration): | ||
10 | + | ||
11 | + dependencies = [ | ||
12 | + ('poll', '0002_answersstudent'), | ||
13 | + ] | ||
14 | + | ||
15 | + operations = [ | ||
16 | + migrations.AlterField( | ||
17 | + model_name='answersstudent', | ||
18 | + name='poll', | ||
19 | + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers_stundet', to='poll.Poll', verbose_name='Poll'), | ||
20 | + ), | ||
21 | + ] |
poll/models.py
@@ -27,3 +27,17 @@ class Answer(models.Model): | @@ -27,3 +27,17 @@ class Answer(models.Model): | ||
27 | 27 | ||
28 | def __str__(self): | 28 | def __str__(self): |
29 | return str(self.answer) + str("/") + str(self.poll) | 29 | return str(self.answer) + str("/") + str(self.poll) |
30 | + | ||
31 | +class AnswersStudent(models.Model): | ||
32 | + status = models.BooleanField(_("Answered"), default=False) | ||
33 | + poll = models.ForeignKey(Poll, verbose_name = _('Poll'), related_name='answers_stundet') | ||
34 | + answer = models.ManyToManyField(Answer,verbose_name = _('Answers Students'), related_name='answers_stundet') | ||
35 | + student = models.ForeignKey(User, verbose_name = _('Student'), related_name='answers_stundent') | ||
36 | + answered_in = models.DateTimeField(_("Answered Date"),auto_now=True) | ||
37 | + | ||
38 | + class Meta: | ||
39 | + verbose_name = _('Answer Stundent') | ||
40 | + verbose_name_plural = _('Answers Student') | ||
41 | + | ||
42 | + def __str__(self): | ||
43 | + return str(self.student) + str("/") + str(self.poll) |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +//controles do modal | ||
2 | +$(window).ready(function() { // utilizado para abrir o modal quando tiver tido algum erro no preenchimento do formulario | ||
3 | + if($('.not_submited').length){ | ||
4 | + $('#poll').modal('show'); | ||
5 | + } | ||
6 | +}); | ||
7 | +var Answer = { | ||
8 | + init: function(url) { // utilizado para adicionar um novo campo de resposta | ||
9 | + $.get(url, function(data){ | ||
10 | + $("#form").append(data); | ||
11 | + var cont = 1; | ||
12 | + $("#form div div div input").each(function(){ | ||
13 | + $(this).attr('name',cont++); | ||
14 | + }); | ||
15 | + }); | ||
16 | + } | ||
17 | +}; | ||
18 | + | ||
19 | +var Submite = { | ||
20 | + post: function(url,dados){ | ||
21 | + $('#poll').modal('hide'); | ||
22 | + $.post(url,dados, function(data){ | ||
23 | + }).fail(function(data){ | ||
24 | + $("div.modal-backdrop.fade.in").remove(); | ||
25 | + $("#modal_poll").empty(); | ||
26 | + $("#modal_poll").append(data.responseText); | ||
27 | + }); | ||
28 | + } | ||
29 | + , | ||
30 | + remove: function(url,dados, id_li_link){ | ||
31 | + $('#poll').modal('hide'); | ||
32 | + $.post(url,dados, function(data){ | ||
33 | + $(id_li_link).remove(); | ||
34 | + $("#modal_poll").empty(); | ||
35 | + $("div.modal-backdrop.fade.in").remove(); | ||
36 | + }).fail(function(){ | ||
37 | + $("#modal_poll").empty(); | ||
38 | + $("#modal_poll").append(data); | ||
39 | + $('#poll').modal('show'); | ||
40 | + }); | ||
41 | + } | ||
42 | +} |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +function get(url, id_modal, id_div_modal){ | ||
2 | + $.get(url, function(data){ | ||
3 | + if($(id_modal).length){ | ||
4 | + $(id_div_modal).empty(); | ||
5 | + $(id_div_modal).append(data); | ||
6 | + } else { | ||
7 | + $(id_div_modal).append(data); | ||
8 | + } | ||
9 | + $(id_modal).modal('show'); | ||
10 | + }); | ||
11 | +} | ||
12 | + | ||
13 | +// function remove(url, id_li_link){ | ||
14 | +// $.post(url, function(data){ | ||
15 | +// $(id_li_link).remove(); | ||
16 | +// }).fail(function(data){ | ||
17 | +// alert("Error ao excluir a enquete"); | ||
18 | +// alert(data); | ||
19 | +// }); | ||
20 | +// } |
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +//deve ser importado apenas depois do html | ||
2 | +$( "#form" ).sortable({ // utilizado para fazer a re-organização das respostas | ||
3 | + delay: 100, | ||
4 | + distance: 5, | ||
5 | + update: function( event, ui ) { | ||
6 | + var cont = 1; | ||
7 | + $("#form div div div input").each(function(){ | ||
8 | + $(this).attr('name',cont++); | ||
9 | + }); | ||
10 | + }, | ||
11 | +}); |
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | + | ||
2 | +{% load i18n %} | ||
3 | + | ||
4 | +<div class="row form-group"> | ||
5 | + <div class="col-md-1"> | ||
6 | + </br> | ||
7 | + <label><span class="glyphicon glyphicon-move"></span></label> | ||
8 | + </div> | ||
9 | + <div class="col-md-10"> | ||
10 | + <div class="has-success is-empty"> | ||
11 | + <input type="text" name="1" class="form-control" placeholder="{% trans 'Answer' %}"> | ||
12 | + <span class="help-block">{% trans "Possible answer for the question" %}</span> | ||
13 | + </div> | ||
14 | + </div> | ||
15 | + <div class="col-md-1"> | ||
16 | + </br> | ||
17 | + <label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label> | ||
18 | + </div> | ||
19 | +</div> |
@@ -0,0 +1,34 @@ | @@ -0,0 +1,34 @@ | ||
1 | +{% extends "poll/create.html" %} | ||
2 | + | ||
3 | +{% load i18n static dict_access %} | ||
4 | + | ||
5 | +{% block title_poll %} | ||
6 | +<!-- Put your title here!!! --> | ||
7 | +<h4 class="modal-title" id="myModalLabel">{{poll.name}}</h4> | ||
8 | +{% endblock title_poll %} | ||
9 | + | ||
10 | +{% block content_poll %} | ||
11 | +<form id="answer_form" class="" action="" method="post"> | ||
12 | + {% csrf_token %} | ||
13 | + {% for key in keys %} | ||
14 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> | ||
15 | + <div class="col-md-10 col-sm-10 col-xs-10 col-lg-10"> | ||
16 | + <div class="checkbox"> | ||
17 | + <label> | ||
18 | + <input type="checkbox" name="{{key}}"><span class="checkbox-material"><span class="check"></span></span> {{ answers|value:key }} | ||
19 | + </label> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | + </div> | ||
23 | + {% endfor %} | ||
24 | +</form> | ||
25 | +{% endblock content_poll %} | ||
26 | +{% block button_save %} | ||
27 | +<button type="submite" id="button" form="answer_form" class="btn btn-primary btn-raised">{% trans "Answer" %}</button> | ||
28 | +<script> | ||
29 | + $("#answer_form").submit(function(event) { | ||
30 | + Submite.post("{% url 'course:poll:answer_student_poll' poll.slug %}",$(this).serialize()); | ||
31 | + event.preventDefault(); | ||
32 | + }); | ||
33 | +</script> | ||
34 | +{% endblock button_save %} |
poll/templates/poll/create.html
1 | -{% extends "topic/index.html" %} | 1 | +{# {% extends "topic/index.html" %} #} |
2 | 2 | ||
3 | {% load i18n widget_tweaks dict_access static%} | 3 | {% load i18n widget_tweaks dict_access static%} |
4 | 4 | ||
5 | -{% block style %} | 5 | +{# {% block style %} #} |
6 | <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> | 6 | <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> |
7 | -{% endblock %} | 7 | + <script src="{% static 'js/modal_poll.js' %}"></script> |
8 | 8 | ||
9 | -{% block content %} | 9 | +{# {% endblock %} #} |
10 | + | ||
11 | +{# {% block content %} #} | ||
10 | <!-- Modal (remember to change the ids!!!) --> | 12 | <!-- Modal (remember to change the ids!!!) --> |
11 | <div class="modal fade" id="poll" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> | 13 | <div class="modal fade" id="poll" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> |
12 | <div class="modal-dialog" role="document"> | 14 | <div class="modal-dialog" role="document"> |
@@ -56,7 +58,7 @@ | @@ -56,7 +58,7 @@ | ||
56 | <form id="form" class="" action="" method="post"> | 58 | <form id="form" class="" action="" method="post"> |
57 | {% csrf_token %} | 59 | {% csrf_token %} |
58 | {% for key in keys %} | 60 | {% for key in keys %} |
59 | - <div class="row form-group"> | 61 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> |
60 | <div class="col-md-1"> | 62 | <div class="col-md-1"> |
61 | </br> | 63 | </br> |
62 | <label><span class="glyphicon glyphicon-move"></span></label> | 64 | <label><span class="glyphicon glyphicon-move"></span></label> |
@@ -73,7 +75,7 @@ | @@ -73,7 +75,7 @@ | ||
73 | </div> | 75 | </div> |
74 | </div> | 76 | </div> |
75 | {% empty %} | 77 | {% empty %} |
76 | - <div class="row form-group"> | 78 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> |
77 | <div class="col-md-1"> | 79 | <div class="col-md-1"> |
78 | </br> | 80 | </br> |
79 | <label><span class="glyphicon glyphicon-move"></span></label> | 81 | <label><span class="glyphicon glyphicon-move"></span></label> |
@@ -94,10 +96,10 @@ | @@ -94,10 +96,10 @@ | ||
94 | </br> | 96 | </br> |
95 | </div> | 97 | </div> |
96 | <button type="button" id="add" class="btn btn-primary btn-block btn-sm">add</button> | 98 | <button type="button" id="add" class="btn btn-primary btn-block btn-sm">add</button> |
97 | - <div class="row form-group"> | 99 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> |
98 | <label for="{{ form.limit_date.auto_id }}">{{ form.limit_date.label }}</label> | 100 | <label for="{{ form.limit_date.auto_id }}">{{ form.limit_date.label }}</label> |
99 | - {% render_field form.limit_date class="form-control" form="form"%} | ||
100 | - {# <input form="form" class="form-control" type="date" name="{{form.limit_date.name}}" {% if form.limit_date.value != None %}value="{% if form.limit_date.value.year %}{{form.limit_date.value|date:'Y-m-d'}}{% else %}{{form.limit_date.value}}{% endif %}"{% endif %}>#} | 101 | + {# {% render_field form.limit_date class="form-control" form="form"%} #} |
102 | + <input form="form" class="form-control" type="date" name="{{form.limit_date.name}}" {% if form.limit_date.value != None %}value="{% if form.limit_date.value.year %}{{form.limit_date.value|date:'Y-m-d'}}{% else %}{{form.limit_date.value}}{% endif %}"{% endif %}> | ||
101 | {% if form.limit_date.errors %} | 103 | {% if form.limit_date.errors %} |
102 | <div class="not_submited"> | 104 | <div class="not_submited"> |
103 | </br> | 105 | </br> |
@@ -115,11 +117,11 @@ | @@ -115,11 +117,11 @@ | ||
115 | {% endif %} | 117 | {% endif %} |
116 | </div> | 118 | </div> |
117 | 119 | ||
118 | - <div class="row form-group"> | 120 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> |
119 | <label for="{{ form.students.auto_id }}">{{ form.students.label }}</label> | 121 | <label for="{{ form.students.auto_id }}">{{ form.students.label }}</label> |
120 | {% render_field form.students class="form-control" form="form"%} | 122 | {% render_field form.students class="form-control" form="form"%} |
121 | </div> | 123 | </div> |
122 | - <div class="row form-group"> | 124 | + <div class="row form-group {% if form.has_error %} has-error {% endif %}"> |
123 | <div class="checkbox"> | 125 | <div class="checkbox"> |
124 | <label> | 126 | <label> |
125 | {% render_field form.all_students class="form-control" form="form" %}<span class="checkbox-material"><span class="check"></span></span> {{form.all_students.label }} | 127 | {% render_field form.all_students class="form-control" form="form" %}<span class="checkbox-material"><span class="check"></span></span> {{form.all_students.label }} |
@@ -159,48 +161,21 @@ | @@ -159,48 +161,21 @@ | ||
159 | </div> | 161 | </div> |
160 | </div> | 162 | </div> |
161 | </div> | 163 | </div> |
164 | +<script src="{% static 'js/sortable_poll.js' %}"> | ||
165 | +// Este js tem que ficar aqui se não o sortable não vai funcionar | ||
166 | +</script> | ||
167 | +{% block script_poll %} | ||
162 | <script type="text/javascript"> | 168 | <script type="text/javascript"> |
163 | -// Este js tem que ficar aqui se não a tag "trans" não vai funcionar | ||
164 | -$(window).ready(function() { // utilizado para abrir o modal quando tiver tido algum erro no preenchimento do formulario | ||
165 | - if($('.not_submited').length){ | ||
166 | - $('#poll').modal('show'); | ||
167 | - } | ||
168 | -}); | ||
169 | -$( "#form" ).sortable({ // utilizado para fazer a re-organização das respostas | ||
170 | - delay: 100, | ||
171 | - distance: 5, | ||
172 | - update: function( event, ui ) { | ||
173 | - var cont = 1; | ||
174 | - $("#form div div div input").each(function(){ | ||
175 | - $(this).attr('name',cont++); | ||
176 | - }); | ||
177 | - }, | ||
178 | -}); | ||
179 | -name = 2; | ||
180 | -$("#add").click(function() { // utilizado para adicionar um novo campo de resposta | ||
181 | - //Obs: não funcionar se estiver importado no head, só funciona se estiver no final do arquivo | ||
182 | - $("#form").append('\ | ||
183 | - <div class="row form-group">\ | ||
184 | - <div class="col-md-1">\ | ||
185 | - </br>\ | ||
186 | - <label><span class="glyphicon glyphicon-move"></span></label>\ | ||
187 | - </div>\ | ||
188 | - <div class="col-md-10">\ | ||
189 | - <div class="has-success is-empty">\ | ||
190 | - <input type="text" name="1" class="form-control" placeholder="{% trans "Answer" %}">\ | ||
191 | - <span class="help-block">{% trans "Possible answer for the question" %}</span>\ | ||
192 | - </div>\ | ||
193 | - </div>\ | ||
194 | - <div class="col-md-1">\ | ||
195 | - </br>\ | ||
196 | - <label><span class="glyphicon glyphicon-remove" onclick="this.parentNode.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode.parentNode);"></span></label>\ | ||
197 | - </div>\ | ||
198 | - </div>'); | ||
199 | - var cont = 1; | ||
200 | - $("#form div div div input").each(function(){ | ||
201 | - $(this).attr('name',cont++); | 169 | +// Este js tem que ficar aqui se não o button add não vai funcionar |
170 | + $("#add").click(function (){ | ||
171 | + Answer.init('{% url "course:poll:answer_poll" %}'); | ||
172 | + }); | ||
173 | + | ||
174 | + $("#form").submit(function(event) { | ||
175 | + Submite.post("{% url 'course:poll:create_poll' topic.slug %}",$(this).serialize()); | ||
176 | + event.preventDefault(); | ||
202 | }); | 177 | }); |
203 | -}); | ||
204 | </script> | 178 | </script> |
205 | -<a href="" data-toggle="modal" data-target="#poll">modal</a> | ||
206 | -{% endblock content %} | 179 | +{% endblock script_poll %} |
180 | +{# <a href="" data-toggle="modal" data-target="#poll">modal</a> #} | ||
181 | +{# {% endblock content %} #} |
poll/templates/poll/remove.html
1 | {% extends "poll/create.html" %} | 1 | {% extends "poll/create.html" %} |
2 | 2 | ||
3 | -{% load i18n %} | 3 | +{% load i18n static%} |
4 | 4 | ||
5 | {% block title_poll %} | 5 | {% block title_poll %} |
6 | <!-- Put your title here!!! --> | 6 | <!-- Put your title here!!! --> |
@@ -8,14 +8,19 @@ | @@ -8,14 +8,19 @@ | ||
8 | {% endblock title_poll %} | 8 | {% endblock title_poll %} |
9 | 9 | ||
10 | {% block content_poll %} | 10 | {% block content_poll %} |
11 | +<script src="{% static 'js/modal_poll.js' %}"></script> | ||
11 | <!-- Put ONLY your content here!!! --> | 12 | <!-- Put ONLY your content here!!! --> |
12 | -<form action="" method="post"> | 13 | +<form id="delete_form" action="" method="post"> |
13 | {% csrf_token %} | 14 | {% csrf_token %} |
14 | - <h2>{% trans 'Are you sure you want to delete the subject' %} "{{poll}}"?</h2> | ||
15 | - <input type="submit" class="btn btn-raised btn-success btn-lg" value="{% trans 'Yes' %}" /> | ||
16 | - <a href="" class="btn btn-raised btn-danger btn-lg">{% trans 'No' %}</a> | 15 | + <p>{% trans 'Are you sure you want to delete the subject' %} "{{poll.name}}"?</p> |
17 | </form> | 16 | </form> |
18 | {% endblock content_poll %} | 17 | {% endblock content_poll %} |
19 | - | ||
20 | {% block button_save %} | 18 | {% block button_save %} |
19 | +<button type="submite" id="button" form="delete_form" class="btn btn-primary btn-raised">{% trans "Delete" %}</button> | ||
20 | +<script> | ||
21 | + $("#delete_form").submit(function(event) { | ||
22 | + Submite.remove("{% url 'course:poll:delete_poll' poll.slug %}",$(this).serialize(),"#poll_{{poll.slug}}"); | ||
23 | + event.preventDefault(); | ||
24 | + }); | ||
25 | +</script> | ||
21 | {% endblock button_save %} | 26 | {% endblock button_save %} |
poll/templates/poll/update.html
@@ -11,3 +11,17 @@ | @@ -11,3 +11,17 @@ | ||
11 | <!-- Put curtom buttons here!!! --> | 11 | <!-- Put curtom buttons here!!! --> |
12 | <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Update" %}</button> | 12 | <button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Update" %}</button> |
13 | {% endblock button_save %} | 13 | {% endblock button_save %} |
14 | + | ||
15 | +{% block script_poll %} | ||
16 | +<script type="text/javascript"> | ||
17 | +// Este js tem que ficar aqui se não o button add não vai funcionar | ||
18 | + $("#add").click(function (){ | ||
19 | + Answer.init('{% url "course:poll:answer_poll" %}'); | ||
20 | + }); | ||
21 | + | ||
22 | + $("#form").submit(function(event) { | ||
23 | + Submite.post("{% url 'course:poll:update_poll' poll.slug %}",$(this).serialize()); | ||
24 | + event.preventDefault(); | ||
25 | + }); | ||
26 | +</script> | ||
27 | +{% endblock script_poll %} |
poll/templates/poll/view.html
@@ -7,19 +7,29 @@ | @@ -7,19 +7,29 @@ | ||
7 | 7 | ||
8 | {% block title_poll %} | 8 | {% block title_poll %} |
9 | <!-- Put your title here!!! --> | 9 | <!-- Put your title here!!! --> |
10 | -<h4 class="modal-title" id="myModalLabel">{{poll}}</h4> | 10 | +<h4 class="modal-title" id="myModalLabel">{{poll.name}}</h4> |
11 | {% endblock title_poll %} | 11 | {% endblock title_poll %} |
12 | 12 | ||
13 | {% block content_poll %} | 13 | {% block content_poll %} |
14 | <!-- Put ONLY your content here!!! --> | 14 | <!-- Put ONLY your content here!!! --> |
15 | <div class="row"> | 15 | <div class="row"> |
16 | <div class="col-md-10 col-md-offset-1"> | 16 | <div class="col-md-10 col-md-offset-1"> |
17 | - <h3>{% trans "Limit date:" %} {{poll.limit_date|date:'d/m/y'}}</h3> | 17 | + <p>{% trans "Limit date:" %} {{poll.limit_date|date:'d/m/y'}}</p> |
18 | + </div> | ||
19 | + <div class="col-md-10 col-md-offset-1"> | ||
20 | + <p>{% trans "Status:" %} | ||
21 | + {% if status %} | ||
22 | + {% trans "Poll answered" %} | ||
23 | + {% else %} | ||
24 | + {% trans "Poll don't yet answered" %} | ||
25 | + {% endif %} | ||
18 | </div> | 26 | </div> |
19 | </div> | 27 | </div> |
20 | {% endblock content_poll %} | 28 | {% endblock content_poll %} |
21 | 29 | ||
22 | {% block button_save %} | 30 | {% block button_save %} |
23 | <!-- Put curtom buttons here!!! --> | 31 | <!-- Put curtom buttons here!!! --> |
24 | -<button type="submite" id="button" form="form" class="btn btn-primary btn-raised">{% trans "Answer" %}</button> | 32 | +{% if not status %} |
33 | +<button type="button" onclick="javascript:get('{% url 'course:poll:answer_student_poll' poll.slug%}','#poll','#modal_poll');$('div.modal-backdrop.fade.in').remove();" class="btn btn-primary btn-raised">{% trans "Answer" %}</button> | ||
34 | +{% endif %} | ||
25 | {% endblock button_save %} | 35 | {% endblock button_save %} |
poll/tests/poll.py
@@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse | @@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse | ||
5 | 5 | ||
6 | from rolepermissions.shortcuts import assign_role | 6 | from rolepermissions.shortcuts import assign_role |
7 | 7 | ||
8 | -from courses.models import Category, Course, Subject, Topic | 8 | +from courses.models import CourseCategory, Course, Subject, Topic |
9 | from poll.models import Poll | 9 | from poll.models import Poll |
10 | from users.models import User | 10 | from users.models import User |
11 | 11 | ||
@@ -33,7 +33,7 @@ class PollTestCase(TestCase): | @@ -33,7 +33,7 @@ class PollTestCase(TestCase): | ||
33 | ) | 33 | ) |
34 | assign_role(self.user_student, 'student') | 34 | assign_role(self.user_student, 'student') |
35 | 35 | ||
36 | - self.category = Category( | 36 | + self.category = CourseCategory( |
37 | name = 'Categoria Teste', | 37 | name = 'Categoria Teste', |
38 | ) | 38 | ) |
39 | self.category.save() | 39 | self.category.save() |
poll/urls.py
@@ -7,5 +7,6 @@ urlpatterns = [ | @@ -7,5 +7,6 @@ urlpatterns = [ | ||
7 | url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreatePoll.as_view(), name='create_poll'), # topic slug | 7 | url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreatePoll.as_view(), name='create_poll'), # topic slug |
8 | url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdatePoll.as_view(), name='update_poll'), # poll slug | 8 | url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdatePoll.as_view(), name='update_poll'), # poll slug |
9 | url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeletePoll.as_view(), name='delete_poll'), # poll | 9 | url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeletePoll.as_view(), name='delete_poll'), # poll |
10 | - | 10 | + url(r'^answer/$', views.AnswerPoll.as_view(), name='answer_poll'), # poll |
11 | + url(r'^answer-poll/(?P<slug>[\w\-_]+)/$', views.AnswerStudentPoll.as_view(), name='answer_student_poll'), # poll slug | ||
11 | ] | 12 | ] |
poll/views.py
@@ -12,7 +12,7 @@ from django.db.models import Q | @@ -12,7 +12,7 @@ from django.db.models import Q | ||
12 | # from django.views.generic.edit import FormMixin | 12 | # from django.views.generic.edit import FormMixin |
13 | 13 | ||
14 | from .forms import PollForm | 14 | from .forms import PollForm |
15 | -from .models import Poll, Answer | 15 | +from .models import Poll, Answer, AnswersStudent |
16 | from core.mixins import NotificationMixin | 16 | from core.mixins import NotificationMixin |
17 | from users.models import User | 17 | from users.models import User |
18 | from courses.models import Course, Topic | 18 | from courses.models import Course, Topic |
@@ -26,48 +26,19 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | @@ -26,48 +26,19 @@ class ViewPoll(LoginRequiredMixin,generic.DetailView): | ||
26 | def get_object(self, queryset=None): | 26 | def get_object(self, queryset=None): |
27 | return get_object_or_404(Poll, slug = self.kwargs.get('slug')) | 27 | return get_object_or_404(Poll, slug = self.kwargs.get('slug')) |
28 | 28 | ||
29 | - def form_invalid(self, form,**kwargs): | ||
30 | - context = super(ViewPoll, self).form_invalid(form) | ||
31 | - answers = {} | ||
32 | - for key in self.request.POST: | ||
33 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
34 | - answers[key] = self.request.POST[key] | ||
35 | - | ||
36 | - keys = sorted(answers) | ||
37 | - context.context_data['answers'] = answers | ||
38 | - context.context_data['keys'] = keys | ||
39 | - return context | ||
40 | - | ||
41 | - def form_valid(self, form): | ||
42 | - poll = self.object | ||
43 | - poll = form.save(commit = False) | ||
44 | - poll.answers.all().delete() | ||
45 | - poll.save() | ||
46 | - | ||
47 | - | ||
48 | - for key in self.request.POST: | ||
49 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
50 | - answer = Answer(answer=self.request.POST[key],order=key,poll=poll) | ||
51 | - answer.save() | ||
52 | - | ||
53 | - return super(ViewPoll, self).form_valid(form) | ||
54 | - | ||
55 | def get_context_data(self, **kwargs): | 29 | def get_context_data(self, **kwargs): |
56 | context = super(ViewPoll, self).get_context_data(**kwargs) | 30 | context = super(ViewPoll, self).get_context_data(**kwargs) |
57 | poll = self.object | 31 | poll = self.object |
32 | + context["topic"] = poll.topic | ||
58 | context['course'] = poll.topic.subject.course | 33 | context['course'] = poll.topic.subject.course |
59 | context['subject'] = poll.topic.subject | 34 | context['subject'] = poll.topic.subject |
60 | context['subjects'] = poll.topic.subject.course.subjects.all() | 35 | context['subjects'] = poll.topic.subject.course.subjects.all() |
61 | - | ||
62 | - answers = {} | ||
63 | - for answer in poll.answers.all(): | ||
64 | - answers[answer.order] = answer.answer | ||
65 | - | ||
66 | - keys = sorted(answers) | ||
67 | - context['answers'] = answers | ||
68 | - context['keys'] = keys | ||
69 | - | ||
70 | - print (context) | 36 | + answered = AnswersStudent.objects.filter(poll = poll, student=self.request.user) |
37 | + print (answered) | ||
38 | + if answered.count()<1: | ||
39 | + context['status'] = False | ||
40 | + else: | ||
41 | + context['status'] = answered[0].status | ||
71 | return context | 42 | return context |
72 | 43 | ||
73 | 44 | ||
@@ -80,7 +51,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -80,7 +51,6 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
80 | form_class = PollForm | 51 | form_class = PollForm |
81 | context_object_name = 'poll' | 52 | context_object_name = 'poll' |
82 | template_name = 'poll/create.html' | 53 | template_name = 'poll/create.html' |
83 | - success_url = reverse_lazy('core:home') | ||
84 | 54 | ||
85 | def form_invalid(self, form,**kwargs): | 55 | def form_invalid(self, form,**kwargs): |
86 | context = super(CreatePoll, self).form_invalid(form) | 56 | context = super(CreatePoll, self).form_invalid(form) |
@@ -92,6 +62,9 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -92,6 +62,9 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
92 | keys = sorted(answers) | 62 | keys = sorted(answers) |
93 | context.context_data['answers'] = answers | 63 | context.context_data['answers'] = answers |
94 | context.context_data['keys'] = keys | 64 | context.context_data['keys'] = keys |
65 | + context.context_data['form'] = form | ||
66 | + context.status_code = 400 | ||
67 | + # return self.render_to_response(context, status = 400) | ||
95 | return context | 68 | return context |
96 | 69 | ||
97 | def form_valid(self, form): | 70 | def form_valid(self, form): |
@@ -105,11 +78,12 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -105,11 +78,12 @@ class CreatePoll(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
105 | answer = Answer(answer=self.request.POST[key],order=key,poll=self.object) | 78 | answer = Answer(answer=self.request.POST[key],order=key,poll=self.object) |
106 | answer.save() | 79 | answer.save() |
107 | 80 | ||
108 | - return super(CreatePoll, self).form_valid(form) | 81 | + return self.render_to_response(self.get_context_data(form = form), status = 200) |
109 | 82 | ||
110 | def get_context_data(self, **kwargs): | 83 | def get_context_data(self, **kwargs): |
111 | context = super(CreatePoll, self).get_context_data(**kwargs) | 84 | context = super(CreatePoll, self).get_context_data(**kwargs) |
112 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) | 85 | topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) |
86 | + context["topic"] = topic | ||
113 | context['course'] = topic.subject.course | 87 | context['course'] = topic.subject.course |
114 | context['subject'] = topic.subject | 88 | context['subject'] = topic.subject |
115 | context['subjects'] = topic.subject.course.subjects.all() | 89 | context['subjects'] = topic.subject.course.subjects.all() |
@@ -145,6 +119,8 @@ class UpdatePoll(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | @@ -145,6 +119,8 @@ class UpdatePoll(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | ||
145 | keys = sorted(answers) | 119 | keys = sorted(answers) |
146 | context.context_data['answers'] = answers | 120 | context.context_data['answers'] = answers |
147 | context.context_data['keys'] = keys | 121 | context.context_data['keys'] = keys |
122 | + context.context_data['form'] = form | ||
123 | + context.status_code = 400 | ||
148 | return context | 124 | return context |
149 | 125 | ||
150 | def form_valid(self, form): | 126 | def form_valid(self, form): |
@@ -164,6 +140,7 @@ class UpdatePoll(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | @@ -164,6 +140,7 @@ class UpdatePoll(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | ||
164 | def get_context_data(self, **kwargs): | 140 | def get_context_data(self, **kwargs): |
165 | context = super(UpdatePoll, self).get_context_data(**kwargs) | 141 | context = super(UpdatePoll, self).get_context_data(**kwargs) |
166 | poll = self.object | 142 | poll = self.object |
143 | + context['topic'] = poll.topic | ||
167 | context['course'] = poll.topic.subject.course | 144 | context['course'] = poll.topic.subject.course |
168 | context['subject'] = poll.topic.subject | 145 | context['subject'] = poll.topic.subject |
169 | context['subjects'] = poll.topic.subject.course.subjects.all() | 146 | context['subjects'] = poll.topic.subject.course.subjects.all() |
@@ -199,6 +176,7 @@ class DeletePoll(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | @@ -199,6 +176,7 @@ class DeletePoll(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | ||
199 | context['course'] = self.object.topic.subject.course | 176 | context['course'] = self.object.topic.subject.course |
200 | context['subject'] = self.object.topic.subject | 177 | context['subject'] = self.object.topic.subject |
201 | context['poll'] = self.object | 178 | context['poll'] = self.object |
179 | + context["topic"] = self.object.topic | ||
202 | context['subjects'] = self.object.topic.subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user])) | 180 | context['subjects'] = self.object.topic.subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user])) |
203 | if (has_role(self.request.user,'system_admin')): | 181 | if (has_role(self.request.user,'system_admin')): |
204 | context['subjects'] = self.object.topic.subject.course.subjects.all() | 182 | context['subjects'] = self.object.topic.subject.course.subjects.all() |
@@ -206,3 +184,50 @@ class DeletePoll(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | @@ -206,3 +184,50 @@ class DeletePoll(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | ||
206 | 184 | ||
207 | def get_success_url(self): | 185 | def get_success_url(self): |
208 | return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) | 186 | return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) |
187 | + | ||
188 | + | ||
189 | +class AnswerPoll(generic.TemplateView): | ||
190 | + template_name = 'poll/answer.html' | ||
191 | + | ||
192 | +class AnswerStudentPoll(LoginRequiredMixin,generic.CreateView): | ||
193 | + | ||
194 | + model = AnswersStudent | ||
195 | + fields = ['status'] | ||
196 | + context_object_name = 'answer' | ||
197 | + template_name = 'poll/answer_student.html' | ||
198 | + | ||
199 | + def form_valid(self, form): | ||
200 | + poll = get_object_or_404(Poll, slug = self.kwargs.get('slug')) | ||
201 | + answers = AnswersStudent( | ||
202 | + status = True, | ||
203 | + poll = poll, | ||
204 | + student = self.request.user, | ||
205 | + ) | ||
206 | + answers.save() | ||
207 | + | ||
208 | + for key in self.request.POST: | ||
209 | + if(key != 'csrfmiddlewaretoken'): | ||
210 | + answers.answer.add(poll.answers.all().filter(order=key)[0]) | ||
211 | + | ||
212 | + return self.render_to_response(self.get_context_data(form = form), status = 200) | ||
213 | + | ||
214 | + def get_context_data(self, **kwargs): | ||
215 | + context = super(AnswerStudentPoll, self).get_context_data(**kwargs) | ||
216 | + print (self.kwargs.get('slug')) | ||
217 | + poll = get_object_or_404(Poll, slug = self.kwargs.get('slug')) | ||
218 | + context['poll'] = poll | ||
219 | + context['topic'] = poll.topic | ||
220 | + context['course'] = poll.topic.subject.course | ||
221 | + context['subject'] = poll.topic.subject | ||
222 | + context['subjects'] = poll.topic.subject.course.subjects.all() | ||
223 | + | ||
224 | + print (self.request.method) | ||
225 | + answers = {} | ||
226 | + for answer in poll.answers.all(): | ||
227 | + answers[answer.order] = answer.answer | ||
228 | + | ||
229 | + keys = sorted(answers) | ||
230 | + context['answers'] = answers | ||
231 | + context['keys'] = keys | ||
232 | + | ||
233 | + return context |