From 61d40e31c15c5e61b3340657eda412061911e417 Mon Sep 17 00:00:00 2001 From: Zambom Date: Sat, 5 Nov 2016 21:32:25 -0300 Subject: [PATCH] Adding file crud log functions [Issue: #245] --- courses/views.py | 32 ++++++++++++++++++++++++++++++-- files/views.py | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 127 insertions(+), 8 deletions(-) diff --git a/courses/views.py b/courses/views.py index 554317d..45f84c5 100644 --- a/courses/views.py +++ b/courses/views.py @@ -941,11 +941,39 @@ class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView): context['subject_categories'] = SubjectCategory.objects.all() return context -class FileMaterialView(LoginRequiredMixin, generic.DetailView): +class FileMaterialView(LoginRequiredMixin, LogMixin, generic.DetailView): + log_component = 'file' + log_resource = 'file' + log_action = 'viewed' + log_context = {} allowed_roles = ['professor', 'system_admin', 'student'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' model = Material context_object_name = 'file' - template_name = 'topic/file_material_view.html' \ No newline at end of file + template_name = 'topic/file_material_view.html' + + def dispatch(self, *args, **kwargs): + file = get_object_or_404(TopicFile, slug = self.kwargs.get('slug')) + + self.log_context['file_id'] = file.id + self.log_context['file_name'] = file.name + self.log_context['topic_id'] = file.topic.id + self.log_context['topic_name'] = file.topic.name + self.log_context['topic_slug'] = file.topic.slug + self.log_context['subject_id'] = file.topic.subject.id + self.log_context['subject_name'] = file.topic.subject.name + self.log_context['subject_slug'] = file.topic.subject.slug + self.log_context['course_id'] = file.topic.subject.course.id + self.log_context['course_name'] = file.topic.subject.course.name + self.log_context['course_slug'] = file.topic.subject.course.slug + self.log_context['course_category_id'] = file.topic.subject.course.category.id + self.log_context['course_category_name'] = file.topic.subject.course.category.name + + super(FileMaterialView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + self.request.session['time_spent'] = str(datetime.now()) + self.request.session['log_id'] = Log.objects.latest('id').id + + return super(FileMaterialView, self).dispatch(*args, **kwargs) diff --git a/files/views.py b/files/views.py index fd239b1..f85faaa 100644 --- a/files/views.py +++ b/files/views.py @@ -10,12 +10,19 @@ from .forms import FileForm, UpdateFileForm from .models import TopicFile from .utils import mime_type_to_material_icons from courses.models import Topic -from core.models import MimeType -from core.mixins import NotificationMixin +from core.decorators import log_decorator +from core.models import Log, MimeType +from core.mixins import LogMixin, NotificationMixin from django.urls import reverse +from datetime import datetime # Create your views here. -class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.edit.CreateView): +class CreateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView): + log_component = 'file' + log_resource = 'file' + log_action = 'create' + log_component = {} + allowed_roles = ['professor', 'system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' @@ -65,6 +72,22 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), users=self.object.topic.subject.students.all()) + self.log_context['file_id'] = self.object.id + self.log_context['file_name'] = self.object.name + self.log_context['topic_id'] = self.object.topic.id + self.log_context['topic_name'] = self.object.topic.name + self.log_context['topic_slug'] = self.object.topic.slug + self.log_context['subject_id'] = self.object.topic.subject.id + self.log_context['subject_name'] = self.object.topic.subject.name + self.log_context['subject_slug'] = self.object.topic.subject.slug + self.log_context['course_id'] = self.object.topic.subject.course.id + self.log_context['course_name'] = self.object.topic.subject.course.name + self.log_context['course_slug'] = self.object.topic.subject.course.slug + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name + + super(CreateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return self.get_success_url() def get_context_data(self, **kwargs): @@ -84,15 +107,41 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed return self.success_url +@log_decorator("file", "viewed", "file") def render_file(request, id): template_name = 'files/render_file.html' + file = get_object_or_404(TopicFile, id = id) + context = { - 'file': get_object_or_404(TopicFile, id = id) + 'file': file } + + log_context = {} + log_context['file_id'] = file.id + log_context['file_name'] = file.name + log_context['topic_id'] = file.topic.id + log_context['topic_name'] = file.topic.name + log_context['topic_slug'] = file.topic.slug + log_context['subject_id'] = file.topic.subject.id + log_context['subject_name'] = file.topic.subject.name + log_context['subject_slug'] = file.topic.subject.slug + log_context['course_id'] = file.topic.subject.course.id + log_context['course_name'] = file.topic.subject.course.name + log_context['course_slug'] = file.topic.subject.course.slug + log_context['course_category_id'] = file.topic.subject.course.category.id + log_context['course_category_name'] = file.topic.subject.course.category.name + + request.log_context = log_context + return render(request, template_name, context) -class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): +class UpdateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView): + log_component = 'file' + log_resource = 'resource' + log_action = 'update' + log_context = {} + allowed_roles = ['professor', 'system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' @@ -108,6 +157,27 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): return context + def form_valid(self, form): + self.object = form.save() + + self.log_context['file_id'] = self.object.id + self.log_context['file_name'] = self.object.name + self.log_context['topic_id'] = self.object.topic.id + self.log_context['topic_name'] = self.object.topic.name + self.log_context['topic_slug'] = self.object.topic.slug + self.log_context['subject_id'] = self.object.topic.subject.id + self.log_context['subject_name'] = self.object.topic.subject.name + self.log_context['subject_slug'] = self.object.topic.subject.slug + self.log_context['course_id'] = self.object.topic.subject.course.id + self.log_context['course_name'] = self.object.topic.subject.course.name + self.log_context['course_slug'] = self.object.topic.subject.course.slug + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name + + super(UpdateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + return super(UpdateFile, self).form_valid(form) + def get_object(self, queryset=None): return get_object_or_404(TopicFile, slug = self.kwargs.get('slug')) @@ -117,7 +187,12 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): return self.success_url -class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): +class DeleteFile(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView): + log_component = 'file' + log_resource = 'file' + log_action = 'delete' + log_context = {} + allowed_roles = ['professor', 'system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' @@ -139,4 +214,20 @@ class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): return context def get_success_url(self): + self.log_context['file_id'] = self.object.id + self.log_context['file_name'] = self.object.name + self.log_context['topic_id'] = self.object.topic.id + self.log_context['topic_name'] = self.object.topic.name + self.log_context['topic_slug'] = self.object.topic.slug + self.log_context['subject_id'] = self.object.topic.subject.id + self.log_context['subject_name'] = self.object.topic.subject.name + self.log_context['subject_slug'] = self.object.topic.subject.slug + self.log_context['course_id'] = self.object.topic.subject.course.id + self.log_context['course_name'] = self.object.topic.subject.course.name + self.log_context['course_slug'] = self.object.topic.subject.course.slug + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name + + super(DeleteFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) \ No newline at end of file -- libgit2 0.21.2