Bricolage 1.8.6 Released

The Bricolage development team is pleased to announce the release of
Bricolage 1.8.6. This maintenance release addresses numerous minor issues in
Bricolage 1.8.5 and adds a number of improvements, including SOAP, document
expiration, and bric_queued fixes. The most important changes
include:

Improvements

Added JavaScript code to validate that the username in the user profile does not have leading or trailing spaces.
[David]

Events in the event log are now returned (and displayed) in reverse
chronological order. [David]

The SOAP server now uses a user's template sandbox when executing previews
(such as with bric_soap --to-preview workflow publish). Reported
by Marshall. [David]

Bric::Biz::Workflow now caches calls to allowed_desks(). This
will allow desks to render much Faster, since most assets on a desk
will list the same desks in the Move to select lists. [David]

When the PUBLISH_RELATED_ASSETSbricolage.conf
directive is enabled, aliases are now also republished. Only aliases that have
previously been published will be republished, and only the last published
version will be republished, rather than any versions created since the last
publish. Suggested by Serge Sozonoff. [David]

A story or media document published with an expire date earlier than the
scheduled publish time no longer bothers with the publish but just expires the
story or media document. [David]

Media documents without an associated media file will no longer be
displayed in the search results when attempting to relate a media document to
an element. Reported by Adam Rinehart. [David]

Bug Fixes

Form validation and group management now properly work in the user
profile. [David]

The SFTP mover now works with bric_queued. [David]

Cloned stories now properly set the published_version
attribute to undef rather than the value of the original story,
thus preventing the clone from having a published version number greater than
its current version number. Reported by Nate Perry-Thistle and Joshua
Edelstein. [David and Nate Perry-Thistle]

When a category is added to a story that creates a URI conflict, the new
category does not remain associated with the story in the story profile after
the conflict error has been thrown. Reported by Paul Orrock. [David]

Contributor groups created in the contributor profile are no longer
missing from the contributor manager search interface. Reported by Rachel
Murray and Scott. [David]

The favicon.ico works again. [David]

Stories are now properly expired when
the BRIC_QUEUEDbricolage.conf directive is enabled.
Reported by Scott. [David]

When a template is checked out of the library and then the checkout is
canceled, it is no longer left on the desk it was moved into upon the
checkout, but properly reshelved. Reported by Marshall. [David]

Super Bulk Edit now works for media as well as stories. Reported by Scott.
[David]

When a template is moved to a new category, the old version of the
template is undeployed when the new version is deployed to the new category.
The versions in the sandbox are properly synced, as well.

For a complete list of the changes, see the changes.
For the complete history of ongoing changes in Bricolage, see Bric::Changes.

Bricolage is a full-featured, enterprise-class content management and
publishing system. It offers a browser-based interface for ease-of use, a
full-fledged templating system with complete HTML::Mason, HTML::Template, and
Template Toolkit support for flexibility, and many other features. It operates
in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its
repository. A comprehensive, actively-developed open source CMS, Bricolage has
been hailed as quite possibly the most capable enterprise-class open-source
application available by eWEEK.

Removed trailing commas from 3 arrays, since IE6/Win doesn't like
them. And now everything works in IE. Thanks to Marshall Roch for tracking
down and nailing this problem.

isNum() and isntNum() in TestBuilder.js now
properly convert values to numbers using the global Number() function.

CurrentTest is now properly initialized to 0 when creating a new
TestBuilder object.

Values passed to like() and unlike() that are
not strings now always fail to match the regular expression.

plan() now outputs better error messages.

isDeeply() now works better with circular and repeating
references.

diag() is now smarter about converting objects to strings
before outputting them.

Changed isEq() and isntEq() to use simple equivalence checks
(== and !=, respectively) instead of stringified
comparisons, as the equivalence checks are more generally
useful. Use cmpOk(got, "eq", expect) to explicitly
compare stringified versions of values.

