New Functionality
Workflows
•Add support for workflows to send emails and choose the to/cc/bcc recipients separately. Previously, all recipients were in the "to" section of the email.
•Add support for being able to listen to database events after they have completed.
oCurrently, workflows can only run while the event is in progress, which means the original event can be vetoed.
oSometimes this is useful, such as being able to prevent a booking, but it's also sometimes undesirable if an error in your workflow prevents something being saved.
oWith this new option, it is guaranteed that the workflow cannot impact the change being listened to (which is in some cases desirable).
oIt also means changes cannot be vetoed using this mechanism.
•Add support for a new User Login Workflow Event, triggered when a user logs in.
oThis will allow the system to customise aspects of the user's settings at login time.
oIn particular, modifying the menu a user will use, so that it can be ensured that those with the admin role always get the admin menu.
oIt is also possible to run a VetoWorkflowAction to prevent the user from logging in.
oIt is also possible to which layouts the user will see. Do this by calling the new workflow function addUserLayout, passing in the layout to be used by the user, and the layouts given on the UserLoginWorkflowEvent.
•Add support for TemplatedTextWorkflowAction to parse FreeMarker templates
oThe template provided to a TemplatedTextWorkflowAction provides values that are replaced by references to particular values from the workflow's context.
oThat still happens, and is the first step towards converting the template to the output text.
oThere's now an additional step, if there are any FreeMarker directives in the template, then the template is now also run through FreeMarker.
oThere are values provided for the FreeMarker data model, which can all be accessed using standard FreeMarker syntax. An administrator doesn't need to remember how to do this though - the UI's "Insert" button has a new item that appears in the drop-down. One for selecting a value that FreeMarker will parse, and another for creating a FreeMarker loop through a list of biskits.
oFor example, this is a valid FreeMarker template, where event #1 is a database event for a booking being created:
oHello there ${METAPROPERTIES.user.userIdentity.loginName}, booking made for ${source1.biskit.resource.name}
•Add support to expression workflow action for logical combinations of booleans. This means the expressions below can be used:
Logical AND:
a && b
a AND b
a and b
Logical OR:
a || b
a OR b
a or b
Logical Exclusive OR:
a ^ b
a XOR b
z xor b
Logical NOR:
a NOR b
a nor b
•addUserLayout can only be used as part of a UserLoginWorkflowEvent, and the function will add a layout to those that the user will see. This is used to specify particular layouts for a user so that the way data is presented can be controlled. For example, it may be required to hide the existence of some properties from some users, rather than only hiding the value of those properties.
•expandRepeats takes a repeating item (template, booking etc), or a list of them, and returns a list of the repeating instances.
oSpecify either the start and end dates, or the start date and a number of days.
•intersect was a function that takes two DateRange values and works out the DateRange representing the period they have in common. There are now two more versions of this method. One takes a DateRange and two date/times, and the other takes four date/times.
•createDateRange creates a new DateRange value. There are two versions of it, one that takes no arguments and gives you a range from now to December 2999 and one that takes two date-time values.
•timeDiffSeconds returns the difference in seconds between two times.
•timeDiffMilliseconds returns the difference in milliseconds between two times.
•Add overloaded version of workflow function getBookingTemplates
oThe new version doesn't take a booking as an argument, but all the details that it would need from a booking.
oThat means resource, booker, project, start and finish
•The name of the function added for a CustomFunctionWorkflowEvent that declares that its function can only be called from within its own workflow will now be limited in scope to that workflow.
oIt was already callable only from that workflow.
oNow it will not be considered to clash with a function defined outside the workflow that has the same name.
oA reference to a function will now look for something scoped within the workflow where you're defining the call to the function, and then if it doesn't find it there, it will look in the global scope.
oThis means it is possible to copy-and-paste a workflow that contains a CustomFunctionWorkflowEvent, where previously the save was rejected because it would be creating a new function of the same name as before.
oThis copy-and-paste will only work where the CustomFunctionWorkflowEvent declares its function can only be called from within the workflow. Otherwise, the name of the function will have to be modified before being allowed to save it.
oNote this means an alternative implementation of a global function can be provided, even one provided with the system, but in order to do that, a CustomFunctionWorkflowEvent must be created with both a matching function name and also matching input and output names as well. In other words, the names of the inputs and outputs are seen as an integral part of the function-matching system.
✍Aside: Doing it this way is a design choice made because it allows us to automatically modify any actions that call a function when that function's signature is modified by adding, removing or reordering the parameters. For this to work, the names of the arguments are used to detect the detail of the underlying change and how to modify things accordingly. We take the view that it is better to support automatic modification of user workflows when we make changes to built-in functions than it is to allow custom functions to override functions without a care for input or output names.
•Add support for expression workflow action to create a system event with details of every partial expression evaluated when in verbose mode
oTurn on verbose mode for EvaluateExpressionActionHandler and there will be an event as each part of an expression is evaluated.
•Add new "References" tab to the display for each workflow event and action
oThis shows which other events/actions reference this one (the inbound references) and which other events/actions are referenced (the outbound references).
oWhen the mouse hovers over each reference, the item is highlighted in the tree of actions and items.
oClick on a reference to go directly to that item.
•Perform validation of a workflow and trigger every time they are rendered
oThis means that if there are any inconsistencies within a workflow, event or trigger, just clicking on it or saving it will display an error message.
•When action succeeds but won't run its children, mark system event as such
oThis makes it easier when looking at system events to see whether a TypeCastAction matched or not.
•Display good properties for CreateVariablesAction in system event
•Add collection size to ForEachWorkflowAction output
oWhen a foreach is run and loops through its contents, the output of the foreach now shows the number of items in that collection as well as the current index.
•Add function name and signature to output of function workflow action
•Display details of output from evaluate expression in system event
•Add workflow function generateUserWorkflowEventURL, this allows links to be emailed that will cause a UserWorkflowEvent to be run.
Read Only Calendar
It has been possible to display a read-only bookings calendar for quite some time now, but it wasn't easy for people to use this because it needed a suitable workflow to be created.
Version 8.4 now comes with a default workflow that provides anonymous http access to display a read-only calendar. That means it can be seen without logging in to Calpendo.
The workflow is disabled by default. The minimum require to get it working is:
•Go to the Workflow Manager
•Find the workflow, under "Booking" and called "Weekly Calendar"
•Edit it and enable the workflow, and save it
•Point a web browser at:
•https://yourcalpendo/anon/bookings.html?title=Your Title&pks=1,2,3,4
where the arguments in the URL to control the displayed title may be changed and the IDs of the resources whose bookings should be displayed.
It is possible to see an example of this by going here:
https://demo.calpendo.com/anon/bookings.html?title=Custom%20Calendar&pks=1,2,3,5,6
The displayed data will reflect the permissions of a particular configured user, and that user is by default "admin". This may not be what is required, so if this is turned on, it should be configured to make sure it's not leaking information.
Grouping of Related Items In the Bakery
•Add support for MappedInt, MappedString and StringEnumDef groups in the Bakery
oThis means that items in the bakery can be grouped so that they can be seen to be related.
Tag Properties
Calpendo now supports "tags". These are either string properties or properties that store a set of strings, and any value may be chosen for the string, but the user will automatically be offered values that have previously been used for the same tag.
An administrator might want to prevent certain values being offered as suggestions, and to do this you would search for "Tag" biskits, and modify the relevant one to mark it as deprecated. Alternatively, they could just delete it.
To set this up, in the Bakery there is now a new top-level item labelled "Tag Def" where the flavour of tags that exist can be defined.
To have a single tag property, add a string property in the Bakery and set the string type to "Tag", and then choose the type of tag it is, which will be one of those created in the "Tag Def" section.
To add a property to store multiple tags, add a "set" property, and specify the set contains items of type "string", and "Tag" will automatically be defined as the type of string. Again, choose the type of tag it is, which will be one of those created in the "Tag Def" section.
Choose Which Roles Can Book For Any Project
•Historically, those with the admin role have been able to select any project when making a booking.
•Global preferences now has an option to choose which roles provide this ability.
•This means you can set up any role as meaning that users with that role can select any project in the booking pop-up.
Display Only Authorised Projects When Admin/Resource Manager Makes Bookings
•When an admin makes a booking for a resource that is marked as requiring authorised projects only, we used to show ALL projects.
•This made it difficult for admins who had to pick one that was authorised.
•It now only shows those that are authorised, when the resource says it requires it.
•It was already working this way for non-admins.
Support for Location Based Cascading Menus
•When there is a cascading selection of locations, possibly with many such locations, it is possible to now add a single menu item that will automatically expand out into a cascading set of menu items for users.
•Each menu item will let user display a bookings calendar with the resources in the location they select from the menu.
New Bakery Tool To Find References to Property Paths
This is found in two places:
•On each PropertyDef there's a new "References" button that finds all references to this PropertyDef or any reference to a string property path that might refer to properties with the same name as this PropertyDef.
•Under the "Tools" option at the top-level of the bakery, there's a tool to help locate references to any property path. Type in the name of a property (or something that used to be a property) or the name of a path that might have been used somewhere, such as in conditions. This could be something like "New.owner" or other things with a period in them as well as a simple property name.
Add Auto-Refresh to Calenders
All calendars can now automatically refresh every so often
•The time between refreshes is defined in a Global Preference (in the tab labelled "Security") and a user setting (in a new tab labelled "Refresh").
•By default, user settings will indicate it's the global preferences setting that should be used for the time between automatic calendar refreshes.
•The automatic refresh only happens while a calendar page is displayed.
•If the user visits a calendar page, then goes to a different page for a long time and goes back to the calendar, it will automatically refresh when the user goes back to the calendar.
•If you leave a calendar page displayed and do not interact with it for long enough so that the session expires, then it will automatically switch to the login screen.
Add Support For Pictures of Resources
•In the resource editor, set the picture in the "Picture" tab
•On the bookings calendar, the head of each column that shows the name of the resource now shows a picture when you mouse hovers over it.
Add New Suspended Status For Users
•The new Suspended status allows users to be able to login, but not count towards your user limit. These users will not receive emails but on login will have their status changed to Normal.
Add Support For Logging SMTP Transactions
This provides an option for logging the details of the transaction with an SMTP server, and can be useful in identifying problems with sending emails.
If this is enabled, then every time Calpendo tries to send an email, the system event generated will record the log of the communication with the SMTP server.
This may be helpful for debugging, but is a security risk because the entire content of all emails sent will be recorded in the system events.
So you should:
onot turn this on unless absolutely required
onot leave it turned on after its been finished with
omanually delete any system events containing sensitive email logs if it is turned on
Authentication
Additional authentication options are available that can delegate the authentication to a separate server. This is supported in two new ways:
•an internal authentication method in which a user gives their login name and password to Calpendo, and this is validated by a separate Calpendo server.
•an external authentication method in which the password is never seen, but authentication is delegated to a proxy server. In this configuration, a central Exprodo Software ID server is used for the authentication, and that central ID server is configured for Shibboleth.
The end result of these new options is that we can delegate authentication to proxy servers, and that we can add support for Shibboleth authentication much more easily than we could previously.
Add support for attributes published by a single-sign-on provider to automatically populate user information that appears in the user registration form.
•When installing Calpendo on an external server, this requires the Apache configuration to capture Apache environment variables and make them available as http headers.
•The shibboleth External Proxy authentication run by the Exprodo Software service at https://sp.exprodo.com/ exposes many standard attributes as http headers, although each identity provider that is dealt with may choose to expose each of those attributes to us or not.
•The external authentication in Calpendo can now be set up to provide a mapping from an http header to any string property of a user.
•Multiple headers may be mapped to the same user property, in which case the first one which is actually populate with a value is the one that will be used.
Add support for ExternalProxy authentication to choose a fixed identity provider
•External Proxy Authentication method can now be told which identity provider to use. This avoids the need for users to select their institution when they register and when they log in.
•Therefore it is possible to configure one authentication method specific to the institution and another that doesn't specify the identity provider.
Cancellation Comments
When canceling bookings, there is now an option to provide free-text comments to explain why it is being canceled, as well as the existing facility for choosing from a customisable drop-down of reasons.
iCal Feed
•Add support for anonymised iCal feeds
oAll existing iCal feeds will no longer work
oEach user wanting a feed must ask Calpendo for a URL
oEach user is given a different URL for the same underlying data
oThe URLs used now include a long random string so that it is hard to guess an active feed URL.
•Add special user called ical_viewer
oical_viewer is a new user that will exist in all Calpendos, and you can't change its name, roles or status.
oThis user cannot log in and so does not count towards the number of licensed users.
oWhen generating an iCal feed, it is this new user whose permissions are checked. That means that if you want to hide something from the iCal feed, you would set permissions so that user ical_viewer cannot read the relevant information.
oAll existing and future Calpendos are now given permissions to prevent ical_viewer from seeing who made or owns bookings and also the names of resources.
oIf this information is required to be available in the iCal feed, then permissions will need to be changed to open it up.
•Disable ical feeds
oThis is a precaution following recent security issues and corrects the problem that ical feeds have historically been enabled by default.
oThis reverses that and requires everybody to turn the feed back on if it's required.
•Add support for choice of permissions user when download single booking
oFrom the bookings calendar, you can click on a booking and select the option to download it in ical format so you can add it to some other calendar.
oThere's now a global preferences option to choose whether to control the content of the downloaded data according to permissions for the user doing the downloading or the special ical_viewer user.
oNormally, the ical_viewer user would be the most restrictive, and this is the default.