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() cm = self.loopsRoot.getConceptManager()
hasType = cm.getTypePredicate() hasType = cm.getTypePredicate()
standard = cm.getDefaultPredicate() standard = cm.getDefaultPredicate()
#rels = sorted(self.context.getChildRelations(),
# key=(lambda x: x.second.title.lower()))
rels = self.context.getChildRelations() rels = self.context.getChildRelations()
for r in rels: for r in rels:
if r.predicate == hasType: if r.predicate == hasType:
@ -140,8 +138,7 @@ class ConceptView(BaseView):
yield ConceptRelationView(r, self.request) yield ConceptRelationView(r, self.request)
def resources(self): def resources(self):
rels = sorted(self.context.getResourceRelations(), rels = self.context.getResourceRelations()
key=(lambda x: x.second.title.lower()))
for r in rels: for r in rels:
yield ConceptRelationView(r, self.request, contextIsSecond=True) yield ConceptRelationView(r, self.request, contextIsSecond=True)
@ -197,15 +194,20 @@ class ConceptConfigureView(ConceptView):
if action == 'assign': if action == 'assign':
assignAs = request.get('assignAs', 'child') assignAs = request.get('assignAs', 'child')
predicate = request.get('predicate') or None predicate = request.get('predicate') or None
order = int(request.get('order') or 0)
relevance = float(request.get('relevance') or 1.0)
if predicate: if predicate:
predicate = removeSecurityProxy( predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate)) self.loopsRoot.loopsTraverse(predicate))
if assignAs == 'child': if assignAs == 'child':
self.context.assignChild(removeSecurityProxy(concept), predicate) self.context.assignChild(removeSecurityProxy(concept), predicate,
order, relevance)
elif assignAs == 'parent': elif assignAs == 'parent':
self.context.assignParent(removeSecurityProxy(concept), predicate) self.context.assignParent(removeSecurityProxy(concept), predicate,
order, relevance)
elif assignAs == 'resource': elif assignAs == 'resource':
self.context.assignResource(removeSecurityProxy(concept), predicate) self.context.assignResource(removeSecurityProxy(concept), predicate,
order, relevance)
else: else:
raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs) raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs)
elif action == 'remove': elif action == 'remove':
@ -246,14 +248,16 @@ class ConceptConfigureView(ConceptView):
if predicate: if predicate:
predicate = removeSecurityProxy( predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate)) self.loopsRoot.loopsTraverse(predicate))
order = int(request.get('create.order') or 0)
relevance = float(request.get('create.relevance') or 1.0)
if assignAs == 'child': if assignAs == 'child':
self.context.assignChild(concept, predicate) self.context.assignChild(concept, predicate, order, relevance)
elif assignAs == 'parent': elif assignAs == 'parent':
self.context.assignParent(concept, predicate) self.context.assignParent(concept, predicate, order, relevance)
elif assignAs == 'resource': elif assignAs == 'resource':
self.context.assignResource(concept, predicate) self.context.assignResource(concept, predicate, order, relevance)
elif assignAs == 'concept': elif assignAs == 'concept':
self.context.assignConcept(concept, predicate) self.context.assignConcept(concept, predicate, order, relevance)
else: else:
raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs) raise(BadRequest, 'Illegal assignAs parameter: %s.' % assignAs)
@ -303,6 +307,7 @@ class ConceptRelationView(BaseView):
self.other = relation.second self.other = relation.second
self.context = getVersion(self.context, request) self.context = getVersion(self.context, request)
self.predicate = relation.predicate self.predicate = relation.predicate
self.relation = relation
self.request = request self.request = request
@Lazy @Lazy
@ -327,3 +332,11 @@ class ConceptRelationView(BaseView):
def predicateUrl(self): def predicateUrl(self):
return zapi.absoluteURL(self.predicate, self.request) 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:content="pred/title">Predicate</option>
</tal:types> </tal:types>
</select> </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:special>
</metal:assign> </metal:assign>
</div> </div>

View file

@ -75,6 +75,10 @@
tal:content="pred/title">Predicate</option> tal:content="pred/title">Predicate</option>
</tal:types> </tal:types>
</select> </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:special>
</metal:assign> </metal:assign>
</div> </div>

View file

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

View file