TestBuilder.create() now properly returns a new TestBuilder object
instead of the singleton.

The useNumbers(), noHeader(),
and noEnding() accessors will now properly assign a non-null
value passed to them.

The arrays returned from summary()
and details() now have the appropriate structures.

diag() now always properly adds a # character after
newlines.

Added output(), failureOutput(),
todoOutput(), warnOutput(),
and endOutput() to TestBuilder to set up function reference to
which to send output for various purposes. The first three each default
to document.write, while warnOutput() defaults to
window.alert and endOutout() defaults to the
appendData function of a text element inside an element with
the ID test or, failing that, window.write.

todo() and todoSkip() now properly add #
after all newlines in their messages.

Fixed line ending escapes in diagnostics to be platform-independent. Bug
reported by Marshall Roch.

Ported about a third of the tests from Test::Simple (which is how I
caught most of the above issues). The remaining test from Test::Simple will
be ported for the next release.

Now, there is one outstanding issue I'd like to address before I would
consider this production ready (aside from porting all the remaining tests
from Test::Simple): how to harness the output. Harnessing breaks down into a
number of issues:

How to run all tests in a single window. I might be able to write a build
script that builds a single HTML file that includes all the other HTML files
in iframes or some such. But then will each run in its own space without
stomping on the others? And how would the harness pull in the results of each?
It might be able to go into each of its children and grab the resultsfrom the
TestBuilder objects...

Removed eqArray() and eqAssoc() functions from
TestMore per suggestion from Michael Schwern. The problem is that these
are not test functions, and so are inconsistent with the way the rest of
the functions work. isDeeply() is the function that users
really want.

Changed eqSet() to isSet() and made it into a
real test function.

Implemented skip(), todoSkip(),
and todo(). These are a bit different than the Perl
originals originals so read the docs!

Implemented skipAll() and BAILOUT() using
exceptions and an exception handler installed
in window.onerror.

The final message of a test file now properly outputs in the proper
place. Tests must be run inside an element its id attribute set
to test, such as <pre id="test">. The
window.onload handler will find it and append the final test
information.

Implemented skipRest() in TestBuilder and TestMore. This
method is stubbed out the Perl original, but not yet implemented
there!

The only truly outstanding issues I see before I would consider
these modules ready for production use are:

Figure out how to get at file names and line numbers for better
diagnostic messages. Is this even possible in JavaScript?

Decide where to send test output, and where to allow other output to be
sent. Test::Builder clones STDERR and STDOUT for
this purpose. We'll probably have to do it by overriding
document.write()> , but it'd be good to allow users to define
alternate outputs (tests may not always run in a browser, eh?). Maybe we can
use an output object? Currently, a browser and its DOM are expected to be
present. I could really use some advice from real JavaScript gurus on this
one.

Write tests!

Feedback/advice/insults welcome!

Thursday April 07, 2005

02:31 PM

New JavaScript Testing Method: TestSimple

You can see what the tests look like by loading the files in
the tests/ directory into your Web browser. This is my first stab at
what I hope becomes a complete port. I could use some feedback/ideas on a
number of outstanding issues:

I have made no decisions as to where to output test results,
diagnostics, etc. Currently, they're simply output to document.write(). This
may well be the best place in the long run, though it might be nice to allow
users to configure where output goes. It will also be easy to control the
output, since the output functions can easily be replaced in JavaScript.
Suggestions welcome.

I have no idea how to exit execution of tests other than by throwing an
exception, which is only supported by JavaScript 1.5, anyway, AFAIK. As a
result, skipAll(), BAILOUT(),
and skipRest() do not work.

Skip and Todo tests currently don't work because named blocks (e.g.,
SKIP: and TODO:) are lexical in JavaScript.
Therefore I cannot get at them from within a function called from within a
block (at least not that I can tell). It might be that I need to just pass
function references to skip() and todo(), instead.
This is a rather different interface than that supported by Test::More, but
it might work. Thoughts?

