Isse #56, Remove document versions major, minor and micro versioning fields

This commit is contained in:
Roberto Rosario
2014-12-09 03:15:23 -04:00
parent 53c34eedcd
commit af51acebf5
8 changed files with 148 additions and 93 deletions

View File

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

View File

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

View File

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

View File

@@ -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']

View File

@@ -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()

View File

@@ -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',

View File

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

View File

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