@ -27,6 +27,10 @@
</tr> </tr>
<tr metal:use-macro="view/template/macros/assignments" /> <tr metal:use-macro="view/template/macros/assignments" />
<tr metal:use-macro="view/template/macros/search_concepts" /> <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/versioning" />
<tr metal:use-macro="view/template/macros/buttons" /> <tr metal:use-macro="view/template/macros/buttons" />
</tbody> </tbody>
@ -72,7 +76,6 @@
<tbody><tr><td colspan="5"> <tbody><tr><td colspan="5">
<div id="form.fields"> <div id="form.fields">
<!--<metal:fields use-macro="view/template/macros/fields" />-->
<metal:fields use-macro="view/fieldRenderers/fields" /> <metal:fields use-macro="view/fieldRenderers/fields" />
</div> </div>
</td></tr></tbody> </td></tr></tbody>
@ -80,10 +83,14 @@
<tbody> <tbody>
<tr> <tr>
<td colspan="5" class="headline" <td colspan="5" class="headline"
i18n:translate="">Assign Concept(s)</td> i18n:translate="">Assign Parent Concepts</td>
</tr> </tr>
<tr metal:use-macro="view/template/macros/assignments" /> <tr metal:use-macro="view/template/macros/assignments" />
<tr metal:use-macro="view/template/macros/search_concepts" /> <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" /> <tr metal:use-macro="view/template/macros/buttons" />
</tbody> </tbody>
</table> </table>

View file

@ -24,8 +24,11 @@
<th>&nbsp;</th> <th>&nbsp;</th>
<th i18n:translate="label_title">Title</th> <th i18n:translate="label_title">Title</th>
<th i18n:translate="label_type">Type</th> <th i18n:translate="label_type">Type</th>
<th i18n:translate="label_predicate" <tal:relation condition="showPredicate">
tal:condition="showPredicate">Predicate</th> <th i18n:translate="label_predicate">Predicate</th>
<th i18n:translate="label_order">Ord</th>
<th i18n:translate="label_relevance">RF</th>
</tal:relation>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -51,13 +54,17 @@
Type Type
</a> </a>
</td> </td>
<td tal:condition="showPredicate"> <tal:relation condition="showPredicate">
<td>
<a tal:content="item/predicateTitle" href="#" <a tal:content="item/predicateTitle" href="#"
tal:attributes="href tal:attributes="href
string:${item/predicateUrl}/@@SelectedManagementView.html"> string:${item/predicateUrl}/@@SelectedManagementView.html">
Predicate Predicate
</a> </a>
</td> </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> </tr>
</tbody> </tbody>
</table> </table>
@ -119,6 +126,10 @@
</tal:types> </tal:types>
</select> </select>
</metal:control> </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> </div>
</form> </form>
</fieldset> </fieldset>

View file

@ -239,10 +239,13 @@ class ResourceConfigureView(ResourceView, ConceptConfigureView):
concept = self.loopsRoot.loopsTraverse(token) concept = self.loopsRoot.loopsTraverse(token)
if action == 'assign': if action == 'assign':
predicate = request.get('predicate') or None predicate = request.get('predicate') or None
order = int(request.get('order') or 0)
relevance = float(request.get('relevance') or 1.0)
if predicate: if predicate:
predicate = removeSecurityProxy( predicate = removeSecurityProxy(
self.loopsRoot.loopsTraverse(predicate)) self.loopsRoot.loopsTraverse(predicate))
self.context.assignConcept(removeSecurityProxy(concept), predicate) self.context.assignConcept(removeSecurityProxy(concept), predicate,
order, relevance)
elif action == 'remove': elif action == 'remove':
predicate = self.loopsRoot.loopsTraverse(relToken) predicate = self.loopsRoot.loopsTraverse(relToken)
self.context.deassignConcept(concept, [predicate]) self.context.deassignConcept(concept, [predicate])

View file

@ -61,6 +61,10 @@
tal:content="pred/title">Predicate</option> tal:content="pred/title">Predicate</option>
</tal:types> </tal:types>
</select> </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:special>
</metal:assign> </metal:assign>
</div> </div>

View file

