Commit e05c0b182a58a2ed90f97913ba998b7f7075ce33
1 parent
5f472d6b
Exists in
master
and in
3 other branches
Adding general post edit
Showing
7 changed files
with
128 additions
and
12 deletions
Show diff stats
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10 on 2017-02-06 21:12 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('mural', '0004_auto_20170206_1348'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AddField( | ||
16 | + model_name='mural', | ||
17 | + name='edited', | ||
18 | + field=models.BooleanField(default=False, verbose_name='Edited'), | ||
19 | + ), | ||
20 | + ] |
mural/models.py
@@ -3,6 +3,8 @@ from django.core import validators | @@ -3,6 +3,8 @@ from django.core import validators | ||
3 | from django.core.exceptions import ValidationError | 3 | from django.core.exceptions import ValidationError |
4 | from django.utils.translation import ugettext_lazy as _ | 4 | from django.utils.translation import ugettext_lazy as _ |
5 | 5 | ||
6 | +from topics.decorators import always_as_child | ||
7 | + | ||
6 | from categories.models import Category | 8 | from categories.models import Category |
7 | from subjects.models import Subject | 9 | from subjects.models import Subject |
8 | from topics.models import KnowsChild, Resource | 10 | from topics.models import KnowsChild, Resource |
@@ -22,17 +24,31 @@ class Mural(KnowsChild): | @@ -22,17 +24,31 @@ class Mural(KnowsChild): | ||
22 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "post_user", null = True) | 24 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "post_user", null = True) |
23 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) | 25 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) |
24 | last_update = models.DateTimeField(_('Last Update'), auto_now = True) | 26 | last_update = models.DateTimeField(_('Last Update'), auto_now = True) |
27 | + edited = models.BooleanField(_('Edited'), default = False) | ||
28 | + | ||
29 | + @always_as_child | ||
30 | + def update_link(self): | ||
31 | + pass | ||
25 | 32 | ||
26 | class GeneralPost(Mural): | 33 | class GeneralPost(Mural): |
27 | space = models.IntegerField(_('Space'), default = 0, blank = True) | 34 | space = models.IntegerField(_('Space'), default = 0, blank = True) |
28 | 35 | ||
36 | + def update_link(self): | ||
37 | + return "mural:update_general" | ||
38 | + | ||
29 | class CategoryPost(Mural): | 39 | class CategoryPost(Mural): |
30 | space = models.ForeignKey(Category, verbose_name = ('Category'), related_name = 'post_category') | 40 | space = models.ForeignKey(Category, verbose_name = ('Category'), related_name = 'post_category') |
31 | 41 | ||
42 | + def update_link(self): | ||
43 | + return "" | ||
44 | + | ||
32 | class SubjectPost(Mural): | 45 | class SubjectPost(Mural): |
33 | space = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'post_subject') | 46 | space = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'post_subject') |
34 | resource = models.ForeignKey(Resource, verbose_name = _('Resource'), related_name = 'post_resource', null = True) | 47 | resource = models.ForeignKey(Resource, verbose_name = _('Resource'), related_name = 'post_resource', null = True) |
35 | 48 | ||
49 | + def update_link(self): | ||
50 | + return "" | ||
51 | + | ||
36 | class Comment(models.Model): | 52 | class Comment(models.Model): |
37 | comment = models.TextField(_('Comment'), blank = True) | 53 | comment = models.TextField(_('Comment'), blank = True) |
38 | image = models.ImageField(verbose_name = _('Image'), null=True, blank = True, upload_to = 'posts/comments/', validators = [validate_img_extension]) | 54 | 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): | @@ -41,12 +57,18 @@ class Comment(models.Model): | ||
41 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) | 57 | create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) |
42 | last_update = models.DateTimeField(_('Last Update'), auto_now = True) | 58 | last_update = models.DateTimeField(_('Last Update'), auto_now = True) |
43 | 59 | ||
60 | +""" | ||
61 | + Model to handle posts visualizations | ||
62 | +""" | ||
44 | class MuralVisualizations(models.Model): | 63 | class MuralVisualizations(models.Model): |
45 | viewed = models.BooleanField(_('Viewed'), default = False) | 64 | viewed = models.BooleanField(_('Viewed'), default = False) |
46 | post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'visualization_post', null = True) | 65 | post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'visualization_post', null = True) |
47 | comment = models.ForeignKey(Comment, verbose_name = _('Comment'), related_name = 'visualization_comment', null = True) | 66 | comment = models.ForeignKey(Comment, verbose_name = _('Comment'), related_name = 'visualization_comment', null = True) |
48 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "visualization_user", null = True) | 67 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "visualization_user", null = True) |
49 | 68 | ||
69 | +""" | ||
70 | + Model to handle users favorite posts | ||
71 | +""" | ||
50 | class MuralFavorites(models.Model): | 72 | class MuralFavorites(models.Model): |
51 | post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'favorites_post', null = True) | 73 | post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'favorites_post', null = True) |
52 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "favorites_user", null = True) | 74 | user = models.ForeignKey(User, verbose_name = _('User'), related_name = "favorites_user", null = True) |
53 | \ No newline at end of file | 75 | \ No newline at end of file |
mural/templates/mural/_view.html
1 | {% load i18n mural_filters %} | 1 | {% load i18n mural_filters %} |
2 | 2 | ||
3 | -<div class="row panel panel-default"> | 3 | +<div id="post-{{ post.id }}" class="row panel panel-default"> |
4 | <div class="panel-body post"> | 4 | <div class="panel-body post"> |
5 | <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 post-img"> | 5 | <div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 post-img"> |
6 | <img src="{{ post.user.image_url }}" class="img-responsive" /> | 6 | <img src="{{ post.user.image_url }}" class="img-responsive" /> |
@@ -18,7 +18,7 @@ | @@ -18,7 +18,7 @@ | ||
18 | <i class="fa fa-ellipsis-v" aria-hidden="true"></i> | 18 | <i class="fa fa-ellipsis-v" aria-hidden="true"></i> |
19 | </button> | 19 | </button> |
20 | <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> | 20 | <ul class="dropdown-menu pull-right" aria-labelledby="moreActions"> |
21 | - <li><a href=""><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans 'Edit' %}</a></li> | 21 | + <li><a onclick="editPost($(this));" data-url="{% url post.update_link post.id %}" data-post="{{ post.id }}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i> {% trans 'Edit' %}</a></li> |
22 | <li> | 22 | <li> |
23 | <a href="" aria-hidden="true"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li> | 23 | <a href="" aria-hidden="true"><i class="fa fa-trash fa-fw" aria-hidden="true"></i> {% trans 'Remove' %}</a></li> |
24 | </ul> | 24 | </ul> |
@@ -32,7 +32,7 @@ | @@ -32,7 +32,7 @@ | ||
32 | </h4> | 32 | </h4> |
33 | <p class="time"> | 33 | <p class="time"> |
34 | <i class="fa fa-clock-o"></i> | 34 | <i class="fa fa-clock-o"></i> |
35 | - {% trans 'In' %} {{ post.last_update }} | 35 | + {% trans 'In' %} {{ post.last_update }} {{ post|is_edited }} |
36 | </p> | 36 | </p> |
37 | 37 | ||
38 | {% autoescape off %} | 38 | {% autoescape off %} |
mural/templates/mural/list.html
@@ -65,11 +65,11 @@ | @@ -65,11 +65,11 @@ | ||
65 | 65 | ||
66 | $('#post-modal-form').modal('show'); | 66 | $('#post-modal-form').modal('show'); |
67 | } | 67 | } |
68 | - }) | 68 | + }); |
69 | }); | 69 | }); |
70 | }); | 70 | }); |
71 | 71 | ||
72 | - function setPostFormSubmit() { | 72 | + function setPostFormSubmit(post = "") { |
73 | var frm = $('#post-form'); | 73 | var frm = $('#post-form'); |
74 | 74 | ||
75 | frm.submit(function () { | 75 | frm.submit(function () { |
@@ -82,9 +82,17 @@ | @@ -82,9 +82,17 @@ | ||
82 | dataType: "json", | 82 | dataType: "json", |
83 | async: false, | 83 | async: false, |
84 | success: function (data) { | 84 | success: function (data) { |
85 | - $('.posts').prepend(data.view); | 85 | + if (post != "") { |
86 | + var old = $("#post-" + post); | ||
87 | + | ||
88 | + old.before(data.view); | ||
89 | + | ||
90 | + old.remove(); | ||
91 | + } else { | ||
92 | + $('.posts').prepend(data.view); | ||
86 | 93 | ||
87 | - $('.no-subjects').attr('style', 'display:none'); | 94 | + $('.no-subjects').attr('style', 'display:none'); |
95 | + } | ||
88 | 96 | ||
89 | $('#post-modal-form').modal('hide'); | 97 | $('#post-modal-form').modal('hide'); |
90 | 98 | ||
@@ -92,7 +100,7 @@ | @@ -92,7 +100,7 @@ | ||
92 | }, | 100 | }, |
93 | error: function(data) { | 101 | error: function(data) { |
94 | $("#post-modal-form").html(data.responseText); | 102 | $("#post-modal-form").html(data.responseText); |
95 | - setPostFormSubmit(); | 103 | + setPostFormSubmit(post); |
96 | }, | 104 | }, |
97 | cache: false, | 105 | cache: false, |
98 | contentType: false, | 106 | contentType: false, |
@@ -123,7 +131,25 @@ | @@ -123,7 +131,25 @@ | ||
123 | btn.attr('data-original-title', response.label); | 131 | btn.attr('data-original-title', response.label); |
124 | } | 132 | } |
125 | }); | 133 | }); |
134 | + } | ||
135 | + | ||
136 | + function editPost(btn) { | ||
137 | + var url = btn.data('url'); | ||
138 | + var post = btn.data('post'); | ||
139 | + | ||
140 | + console.log(url); | ||
141 | + console.log(post); | ||
126 | 142 | ||
143 | + $.ajax({ | ||
144 | + url: url, | ||
145 | + success: function (data) { | ||
146 | + $('#post-modal-form').html(data); | ||
147 | + | ||
148 | + setPostFormSubmit(post); | ||
149 | + | ||
150 | + $('#post-modal-form').modal('show'); | ||
151 | + } | ||
152 | + }); | ||
127 | } | 153 | } |
128 | </script> | 154 | </script> |
129 | {% endblock %} | 155 | {% endblock %} |
130 | \ No newline at end of file | 156 | \ No newline at end of file |
mural/templatetags/mural_filters.py
@@ -5,6 +5,13 @@ from mural.models import MuralFavorites | @@ -5,6 +5,13 @@ from mural.models import MuralFavorites | ||
5 | 5 | ||
6 | register = template.Library() | 6 | register = template.Library() |
7 | 7 | ||
8 | +@register.filter(name = 'is_edited') | ||
9 | +def is_edited(post): | ||
10 | + if post.edited: | ||
11 | + return _("(Edited)") | ||
12 | + | ||
13 | + return "" | ||
14 | + | ||
8 | @register.filter(name = 'action_icon') | 15 | @register.filter(name = 'action_icon') |
9 | def action_icon(action): | 16 | def action_icon(action): |
10 | if action == "comment": | 17 | if action == "comment": |
mural/urls.py
@@ -4,6 +4,7 @@ from . import views | @@ -4,6 +4,7 @@ from . import views | ||
4 | urlpatterns = [ | 4 | urlpatterns = [ |
5 | url(r'^$', views.GeneralIndex.as_view(), name='manage_general'), | 5 | url(r'^$', views.GeneralIndex.as_view(), name='manage_general'), |
6 | url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'), | 6 | url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'), |
7 | - url(r'^render_post/([\w_-]+)/$', views.render_gen_post, name='render_post_general'), | 7 | + url(r'^update_gen/(?P<pk>[\w_-]+)/$', views.GeneralUpdate.as_view(), name='update_general'), |
8 | + url(r'^render_post/([\w_-]+)/([\w_-]+)/$', views.render_gen_post, name='render_post_general'), | ||
8 | url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), | 9 | url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'), |
9 | ] | 10 | ] |
10 | \ No newline at end of file | 11 | \ No newline at end of file |
mural/views.py
@@ -97,17 +97,57 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): | @@ -97,17 +97,57 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): | ||
97 | return context | 97 | return context |
98 | 98 | ||
99 | def get_success_url(self): | 99 | def get_success_url(self): |
100 | - return reverse_lazy('mural:render_post_general', args = (self.object.id, )) | 100 | + return reverse_lazy('mural:render_post_general', args = (self.object.id, 'create', )) |
101 | 101 | ||
102 | -def render_gen_post(request, post): | 102 | +class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): |
103 | + login_url = reverse_lazy("users:login") | ||
104 | + redirect_field_name = 'next' | ||
105 | + | ||
106 | + template_name = 'mural/_form.html' | ||
107 | + model = GeneralPost | ||
108 | + form_class = GeneralPostForm | ||
109 | + | ||
110 | + def form_invalid(self, form): | ||
111 | + context = super(GeneralUpdate, self).form_invalid(form) | ||
112 | + context.status_code = 400 | ||
113 | + | ||
114 | + return context | ||
115 | + | ||
116 | + def form_valid(self, form): | ||
117 | + self.object = form.save(commit = False) | ||
118 | + | ||
119 | + self.object.edited = True | ||
120 | + | ||
121 | + self.object.save() | ||
122 | + | ||
123 | + return super(GeneralUpdate, self).form_valid(form) | ||
124 | + | ||
125 | + def get_context_data(self, *args, **kwargs): | ||
126 | + context = super(GeneralUpdate, self).get_context_data(*args, **kwargs) | ||
127 | + | ||
128 | + context['form_url'] = reverse_lazy("mural:update_general", args = (), kwargs = {'pk': self.object.id}) | ||
129 | + | ||
130 | + return context | ||
131 | + | ||
132 | + def get_success_url(self): | ||
133 | + return reverse_lazy('mural:render_post_general', args = (self.object.id, 'update', )) | ||
134 | + | ||
135 | +def render_gen_post(request, post, msg): | ||
103 | post = get_object_or_404(GeneralPost, id = post) | 136 | post = get_object_or_404(GeneralPost, id = post) |
104 | 137 | ||
105 | context = {} | 138 | context = {} |
106 | context['post'] = post | 139 | context['post'] = post |
107 | 140 | ||
141 | + msg = "" | ||
142 | + | ||
143 | + if msg == 'create': | ||
144 | + msg = _('Your post was published successfully!') | ||
145 | + else: | ||
146 | + msg = _('Your post was edited successfully!') | ||
147 | + | ||
108 | html = render_to_string("mural/_view.html", context, request) | 148 | html = render_to_string("mural/_view.html", context, request) |
109 | 149 | ||
110 | - return JsonResponse({'message': _('Your post was published successfully!'), 'view': html}) | 150 | + return JsonResponse({'message': msg, 'view': html}) |
111 | 151 | ||
112 | @login_required | 152 | @login_required |
113 | def favorite(request, post): | 153 | def favorite(request, post): |