Commit b0f214b30bfca9030005c9b9ecc65d711f3c12b5
Exists in
master
and in
3 other branches
Merge branch 'refactoring' of https://github.com/amadeusproject/amadeuslms into refactoring
Showing
9 changed files
with
337 additions
and
20 deletions
Show diff stats
amadeus/static/js/socket.js
... | ... | @@ -26,9 +26,10 @@ if (socket.readyState == WebSocket.OPEN) socket.onopen(); |
26 | 26 | |
27 | 27 | function muralNotificationPost(content) { |
28 | 28 | var page = window.location.pathname, |
29 | - render = (content.paths.indexOf(page) != -1); | |
29 | + render = (content.paths.indexOf(page) != -1), | |
30 | + is_resource = (page.indexOf("resource") != -1); | |
30 | 31 | |
31 | - if ((render && page.indexOf(content.post_type) != -1) || (render && content.post_type == "general")) { | |
32 | + if ((render && page.indexOf(content.post_type) != -1) || (render && content.post_type == "general") || (render && is_resource)) { | |
32 | 33 | if (content.accordion) { |
33 | 34 | var section = $(content.container); |
34 | 35 | |
... | ... | @@ -72,7 +73,7 @@ function muralNotificationPost(content) { |
72 | 73 | } |
73 | 74 | }); |
74 | 75 | |
75 | - if (content.post_type == "subject") { | |
76 | + if (content.post_type == "subjects") { | |
76 | 77 | var slug = content.container.substring(1, content.container.length), |
77 | 78 | subject_mbadge = $("#subject_" + slug).find('.mural_notify'), |
78 | 79 | actual = subject_mbadge.text(); |
... | ... | @@ -136,6 +137,7 @@ function muralNotificationMuralDelete(content) { |
136 | 137 | function muralNotificationComment(content) { |
137 | 138 | var page = window.location.pathname, |
138 | 139 | render = (content.paths.indexOf(page) != -1), |
140 | + is_resource = (page.indexOf("resource") != -1), | |
139 | 141 | checker = "general"; |
140 | 142 | |
141 | 143 | switch (content.post_type) { |
... | ... | @@ -147,7 +149,7 @@ function muralNotificationComment(content) { |
147 | 149 | break; |
148 | 150 | } |
149 | 151 | |
150 | - if ((render && page.indexOf(checker) != -1) || (render && content.post_type == "generalpost" && page.indexOf("categories") == -1 && page.indexOf("subjects") == -1)) { | |
152 | + if ((render && page.indexOf(checker) != -1) || (render && content.post_type == "generalpost" && page.indexOf("categories") == -1 && page.indexOf("subjects") == -1) || (render && is_resource)) { | |
151 | 153 | var section = $(content.container); |
152 | 154 | |
153 | 155 | if (section.is(":visible") || section.is(":hidden")) { |
... | ... | @@ -156,8 +158,6 @@ function muralNotificationComment(content) { |
156 | 158 | comments.append(content.complete); |
157 | 159 | } |
158 | 160 | } else { |
159 | - console.log("Lester"); | |
160 | - | |
161 | 161 | $('.mural_badge').each(function () { |
162 | 162 | var actual = $(this).text(); |
163 | 163 | ... | ... |
mural/forms.py
... | ... | @@ -77,6 +77,15 @@ class SubjectPostForm(Validation): |
77 | 77 | 'post': forms.Textarea |
78 | 78 | } |
79 | 79 | |
80 | +class ResourcePostForm(Validation): | |
81 | + class Meta: | |
82 | + model = SubjectPost | |
83 | + fields = ['action', 'post', 'image'] | |
84 | + widgets = { | |
85 | + 'action': forms.RadioSelect, | |
86 | + 'post': forms.Textarea | |
87 | + } | |
88 | + | |
80 | 89 | class CommentForm(forms.ModelForm): |
81 | 90 | MAX_UPLOAD_SIZE = 5*1024*1024 |
82 | 91 | ... | ... |
... | ... | @@ -0,0 +1,98 @@ |
1 | +{% extends 'subjects/view.html' %} | |
2 | + | |
3 | +{% load static i18n pagination permissions_tags subject_counter %} | |
4 | +{% load django_bootstrap_breadcrumbs %} | |
5 | + | |
6 | +{% block breadcrumbs %} | |
7 | + {{ block.super }} | |
8 | + | |
9 | + {% breadcrumb resource.topic 'subjects:topic_view' subject.slug resource.topic.slug %} | |
10 | + {% breadcrumb resource resource.access_link %} | |
11 | + | |
12 | + {% trans 'Mural' as mural %} | |
13 | + {% breadcrumb mural 'mural:resource_view' resource.slug %} | |
14 | +{% endblock %} | |
15 | + | |
16 | +{% block content %} | |
17 | + {% subject_permissions request.user subject as has_subject_permissions %} | |
18 | + | |
19 | + {% if subject.visible %} | |
20 | + <div class="panel panel-info topic-panel" id="subject_{{subject.slug}}"> | |
21 | + <div class="panel-heading"> | |
22 | + {% elif has_subject_permissions %} | |
23 | + <div class="panel panel-info topic-panel-invisible" id="subject_{{subject.slug}}"> | |
24 | + <div class="panel-heading panel-invisible"> | |
25 | + {% endif %} | |
26 | + <div class="row"> | |
27 | + <div class="col-md-12 category-header"> | |
28 | + <h4 class="panel-title" style="margin-top: 10px; margin-bottom: 8px"> | |
29 | + <span>{{ resource }}</span> | |
30 | + </h4> | |
31 | + | |
32 | + <div class="col-md-5 pull-right category-card-items"> | |
33 | + <a href="{% url 'mural:resource_view' resource.slug %}" class="pull-right action_icon"> | |
34 | + <i class="fa fa-list" aria-hidden="true"></i> | |
35 | + {% resource_mural_number resource request.user %} | |
36 | + </a> | |
37 | + </div> | |
38 | + </div> | |
39 | + </div> | |
40 | + </div> | |
41 | + <div id="{{subject.slug}}" class="panel-collapse panel-body in collapse mural-ungeneral"> | |
42 | + <div class="col-md-12 cards-content mural" data-url="{% url 'mural:resource_view' resource.slug %}" data-pages="{{ paginator.num_pages }}" data-page="{{ page_obj.number }}" data-fav="{{ favorites }}" data-mine="{{ mines }}"> | |
43 | + <div class="col-md-9 col-sm-9 col-xs-9 mural-list"> | |
44 | + <div class="post_make panel panel-default"> | |
45 | + <div class="panel-body"> | |
46 | + <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 user-img text-center"> | |
47 | + <img src="{{ request.user.image_url }}" class="img-responsive" /> | |
48 | + </div> | |
49 | + <div class="col-lg-11 col-md-11 col-sm-11 col-xs-11 post-field"> | |
50 | + <div> | |
51 | + <h4 data-url="{% url 'mural:create_resource' subject.slug resource.slug %}">{% trans 'Wish to make a new post?' %}</h4> | |
52 | + </div> | |
53 | + </div> | |
54 | + </div> | |
55 | + </div> | |
56 | + | |
57 | + <div class="posts"> | |
58 | + {% for post in posts %} | |
59 | + {% include 'mural/_view.html' %} | |
60 | + {% endfor %} | |
61 | + </div> | |
62 | + <div id="loading_posts" class="alert alert-success" role="alert" style="display:none"> | |
63 | + <center> | |
64 | + <span class="fa fa-spin fa-circle-o-notch"></span> | |
65 | + </center> | |
66 | + </div> | |
67 | + <div class="text-center no-subjects" {% if posts.count > 0 %} style="display:none" {% endif %}> | |
68 | + <i class="fa fa-list"></i> | |
69 | + <h4>{% trans 'There are no posts in this mural yet.' %}</h4> | |
70 | + </div> | |
71 | + </div> | |
72 | + <div class="col-md-3 col-sm-3 col-xs-3 post-filter"> | |
73 | + <h4>{% trans 'Filter' %}</h4> | |
74 | + | |
75 | + <form id="post-filters" action="" method="GET"> | |
76 | + <div class="checkbox"> | |
77 | + <label> | |
78 | + <input name="favorite" type="checkbox" {{ favorites }}> {% trans 'Favorite posts' %} <i class="fa fa-thumb-tack"></i> | |
79 | + </label> | |
80 | + </div> | |
81 | + <div class="checkbox"> | |
82 | + <label> | |
83 | + <input name="mine" type="checkbox" {{ mines }}> {% trans 'Only my posts' %} | |
84 | + </label> | |
85 | + </div> | |
86 | + <button type="submit" class="btn btn-success btn-raised btn-block">{% trans 'Filter' %}</button> | |
87 | + <button type="button" id="clear_filter" class="btn btn-default btn-raised btn-block clear_filter">{% trans 'Clean Filters' %}</button> | |
88 | + </form> | |
89 | + </div> | |
90 | + </div> | |
91 | + </div> | |
92 | + </div> | |
93 | + | |
94 | + <div class="modal fade" id="post-modal-form" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"></div> | |
95 | + | |
96 | + <script type="text/javascript" src="{% static 'js/mural.js' %}"></script> | |
97 | + <script type="text/javascript" src="{% static 'js/mural_general.js' %}"></script> | |
98 | +{% endblock %} | |
0 | 99 | \ No newline at end of file | ... | ... |
mural/templatetags/mural_filters.py
... | ... | @@ -66,14 +66,14 @@ def show_settings(post, user): |
66 | 66 | return True |
67 | 67 | |
68 | 68 | if post._my_subclass == "categorypost": |
69 | - if post.categorypost.space.coordinators == user: | |
69 | + if user in post.categorypost.space.coordinators.all(): | |
70 | 70 | return True |
71 | 71 | |
72 | 72 | if post._my_subclass == "subjectpost": |
73 | - if post.subjectpost.space.professor == user: | |
73 | + if user in post.subjectpost.space.professor.all(): | |
74 | 74 | return True |
75 | 75 | |
76 | - if post.subjectpost.space.category.coordinators == user: | |
76 | + if user in post.subjectpost.space.category.coordinators.all(): | |
77 | 77 | return True |
78 | 78 | |
79 | 79 | return False |
... | ... | @@ -87,14 +87,14 @@ def show_settings_comment(comment, user): |
87 | 87 | return True |
88 | 88 | |
89 | 89 | if comment.post._my_subclass == "categorypost": |
90 | - if comment.post.categorypost.space.coordinators == user: | |
90 | + if user in comment.post.categorypost.space.coordinators.all(): | |
91 | 91 | return True |
92 | 92 | |
93 | 93 | if comment.post._my_subclass == "subjectpost": |
94 | - if comment.post.subjectpost.space.professor == user: | |
94 | + if user in comment.post.subjectpost.space.professor.all(): | |
95 | 95 | return True |
96 | 96 | |
97 | - if comment.post.subjectpost.space.category.coordinators == user: | |
97 | + if user in comment.post.subjectpost.space.category.coordinators.all(): | |
98 | 98 | return True |
99 | 99 | |
100 | 100 | return False | ... | ... |
mural/urls.py
... | ... | @@ -8,6 +8,7 @@ urlpatterns = [ |
8 | 8 | url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'), |
9 | 9 | url(r'^create_cat/(?P<slug>[\w_-]+)/$', views.CategoryCreate.as_view(), name='create_category'), |
10 | 10 | url(r'^create_sub/(?P<slug>[\w_-]+)/$', views.SubjectCreate.as_view(), name='create_subject'), |
11 | + url(r'^create_res/(?P<slug>[\w_-]+)/(?P<rslug>[\w_-]+)/$', views.ResourceCreate.as_view(), name='create_resource'), | |
11 | 12 | url(r'^update_gen/(?P<pk>[\w_-]+)/$', views.GeneralUpdate.as_view(), name='update_general'), |
12 | 13 | url(r'^update_cat/(?P<pk>[\w_-]+)/$', views.CategoryUpdate.as_view(), name='update_category'), |
13 | 14 | url(r'^update_sub/(?P<pk>[\w_-]+)/$', views.SubjectUpdate.as_view(), name='update_subject'), |
... | ... | @@ -15,6 +16,7 @@ urlpatterns = [ |
15 | 16 | url(r'^delete_cat/(?P<pk>[\w_-]+)/$', views.CategoryDelete.as_view(), name='delete_category'), |
16 | 17 | url(r'^delete_sub/(?P<pk>[\w_-]+)/$', views.SubjectDelete.as_view(), name='delete_subject'), |
17 | 18 | url(r'^subject/(?P<slug>[\w_-]+)/$', views.SubjectView.as_view(), name='subject_view'), |
19 | + url(r'^resource/(?P<slug>[\w_-]+)/$', views.ResourceView.as_view(), name='resource_view'), | |
18 | 20 | url(r'^load_category/([\w_-]+)/$', views.load_category_posts, name='load_category'), |
19 | 21 | url(r'^load_subject/([\w_-]+)/$', views.load_subject_posts, name='load_subject'), |
20 | 22 | url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), | ... | ... |
mural/views.py
... | ... | @@ -16,12 +16,15 @@ import json |
16 | 16 | |
17 | 17 | from categories.models import Category |
18 | 18 | from subjects.models import Subject |
19 | +from topics.models import Resource | |
19 | 20 | from users.models import User |
20 | 21 | |
21 | 22 | from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites, Comment |
22 | -from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, CommentForm | |
23 | +from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, ResourcePostForm, CommentForm | |
23 | 24 | from .utils import getSpaceUsers |
24 | 25 | |
26 | +from amadeus.permissions import has_subject_view_permissions, has_resource_permissions | |
27 | + | |
25 | 28 | """ |
26 | 29 | Section for GeneralPost classes |
27 | 30 | """ |
... | ... | @@ -594,7 +597,13 @@ class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): |
594 | 597 | users = getSpaceUsers(self.request.user.id, self.object) |
595 | 598 | entries = [] |
596 | 599 | |
597 | - paths = [reverse("mural:manage_subject")] | |
600 | + paths = [ | |
601 | + reverse("mural:manage_subject"), | |
602 | + reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug}) | |
603 | + ] | |
604 | + | |
605 | + if self.object.resource: | |
606 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.resource.slug})) | |
598 | 607 | |
599 | 608 | notification = { |
600 | 609 | "type": "mural", |
... | ... | @@ -643,6 +652,13 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): |
643 | 652 | |
644 | 653 | return initial |
645 | 654 | |
655 | + def get_form_class(self): | |
656 | + if self.object.resource: | |
657 | + if "resource" in self.request.META.get('HTTP_REFERER'): | |
658 | + self.form_class = ResourcePostForm | |
659 | + | |
660 | + return self.form_class | |
661 | + | |
646 | 662 | def form_invalid(self, form): |
647 | 663 | context = super(SubjectUpdate, self).form_invalid(form) |
648 | 664 | context.status_code = 400 |
... | ... | @@ -658,7 +674,13 @@ class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): |
658 | 674 | |
659 | 675 | users = getSpaceUsers(self.request.user.id, self.object) |
660 | 676 | |
661 | - paths = [reverse("mural:manage_subject")] | |
677 | + paths = [ | |
678 | + reverse("mural:manage_subject"), | |
679 | + reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug}) | |
680 | + ] | |
681 | + | |
682 | + if self.object.resource: | |
683 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.resource.slug})) | |
662 | 684 | |
663 | 685 | notification = { |
664 | 686 | "type": "mural", |
... | ... | @@ -703,7 +725,13 @@ class SubjectDelete(LoginRequiredMixin, generic.DeleteView): |
703 | 725 | def get_success_url(self): |
704 | 726 | users = getSpaceUsers(self.request.user.id, self.object) |
705 | 727 | |
706 | - paths = [reverse("mural:manage_subject")] | |
728 | + paths = [ | |
729 | + reverse("mural:manage_subject"), | |
730 | + reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug}) | |
731 | + ] | |
732 | + | |
733 | + if self.object.resource: | |
734 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.resource.slug})) | |
707 | 735 | |
708 | 736 | notification = { |
709 | 737 | "type": "mural", |
... | ... | @@ -727,6 +755,14 @@ class SubjectView(LoginRequiredMixin, generic.ListView): |
727 | 755 | context_object_name = "posts" |
728 | 756 | paginate_by = 10 |
729 | 757 | |
758 | + def dispatch(self, request, *args,**kwargs): | |
759 | + subject = get_object_or_404(Subject, slug = kwargs.get('slug', '')) | |
760 | + | |
761 | + if not has_subject_view_permissions(request.user, subject): | |
762 | + return redirect(reverse_lazy('subjects:home')) | |
763 | + | |
764 | + return super(SubjectView, self).dispatch(request, *args, **kwargs) | |
765 | + | |
730 | 766 | def get_queryset(self): |
731 | 767 | user = self.request.user |
732 | 768 | favorites = self.request.GET.get('favorite', False) |
... | ... | @@ -785,6 +821,155 @@ class SubjectView(LoginRequiredMixin, generic.ListView): |
785 | 821 | return context |
786 | 822 | |
787 | 823 | """ |
824 | + Section for specific resource post classes | |
825 | +""" | |
826 | +class ResourceView(LoginRequiredMixin, generic.ListView): | |
827 | + login_url = reverse_lazy("users:login") | |
828 | + redirect_field_name = 'next' | |
829 | + | |
830 | + template_name = 'mural/resource_view.html' | |
831 | + context_object_name = "posts" | |
832 | + paginate_by = 10 | |
833 | + | |
834 | + def dispatch(self, request, *args, **kwargs): | |
835 | + slug = self.kwargs.get('slug', '') | |
836 | + resource = get_object_or_404(Resource, slug = slug) | |
837 | + | |
838 | + if not has_resource_permissions(request.user, resource): | |
839 | + return redirect(reverse_lazy('subjects:home')) | |
840 | + | |
841 | + return super(ResourceView, self).dispatch(request, *args, **kwargs) | |
842 | + | |
843 | + def get_queryset(self): | |
844 | + user = self.request.user | |
845 | + favorites = self.request.GET.get('favorite', False) | |
846 | + mines = self.request.GET.get('mine', False) | |
847 | + showing = self.request.GET.get('showing', False) | |
848 | + page = self.request.GET.get('page', False) | |
849 | + slug = self.kwargs.get('slug') | |
850 | + resource = get_object_or_404(Resource, slug = slug) | |
851 | + | |
852 | + if not favorites: | |
853 | + if mines: | |
854 | + posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(mural_ptr__user = user, resource = resource) | |
855 | + else: | |
856 | + posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(resource = resource) | |
857 | + else: | |
858 | + if mines: | |
859 | + posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(favorites_post__isnull = False, favorites_post__user = user, mural_ptr__user = user, resource = resource) | |
860 | + else: | |
861 | + posts = SubjectPost.objects.extra(select = {"most_recent": "greatest(last_update, (select max(mural_comment.last_update) from mural_comment where mural_comment.post_id = mural_subjectpost.mural_ptr_id))"}).filter(favorites_post__isnull = False, favorites_post__user = user, resource = resource) | |
862 | + | |
863 | + if showing: #Exclude ajax creation posts results | |
864 | + showing = showing.split(',') | |
865 | + posts = posts.exclude(id__in = showing) | |
866 | + | |
867 | + if not page: #Don't need this if is pagination | |
868 | + MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & (Q(post__subjectpost__resource = resource) | Q(comment__post__subjectpost__resource = resource))).update(viewed = True) | |
869 | + | |
870 | + return posts.order_by("-most_recent") | |
871 | + | |
872 | + def get_context_data(self, **kwargs): | |
873 | + context = super(ResourceView, self).get_context_data(**kwargs) | |
874 | + | |
875 | + page = self.request.GET.get('page', '') | |
876 | + | |
877 | + slug = self.kwargs.get('slug', None) | |
878 | + resource = get_object_or_404(Resource, slug = slug) | |
879 | + | |
880 | + if page: | |
881 | + self.template_name = "mural/_list_view.html" | |
882 | + | |
883 | + context['title'] = _('%s - Mural')%(str(resource)) | |
884 | + context['subject'] = resource.topic.subject | |
885 | + context['resource'] = resource | |
886 | + context['favorites'] = "" | |
887 | + context['mines'] = "" | |
888 | + | |
889 | + favs = self.request.GET.get('favorite', False) | |
890 | + | |
891 | + if favs: | |
892 | + context['favorites'] = "checked" | |
893 | + | |
894 | + mines = self.request.GET.get('mine', False) | |
895 | + | |
896 | + if mines: | |
897 | + context['mines'] = "checked" | |
898 | + | |
899 | + return context | |
900 | + | |
901 | +class ResourceCreate(LoginRequiredMixin, generic.edit.CreateView): | |
902 | + login_url = reverse_lazy("users:login") | |
903 | + redirect_field_name = 'next' | |
904 | + | |
905 | + template_name = 'mural/_form.html' | |
906 | + form_class = ResourcePostForm | |
907 | + | |
908 | + def form_invalid(self, form): | |
909 | + context = super(SubjectCreate, self).form_invalid(form) | |
910 | + context.status_code = 400 | |
911 | + | |
912 | + return context | |
913 | + | |
914 | + def form_valid(self, form): | |
915 | + self.object = form.save(commit = False) | |
916 | + | |
917 | + slug = self.kwargs.get('slug', None) | |
918 | + sub = get_object_or_404(Subject, slug = slug) | |
919 | + | |
920 | + rslug = self.kwargs.get('rslug', None) | |
921 | + resource = get_object_or_404(Resource, slug = rslug) | |
922 | + | |
923 | + self.object.space = sub | |
924 | + self.object.resource = resource | |
925 | + self.object.user = self.request.user | |
926 | + | |
927 | + self.object.save() | |
928 | + | |
929 | + users = getSpaceUsers(self.request.user.id, self.object) | |
930 | + entries = [] | |
931 | + | |
932 | + paths = [ | |
933 | + reverse("mural:manage_subject"), | |
934 | + reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.space.slug}) | |
935 | + ] | |
936 | + | |
937 | + if self.object.resource: | |
938 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.resource.slug})) | |
939 | + | |
940 | + notification = { | |
941 | + "type": "mural", | |
942 | + "subtype": "post", | |
943 | + "paths": paths, | |
944 | + "user_icon": self.object.user.image_url, | |
945 | + "simple_notify": _("%s has made a post in %s")%(str(self.object.user), str(self.object.space)), | |
946 | + "complete": render_to_string("mural/_view.html", {"post": self.object}, self.request), | |
947 | + "container": "#" + slug, | |
948 | + "accordion": True, | |
949 | + "post_type": "subjects" | |
950 | + } | |
951 | + | |
952 | + notification = json.dumps(notification) | |
953 | + | |
954 | + for user in users: | |
955 | + entries.append(MuralVisualizations(viewed = False, user = user, post = self.object)) | |
956 | + Group("user-%s" % user.id).send({'text': notification}) | |
957 | + | |
958 | + MuralVisualizations.objects.bulk_create(entries) | |
959 | + | |
960 | + return super(ResourceCreate, self).form_valid(form) | |
961 | + | |
962 | + def get_context_data(self, *args, **kwargs): | |
963 | + context = super(ResourceCreate, self).get_context_data(*args, **kwargs) | |
964 | + | |
965 | + context['form_url'] = reverse_lazy("mural:create_resource", args = (), kwargs = {'slug': self.kwargs.get('slug', None), 'rslug': self.kwargs.get('rslug', None)}) | |
966 | + | |
967 | + return context | |
968 | + | |
969 | + def get_success_url(self): | |
970 | + return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'sub', )) | |
971 | + | |
972 | +""" | |
788 | 973 | Section for common post functions |
789 | 974 | """ |
790 | 975 | def render_post(request, post, msg, ptype): |
... | ... | @@ -862,6 +1047,12 @@ class CommentCreate(LoginRequiredMixin, generic.edit.CreateView): |
862 | 1047 | reverse("mural:manage_subject") |
863 | 1048 | ] |
864 | 1049 | |
1050 | + if post._my_subclass == "subjectpost": | |
1051 | + paths.append(reverse("mural:subject_view", args = (), kwargs = {'slug': post.get_space_slug()})) | |
1052 | + | |
1053 | + if post.subjectpost.resource: | |
1054 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': post.subjectpost.resource.slug})) | |
1055 | + | |
865 | 1056 | notification = { |
866 | 1057 | "type": "mural", |
867 | 1058 | "subtype": "comment", |
... | ... | @@ -925,6 +1116,12 @@ class CommentUpdate(LoginRequiredMixin, generic.UpdateView): |
925 | 1116 | reverse("mural:manage_subject") |
926 | 1117 | ] |
927 | 1118 | |
1119 | + if self.object.post._my_subclass == "subjectpost": | |
1120 | + paths.append(reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.post.get_space_slug()})) | |
1121 | + | |
1122 | + if self.object.post.subjectpost.resource: | |
1123 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.post.subjectpost.resource.slug})) | |
1124 | + | |
928 | 1125 | notification = { |
929 | 1126 | "type": "mural", |
930 | 1127 | "subtype": "mural_update", |
... | ... | @@ -974,6 +1171,12 @@ class CommentDelete(LoginRequiredMixin, generic.DeleteView): |
974 | 1171 | reverse("mural:manage_subject") |
975 | 1172 | ] |
976 | 1173 | |
1174 | + if self.object.post._my_subclass == "subjectpost": | |
1175 | + paths.append(reverse("mural:subject_view", args = (), kwargs = {'slug': self.object.post.get_space_slug()})) | |
1176 | + | |
1177 | + if self.object.post.subjectpost.resource: | |
1178 | + paths.append(reverse("mural:resource_view", args = (), kwargs = {'slug': self.object.post.subjectpost.resource.slug})) | |
1179 | + | |
977 | 1180 | notification = { |
978 | 1181 | "type": "mural", |
979 | 1182 | "subtype": "mural_delete", | ... | ... |
pdf_file/templates/pdf_file/view.html
1 | 1 | {% extends "subjects/view.html" %} |
2 | 2 | |
3 | -{% load static i18n django_bootstrap_breadcrumbs %} | |
3 | +{% load static i18n django_bootstrap_breadcrumbs permissions_tags subject_counter %} | |
4 | 4 | |
5 | 5 | {% block style %} |
6 | 6 | {{block.super}} |
... | ... | @@ -24,6 +24,8 @@ |
24 | 24 | |
25 | 25 | |
26 | 26 | {% block content %} |
27 | + {% subject_permissions request.user subject as has_subject_permissions %} | |
28 | + | |
27 | 29 | {% if subject.visible %} |
28 | 30 | <div class="panel panel-info topic-panel"> |
29 | 31 | <div class="panel-heading"> |
... | ... | @@ -38,7 +40,10 @@ |
38 | 40 | </h4> |
39 | 41 | |
40 | 42 | <div class="col-md-5 pull-right category-card-items"> |
41 | - <a href="" ><i class="fa fa-list" aria-hidden="true"></i></a> | |
43 | + <a href="{% url 'mural:resource_view' pdf_file.slug %}" class="pull-right action_icon"> | |
44 | + <i class="fa fa-list" aria-hidden="true"></i> | |
45 | + {% resource_mural_number pdf_file request.user %} | |
46 | + </a> | |
42 | 47 | </div> |
43 | 48 | </div> |
44 | 49 | </div> | ... | ... |
webpage/templates/webpages/view.html
... | ... | @@ -41,7 +41,7 @@ |
41 | 41 | </h4> |
42 | 42 | |
43 | 43 | <div class="col-md-5 pull-right category-card-items"> |
44 | - <a href="" > | |
44 | + <a href="{% url 'mural:resource_view' webpage.slug %}" class="pull-right action_icon"> | |
45 | 45 | <i class="fa fa-list" aria-hidden="true"></i> |
46 | 46 | {% resource_mural_number webpage request.user %} |
47 | 47 | </a> | ... | ... |
youtube_video/templates/youtube/view.html
... | ... | @@ -41,7 +41,7 @@ |
41 | 41 | </h4> |
42 | 42 | |
43 | 43 | <div class="col-md-5 pull-right category-card-items"> |
44 | - <a href=""> | |
44 | + <a href="{% url 'mural:resource_view' youtube.slug %}" class="pull-right action_icon"> | |
45 | 45 | <i class="fa fa-list" aria-hidden="true"></i> |
46 | 46 | {% resource_mural_number youtube request.user %} |
47 | 47 | </a> | ... | ... |