From af51acebf5633a97a0b9e199faf8a3d836f3d614 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 9 Dec 2014 03:15:23 -0400 Subject: [PATCH] Isse #56, Remove document versions major, minor and micro versioning fields --- mayan/apps/documents/api_views.py | 24 +-- mayan/apps/documents/literals.py | 4 - mayan/apps/documents/models.py | 57 +------ ..._major__del_field_documentversion_micro.py | 140 ++++++++++++++++++ mayan/apps/documents/tasks.py | 4 +- mayan/apps/documents/views.py | 4 - mayan/apps/sources/forms.py | 4 - mayan/apps/sources/views.py | 4 +- 8 files changed, 148 insertions(+), 93 deletions(-) create mode 100644 mayan/apps/documents/south_migrations/0029_auto__del_field_documentversion_major__del_field_documentversion_micro.py diff --git a/mayan/apps/documents/api_views.py b/mayan/apps/documents/api_views.py index e047411d39..51b2cb5033 100644 --- a/mayan/apps/documents/api_views.py +++ b/mayan/apps/documents/api_views.py @@ -139,33 +139,15 @@ class APIDocumentVersionCreateView(generics.CreateAPIView): serializer = self.get_serializer(data=request.DATA, files=request.FILES) if serializer.is_valid(): - self.pre_save(serializer.object) # Nested resource we take the document pk from the URL and insert it # so that it needs not to be specified by the user, we mark it as # a read only field in the serializer - serializer.object.document = get_object_or_404(Document, pk=kwargs['pk']) + document = get_object_or_404(Document, pk=kwargs['pk']) - try: - # Check the uniqueness of this version for this document instead - # of letting Django explode with an IntegrityError - DocumentVersion.objects.get( - document=serializer.object.document, - major=serializer.object.major, - minor=serializer.object.minor, - micro=serializer.object.micro, - ) - except DocumentVersion.DoesNotExist: - self.object = serializer.save(force_insert=True) - else: - return Response( - {'non_field_errors': 'A version with the same major, minor and micro values already exist for this document.'}, - status=status.HTTP_400_BAD_REQUEST - ) + document.new_version(file_object=serializer.object.file, user=request.user, comment=serializer.object.comment) - self.post_save(self.object, created=True) headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_201_CREATED, - headers=headers) + return Response(status=status.HTTP_202_ACCEPTED, headers=headers) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/mayan/apps/documents/literals.py b/mayan/apps/documents/literals.py index 396b4cd877..1bec3f53bd 100644 --- a/mayan/apps/documents/literals.py +++ b/mayan/apps/documents/literals.py @@ -5,10 +5,6 @@ PICTURE_ERROR_MEDIUM = u'1297211435_error.png' PICTURE_UNKNOWN_SMALL = u'1299549572_unknown2.png' PICTURE_UNKNOWN_MEDIUM = u'1299549805_unknown.png' -VERSION_UPDATE_MAJOR = u'major' -VERSION_UPDATE_MINOR = u'minor' -VERSION_UPDATE_MICRO = u'micro' - DEFAULT_ZIP_FILENAME = u'document_bundle.zip' LANGUAGE_CHOICES = [(i.bibliographic, i.name) for i in list(pycountry.languages)] diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index 4354634846..ca77403bd4 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -31,8 +31,7 @@ from mimetype.api import get_mimetype from .events import HISTORY_DOCUMENT_CREATED from .exceptions import NewDocumentVersionNotAllowed -from .literals import (LANGUAGE_CHOICES, VERSION_UPDATE_MAJOR, - VERSION_UPDATE_MICRO, VERSION_UPDATE_MINOR) +from .literals import LANGUAGE_CHOICES from .managers import (DocumentManager, DocumentPageTransformationManager, DocumentTypeManager, RecentDocumentManager) from .runtime import storage_backend @@ -188,27 +187,15 @@ class Document(models.Model): def size(self): return self.latest_version.size - def new_version(self, file_object, user=None, comment=None, version_update=None): + def new_version(self, file_object, user=None, comment=None): logger.debug('creating new document version') # TODO: move this restriction to a signal processor of the checkouts app if not self.is_new_versions_allowed(user=user): raise NewDocumentVersionNotAllowed - if version_update: - # TODO: remove get_new_version_dict and just past the major, minor - # and micro values - new_version_dict = self.latest_version.get_new_version_dict(version_update) - else: - new_version_dict = {} - - logger.debug('new_version_dict: %s', new_version_dict) - new_version = DocumentVersion( document=self, file=file_object, - major=new_version_dict.get('major') or 1, - minor=new_version_dict.get('minor') or 0, - micro=new_version_dict.get('micro') or 0, comment=comment or '', ) new_version.save() @@ -291,14 +278,6 @@ class DocumentVersion(models.Model): _pre_open_hooks = {} _post_save_hooks = {} - @staticmethod - def get_version_update_choices(document_version): - return ( - (VERSION_UPDATE_MAJOR, _(u'Major %(major)i.%(minor)i.%(micro)i, (new release)') % document_version.get_new_version_dict(VERSION_UPDATE_MAJOR)), - (VERSION_UPDATE_MINOR, _(u'Minor %(major)i.%(minor)i.%(micro)i, (some updates)') % document_version.get_new_version_dict(VERSION_UPDATE_MINOR)), - (VERSION_UPDATE_MICRO, _(u'Micro %(major)i.%(minor)i.%(micro)i, (fixes)') % document_version.get_new_version_dict(VERSION_UPDATE_MICRO)) - ) - @classmethod def register_pre_open_hook(cls, order, func): cls._pre_open_hooks[order] = func @@ -308,9 +287,6 @@ class DocumentVersion(models.Model): cls._post_save_hooks[order] = func document = models.ForeignKey(Document, verbose_name=_(u'Document'), related_name='versions') - major = models.PositiveIntegerField(verbose_name=_(u'Mayor'), default=1) - minor = models.PositiveIntegerField(verbose_name=_(u'Minor'), default=0) - micro = models.PositiveIntegerField(verbose_name=_(u'Micro'), default=0) timestamp = models.DateTimeField(verbose_name=_(u'Timestamp'), auto_now_add=True) comment = models.TextField(blank=True, verbose_name=_(u'Comment')) @@ -322,41 +298,12 @@ class DocumentVersion(models.Model): checksum = models.TextField(blank=True, null=True, verbose_name=_(u'Checksum'), editable=False) class Meta: - unique_together = ('document', 'major', 'minor', 'micro') verbose_name = _(u'Document version') verbose_name_plural = _(u'Document version') def __unicode__(self): return self.get_formated_version() - def get_new_version_dict(self, version_update_type): - logger.debug('version_update_type: %s', version_update_type) - - if version_update_type == VERSION_UPDATE_MAJOR: - return { - 'major': self.major + 1, - 'minor': 0, - 'micro': 0, - } - elif version_update_type == VERSION_UPDATE_MINOR: - return { - 'major': self.major, - 'minor': self.minor + 1, - 'micro': 0, - } - elif version_update_type == VERSION_UPDATE_MICRO: - return { - 'major': self.major, - 'minor': self.minor, - 'micro': self.micro + 1, - } - - def get_formated_version(self): - """ - Return the formatted version information - """ - return u'%i.%i.%i' % (self.major, self.minor, self.micro) - def save(self, *args, **kwargs): """ Overloaded save method that updates the document version's checksum, diff --git a/mayan/apps/documents/south_migrations/0029_auto__del_field_documentversion_major__del_field_documentversion_micro.py b/mayan/apps/documents/south_migrations/0029_auto__del_field_documentversion_major__del_field_documentversion_micro.py new file mode 100644 index 0000000000..86df6c8a09 --- /dev/null +++ b/mayan/apps/documents/south_migrations/0029_auto__del_field_documentversion_major__del_field_documentversion_micro.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing unique constraint on 'DocumentVersion', fields ['document', 'major', 'minor', 'micro'] + db.delete_unique(u'documents_documentversion', ['document_id', 'major', 'minor', 'micro']) + + # Deleting field 'DocumentVersion.major' + db.delete_column(u'documents_documentversion', 'major') + + # Deleting field 'DocumentVersion.micro' + db.delete_column(u'documents_documentversion', 'micro') + + # Deleting field 'DocumentVersion.minor' + db.delete_column(u'documents_documentversion', 'minor') + + + def backwards(self, orm): + # Adding field 'DocumentVersion.major' + db.add_column(u'documents_documentversion', 'major', + self.gf('django.db.models.fields.PositiveIntegerField')(default=1), + keep_default=False) + + # Adding field 'DocumentVersion.micro' + db.add_column(u'documents_documentversion', 'micro', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + # Adding field 'DocumentVersion.minor' + db.add_column(u'documents_documentversion', 'minor', + self.gf('django.db.models.fields.PositiveIntegerField')(default=0), + keep_default=False) + + # Adding unique constraint on 'DocumentVersion', fields ['document', 'major', 'minor', 'micro'] + db.create_unique(u'documents_documentversion', ['document_id', 'major', 'minor', 'micro']) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'documents.document': { + 'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'}, + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'document_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'documents'", 'to': u"orm['documents.DocumentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'default': "u'Uninitialized document'", 'max_length': '255', 'db_index': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'default': "u'eng'", 'max_length': '8'}), + 'uuid': ('django.db.models.fields.CharField', [], {'default': "u'840ee754-cd01-4a28-b17c-e432e32356bb'", 'max_length': '48'}) + }, + u'documents.documentpage': { + 'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'}, + 'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'document_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pages'", 'to': u"orm['documents.DocumentVersion']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'page_label': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'}) + }, + u'documents.documentpagetransformation': { + 'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'}, + 'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['documents.DocumentPage']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + u'documents.documenttype': { + 'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}), + 'ocr': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + u'documents.documenttypefilename': { + 'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'}, + 'document_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'filenames'", 'to': u"orm['documents.DocumentType']"}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'documents.documentversion': { + 'Meta': {'object_name': 'DocumentVersion'}, + 'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'document': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'versions'", 'to': u"orm['documents.Document']"}), + 'encoding': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mimetype': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'documents.recentdocument': { + 'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'}, + 'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}), + 'document': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['documents.Document']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) + } + } + + complete_apps = ['documents'] \ No newline at end of file diff --git a/mayan/apps/documents/tasks.py b/mayan/apps/documents/tasks.py index 586a773832..4ea60645a9 100644 --- a/mayan/apps/documents/tasks.py +++ b/mayan/apps/documents/tasks.py @@ -61,7 +61,7 @@ def task_new_document(document_type_id, shared_uploaded_file_id, label, descript @app.task(ignore_result=True) -def task_upload_new_version(document_id, shared_uploaded_file_id, user_id, comment=None, version_update=None): +def task_upload_new_version(document_id, shared_uploaded_file_id, user_id, comment=None): shared_file = SharedUploadedFile.objects.get(pk=shared_uploaded_file_id) document = Document.objects.get(pk=document_id) @@ -71,6 +71,6 @@ def task_upload_new_version(document_id, shared_uploaded_file_id, user_id, comme user = None with File(file=shared_file.file) as file_object: - document.new_version(comment=comment, file_object=file_object, user=user, version_update=version_update) + document.new_version(comment=comment, file_object=file_object, user=user) shared_file.delete() diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 05f5e9cffa..e3eb986ea8 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -1109,10 +1109,6 @@ def document_version_list(request, document_pk): 'object': document, 'access_object': document, 'extra_columns': [ - { - 'name': _(u'Version'), - 'attribute': 'get_formated_version', - }, { 'name': _(u'Time and date'), 'attribute': 'timestamp', diff --git a/mayan/apps/sources/forms.py b/mayan/apps/sources/forms.py index cf0ee1a16a..666a9b589f 100644 --- a/mayan/apps/sources/forms.py +++ b/mayan/apps/sources/forms.py @@ -24,10 +24,6 @@ class NewVersionForm(forms.Form): def __init__(self, *args, **kwargs): document = kwargs.pop('document') super(NewVersionForm, self).__init__(*args, **kwargs) - self.fields['version_update'] = forms.ChoiceField( - label=_(u'Version update'), - choices=DocumentVersion.get_version_update_choices(document.latest_version) - ) self.fields['comment'] = forms.CharField( label=_(u'Comment'), diff --git a/mayan/apps/sources/views.py b/mayan/apps/sources/views.py index c83fc65ebe..427e5e1c23 100644 --- a/mayan/apps/sources/views.py +++ b/mayan/apps/sources/views.py @@ -167,7 +167,7 @@ class UploadInteractiveView(UploadBaseView): Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_CREATE]) - self.document_type = get_object_or_404(DocumentType, pk=self.request.GET['document_type_id']) + self.document_type = get_object_or_404(DocumentType, pk=self.request.GET.get('document_type_id', self.request.POST.get('document_type_id'))) self.tab_links = get_active_tab_links() @@ -212,7 +212,6 @@ class UploadInteractiveView(UploadBaseView): source_id=self.source.pk, user_id=user_id, ), queue='uploads') - messages.success(self.request, _(u'New document queued for uploaded and will be available shortly.')) return HttpResponseRedirect(self.request.get_full_path()) @@ -299,7 +298,6 @@ class UploadInteractiveVersionView(UploadBaseView): shared_uploaded_file_id=shared_uploaded_file.pk, document_id=self.document.pk, user_id=user_id, - version_update=forms['document_form'].cleaned_data.get('version_update'), comment=forms['document_form'].cleaned_data.get('comment') ), queue='uploads')