Initial audit of the document index app

Add keyword arguments to calls. Sort methods and parameters.

Signed-off-by: Roberto Rosario <Roberto.Rosario.Gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2019-01-02 19:16:32 -04:00
parent 82651ff32c
commit 3dc8df46b9
12 changed files with 160 additions and 128 deletions

View File

@@ -62,7 +62,7 @@ class APIIndexNodeInstanceDocumentListView(generics.ListAPIView):
def get_queryset(self):
index_node_instance = get_object_or_404(
klass=IndexInstanceNode, pk=self.kwargs['pk']
klass=IndexInstanceNode, pk=self.kwargs['index_instance_node_pk']
)
AccessControlList.objects.check_access(
permissions=permission_document_indexing_view,
@@ -109,7 +109,7 @@ class APIDocumentIndexListView(generics.ListAPIView):
serializer_class = IndexInstanceNodeSerializer
def get_queryset(self):
document = get_object_or_404(klass=Document, pk=self.kwargs['pk'])
document = get_object_or_404(klass=Document, pk=self.kwargs['document_pk'])
AccessControlList.objects.check_access(
permissions=permission_document_view, user=self.request.user,
obj=document

View File

@@ -65,12 +65,14 @@ class DocumentIndexingApp(MayanAppConfig):
app_label='documents', model_name='DocumentType'
)
DocumentIndexInstanceNode = self.get_model('DocumentIndexInstanceNode')
DocumentIndexInstanceNode = self.get_model(
model_name='DocumentIndexInstanceNode'
)
Index = self.get_model('Index')
IndexInstance = self.get_model('IndexInstance')
IndexInstanceNode = self.get_model('IndexInstanceNode')
IndexTemplateNode = self.get_model('IndexTemplateNode')
Index = self.get_model(model_name='Index')
IndexInstance = self.get_model(model_name='IndexInstance')
IndexInstanceNode = self.get_model(model_name='IndexInstanceNode')
IndexTemplateNode = self.get_model(model_name='IndexTemplateNode')
ModelPermission.register(
model=Index, permissions=(

View File

@@ -23,8 +23,9 @@ class IndexListForm(forms.Form):
user = kwargs.pop('user')
super(IndexListForm, self).__init__(*args, **kwargs)
queryset = AccessControlList.objects.filter_by_access(
permission=permission_document_indexing_rebuild, user=user,
queryset=Index.objects.filter(enabled=True)
permission=permission_document_indexing_rebuild,
queryset=Index.objects.filter(enabled=True),
user=user
)
self.fields['indexes'].queryset = queryset

View File

@@ -15,7 +15,7 @@ class IndexManager(models.Manager):
return self.get(slug=slug)
def index_document(self, document):
for index in self.filter(enabled=True, document_types=document.document_type):
for index in self.filter(document_types=document.document_type, enabled=True):
index.index_document(document=document)
def rebuild(self):

View File

@@ -65,8 +65,8 @@ class Index(models.Model):
def get_absolute_url(self):
try:
return reverse(
'indexing:index_instance_node_view',
args=(self.instance_root.pk,)
viewname='indexing:index_instance_node_view',
kwargs={'index_instance_node_pk': self.instance_root.pk}
)
except IndexInstanceNode.DoesNotExist:
return '#'
@@ -190,24 +190,19 @@ class IndexTemplateNode(MPTTModel):
'Enter a template to render. '
'Use Django\'s default templating language '
'(https://docs.djangoproject.com/en/1.11/ref/templates/builtins/)'
),
verbose_name=_('Indexing expression')
), verbose_name=_('Indexing expression')
)
enabled = models.BooleanField(
default=True,
help_text=_(
default=True, help_text=_(
'Causes this node to be visible and updated when document data '
'changes.'
),
verbose_name=_('Enabled')
), verbose_name=_('Enabled')
)
link_documents = models.BooleanField(
default=False,
help_text=_(
default=False, help_text=_(
'Check this option to have this node act as a container for '
'documents and not as a parent for further nodes.'
),
verbose_name=_('Link documents')
), verbose_name=_('Link documents')
)
class Meta:
@@ -216,7 +211,7 @@ class IndexTemplateNode(MPTTModel):
def __str__(self):
if self.is_root_node():
return ugettext('Root')
return ugettext(message='Root')
else:
return self.expression
@@ -250,7 +245,7 @@ class IndexTemplateNode(MPTTModel):
for child in self.get_children():
child.index_document(
document=document, acquire_lock=False,
acquire_lock=False, document=document,
index_instance_node_parent=index_instance_root_node
)
elif self.enabled:
@@ -267,7 +262,7 @@ class IndexTemplateNode(MPTTModel):
try:
context = {'document': document}
template = Template(self.expression)
template = Template(source=self.expression)
result = template.render(**context)
except Exception as exception:
logger.debug('Evaluating error: %s', exception)
@@ -294,7 +289,7 @@ class IndexTemplateNode(MPTTModel):
for child in self.get_children():
child.index_document(
document=document, acquire_lock=False,
acquire_lock=False, document=document,
index_instance_node_parent=index_instance_node
)
finally:
@@ -341,7 +336,7 @@ class IndexInstanceNode(MPTTModel):
# Prevent another process to delete this node.
try:
lock = locking_backend.acquire_lock(
self.index_template_node.get_lock_string()
name=self.index_template_node.get_lock_string()
)
except LockError:
raise
@@ -359,7 +354,10 @@ class IndexInstanceNode(MPTTModel):
lock.release()
def get_absolute_url(self):
return reverse('indexing:index_instance_node_view', args=(self.pk,))
return reverse(
viewname='indexing:index_instance_node_view',
kwargs={'index_instance_node_pk': self.pk}
)
def get_children_count(self):
return self.get_children().count()
@@ -369,28 +367,29 @@ class IndexInstanceNode(MPTTModel):
def get_descendants_document_count(self, user):
return AccessControlList.objects.filter_by_access(
permission=permission_document_view, user=user,
permission=permission_document_view,
queryset=Document.objects.filter(
index_instance_nodes__in=self.get_descendants(
include_self=True
)
)
), user=user
).count()
def get_full_path(self):
result = []
for node in self.get_ancestors(include_self=True):
if node.is_root_node():
result.append(force_text(self.index()))
result.append(force_text(s=self.index()))
else:
result.append(force_text(node))
result.append(force_text(s=node))
return ' / '.join(result)
def get_item_count(self, user):
if self.index_template_node.link_documents:
queryset = AccessControlList.objects.filter_by_access(
permission_document_view, user, queryset=self.documents
permission=permission_document_view, queryset=self.documents,
user=user
)
return queryset.count()
@@ -417,7 +416,7 @@ class IndexInstanceNode(MPTTModel):
# parent template node for the lock
try:
lock = locking_backend.acquire_lock(
self.index_template_node.get_lock_string()
name=self.index_template_node.get_lock_string()
)
except LockError:
raise

