Initial commit to remove use of eval. gh-issue #151.

This commit is contained in:
Roberto Rosario
2015-07-22 23:19:43 -04:00
parent 4527563d89
commit 58d919d173
10 changed files with 606 additions and 176 deletions

View File

@@ -41,30 +41,47 @@ class MissingRequiredMetadataDocumentListView(DocumentListView):
}
def get_document_queryset(self):
return Document.objects.filter(document_type__metadata__required=True, metadata__value__isnull=True)
return Document.objects.filter(
document_type__metadata__required=True,
metadata__value__isnull=True
)
def metadata_edit(request, document_id=None, document_id_list=None):
if document_id:
document_id_list = unicode(document_id)
documents = Document.objects.select_related('metadata').filter(pk__in=document_id_list.split(','))
documents = Document.objects.select_related('metadata').filter(
pk__in=document_id_list.split(',')
)
try:
Permission.check_permissions(request.user, [permission_metadata_document_edit])
Permission.check_permissions(
request.user, [permission_metadata_document_edit]
)
except PermissionDenied:
documents = AccessControlList.objects.filter_by_access(permission_metadata_document_edit, request.user, documents)
documents = AccessControlList.objects.filter_by_access(
permission_metadata_document_edit, request.user, documents
)
if not documents:
if document_id:
raise Http404
else:
messages.error(request, _('Must provide at least one document.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
if len(set([document.document_type.pk for document in documents])) > 1:
messages.error(request, _('Only select documents of the same type.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
if set(documents.values_list('metadata__value', flat=True)) == set([None]):
message = ungettext(
@@ -73,11 +90,19 @@ def metadata_edit(request, document_id=None, document_id_list=None):
len(documents)
)
messages.warning(request, message)
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
post_action_redirect = reverse('documents:document_list_recent')
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_action_redirect)))
next = request.POST.get(
'next', request.GET.get(
'next', request.META.get('HTTP_REFERER', post_action_redirect)
)
)
metadata = {}
initial = []
@@ -97,7 +122,9 @@ def metadata_edit(request, document_id=None, document_id_list=None):
initial.append({
'metadata_type': key,
'value': ', '.join(value) if value else '',
'required': key in document.document_type.metadata.filter(required=True),
'required': key in document.document_type.metadata.filter(
required=True
),
})
formset = MetadataFormSet(initial=initial)
@@ -119,10 +146,19 @@ def metadata_edit(request, document_id=None, document_id_list=None):
if settings.DEBUG:
raise
else:
messages.error(request, _('Error editing metadata for document %(document)s; %(exception)s.') % {
'document': document, 'exception': ', '.join(exception.messages)})
messages.error(
request, _(
'Error editing metadata for document %(document)s; %(exception)s.'
) % {
'document': document,
'exception': ', '.join(exception.messages)
}
)
else:
messages.success(request, _('Metadata for document %s edited successfully.') % document)
messages.success(
request,
_('Metadata for document %s edited successfully.') % document
)
return HttpResponseRedirect(next)
@@ -146,54 +182,102 @@ def metadata_edit(request, document_id=None, document_id_list=None):
def metadata_multiple_edit(request):
return metadata_edit(request, document_id_list=request.GET.get('id_list', ''))
return metadata_edit(
request, document_id_list=request.GET.get('id_list', '')
)
def metadata_add(request, document_id=None, document_id_list=None):
if document_id:
documents = [get_object_or_404(Document, pk=document_id)]
elif document_id_list:
documents = [get_object_or_404(Document.objects.select_related('document_type'), pk=document_id) for document_id in document_id_list.split(',')]
documents = [
get_object_or_404(Document.objects.select_related('document_type'), pk=document_id) for document_id in document_id_list.split(',')
]
if len(set([document.document_type.pk for document in documents])) > 1:
messages.error(request, _('Only select documents of the same type.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
messages.error(
request, _('Only select documents of the same type.')
)
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
try:
Permission.check_permissions(request.user, [permission_metadata_document_add])
Permission.check_permissions(
request.user, [permission_metadata_document_add]
)
except PermissionDenied:
documents = AccessControlList.objects.filter_by_access(permission_metadata_document_add, request.user, documents)
documents = AccessControlList.objects.filter_by_access(
permission_metadata_document_add, request.user, documents
)
if not documents:
messages.error(request, _('Must provide at least one document.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
for document in documents:
document.add_as_recent_document_for_user(request.user)
post_action_redirect = reverse('documents:document_list_recent')
next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', post_action_redirect)))
next = request.POST.get(
'next',
request.GET.get(
'next', request.META.get('HTTP_REFERER', post_action_redirect)
)
)
if request.method == 'POST':
form = AddMetadataForm(data=request.POST, document_type=document.document_type)
form = AddMetadataForm(
data=request.POST, document_type=document.document_type
)
if form.is_valid():
metadata_type = form.cleaned_data['metadata_type']
for document in documents:
try:
document_metadata, created = DocumentMetadata.objects.get_or_create(document=document, metadata_type=metadata_type.metadata_type, defaults={'value': ''})
document_metadata, created = DocumentMetadata.objects.get_or_create(
document=document,
metadata_type=metadata_type.metadata_type,
defaults={'value': ''}
)
except Exception as exception:
if getattr(settings, 'DEBUG', False):
raise
else:
messages.error(request, _('Error adding metadata type "%(metadata_type)s" to document: %(document)s; %(exception)s') % {
'metadata_type': metadata_type, 'document': document, 'exception': ', '.join(getattr(exception, 'messages', exception))})
messages.error(
request,
_(
'Error adding metadata type "%(metadata_type)s" to document: %(document)s; %(exception)s'
) % {
'metadata_type': metadata_type,
'document': document,
'exception': ', '.join(getattr(exception, 'messages', exception))
}
)
else:
if created:
messages.success(request, _('Metadata type: %(metadata_type)s successfully added to document %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
messages.success(
request,
_(
'Metadata type: %(metadata_type)s successfully added to document %(document)s.'
) % {
'metadata_type': metadata_type, 'document': document
}
)
else:
messages.warning(request, _('Metadata type: %(metadata_type)s already present in document %(document)s.') % {
'metadata_type': metadata_type, 'document': document})
messages.warning(
request, _(
'Metadata type: %(metadata_type)s already present in document %(document)s.'
) % {
'metadata_type': metadata_type, 'document': document
}
)
if len(documents) == 1:
return HttpResponseRedirect('%s?%s' % (
@@ -228,30 +312,46 @@ def metadata_add(request, document_id=None, document_id_list=None):
def metadata_multiple_add(request):
return metadata_add(request, document_id_list=request.GET.get('id_list', []))
return metadata_add(
request, document_id_list=request.GET.get('id_list', [])
)
def metadata_remove(request, document_id=None, document_id_list=None):
if document_id:
document_id_list = unicode(document_id)
documents = Document.objects.select_related('metadata').filter(pk__in=document_id_list.split(','))
documents = Document.objects.select_related('metadata').filter(
pk__in=document_id_list.split(',')
)
try:
Permission.check_permissions(request.user, [permission_metadata_document_remove])
Permission.check_permissions(
request.user, [permission_metadata_document_remove]
)
except PermissionDenied:
documents = AccessControlList.objects.filter_by_access(permission_metadata_document_remove, request.user, documents)
documents = AccessControlList.objects.filter_by_access(
permission_metadata_document_remove, request.user, documents
)
if not documents:
if document_id:
raise Http404
else:
messages.error(request, _('Must provide at least one document.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
if len(set([document.document_type.pk for document in documents])) > 1:
messages.error(request, _('Only select documents of the same type.'))
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
if set(documents.values_list('metadata__value', flat=True)) == set([None]):
message = ungettext(
@@ -260,7 +360,11 @@ def metadata_remove(request, document_id=None, document_id_list=None):
len(documents)
)
messages.warning(request, message)
return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))
return HttpResponseRedirect(
request.META.get(
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
)
)
post_action_redirect = reverse('documents:document_list_recent')
@@ -413,20 +517,36 @@ class SetupDocumentTypeMetadataOptionalView(AssignRemoveView):
return get_object_or_404(DocumentType, pk=self.kwargs['pk'])
def left_list(self):
return AssignRemoveView.generate_choices(set(MetadataType.objects.all()) - set(MetadataType.objects.filter(id__in=self.get_object().metadata.values_list('metadata_type', flat=True))))
return AssignRemoveView.generate_choices(
set(MetadataType.objects.all()) - set(
MetadataType.objects.filter(
id__in=self.get_object().metadata.values_list(
'metadata_type', flat=True
)
)
)
)
def right_list(self):
return AssignRemoveView.generate_choices(self.get_object().metadata.filter(required=False))
return AssignRemoveView.generate_choices(
self.get_object().metadata.filter(required=False)
)
def remove(self, item):
item.delete()
def get_context_data(self, **kwargs):
data = super(SetupDocumentTypeMetadataOptionalView, self).get_context_data(**kwargs)
data.update({
'object': self.get_object(),
'title': _('Optional metadata types for document type: %s') % self.get_object(),
})
data = super(
SetupDocumentTypeMetadataOptionalView, self
).get_context_data(**kwargs)
data.update(
{
'object': self.get_object(),
'title': _(
'Optional metadata types for document type: %s'
) % self.get_object(),
}
)
return data
@@ -436,13 +556,21 @@ class SetupDocumentTypeMetadataRequiredView(SetupDocumentTypeMetadataOptionalVie
self.get_object().metadata.create(metadata_type=item, required=True)
def right_list(self):
return AssignRemoveView.generate_choices(self.get_object().metadata.filter(required=True))
return AssignRemoveView.generate_choices(
self.get_object().metadata.filter(required=True)
)
def get_context_data(self, **kwargs):
data = super(SetupDocumentTypeMetadataRequiredView, self).get_context_data(**kwargs)
data.update({
'object': self.get_object(),
'title': _('Required metadata types for document type: %s') % self.get_object(),
})
data = super(
SetupDocumentTypeMetadataRequiredView, self
).get_context_data(**kwargs)
data.update(
{
'object': self.get_object(),
'title': _(
'Required metadata types for document type: %s'
) % self.get_object(),
}
)
return data