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_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_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]) register_links(Document, [document_view, document_edit, document_delete])
@@ -24,6 +24,6 @@ register_links(StagingFile, [document_create_from_staging])
register_menu([ register_menu([
{'text':_('documents'), 'view':'document_list', 'links':[ {'text':_('documents'), 'view':'document_list', 'links':[
document_list#, document_create document_list
],'famfam':'page','position':4}]) ],'famfam':'page','position':4}])

View File

@@ -1,8 +1,8 @@
from django.contrib import admin from django.contrib import admin
from models import MetadataType, DocumentType, Document, \ from models import MetadataType, DocumentType, Document, \
DocumentTypeMetadataType, DocumentMetadata, DocumentTypeFilename, \ DocumentTypeMetadataType, DocumentMetadata, DocumentTypeFilename#, \
DocumentFile # DocumentFile
class MetadataTypeAdmin(admin.ModelAdmin): class MetadataTypeAdmin(admin.ModelAdmin):
@@ -34,15 +34,16 @@ class DocumentMetadataInline(admin.StackedInline):
allow_add = True allow_add = True
class DocumentFileInline(admin.StackedInline): #class DocumentFileInline(admin.StackedInline):
model = DocumentFile # model = DocumentFile
extra = 1 # extra = 1
classes = ('collapse-open',) # classes = ('collapse-open',)
allow_add = True # allow_add = True
class DocumentAdmin(admin.ModelAdmin): class DocumentAdmin(admin.ModelAdmin):
inlines = [DocumentFileInline, DocumentMetadataInline,] #inlines = [DocumentFileInline]#, DocumentMetadataInline,]
inlines = [DocumentMetadataInline]
list_display = ('uuid',) list_display = ('uuid',)

View File

@@ -9,14 +9,9 @@ from common.wizard import BoundFormWizard
from common.utils import urlquote from common.utils import urlquote
from common.forms import DetailForm 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 from documents.conf.settings import AVAILABLE_FUNCTIONS
class DocumentFileForm(forms.ModelForm):
class Meta:
model = DocumentFile
class DocumentForm(forms.ModelForm): class DocumentForm(forms.ModelForm):

View File

@@ -24,12 +24,11 @@ if SLUGIFY_PATH == False:
def get_filename_from_uuid(instance, filename, directory=STORAGE_DIRECTORY_NAME): 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) stem, extension = os.path.splitext(filename)
return '%s/%s%s' % (directory, instance.uuid, extension) return '%s/%s%s' % (directory, instance.uuid, extension)
def populate_file_extension_and_mimetype(instance):#, filename): def populate_file_extension_and_mimetype(instance, filename):
filename = instance.file.name
# First populate the file extension and mimetype # First populate the file extension and mimetype
instance.file_mimetype, encoding = mimetypes.guess_type(filename) instance.file_mimetype, encoding = mimetypes.guess_type(filename)
if not instance.file_mimetype: if not instance.file_mimetype:
@@ -46,19 +45,32 @@ class DocumentType(models.Model):
def __unicode__(self): def __unicode__(self):
return self.name 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_mimetype = models.CharField(max_length=50, default='', editable=False)
file_filename = models.CharField(max_length=64, default='', editable=False) file_filename = models.CharField(max_length=64, default='', editable=False)
file_extension = models.CharField(max_length=10, 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) checksum = models.TextField(blank=True, null=True, verbose_name=_(u'checksum'), editable=False)
class Meta: class Meta:
verbose_name = _(u'document file') verbose_name = _(u'document')
verbose_name_plural = _(u'documents files') verbose_name_plural = _(u'documents')
ordering = ['-date_updated', '-date_added']
def __unicode__(self): 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): def update_checksum(self, save=True):
self.checksum = unicode(CHECKSUM_FUNCTION(self.file.read())) self.checksum = unicode(CHECKSUM_FUNCTION(self.file.read()))
@@ -67,12 +79,11 @@ class DocumentFile(models.Model):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.update_checksum(save=False) self.update_checksum(save=False)
populate_file_extension_and_mimetype(self) super(Document, self).save(*args, **kwargs)
super(DocumentFile, self).save(*args, **kwargs)
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
self.delete_fs_links() self.delete_fs_links()
super(DocumentFile, self).delete(*args, **kwargs) super(Document, self).delete(*args, **kwargs)
def calculate_fs_links(self): def calculate_fs_links(self):
targets = [] targets = []
@@ -109,33 +120,6 @@ class DocumentFile(models.Model):
else: else:
raise OSError(ugettext(u'Unable to delete metadata indexing symbolic link: %s') % exc) 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 '' available_functions_string = (_(u' Available functions: %s') % ','.join(['%s()' % name for name, function in AVAILABLE_FUNCTIONS.items()])) if AVAILABLE_FUNCTIONS else ''

