Commit 968668f4034a8296b126521bf4d5715056e7d122
1 parent
2146f0a6
Exists in
master
and in
3 other branches
Adding post update/delete propagation to other users
Showing
2 changed files
with
76 additions
and
28 deletions
Show diff stats
amadeus/static/js/socket.js
@@ -4,48 +4,79 @@ if (("Notification" in window)) { | @@ -4,48 +4,79 @@ if (("Notification" in window)) { | ||
4 | } | 4 | } |
5 | } | 5 | } |
6 | 6 | ||
7 | - | ||
8 | socket = new WebSocket("ws://" + window.location.host + "/"); | 7 | socket = new WebSocket("ws://" + window.location.host + "/"); |
9 | 8 | ||
10 | socket.onmessage = function(e) { | 9 | socket.onmessage = function(e) { |
11 | content = JSON.parse(e.data); | 10 | content = JSON.parse(e.data); |
12 | 11 | ||
13 | if (content.type == "mural") { | 12 | if (content.type == "mural") { |
14 | - if (window.location.pathname == content.pathname) { | ||
15 | - $('.posts').prepend(content.complete); | 13 | + if (content.subtype == "create") { |
14 | + muralNotificationCreate(content); | ||
15 | + } else if (content.subtype == "update") { | ||
16 | + muralNotificationUpdate(content); | ||
17 | + } else if (content.subtype == "delete") { | ||
18 | + muralNotificationDelete(content); | ||
19 | + } | ||
20 | + } | ||
21 | +} | ||
22 | +// Call onopen directly if socket is already open | ||
23 | +if (socket.readyState == WebSocket.OPEN) socket.onopen(); | ||
16 | 24 | ||
17 | - $('.no-subjects').attr('style', 'display:none'); | ||
18 | - } else { | ||
19 | - $('.mural_badge').each(function () { | ||
20 | - var actual = $(this).text(); | 25 | +function muralNotificationCreate(content) { |
26 | + if (window.location.pathname == content.pathname) { | ||
27 | + $('.posts').prepend(content.complete); | ||
21 | 28 | ||
22 | - if (actual != "+99") { | ||
23 | - actual = parseInt(actual, 10) + 1; | 29 | + $('.no-subjects').attr('style', 'display:none'); |
30 | + } else { | ||
31 | + $('.mural_badge').each(function () { | ||
32 | + var actual = $(this).text(); | ||
24 | 33 | ||
25 | - if (actual > 99) { | ||
26 | - actual = "+99"; | ||
27 | - } | 34 | + if (actual != "+99") { |
35 | + actual = parseInt(actual, 10) + 1; | ||
28 | 36 | ||
29 | - $(this).text(actual); | 37 | + if (actual > 99) { |
38 | + actual = "+99"; | ||
30 | } | 39 | } |
31 | 40 | ||
32 | - $(this).show(); | ||
33 | - }); | 41 | + $(this).text(actual); |
42 | + } | ||
43 | + | ||
44 | + $(this).show(); | ||
45 | + }); | ||
46 | + } | ||
47 | + | ||
48 | + if (("Notification" in window)) { | ||
49 | + var options = { | ||
50 | + icon: content.user_icon, | ||
51 | + body: content.simple | ||
34 | } | 52 | } |
35 | 53 | ||
36 | - if (("Notification" in window)) { | ||
37 | - var options = { | ||
38 | - icon: content.user_icon, | ||
39 | - body: content.simple | ||
40 | - } | 54 | + if (Notification.permission === "granted") { |
55 | + var notification = new Notification("", options); | ||
41 | 56 | ||
42 | - if (Notification.permission === "granted") { | ||
43 | - var notification = new Notification("", options); | 57 | + setTimeout(notification.close.bind(notification), 3000); |
58 | + } | ||
59 | + } | ||
60 | +} | ||
61 | + | ||
62 | +function muralNotificationUpdate(content) { | ||
63 | + if (window.location.pathname == content.pathname) { | ||
64 | + var post = $("#post-" + content.post_id); | ||
65 | + | ||
66 | + if (post.is(":visible")) { | ||
67 | + post.before(content.complete); | ||
44 | 68 | ||
45 | - setTimeout(notification.close.bind(notification), 3000); | ||
46 | - } | ||
47 | - } | 69 | + post.remove(); |
70 | + } | ||
48 | } | 71 | } |
49 | } | 72 | } |
50 | -// Call onopen directly if socket is already open | ||
51 | -if (socket.readyState == WebSocket.OPEN) socket.onopen(); | ||
52 | \ No newline at end of file | 73 | \ No newline at end of file |
74 | + | ||
75 | +function muralNotificationDelete(content) { | ||
76 | + if (window.location.pathname == content.pathname) { | ||
77 | + var post = $("#post-" + content.post_id); | ||
78 | + | ||
79 | + if (post.is(":visible")) { | ||
80 | + post.remove(); | ||
81 | + } | ||
82 | + } | ||
83 | +} | ||
53 | \ No newline at end of file | 84 | \ No newline at end of file |
mural/views.py
@@ -83,7 +83,7 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): | @@ -83,7 +83,7 @@ class GeneralCreate(LoginRequiredMixin, generic.edit.CreateView): | ||
83 | 83 | ||
84 | for user in users: | 84 | for user in users: |
85 | entries.append(MuralVisualizations(viewed = False, user = user, post = self.object)) | 85 | entries.append(MuralVisualizations(viewed = False, user = user, post = self.object)) |
86 | - Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "user_icon": user_icon, "pathname": pathname, "simple": simple_notify, "complete": _view})}) | 86 | + Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "create", "user_icon": user_icon, "pathname": pathname, "simple": simple_notify, "complete": _view})}) |
87 | 87 | ||
88 | MuralVisualizations.objects.bulk_create(entries) | 88 | MuralVisualizations.objects.bulk_create(entries) |
89 | 89 | ||
@@ -119,6 +119,15 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): | @@ -119,6 +119,15 @@ class GeneralUpdate(LoginRequiredMixin, generic.UpdateView): | ||
119 | self.object.edited = True | 119 | self.object.edited = True |
120 | 120 | ||
121 | self.object.save() | 121 | self.object.save() |
122 | + | ||
123 | + users = User.objects.all().exclude(id = self.request.user.id) | ||
124 | + | ||
125 | + notify_type = "mural" | ||
126 | + _view = render_to_string("mural/_view.html", {"post": self.object}, self.request) | ||
127 | + pathname = reverse("mural:manage_general") | ||
128 | + | ||
129 | + for user in users: | ||
130 | + Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "update", "pathname": pathname, "complete": _view, "post_id": self.object.id})}) | ||
122 | 131 | ||
123 | return super(GeneralUpdate, self).form_valid(form) | 132 | return super(GeneralUpdate, self).form_valid(form) |
124 | 133 | ||
@@ -147,6 +156,14 @@ class GeneralDelete(LoginRequiredMixin, generic.DeleteView): | @@ -147,6 +156,14 @@ class GeneralDelete(LoginRequiredMixin, generic.DeleteView): | ||
147 | return context | 156 | return context |
148 | 157 | ||
149 | def get_success_url(self): | 158 | def get_success_url(self): |
159 | + users = User.objects.all().exclude(id = self.request.user.id) | ||
160 | + | ||
161 | + notify_type = "mural" | ||
162 | + pathname = reverse("mural:manage_general") | ||
163 | + | ||
164 | + for user in users: | ||
165 | + Group("user-%s" % user.id).send({'text': json.dumps({"type": notify_type, "subtype": "delete", "pathname": pathname, "post_id": self.object.id})}) | ||
166 | + | ||
150 | return reverse_lazy('mural:deleted_post') | 167 | return reverse_lazy('mural:deleted_post') |
151 | 168 | ||
152 | def render_gen_post(request, post, msg): | 169 | def render_gen_post(request, post, msg): |