diff --git a/mural/migrations/0005_mural_edited.py b/mural/migrations/0005_mural_edited.py new file mode 100644 index 0000000..9d44a83 --- /dev/null +++ b/mural/migrations/0005_mural_edited.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-06 21:12 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mural', '0004_auto_20170206_1348'), + ] + + operations = [ + migrations.AddField( + model_name='mural', + name='edited', + field=models.BooleanField(default=False, verbose_name='Edited'), + ), + ] diff --git a/mural/models.py b/mural/models.py index 8d20c3a..c803c91 100644 --- a/mural/models.py +++ b/mural/models.py @@ -3,6 +3,8 @@ from django.core import validators from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ +from topics.decorators import always_as_child + from categories.models import Category from subjects.models import Subject from topics.models import KnowsChild, Resource @@ -22,17 +24,31 @@ class Mural(KnowsChild): user = models.ForeignKey(User, verbose_name = _('User'), related_name = "post_user", null = True) create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) last_update = models.DateTimeField(_('Last Update'), auto_now = True) + edited = models.BooleanField(_('Edited'), default = False) + + @always_as_child + def update_link(self): + pass class GeneralPost(Mural): space = models.IntegerField(_('Space'), default = 0, blank = True) + def update_link(self): + return "mural:update_general" + class CategoryPost(Mural): space = models.ForeignKey(Category, verbose_name = ('Category'), related_name = 'post_category') + def update_link(self): + return "" + 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) + def update_link(self): + return "" + class Comment(models.Model): comment = models.TextField(_('Comment'), blank = True) image = models.ImageField(verbose_name = _('Image'), null=True, blank = True, upload_to = 'posts/comments/', validators = [validate_img_extension]) @@ -41,12 +57,18 @@ class Comment(models.Model): create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) last_update = models.DateTimeField(_('Last Update'), auto_now = True) +""" + Model to handle posts visualizations +""" class MuralVisualizations(models.Model): viewed = models.BooleanField(_('Viewed'), default = False) post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'visualization_post', null = True) comment = models.ForeignKey(Comment, verbose_name = _('Comment'), related_name = 'visualization_comment', null = True) user = models.ForeignKey(User, verbose_name = _('User'), related_name = "visualization_user", null = True) +""" + Model to handle users favorite posts +""" class MuralFavorites(models.Model): post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'favorites_post', null = True) user = models.ForeignKey(User, verbose_name = _('User'), related_name = "favorites_user", null = True) \ No newline at end of file diff --git a/mural/templates/mural/_view.html b/mural/templates/mural/_view.html index 326a44b..2b0008c 100644 --- a/mural/templates/mural/_view.html +++ b/mural/templates/mural/_view.html @@ -1,6 +1,6 @@ {% load i18n mural_filters %} -
+
@@ -18,7 +18,7 @@ @@ -32,7 +32,7 @@

- {% trans 'In' %} {{ post.last_update }} + {% trans 'In' %} {{ post.last_update }} {{ post|is_edited }}

{% autoescape off %} diff --git a/mural/templates/mural/list.html b/mural/templates/mural/list.html index 653d414..e169203 100644 --- a/mural/templates/mural/list.html +++ b/mural/templates/mural/list.html @@ -65,11 +65,11 @@ $('#post-modal-form').modal('show'); } - }) + }); }); }); - function setPostFormSubmit() { + function setPostFormSubmit(post = "") { var frm = $('#post-form'); frm.submit(function () { @@ -82,9 +82,17 @@ dataType: "json", async: false, success: function (data) { - $('.posts').prepend(data.view); + if (post != "") { + var old = $("#post-" + post); + + old.before(data.view); + + old.remove(); + } else { + $('.posts').prepend(data.view); - $('.no-subjects').attr('style', 'display:none'); + $('.no-subjects').attr('style', 'display:none'); + } $('#post-modal-form').modal('hide'); @@ -92,7 +100,7 @@ }, error: function(data) { $("#post-modal-form").html(data.responseText); - setPostFormSubmit(); + setPostFormSubmit(post); }, cache: false, contentType: false, @@ -123,7 +131,25 @@ btn.attr('data-original-title', response.label); } }); + } + + function editPost(btn) { + var url = btn.data('url'); + var post = btn.data('post'); + + console.log(url); + console.log(post); + $.ajax({ + url: url, + success: function (data) { + $('#post-modal-form').html(data); + + setPostFormSubmit(post); + + $('#post-modal-form').modal('show'); + } + }); } {% endblock %} \ No newline at end of file diff --git a/mural/templatetags/mural_filters.py b/mural/templatetags/mural_filters.py index 5b58394..5a67272 100644 --- a/mural/templatetags/mural_filters.py +++ b/mural/templatetags/mural_filters.py @@ -5,6 +5,13 @@ from mural.models import MuralFavorites register = template.Library() +@register.filter(name = 'is_edited') +def is_edited(post): + if post.edited: + return _("(Edited)") + + return "" + @register.filter(name = 'action_icon') def action_icon(action): if action == "comment": diff --git a/mural/urls.py b/mural/urls.py index 58efae5..625f347 100644 --- a/mural/urls.py +++ b/mural/urls.py @@ -4,6 +4,7 @@ from . import views urlpatterns = [ url(r'^$', views.GeneralIndex.as_view(), name='manage_general'), url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'), - url(r'^render_post/([\w_-]+)/$', views.render_gen_post, name='render_post_general'), + url(r'^update_gen/(?P[\w_-]+)/$', views.GeneralUpdate.as_view(), name='update_general'), + url(r'^render_post/([\w_-]+)/([\w_-]+)/$', views.render_gen_post, name='render_post_general'), url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), ] \ No newline at end of file diff --git a/mural/views.py b/mural/views.py index d8bb749..4fb73fc 100644 --- a/mural/views.py +++ b/mural/views.py @@ -97,17 +97,57 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): return context def get_success_url(self): - return reverse_lazy('mural:render_post_general', args = (self.object.id, )) + return reverse_lazy('mural:render_post_general', args = (self.object.id, 'create', )) -def render_gen_post(request, post): +class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'mural/_form.html' + model = GeneralPost + form_class = GeneralPostForm + + def form_invalid(self, form): + context = super(GeneralUpdate, 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() + + return super(GeneralUpdate, self).form_valid(form) + + def get_context_data(self, *args, **kwargs): + context = super(GeneralUpdate, self).get_context_data(*args, **kwargs) + + context['form_url'] = reverse_lazy("mural:update_general", args = (), kwargs = {'pk': self.object.id}) + + return context + + def get_success_url(self): + return reverse_lazy('mural:render_post_general', args = (self.object.id, 'update', )) + +def render_gen_post(request, post, msg): post = get_object_or_404(GeneralPost, id = post) context = {} context['post'] = post + msg = "" + + if msg == 'create': + msg = _('Your post was published successfully!') + else: + msg = _('Your post was edited successfully!') + html = render_to_string("mural/_view.html", context, request) - return JsonResponse({'message': _('Your post was published successfully!'), 'view': html}) + return JsonResponse({'message': msg, 'view': html}) @login_required def favorite(request, post): -- libgit2 0.21.2