Currently, one must call Test._ending() to finish running
tests. This is because there is no END block to grab on to in
JavaScript. Suggestions for how to capture output and append the output of
_ending() are welcome. It might work to have
the onload event execute it, but then it will have to look for
the proper context in which to append it (a <pre> tag, at
this point).

Anyone have any idea how to get at the line number and file name in a
JavaScript? Failures currently aren't too descriptive. As a result, I'm not
sure if level() will have any part to play.

Is there threading in JavaScript?

I haven't written TestHarness yet. It may not make sense to even have
such a thing in JavaScript; I'm not sure.

I'm using a Module::Build
script to build a distribution. I don't think there's a standard for
distributing JavaScript libraries, but I think that this works reasonably
well. I have all of the documentation in POD, and the script generates HTML
and text versions before creating the tarball. The Build.PL script
of course is not included in the distribution. I started out trying to write
the documentation in JSDoc, but abandoned it for all of the reasons I recounted last
week.

Is there a way to dynamically load a JavaScript file? I'd like to use an
approach to have TestMore.js and TestSimple.js
load TestBuilder.js. I'd also like to use it to
implement loadOk() (equivalent to
Test::More's use_ok() and
require_ok() subroutines).

More details are in the ToDo section of the TestBuilder docs.

Let me know what you think!

Saturday March 19, 2005

01:56 AM

Bricolage 1.8.5 Released

The Bricolage development team is pleased to announce the release of
Bricolage 1.8.5. This maintenance release addresses a number of issues in
Bricolage 1.8.3 and adds a number of improvements (there was no announcement
for the short-lived 1.8.4 release). The SOAP server in particular sees
improvements in this release, with improved character set support; better
support for related stories and media using URIs in addition to IDs; and as
support for top-level element relations. Issues with the ordering of story
elements have also been corrected, as well as errors when attempting to revert
a story or media document or template. Here are the other highlights of this
release:

Improvements

Added Linux startup script contrib/start_scripts/linux.
[David]

Related story and media elements managed through the SOAP server can now
use a combination of URI and site ID to identify related assets in addition to
the existing approach of using story and media IDs. [David]

A list of subelements is now less likely to mysteriously become out of
order and thus lead to strange action-at-a-distance errors. And even if they
do become out of order, the error message will be more appropriate
(Warning! State inconsistent instead of Can't call method
"get_name" on an undefined value). Reported by Curtis Poe.
[David]

The SOAP media interface now supports creating relationships between the
media documents elements and other story and media documents, just like the
SOAP story interface does. [David]

The SOAP interface now supports Related stories and media on story type
and media type elements just as in the UI. This involved the somewhat hackish
necessity for including the related_story_id
and related_media_id (or related_story_uri
and related_media_uri) attributes in the elements XML element,
but it does the trick. [David]

Bug Fixes

Calls to publish documents via SOAP will no longer fail if
the published_version attribute is not specified and the document
to be published has never been published before. [David]

The Bricolage virtual FTP server will no longer fail to start if Template
Toolkit is installed but its version number is less than 2.14. Reported by
Adam Rinehart. [David]

Stories and Media created or updated via the SOAP interface will now
associate contributors of the appropriate type, instead of All
Contributors. [Scott & David]

Deleting an element that has a template no longer causes an error. Thanks
to Susan for the spot! [David]

Eliminated encoding errors when using the SOAP interface to output
stories, media, or templates with wide characters. Reported by Scott Lanning.
[David]

Publishing a published version of a document that has a later version in
workflow will no longer cause that later version to be mysteriously removed
from workflow. This could be caused by passing a document looked up using
the published_version to list()
to $burner->publish_another in a template. [David]

The SOAP server story and media interfaces now support elements that
contain both related stories and media, rather than one or the other.
[David]

Attempting to preview a story or media document currently checked out to
another user no longer causes an error. Reported by Paul Orrock. [David]

