Commit 44c1868c10bdb7695ee0a8533c0fde4210592962

Authored by Zambom
1 parent 4fcd4533

Adding mural logs

mural/templates/mural/list_category.html
@@ -66,6 +66,9 @@ @@ -66,6 +66,9 @@
66 </div> 66 </div>
67 </div> 67 </div>
68 <div id="{{category.slug}}" class="panel-collapse panel-body collapse mural-ungeneral"> 68 <div id="{{category.slug}}" class="panel-collapse panel-body collapse mural-ungeneral">
  69 + <input type="hidden" class="log_url" value="{% url 'mural:view_log_cat' category.id %}" />
  70 + <input type="hidden" class="log_id" value="" />
  71 +
69 <div class="col-md-12 cards-content mural" data-url="{% url 'mural:load_category' category.id %}"> 72 <div class="col-md-12 cards-content mural" data-url="{% url 'mural:load_category' category.id %}">
70 <div class="col-sm-12 col-xs-12 visible-xs visible-sm" style="padding-left: 0px"> 73 <div class="col-sm-12 col-xs-12 visible-xs visible-sm" style="padding-left: 0px">
71 <div class="post-filter post-filter-small"> 74 <div class="post-filter post-filter-small">
mural/templates/mural/list_subject.html
@@ -65,6 +65,9 @@ @@ -65,6 +65,9 @@
65 </div> 65 </div>
66 </div> 66 </div>
67 <div id="{{subject.slug}}" class="panel-collapse panel-body collapse mural-ungeneral"> 67 <div id="{{subject.slug}}" class="panel-collapse panel-body collapse mural-ungeneral">
  68 + <input type="hidden" class="log_url" value="{% url 'mural:view_log_sub' subject.id %}" />
  69 + <input type="hidden" class="log_id" value="" />
  70 +
68 <div class="col-md-12 cards-content mural" data-url="{% url 'mural:load_subject' subject.id %}"> 71 <div class="col-md-12 cards-content mural" data-url="{% url 'mural:load_subject' subject.id %}">
69 <div class="col-sm-12 col-xs-12 visible-xs visible-sm" style="padding-left: 0px"> 72 <div class="col-sm-12 col-xs-12 visible-xs visible-sm" style="padding-left: 0px">
70 <div class="post-filter post-filter-small"> 73 <div class="post-filter post-filter-small">
@@ -19,6 +19,8 @@ urlpatterns = [ @@ -19,6 +19,8 @@ urlpatterns = [
19 url(r'^resource/(?P<slug>[\w_-]+)/$', views.ResourceView.as_view(), name='resource_view'), 19 url(r'^resource/(?P<slug>[\w_-]+)/$', views.ResourceView.as_view(), name='resource_view'),
20 url(r'^load_category/([\w_-]+)/$', views.load_category_posts, name='load_category'), 20 url(r'^load_category/([\w_-]+)/$', views.load_category_posts, name='load_category'),
21 url(r'^load_subject/([\w_-]+)/$', views.load_subject_posts, name='load_subject'), 21 url(r'^load_subject/([\w_-]+)/$', views.load_subject_posts, name='load_subject'),
  22 + url(r'^view_log_cat/(?P<category>[\w_-]+)/$', views.mural_category_log, name = 'view_log_cat'),
  23 + url(r'^view_log_sub/(?P<subject>[\w_-]+)/$', views.mural_subject_log, name = 'view_log_sub'),
22 url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), 24 url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'),
23 url(r'^deleted/$', views.deleted_post, name='deleted_post'), 25 url(r'^deleted/$', views.deleted_post, name='deleted_post'),
24 url(r'^comment/(?P<post>[\w_-]+)/$', views.CommentCreate.as_view(), name='create_comment'), 26 url(r'^comment/(?P<post>[\w_-]+)/$', views.CommentCreate.as_view(), name='create_comment'),
mural/views.py
@@ -19,6 +19,11 @@ from subjects.models import Subject @@ -19,6 +19,11 @@ from subjects.models import Subject
19 from topics.models import Resource 19 from topics.models import Resource
20 from users.models import User 20 from users.models import User
21 21
  22 +from log.models import Log
  23 +from log.mixins import LogMixin
  24 +from log.decorators import log_decorator, log_decorator_ajax
  25 +import time
  26 +
22 from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites, Comment 27 from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites, Comment
23 from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, ResourcePostForm, CommentForm 28 from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, ResourcePostForm, CommentForm
24 from .utils import getSpaceUsers 29 from .utils import getSpaceUsers
@@ -28,7 +33,12 @@ from amadeus.permissions import has_subject_view_permissions, has_resource_permi @@ -28,7 +33,12 @@ from amadeus.permissions import has_subject_view_permissions, has_resource_permi
28 """ 33 """
29 Section for GeneralPost classes 34 Section for GeneralPost classes
30 """ 35 """
31 -class GeneralIndex(LoginRequiredMixin, generic.ListView): 36 +class GeneralIndex(LoginRequiredMixin, LogMixin, generic.ListView):
  37 + log_component = "mural"
  38 + log_action = "view"
  39 + log_resource = "general"
  40 + log_context = {}
  41 +
32 login_url = reverse_lazy("users:login") 42 login_url = reverse_lazy("users:login")
33 redirect_field_name = 'next' 43 redirect_field_name = 'next'
34 44
@@ -80,6 +90,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView): @@ -80,6 +90,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView):
80 90
81 if page: 91 if page:
82 self.template_name = "mural/_list_view.html" 92 self.template_name = "mural/_list_view.html"
  93 + else:
  94 + self.log_context['timestamp_start'] = str(int(time.time()))
  95 +
  96 + super(GeneralIndex, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  97 +
  98 + self.request.session['log_id'] = Log.objects.latest('id').id
83 99
84 context['title'] = _('Mural') 100 context['title'] = _('Mural')
85 context['totals'] = self.totals 101 context['totals'] = self.totals
@@ -99,7 +115,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView): @@ -99,7 +115,12 @@ class GeneralIndex(LoginRequiredMixin, generic.ListView):
99 115
100 return context 116 return context
101 117
102 -class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): 118 +class GeneralCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
  119 + log_component = "mural"
  120 + log_action = "create_post"
  121 + log_resource = "general"
  122 + log_context = {}
  123 +
