Commit e6de613120e50eee0761ade2c3e43c73c47c33b6

Authored by Zambom
1 parent 187e2bb3

Adding goals unanswered report

amadeus/static/js/goals_reports.js
@@ -4,8 +4,7 @@ $(function () { @@ -4,8 +4,7 @@ $(function () {
4 4
5 function getAnswered() { 5 function getAnswered() {
6 var container = $("#reports"), 6 var container = $("#reports"),
7 - list = container.find('.answered_data'),  
8 - holder = list.parent().find('.holder'); 7 + list = container.find('.answered_data');
9 8
10 if (list.children().length == 0) { 9 if (list.children().length == 0) {
11 var url = list.parent().data('url'); 10 var url = list.parent().data('url');
@@ -15,13 +14,6 @@ function getAnswered() { @@ -15,13 +14,6 @@ function getAnswered() {
15 success: function (data) { 14 success: function (data) {
16 list.html(data); 15 list.html(data);
17 16
18 - // var form = list.find('.form_search');  
19 -  
20 - // form.submit(function () {  
21 - // searchHistory(panel_id);  
22 -  
23 - // return false;  
24 - // });  
25 $('#answered_table').DataTable({ 17 $('#answered_table').DataTable({
26 "dom": "Bfrtip", 18 "dom": "Bfrtip",
27 "language": dataTablei18n, 19 "language": dataTablei18n,
@@ -44,35 +36,82 @@ function getAnswered() { @@ -44,35 +36,82 @@ function getAnswered() {
44 ] 36 ]
45 } 37 }
46 }); 38 });
47 - // var items = $("#answered_table").children(":visible").length;  
48 -  
49 - // if (items > 10) {  
50 - // holder.jPages({  
51 - // containerID : "answered_table",  
52 - // perPage: 10,  
53 - // previous: "«",  
54 - // next: "»",  
55 - // midRange: 5  
56 - // });  
57 - // }  
58 } 39 }
59 }); 40 });
60 - } else {  
61 - $('#answered_table').DataTable();  
62 - // var items = $("#answered_table").children(":visible").length;  
63 -  
64 - // if (items > 10) {  
65 - // holder.jPages({  
66 - // containerID : "answered_table",  
67 - // perPage: 10,  
68 - // previous: "«",  
69 - // next: "»",  
70 - // midRange: 5  
71 - // });  
72 - // }  
73 } 41 }
74 42
75 container.find('.answered_link').addClass('active'); 43 container.find('.answered_link').addClass('active');
  44 + container.find('.answered').show();
  45 +
  46 + container.find('.unanswered_link').removeClass('active');
  47 + container.find('.unanswered').hide();
  48 +
  49 + setBreadcrumb(answeredBread);
  50 +}
  51 +
  52 +function getUnanswered() {
  53 + var container = $("#reports"),
  54 + list = container.find('.unanswered_data');
  55 +
  56 + if (list.children().length == 0) {
  57 + var url = list.parent().data('url');
  58 +
  59 + $.ajax({
  60 + url: url,
  61 + success: function (data) {
  62 + list.html(data);
  63 +
  64 + $('#unanswered_table').DataTable({
  65 + "dom": "Bfrtip",
  66 + "language": dataTablei18n,
  67 + buttons: {
  68 + dom: {
  69 + container: {
  70 + className: 'col-md-3'
  71 + },
  72 + buttonContainer: {
  73 + tag: 'h4',
  74 + className: 'history-header'
  75 + },
  76 + },
  77 + buttons: [
  78 + {
  79 + extend: 'csv',
  80 + text: csvBtnLabeli18n,
  81 + filename: 'report-unanswered'
  82 + }
  83 + ],
  84 + },
  85 + "columns": [
  86 + null,
  87 + null,
  88 + { "orderable": false },
  89 + ]
  90 + });
  91 +
  92 + $("#check_all_rows").click(function () {
  93 + var checked = this.checked;
  94 +
  95 + $('#unanswered_table').find('input[type="checkbox"]').each(function() {
  96 + this.checked = checked;
  97 + });
  98 + });
  99 + }
  100 + });
  101 + }
  102 +
  103 + container.find('.answered_link').removeClass('active');
  104 + container.find('.answered').hide();
  105 +
  106 + container.find('.unanswered_link').addClass('active');
  107 + container.find('.unanswered').show();
  108 +
  109 + setBreadcrumb(unansweredBread);
  110 +}
76 111
77 - container.find('.answered').attr('style', 'display: block'); 112 +function setBreadcrumb(text) {
  113 + var breadcrumb = $(".breadcrumb")[0],
  114 + li = $(breadcrumb).find('li:last-child');
  115 +
  116 + $(li).html(text);
78 } 117 }
79 \ No newline at end of file 118 \ No newline at end of file
goals/templates/goals/_unanswered.html 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +{% load i18n goals_filters %}
  2 +
  3 +<div class="row">
  4 + <div class="col-md-12">
  5 + <table id="unanswered_table" class="table table-striped table-bordered">
  6 + <thead>
  7 + <th>
  8 + {% trans 'Student' %}
  9 + </th>
  10 + <th>
  11 + {% trans 'Group' %}
  12 + </th>
  13 + <th>
  14 + <input type="checkbox" id="check_all_rows" /> {% trans 'Select All' %}
  15 + </th>
  16 + </thead>
  17 + <tbody>
  18 + {% for student in students %}
  19 + <tr>
  20 + <td>{{ student }}</td>
  21 + <td>{{ student|groups }}</td>
  22 + <td class="text-center"><input type="checkbox" /></td>
  23 + </tr>
  24 + {% endfor %}
  25 + </tbody>
  26 + </table>
  27 + </div>
  28 +</div>