View File

@@ -7,21 +7,21 @@ from mayan.apps.permissions import PermissionNamespace
namespace = PermissionNamespace(label=_('Indexing'), name='document_indexing')
permission_document_indexing_create = namespace.add_permission(
name='document_index_create', label=_('Create new document indexes')
label=_('Create new document indexes'), name='document_index_create'
)
permission_document_indexing_edit = namespace.add_permission(
name='document_index_edit', label=_('Edit document indexes')
label=_('Edit document indexes'), name='document_index_edit'
)
permission_document_indexing_delete = namespace.add_permission(
name='document_index_delete', label=_('Delete document indexes')
label=_('Delete document indexes'), name='document_index_delete'
)
permission_document_indexing_instance_view = namespace.add_permission(
name='document_index_instance_view',
label=_('View document index instances')
label=_('View document index instances'),
name='document_index_instance_view'
)
permission_document_indexing_view = namespace.add_permission(
name='document_index_view', label=_('View document indexes')
label=_('View document indexes'), name='document_index_view'
)
permission_document_indexing_rebuild = namespace.add_permission(
name='document_rebuild_indexes', label=_('Rebuild document indexes')
label=_('Rebuild document indexes'), name='document_rebuild_indexes'
)

View File

@@ -5,21 +5,21 @@ from django.utils.translation import ugettext_lazy as _
from mayan.apps.common.queues import queue_tools
from mayan.apps.task_manager.classes import CeleryQueue
queue_indexing = CeleryQueue(name='indexing', label=_('Indexing'))
queue_indexing = CeleryQueue(label=_('Indexing'), name='indexing')
queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_delete_empty',
label=_('Delete empty index nodes')
label=_('Delete empty index nodes'),
name='mayan.apps.document_indexing.tasks.task_delete_empty'
)
queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_remove_document',
label=_('Remove document')
label=_('Remove document'),
name='mayan.apps.document_indexing.tasks.task_remove_document'
)
queue_indexing.add_task_type(
name='mayan.apps.document_indexing.tasks.task_index_document',
label=_('Index document')
label=_('Index document'),
name='mayan.apps.document_indexing.tasks.task_index_document'
)
queue_tools.add_task_type(
name='mayan.apps.document_indexing.tasks.task_rebuild_index',
label=_('Rebuild index')
label=_('Rebuild index'),
name='mayan.apps.document_indexing.tasks.task_rebuild_index'
)

