Add initial new document version class based view

This commit is contained in:
Roberto Rosario
2014-10-24 18:50:23 -04:00
parent c23205f464
commit 6a007492a8
4 changed files with 184 additions and 125 deletions

View File

@@ -219,36 +219,3 @@ class DocumentDownloadForm(forms.Form):
if len(self.document_versions) > 1:
self.fields['compressed'].initial = True
self.fields['compressed'].widget.attrs.update({'disabled': True})
class NewVersionForm(forms.ModelForm):
class Meta:
model = DocumentVersion
'''
def version_fields(self, document):
self.fields['version_update'] = forms.ChoiceField(
label=_(u'Version update'),
choices=DocumentVersion.get_version_update_choices(document.latest_version)
)
self.fields['comment'] = forms.CharField(
label=_(u'Comment'),
required=False,
widget=forms.widgets.Textarea(attrs={'rows': 4}),
)
new_filename = forms.CharField(
label=_('New document filename'), required=False
)
def clean(self):
cleaned_data = self.cleaned_data
cleaned_data['new_version_data'] = {
'comment': self.cleaned_data.get('comment'),
'version_update': self.cleaned_data.get('version_update'),
}
# Always return the full collection of cleaned data.
return cleaned_data
'''

View File

@@ -7,6 +7,7 @@ from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
from documents.forms import DocumentForm
from documents.models import DocumentVersion
from .models import (IMAPEmail, POP3Email, SourceTransformation,
StagingFolderSource, WebFormSource, WatchFolderSource)
@@ -19,6 +20,31 @@ class NewDocumentForm(DocumentForm):
exclude = ('label',)
class NewVersionForm(forms.Form):
def __init__(self, *args, **kwargs):
document = kwargs.pop('document')
super(NewVersionForm, self).__init__(*args, **kwargs)
self.fields['version_update'] = forms.ChoiceField(
label=_(u'Version update'),
choices=DocumentVersion.get_version_update_choices(document.latest_version)
)
self.fields['comment'] = forms.CharField(
label=_(u'Comment'),
required=False,
widget=forms.widgets.Textarea(attrs={'rows': 4}),
)
#def clean(self):
# cleaned_data = self.cleaned_data
# cleaned_data['new_version_data'] = {
# 'comment': self.cleaned_data.get('comment'),
# 'version_update': self.cleaned_data.get('version_update'),
# }
# Always return the full collection of cleaned data.
#return cleaned_data
class UploadBaseForm(forms.Form):
def __init__(self, *args, **kwargs):
show_expand = kwargs.pop('show_expand', False)

View File

