Change the user_object of the DocumentCheckout model to be just a FK to the User model

This commit is contained in:
Roberto Rosario
2015-06-16 23:35:23 -04:00
parent 0e52609c7c
commit 91150a7f51
9 changed files with 90 additions and 15 deletions

View File

@@ -62,7 +62,7 @@ class APICheckedoutDocumentListView(generics.ListCreateAPIView):
DocumentCheckout.objects.create(
document=document,
expiration_datetime=timezone.localize(serializer.data['expiration_datetime']),
user_object=request.user,
user=request.user,
block_new_version=serializer.data['block_new_version']
)
except Exception as exception:
@@ -105,7 +105,7 @@ class APICheckedoutDocumentView(generics.RetrieveDestroyAPIView):
document = self.get_object().document
if document.checkout_info().user_object == request.user:
if document.checkout_info().user == request.user:
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKIN])
except PermissionDenied:

View File

@@ -11,4 +11,4 @@ class DocumentCheckoutForm(forms.ModelForm):
class Meta:
model = DocumentCheckout
exclude = ('document', 'checkout_datetime', 'user_content_type', 'user_object_id')
exclude = ('document', 'checkout_datetime', 'user')

View File

@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
class DocumentCheckoutManager(models.Manager):
def checkout_document(self, document, expiration_datetime, user, block_new_version=True):
self.create(document=document, expiration_datetime=expiration_datetime, user_object=user, block_new_version=block_new_version)
self.create(document=document, expiration_datetime=expiration_datetime, user=user, block_new_version=block_new_version)
def checked_out_documents(self):
return Document.objects.filter(pk__in=self.model.objects.all().values_list('document__pk', flat=True))
@@ -49,7 +49,7 @@ class DocumentCheckoutManager(models.Manager):
raise DocumentNotCheckedOut
else:
if user:
if self.document_checkout_info(document).user_object != user:
if self.document_checkout_info(document).user != user:
event_document_forceful_check_in.commit(actor=user, target=document)
else:
event_document_check_in.commit(actor=user, target=document)

View File

@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('checkouts', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='documentcheckout',
name='user',
field=models.ForeignKey(verbose_name='User', blank=True, to=settings.AUTH_USER_MODEL, null=True),
preserve_default=True,
),
]

View File

@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def move_from_content_type_user_to_foreign_key_field_user(apps, schema_editor):
# The model references the use who checked out the document using a
# generic.GenericForeignKey. This migrations changes that to a simpler
# ForeignKey to the User model
DocumentCheckout = apps.get_model('checkouts', 'DocumentCheckout')
for document_checkout in DocumentCheckout.objects.all():
document_checkout.user = document_checkout.user_object
document_checkout.save()
class Migration(migrations.Migration):
dependencies = [
('checkouts', '0002_documentcheckout_user'),
]
operations = [
migrations.RunPython(move_from_content_type_user_to_foreign_key_field_user),
]

View File

@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
('checkouts', '0003_auto_20150617_0325'),
]
operations = [
migrations.RemoveField(
model_name='documentcheckout',
name='user_content_type',
),
migrations.RemoveField(
model_name='documentcheckout',
name='user_object_id',
),
migrations.AlterField(
model_name='documentcheckout',
name='user',
field=models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL),
preserve_default=True,
),
]

View File

@@ -2,6 +2,7 @@ from __future__ import unicode_literals
import logging
from django.conf import settings
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
@@ -27,10 +28,7 @@ class DocumentCheckout(models.Model):
checkout_datetime = models.DateTimeField(verbose_name=_('Check out date and time'), auto_now_add=True)
expiration_datetime = models.DateTimeField(verbose_name=_('Check out expiration date and time'), help_text=_('Amount of time to hold the document checked out in minutes.'))
# TODO: simplify user_object to an instance of User
user_content_type = models.ForeignKey(ContentType, null=True, blank=True) # blank and null added for ease of db migration
user_object_id = models.PositiveIntegerField(null=True, blank=True)
user_object = generic.GenericForeignKey(ct_field='user_content_type', fk_field='user_object_id')
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('User'))
block_new_version = models.BooleanField(default=True, verbose_name=_('Block new version upload'), help_text=_('Do not allow new version of this document to be uploaded.'))
@@ -50,7 +48,7 @@ class DocumentCheckout(models.Model):
result = super(DocumentCheckout, self).save(*args, **kwargs)
if new_checkout:
event_document_check_out.commit(actor=self.user_object, target=self.document)
event_document_check_out.commit(actor=self.user, target=self.document)
return result
def get_absolute_url(self):

View File

@@ -15,7 +15,6 @@ class DocumentCheckoutSerializer(serializers.ModelSerializer):
class Meta:
model = DocumentCheckout
read_only_fields = ('user_content_type', 'user_object_id')
class NewDocumentCheckoutSerializer(serializers.Serializer):

View File

@@ -33,7 +33,7 @@ class CheckoutListView(DocumentListView):
'title': _('Documents checked out'),
'hide_links': True,
'extra_columns': [
{'name': _('Checkout user'), 'attribute': encapsulate(lambda document: get_object_name(document.checkout_info().user_object))},
{'name': _('Checkout user'), 'attribute': encapsulate(lambda document: get_object_name(document.checkout_info().user))},
{'name': _('Checkout time and date'), 'attribute': encapsulate(lambda document: document.checkout_info().checkout_datetime)},
{'name': _('Checkout expiration'), 'attribute': encapsulate(lambda document: document.checkout_info().expiration_datetime)},
],
@@ -51,7 +51,7 @@ def checkout_info(request, document_pk):
if document.is_checked_out():
checkout_info = document.checkout_info()
paragraphs.append(_('User: %s') % get_object_name(checkout_info.user_object))
paragraphs.append(_('User: %s') % get_object_name(checkout_info.user))
paragraphs.append(_('Check out time: %s') % checkout_info.checkout_datetime)
paragraphs.append(_('Check out expiration: %s') % checkout_info.expiration_datetime)
paragraphs.append(_('New versions allowed: %s') % (_('Yes') if not checkout_info.block_new_version else _('No')))
@@ -112,7 +112,7 @@ def checkin_document(request, document_pk):
# If the user trying to check in the document is the same as the check out
# user just check for the normal permission otherwise check for the forceful
# checkin permission
if document.checkout_info().user_object == request.user:
if document.checkout_info().user == request.user:
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CHECKIN])
except PermissionDenied:
@@ -141,7 +141,7 @@ def checkin_document(request, document_pk):
'object': document,
}
if document.checkout_info().user_object != request.user:
if document.checkout_info().user != request.user:
context['title'] = _('You didn\'t originally checked out this document. Are you sure you wish to forcefully check in document: %s?') % document
else:
context['title'] = _('Are you sure you wish to check in document: %s?') % document