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
This commit is contained in:
helmutm 2007-02-28 09:24:58 +00:00
parent fe8d2792d3
commit f43676c843
5 changed files with 59 additions and 48 deletions

View file

@ -602,7 +602,8 @@ that are shown in the end-user interface.
Creating an object 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()) >>> form = CreateObjectForm(m112, TestRequest())
>>> from loops.interfaces import INote, ITypeConcept >>> from loops.interfaces import INote, ITypeConcept
@ -614,7 +615,7 @@ Creating an object
>>> note_tc.conceptType = typeObject >>> note_tc.conceptType = typeObject
>>> ITypeConcept(note_tc).typeInterface = INote >>> ITypeConcept(note_tc).typeInterface = INote
>>> component.provideAdapter(ResourceNameChooser) >>> component.provideAdapter(NameChooser)
>>> request = TestRequest(form={'form.title': u'Test Note', >>> request = TestRequest(form={'form.title': u'Test Note',
... 'form.type': u'.loops/concepts/note'}) ... 'form.type': u'.loops/concepts/note'})
>>> view = NodeView(m112, request) >>> view = NodeView(m112, request)
@ -646,16 +647,16 @@ created object:
>>> sorted(t.__name__ for t in note.getConcepts()) >>> sorted(t.__name__ for t in note.getConcepts())
[u'note', u'topic'] [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 of the object. Let's make sure that the name chooser also handles special
and possibly critcal cases: and possibly critcal cases:
>>> nc = ResourceNameChooser(resources) >>> nc = NameChooser(resources)
>>> nc.chooseName(u'abc: (cde)', None) >>> nc.chooseName(u'', Resource(u'abc: (cde)'))
u'abc_cde' u'abc_cde'
>>> nc.chooseName(u'\xdcml\xe4ut', None) >>> nc.chooseName(u'', Resource(u'\xdcml\xe4ut'))
u'uemlaeut' u'uemlaeut'
>>> nc.chooseName(u'A very very loooooong title', None) >>> nc.chooseName(u'', Resource(u'A very very loooooong title'))
u'a_title' u'a_title'
Editing an Object Editing an Object

View file

@ -612,8 +612,6 @@
permission="zope.Public" permission="zope.Public"
/> />
<zope:adapter factory="loops.browser.form.ResourceNameChooser" />
<!-- inner HTML views --> <!-- inner HTML views -->
<page <page

View file

@ -198,7 +198,6 @@ class EditObject(FormController):
return self.view.loopsRoot return self.view.loopsRoot
def updateFields(self, obj): def updateFields(self, obj):
# TODO: replace with `applyChanges()`
form = self.request.form form = self.request.form
ti = IType(obj).typeInterface ti = IType(obj).typeInterface
if ti is not None: if ti is not None:
@ -218,6 +217,7 @@ class EditObject(FormController):
filename = getattr(value, 'filename', '') filename = getattr(value, 'filename', '')
value = value.read() value = value.read()
if filename: if filename:
#self.request.form['filename'] = filename
contentType = guess_content_type(filename, value[:100]) contentType = guess_content_type(filename, value[:100])
if contentType: if contentType:
self.request.form['form.contentType'] = contentType[0] self.request.form['form.contentType'] = contentType[0]
@ -256,12 +256,17 @@ class CreateObject(EditObject):
def update(self): def update(self):
form = self.request.form form = self.request.form
obj = Resource()
container = self.loopsRoot.getResourceManager() container = self.loopsRoot.getResourceManager()
title = form.get('form.title') title = form.get('form.title')
if not title: if not title:
raise BadRequest('Title field is empty') raise BadRequest('Title field is empty')
name = INameChooser(container).chooseName(title, obj) obj = Resource(title)
data = form.get('form.data')
if data and isinstance(data, FileUpload):
name = getattr(data, 'filename', None)
else:
name = None
name = INameChooser(container).chooseName(name, obj)
container[name] = obj container[name] = obj
tc = form.get('form.type') or '.loops/concepts/note' tc = form.get('form.type') or '.loops/concepts/note'
obj.resourceType = self.loopsRoot.loopsTraverse(tc) obj.resourceType = self.loopsRoot.loopsTraverse(tc)
@ -269,37 +274,3 @@ class CreateObject(EditObject):
self.updateFields(obj) self.updateFields(obj)
return True return True
specialCharacters = {
'\xc4': 'Ae', '\xe4': 'ae', '\xd6': 'Oe', '\xf6': 'oe',
'\xdc': 'Ue', '\xfc': 'ue', '\xdf': 'ss'}
class ResourceNameChooser(NameChooser):
adapts(IResourceManager)
def chooseName(self, title, obj):
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 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)

View file

@ -22,14 +22,14 @@ Common stuff.
$Id$ $Id$
""" """
from zope.app import zapi from zope.app.container.contained import NameChooser as BaseNameChooser
from zope.dublincore.interfaces import IZopeDublinCore from zope.dublincore.interfaces import IZopeDublinCore
from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter from zope.dublincore.annotatableadapter import ZDCAnnotatableAdapter
from zope.dublincore.zopedublincore import ScalarProperty from zope.dublincore.zopedublincore import ScalarProperty
from zope.component import adapts from zope.component import adapts
from zope.interface import implements from zope.interface import implements
from zope.cachedescriptors.property import Lazy 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 from loops.interfaces import IResourceAdapter
@ -93,3 +93,42 @@ class LoopsDCAdapter(ZDCAnnotatableAdapter):
title = property(Title, setTitle) 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'}

View file

@ -289,6 +289,8 @@
<adapter factory="loops.resource.DocumentReadFileAdapter" /> <adapter factory="loops.resource.DocumentReadFileAdapter" />
<adapter factory="loops.resource.DocumentWriteFileAdapter" /> <adapter factory="loops.resource.DocumentWriteFileAdapter" />
<adapter factory="loops.common.NameChooser" />
<adapter factory="loops.type.LoopsType" /> <adapter factory="loops.type.LoopsType" />
<adapter factory="loops.type.ConceptType" /> <adapter factory="loops.type.ConceptType" />
<adapter factory="loops.type.ResourceType" <adapter factory="loops.type.ResourceType"