103 login_url = reverse_lazy("users:login") 124 login_url = reverse_lazy("users:login")
104 redirect_field_name = 'next' 125 redirect_field_name = 'next'
105 126
@@ -144,6 +165,8 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -144,6 +165,8 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView):
144 165
145 MuralVisualizations.objects.bulk_create(entries) 166 MuralVisualizations.objects.bulk_create(entries)
146 167
  168 + super(GeneralCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  169 +
147 return super(GeneralCreate, self).form_valid(form) 170 return super(GeneralCreate, self).form_valid(form)
148 171
149 def get_context_data(self, *args, **kwargs): 172 def get_context_data(self, *args, **kwargs):
@@ -156,7 +179,12 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -156,7 +179,12 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView):
156 def get_success_url(self): 179 def get_success_url(self):
157 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'gen', )) 180 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'gen', ))
158 181
159 -class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): 182 +class GeneralUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
  183 + log_component = "mural"
  184 + log_action = "edit_post"
  185 + log_resource = "general"
  186 + log_context = {}
  187 +
160 login_url = reverse_lazy("users:login") 188 login_url = reverse_lazy("users:login")
161 redirect_field_name = 'next' 189 redirect_field_name = 'next'
162 190
@@ -193,6 +221,10 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): @@ -193,6 +221,10 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView):
193 221
194 for user in users: 222 for user in users:
195 Group("user-%s" % user.id).send({'text': notification}) 223 Group("user-%s" % user.id).send({'text': notification})
  224 +
  225 + self.log_context['post_id'] = str(self.object.id)
  226 +
  227 + super(GeneralUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
196 228
197 return super(GeneralUpdate, self).form_valid(form) 229 return super(GeneralUpdate, self).form_valid(form)
198 230
@@ -206,7 +238,12 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): @@ -206,7 +238,12 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView):
206 def get_success_url(self): 238 def get_success_url(self):
207 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'gen', )) 239 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'gen', ))
208 240
209 -class GeneralDelete(LoginRequiredMixin, generic.DeleteView): 241 +class GeneralDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
  242 + log_component = "mural"
  243 + log_action = "delete_post"
  244 + log_resource = "general"
  245 + log_context = {}
  246 +
