Migrate to use a local model for document comments. Closes gh-issue #233.

This commit is contained in:
Roberto Rosario
2015-07-29 19:43:11 -04:00
parent 97f3451caf
commit 26259b63f6
9 changed files with 192 additions and 30 deletions

View 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)

View File

@@ -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 acls import ModelPermission
from common import MayanAppConfig, menu_facet, menu_object, menu_sidebar
from common.classes import ModelAttribute
from common.utils import encapsulate
from documents.models import Document
from navigation import SourceColumn
@@ -14,6 +11,7 @@ from navigation import SourceColumn
from .links import (
link_comment_add, link_comment_delete, link_comments_for_document
)
from .models import Comment
from .permissions import (
permission_comment_create, permission_comment_delete,
permission_comment_view
@@ -29,15 +27,6 @@ class DocumentCommentsApp(MayanAppConfig):
def ready(self):
super(DocumentCommentsApp, self).ready()
Document.add_to_class(
'comments',
generic.GenericRelation(
Comment,
content_type_field='content_type',
object_id_field='object_pk'
)
)
ModelPermission.register(
model=Document, permissions=(
permission_comment_create, permission_comment_delete,
@@ -61,7 +50,9 @@ class DocumentCommentsApp(MayanAppConfig):
'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(
links=(link_comments_for_document,), sources=(Document,)
)

View File

@@ -1,7 +1,8 @@
from __future__ import unicode_literals
from django import forms
from django.contrib.comments.models import Comment
from .models import Comment
class CommentForm(forms.ModelForm):

View 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,),
),
]

View File

@@ -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,
),
]

View File

@@ -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),
]

View 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')

View File

@@ -2,9 +2,6 @@ from __future__ import absolute_import, unicode_literals
from django.conf import settings
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.urlresolvers import reverse
from django.http import HttpResponseRedirect
@@ -17,6 +14,7 @@ from documents.models import Document
from permissions import Permission
from .forms import CommentForm
from .models import Comment
from .permissions import (
permission_comment_create, permission_comment_delete,
permission_comment_view
@@ -36,19 +34,27 @@ def comment_delete(request, comment_id=None, comment_id_list=None):
]
try:
Permission.check_permissions(request.user, [permission_comment_delete])
Permission.check_permissions(request.user, (
permission_comment_delete,))
except PermissionDenied:
comments = AccessControlList.objects.filter_by_access(
permission_comment_delete, request.user, comments,
related='content_object'
)
if not comments:
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))))
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.POST.get(
'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':
for comment in comments:
@@ -74,7 +80,7 @@ def comment_delete(request, comment_id=None, comment_id_list=None):
'next': next,
}
if len(comments) == 1:
context['object'] = comments[0].content_object
context['object'] = comments[0].document
context['title'] = _('Delete comment?')
elif len(comments) > 1:
context['title'] = _('Delete comments?')
@@ -93,7 +99,9 @@ def comment_add(request, document_id):
document = get_object_or_404(Document, pk=document_id)
try:
Permission.check_permissions(request.user, [permission_comment_create])
Permission.check_permissions(
request.user, (permission_comment_create,)
)
except PermissionDenied:
AccessControlList.objects.check_access(
permission_comment_create, request.user, document
@@ -108,9 +116,7 @@ def comment_add(request, document_id):
if form.is_valid():
comment = form.save(commit=False)
comment.user = request.user
comment.content_type = ContentType.objects.get_for_model(document)
comment.object_pk = document.pk
comment.site = Site.objects.get_current()
comment.document = document
comment.save()
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)
try:
Permission.check_permissions(request.user, [permission_comment_view])
Permission.check_permissions(request.user, (permission_comment_view,))
except PermissionDenied:
AccessControlList.objects.check_access(
permission_comment_view, request.user, document
@@ -143,7 +149,7 @@ def comments_for_document(request, document_id):
'object': document,
'access_object': 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_object': True,
}, context_instance=RequestContext(request))