@@ -5,7 +5,7 @@ from django.conf.urls import patterns, url
from .api_views import (APIDocumentCreateView, APIStagingSourceFileView,
APIStagingSourceFileImageView, APIStagingSourceListView,
APIStagingSourceView)
from .views import UploadInteractiveView
from .views import UploadInteractiveVersionView, UploadInteractiveView
from .wizards import DocumentCreateWizard
urlpatterns = patterns('sources.views',
@@ -14,8 +14,8 @@ urlpatterns = patterns('sources.views',
url(r'^upload/document/new/interactive/(?P<source_id>\d+)/$', UploadInteractiveView.as_view(), name='upload_interactive'),
url(r'^upload/document/new/interactive/$', UploadInteractiveView.as_view(), name='upload_interactive'),
url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/(?P<source_id>\d+)/$', 'upload_new_version', (), 'upload_version'),
url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/$', 'upload_new_version', (), 'upload_version'),
url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/(?P<source_id>\d+)/$', UploadInteractiveVersionView.as_view(), name='upload_version'),
url(r'^upload/document/(?P<document_pk>\d+)/version/interactive/$', UploadInteractiveVersionView.as_view(), name='upload_version'),
# Setup views

View File

@@ -24,7 +24,7 @@ from documents.permissions import (PERMISSION_DOCUMENT_CREATE,
from metadata.api import decode_metadata_from_url, metadata_repr_as_list
from permissions.models import Permission
from .forms import (NewDocumentForm, SourceTransformationForm,
from .forms import (NewDocumentForm, NewVersionForm, SourceTransformationForm,
SourceTransformationForm_create)
from .literals import (SOURCE_CHOICE_STAGING, SOURCE_CHOICE_WEB_FORM,
SOURCE_UNCOMPRESS_CHOICE_ASK, SOURCE_UNCOMPRESS_CHOICE_Y)
@@ -92,10 +92,87 @@ def get_active_tab_links(document=None):
}
class UploadInteractiveView(MultiFormView):
class UploadBaseView(MultiFormView):
template_name = 'main/generic_form.html'
prefixes = {'source_form': 'source', 'document_form': 'document'}
def dispatch(self, request, *args, **kwargs):
if 'source_id' in kwargs:
self.source = get_object_or_404(Source.objects.filter(enabled=True).select_subclasses(), pk=kwargs['source_id'])
else:
self.source = InteractiveSource.objects.filter(enabled=True).select_subclasses().first()
return super(UploadBaseView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(UploadBaseView, self).get_context_data(**kwargs)
subtemplates_list = []
context['source'] = self.source
if InteractiveSource.objects.filter(enabled=True).count() == 0:
subtemplates_list.append(
{
'name': 'main/generic_subtemplate.html',
'context': {
'title': _(u'Upload sources'),
'paragraphs': [
_(u'No interactive document sources have been defined or none have been enabled.'),
],
}
})
if isinstance(self.source, StagingFolderSource):
try:
staging_filelist = list(self.source.get_files())
except Exception as exception:
messages.error(request, exception)
staging_filelist = []
finally:
subtemplates_list = [
{
'name': 'main/generic_multiform_subtemplate.html',
'context': {
'forms': context['forms'],
}
},
{
'name': 'main/generic_list_subtemplate.html',
'context': {
'title': _(u'Files in staging path'),
'object_list': staging_filelist,
'hide_link': True,
}
},
]
else:
subtemplates_list.append({
'name': 'main/generic_multiform_subtemplate.html',
'context': {
'forms': context['forms'],
'is_multipart': True
},
})
context.update({
'subtemplates_list': subtemplates_list,
'temporary_navigation_links': {
'form_header': {
'sources:upload_version': {
'links': self.tab_links['tab_links']
},
'sources:upload_interactive': {
'links': self.tab_links['tab_links']
}
}
},
})
return context
class UploadInteractiveView(UploadBaseView):
def dispatch(self, request, *args, **kwargs):
self.subtemplates_list = []
@@ -103,10 +180,7 @@ class UploadInteractiveView(MultiFormView):
self.document_type = get_object_or_404(DocumentType, pk=self.request.GET['document_type_id'])
if 'source_id' in kwargs:
self.source = get_object_or_404(Source.objects.filter(enabled=True).select_subclasses(), pk=kwargs['source_id'])
else:
self.source = InteractiveSource.objects.filter(enabled=True).select_subclasses().first()
self.tab_links = get_active_tab_links()
return super(UploadInteractiveView, self).dispatch(request, *args, **kwargs)
@@ -158,7 +232,6 @@ class UploadInteractiveView(MultiFormView):
messages.success(self.request, _(u'New document queued for uploaded and will be available shortly.'))
return HttpResponseRedirect(self.request.get_full_path())
def create_source_form_form(self, **kwargs):
return self.get_form_classes()['source_form'](
prefix=kwargs['prefix'],
@@ -181,72 +254,7 @@ class UploadInteractiveView(MultiFormView):
def get_context_data(self, **kwargs):
context = super(UploadInteractiveView, self).get_context_data(**kwargs)
subtemplates_list = []
results = get_active_tab_links()
context['source'] = self.source
if InteractiveSource.objects.filter(enabled=True).count() == 0:
subtemplates_list.append(
{
'name': 'main/generic_subtemplate.html',
'context': {
'title': _(u'Upload sources'),
'paragraphs': [
_(u'No interactive document sources have been defined or none have been enabled.'),
],
}
})
title = _(u'Upload a local document from source: %s') % self.source.title
if isinstance(self.source, StagingFolderSource):
try:
staging_filelist = list(self.source.get_files())
except Exception as exception:
messages.error(request, exception)
staging_filelist = []
finally:
subtemplates_list = [
{
'name': 'main/generic_multiform_subtemplate.html',
'context': {
'forms': context['forms'],
'title': title,
}
},
{
'name': 'main/generic_list_subtemplate.html',
'context': {
'title': _(u'Files in staging path'),
'object_list': staging_filelist,
'hide_link': True,
}
},
]
else:
subtemplates_list.append({
'name': 'main/generic_multiform_subtemplate.html',
'context': {
'forms': context['forms'],
'title': title,
'is_multipart': True
},
})
context.update({
'document_type_id': self.document_type.pk,
'subtemplates_list': subtemplates_list,
'temporary_navigation_links': {
'form_header': {
'sources:upload_version': {
'links': results['tab_links']
},
'sources:upload_interactive': {
'links': results['tab_links']
}
}
},
})
context['title'] = _(u'Upload a local document from source: %s') % self.source.title
context.update(
{
@@ -270,29 +278,87 @@ class UploadInteractiveView(MultiFormView):
],
}
)
return context
def upload_new_version(request, document_id):
subtemplates_list = []
class UploadInteractiveVersionView(UploadBaseView):
def dispatch(self, request, *args, **kwargs):
document = get_object_or_404(Document, pk=document_pk)
try:
Permission.objects.check_permissions(request.user, [PERMISSION_DOCUMENT_NEW_VERSION])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_NEW_VERSION, request.user, document)
self.subtemplates_list = []
results = get_active_tab_links(document)
self.document = get_object_or_404(Document, pk=kwargs['document_pk'])
try:
Permission.objects.check_permissions(self.request.user, [PERMISSION_DOCUMENT_NEW_VERSION])
except PermissionDenied:
AccessEntry.objects.check_access(PERMISSION_DOCUMENT_NEW_VERSION, self.request.user, self.document)
# messages.success(request, _(u'New document version queued for uploaded and will be available shortly.'))
# return HttpResponseRedirect(reverse('documents:document_version_list', args=[document.pk]))
self.tab_links = get_active_tab_links(self.document)
# title = _(u'Upload a new version from source: %s') % source.title
# TODO: move to version upload
#if document:
#context['object'] = document
pass
return super(UploadInteractiveVersionView, self).dispatch(request, *args, **kwargs)
def forms_valid(self, forms):
uploaded_file = self.source.get_upload_file_object(self.request, forms['source_form'])
file_object = uploaded_file.file
temporary_file = tempfile.NamedTemporaryFile(delete=False)
for chunk in file_object.chunks():
temporary_file.write(chunk)
temporary_file.close()
file_object.close()
try:
self.source.clean_up_upload_file(uploaded_file)
except Exception as exception:
messages.error(self.request, exception)
if not self.request.user.is_anonymous():
user_id = self.request.user.pk
else:
user_id = None
'''
task_upload_document.apply_async(kwargs=dict(
source_id=self.source.pk,
file_path=temporary_file.name,
label=file_object.name,
document_type_id=self.document_type.pk,
expand=expand,
metadata_dict_list=decode_metadata_from_url(self.request.GET),
user_id=user_id,
description=forms['document_form'].cleaned_data.get('description'),
language=forms['document_form'].cleaned_data.get('language')
), queue='uploads')
'''
messages.success(self.request, _(u'New document version queued for uploaded and will be available shortly.'))
return HttpResponseRedirect(reverse('documents:document_version_list', args=[self.document.pk]))
def create_source_form_form(self, **kwargs):
return self.get_form_classes()['source_form'](
prefix=kwargs['prefix'],
source=self.source,
show_expand=False,
data=kwargs.get('data', None),
files=kwargs.get('files', None),
)
def create_document_form_form(self, **kwargs):
return self.get_form_classes()['document_form'](
prefix=kwargs['prefix'],
document=self.document,
data=kwargs.get('data', None),
files=kwargs.get('files', None),
)
def get_form_classes(self):
return {'document_form': NewVersionForm, 'source_form': get_upload_form_class(self.source.source_type)}
def get_context_data(self, **kwargs):
context = super(UploadInteractiveVersionView, self).get_context_data(**kwargs)
context['object'] = self.document
context['title'] = _(u'Upload a new version from source: %s') % self.source.title
return context
def staging_file_delete(request, staging_folder_pk, encoded_filename):