210 login_url = reverse_lazy("users:login") 247 login_url = reverse_lazy("users:login")
211 redirect_field_name = 'next' 248 redirect_field_name = 'next'
212 249
@@ -238,6 +275,10 @@ class GeneralDelete(LoginRequiredMixin, generic.DeleteView): @@ -238,6 +275,10 @@ class GeneralDelete(LoginRequiredMixin, generic.DeleteView):
238 for user in users: 275 for user in users:
239 Group("user-%s" % user.id).send({'text': notification}) 276 Group("user-%s" % user.id).send({'text': notification})
240 277
  278 + self.log_context['post_id'] = str(self.object.id)
  279 +
  280 + super(GeneralDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  281 +
241 return reverse_lazy('mural:deleted_post') 282 return reverse_lazy('mural:deleted_post')
242 283
243 """ 284 """
@@ -327,7 +368,12 @@ class CategoryIndex(LoginRequiredMixin, generic.ListView): @@ -327,7 +368,12 @@ class CategoryIndex(LoginRequiredMixin, generic.ListView):
327 368
328 return context 369 return context
329 370
330 -class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): 371 +class CategoryCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
  372 + log_component = "mural"
  373 + log_action = "create_post"
  374 + log_resource = "category"
  375 + log_context = {}
  376 +
331 login_url = reverse_lazy("users:login") 377 login_url = reverse_lazy("users:login")
332 redirect_field_name = 'next' 378 redirect_field_name = 'next'
333 379
@@ -376,6 +422,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -376,6 +422,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView):
376 422
377 MuralVisualizations.objects.bulk_create(entries) 423 MuralVisualizations.objects.bulk_create(entries)
378 424
  425 + self.log_context['category_id'] = self.object.space.id
  426 + self.log_context['category_name'] = self.object.space.name
  427 + self.log_context['category_slug'] = self.object.space.slug
  428 +
  429 + super(CategoryCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  430 +
379 return super(CategoryCreate, self).form_valid(form) 431 return super(CategoryCreate, self).form_valid(form)
380 432
381 def get_context_data(self, *args, **kwargs): 433 def get_context_data(self, *args, **kwargs):
@@ -388,7 +440,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -388,7 +440,12 @@ class CategoryCreate(LoginRequiredMixin, generic.edit.CreateView):
388 def get_success_url(self): 440 def get_success_url(self):
389 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'cat', )) 441 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'cat', ))
390 442
391 -class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): 443 +class CategoryUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
  444 + log_component = "mural"
  445 + log_action = "edit_post"
  446 + log_resource = "category"
  447 + log_context = {}
  448 +
392 login_url = reverse_lazy("users:login") 449 login_url = reverse_lazy("users:login")
393 redirect_field_name = 'next' 450 redirect_field_name = 'next'
394 451
@@ -426,6 +483,13 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): @@ -426,6 +483,13 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView):
426 for user in users: 483 for user in users:
427 Group("user-%s" % user.id).send({'text': notification}) 484 Group("user-%s" % user.id).send({'text': notification})
428 485
  486 + self.log_context['post_id'] = self.object.id
  487 + self.log_context['category_id'] = self.object.space.id
  488 + self.log_context['category_name'] = self.object.space.name
  489 + self.log_context['category_slug'] = self.object.space.slug
  490 +
  491 + super(CategoryUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  492 +
429 return super(CategoryUpdate, self).form_valid(form) 493 return super(CategoryUpdate, self).form_valid(form)
430 494
431 def get_context_data(self, *args, **kwargs): 495 def get_context_data(self, *args, **kwargs):
@@ -438,7 +502,12 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView): @@ -438,7 +502,12 @@ class CategoryUpdate(LoginRequiredMixin, generic.UpdateView):
438 def get_success_url(self): 502 def get_success_url(self):
439 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'cat', )) 503 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'cat', ))
440 504
441 -class CategoryDelete(LoginRequiredMixin, generic.DeleteView): 505 +class CategoryDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
  506 + log_component = "mural"
  507 + log_action = "delete_post"
  508 + log_resource = "category"
  509 + log_context = {}
  510 +
