From 1471f57074a40d799c74351f0f27eab50e9e44a9 Mon Sep 17 00:00:00 2001 From: Zambom Date: Thu, 16 Feb 2017 22:47:01 -0200 Subject: [PATCH] Adding subject mural post crud --- amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc | Bin 147808 -> 0 bytes amadeus/static/css/base/amadeus.css | 2 +- amadeus/static/css/themes/green.css | 4 ++-- amadeus/static/css/themes/green.css.map | 2 +- amadeus/static/css/themes/green.sass | 4 ++-- amadeus/static/js/mural_subject.js | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mural/forms.py | 30 +++++++++++++++++++++++++++++- mural/models.py | 6 +++--- mural/templates/mural/_form.html | 22 ++++++++++++++++++++++ mural/templates/mural/_view.html | 1 + mural/templates/mural/list_subject.html | 4 ++-- mural/templatetags/mural_filters.py | 22 ++++++++++++++++++++++ mural/urls.py | 4 ++++ mural/views.py | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 14 files changed, 349 insertions(+), 13 deletions(-) diff --git a/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc b/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc index 0b05730..642a0fe 100644 Binary files a/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc and b/amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc differ diff --git a/amadeus/static/css/base/amadeus.css b/amadeus/static/css/base/amadeus.css index d682a96..008b484 100755 --- a/amadeus/static/css/base/amadeus.css +++ b/amadeus/static/css/base/amadeus.css @@ -1119,7 +1119,7 @@ li.item .notify_badge { padding-top: 5px; } -.marked_user { +.marked_user, .post_resource { font-weight: 700; } diff --git a/amadeus/static/css/themes/green.css b/amadeus/static/css/themes/green.css index 48bcea2..b46f348 100644 --- a/amadeus/static/css/themes/green.css +++ b/amadeus/static/css/themes/green.css @@ -411,7 +411,7 @@ a.add-row { .post_action i, .post .post-user .user-action i, .comment .comment-user .user-action i { color: #1d8fe0; } -.post .post-user, .comment .comment-user, .marked_user { +.post .post-user, .comment .comment-user, .marked_user, .post_resource { color: #26A69A; } .post .post-user .user-action { @@ -459,7 +459,7 @@ a.add-row { .suggestions { background: #FFFFFF; } -.mural-category { +.mural-category, .mural-subject { background: #EEE; } .btn:not(.btn-raised):not(.btn-link):focus, .btn:not(.btn-raised):not(.btn-link):hover, .input-group-btn .btn:not(.btn-raised):not(.btn-link):focus, .input-group-btn .btn:not(.btn-raised):not(.btn-link):hover { diff --git a/amadeus/static/css/themes/green.css.map b/amadeus/static/css/themes/green.css.map index fbccca8..fb94136 100644 --- a/amadeus/static/css/themes/green.css.map +++ b/amadeus/static/css/themes/green.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "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", +"mappings": "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", "sources": ["green.sass"], "names": [], "file": "green.css" diff --git a/amadeus/static/css/themes/green.sass b/amadeus/static/css/themes/green.sass index fe90ea6..f5a81aa 100644 --- a/amadeus/static/css/themes/green.sass +++ b/amadeus/static/css/themes/green.sass @@ -564,7 +564,7 @@ a.add-row color: #1d8fe0 -.post .post-user, .comment .comment-user, .marked_user +.post .post-user, .comment .comment-user, .marked_user, .post_resource color: #26A69A @@ -629,7 +629,7 @@ a.add-row background: $white -.mural-category +.mural-category, .mural-subject background: #EEE diff --git a/amadeus/static/js/mural_subject.js b/amadeus/static/js/mural_subject.js index 3c8c89d..ffd21f3 100644 --- a/amadeus/static/js/mural_subject.js +++ b/amadeus/static/js/mural_subject.js @@ -11,6 +11,75 @@ $('.mural-subject').on('shown.bs.collapse', function(e) { $(li).append("/"); new_li.appendTo('.breadcrumb'); + + var post_section = $(this).find('.posts'), + without = $(this).find('.no-subjects'), + loading = $(this).find('.loading-posts'), + more = $(this).find('.more-posts'), + filters = $(this).find('.post-filters'), + clear_filters = $(this).find('.clear_filter'), + mural = post_section.parent().parent(); + + if (post_section.children().length == 0) { + var url = $(this).find('.mural').data('url'); + + $.ajax({ + url: url, + dataType: 'json', + success: function (data) { + loading.hide(); + + if (data.count > 0) { + post_section.append(data.posts); + + mural.data('pages', data.num_pages); + mural.data('page', data.num_page); + + setTimeout(function () { postHeightLimits() }, 100); + + if (data.num_page < data.num_pages) { + more.show(); + } else { + more.hide(); + } + + $('.mural_badge').each(function () { + var actual = $(this).text(); + + if (actual != "+99") { + actual = parseInt(actual, 10) - data.unviewed; + + if (actual <= 0) { + $(this).hide(); + } else { + $(this).text(actual); + } + } + }); + + $('.sub_badge').each(function () { + var actual = $(this).text(); + + if (actual != "+99") { + actual = parseInt(actual, 10) - data.unviewed; + + if (actual < 0) { + actual = 0; + } + + $(this).text(actual); + } + }); + + without.hide(); + } else { + more.hide(); + + without.show(); + } + } + }); + } } }); diff --git a/mural/forms.py b/mural/forms.py index 624b131..58ae7e5 100644 --- a/mural/forms.py +++ b/mural/forms.py @@ -2,8 +2,11 @@ from django import forms from django.utils.translation import ugettext_lazy as _ from django.utils.html import strip_tags +from django.db.models import Q -from .models import GeneralPost, CategoryPost, Comment +from topics.models import Resource + +from .models import GeneralPost, CategoryPost, SubjectPost, Comment class Validation(forms.ModelForm): MAX_UPLOAD_SIZE = 5*1024*1024 @@ -49,6 +52,31 @@ class CategoryPostForm(Validation): 'post': forms.Textarea } +class SubjectPostForm(Validation): + def __init__(self, *args, **kwargs): + super(SubjectPostForm, self).__init__(*args, **kwargs) + + user = kwargs['initial'].get('user', None) + subject = kwargs['initial'].get('subject', None) + + if not kwargs['instance'] is None: + subject = self.instance.space + + if user.is_staff: + self.fields['resource'].choices = [(r.id, str(r)) for r in Resource.objects.filter(Q(topic__subject = subject))] + else: + self.fields['resource'].choices = [(r.id, str(r)) for r in Resource.objects.filter(Q(topic__subject = subject) & (Q(all_students = True) | Q(students = user) | Q(groups__participants = user)))] + + self.fields['resource'].choices.append(("", _("Choose an especific resource"))) + + class Meta: + model = SubjectPost + fields = ['action', 'resource', 'post', 'image'] + widgets = { + 'action': forms.RadioSelect, + 'post': forms.Textarea + } + class CommentForm(forms.ModelForm): MAX_UPLOAD_SIZE = 5*1024*1024 diff --git a/mural/models.py b/mural/models.py index ea5f5ef..444844c 100644 --- a/mural/models.py +++ b/mural/models.py @@ -74,7 +74,7 @@ class CategoryPost(Mural): class SubjectPost(Mural): space = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'post_subject') - resource = models.ForeignKey(Resource, verbose_name = _('Resource'), related_name = 'post_resource', null = True) + resource = models.ForeignKey(Resource, verbose_name = _('Resource'), related_name = 'post_resource', null = True, blank = True) def get_id(self): return self.id @@ -83,10 +83,10 @@ class SubjectPost(Mural): return self.space.id def update_link(self): - return "" + return "mural:update_subject" def delete_link(self): - return "" + return "mural:delete_subject" class Comment(models.Model): comment = models.TextField(_('Comment'), blank = True) diff --git a/mural/templates/mural/_form.html b/mural/templates/mural/_form.html index 3cf70d0..26f1ce1 100644 --- a/mural/templates/mural/_form.html +++ b/mural/templates/mural/_form.html @@ -27,6 +27,28 @@ + {% if form.resource %} +
+ + {% render_field form.resource class='form-control' %} + + {{ form.resource.help_text }} + + {% if form.resource.errors %} + + {% endif %} +
+ {% endif %} +
{% render_field form.post class='form-control text_simple_wysiwyg' %} diff --git a/mural/templates/mural/_view.html b/mural/templates/mural/_view.html index 13ee372..780f9ab 100644 --- a/mural/templates/mural/_view.html +++ b/mural/templates/mural/_view.html @@ -11,6 +11,7 @@ {{ post.get_action_display }} + {{ post|has_resource|safe }} {% if post|show_settings:request.user %} diff --git a/mural/templates/mural/list_subject.html b/mural/templates/mural/list_subject.html index c934b9b..a99d9d3 100644 --- a/mural/templates/mural/list_subject.html +++ b/mural/templates/mural/list_subject.html @@ -65,7 +65,7 @@
-
+
@@ -74,7 +74,7 @@
-

{% trans 'Wish to make a new post?' %}

+

{% trans 'Wish to make a new post?' %}

diff --git a/mural/templatetags/mural_filters.py b/mural/templatetags/mural_filters.py index 65883b5..cf56461 100644 --- a/mural/templatetags/mural_filters.py +++ b/mural/templatetags/mural_filters.py @@ -69,6 +69,13 @@ def show_settings(post, user): if post.space.coordinators == user: return True + if post._my_subclass == "subjectpost": + if post.space.professor == user: + return True + + if post.space.category.coordinators == user: + return True + return False @register.filter(name = 'show_settings_comment') @@ -83,4 +90,19 @@ def show_settings_comment(comment, user): if comment.post.space.coordinators == user: return True + if comment.post._my_subclass == "subjectpost": + if comment.post.space.professor == user: + return True + + if comment.post.space.category.coordinators == user: + return True + return False + +@register.filter(name = 'has_resource') +def has_resource(post): + if post._my_subclass == 'subjectpost': + if post.subjectpost.resource: + return _("about") + " " + str(post.subjectpost.resource) + "" + + return "" \ No newline at end of file diff --git a/mural/urls.py b/mural/urls.py index 8e77de0..c9962eb 100644 --- a/mural/urls.py +++ b/mural/urls.py @@ -7,11 +7,15 @@ urlpatterns = [ url(r'^subjects/$', views.SubjectIndex.as_view(), name='manage_subject'), url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'), url(r'^create_cat/(?P[\w_-]+)/$', views.CategoryCreate.as_view(), name='create_category'), + url(r'^create_sub/(?P[\w_-]+)/$', views.SubjectCreate.as_view(), name='create_subject'), url(r'^update_gen/(?P[\w_-]+)/$', views.GeneralUpdate.as_view(), name='update_general'), url(r'^update_cat/(?P[\w_-]+)/$', views.CategoryUpdate.as_view(), name='update_category'), + url(r'^update_sub/(?P[\w_-]+)/$', views.SubjectUpdate.as_view(), name='update_subject'), url(r'^delete_gen/(?P[\w_-]+)/$', views.GeneralDelete.as_view(), name='delete_general'), url(r'^delete_cat/(?P[\w_-]+)/$', views.CategoryDelete.as_view(), name='delete_category'), + url(r'^delete_sub/(?P[\w_-]+)/$', views.SubjectDelete.as_view(), name='delete_subject'), 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'^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 33becbf..29d1591 100644 --- a/mural/views.py +++ b/mural/views.py @@ -19,7 +19,7 @@ from subjects.models import Subject from users.models import User from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites, Comment -from .forms import GeneralPostForm, CategoryPostForm, CommentForm +from .forms import GeneralPostForm, CategoryPostForm, SubjectPostForm, CommentForm from .utils import getSpaceUsers """ @@ -420,6 +420,57 @@ class CategoryDelete(LoginRequiredMixin, generic.DeleteView): """ Section for SubjectPost classes """ +def load_subject_posts(request, subject): + context = { + 'request': request, + } + + user = request.user + favorites = request.GET.get('favorite', False) + mines = request.GET.get('mine', False) + showing = request.GET.get('showing', '') + n_views = 0 + + if not favorites: + if mines: + 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(space__id = subject, mural_ptr__user = user) + else: + 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(space__id = subject) + else: + if mines: + 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(space__id = subject, favorites_post__isnull = False, favorites_post__user = user, mural_ptr__user = user) + else: + 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(space__id = subject, favorites_post__isnull = False, favorites_post__user = user) + + if showing: #Exclude ajax creation posts results + showing = showing.split(',') + posts = posts.exclude(id__in = showing) + + has_page = request.GET.get('page', None) + + if has_page is None: + views = MuralVisualizations.objects.filter(Q(user = user) & Q(viewed = False) & (Q(comment__post__subjectpost__space__id = subject) | Q(post__subjectpost__space__id = subject))) + n_views = views.count() + views.update(viewed = True) + + paginator = Paginator(posts.order_by("-most_recent"), 10) + + try: + page_number = int(request.GET.get('page', 1)) + except ValueError: + raise Http404 + + try: + page_obj = paginator.page(page_number) + except EmptyPage: + raise Http404 + + context['posts'] = page_obj.object_list + + response = render_to_string("mural/_list_view.html", context, request) + + return JsonResponse({"posts": response, "unviewed": n_views, "count": posts.count(), "num_pages": paginator.num_pages, "num_page": page_obj.number}) + class SubjectIndex(LoginRequiredMixin, generic.ListView): login_url = reverse_lazy("users:login") redirect_field_name = 'next' @@ -453,6 +504,143 @@ class SubjectIndex(LoginRequiredMixin, generic.ListView): return context +class SubjectCreate(LoginRequiredMixin, generic.edit.CreateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'mural/_form.html' + form_class = SubjectPostForm + + def get_initial(self): + initial = super(SubjectCreate, self).get_initial() + + slug = self.kwargs.get('slug', None) + sub = get_object_or_404(Subject, slug = slug) + + initial['subject'] = sub + initial['user'] = self.request.user + + return initial + + def form_invalid(self, form): + context = super(SubjectCreate, self).form_invalid(form) + context.status_code = 400 + + return context + + def form_valid(self, form): + self.object = form.save(commit = False) + + slug = self.kwargs.get('slug', None) + sub = get_object_or_404(Subject, slug = slug) + + self.object.space = sub + self.object.user = self.request.user + + self.object.save() + + #users = User.objects.filter(Q(is_staff = True) | Q(coordinators = cat) | Q(professors__category = cat) | Q(subject_student__category = cat)).exclude(id = self.request.user.id) + entries = [] + + notify_type = "mural" + user_icon = self.object.user.image_url + #_view = render_to_string("mural/_view.html", {"post": self.object}, self.request) + simple_notify = _("%s has made a post in %s")%(str(self.object.user), str(self.object.space)) + pathname = reverse("mural:manage_category") + + #for user in users: + # entries.append(MuralVisualizations(viewed = False, user = user, post = self.object)) + # Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "create_cat", "user_icon": user_icon, "pathname": pathname, "simple": simple_notify, "complete": _view, "cat": slug})}) + + #MuralVisualizations.objects.bulk_create(entries) + + return super(SubjectCreate, self).form_valid(form) + + def get_context_data(self, *args, **kwargs): + context = super(SubjectCreate, self).get_context_data(*args, **kwargs) + + context['form_url'] = reverse_lazy("mural:create_subject", args = (), kwargs = {'slug': self.kwargs.get('slug', None)}) + + return context + + def get_success_url(self): + return reverse_lazy('mural:render_post', args = (self.object.id, 'create', 'sub', )) + +class SubjectUpdate(LoginRequiredMixin, generic.UpdateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'mural/_form.html' + model = SubjectPost + form_class = SubjectPostForm + + def get_initial(self): + initial = super(SubjectUpdate, self).get_initial() + + initial['user'] = self.request.user + + return initial + + def form_invalid(self, form): + context = super(SubjectUpdate, self).form_invalid(form) + context.status_code = 400 + + return context + + def form_valid(self, form): + self.object = form.save(commit = False) + + self.object.edited = True + + self.object.save() + + #users = User.objects.all().exclude(id = self.request.user.id) + + notify_type = "mural" + _view = render_to_string("mural/_view.html", {"post": self.object}, self.request) + pathname = reverse("mural:manage_category") + + #for user in users: + # Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "update_cat", "pathname": pathname, "complete": _view, "post_id": self.object.id})}) + + return super(SubjectUpdate, self).form_valid(form) + + def get_context_data(self, *args, **kwargs): + context = super(SubjectUpdate, self).get_context_data(*args, **kwargs) + + context['form_url'] = reverse_lazy("mural:update_subject", args = (), kwargs = {'pk': self.object.id}) + + return context + + def get_success_url(self): + return reverse_lazy('mural:render_post', args = (self.object.id, 'update', 'sub', )) + +class SubjectDelete(LoginRequiredMixin, generic.DeleteView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'mural/delete.html' + model = SubjectPost + + def get_context_data(self, *args, **kwargs): + context = super(SubjectDelete, self).get_context_data(*args, **kwargs) + + context['form_url'] = reverse_lazy("mural:delete_subject", args = (), kwargs = {'pk': self.object.id}) + context['message'] = _('Are you sure you want to delete this post?') + + return context + + def get_success_url(self): + #users = User.objects.all().exclude(id = self.request.user.id) + + notify_type = "mural" + pathname = reverse("mural:manage_subject") + + #for user in users: + # Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "delete_cat", "pathname": pathname, "post_id": self.object.id})}) + + return reverse_lazy('mural:deleted_post') + """ Section for common post functions """ @@ -461,6 +649,8 @@ def render_post(request, post, msg, ptype): post = get_object_or_404(GeneralPost, id = post) elif ptype == 'cat': post = get_object_or_404(CategoryPost, id = post) + elif ptype == 'sub': + post = get_object_or_404(SubjectPost, id = post) context = {} context['post'] = post -- libgit2 0.21.2