Reverted back to previous upload method, but now using SimpleUploadedFile to upload staging files

This commit is contained in:
Roberto Rosario
2011-02-06 03:29:39 -04:00
parent 729514c9da
commit b0f31f2a8f
7 changed files with 64 additions and 86 deletions

View File

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

View File

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

View File

@@ -9,16 +9,11 @@ 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):
def __init__(self, *args, **kwargs):
super(DocumentForm, self).__init__(*args, **kwargs)

View File

@@ -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 = []
@@ -110,33 +121,6 @@ class DocumentFile(models.Model):
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 ''
class MetadataType(models.Model):

View File

@@ -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():
@@ -51,17 +48,14 @@ class StagingFile(object):
else:
raise AttributeError, name
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
def upload(self):
return SimpleUploadedFile(name=self.filename, content=open(self.filepath).read())
#return InMemoryUploadedFile(
# file=open(self.filepath, 'r'),
# field_name='',
# name=self.filename,
# content_type='unknown',
# size=os.path.getsize(self.filepath),
# charset=None,
#)

View File

@@ -12,7 +12,5 @@ urlpatterns = patterns('documents.views',
url(r'^document/(?P<document_id>\d+)/$', 'document_view', (), 'document_view'),
url(r'^document/(?P<document_id>\d+)/delete/$', 'document_delete', (), 'document_delete'),
url(r'^document/(?P<document_id>\d+)/edit/$', 'document_edit', (), 'document_edit'),
url(r'^document/type/(?P<document_type_id>\d+)/upload/from/staging/(?P<file_id>\d+)/single/$', 'document_create_from_staging', {'multiple':False}, 'document_create_from_staging'),
#url(r'^document/create/from/staging/(?P<file_id>\d+)/$', '', (), 'document_create_from_staging'),
url(r'^document/type/(?P<document_type_id>\d+)/upload/from/staging/(?P<file_id>\d+)/single/$', 'document_create_from_staging', {'multiple':True}, 'document_create_from_staging'),
)

View File

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