[silva.core.references][Sylvain Viollon] Display broken referenc...

[email protected] Fri, 25 Oct 2013 18:02:46 +0200
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Sylvain Viollon
date:      Fri Oct 25 18:02:44 2013 +0200
revision:  312:8e36120497df in silva.core.references
branch:    2.4
details:   https://hg.infrae.com/silva.core.references?cmd=changeset;node=8e36120497df
modified:  src/silva/core/references/service.py src/silva/core/references/service_templates/listbrokenreference.pt src/silva/core/references/service_templates/smilistbrokenreference.cpt src/silva/core/references/service_templates/zmilistbrokenreference.pt
added:     src/silva/core/references/service_templates/smilistbrokenreference.cpt src/silva/core/references/service_templates/zmilistbrokenreference.pt
removed:   src/silva/core/references/service_templates/listbrokenreference.pt
log:       Display broken references inside the SMI with a batch and an icon
	(the UI could still be improved).


diffstat:

 src/silva/core/references/service.py                                   |  64 ++++++++-
 src/silva/core/references/service_templates/listbrokenreference.pt     |  42 ------
 src/silva/core/references/service_templates/smilistbrokenreference.cpt |  37 +++++
 src/silva/core/references/service_templates/zmilistbrokenreference.pt  |  58 +++++++++
 4 files changed, 152 insertions(+), 49 deletions(-)

diffs (266 lines):

diff -r cc4ec4c6240c -r 8e36120497df src/silva/core/references/service.py
--- a/src/silva/core/references/service.py	Mon Sep 02 11:38:25 2013 +0200
+++ b/src/silva/core/references/service.py	Fri Oct 25 18:02:44 2013 +0200
@@ -2,16 +2,22 @@
 # Copyright (c) 2010-2013 Infrae. All rights reserved.
 # See also LICENSE.txt
 
+import uuid
+
 from OFS.interfaces import IItem
 from dolmen.relations.catalog import RelationCatalog
 from dolmen.relations.container import RelationsContainer
 from five import grok
 from zc.relation.interfaces import ICatalog
 from zc.relation.queryfactory import TransposingTransitive
-from zope import component
+from zeam.utils import batch
+from zope.component import getMultiAdapter, queryUtility
 from zope.lifecycleevent.interfaces import IObjectCopiedEvent
-import uuid
 
+from silva.core.interfaces import IIconResolver
+from silva.translations import translate as _
+from silva.ui import rest
+from silva.core.interfaces import ISilvaConfigurableService, IVersion
 from silva.core import conf as silvaconf
 from silva.core.references.interfaces import (
     IReferenceService, IReferenceValue, IReferenceGrapher)
