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
This commit is contained in:
parent
aa6838faa6
commit
b9bb7e22ad
17 changed files with 133 additions and 39 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -61,6 +61,10 @@
|
|||
tal:content="pred/title">Predicate</option>
|
||||
</tal:types>
|
||||
</select>
|
||||
<span i18n:translate="">Order</span>
|
||||
<input name="order" size="2" value="0" />
|
||||
<span i18n:translate="">Relevance</span>
|
||||
<input name="relevance" size="3" value="1.0" />
|
||||
</metal:special>
|
||||
</metal:assign>
|
||||
</div>
|
||||
|
|
|
@ -75,6 +75,10 @@
|
|||
tal:content="pred/title">Predicate</option>
|
||||
</tal:types>
|
||||
</select>
|
||||
<span i18n:translate="">Order</span>
|
||||
<input name="order" size="2" value="0" />
|
||||
<span i18n:translate="">Relevance</span>
|
||||
<input name="relevance" size="3" value="1.0" />
|
||||
</metal:special>
|
||||
</metal:assign>
|
||||
</div>
|
||||
|
|
|
@ -67,6 +67,7 @@ class ObjectForm(NodeView):
|
|||
"""
|
||||
|
||||
template = ViewPageTemplateFile('form_macros.pt')
|
||||
customMacro = None
|
||||
formState = FormState() # dummy, don't update!
|
||||
isInnerHtml = True
|
||||
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
</tr>
|
||||
<tr metal:use-macro="view/template/macros/assignments" />
|
||||
<tr metal:use-macro="view/template/macros/search_concepts" />
|
||||
<tal:custom define="customMacro view/customMacro"
|
||||
condition="customMacro">
|
||||
<tr metal:use-macro="customMacro" />
|
||||
</tal:custom>
|
||||
<tr metal:use-macro="view/template/macros/versioning" />
|
||||
<tr metal:use-macro="view/template/macros/buttons" />
|
||||
</tbody>
|
||||
|
@ -72,7 +76,6 @@
|
|||
|
||||
<tbody><tr><td colspan="5">
|
||||
<div id="form.fields">
|
||||
<!--<metal:fields use-macro="view/template/macros/fields" />-->
|
||||
<metal:fields use-macro="view/fieldRenderers/fields" />
|
||||
</div>
|
||||
</td></tr></tbody>
|
||||
|
@ -80,10 +83,14 @@
|
|||
<tbody>
|
||||
<tr>
|
||||
<td colspan="5" class="headline"
|
||||
i18n:translate="">Assign Concept(s)</td>
|
||||
i18n:translate="">Assign Parent Concepts</td>
|
||||
</tr>
|
||||
<tr metal:use-macro="view/template/macros/assignments" />
|
||||
<tr metal:use-macro="view/template/macros/search_concepts" />
|
||||
<tal:custom define="customMacro view/customMacro"
|
||||
condition="customMacro">
|
||||
<tr metal:use-macro="customMacro" />
|
||||
</tal:custom>
|
||||
<tr metal:use-macro="view/template/macros/buttons" />
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
@ -24,8 +24,11 @@
|
|||
<th> </th>
|
||||
<th i18n:translate="label_title">Title</th>
|
||||
<th i18n:translate="label_type">Type</th>
|
||||
<th i18n:translate="label_predicate"
|
||||
tal:condition="showPredicate">Predicate</th>
|
||||
<tal:relation condition="showPredicate">
|
||||
<th i18n:translate="label_predicate">Predicate</th>
|
||||
<th i18n:translate="label_order">Ord</th>
|
||||
<th i18n:translate="label_relevance">RF</th>
|
||||
</tal:relation>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -51,13 +54,17 @@
|
|||
Type
|
||||
</a>
|
||||
</td>
|
||||
<td tal:condition="showPredicate">
|
||||
<a tal:content="item/predicateTitle" href="#"
|
||||
tal:attributes="href
|
||||
string:${item/predicateUrl}/@@SelectedManagementView.html">
|
||||
Predicate
|
||||
</a>
|
||||
</td>
|
||||
<tal:relation condition="showPredicate">
|
||||
<td>
|
||||
<a tal:content="item/predicateTitle" href="#"
|
||||
tal:attributes="href
|
||||
string:${item/predicateUrl}/@@SelectedManagementView.html">
|
||||
Predicate
|
||||
</a>
|
||||
</td>
|
||||
<td tal:content="item/order" style="text-align: center">0</td>
|
||||
<td tal:content="item/relevance" style="text-align: center">1.0</td>
|
||||
</tal:relation>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -119,6 +126,10 @@
|
|||
</tal:types>
|
||||
</select>
|
||||
</metal:control>
|
||||
<span i18n:translate="">Order</span>
|
||||
<input name="create.order" size="2" value="0" />
|
||||
<span i18n:translate="">Relevance</span>
|
||||
<input name="create.relevance" size="3" value="1.0" />
|
||||
</div>
|
||||
</form>
|
||||
</fieldset>
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -61,6 +61,10 @@
|
|||
tal:content="pred/title">Predicate</option>
|
||||
</tal:types>
|
||||
</select>
|
||||
<span i18n:translate="">Order</span>
|
||||
<input name="order" size="2" value="0" />
|
||||
<span i18n:translate="">Relevance</span>
|
||||
<input name="relevance" size="3" value="1.0" />
|
||||
</metal:special>
|
||||
</metal:assign>
|
||||
</div>
|
||||
|
|
|
@ -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)]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -24,4 +24,18 @@
|
|||
permission="zope.View"
|
||||
/>
|
||||
|
||||
<page
|
||||
name="create_glossaryitem.html"
|
||||
for="loops.interfaces.INode"
|
||||
class="loops.knowledge.glossary.browser.CreateGlossaryItemForm"
|
||||
permission="zope.ManageContent"
|
||||
/>
|
||||
|
||||
<page
|
||||
name="edit_glossaryitem.html"
|
||||
for="loops.interfaces.INode"
|
||||
class="loops.knowledge.glossary.browser.EditGlossaryItemForm"
|
||||
permission="zope.ManageContent"
|
||||
/>
|
||||
|
||||
</configure>
|
||||
|
|
|
@ -28,3 +28,11 @@
|
|||
</p>
|
||||
<metal:resources use-macro="item/conceptMacros/conceptresources" />
|
||||
</metal:block>
|
||||
|
||||
|
||||
<metal:block define-macro="children">
|
||||
<tr>
|
||||
<td colspan="5" class="headline"
|
||||
i18n:translate="">Assign Child Concepts</td>
|
||||
</tr>
|
||||
</metal:block>
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgstr ""
|
|||
|
||||
"Project-Id-Version: $Id$\n"
|
||||
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
||||
"PO-Revision-Date: 2007-11-18 12:00 CET\n"
|
||||
"PO-Revision-Date: 2007-12-04 12:00 CET\n"
|
||||
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
|
||||
"Language-Team: loops developers <helmutm@cy55.de>\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"
|
||||
|
|
|
@ -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)
|
||||
|
|
1
setup.py
1
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
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Add table
Reference in a new issue