diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 4c667ef63e..2ec14c9b37 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -12,7 +12,7 @@ document_view = {'text':_('details'), 'view':'document_view', 'args':'object.id' document_delete = {'text':_('delete'), 'view':'document_delete', 'args':'object.id', 'famfam':'page_delete'} document_edit = {'text':_('edit'), 'view':'document_edit', 'args':'object.id', 'famfam':'page_edit'} -document_create_from_staging = {'text':_('select staging'), 'view':'document_create_from_staging', 'args':{'file_id':'object.id', 'document_type_id': 'document_type_id'}, 'famfam':'page_add'} +document_create_from_staging = {'text':_('upload file'), 'view':'document_create_from_staging', 'args':{'file_id':'object.id', 'document_type_id': 'document_type_id'}, 'famfam':'page_add'} register_links(Document, [document_view, document_edit, document_delete]) @@ -24,6 +24,6 @@ register_links(StagingFile, [document_create_from_staging]) register_menu([ {'text':_('documents'), 'view':'document_list', 'links':[ - document_list#, document_create + document_list ],'famfam':'page','position':4}]) diff --git a/apps/documents/admin.py b/apps/documents/admin.py index 6ecc70a4dd..1f8b6248b8 100644 --- a/apps/documents/admin.py +++ b/apps/documents/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin from models import MetadataType, DocumentType, Document, \ - DocumentTypeMetadataType, DocumentMetadata, DocumentTypeFilename, \ - DocumentFile + DocumentTypeMetadataType, DocumentMetadata, DocumentTypeFilename#, \ +# DocumentFile class MetadataTypeAdmin(admin.ModelAdmin): @@ -34,15 +34,16 @@ class DocumentMetadataInline(admin.StackedInline): allow_add = True -class DocumentFileInline(admin.StackedInline): - model = DocumentFile - extra = 1 - classes = ('collapse-open',) - allow_add = True +#class DocumentFileInline(admin.StackedInline): +# model = DocumentFile +# extra = 1 +# classes = ('collapse-open',) +# allow_add = True class DocumentAdmin(admin.ModelAdmin): - inlines = [DocumentFileInline, DocumentMetadataInline,] + #inlines = [DocumentFileInline]#, DocumentMetadataInline,] + inlines = [DocumentMetadataInline] list_display = ('uuid',) diff --git a/apps/documents/forms.py b/apps/documents/forms.py index 18eee7a999..a4eda9d5c7 100644 --- a/apps/documents/forms.py +++ b/apps/documents/forms.py @@ -9,14 +9,9 @@ from common.wizard import BoundFormWizard from common.utils import urlquote from common.forms import DetailForm -from models import Document, DocumentType, DocumentTypeMetadataType, DocumentFile +from models import Document, DocumentType, DocumentTypeMetadataType from documents.conf.settings import AVAILABLE_FUNCTIONS - - -class DocumentFileForm(forms.ModelForm): - class Meta: - model = DocumentFile class DocumentForm(forms.ModelForm): diff --git a/apps/documents/models.py b/apps/documents/models.py index a22cfa8669..b8ce3a114a 100644 --- a/apps/documents/models.py +++ b/apps/documents/models.py @@ -24,12 +24,11 @@ if SLUGIFY_PATH == False: def get_filename_from_uuid(instance, filename, directory=STORAGE_DIRECTORY_NAME): - #populate_file_extension_and_mimetype(instance, filename) + populate_file_extension_and_mimetype(instance, filename) stem, extension = os.path.splitext(filename) return '%s/%s%s' % (directory, instance.uuid, extension) -def populate_file_extension_and_mimetype(instance):#, filename): - filename = instance.file.name +def populate_file_extension_and_mimetype(instance, filename): # First populate the file extension and mimetype instance.file_mimetype, encoding = mimetypes.guess_type(filename) if not instance.file_mimetype: @@ -46,19 +45,32 @@ class DocumentType(models.Model): def __unicode__(self): return self.name -class DocumentFile(models.Model): - file = models.FileField(upload_to=get_filename_from_uuid) + +class Document(models.Model): + """ Minimum fields for a document entry. + Inherit this model to customise document metadata, see BasicDocument for an example. + """ + document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type')) + file = models.FileField(upload_to=get_filename_from_uuid, blank=True, null=True) + uuid = models.CharField(max_length=36, default=UUID_FUNCTION(), blank=True, editable=False) file_mimetype = models.CharField(max_length=50, default='', editable=False) file_filename = models.CharField(max_length=64, default='', editable=False) file_extension = models.CharField(max_length=10, default='', editable=False) + date_added = models.DateTimeField(verbose_name=_(u'added'), auto_now_add=True) + date_updated = models.DateTimeField(verbose_name=_(u'updated'), auto_now=True) checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False) class Meta: - verbose_name = _(u'document file') - verbose_name_plural = _(u'documents files') - + verbose_name = _(u'document') + verbose_name_plural = _(u'documents') + ordering = ['-date_updated', '-date_added'] + def __unicode__(self): - return self.id + return self.uuid + + @models.permalink + def get_absolute_url(self): + return ('document_view', [self.id]) def update_checksum(self, save=True): self.checksum = unicode(CHECKSUM_FUNCTION(self.file.read())) @@ -67,12 +79,11 @@ class DocumentFile(models.Model): def save(self, *args, **kwargs): self.update_checksum(save=False) - populate_file_extension_and_mimetype(self) - super(DocumentFile, self).save(*args, **kwargs) + super(Document, self).save(*args, **kwargs) def delete(self, *args, **kwargs): self.delete_fs_links() - super(DocumentFile, self).delete(*args, **kwargs) + super(Document, self).delete(*args, **kwargs) def calculate_fs_links(self): targets = [] @@ -109,33 +120,6 @@ class DocumentFile(models.Model): else: raise OSError(ugettext(u'Unable to delete metadata indexing symbolic link: %s') % exc) - -class Document(models.Model): - """ Minimum fields for a document entry. - Inherit this model to customise document metadata, see BasicDocument for an example. - """ - document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type')) - #file = models.FileField(upload_to=get_filename_from_uuid, blank=True, null=True) - uuid = models.CharField(max_length=36, default=UUID_FUNCTION(), blank=True, editable=False) - #file_mimetype = models.CharField(max_length=50, default='', editable=False) - #file_filename = models.CharField(max_length=64, default='', editable=False) - #file_extension = models.CharField(max_length=10, default='', editable=False) - date_added = models.DateTimeField(verbose_name=_(u'added'), auto_now_add=True) - date_updated = models.DateTimeField(verbose_name=_(u'updated'), auto_now=True) - #checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False) - document_file = models.ForeignKey(DocumentFile, blank=True, null=True, verbose_name=_('document file')) - - class Meta: - verbose_name = _(u'document') - verbose_name_plural = _(u'documents') - ordering = ['-date_updated', '-date_added'] - - def __unicode__(self): - return self.uuid - - @models.permalink - def get_absolute_url(self): - return ('document_view', [self.id]) available_functions_string = (_(u' Available functions: %s') % ','.join(['%s()' % name for name, function in AVAILABLE_FUNCTIONS.items()])) if AVAILABLE_FUNCTIONS else '' diff --git a/apps/documents/staging.py b/apps/documents/staging.py index 5230d25d64..cdd753dbcb 100644 --- a/apps/documents/staging.py +++ b/apps/documents/staging.py @@ -1,13 +1,10 @@ import os -import shutil -from django.core.exceptions import ObjectDoesNotExist from django.conf import settings -from django.core.files.storage import default_storage +from django.core.exceptions import ObjectDoesNotExist +from django.core.files.uploadedfile import InMemoryUploadedFile, SimpleUploadedFile from documents.conf.settings import STAGING_DIRECTORY -from documents.conf.settings import UUID_FUNCTION -from models import Document, get_filename_from_uuid def get_all_files(): @@ -50,18 +47,15 @@ class StagingFile(object): return self._id else: raise AttributeError, name + + def upload(self): + return SimpleUploadedFile(name=self.filename, content=open(self.filepath).read()) - def upload(self, document_type): - document = Document(document_type=document_type) - document.save(save=False) - print 'UUID', document.uuid - tmp_filepath = os.path.join(settings.MEDIA_ROOT, UUID_FUNCTION()) - #shutil.copy(self.filepath, tmp_filepath) - #document = Document(document_type=document_type, - # file=tmp_filepath) - #document.save() - #final_filepath = get_filename_from_uuid(document, filename=self.filename) - #document.save() - #print final_filepath - - + #return InMemoryUploadedFile( + # file=open(self.filepath, 'r'), + # field_name='', + # name=self.filename, + # content_type='unknown', + # size=os.path.getsize(self.filepath), + # charset=None, + #) diff --git a/apps/documents/urls.py b/apps/documents/urls.py index df5470dadc..3a3b048081 100644 --- a/apps/documents/urls.py +++ b/apps/documents/urls.py @@ -12,7 +12,5 @@ urlpatterns = patterns('documents.views', url(r'^document/(?P\d+)/$', 'document_view', (), 'document_view'), url(r'^document/(?P\d+)/delete/$', 'document_delete', (), 'document_delete'), url(r'^document/(?P\d+)/edit/$', 'document_edit', (), 'document_edit'), - - url(r'^document/type/(?P\d+)/upload/from/staging/(?P\d+)/single/$', 'document_create_from_staging', {'multiple':False}, 'document_create_from_staging'), - #url(r'^document/create/from/staging/(?P\d+)/$', '', (), 'document_create_from_staging'), + url(r'^document/type/(?P\d+)/upload/from/staging/(?P\d+)/single/$', 'document_create_from_staging', {'multiple':True}, 'document_create_from_staging'), ) diff --git a/apps/documents/views.py b/apps/documents/views.py index ff7e4ab889..78bf04049a 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -8,11 +8,9 @@ from django.core.urlresolvers import reverse from django.views.generic.create_update import create_object, delete_object, update_object from django.forms.formsets import formset_factory - from models import Document, DocumentMetadata, DocumentType, MetadataType from forms import DocumentTypeSelectForm, DocumentCreateWizard, \ - MetadataForm, DocumentForm, DocumentForm_edit, DocumentForm_view, \ - DocumentFileForm + MetadataForm, DocumentForm, DocumentForm_edit, DocumentForm_view from staging import StagingFile @@ -63,7 +61,7 @@ def _save_metadata_from_request(request, document): def upload_document_with_type(request, document_type_id, multiple=True): document_type = get_object_or_404(DocumentType, pk=document_type_id) if request.method == 'POST': - form = DocumentFileForm(request.POST, request.FILES)#, initial={'document_type':document_type}) + form = DocumentForm(request.POST, request.FILES, initial={'document_type':document_type}) if form.is_valid(): instance = form.save() if 'new_filename' in form.cleaned_data: @@ -83,7 +81,7 @@ def upload_document_with_type(request, document_type_id, multiple=True): else: return HttpResponseRedirect(reverse('document_list')) else: - form = DocumentFileForm()#initial={'document_type':document_type}) + form = DocumentForm(initial={'document_type':document_type}) filelist = StagingFile.get_all() @@ -173,14 +171,22 @@ def document_edit(request, document_id): }, context_instance=RequestContext(request)) - def document_create_from_staging(request, file_id, document_type_id, multiple=True): document_type = get_object_or_404(DocumentType, pk=document_type_id) staging_file = StagingFile.get(id=int(file_id)) - staging_file.upload(document_type=document_type) + document = Document(file=staging_file.upload(), document_type=document_type) + document.save() + + #TODO: need to grab url query string from HTTP_REFERER + _save_metadata_from_request(request, document) + messages.success(request, _(u'Staging file: %s, uploaded successfully.') % staging_file.filename) + try: + document.create_fs_links() + except Exception, e: + messages.error(request, e) + if multiple: - return HttpResponseRedirect(request.get_full_path()) + return HttpResponseRedirect(request.META['HTTP_REFERER']) else: return HttpResponseRedirect(reverse('document_list')) -