Isse #56, Remove document versions major, minor and micro versioning fields
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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']
|
||||
@@ -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()
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user