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