2004-03-02  Sidnei da Silva  <sidnei@awkly.org>

	* ArchetypeTool.py (ArchetypeTool.getSearchWidgets): field_name
	should be set to field.accessor, because the auto-generated index
	will be named after the accessor!

2004-01-17  Sidnei da Silva  <sidnei@redesul.com.br>

	* ExtensibleMetadata.py (ExtensibleMetadata.isEffective):
	Copy/paste error. Was using effectiveDate for expirationDate when
	calculating isEffective.

	* ArchetypeTool.py (modify_fti): Allow overriding immediate_view
	from klass attribute.

	* Extensions/utils.py (install_subskin): Don't try to install .svn
	directory as a skin.

2003-12-19  Sidnei da Silva  <sidnei@awkly.org>

	* SQLStorage.py (SQLServerStorage.table_exists): Added
	SQLServerStorage, contributed by Dwight Lowry as per #862448.

	* SQLMethod.py: Missing import.

2003-12-16  Sidnei da Silva  <sidnei@awkly.org>

	* ClassGen.py (ClassGenerator.checkSchema): Return an acquisition
	wrapped Schema so that the security machinery can find it's way
	through. **WARNING**: Consumers of Schema() and Schemata() must
	make sure to remove acquisition wrappers when persisting the
	resultant object. Failure on doing so will bite your butt when you
	get to run Zope HEAD :)

	* Schema.py (getSchemata): Wrap schemata into an
	ImplicitAcquisitionWrapper, so that the security machinery can
	find it's way through.

2003-12-13  Sidnei da Silva  <sidnei@awkly.org>

	* ArchetypeTool.py (ArchetypeTool.getSearchWidgets): Applied Joel
	Burton's fixes from head, plus a few more changes to make it work
	even better.
	(ArchetypeTool.getSearchWidgets): Allow passing type and context
	(for Andreas Jung's PloneCollectorNG -- untested)

	* Extensions/utils.py (install_tools): Fixed migration from 1.0

	* skins/archetypes/widgets/calendar.pt: A tal:omit-tag too much.

2003-12-06  Sidnei da Silva  <sidnei@awkly.org>

	* Widget.py (ImageWidget.process_form): Added maxlength and size
	to some widgets.

	* BaseObject.py (BaseObject.getCharset): Ops, protect with view
	permission, not Private. 

	* BaseBTreeFolder.py (__getitem__): Title/Description should come
	from BaseFolder, not from SkinnedFolder.

	* OrderedBaseFolder.py (OrderedFolder._setObject): Added
	CatalogMultiplex as a base class for OrderedBaseFolder.

	* BaseObject.py (BaseObject.__bobo_traverse__): Should fix a bug
	with folderish content and WebDAV. WebDAV methods expect a
	NullResource when the object is not found, so a new one can be
	created.

2003-11-20  Sidnei da Silva  <sidnei@awkly.org>

	* BaseFolder.py (BaseFolderMixin.manage_beforeDelete): Bummer!
	PortalFolder also inherits from CMFCatalogAware. That's so stupid!
	Use Folder then, which is what we should have done from the start.

	* examples/ComplexType.py (schema): Fix for #843871

	* BaseFolder.py (BaseFolderMixin.manage_afterAdd):
	CatalogMultiplex inherits from CMFCatalogAware, which
	SkinnedFolder does as well. So, instead of calling
	SkinnedFolder.manage_after*/manage_before*, we just inherit from
	PortalFolder as well (stupid ExtensionClass) and call
	PortalFolder.manage_after*/manage_before* and let CatalogMultiplex
	call the methods from CMFCatalogAware.

	* BaseBTreeFolder.py (manage_afterAdd): CMFBTreeFolder seems to
	inherit from PortalFolder, which BaseFolder does as well (via
	SkinnedFolder), so we don't need to call
	manage_after*/manage_before* twice, because they are mostly the
	same method.

2003-11-18  Sidnei da Silva  <sidnei@awkly.org>

	* ExtensibleMetadata.py (ExtensibleMetadata.allowDiscussion): Take
	keyword arguments, even if we ignore them *wink*.

	* ArchTTWTool.py (ArchTTWTool.storages_xml): Added storages xml page.

	* Registry.py: Added storage registry.

	* Storage.py: Register storages.

	* BaseContent.py (BaseContentMixin.manage_FTPget): This may be
	called with no arguments (for example, by manage_DAVget). Fall
	back to self.REQUEST in this case.

2003-11-14  Sidnei da Silva  <sidnei@plone.org>

	* Field.py (ImageField.scale): Mini-patch by Gabriel Wicke.
	- scaling is done with the ANTIALIAS filter instead of
	NEAREST. Disadvantage: slower.
	- jpg compression is 88 instead of the 75 default (maybe 85 would
	be enough, makes some difference for file size). Less Artifacts.
	(ImageField.scale): ANTIALIAS is only available on PIL 1.1.3

2003-11-10  Sidnei da Silva  <sidnei@plone.org>

	* BaseObject.py (BaseObject.get_size): Better get_size
	implementation. DateTime's raise an AttributeError when using
	len().


2003-11-10  Geoff Davis <geoff@geoffdavis.net>

    * BaseObject.py: Added optional values argument to processForm to allow one
      to massage incoming form values in a script before passing them along to
      processForm.  If values is set (should be a dict), processForm takes its
      values from the dict; otherwise it gets them from REQUEST.form.

2003-11-09  Geoff Davis <geoff@geoffdavis.net>

    * updateSchemaForm.pt: Let user choose which classes should be updated
      since automatic schema change detection loses change info when Archetypes
      is reinstalled.  Also let the user choose to update all classes or only
      classes with an old schema.

    * ArchetypeTool.py: getChangedSchema now returns a tuple consisting of
      type, changed_flag rather than just a list of changed types.
      If called from a REQUEST, manage_updateSchema checks to see which
      classes need to be updated.  Fixed catalog search for objects that need
      updating (was using incorrect metatype and searching the UID catalog).

    * BaseObject.py: Made automated migrations slightly more robust by handling
      AttributeErrors gracefully.

2003-11-07  Sylvain Thénault  <syt@logilab.fr>

    * BaseFolder.py: added the Description method to not fallback to
    the PortalFolder's one

    * __init__.py: make DisplayList public

    * Extensions/utils.py: don't try to add an index when we only want
    to add the field to metadata

2003-11-05  Sidnei da Silva  <sidnei@plone.org>

	* BaseObject.py (BaseObject.get_size): Fix for when the value is
	a BaseUnit. Also, use the 'standard' way to get the raw value.

2003-11-05  Sylvain Thénault  <syt@logilab.fr>
	* Extensions/utils.py
	extends fields'index attribute syntax to support extra
	arguments. That allows for instance to add ZCTextIndex :
	index='ZCTextIndex, lexicon_id=lexicon, index_type=Okapi BM25
	Rank'

	* __init__.py: make IndexIterator available even without Plone
	and use it in base_edit, base_metadata and reference_edit

	* Field.py: use the new getCharset script to get the site
	charset. This is usefull for non plone site without
	site_properties.

	* skins/archetypes/unicodeEncode.py: use the new getCharset
	script to get the site charset.

	* Archetypes should now working as well with plain CMF site :)

