diff --git a/mural/templates/mural/list_category.html b/mural/templates/mural/list_category.html index 2c01329..601135e 100644 --- a/mural/templates/mural/list_category.html +++ b/mural/templates/mural/list_category.html @@ -66,6 +66,9 @@
+ + +
diff --git a/mural/templates/mural/list_subject.html b/mural/templates/mural/list_subject.html index 0566574..10be2bc 100644 --- a/mural/templates/mural/list_subject.html +++ b/mural/templates/mural/list_subject.html @@ -65,6 +65,9 @@
+ + +
diff --git a/mural/urls.py b/mural/urls.py index 2ac1c19..64e6f68 100644 --- a/mural/urls.py +++ b/mural/urls.py @@ -19,6 +19,8 @@ urlpatterns = [ url(r'^resource/(?P[\w_-]+)/$', views.ResourceView.as_view(), name='resource_view'), url(r'^load_category/([\w_-]+)/$', views.load_category_posts, name='load_category'), url(r'^load_subject/([\w_-]+)/$', views.load_subject_posts, name='load_subject'), + url(r'^view_log_cat/(?P[\w_-]+)/$', views.mural_category_log, name = 'view_log_cat'), + url(r'^view_log_sub/(?P[\w_-]+)/$', views.mural_subject_log, name = 'view_log_sub'), url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), url(r'^deleted/$', views.deleted_post, name='deleted_post'), url(r'^comment/(?P[\w_-]+)/$', views.CommentCreate.as_view(), name='create_comment'), diff --git a/mural/views.py b/mural/views.py index 76722fe..59b3550 100644 --- a/mural/views.py +++ b/mural/views.py @@ -19,6 +19,11 @@ from subjects.models import Subject from topics.models import Resource from users.models import User +from log.models import Log +from log.mixins import LogMixin +from log.decorators import log_decorator, log_decorator_ajax +import time + from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites, Comment from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, ResourcePostForm, CommentForm from .utils import getSpaceUsers @@ -28,7 +33,12 @@ from amadeus.permissions import has_subject_view_permissions, has_resource_permi """ Section for GeneralPost classes """ -class GeneralIndex(LoginRequiredMixin, generic.ListView): +class GeneralIndex(LoginRequiredMixin, LogMixin, generic.ListView): + log_component = "mural" + log_action = "view" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -80,6 +90,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView): if page: self.template_name = "mural/_list_view.html" + else: + self.log_context['timestamp_start'] = str(int(time.time())) + + super(GeneralIndex, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + self.request.session['log_id'] = Log.objects.latest('id').id context['title'] = _('Mural') context['totals'] = self.totals @@ -99,7 +115,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView): return context -class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): +class GeneralCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = "mural" + log_action = "create_post" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -144,6 +165,8 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): MuralVisualizations.objects.bulk_create(entries) + super(GeneralCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(GeneralCreate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -156,7 +179,12 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'gen', )) -class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): +class GeneralUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = "mural" + log_action = "edit_post" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -193,6 +221,10 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + + self.log_context['post_id'] = str(self.object.id) + + super(GeneralUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) return super(GeneralUpdate, self).form_valid(form) @@ -206,7 +238,12 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'gen', )) -class GeneralDelete(LoginRequiredMixin, generic.DeleteView): +class GeneralDelete(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = "mural" + log_action = "delete_post" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -238,6 +275,10 @@ class GeneralDelete(LoginRequiredMixin, generic.DeleteView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + self.log_context['post_id'] = str(self.object.id) + + super(GeneralDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('mural:deleted_post') """ @@ -327,7 +368,12 @@ class CategoryIndex(LoginRequiredMixin, generic.ListView): return context -class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): +class CategoryCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = "mural" + log_action = "create_post" + log_resource = "category" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -376,6 +422,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): MuralVisualizations.objects.bulk_create(entries) + self.log_context['category_id'] = self.object.space.id + self.log_context['category_name'] = self.object.space.name + self.log_context['category_slug'] = self.object.space.slug + + super(CategoryCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(CategoryCreate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -388,7 +440,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'cat', )) -class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): +class CategoryUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = "mural" + log_action = "edit_post" + log_resource = "category" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -426,6 +483,13 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + self.log_context['post_id'] = self.object.id + self.log_context['category_id'] = self.object.space.id + self.log_context['category_name'] = self.object.space.name + self.log_context['category_slug'] = self.object.space.slug + + super(CategoryUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(CategoryUpdate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -438,7 +502,12 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'cat', )) -class CategoryDelete(LoginRequiredMixin, generic.DeleteView): +class CategoryDelete(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = "mural" + log_action = "delete_post" + log_resource = "category" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -470,8 +539,37 @@ class CategoryDelete(LoginRequiredMixin, generic.DeleteView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + self.log_context['post_id'] = self.object.id + self.log_context['category_id'] = self.object.space.id + self.log_context['category_name'] = self.object.space.name + self.log_context['category_slug'] = self.object.space.slug + + super(CategoryDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('mural:deleted_post') +@log_decorator_ajax('mural', 'view', 'category') +def mural_category_log(request, category): + action = request.GET.get('action') + + if action == 'open': + category = get_object_or_404(Category, id = category) + + log_context = {} + log_context['category_id'] = category.id + log_context['category_name'] = category.name + log_context['category_slug'] = category.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'}) + """ Section for SubjectPost classes """ @@ -559,7 +657,12 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView): return context -class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): +class SubjectCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = "mural" + log_action = "create_post" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -625,6 +728,17 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): MuralVisualizations.objects.bulk_create(entries) + self.log_context['subject_id'] = self.object.space.id + self.log_context['subject_name'] = self.object.space.name + self.log_context['subject_slug'] = self.object.space.slug + + if self.object.resource: + self.log_context['resource_id'] = self.object.resource.id + self.log_context['resource_name'] = self.object.resource.name + self.log_context['resource_slug'] = self.object.resource.slug + + super(SubjectCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(SubjectCreate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -637,7 +751,12 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'sub', )) -class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): +class SubjectUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = "mural" + log_action = "edit_post" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -694,6 +813,18 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + + self.log_context['post_id'] = self.object.id + self.log_context['subject_id'] = self.object.space.id + self.log_context['subject_name'] = self.object.space.name + self.log_context['subject_slug'] = self.object.space.slug + + if self.object.resource: + self.log_context['resource_id'] = self.object.resource.id + self.log_context['resource_name'] = self.object.resource.name + self.log_context['resource_slug'] = self.object.resource.slug + + super(SubjectUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) return super(SubjectUpdate, self).form_valid(form) @@ -707,7 +838,12 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'sub', )) -class SubjectDelete(LoginRequiredMixin, generic.DeleteView): +class SubjectDelete(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = "mural" + log_action = "delete_post" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -745,9 +881,26 @@ class SubjectDelete(LoginRequiredMixin, generic.DeleteView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + self.log_context['post_id'] = self.object.id + self.log_context['subject_id'] = self.object.space.id + self.log_context['subject_name'] = self.object.space.name + self.log_context['subject_slug'] = self.object.space.slug + + if self.object.resource: + self.log_context['resource_id'] = self.object.resource.id + self.log_context['resource_name'] = self.object.resource.name + self.log_context['resource_slug'] = self.object.resource.slug + + super(SubjectDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('mural:deleted_post') -class SubjectView(LoginRequiredMixin, generic.ListView): +class SubjectView(LoginRequiredMixin, LogMixin, generic.ListView): + log_component = "mural" + log_action = "view" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -802,6 +955,15 @@ class SubjectView(LoginRequiredMixin, generic.ListView): if page: self.template_name = "mural/_list_view.html" + else: + self.log_context['subject_id'] = subject.id + self.log_context['subject_name'] = subject.name + self.log_context['subject_slug'] = subject.slug + self.log_context['timestamp_start'] = str(int(time.time())) + + super(SubjectView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + self.request.session['log_id'] = Log.objects.latest('id').id context['title'] = _('%s - Mural')%(str(subject)) context['subject'] = subject @@ -820,10 +982,37 @@ class SubjectView(LoginRequiredMixin, generic.ListView): return context +@log_decorator_ajax('mural', 'view', 'subject') +def mural_subject_log(request, subject): + action = request.GET.get('action') + + if action == 'open': + subject = get_object_or_404(Subject, id = subject) + + log_context = {} + log_context['subject_id'] = subject.id + log_context['subject_name'] = subject.name + log_context['subject_slug'] = subject.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'}) + """ Section for specific resource post classes """ -class ResourceView(LoginRequiredMixin, generic.ListView): +class ResourceView(LoginRequiredMixin, LogMixin, generic.ListView): + log_component = "mural" + log_action = "view" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -879,6 +1068,18 @@ class ResourceView(LoginRequiredMixin, generic.ListView): if page: self.template_name = "mural/_list_view.html" + else: + self.log_context['subject_id'] = resource.topic.subject.id + self.log_context['subject_name'] = resource.topic.subject.name + self.log_context['subject_slug'] = resource.topic.subject.slug + self.log_context['resource_id'] = resource.id + self.log_context['resource_name'] = resource.name + self.log_context['resource_slug'] = resource.slug + self.log_context['timestamp_start'] = str(int(time.time())) + + super(ResourceView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + self.request.session['log_id'] = Log.objects.latest('id').id context['title'] = _('%s - Mural')%(str(resource)) context['subject'] = resource.topic.subject @@ -898,7 +1099,12 @@ class ResourceView(LoginRequiredMixin, generic.ListView): return context -class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView): +class ResourceCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = "mural" + log_action = "create_post" + log_resource = "subject" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -957,6 +1163,17 @@ class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView): MuralVisualizations.objects.bulk_create(entries) + self.log_context['subject_id'] = self.object.space.id + self.log_context['subject_name'] = self.object.space.name + self.log_context['subject_slug'] = self.object.space.slug + + if self.object.resource: + self.log_context['resource_id'] = self.object.resource.id + self.log_context['resource_name'] = self.object.resource.name + self.log_context['resource_slug'] = self.object.resource.slug + + super(ResourceCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(ResourceCreate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -1014,7 +1231,12 @@ def favorite(request, post): """ Section for comment functions """ -class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): +class CommentCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = "mural" + log_action = "create_comment" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -1073,6 +1295,30 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): MuralVisualizations.objects.bulk_create(entries) + self.log_context = {} + self.log_context['post_id'] = str(post.id) + + if post._my_subclass == "categorypost": + self.log_resource = "category" + + self.log_context['category_id'] = post.categorypost.space.id + self.log_context['category_name'] = post.categorypost.space.name + self.log_context['category_slug'] = post.categorypost.space.slug + + elif post._my_subclass == "subjectpost": + self.log_resource = "subject" + + self.log_context['subject_id'] = post.subjectpost.space.id + self.log_context['subject_name'] = post.subjectpost.space.name + self.log_context['subject_slug'] = post.subjectpost.space.slug + + if post.subjectpost.resource: + self.log_context['resource_id'] = post.subjectpost.resource.id + self.log_context['resource_name'] = post.subjectpost.resource.name + self.log_context['resource_slug'] = post.subjectpost.resource.slug + + super(CommentCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return super(CommentCreate, self).form_valid(form) def get_context_data(self, *args, **kwargs): @@ -1087,7 +1333,12 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): def get_success_url(self): return reverse_lazy('mural:render_comment', args = (self.object.id, 'create', )) -class CommentUpdate(LoginRequiredMixin, generic.UpdateView): +class CommentUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = "mural" + log_action = "edit_comment" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -1134,6 +1385,31 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + + self.log_context = {} + self.log_context['post_id'] = str(self.object.post.id) + self.log_context['comment_id'] = str(self.object.id) + + if self.object.post._my_subclass == "categorypost": + self.log_resource = "category" + + self.log_context['category_id'] = self.object.post.categorypost.space.id + self.log_context['category_name'] = self.object.post.categorypost.space.name + self.log_context['category_slug'] = self.object.post.categorypost.space.slug + + elif self.object.post._my_subclass == "subjectpost": + self.log_resource = "subject" + + self.log_context['subject_id'] = self.object.post.subjectpost.space.id + self.log_context['subject_name'] = self.object.post.subjectpost.space.name + self.log_context['subject_slug'] = self.object.post.subjectpost.space.slug + + if self.object.post.subjectpost.resource: + self.log_context['resource_id'] = self.object.post.subjectpost.resource.id + self.log_context['resource_name'] = self.object.post.subjectpost.resource.name + self.log_context['resource_slug'] = self.object.post.subjectpost.resource.slug + + super(CommentUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) return super(CommentUpdate, self).form_valid(form) @@ -1147,7 +1423,12 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView): def get_success_url(self): return reverse_lazy('mural:render_comment', args = (self.object.id, 'update', )) -class CommentDelete(LoginRequiredMixin, generic.DeleteView): +class CommentDelete(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = "mural" + log_action = "delete_comment" + log_resource = "general" + log_context = {} + login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -1189,6 +1470,31 @@ class CommentDelete(LoginRequiredMixin, generic.DeleteView): for user in users: Group("user-%s" % user.id).send({'text': notification}) + self.log_context = {} + self.log_context['post_id'] = str(self.object.post.id) + self.log_context['comment_id'] = str(self.object.id) + + if self.object.post._my_subclass == "categorypost": + self.log_resource = "category" + + self.log_context['category_id'] = self.object.post.categorypost.space.id + self.log_context['category_name'] = self.object.post.categorypost.space.name + self.log_context['category_slug'] = self.object.post.categorypost.space.slug + + elif self.object.post._my_subclass == "subjectpost": + self.log_resource = "subject" + + self.log_context['subject_id'] = self.object.post.subjectpost.space.id + self.log_context['subject_name'] = self.object.post.subjectpost.space.name + self.log_context['subject_slug'] = self.object.post.subjectpost.space.slug + + if self.object.post.subjectpost.resource: + self.log_context['resource_id'] = self.object.post.subjectpost.resource.id + self.log_context['resource_name'] = self.object.post.subjectpost.resource.name + self.log_context['resource_slug'] = self.object.post.subjectpost.resource.slug + + super(CommentDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + return reverse_lazy('mural:deleted_comment') def render_comment(request, comment, msg): -- libgit2 0.21.2