diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index f47ab4bab9..1a39e01ac8 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -13,8 +13,9 @@ from history.api import register_history_type from metadata.api import get_metadata_string from project_setup.api import register_setup -from documents.models import Document, DocumentPage, \ - DocumentPageTransformation, DocumentType, DocumentTypeFilename +from documents.models import (Document, DocumentPage, + DocumentPageTransformation, DocumentType, DocumentTypeFilename, + DocumentVersion) from documents.literals import PERMISSION_DOCUMENT_CREATE, \ PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW, \ PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \ @@ -78,6 +79,7 @@ document_multiple_delete = {'text': _(u'delete'), 'view': 'document_multiple_del document_edit = {'text': _(u'edit'), 'view': 'document_edit', 'args': 'object.id', 'famfam': 'page_edit', 'permissions': [PERMISSION_DOCUMENT_PROPERTIES_EDIT]} document_preview = {'text': _(u'preview'), 'class': 'fancybox', 'view': 'document_preview', 'args': 'object.id', 'famfam': 'magnifier', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_download = {'text': _(u'download'), 'view': 'document_download', 'args': 'object.id', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]} +document_version_download = {'text': _(u'download'), 'view': 'document_version_download', 'args': 'object.pk', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]} document_find_duplicates = {'text': _(u'find duplicates'), 'view': 'document_find_duplicates', 'args': 'object.id', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_find_all_duplicates = {'text': _(u'find all duplicates'), 'view': 'document_find_all_duplicates', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'description': _(u'Search all the documents\' checksums and return a list of the exact matches.')} document_update_page_count = {'text': _(u'update office documents\' page count'), 'view': 'document_update_page_count', 'famfam': 'page_white_csharp', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Update the page count of the office type documents. This is useful when enabling office document support after there were already office type documents in the database.')} @@ -85,8 +87,12 @@ document_clear_transformations = {'text': _(u'clear transformations'), 'view': ' document_multiple_clear_transformations = {'text': _(u'clear transformations'), 'view': 'document_multiple_clear_transformations', 'famfam': 'page_paintbrush', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]} document_print = {'text': _(u'print'), 'view': 'document_print', 'args': 'object.id', 'famfam': 'printer', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_history_view = {'text': _(u'history'), 'view': 'history_for_object', 'args': ['"documents"', '"document"', 'object.id'], 'famfam': 'book_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]} + +# Tools document_clear_image_cache = {'text': _(u'Clear the document image cache'), 'view': 'document_clear_image_cache', 'famfam': 'camera_delete', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Clear the graphics representations used to speed up the documents\' display and interactive transformations results.')} +# Document pages document_page_transformation_list = {'text': _(u'page transformations'), 'class': 'no-parent-history', 'view': 'document_page_transformation_list', 'args': 'page.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]} document_page_transformation_create = {'text': _(u'create new transformation'), 'class': 'no-parent-history', 'view': 'document_page_transformation_create', 'args': 'page.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]} document_page_transformation_edit = {'text': _(u'edit'), 'class': 'no-parent-history', 'view': 'document_page_transformation_edit', 'args': 'transformation.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]} @@ -105,7 +111,8 @@ document_page_rotate_right = {'text': _(u'rotate right'), 'class': 'no-parent-hi document_page_rotate_left = {'text': _(u'rotate left'), 'class': 'no-parent-history', 'view': 'document_page_rotate_left', 'args': 'page.pk', 'famfam': 'arrow_turn_left', 'permissions': [PERMISSION_DOCUMENT_VIEW]} document_page_view_reset = {'text': _(u'reset view'), 'class': 'no-parent-history', 'view': 'document_page_view_reset', 'args': 'page.pk', 'famfam': 'page_white', 'permissions': [PERMISSION_DOCUMENT_VIEW]} -document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]} +# Document versions +document_version_list = {'text': _(u'versions'), 'view': 'document_version_list', 'args': 'object.pk', 'famfam': 'page_world', 'permissions': [PERMISSION_DOCUMENT_VIEW]} # Document type related links document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]} @@ -133,6 +140,9 @@ register_links(['document_type_filename_create', 'document_type_filename_list', register_links(Document, [document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_create_siblings]) register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete]) +# Document Version links +register_links(DocumentVersion, [document_version_download]) + secondary_menu_links = [document_list_recent, document_list, document_create_multiple] register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], secondary_menu_links, menu_name='secondary_menu') @@ -198,6 +208,7 @@ register_sidebar_template(['document_type_list'], 'document_types_help.html') register_links(Document, [document_view_simple], menu_name='form_header', position=0) register_links(Document, [document_view_advanced], menu_name='form_header', position=1) register_links(Document, [document_history_view], menu_name='form_header') +register_links(Document, [document_version_list], menu_name='form_header') if (validate_path(document_settings.CACHE_PATH) == False) or (not document_settings.CACHE_PATH): setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp()) diff --git a/apps/documents/admin.py b/apps/documents/admin.py index 8ef02b1cea..8fc0e838bb 100644 --- a/apps/documents/admin.py +++ b/apps/documents/admin.py @@ -20,9 +20,9 @@ class DocumentVersionInline(admin.StackedInline): extra = 1 classes = ('collapse-open',) allow_add = True - inlines = [ - DocumentPageInline, - ] + #inlines = [ + # DocumentPageInline, + #] class DocumentTypeFilenameInline(admin.StackedInline): diff --git a/apps/documents/models.py b/apps/documents/models.py index 6d68e03ae6..ab1165bf5f 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -361,6 +361,10 @@ class Document(models.Model): def get_latest_version(self): return self.documentversion_set.order_by('-timestamp')[0] + @property + def versions(self): + return self.documentversion_set + RELEASE_LEVEL_FINAL = 1 RELEASE_LEVEL_ALPHA = 2 @@ -381,12 +385,13 @@ class DocumentVersion(models.Model): Model that describes a document version and it properties ''' document = models.ForeignKey(Document, verbose_name=_(u'document')) - mayor = models.PositiveIntegerField(verbose_name=_(u'mayor'), default=1) + 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) release_level = models.PositiveIntegerField(choices=RELEASE_LEVEL_CHOICES, default=RELEASE_LEVEL_FINAL, verbose_name=_(u'release level')) serial = models.PositiveIntegerField(verbose_name=_(u'serial'), default=0) timestamp = models.DateTimeField(verbose_name=_(u'timestamp')) + comment = models.TextField(blank=True, verbose_name=_(u'comment')) # File related fields file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND(), verbose_name=_(u'file')) @@ -396,7 +401,7 @@ class DocumentVersion(models.Model): checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False) class Meta: - unique_together = ('document', 'mayor', 'minor', 'micro', 'release_level', 'serial') + unique_together = ('document', 'major', 'minor', 'micro', 'release_level', 'serial') verbose_name = _(u'document version') verbose_name_plural = _(u'document version') @@ -405,16 +410,16 @@ class DocumentVersion(models.Model): # TODO: Update timestamp - def get_version(): + def get_version(self): ''' Return the formatted version information ''' - vers = [u'%(major)i.%(minor)i' % self, ] + vers = [u'%i.%i' % (self.major, self.minor), ] if self.micro: - vers.append(u'.%(micro)i' % self) - if self.releaselevel != RELEASE_LEVEL_FINAL: - vers.append(u'%(releaselevel)s%(serial)i' % self) + vers.append(u'.%i' % self.micro) + if self.release_level != RELEASE_LEVEL_FINAL: + vers.append(u'%s%i' % (self.release_level, self.serial)) return u''.join(vers) @property diff --git a/apps/documents/urls.py b/apps/documents/urls.py index e3cfbf598d..88650155a7 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -33,6 +33,9 @@ urlpatterns = patterns('documents.views', url(r'^(?P\d+)/create/siblings/$', 'document_create_siblings', (), 'document_create_siblings'), url(r'^(?P\d+)/find_duplicates/$', 'document_find_duplicates', (), 'document_find_duplicates'), url(r'^(?P\d+)/clear_transformations/$', 'document_clear_transformations', (), 'document_clear_transformations'), + + url(r'^(?P\d+)/version/all/$', 'document_version_list', (), 'document_version_list'), + url(r'^document/version/(?P\d+)/download/$', 'document_version_download', (), 'document_version_download'), url(r'^multiple/clear_transformations/$', 'document_multiple_clear_transformations', (), 'document_multiple_clear_transformations'), url(r'^duplicates/list/$', 'document_find_all_duplicates', (), 'document_find_all_duplicates'), diff --git a/apps/documents/views.py b/apps/documents/views.py index ba0e18e315..efaaf3e2da 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -53,8 +53,9 @@ from documents.forms import DocumentTypeSelectForm, \ DocumentPageForm_text, PrintForm, DocumentTypeForm, \ DocumentTypeFilenameForm, DocumentTypeFilenameForm_create from documents.wizards import DocumentCreateWizard -from documents.models import Document, DocumentType, DocumentPage, \ - DocumentPageTransformation, RecentDocument, DocumentTypeFilename +from documents.models import (Document, DocumentType, DocumentPage, + DocumentPageTransformation, RecentDocument, DocumentTypeFilename, + DocumentVersion) # Document type permissions from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \ @@ -294,6 +295,10 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, base64_version=F return sendfile.sendfile(request, document.get_image(size=size, page=page, zoom=zoom, rotation=rotation), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE) +def document_version_download(request, document_version_pk): + document_version = get_object_or_404(DocumentVersion, pk=document_version_pk) + return document_download(request, document_version.document.pk) + def document_download(request, document_id): check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD]) @@ -1142,3 +1147,44 @@ def document_clear_image_cache(request): 'title': _(u'Are you sure you wish to clear the document image cache?'), 'form_icon': u'camera_delete.png', }, context_instance=RequestContext(request)) + + +def document_version_list(request, document_pk): + check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW]) + document = get_object_or_404(Document, pk=document_pk) + + context = { + 'object_list': document.versions.all(), + 'title': _(u'versions for document: %s') % document, + 'hide_object': True, + 'object': document, + 'extra_columns': [ + { + 'name': _(u'version'), + 'attribute': 'get_version', + }, + { + 'name': _(u'time and date'), + 'attribute': 'timestamp', + }, + { + 'name': _(u'mimetype'), + 'attribute': 'mimetype', + }, + { + 'name': _(u'encoding'), + 'attribute': 'encoding', + }, + { + 'name': _(u'filename'), + 'attribute': 'filename', + }, + { + 'name': _(u'comment'), + 'attribute': 'comment', + }, + ] + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request))