442 login_url = reverse_lazy("users:login") 511 login_url = reverse_lazy("users:login")
443 redirect_field_name = 'next' 512 redirect_field_name = 'next'
444 513
@@ -470,8 +539,37 @@ class CategoryDelete(LoginRequiredMixin, generic.DeleteView): @@ -470,8 +539,37 @@ class CategoryDelete(LoginRequiredMixin, generic.DeleteView):
470 for user in users: 539 for user in users:
471 Group("user-%s" % user.id).send({'text': notification}) 540 Group("user-%s" % user.id).send({'text': notification})
472 541
  542 + self.log_context['post_id'] = self.object.id
  543 + self.log_context['category_id'] = self.object.space.id
  544 + self.log_context['category_name'] = self.object.space.name
  545 + self.log_context['category_slug'] = self.object.space.slug
  546 +
  547 + super(CategoryDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  548 +
473 return reverse_lazy('mural:deleted_post') 549 return reverse_lazy('mural:deleted_post')
474 550
  551 +@log_decorator_ajax('mural', 'view', 'category')
  552 +def mural_category_log(request, category):
  553 + action = request.GET.get('action')
  554 +
  555 + if action == 'open':
  556 + category = get_object_or_404(Category, id = category)
  557 +
  558 + log_context = {}
  559 + log_context['category_id'] = category.id
  560 + log_context['category_name'] = category.name
  561 + log_context['category_slug'] = category.slug
  562 + log_context['timestamp_start'] = str(int(time.time()))
  563 + log_context['timestamp_end'] = '-1'
  564 +
  565 + request.log_context = log_context
  566 +
  567 + log_id = Log.objects.latest('id').id
  568 +
  569 + return JsonResponse({'message': 'ok', 'log_id': log_id})
  570 +
  571 + return JsonResponse({'message': 'ok'})
  572 +
475 """ 573 """
476 Section for SubjectPost classes 574 Section for SubjectPost classes
477 """ 575 """
@@ -559,7 +657,12 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView): @@ -559,7 +657,12 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView):
559 657
560 return context 658 return context
561 659
562 -class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): 660 +class SubjectCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
  661 + log_component = "mural"
  662 + log_action = "create_post"
  663 + log_resource = "subject"
  664 + log_context = {}
  665 +
563 login_url = reverse_lazy("users:login") 666 login_url = reverse_lazy("users:login")
564 redirect_field_name = 'next' 667 redirect_field_name = 'next'
565 668
@@ -625,6 +728,17 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -625,6 +728,17 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView):
625 728
626 MuralVisualizations.objects.bulk_create(entries) 729 MuralVisualizations.objects.bulk_create(entries)
627 730
  731 + self.log_context['subject_id'] = self.object.space.id
  732 + self.log_context['subject_name'] = self.object.space.name
  733 + self.log_context['subject_slug'] = self.object.space.slug
  734 +
  735 + if self.object.resource:
  736 + self.log_context['resource_id'] = self.object.resource.id
  737 + self.log_context['resource_name'] = self.object.resource.name
  738 + self.log_context['resource_slug'] = self.object.resource.slug
  739 +
  740 + super(SubjectCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  741 +
628 return super(SubjectCreate, self).form_valid(form) 742 return super(SubjectCreate, self).form_valid(form)
629 743
630 def get_context_data(self, *args, **kwargs): 744 def get_context_data(self, *args, **kwargs):
@@ -637,7 +751,12 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -637,7 +751,12 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView):
637 def get_success_url(self): 751 def get_success_url(self):
638 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'sub', )) 752 return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'sub', ))
639 753
640 -class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): 754 +class SubjectUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
  755 + log_component = "mural"
  756 + log_action = "edit_post"
  757 + log_resource = "subject"
  758 + log_context = {}
  759 +
