Commit 61d40e31c15c5e61b3340657eda412061911e417
1 parent
fd16faee
Exists in
master
and in
5 other branches
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 |