Custom fields with default values now have their values included when they
are added to stories and media. Thanks to Clare Parkinson for the spot!
[David]

The bric_queued script now requires a username and password
and will authenticate the user. This user will then be used for logging
events. All events logged when a job is run via the UI are now also logged
by bric_queued. [Mark and David]

Preview redirections now use the protocol setting of the preview output
channel if it’s available, and falls back on using http:// when
it’s not, instead of using the hard-coded http://. Thanks to
Martin Bacovsky for the spot! [David]

The has_keyword() method in the Business class (from which
the story and media classes inherit) now works. Thanks to Clare Parkinson for
the spot! [David]

Clicking a link in the left-side navigation after the session has expired
now causes the whole window to show the login form, rather than it showing
inside the nav frame, which was useless. [Marshall]

The JavaScript that validates form contents once again works with
htmlArea, provided htmlArea itself is patched. See the relevant htmlArea
bug report for the patch. As of this writing, you must run the version of
htmlArea in CVS. [David & Marshall]

The JavaScript that handles the double list manager has been vastly
optimized. It should now be able to better handle large lists, such as a list
of thousands of categories. Reported by Scott. [Marshall]

Uploading a new image to a media document with a different media type than
the previous image no longer causes an Imager error. [David]

For a complete list of the changes, see the changes.
For the complete history of ongoing changes in Bricolage, see Bric::Changes.

Bricolage is a full-featured, enterprise-class content management and
publishing system. It offers a browser-based interface for ease-of use, a
full-fledged templating system with complete HTML::Mason, HTML::Template, and
Template Toolkit support for flexibility, and many other features. It operates
in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its
repository. A comprehensive, actively-developed open source CMS, Bricolage was
hailed as quite possibly the most capable enterprise-class open-source
application available by eWEEK.

Tuesday November 09, 2004

07:08 PM

Bricolage 1.8.3 Released

The Bricolage development team is pleased to announce the release of Bricolage
1.8.3. This maintenance release addresses a number of issues in Bricolage
1.8.2. The most important changes eliminate or greatly reduce the number of
deadlocks caused during bulk publishes of many documents. Other changes
include new contributed scripts for importing contributors and for generating
thumbnail images, Russian localization, and various fixes for database
transaction, template formatting, and various user interface fixes. Here are
the other highlights of this release:

Added contrib/bric_import_contribs to import contributors from a
tab-delimited file. Development by Kineticode, sponsored by the RAND
Corporation. [David]

Added the published_version parameter to
the list() methods of the story, media, and template
classes. This parameter forces the search to return the versions of the assets
as they were last published, rather than the most recent version. This will be
most useful to those looking up other documents in templates and publishing
them, as a way of avoiding pulling documents out from other anyone who might
have them checked out! [David]

All publishing and distribution jobs are now executed in their own
transactions when they are triggered by the user interface. This is to reduce
the chances of a deadlock between long-running publishing
transactions. [David]

Optimized SQL queries for key names or that order by string values to use
indexes in the list() and list_ids() methods of the
story, media, and template classes. [David]

Added Russian localization.
[Sergey Samoilenko].

Changed the foreign keys in the story, media, and formatting (template)
tables so that DELETEs do not cascade, but are restricted. This
means that before deleting any source, element, site, workflow, or other
related object that has a foreign key reference in an asset table, those rows
must be deleted. Otherwise, PostgreSQL will throw an exception. Hopefully,
this will put a stop to the mysterious but very rare disappearance of stories
from Bricolage. [David]

A call to $burner->burn_another in a template that passes
in a date/time string in the future now causes a publish job to be scheduled
for that time, rather than immediate burning the document and then scheduling
the distribution to take place in the future. Reported by Ashlee
Caul. [David]

Changing the sort order of a list of items in a search interface now
properly reverses the entire collection of object over the pages, rather than
just the objects for the current page. Thanks to Marshall for the spot!
[David]