641 login_url = reverse_lazy("users:login") 760 login_url = reverse_lazy("users:login")
642 redirect_field_name = 'next' 761 redirect_field_name = 'next'
643 762
@@ -694,6 +813,18 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): @@ -694,6 +813,18 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView):
694 813
695 for user in users: 814 for user in users:
696 Group("user-%s" % user.id).send({'text': notification}) 815 Group("user-%s" % user.id).send({'text': notification})
  816 +
  817 + self.log_context['post_id'] = self.object.id
  818 + self.log_context['subject_id'] = self.object.space.id
  819 + self.log_context['subject_name'] = self.object.space.name
  820 + self.log_context['subject_slug'] = self.object.space.slug
  821 +
  822 + if self.object.resource:
  823 + self.log_context['resource_id'] = self.object.resource.id
  824 + self.log_context['resource_name'] = self.object.resource.name
  825 + self.log_context['resource_slug'] = self.object.resource.slug
  826 +
  827 + super(SubjectUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
697 828
698 return super(SubjectUpdate, self).form_valid(form) 829 return super(SubjectUpdate, self).form_valid(form)
699 830
@@ -707,7 +838,12 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): @@ -707,7 +838,12 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView):
707 def get_success_url(self): 838 def get_success_url(self):
708 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'sub', )) 839 return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'sub', ))
709 840
710 -class SubjectDelete(LoginRequiredMixin, generic.DeleteView): 841 +class SubjectDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
  842 + log_component = "mural"
  843 + log_action = "delete_post"
  844 + log_resource = "subject"
  845 + log_context = {}
  846 +
