Add ACLs to document indexes. Convert all document indexing views to CBV. Remove the document index setup permission. Add view tests to the document indexing app. Use MPTT methods and stop relying on undocumented API.
This commit is contained in:
@@ -26,9 +26,8 @@ from .models import (
|
||||
)
|
||||
from .permissions import (
|
||||
permission_document_indexing_create, permission_document_indexing_delete,
|
||||
permission_document_indexing_edit,
|
||||
permission_document_indexing_rebuild_indexes,
|
||||
permission_document_indexing_setup, permission_document_indexing_view
|
||||
permission_document_indexing_edit, permission_document_indexing_rebuild,
|
||||
permission_document_indexing_view
|
||||
)
|
||||
from .tasks import task_do_rebuild_all_indexes
|
||||
from .widgets import node_tree
|
||||
@@ -43,34 +42,10 @@ class SetupIndexCreateView(SingleObjectCreateView):
|
||||
view_permission = permission_document_indexing_create
|
||||
|
||||
|
||||
class SetupIndexListView(SingleObjectListView):
|
||||
model = Index
|
||||
view_permission = permission_document_indexing_setup
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'hide_object': True,
|
||||
'title': _('Indexes'),
|
||||
}
|
||||
|
||||
|
||||
class SetupIndexEditView(SingleObjectEditView):
|
||||
fields = ('label', 'slug', 'enabled')
|
||||
model = Index
|
||||
post_action_redirect = reverse_lazy('indexing:index_setup_list')
|
||||
view_permission = permission_document_indexing_edit
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'object': self.get_object(),
|
||||
'title': _('Edit index: %s') % self.get_object(),
|
||||
}
|
||||
|
||||
|
||||
class SetupIndexDeleteView(SingleObjectDeleteView):
|
||||
model = Index
|
||||
post_action_redirect = reverse_lazy('indexing:index_setup_list')
|
||||
view_permission = permission_document_indexing_delete
|
||||
object_permission = permission_document_indexing_delete
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
@@ -79,8 +54,82 @@ class SetupIndexDeleteView(SingleObjectDeleteView):
|
||||
}
|
||||
|
||||
|
||||
class SetupIndexEditView(SingleObjectEditView):
|
||||
fields = ('label', 'slug', 'enabled')
|
||||
model = Index
|
||||
post_action_redirect = reverse_lazy('indexing:index_setup_list')
|
||||
object_permission = permission_document_indexing_edit
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'object': self.get_object(),
|
||||
'title': _('Edit index: %s') % self.get_object(),
|
||||
}
|
||||
|
||||
|
||||
class SetupIndexListView(SingleObjectListView):
|
||||
model = Index
|
||||
object_permission = permission_document_indexing_view
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'hide_object': True,
|
||||
'title': _('Indexes'),
|
||||
}
|
||||
|
||||
|
||||
class SetupIndexDocumentTypesView(AssignRemoveView):
|
||||
decode_content_type = True
|
||||
left_list_title = _('Available document types')
|
||||
object_permission = permission_document_indexing_edit
|
||||
right_list_title = _('Document types linked')
|
||||
|
||||
def add(self, item):
|
||||
self.get_object().document_types.add(item)
|
||||
|
||||
def get_document_queryset(self):
|
||||
queryset = DocumentType.objects.all()
|
||||
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
self.request.user, (permission_document_view,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
queryset = AccessControlList.objects.filter_by_access(
|
||||
permission_document_view, self.request.user, queryset
|
||||
)
|
||||
|
||||
return queryset
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'object': self.get_object(),
|
||||
'title': _(
|
||||
'Document types linked to index: %s'
|
||||
) % self.get_object()
|
||||
}
|
||||
|
||||
def get_object(self):
|
||||
return get_object_or_404(Index, pk=self.kwargs['pk'])
|
||||
|
||||
def left_list(self):
|
||||
return AssignRemoveView.generate_choices(
|
||||
self.get_document_queryset().exclude(
|
||||
id__in=self.get_object().document_types.all()
|
||||
)
|
||||
)
|
||||
|
||||
def remove(self, item):
|
||||
self.get_object().document_types.remove(item)
|
||||
|
||||
def right_list(self):
|
||||
return AssignRemoveView.generate_choices(
|
||||
self.get_document_queryset() & self.get_object().document_types.all()
|
||||
)
|
||||
|
||||
|
||||
class SetupIndexTreeTemplateListView(SingleObjectListView):
|
||||
view_permission = permission_document_indexing_setup
|
||||
object_permission = permission_document_indexing_edit
|
||||
|
||||
def get_index(self):
|
||||
return get_object_or_404(Index, pk=self.kwargs['pk'])
|
||||
@@ -98,116 +147,46 @@ class SetupIndexTreeTemplateListView(SingleObjectListView):
|
||||
'title': _('Tree template nodes for index: %s') % self.get_index(),
|
||||
}
|
||||
|
||||
class TemplateNodeCreateView(SingleObjectCreateView):
|
||||
form_class = IndexTemplateNodeForm
|
||||
model = IndexTemplateNode
|
||||
|
||||
class SetupIndexDocumentTypesView(AssignRemoveView):
|
||||
decode_content_type = True
|
||||
object_permission = permission_document_indexing_edit
|
||||
left_list_title = _('Available document types')
|
||||
right_list_title = _('Document types linked')
|
||||
|
||||
def add(self, item):
|
||||
self.get_object().document_types.add(item)
|
||||
|
||||
def get_object(self):
|
||||
return get_object_or_404(Index, pk=self.kwargs['pk'])
|
||||
|
||||
def left_list(self):
|
||||
return AssignRemoveView.generate_choices(
|
||||
DocumentType.objects.exclude(
|
||||
pk__in=self.get_object().document_types.all()
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
request.user, (permission_document_indexing_edit,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_document_indexing_edit, request.user,
|
||||
self.get_parent_node().index
|
||||
)
|
||||
)
|
||||
|
||||
def right_list(self):
|
||||
return AssignRemoveView.generate_choices(
|
||||
self.get_object().document_types.all()
|
||||
)
|
||||
|
||||
def remove(self, item):
|
||||
self.get_object().document_types.remove(item)
|
||||
return super(
|
||||
TemplateNodeCreateView, self
|
||||
).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'object': self.get_object(),
|
||||
'title': _(
|
||||
'Document types linked to index: %s'
|
||||
) % self.get_object()
|
||||
'index': self.get_parent_node().index,
|
||||
'navigation_object_list': ('index',),
|
||||
'title': _('Create child node of: %s') % self.get_parent_node(),
|
||||
}
|
||||
|
||||
def get_initial(self):
|
||||
parent_node = self.get_parent_node()
|
||||
return {
|
||||
'index': parent_node.index, 'parent': parent_node
|
||||
}
|
||||
|
||||
# Node views
|
||||
def template_node_create(request, parent_pk):
|
||||
parent_node = get_object_or_404(IndexTemplateNode, pk=parent_pk)
|
||||
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
request.user, (permission_document_indexing_edit,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_document_indexing_edit, request.user, parent_node.index
|
||||
)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = IndexTemplateNodeForm(request.POST)
|
||||
if form.is_valid():
|
||||
node = form.save()
|
||||
messages.success(
|
||||
request, _('Index template node created successfully.')
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse('indexing:index_setup_view', args=(node.index.pk,))
|
||||
)
|
||||
else:
|
||||
form = IndexTemplateNodeForm(
|
||||
initial={'index': parent_node.index, 'parent': parent_node}
|
||||
)
|
||||
|
||||
return render_to_response('appearance/generic_form.html', {
|
||||
'form': form,
|
||||
'index': parent_node.index,
|
||||
'navigation_object_list': ('index',),
|
||||
'title': _('Create child node'),
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def template_node_edit(request, node_pk):
|
||||
node = get_object_or_404(IndexTemplateNode, pk=node_pk)
|
||||
|
||||
try:
|
||||
Permission.check_permissions(
|
||||
request.user, (permission_document_indexing_edit,)
|
||||
)
|
||||
except PermissionDenied:
|
||||
AccessControlList.objects.check_access(
|
||||
permission_document_indexing_edit, request.user, node.index
|
||||
)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = IndexTemplateNodeForm(request.POST, instance=node)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(
|
||||
request, _('Index template node edited successfully')
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse('indexing:index_setup_view', args=(node.index.pk,))
|
||||
)
|
||||
else:
|
||||
form = IndexTemplateNodeForm(instance=node)
|
||||
|
||||
return render_to_response('appearance/generic_form.html', {
|
||||
'form': form,
|
||||
'index': node.index,
|
||||
'navigation_object_list': ('index', 'node'),
|
||||
'node': node,
|
||||
'title': _('Edit index template node: %s') % node,
|
||||
}, context_instance=RequestContext(request))
|
||||
def get_parent_node(self):
|
||||
return get_object_or_404(IndexTemplateNode, pk=self.kwargs['pk'])
|
||||
|
||||
|
||||
class TemplateNodeDeleteView(SingleObjectDeleteView):
|
||||
model = IndexTemplateNode
|
||||
view_permission = permission_document_indexing_edit
|
||||
object_permission = permission_document_indexing_edit
|
||||
object_permission_related = 'index'
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
@@ -225,6 +204,28 @@ class TemplateNodeDeleteView(SingleObjectDeleteView):
|
||||
)
|
||||
|
||||
|
||||
class TemplateNodeEditView(SingleObjectEditView):
|
||||
form_class = IndexTemplateNodeForm
|
||||
model = IndexTemplateNode
|
||||
object_permission = permission_document_indexing_edit
|
||||
object_permission_related = 'index'
|
||||
|
||||
def get_extra_context(self):
|
||||
return {
|
||||
'index': self.get_object().index,
|
||||
'navigation_object_list': ('index', 'node'),
|
||||
'node': self.get_object(),
|
||||
'title': _(
|
||||
'Edit the index template node: %s?'
|
||||
) % self.get_object(),
|
||||
}
|
||||
|
||||
def get_post_action_redirect(self):
|
||||
return reverse(
|
||||
'indexing:index_setup_view', args=(self.get_object().index.pk,)
|
||||
)
|
||||
|
||||
|
||||
class IndexListView(SingleObjectListView):
|
||||
object_permission = permission_document_indexing_view
|
||||
queryset = IndexInstance.objects.filter(enabled=True)
|
||||
@@ -341,7 +342,7 @@ class RebuildIndexesConfirmView(ConfirmView):
|
||||
'message': _('On large databases this operation may take some time to execute.'),
|
||||
'title': _('Rebuild all indexes?'),
|
||||
}
|
||||
view_permission = permission_document_indexing_rebuild_indexes
|
||||
view_permission = permission_document_indexing_rebuild
|
||||
|
||||
def get_post_action_redirect(self):
|
||||
return reverse('common:tools_list')
|
||||
|
||||
Reference in New Issue
Block a user