Bug Fixes

Publishing stories not in workflow via the SOAP server works again.
[David]

The Burner object’s encoding attribute is now setable
as well as readable. [David]

The category browser works again. [David]

Fixed Media Upload bug where the full local path was being used, by adding
a winxp key to Bric::Util::Trans::FS to account for an update to
HTTP::BrowserDetect. [Mark Kennedy]

Instances of a required custom field in story elements is no longer
required once it has been deleted from the element definition in the element
manager. Reported by Rod Taylor. [David]

A false value passed to the checked_out parameter of
the list() and list_ids() methods of the story,
media, and template (formatting) classes now properly returns only objects or
IDs for assets that are not checked out. [David]

The cover date select widget now works properly in the clone interface
when a non-ISO style date preference is selected. Thanks to Susan G. for the
spot! [David]

Sorting templates based on Asset Type (Element) no longer causes an
error. [David]

Fixed a number of the callbacks in the story, media, and template profiles
so that they didn’t clear out the session before other callbacks were
done with it. Most often seen as the error Can’t call
method get_tiles on an undefined value in the media profile,
especially with IE/Windows (for some unknown reason). Reported by Ed
Stevenson. [David]

Fixed typo in clone page that caused all output channels to be listed
rather than only those associated with the element itself. [Scott]

Fixed double listing of the All group in the group membership
double list manager. [Christian Hauser]

Image buttons now correctly execute the onsubmit() method for
forms that define an onsubmit attribute. This means that, among
other things, changes to a group profile will persist when you click
the Permissions button. [David]

Simple search now works when it is selected when the Default Search
preference is set to Advanced. Reported by Marshall Roch. [David]

Multiple alert types set up to trigger alerts for the same event will now
all properly execute. Thanks to Christian Hauser for the spot! [David]

Publishing stories or media via SOAP with the published_only
parameter (--published-only for bric_republish) now
correctly republishes the published versions of documents even if the current
version is in workflow. Reported by Adam Rinehart. [David]

Users granted a permission greater than READ to the members of the All
Users group no longer get such permission to any members of the Global
Admins group unless they have specifically been granted such permission to
the members of the Global Admins group. Thanks to Marshall Roch for the
spot! [David]

For a complete list of the changes, see the changes. For
the complete history of ongoing changes in Bricolage, see Bric::Changes.

Bricolage is a full-featured, enterprise-class content management and
publishing system. It offers a browser-based interface for ease-of use, a
full-fledged templating system with complete HTML::Mason, HTML::Template, and
Template Toolkit support for flexibility, and many other features. It operates
in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its
repository. A comprehensive, actively-developed open source CMS, Bricolage was
hailed as quite possibly the most capable enterprise-class open-source
application available by eWEEK.

Bricolage 1.8.2 Released

The Bricolage development team is pleased to announce the release of Bricolage 1.8.2.
This maintenance release addresses quite a large number of issues in Bricolage 1.8.1.
The most important changes were to enhance Unicode support in Bricolage.
Bricolage now internally handles all text content as UTF-8 strings,
thus enabling templates to better control the manipulation of multibyte characters.
Other changes include better performance for searches using the ANY() operators and more intelligent transaction handling for distribution jobs.
Here are the other highlights of this release:

Improvements

Bricolage now runs under a DSO mod_perl as long as it uses a Perl
compiled
with -Uusemymallocor-Ubincompat5005. See The mod_perl
FAQ for details.

Alerts triggered to be sent to users who don't have the appropriate contact information will now be logged for those users so that they can see them and acknowledge them under My Alerts.

Added bric_media_dump script to contrib/.

The category association interface used in the story profile when the ENABLE_CATEGORY_BROWSERbricolage.conf directive is enabled now uses radio buttons instead of a link to select the primary category.
Suggested by Scott Lanning.