@ -205,11 +205,14 @@ class Concept(Contained, Persistent):
# resource relations # 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 predicates = predicates is None and ['*'] or predicates
relationships = [ResourceRelation(self, None, p) for p in predicates] relationships = [ResourceRelation(self, None, p) for p in predicates]
# TODO: sort... if sort == 'default':
return getRelations(first=self, second=resource, relationships=relationships) 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): def getResources(self, predicates=None):
return [r.second for r in self.getResourceRelations(predicates)] 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.action import Action, DialogAction
from loops.browser.concept import ConceptView 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.common import adapted
from loops import util from loops import util
@ -46,7 +48,7 @@ class GlossaryView(ConceptView):
if category == 'portlet': if category == 'portlet':
actions.append(DialogAction(self, title='Create Glossary Item...', actions.append(DialogAction(self, title='Create Glossary Item...',
description='Create a new glossary item.', description='Create a new glossary item.',
viewName='create_concept.html', viewName='create_glossaryitem.html',
dialogName='createGlossaryItem', dialogName='createGlossaryItem',
#qualifier='concept', #qualifier='concept',
typeToken='.loops/concepts/glossaryitem', typeToken='.loops/concepts/glossaryitem',
@ -67,8 +69,20 @@ class GlossaryItemView(ConceptView):
if category == 'portlet': if category == 'portlet':
actions.append(DialogAction(self, title='Edit Glossary Item...', actions.append(DialogAction(self, title='Edit Glossary Item...',
description='Modify glossary item.', description='Modify glossary item.',
viewName='edit_concept.html', viewName='edit_glossaryitem.html',
dialogName='editGlossaryItem', dialogName='editGlossaryItem',
page=page)) page=page))
return actions 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" 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> </configure>

View file

@ -28,3 +28,11 @@
</p> </p>
<metal:resources use-macro="item/conceptMacros/conceptresources" /> <metal:resources use-macro="item/conceptMacros/conceptresources" />
</metal:block> </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" "Project-Id-Version: $Id$\n"
"POT-Creation-Date: 2007-05-22 12:00 CET\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" "Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
"Language-Team: loops developers <helmutm@cy55.de>\n" "Language-Team: loops developers <helmutm@cy55.de>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -86,8 +86,11 @@ msgstr "Format"
msgid "Link URL" msgid "Link URL"
msgstr "URL" msgstr "URL"
msgid "Assign Concept(s)" msgid "Assign Parent Concepts"
msgstr "Begriff(e) zuordnen" msgstr "Oberbegriffe zuordnen"
msgid "Assign Child Concepts"
msgstr "Unterbegriffe zuordnen"
msgid "State" msgid "State"
msgstr "Status" msgstr "Status"

View file

@ -191,12 +191,14 @@ class Resource(Image, Contained):
rels = getRelations(second=obj, relationships=relationships) rels = getRelations(second=obj, relationships=relationships)
return [r.first for r in rels] 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 predicates = predicates is None and ['*'] or predicates
obj = getMaster(self) obj = getMaster(self)
relationships = [ResourceRelation(None, obj, p) for p in predicates] relationships = [ResourceRelation(None, obj, p) for p in predicates]
# TODO: sort... if sort == 'default':
return getRelations(first=concept, second=obj, relationships=relationships) 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): def getConcepts(self, predicates=None):
obj = getMaster(self) obj = getMaster(self)

View file

@ -85,6 +85,7 @@ class SetupManager(object):
note = self.addObject(conceptManager, Concept, 'note', title=u'Note') note = self.addObject(conceptManager, Concept, 'note', title=u'Note')
for c in (typeConcept, domain, query, note, file, textdocument, predicate): for c in (typeConcept, domain, query, note, file, textdocument, predicate):
c.conceptType = typeConcept c.conceptType = typeConcept
notify(ObjectModifiedEvent(c))
ITypeConcept(typeConcept).typeInterface = ITypeConcept ITypeConcept(typeConcept).typeInterface = ITypeConcept
ITypeConcept(query).typeInterface = IQueryConcept ITypeConcept(query).typeInterface = IQueryConcept
ITypeConcept(file).typeInterface = IFile 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 # 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 # 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.concept import Concept
from loops.util import getUidForObject, getObjectForUid, toUnicode from loops.util import getUidForObject, getObjectForUid, toUnicode
class LoopsMethods(MethodPublisher): class LoopsMethods(MethodPublisher):
""" XML-RPC methods for the loops root object. """ XML-RPC methods for the loops root object.
""" """
@ -143,6 +144,7 @@ class LoopsMethods(MethodPublisher):
if ti is not None: if ti is not None:
obj = ti(obj) obj = ti(obj)
# TODO: provide conversion if necessary # TODO: provide conversion if necessary
value = value.strip() # remove spaces appended by Flash
setattr(obj, attr, toUnicode(value)) setattr(obj, attr, toUnicode(value))
notify(ObjectModifiedEvent(obj)) notify(ObjectModifiedEvent(obj))
return 'OK' return 'OK'