2003-11-05  Sidnei da Silva  <sidnei@plone.org>

        * skins/archetypes/widgets/*: Removed cruft (onfocus/onblur from
	Plone 1.0.x).

	* Widget.py (RichWidget.process_form): Better handling of
	upload/content-type/typed-in text.

	* BaseObject.py (BaseObject._migrateGetValue): Tentatively fix
	migrateGetValue by using __getitem__ (which looks up
	getEditAccessor, then falls back to getAcessor.

        * Several fixes all over the place. Updated forms to Plone 2.0
	style. Fixed problem with setting an empty value to a field (needs
	a test). Moved test suite to use ZopeTestCase (thanks to
	Tiran). Fixed problem were if you registered two classes with the
	same meta_type, the latter would win and override the first. Fixed
	getContentType method of TextField to work with the new BaseUnit.

2003-10-09  Benjamin Saller  <bcsaller@yahoo.com>

	* Widget.py (RichWidget.process_form): I think we'd want to take
	the mime_type input incase we can't guess the file type down the
	line?  if I am outta line with this tell me, but on unix many
	files don't have extensions so this is a win.


	* BaseObject.py (BaseObject._processForm): MAJOR CHANGE, minor
	expected impact. Unless I missed something (and I might have)
	normal users should notice no changes, however form processing has
	been broken out and delegated to the widget. This has the cool
	effect that widgets can now easily present multiple UI elements so
	long as they can produce a single value (and optional kwargs) that
	would be passed to the fields mutator. This also greatly simplfies
	processForm.

	The base widgets should have been updated. As an example of this
	new extension point the newish plone keywords widget replaces the
	plone 1.0 keywords widget. Previously this would have required
	additional javascript or alteration to the procesForm loop. Now
	its the responcibility of the the widget author to make sure if
	you need funky processing it happens in your widget.

	(schema): marked ID as not required in keeping with the plonish
	way of presenting this now, however the widget must mask this as a
	function of the way its displayed or not. The new code handles
	this nicely. Also, ID is invis by default now on the view screen.

	* skins/archetypes/widgets/zid.pt: brought into line with plone
	policy for id display and made to work with portal_factory. This
	deprecates the widget.displayautogenerated stuff that was there
	before, but because we call a script in the skinpath for this
	people that used that may get things back?

	* skins/archetypes/widgets/keyword.pt: updated to plone 2.0 styled
	keyword widgets.

	* skins/archetypes/widgets/epoz.pt: fixed tabindex handling (at
	least with my version of epoz)

	* skins/archetypes/base_metadata.cpt: slightly modularized this so
	you can provide a different header per type or per skin and
	included default that mirrors plone's current metadata text as its
	a good default.

	* skins/archetypes/base_edit.cpt: slightly modularized this so you
	can provide a different header per type or per skin

2003-10-08  Benjamin Saller  <bcsaller@yahoo.com>

	* TemplateMixin.py (getTemplateFor): Made registerTemplate less
	restrictive and TemplateMixin a bit more robust.

	* ArchetypeTool.py (fixActionsForType): Added CMF1.4 support for
	method aliases by defining an aliases dict on the class
	object. This is needed to make TemplateMixin work again as
	_guessMethodAliases would break the view delegate before.

	Refactored the actions code ever so slightly and moved it out of
	extensions and into the archetypes tool.

	Made the TTW type installer call process types and the actions
	code to be sure that modify_fti was called and the correct actions
	installed.


2003-10-03    <demo@bazil.runyaga.org>

	* BaseContent.py (BaseContent.PUT): Dont Trust Content-Type Sent
	By Client. We have the filename, so we can figure it out.


2003-10-03  Sidnei da Silva  <sidnei@dreamcatcher.homeunix.org>

	* BaseUnit.py (newBaseUnit.update): Go with defaults, as we may
	get a string on mimetype here, which is not what we want.
	(newBaseUnit.update): Simplified a bit by using hacked
	getToolByName from PortalTransforms.

2003-09-22  Sidnei da Silva  <sidnei@plone.org>

	* BaseObject.py (BaseObject.getPrimaryField): Moved
	getPrimaryField from BaseContent to BaseObject, so it is available
	to BaseFolder as well.

2003-09-19  Benjamin Saller  <bcsaller@yahoo.com>

	* ReferenceEngine.py: This is a BIG CHANGE. Using the
	multi-catalog code the reference engine is now tooled to use a
	uid_catalog (which is created by the install script). Archetypes
	should have uid_catalog listed in the archetypes_tool/catalogs tab
	in addition to portal_catalog or what ever other cataloging is
	arranged. This helps with the use-case that context is indexed in
	a catalog other than portal catalog for a specific data
	type. Previous to this portal_catalog was needed for UID support
	and hence references to work. This will no longer be the case.

2003-09-14  Sidnei da Silva  <sidnei@plone.org>

	* Registry.py (availableTypes): Created a property type registry.

2003-09-13  Sidnei da Silva  <sidnei@plone.org>

	* ArchTTWTool.py: Added TTW Tool, which will be responsible for
	exporting XML out of the registries, and handling the editing of
	existing content types and adding of new content types.

	* Validators.py: Changed registration to go through our new registry.

	* Widget.py: Registered default widgets.

	* Field.py: Registered default fields.

	* Registry.py: Added a registry, for registering widgets, fields,
	validators, types...

2003-09-06  Sidnei da Silva  <sidnei@plone.org>

	* skins/archetypes/widgets/field.pt: Edit accessor may be None in
	some cases.

2003-09-04  Sidnei da Silva  <sidnei@plone.org>

	* Marshall.py (RFC822Marshaller.marshall): And more marshalling fixes.
	(RFC822Marshaller.marshall): Dang. Missing a parameter to
	getContentType call.

	* BaseObject.py (BaseObject.__getitem__): Avoid breakage when
	fields dont take **kw.

	* Marshall.py (RFC822Marshaller.demarshall): A couple more
	marshalling fixes.

2003-09-05  Benjamin Saller  <bcsaller@yahoo.com>

	* CatalogMultiplex.py (CatalogMultiplex.reindexObjectSecurity):
	First pass at flexible multi-catalog support. This has a very
	simple UI and prolly some impl problems in that it might not be as
	flexible as needed from an extension POV, but it seems to work
	locally. Add a new ZCatalog with a unique id to your Plone site,
	then in the archetypes tool goto the catalogs tab and add the id
	of the catalog and it will start getting updates.

2003-09-04  Benjamin Saller  <bcsaller@yahoo.com>

	* skins/archetypes/widgets/field.pt: adding back visiblity handling to widgets
		widget=Foo(visible={'edit' : 'hidden'}, missing states default to visible
		states can be visible, hidden, invisible


2003-08-08  Sylvain Thénault  <syt@logilab.fr>
	* BaseObject.py: fix addSubObjects, remove _datify and Date

	* ExtensibleMetada.py: remove inheritance of DefaultDublinCoreImpl:)
	not more use of the ObjectField.

        * I18NMixin.py: stop trying to del the title property. Need to
	find a clean way to do this

	* examples/ComplexType.py: remove the MetaDataField, use of
	BaseSchema to avoid buggy metadata. I think we should not make
	PortalContent and PortalFolder using ExtensibleMetaData

	* tests/: make tests working (fix some ones according to new
	implementation, code cleaning)

2003-08-07  Sylvain Thénault  <syt@logilab.fr>
	* config.py: make new base unit the default unit :)

	* Field.py: remove MetadataField, works on unicode for
	String, Lines and Text fields. Override setStorage in TextField
	and I18NMixin.

	* BaseUnit.py: works on unicode, more reliance on the mime types
	registry

	* tests/test_unicode.py: new unit tests testing unicode behaviour

2003-08-04  Sylvain Thénault  <syt@logilab.fr>

	* use generator and validation as Python package instead of zope
	products

2003-07-30  Sylvain Thénault  <syt@logilab.fr>

	* Extensions/utils.py: only run install_subskins if
	product_skins_dir is not None

	* TemplateMixin.py: use StringField instead of Objectfield

2003-07-17  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/content_edit.py (previous): Clearer schemata
	handling. Should fix #770953.

	* BaseObject.py (content_type): Make the RFC822Marshaller the
	default one. Pending tests.
	(BaseObject.SearchableText): Misplaced piece of code, for handling
	LinesField and SearchableText.

	* Marshall.py (RFC822Marshaller.marshall): Small fixes to deal
	with objects without PrimaryField set.

2003-07-16  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/unicodeTestIn.py: Trying to fix current unicode
	state on archetypes. Needs a unicode guru.

	* Schema.py (Schema.validate): Filter empty values on vocabulary lookup.

	* skins/archetypes/widgets/string.pt: Whitespace.

	* skins/archetypes/widgets/keyword.pt: Fill from request if available.

	* skins/archetypes/widgets/multiselection.pt: Reverting Xiru's
	changes and fixing accordingly. Include the default hidden field
	if not required.

	* Validators.py: Zope-dependent validators goes here.

	* skins/archetypes/widgets/field.pt: Display content type if available.

2003-07-15  Sidnei da Silva  <sidnei@redesul.com.br>

	* BaseObject.py: Missing import.

2003-07-11  Sidnei da Silva  <sidnei@x3ng.com>

	* skins/archetypes/base_edit.pt: Show 'default' schemata when
	there is more than one.
	Ops. That wasn't quite it. Fixed accordingly now.

	* skins/archetypes/widgets/multiselection.pt: <input> can't have
	tal:content. I guess it should be value, so changed it to that. It
	is a 'singleton' (or something like that).

	* ArchetypeTool.py (process_types): I was missing this feature for
	a loooong time. Lookup modify_fti on the base classes's modules.

=======
2003-09-06  Sidnei da Silva  <sidnei@plone.org>

	* skins/archetypes/widgets/field.pt: Edit accessor may be None in
	some cases.

2003-09-04  Sidnei da Silva  <sidnei@plone.org>

	* Marshall.py (RFC822Marshaller.marshall): And more marshalling fixes.
	(RFC822Marshaller.marshall): Dang. Missing a parameter to
	getContentType call.

	* BaseObject.py (BaseObject.__getitem__): Avoid breakage when
	fields dont take **kw.

	* Marshall.py (RFC822Marshaller.demarshall): A couple more
	marshalling fixes.

2003-09-02  Sidnei da Silva  <sidnei@plone.org>

	* Field.py (Field.getAccessor): Be more robust about fields
	without accessor.

	* skins/archetypes/widgets/reference.pt: Provide a default value.

	* Field.py (ReferenceField.Vocabulary): Fixed typo in
	vocabylary. Patch by philiKON.

	* BaseUnit.py (newBaseUnit.content_type): Provide a content_type
	method to make ExternalEditor happy (oh, adapters...)

	* Marshall.py (PrimaryFieldMarshaller.marshall): Use __getitem__
	of BaseObject, so we get to use the same effect everywere (get a
	BaseUnit instead of a string).
	(RFC822Marshaller.marshall): Same thing here.

	* BaseUnit.py: Missing parameter on call to update on PUT.

2003-09-01  Sidnei da Silva  <sidnei@plone.org>

	* BaseObject.py (BaseObject.__getitem__): Fixed ExternalEditor
	with Archetypes, by passing maybe_baseunit, which triggers getRaw
	to return the BaseUnit instead of it's string value.

	* Marshall.py (PrimaryFieldMarshaller.marshall): Issue a log
	warning instead of cryptic error if no IBaseUnit returned.

	* BaseUnit.py (newBaseUnit.manage_FTPget): Typo.

2003-08-13  Sidnei da Silva  <sidnei@redesul.com.br>

	* utils.py (DisplayList.keys): Lookup keys/values as their string
	representation as well.

2003-07-31  Sidnei da Silva  <sidnei@redesul.com.br>

	* Field.py (ReferenceField.Vocabulary): Log a warning instead of
	failing when the object cannot be found on the catalog.

2003-07-30  Sidnei da Silva  <sidnei@redesul.com.br>

	* Field.py (FloatField.set): Bah, it was still broken

2003-07-30  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/widgets/multiselection.pt: Fix the
	multiselection widget. It was broken with Zope 2.7.

2003-07-29  Sidnei da Silva  <sidnei@redesul.com.br>

	* tests/test_sqlstorage.py (DummyTool.getConnFor): Fix
	SQLStorageTests by adding the ReferenceEngine as Mixin to the DummyTool.

	* Field.py (ImageField.get): Bah, fixing last minute change that
	broke existing image fields.

	* skins/archetypes/widgets/multiselection.pt: Fix checkbox
	handling on multiselection widget.

2003-07-28  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/displayValue.py: Whoa. A parentesis was out of order.
	Finish by filtering out empty values.

	* Marshall.py (RFC822Marshaller.marshall): Removed TODO
	DublinCoreMarshaller. The RFC822 one should do what the DublinCore
	one intended to do.
	(PrimaryFieldMarshaller.marshall): Make it just a little bit
	smarter. I don't see why this fails to George Pan :(

	* Field.py (Field.validate): Patch by Azazel. Allow passing kwargs
	to the validators, as they seem to already support kwargs in the
	method signatures.

	* BaseObject.py (BaseObject._processForm): As suggested by George
	Pan, have a REQUEST argument on the processForm method to allow
	passing in a REQUEST.

	* skins/archetypes/displayValue.py: Ok, don't join chars with a
	',' if its a not a list (eg: string or unicode) and convert to a
	string if anything else (eg: int, float)

	* Field.py (Image.isBinary): Use return wrapped image in the
	instance context, and use the instance Title where
	possible. Existing images must be re-saved to get this
	functionality. If you want a non-wrapped image, you must pass the
	keyword argument 'unwrapped=1'.

2003-07-26  Sidnei da Silva  <sidnei@redesul.com.br>

	* Extensions/utils.py (filterTypes): Also check base classes to
	see if they implement IBaseObject.

2003-07-23  Sidnei da Silva  <sidnei@redesul.com.br>

	* Field.py (Field.copy): Do a deepcopy, so we don't get references
	for stuff we don't want to change.

2003-07-18  Sidnei da Silva  <sidnei@redesul.com.br>

	* BaseObject.py (BaseObject.__getitem__): Backport slightly
	modified fix from Ben from head. Enables External Editor to work again.

	* Field.py (Field.getMutator): Aha! self.mutator may be None
	actually, with ComputedField.

2003-07-17  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/content_edit.py (previous): Clearer schemata
	handling. Should fix #770953.

	* BaseObject.py (content_type): Make the RFC822Marshaller the
	default one. Pending tests.
	(BaseObject.SearchableText): Misplaced piece of code, for handling
	LinesField and SearchableText.

	* Marshall.py (RFC822Marshaller.marshall): Small fixes to deal
	with objects without PrimaryField set.

2003-07-16  Sidnei da Silva  <sidnei@redesul.com.br>

	* skins/archetypes/unicodeTestIn.py: Trying to fix current unicode
	state on archetypes. Needs a unicode guru.

	* Schema.py (Schema.validate): Filter empty values on vocabulary lookup.

	* skins/archetypes/widgets/string.pt: Whitespace.

	* skins/archetypes/widgets/keyword.pt: Fill from request if available.

	* skins/archetypes/widgets/multiselection.pt: Reverting Xiru's
	changes and fixing accordingly. Include the default hidden field
	if not required.

	* Validators.py: Zope-dependent validators goes here.

	* skins/archetypes/widgets/field.pt: Display content type if available.

2003-07-15  Sidnei da Silva  <sidnei@redesul.com.br>

	* BaseObject.py: Missing import.

2003-07-11  Sidnei da Silva  <sidnei@x3ng.com>

	* skins/archetypes/base_edit.pt: Show 'default' schemata when
	there is more than one.
	Ops. That wasn't quite it. Fixed accordingly now.

	* skins/archetypes/widgets/multiselection.pt: <input> can't have
	tal:content. I guess it should be value, so changed it to that. It
	is a 'singleton' (or something like that).

	* ArchetypeTool.py (process_types): I was missing this feature for
	a loooong time. Lookup modify_fti on the base classes's modules.

2003-07-10  Sidnei da Silva  <sidnei@x3ng.com>

	* Field.py (ImageField.set): Trying to fix 'imgdata referenced
	before assignment' for Lewellyn.
	(ImageField.set): Doh, now 'mimetype refereced before assignment'

	* tests/test_all.py (test_suite): Added test_fields to the
	suite. Added test_widgets, but commented out. It should be run
	standalone, and with caution! It may harm your database.

	* Extensions/utils.py (isPloneSite): More permissive detection of
	a Plone Site (for people using sites created with *REALLY* old
	versions).

	* ArchetypeTool.py (ArchetypeTool._genId): Replaced weak
	implementation by version suggested by Robert Rotterman.
	(TTWSchema.compileSchema): Tentative to fix 'module Form not
	found' messages for people trying to use TTW schema.

	* skins/archetypes/base_view.pt: Define 'errors' so you can use
	edit widgets on the 'view' customization if you want to.

	* skins/archetypes/widgets/selection.pt: Made selection widget
	work with LinesField. I know it wasn't supposed to be like this,
	but I supposed it should work and it didn't worked, so I ended up
	making it work, which is good in the end :)

2003-07-09  Sidnei da Silva  <sidnei@x3ng.com>

	* tests/test_fields.py: Simple tests for 'processForm'.

	* tests/test_widgets.py (WidgetTests.test_widgets): Kids, don't do
	that at home :) I know I warned you guys against using commit() on
	unittests, but theres *really* no easy way out of this. I have to
	get the site commited to be able to reach it through HTTP, and
	hence use ClientForm to test the forms.

2003-07-08  Sylvain Thénault  <syt@logilab.fr>

	* make subobjects working :))) You can access to subobjects
	generated by transformation of new base unit from the
	instance. For instance if there is a 'image.jpg' subobject on
	<yourobject>, you can get it by accessing yourobject_url/image.jpg
	(or yourobject.getSubObject('image.jpg') ).

	* BaseObject.py: new method isTransformable which return true if
	the field is transformable (i.e. TextField based). New methods to
	handle subobjects : addSubObjects and getSubObject (objects are
	stored in sessions). Automatic access to these subojects by
	overriding __bobo_traverse__.

	* BaseUnit.py: use the new idatastream api and the subobjects api
	of BaseObject. Move cache handling to the transforms tool.

	* I18NMixIn.py: docstring cleanup, fix to work with
	BaseObject.__bobo_traverse__.

	* skins/archetypes/widgets/rich.pt: use isTransformable instead
	of isBinary

2003-07-03  Sylvain Thénault  <syt@logilab.fr>

	* added some tests for i18n fields and a basic documentation

        * BaseObject.py: remove the getLanguage function to put it into an
	external python script (getContentLanguage).

	* Field.py: use the external python script to get the current
	language.

	* skins/i18n_content_scripts: some scripts / template to handle
	the current language selection.

	* Schema.py: add hasI18NContent method

	* Extensions/utils.py: add an additional script (change_lang) to
	navigation after content_edit.success to reset the content language

2003-06-25  Sidnei da Silva  <sidnei@x3ng.com>

	* skins/archetypes/widgets/calendar.pt: Updated macro location to
	the recommended new one, which is calendar_slot not calendar_support.

	* utils.py (OrderedDict.reverse): Implemented 'reverse' operation
	on OrderedDict. Returns a reversed copy of the items list without
	modifying the object. Fixes bug #755622 on sf.

2003-06-24  Sylvain Thénault  <syt@logilab.fr>

	* BaseContent.py: add I18NBaseContent

	* BaseFolder.py: add I18NBaseFolder

	* BaseObject.py: fix a bug related to translation state

	* public.py: export I18NBaseFolder and I18NBaseContent

	* skins/archetypes/base_translation.pt: add an hidden input field
	for required but no I18N fields


2003-06-23  Sylvain Thénault  <syt@logilab.fr>

	* BaseObject.py: add methods to handle a master translation and
	others translations states.

	* public.py: add i18N content related actions (not sure they are
	in the right place...)

	* skins/archetypes/base_translation.pt: template to edit a
	translation while viewing the master translation.

	* skins/archetypes/manage_translations_form.pt: form to delete
	existant translations or change the master translation.
2003-06-22  Geoff Davis <geoff@geoffdavis.net> (plonista)

	* ArchetypeTool.py: added mechanism for monitoring object schemae.
	Schema are signed at registration time, and when a schema
	signature changes, it is flagged in ArchetypeTool._types.  Added a
	new tab on the tool that lets you see which types have schema that
	have changed and lets you update all the schema in place.  You
	will need to reinstall Archetypes to make this work.

	* Schema.py: Added toString and signature methods for use with
	update detection.  The toString method could use some improving.
	Also made a minor fix for the case of validating objects in place.

	* Field.py: Added toString and signature methods for use with
	update detection.  The toString method could use some improving.

	* BaseObject.py: Added an automigration method for handling
	updated schema.  The migration method works fine as long as
	calling a mutator on the value returned by an object's accessor
	leaves the object unchanged.  If you have objects for which this
	simple migration mechanism won't work, you will need to override
	BaseObject._updateSchema.

	* tests/test_update_schema.py: A new test to make sure all the
	schema updates work.  The individual subtests all work when run
	individually, but something evil in Archetypes is causing
	POSKeyErrors to be raised when the suite is run.  You will need to
	download the test product ArchetypesTestUpdateSchema for this test
	to run.

	* skins/archetypes/widget/label.pt: Added a skin for a Label
	Widget (a widget used not for data storage, but rather as a kludge
	for displaying text on a form)

2003-06-19  Sylvain Thénault  <syt@logilab.fr>

	* Field.py: add the I18NMixin and create I18N fields for String,
	  Metadata, File, Text, Lines and Image.

	* interfaces/fields.py: added the hasI18NContent method

	* BaseObject.py: add a few methods for I18N content:
	hasI18NContent, getFilteredLanguages and getLanguage

	* skins/archetypes/base_view.py: add a language selector if object
	has I18N content

	* skins/archetypes/base_edit.py: add a language selector if object
	has I18N content

2003-06-18  Sylvain Thénault  <syt@logilab.fr>

	* always use mimetype (and not mime_type) as variable / argument,
	for consistency.

	* TransformTool.py: fix persistence bug in the transformations
	mapping , add support for list and dictionary in
	transforms'configuration.

	* www/configureTransform.pt: use some simple widgets according to
	config metadata.

2003-06-10  Geoff Davis <geoff@geoffdavis.net> (plonista)

	* Field.py: added max_size attribute to ImageField.  max_size is
	a 2-tuple that specifies the maximum width and height for an image.
	Images larger than max_size will be rescaled so that their dimensions
	are <= max_size.  Rescaling preserves the image's aspect ratio and
	requires PIL.

	* Schema.py: fixed a bug in validate when no REQUEST is passed in

	* Widget.py: added size and maxlength attributes to the StringWidget

	* widgets/string.pt: added support for size and maxlength widget
	attributes

	* widgets/zid.pt: allow a form to override member.visible_ids by
	defining a value for the variable visible_ids

2003-06-06  Sylvain Thénault  <syt@logilab.fr>

	* BaseUnit.py: make new base unit working with transforms /
	mimetypes tool.

	* ClassGen.py: add generation of the edit accessor for field with
	the 'w' mode. Edit accessor is like the standard accessor but is
	used before edition of the content. It has been introduced since
	accessor for TextField (i.e. wrapping a BU) return a html / plain
	text version of the content. The edit accessor return the BU
	instance in that case, the same thing as the standard accessor in
	other cases.

	* Field.py: add methods to handle the edit accessor. Add
	transformation in the TextField accessor.

	* Extensions/utils.py (install_tools): install the transforms tool
	and the mimetypes registry.

	* TransformTool.py: new TransformsChain classe, simple policy
	handling

2003-06-04  Sidnei da Silva  <sidnei@x3ng.com>

	* SQLStorage.py (BaseSQLStorage.unmap_fixedpoint): Was causing an
	error if not yet initialized. There is a deep problem in
	archetypes that we need to solve, which is to postpone
	initialization until the object is in the ZODB, currently it is
	being done on a not very friendly order.

	* ArchetypeTool.py (ArchetypeTool.lookupObject): Return None if an
	empty uid was passed.

2003-06-02  Sidnei da Silva  <sidnei@x3ng.com>

	* TransformTool.py (Transform.reload): Got TransformTool and
	MimeTypesTool into a working state, so we can start from
	something. Also, fixed reload method of TransformTool.

2003-05-16  Sidnei da Silva  <sidnei@x3ng.com>

	* utils.py (DisplayList.__add__): Typo. mgsids -> msgids.

	* Field.py (Field.checkExternalEditor): Add check for external
	editor plus permission. This is to make it display the external
	edit link only if it is enabled in plone site_properties (which
	usually means external editor is installed and setup).

	* TemplateMixin.py: Changed references from FieldList to Schema.

2003-05-15  Sidnei da Silva  <sidnei@x3ng.com>

	* Schema.py (Schema.validate): Dont fail if visible_ids is False
	and no id was sent in the request.
	Missing import :(

2003-05-14  Sidnei da Silva  <sidnei@x3ng.com>

	* interfaces/interface.py: Trying to normalize the way interfaces
	are imported in different versions of Zope.

2003-05-13  Sidnei da Silva  <sidnei@x3ng.com>

	* Extensions/utils.py (install_indexes): Changed behavior on index
	instantiation: now uses "TextIndex|FieldIndex:schema". The change
	is in that before this, schema was separated by a pipe, and now it
	uses ':'.

	* skins/archetypes/widgets/calendar.pt: Allow to override calendar
	default value on search widget from request.

	* Storage.py (AttributeStorage.get): Strip acquisition wrappers
	before doing getattr, and try to add them back before returning the value.

	* Field.py (FileField.set): Fixed problem with uploading
	files. Sometimes the mime_type was being wrongly set. Added a test
	to make sure it keeps working.
	(ObjectField.set): Remove acquisition wrappers before going into storage.

2003-05-12  Sidnei da Silva  <sidnei@x3ng.com>

	* ArchetypeTool.py (modify_fti): Get 'global_allow' from the class
	definition, if possible.

2003-05-08  Benjamin Saller  <bcsaller@yahoo.com>

	* Schema.py (Schema.setDefaults): ok, we really do need callable
	default methods but we not have the normal Field.default and the
	Field.default_method that is a name of a method on the instance,
	called with no args and returning the value to be used as the
	default.

2003-05-07  Sidnei da Silva  <sidnei@frodo.x3ng.intranet>

	* skins/archetypes/widgets/textarea.pt: Value is not a valid
	attribute for textareas.

	* Field.py (TextField.getContentType): Changed default to None, or
	else uploaded files of unknown type could end up as text/plain.

	* skins/archetypes/widgets/rich.pt: Display 'download or edit'
	widget.

	* Field.py (Field.getAccessor): Provide a common way for finding
	the accessor and mutator methods.

	* BaseObject.py (BaseObject.isBinary): Improve testing for
	'binaricity' of content.

	* skins/archetypes/widgets/rich.pt: Dont display binary content.

	* ArchetypeTool.py (modify_fti): Set filter_content_types
	accordingly with allowed_content_types or klass attribute.

	* BaseBTreeFolder.py (__getitem__): Cope with BaseBTreeFolder __getitem__.

	* Field.py (FileField.set): Should really store a file, if we want
	it to use external editor with it. This change should not break
	existing instances, but tell me if it does.

2003-05-05  Sidnei da Silva  <sidnei@x3ng.com>

	* BaseObject.py (BaseObject._processForm): Wrong property. Should
	be isMetadata, not metadata.

	* skins/archetypes/widgets/multiselection.pt: Add default value
	for when no option was selected.

2003-05-01  Benjamin Saller  <bcsaller@yahoo.com>

	* ReferenceEngine.py (ReferenceEngine._addBref): There was a
	problem with Brefs getting added more than once since an
	assumption was violated with the addition of relationships. Fixed.

2003-04-30  Benjamin Saller  <bcsaller@yahoo.com>

	* ReferenceEngine.py (ReferenceEngine.addReference): changed the
	before add/del hooks to get passed the name of the
	relationship. Made delete take the name of the relationship and
	introduced a slight policy change as seen in test_singleReference.
	We record a single reference for an (object, relationship) pair,
	but an object can keep many references to a single object with
	different relationships. The delete case was also broken by the
	introduction of relationship types, this has been fixed and a test
	added.


2003-04-30  Sidnei da Silva  <sidnei@x3ng.com>

	* BaseObject.py (BaseObject._processForm): Mispelling. metdata -> metadata.

2003-04-28  Benjamin Saller  <bcsaller@yahoo.com>

	* Referenceable changes: added before Add/Delete hooks for
	target. Added getRelationships which is a list of all types of
	relationships managed for this object.

2003-04-27  Sidnei da Silva  <sidnei@x3ng.com>

	* Marshall.py (RFC822Marshaller.demarshall): Use the mutator
	instead of field.set().
	(RFC822Marshaller.marshall): Add a new line.

2003-04-25  Sidnei da Silva  <sidnei@x3ng.com>

	* tests/test_all.py (test_suite): Was missing a test on the test suite.

2003-04-23  Sidnei da Silva  <sidnei@x3ng.com>

	* Schema.py (MetadataSchema.addField): Layer was not being
	registered, which caused it not to be initialized/cleaned.

	* Storage.py (Storage.__repr__): Uniquefy Storage. Storages dont
	have special attributes, so using two instances need to be like
	one to initializeLayers and cleanupLayers.

	* Marshall.py (Marshaller.cleanupInstance): Avoid trying to delete
	the hook twice. XXX Need to find out why it is being called twice.

	* Field.py (TextField.set): The the mime-type parameter is spelled
	mime_type, also, the new BaseUnit doesnt accepts an instance parameter.

2003-04-22  Benjamin Saller  <bcsaller@yahoo.com>

	* tests/test_referenceable.py
	(ReferenceableTests.test_relationships): Added tests for and the
	ability to define the relationship between references. Look at the
	test for details but know that we can say things like:
		a.addReference('Owns', b)
		a.getRefs() = [..all..]
		a.getRefs('Owns') [b]

	IMPORTANT: The old storage format for reference is no longer
	supported. It should possible to convert to the new model using a
	script and a default relationship type though


2003-04-22  Sidnei da Silva  <sidnei@x3ng.com>

	* Marshall.py (Marshaller.initializeInstance): Method was not
	matching the interface.
	(RFC822Marshaller.marshall): Check by interface, instead of attribute.
	(Marshaller.initializeInstance): Better initialization/cleanup.

	* interfaces/layer.py (ILayerRuntime.initializeLayers): Update
	interfaces to match the real implementation.


2003-04-21  Sidnei da Silva  <sidnei@x3ng.com>

	* BaseContent.py (BaseContent): No ObjectManager here please.

	* Field.py (ImageField): Theres no reason why this coudlnt use
	AttributeStorage by default. Using ObjectManagedStorage breaks it
	when using with BaseContent objects.

	* tests/test_baseunit.py (BaseUnitTest.testSame): Added the same
	tests here as on the transform package, to confirm it works with
	the new BaseUnit.

2003-04-20  Sidnei da Silva  <sidnei@x3ng.com>

	* content_driver/html4zope.py: Fixed Subtitle.

2003-04-19  Sidnei da Silva  <sidnei@x3ng.com>

	* Marshall.py (RFC822Marshaller.demarshall): Adding a bare RFC822
	Marshaller, and fixing lots of typoes :P
	(RFC822Marshaller.marshall): Should use instance['field_name'] to
	reliably access fields. BaseObject.__getitem__ does the right job
	at getting and calliing the accessor.

	* content_driver/reST.py (Converter.convertData): Rendering of
	reST was broken. It was not rendering references the right way,
	and it didnt seem like it was doing the right thing with
	titles. Updated to use docutils.core.publish_string.

	* tests/test_baseunit.py: Added minimal test for BaseUnit.

2003-04-18  Sidnei da Silva  <sidnei@x3ng.com>

	* public.py: Added BaseBTreeFolderSchema. Fixed BaseFolderSchema
	and BaseSchema, now that we have added ExtensibleMetadata in the classes.

2003-04-17  Benjamin Saller  <bcsaller@yahoo.com>

	* ArchetypeTool.py (listTypes): deprecated old listTypes, but keep
	the import working, this should avoid a class of errors coming
	from 'near misses' on the imports


2003-04-16  Sidnei da Silva  <sidnei@x3ng.com>

        * BaseFolder.py: Add ExtensibleMetadata.schema to the Folder
	schema. Otherwise, were dont really implement IExtensibleMetadata.

	* BaseFolder.py (BaseFolder.manage_afterAdd): SkinnedFolder
	subclasses CMFCatalogAware, so, now that Referenceable doenst
	subclasses it anymore, we call SkinnedFolder.manage_afterAdd.

	* BaseContent.py (BaseContent.manage_afterAdd): PortalContent
	subclasses CMFCatalogAware, so, now that Referenceable doenst
	subclasses it anymore, we call PortalContent.manage_afterAdd.

	* Referenceable.py (Referenceable.manage_afterAdd): Dont subclass
	CMFCatalogAware anymore. Some methods were being called twice,
	because of this, and some initialization couldnt be performed
	because it tried to catalog fields that were not being
	initialized, and you couldnt make initialization happen first
	because it could depend on UID being set.

	* ArchetypeTool.py (modify_fti): Setting category to Folder was
	causing bad things. We need to fix plone, because a portal_type
	that is marked as 'use_folder_tabs' dont get tabs of the object category.
	(modify_fti): Hide references if IReferenceable is not implemented
	by the class.
	(modify_fti): Hide metadata if IExtensibleMetadata is not
	implemented by the class.

	* BaseContent.py: Assert that we implement IReferenceable

	* BaseFolder.py: Assert that we implement IReferenceable

	* BaseObject.py: Assert that we implement IReferenceable

	* interfaces/referenceable.py (IReferenceable._verifyObjectPaste):
	Added IReferenceable interface.

2003-04-15  Benjamin Saller  <bcsaller@yahoo.com>

	* Made widget.Description more runtime callable by looking for an
	optional method on the class of its name and returning its value.

2003-04-15  Sidnei da Silva  <sidnei@x3ng.com>

	* skins/archetypes/widgets/lines.pt: Should be :lines, not
	:list. Textareas dont have a value attribute.

	* skins/archetypes/base_view.pt: Allow users to provide custom
	header, body and footer macros for the the autogenerated
	view. This happens by looking for a template named
	'${portal_type}_view' and inside this template, looking for macros
	named 'header', 'body' and 'footer'. The body macro overrides the
	generated field listing. The header macro is inserted at the top,
	replacing <h1>Title</h1> and the footer macro is inserted after
	the field listing.

	* SQLStorage.py: Forgot to import type_map from Storage.py

2003-04-14  Sidnei da Silva  <sidnei@x3ng.com>

	* BaseBTreeFolder.py: Declare the right interfaces we implement.

	* ArchetypeTool.py (modify_fti): Make folderish types actions have
	a category of 'folder', so it works correctly with Plone.

	* public.py: Make Storages and DisplayList available from public.

	* SQLStorage.py: Import only what is needed from Storage.

	* Storage.py (__all__): Restrict whats going to be imported so we
	dont pollute the namespace.

	* BaseObject.py (BaseObject.__getitem__): Was not playing nicely
	with acquisition.

2003-04-12  Sidnei da Silva  <sidnei@x3ng.com>

	* *.py: Removed trailing whitespace and rewrapped some long lines.

	* Marshall.py (PrimaryFieldMarshaller.marshall): Fixing a broken
	import plus moving interface declaration to interfaces subdir.

2003-04-08  Benjamin Saller  <bcsaller@yahoo.com>

	* ArchetypeTool.py (process_types): changed the module level fti
	hook to pass fti[0] as its simpler for the developer

2003-04-07 Sidnei da Silva <sidnei@x3ng.com>

        * Made possible to have multiple fieldsets (they are called
	schemata). Just add "schemata = 'your_fieldset_name' when
	declaring a field. It will show up as a link on your edit form.

	* Blown away validate_metadata.py and metadata_edit.py. You may
	need to fix your portal_properties/form_properties
	[validate_metadata -> validate_base] and
	portal_properties/navigation_properties [metadata_edit ->
	content_edit] on your existing sites.

2003-02-11  Benjamin Saller  <bcsaller@yahoo.com>

	* Field.py (FieldList.__init__): Added the ability for FieldList
	to hold properties itself and be a layer container. Added minimal
	support for the marshalling layer.

	* BaseObject.py (content_type): Makeing title's default='' makes
	this work with ZCTextIndex again on creation.

	* GeneratorTool.py (modify_fti): icon is a name used by the ZMI,
	we don't wanna play in that name space so to specify an icon use
	the content_icon name

	* Marshall.py (Marshaller.__init__): A default marshalling impl
	can store hooks that it will call on the instance that should take
	the data that comes out of the demarshall call and update the
	object as needed.

	* BaseContent.py (BaseContent.PUT): Notion of top level PUT/ftpGET
	handling that deligates to a plugable marshalling layer, this
	abstaction should get some testing at the sprint.

	* Merged some of VladDrak's patches. I am not going to include the
	metadata patch until I've had more time to look it over but I
	don't mind getting that in given a couple of days.

2003-02-03  Benjamin Saller  <bcsaller@yahoo.com>

	* Field.py (FieldList.__init__): Made FieldList take props, made
	fieldlist a layercontainer, added placeholder for marshalling layer

2003-01-30  Benjamin Saller  <bcsaller@yahoo.com>

	* BaseObject.py (BaseObject.__getitem__): Play nice with Aq again

	* GeneratorTool.py (getType): added introspect tab so when people
	as me what types got registered we can just look now.... This is a
	step towards exposing the schema on the web.

	* BaseUnit.py (BaseUnit.__str__): __call__ maps to str for the
	catalog to work.

2003-01-14  Benjamin Saller  <bcsaller@yahoo.com>

	* templates/singleselection_pulldown_body: use the str() to cmp
	the values. better for int keys

	* Field.py (DateTimeField.set): Don't cvt if if you don't need
	to... duh

	* Storage.py: removed deprecated method from iface

	* BaseUnit.py (BaseUnit.reConvert): docstring to publish

	* GeneratorTool.py (modify_fti): allowed_content_types on a klass
	now sets up the fti, yum.
	(listTypes): listTypes specific to a package with the new argument

2003-01-07  Benjamin Saller  <bcsaller@yahoo.com>

	* GeneratorTool.py (process_types): got rid of the old
	view/edit/script dirs in favor of a simple target_dir (its all
	generated code anyway). This should be honored now, with a default
	of the cmft skin directory.

	* Generator.py (Generator.__init__): All references to editable
	are removed from generator and the templates. The str method on
	BaseUnits mostly covers this as we always return the raw object.

	* ClassGen.py (Generator.makeMethod): Generate uniform lambda for
	the created methods, this works now that we delegate to the schema
	all the time. Also gets rid of the methods template directory as
	its not needed anymore.

	* Field.py (FieldList.initalizeLayers): Play nice with the layer
	code, I hope to bulid this out a little more in the future, but
	for now its very simple.

	* cmf_types/DDocument.py (content_type): Broke out the schema to
	the module level, types only keep a ref to it. Also see how the
	type is the composite of BaseContent.type and
	ExtensibleMetadata.type.

	* Extensions/utils.py (install_navigation): changes to all the
	external method calls to skip most of the special metadata
	handling.

	* ExtensibleMetadata.py: Its just called 'type' now, metadata type
	is deprecated and we have more uniform handling of data/metadata.

	* Generator.py (_modes): Generation modes, generate views takes a
	list of either keys to this dict or just new dicts in this format
	that are the modes to be generated. Have fun.

2003-01-05  Benjamin Saller  <bcsaller@yahoo.com>

	* Field.py (FieldList.initalizeLayers): Added Layers calls to
	FieldList and the base Field Object. We explicitly register layers
	and expect that they will get initalized. The idea is that
	subsystems may require particular initalization on the part of an
	instance or an instance's field. The current interfaces support
	this.

2003-01-04  Benjamin Saller  <bcsaller@yahoo.com>

	* ContentTool.py (ContentTool._genId): Mr.Topf caught a bug in id
	generation where I wasn't incrementing the counter
	properly. Patched in accordance with his idea.

	* Storage.py (MetadataStorage.get): Thinking it might make more
	sense to call out to the metadata interface for this, handing off
	the storage concern once again. This can change when storage can
	perform initalization on the object during construction via a
	callback into the schema. Thus each storage item might be able to
	modify the instance if need be.

2003-01-03  Benjamin Saller  <bcsaller@yahoo.com>

	* ExtensibleMetadata.py (metadatatype): Updated field to use
	MetadataField type (and the new Metadata Storage) and removed a
	number of fields that are in the DublinCore but were
	invisible. Trying to let CMFTypes manage these internal fields
	seems to be a mistake so I let the default impl handle it.

	* ClassGen.py (_modes): one more step towards removing editable. I
	will be happy when this is gone

	* BaseObject.py (BaseObject.__init__): Had to move id mgmt to
	later to avoid a special case in the default handling
	(BaseObject.get): delegate through schema

2003-01-02  Benjamin Saller  <bcsaller@yahoo.com>

	* BaseObject.py (BaseObject.Vocabulary): Still trying to figure
	out just what I want to bubble up to this level and what should
	remain in the schema.

	* skins/cmft/collectKeywords.py: use new BaseObject.Vocabulary
	method.

	* Field.py (FieldList._properties): Easier to read/manage way of
	setting Field defaults/properties. See how the other fields use
	the _properties to set defaults and attributes now.

	* debug.py (Log.log_exc): take msg='' and **kwargs now, like log

	* Field.py (ObjectField.get): changed get/set to drive through
	Field.storage (see below)

	* Storage.py: Provide sample storage interface. This layer of
	indirection can be overridden on a per field basis to alter the
	way storage is handled. With the right tool it should be a simple
	task to store large fields on the filesystem or in a RDB of some
	sort.

	* Field.py (FieldList.setDefaults): Simplfied setDefaults, but now
	it really only should be called when object is uninitalized (which
	I may want to track)

	* BaseUnit.py (BaseUnit.PUT): Fixed PUT to use new driver code

	* __init__.py (listTypes): Updated to use generatorTool, still
	generates on initalize though

	* GeneratorTool.py (modify_fti): new tool, moved fti stuff here as
	well as process_types and registerType. Also added "icon" as an
	attribute of your content class so you can override its icon