View File

@@ -1,13 +1,10 @@
import os import os
import shutil
from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings 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 STAGING_DIRECTORY
from documents.conf.settings import UUID_FUNCTION
from models import Document, get_filename_from_uuid
def get_all_files(): def get_all_files():
@@ -50,18 +47,15 @@ class StagingFile(object):
return self._id return self._id
else: else:
raise AttributeError, name raise AttributeError, name
def upload(self):
return SimpleUploadedFile(name=self.filename, content=open(self.filepath).read())
def upload(self, document_type): #return InMemoryUploadedFile(
document = Document(document_type=document_type) # file=open(self.filepath, 'r'),
document.save(save=False) # field_name='',
print 'UUID', document.uuid # name=self.filename,
tmp_filepath = os.path.join(settings.MEDIA_ROOT, UUID_FUNCTION()) # content_type='unknown',
#shutil.copy(self.filepath, tmp_filepath) # size=os.path.getsize(self.filepath),
#document = Document(document_type=document_type, # charset=None,
# file=tmp_filepath) #)
#document.save()
#final_filepath = get_filename_from_uuid(document, filename=self.filename)
#document.save()
#print final_filepath

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+)/$', 'document_view', (), 'document_view'),
url(r'^document/(?P<document_id>\d+)/delete/$', 'document_delete', (), 'document_delete'), 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/(?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':True}, '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':False}, 'document_create_from_staging'),
#url(r'^document/create/from/staging/(?P<file_id>\d+)/$', '', (), '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.views.generic.create_update import create_object, delete_object, update_object
from django.forms.formsets import formset_factory from django.forms.formsets import formset_factory
from models import Document, DocumentMetadata, DocumentType, MetadataType from models import Document, DocumentMetadata, DocumentType, MetadataType
from forms import DocumentTypeSelectForm, DocumentCreateWizard, \ from forms import DocumentTypeSelectForm, DocumentCreateWizard, \
MetadataForm, DocumentForm, DocumentForm_edit, DocumentForm_view, \ MetadataForm, DocumentForm, DocumentForm_edit, DocumentForm_view
DocumentFileForm
from staging import StagingFile 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): def upload_document_with_type(request, document_type_id, multiple=True):
document_type = get_object_or_404(DocumentType, pk=document_type_id) document_type = get_object_or_404(DocumentType, pk=document_type_id)
if request.method == 'POST': 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(): if form.is_valid():
instance = form.save() instance = form.save()
if 'new_filename' in form.cleaned_data: if 'new_filename' in form.cleaned_data:
@@ -83,7 +81,7 @@ def upload_document_with_type(request, document_type_id, multiple=True):
else: else:
return HttpResponseRedirect(reverse('document_list')) return HttpResponseRedirect(reverse('document_list'))
else: else:
form = DocumentFileForm()#initial={'document_type':document_type}) form = DocumentForm(initial={'document_type':document_type})
filelist = StagingFile.get_all() filelist = StagingFile.get_all()
@@ -173,14 +171,22 @@ def document_edit(request, document_id):
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def document_create_from_staging(request, file_id, document_type_id, multiple=True): def document_create_from_staging(request, file_id, document_type_id, multiple=True):
document_type = get_object_or_404(DocumentType, pk=document_type_id) document_type = get_object_or_404(DocumentType, pk=document_type_id)
staging_file = StagingFile.get(id=int(file_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: if multiple:
return HttpResponseRedirect(request.get_full_path()) return HttpResponseRedirect(request.META['HTTP_REFERER'])
else: else:
return HttpResponseRedirect(reverse('document_list')) return HttpResponseRedirect(reverse('document_list'))