711 login_url = reverse_lazy("users:login") 847 login_url = reverse_lazy("users:login")
712 redirect_field_name = 'next' 848 redirect_field_name = 'next'
713 849
@@ -745,9 +881,26 @@ class SubjectDelete(LoginRequiredMixin, generic.DeleteView): @@ -745,9 +881,26 @@ class SubjectDelete(LoginRequiredMixin, generic.DeleteView):
745 for user in users: 881 for user in users:
746 Group("user-%s" % user.id).send({'text': notification}) 882 Group("user-%s" % user.id).send({'text': notification})
747 883
  884 + self.log_context['post_id'] = self.object.id
  885 + self.log_context['subject_id'] = self.object.space.id
  886 + self.log_context['subject_name'] = self.object.space.name
  887 + self.log_context['subject_slug'] = self.object.space.slug
  888 +
  889 + if self.object.resource:
  890 + self.log_context['resource_id'] = self.object.resource.id
  891 + self.log_context['resource_name'] = self.object.resource.name
  892 + self.log_context['resource_slug'] = self.object.resource.slug
  893 +
  894 + super(SubjectDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  895 +
748 return reverse_lazy('mural:deleted_post') 896 return reverse_lazy('mural:deleted_post')
749 897
750 -class SubjectView(LoginRequiredMixin, generic.ListView): 898 +class SubjectView(LoginRequiredMixin, LogMixin, generic.ListView):
  899 + log_component = "mural"
  900 + log_action = "view"
  901 + log_resource = "subject"
  902 + log_context = {}
  903 +
751 login_url = reverse_lazy("users:login") 904 login_url = reverse_lazy("users:login")
752 redirect_field_name = 'next' 905 redirect_field_name = 'next'
753 906
@@ -802,6 +955,15 @@ class SubjectView(LoginRequiredMixin, generic.ListView): @@ -802,6 +955,15 @@ class SubjectView(LoginRequiredMixin, generic.ListView):
802 955
803 if page: 956 if page:
804 self.template_name = "mural/_list_view.html" 957 self.template_name = "mural/_list_view.html"
  958 + else:
  959 + self.log_context['subject_id'] = subject.id
  960 + self.log_context['subject_name'] = subject.name
  961 + self.log_context['subject_slug'] = subject.slug
  962 + self.log_context['timestamp_start'] = str(int(time.time()))
  963 +
  964 + super(SubjectView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  965 +
  966 + self.request.session['log_id'] = Log.objects.latest('id').id
805 967
806 context['title'] = _('%s - Mural')%(str(subject)) 968 context['title'] = _('%s - Mural')%(str(subject))
807 context['subject'] = subject 969 context['subject'] = subject
@@ -820,10 +982,37 @@ class SubjectView(LoginRequiredMixin, generic.ListView): @@ -820,10 +982,37 @@ class SubjectView(LoginRequiredMixin, generic.ListView):
820 982
821 return context 983 return context
822 984
  985 +@log_decorator_ajax('mural', 'view', 'subject')
  986 +def mural_subject_log(request, subject):
  987 + action = request.GET.get('action')
  988 +
  989 + if action == 'open':
  990 + subject = get_object_or_404(Subject, id = subject)
  991 +
  992 + log_context = {}
  993 + log_context['subject_id'] = subject.id
  994 + log_context['subject_name'] = subject.name
  995 + log_context['subject_slug'] = subject.slug
  996 + log_context['timestamp_start'] = str(int(time.time()))
  997 + log_context['timestamp_end'] = '-1'
  998 +
  999 + request.log_context = log_context
  1000 +
  1001 + log_id = Log.objects.latest('id').id
  1002 +
  1003 + return JsonResponse({'message': 'ok', 'log_id': log_id})
  1004 +
  1005 + return JsonResponse({'message': 'ok'})
  1006 +
823 """ 1007 """
824 Section for specific resource post classes 1008 Section for specific resource post classes
825 """ 1009 """
826 -class ResourceView(LoginRequiredMixin, generic.ListView): 1010 +class ResourceView(LoginRequiredMixin, LogMixin, generic.ListView):
  1011 + log_component = "mural"
  1012 + log_action = "view"
  1013 + log_resource = "subject"
  1014 + log_context = {}
  1015 +
827 login_url = reverse_lazy("users:login") 1016 login_url = reverse_lazy("users:login")
828 redirect_field_name = 'next' 1017 redirect_field_name = 'next'
829 1018
@@ -879,6 +1068,18 @@ class ResourceView(LoginRequiredMixin, generic.ListView): @@ -879,6 +1068,18 @@ class ResourceView(LoginRequiredMixin, generic.ListView):
879 1068
880 if page: 1069 if page:
881 self.template_name = "mural/_list_view.html" 1070 self.template_name = "mural/_list_view.html"
  1071 + else:
  1072 + self.log_context['subject_id'] = resource.topic.subject.id
  1073 + self.log_context['subject_name'] = resource.topic.subject.name
  1074 + self.log_context['subject_slug'] = resource.topic.subject.slug
  1075 + self.log_context['resource_id'] = resource.id
  1076 + self.log_context['resource_name'] = resource.name
  1077 + self.log_context['resource_slug'] = resource.slug
  1078 + self.log_context['timestamp_start'] = str(int(time.time()))
  1079 +
  1080 + super(ResourceView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  1081 +
  1082 + self.request.session['log_id'] = Log.objects.latest('id').id
882 1083
883 context['title'] = _('%s - Mural')%(str(resource)) 1084 context['title'] = _('%s - Mural')%(str(resource))
884 context['subject'] = resource.topic.subject 1085 context['subject'] = resource.topic.subject
@@ -898,7 +1099,12 @@ class ResourceView(LoginRequiredMixin, generic.ListView): @@ -898,7 +1099,12 @@ class ResourceView(LoginRequiredMixin, generic.ListView):
898 1099
899 return context 1100 return context
900 1101
901 -class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView): 1102 +class ResourceCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
  1103 + log_component = "mural"
  1104 + log_action = "create_post"
  1105 + log_resource = "subject"
  1106 + log_context = {}
  1107 +
902 login_url = reverse_lazy("users:login") 1108 login_url = reverse_lazy("users:login")
903 redirect_field_name = 'next' 1109 redirect_field_name = 'next'
904 1110
@@ -957,6 +1163,17 @@ class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -957,6 +1163,17 @@ class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView):
957 1163
958 MuralVisualizations.objects.bulk_create(entries) 1164 MuralVisualizations.objects.bulk_create(entries)
959 1165
  1166 + self.log_context['subject_id'] = self.object.space.id
  1167 + self.log_context['subject_name'] = self.object.space.name
  1168 + self.log_context['subject_slug'] = self.object.space.slug
  1169 +
  1170 + if self.object.resource:
  1171 + self.log_context['resource_id'] = self.object.resource.id
  1172 + self.log_context['resource_name'] = self.object.resource.name
  1173 + self.log_context['resource_slug'] = self.object.resource.slug
  1174 +
  1175 + super(ResourceCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  1176 +
960 return super(ResourceCreate, self).form_valid(form) 1177 return super(ResourceCreate, self).form_valid(form)
961 1178
962 def get_context_data(self, *args, **kwargs): 1179 def get_context_data(self, *args, **kwargs):
@@ -1014,7 +1231,12 @@ def favorite(request, post): @@ -1014,7 +1231,12 @@ def favorite(request, post):
1014 """ 1231 """
1015 Section for comment functions 1232 Section for comment functions
1016 """ 1233 """
1017 -class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): 1234 +class CommentCreate(LoginRequiredMixin, LogMixin, generic.edit.CreateView):
  1235 + log_component = "mural"
  1236 + log_action = "create_comment"
  1237 + log_resource = "general"
  1238 + log_context = {}
  1239 +
1018 login_url = reverse_lazy("users:login") 1240 login_url = reverse_lazy("users:login")
1019 redirect_field_name = 'next' 1241 redirect_field_name = 'next'
1020 1242
@@ -1073,6 +1295,30 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -1073,6 +1295,30 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView):
1073 1295
1074 MuralVisualizations.objects.bulk_create(entries) 1296 MuralVisualizations.objects.bulk_create(entries)
1075 1297
  1298 + self.log_context = {}
  1299 + self.log_context['post_id'] = str(post.id)
  1300 +
  1301 + if post._my_subclass == "categorypost":
  1302 + self.log_resource = "category"
  1303 +
  1304 + self.log_context['category_id'] = post.categorypost.space.id
  1305 + self.log_context['category_name'] = post.categorypost.space.name
  1306 + self.log_context['category_slug'] = post.categorypost.space.slug
  1307 +
  1308 + elif post._my_subclass == "subjectpost":
  1309 + self.log_resource = "subject"
  1310 +
  1311 + self.log_context['subject_id'] = post.subjectpost.space.id
  1312 + self.log_context['subject_name'] = post.subjectpost.space.name
  1313 + self.log_context['subject_slug'] = post.subjectpost.space.slug
  1314 +
  1315 + if post.subjectpost.resource:
  1316 + self.log_context['resource_id'] = post.subjectpost.resource.id
  1317 + self.log_context['resource_name'] = post.subjectpost.resource.name
  1318 + self.log_context['resource_slug'] = post.subjectpost.resource.slug
  1319 +
  1320 + super(CommentCreate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  1321 +
1076 return super(CommentCreate, self).form_valid(form) 1322 return super(CommentCreate, self).form_valid(form)
1077 1323
1078 def get_context_data(self, *args, **kwargs): 1324 def get_context_data(self, *args, **kwargs):
@@ -1087,7 +1333,12 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): @@ -1087,7 +1333,12 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView):
1087 def get_success_url(self): 1333 def get_success_url(self):
1088 return reverse_lazy('mural:render_comment', args = (self.object.id, 'create', )) 1334 return reverse_lazy('mural:render_comment', args = (self.object.id, 'create', ))
1089 1335
1090 -class CommentUpdate(LoginRequiredMixin, generic.UpdateView): 1336 +class CommentUpdate(LoginRequiredMixin, LogMixin, generic.UpdateView):
  1337 + log_component = "mural"
  1338 + log_action = "edit_comment"
  1339 + log_resource = "general"
  1340 + log_context = {}
  1341 +
