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

Concept Title


- +
Predicate + Order +   + Relevance +  
- +
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'