Migrate to use a local model for document comments. Closes gh-issue #233.
This commit is contained in:
14
mayan/apps/document_comments/admin.py
Normal file
14
mayan/apps/document_comments/admin.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from .models import Comment
|
||||||
|
|
||||||
|
|
||||||
|
class CommentAdmin(admin.ModelAdmin):
|
||||||
|
date_hierarchy = 'submit_date'
|
||||||
|
list_display = ('document', 'submit_date', 'user', 'comment')
|
||||||
|
readonly_fields = ('document', 'submit_date', 'user', 'comment')
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(Comment, CommentAdmin)
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
from __future__ import absolute_import, unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.contrib.comments.models import Comment
|
|
||||||
from django.contrib.contenttypes import generic
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from acls import ModelPermission
|
from acls import ModelPermission
|
||||||
from common import MayanAppConfig, menu_facet, menu_object, menu_sidebar
|
from common import MayanAppConfig, menu_facet, menu_object, menu_sidebar
|
||||||
from common.classes import ModelAttribute
|
|
||||||
from common.utils import encapsulate
|
from common.utils import encapsulate
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from navigation import SourceColumn
|
from navigation import SourceColumn
|
||||||
@@ -14,6 +11,7 @@ from navigation import SourceColumn
|
|||||||
from .links import (
|
from .links import (
|
||||||
link_comment_add, link_comment_delete, link_comments_for_document
|
link_comment_add, link_comment_delete, link_comments_for_document
|
||||||
)
|
)
|
||||||
|
from .models import Comment
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_comment_create, permission_comment_delete,
|
permission_comment_create, permission_comment_delete,
|
||||||
permission_comment_view
|
permission_comment_view
|
||||||
@@ -29,15 +27,6 @@ class DocumentCommentsApp(MayanAppConfig):
|
|||||||
def ready(self):
|
def ready(self):
|
||||||
super(DocumentCommentsApp, self).ready()
|
super(DocumentCommentsApp, self).ready()
|
||||||
|
|
||||||
Document.add_to_class(
|
|
||||||
'comments',
|
|
||||||
generic.GenericRelation(
|
|
||||||
Comment,
|
|
||||||
content_type_field='content_type',
|
|
||||||
object_id_field='object_pk'
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
ModelPermission.register(
|
ModelPermission.register(
|
||||||
model=Document, permissions=(
|
model=Document, permissions=(
|
||||||
permission_comment_create, permission_comment_delete,
|
permission_comment_create, permission_comment_delete,
|
||||||
@@ -61,7 +50,9 @@ class DocumentCommentsApp(MayanAppConfig):
|
|||||||
'comments:comment_delete', 'comments:comment_multiple_delete'
|
'comments:comment_delete', 'comments:comment_multiple_delete'
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
menu_object.bind_links(links=(link_comment_delete,), sources=(Comment,))
|
menu_object.bind_links(
|
||||||
|
links=(link_comment_delete,), sources=(Comment,)
|
||||||
|
)
|
||||||
menu_facet.bind_links(
|
menu_facet.bind_links(
|
||||||
links=(link_comments_for_document,), sources=(Document,)
|
links=(link_comments_for_document,), sources=(Document,)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib.comments.models import Comment
|
|
||||||
|
from .models import Comment
|
||||||
|
|
||||||
|
|
||||||
class CommentForm(forms.ModelForm):
|
class CommentForm(forms.ModelForm):
|
||||||
|
|||||||
52
mayan/apps/document_comments/migrations/0001_initial.py
Normal file
52
mayan/apps/document_comments/migrations/0001_initial.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('documents', '0026_auto_20150729_2140'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Comment',
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
'id', models.AutoField(
|
||||||
|
verbose_name='ID', serialize=False, auto_created=True,
|
||||||
|
primary_key=True
|
||||||
|
)
|
||||||
|
),
|
||||||
|
('comment', models.TextField(verbose_name='comment')),
|
||||||
|
(
|
||||||
|
'submit_date', models.DateTimeField(
|
||||||
|
verbose_name='Date time submitted', db_index=True
|
||||||
|
)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'document', models.ForeignKey(
|
||||||
|
related_name='comments', verbose_name='Document',
|
||||||
|
to='documents.Document'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'user', models.ForeignKey(
|
||||||
|
related_name='comments', editable=False,
|
||||||
|
to=settings.AUTH_USER_MODEL, verbose_name='User'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'ordering': ('-submit_date',),
|
||||||
|
'get_latest_by': 'submit_date',
|
||||||
|
'verbose_name': 'Comment',
|
||||||
|
'verbose_name_plural': 'Comments',
|
||||||
|
},
|
||||||
|
bases=(models.Model,),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('document_comments', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='comment',
|
||||||
|
name='submit_date',
|
||||||
|
field=models.DateTimeField(
|
||||||
|
auto_now_add=True, verbose_name='Date time submitted',
|
||||||
|
db_index=True
|
||||||
|
),
|
||||||
|
preserve_default=True,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_old_comments(apps, schema_editor):
|
||||||
|
# https://code.djangoproject.com/ticket/24282
|
||||||
|
# If someone has a better solution until Django 1.8, would appreciate
|
||||||
|
# a pull-request :)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from django.contrib.comments.models import Comment as OldComment
|
||||||
|
except ImportError:
|
||||||
|
# Django > 1.7
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
|
||||||
|
Comment = apps.get_model('document_comments', 'Comment')
|
||||||
|
Document = apps.get_model('documents', 'Document')
|
||||||
|
User = apps.get_model(*settings.AUTH_USER_MODEL.split('.'))
|
||||||
|
|
||||||
|
for old_comment in OldComment.objects.all():
|
||||||
|
comment = Comment(
|
||||||
|
document=Document.objects.get(pk=old_comment.object_pk),
|
||||||
|
user=User(old_comment.user.pk),
|
||||||
|
comment=old_comment.comment,
|
||||||
|
submit_date=old_comment.submit_date,
|
||||||
|
)
|
||||||
|
comment.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('document_comments', '0002_auto_20150729_2144'),
|
||||||
|
('documents', '0001_initial'),
|
||||||
|
('sites', '0001_initial'),
|
||||||
|
('contenttypes', '0001_initial'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL)
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(migrate_old_comments),
|
||||||
|
]
|
||||||
0
mayan/apps/document_comments/migrations/__init__.py
Normal file
0
mayan/apps/document_comments/migrations/__init__.py
Normal file
29
mayan/apps/document_comments/models.py
Normal file
29
mayan/apps/document_comments/models.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import models
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from documents.models import Document
|
||||||
|
|
||||||
|
|
||||||
|
class Comment(models.Model):
|
||||||
|
document = models.ForeignKey(
|
||||||
|
Document, db_index=True, related_name='comments',
|
||||||
|
verbose_name=_('Document')
|
||||||
|
)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
settings.AUTH_USER_MODEL, editable=False, related_name='comments',
|
||||||
|
verbose_name=_('User'),
|
||||||
|
)
|
||||||
|
comment = models.TextField(verbose_name=_('comment'))
|
||||||
|
submit_date = models.DateTimeField(
|
||||||
|
auto_now_add=True, db_index=True,
|
||||||
|
verbose_name=_('Date time submitted')
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
get_latest_by = 'submit_date'
|
||||||
|
ordering = ('-submit_date',)
|
||||||
|
verbose_name = _('Comment')
|
||||||
|
verbose_name_plural = _('Comments')
|
||||||
@@ -2,9 +2,6 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.comments.models import Comment
|
|
||||||
from django.contrib.contenttypes.models import ContentType
|
|
||||||
from django.contrib.sites.models import Site
|
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
@@ -17,6 +14,7 @@ from documents.models import Document
|
|||||||
from permissions import Permission
|
from permissions import Permission
|
||||||
|
|
||||||
from .forms import CommentForm
|
from .forms import CommentForm
|
||||||
|
from .models import Comment
|
||||||
from .permissions import (
|
from .permissions import (
|
||||||
permission_comment_create, permission_comment_delete,
|
permission_comment_create, permission_comment_delete,
|
||||||
permission_comment_view
|
permission_comment_view
|
||||||
@@ -36,19 +34,27 @@ def comment_delete(request, comment_id=None, comment_id_list=None):
|
|||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, [permission_comment_delete])
|
Permission.check_permissions(request.user, (
|
||||||
|
permission_comment_delete,))
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
comments = AccessControlList.objects.filter_by_access(
|
comments = AccessControlList.objects.filter_by_access(
|
||||||
permission_comment_delete, request.user, comments,
|
permission_comment_delete, request.user, comments,
|
||||||
related='content_object'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if not comments:
|
if not comments:
|
||||||
messages.error(request, _('Must provide at least one comment.'))
|
messages.error(request, _('Must provide at least one comment.'))
|
||||||
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
|
return HttpResponseRedirect(
|
||||||
|
request.META.get(
|
||||||
|
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
|
previous = request.POST.get(
|
||||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
|
'previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
|
||||||
|
)
|
||||||
|
next = request.POST.get(
|
||||||
|
'next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
|
||||||
|
)
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
for comment in comments:
|
for comment in comments:
|
||||||
@@ -74,7 +80,7 @@ def comment_delete(request, comment_id=None, comment_id_list=None):
|
|||||||
'next': next,
|
'next': next,
|
||||||
}
|
}
|
||||||
if len(comments) == 1:
|
if len(comments) == 1:
|
||||||
context['object'] = comments[0].content_object
|
context['object'] = comments[0].document
|
||||||
context['title'] = _('Delete comment?')
|
context['title'] = _('Delete comment?')
|
||||||
elif len(comments) > 1:
|
elif len(comments) > 1:
|
||||||
context['title'] = _('Delete comments?')
|
context['title'] = _('Delete comments?')
|
||||||
@@ -93,7 +99,9 @@ def comment_add(request, document_id):
|
|||||||
document = get_object_or_404(Document, pk=document_id)
|
document = get_object_or_404(Document, pk=document_id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, [permission_comment_create])
|
Permission.check_permissions(
|
||||||
|
request.user, (permission_comment_create,)
|
||||||
|
)
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
AccessControlList.objects.check_access(
|
AccessControlList.objects.check_access(
|
||||||
permission_comment_create, request.user, document
|
permission_comment_create, request.user, document
|
||||||
@@ -108,9 +116,7 @@ def comment_add(request, document_id):
|
|||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
comment = form.save(commit=False)
|
comment = form.save(commit=False)
|
||||||
comment.user = request.user
|
comment.user = request.user
|
||||||
comment.content_type = ContentType.objects.get_for_model(document)
|
comment.document = document
|
||||||
comment.object_pk = document.pk
|
|
||||||
comment.site = Site.objects.get_current()
|
|
||||||
comment.save()
|
comment.save()
|
||||||
|
|
||||||
messages.success(request, _('Comment added successfully.'))
|
messages.success(request, _('Comment added successfully.'))
|
||||||
@@ -133,7 +139,7 @@ def comments_for_document(request, document_id):
|
|||||||
document = get_object_or_404(Document, pk=document_id)
|
document = get_object_or_404(Document, pk=document_id)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
Permission.check_permissions(request.user, [permission_comment_view])
|
Permission.check_permissions(request.user, (permission_comment_view,))
|
||||||
except PermissionDenied:
|
except PermissionDenied:
|
||||||
AccessControlList.objects.check_access(
|
AccessControlList.objects.check_access(
|
||||||
permission_comment_view, request.user, document
|
permission_comment_view, request.user, document
|
||||||
@@ -143,7 +149,7 @@ def comments_for_document(request, document_id):
|
|||||||
'object': document,
|
'object': document,
|
||||||
'access_object': document,
|
'access_object': document,
|
||||||
'title': _('Comments for document: %s') % document,
|
'title': _('Comments for document: %s') % document,
|
||||||
'object_list': Comment.objects.for_model(document).order_by('-submit_date'),
|
'object_list': document.comments.all(),
|
||||||
'hide_link': True,
|
'hide_link': True,
|
||||||
'hide_object': True,
|
'hide_object': True,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|||||||
Reference in New Issue
Block a user