From f43676c8430ef60389e8b1716b3f219ce518cf74 Mon Sep 17 00:00:00 2001 From: helmutm Date: Wed, 28 Feb 2007 09:24:58 +0000 Subject: [PATCH] provide common.NameChooser and use it on browser.form git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1601 fd906abe-77d9-0310-91a1-e0d9ade77398 --- README.txt | 15 +++++++------- browser/configure.zcml | 2 -- browser/form.py | 45 ++++++++---------------------------------- common.py | 43 ++++++++++++++++++++++++++++++++++++++-- configure.zcml | 2 ++ 5 files changed, 59 insertions(+), 48 deletions(-) diff --git a/README.txt b/README.txt index cfcd434..f763a1b 100755 --- a/README.txt +++ b/README.txt @@ -602,7 +602,8 @@ that are shown in the end-user interface. Creating an object ------------------ - >>> from loops.browser.form import CreateObjectForm, CreateObject, ResourceNameChooser + >>> from loops.common import NameChooser + >>> from loops.browser.form import CreateObjectForm, CreateObject >>> form = CreateObjectForm(m112, TestRequest()) >>> from loops.interfaces import INote, ITypeConcept @@ -614,7 +615,7 @@ Creating an object >>> note_tc.conceptType = typeObject >>> ITypeConcept(note_tc).typeInterface = INote - >>> component.provideAdapter(ResourceNameChooser) + >>> component.provideAdapter(NameChooser) >>> request = TestRequest(form={'form.title': u'Test Note', ... 'form.type': u'.loops/concepts/note'}) >>> view = NodeView(m112, request) @@ -646,16 +647,16 @@ created object: >>> sorted(t.__name__ for t in note.getConcepts()) [u'note', u'topic'] -When creating an object its name is automatically generated using the title +When creating an object its name may be automatically generated using the title of the object. Let's make sure that the name chooser also handles special and possibly critcal cases: - >>> nc = ResourceNameChooser(resources) - >>> nc.chooseName(u'abc: (cde)', None) + >>> nc = NameChooser(resources) + >>> nc.chooseName(u'', Resource(u'abc: (cde)')) u'abc_cde' - >>> nc.chooseName(u'\xdcml\xe4ut', None) + >>> nc.chooseName(u'', Resource(u'\xdcml\xe4ut')) u'uemlaeut' - >>> nc.chooseName(u'A very very loooooong title', None) + >>> nc.chooseName(u'', Resource(u'A very very loooooong title')) u'a_title' Editing an Object diff --git a/browser/configure.zcml b/browser/configure.zcml index 8b3f8f2..9da785b 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -612,8 +612,6 @@ permission="zope.Public" /> - - 15: - words = title.split() - if len(words) > 1: - title = '_'.join((words[0], words[-1])) - for c in title: - try: - c = c.encode('ISO8859-15') - except UnicodeEncodeError: - continue - if c in specialCharacters: - result.append(specialCharacters[c].lower()) - continue - if ord(c) > 127: - c = chr(ord(c) & 127) - if c in ('_., '): - result.append('_') - elif not c.isalpha() and not c.isdigit(): - continue - else: - result.append(c.lower()) - name = unicode(''.join(result)) - return super(ResourceNameChooser, self).chooseName(name, obj) - diff --git a/common.py b/common.py index 44600f4..5f97ccc 100644 --- a/common.py +++ b/common.py @@ -22,14 +22,14 @@ Common stuff. $Id$ """ -from zope.app import zapi +from zope.app.container.contained import NameChooser as BaseNameChooser from zope.dublincore.interfaces import IZopeDublinCore from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter from zope.dublincore.zopedublincore import ScalarProperty from zope.component import adapts from zope.interface import implements from zope.cachedescriptors.property import Lazy -from loops.interfaces import ILoopsObject, IConcept, IResource +from loops.interfaces import ILoopsObject, ILoopsContained, IConcept, IResource from loops.interfaces import IResourceAdapter @@ -93,3 +93,42 @@ class LoopsDCAdapter(ZDCAnnotatableAdapter): title = property(Title, setTitle) +class NameChooser(BaseNameChooser): + + adapts(ILoopsContained) + + def chooseName(self, name, obj): + if not name: + name = self.generateName(obj) + name = super(NameChooser, self).chooseName(name, obj) + return name + + def generateName(self, obj): + title = obj.title + result = [] + if len(title) > 15: + words = title.split() + if len(words) > 1: + title = '_'.join((words[0], words[-1])) + for c in title: + try: + c = c.encode('ISO8859-15') + except UnicodeEncodeError: + continue + if c in self.specialCharacters: + result.append(self.specialCharacters[c].lower()) + continue + if ord(c) > 127: + c = chr(ord(c) & 127) + if c in ('_., '): + result.append('_') + elif not c.isalpha() and not c.isdigit(): + continue + else: + result.append(c.lower()) + name = unicode(''.join(result)) + return name + + specialCharacters = { + '\xc4': 'Ae', '\xe4': 'ae', '\xd6': 'Oe', '\xf6': 'oe', + '\xdc': 'Ue', '\xfc': 'ue', '\xdf': 'ss'} diff --git a/configure.zcml b/configure.zcml index cbb7426..849fc1f 100644 --- a/configure.zcml +++ b/configure.zcml @@ -289,6 +289,8 @@ + +