Skip to content

Commit

Permalink
Merge pull request #100 from davidbgk/99-moderation-discussions
Browse files Browse the repository at this point in the history
Add the ability to delete a discussion, refs #99
  • Loading branch information
davidbgk committed Jul 10, 2015
2 parents f4de6ad + a3b01aa commit 352db05
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 4 deletions.
18 changes: 16 additions & 2 deletions udata/core/discussions/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,18 @@

from flask.ext.security import current_user

from udata.auth import admin_permission
from udata.api import api, API, fields
from udata.models import Dataset, DatasetDiscussion, Reuse, ReuseDiscussion
from udata.core.user.api_fields import user_ref_fields

from .forms import DiscussionCreateForm, DiscussionCommentForm
from .models import Message, Discussion
from .permissions import CloseDiscussionPermission
from .signals import on_new_discussion, on_new_discussion_comment, on_discussion_closed
from .signals import (
on_new_discussion, on_new_discussion_comment, on_discussion_closed,
on_discussion_deleted
)

ns = api.namespace('discussions', 'Discussion related operations')

Expand Down Expand Up @@ -67,7 +71,7 @@ def get(self, id):
@api.response(403, 'Not allowed to close this discussion')
@api.marshal_with(discussion_fields)
def post(self, id):
'''Add comment and optionnaly close an discussion given its ID'''
'''Add comment and optionnaly close a discussion given its ID'''
discussion = Discussion.objects.get_or_404(id=id)
form = api.validate(DiscussionCommentForm)
message = Message(
Expand All @@ -87,6 +91,16 @@ def post(self, id):
on_new_discussion_comment.send(discussion, message=message)
return discussion

@api.secure(admin_permission)
@api.doc('delete_discussion')
@api.response(403, 'Not allowed to delete this discussion')
def delete(self, id):
'''Delete a discussion given its ID'''
discussion = Discussion.objects.get_or_404(id=id)
discussion.delete()
on_discussion_deleted.send(discussion)
return '', 204


@ns.route('/', endpoint='discussions')
class DiscussionsAPI(API):
Expand Down
5 changes: 4 additions & 1 deletion udata/core/discussions/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
from udata.i18n import lazy_gettext as _

from .models import Discussion
from .signals import on_new_discussion, on_discussion_closed
from .signals import (
on_new_discussion, on_discussion_closed, on_discussion_deleted
)


class DiscussionsMetric(Metric):
Expand All @@ -18,6 +20,7 @@ def get_value(self):

@on_new_discussion.connect
@on_discussion_closed.connect
@on_discussion_deleted.connect
def update_discussions_metric(discussion, **kwargs):
model = discussion.subject.__class__
for name, cls in Metric.get_for(model).items():
Expand Down
3 changes: 3 additions & 0 deletions udata/core/discussions/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@

#: Trigerred when an discussion is closed
on_discussion_closed = namespace.signal('on-discussion-closed')

#: Trigerred when an discussion is deleted
on_discussion_deleted = namespace.signal('on-discussion-deleted')
47 changes: 46 additions & 1 deletion udata/tests/test_discussions.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

from .api import APITestCase
from .factories import (
faker, UserFactory, OrganizationFactory, DatasetFactory, DatasetDiscussionFactory
faker, AdminFactory, UserFactory, OrganizationFactory, DatasetFactory,
DatasetDiscussionFactory
)


Expand Down Expand Up @@ -261,6 +262,50 @@ def test_close_discussion_permissions(self):
# Metrics unchanged after attempt to close the discussion.
self.assertEqual(dataset.metrics['discussions'], 1)

def test_delete_discussion(self):
owner = self.login(AdminFactory())
user = UserFactory()
dataset = Dataset.objects.create(title='Test dataset', owner=owner)
message = Message(content='bla bla', posted_by=user)
discussion = DatasetDiscussion.objects.create(
subject=dataset.id,
user=user,
title='test discussion',
discussion=[message]
)
on_new_discussion.send(discussion) # Updating metrics.
self.assertEqual(DatasetDiscussion.objects(subject=dataset.id).count(),
1)

response = self.delete(url_for('api.discussion', id=discussion.id))
self.assertStatus(response, 204)

dataset.reload()
self.assertEqual(dataset.metrics['discussions'], 0)
self.assertEqual(DatasetDiscussion.objects(subject=dataset.id).count(),
0)

def test_delete_discussion_permissions(self):
owner = self.login()
dataset = Dataset.objects.create(title='Test dataset', owner=owner)
user = UserFactory()
message = Message(content='bla bla', posted_by=user)
discussion = DatasetDiscussion.objects.create(
subject=dataset.id,
user=user,
title='test discussion',
discussion=[message]
)
on_new_discussion.send(discussion) # Updating metrics.

self.login()
response = self.delete(url_for('api.discussion', id=discussion.id))
self.assert403(response)

dataset.reload()
# Metrics unchanged after attempt to delete the discussion.
self.assertEqual(dataset.metrics['discussions'], 1)


class DiscussionCsvTest(FrontTestCase):

Expand Down

0 comments on commit 352db05

Please sign in to comment.