diff --git a/mayan/apps/checkouts/api_views.py b/mayan/apps/checkouts/api_views.py index 712a8575b7..a2911acd87 100644 --- a/mayan/apps/checkouts/api_views.py +++ b/mayan/apps/checkouts/api_views.py @@ -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: diff --git a/mayan/apps/checkouts/forms.py b/mayan/apps/checkouts/forms.py index b0ce0f2b0c..cda92dbee5 100644 --- a/mayan/apps/checkouts/forms.py +++ b/mayan/apps/checkouts/forms.py @@ -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') diff --git a/mayan/apps/checkouts/managers.py b/mayan/apps/checkouts/managers.py index 53aa008755..422efb0862 100644 --- a/mayan/apps/checkouts/managers.py +++ b/mayan/apps/checkouts/managers.py @@ -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) diff --git a/mayan/apps/checkouts/migrations/0002_documentcheckout_user.py b/mayan/apps/checkouts/migrations/0002_documentcheckout_user.py new file mode 100644 index 0000000000..abd1db2b9b --- /dev/null +++ b/mayan/apps/checkouts/migrations/0002_documentcheckout_user.py @@ -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, + ), + ] diff --git a/mayan/apps/checkouts/migrations/0003_auto_20150617_0325.py b/mayan/apps/checkouts/migrations/0003_auto_20150617_0325.py new file mode 100644 index 0000000000..67b7945e0d --- /dev/null +++ b/mayan/apps/checkouts/migrations/0003_auto_20150617_0325.py @@ -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), + ] diff --git a/mayan/apps/checkouts/migrations/0004_auto_20150617_0330.py b/mayan/apps/checkouts/migrations/0004_auto_20150617_0330.py new file mode 100644 index 0000000000..f2a15bc655 --- /dev/null +++ b/mayan/apps/checkouts/migrations/0004_auto_20150617_0330.py @@ -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, + ), + ] diff --git a/mayan/apps/checkouts/models.py b/mayan/apps/checkouts/models.py index 83d5f4c48a..3f09fba26d 100644 --- a/mayan/apps/checkouts/models.py +++ b/mayan/apps/checkouts/models.py @@ -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): diff --git a/mayan/apps/checkouts/serializers.py b/mayan/apps/checkouts/serializers.py index 2c28430bf6..72f7947cca 100644 --- a/mayan/apps/checkouts/serializers.py +++ b/mayan/apps/checkouts/serializers.py @@ -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): diff --git a/mayan/apps/checkouts/views.py b/mayan/apps/checkouts/views.py index cdb3766d6f..0ed610327c 100644 --- a/mayan/apps/checkouts/views.py +++ b/mayan/apps/checkouts/views.py @@ -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