1091 login_url = reverse_lazy("users:login") 1342 login_url = reverse_lazy("users:login")
1092 redirect_field_name = 'next' 1343 redirect_field_name = 'next'
1093 1344
@@ -1134,6 +1385,31 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView): @@ -1134,6 +1385,31 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView):
1134 1385
1135 for user in users: 1386 for user in users:
1136 Group("user-%s" % user.id).send({'text': notification}) 1387 Group("user-%s" % user.id).send({'text': notification})
  1388 +
  1389 + self.log_context = {}
  1390 + self.log_context['post_id'] = str(self.object.post.id)
  1391 + self.log_context['comment_id'] = str(self.object.id)
  1392 +
  1393 + if self.object.post._my_subclass == "categorypost":
  1394 + self.log_resource = "category"
  1395 +
  1396 + self.log_context['category_id'] = self.object.post.categorypost.space.id
  1397 + self.log_context['category_name'] = self.object.post.categorypost.space.name
  1398 + self.log_context['category_slug'] = self.object.post.categorypost.space.slug
  1399 +
  1400 + elif self.object.post._my_subclass == "subjectpost":
  1401 + self.log_resource = "subject"
  1402 +
  1403 + self.log_context['subject_id'] = self.object.post.subjectpost.space.id
  1404 + self.log_context['subject_name'] = self.object.post.subjectpost.space.name
  1405 + self.log_context['subject_slug'] = self.object.post.subjectpost.space.slug
  1406 +
  1407 + if self.object.post.subjectpost.resource:
  1408 + self.log_context['resource_id'] = self.object.post.subjectpost.resource.id
  1409 + self.log_context['resource_name'] = self.object.post.subjectpost.resource.name
  1410 + self.log_context['resource_slug'] = self.object.post.subjectpost.resource.slug
  1411 +
  1412 + super(CommentUpdate, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
1137 1413
1138 return super(CommentUpdate, self).form_valid(form) 1414 return super(CommentUpdate, self).form_valid(form)
1139 1415
@@ -1147,7 +1423,12 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView): @@ -1147,7 +1423,12 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView):
1147 def get_success_url(self): 1423 def get_success_url(self):
1148 return reverse_lazy('mural:render_comment', args = (self.object.id, 'update', )) 1424 return reverse_lazy('mural:render_comment', args = (self.object.id, 'update', ))
1149 1425
1150 -class CommentDelete(LoginRequiredMixin, generic.DeleteView): 1426 +class CommentDelete(LoginRequiredMixin, LogMixin, generic.DeleteView):
  1427 + log_component = "mural"
  1428 + log_action = "delete_comment"
  1429 + log_resource = "general"
  1430 + log_context = {}
  1431 +
