Commit 2ef81f0af9e16a3029783986234cfead6d8e167f

Authored by Zambom
1 parent 6e69b2da

Adding topic log

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