From b9bb7e22ad11c2d6946a45edda261cabec655977 Mon Sep 17 00:00:00 2001
From: helmutm
Date: Wed, 5 Dec 2007 15:37:39 +0000
Subject: [PATCH] more on knowledge.glossary; provide order and relevance for
relations on admin interface
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2215 fd906abe-77d9-0310-91a1-e0d9ade77398
---
browser/concept.py | 35 ++++++++++++++++++++----------
browser/concept_related.pt | 4 ++++
browser/concept_resources.pt | 12 ++++++----
browser/form.py | 1 +
browser/form_macros.pt | 11 ++++++++--
browser/relation_macros.pt | 29 +++++++++++++++++--------
browser/resource.py | 5 ++++-
browser/resource_configure.pt | 4 ++++
concept.py | 9 +++++---
knowledge/glossary/browser.py | 18 +++++++++++++--
knowledge/glossary/configure.zcml | 14 ++++++++++++
knowledge/glossary/view_macros.pt | 8 +++++++
locales/de/LC_MESSAGES/loops.mo | Bin 3884 -> 3952 bytes
locales/de/LC_MESSAGES/loops.po | 9 +++++---
resource.py | 8 ++++---
setup.py | 1 +
xmlrpc/common.py | 4 +++-
17 files changed, 133 insertions(+), 39 deletions(-)
diff --git a/browser/concept.py b/browser/concept.py
index 443508a..96360dd 100644
--- a/browser/concept.py
+++ b/browser/concept.py
@@ -119,8 +119,6 @@ class ConceptView(BaseView):
cm = self.loopsRoot.getConceptManager()
hasType = cm.getTypePredicate()
standard = cm.getDefaultPredicate()
- #rels = sorted(self.context.getChildRelations(),
- # key=(lambda x: x.second.title.lower()))
rels = self.context.getChildRelations()
for r in rels:
if r.predicate == hasType:
@@ -140,8 +138,7 @@ class ConceptView(BaseView):
yield ConceptRelationView(r, self.request)
def resources(self):
- rels = sorted(self.context.getResourceRelations(),
- key=(lambda x: x.second.title.lower()))
+ rels = self.context.getResourceRelations()
for r in rels:
yield ConceptRelationView(r, self.request, contextIsSecond=True)
@@ -197,15 +194,20 @@ class ConceptConfigureView(ConceptView):
if action == 'assign':
assignAs = request.get('assignAs', 'child')
predicate = request.get('predicate') or None
+ order = int(request.get('order') or 0)
+ relevance = float(request.get('relevance') or 1.0)
if predicate:
predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate))
if assignAs == 'child':
- self.context.assignChild(removeSecurityProxy(concept), predicate)
+ self.context.assignChild(removeSecurityProxy(concept), predicate,
+ order, relevance)
elif assignAs == 'parent':
- self.context.assignParent(removeSecurityProxy(concept), predicate)
+ self.context.assignParent(removeSecurityProxy(concept), predicate,
+ order, relevance)
elif assignAs == 'resource':
- self.context.assignResource(removeSecurityProxy(concept), predicate)
+ self.context.assignResource(removeSecurityProxy(concept), predicate,
+ order, relevance)
else:
raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs)
elif action == 'remove':
@@ -246,14 +248,16 @@ class ConceptConfigureView(ConceptView):
if predicate:
predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate))
+ order = int(request.get('create.order') or 0)
+ relevance = float(request.get('create.relevance') or 1.0)
if assignAs == 'child':
- self.context.assignChild(concept, predicate)
+ self.context.assignChild(concept, predicate, order, relevance)
elif assignAs == 'parent':
- self.context.assignParent(concept, predicate)
+ self.context.assignParent(concept, predicate, order, relevance)
elif assignAs == 'resource':
- self.context.assignResource(concept, predicate)
+ self.context.assignResource(concept, predicate, order, relevance)
elif assignAs == 'concept':
- self.context.assignConcept(concept, predicate)
+ self.context.assignConcept(concept, predicate, order, relevance)
else:
raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs)
@@ -303,6 +307,7 @@ class ConceptRelationView(BaseView):
self.other = relation.second
self.context = getVersion(self.context, request)
self.predicate = relation.predicate
+ self.relation = relation
self.request = request
@Lazy
@@ -327,3 +332,11 @@ class ConceptRelationView(BaseView):
def predicateUrl(self):
return zapi.absoluteURL(self.predicate, self.request)
+ @Lazy
+ def relevance(self):
+ return self.relation.relevance
+
+ @Lazy
+ def order(self):
+ return self.relation.order
+
diff --git a/browser/concept_related.pt b/browser/concept_related.pt
index 9097b61..5efb49a 100644
--- a/browser/concept_related.pt
+++ b/browser/concept_related.pt
@@ -61,6 +61,10 @@
tal:content="pred/title">Predicate
+ Order
+
+ Relevance
+
diff --git a/browser/concept_resources.pt b/browser/concept_resources.pt
index 8c46029..1e032cb 100644
--- a/browser/concept_resources.pt
+++ b/browser/concept_resources.pt
@@ -2,11 +2,11 @@
-
+
diff --git a/browser/form.py b/browser/form.py
index 80931b6..5b3d5f8 100644
--- a/browser/form.py
+++ b/browser/form.py
@@ -67,6 +67,7 @@ class ObjectForm(NodeView):
"""
template = ViewPageTemplateFile('form_macros.pt')
+ customMacro = None
formState = FormState() # dummy, don't update!
isInnerHtml = True
diff --git a/browser/form_macros.pt b/browser/form_macros.pt
index e18f251..fde5191 100644
--- a/browser/form_macros.pt
+++ b/browser/form_macros.pt
@@ -27,6 +27,10 @@
+
+
+
@@ -72,7 +76,6 @@
-
|
@@ -80,10 +83,14 @@
Assign Concept(s) |
+ i18n:translate="">Assign Parent Concepts
+
+
+
diff --git a/browser/relation_macros.pt b/browser/relation_macros.pt
index 56c03d4..97a3925 100644
--- a/browser/relation_macros.pt
+++ b/browser/relation_macros.pt
@@ -24,8 +24,11 @@
|
Title |
Type |
- Predicate |
+
+ Predicate |
+ Ord |
+ RF |
+
@@ -51,13 +54,17 @@
Type
-
-
- Predicate
-
- |
+
+
+
+ Predicate
+
+ |
+ 0 |
+ 1.0 |
+
@@ -119,6 +126,10 @@
+ Order
+
+ Relevance
+
diff --git a/browser/resource.py b/browser/resource.py
index eba6e48..be3c3f9 100644
--- a/browser/resource.py
+++ b/browser/resource.py
@@ -239,10 +239,13 @@ class ResourceConfigureView(ResourceView, ConceptConfigureView):
concept = self.loopsRoot.loopsTraverse(token)
if action == 'assign':
predicate = request.get('predicate') or None
+ order = int(request.get('order') or 0)
+ relevance = float(request.get('relevance') or 1.0)
if predicate:
predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate))
- self.context.assignConcept(removeSecurityProxy(concept), predicate)
+ self.context.assignConcept(removeSecurityProxy(concept), predicate,
+ order, relevance)
elif action == 'remove':
predicate = self.loopsRoot.loopsTraverse(relToken)
self.context.deassignConcept(concept, [predicate])
diff --git a/browser/resource_configure.pt b/browser/resource_configure.pt
index 03d5ab1..c3fefec 100644
--- a/browser/resource_configure.pt
+++ b/browser/resource_configure.pt
@@ -61,6 +61,10 @@
tal:content="pred/title">Predicate
+ Order
+
+ Relevance
+
diff --git a/concept.py b/concept.py
index 4088eab..feb0433 100644
--- a/concept.py
+++ b/concept.py
@@ -205,11 +205,14 @@ class Concept(Contained, Persistent):
# resource relations
- def getResourceRelations(self, predicates=None, resource=None):
+ def getResourceRelations(self, predicates=None, resource=None, sort='default'):
predicates = predicates is None and ['*'] or predicates
relationships = [ResourceRelation(self, None, p) for p in predicates]
- # TODO: sort...
- return getRelations(first=self, second=resource, relationships=relationships)
+ if sort == 'default':
+ sort = lambda x: (x.order, x.second.title.lower())
+ return sorted(getRelations(
+ first=self, second=resource, relationships=relationships),
+ key=sort)
def getResources(self, predicates=None):
return [r.second for r in self.getResourceRelations(predicates)]
diff --git a/knowledge/glossary/browser.py b/knowledge/glossary/browser.py
index 17155e2..52bc9e6 100755
--- a/knowledge/glossary/browser.py
+++ b/knowledge/glossary/browser.py
@@ -28,6 +28,8 @@ from zope.app.pagetemplate import ViewPageTemplateFile
from loops.browser.action import Action, DialogAction
from loops.browser.concept import ConceptView
+from loops.browser.form import CreateConceptForm, EditConceptForm
+from loops.browser.form import CreateConcept, EditConcept
from loops.common import adapted
from loops import util
@@ -46,7 +48,7 @@ class GlossaryView(ConceptView):
if category == 'portlet':
actions.append(DialogAction(self, title='Create Glossary Item...',
description='Create a new glossary item.',
- viewName='create_concept.html',
+ viewName='create_glossaryitem.html',
dialogName='createGlossaryItem',
#qualifier='concept',
typeToken='.loops/concepts/glossaryitem',
@@ -67,8 +69,20 @@ class GlossaryItemView(ConceptView):
if category == 'portlet':
actions.append(DialogAction(self, title='Edit Glossary Item...',
description='Modify glossary item.',
- viewName='edit_concept.html',
+ viewName='edit_glossaryitem.html',
dialogName='editGlossaryItem',
page=page))
return actions
+
+class CreateGlossaryItemForm(CreateConceptForm):
+
+ @Lazy
+ def customMacro(self):
+ return template.macros['children']
+
+
+class EditGlossaryItemForm(CreateGlossaryItemForm, EditConceptForm):
+
+ pass
+
diff --git a/knowledge/glossary/configure.zcml b/knowledge/glossary/configure.zcml
index 629475a..a219532 100755
--- a/knowledge/glossary/configure.zcml
+++ b/knowledge/glossary/configure.zcml
@@ -24,4 +24,18 @@
permission="zope.View"
/>
+
+
+
+
diff --git a/knowledge/glossary/view_macros.pt b/knowledge/glossary/view_macros.pt
index 9464a64..bdcc429 100755
--- a/knowledge/glossary/view_macros.pt
+++ b/knowledge/glossary/view_macros.pt
@@ -28,3 +28,11 @@
+
+
+
+
+ Assign Child Concepts |
+
+
\ No newline at end of file
diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo
index 782d3b025a3d49d8d6afd430459c0f04240e8733..0357d4e2eacde129a5f3cd4a33871f506c93061e 100644
GIT binary patch
delta 1636
zcmYk+OGs2v9LMovj;}^b$1+W`NoTZtq?wtoEMFNR7LPAT6Shc1ep0Y*7&9rl3tkkMB=UkHh@$=iD>r{?Fr{nd!{Wnc+p3W5Q6H
zhz#QBDr4Gl)WL<47;Q`pCSg3LVI=0D6Z33)8LsEP9#ilb#$g}wF+*I|;yH}POGw_Z
znWU0T!!2~-LrlbZ)PS!s6+hVT^_1q8jG90y@|E$R66d3yFU16GwD(6)&-qXj3t%kc
zn|>-uG@L~x97A=SL`~p2dT|<+_yzJY@3?5dB`n6T7=>OMHE=%a`wA|~SBIKt6RyD)
zbTYnaqmqsR+hN3Z7{xr=ucCJ5DJsz`)If{&{yk~|A8q@0YXr+w{}|M(iAOCc3s++i
zhUsf6si
zftvYURN@&_g2$*Gn@1LD-lCpg!fO19+JPz_
zQvOy{o;G_Q_EFITJ*b(7ts|%vo<|+di>Q^}Lvor&s0q%a5-(sGzQIlCqO;nIQF+U)
zHMYG0IkaKZOhq$4ZabVr&dzeFjgXlTBn_YxT9i^|3oT9#kRK5iNbH=(~C6}_a)
zEsONi}61;Hv!IiVl9O4AC)HU2HC&T}Hr<8#;d20Q(I1O2A9zdz6&bRTXH`GW(0
zn`axMA4EDz3X4l;f5dqrvRi`#{!oX%I~3^Z^1FuydqcjUKWGkh{A-=fcSbmV15t*F
A4gdfE
delta 1568
zcmYk+OGs2v9LMqhe0V1#sQVVf2b
z5-p5qm7B_i1igrM(Iz4&2&AYsE(#0+%T?ds%vp4}|NA-j+aqqew^@gQVE!?1|P1$Af{jrhA`sVD>2M<0|v1RIqWE>EIf&67(?ZY<2p0X
z#;Ih}a0A!kT~tSNn1?Ui{ST-yEuuR9i5&KqlM*Yd-Vb61M%;B2^Rs~sFj&PC3=MFXx?2vMJ@SD*Z$7=(cNFb4cz~Vn$R+)qn~A2D_#2sw*ncZ{kpXg09{)T$)7ivN)$hWtQ
z5bLi>DeJ*I*63_UE%_nTlJ=nnbQag+2y)n@yS|B9;`^A74_*6f*S>%n@OM<6B~;!&
zA=W>KN`SjcT!gt;kD7T8YUIaIGdzXb&1aCqhB@iE%cz-N#Vt66%KIES>^t`GUQ;
zh#E+f$1t=c?Wh$v;XI9+Q4E!M7?ofG^-U*{N!SeP{aM_N&rmC{jOrlF%gU3Fx-LOI
zA4Lt^Yju?l)C><`0Uk!pbO_01g6N$eu@Q`E|+XolN}t-AQHlvA%K
z^l3E6#8me}6`?\n"
"Language-Team: loops developers \n"
"MIME-Version: 1.0\n"
@@ -86,8 +86,11 @@ msgstr "Format"
msgid "Link URL"
msgstr "URL"
-msgid "Assign Concept(s)"
-msgstr "Begriff(e) zuordnen"
+msgid "Assign Parent Concepts"
+msgstr "Oberbegriffe zuordnen"
+
+msgid "Assign Child Concepts"
+msgstr "Unterbegriffe zuordnen"
msgid "State"
msgstr "Status"
diff --git a/resource.py b/resource.py
index e55495b..079be8b 100644
--- a/resource.py
+++ b/resource.py
@@ -191,12 +191,14 @@ class Resource(Image, Contained):
rels = getRelations(second=obj, relationships=relationships)
return [r.first for r in rels]
- def getConceptRelations (self, predicates=None, concept=None):
+ def getConceptRelations (self, predicates=None, concept=None, sort='default'):
predicates = predicates is None and ['*'] or predicates
obj = getMaster(self)
relationships = [ResourceRelation(None, obj, p) for p in predicates]
- # TODO: sort...
- return getRelations(first=concept, second=obj, relationships=relationships)
+ if sort == 'default':
+ sort = lambda x: (x.order, x.first.title.lower())
+ return sorted(getRelations(first=concept, second=obj, relationships=relationships),
+ key=sort)
def getConcepts(self, predicates=None):
obj = getMaster(self)
diff --git a/setup.py b/setup.py
index b2f1cc7..70c127f 100644
--- a/setup.py
+++ b/setup.py
@@ -85,6 +85,7 @@ class SetupManager(object):
note = self.addObject(conceptManager, Concept, 'note', title=u'Note')
for c in (typeConcept, domain, query, note, file, textdocument, predicate):
c.conceptType = typeConcept
+ notify(ObjectModifiedEvent(c))
ITypeConcept(typeConcept).typeInterface = ITypeConcept
ITypeConcept(query).typeInterface = IQueryConcept
ITypeConcept(file).typeInterface = IFile
diff --git a/xmlrpc/common.py b/xmlrpc/common.py
index b188e60..f2c57bd 100644
--- a/xmlrpc/common.py
+++ b/xmlrpc/common.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2005 Helmut Merz helmutm@cy55.de
+# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -37,6 +37,7 @@ from cybertools.typology.interfaces import IType
from loops.concept import Concept
from loops.util import getUidForObject, getObjectForUid, toUnicode
+
class LoopsMethods(MethodPublisher):
""" XML-RPC methods for the loops root object.
"""
@@ -143,6 +144,7 @@ class LoopsMethods(MethodPublisher):
if ti is not None:
obj = ti(obj)
# TODO: provide conversion if necessary
+ value = value.strip() # remove spaces appended by Flash
setattr(obj, attr, toUnicode(value))
notify(ObjectModifiedEvent(obj))
return 'OK'