Update document comments app

Add keyword arguments to the app links.

Remove use of `raise_404`.

Update URL parameters to use document_id and comment_id.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-01-19 04:08:45 -04:00
parent 53f3261dae
commit 6376445cc4
14 changed files with 49 additions and 64 deletions

View File

@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals
from rest_framework import generics from rest_framework import generics
from mayan.apps.common.mixins import ExternalObjectViewMixin from mayan.apps.common.mixins import ExternalObjectMixin
from mayan.apps.documents.models import Document from mayan.apps.documents.models import Document
from .permissions import ( from .permissions import (
@@ -12,13 +12,13 @@ from .permissions import (
from .serializers import CommentSerializer, WritableCommentSerializer from .serializers import CommentSerializer, WritableCommentSerializer
class APICommentListView(ExternalObjectViewMixin, generics.ListCreateAPIView): class APICommentListView(ExternalObjectMixin, generics.ListCreateAPIView):
""" """
get: Returns a list of all the document comments. get: Returns a list of all the document comments.
post: Create a new document comment. post: Create a new document comment.
""" """
external_object_pk_url_kwarg = 'document_pk'
external_object_class = Document external_object_class = Document
external_object_pk_url_kwarg = 'document_id'
def get_document(self): def get_document(self):
return self.get_external_object() return self.get_external_object()
@@ -59,14 +59,14 @@ class APICommentListView(ExternalObjectViewMixin, generics.ListCreateAPIView):
return context return context
class APICommentView(ExternalObjectViewMixin, generics.RetrieveDestroyAPIView): class APICommentView(ExternalObjectMixin, generics.RetrieveDestroyAPIView):
""" """
delete: Delete the selected document comment. delete: Delete the selected document comment.
get: Returns the details of the selected document comment. get: Returns the details of the selected document comment.
""" """
external_object_pk_url_kwarg = 'document_pk'
external_object_class = Document external_object_class = Document
lookup_url_kwarg = 'comment_pk' external_object_pk_url_kwarg = 'document_id'
lookup_url_kwarg = 'comment_id'
serializer_class = CommentSerializer serializer_class = CommentSerializer
def get_document(self): def get_document(self):

View File

@@ -60,18 +60,18 @@ class DocumentCommentsApp(MayanAppConfig):
SourceColumn(source=Comment, label=_('Date'), attribute='submit_date') SourceColumn(source=Comment, label=_('Date'), attribute='submit_date')
SourceColumn( SourceColumn(
source=Comment, label=_('User'), func=lambda context: context['object'].user.get_full_name() if context['object'].user.get_full_name() else context['object'].user,
func=lambda context: context['object'].user.get_full_name() if context['object'].user.get_full_name() else context['object'].user label=_('User'), source=Comment
) )
SourceColumn(source=Comment, label=_('Comment'), attribute='comment') SourceColumn(source=Comment, label=_('Comment'), attribute='comment')
document_page_search.add_model_field( document_page_search.add_model_field(
label=_('Comments'),
field='document_version__document__comments__comment', field='document_version__document__comments__comment',
label=_('Comments')
) )
document_search.add_model_field( document_search.add_model_field(
field='comments__comment', label=_('Comments'),
label=_('Comments') field='comments__comment'
) )
menu_sidebar.bind_links( menu_sidebar.bind_links(

View File

@@ -5,12 +5,12 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.events import EventTypeNamespace from mayan.apps.events import EventTypeNamespace
namespace = EventTypeNamespace( namespace = EventTypeNamespace(
name='document_comments', label=_('Document comments') label=_('Document comments'), name='document_comments'
) )
event_document_comment_created = namespace.add_event_type( event_document_comment_created = namespace.add_event_type(
name='create', label=_('Document comment created') label=_('Document comment created'), name='create'
) )
event_document_comment_deleted = namespace.add_event_type( event_document_comment_deleted = namespace.add_event_type(
name='delete', label=_('Document comment deleted') label=_('Document comment deleted'), name='delete'
) )

View File

@@ -2,9 +2,9 @@ from __future__ import absolute_import, unicode_literals
from mayan.apps.appearance.classes import Icon from mayan.apps.appearance.classes import Icon
icon_comments_for_document = Icon(driver_name='fontawesome', symbol='comment')
icon_comment_add = Icon( icon_comment_add = Icon(
driver_name='fontawesome-dual', primary_symbol='comment', driver_name='fontawesome-dual', primary_symbol='comment',
secondary_symbol='plus' secondary_symbol='plus'
) )
icon_comment_delete = Icon(driver_name='fontawesome', symbol='times') icon_comment_delete = Icon(driver_name='fontawesome', symbol='times')
icon_comments_for_document = Icon(driver_name='fontawesome', symbol='comment')

View File

@@ -13,17 +13,18 @@ from .permissions import (
) )
link_comment_add = Link( link_comment_add = Link(
args='object.pk', icon_class=icon_comment_add, icon_class=icon_comment_add, kwargs={'document_id': 'object.pk'},
permissions=(permission_comment_create,), text=_('Add comment'), permissions=(permission_comment_create,), text=_('Add comment'),
view='comments:comment_add', view='comments:comment_add',
) )
link_comment_delete = Link( link_comment_delete = Link(
args='object.pk', icon_class=icon_comment_delete, icon_class=icon_comment_delete, kwargs={'comment_id': 'object.pk'},
permissions=(permission_comment_delete,), tags='dangerous', permissions=(permission_comment_delete,), tags='dangerous',
text=_('Delete'), view='comments:comment_delete', text=_('Delete'), view='comments:comment_delete',
) )
link_comments_for_document = Link( link_comments_for_document = Link(
args='resolved_object.pk', icon_class=icon_comments_for_document, icon_class=icon_comments_for_document,
kwargs={'document_id': 'resolved_object.pk'},
permissions=(permission_comment_view,), text=_('Comments'), permissions=(permission_comment_view,), text=_('Comments'),
view='comments:comments_for_document', view='comments:comments_for_document',
) )

View File

@@ -7,11 +7,11 @@ from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(label=_('Comments'), name='comments') namespace = PermissionNamespace(label=_('Comments'), name='comments')
permission_comment_create = namespace.add_permission( permission_comment_create = namespace.add_permission(
name='comment_create', label=_('Create new comments') label=_('Create new comments'), name='comment_create'
) )
permission_comment_delete = namespace.add_permission( permission_comment_delete = namespace.add_permission(
name='comment_delete', label=_('Delete comments') label=_('Delete comments'), name='comment_delete'
) )
permission_comment_view = namespace.add_permission( permission_comment_view = namespace.add_permission(
name='comment_view', label=_('View comments') label=_('View comments'), name='comment_view'
) )

View File

@@ -25,14 +25,14 @@ class CommentSerializer(serializers.HyperlinkedModelSerializer):
def get_document_comments_url(self, instance): def get_document_comments_url(self, instance):
return reverse( return reverse(
viewname='rest_api:comment-list', kwargs={ viewname='rest_api:comment-list', kwargs={
'document_pk': instance.document.pk, 'document_id': instance.document.pk,
}, request=self.context['request'], format=self.context['format'] }, request=self.context['request'], format=self.context['format']
) )
def get_url(self, instance): def get_url(self, instance):
return reverse( return reverse(
viewname='rest_api:comment-detail', kwargs={ viewname='rest_api:comment-detail', kwargs={
'document_pk': instance.document.pk, 'comment_pk': instance.pk 'document_id': instance.document.pk, 'comment_pk': instance.pk
}, request=self.context['request'], format=self.context['format'] }, request=self.context['request'], format=self.context['format']
) )
@@ -59,13 +59,13 @@ class WritableCommentSerializer(serializers.ModelSerializer):
def get_document_comments_url(self, instance): def get_document_comments_url(self, instance):
return reverse( return reverse(
viewname='rest_api:comment-list', kwargs={ viewname='rest_api:comment-list', kwargs={
'document_pk': instance.document.pk 'document_id': instance.document.pk
}, request=self.context['request'], format=self.context['format'] }, request=self.context['request'], format=self.context['format']
) )
def get_url(self, instance): def get_url(self, instance):
return reverse( return reverse(
viewname='rest_api:comment-detail', kwargs={ viewname='rest_api:comment-detail', kwargs={
'document_pk': instance.document.pk, 'comment_pk': instance.pk 'document_id': instance.document.pk, 'comment_id': instance.pk
}, request=self.context['request'], format=self.context['format'] }, request=self.context['request'], format=self.context['format']
) )

View File

@@ -9,13 +9,13 @@ class CommentsTestMixin(object):
def _create_comment(self, user=None): def _create_comment(self, user=None):
self.test_comment = self.document.comments.create( self.test_comment = self.document.comments.create(
comment=TEST_COMMENT_TEXT, comment=TEST_COMMENT_TEXT,
user=user or self.user or self.admin_user user=user or self._test_case_user or self.admin_user
) )
def _request_document_comment_add_view(self): def _request_document_comment_add_view(self):
response = self.post( response = self.post(
viewname='comments:comment_add', viewname='comments:comment_add',
kwargs={'document_pk': self.document.pk}, kwargs={'document_id': self.document.pk},
data={'comment': TEST_COMMENT_TEXT} data={'comment': TEST_COMMENT_TEXT}
) )
self.test_comment = Comment.objects.filter( self.test_comment = Comment.objects.filter(
@@ -27,5 +27,5 @@ class CommentsTestMixin(object):
def _request_document_comment_delete_view(self): def _request_document_comment_delete_view(self):
return self.post( return self.post(
viewname='comments:comment_delete', viewname='comments:comment_delete',
kwargs={'comment_pk': self.test_comment.pk}, kwargs={'comment_id': self.test_comment.pk},
) )

View File

@@ -16,10 +16,6 @@ from .mixins import CommentsTestMixin
class CommentAPITestCase(CommentsTestMixin, DocumentTestMixin, BaseAPITestCase): class CommentAPITestCase(CommentsTestMixin, DocumentTestMixin, BaseAPITestCase):
def setUp(self):
super(CommentAPITestCase, self).setUp()
self.login_user()
def _request_api_comment_create_view(self): def _request_api_comment_create_view(self):
return self.post( return self.post(
viewname='rest_api:comment-list', viewname='rest_api:comment-list',

View File

@@ -13,10 +13,6 @@ from .mixins import CommentsTestMixin
class CommentEventsTestCase(CommentsTestMixin, GenericDocumentViewTestCase): class CommentEventsTestCase(CommentsTestMixin, GenericDocumentViewTestCase):
def setUp(self):
super(CommentEventsTestCase, self).setUp()
self.login_user()
def test_comment_created_event_no_permissions(self): def test_comment_created_event_no_permissions(self):
Action.objects.all().delete() Action.objects.all().delete()

View File

@@ -12,10 +12,6 @@ from .mixins import CommentsTestMixin
class CommentsViewsTestCase(CommentsTestMixin, GenericDocumentViewTestCase): class CommentsViewsTestCase(CommentsTestMixin, GenericDocumentViewTestCase):
def setUp(self):
super(CommentsViewsTestCase, self).setUp()
self.login_user()
def test_document_comment_add_view_no_permission(self): def test_document_comment_add_view_no_permission(self):
response = self._request_document_comment_add_view() response = self._request_document_comment_add_view()
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
@@ -31,7 +27,7 @@ class CommentsViewsTestCase(CommentsTestMixin, GenericDocumentViewTestCase):
def _create_test_comment(self): def _create_test_comment(self):
self.test_comment = self.document.comments.create( self.test_comment = self.document.comments.create(
user=self.user, comment=TEST_COMMENT_TEXT user=self._test_case_user, comment=TEST_COMMENT_TEXT
) )
def test_document_comment_delete_view_no_permission(self): def test_document_comment_delete_view_no_permission(self):
@@ -54,7 +50,7 @@ class CommentsViewsTestCase(CommentsTestMixin, GenericDocumentViewTestCase):
def _request_document_comment_list_view(self): def _request_document_comment_list_view(self):
return self.get( return self.get(
viewname='comments:comments_for_document', viewname='comments:comments_for_document',
kwargs={'document_pk': self.document.pk} kwargs={'document_id': self.document.pk}
) )
def test_document_comment_list_view_no_permissions(self): def test_document_comment_list_view_no_permissions(self):

View File

@@ -10,26 +10,26 @@ from .views import (
urlpatterns = [ urlpatterns = [
url( url(
regex=r'^comments/(?P<comment_pk>\d+)/delete/$', name='comment_delete', regex=r'^comments/(?P<comment_id>\d+)/delete/$', name='comment_delete',
view=DocumentCommentDeleteView.as_view() view=DocumentCommentDeleteView.as_view()
), ),
url( url(
regex=r'^documents/(?P<document_pk>\d+)/comments/add/$', regex=r'^documents/(?P<document_id>\d+)/comments/$',
name='comment_add', view=DocumentCommentCreateView.as_view()
),
url(
regex=r'^documents/(?P<document_pk>\d+)/comments/$',
name='comments_for_document', view=DocumentCommentListView.as_view() name='comments_for_document', view=DocumentCommentListView.as_view()
), ),
url(
regex=r'^documents/(?P<document_id>\d+)/comments/add/$',
name='comment_add', view=DocumentCommentCreateView.as_view()
)
] ]
api_urls = [ api_urls = [
url( url(
regex=r'^documents/(?P<document_pk>[0-9]+)/comments/$', regex=r'^documents/(?P<document_id>\d+)/comments/$',
name='comment-list', view=APICommentListView.as_view() name='comment-list', view=APICommentListView.as_view()
), ),
url( url(
regex=r'^documents/(?P<document_pk>[0-9]+)/comments/(?P<comment_pk>[0-9]+)/$', regex=r'^documents/(?P<document_id>\d+)/comments/(?P<comment_id>\d+)/$',
name='comment-detail', view=APICommentView.as_view() name='comment-detail', view=APICommentView.as_view()
), )
] ]

View File

@@ -7,7 +7,7 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.generics import ( from mayan.apps.common.generics import (
SingleObjectCreateView, SingleObjectDeleteView, SingleObjectListView SingleObjectCreateView, SingleObjectDeleteView, SingleObjectListView
) )
from mayan.apps.common.mixins import ExternalObjectViewMixin from mayan.apps.common.mixins import ExternalObjectMixin
from mayan.apps.documents.models import Document from mayan.apps.documents.models import Document
from .icons import icon_comments_for_document from .icons import icon_comments_for_document
@@ -19,11 +19,11 @@ from .permissions import (
) )
class DocumentCommentCreateView(ExternalObjectViewMixin, SingleObjectCreateView): class DocumentCommentCreateView(ExternalObjectMixin, SingleObjectCreateView):
fields = ('comment',)
external_object_pk_url_kwarg = 'document_pk'
external_object_class = Document external_object_class = Document
external_object_permission = permission_comment_create external_object_permission = permission_comment_create
external_object_pk_url_kwarg = 'document_id'
fields = ('comment',)
model = Comment model = Comment
def get_document(self): def get_document(self):
@@ -43,7 +43,7 @@ class DocumentCommentCreateView(ExternalObjectViewMixin, SingleObjectCreateView)
def get_post_action_redirect(self): def get_post_action_redirect(self):
return reverse( return reverse(
viewname='comments:comments_for_document', kwargs={ viewname='comments:comments_for_document', kwargs={
'document_pk': self.kwargs['document_pk'] 'document_id': self.kwargs['document_id']
} }
) )
@@ -55,9 +55,8 @@ class DocumentCommentCreateView(ExternalObjectViewMixin, SingleObjectCreateView)
class DocumentCommentDeleteView(SingleObjectDeleteView): class DocumentCommentDeleteView(SingleObjectDeleteView):
model = Comment model = Comment
pk_url_kwarg = 'comment_pk' pk_url_kwarg = 'comment_id'
object_permission = permission_comment_delete object_permission = permission_comment_delete
object_permission_raise_404 = True
def get_delete_extra_data(self): def get_delete_extra_data(self):
return {'_user': self.request.user} return {'_user': self.request.user}
@@ -71,15 +70,15 @@ class DocumentCommentDeleteView(SingleObjectDeleteView):
def get_post_action_redirect(self): def get_post_action_redirect(self):
return reverse( return reverse(
viewname='comments:comments_for_document', kwargs={ viewname='comments:comments_for_document', kwargs={
'document_pk': self.get_object().document.pk 'document_id': self.get_object().document.pk
} }
) )
class DocumentCommentListView(ExternalObjectViewMixin, SingleObjectListView): class DocumentCommentListView(ExternalObjectMixin, SingleObjectListView):
external_object_pk_url_kwarg = 'document_pk'
external_object_class = Document external_object_class = Document
external_object_permission = permission_comment_view external_object_permission = permission_comment_view
external_object_pk_url_kwarg = 'document_id'
def get_document(self): def get_document(self):
return self.get_external_object() return self.get_external_object()

View File

@@ -47,7 +47,6 @@ class MailDocumentView(MultipleObjectFormActionView):
form_class = DocumentMailForm form_class = DocumentMailForm
model = Document model = Document
object_permission = permission_mailing_send_document object_permission = permission_mailing_send_document
object_permission_raise_404 = True
pk_url_kwarg = 'document_pk' pk_url_kwarg = 'document_pk'
success_message = _('%(count)d document queued for email delivery') success_message = _('%(count)d document queued for email delivery')
success_message_plural = _( success_message_plural = _(
@@ -173,7 +172,6 @@ class UserMailingCreateView(SingleObjectDynamicFormCreateView):
class UserMailingDeleteView(SingleObjectDeleteView): class UserMailingDeleteView(SingleObjectDeleteView):
model = UserMailer model = UserMailer
object_permission = permission_user_mailer_delete object_permission = permission_user_mailer_delete
object_permission_raise_404 = True
pk_url_kwarg = 'mailer_pk' pk_url_kwarg = 'mailer_pk'
post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list') post_action_redirect = reverse_lazy(viewname='mailer:user_mailer_list')
@@ -187,7 +185,6 @@ class UserMailingEditView(SingleObjectDynamicFormEditView):
form_class = UserMailerDynamicForm form_class = UserMailerDynamicForm
model = UserMailer model = UserMailer
object_permission = permission_user_mailer_edit object_permission = permission_user_mailer_edit
object_permission_raise_404 = True
pk_url_kwarg = 'mailer_pk' pk_url_kwarg = 'mailer_pk'
def get_extra_context(self): def get_extra_context(self):