[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>
+