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:
helmutm 2007-12-05 15:37:39 +00:00
parent aa6838faa6
commit b9bb7e22ad
17 changed files with 133 additions and 39 deletions

View file

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

View file

@ -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" />&nbsp;
<span i18n:translate="">Relevance</span>
<input name="relevance" size="3" value="1.0" />&nbsp;
</metal:special>
</metal:assign>
</div>

View file

@ -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" />&nbsp;
<span i18n:translate="">Relevance</span>
<input name="relevance" size="3" value="1.0" />&nbsp;
</metal:special>
</metal:assign>
</div>

View file

@ -67,6 +67,7 @@ class ObjectForm(NodeView):
"""
template = ViewPageTemplateFile('form_macros.pt')
customMacro = None
formState = FormState() # dummy, don't update!
isInnerHtml = True

View file

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

View file

@ -24,8 +24,11 @@
<th>&nbsp;</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">
<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" />&nbsp;
<span i18n:translate="">Relevance</span>
<input name="create.relevance" size="3" value="1.0" />&nbsp;
</div>
</form>
</fieldset>

View file

@ -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])

View file

@ -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" />&nbsp;
<span i18n:translate="">Relevance</span>
<input name="relevance" size="3" value="1.0" />&nbsp;
</metal:special>
</metal:assign>
</div>

View file

@ -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)]

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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