1151 login_url = reverse_lazy("users:login") 1432 login_url = reverse_lazy("users:login")
1152 redirect_field_name = 'next' 1433 redirect_field_name = 'next'
1153 1434
@@ -1189,6 +1470,31 @@ class CommentDelete(LoginRequiredMixin, generic.DeleteView): @@ -1189,6 +1470,31 @@ class CommentDelete(LoginRequiredMixin, generic.DeleteView):
1189 for user in users: 1470 for user in users:
1190 Group("user-%s" % user.id).send({'text': notification}) 1471 Group("user-%s" % user.id).send({'text': notification})
1191 1472
  1473 + self.log_context = {}
  1474 + self.log_context['post_id'] = str(self.object.post.id)
  1475 + self.log_context['comment_id'] = str(self.object.id)
  1476 +
  1477 + if self.object.post._my_subclass == "categorypost":
  1478 + self.log_resource = "category"
  1479 +
  1480 + self.log_context['category_id'] = self.object.post.categorypost.space.id
  1481 + self.log_context['category_name'] = self.object.post.categorypost.space.name
  1482 + self.log_context['category_slug'] = self.object.post.categorypost.space.slug
  1483 +
  1484 + elif self.object.post._my_subclass == "subjectpost":
  1485 + self.log_resource = "subject"
  1486 +
  1487 + self.log_context['subject_id'] = self.object.post.subjectpost.space.id
  1488 + self.log_context['subject_name'] = self.object.post.subjectpost.space.name
  1489 + self.log_context['subject_slug'] = self.object.post.subjectpost.space.slug
  1490 +
  1491 + if self.object.post.subjectpost.resource:
  1492 + self.log_context['resource_id'] = self.object.post.subjectpost.resource.id
  1493 + self.log_context['resource_name'] = self.object.post.subjectpost.resource.name
  1494 + self.log_context['resource_slug'] = self.object.post.subjectpost.resource.slug
  1495 +
  1496 + super(CommentDelete, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  1497 +
1192 return reverse_lazy('mural:deleted_comment') 1498 return reverse_lazy('mural:deleted_comment')
1193 1499
1194 def render_comment(request, comment, msg): 1500 def render_comment(request, comment, msg):