Existing jobs are now executed within their own transactions,
as opposed to no transaction specification.
This means that each job must succeed or fail independent of any other jobs.
New jobs are executed before being inserted into the database so as to keep them atomic within their surrounding transaction (generally a UI request).
All this means that transactionality is much more intelligent for jobs and will hopefully eliminate job table deadlocks.

All templates now execute with UTF-8 character strings enabled.
This means that any templates that convert content to other character sets might need to change the way they do so.
For example,
templates that had used <%filter> blocks to convert content to another encoding using something like Encode::from_to($_,
'utf-8',
$encoding) must now use something like $_ = Encode::encode($encoding,
$_),
instead.
Bric::Util::CharTrans should continue to do the right thing.

Added encoding attribute to Bric::Util::Burner so that,
if templates are outputting something other than Perl utf8 decoded data,
they can specify what they're outputting,
and the file opened for output from the templates will be set to the proper mode.
Applies to Perl 5.8.0 and later only.

Added SFTP_HOMEbricolage.conf directive to specify the home directory and location of SSH keys when SSH is enabled.

Bug Fixes

make clone once again properly copies the lib/Makefile.PL and bin/Makefile.PL files from the source directory.

Added missing language-specifying HTML attributes so as to properly localize story titles and the like.

The list of output channels to add to an element in the element profile now contains the name of the site that each is associated with,
since different sites can have output channels with the same names.

The Advanced Search interface once again works for searching for related story and media documents.

Bricolage no longer attempts to email alerts to an empty list of recipients.
This will make your SMTP server happier.

The version numbering issues of Bricolage modules have all been worked out after the confusion in 1.8.1.
This incidentally allows the HTML::Template and Template Toolkit burners to be available again.

Misspelling the name of a key name tag or including a non-repeatable field more than once in Super Bulk Edit no longer causes all of the changes in that screen to be lost.

When a user overrides the global Date/Time Format and Time Zone preferences,
the affects of the overrides are now properly reflected in the UI.

Publishing a story or media document along with its related story or media documents from a publish desk again correctly publishes the original asset as well as the relateds.

Deleted output channels no longer show up in the select list for story type and media type elements.

Deleting a workflow from the workflow manager now properly updates the workflow cache so that the deleted workflow is removed from the left navigation without a restart.

When Bricolage notices that a document or template is not in workflow or on a desk when it should be,
it is now more intelligent in trying to select the correct workflow and/or desk to put it on,
based on current workflow context and user permissions.

Content submitted to Bricolage in the UTF-8 character set is now always has the utf8 flag set on the Perl strings that store it.
This allows fields that have a maximum length to be truncated to that length in characters instead of bytes.

Elements with autopopulated fields (e.g.,
for image documents) can now be created via the SOAP interface.

Fixed a number of the parameters to the list() method of the Story,
Media,
and Template classes to properly handle an argument using the ANY operator.
These include the keyword and category_uri parameters.
Passing an ANY argument to these parameters before this release could cause a well-populated database to lock up with an impossible query for hours at a time.

Template sandboxes now work for the Template Toolkit burner.

For a complete list of the changes, see the changes. For
the complete history of ongoing changes in Bricolage, see Bric::Changes.

Bricolage is a full-featured, enterprise-class content management and
publishing system. It offers a browser-based interface for ease-of use, a
full-fledged templating system with complete HTML::Mason, HTML::Template, and
Template Toolkit support for flexibility, and many other features. It operates
in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its
repository. A comprehensive, actively-developed open source CMS, Bricolage was
hailed as quite possibly the most capable enterprise-class open-source
application available by eWEEK.

Bricolage 1.8.1 Released

The Bricolage development team is pleased to announce the release of Bricolage 1.8.1.
This maintenance release address a number of issues in Bricolage 1.8.0.
Here are the highlights:

Improvements

More complete Traditional Chinese and Simplified Chinese
localizations. Also, the Mandarin localization now simply inherits from the
Traditional Chinese localization.