0 \ No newline at end of file 29 \ No newline at end of file
goals/templates/goals/reports.html
@@ -54,8 +54,8 @@ @@ -54,8 +54,8 @@
54 <div id="reports" class="panel-collapse in collapse category-panel-content"> 54 <div id="reports" class="panel-collapse in collapse category-panel-content">
55 <div id="core-subjects-options-div"> 55 <div id="core-subjects-options-div">
56 <ul class="core-subjects-options"> 56 <ul class="core-subjects-options">
57 - <a href=""><li class="answered_link active">{% trans "Answered" %} ({{ totals.answered }})</li></a>  
58 - <a href=""><li class="">{% trans "Unanswered" %} ({{ totals.unanswered }})</li></a> 57 + <a href="javascript:getAnswered()"><li class="answered_link active">{% trans "Answered" %} ({{ totals.answered }})</li></a>
  58 + <a href="javascript:getUnanswered()"><li class="unanswered_link">{% trans "Unanswered" %} ({{ totals.unanswered }})</li></a>
59 <a href=""><li class="">{% trans "Resource History" %}</li></a> 59 <a href=""><li class="">{% trans "Resource History" %}</li></a>
60 </ul> 60 </ul>
61 </div> 61 </div>
@@ -66,6 +66,13 @@ @@ -66,6 +66,13 @@
66 <div class="holder"></div> 66 <div class="holder"></div>
67 </div> 67 </div>
68 </div> 68 </div>
  69 +
  70 + <div class="unanswered" data-url="{% url 'goals:unanswered_report' goal.slug %}">
  71 + <div class="unanswered_data"></div>
  72 + <div class="text-center">
  73 + <div class="holder"></div>
  74 + </div>
  75 + </div>
69 </div> 76 </div>
70 </div> 77 </div>
71 78
@@ -95,7 +102,9 @@ @@ -95,7 +102,9 @@
95 } 102 }
96 }; 103 };
97 104
98 - var csvBtnLabeli18n = "<i class='fa fa-download'></i> {% trans 'Download .csv file' %}"; 105 + var csvBtnLabeli18n = "<i class='fa fa-download'></i> {% trans 'Download .csv file' %}",
  106 + answeredBread = "{% trans 'Reports: Answered' %}",
  107 + unansweredBread = "{% trans 'Reports: Unanswered' %}";
