def reply(request, document_slug, thread_id): """Reply to a thread.""" doc = get_document(document_slug, request) form = ReplyForm(request.POST) post_preview = None if form.is_valid(): thread = get_object_or_404(Thread, pk=thread_id, document=doc) if not thread.is_locked: reply_ = form.save(commit=False) reply_.thread = thread reply_.creator = request.user if 'preview' in request.POST: post_preview = reply_ else: reply_.save() statsd.incr('kbforums.reply') # Subscribe the user to the thread. if Setting.get_for_user(request.user, 'kbforums_watch_after_reply'): NewPostEvent.notify(request.user, thread) # Send notifications to thread/forum watchers. NewPostEvent(reply_).fire(exclude=reply_.creator) return HttpResponseRedirect(reply_.get_absolute_url()) return posts(request, document_slug, thread_id, form, post_preview)
def test_autowatch_reply(self, get_current): get_current.return_value.domain = 'testserver' user = User.objects.get(username='******') t1, t2 = Thread.objects.filter(is_locked=False)[0:2] assert not NewPostEvent.is_notifying(user, t1) assert not NewPostEvent.is_notifying(user, t2) self.client.login(username='******', password='******') s = Setting.objects.create(user=user, name='kbforums_watch_after_reply', value='True') data = {'content': 'some content'} post(self.client, 'wiki.discuss.reply', data, args=[t1.document.slug, t1.pk]) assert NewPostEvent.is_notifying(user, t1) s.value = 'False' s.save() post(self.client, 'wiki.discuss.reply', data, args=[t2.document.slug, t2.pk]) assert not NewPostEvent.is_notifying(user, t2)
def new_thread(request, document_slug): """Start a new thread.""" doc = get_document(document_slug, request) if request.method == "GET": form = NewThreadForm() return jingo.render(request, "kbforums/new_thread.html", {"form": form, "document": doc}) form = NewThreadForm(request.POST) post_preview = None if form.is_valid(): if "preview" in request.POST: thread = Thread(creator=request.user, title=form.cleaned_data["title"]) post_preview = Post(thread=thread, creator=request.user, content=form.cleaned_data["content"]) else: thread = doc.thread_set.create(creator=request.user, title=form.cleaned_data["title"]) thread.save() statsd.incr("kbforums.thread") post = thread.new_post(creator=request.user, content=form.cleaned_data["content"]) post.save() # Send notifications to forum watchers. NewThreadEvent(post).fire(exclude=post.creator) # Add notification automatically if needed. if Setting.get_for_user(request.user, "kbforums_watch_new_thread"): NewPostEvent.notify(request.user, thread) return HttpResponseRedirect(reverse("wiki.discuss.posts", args=[document_slug, thread.id])) return jingo.render( request, "kbforums/new_thread.html", {"form": form, "document": doc, "post_preview": post_preview} )
def watch_thread(request, document_slug, thread_id): """Watch/unwatch a thread (based on 'watch' POST param).""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) if request.POST.get('watch') == 'yes': NewPostEvent.notify(request.user, thread) else: NewPostEvent.stop_notifying(request.user, thread) return HttpResponseRedirect( reverse('wiki.discuss.posts', args=[document_slug, thread_id]))
def watch_thread(request, document_slug, thread_id): """Watch/unwatch a thread (based on 'watch' POST param).""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) if request.POST.get("watch") == "yes": NewPostEvent.notify(request.user, thread) statsd.incr("kbforums.watches.thread") else: NewPostEvent.stop_notifying(request.user, thread) return HttpResponseRedirect(reverse("wiki.discuss.posts", args=[document_slug, thread_id]))
def watch_thread(request, document_slug, thread_id): """Watch/unwatch a thread (based on 'watch' POST param).""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) if request.POST.get('watch') == 'yes': NewPostEvent.notify(request.user, thread) else: NewPostEvent.stop_notifying(request.user, thread) return HttpResponseRedirect(reverse('wiki.discuss.posts', args=[document_slug, thread_id]))
def test_watch_thread(self): """Watch then unwatch a thread.""" self.client.login(username='******', password='******') user = User.objects.get(username='******') t = Thread.objects.filter()[0] post(self.client, 'wiki.discuss.watch_thread', {'watch': 'yes'}, args=[t.document.slug, t.id]) assert NewPostEvent.is_notifying(user, t) # NewThreadEvent is not notifying. assert not NewThreadEvent.is_notifying(user, t.document) post(self.client, 'wiki.discuss.watch_thread', {'watch': 'no'}, args=[t.document.slug, t.id]) assert not NewPostEvent.is_notifying(user, t)
def _toggle_watch_thread_as(self, username, thread, turn_on=True): """Watch a thread and return it.""" self.client.login(username=username, password='******') user = User.objects.get(username=username) watch = 'yes' if turn_on else 'no' post(self.client, 'wiki.discuss.watch_thread', {'watch': watch}, args=[thread.document.slug, thread.id]) # Watch exists or not, depending on watch. if turn_on: assert NewPostEvent.is_notifying(user, thread), ( 'NewPostEvent should be notifying.') else: assert not NewPostEvent.is_notifying(user, thread), ( 'NewPostEvent should not be notifying.') return thread
def test_watch_thread(self): """Watch then unwatch a thread.""" u = user(save=True) self.client.login(username=u.username, password='******') t = thread(save=True) post(self.client, 'wiki.discuss.watch_thread', {'watch': 'yes'}, args=[t.document.slug, t.id]) assert NewPostEvent.is_notifying(u, t) # NewThreadEvent is not notifying. assert not NewThreadEvent.is_notifying(u, t.document) post(self.client, 'wiki.discuss.watch_thread', {'watch': 'no'}, args=[t.document.slug, t.id]) assert not NewPostEvent.is_notifying(u, t)
def posts(request, document_slug, thread_id, form=None, reply_preview=None): """View all the posts in a thread.""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) posts_ = paginate(request, thread.post_set.all(), kbforums.POSTS_PER_PAGE) if not form: form = ReplyForm() feed_urls = ((reverse('wiki.discuss.posts.feed', kwargs={ 'document_slug': document_slug, 'thread_id': thread_id }), PostsFeed().title(thread)), ) is_watching_thread = (request.user.is_authenticated() and NewPostEvent.is_notifying(request.user, thread)) return jingo.render( request, 'kbforums/posts.html', { 'document': doc, 'thread': thread, 'posts': posts_, 'form': form, 'reply_preview': reply_preview, 'is_watching_thread': is_watching_thread, 'feeds': feed_urls })
def posts(request, document_slug, thread_id, form=None, reply_preview=None): """View all the posts in a thread.""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) posts_ = paginate(request, thread.post_set.all(), kbforums.POSTS_PER_PAGE) if not form: form = ReplyForm() feed_urls = ((reverse('wiki.discuss.posts.feed', kwargs={'document_slug': document_slug, 'thread_id': thread_id}), PostsFeed().title(thread)),) is_watching_thread = (request.user.is_authenticated() and NewPostEvent.is_notifying(request.user, thread)) return jingo.render(request, 'kbforums/posts.html', {'document': doc, 'thread': thread, 'posts': posts_, 'form': form, 'reply_preview': reply_preview, 'is_watching_thread': is_watching_thread, 'feeds': feed_urls})
def new_thread(request, document_slug): """Start a new thread.""" doc = get_document(document_slug, request) if request.method == 'GET': form = NewThreadForm() return render(request, 'kbforums/new_thread.html', { 'form': form, 'document': doc }) form = NewThreadForm(request.POST) post_preview = None if form.is_valid(): if 'preview' in request.POST: thread = Thread(creator=request.user, title=form.cleaned_data['title']) post_preview = Post(thread=thread, creator=request.user, content=form.cleaned_data['content']) else: thread = doc.thread_set.create(creator=request.user, title=form.cleaned_data['title']) thread.save() statsd.incr('kbforums.thread') post = thread.new_post(creator=request.user, content=form.cleaned_data['content']) post.save() # Send notifications to forum watchers. NewThreadEvent(post).fire(exclude=post.creator) # Add notification automatically if needed. if Setting.get_for_user(request.user, 'kbforums_watch_new_thread'): NewPostEvent.notify(request.user, thread) return HttpResponseRedirect( reverse('wiki.discuss.posts', args=[document_slug, thread.id])) return render(request, 'kbforums/new_thread.html', { 'form': form, 'document': doc, 'post_preview': post_preview })
def test_autowatch_new_thread(self, get_current): """Creating a new thread should email responses""" get_current.return_value.domain = 'testserver' d = document(save=True) u = user(save=True) self.client.login(username=u.username, password='******') s = Setting.objects.create(user=u, name='kbforums_watch_new_thread', value='False') data = {'title': 'a title', 'content': 'a post'} post(self.client, 'wiki.discuss.new_thread', data, args=[d.slug]) t1 = thread(document=d, save=True) assert not NewPostEvent.is_notifying(u, t1), ( 'NewPostEvent should not be notifying.') s.value = 'True' s.save() post(self.client, 'wiki.discuss.new_thread', data, args=[d.slug]) t2 = Thread.uncached.all().order_by('-id')[0] assert NewPostEvent.is_notifying(u, t2), ( 'NewPostEvent should be notifying')
def new_thread(request, document_slug): """Start a new thread.""" doc = get_document(document_slug, request) if request.method == 'GET': form = NewThreadForm() return render(request, 'kbforums/new_thread.html', { 'form': form, 'document': doc}) form = NewThreadForm(request.POST) post_preview = None if form.is_valid(): if 'preview' in request.POST: thread = Thread(creator=request.user, title=form.cleaned_data['title']) post_preview = Post(thread=thread, creator=request.user, content=form.cleaned_data['content']) else: thread = doc.thread_set.create(creator=request.user, title=form.cleaned_data['title']) thread.save() statsd.incr('kbforums.thread') post = thread.new_post(creator=request.user, content=form.cleaned_data['content']) post.save() # Send notifications to forum watchers. NewThreadEvent(post).fire(exclude=post.creator) # Add notification automatically if needed. if Setting.get_for_user(request.user, 'kbforums_watch_new_thread'): NewPostEvent.notify(request.user, thread) return HttpResponseRedirect( reverse('wiki.discuss.posts', args=[document_slug, thread.id])) return render(request, 'kbforums/new_thread.html', { 'form': form, 'document': doc, 'post_preview': post_preview})
def test_watch_forum(self): """Watch then unwatch a forum.""" self.client.login(username='******', password='******') user = User.objects.get(username='******') d = Document.objects.filter()[0] post(self.client, 'wiki.discuss.watch_forum', {'watch': 'yes'}, args=[d.slug]) assert NewThreadEvent.is_notifying(user, d) # NewPostEvent is not notifying. p = d.thread_set.all()[0].post_set.all()[0] assert not NewPostEvent.is_notifying(user, p) post(self.client, 'wiki.discuss.watch_forum', {'watch': 'no'}, args=[d.slug]) assert not NewThreadEvent.is_notifying(user, d)
def _toggle_watch_kbforum_as(self, username, turn_on=True, document_id=1): """Watch a discussion forum and return it.""" document = Document.objects.get(pk=document_id) self.client.login(username=username, password='******') user = User.objects.get(username=username) watch = 'yes' if turn_on else 'no' post(self.client, 'wiki.discuss.watch_forum', {'watch': watch}, args=[document.slug]) # Watch exists or not, depending on watch. if turn_on: assert NewThreadEvent.is_notifying(user, document), ( 'NewThreadEvent should be notifying.') else: assert not NewPostEvent.is_notifying(user, document), ( 'NewThreadEvent should not be notifying.') return document
def test_watch_forum(self): """Watch then unwatch a forum.""" u = user(save=True) self.client.login(username=u.username, password='******') d = document(save=True) post(self.client, 'wiki.discuss.watch_forum', {'watch': 'yes'}, args=[d.slug]) assert NewThreadEvent.is_notifying(u, d) # NewPostEvent is not notifying. t = thread(document=d, save=True) p = t.new_post(creator=t.creator, content='test') #p = d.thread_set.all()[0].post_set.all()[0] assert not NewPostEvent.is_notifying(u, p) post(self.client, 'wiki.discuss.watch_forum', {'watch': 'no'}, args=[d.slug]) assert not NewThreadEvent.is_notifying(u, d)
def posts(request, document_slug, thread_id, form=None, post_preview=None): """View all the posts in a thread.""" doc = get_document(document_slug, request) thread = get_object_or_404(Thread, pk=thread_id, document=doc) posts_ = thread.post_set.all() count = posts_.count() if count: last_post = posts_[count - 1] else: last_post = None posts_ = paginate(request, posts_, kbforums.POSTS_PER_PAGE) if not form: form = ReplyForm() feed_urls = ( ( reverse("wiki.discuss.posts.feed", kwargs={"document_slug": document_slug, "thread_id": thread_id}), PostsFeed().title(thread), ), ) is_watching_thread = request.user.is_authenticated() and NewPostEvent.is_notifying(request.user, thread) return jingo.render( request, "kbforums/posts.html", { "document": doc, "thread": thread, "posts": posts_, "form": form, "count": count, "last_post": last_post, "post_preview": post_preview, "is_watching_thread": is_watching_thread, "feeds": feed_urls, }, )
def reply(request, document_slug, thread_id): """Reply to a thread.""" doc = get_document(document_slug, request) form = ReplyForm(request.POST) reply_preview = None if form.is_valid(): thread = get_object_or_404(Thread, pk=thread_id, document=doc) if not thread.is_locked: reply_ = form.save(commit=False) reply_.thread = thread reply_.creator = request.user if 'preview' in request.POST: reply_preview = reply_ else: reply_.save() # Send notifications to thread/forum watchers. NewPostEvent(reply_).fire(exclude=reply_.creator) return HttpResponseRedirect(reply_.get_absolute_url()) return posts(request, document_slug, thread_id, form, reply_preview)
def test_delete_removes_watches(self): t = Thread.objects.get(pk=1) NewPostEvent.notify('*****@*****.**', t) assert NewPostEvent.is_notifying('*****@*****.**', t) t.delete() assert not NewPostEvent.is_notifying('*****@*****.**', t)