Commit 2ef81f0af9e16a3029783986234cfead6d8e167f

Authored by Zambom
1 parent 6e69b2da

Adding topic log

amadeus/static/js/topics.js
1 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 30 // Update breadcrumb with topic's name
14 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 47 // Reset breadcrumb to it's normal state
31 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 82 // utilizado para fazer a re-organização dos tópicos
49 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 106 function sendUpdate(data) {
... ... @@ -94,9 +128,9 @@ function delete_topic(url) {
94 128 }
95 129  
96 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 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 137 \ No newline at end of file
... ...
subjects/templates/subjects/subject_card.html
... ... @@ -42,7 +42,7 @@
42 42 </div>
43 43 </div>
44 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 46 <input type="hidden" class="log_id" value="" />
47 47  
48 48 <div class="row">
... ...
topics/templates/topics/list.html
... ... @@ -37,6 +37,9 @@
37 37 <div id="{{topic.slug}}" class="panel-collapse collapse category-panel-content topic-panel">
38 38 <input type="hidden" class="id_inp" name="id" value="{{ topic.id }}" />
39 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 44 {% autoescape off %}
42 45 {{ topic.description }}
... ...
topics/urls.py
... ... @@ -7,6 +7,7 @@ urlpatterns = [
7 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
8 8 url(r'^update/(?P<sub_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'),
9 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 11 url(r'^update_order/$', views.update_order, name = 'update_order'),
11 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 7 from django.contrib.auth.mixins import LoginRequiredMixin
8 8  
9 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 16 from amadeus.permissions import has_subject_permissions
12 17  
... ... @@ -15,7 +20,12 @@ from subjects.models import Subject
15 20 from .models import Topic, Resource
16 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 29 login_url = reverse_lazy("users:login")
20 30 redirect_field_name = 'next'
21 31  
... ... @@ -51,6 +61,18 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
51 61  
52 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 76 return super(CreateView, self).form_valid(form)
55 77  
56 78 def get_context_data(self, **kwargs):
... ... @@ -70,7 +92,12 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
70 92  
71 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 101 login_url = reverse_lazy("users:login")
75 102 redirect_field_name = 'next'
76 103  
... ... @@ -112,9 +139,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView):
112 139 def get_success_url(self):
113 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 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 162 login_url = reverse_lazy("users:login")
119 163 redirect_field_name = 'next'
120 164  
... ... @@ -146,8 +190,48 @@ class DeleteView(LoginRequiredMixin, generic.DeleteView):
146 190 def get_success_url(self):
147 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 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 235 def update_order(request):
152 236 data = request.GET.get('data', None)
153 237  
... ...