99 </script> 108 </script>
100 <script type="text/javascript" src="{% static 'js/goals_reports.js' %}"></script> 109 <script type="text/javascript" src="{% static 'js/goals_reports.js' %}"></script>
101 {% endblock %} 110 {% endblock %}
102 \ No newline at end of file 111 \ No newline at end of file
@@ -13,4 +13,5 @@ urlpatterns = [ @@ -13,4 +13,5 @@ urlpatterns = [
13 url(r'^update_submit/(?P<slug>[\w_-]+)/$', views.UpdateSubmit.as_view(), name = 'update_submit'), 13 url(r'^update_submit/(?P<slug>[\w_-]+)/$', views.UpdateSubmit.as_view(), name = 'update_submit'),
14 url(r'^reports/(?P<slug>[\w_-]+)/$', views.Reports.as_view(), name = 'reports'), 14 url(r'^reports/(?P<slug>[\w_-]+)/$', views.Reports.as_view(), name = 'reports'),
15 url(r'^answered_report/(?P<slug>[\w_-]+)/$', views.AnsweredReport.as_view(), name = 'answered_report'), 15 url(r'^answered_report/(?P<slug>[\w_-]+)/$', views.AnsweredReport.as_view(), name = 'answered_report'),
  16 + url(r'^unanswered_report/(?P<slug>[\w_-]+)/$', views.UnansweredReport.as_view(), name = 'unanswered_report'),
16 ] 17 ]
goals/views.py
@@ -105,6 +105,47 @@ class AnsweredReport(LoginRequiredMixin, generic.ListView): @@ -105,6 +105,47 @@ class AnsweredReport(LoginRequiredMixin, generic.ListView):
105 105
106 return context 106 return context
107 107
  108 +class UnansweredReport(LoginRequiredMixin, generic.ListView):
  109 + login_url = reverse_lazy("users:login")
  110 + redirect_field_name = 'next'
  111 +
  112 + template_name = 'goals/_unanswered.html'
  113 + model = MyGoals
  114 + context_object_name = 'students'
  115 +
  116 + def get_queryset(self):
  117 + slug = self.kwargs.get('slug', '')
  118 + goal = get_object_or_404(Goals, slug = slug)
  119 +
  120 + users = goal.topic.subject.students.values_list('id', flat = True)
  121 +
  122 + submited = Log.objects.filter(user_id__in = users, action = 'submit', resource = 'goals', context__contains = {"goals_id": goal.id}).values_list('user_id', flat = True)
  123 +
  124 + users = [i for i in users if i not in submited]
  125 +
  126 + submited_users = User.objects.filter(id__in = users)
  127 +
  128 + return submited_users
  129 +
  130 + def dispatch(self, request, *args, **kwargs):
  131 + slug = self.kwargs.get('slug', '')
  132 + goals = get_object_or_404(Goals, slug = slug)
  133 +
  134 + if not has_resource_permissions(request.user, goals):
  135 + return redirect(reverse_lazy('subjects:home'))
  136 +
  137 + return super(UnansweredReport, self).dispatch(request, *args, **kwargs)
  138 +
  139 + def get_context_data(self, **kwargs):
  140 + context = super(UnansweredReport, self).get_context_data(**kwargs)
  141 +
  142 + slug = self.kwargs.get('slug', '')
  143 + goals = get_object_or_404(Goals, slug = slug)
  144 +
  145 + context['goal'] = goals
  146 +
  147 + return context
  148 +
108 class InsideView(LoginRequiredMixin, LogMixin, generic.ListView): 149 class InsideView(LoginRequiredMixin, LogMixin, generic.ListView):
109 log_component = "resources" 150 log_component = "resources"
110 log_action = "view" 151 log_action = "view"