Successfully merged staging file upload and local file upload views and forms

This commit is contained in:
Roberto Rosario
2011-02-07 00:58:09 -04:00
parent 33e8dcf4dc
commit 07e2ca0e7f
5 changed files with 99 additions and 29 deletions

View File

@@ -12,14 +12,14 @@ 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':_('upload file'), '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])
register_links(Document, [document_list, document_create, document_create_multiple], menu_name='sidebar') register_links(Document, [document_list, document_create, document_create_multiple], menu_name='sidebar')
register_links(['document_list', 'document_create', 'document_create_multiple', 'upload_document_with_type', 'upload_multiple_documents_with_type'], [document_list, document_create, document_create_multiple], menu_name='sidebar') register_links(['document_list', 'document_create', 'document_create_multiple', 'upload_document_with_type', 'upload_multiple_documents_with_type'], [document_list, document_create, document_create_multiple], menu_name='sidebar')
register_links(StagingFile, [document_create_from_staging]) #register_links(StagingFile, [document_create_from_staging])
register_menu([ register_menu([

View File

@@ -5,6 +5,8 @@ from django.http import HttpResponseRedirect
from django.utils.http import urlencode from django.utils.http import urlencode
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from staging import StagingFile
from common.wizard import BoundFormWizard 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
@@ -14,7 +16,7 @@ from models import Document, DocumentType, DocumentTypeMetadataType
from documents.conf.settings import AVAILABLE_FUNCTIONS from documents.conf.settings import AVAILABLE_FUNCTIONS
from documents.conf.settings import AVAILABLE_MODELS from documents.conf.settings import AVAILABLE_MODELS
#TODO: Turn this into a base form and let others inherit
class DocumentForm(forms.ModelForm): class DocumentForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(DocumentForm, self).__init__(*args, **kwargs) super(DocumentForm, self).__init__(*args, **kwargs)
@@ -48,6 +50,22 @@ class DocumentForm_edit(DocumentForm):
new_filename = forms.CharField(label=_(u'New document filename'), required=False) new_filename = forms.CharField(label=_(u'New document filename'), required=False)
class StagingDocumentForm(forms.Form):
def __init__(self, *args, **kwargs):
super(StagingDocumentForm, self).__init__(*args, **kwargs)
self.fields['staging_file_id'].choices=[(staging_file.id, staging_file) for staging_file in StagingFile.get_all()]
if 'initial' in kwargs:
if 'document_type' in kwargs['initial']:
filenames_qs = kwargs['initial']['document_type'].documenttypefilename_set.filter(enabled=True)
if filenames_qs.count() > 0:
self.fields['document_type_available_filenames'] = forms.ModelChoiceField(
queryset=filenames_qs,
required=False,
label=_(u'Document type available filenames'))
staging_file_id = forms.ChoiceField()
class DocumentTypeSelectForm(forms.Form): class DocumentTypeSelectForm(forms.Form):
document_type = forms.ModelChoiceField(queryset=DocumentType.objects.all()) document_type = forms.ModelChoiceField(queryset=DocumentType.objects.all())

View File

@@ -54,7 +54,7 @@ class Document(models.Model):
Inherit this model to customise document metadata, see BasicDocument for an example. Inherit this model to customise document metadata, see BasicDocument for an example.
""" """
document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type')) document_type = models.ForeignKey(DocumentType, verbose_name=_(u'document type'))
file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND()) file = models.FileField(upload_to=get_filename_from_uuid, storage=STORAGE_BACKEND(), verbose_name=_(u'file'))
uuid = models.CharField(max_length=48, default=UUID_FUNCTION(), blank=True, editable=False) uuid = models.CharField(max_length=48, default=UUID_FUNCTION(), blank=True, editable=False)
file_mimetype = models.CharField(max_length=64, default='', editable=False) file_mimetype = models.CharField(max_length=64, default='', editable=False)
file_filename = models.CharField(max_length=64, default='', editable=False) file_filename = models.CharField(max_length=64, default='', editable=False)

View File

@@ -12,5 +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':True}, 'document_create_from_staging'),
) )

View File

@@ -13,13 +13,14 @@ 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, \
StagingDocumentForm
from staging import StagingFile from staging import StagingFile
from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD
from documents.conf.settings import USE_STAGING_DIRECTORY from documents.conf.settings import USE_STAGING_DIRECTORY
DELETE_STAGING_FILE_AFTER_UPLOAD = True
def document_list(request): def document_list(request):
return object_list( return object_list(
@@ -68,33 +69,74 @@ def _save_metadata(url_dict, 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)
local_form = DocumentForm(prefix='local', initial={'document_type':document_type})
if USE_STAGING_DIRECTORY:
staging_form = StagingDocumentForm(prefix='staging',
initial={'document_type':document_type})
if request.method == 'POST': if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES, initial={'document_type':document_type}) if 'local-submit' in request.POST.keys():
if form.is_valid(): local_form = DocumentForm(request.POST, request.FILES,
instance = form.save() prefix='local', initial={'document_type':document_type})
if 'document_type_available_filenames' in form.cleaned_data: if local_form.is_valid():
if form.cleaned_data['document_type_available_filenames']: instance = local_form.save()
instance.file_filename = form.cleaned_data['document_type_available_filenames'].filename if 'document_type_available_filenames' in local_form.cleaned_data:
instance.save() if local_form.cleaned_data['document_type_available_filenames']:
instance.file_filename = local_form.cleaned_data['document_type_available_filenames'].filename
_save_metadata(request.GET, instance) instance.save()
messages.success(request, _(u'Document uploaded successfully.'))
try: _save_metadata(request.GET, instance)
instance.create_fs_links() messages.success(request, _(u'Document uploaded successfully.'))
except Exception, e: try:
messages.error(request, e) instance.create_fs_links()
except Exception, e:
messages.error(request, e)
if multiple:
return HttpResponseRedirect(request.get_full_path())
else:
return HttpResponseRedirect(reverse('document_list'))
elif 'staging-submit' in request.POST.keys() and USE_STAGING_DIRECTORY:
staging_form = StagingDocumentForm(request.POST, request.FILES,
prefix='staging', initial={'document_type':document_type})
if staging_form.is_valid():
staging_file_id = staging_form.cleaned_data['staging_file_id']
staging_file = StagingFile.get(int(staging_file_id))
try:
document = Document(file=staging_file.upload(), document_type=document_type)
document.save()
except Exception, e:
messages.error(request, e)
else:
_save_metadata(request.GET, 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 DELETE_STAGING_FILE_AFTER_UPLOAD:
try:
staging_file.delete()
messages.success(request, _(u'Staging file: %s, deleted successfully.') % staging_file.filename)
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'))
else:
form = DocumentForm(initial={'document_type':document_type})
context = { context = {
'form':form,
'title':_(u'upload a local document'),
'document_type_id':document_type_id, 'document_type_id':document_type_id,
'form_list':[
{
'form':local_form,
'title':_(u'upload a local document')
},
],
} }
if USE_STAGING_DIRECTORY: if USE_STAGING_DIRECTORY:
@@ -110,9 +152,16 @@ def upload_document_with_type(request, document_type_id, multiple=True):
'name':'generic_list_subtemplate.html', 'name':'generic_list_subtemplate.html',
'title':_(u'files in staging'), 'title':_(u'files in staging'),
'object_list':filelist, 'object_list':filelist,
'hide_link':True,
}, },
], ],
}) })
context['form_list'].append(
{
'form':staging_form,
'title':_(u'upload a document from staging'),
},
)
return render_to_response('generic_form.html', context, return render_to_response('generic_form.html', context,
context_instance=RequestContext(request)) context_instance=RequestContext(request))
@@ -178,13 +227,15 @@ def document_edit(request, document_id):
document.save() document.save()
messages.success(request, _(u'Document edited successfully.'))
try: try:
document.create_fs_links() document.create_fs_links()
messages.success(request, _(u'Document filesystem links updated successfully.'))
except Exception, e: except Exception, e:
messages.error(request, e) messages.error(request, e)
return HttpResponseRedirect(reverse('document_list')) return HttpResponseRedirect(reverse('document_list'))
messages.success(request, _(u'Document edited and filesystem links updated.'))
return HttpResponseRedirect(reverse('document_list')) return HttpResponseRedirect(reverse('document_list'))
else: else:
form = DocumentForm_edit(instance=document, initial={ form = DocumentForm_edit(instance=document, initial={
@@ -196,7 +247,7 @@ 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):
if USE_STAGING_DIRECTORY: if USE_STAGING_DIRECTORY:
document_type = get_object_or_404(DocumentType, pk=document_type_id) document_type = get_object_or_404(DocumentType, pk=document_type_id)
@@ -230,3 +281,4 @@ def document_create_from_staging(request, file_id, document_type_id, multiple=Tr
return HttpResponseRedirect(request.META['HTTP_REFERER']) return HttpResponseRedirect(request.META['HTTP_REFERER'])
else: else:
return HttpResponseRedirect(reverse('document_list')) return HttpResponseRedirect(reverse('document_list'))
'''