Commit 61d40e31c15c5e61b3340657eda412061911e417

Authored by Zambom
1 parent fd16faee

Adding file crud log functions [Issue: #245]

Showing 2 changed files with 127 additions and 8 deletions   Show diff stats
courses/views.py
@@ -941,11 +941,39 @@ class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView): @@ -941,11 +941,39 @@ class IndexSubjectCategoryView(LoginRequiredMixin, generic.ListView):
941 context['subject_categories'] = SubjectCategory.objects.all() 941 context['subject_categories'] = SubjectCategory.objects.all()
942 return context 942 return context
943 943
944 -class FileMaterialView(LoginRequiredMixin, generic.DetailView): 944 +class FileMaterialView(LoginRequiredMixin, LogMixin, generic.DetailView):
  945 + log_component = 'file'
  946 + log_resource = 'file'
  947 + log_action = 'viewed'
  948 + log_context = {}
945 949
946 allowed_roles = ['professor', 'system_admin', 'student'] 950 allowed_roles = ['professor', 'system_admin', 'student']
947 login_url = reverse_lazy("core:home") 951 login_url = reverse_lazy("core:home")
948 redirect_field_name = 'next' 952 redirect_field_name = 'next'
949 model = Material 953 model = Material
950 context_object_name = 'file' 954 context_object_name = 'file'
951 - template_name = 'topic/file_material_view.html'  
952 \ No newline at end of file 955 \ No newline at end of file
  956 + template_name = 'topic/file_material_view.html'
  957 +
  958 + def dispatch(self, *args, **kwargs):
  959 + file = get_object_or_404(TopicFile, slug = self.kwargs.get('slug'))
  960 +
  961 + self.log_context['file_id'] = file.id
  962 + self.log_context['file_name'] = file.name
  963 + self.log_context['topic_id'] = file.topic.id
  964 + self.log_context['topic_name'] = file.topic.name
  965 + self.log_context['topic_slug'] = file.topic.slug
  966 + self.log_context['subject_id'] = file.topic.subject.id
  967 + self.log_context['subject_name'] = file.topic.subject.name
  968 + self.log_context['subject_slug'] = file.topic.subject.slug
  969 + self.log_context['course_id'] = file.topic.subject.course.id
  970 + self.log_context['course_name'] = file.topic.subject.course.name
  971 + self.log_context['course_slug'] = file.topic.subject.course.slug
  972 + self.log_context['course_category_id'] = file.topic.subject.course.category.id
  973 + self.log_context['course_category_name'] = file.topic.subject.course.category.name
  974 +
  975 + super(FileMaterialView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  976 +
  977 + self.request.session['time_spent'] = str(datetime.now())
  978 + self.request.session['log_id'] = Log.objects.latest('id').id
  979 +
  980 + return super(FileMaterialView, self).dispatch(*args, **kwargs)
files/views.py
@@ -10,12 +10,19 @@ from .forms import FileForm, UpdateFileForm @@ -10,12 +10,19 @@ from .forms import FileForm, UpdateFileForm
10 from .models import TopicFile 10 from .models import TopicFile
11 from .utils import mime_type_to_material_icons 11 from .utils import mime_type_to_material_icons
12 from courses.models import Topic 12 from courses.models import Topic
13 -from core.models import MimeType  
14 -from core.mixins import NotificationMixin 13 +from core.decorators import log_decorator
  14 +from core.models import Log, MimeType
  15 +from core.mixins import LogMixin, NotificationMixin
15 from django.urls import reverse 16 from django.urls import reverse
  17 +from datetime import datetime
16 18
17 # Create your views here. 19 # Create your views here.
18 -class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.edit.CreateView): 20 +class CreateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, NotificationMixin, generic.edit.CreateView):
  21 + log_component = 'file'
  22 + log_resource = 'file'
  23 + log_action = 'create'
  24 + log_component = {}
  25 +
