Woost changelog
1.x
1.0"arkanoid"
Requires cocktail/absinthe.
1.0.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
1.1"bomberman"
The main feature of this release is the addition of the blocks
extension.
Requires cocktail/absinthe.
1.1.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
1.2"castlevania"
The main feature of this release is the support for hosting multiple subsites on a single project/installation.
Requires cocktail/absinthe.
1.2.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
1.3"diablo"
The main feature of this release is the support for synchronizing content across different installations of the same website.
Requires cocktail/baileys.
Removed the
woost.models.FileListing
block. Usewoost.models.PublishableListing
instead. A migration step has been added to convert existing obsolete blocks to the new model.Removed the
woost.models.YouTubeBlock
andwoost.models.VimeoBlock
blocks (along with the image renderers for both). Both block types should be replaced withwoost.models.VideoBlock
. A migration step has been added to convert existing obsolete blocks to the new model.Support for synchronizing content across different installations of the same website. Introduces the following changes:
- Added the
woost.models.SiteInstallation
model - Added the
woost.application.Application.installation_id
property - Added the
woost.models.Item.global_id
member - Added the
woost.models.Item.synchronizable
member - Added the
cocktail.schema.Member.synchronizable
property
- Added the
Added the
woost.application.Application.installation_color
property. This can helps in telling different installations of a site appart at a glance. Also, many styles in the backoffice have been changed to have a more subtle and color neutral appearence, so they can work better with the changing color in the heading.Redesigned the type selection menu in the backoffice.
1.3.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.x
2.0"elite"
The main changes in this release are the adoption of the blocks extension
in the core, the move to the new cache infrastructure provided by the cocktail.caching
package, a new system for composing and resolving URLs and dropping support for all template systems except CML.
Requires cocktail/cointreau.
Merged the blocks extension into the core. The extension can still be imported, but it is deprecated and has no effect.
woost.models.StandardPage
andwoost.extensions.blocks.blockspage.BlocksPage
become deprecated aliases for a newwoost.models.Page
model.Use the cache system introduced by cocktail/cointreau.
- No longer uses Beaker for caching (it is still used to deal with user sessions)
- Added a user action in the backoffice to manually invalidate the cache
- Removed the
woost.models.CachingPolicy.content_last_update_expression
member - Adde the
woost.models.CachingPolicy.cache_tags_expression
member - Cache is now usable even when browsing as an authenticated user:
- User roles are added as a caching key
- The active user indicator in the frontend is now added using javascript, so it is not included in the cached content
Removed the
woost.models.Action
class. Thewoost.models.Change.action
member is now expressed using strings instead.Removed the
woost.models.Item.owner
member, to avoid conflicts when caching content for authenticated users.Removed the support for document drafts, as it didn't mix well with pages based on blocks.
Removed the
workflow
extension, since it didn't work well with block based pages.Removed the
woost.models.Document.attachments
member, since using a listing block instead will be usually preferable.Removed support for per page inclusion of linked scripts and style sheets. This was seldom used and page templates can cover most cases while providing better control.
- Removed the
woost.models.Document.page_resources
member - Removed the
woost.models.Document.branch_resources
member - Removed the
woost.models.Publishable.inherit_resources
member
- Removed the
Removed support for multiple template engines (buffet) in favor of CML templates.
- Most websites were already using CML templates
- Having a single template language simplifies the implementation of the standard templates
- Relying on
cocktail.html
gives us better integration with thecocktail.caching
package (f. eg. in regards to cache entry tagging)
Changed the URL composition / resolution system.
- Removed the
woost.models.PublicationSchema
model and its subclasses - Added the
woost.urlresolver
module - Added the
woost.application.Application.url_resolver
property - The new system should be more efficient (no need to load resolvers from the database) and more friendly to unit tests
- Removed the
Added a
woost.models.initialization.SiteInitializer
class that replaces the oldwoost.models.initialization.init_site()
function. The new class based approach is much more flexible and structured.Added the
woost.models.Block.initialization
member.Improvements to the
googleanalytics
extension.- Added support for the universal API
- Added the
woost.extensions.googleanalytics.utils.add_event()
function
Added the
woost.models.Publishable.is_internal_content()
method.
2.0.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.0.2
The
pdf
extension served files using theapplication/x-pdf
extension; this has been corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.1"frogger"
The main features for this release are support for translation inheritance and user interface improvements in the backoffice.
Requires cocktail/damassine.
User interface improvements in the backoffice.
- Reorganized the controls in listing views, arranging the toolbar in a single row
- Moved the references view to a specific view (loading it outright from the edit/details view could have a heavy impact on objects with lots of references)
- Removed the action bar below the edit view, since tabs make it mostly unnecessary
- Redesigned the visible translations selector in backoffice listings
- Redesigned the visible columns selector in backoffice listings
- Show the frequent views bar on all views
- Improved keyboard navigation
- Autofocus the first control of the login form and the edit view
Removed the Show details user action.
Removed the Print user action.
Changed the pattern for the translation keys of user actions and their shortcuts. The new patterns are
woost.action.ACTION
andwoost.action.ACTION.shortcut
, respectively.Replaced all backoffice dropdown panels with
cocktail.html.DropdownPanel
.Support for translation inheritance and websites with a large number of locales (100+)
- Added the
woost.models.Configuration.fallback_languages
member - Redesigned the translations selector in the edit view
- Added a selector to toggle the visible translations in the blocks editor
- Show values inherited from other translations in backoffice listings
- Added the
Added the
woost.models.TextBlock.heading_icon
member.Added the
annotations
extension.Added the
notices
extension.
2.1.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.1.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.2"gauntlet"
The main change of this release is the overhaul of the permissions system.
Requires cocktail/damassine.
Overhaul of the content permissions system.
The modeling and behavior of the
woost.models.ContentPermission
class has been altered, so this change affects all permissions for creating, modifying, reading and deleting objects.- The
woost.models.ContentPermission.matching_items
member has been removed - The class doesn't use
UserCollection
/UserFilter
anymore - The new implementation uses two new members (
woost.models.ContentPermission.content_type
andwoost.models.ContentPermission.content_expression
) which are used to obtain acocktail.persistence.Query
object encompassing all the objects affected by the permission
The changes provide a big performance boost, while also solving many long standing bugs when creating / editing permissions from the backoffice.
- The
The
language
member ofwoost.models.EmailTemplate
has been renamed tolanguage_expression
, to work around a bug in the backoffice.Changed the default value of
woost.models.rendering.Fill.preserve_vertical_images
toFalse
.woost.controllers.firstchildredirectioncontroller.FirstChildRedirectionController
has been deprecated.Added the
woost.models.rendering.AutoCrop
image effect.Allow images to be upscaled, using the new
upscale
option of thewoost.models.rendering.Thumbnail
andwoost.models.rendering.Fill
image effects.staticsite
extension: added Python expressions to the exporters to enable the postprocessing of the exported static files.Enable the Show published action for blocks.
Added the
woost.models.Document.redirection_mode
member, to choose between several redirection behaviors (temporary, permanent or using javascript).Added the
woost.models.TextBlock.image_footnotes_visible
member, to determine if text blocks should display image footnotes.Added the
woost.models.utils.restore_deleted_item()
function, to simplify the recovery of deleted objects.Added support for including file extensions in the
woost.urlresolver.IdURLScheme
URL scheme.Added an option to have blocks based on a definition list wrap their entries using a <div> element. While this is technically invalid HTML, browsers render it just fine and it simplifies styling enormously.
Improvements to the
shell.py
script.- Added the
woost.scripts.shell
module, to be able to retroactively modify the symbols exported by theshell.py
script of each project - Added the
iter_text()
,get()
,req()
,grep()
,hl()
,replace()
,show()
andedit()
functions
Note that existing projects must regenerate their
shell.py
file, using the template provided inwoost/scripts/project_skeleton/scripts/shell.py
.- Added the
Disable URL processing in TinyMCE; preserve URLs as editors enter them.
2.2.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.2.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.3"hexen"
This branch introduces changes to the publication system, changing the way objects specify which languages they should be published in, and replacing the restrictedaccess
extension with equivalent functionality in the core.
Replaced
woost.models.Publishable.translation_enabled
member with the newwoost.models.Publishable.enabled_translations
collection.Using a collection of published languages, instead of a translated boolean member solves issues derived from the translation inheritance system: for example, in order to state that a derived language shouldn't be published it was necessary to add a translation for that language, which in many cases would be undesirable.
The
restrictedaccess
extension is now deprecated, as its functionality has been merged into the core.- Added the
woost.models.AccessLevel
model - Added the
woost.models.Publishable.access_level
member - Added the
woost.models.Role.access_levels
member
- Added the
Try to use a series of languages when describing objects in the backoffice.
- Added the
woost.models.Configuration.backoffice_language_chain
member - Added the
woost.models.User.backoffice_language_chain
member
- Added the
Added the
variables
extension. The extension makes it possible to apply site wide text substitutions on the produced HTML output.Restored the Changelog action in the backoffice, fixing several issues.
Added the woost.models.Change.is_explicit_change member, to differentiate user initiated changes from side effects.
staticsite
extension: added thewoost.extensions.staticsite.staticsitedestination.AmazonS3Destination
, to support exporting websites to an Amazon S3 bucketSort languages alphabetically in the backoffice.
staticsite
extension: don't remove the directory generated bywoost.extensions.staticsite.staticsitesnapshoter.WgetSnapShoter
. Preserving the directory can aid in debugging, and it works around certain bugs.
2.3.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.3.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.4"ishar"
This release introduces changes to full text searches, further improvements to the permissions system and an assortment of fixes and improvements.
Requires cocktail/feni.
Changes and improvements to permissions.
woost.models.Permission.match()
now receives auser
parameter indicating the user that the permission is being validated for- It is now possible to translate a
woost.models.ContentPermission
object containing a content expression that raises an exception - Added the
woost.models.ContentPermission.subject_description
member, to make it possible to override the description of content permissions
Changes and improvements for text searches.
- Adapted to the changes in the full text search system introduced by cocktail/feni
- Use the
cocktail.schema.HTML
member type where appropiate, to improve full text indexing - Flag several members as not searchable
- Added the
woost.models.utils.search()
function - Include blocks in the body of searchable text of their containers
Added the
woost.models.Item.get_representative_image()
method, to make it easier to have an object use another object as its image.Added the
cocktail.schema.Schema.skip_listing
property, to indicate that a model is a singleton and that selecting it on the backoffice menu should edit its single instance instead. Basically used to speed up the access to thewoost.models.Configuration
object in the backoffice.Added
woost.views.EventsCalendar
as an option for the appearence ofwoost.models.EventListing
blocks, to show events in a month calendar layout.
2.4.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.4.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.5"joust"
This release updates the codebase to match the changes in schema validations introduced by cocktail/gin.
Requires cocktail/gin.
Make
woost.models.Publishable.parent
an indexed member. A migration step has been added to effect this change.Make the generation of block views more flexible.
- Added the
woost.models.Block.get_view_class()
method woost.models.blockutils.create_block_views()
andwoost.models.Block.create_view()
now accept arbitrary keyword arguments
- Added the
Changed the signature of the
woost.views.ActionBar.create_action_button()
method. It now receives a third parameter with the context for the action.woost.models.Publishable.websites
andwoost.models.Website.specific_content
now use sets instead of lists. A migration step has been added to effect this change.Added the
woost.controllers.fileuploader.FileUploader
class, as a more flexible alternative towoost.controllers.uploadform.UploadForm
. The classes provide (mostly) equivalent functionality, but sinceFileUploader
is independant of any controller, it can be used in more situations (f. eg. incocktail.schema.Expansion
adaptation rules).Added a Duplicate action to the backoffice.
Added the
newsletters
extension, to simplify the composition of HTML newsletters that can be sent as e-mail messages.Added a
verbose
parameter to thewoost.models.rebuild_manifest()
functionImprovements to representative images.
- Added the
woost.models.Item.resolve_representative_image()
method woost.models.rendering.ImageFactory.can_render()
now takes into account representative images
- Added the
Added the
woost.views.viewfactory.ViewFacotry.handler_for()
method, to provide more convenient syntax for registering functions as handlers in a view factorywoost.models.Template.identifier
is no longer a unique member. A migration step has been added to effect this change.Added the
woost.controllers.autocompletecontroller.AutocompleteController
class. It is a subclass of the homonimous controller in cocktail, adding permission and publication state checks.Added the
forms
extension, which allows editors to design their own forms.New installer.
Added the
identity
extension, to allow users to authenticate using external identity providers, such as Google and Facebook.
2.5.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.5.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.6"kungfu"
The focus of this release is on improvements to the backoffice user interface.
Requires cocktail/horilka.
Added support for contextual menus in the backoffice.
woost.views.ItemDisplay
replaceswoost.views.ItemLabel
as the default view for elements in the backoffice- Replaced
woost.models.Item.backoffice_heading_view
withwoost.models.Item.backoffice_card_view
- All
BackOffice...HeadingView
classes are renamed to...Card
Suport read only fields in backoffice edit views.
- The
cocktail.schema.Member.editable
property is now defined bycocktail.schema
. Instead of boolean values, now it must be set to any of the following constants: cocktail.schema.EDITABLE
cocktail.schema.NOT_EDITABLE
cocktail.schema.READ_ONLY
woost.controllers.backoffice.editcontroller.EditController
doesn't require modification rights anymore- Added a
woost.controllers.backoffice.editstack.EditNode.get_member_edit_mode()
method that replaces the oldwoost.controllers.backoffice.editstack.EditNode.should_exclude_member()
, which is no longer available. The old method returned a boolean, the new one should return one of the three constants enumerated above. - Added the
woost.controllers.backoffice.editstack.EditNode.verbose_member_mode
property, to aid in debugging why a particular member ends up being editable / not editable / read only
- The
Improvements to the backoffice actions system.
- Action bars will now contain all actions that can be potentially applied to the current context, including actions that only apply to a subset of the listed items. Actions that are not applicable to the active selection will be disabled or hidden. Previously, only actions that could apply to all the elements in the listing were included.
- The action context identifiers ending with the
_extra
suffix are gone; in their stead, the following elements have been added: woost.controllers.backoffice.useractions.UserAction.show_as_primary_action
woost.controllers.backoffice.useractions.UserAction.is_primary()
- Removed functions to add context for user actions:
woost.controllers.backoffice.useractions.add_view_action_context()
woost.controllers.backoffice.useractions.get_view_actions_context()
- Added the
woost.controllers.useractions.UserAction.unregister()
method - Added the
woost.controllers.useractions.UserAction.unregister()
method - Added the
woost.controllers.useractions.UserAction.hidden_when_disabled
property
The
woost.models.blockutils.type_is_block_container()
changes its behavior to only consider the indicated type. The previous behavior (include both the given type and its descendants) is now available under the newwoost.models.blockutils.schema_tree_has_block_container()
function.Improvements to the changelog view.
- Added the
woost.views.ChangeLog
view, which replaceswoost.views.ChangelogTable
- Group the listing by date
- Group similar actions
- Improved the indexing of
woost.models.ChangeSet
andwoost.models.Change
, for a big performance boost. A migration step has been added to effect this change. - Added the
woost.models.ChangeSetHasChangeFilter
user filter, which replaces all previous history related user filters
- Added the
Improvements to woost.controllers.uploadform.UploadForm to ease the customization of the upload fields generated by the form.
- Part of the
woost.controllers.uploadform.UploadForm.upload_options
dictionary is moved to a newwoost.controllers.uploadform.UploadForm.default_upload_options
property - Added the
woost.controllers.uploadform.UploadForm.get_upload_options()
method
- Part of the
New notifications API.
- Added the
woost.controllers.notifications.Notification
class - The old API is still usable. Only users who extended or customized the behavior or appearence of
cocktail.html.NotificationBox
should be affected by the changes.
- Added the
Changes to the
locations
extension.- Added the
woost.extensions.locations.extension.countryreference.CountryReference
class, as a convenience to simplify the declaration of references to countries - Added the
woost.extensions.locations.LocationSelector
view - The
woost.extensions.locations.location.Location.by_code()
andwoost.extensions.locations.location.Location.by_path()
methods were problematic and have been deprecated in favor of the newwoost.extensions.locations.location.Location.by_abs_path()
method. The problem with the old methods is that using relative paths as a search criteria could lead to a single path producing two or more matching elements.
- Added the
Support for tabbed listings in the backoffice.
- Added the
woost.models.Item.backoffice_listing_tabs()
method - Added the
woost.models.Item.backoffice_listing_default_tab()
method
- Added the
Added properties that make it possible/easier to have different display / edit controls / search controls for members in the backoffice.
- Added the
cocktail.schema.Member.backoffice_display
property, which overridescocktail.schema.Member.display
in the backoffice - Added the
cocktail.schema.Member.backoffice_edit_control
property, which overridescocktail.schema.Member.edit_control
in the backoffice - Added the cocktail.schema.Member.backoffice_search_control property, which overrides
cocktail.schema.Member.search_control
in the backoffice
- Added the
The backoffice will now hide object icons in many cases, only displaying them when it feels they will add valuable information to the listing (ie. type distinction on heterogeneous listings or representative images).
Models can explicitly request that their icons be always displayed using the new
woost.models.Item.icon_conveys_information
property.Added the
woost.controllers.backoffice.editstack.StackNode.push_to_stack()
methodImprovements to the Export to MS Excel action in the backoffice.
- Added the
cocktail.schema.Member.included_in_backoffice_msexcel_export
property, to make it easier to exclusde certain columns from the produced spreadsheet - Added the
cocktail.schema.Member.backoffice_msexcel_exporter property
, to make it possible to alter the composition, format and style on a per column basis
- Added the
Add support to
woost.views.ItemCollectionEditor
for the cocktail.html.grouping API, to make it possible to edit lists that require non arbitrary sorting and/or row grouping / hierarchies.Offer more options to determine which translations should be added / enabled when creating / editing an object in the backoffice.
- Added the
woost.models.User.backoffice_visible_translations
member, to toggle translations shown on the backoffice on a per user basis - The new
woost.controllers.cmscontroller.CMSController.choosing_visible_translations
event makes it possible to alter the list of translations to add / enable programmatically
- Added the
Added the
woost.models.utils.rebase_id()
function, to regenerate the unique identifiers all the site objects, starting from the given number.Use case: recreating an existing website (ie. to remake it in a newer version) and forgetting to pass the
--base-id
parameter to the installer.Added the
woost.views.PublishableCollage
view and made it an appearence option forwoost.views.PublishableListing
.Added the
woost.models.utils.show_translation_coverage()
function.Added the
woost.models.importurl
module, to import remote URLs as publishable objects of the site.Added the
woost.models.URI.image
member.Added an API to import/export objects using JSON serialization.
- Added the
woost.models.objectio
module, to simplify the copying of objects between websites - Added convenience methods in
woost.models.utils
: woost.models.utils.copy_to_clipboard()
woost.models.utils.paste_from_clipboard()
woost.models.utils.export_json()
woost.models.utils.import_json()
- Added a dependency to the
clipboard
module
- Added the
Added a dependency to the
enum34
package, to be able to declare enumerations using the syntax provided by Python 3.Hide the
woost.models.Item.creation_time
column by default on backoffice listings.Flag subclasses of
woost.models.Extension
as not instantiable.
2.6.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.6.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.7"lemmings"
The main features of this branch are the upgrade of jQuery, an overhaul of the googleanalytics
extension and new APIs for accessing request context.
Requires cocktail/izarra.
Upgraded jQuery to 1.11.3.
Changes to the
googleanalytics
extension.- Removed support for the old analytics API; assume all properties are using the universal API.
- Added the client side object
woost.ga
- Added the
woost.extensions.googleanalytics.utils.escape_ga_string()
function - Added the
woost.extensions.googleanalytics.utils.get_ga_value()
function - Added the
woost.extensions.googleanalytics.utils.get_ga_custom_values()
function - Removed the
woost.extensions.googleanalytics.utils.add_event()
function. Instead, the following properties have been added tococktail.html.Element
: cocktail.html.Element.ga_event_category
cocktail.html.Element.ga_event_action
cocktail.html.Element.ga_event_label
cocktail.html.Element.ga_event_value
cocktail.html.Element.ga_event_source
cocktail.html.Element.ga_event_env
cocktail.html.Element.ga_event_overrides
- New system for defining custom dimensions and metrics. A new
woost.extensions.googleanalytics.customdefinition.GoogleAnalyticsCustomDefinition
model has been introduced to represent each of the custom dimensions and metrics exported by the website (see also thewoost.models.Website.google_analytics_custom_definitions
member). A migration step has been added to declare the standard dimensions generated by Woost. Site specific dimensions that were declared using thewoost.extensions.googleanalytics.GoogleAnalyticsExtension.declaring_tracker
event will need to be declared by hand. - The CMS now generates Google Analytics events by default for most links and buttons
Replace the image gallery in woost.views.ItemCard with a player or control specific to the presented object (for example, a video player for a YouTube video, a download link for a ZIP file, etc).
- Added the
woost.views.viewfactory.item_card_view_factory
object - Removed
item_image_gallery
andget_item_images()
inwoost.views.ItemCard
- Added the
Removed the old controllers that implemented webservices to create / read / modify / delete content. They had been out of use for a long while.
New APIs for accessing contextual properties:
woost.application.Application.publishable
: provides access to the publishable object for the current request. Previously accessed through thepublishable
key ofcocktail.controllers.context
.woost.application.Application.original_publishable
: provides access to the publishable object that was requested in the current request and replaced because of an error. For example, in a 403 error,app.publishable
will point to the access denied error page whileapp.original_publishable
will point to the document that had been requested. Previously accessed through theoriginal_publishable
key ofcocktail.controllers.context
.woost.application.Application.user
: provides access to the current user. Previously accessed throughwoost.models.get_current_user()
.woost.application.Application.error
: if a request for a publishable object triggers an error, this will contain a reference to the raised exception. Had no previous equivalent.
All the previous APIs still work, but they may issue deprecation warnings.
Added a mechanism to fake the active navigation point in the menu.
- Added the
woost.application.Application.navigation_point
property. - Added the
woost.controllers.navigationpoint.get_navigation_point()
generic method
- Added the
Added the
woost.views.Breadcrumbs
view.Support to customize meta tags, either globally, per website or per document:
- Added the
woost.models.metatags.MetaTags
member type - Added the
woost.models.Configuration.meta_tags
member - Added the
woost.models.Website.meta_tags
member - Added the
woost.models.Document.meta_tags
member
- Added the
Add a default error page.
- Added the
woost.models.DebugPermission
permission type - Added the
woost.models.Website.technical_contact_email
member - Added the
woost.views.Traceback
view - Added the
woost.application.Application.traceback
property - Added the
woost.application.Application.traceback_link_style
property
- Added the
2.7.1
Fixed the version specifier for the dependency on cocktail, to allow variations in microversions.
2.7.2
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.7.3
forms extension: make it possible to override the translation of form agreements.
Revisiones:
2.8"metroid"
The main changes in this release concern the standard page templates.
Requires cocktail/izarra.
Changes to the standard page templates.
- Removed support for HTML4
- Removed the "incomplete translation" notice (hadn't worked - or been in use - for a long while)
- Introduced a
main
tag - Renamed multiple elements
header
->site_header
title_label
->site_title
title_label_text
->site_title_text
site_home_link
->home_link
navigation
->site_navigation
navigation_heading
->site_navigation_heading
main
->main_article
(but see the distinction betweenmain_article
andmain
)content_title_label
->main_heading
content
->main_content
block_content
->main_blocks
footer
->site_footer
toolbar
->cms_edit_panel
- Added or modified several methods:
woost.views.StandardView.get_logo()
becomeswoost.views.StandardView.get_site_logo()
woost.views.BaseView.get_keywords()
becomeswoost.views.BaseView.get_page_keywords()
- Added
woost.views.BaseView.get_site_title()
- Added
woost.views.BaseView.get_main_title()
- Modified
woost.views.BaseView.get_page_title()
so that it combineswoost.views.BaseView.get_site_title()
andwoost.views.BaseView.get_main_title()
- Added Added
woost.views.StandardView.get_main_heading_title()
- Added
woost.views.BaseView.get_page_description()
- Added
woost.views.BaseView.get_page_icon()
Revisiones:Added the
navigation
ARIA role to thewoost.views.Breadcrumbs
view.Revisiones:
2.8.1
The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:
2.8.2
forms extension: make it possible to override the translation of form agreements.
Revisiones:
2.9"nethack"
Requires cocktail/komovica.
Adapted to the changes to static resources in cocktail/komovica.
- Woost static resources moved from
/resources
to/resources/woost
- Site specific static resources moved from
/XYZ_resources
to/resources/XYZ
- Use resource repository URL schemes everywhere (ie.
woost://
) - Added the
woost.application.Application.add_resources_repository()
method - Added the
woost.controllers.cmsresourcescontroller.CMSResourcesController
class
Revisiones:- Woost static resources moved from
Use
woost.views.Link
inwoost.views.PublishableListing
classes.- Removed the
woost.views.PublishableListing.get_item_uri()
method - Added the
woost.views.PublishableListing.create_publishable_link()
method
Revisiones:- Removed the
Removed the workaround for IE to support column layouts in text blocks.
Revisiones:Added the
woost.models.Document.custom_document_title
member.Revisiones:Added the
woost.views.BlockList.get_blocks()
methodRevisiones:Added the
woost.views.ExtractNewsListing
view.Revisiones:Use
woost.views.Link
inwoost.views.ThumbnailLink
.Revisiones:Added the
woost.views.Link.force_download
property.Revisiones:Added the
attributes
extension.Revisiones:Added the Google Tag Manager extension.
Revisiones:Support reading the values for custom Google Analytics dimensions and metrics from data- attributes.
This change modifies the extension to make it able to work alongside the new
attributes
extension.woost.ga.getEventData()
now gathers data from bothdata-ga-event-data
and customdata-
attributes- Made
woost.extensions.googleanalytics.customdefinition.CustomDefinition.initialization
optional - Added the
woost.ga.setCustomDefinitions()
client side method - Added the
woost.ga.customDefinitions
client side property - Generate
data-ga-
attributes for theelement
Revisiones:Added an option to select a default image for Open Graph.
Revisiones:The
pdf
extension served files using theapplication/x-pdf
extension. Corrected toapplication/pdf
. Some user agents (notably, some versions of the Android download manager) couldn't deal with the first form.Revisiones:Fixed the default value for
woost.models.TextBlock.image_close_up_factory
.Revisiones:
2.10"outrun"
The main changes in this version are the adoption of SASS, the support for alternative views on all blocks and the introduction of visual grids.
Requires cocktail/komovica.
Improvements to the
woost.models.Block
model.- Support different views per block type. The change allows all block types to support different views (like some blocks already did on their own, such as
woost.models.PublishableListing
orwoost.models.NewsListing
). woost.models.Block.element_type
is now a standard member of all blocks (most blocks ended up adding it anyway). Thewoost.models.ElementType
member type is gone.woost.models.Block.heading_type
remains, but some of its values now reside in a newwoost.models.Block.heading_display
member- Blocks with a visible heading now default to a
section
/h1
combination - Most block members can now be set to a -- Default -- value, intended to respect the values set by the chosen view class
- Rearranged the fieldsets / tabs for
woost.models.Block
,woost.models.TextBlock
and others. Thebehavior
member group has been renamed topublication
. woost.controllers.backoffice.AddBlockNode
is replaced bywoost.controllers.backoffice.BlockEditNode
Revisiones:- Support different views per block type. The change allows all block types to support different views (like some blocks already did on their own, such as
Better integration with SASS.
- Added
libsass
as a dependency - Support SASS code in the block embedded styles
- Support SASS code in user styles
- Renamed
woost.models.Block.inline_css_styles
towoost.models.Block.embedded_styles
(requires a migration) - Added the
woost.models.Block.embedded_styles_initialization
member - Added the
woost.models.Style.declarations_initialization
member - Use
cocktail.schema.CodeBlock
for all style fields, with language set to SASS
Revisiones:- Added
Added slots to define footer blocks (most sites ended up defining these themselves).
- Added the
woost.models.Configuration.footer_blocks
member - Added the
woost.models.Website.footer_blocks
member - Added the
woost.views.StandardView.site_footer_blocks
element - Removed the
woost.views.StandardView.vcard
element
Revisiones:- Added the
New API to create
woost.models.File
objects from filesystem paths and file-like objects.- Added the
woost.models.File.import_file()
method - Added a
file
parameter to thewoost.models.File
constructor - Deprecated
woost.models.File.from_path()
The new API can be invoked from the File constructor, which is convenient when mixed with the
cocktail.persistence.PersistentObject.new()
class method. Also, it supports loading files from file-like objects, not just file system files, and provides better control over which parts of the File instance should be initialized using data from the imported file.Revisiones:- Added the
Added support for visual themes and grids.
- Added the
woost.models.Theme
model - Added the
woost.models.Configuration.theme
member - Added the
woost.models.Website.theme
member - Added the
woost.models.Template.theme
member - Added the
woost.models.Document.theme
member - Added the
woost.application.Application.theme
property - Added the
woost.models.Grid
model - Added the
woost.models.GridSize
model - Added visual rulers for the site's grid (activated by appending a
#rulers
hash to page URLs)
- Added the
Added responsive navigation elements to the base site template.
- Added the
woost.views.SmallScreenNavigation
view - Added the
woost.views.StandardView.small_screen_navigation
element
Revisiones:- Added the
Added several events to customize blocks in a cleaner, standard way, avoiding the need to monkey patch block classes in common customization scenarios.
- Added the
woost.models.Block.initializing_view
event - Added the
woost.models.PublishableListing.selecting_items
event - Added the
woost.models.NewsListing.selecting_items
event - Added the
woost.models.EventListing.selecting_items
event
- Added the
Added a member to define alternative titles for menus.
- Added the
woost.models.Publishable.menu_title
member woost.views.Menu
will now give preference to menu_title and fall back to the generic translation
Revisiones:- Added the
Allow ContainerBlock to have background images.
Added the following elements:
woost.models.ContainerBlock.background_image
woost.models.ContainerBlock.background_image_factory
woost.views.ContainerBlockView.background_image
woost.views.ContainerBlockView.background_image_factory
Revisiones:Added the
woost.views.VCard
view.Revisiones:woost.views.IdentityBox
now exposes adata-woost-auth-state
attribute.Revisiones:Provide a
T
variable in the site shell that exposes thecocktail.schema.TranslatedValues
class in a convenient manner.Revisiones:Attributes extension: refactored the element initialization code.
- Added support for passing arbitrary context to initialization code blocks (the
env
parameter ofwoost.extensions.attributes.utils.init_element()
andwoost.extensions.attributes.utils.iter_attributes()
) - Added attributes to
cocktail.html.Element
(following the same pattern of the Google Analytics extension) to control element initialization
Revisiones:- Added support for passing arbitrary context to initialization code blocks (the
The autohiding behavior of
text_container
inwoost.views.TextBlockView
should account for theheading_alignment
property.Revisiones:googleanalytics: handle missing attributes when invoking woost.ga.eventTrigger(); don't trigger events unless both eventCategory and eventAction are defined.
Revisiones:Optimized the resolution of permissions that operate on whole types.
Revisiones:Cache the
woost.models.Configuration.instance
property.Revisiones:Overhauled client side caching.
The previous implementation used content hashing to produce the value for the
ETag
header. This is a very fragile approach, as CML based documents tended to produce inconsistent values (the declaration order for client parameters is not guaranteed, andcocktail.html.element.Element.require_id()
includes a timestamp). Thus, the produced ETags varied between requests, breaking client side caching.The new approach uses timestamps as ETags, updating them whenever a document is rendered or one of its dependencies (as stated by
cocktail.html.element.Element.depends_on()
) is modified.Some observations:
- The new system makes it unnecessary to produce the content for a request if the stated
ETag
matches the last known document state. The previous system needed to generate it in all cases, to compute theETag
hash and compare it with the one provided by the client. - Client side caching now requires a cache storage (the timestamp for each served document is stored in the cache)
- Client side caching now requires explicit dependency definition (
cocktail.html.element.Element.depends_on()
), just like server side caching - The structure of the entries of the site's cache has changed (to add the timestamp), so be sure to flush the cache after applying this upgrade
- A new property,
woost.models.Publishable.cacheable_server_side
, compliments the already existingwoost.models.Publishable.cacheable
. Server side caching is disabled forwoost.models.File
objects by default.
Revisiones:- The new system makes it unnecessary to produce the content for a request if the stated
2.11"pacman"
This release replaces the URL mapping system, introduces the staticpub
extension and adapts to the translation API changes in cocktail 2.11.
Adapted to the translation API changes in cocktail 1.11.
- Removed the woost.translations package, replaced with multiple
.strings
files - The directory skeleton for new sites no longer includes a translations package
- The
-menu
suffix for the translation keys of model members becomes.backoffice.menu_label
Revisiones:- Removed the woost.translations package, replaced with multiple
Disabled several old extensions.
- blocks
- campaignmonitor
- comments
- facebookpublication
- shop
- twitterpublication
- usermodels
- webconsole
Revisiones:New URL mapping system.
The previous system for parsing and building content URLs was severely limited:
- Protocol and domains were set based on hard coded policies
- Websites could only be mapped to domains
- Languages could only be mapped to the first path component
- The publishable object could only be mapped to the path
- All those systems were essentially hard coded and not interoperable
The new system provides a single, extensible point of configuration to push or pop information from/into content URLs.
- Removed the
woost.urlresolver
module, replaced withwoost.urlmapping
- Renamed
woost.application.Application.url_resolver
towoost.application.Application.url_mapping
- Changes to
woost.models.Item.get_uri()
andwoost.models.Item.get_image_uri()
: - Return
cocktail.urls.URL
objects instead of plain strings - No longer accept
"."
as a value for theirhost
parameter - Gained a
website
parameter - Can now receive arbitrary keyword parameters, to be forwarded to the URL mapping process
- Removed the
encode
parameter - Removed the
woost.models.Item._fix_uri()
method - Changes to
woost.controllers.CMSController
: - Removed the
woost.controllers.CMSController._process_path()
method - Renamed
woost.controllers.CMSController.canonical_redirection()
towoost.controllers.CMSController._enforce_canonical_url()
- Removed obsolete and deprecated members:
woost.controllers.CMSController.uri()
woost.controllers.CMSController.translate_uri()
woost.controllers.CMSController.image_uri()
woost.controllers.CMSController.language
woost.controllers.CMSController.authentication
woost.controllers.CMSController.LanguageModule
woost.controllers.CMSController.AuthenticationModule
- Changes to
woost.languagescheme.LanguageScheme
: - Removed
woost.languagescheme.LanguageScheme.translate_uri()
, usewoost.urlmapping.URLMapping.transform_url_request()
instead - Removed
woost.languagescheme.LanguageScheme.language_to_uri_component()
- Removed
woost.languagescheme.LanguageScheme.uri_component_to_language()
- Changes to
woost.models.Configuration
: - Removed the deprecated
woost.models.Configuration.resolve_path()
method - Removed the deprecated
woost.models.Configuration.get_path()
method - Removed obsolete modules:
woost.controllers.language
woost.controllers.authentication
Revisiones:Introduced the
staticpub
extension.Internal refactoring of the user actions system.
The
add_integral
action was broken: it used a link to pass the desired type for the new object on its query string. Since it didn't use a POST, unsaved form data was not entered into the edit stack and was therefore lost.To fix this, user actions can now receive parameters (such as said type, or the relation they work uppon). This has caused many changes:
- The POST format for user actions changes; it can now include extra parameters and reference other form fields in the part that designates the selected targets
- All the logic to select and activate a user action based on the current request has been moved to
BaseBackOfficeController
. Removed specific logic inContentController
,EditController
,EditBlocksController
,ChangeLogController a
ndItemFieldsController
. - Changes to the
woost.views.ActionBar
class: - Removed the
woost.views.ActionBar.action_parameter
property - Removed the
woost.views.ActionBar.submit_action_target
property - Added the
woost.views.ActionBar.selection_field
property - Added the
woost.views.ActionBar.relation
property - Added the
woost.views.ActionBar.hide_disabled_actions
property - Changes to the
woost.controllers.backoffice.UserAction
class: - Changed the signature of
woost.controllers.backoffice.UserAction.get_errors()
- Changed the signature of
woost.controllers.backoffice.UserAction.invoke()
- Added the
woost.controllers.backoffice.UserAction.get_parameters_schema()
method - Added the
woost.controllers.backoffice.UserAction.get_parameter_members()
method woost.controllers.backoffice.UserAction.get_dropdown_panel()
now receives a reference to awoost.views.ActionBar
object instead of the action's target- New actions and abstract base classes:
woost.controllers.backoffice.useractions.CreateAction
woost.controllers.backoffice.useractions.SelectRelatedObjectAction
woost.controllers.backoffice.useractions.RelateNewIntegralObjectAction
woost.controllers.backoffice.useractions.AddNewAction
(replaceswoost.controllers.backoffice.useractions.AddIntegralAction
)woost.controllers.backoffice.useractions.PickAction
woost.controllers.backoffice.useractions.PickNewAction
woost.controllers.backoffice.useractions.UnlinkAction
- Reimplemented
woost.views.ItemSelector
as a CML template, use awoost.views.ActionBar
instead of a custom set of buttons - The dropdown menu for the
new
andadd_new
(the oldadd_integral
) actions is now defined by the get_dropdown_panel() of their CreateAction base class. Until now it was replicated in several places.
Revisiones:Support SVG files in
woost.views.Image
.Revisiones:Introduced default document templates.
Until now, each document had to specify its template explicitly. This presented two problems:
- It was wasteful. In most cases, all documents of a type used the same template. Having each instance specify their template was inefficient (template objects ended up with a list containing all related documents using the template, which could escalate quickly).
- It made it difficult to choose templates based on dynamic or contextual parameters. For example, using different templates depending on the active website.
The new system still offers the
woost.models.Document.template
member, which works as before, but couples it with new elements that make it possible to specify site wide default templates for all instances of a document type:- Added the
woost.models.Document.get_template()
method - Added the
woost.models.Document.get_default_template()
method - Added settings in
woost.models.Configuration
andwoost.models.Website
to specify the default templates for all standardwoost.models.Document
subclasses (default_page_template
,default_news_template
anddefault_event_template
)
As a side effect, a new member subgroup has been added to both
woost.models.Configuration
andwoost.models.Website
(presentation.appearence
), and thetheme
member for both has been relocated inside it.Implementers should replace snippets like this:
default_template = schema.DynamicDefault(
lambda: Template.get_instance(qname = "...")
)
with an override of the
woost.models.Document.get_default_template()
method.A migration is provided to automatically remove redundant references to a default template. It does a best effort attempt; site developers should check the results and adjust as needed.
Revisiones:Make it possible to add CSS classes to documents.
- Added the
woost.models.Document.styles
member - Added the
woost.models.Style.applicable_to_documents
member
Revisiones:- Added the
Enable blocks to customize the HTML for their heading.
- Added the
woost.models.Block.custom_heading
member - Added the
custom
option for thewoost.models.Block.heading_display
member - Added the
woost.models.Block.get_heading()
method
Revisiones:- Added the
Changes to
woost.models.Document.inner_title
- Now supports HTML
- Changed its visible name, to align it with
woost.models.Block.custom_heading
woost.views.BaseView.get_main_title()
now ignores it- Add a
with_custom_heading
CSS class towoost.views.StandardView
if the active document defineswoost.models.Document.inner_title
Revisiones:Added the
woost.grid
client side packageRevisiones:forms extension: Added the
woost.extensions.forms.fields.OptionFieldOption.enabled
member.This makes it possible to remove options from a closed set field without affecting the requests that may have selected it and been already stored.
Revisiones:Optimized
woost.models.Item.get_cache_expiration_for_type()
for indexed membersRevisiones:variables
extension: support passing positional parameters to dynamic variablesRevisiones:Added the
woost.models.utils.import_remote()
function.Also, added the
woost.app.default_remote_host
andwoost.app.default_remote_python_executable
properties as a convenience for calling the new function.Revisiones:Support
javascript:
URLs inwoost.models.URI
objects.Revisiones:
2.12"quake"
The main features of this branch are the automatic generation of robots.txt files, an overhauled extension for sitemaps and more flexible APIs for querying publication state.
Requires cocktail/mezcal.
Make publication state checks more flexible.
Until now, publication checks (the
woost.models.Publishable.is_published()
/woost.models.Publishable.is_accessible()
methods, and thewoost.models.IsPublishedExpression
/woost.models.IsAccessibleExpression
classes) only considered the active language and website when computing their results. This changeset makes it possible to indicate which languages and websites should be considered. The default behavior will still use the active context, so the changes should be backwards compatible (except for the"any"
value in the methods; see below).- Make the
language
andwebsite
parameters towoost.models.Publishable.is_published()
andwoost.models.Publishable.is_accessible()
accept multiple values, as well as the newwoost.models.Publishable.any_language
/woost.models.Publishable.any_website constants
. - Added the
language
andwebsite
properties and constructor parameters towoost.models.IsPublishedExpression
andwoost.models.IsAccessibleExpression
- The
website
parameter ofwoost.models.Publishable.is_published()
/woost.models.Publishable.is_accessible()
no longer accepts an"any"
value; passwoost.models.Publishable.any_website
instead.
Revisiones:- Make the
Automatically generate a
robots.txt
file, relocaterobots_should_index
.Until now, disabling indexing for specific content was only possible for instances of the
woost.models.Document
model since the CMS used a<meta>
HTML tag to achieve this, therefore requiring an HTML template). With this change, the CMS will now automatically generate arobots.txt file
, based on therobots_should_index
member. As a consequence, the member has been moved to thewoost.models.Publishable
model.Sites can customize the generated
robots.txt
file using any of the events provided bywoost.controllers.robotscontroller.RobotsController
, or outright disable the automatic generation by
placing a customrobots.txt
file in the document root of the web server.Revisiones:Complete overhaul of the
sitemap
extension.- Introduced a
woost.extensions.sitemap.SiteMap
model, which makes it possible to define (and customize) multiple different site maps. - It is now possible to generate multiple URLs for each element (for example, for pages with query string parameters or dynamic paths)
- Support for multi language site maps, using
rel="alternate"
- Automatic declaration in the
robots.txt
file <priority>
is now omitted by default, unless explicitly set to anything other than 0.5<lastmod>
is no longer included in the default site map; computing this reliably is impossible for most content- The
woost.models.Publishable.sitemap_indexable
member has been removed; usewoost.models.Publishable.robots_should_index
from the core instead - Moved the site map configuration members in
woost.models.Publishable
to themeta.robots
tab
Revisiones:- Introduced a
Added the
woost.models.Website.get_published_languages()
method.Revisiones:Support multiple background images in text blocks.
Revisiones:Use the
woost.views.BaseView.get_main_title()
method to obtain the document's main heading.Revisiones:Make the
woost.views.Link
view add the hostname to its target URL when necessary.Revisiones:Limit the size of SVG thumbnails in the backoffice.
Revisiones:Optimized
woost.models.Item.get_cache_expiration_for_type()
for indexed members.Revisiones:Added the
woost.publishable
andwoost.navigationPoint
client side variables.Revisiones:Cache the navigation for small screens by default.
The menu for small screens can be expensive to render on sites with a big page tree. This changeset enables caching for it, making all pages share the same rendering, which can lead to a substantial performance improvement. Note that as part of the change, the menu now selects the active menu entry client side.
Note that the site will need to configure a storage for
cocktail.html.rendering_cache
to benefit from this.Revisiones:woost.models.CachingPolicy
always included query strings in the caching key.This was redundant (the key was qualified by default with the full set of parameters) and also made it impossible to ignore certain parameters using
woost.models.CachingPolicy.cache_key_expression
).Allow container blocks to have a link
- Added the
woost.models.ContainerBlock.link_destination
member - Added the
woost.models.ContainerBlock.link_parameters
member - Added the
woost.models.ContainerBlock.link_opens_in_new_window
member
Revisiones:- Added the
Improvements to the 'Add block' dialog in the backoffice.
- Better layout
- Search box
Revisiones:Improvements to
shell.py
.- Added a
fetch()
function.fetch(Model, *args, **kwargs)
is the same aslist(Model.select(*args, **warkgs))
. - Added
tr
as an alias forcocktail.translations.translations
- Automatically import several classes of the Python standard library that are used frequantly in interactive sessions:
decimal.Decimal
collections.Counter
collections.defaultdict
datetime.date
datetime.time
datetime.datetime
datetime.timedelta
Revisiones:- Added a
Complete overhaul of cost calculations on the
ecommerce
extension.Revisiones:Added an
scheme
parameter towoost.urlmapping.URLMapping.get_url()
andwoost.models.Item.get_uri()
Revisiones:Added the
BECOME_DIV
option forwoost.views.Link.inactive_behavior
Revisiones:locations
extension: Added thewoost.extensions.locations.location.Location.get_country()
methodRevisiones:Make
woost.models.objectio
more convenient.woost.models.objectio.ObjectImporter
now has anobjects
property, making it easier to access all the objects it imported- The constructor for
woost.models.objectio.ObjectImporter
now accepts a file or a JSON string (no need to instantiate and load in two steps) - Most
woost.models.objectio.ObjectImporter
attributes can now be set through the constructor - Import the most relevant
woost.models.objectio
classes automatically intoshell.py
sessions
Revisiones:Improve the results of some image processing effects on palette based images.
Added the
woost.models.rendering.imageeffects.requires_rgb()
decorator to temporarily convert images to RGB, applied
it to several image factory effects.Revisiones:googlesearch
extension: Site Search discontinued, moved to the Google CSE Json API.Revisiones:Added the
woost.models.with_default_template
class decorator, to simplify the declaration of site wide default templates for site specific models.Revisiones:Introduced changes to minimize the risk of keeping object cycles alive when rendering pages, which ramps up memory consumption over time.
- Call
cocktail.html.Element.dispose
after rendering document templates - Delete the references to
block
andview
inwoost.models.Block.initialization
after executing the code snippet
Revisiones:- Call
Introduced the
woost.models.PublishableObject
mixin class.The new mixin allows models to gain all the behavior of the
woost.models.Publishable
class, without being forced to extend it, which can be undesirable in many cases.Also, the following supporting functions have been added:
woost.models.get_publishable()
woost.models.get_publishable_by_full_path()
Revisiones:Improvements to
woost.urlmapping.DescriptiveIdInPath
:- Added the
woost.urlmapping.DescriptiveIdInPath.applies_to_publishable()
method - Added the
woost.urlmapping.DescriptiveIdInPath.allow_slashes_in_title
property - Added the
woost.urlmapping.DescriptiveIdInPath.escape_title()
method
Revisiones:- Added the
Generalized the support for application wide contextual properties.
- Introduced the
woost.application.ContextualProperty
class - All existing contextual properties are now implemented as subclasses of
woost.application.ContextualProperty
- Added the
woost.application.Application.clear_context()
method
Revisiones:- Introduced the