diff --git a/amadeus/static/js/topics.js b/amadeus/static/js/topics.js index 1a26f35..6cd98e6 100644 --- a/amadeus/static/js/topics.js +++ b/amadeus/static/js/topics.js @@ -1,72 +1,106 @@ $('.topic-panel').on('show.bs.collapse', function (e) { - if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-right'); - - btn = btn[0]; - - $(btn).switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); - - $(this).parent().parent().find('.panel-collapse.in').collapse('hide'); - } + if($(this).is(e.target)){ + var btn = $(this).parent().find('.fa-angle-right'); + + btn = btn[0]; + + $(btn).switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); + + var url = $(this).parent().find('.log_url').val(); + var log_input = $(this).parent().find('.log_id'); + + if (typeof(url) != 'undefined') { + $.ajax({ + url: url, + data: {'action': 'open'}, + dataType: 'json', + success: function (data) { + log_input.val(data.log_id); + }, + error: function (data) { + console.log(data); + } + }); + } + + $(this).parent().parent().find('.panel-collapse.in').collapse('hide'); + } }); // Update breadcrumb with topic's name $('.topic-panel').on('shown.bs.collapse', function (e) { - if($(this).is(e.target)){ - var li = $(".breadcrumb").find('li:last-child'); - var li_text = $(li).html(); - var url = $(".subs_url").val(); - var new_li = $(li).clone(); - - new_li.html($(this).parent().find('.panel-title').text()); - - $(li).html("" + li_text + ""); - $(li).append("/"); - - new_li.appendTo('.breadcrumb'); - } + if($(this).is(e.target)){ + var li = $(".breadcrumb").find('li:last-child'); + var li_text = $(li).html(); + var url = $(".subs_url").val(); + var new_li = $(li).clone(); + + new_li.html($(this).parent().find('.panel-title').text()); + + $(li).html("" + li_text + ""); + $(li).append("/"); + + new_li.appendTo('.breadcrumb'); + } }); // Reset breadcrumb to it's normal state $('.topic-panel').on('hide.bs.collapse', function (e) { - if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-down'); - - btn = btn[0]; - - $(btn).switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); - - $(".breadcrumb").find('li:last-child').remove(); - - var li = $(".breadcrumb").find('li:last-child'); - var text = $(li).find('a').text(); - - $(li).html(text); + if($(this).is(e.target)){ + var btn = $(this).parent().find('.fa-angle-down'); + + btn = btn[0]; + + $(btn).switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); + + $(".breadcrumb").find('li:last-child').remove(); + + var li = $(".breadcrumb").find('li:last-child'); + var text = $(li).find('a').text(); + + $(li).html(text); + + var url = $(this).parent().find('.log_url').val(); + var log_id = $(this).parent().find('.log_id').val(); + + if (typeof(url) != 'undefined') { + $.ajax({ + url: url, + data: {'action': 'close', 'log_id': log_id}, + dataType: 'json', + success: function (data) { + console.log(data.message); + }, + error: function (data) { + console.log(data); + } + }); + } } }); // utilizado para fazer a re-organização dos tópicos $("#topics-accordion").sortable({ - delay: 100, - distance: 5, - handle: 'i.move_topic', - update: function( event, ui ) { - var cont = 1; - var data = []; - - $("#topics-accordion").find('.order_inp').each(function () { - $(this).val(cont++); - - data.push({ - 'topic_id': $(this).parent().find('.id_inp').val(), - 'topic_order': $(this).val() - }); - }); - - data = JSON.stringify(data); - - sendUpdate(data); - }, + delay: 100, + distance: 5, + handle: 'i.move_topic', + update: function( event, ui ) { + var cont = 1; + var data = []; + + $("#topics-accordion").find('.order_inp').each(function () { + $(this).val(cont++); + + data.push({ + 'topic_id': $(this).parent().find('.id_inp').val(), + 'topic_order': $(this).val() + }); + }); + + data = JSON.stringify(data); + + sendUpdate(data); + }, }); function sendUpdate(data) { @@ -94,9 +128,9 @@ function delete_topic(url) { } $(".add_resource").on('show.bs.dropdown', function () { - $(this).find('i.fa-angle-right').switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); + $(this).find('i.fa-angle-right').switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); }); $(".add_resource").on('hide.bs.dropdown', function () { - $(this).find('i.fa-angle-down').switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); + $(this).find('i.fa-angle-down').switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); }); \ No newline at end of file diff --git a/subjects/templates/subjects/subject_card.html b/subjects/templates/subjects/subject_card.html index f0b55df..e2c6eef 100644 --- a/subjects/templates/subjects/subject_card.html +++ b/subjects/templates/subjects/subject_card.html @@ -42,7 +42,7 @@
- +
diff --git a/topics/templates/topics/list.html b/topics/templates/topics/list.html index 23491a7..69a7390 100644 --- a/topics/templates/topics/list.html +++ b/topics/templates/topics/list.html @@ -37,6 +37,9 @@
+ + + {% autoescape off %} {{ topic.description }} diff --git a/topics/urls.py b/topics/urls.py index 2058186..7063692 100644 --- a/topics/urls.py +++ b/topics/urls.py @@ -7,6 +7,7 @@ urlpatterns = [ url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), url(r'^update/(?P[\w_-]+)/(?P[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), url(r'^delete/(?P[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), + url(r'^view_log/(?P[\w_-]+)/$', views.topic_view_log, name = 'view_log'), url(r'^update_order/$', views.update_order, name = 'update_order'), url(r'^update_resource_order/$', views.update_resource_order, name = 'update_resource_order'), ] diff --git a/topics/views.py b/topics/views.py index dff6f18..c459fea 100644 --- a/topics/views.py +++ b/topics/views.py @@ -7,6 +7,11 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.mixins import LoginRequiredMixin import json +import time + +from log.models import Log +from log.mixins import LogMixin +from log.decorators import log_decorator_ajax from amadeus.permissions import has_subject_permissions @@ -15,7 +20,12 @@ from subjects.models import Subject from .models import Topic, Resource from .forms import TopicForm -class CreateView(LoginRequiredMixin, generic.edit.CreateView): +class CreateView(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = 'topic' + log_action = 'create' + log_resource = 'topic' + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -51,6 +61,18 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): self.object.save() + self.log_context['category_id'] = self.object.subject.category.id + self.log_context['category_name'] = self.object.subject.category.name + self.log_context['category_slug'] = self.object.subject.category.slug + self.log_context['subject_id'] = self.object.subject.id + self.log_context['subject_name'] = self.object.subject.name + self.log_context['subject_slug'] = self.object.subject.slug + self.log_context['topic_id'] = self.object.id + self.log_context['topic_name'] = self.object.name + self.log_context['topic_slug'] = self.object.slug + + super(CreateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(CreateView, self).form_valid(form) def get_context_data(self, **kwargs): @@ -70,7 +92,12 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) -class UpdateView(LoginRequiredMixin, generic.UpdateView): +class UpdateView(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = 'topic' + log_action = 'update' + log_resource = 'topic' + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -112,9 +139,26 @@ class UpdateView(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): messages.success(self.request, _('Topic "%s" was updated on virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) + self.log_context['category_id'] = self.object.subject.category.id + self.log_context['category_name'] = self.object.subject.category.name + self.log_context['category_slug'] = self.object.subject.category.slug + self.log_context['subject_id'] = self.object.subject.id + self.log_context['subject_name'] = self.object.subject.name + self.log_context['subject_slug'] = self.object.subject.slug + self.log_context['topic_id'] = self.object.id + self.log_context['topic_name'] = self.object.name + self.log_context['topic_slug'] = self.object.slug + + super(UpdateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) -class DeleteView(LoginRequiredMixin, generic.DeleteView): +class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = 'topic' + log_action = 'delete' + log_resource = 'topic' + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -146,8 +190,48 @@ class DeleteView(LoginRequiredMixin, generic.DeleteView): def get_success_url(self): messages.success(self.request, _('Topic "%s" was removed from virtual enviroment "%s" successfully!')%(self.object.name, self.object.subject.name)) + self.log_context['category_id'] = self.object.subject.category.id + self.log_context['category_name'] = self.object.subject.category.name + self.log_context['category_slug'] = self.object.subject.category.slug + self.log_context['subject_id'] = self.object.subject.id + self.log_context['subject_name'] = self.object.subject.name + self.log_context['subject_slug'] = self.object.subject.slug + self.log_context['topic_id'] = self.object.id + self.log_context['topic_name'] = self.object.name + self.log_context['topic_slug'] = self.object.slug + + super(DeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.subject.slug}) +@log_decorator_ajax('topic', 'view', 'topic') +def topic_view_log(request, topic): + action = request.GET.get('action') + + if action == 'open': + topic = get_object_or_404(Topic, id = topic) + + log_context = {} + log_context['category_id'] = topic.subject.category.id + log_context['category_name'] = topic.subject.category.name + log_context['category_slug'] = topic.subject.category.slug + log_context['subject_id'] = topic.subject.id + log_context['subject_name'] = topic.subject.name + log_context['subject_slug'] = topic.subject.slug + log_context['topic_id'] = topic.id + log_context['topic_name'] = topic.name + log_context['topic_slug'] = topic.slug + log_context['timestamp_start'] = str(int(time.time())) + log_context['timestamp_end'] = '-1' + + request.log_context = log_context + + log_id = Log.objects.latest('id').id + + return JsonResponse({'message': 'ok', 'log_id': log_id}) + + return JsonResponse({'message': 'ok'}) + def update_order(request): data = request.GET.get('data', None) -- libgit2 0.21.2