19 allowed_roles = ['professor', 'system_admin'] 26 allowed_roles = ['professor', 'system_admin']
20 login_url = reverse_lazy("core:home") 27 login_url = reverse_lazy("core:home")
21 redirect_field_name = 'next' 28 redirect_field_name = 'next'
@@ -65,6 +72,22 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed @@ -65,6 +72,22 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed
65 resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]), 72 resource_name=self.object.name, resource_link= reverse('course:view_topic', args=[self.object.topic.slug]),
66 users=self.object.topic.subject.students.all()) 73 users=self.object.topic.subject.students.all())
67 74
  75 + self.log_context['file_id'] = self.object.id
  76 + self.log_context['file_name'] = self.object.name
  77 + self.log_context['topic_id'] = self.object.topic.id
  78 + self.log_context['topic_name'] = self.object.topic.name
  79 + self.log_context['topic_slug'] = self.object.topic.slug
  80 + self.log_context['subject_id'] = self.object.topic.subject.id
  81 + self.log_context['subject_name'] = self.object.topic.subject.name
  82 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  83 + self.log_context['course_id'] = self.object.topic.subject.course.id
  84 + self.log_context['course_name'] = self.object.topic.subject.course.name
  85 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  86 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  87 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  88 +
  89 + super(CreateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  90 +
68 return self.get_success_url() 91 return self.get_success_url()
69 92
70 def get_context_data(self, **kwargs): 93 def get_context_data(self, **kwargs):
@@ -84,15 +107,41 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed @@ -84,15 +107,41 @@ class CreateFile(LoginRequiredMixin, HasRoleMixin, NotificationMixin, generic.ed
84 107
85 return self.success_url 108 return self.success_url
86 109
  110 +@log_decorator("file", "viewed", "file")
87 def render_file(request, id): 111 def render_file(request, id):
88 template_name = 'files/render_file.html' 112 template_name = 'files/render_file.html'
  113 + file = get_object_or_404(TopicFile, id = id)
  114 +
89 context = { 115 context = {
90 - 'file': get_object_or_404(TopicFile, id = id) 116 + 'file': file
91 } 117 }
  118 +
  119 + log_context = {}
  120 + log_context['file_id'] = file.id
  121 + log_context['file_name'] = file.name
  122 + log_context['topic_id'] = file.topic.id
  123 + log_context['topic_name'] = file.topic.name
  124 + log_context['topic_slug'] = file.topic.slug
  125 + log_context['subject_id'] = file.topic.subject.id
  126 + log_context['subject_name'] = file.topic.subject.name
  127 + log_context['subject_slug'] = file.topic.subject.slug
  128 + log_context['course_id'] = file.topic.subject.course.id
  129 + log_context['course_name'] = file.topic.subject.course.name
  130 + log_context['course_slug'] = file.topic.subject.course.slug
  131 + log_context['course_category_id'] = file.topic.subject.course.category.id
  132 + log_context['course_category_name'] = file.topic.subject.course.category.name
  133 +
  134 + request.log_context = log_context
  135 +
92 return render(request, template_name, context) 136 return render(request, template_name, context)
93 137
94 138
95 -class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): 139 +class UpdateFile(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.UpdateView):
  140 + log_component = 'file'
  141 + log_resource = 'resource'
  142 + log_action = 'update'
  143 + log_context = {}
  144 +
96 allowed_roles = ['professor', 'system_admin'] 145 allowed_roles = ['professor', 'system_admin']
97 login_url = reverse_lazy("core:home") 146 login_url = reverse_lazy("core:home")
98 redirect_field_name = 'next' 147 redirect_field_name = 'next'
@@ -108,6 +157,27 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): @@ -108,6 +157,27 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
108 157
109 return context 158 return context
110 159
  160 + def form_valid(self, form):
  161 + self.object = form.save()
  162 +
  163 + self.log_context['file_id'] = self.object.id
  164 + self.log_context['file_name'] = self.object.name
  165 + self.log_context['topic_id'] = self.object.topic.id
  166 + self.log_context['topic_name'] = self.object.topic.name
  167 + self.log_context['topic_slug'] = self.object.topic.slug
  168 + self.log_context['subject_id'] = self.object.topic.subject.id
  169 + self.log_context['subject_name'] = self.object.topic.subject.name
  170 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  171 + self.log_context['course_id'] = self.object.topic.subject.course.id
  172 + self.log_context['course_name'] = self.object.topic.subject.course.name
  173 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  174 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  175 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  176 +
  177 + super(UpdateFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  178 +
  179 + return super(UpdateFile, self).form_valid(form)
  180 +
111 def get_object(self, queryset=None): 181 def get_object(self, queryset=None):
112 return get_object_or_404(TopicFile, slug = self.kwargs.get('slug')) 182 return get_object_or_404(TopicFile, slug = self.kwargs.get('slug'))
113 183
@@ -117,7 +187,12 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): @@ -117,7 +187,12 @@ class UpdateFile(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
117 return self.success_url 187 return self.success_url
118 188
119 189
120 -class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): 190 +class DeleteFile(LoginRequiredMixin, HasRoleMixin, LogMixin, generic.DeleteView):
  191 + log_component = 'file'
  192 + log_resource = 'file'
  193 + log_action = 'delete'
  194 + log_context = {}
  195 +
121 allowed_roles = ['professor', 'system_admin'] 196 allowed_roles = ['professor', 'system_admin']
122 login_url = reverse_lazy("core:home") 197 login_url = reverse_lazy("core:home")
123 redirect_field_name = 'next' 198 redirect_field_name = 'next'
@@ -139,4 +214,20 @@ class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): @@ -139,4 +214,20 @@ class DeleteFile(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
139 return context 214 return context
140 215
141 def get_success_url(self): 216 def get_success_url(self):
  217 + self.log_context['file_id'] = self.object.id
  218 + self.log_context['file_name'] = self.object.name
  219 + self.log_context['topic_id'] = self.object.topic.id
  220 + self.log_context['topic_name'] = self.object.topic.name
  221 + self.log_context['topic_slug'] = self.object.topic.slug
  222 + self.log_context['subject_id'] = self.object.topic.subject.id
  223 + self.log_context['subject_name'] = self.object.topic.subject.name
  224 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  225 + self.log_context['course_id'] = self.object.topic.subject.course.id
  226 + self.log_context['course_name'] = self.object.topic.subject.course.name
  227 + self.log_context['course_slug'] = self.object.topic.subject.course.slug
  228 + self.log_context['course_category_id'] = self.object.topic.subject.course.category.id
  229 + self.log_context['course_category_name'] = self.object.topic.subject.course.category.name
  230 +
  231 + super(DeleteFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  232 +
142 return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) 233 return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug})
143 \ No newline at end of file 234 \ No newline at end of file