@@ -35,7 +41,7 @@
     """
     meta_type = 'Silva Reference Service'
     grok.name('service_reference')
-    grok.implements(IReferenceService)
+    grok.implements(IReferenceService, ISilvaConfigurableService)
     silvaconf.default_service(setup=configure_service)
     silvaconf.icon('service.png')
 
@@ -169,7 +175,8 @@
                 factory=reference.__class__)
 
 
-class ListBrokenReference(silvaviews.ZMIView):
+class ZMIListBrokenReference(silvaviews.ZMIView):
+    grok.context(ReferenceService)
     grok.name('manage_brokenreferences')
 
     def update(self):
@@ -179,6 +186,50 @@
                 {'source_id': 0}))
 
 
+class SMIBrokenReference(object):
+
+    def __init__(self, page, reference, content):
+        if IVersion.providedBy(content):
+            self.content = content.get_silva_object()
+            self.title = u'{} (version {})'.format(
+                self.content.get_title_or_id(),
+                content.getId())
+        else:
+            self.content = content
+            self.title = self.content.get_title_or_id()
+        self.icon = page.get_icon(self.content)
+        self.path = page.get_content_path(self.content)
+        self.tags = reference.tags
+
+
+class SMIListBrokenReference(rest.PageWithTemplateREST):
+    grok.adapts(rest.Screen, ReferenceService)
+    grok.name('admin')
+    grok.require('zope2.ViewManagementScreens')
+
+    def get_menu_title(self):
+        return _("Broken references")
+
+    def update(self):
+        self.get_icon = IIconResolver(self.request).get_tag
+        self.broken_targets = batch.Batch(
+            list(self.context.catalog.findRelations({'target_id': 0})),
+            name='targets',
+            count=25,
+            factory=lambda r: SMIBrokenReference(self, r, r.source),
+            request=self.request)
+        self.targets_batch = getMultiAdapter(
+            (self, self.broken_targets, self.request), batch.IBatching)()
+        self.broken_sources = batch.Batch(
+            list(self.context.catalog.findRelations({'source_id': 0})),
+            name='sources',
+            count=25,
+            factory=lambda r: SMIBrokenReference(self, r, r.target),
+            request=self.request)
+        self.sources_batch = getMultiAdapter(
+            (self, self.broken_sources, self.request), batch.IBatching)()
+
+
 class ReferenceGraph(silvaviews.ZMIView):
     """This view create a graphivz file with all contained references.
     """
@@ -190,8 +241,7 @@
             root = root.restrictedTraverse(only_in)
 
         self.response.setHeader('Content-Type', 'text/vnd.graphviz')
-        grapher = component.getMultiAdapter(
-            (root, self.request), IReferenceGrapher)
+        grapher = getMultiAdapter((root, self.request), IReferenceGrapher)
         grapher.dot(self.response)
         return ''
 
@@ -200,7 +250,7 @@
 def clone_reference(content, event):
     """Clone object references when the object is cloned.
     """
-    service = component.queryUtility(IReferenceService)
+    service = queryUtility(IReferenceService)
     if service is not None:
         # This event is called for all content contained in
         # event.object. We need to find the corresponding original
diff -r cc4ec4c6240c -r 8e36120497df src/silva/core/references/service_templates/listbrokenreference.pt
--- a/src/silva/core/references/service_templates/listbrokenreference.pt	Mon Sep 02 11:38:25 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
-      xmlns:metal="http://xml.zope.org/namespaces/metal"
-      xmlns:tal="http://xml.zope.org/namespaces/tal"
-      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
-      metal:use-macro="context/@@standard_macros/page">
-
-  <body>
-    <div metal:fill-slot="body">
-
-      <p tal:condition="python:not(view.broken_targets or view.broken_sources)">
-        There are no broken references.
-      </p>
-
-      <div tal:condition="view/broken_targets"
-           tal:define="references view/broken_targets">
-        <p>Targets of the following reference are missing:</p>
-        <ul metal:define-macro="list_references">
-          <li tal:repeat="reference references">
-            Source
-            <a href="#"
-               tal:define="source nocall:reference/source;
-                           source_url source/absolute_url"
-               tal:attributes="href source_url"
-               tal:content="python:'/'.join(source.getPhysicalPath())">
-              Name
-            </a>
-            (details:
-            <span tal:replace="python:', '.join(reference.tags)"></span>)
-          </li>
-        </ul>
-      </div>
-
-      <div tal:condition="view/broken_sources"
-           tal:define="references view/broken_sources">
-        <p>Sources of the following reference are missing:</p>
-        <ul metal:use-macro="template/macros/list_references" />
-      </div>
-
-    </div>
-  </body>
-</html>
-
diff -r cc4ec4c6240c -r 8e36120497df src/silva/core/references/service_templates/smilistbrokenreference.cpt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silva/core/references/service_templates/smilistbrokenreference.cpt	Fri Oct 25 18:02:44 2013 +0200
@@ -0,0 +1,37 @@
+<tal:configuration i18n:domain="silva">
+  <div class="form-head">
+    <h3 i18n:translate="">
+      Broken references
+    </h3>
+
+    <p tal:condition="not(rest.broken_targets or rest.broken_sources)"
+       i18n:translate="">
+      There are no broken references.
+    </p>
+
+    <div tal:condition="rest.broken_targets"
+         tal:define="references rest.broken_targets">
+      <p i18n:translate="">The following content contains broken references:</p>
+      <ul metal:define-macro="list_references">
+        <li tal:repeat="reference references">
+          <tal:icon tal:replace="structure reference.icon" />
+          <a href="#" rel="content" class="open-screen"
+             tal:attributes="href reference.path"
+             tal:content="reference.title">
+            Name
+          </a>
+          (details:
+          <em tal:content="', '.join(reference.tags)"></em>)
+        </li>
+      </ul>
+      <tal:batch tal:content="structure rest.targets_batch" />
+    </div>
+
+    <div tal:condition="rest.broken_sources"
+         tal:define="references rest.broken_sources">
+      <p i18n:translate="">The following content are used by broken content:</p>
+      <ul metal:use-macro="path:template/macros/list_references" />
+      <tal:batch tal:content="structure rest.sources_batch" />
+    </div>
+  </div>
+</tal:configuration>
diff -r cc4ec4c6240c -r 8e36120497df src/silva/core/references/service_templates/zmilistbrokenreference.pt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silva/core/references/service_templates/zmilistbrokenreference.pt	Fri Oct 25 18:02:44 2013 +0200
@@ -0,0 +1,58 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      metal:use-macro="context/@@standard_macros/page">
+
+  <body>
+    <div metal:fill-slot="body">
+
+      <p tal:condition="python:not (view.broken_targets or view.broken_sources)"
+         i18n:translate="">
+        There are no broken references.
+      </p>
+
+      <div tal:condition="view/broken_targets"
+           tal:define="references view/broken_targets">
+        <p i18n:translate="">
+          The following content contains broken references:
+        </p>
+        <ul>
+          <li tal:repeat="reference references">
+            Source
+            <a href="#"
+               tal:define="source nocall:reference/source"
+               tal:attributes="href source/@@absolute_url"
+               tal:content="python:'/'.join(source.getPhysicalPath())">
+              Name
+            </a>
+            (details:
+            <span tal:replace="python:', '.join(reference.tags)"></span>)
+          </li>
+        </ul>
+      </div>
+
+      <div tal:condition="view/broken_sources"
+           tal:define="references view/broken_sources">
+        <p i18n:translate="">
+          The following content are used by broken content:
+        </p>
+        <ul>
+          <li tal:repeat="reference references">
+            Source
+            <a href="#"
+               tal:define="target nocall:reference/target"
+               tal:attributes="href target/@@absolute_url"
+               tal:content="python:'/'.join(target.getPhysicalPath())">
+              Name
+            </a>
+            (details:
+            <span tal:replace="python:', '.join(reference.tags)"></span>)
+          </li>
+        </ul>
+      </div>
+
+    </div>
+  </body>
+</html>
+