Commit 2ef81f0af9e16a3029783986234cfead6d8e167f
1 parent
6e69b2da
Exists in
master
and in
3 other branches
Adding topic log
Showing
5 changed files
with
183 additions
and
61 deletions
Show diff stats
amadeus/static/js/topics.js
1 | $('.topic-panel').on('show.bs.collapse', function (e) { | 1 | $('.topic-panel').on('show.bs.collapse', function (e) { |
2 | - if($(this).is(e.target)){ | ||
3 | - var btn = $(this).parent().find('.fa-angle-right'); | ||
4 | - | ||
5 | - btn = btn[0]; | ||
6 | - | ||
7 | - $(btn).switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); | ||
8 | - | ||
9 | - $(this).parent().parent().find('.panel-collapse.in').collapse('hide'); | ||
10 | - } | 2 | + if($(this).is(e.target)){ |
3 | + var btn = $(this).parent().find('.fa-angle-right'); | ||
4 | + | ||
5 | + btn = btn[0]; | ||
6 | + | ||
7 | + $(btn).switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); | ||
8 | + | ||
9 | + var url = $(this).parent().find('.log_url').val(); | ||
10 | + var log_input = $(this).parent().find('.log_id'); | ||
11 | + | ||
12 | + if (typeof(url) != 'undefined') { | ||
13 | + $.ajax({ | ||
14 | + url: url, | ||
15 | + data: {'action': 'open'}, | ||
16 | + dataType: 'json', | ||
17 | + success: function (data) { | ||
18 | + log_input.val(data.log_id); | ||
19 | + }, | ||
20 | + error: function (data) { | ||
21 | + console.log(data); | ||
22 | + } | ||
23 | + }); | ||
24 | + } | ||
25 | + | ||
26 | + $(this).parent().parent().find('.panel-collapse.in').collapse('hide'); | ||
27 | + } | ||
11 | }); | 28 | }); |
12 | 29 | ||
13 | // Update breadcrumb with topic's name | 30 | // Update breadcrumb with topic's name |
14 | $('.topic-panel').on('shown.bs.collapse', function (e) { | 31 | $('.topic-panel').on('shown.bs.collapse', function (e) { |
15 | - if($(this).is(e.target)){ | ||
16 | - var li = $(".breadcrumb").find('li:last-child'); | ||
17 | - var li_text = $(li).html(); | ||
18 | - var url = $(".subs_url").val(); | ||
19 | - var new_li = $(li).clone(); | ||
20 | - | ||
21 | - new_li.html($(this).parent().find('.panel-title').text()); | ||
22 | - | ||
23 | - $(li).html("<a href='" + url + "'>" + li_text + "</a>"); | ||
24 | - $(li).append("<span class='divider'>/</span>"); | ||
25 | - | ||
26 | - new_li.appendTo('.breadcrumb'); | ||
27 | - } | 32 | + if($(this).is(e.target)){ |
33 | + var li = $(".breadcrumb").find('li:last-child'); | ||
34 | + var li_text = $(li).html(); | ||
35 | + var url = $(".subs_url").val(); | ||
36 | + var new_li = $(li).clone(); | ||
37 | + | ||
38 | + new_li.html($(this).parent().find('.panel-title').text()); | ||
39 | + | ||
40 | + $(li).html("<a href='" + url + "'>" + li_text + "</a>"); | ||
41 | + $(li).append("<span class='divider'>/</span>"); | ||
42 | + | ||
43 | + new_li.appendTo('.breadcrumb'); | ||
44 | + } | ||
28 | }); | 45 | }); |
29 | 46 | ||
30 | // Reset breadcrumb to it's normal state | 47 | // Reset breadcrumb to it's normal state |
31 | $('.topic-panel').on('hide.bs.collapse', function (e) { | 48 | $('.topic-panel').on('hide.bs.collapse', function (e) { |
32 | - if($(this).is(e.target)){ | ||
33 | - var btn = $(this).parent().find('.fa-angle-down'); | ||
34 | - | ||
35 | - btn = btn[0]; | ||
36 | - | ||
37 | - $(btn).switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); | ||
38 | - | ||
39 | - $(".breadcrumb").find('li:last-child').remove(); | ||
40 | - | ||
41 | - var li = $(".breadcrumb").find('li:last-child'); | ||
42 | - var text = $(li).find('a').text(); | ||
43 | - | ||
44 | - $(li).html(text); | 49 | + if($(this).is(e.target)){ |
50 | + var btn = $(this).parent().find('.fa-angle-down'); | ||
51 | + | ||
52 | + btn = btn[0]; | ||
53 | + | ||
54 | + $(btn).switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); | ||
55 | + | ||
56 | + $(".breadcrumb").find('li:last-child').remove(); | ||
57 | + | ||
58 | + var li = $(".breadcrumb").find('li:last-child'); | ||
59 | + var text = $(li).find('a').text(); | ||
60 | + | ||
61 | + $(li).html(text); | ||
62 | + | ||
63 | + var url = $(this).parent().find('.log_url').val(); | ||
64 | + var log_id = $(this).parent().find('.log_id').val(); | ||
65 | + | ||
66 | + if (typeof(url) != 'undefined') { | ||
67 | + $.ajax({ | ||
68 | + url: url, | ||
69 | + data: {'action': 'close', 'log_id': log_id}, | ||
70 | + dataType: 'json', | ||
71 | + success: function (data) { | ||
72 | + console.log(data.message); | ||
73 | + }, | ||
74 | + error: function (data) { | ||
75 | + console.log(data); | ||
76 | + } | ||
77 | + }); | ||
78 | + } | ||
45 | } | 79 | } |
46 | }); | 80 | }); |
47 | 81 | ||
48 | // utilizado para fazer a re-organização dos tópicos | 82 | // utilizado para fazer a re-organização dos tópicos |
49 | $("#topics-accordion").sortable({ | 83 | $("#topics-accordion").sortable({ |
50 | - delay: 100, | ||
51 | - distance: 5, | ||
52 | - handle: 'i.move_topic', | ||
53 | - update: function( event, ui ) { | ||
54 | - var cont = 1; | ||
55 | - var data = []; | ||
56 | - | ||
57 | - $("#topics-accordion").find('.order_inp').each(function () { | ||
58 | - $(this).val(cont++); | ||
59 | - | ||
60 | - data.push({ | ||
61 | - 'topic_id': $(this).parent().find('.id_inp').val(), | ||
62 | - 'topic_order': $(this).val() | ||
63 | - }); | ||
64 | - }); | ||
65 | - | ||
66 | - data = JSON.stringify(data); | ||
67 | - | ||
68 | - sendUpdate(data); | ||
69 | - }, | 84 | + delay: 100, |
85 | + distance: 5, | ||
86 | + handle: 'i.move_topic', | ||
87 | + update: function( event, ui ) { | ||
88 | + var cont = 1; | ||
89 | + var data = []; | ||
90 | + | ||
91 | + $("#topics-accordion").find('.order_inp').each(function () { | ||
92 | + $(this).val(cont++); | ||
93 | + | ||
94 | + data.push({ | ||
95 | + 'topic_id': $(this).parent().find('.id_inp').val(), | ||
96 | + 'topic_order': $(this).val() | ||
97 | + }); | ||
98 | + }); | ||
99 | + | ||
100 | + data = JSON.stringify(data); | ||
101 | + | ||
102 | + sendUpdate(data); | ||
103 | + }, | ||
70 | }); | 104 | }); |
71 | 105 | ||
72 | function sendUpdate(data) { | 106 | function sendUpdate(data) { |
@@ -94,9 +128,9 @@ function delete_topic(url) { | @@ -94,9 +128,9 @@ function delete_topic(url) { | ||
94 | } | 128 | } |
95 | 129 | ||
96 | $(".add_resource").on('show.bs.dropdown', function () { | 130 | $(".add_resource").on('show.bs.dropdown', function () { |
97 | - $(this).find('i.fa-angle-right').switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); | 131 | + $(this).find('i.fa-angle-right').switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); |
98 | }); | 132 | }); |
99 | 133 | ||
100 | $(".add_resource").on('hide.bs.dropdown', function () { | 134 | $(".add_resource").on('hide.bs.dropdown', function () { |
101 | - $(this).find('i.fa-angle-down').switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); | 135 | + $(this).find('i.fa-angle-down').switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); |
102 | }); | 136 | }); |
103 | \ No newline at end of file | 137 | \ No newline at end of file |
subjects/templates/subjects/subject_card.html
@@ -42,7 +42,7 @@ | @@ -42,7 +42,7 @@ | ||
42 | </div> | 42 | </div> |
43 | </div> | 43 | </div> |
44 | <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content"> | 44 | <div id="{{subject.slug}}" class="panel-collapse collapse category-panel-content"> |
45 | - <input type="hidden" class="log_url" value="{% url 'subjects:view_log' subject.id %}" /> | 45 | + <input type="hidden" class="log_url" value="{% url 'subjects:view_log' subject.id %}" /> |
46 | <input type="hidden" class="log_id" value="" /> | 46 | <input type="hidden" class="log_id" value="" /> |
47 | 47 | ||
48 | <div class="row"> | 48 | <div class="row"> |
topics/templates/topics/list.html
@@ -37,6 +37,9 @@ | @@ -37,6 +37,9 @@ | ||
37 | <div id="{{topic.slug}}" class="panel-collapse collapse category-panel-content topic-panel"> | 37 | <div id="{{topic.slug}}" class="panel-collapse collapse category-panel-content topic-panel"> |
38 | <input type="hidden" class="id_inp" name="id" value="{{ topic.id }}" /> | 38 | <input type="hidden" class="id_inp" name="id" value="{{ topic.id }}" /> |
39 | <input type="hidden" class="order_inp" name="order" value="{{ topic.order }}" /> | 39 | <input type="hidden" class="order_inp" name="order" value="{{ topic.order }}" /> |
40 | + | ||
41 | + <input type="hidden" class="log_url" value="{% url 'topics:view_log' topic.id %}" /> | ||
42 | + <input type="hidden" class="log_id" value="" /> | ||
40 | 43 | ||
41 | {% autoescape off %} | 44 | {% autoescape off %} |
42 | {{ topic.description }} | 45 | {{ topic.description }} |
topics/urls.py
@@ -7,6 +7,7 @@ urlpatterns = [ | @@ -7,6 +7,7 @@ urlpatterns = [ | ||
7 | url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), | 7 | url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), |
8 | url(r'^update/(?P<sub_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), | 8 | url(r'^update/(?P<sub_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), |
9 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), | 9 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), |
10 | + url(r'^view_log/(?P<topic>[\w_-]+)/$', views.topic_view_log, name = 'view_log'), | ||
10 | url(r'^update_order/$', views.update_order, name = 'update_order'), | 11 | url(r'^update_order/$', views.update_order, name = 'update_order'), |
11 | url(r'^update_resource_order/$', views.update_resource_order, name = 'update_resource_order'), | 12 | url(r'^update_resource_order/$', views.update_resource_order, name = 'update_resource_order'), |
12 | ] | 13 | ] |
topics/views.py
@@ -7,6 +7,11 @@ from django.utils.translation import ugettext_lazy as _ | @@ -7,6 +7,11 @@ from django.utils.translation import ugettext_lazy as _ | ||
7 | from django.contrib.auth.mixins import LoginRequiredMixin | 7 | from django.contrib.auth.mixins import LoginRequiredMixin |
8 | 8 | ||
9 | import json | 9 | import json |
10 | +import time | ||
11 | + | ||
12 | +from log.models import Log | ||
13 | +from log.mixins import LogMixin | ||
14 | +from log.decorators import log_decorator_ajax | ||
10 | 15 | ||
11 | from amadeus.permissions import has_subject_permissions | 16 | from amadeus.permissions import has_subject_permissions |
12 | 17 | ||
@@ -15,7 +20,12 @@ from subjects.models import Subject | @@ -15,7 +20,12 @@ from subjects.models import Subject | ||
15 | from .models import Topic, Resource | 20 | from .models import Topic, Resource |
16 | from .forms import TopicForm | 21 | from .forms import TopicForm |
17 | 22 | ||
18 | -class CreateView(LoginRequiredMixin, generic.edit.CreateView): | 23 | +class CreateView(LoginRequiredMixin, LogMixin, generic.edit.CreateView): |
24 | + log_component = 'topic' | ||
25 | + log_action = 'create' | ||
26 | + log_resource = 'topic' | ||
27 | + log_context = {} | ||
28 | + | ||
19 | login_url = reverse_lazy("users:login") | 29 | login_url = reverse_lazy("users:login") |
20 | redirect_field_name = 'next' | 30 | redirect_field_name = 'next' |
21 | 31 | ||
@@ -51,6 +61,18 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): | @@ -51,6 +61,18 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): | ||
51 | 61 | ||
52 | self.object.save() | 62 | self.object.save() |
53 | 63 | ||
64 | + self.log_context['category_id'] = self.object.subject.category.id | ||
65 | + self.log_context['category_name'] = self.object.subject.category.name | ||
66 | + self.log_context['category_slug'] = self.object.subject.category.slug | ||
67 | + self.log_context['subject_id'] = self.object.subject.id | ||
68 | + self.log_context['subject_name'] = self.object.subject.name | ||
69 | + self.log_context['subject_slug'] = self.object.subject.slug | ||
70 | + self.log_context['topic_id'] = self.object.id | ||
71 | + self.log_context['topic_name'] = self.object.name | ||
72 | + self.log_context['topic_slug'] = self.object.slug | ||
73 | + | ||
74 | + super(CreateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | ||
75 | + | ||
54 | return super(CreateView, self).form_valid(form) | 76 | return super(CreateView, self).form_valid(form) |
55 | 77 | ||
56 | def get_context_data(self, **kwargs): | 78 | def get_context_data(self, **kwargs): |
@@ -70,7 +92,12 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): | @@ -70,7 +92,12 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): | ||
70 | 92 | ||
71 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) | 93 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) |
72 | 94 | ||
73 | -class UpdateView(LoginRequiredMixin, generic.UpdateView): | 95 | +class UpdateView(LoginRequiredMixin, LogMixin, generic.UpdateView): |
96 | + log_component = 'topic' | ||
97 | + log_action = 'update' | ||
98 | + log_resource = 'topic' | ||
99 | + log_context = {} | ||
100 | + | ||
74 | login_url = reverse_lazy("users:login") | 101 | login_url = reverse_lazy("users:login") |
75 | redirect_field_name = 'next' | 102 | redirect_field_name = 'next' |
76 | 103 | ||
@@ -112,9 +139,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): | @@ -112,9 +139,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): | ||
112 | def get_success_url(self): | 139 | def get_success_url(self): |
113 | messages.success(self.request, _('Topic "%s" was updated on virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) | 140 | messages.success(self.request, _('Topic "%s" was updated on virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) |
114 | 141 | ||
142 | + self.log_context['category_id'] = self.object.subject.category.id | ||
143 | + self.log_context['category_name'] = self.object.subject.category.name | ||
144 | + self.log_context['category_slug'] = self.object.subject.category.slug | ||
145 | + self.log_context['subject_id'] = self.object.subject.id | ||
146 | + self.log_context['subject_name'] = self.object.subject.name | ||
147 | + self.log_context['subject_slug'] = self.object.subject.slug | ||
148 | + self.log_context['topic_id'] = self.object.id | ||
149 | + self.log_context['topic_name'] = self.object.name | ||
150 | + self.log_context['topic_slug'] = self.object.slug | ||
151 | + | ||
152 | + super(UpdateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | ||
153 | + | ||
115 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) | 154 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) |
116 | 155 | ||
117 | -class DeleteView(LoginRequiredMixin, generic.DeleteView): | 156 | +class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView): |
157 | + log_component = 'topic' | ||
158 | + log_action = 'delete' | ||
159 | + log_resource = 'topic' | ||
160 | + log_context = {} | ||
161 | + | ||
118 | login_url = reverse_lazy("users:login") | 162 | login_url = reverse_lazy("users:login") |
119 | redirect_field_name = 'next' | 163 | redirect_field_name = 'next' |
120 | 164 | ||
@@ -146,8 +190,48 @@ class DeleteView(LoginRequiredMixin, generic.DeleteView): | @@ -146,8 +190,48 @@ class DeleteView(LoginRequiredMixin, generic.DeleteView): | ||
146 | def get_success_url(self): | 190 | def get_success_url(self): |
147 | messages.success(self.request, _('Topic "%s" was removed from virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) | 191 | messages.success(self.request, _('Topic "%s" was removed from virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) |
148 | 192 | ||
193 | + self.log_context['category_id'] = self.object.subject.category.id | ||
194 | + self.log_context['category_name'] = self.object.subject.category.name | ||
195 | + self.log_context['category_slug'] = self.object.subject.category.slug | ||
196 | + self.log_context['subject_id'] = self.object.subject.id | ||
197 | + self.log_context['subject_name'] = self.object.subject.name | ||
198 | + self.log_context['subject_slug'] = self.object.subject.slug | ||
199 | + self.log_context['topic_id'] = self.object.id | ||
200 | + self.log_context['topic_name'] = self.object.name | ||
201 | + self.log_context['topic_slug'] = self.object.slug | ||
202 | + | ||
203 | + super(DeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) | ||
204 | + | ||
149 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) | 205 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) |
150 | 206 | ||
207 | +@log_decorator_ajax('topic', 'view', 'topic') | ||
208 | +def topic_view_log(request, topic): | ||
209 | + action = request.GET.get('action') | ||
210 | + | ||
211 | + if action == 'open': | ||
212 | + topic = get_object_or_404(Topic, id = topic) | ||
213 | + | ||
214 | + log_context = {} | ||
215 | + log_context['category_id'] = topic.subject.category.id | ||
216 | + log_context['category_name'] = topic.subject.category.name | ||
217 | + log_context['category_slug'] = topic.subject.category.slug | ||
218 | + log_context['subject_id'] = topic.subject.id | ||
219 | + log_context['subject_name'] = topic.subject.name | ||
220 | + log_context['subject_slug'] = topic.subject.slug | ||
221 | + log_context['topic_id'] = topic.id | ||
222 | + log_context['topic_name'] = topic.name | ||
223 | + log_context['topic_slug'] = topic.slug | ||
224 | + log_context['timestamp_start'] = str(int(time.time())) | ||
225 | + log_context['timestamp_end'] = '-1' | ||
226 | + | ||
227 | + request.log_context = log_context | ||
228 | + | ||
229 | + log_id = Log.objects.latest('id').id | ||
230 | + | ||
231 | + return JsonResponse({'message': 'ok', 'log_id': log_id}) | ||
232 | + | ||
233 | + return JsonResponse({'message': 'ok'}) | ||
234 | + | ||
151 | def update_order(request): | 235 | def update_order(request): |
152 | data = request.GET.get('data', None) | 236 | data = request.GET.get('data', None) |
153 | 237 |