View File

@@ -92,7 +92,7 @@ class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
document = self.upload_document()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[instance.value for instance in IndexInstanceNode.objects.all().order_by('index_instance_node_pk')],
[
'', force_text(document.date_added.year),
force_text(document.date_added.month).zfill(2)
@@ -100,7 +100,7 @@ class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
)
self.assertTrue(
document in list(IndexInstanceNode.objects.order_by('pk').last().documents.all())
document in list(IndexInstanceNode.objects.order_by('index_instance_node_pk').last().documents.all())
)
def test_dual_level_dual_document_index(self):
@@ -131,7 +131,7 @@ class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
Index.objects.rebuild()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[instance.value for instance in IndexInstanceNode.objects.all().order_by('index_instance_node_pk')],
[
'', force_text(self.document_2.uuid), self.document_2.label,
force_text(self.document.uuid), self.document.label

View File

@@ -45,7 +45,10 @@ class IndexViewTestCase(GenericDocumentViewTestCase):
self.assertEqual(Index.objects.first().label, TEST_INDEX_LABEL)
def _request_index_delete_view(self, index):
return self.post('indexing:index_setup_delete', args=(index.pk,))
return self.post(
viewname='indexing:index_setup_delete',
kwargs={'index_pk': index.pk}
)
def test_index_delete_view_no_permission(self):
index = Index.objects.create(
@@ -72,7 +75,9 @@ class IndexViewTestCase(GenericDocumentViewTestCase):
def _request_index_edit_view(self, index):
return self.post(
'indexing:index_setup_edit', args=(index.pk,), data={
viewname='indexing:index_setup_edit', kwargs={
'index_pk': index.pk
}, data={
'label': TEST_INDEX_LABEL_EDITED, 'slug': TEST_INDEX_SLUG
}
)
@@ -122,7 +127,8 @@ class IndexViewTestCase(GenericDocumentViewTestCase):
def _request_index_instance_node_view(self, index_instance_node):
return self.get(
'indexing:index_instance_node_view', args=(index_instance_node.pk,)
viewname='indexing:index_instance_node_view',
kwargs={'index_instance_node_pk': index_instance_node.pk}
)
def test_index_instance_node_view_no_permission(self):
@@ -146,7 +152,9 @@ class IndexViewTestCase(GenericDocumentViewTestCase):
index_instance_node=self.index.instance_root
)
self.assertContains(response, text=TEST_INDEX_LABEL, status_code=200)
self.assertContains(
response=response, text=TEST_INDEX_LABEL, status_code=200
)
def _request_index_rebuild_get_view(self):
return self.get(

View File

@@ -17,80 +17,86 @@ from .views import (
urlpatterns = [
url(
r'^setup/index/list/$', SetupIndexListView.as_view(),
name='index_setup_list'
regex=r'^indexes/$', name='index_setup_list',
view=SetupIndexListView.as_view()
),
url(
r'^setup/index/create/$', SetupIndexCreateView.as_view(),
name='index_setup_create'
regex=r'^indexes/create/$', name='index_setup_create',
view=SetupIndexCreateView.as_view()
),
url(
r'^setup/index/(?P<pk>\d+)/edit/$', SetupIndexEditView.as_view(),
name='index_setup_edit'
regex=r'^indexes/(?P<index_pk>\d+)/delete/$',
name='index_setup_delete', view=SetupIndexDeleteView.as_view()
),
url(
r'^setup/index/(?P<pk>\d+)/delete/$', SetupIndexDeleteView.as_view(),
name='index_setup_delete'
regex=r'^indexes/(?P<index_pk>\d+)/edit/$',
name='index_setup_edit', view=SetupIndexEditView.as_view()
),
url(
r'^setup/index/(?P<pk>\d+)/template/$',
SetupIndexTreeTemplateListView.as_view(), name='index_setup_view'
regex=r'^indexes/(?P<index_pk>\d+)/templates/$',
name='index_setup_view', view=SetupIndexTreeTemplateListView.as_view()
),
url(
r'^setup/index/(?P<pk>\d+)/document_types/$',
SetupIndexDocumentTypesView.as_view(),
name='index_setup_document_types'
regex=r'^indexes/(?P<index_pk>\d+)/document_types/$',
name='index_setup_document_types',
view=SetupIndexDocumentTypesView.as_view()
),
url(
r'^setup/template/node/(?P<pk>\d+)/create/child/$',
TemplateNodeCreateView.as_view(), name='template_node_create'
regex=r'^indexes/templates/nodes/(?P<index_template_node_pk>\d+)/create/child/$',
name='template_node_create', view=TemplateNodeCreateView.as_view()
),
url(
r'^setup/template/node/(?P<pk>\d+)/edit/$',
TemplateNodeEditView.as_view(), name='template_node_edit'
regex=r'^indexes/templates/nodes/(?P<index_template_node_pk>\d+)/edit/$',
name='template_node_edit', view=TemplateNodeEditView.as_view()
),
url(
r'^setup/template/node/(?P<pk>\d+)/delete/$',
TemplateNodeDeleteView.as_view(), name='template_node_delete'
regex=r'^indexes/templates/nodes/(?P<index_template_node_pk>\d+)/delete/$',
name='template_node_delete', view=TemplateNodeDeleteView.as_view()
),
url(r'^index/list/$', IndexListView.as_view(), name='index_list'),
url(
r'^instance/node/(?P<pk>\d+)/$', IndexInstanceNodeView.as_view(),
name='index_instance_node_view'
regex=r'^indexes/instances/list/$', name='index_list',
view=IndexListView.as_view()
),
url(
regex=r'^indexes/instances/node/(?P<index_instance_node_pk>\d+)/$',
name='index_instance_node_view', view=IndexInstanceNodeView.as_view()
),
url(
r'^rebuild/all/$', RebuildIndexesView.as_view(),
name='rebuild_index_instances'
regex=r'^indexes/rebuild/$', name='rebuild_index_instances',
view=RebuildIndexesView.as_view()
),
url(
r'^list/for/document/(?P<pk>\d+)/$',
DocumentIndexNodeListView.as_view(), name='document_index_list'
regex=r'^documents/(?P<document_pk>\d+)/indexes/$',
name='document_index_list', view=DocumentIndexNodeListView.as_view()
),
]
api_urls = [
url(
r'^indexes/node/(?P<pk>[0-9]+)/documents/$',
APIIndexNodeInstanceDocumentListView.as_view(),
name='index-node-documents'
regex=r'^indexes/nodes/(?P<index_instance_node_pk>[0-9]+)/documents/$',
name='index-node-documents',
view=APIIndexNodeInstanceDocumentListView.as_view(),
),
url(
r'^indexes/template/(?P<pk>[0-9]+)/$', APIIndexTemplateView.as_view(),
name='index-template-detail'
regex=r'^indexes/templates/(?P<index_template_node_pk>[0-9]+)/$',
name='index-template-detail', view=APIIndexTemplateView.as_view()
),
url(
r'^indexes/(?P<pk>[0-9]+)/$', APIIndexView.as_view(),
name='index-detail'
regex=r'^indexes/(?P<index_pk>\d+)/$', name='index-detail',
view=APIIndexView.as_view()
),
url(
r'^indexes/(?P<pk>[0-9]+)/template/$',
APIIndexTemplateListView.as_view(), name='index-template-detail'
regex=r'^indexes/(?P<index_pk>\d+)/templates/$',
name='index-template-detail', view=APIIndexTemplateListView.as_view()
),
url(r'^indexes/$', APIIndexListView.as_view(), name='index-list'),
url(
r'^documents/(?P<pk>[0-9]+)/indexes/$',
APIDocumentIndexListView.as_view(), name='document-index-list'
regex=r'^indexes/$', name='index-list',
view=APIIndexListView.as_view()
),
url(
regex=r'^documents/(?P<document_pk>\d+)/indexes/$',
name='document-index-list',
view=APIDocumentIndexListView.as_view()
),
]

View File

@@ -39,14 +39,15 @@ class SetupIndexCreateView(SingleObjectCreateView):
extra_context = {'title': _('Create index')}
fields = ('label', 'slug', 'enabled')
model = Index
post_action_redirect = reverse_lazy('indexing:index_setup_list')
post_action_redirect = reverse_lazy(viewname='indexing:index_setup_list')
view_permission = permission_document_indexing_create
class SetupIndexDeleteView(SingleObjectDeleteView):
model = Index
post_action_redirect = reverse_lazy('indexing:index_setup_list')
object_permission = permission_document_indexing_delete
pk_url_kwarg = 'index_pk'
post_action_redirect = reverse_lazy(viewname='indexing:index_setup_list')
def get_extra_context(self):
return {
@@ -58,8 +59,9 @@ 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
pk_url_kwarg = 'index_pk'
post_action_redirect = reverse_lazy(viewname='indexing:index_setup_list')
def get_extra_context(self):
return {
@@ -101,25 +103,25 @@ class SetupIndexDocumentTypesView(AssignRemoveView):
def get_document_queryset(self):
return AccessControlList.objects.filter_by_access(
permission_document_view, self.request.user,
queryset=DocumentType.objects.all()
permission_document_view, queryset=DocumentType.objects.all(),
user=self.request.user
)
def get_extra_context(self):
return {
'object': self.get_object(),
'title': _(
'Document types linked to index: %s'
) % self.get_object(),
'subtitle': _(
'Only the documents of the types selected will be shown '
'in the index when built. Only the events of the documents '
'of the types select will trigger updates in the index.'
),
'title': _(
'Document types linked to index: %s'
) % self.get_object()
}
def get_object(self):
return get_object_or_404(klass=Index, pk=self.kwargs['pk'])
return get_object_or_404(klass=Index, pk=self.kwargs['index_pk'])
def left_list(self):
return AssignRemoveView.generate_choices(
@@ -133,7 +135,7 @@ class SetupIndexDocumentTypesView(AssignRemoveView):
def right_list(self):
return AssignRemoveView.generate_choices(
self.get_document_queryset() & self.get_object().document_types.all()
choices=self.get_document_queryset() & self.get_object().document_types.all()
)
@@ -149,7 +151,7 @@ class SetupIndexTreeTemplateListView(SingleObjectListView):
}
def get_index(self):
return get_object_or_404(klass=Index, pk=self.kwargs['pk'])
return get_object_or_404(klass=Index, pk=self.kwargs['index_pk'])
def get_object_list(self):
return self.get_index().template_root.get_descendants(
@@ -163,13 +165,13 @@ class TemplateNodeCreateView(SingleObjectCreateView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_document_indexing_edit, user=request.user,
obj=self.get_parent_node().index
obj=self.get_parent_node().index,
permissions=permission_document_indexing_edit, user=request.user
)
return super(
TemplateNodeCreateView, self
).dispatch(request, *args, **kwargs)
).dispatch(request=request, *args, **kwargs)
def get_extra_context(self):
return {
@@ -185,7 +187,9 @@ class TemplateNodeCreateView(SingleObjectCreateView):
}
def get_parent_node(self):
return get_object_or_404(klass=IndexTemplateNode, pk=self.kwargs['pk'])
return get_object_or_404(
klass=IndexTemplateNode, pk=self.kwargs['index_template_node_pk']
)
class TemplateNodeDeleteView(SingleObjectDeleteView):
@@ -205,7 +209,8 @@ class TemplateNodeDeleteView(SingleObjectDeleteView):
def get_post_action_redirect(self):
return reverse(
'indexing:index_setup_view', args=(self.get_object().index.pk,)
viewname='indexing:index_setup_view',
kwargs={'index_pk': self.get_object().index.pk}
)
@@ -227,7 +232,8 @@ class TemplateNodeEditView(SingleObjectEditView):
def get_post_action_redirect(self):
return reverse(
'indexing:index_setup_view', args=(self.get_object().index.pk,)
viewname='indexing:index_setup_view',
kwargs={'index_pk': self.get_object().index.pk}
)
@@ -252,7 +258,9 @@ class IndexListView(SingleObjectListView):
def get_object_list(self):
queryset = IndexInstance.objects.filter(enabled=True)
return queryset.filter(node_templates__index_instance_nodes__isnull=False).distinct()
return queryset.filter(
node_templates__index_instance_nodes__isnull=False
).distinct()
class IndexInstanceNodeView(DocumentListView):
@@ -260,21 +268,24 @@ class IndexInstanceNodeView(DocumentListView):
def dispatch(self, request, *args, **kwargs):
self.index_instance_node = get_object_or_404(
klass=IndexInstanceNode, pk=self.kwargs['pk']
klass=IndexInstanceNode, pk=self.kwargs['index_instance_node_pk']
)
AccessControlList.objects.check_access(
obj=self.index_instance_node.index(),
permissions=permission_document_indexing_instance_view,
user=request.user, obj=self.index_instance_node.index()
user=request.user
)
if self.index_instance_node:
if self.index_instance_node.index_template_node.link_documents:
return super(IndexInstanceNodeView, self).dispatch(
request, *args, **kwargs
request=request, *args, **kwargs
)
return SingleObjectListView.dispatch(self, request, *args, **kwargs)
return SingleObjectListView.dispatch(
self, request=request, *args, **kwargs
)
def get_document_queryset(self):
if self.index_instance_node:
@@ -331,16 +342,18 @@ class DocumentIndexNodeListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user,
obj=self.get_document()
obj=self.get_document(), permissions=permission_document_view,
user=request.user
)
return super(
DocumentIndexNodeListView, self
).dispatch(request, *args, **kwargs)
).dispatch(request=request, *args, **kwargs)
def get_document(self):
return get_object_or_404(klass=Document, pk=self.kwargs['pk'])
return get_object_or_404(
klass=Document, pk=self.kwargs['document_pk']
)
def get_extra_context(self):
return {
@@ -381,7 +394,7 @@ class RebuildIndexesView(FormView):
count += 1
messages.success(
self.request, ungettext(
request=self.request, message=ungettext(
singular='%(count)d index queued for rebuild.',
plural='%(count)d indexes queued for rebuild.',
number=count
@@ -398,4 +411,4 @@ class RebuildIndexesView(FormView):
}
def get_post_action_redirect(self):
return reverse('common:tools_list')
return reverse(viewname='common:tools_list')

View File

@@ -12,7 +12,7 @@ def get_instance_link(index_instance_node):
Return an HTML anchor to an index node instance
"""
return mark_safe(
'<a href="{url}">{text}</a>'.format(
s='<a href="{url}">{text}</a>'.format(
url=index_instance_node.get_absolute_url(),
text=escape(index_instance_node.get_full_path())
)
@@ -20,6 +20,7 @@ def get_instance_link(index_instance_node):
def index_instance_item_link(index_instance_item):
#TODO: Replace with a file template
IndexInstanceNode = apps.get_model(
app_label='document_indexing', model_name='IndexInstanceNode'
)
@@ -33,7 +34,7 @@ def index_instance_item_link(index_instance_item):
icon = ''
return mark_safe(
'%(icon)s&nbsp;<a href="%(url)s">%(text)s</a>' % {
s='%(icon)s&nbsp;<a href="%(url)s">%(text)s</a>' % {
'url': index_instance_item.get_absolute_url(),
'icon': icon,
'text': index_instance_item
@@ -45,8 +46,9 @@ def node_level(node):
"""
Render an indented tree like output for a specific node
"""
#TODO: Replace with a file template
return mark_safe(
''.join(
s=''.join(
[
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' * node.get_level(),
'' if node.is_root_node() else icon_index_level_up.render(),
@@ -57,6 +59,7 @@ def node_level(node):
def node_tree(node, user):
#TODO: Replace with a file template
result = []
result.append('<div class="list-group">')
@@ -84,4 +87,4 @@ def node_tree(node, user):
result.append('</div>')
return mark_safe(''.join(result))
return mark_safe(s=''.join(result))