make clone now copies the lib directory and all of the bin scripts from the target to the clone,
rather than from the sources.
This allows any changes that have been made to scripts and classes to be properly cloned.

When installing Bricolage,
it will now allow you to proceed if the database already exists by asking if you want to create the Bricolage tables in the existing database.
Suggested by Mark Fournier and Marshall Roch.

The installer is now a bit smarter in how it handles loading the
log_config (or config_log, as the case may be)
module.

Added language-specific style sheets.
This is especially useful for right-to-left languages or for languages that require special fonts.

The New Alias search interface now displays thumbnails when searching for media documents to alias and the USE_THUMBNAILSbricolage.conf directive is enabled.

Aliases can now be made to documents within the same site.

The SOAP interface for importing and exporting elements now properly has key_name XML elements instead of name XML elements.
The changes are backwards compatible with XML exported from Bricolage 1.8.0 servers,
however.

Added move() method to the virtual FTP interface.
This means that to deploy a template,
rather than having to rename it locally to append.deploy
one can simply move in FTP to its new name with.deploy on appended to the new name.

Document expirations are now somewhat more intelligent.
Rather than just scheduling an expiration job only if there is an expiration date the first time a document is published,
Bricolage will now always schedule an expiration job for a document provided that one does not already exist (scheduled or completed) for the same time and for one of the file resources for the document.
This should allow people to more easily and arbitrarily expire content whenever necessary.

Burner notes now persist for all sub burns (triggered by publish_another() and preview_another() in a single burn.

Added ability to create and manage groups of objects for several different types of objects.
Also added the ability manage group membership within the administrative profiles for those objects.
This change makes it possible to give users permission to administer subsets of objects.
The new groupable objects are:

Preferences

Groups

Alert Types

Element Types

Keywords

Contributors

Alert rules are now evaluated within a safe compartment (using Safe.pm) to prevent security exploits.

The Bulk Publish admin tool is no longer limited to use only by members of the Global Admins group.
Now anyone can use it.
All one needs is READ permission to the categories of stories,
and PUBLISH permission to the stories and media documents to be published.

Bug Fixes

Eliminated Bareword "ENABLE_HTMLAREA" not allowed while "strict subs" in use warning that prevented startup for some installations.

Changes made to user or contributor contacts without changing any other part of the user or contributor object are now properly saved.

The upgrade to 1.8.0 now correctly updates story URIs that use the URI Suffix of an output channel instead of using the URI Prefix twice.

Related media and story subelements of media documents now work properly.

Calls to preview_another() in Bric::Util::Burner will now use any templates in the current user's sandbox and properly burn them to the preview root rather than to the staging root used for publishing.

Contributor fields for roles other than the default role now properly store and retain their values.

The virtual FTP server now properly checks out templates when a template is uploaded and is already in workflow.

Uploading a non-existent template via the virtual FTP server now correctly creates a new template.
The type of template depends on the name of the template being uploaded,
and for element templates,
on whether there is an element with the appropriate key name.
The user must have CREATE permission to All Templates or to the start desk in the first template workflow in the relevant site.

Reverting a document or template to the current version number now properly reverts all changes to the time the user checked out the document or template.
Reversion is also a bit more efficient in how it looks up the previous version in the database.

The SOAP server now rolls back any changes whenever an error is thrown.
This prevents problems when a few objects are created or updated before an exception is thrown.
Now any error will cause the entire SOAP request to fail.
Thanks to Neal Sofge for the spot!

Bricolage is a full-featured,
enterprise-class content management and publishing system.
It offers a browser-based interface for ease-of use,
a full-fledged templating system with complete HTML::Mason,
HTML::Template,
and Template Toolkit support for flexibility,
and many other features.
It operates in an Apache/mod_perl environment and uses the PostgreSQL RDBMS for its repository.
A comprehensive,
actively-developed open source CMS,
Bricolage was hailed as Most Impressive in 2002 by eWeek.