Table Of Contents
- Upgrading to 10.0
- New Features
- New Enterprise Features
- Workflow Changes
- User Interface Changes
- Changes
- [Updates]
- 10.0.0 March 31, 2020
- 10.0.1 July 9, 2020
- 10.0.2 August 21, 2020
- 10.0.3 October 14, 2020
- 10.0.4 November 4, 2020
- 10.0.5 November 17, 2020
- 10.0.6 November 22, 2020
- 10.0.7 December 2, 2020
- 10.0.8 December 8, 2020
- 10.0.9 December 17, 2020
- 10.0.10 December 22, 2020
- 10.0.11 December 23, 2020
- 10.0.12 January 4, 2021
- 10.0.13 January 6, 2021
- 10.0.14 January 8, 2021
- 10.0.15 January 12, 2021
- 10.0.16 January 21, 2021
- 10.0.17 January 26, 2021
- 10.0.18 February 1, 2021
- 10.0.19 February 5, 2021
- 10.0.20 February 10, 2021
- 10.0.21 February 15, 2021
- 10.0.22 February 17, 2021
- 10.0.23 February 23, 2021
- 10.0.24 March 3, 2021
- 10.0.25 March 5, 2021
- 10.0.26 March 11, 2021
- 10.0.27 March 17, 2021
- 10.0.28 March 23, 2021
- 10.0.29 April 6, 2021
- 10.0.30 April 25, 2021
- 10.0.31 May 6, 2021
- 10.0.32 May 24, 2021
- 10.0.33 May 31, 2021
- 10.0.34 June 7, 2021
- 10.0.35 June 18, 2021
- 10.0.36 June 21, 2021
- 10.0.37 June 25, 2021
- 10.0.38 June 28, 2021
- 10.0.39 July 9, 2021
- 10.0.40 August 3, 2021
- 10.0.41 August 25, 2021
- 10.0.42 September 16, 2021
Upgrading to 10.0
Read This First
Upgrading to 10.0 is a major upgrade, and so you are strongly advised to read everything in the “Upgrading to 10.0” section before attempting it.
It is entirely possible the upgrade will fail the first time. It is therefore critical that you have a backup of the database before you start.
You must also upgrade to the latest 9.0.x before upgrading to 10.0. Unlike earlier releases, there is an incompatibility that means 10.0 cannot apply 9.0 upgrades. Consequently, you must complete all 9.0 database upgrades before upgrading to 10.0. This means you must boot Calpendo with the latest 9.0 so that it can apply those upgrades.
If you have a Calpendo test environment, then you should perform the test there first, using a copy of your production data.
If you do not have a test environment, then you will need to plan for enough down time for the upgrade. See below for an estimate of how long a successful upgrade will take.
Primary Key Changes
Unlike earlier versions of Calpendo, you cannot upgrade directly to 10.0 from any version; you must upgrade to the latest 9.0 version before attempting to upgrade to 10.0.
Upgrading from 9.0.x to 10.0 is a relatively slow upgrade and it manipulates the data in the database fairly extensively. This is because the format for all primary keys has changed from a 32 bit integer to a 64 bit integer. This is in preparation for Calpendo Enterprise which includes the ability for data to be shared between systems.
This has resulted in primary keys being formatted as:
- The top 11 bits are always zero
- The next 31 bits store the number of seconds since January 1, 2019 to the time when the primary key was allocated.
- The next 12 bits store a sequence number. This means we can allocate at most 4096 primary keys per second.
- The bottom 10 bits store a number to identify the shard in a federated system of co-operating databases. This allows up to 1024 shards to exist in a federation.
This scheme allows for primary keys to be created up until 19th January 2087 with the largest legal primary key being 2^53-1.
When upgrading a 9.0 system to 10.0, your database will be allocated a random shard number and all primary keys will be modified to the above format. This means all pre-existing keys are multiplied by 1024 and the shard number added to it.
When displaying an ID in the user interface, we display the number in the format yyyymmdd.HHMMSS.sequence.shard unless the ID is small enough that it looks like it came from a pre-enterprise system, in which case it will be displayed as sequence.shard.
The conversion of primary keys is a complex operation on the database, and while we have taken great care to make sure this is done correctly, it is imperative that you create a backup of your database before the upgrade just in case anything goes wrong.
Also, if there are any tables in your database that are not used by Calpendo, it is important to understand that the above primary key translation will be done on them as well. If you want to avoid this happening, then you should drop those tables after you have taken a backup (and verified that it is good) and then upgrade, and then restore your tables. If the tables are used by Calpendo, then you will have to leave them in place so that they can be converted. Otherwise Calpendo won’t be able to continue to work with them.
Before Upgrading To Version 10.0
Unlike previous upgrades, the upgrade to version 10.0 is not entirely automatic; you must examine your system and make certain changes first before upgrading so that the upgrade will then be automatic. These changes are all compatible with version 9.0, which means that you can get ready for upgrading to version 10.0 before you actually do the upgrade itself.
All custom integer properties added to any BiskitDef that store a primary key should be modified. There’s an integer sub-type called “Primary Key” that can be set onto integer properties. This does not change any behaviour in 9.0, but it is a signal to the upgrade procedure that this property stores a primary key, and so should be changed to a long.
If you have an integer property that stores a primary key but you do not mark it as storing a primary key, then the upgrade procedure will not modify it. This would then mean that it is no longer capable of storing a primary key after upgrading to version 10.0 which will cause problems. It could, however, be manually modified after upgrading to 10.0 to change it to be a long. This would require changing the type of the property and also changing the column used to store it. It is easier to simply mark the property as storing a primary key in version 9.0 instead.
If any of your workflows call the function “toInt”, which converts a string to an integer, and the value concerned is actually a primary key, then the function should be changed. Call “parsepk” instead. This is a function that also converts a string to an integer in version 9.0, but returns a long in version 10.0. However, the names of the inputs and outputs are different, so this isn’t a drop-in replacement. That is, you will need to modify any actions that use the output from “toInt” that has been switched to “parsepk”.
If you have any workflow function actions that call the function ‘getAsInt’ or ‘getAsIntList’ or ‘csvDecode’, then they should be checked to see whether they are actually returning primary keys. If they are, then the actions should be changed to call ‘getAsPrimaryKey’ or ‘getAsPrimaryKeyList’ or ‘csvDecodeAsPrimaryKeys’ as appropriate. These are functions that make no functional change in version 9.0, but which are modified during an upgrade to version 10.0 to return a long or list of longs.
If you have any workflow that uses the ‘Registers’ biskit, and you use one of its integer properties (int1, int2, int3 etc) to store a biskit’s id, then you should modify the workflow so that it uses the equivalent primary key property instead. That means that references to int1 should be changed to pk1, and references to int2 should be changed to pk2, but only for those properties that store a biskit’s id. During an upgrade to version 10.0, Registers properties pk1, pk2, pk3 etc are converted from int to long.
Go to Admin->Bakery and click on “Validate Biskits”. If there are any errors, then please correct them before upgrading. Also click on “Update DB Schema…” to make sure the database schema is fully up-to-date before upgrade. In particular, if the script it generates wants to add foreign key constraints, then it is essential that those changes are made before upgrade. That’s because we use foreign key constraints as an indication of a column that contains a primary key and needs to be converted from an integer to a long integer.
In all cases, if you find from the above that you need to modify anything, then we recommend checking that your workflows are still correctly defined after the upgrade, and that they operate correctly.
Upgrading from any version to the latest (including applying bug fix updates) should be done with the following procedure:
Stop tomcat
For major upgrades, you must create a backup of your database before proceeding. For minor upgrades, it is recommended to create a backup, but it is less important. After having stopped tomcat, the typical command required is:
mysqldump -u USERNAME -p calpendo > calpendo.sql
or, depending on your system:
sudo mysqldump calpendo > calpendo.sql
Save the hibernate.cfg.xml and log4j.properties files from your existing webapps/Calpendo/WEB-INF/classes directory
Take the Calpendo directory from the tar.gz download, and replace your existing webapps/Calpendo with it.
Put the saved hibernate.cfg.xml and log4j.properties files into the new directory.
Make sure you do not have both old and new versions in the webapps directory at the same time, unless they point to a different database. Booting multiple versions of Calpendo that point to the same database will cause problems and is best avoided.
Restart tomcat
Time Required To Upgrade
The upgrade may take a long time. I rough rule of thumb is that it will take about 20 minutes per gigabyte of a gzip-compressed backup of the database. That is, if you run mysqldump and gzip the output, and it’s about 1GB, then the upgrade will take about 20 minutes. This is only a rough guide.
If Things Go Wrong
If you have a large database, and a small MySQL setting for innodb_buffer_pool_size, then the upgrade may fail with the log file (which may be in /var/log/tomcat*/calpendo.log or similar directory) containing a message in the first error saying:
the total number of locks exceeds the lock table size
If this happens, then you should increase the value of innodb_buffer_pool_size. This probably means you should edit a file under /etc/mysql/ to add or change the directive and restart MySQL. This is the kind of line you would add:
innodb_buffer_pool_size = 2G
where you would choose the size depending on what’s required. What’s required depends on the amount of data you have. So you might want to increase this for now, perform the upgrade and then put it back afterwards.
It should, in general, be no bigger than 80% of your RAM on a dedicated database server. If you also run Tomcat or other services on the server, then you should allocate less memory to the innodb_buffer_pool_size.
You can see what your current setting is by running this on the database:
select @@innodb_buffer_pool_size;
For some online resources giving background about this, see:
If this is your problem, and you’ve increased innodb_buffer_pool_size, then you can try again. This means dropping your existing database, rebuilding from backup:
sudo mysqladmin drop calpendo
sudo mysqladmin create calpendo
sudo mysql calpendo < calpendo.sql
and then restart Tomcat.
Downgrading from 10.0 to 9.0
The general procedure for downgrading from 10.0 to 9.0 is:
- Stop tomcat
Drop the calpendo database and recreate it
sudo mysqladmin drop calpendo
sudo mysqladmin create calpendo
Rebuild the calpendo database from a backup
sudo mysql calpendo < calpendo.sql
- Change the Calpendo directory under tomcat to be the previous version
Restart Calpendo.
Do not merely load an old database on top of an upgraded or partially upgraded database and run an old Calpendo. It will break things, but possibly not until you come to do another upgrade, by which time it may be too late to fix things easily.
New Features
Linked Bookings
Linked Bookings are a feature whereby a booking for one resource can automatically trigger the creation of a booking for some other resource, perhaps at some earlier time or at the same time. When the “parent” booking is moved to a new time, then the “child” booking should be moved too. When the parent booking is cancelled, the child should be cancelled too.
An example would be when you have a PET Scanner and so when you have a scanner booking, you would like an automatic booking for the creation of a radioactive tracer some time ahead of the scanner booking.
Bookings now have a permanent property added called parentLinkedBooking that provides a reference from a child booking to its parent. This value would not be set for any booking that is not a inked booking child.
In earlier versions of Calpendo, we have implemented linked bookings for customers by putting the necessary code into workflows. In version 10.0, it is no longer necessarey to use a complex workflow for this because we now have built-in support for it. This also provides support for all the different flavours of linked bookings that people have requested until now.
For example:
Linked bookings are now managed by going to the resource editor by selecting menu item Admin->Resource Editor and creating a Linked Booking Link.
Two extra properties have been added to Booking to support linked bookings. They are both only populated for bookings that are children of some link. The properties are:
- link - a reference to the link that created the current booking.
- linkedParentBooking - a reference to the parent of the current booking.
Linked Bookings are not available in Calpendo Lite.
Sometimes, you want some of the same things to appear on menus for different people. When this happens, it’s annoying when you want to make a change to one of them, because it means you have to make a change to all of them.
There’s now a solution to this in the form of “Linked Menu Items”.
This means that you can set up a menu item on a menu that is a linked to a menu item on another menu, or even on the same menu. Then, when the menu is loaded, it replaces the linked menu item with whatever it was pointing to.
This will work for any type of menu item. This means that if you create a submenu and a link to it, then the whole submenu will be replicated. Alternatively, you may want to link a single item such as a custom search page.
Linked Menu Items can be found in the menu editor by adding a custom page of type “Linked Menu Item”.
Kanban Reports
There’s now a new style of built-in report available called “Kanban”. This provides a Kanban board in which items are separated into separate lists depending on the value of a configurable property.
For example, from a search for users, if you select a Kanban report, and then select the property “type”, it will show the users in separate lists with all those users having the same type being in the same list.
Booting With Broken Biskit Definitions
Previously, you could modify the biskit definitions in such a way that the system could not boot. Now, if there’s something fatally wrong with the biskit definitions, or missing tables from the database, then the system will boot with the original set of biskit definitions.
This means the system is in a rescue mode that will allow you to go to the bakery and fix any problems that exist.
This makes it much harder to put the system into a state whereby it cannot boot and avoids the need to modify the database outside the web browser to fix it.
Broken Upgrade Recording
If a database upgrade fails for some reason, there’s now a record of the SQL it was trying to run in the system events.
Agresso
There is now an Agresso module. This makes it easier to integrate with Unit 4 Business World, formerly known as Agresso.
The module provides:
- Two biskit definitions, Agresso.LG04 and Agresso.GL07. These represent all the data that can be sent to Agresso with an LG04 file or a GL07 file.
- Two workflow functions. One to convert a list of Agresso.GL07 to a GL07 formatted file, and one to convert a list of Agresso.LG04 to an LG04 formatted file.
A workflow can then generate GL07 and/or LG04 biskits and generate a file suitable for sending to Agresso.
Custom Tree Pages
For a long time now, there has been support in the menu editor for adding pages that:
- Display a custom search page, with search options for filtering on any property to might want. This is the “Customised Search Page” custom page.
- Display a tree of biskits on the left, so that when you click on one of the entries, there’s an editor for it displayed on the right. This is the “Biskit Tree Editor” custom page.
- Display a tree of biskits on the left, so that when you click on one of the entries, it displays one of the properties on the right. This is typically used for “information pages” so that you can provide a set of instructions or information about your facility or anything else. This is the “Biskit Tree Viewer” page.
There’s now a new custom page option available in the menu editor called “Custom Tree Page” that lets you define a custom tree to appear on the left, where each of the items in the tree can trigger any custom page or built-in page on the right.
However, it can also display child items in the tree for biskits that it finds, with optional grouping depending on the value of one or more properties.
For example, you could create a menu item for a Custom Tree Page and give it two child menu items as follows:
- Customised Search Page with label “Users by status and roles”, for users, showing child tree items for users grouped by status and roles.
- Customised Search Page with label “Users by user type” for users, showing child tree items for users grouped by user type.
This might then produce a tree that looked like this:
- Users by status and roles
- Users by user type
- Staff
- Admin
- admin
- root
- ical_viewer
- nobody
This will be explained more in the documentation and videos.
Requirements
There’s now built-in support for storing system requirements. The intention is to use this for new customers to sort out the requirements they have for their new system. The requirements support provides a means of showing all the individual requirements, along with a mechanism for attaching notes to each requirement so that there can be a discussion based around each requirement.
Requirements can also be split into sections and given a subject.
Requirements can also be given tags to provide a custom means of identifying them.
This is built-in to each Calpendo so that once your system has been built, it will continue to contain the requirements to serve as a specification for what the system contains and what it’s supposed to do. This will help both customers and Exprodo when anybody unfamiliar with the system needs to understand what things are in it and how it’s supposed to work. It will also help with the process of getting new customers up and running.
This will be documented further elsewhere.
When displaying a search page with Requirements, there’s now a new report type, called “Requirements Report” that displays the requirements properly on the screen. It can also be exported to PDF where it will include a copy of all the requirements included in the search, along with all their notes too.
Send SMS Text Messages
You can now send SMS text messages from a workflow. To use this, you will need to create an account with Twilio and buy a phone number from them. Then, create an instance of TwilioPhoneAccount in Calpendo and give it the details of your Twilio account and phone number.
Then you can use the new workflow function called sendTwilioSMS to send an SMS message, giving it the message to send, the phone number to send it to, and referencing your TwilioPhoneAccount.
Draft Projects
There is now a new “Draft” status that can be selected for a project.
This includes the following changes:
- The Projects Search and My Projects pages both display draft projects by default.
- Both admins and regular users are prevented from making a booking for a draft project.
- Validation of a project is not performed while its status is draft. This means the checks due to the min/max/required attributes set in the bakery and not any checks you may have customised in workflows.
- Issue: 2780
New Enterprise Features
Introduction to Enterprise
Calpendo Enterprise is a version of Calpendo that allows multiple separate Calpendos to work together in a federation. Each Calpendo instance is known as a shard.
The idea is that where there are multiple facilities (which you may call cores, labs, facilities, departments or similar things) and each of them needs to be autonomous, but work together in some way, then Calpendo Enterprise will support that. Each of these facilities will have their own Calpendo, but the Calpendos will talk to each other.
Each Calpendo is known as a “shard”, as it forms a part of whole “federation”.
There will be a single “master” shard which provides a place to define some things that are common across all shards. This would be the first shard created in a federation.
This system will allow:
- a calendar that can show bookings for resources from multiple facilities;
- reports to be run that aggregate data from all facilities;
- rules, permissions and workflows that can be defined on the master shard and inherited by all facilities;
- the ability for users to be admins on some facilities but not others;
- segregation of facilities so that configuration changes on one facility cannot possibly impact other facilities.
Most of the changes for support Calpendo Enterprise are a part of Calpendo 10.0, and the final elements will ship in a latesr version.
Some of the concepts introduced in Calpendo 10.0 are described in the following subsections.
Enterprise Terminology
Each individual Calpendo is known as a shard. A collection of shards working together is known as a federation. The first shard created is known as the master shard and it controls the standard biskit definitions (such as those for User, Booking and Resource). These are inherited by all other shards, who may create custom sub-types if desired.
For example, a shard might create a subtype of Booking that contains properties required on that shard.
Any shard that creates a BiskitDef is said to own it. Only the shard that created a BiskitDef is allowed to make changes to it.
A slave shard is any shard that is not the master shard.
A biskit is said to be fragmented when that biskit has a main part plus one fragment of data for each shard. Each shard can define what properties exist on the fragment that that shard.
We generally use the term “facility” to refer to the concept of an autonomous (or semi-autonomous) part of a larger organisation, and each facility would normally have its own shard. You can put more than one facility into a shard, but it is more difficult than having them in separate shards.
We will sometimes use the words facility and shard as if they were synonymous. They aren’t quite the same thing though because you can have multiple facilities in one shard. Also, you may have something in your organisation that is politically considered to be a single entity or “core facility”, and which is comprised of more than one part that have different technical rules around how it is run. In that case, you might split one “core facility” across multiple shards.
Pinning
A biskit definition can be pinned. That means that it is the preferred type for biskits. For example, suppose:
- there’s a biskit definition A created on the master shard.
- Slave shard X creates a subtype of A called XA.
- Slave shard X also creates subtypes of XA called XAChild1 and XAChild2.
- XA is marked as pinned.
- Slave shard Y mirrors this arrangement so that A has a subtype AY, and AY has subtypes AYChild1 and AYChild2 and AY is pinned
Then on the master shard, if you go to Search->Search and try to create an instance of A, it will ask whether it should be an A, AX, AXChild1, AXChild2, AY, AYChild1 or AYChild2.
However, if you search for A on shard X, and then try to create an instance, it will only offer you the chance to create an AX, AXChild1 or AXChild2. That’s because AX is pinned on shard X.
Similarly, trying to create an A on shard Y would only offer the option to create an AY, AYChild1 or AYChild2.
Exporting Biskits
In order to see bookings for another shard’s resources, the other shards resources must be exported to other shards.
Projects can be exported, and in fact must be exported to another facility’s shard if you want the project to use that facility’s resources.
Fragmentation
A user of one facility might well be a user of another. Each user that registers will request access to the facilities they want to use. This means that a single user record will exist that spands the whole federation.
This means there is some facility-specific information that must exist for each user and facility:
- The user’s status, that indicates whether the user can log in etc.
- The user’s roles that apply to that facility (are they an admin etc).
- The user’s type, assigned by the facility and so may be different for each facility.
- Any other facility-specific information that each facility might want to record with a user.
From a technical perspective, a user is said to be fragmented.
Similarly, Calpendo projects are fragmented. That’s because each facility will have its own ideas about what information should be stored about a project, depending on what makes sense for that facility. This means each facility will define the properties that exist on the project fragment for the facility’s shard.
If you look in the bakery, you will see a UserFragment and a ProjectFragment.
If you set up an Enterprise system, then for each shard, there will be a subtype of UserFragment and ProjectFragment defining the properties for that shard beyond those defined on UserFragment and ProjectFragment.
This means that when looking at a project, you will see one tab for each shard, which contains the information in the ProjectFragment for that shard.
Local User, Project and Resource Types
A user in Calpendo has a UserType.
The UserType values that can be selected are defined globally, so that every shard would see the same selectable values.
Some facilities would like to segregate their users into types in a manner that suits their facility, and not in a way that suits other facilities, or in a way that suits the whole federation. To make this possible, a user can have a local type.
The way this works is that there is a LocalUserType biskit. Each shard will have instances of LocalUserType created, and only instances of LocalUserType that were created on a particular shard can be assigned as the local type for a user’s fragment on that same shard.
In the same way, a ProjectFragment stores a LocalProjectType, and the values that can be stored in it are all those LocalProjectType instances created on the relevant shard.
Resources also have a LocalResourceType. However, they are different from user and project because Resource is not fragmented. This means that the local type stored on a resource has to be from the shard that created the resource.
Permissions
Permissions have changed very slightly, but the difference is only visible when running Calpendo Enterprise. A user can access multiple shards, and may have different roles on each one. For example, somebody may be an admin for one facility, but a regular user on another.
To make this work, there are three properties that define a user’s roles.
First, there’s the User.roles property as has always existed.
Then, on each UserFragment, there is a roles property that defines the additional roles the user has on the shard that fragment relates to.
For example, if a user is an admin across the whole federation, they could have the admin role in their User.roles property. Whereas, if a user is an admin on only one shard, then they would have the admin role in their UserFragment.roles for the relevant shard, but not in their UserFragment.roles for other shards, nor in User.roles.
Finally, the roles that can be assigned are defined globally by the master shard. If a shard wants to have other roles that exist only on that shard, then it can. Every shard in a federation has a MappedInt that defines the roles that exist for that shard. These are known as “local roles”, and they are stored in UserFragment.localRoles.
When creating permissions in an Enterprise system, the “Roles” section displays a little differently. It now lets you select both the global roles and the local roles (if the shard on which you’re creating the permission has some local roles defined in its MappedInt).
If you indicate that a permission applies to somebody with the global “admin” role, then it does not matter whether a user has the admin role in their User.roles or their UserFragment.roles; they are treated the same.
Expiry Date
A user has an expiry date in the ExprodoUser.expiryDate property. However, each facility may want to set an expiry date on when the user can access their shard. For this, there’s also now a UserFragment.expiryDate property to store the expiry date for a user on the shard for that fragment.
Workflow Changes
Workflow Manager User Interface
There are new events and workflow actions that have been introduced in this version.
As a consequence, the old method of adding events and actions by clicking a button that gives a drop-down list, has become cumbersome. It generally took too much scrolling and searching to find the type of item you wanted.
So there’s now a new tab labelled “Add” that appears for each event and action. On that new tab, you will find one button for each type of event and action. Those that are legal to be added in the current context will be enabled, and the others greyed out.
The previous “Add Event” and “Add Action” buttons have both been removed so that you must now use the new “Add” tab instead.
Workflow Debugger
This provides a means of properly debugging workflows so that the use of system events should no longer be necessary.
This is different from most debuggers, in that it does not operate live. Instead, you record some activity and then use the debugger to examine the recording to see what happened. This has the advantage over a “live” debugger that you can go backwards in time through a recording, as well as forwards.
There’s a new item added to all menus that previously had Workflow Manager on them, and you can also reach it by clicking the “Debugger” button from the Workflow Manager.
To use this, you must first go to the debugger, go to the recording options, and enable recording. This can be enabled for all workflows or just some.
- Once recording is on, run some workflows.
- Then, in the debugger, enter a range of date/times covering the period you’re interested in, and hit the “Go” button. This will load the recordings taken in that period.
- The recordings will appear split over multiple “runs”. Each run should relate to a separate triggering event. By clicking on a particular run, you will see the content of that run.
- Each run contains a number of “frames”. Each frame represents the execution of a single trigger (that is, an event or action).
- A tree shows all the triggers involved in the currently selected run.
- You can navigate through each of the frames to see what happened at that frame. While on a frame, the Context pane will show all the date that was available in that frame.
Map Workflow Action
Map Workflow Action is a new type of action. It lets you group a list of biskits by one or more keys that you can define.
This is best explained by example. Suppose you need to generate PDF reports or invoices of bookings, and you want one PDF for each project owner (the principal investigator).
This is an ideal situation for the Map Workflow Action. You given it a list of the bookings, and set up the keys as “project.owner”.
The result is a list of entries, each of which has a user (the project owner) as a key, and a list of bookings whose project.owner matches the key. This lets you loop through the entries, and produce one PDF for each entry.
This leads to a workflow snippet that looks something like this:
- Search for bookings
- Map action on the bookings with key project.owner
- For each entry in the map action’s output’s entries
- Generate a PDF with the bookings in the entry
Now suppose you want the PDFs to group the bookings by project. This means you need the bookings grouped by project as well. So change the map action to have keys “project.owner” and “project”.
Now the map action will return a different list of entries. Each entry will have a user (the project owner) as a key, which is the same as before. It will also have a list of values (bookings) for that project owner, as before. However, each entry will also contain a list of sub-entries. Each of those will have the project as a key and a list of bookings that have the project.owner and the key as project.
This leads to a workflow snippet that looks something like this:
- Search for bookings
- Map action on the bookings with keys project.owner and project
- For each entry1 in the map action’s output’s entries
- Begin creating a PDF for user in entry.key
- For each entry2 in the entry1’s entries
- Add a heading for entry2.key (the project)
- Add a table with entry2.values (the bookings)
- End PDF
Import Workflow Action
This action can be used to import data.
This works in a similar way to the file import page, except you give it a a list of biskits, and specifications on how to resolve properties from those in the input list to something that will be on the biskit imported.
You also specify how to match properties in the input list to pre-existing biskits. This is so that we know which biskits to update, when the import is set to update existing biskits rather than create new ones, or when the import is set to create new biskits that don’t match a pre-existing one.
You might generate your input list of biskits from a file you’ve parsed or some other source, and then want them to be converted into something that can be saved to the database.
Macro Workflow Event
- Add support for MacroWorkflowEvent
- Custom Function Workflow Event has been converted into a new type of event called Macro Workflow Event, and Custom Function Workflow Action.
- Macro Workflow Event contains actions that are not triggered by a system event, but directly called by other actions.
- Custom Function Workflow Action defines a custom function, and it can only be added below a Macro Workflow Event.
- This means that to add a custom function, you must now first create a Macro Workflow Event, and then add a Custom Function Action to it.
Defining and using Subroutines
The following actions have been added:
- “Define Subroutine Workflow Action”
- “Call Subroutine Workflow Action”
- “Define Interface Workflow Action”
A subroutine has inputs, and produces outputs, much like a function. Unlike a function, a subroutine can be passed as an argument to another subroutine, allowing you to provide plug-in behaviour to a subroutine.
For example, you might have a complicated subroutine that generates an output file, but you might want each line to be either comma separated or HTML. You can handle this by using a subroutine to generate each individual line in the format you want, and passing that as an argument to the subroutine that builds the file.
You can define an interface. This is something that lets you define inputs and outputs, but an interface has no child actions so it can’t do anything.
When you define a subroutine, you have the option to indicate that you implement a particular interface, which means it controls what your inputs and outputs are. Alternatively, you can define the inputs and outputs directly in the subroutine.
When you define a subroutine that takes another subroutine as an input, you should specify the type of one of those inputs as a Define Interface Workflow Action. That will allow you to use it in a Call Subroutine Workflow Action.
Then, when you pass a subroutine as an argument to another subroutine, the subroutines that you pass in must specify that they implement the interface required for the argument.
Subroutines and interfaces can only be added below a Macro Workflow Event, just like custom functions actions.
The differences between a subroutine and a function are:
- A function can be called by an expression, but a subroutine cannot.
- A subroutine can be passed as an argument to another subroutine, but a function cannot be passed as an argument.
Defining and using Constants
It’s common that you need workflows to operate using some values that control how it works, where these values rarely change. In these circumstances, it’s preferable not to bury the values deep inside a workflow because that makes it difficult to maintain if those values do need to change.
So we now have new actions:
- “Define Constants Workflow Action”
- “Get Constants Workflow Action”
This is like a Create Variables, but one that can be shared across different events or even across different workflows.
Constants can only be added below a Macro Workflow Event. However, you can add any action as a child of a Define Constants Workflow Action.
This means you can define what constants you want, and then the child actions can calculate something and store their value onto the constants biskit.
Constants are calculated once when the system boots, and whenever the workflow containing the constants is modified. They are not recalculated at any other time. So the values you generate will be used many times without reclculating them.
Find Function (Breaking Change)
The find function is given a BiskitDef and a primary key or list of primary keys, and returns you the biskit or list of biskits they represent.
Since primary keys are not longs and not integers, this means the signature of the find function has changed so it expects a long or list of longs. If you have used the find function in any of your workflows, then after an upgrade, you may need to change your workflows so they continue to work.
To help with this, there’s a check when the database is upgraded to see whether you’re using the find function. If there is, then an upgrade warning is issued which will cause a message on the first few logins after the upgrade.
getAsPrimaryKey and getAsPrimaryKeyList Functions (Breaking Change)
These two functions were added in 9.0 specifically because they would return an integer (or integer list) in 9.0 and a long (or long list) in version 10.0.
Workflows using these functions should be checked after upgrade to make sure that everything still works.
User Workflow Event Message Types
When a User Workflow Event is run, the workflow can set a message onto the event’s response biskit to send a message back to the user. There’s also a MessageType that lets you choose whether this is an error, warning, or an informational message that appears in the bottom right corner for a few seconds before automatically disappearing.
There are now two more options for the message type. Both of them are considered informational messages, but they require the user to manually click an OK button for the message to go away. The only difference between the two new message types is that one expects the message to be written in plain text and the other in HTML.
JSON and XML Processing Support
We have had support for generating and manipulating JSON files for quite some time. This has now been extended by a workflow function called jslt that can invoke JSON transformations using JSLT (there’s a tutorial for it here).
We now also have tools for processing XML. This is typically used (within Exprodo) for generating XSL-FO files that are in turn used to generate PDF files, or for working with XML-based external APIs.
We now support both XQuery and XSLT.
XSLT and XQuery are both languages for transforming XML documents into other XML documents or other formats.
Our XSLT support is implemented with a new workflow function called xslt.
Our XQuery support is implemented with an extension to a TemplatedTextWorkflowAction. Make the template be an XQuery program, and enable the XQuery option on the action, and it will run XQuery after replacing any data references in the usual way.
You may also enable the FreeMarker templating engine to process the contents of the template. The expansions are performed in the following order:
- Regular expansion of references to data
- XQuery
- FreeMarker
To support this, Templated Text actions have new options to choose whether to enable FreeMarker or XQuery.
- FreeMarker can be a very useful templating engine for generating output.
- However, if you have many small templates all using FreeMarker, then the result will run relatively slowly.
- It is therefore much faster to disable FreeMarker where possible, and enable it only as required.
- If your template does not include any FreeMarker directives, then disabling FreeMarker has a negligable effect.
- If you do disable FreeMarker and use it later, then do be aware that any references you want FreeMarker to expand must be in scope when FreeMarker runs. For example, you can use a FreeMarker directive that will loop through a list of biskits. That list of biskits must still be in scope when FreeMarker runs, or else it will not work.
- When editing a Templated Text action, you will now see a checkbox where you can enable or disable FreeMarker.
For more information about XQuery, see:
New Workflow Functions
The following functions have been added:
nop function that does nothing. This is intended to be used where you want a placeholder that will be replaced with a real function later, but something that just does nothing for now.
- mapBiskitProperties is a pre-existing function which has now been given a new overloaded version.
- The original function is given a biskit and creates a new biskit with the same values, but where the property names are modified by adding or removing a fixed prefix and/or suffix to the property names.
- The new overloaded version does the same thing but for a list of biskits.
- fromJson is a pre-existing function which has now been given a new overloaded version.
- The original function converts JSON to a biskit
- The new version can be used where you expect the JSON to represent a list of items, and so returns a list of biskits.
- contains is a pre-existing function which has now been given a new overloaded version.
- We had versions of the “contains” workflow function that search through a collection of biskits, integers, doubles and strings, but not one that searched through long integer values.
indexOf to find the index of an item within a list
ldapSearch is a pre-existing function for searching an LDAP server. We now have an overloaded version that lets you specify the timeout to use for the query.
- csvDecodeAsPrimaryKeys decodes a csv string as primary keys. The values can be formatted as simple long integer values, or as formatted primary keys. That means we accept the following forms:
n where n is an integral value
n.s where n and s are integral values, with s being the shard number and n being the time-and-sequence part.
- YYYYDDMM.hhmm.sequence.shard where:
- YYYYMMDD is the date, hhmm is the time,
- sequence is the sequence number and
- shard is the shard number
- typeCastBiskits to filter a list of biskits by type
- Given an input list of biskits, you can generate an output list of biskits that only includes biskits that are a particular type, or a subtype thereof.
- An argument lets you choose how to deal with input biskits of the wrong type.
- You can either write a null value into the output, or ignore it so that the output may have fewer entries than the input.
- jslt to apply a JSLT transformation to JSON
- This function invokes a third party tool called JSLT that transforms JSON from one form to another.
- See github.com/schibsted/jslt
- The help text on the workflow function gives details of a JSLT tutorial that you can also find here
- xslt to apply an XSLT transformation to XML
- This function takes two string arguments. One is the XML to be transformed and the other is an XSLT transformation that should be applied to the XML.
- The output is the result of applying the XSLT transformation.
- There are many examples of how to use XSLT on the internet.
However, there are also examples in a workflow called “Example XSLT transformations” that you can find in the workflow manager under:
Workflow Biskit->Versioned Workflow Biskit->Workflow
- toXML that converts a biskit to XML or a collection (of anything) to XML
- This can be used together with the XSLT support provided with the workflow function xslt to transform the resulting XML into other forms.
- In particular, you can convert biskits to XML which can then be tranformed via XSLT to a XSL-FO formatted XML file which can then be converted to a PDF file via the workflow function toPDF.
- sendTwilioSMS that sends an SMS text message using Twilio.
- To use this, you will need to create an account with Twilio and buy a phone number from them.
- Then, create an instance of TwilioPhoneAccount in Calpendo and give it the details of your Twilio account and phone number.
- Then you can use the sendTwilioSMS function to send an SMS message, giving it the message to send, the phone number to send it to, and referencing your TwilioPhoneAccount.
- splitDateRangeByDay that splits a range of dates into individual days.
- This takes a pair of dates, a pair of date-time, or a DateRange, and returns a list of date or a list of date range, representing the different days in the original range.
- You can choose which flavour of inputs you want to provide, as well as whether you get back DateRange (so with time) or Date (so without time).
- Issue: 2383
getCertificateSummary that retrieves the SSL certificates from a server, and returns some details on the certificates including their issuer, expiry, subject and public key.
- fontList to generate a list of the fonts installed.
- The example workflow that shows various PDF generation techniques has been extended to show an example of using the new ‘fontList’ function to generate a PDF containing all the available fonts.
- The workflow can be found in the workflow manager along under the type ‘Workflow’ and is called ‘Example PDF generation with XSL FO’.
User Interface Changes
Selecting biskit from list
Whenever you have a list of biskits displayed, for example in a list report or when you click on a row in a group report, you can click on a biskit in the list to display it.
Previously, the displayed biskit would appear below the list which meant a lot of scrolling up and down if you changed which biskit you clicked on.
It now appears (by default) in a pop-up instead. Click the red X icon to close the pop-up, or press the Escape key to close it.
This behaviour can be modified by pressing the control key (command on an Apple Mac) or by pressing the shift key:
- Shift-click on a row in a biskit list to switch to a page showing just the biskit, and not in a pop-up. This is the “Fullscreen” option you will now see on biskits displayed in a pop-up.
- Control-click (Command-click on Mac) to show the biskit below the list, the same way as it used to happen in earlier versions.
Adding Events and Actions To Workflows
A new “Add” tab now exists in the workflow manager for adding events and actions. The existing “Add Event” and “Add Action” button still remain for now, but will be removed in a future release.
Changes
Primary Keys
All primary keys (integer identifiers) on all biskits have been changed from 32 bits to 64 bits. This is in preparation for a federated system where up to 1023 databases can talk to one another, and data from one database can be exported to be accessed within another.
In this scenario, each database is known as a shard, with each one being given a unique number from 1 to 1023 to identify it.
This includes a new format for the idenitifier within the available 64 bits as follows:
- The top 11 bits are always zero
- The next 31 bits store a number of seconds since January 1, 2019
- The next 12 bits store a sequence number that is incremented every time a new key is allocated, and reset to zero every time a new second ticks in.
- The last 10 bits store the shard number which identifies the particular database this comes from.
Every database that is upgraded is assigned a randomly selected shard number. Then, every column that stores a primary key is modified by the upgrade in two ways:
- it is widened out to 64 bits
- it is multiplied by 1024 and the shard number added to it
This puts it into the new key format, leaving the time part of the key is set to zero.
Whenever you see an identifier in the user interface, you might see it in one of the following formats:
- “sequence.shard”
- This is for identifiers where the time part of the identifier is zero or small enough to indicate it was converted from a pre-version-10.0 system.
- If a pre-version-10.0 identifier is set to “x”, then it would display now with a sequence number of “x”.
- “yyyymmdd.HHMM.sequence.shard”
- This is for identifiers allocated after an upgrade to version 10.0.
- number
- Sometimes, just the number on its own will be seen.
- This happens when an identifier appears in a URL.
- It might possibly happen elsewhere, but if there are any such instances, they will be converted to the above format.
- At some point, URLs may be switched to use the new format as well.
We display the number in this new format to make it easier to read. Otherwise, it’s just a very long number.
The top 11 bits are always zero, making this a 53 bit number. The reason this is done is that JavaScript does not have an integer data type, and uses floating point values for all numbers. Everything up to 53 bits can be represented as a floating point value without losing any resolution.
Primary Key Translation
Primary keys now exist in two forms - there’s a numeric value stored in the database, and a formatted version of them displayed in the user interface. If you need to convert between them for some reason, then you can do so with a new page called “Primary Key Translation” which you can reach either by adding it to your menu or by going to the page #pktranslate
Long Property Subtype
When you define a property in the bakery of type Long, you can now specify a subtype to say that it stores a primary key.
If you do this, then it will mean that the property is rendered like a primary key, using the new format described above.
Also, when adding a long property to a Create Variables Workflow Action or Custom Function Workflow Event, you can now specify whether it is a primary key.
Stored Functions
For anybody who runs direct queries against the database, we now create two functions to assist with primary keys. The UI will now display primary keys in one of the formats described above. But when running queries, you need to use the numeric values.
You can use the #pktranslate page to convert for you, but you can also use one of the new functions:
These convert between the numeric and formatted versions of primary keys. For example:
MariaDB [calpendo]> select formatpk(135003325370560);
+---------------------------+
| formatpk(135003325370560) |
+---------------------------+
| 20200108.125501.36.192 |
+---------------------------+
1 row in set (0.00 sec)
MariaDB [calpendo]> select parsepk('20200108.125501.36.192');
+-----------------------------------+
| parsepk('20200108.125501.36.192') |
+-----------------------------------+
| 135003325370560 |
+-----------------------------------+
1 row in set (0.00 sec)
All meta-properties available in conditions now provide for a new property called “shardNumber” which is the current system’s shard number.
Installation
Installation of brand new systems is now done differently. You must now create a database which can be empty, and tell the system which database to use and how to connect to it.
When the system boots, it will check to see if there is a table giving configuration options. If it’s there, it will use it. Otherwise, it will start a web server so that if you point your web browser at it, it shows a configuration page where you can set the options needed to build the system. This includes giving a name for the shard and its shard number.
Templates
Template Conditions
A new option when configuring templates it that you can include conditions that control which users each group within a template will apply to.
Previously you could only choose users by their role, user type or user groups. This now allows you to do this based on any property on a user.
Duplicating Templates Across Resources
It is common when setting up templates that you might want to create identical templates across many different resources all at the same time.
You can now create one template, then click on it in the templates calendar, and one of the items in the pop-up menu is “Duplicate across resources” which will offer you a choice of all resources, and then create identical copies of the selected template across all selected resources.
Subtypes of Misc Biskits
Some biskits now support the creation of subtypes that did not support it before. They are:
- UserType
- BookingType
- ProjectType
- ResourceType
- ResourceUsage
- Location
- ServiceProvider
- Project
- ProjectResourceSettings
- ProjectServiceSettings
This is a part of the Calpendo Enterprise changes, with the idea being that each system within a federation might want to have different flavours of each of the above biskits. So you can now create subtypes of the above biskits, and then control which subtype should be created on your system.
This is done by editing a BiskitDef and setting its pinned property to true. This then means that creating a ServiceProvider (for example) will create whichever BiskitDef subtype of ServiceProvider has been pinned for your system.
You can also specify on a resource which subtype of ResourceUsage should be created for that resource.
Database Dump
The built-in database dump process now also saves stored functions and stored procedures. Previously it would ignore these.
This is necessary now that we have stored functions (parsepk and formatpk) which should be saved in the database dumps. If you create your own stored procedures or functions, they will now be included in dumps created through the user interface.
Group Reports and Collections
Group reports will now let you select a property that contains a set of items. For example, when creating a report on projects, you can show the “users” property. This does not let you add a column to the report that belongs to items within the collection. That is, you cannot add a column for “users.roles”.
Also, when creating a group report, you can choose to aggregate a column. For example, you might display a list of bookings and choose to show the maximum value of the duration, or even the standard deviation.
There are now two new aggregations that have been added:
“Comma Separated Unique Values”
This will show all the values joined together in a comma-separated string.
For example, taking the duration example, if you have a group report on bookings and show a CSV of the duration, then it might show something like “60, 90, 100”.
“Split Values”
This will be selectable whenever displaying a property that is a BitSet, Set of string tags, or a set of biskits. When selected, it means the group report will display multiple rows, one per item in the set.
Do beware that this means duplication of the other items from the same group. For example, if you produce a group report of users show their userIdentity.loginName and roles, with roles given an aggregation of “Split Values”, then a user “Joe” with roles admin and guest would show up twice; one row would indicate a login name of Joe and role admin, and another a login name of Joe and role root.
List Report Sorting
When you have a list report, you can sort the rows by any column by clicking on the header cell for that column. If that column were to contain a biskit-valued property, then the sorting was previously done alphabetically.
However, some biskits define their own custom sort order which may not be alphabetical. When you now sort a list report by clicking on the heading of a biskit-valued column, it will sort the rows using the sorting method defined for the type of biskits in that column.
This will still be alphabetical by default, but sometimes it might be something else.
Hiding Search Bar On Predefined Reports
For a long time, you’ve been able to use the menu editor to add a menu item that will display a report. There’s now an option to hide the search bar when the report is displayed. This is for cases where you want a menu option to display a report, but want to keep things simple for the people who view the report so that there aren’t any options to play with it.
Linking to Biskits From External System
For a long time now, you’ve been able to use URLs that link directly to viewing a particular biskit - so long as you’ve know the ID of the biskit you want to link to. The format is like this:
#ba&type=Calpendo.CalpendoUser&action=view&id=9876543
where the ID will also now accept the new format for primary keys:
#ba&type=Calpendo.CalpendoUser&action=view&id=20200504.123456.981.1
However, we have now added support for links where you don’t know the ID of the biskit you want, but you do have some conditions that could nail down precisely which one it is. You can now put those conditions directly into the URL with a fragment like this:
#ba&type=Calpendo.CalpendoUser&action=view&condition=userIdentity.loginName/eq/'fred'
The format for these conditions also support nested conditions, so the value for the “condition” part of the URL can look like this:
- userIdentity.loginName/eq/‘Fred’
- (and(givenName/eq/‘Fred’)(familyName/eq/‘Bloggs’))
- (and(givenName/eq/‘Fred’)(or(familyName/eq/‘Bloggs’)(familyName/eq/‘Jones’)))
or when creating conditions on bookings:
- (and(dateRange.start/eq/now/to-the/day)(durationInMinutes/eq/i60))
THe full syntax supported is beyond the scope of these release notes, and will be published.
As well as linking directly to particular biskits by specifyng conditions in a #ba page, you can now also have a URL that will initiate a search page with conditions in a similar way. This works for all search pages. For example, with the general search page, you can initiate a search with a URL fragment like this:
#search&searchType=Attachment&condition=created/gt/20200413.0000/to-the/second
The conditions specified here are the same format as for the #ba page.
It’s also worth pointing out that the “&searchType=Attachment” part is also new. You can now link to the general search page with something that initiates a search for a particular biskit type, regardless of whether you specify conditions.
As well as the general search page, you can also specify conditions on any other page. Other search pages would normally be configured to know what biskit type they’re searching for - or at least know what the base type is.
For example, “#bookingSearch” searches for Bookings. If you have subtypes of bookings configured, then you can search for a particular subtype of Booking. This means you can specify a &searchType to #bookingSearch, but it has to be a subtype of Booking.
Layout Changes
For a long time now, it’s been possible to specify in the layout editor that you want a boolean property to display with a checkbox instead of a drop-down. However, that was ignored when boolean properties were actually rendered.
This is now done properly so booleans will now display with a check box if that’s what you want. You can also display them with two radio buttons instead if you prefer.
Also, in the layout editor you can now ask for biskit-valued properties to be displayed with radio buttons instead of the normal method. This is useful for presenting multi-choice questions, for example with some sort of a training quiz.
Theme Changes
Added support for theme targets “splitter.left” and “splitter.main”
Double Booking Rule Covid-19 Changes
The double booking rule has been extended so that when you set the maximum number of bookings that are allowed at the same time, the number no longer has to be a fixed number set in the rule. Instead, it can now be a variable value picked up by some property path from the booking being made.
This is principally to make it easier to support social distancing in shared offices. Suppose you have an office that is used by multiple people, and you want to set a maxiumum number of occupants who must make a booking to reserve a desk.
You can now add a property to the resource that indicates the capacity of the room represented by that resource. Then, you can have a single rule that will work for many rooms with different capacities by picking up the capacity from the room itself.
This is intended to support new ways of working where people no longer have their own desk with their personal belongings, but they are shared in a permanent hot-desking arrangement with daily cleaning between each use.
Processes (aka Stepped-Edit Process)
Initiating A Stepped-Edit Process
We have supported the ability to edit biskits in steps for a long time now. This means you edit a biskit in a page with a Next and Previous button, and a layout controls which properties are visible on which screen, and a workflow can control the flow of which page you go to when you click on one of those buttons.
It is now much easier to initiate editing in this way.
Wherever there is a “Create” button that would create a biskit for which a process is defined, then the create button can now initiate the process. This also works for Calpendo’s “New project” menu item, and any custom menu item for creating a new biskit.
A “Create Copy” button will also behave the same way.
Previously the only way to create a new biskit via a process was by going to a suitably crafted URL.
Also, any “Edit” button that is there to edit a biskit that has a process defined on it can initiate editing via the process. In this case, you might want the edit session to start from the first step or from the step most recently used. The user can either have the choice, or the person that sets up the process definition can specify what the default should be.
If the process is configured to allow the user to choose, then pressing the Edit button will display a drop-down to choose whether you want to edit without steps, edit from the current step, or edit from the first step.
Choosing The Biskit To Edit
Another change that has occurred is that when a user starts a stepped-edit process via any method, then a Process Workflow Event will be triggered.
Previously, this event would only be triggered by a user clicking a button in a stepped-editor. Now it is triggered at the start of the process as well.
Now a workflow is being called, this provides an opportunity for a workflow to decide the process should edit a particular biskit instead. This might be a pre-existing biskit, or one that the workflow creates and does some configuration on before letting the user process continue. In the workflow, you can tell whether you’re being triggered at the start of a session or not by looking at the button that was pressed or the step performed:
- The step performed is null if and only if this is the start of an edit session.
- The button pressed is null if and only if this is the start of an edit session.
The response biskit on the process event’s output now has an additional property called biskitToEdit, and you should set this to the biskit that should be the object to be edited in the user’s session.
To help you, the Process Workflow Event’s output also now includes a reference to the ProcessDef this relates to. Also, the response’s nextStep property will be populated with the step that is considered to be the next step to perform. This will either be the ProcessDef’s initial step or a step specified by the user’s browser.
Simpler Process Configuration
It’s now easier to set up a process this working as we’ve removed the requirement for a layout to be configured on the initial step.
It’s definitely a good thing to set up a layout, but without one, you can at least confirm that the stepped editor is being used.
Exiting A Process
When using a workflow to control what happens when a user clicks a button on one of the stepped-edit pages, you now have the option of setting the nextPageToken property on the process workflow event’s response.
This allows you to choose that a user clicking one of the buttons can result in the user’s browser switching to any page that you want to select.
Misc Changes
- When you set the maximum of a string property in the bakery, we now expect the column in the database to store only that number of characters. This means that:
- when you add a string property and specify its maximum length, SQL code generated to create the column will include specifying the length.
- If you already have text columns defined that have a maximum length, Calpendo will complain about them being the wrong length in the database when you ask to update the schema. That’s because it expects the database definition of the column to indicate the length limit, but existing definitions won’t include that limit. This error can be ignored, or the columns can be modified to be of the correct length.
The drop-down menu item from the calendar pages that said “Copy” has been relabelled as “Copy to clipboard”.
The name of a ResourceType must now be unique
A new property has been added to resource so that each Resource can be set to hide the status in the pop-up for creating a booking.
When displaying notes that have been attached via the layout editor, and you click to see the detail of a note, it’s now shown in a pop-up.
- Add option to the FreeMarker function “biskitSort” to reverse the sort order.
- There’s been a method available in FreeMarker reports to sort a list of biskits for a while.
- There’s now an option to reverse the sort order.
For example, this would take allBiskits, reverse sort it, and assign the result to sortedBiskit:
<#assign sortedBiskits = biskitSort(allBiskits, true, "somePropName", true)>
- New free text search options in custom search page
- The free-text condition mangler initiated with a descriptor of “[free]” also copes with somebody entering values like 100-200 to provide a search for items with an id from 100 to 200, and also values like “100-” and “-200” for one-sided id checks.
- Now that ID numbers are longs, and usually formatted differently, this didn’t work quite correctly.
- First, it wasn’t accepting or displaying primary key values in the new format.
- Second, we sometimes define an integer auto-increment property, and want a [free] to operate by searching for numerical values within that value.
- So for this, we now support the syntax [free-xxx] and it then operates as a free-text search as before, but also looks for numerical ranges in a property called xxx, which should be an integer or long property.
- When using [free], or [free-xxx] where xxx is a primary key number, then we now display using the new Primary Key format and also accept input in primary key format.
When viewing a Function Workflow Action, and the function called is defined by a Custom Workflow Action, then there’s now a tooltip you can see when you mouse hovers over the function name (as viewed in read-only mode) telling you where the function is defined. This is in addition to the help text on the function, seen by clicking the (?) button which will also tell you where the function is defined.
- Tighten default password requirements
- The default is now that passwords require:
- lower case letter
- upper case letter
- number
- non-alphanumeric character
- Minimum length 8
- This doesn’t apply to pre-existing database, but only to new ones created in 10.0.1 or later.
- The settings can all be changed for existing customers in global preferences.
- Change display of function workflow action arguments to line up in columns
- The names of each argument and the values are now displayed in columns
- Render TimeIntervalBox better in read-only mode
- It was showing as a pale grey when in read-only mode, and this made it difficult to read.
- Switched to a regular label when read-only.
If you add a property to store a collection of attachments on a user, then the New User Registration Page will now allow users who register to upload files at registration time.
- You can now disable database dumps from global preferences.
- This can be used if you have some security requirements that means nobody should be able to create a dump of the data.
- This prevents the Database Dump option from being visible on menus (even if you add it in the menu editor) and also prevents the server from dumping the database if you go directly to the #dbdump page.
- Add authentication method filter for user search
- This hides by default Exprodo users and those users whose authentication method does not allow users to log in.
- Add support for built-in usage recorder to provide comments when all is OK
- Previously, at the end of a usage session, the user could enter comments only if they said there was a problem with the session.
- They can now say that everything was successful, but still have the option to provide comments.
- Change default relation in custom search relation for TagSet properties
- TagSet properties used to show with a default of “Includes Any”, so that the search would show matching biskits that had any of the selected tags.
- This has changed to default to “Includes All”.
- You can use an item flag in the descriptor to change the relation to “Includes Any” using the item flag ‘N’.
- Improve email address validation
- We’ve had validation to make sure that email addresses conform to a minimum standard for a long time.
- However, this wasn’t close enough to the standard.
- The validation has been upgraded so that it should now be good at identifying what is and is not legal.
- Add button to history to download raw JSON formatted copy of selected item
- This lets you see exactly what was recorded as the state of an object at a particular moment in time.
Back to Top # Updates #
10.0.0 March 31, 2020
First released version.
10.0.1 July 9, 2020
Changes
Includes all changes and fixes in 9.0.61
- Change display of function workflow action arguments to line up in columns
- The names of each argument and the values are now displayed in columns
- Tighten default password requirements
- This doesn’t apply to pre-existing database, but only to new ones created in 10.0.1 or later.
- The default is now that passwords require:
- lower case letter
- upper case letter
- number
- non-alphanumeric character
- Minimum length 8
- The settings can all be changed for existing customers in global preferences.
- Render boolean properties according to PropertyLayout list/check choice
- For a long time now, it’s been possible to specify in the layout editor that you want a boolean property to display with a checkbox instead of a drop-down.
- However, that was ignored when boolean properties were actually rendered.
- This is now done properly.
Add support for booleans layout with radio buttons as well as check/list
Add support for multi-choice layout for biskit properties
- Add support for ResourceUsage subtypes
- You can specify on a resource which subtype of ResourceUsage should be created for that resource.
- Render TimeIntervalBox better in read-only mode
- It was showing as a pale grey when in read-only mode, and this made it difficult to read.
- Switched to a regular label when read-only.
- Add workflow function csvDecodeAsPrimaryKeys
- This decodes a csv string as primary keys. The values can be formatted as simple long integer values, or as formatted primary keys.
- That means we accept the following forms:
n where n is an integral value
n.s where n and s are integral values, with s being the shard number and n being the time-and-sequence part.
- YYYYDDMM.hhmm.sequence.shard where:
- YYYYMMDD is the date, hhmm is the time,
- sequence is the sequence number and
- shard is the shard number
- Add support for theme targets “splitter.left” and “splitter.main”
- Add support for MacroWorkflowEvent
- Custom Function Workflow Event has been converted into a new type of event called Macro Workflow Event, and Custom Function Workflow Action.
- Macro Workflow Event contains actions that are not triggered by a system event, but directly called by other actions.
- Custom Function Workflow Action defines a custom function, and it can only be added below a Macro Workflow Event.
- This means that to add a custom function, you must now first create a Macro Workflow Event, and then add a Custom Function Action to it.
- Add support for subroutines
- We have also added support for subroutines, using “Define Subroutine Workflow Action” and “Call Subroutine Workflow Action”.
- A subroutine has inputs, and produces outputs, much like a function.
- A subroutine can be passed as an argument to another subroutine, allowing you to provide plug-in behaviour to a subroutine.
- For example, you might have a complicated subroutine that generates an output file, but you might want each line to be either comma separated or HTML. You can handle this by using a subroutine to generate each individual line in the format you want, and passing that as an argument to the subroutine that builds the file.
- When you pass a subroutine as an argument to another subroutine, then you must create an instance of a “Define Interface Workflow Action”, to specify what the inputs and outputs must be for the subroutines passed as an argument.
- Each subroutine that you pass as an argument must then declare that it implements that interface.
- Subroutines and interfaces can only be added below a Macro Workflow Event
- The differences between a subroutine and a function are:
- A function can be called by an expression, but a subroutine cannot.
- A subroutine can be passed as an argument to another subroutine, but a function cannot be passed as an argument.
- Add support for constants
- It’s common that you need workflows to operate using some values that control how it works, where these values rarely change. In these circumstances, it’s preferable not to bury the values deep inside a workflow because that makes it difficult to maintain if those values do need to change.
- So we now have a “Define Constants Workflow Action”.
- Use this like a Create Variables, where you define the values you want.
- Constants can only be added below a Macro Workflow Event. However, you can add any action as a child of a Define Constants Workflow Action. This means you can define what constants you want, and then the child actions can calculate something and store their value onto the constants biskit.
- Note that constants are calculated once when the system boots, and then again whenever the workflow containing the constants is modified.
- Add static property Project.colour as a string-valued colour property
- This is intended to be used for display on the calendars, but has not yet been integrated.
- Add workflow function “typeCastBiskits” to filter a list of biskits by type
- Given an input list of biskits, you can generate an output list of biskits that only includes biskits that are a particular type, or a subtype thereof.
- An argument lets you choose how to deal with input biskits of the wrong type.
- You can either write a null value into the output, or ignore it so that the output may have fewer entries than the input.
- Add new “Add” tab in workflow manager for adding events and actions
- The existing “Add Event” and “Add Action” button still remain for now, but will be removed in a future release.
Bug Fixes
Back to Top
10.0.2 August 21, 2020
Changes
Bug Fixes
- BUGFIX: Exception when add a define subroutine workflow action
- Create a workflow, add a macro, add a define Subroutine and you get an exception in model builder.
BUGFIX: Copy & paste a CallSubroutine action and args lost variable values
BUGFIX: Exporting a workflow containing a “While” action gave an exception
BUGFIX: Importing a workflow containing interface/subroutine/constants did not work
- BUGFIX: Linked bookings fail without link from main to ancillary booking
- If you set up a linked booking without a property on the main booking that references the ancillary booking, then when a main booking is created, it generates an exception.
BUGFIX: One-To-Many properties show “This is empty” when they’re not empty
BUGFIX: History of issues in issue tracker fails with class cast exception
- BUGFIX: Referenced-by conditions mishandled when running reports
- A report that relies on referenced-by conditions could be wrong, by not finding some items that it should. That’s because we check the conditions twice - once directly in the database, and then again in Java.
- We do this because the database version cannot take permissions into account.
- But referenced-by conditions are different. They do a query to locate things that reference something interesting, and take permissions into account by using the referenced-by conditions twice as well.
- We then record the results of the referenced-by test in the search context.
- However, some flavours of search (but not all) did not use the same context when re-running the conditions in Java. So it behaved like there were no references (since it lost the references information).
- BUGFIX: “contains” was confusingly half-case-sensitive and half not
- When running a report, the conditions are run twice.
- Once directly in the database and then again inside Java.
- The second version is required because the first version that runs directly in the database cannot take permissions into account.
- So we run again after permissions have been accounted for so that there can’t be an information leak.
- However, “contains” was case insensitive in the database, and case sensitive in Java.
- The Java version has been changed to be case insensitive.
- This should now match what people most commonly expect.
- BUGFIX: Free Text search won’t load report right when prop order changes
- Suppose you create a custom search page and add a [free] option to it so you see a free text search, and then create a report that you save with some text in the free-text search.
- Then if you refresh the browser so it reloads the report, it would only work if the properties remained set in the bakery to be in the same order as when the report was first saved.
- Issue: 2650
- BUGFIX: Cannot save custom search that specifies a tag set value
- BUGFIX: Save custom search with a tag set and tags display read only
- If you have a custom search page and the search options include a property that is a set of tags, then those tags should always be modifiable in the general search page.
- But if you save the search, then they would display read-only.
- Issue: 2652
Back to Top
10.0.3 October 14, 2020
Changes
Bug Fixes
- BUGFIX: Update DB schema complains value_csv is longtext not varchar
BUGFIX: The paths in the duration rule, number of bookings rule and total time booked rule all only allowed you to select a property on Booking itself, and not on the subtype of booking a rule applies to.
- BUGFIX: workflow function toXml message version converting single biskit
- Only the version that converted a collection to XML was visible.
- The version to convert a single biskit was not visible.
- BUGFIX: Exceptions would occur when creating resource usage
- BUGFIX: Kanban report displayed in single column instead of multiple
- BUGFIX: Copy template to different resource would display old resource
- BUGFIX: “there are no entries here” is always showed in Kanban Report
- BUGFIX: WorkflowManager’s “Open All” button did not open everything
- The more deeply nested items did not get opened.
- For example those under WorkflowBiskit/VersionedWorkflowBiskit/Workflow were not visible, or PermissionUser/ExprodoUser/User.
- BUGFIX: Workflow add events panel has events not in alphabetical order
- They are mostly in alphabetical order, but RemoteAuthorisationRequest and RemoteUserIdentificationRequest appear out of sequence.
- They were actually sorted by their biskit type, and these are actually Calpendo.RemoteAuthorisationRequest and Calpendo.RemoteUserIdentificationRequest so they appeared under ‘C’.
- They are now sorted by their display labels.
- Issue 2627
- BUGFIX: tooltips for resource usage and templates give shallow exceptions
- If you create a resource usage from the calendar, or click the refresh button on the resource usage calendar, and then hover over a usage in the calendar, then you get a shallow exception.
- It complains the resource’s type is shallow (not the usage itself, or even the usage’s resource).
- Similarly, on the template calendar, click the refresh button on the calendar, and hover over a template, and there’s an exception complaining that the resource’s type is shallow.
- Issues: 2594, 2612
Release Candidate rc2
- Disable setting string-valued columns to a length from the PropertyDef max
- Ideally, we would set the length of a string-valued column to be the value set on the PropertyDef for the max value.
- Having had it like that for a while, it’s become clear it’s hard to do that.
- The problem is that if we do this, then you have to worry about columns that are created and then later have a length changed.
- It’s easy and common to do that, but then you get a column whose length is not what it should be, and you end up with errors about the column’s type being wrong.
- BUGFIX: Warning about using Month relative time events appears too often
- We now show a warning when using a relative time workflow event that uses a number of months as the offset. This is because it does not and can not work in all situations in a sane or expected way.
- However, the warning was shown too often.
- If you change the number of months an event is relative to, or change the time from positive to negative, then it would show the warning.
- It now happens when you change the units to month, but not when you change the number or sign.
- Issue: 2676
Release Candidate rc3
- BUGFIX: CreateBiskitDef constants action prevents manual edits to superdef
- If you use a CreateBiskitDef workflow action that creates a new type X that extends an existing BiskitDef Y, and put that inside a Define Constants action, then after booting the system any attempt to edit and save Y from the bakery fails with an exception.
Release Candidate rc4
- Add an option in Sort Workflow Action to specify how to sort null values
- If you ask to sort some biskits by some property, and that property is null for some of the biskits, then you now have a choice of whether to discard those biskits, put them first, or put them last.
- BUGFIX: Only some repeat templates appear in the calendar
- When fetching templates to display in the calendar, repeating templates from the same repeat all have the same ID.
- These were being mishandled so that only one of them would appear on the calendar at once.
- Issue: 2593
Release Candidate rc5
- Rename workflow functions related to “whitelist” to avoid racist overtones
- There are workflow functions that let you filter out the contents of an HTML string. These are done by configuring a “whitelist” that specifies what is allowed.
- As a part of a general process of removing terms with racist overtones, these are now being renamed.
- The following functions are being renamed:
- createHtmlWhitelist becomes createHtmlAllowlist
- addAttributeToWhitelist becomes addAttributeToAllowlist
- addEnforcedAttributeToWhitelist becomes addEnforcedAttributeToAllowlist
- addProtocolsToWhitelist becomes addProtocolsToAllowlist
- addTagToWhitelist becomes addTagToAllowlist
- removeAttributeToWhitelist becomes removeAttributeFromAllowlist
- removeEnforcedAttributeToWhitelist becomes removeEnforcedAttributeFromAllowlist
- removeProtocolsToWhitelist becomes removeProtocolsFromAllowlist
- removeTagToWhitelist becomes removeTagFromAllowlist
The function createHtmlWhitelist, now called createHtmlAllowlist used to return a value called whitelist. It now returns two identical values; one is called whitelist and the other is called allowlist.
The intention is that the whitelist returned value will be removed in a future release. This means you will need to modify any workflows that use this function to reference allowlist instead of whitelist.
Some of the above functions have an argument that is an enumeration called HtmlWhitelistOption. This has been renamed to HtmlAllowlistOption.
Systems upgraded will continue to function correctly. However, if you have any references to the workflow function createHtmlWhitelist, or createHtmlAllowlist as it is now called, then when upgraded to version 10.0.3, a database upgrade warning will be issued to ask you to look for uses of the whitelist returned value and change them to allowlist.
- Rename master/slave terms in linked bookings to main/ancillary
- All references to master booking have been changed to main booking, and references to slave booking have been changed to ancillary booking.
Release Candidate rc6
- Add XQuery example workflow to virgin database
- Create system event when a user logs out
- BUGFIX: Could not save global preferences with CTMS module loaded
- BUGFIX: XSLT example workflow fails in example 1
- This fix makes the database upgrade correct, but does not address pre-existing database which must be manually fixed.
- (The second templated text has an extra closing bracket than it should)
- BUGFIX: Running new stepped-edit process gives exception
- BUGFIX: PRS Table could only add 1 PRS per DB operation instead of many
- BUGFIX: Upgrade directly from 9.0 to 10.0.2 failed (requirements report)
- The database upgrades for the requirements report only worked when going to 10.0.0 or 10.0.1, booting the system, and then upgrading to 10.0.2
- BUGFIX: Upgrade directly from 9.0 to 10.0.3 failed (linked bookings)
- Names relating to the master and slave bookings for a LinkedBooking have been renamed to main booking and ancillary booking.
- However, when a database is upgraded directly from 9.0 to 10.0.3, this does not happen correctly with some properties left at the old names which causes problems.
- Databases built from a 10.0 virgin database did not have this problem.
- Issue 2683
- BUGFIX: System events page shows users with PK instead of their identity
- For example, “Permission User #2.205” shows in the user column instead of a user identity.
- Issue: 2515, 2527
- BUGFIX: Template calendar exception creating template with no resource column
- You get an exception when clicking to create a template in the template calendar when it doesn’t know which resource you want to create it for.
- This happens in one of two circumstances:
- If there are no resource columns displayed (because no resources are selected in the template calendar)
- If you click on the right-hand edge of a day in the day (on a day or week view)
- Issue: 2684
- BUGFIX: Workflow function sendTwillioSMS had fixed send-from phone number
- BUGFIX: Permissions AppliesTo drop-down for users shows bad user identity
- The drop-down shows users by their primary key, and not by their human-readable identity.
- While this fixes this particular issue, the table showing the selected users is still bad (issue 2685).
- Issue: 2620
- BUGFIX: Histopathology service module would not load
- It gave an exception on loading.
- Issue: 2629
- BUGFIX: Radiological assessment service module did not load properly
- It claimed to load, but when looking at the database upgrades run, it decided almost all scripts were not required.
- Issue: 2630
Release Candidate rc8
- Remove irrelevant aggregation options from summary report
- Remove “Comma Separated Unique Values” and “Split Values” aggregation options from the Content drop down of Summary Report
- Issue: 2512
- BUGFIX: Radiological assessment service would not load
- BUGFIX: Menu editor shows menu label taking 100% width of page in Chrome
- This does not happen in FireFox.
- BUGFIX: Non-admin users cannot book for their own projects
- This is a problem because projects were converted to be sent in the login download as a biskit instead of a DTO, but users were still DTOs.
- So the relationships between them were not set up correctly, and so the user ended up with no project information.
Release Candidate rc9
- BUGFIX: Server-client messages sometimes contain unnecessary duplicates
- Some messages contain the same biskit multiple times.
- If these are present in separate lists of biskits in the message, then they were written out in full each time instead of written once in full and then the second time as a reference to the first.
- This means some messages were longer than they needed to be.
Release Candidate rc10
- Add workflow debugger
- This provides a means of properly debugging workflows so that the use of system events should no longer be necessary.
- This is different from most debuggers, in that it does not operate live. Instead, you record some activity and then use the debugger to examine the recording to see what happened. This has the advantage over a “live” debugger that you can go backwards in time through a recording, as well as forwards.
- There’s a new item added to all menus that previously had Workflow Manager on them, and you can also reach it by clicking the “Debugger” button from the Workflow Manager.
- To use this, you must first go to the debugger, go to the recording options, and enable recording. This can be enabled for all workflows or just some.
- Once recording is on, run some workflows.
- Then, in the debugger, enter a range of date/times covering the period you’re interested in, and hit the “Go” button. This will load the recordings taken in that period.
- The recordings will appear split over multiple “runs”. Each run should relate to a separate triggering event. By clicking on a particular run, you will see the content of that run.
- Each run contains a number of “frames”. Each frame represents the execution of a single trigger (that is, an event or action).
- A tree shows all the triggers involved in the currently selected run.
- You can navigate through each of the frames to see what happened at that frame. While on a frame, the Context pane will show all the date that was available in that frame.
- Add new workflow function splitDateRangeByDay
- This takes a pair of dates, a pair of date-time, or a DateRange, and returns a list of date or a list of date range, representing the different days in the original range.
- You can choose which flavour of inputs you want to provide, as well as whether you get back DateRange (so with time) or Date (so without time).
- Issue: 2383
- Give better error message when process button has no next step associated
- Add Permission.number and Permission.autoNumber
- This provides a simple integer number to display to identify a permission, similar to how it looked in version 9.
- Issue: 2675
- BUGFIX: Prevent auto-closing on click the biskit editor that is a pop-up from list
- When showing a pop-up to create/view/edit a biskit, clicking outside the pop-up did cause it to close, which could throw away changes being made that had not yet been saved.
- Issue 2701
- BUGFIX: Custom themes upgraded from 10.0 show splitter pages as lime green
- Version 10.0 introduced new theme items splitter.left and splitter.main.
- These were not given default values during the upgrade, and so were displayed as green by default.
- They should instead display with the colour taken from the built-in classic theme.
- BUGFIX: Boolean properties in layout editor always ignore bakery text
- The bakery lets you define the text to be used for true and false for boolean properties. When setting up a layout, you can also define text for true and false, and the values in the layout override that in the bakery.
- This would be okay, except that if you leave the values in the layout empty, the bakery values ought to be used instead, but they are not.
- Issue: 2665
- BUGFIX: MapWorkflowActionOutput did not add “key” to permanent properties
- Calling setKey(…) and then get(“…”) did not result in the value passed in because m_key was not stored in the properties map.
- Issue 2645
- BUGFIX: Export and import of custom function failed
- The upgrade to the new “macro” way of working meant custom function events are now actions, and there were problems related to this that meant things weren’t quite sure if they were an action or event.
- Issue: 2667
- BUGFIX: stored database function parsepk missing from virgin db
Back to Top
10.0.4 November 4, 2020
Changes
Bug Fixes
- BUGFIX: Biskit drop-downs in workflow sometimes show name as primary key
- The workflow manager caused some bad information to be cached, so that drop-downs were then generated with that bad information.
- Issue: 2719, 2720
- BUGFIX: Rule validator output for Bookings-to-count hides resource info
- BUGFIX: Edit workflow gives user drop-downs with primary keys, not names
- Add a workflow action to search for users, and add a condition on self, select a fixed value so you get a drop-down of users.
- Then you would see the drop-down containing users identified by their primary key and not their name or login name.
- Issue: 2688
- BUGFIX: Permission editor users list shows column for roles, not their identity
- BUGFIX: Exception generating linked booking when no link main to ancillary
- BUGFIX: Generic settings/preferences pages tabs can contain bad CSS class
- The label on the tab is used to create a CSS class name.
- However, the label comes from a text group name that is user specified via the group in the bakery on a PropertyDef, so could contain anything.
- We Removed spaces, but that did not remove punctuation, and so the class name could be illegal.
- For example, the “Date & Time” tab resulted in “Date&Time” but is now “DateTime”.
- BUGFIX: Exception starting session in usage recorder
Back to Top
10.0.5 November 17, 2020
This version incorporates all changes in 9.0.68
Changes
Bug Fixes
- BUGFIX: Linked bookings accidentally associated unlinked bookings with new
- Creating a new parent booking would modify the date/time on pre-existing bookings for the child resource rather than creating a new child booking.
- This happened when there was no property from the parent booking to the child booking. But it could have happened even if there was such a property.
- When locating existing child bookings, it got confused between the property that links from parent to child and the property that links from child to parent booking.
- As a consequence, when there was no property linking from parent to child, then it thought any booking for the child resource might have been a child booking. Whereas it should have checked that the child had a reference back to the parent booking.
- So it found more “child bookings” than it should have done, and could modify those pre-existing bookings, thinking that they were children of the booking just-created/updated when they weren’t.
- BUGFIX: Message on failed update to linked main booking says not “created”
- BUGFIX: Having multiple child linked resources gave an exception when a candidate parent booking was created.
- BUGFIX: A disabled linked booking link could be partially active
- Suppose there is a linked booking link which is disabled and is configured with a property from the parent booking to the child booking.
- Then when a booking is created that looks like it would be eligible to be a parent booking for this link, then the property from the parent booking to the child is set to null.
- This means that if there was a value in there already, either because it was provided by the user or a workflow, then it would be lost.
- This would be expected behaviour for an enabled link, since the link should manage the links to child bookings. But it should not happen for disabled links, and yet it was.
- BUGFIX: Workflow function “toXml” was not usable on lists
- It did not have an overloaded version, one for each supported property type, and so you could not call it.
Back to Top
10.0.6 November 22, 2020
Changes
- On creating a project, a random colour is chosen for it
- Add drag & drop reordering of linked booking status rules
- Extend support for variable child resources for linked bookings
- When specifying a variable resource for a child, by providing a path from the parent resource that leads to the resource to use for the child, you must specify the BiskitDef of the bookings expected for the child.
- This was done so that the user interface could let you specify property links for the right sub-type of booking.
- This now serves an additional purpose, by not allowing a child booking to be created for any parent with a variable child resource when the resource found from the parent happens to use a Booking BiskitDef that is not compatible with that specified in the link.
- Modify help text on linked booking status rules
- This makes it explicit that the order of the rules is crucial.
Bug Fixes
- BUGFIX: Creating a linked booking link with conditions failed to save
- BUGFIX: Linked bookings give exception when variable resource is null
- When you configure a link for a variable resource, the understanding is that it might evaluate to null, in which case there should be no linked booking.
- However, a null value was not handled properly.
- BUGFIX: Could not control order of linked booking status rules
- They were supposed to remember their order in the table, but instead they were always shown and used in order of creation.
- BUGFIX: Status rules were not displayed sorted but in creation order
- BUGFIX: new linked booking link has wrong default property links
- When setting up the property links, the implied Booking BiskitDef was calculated as null, simply because there are no child resources yet.
- However, we always know it’s at least a Booking.
Once the default setting (for the project property) is set up without a null BiskitDef, it means it doesn’t find the PropertyDef for the project property, and you see no PropertyDefSelector, and then on save you end up with the first property being selected instead (allDay) so you get a property link of
"allDay always copy variable value project"
which makes no sense.
- BUGFIX: Create new repeat booking and you could get linked booking
- The first instance of the repeat could generate a linked booking, even though it’s not supposed to (since we don’t currently support linked bookings for repeating bookings), and later instances would not.
- BUGFIX: Linked bookings ignored conditions if no parent-to-child property
10.0.7 December 2, 2020
This includes everything in version 9.0.69
Changes
- Creating virgin database improved
- All fields now show placeholders so you can better see what sort of thing it expects.
- Prevent local root from logging in to virgin DB is password was left empty
- The virgin builder page says you can leave the root password empty to disable the local root user, but it wasn’t actually doing that.
- Issue: 2591
- Set icalViewer and nobody passwords to long random value
- This is an added protection against somebody logging in to these accounts that should never be used to log in with.
- Remove the unused description property from virgin configuration
- Track the post-build virgin status so browser knows when the boot completes
- Add virgin build option for browser auto reload when server boot completes
- Make My-Projects-Bookings page find no bookings when user has no projects
- Add support for workflow buttons to display with a number instead of primary key (now that primary keys are longer than they used to be)
- Add extra info to download permission failure message when IP address wrong
- The message now tells users when the problem is that their IP address has changed.
- This happens just a little too often to real people to hide this information.
- Remove “Cancelled” as a status controlled by linked booking status rules
- Cancelled bookings are handled specially by linked bookings.
- Whenever a parent is cancelled, the child is cancelled and there is no option to change that because it wouldn’t make sense to do so.
- This is also consistent with the notion that a cancelled parent means the link to the now-cancelled child is broken.
- This is done so that any changes to the cancelled parent do not change the cancelled child since it is right that the child remain as it was.
- Also, if you cancel a repeat booking this-and-later, then you end up with many cancelled bookings.
- If those cancelled bookings become eligible for being a parent, then the cancellation of the parent would create many child bookings linked to the parent, when the parent was not previously eligible for child bookings since it was a repeat.
- Add authentication method filter for user search
- This hides by default Exprodo users and those users whose authentication method does not allow users to log in.
Bug Fixes
- BUGFIX: CustomTreePage with workflow run on clicking a group node failed
- BUGFIX: CustomTreePage with nodes using an empty string cause exception
- BUGFIX: Tab on tag set would auto-select 1st option instead of skipping
- BUGFIX: Could not save workflow with GetConstants having external constants
- BUGFIX: Bad export of Define subroutine/interface/constants workflow action
- Exporting a workflow with any of these actions would result in some SQL that could not be loaded.
- Issue: 2667
- BUGFIX: Change Type to search for with Kanban report can give an error
- Search for Booking, change to a Kanban report based on the dateRange, then change to searching for any other type that doesn’t have a dateRange property, and you get an error.
- Issue: 2672
- BUGFIX: Bad message given on creating a ResourceType with a non-unique name
- BUGFIX: Exception on add child to one-to-many before parent saved
- BUGFIX: Add multiple identical children to one-to-many set and one is saved
- BUGFIX: Reloading browser while viewing saved report asks if ok to reload
- When you’ve changed a report and want to load a new report, it asks if you want to reload.
- However, it should not do that when you are viewing an unchanged, saved report and then refresh your browser. It was asking just after the browser loaded and before the report itself loaded.
- BUGFIX: Report saved from custom tree page not loadable outside for some
- If you have a custom tree page configured on a menu, and it’s configured on a menu item that’s set up as a link to a different menu where the details of that custom tree page are configured, then some things don’t work.
- In particular, custom search pages defined inside the custom tree page menu items do not function.
- Issue: 2653
- BUGFIX: Report with referenced-by conditions cause menu editor errors
- If you create a report that uses referenced-by conditions and save it, and then go to the menu editor page and refresh the browser, there’s an error parsing the data received from the server.
- The error does not generate a pop-up and can only be seen by using the browser’s developer tools (eg CTRL-J on Chrome)
- BUGFIX: Biskit tree editor pages hide new biskit if create from search view
- Suppose you go to any BiskitTreeEditor page (such as the resource editor).
- Then you click on one of the biskit types in the tree on the left, so that you see a search pane on the right, and then you create a new biskit from that search pane.
- Then when you save the biskit, it does not show you the details of the biskit you just created.
- You should see a read-only version of it, but you would either see nothing, or just a tab panel if the biskit displays with a tab panel (like resources do).
- Issue 2737
- BUGFIX: No reject pop-up on RuleEvent if runs before standard rules
- There’s an inconsistency on how the reject pop-up is shown on a RuleEvent resulting in Reject. If rejecting an action, a error popup should always appear.
- Regardless of the running before or after standard rules
- Issue: 2694
- BUGFIX: edit-in-steps happens behind a pop-up
- BUGFIX: Exception in linked bookings when new child updated to not require link
- When the new child’s parent is null, it caused a problem.
- BUGFIX: Database upgrade 9 to 10.0 failed if schema is missing a table
- If you add biskit definitions to indicate there is a new BiskitDef and a new table for it, and have a property that holds a reference to a biskit of that type, but do not update the schema so that the table for the new BiskitDef does not exist, then the upgrade would fail.
- It would be complaining about the missing table, but in a way that prevented the upgrade completing.
- The missing table was not in itself causing a problem, but rather when trying to identify the target columns for upgrade, we calculated the target column as null because the table was not in use.
- It now generates warnings when it finds a problem like this.
RC2
- BUGFIX: Virgin-built systems from 10.0.0 to 10.0.6 don’t boot in 10.0.7+
- BUGFIX: System events page is slow when you first visit it
RC3
- BUGFIX: Workflow drop-downs using primary key instead of workflow number
- This affects creation of workflow buttons and menus that call workflows.
- BUGFIX: Help buttons could be clicked anywhere along whole width of page
- While the image used to display a help button only had the width you would expect (matching the visual icon), the “hot spot” where you could click and activate the button was much wider.
- This was most easily seen in the linked booking manager, where you could click anywhere to the right of a help button and activate it - across the whole width of the pane it was in.
- This broke the principle of least surprise.
- BUGFIX: Change parent linked booking to not be linked and it retains link
- If a link is configured such that the parent booking holds a reference to the child booking, and a pre-existing parent booking is modified in such a way that it means it is no longer eligible to be a parent booking, then despite the child booking being cancelled and dropping its reference to the parent, the parent retains its reference to the child.
- BUGFIX: CustomTreePage with group action to run workflow only runs once
- When you first click on a group node in a custom tree page that is configured to run a workflow, it will run the workflow.
- If you click on it again, it didn’t.
- It now does.
10.0.8 December 8, 2020
This includes everything in version 9.0.70
Changes
- Add support for recording to whom a requirement is currently allocated
- Add biskit name to any pop-up that views or edits a biskit
- Add support for specifying cancellation reason & comments in rule validator
Bug Fixes
- BUGFIX: Create copy of service order and it appears behind current popup
- BUGFIX: Only some repeat templates appear in the calendar (again)
- Repeating templates would only appear on the templates calendar once, even if they were supposed to appear multiple times on different dates.
- Issue: 2749
- BUGFIX: When parent status change changes child, calendar did not update
- If you set up a linked booking and a parent with child so that a change of status to the parent should cause the child’s status to change, then the calendar would update to show the change to the parent booking, but not the child booking.
- BUGFIX: LinkedBookings “copy when same” did not work for time of child
- If you set the timing on a link to be “copy when same”, then that should mean that a change to the start time of the parent will be copied to the child as long as the parent and child had the same start time before the change.
- But it was always applying, regardless.
10.0.9 December 17, 2020
This includes everything in version 9.0.71
Changes
- Add support for a process workflow event response to set the next page
- When writing a workflow to handle a process (a stepped-edit of a biskit), the workflow can now decide to terminate the process at any point by choosing a page the user’s browser should redirect to.
- It can do this by setting the new nextPageToken property on the event’s response biskit.
- This works exactly the same as the user workflow biskit’s response.
- Issue: 2768
- Change process handling so that a layout is not mandatory for initial step
- When setting up a process (aka stepped edit), it makes a whole lot of sense to have a layout set up for each step.
- However, the basics mechanism can work without it, and yet it was set up as a requirement.
- This was troublesome because it made it a little harder to get a process definition set up, and failing to set a layout on the initial step would give an error message that did not help you see what was wrong.
- So now this has been made easier by removing the requirement for a layout to be there at all.
- It’s sensible to have one, but you can now get going without it - this makes it easier to get it up and running.
Bug Fixes
- BUGFIX: Exception creating resource after pinning new Booking subtype
- BUGFIX: Biskit-valued dynamic properties on booking don’t show right name
- Suppose you create a biskit of type X that holds a reference to a user, and you configure X to show the user’s name as the name of X.
- Suppose you then set up Booking so that it has a reference to an X.
- Then when you look at the booking im a pop-up on the calendar, the value of X will not show the full name of the user inside the X, but just the user’s ID number instead.
- Issue: 2758
- BUGFIX: Global preferences/Bookings/calendar formats text boxes too narrow
- BUGFIX: Processes displayed step ID in URL using plain unformatted number
- It’s now formatted like all other ID numbers that are displayed in version 10.0
10.0.10 December 22, 2020
This includes everything in version 9.0.72
Changes
- Display Resource.bookingBiskitDef more often
- Resource.bookingBiskitDef was hidden whenever there was only one possible value it was allowed to have.
- It now shows either when there’s more than one possible value, or when it’s not set to the base Booking type.
- The allowed values are determined by whether the current system has a Booking subtype pinned in the bakery. If it is, then we can only choose subtypes of that pinned one.
- Since the pinned BiskitDef might have no subtypes, then in such a case, the resource’s bookingBiskitDef was hidden in the resource editor.
- But it makes more sense to hide it only when there are no subtypes of Booking at all.
- Issue: 2769
- Notify the user when server cannot parse a client request properly
Bug Fixes
- BUGFIX: Using a process to create/edit Calpendo.Project fails
- BUGFIX: Cannot configure automated linked booking child properties
- If a child booking has a property configured to be automated, then you can’t set up a linked booking to set a value for it.
- Issue: 2772
- BUGFIX: NPE in LinkedBookingManager when handle non-user booking update
- There was an assumption that everything the linked booking manager handled was coming from a request made by the user.
- But that’s not always true, as bookings are sometimes created by automated processes, and they failed because of this assumption.
- BUGFIX: CTMS search for subjects with no events gives exception
Back to Top
10.0.11 December 23, 2020
This includes everything in version 9.0.72
Changes
- Show workflow buttons on user, project and booking request pages
Bug Fixes
- BUGFIX: Biskit created via process not appear in custom tree page
- If you have a custom tree page that shows biskits of a particular type,
- and you create such a biskit via a stepped-edit process
- and you then go to the custom tree page and click its refresh button
- then the new biskit did not appear.
- Issue: 2774
- BUGFIX: Boolean values displayed read-only with custom layout text fail
- When you have a boolean value with custom text for true and false values assigned in a layout, and you have a value displayed read-only, then reading a value from the UI gives back false.
- Issue: 2777
- BUGFIX: Save from list of biskits and displayed columns can change
- If you have a subtype of Project
- and you search for projects
- and the search is set up only to find instances of a subtype of project
- and you edit and save one of the listed projects
- then the list changes to show all listable properties on the subtype
- and the saved project shows sensible values for the extra columns
- and all other projects show “” for the extra columns
- Issue: 2776
Back to Top
10.0.12 January 4, 2021
This includes everything in version 9.0.73
Changes
- Add support for options on create/update biskits with stepped-edit process defined
- When setting up the Process definition to enable a stepped-edit process, you can now choose when creating or editing biskits of the process’ target type will use the process by default, or whether the user should be asked.
- When editting a biskit which has a process defined, starting in version 10.0.0, the user would have a drop-down asking whether they want to edit from the first step, from the current step, or not in steps at all.
- This drop-down can now be removed by the person setting up the process since they can select what option should be used, or they can select that the user should be asked.
- There’s also now the option to choose what happens when creating a new biskit for which a process is defined. Again, the options are to create via the process, create without a process, or to let the user choose.
- Stepped-edit processes in version 9.0 relied on the user being given a suitably configured URL for them to select, or a suitable menu item to initiate the process.
- Issue: 2784
- Add new “Draft” project status
- The Projects Search and My Projects pages both display draft projects by default.
- Both admins and regular users are prevented from making a booking for a draft project.
- Validation of a project is not performed while its status is draft. This means the checks due to the min/max/required attributes set in the bakery and not any checks you may have customised in workflows.
- Issue: 2780
- Add support for built-in usage recorder to provide comments when all is OK
- Previously, at the end of a usage session, the user could enter comments only if they said there was a problem with the session.
- They can now say that everything was successful, but still have the option to provide comments.
Bug Fixes
- BUGFIX: Child biskit properties in detail view can show biskit by ID
- If you have a biskit A that has a property b that is a biskit of type B, and you see a list of biskits of type A, then it might show the value of the property b, and do so correctly.
- If you then click on an A to see its detail, the property b can show a B using its ID rather than its properly calculated name.
- This only happens if the browser hasn’t already cached the name of the B itself some other way (the list report doesn’t cache the name but showing the detail of the B would do it).
- Issue: 2781
- BUGFIX: Resource.bookingBiskitDef not displayed when it should be
- This bug was supposed to be fixed in 10.0.10, but still had a problem.
- Issue: 2769
- BUGFIX: Stepped editing of biskits with one-to-many props can fail
- This is a bug in code added in version 9.0.8 to support the stepped-editing of biskits with a one-to-many property on it.
- If the collection of children is null, then we generate an exception.
- BUGFIX: CustomTreePage showing Bookings displays PK not name until clicked
- If you configure a Custom Tree Page to display bookings, then they show in the list by their primary key rather than their formatted name (which is normally the start/finish date/time).
- When you click on one to display it, its correct name is displayed in the list.
- This happened with any biskit type that is not enumerable (since we don’t cache things related to such biskits).
- BUGFIX: biskit created not via a process could not be edited with one
- If you were not created with a process, then your current step would be null, which means you can’t edit from the current step.
- This changes now so that it is treated as though its current step is the initial step.
- BUGFIX: Different processes set up on the same hierarchy treated as error
- If you set up a process far a particular BiskitDef, and also for a subtype of it, then this would cause a problem and one of the processes would be picked, but without care to make sure it was the most appropriate one.
- We now make sure that we pick the process that’s most appropriate, by seeing which BiskitDef in the hierarchy they are for.
- If multiple are found for the same BiskitDef, then one will be picked (with no guarantees about which one will be used).
Back to Top
10.0.13 January 6, 2021
Changes
- Change the default status for a new project to be draft, not requested
- When somebody creates a new project, its status will be draft by default.
- This means that an administrator won’t receive a notification that the project is ready to be approved until the status is changed to requested.
- This will require action by the person creating the project to choose to set the status to requested.
Bug Fixes
- BUGFIX: Creating virgin database fails depending on directory permissions
- BUGFIX: The button on a project to terminate it was changing it to draft
- BUGFIX: Buttons were repeated in the project requests approval page
- Buttons to approve, deny, terminate and restrict the selected projects all appeared twice.
- BUGFIX: Different processes set up on the same hierarchy mistreated
- A 10.0.12 fix for this didn’t quite work in all circumstances.
- This is about having a process set up for both a BiskitDef and a child BiskitDef.
- The child version was not getting the right process, and was generating an error message.
Back to Top
10.0.14 January 8, 2021
Bug Fixes
- BUGFIX: Create project from project search page avoids project template
- There’s a template project that you can use to set the default value of properties when creating a new project.
- But that was being ignored when you create a project by going to a search page, searching for projects, and then click the create button that’s there.
- Issue 2789
Back to Top
10.0.15 January 12, 2021
This includes everything in version 9.0.74
Changes
- Add property Booking.link to record which link created a new child booking
- Where a booking is created because it is the child of a linked booking link, then the child booking now records which link created it.
- This allows Calpendo to handle more complicated linked booking scenarios such as:
- A parent booking has a property that indicates which resource should be used for a child booking, and link uses that property to specify a variable resource. Somebody then modifies the parent booking of such a linked booking and changes which resource the child booking should use. This was previously not handled properly, and will now cancel the child and create a new child booking.
- Multiple linked booking links are created that operate on the same parent bookings, and can create child bookings on the same resources. Previously, we had no way to know which link was used to create children in this scenario.
- The Booking.link property remains set even after the child booking is cancelled.
- Issues: 2790, 27901
- Change the message from a workflow veto to give the workflow number, not PK
- When a workflow vetoes an action, it can provide a message that will be presented to the user.
- In order to aid anybody who wants to find the workflow that generated that message, the pop-up also identifies which workflow and action generated it.
- This was showing the primary key of the workflow, but this has now changed to giving the workflow’s number.
- This is much more human-readable now that primary key values are much larger in Exprodo version 10.
Bug Fixes
- BUGFIX: Exporting generated code failed for TypeCastWorkflowAction
- BUGFIX: Virgin database could not create linked booking link
Back to Top
10.0.16 January 21, 2021
Changes
- Add placeholder text to suggest boxes and tree boxes
- When you have a text box that you can type into and that displays a drop-down for values, then while that text box is empty (has no text in it) it will now display some greyed-out placeholder text.
- The text says “Type to select a value”.
- For example, go to the permissions page, click “Create” to create a new permission, click in the Data Type and delete all the text there. It then shows the new text.
Bug Fixes
- BUGFIX: Calendar shallow exception if permissions deny read on booking prop
- If permissions are set up to deny READ permission on any biskit that is a property on a booking (such as the owner), then the bookings calendar would not display.
- Issue: 2794
- BUGFIX: Create copy of permission and the copy has the same number as orig
- BUGFIX: Saving biskits after clicking on card in Kanban report gives error
- Biskits found by running a Kanban report can be shallow, and these are not handled correctly.
- Issue: 2796
Back to Top
10.0.17 January 26, 2021
This includes everything in version 9.0.75
Changes
- Change “Best Possible” to “Template Status” in linked bookings
- References to the text “Best Possible” has been replaced to avoid confusion over what it means.
- When it comes to linked bookings, when you set up a status rule to change the status of child bookings, you can choose that a change to the parent should result in the child getting the status it would have if it were assigned by a template.
- That is what this means.
- Allow linked bookings status rules to indicate child should be cancelled
- You can now choose that a child booking should be cancelled in response to a change in the parent booking’s status.
- Allow linked bookings to change parent’s status in response to child status change
- Normally, you’d like booking status changes to flow from parent to child.
- Sometimes, you’d like the ability for the information to flow the other way.
- This might be if you have a child booking that’s so important to the parent that cancelling the child should cancel the parent.
- When you edit a linked booking link now, you can set up status rules for how changes on the child might affect the parent.
- Set the default iCal fetch frequency for imported resources to be 4 hours
- When you create a new resource, if you set a URL for its bookings to be imported from an ical feed, then it will now be refreshed every 4 hours by default.
- Previously the default was zero, which means that it was disabled.
- This now means that enabling an ical import requires fewer steps since the fetch frequency is already set to a sensible default.
- Change “no project has been selected” msg when customer relabels project
- On entering a booking on the calendar for a resource that requires a project, it produces an error message if the project is not set.
- It mentions “project” in the message, even if the customer has relabelled project as something else - such as “study”.
- This has now been changed so this message now uses the correct name.
- Issue: 2787
- Add standard report showing the custom properties that are defined
- This report is owned by admin, and not system wide.
- It can easily be changed to be system wide is required.
- The report is called “Custom Properties”.
- Issue: 2391
Bug Fixes
- BUGFIX: CSV and TSV formatted reports can’t be emailed in body of email
- This did not affect all systems. Some that were created a long time ago were functioning correctly.
- BUGFIX: Unbootable system if set default value on biskit-valued property
- BUGFIX: Cannot change global preferences minutes between dumps
- Any attempt to change the value and save it results in the new value quietly being ignored.
- Issue: 2809
- BUGFIX: One-to-many table did not auto-increment drag/drop of date-time properties
- If you set up the child of a one-to-many to contain a date and a date-time property, and then use the UI to enter a value and drag-extend the selected values to other cells, it should auto-increment by one day for each cell.
- However, while it did this for date properties, it did not do it for date-time properties.
- Issue: 2374
- BUGFIX: Changes are not saved for global preferences new user default roles
- BUGFIX: Exception running summary report
- Some summary reports generate an exception when they run.
- Issue: 2812
- BUGFIX: Report using equals condition wouldn’t return every result
- BUGFIX: Group report of PropertyDef with column for defaultValue fails
- BUGFIX: searching for property references in the bakery can give error
- When an Exprodo database is first created, there are various conditions tables that might have entries populated in them.
- Some of these entries are malformed in a way that means going to the bakery and searching for references to a property can fail if you search for a property whose name matches a path used in one of those malformed conditions.
- For example, in Calpendo go to the bakery tools and in the Path References section, search for “ical” and it will give an error.
- Issue: 2821
Back to Top
10.0.18 February 1, 2021
This includes everything in version 9.0.76
Changes
- Change visibility of BiskitDef and PropertyDef from ROOT to ADMINS
- This means that an admin will be able to search for BiskitDef and PropertyDef.
Bug Fixes
- BUGFIX: Cancel button in unsaved changes popup would keep reopening popup
- BUGFIX: Rule checks expand booking when updating sequence using ‘This item’
- BUGFIX: Linked Bookings generated false-positive log messages
- When a booking updated, the log messages suggested it was eligible to be a parent of a link, event if no links were actually found.
- This did not affect the performance, only the log messages themselves.
- BUGFIX: Workflow search not allow RHS value to match LHS biskit id
- If you create a workflow search action, and on the left hand side you have a long value (such as a biskit’s id), then it should, but does not, allow you to select a matching biskit id from the right hand side property path drop down.
- Issue: 2575
- BUGFIX: Default reminder notice period is 0 minutes when use time slots
- When you have time slots, like 9am-5pm, and you click in the calendar to create a booking at any time from 9.30am to 4.30pm, the booking pop-up shows a reminder notice period of zero seconds.
- Click at 9am or outside all slots and it shows 30 minutes.
- Issue: 2177
- BUGFIX: Linked bookings don’t display those with cancelled new child status
- BUGFIX: Linked bookings don’t work correctly when child is cancelled
- Cancelling a child of a linked booking might end up leaving it requested depending on the configuration of the link.
This happens with the following for Child to Parent status rules:
Child: Any->Cancelled, Parent: Any->Cancelled
Child: Any->Requested, Parent: Any->Requested
Issue: 2826
- BUGFIX: Recreate workflow from history and it steals events from latest
- This bug was thought to be fixed in 10.0.17, but it was not working as planned.
- Issue: 2470
Back to Top
10.0.19 February 5, 2021
This includes everything in version 9.0.77
Changes
- Add help text to the linked bookings “Child Properties” tab
Bug Fixes
- BUGFIX: Linked booking child status rolling up to parent when should not
- Suppose:
- you set the status so that when creating a parent as approved, the child gets the current template status
- you set it so a change of child status from anything to requested changes the parent to be requested
- Then you can find that creating a parent as approved would result in both parent and child being requested.
- This did not happen always - but in cases where a workflow was triggered by creating a booking, and it then edited that booking.
- Issue: 2837
- BUGFIX: Exporting some workflows fails with a shallow exception
- This only happened with some workflows.
- Issue: 2853
Back to Top
10.0.20 February 10, 2021
Changes
- Display multi-line automated string properties read only in write mode
- In write mode, it is normal that automated properties are hidden.
- That doesn’t happen yet for multi-line string properties.
- So we now make sure such properties are at least displayed read-only.
Bug Fixes
- BUGFIX: No signature on outgoing plain text emails when no prefs signature
- If you set the global preferences so that the signature on outgoing emails is empty on plain text emails and html emails, then you actually get no signature on plain text emails, but you get a default signature on HTML emails.
- This is now changed so that an empty signature results in the default signature being sent.
- If you want a truly empty signature, then add a signature that contains something.
- For example, an empty space for a plain text signature, and just a period for an HTML signature.
- BUGFIX: Options for conditions panel would display inconsistently in rules
- Conditions under the Rule tab should only offer the Value/Meta/BookingToMatch options, but would sometimes allow you to choose Old Value and New Value
- Issue: 2130
- Related to issue 1627
- BUGFIX: ID of biskit you want history for was read only on history page
- This should let you specify a particular ID for the biskit whose history you want, and it did so correctly in 9.0 but not version 10.0.
Back to Top
10.0.21 February 15, 2021
This includes everything in version 9.0.78
Changes
- Set number of rows and columns to display a FAQ answer if not specified
- Without this, FAQ answer would display with very little space when editing the answer.
Bug Fixes
- BUGFIX: Custom search page with date selection asked for time
- If you have a date property (that is, one without time) and set up a custom search page that includes an option to select by putting in date values, then the UI also asked for time.
Back to Top
10.0.22 February 17, 2021
This includes everything in version 9.0.79
Changes
- Add Requirements to help menus
- This makes the built-in requirements system easier to use by having pre-built menus to access it.
Bug Fixes
- BUGFIX: Linked menu items can display incorrectly in menu editor
- Version 10.0 allows menu items that are links to another menu item, so that you can define parts of a menu once, and reuse them on other menus.
- When displaying these links in the menu editor, then if the menu item being linked to is not on the current user’s menu, then it would display the link as pointing to a menu item that was “null” or “<Hidden>”.
Back to Top
10.0.23 February 23, 2021
Changes
Bug Fixes
Back to Top
10.0.24 March 3, 2021
This includes everything in version 9.0.80
Changes
- Add support for custom tree pages to expand a biskit hierarchy of nodes
- Suppose you create a custom tree page on a menu, and you display dynamic nodes by grouping biskits by something that forms a hierarchy.
- For example, show Calpendo resources by the booking BiskitDef.
- Then this will now show a tree of BiskitDefs, rather than a flat list of BiskitDefs, with the resources shown below the relevant BiskitDef.
Bug Fixes
- BUGFIX: Authentication methods not sorted properly when creating user
- Authentication methods should be sorted by their sortOrder property, but the drop-down was instead sorting alphabetically.
- This meant that Exprodo was often the default authentication method, which meant people would create users with an Exprodo authentication method when they didn’t mean to.
- Issue: 2856
BUGFIX: Asking for history on some items would give exception
- BUGFIX: Trying to log in with a name too long gives horrible database error
- It now gives a more friendly message to say the name is too long.
- Issue: 1033
- BUGFIX: Menu editor logs error if there are reports using referenced-by
If there are any saved reports that used a referenced-by condition, then on first going to the menu editor, the browser logs an error message saying:
JSON parsing failed - treating bad value as shallow
(prop=ChildMultiCondition.parent):
We've been told to expect a biskit of type MultiCondition
but the JSON we found contains a ReportSingleCondition
BUGFIX: TextRenderingManager returned null for some boolean properties
BUGFIX: Ancestor of/descendant of relations sometimes fail
- BUGFIX: Requirements report slow to render
- Updates were being fired for a change to the Kanban column when it shouldn’t be
- BUGFIX: CustomTreePage fails to show group matching empty tags
- If you add a CustomTreePage to the menu, and show some biskits by a tags property (for example, show requirements by its tags), then you will see a tree of biskits grouped by the tags on those biskits.
- If you configure this so that clicking on the grouping (the node of the tree representing the tag in this case) shows a search page, then (in the example) clicking on a tag will show all requirements that include that tag.
- If there are some biskits with no tags at all, then clicking on the “No tags set” node should show all biskits that don’t have any tags on them.
- However, that was not working, and it would instead find nothing even if the tree would show that there are things to find.
- BUGFIX: Permissions in browser that rely on resource groups can fail
- If you have permissions that (for example) check whether you can create a booking based on a resource’s membership of a resource group, then there are logged warnings about the resource group being shallow, and not being able to check the permissions properly.
- This is not considered a security issue because the server-side code applies permissions correctly.
- BUGFIX: Conditions checking tags includes a fixed list cannot be saved
- If you create a condition on a tags property and use an includes-all relation, and list one or items to check being in the tags, then the conditions cannot be saved.
Back to Top
10.0.25 March 5, 2021
This includes everything in version 9.0.81
Changes
- Inherit conditions when custom tree page puts search as top-level item
- When a custom tree page chooses to use a customised search page as a node that contains dynamic nodes expanded below it, then any conditions selected on the search page are now automatically inherited and used to filter the dynamic nodes displayed within it, and also inherited for any search pages shown when clicking on a grouping node beneath it.
- Issue: 2766
- Add support for dynamic subtypes of the Account BiskitDef
Bug Fixes
- BUGFIX: Selecting Custom Tree Page dynamic group node gives error if report type unset
- If:
- you set up a custom tree page
- and choose a property by which to group values
- and set the groups to display a custom search
- and do not set the report type to use
- Then when you click on one of the groups when the custom tree page is generated, it gives an exception.
Back to Top
10.0.26 March 11, 2021
Changes
- Remove unnecessary data from biskit definitions sent to browser on login
- When logging in, a browser is sent a message that includes the details of many biskit definitions.
- If some workflows had already run, then temporary biskit definitions generated when the workflow ran would find their way into the data sent to the browser.
- It didn’t cause any problems except that it added unnecessary data and so would have slowed things down.
- Add warnings on upgrading from 9.0.x to 10.0 if something appears to reference an id in a way that might indicate something needs to be modified now that id values have changed.
- In each case, this might well be a false-positive warning, but it needs a human to examine it to be sure.
- This affects:
- Any workflow item that has a path that references an id. For example, if you try to store the id of a biskit somewhere.
- A condition on any part of a workflow references an id by value.
- A workflow action that has a path to something that looks like it references an id.
Bug Fixes
- BUGFIX: Links in new user request emails no longer work
- BUGFIX: Requirements menu items not added on upgrade from 9.0 to 10.0
- BUGFIX: Reminders for booking subtypes use wrong format for email content
- BUGFIX: Warnings about one-to-many referencing the wrong child appeared
- The warnings were false-positives and should not have appeared
- BUGFIX: Menu editor fails to load after 10.0 upgrade with empty Help menu
- If you have a 9.0 system with a menu containing a Help submenu item which itself had no subitems, then the upgrade to 10.0 resulted in an incorrect menu being added for the built in requirements system.
- This in turn meant the menu editor could not display or edit any of the menus.
- BUGFIX: Facility pages freeze following workflow using 10.0-only actions
- Occasionally, the facility pages on some 10.0 systems would cause the browser to freeze, while the browser appeared to be stuck in an infinite loop.
- This was down to the way some of the new 10.0-only workflow actions work.
- In particular, it was triggered by running any:
- Call Subroutine Workflow Action
- Create BiskitDef Workflow Action
- Create Variables Workflow Action
- Custom Function Workflow Action
- Define Constants Workflow Action
- Define Subroutine Workflow Action
- When that happened, the cached copy of biskit definitions was corrupted, so that when a browser was given them, it caused problems.
Back to Top
10.0.27 March 17, 2021
Bug Fixes
- BUGFIX: Recording workflows while a condition fails generates an exception
- If you are recording workflows, and have a situation where a condition evaluates to false, then the recorder generates an exception.
- BUGFIX: Conditions that reference MetaProperty.shardNumber generate error
Back to Top
10.0.28 March 23, 2021
Changes
- Database upgrade from 9.0 to 10.0 modified to improve warnings given
- The upgrade now leaves behind a table called _warnings to provide an additional method of viewing the warnings after an upgrade.
- Some warnings were too long to be stored and caused an upgrade error.
- All warnings now generate an entry in the _warnings table rather than a subset.
- References to the “find” workflow function are now more likely to generate a warning. This function has changed from having an integer argument to a long argument. The upgrade was generating a warning whenever the argument was a variable value using a path with “int” in the path. This is now switched so that we generate a warning if it’s a variable value and the path to the value that feeds it does not contain either “pk” or “primaryKey”.
- Workflow conditions were previously checked to see if any referenced a primary key using an integer fixed value. This is now done for all non-workflow conditions as well. Permissions are perhaps the most likely place where this might happen.
- Database upgrade from 9.0 to 10.0 improved handling of formulaic properties
- Upgrade C3P0 library from version 0.9.5.2 to 0.9.5.5
- This is a database connection pooling library
Bug Fixes
- BUGFIX: Shallow exception on step through workflow debugger recording
- When a workflow debugger recording is stepped through, and you pass over a frame that is for a BiskitUpdateWorkflowAction, it can generate an exception.
- This was seen to happen when the biskit being updated was from a ForEachWorkflowAction that was looping through the results of a SearchWorkflowAction.
- BUGFIX: Memory leak found every time data is cleaned for passing to browser
Back to Top
10.0.29 April 6, 2021
This includes everything in version 9.0.83
Changes
- Auto-upgrade hard-coded conditions fixed ints that look like primary keys
- When upgrading from 9.0 to 10.0, if there are any conditions that compare to a value that is a fixed integer, and it looks like it’s comparing it to a primary key, then the integer value is modified in accordance with the way primary key values are changed from version 9.0 to 10.0.
- Upgrade workflow function calls to csvDecodeAsPrimaryKeys to return longs
- When upgrading from 9.0 to 10.0, any 9.0 system that uses the workflow function csvDecodeAsPrimaryKeys, which returns a list of integers in 9.0, is now modified to the 10.0 signature in which it returns a list of longs.
- Any such call also generates a warning at upgrade time so that somebody will be alerted to the need to check this.
- Add validation check for workflow functions to ensure consistency
- If you add a function workflow action to a workflow, then it makes sure that the number of arguments you pass in and their types are consistent with the function selected.
- However, it is possible for this to get out of sync. For example:
- an upgrade might change the definition of a function
- you might be calling a custom function whose definition you change
- In these cases, there was no message to warn that there was a problem.
- Now, when a workflow with such an invalid function action is displayed, a suitable error message is shown. It is shown again whenever you click on the function action in question.
- Display error msg if variable value appears to have an invalid path
- When entering a workflow, process step definition or linked bookings, there are places where you can enter a value that is variable by selecting a source and a path to the value from that source.
- When this happens, the path should lead to a property that is consistent with what we’re expecting it to lead to. In fact, the UI prevents the entry of something that is inconsistent.
- However, it is possible that something can change after entering a path that means it becomes invalid later. For example, a BiskitDef might change, or a database upgrade might change the return value or argument of a built-in function, or you might be calling a custom function that you change.
- In all these cases, we were already displaying a red border around the path to indicate an error, but not displaying a message explaining what was wrong.
- This now happens in all the above cases.
Bug Fixes
- BUGFIX: Workflow manager can throw exception displaying some workflows
- A BiskitUpdateWorkflowAction allows you to set the value of any property on any biskit.
- That means the individual elements (one per property you want to modify) on the update action have a property whose type is not known until its executed.
- With the right combination of items in a workflow, this means some of the information on a workflow can get lost when it’s displayed in the browser and generate an exception.
- An example of this is if you create a dynamic workflow page.
- To achieve this, a UserWorkflowEvent is run and generates some HTML for display, and can also register another UserWorkflowEvent that should be called when a form in the HTML is submitted.
- This means there’s a BiskitUpdateWorkflowAction that sets a particular UserWorkflowEvent as the value of the next event on the current UserWorkflowEvent’s response.
- If this secondary UserWorkflowEvent has some action defined on it, then the data on them was not being handled correctly, so that clicking on the event in the browser would generate an exception.
- BUGFIX: Radio Button display instead of drop-down ignored null-allowed
- When a biskit-valued property is marked as “null allowed” in the bakery, and there’s a layout that asks for such a property to be displayed using radio buttons (as one would for a questionnare), then the radio buttons would initially display with the first option preselected.
- But if they are “null allowed”, then there should be nothing preselected.
- BUGFIX: Database upgrade from 9.0 to 10.0 broke on menu conditions id path
- If there’s a menu with some search conditions that appear to reference a primary key, then the upgrade did not work correctly.
- BUGFIX: Exception when a repeat booking without a reminder is cancelled
- BUGFIX: When updating a repeat booking “This item”, booking rules were not checked
- This was a bug introduced in a fix for issue 2721
- Issue: 2628
- BUGFIX: Cancelling a repeat booking can give an exception
- Depending on how a repeat booking is defined we could have that the last instance may not coincide with the end of repeat as declared in the booking itself.
- E.g. Repeat every week on Monday until the end of month (which for example is a Friday).
- Cancelling such a booking gave an exception.
- Issue: 2901
Back to Top
10.0.30 April 25, 2021
This includes everything in version 9.0.84 and has no other changes.
Back to Top
10.0.31 May 6, 2021
Bug Fixes
- BUGFIX: Workflow Manager gives collection functions false-positive errors
- When a function is declared to take a list, and it’s given a set, or vice-versa, then 10.0.29 displayed an error message to detect this (as well as other problems).
- However, all built in workflow functions are defined so that when they take a set or list, they will cope with being given the other.
- Also, the workflow manager is designed to allow you to provide a set or list to a function argument that requires a set or list so that you don’t need to concern yourself with the distinction between a list and set.
- So the error message should not have been displayed in this case.
BUGFIX: MetaProperties.shardNumber not found when added to templated text
BUGFIX: Loading a workflow with relative time event can give exception
- BUGFIX: Create a copy of a linked booking link duplicates status rules
- Create a copy of an existing linked booking link, and the status rules are duplicated so they appear twice.
- Issue: 2917
- BUGFIX: Conditions like ‘project.id = 12345’ format number when read write
- A primary key fixed value rendered in a condition like ‘project.id = 12345’ should display the 12345 using a formatted primary key number for consistency with the rest of the system.
- It did display in the formatted manner when a condition was displayed read-write, but not when read only.
- Issue: 2905
- BUGFIX: Exception when non-interactive update caused to linked booking
- When a booking is modified, and it has a linked secondary booking or primary booking, then there was an exception in the server.
- This only happened when an update was not a direct result of a user action.
- For example, caused by a CTMS event going overdue or a workflow change.
- BUGFIX: Saving user settings gives exception if menus include report runner
- If the menu includes something that runs a report, then it can be that saving user settings gives an error.
- BUGFIX: A custom search page with free text search can fail to find things
- There’s a problem with the way referenced-by conditions are evaluated.
- It works properly when the conditions have been saved to the database (and so there’s no security implication with permissions failures).
- The search is confused when:
- you have more than one referenced-by conditions
- the conditions are not saved to the database
BUGFIX: Workflow Debugger ‘Go’ button can be hidden
Back to Top
10.0.32 May 24, 2021
Changes
- Improve handling of file download security when IP address change detected
- Suppose you define a file attachment property on a project, and somebody uploads a file and then takes a long time over filling in the details of the project form before saving it.
- Then normally, this would work okay. However, if the user is on a network that causes their apparent IP address to change regularly, then the project save could appear to be on a different IP address from the one used to upload the file.
- This is treated as a potential security issue, and so there was a limit of 5 minutes placed on the time between the file upload and the project save when the IP address changed.
- This was causing problems to real-world users, made worse by the error message they received misleading them into thinking that re-saving the problem might help, when what they needed to do was re-upload the file.
To reduce the impact of the problem on users, the 5 minute time limit has now changed to 10 minutes, and the message they receive has changed to make it clear what they need to do:
A file attachment appears to have been uploaded from a different
computer from the one that now wants to use it. I am refusing this
for security reasons. Please re-upload the file and try again.
Issue: 2909
- Change workflow manager’s “Validate Functions” to “Validate Workflows”
- This now does more general validation so that if any workflow ever shows a pop-up error as soon as you click on it, then that error will now be amongst those shown by clicking on “Validate Workflows”.
- This checks all workflows.
- Add validation of variable or value assignments to check consistency
- This checks to make sure that when a property is being assigned a value, it is of the correct type.
- For example:
- when a Biskit Create or Biskit Update action assigns a value to a property.
- when a Create Variables assigns a value to a new variable.
- The UI ensures this is set up correctly in the first instance.
- However, things might change either through the upgrade from 9.0 to 10.0 (which changes some ints to longs) or through somebody changing a BiskitDef or the type of a variable.
- Change description of workflow trigger to use workflow number, not ID
- The description is used in system events trigger stack traces and other places.
- It is better to use the workflow number rather than its ID.
Bug Fixes
- BUGFIX: Group reports with many columns (+)/(-) buttons overlap heading
- When there are many columns in a group report, then the width available for each column may result in the buttons in each column heading to add or remove columns overlapping with the label for the column heading.
- This has now changed so that they will never overlap.
- Issue: 2930
- BUGFIX: CustomTreePage did not sort dynamically generated child tree nodes
- For example, if you have a biskit A with a biskit-valued property B, and you set up a custom tree page to show instances of A grouped by B, then the list of B you would see would be presented in an unsorted order.
- Issue: 2931
- BUGFIX: Upgrade from 9.0 to 10.0 left workflow ‘Exception to email’ broken
- In 10.0, there is a new “System User” that exists as a sibling type to “Exprodo User”. This is to represent activity by one system when it makes a remote request to another.
- A consequence of this is that SystemEvent.user is no longer of type ExprodoUser, but the supertype “User”, which has no userIdentity property.
- This affects the standard (disabled) workflow called ‘Exception to email’.
- The workflow is normally disabled, so it wouldn’t normally matter.
- But this fix alters the workflow so that it now works properly again.
- BUGFIX: Exception on changes to an orphaned linked booking
- Suppose you do the following:
- set up a linked booking
- make it conditional upon some property on the parent
- create a parent booking so that a child booking is created
- modify the parent so that it is no longer eligible to have a child
- Then the child will be cancelled and disconnected from the parent.
- If you then modify the child (or a workflow modifies it), then this generated an exception.
Back to Top
10.0.33 May 31, 2021
This includes everything in version 9.0.85.
Changes
- Make DatabaseWorkflowEvent output UserMakingTheChange a CalpendoUser again
- Both DatabaseWorkflowEvent and ProcessWorkflowEvent used to have an output property that child actions could access called UserMakingTheChange that was a CalpendoUser in Calpendo, and an ExprodoUser in non-Calpendo systems.
- However, in versions of 10.0 up to 10.0.32, UserMakingTheChange was of type ExprodoUser even in a Calpendo system. This caused some workflows to break after after.
- This has now changed so that if your database marks ExprodoUser as abstract and it has only one subtype (which is normal in Calpendo 10.0) then DatabaseWorkflowEvent and ProcessWorkflowEvent both now set up UserMakingTheChange as a CalpendoUser again.
- Add function workflow action validation of argument indexes
- Arguments to a function workflow action record the index of their position within all the arguments.
- This is now validated to make sure the indexes are within range and all indexes have the right value.
Bug Fixes
Back to Top
10.0.34 June 7, 2021
Changes
- Remove unused exprodo_event_properties table if it exists
- A very small number of databases still have a table called exprodo_event_properties.
- This is very old and hasn’t been used since 2017, but can slow down the upgrade to 10.0 without any benefit from it.
- We now remove any copies of this table.
Bug Fixes
- BUGFIX: DB Upgrade to 10.0 fails if no user with login name ‘admin’ exists
Back to Top
10.0.35 June 18, 2021
This includes everything in version 9.0.86.
Changes
Bug Fixes
- BUGFIX: Upgrade to 10.0 can give false positive warnings for missing table
- If there’s a static BiskitDef (such as Calpendo.Booking) that is set in the database to indicate its table cannot be shared with subtypes, then any subtype that has a biskit-valued property will generate a warning because it can’t work out which table the subtype is stored in.
- This isn’t a problem normally because the system calculates at runtime whether a static BiskitDef shares its table with subtypes.
- However, the upgrade system uses what’s recorded in the database which is sometimes wrong for static BiskitDefs, and always ignored at runtime for static BiskitDefs.
- BUGFIX: validating biskitDefs before reload database can fail
- If you add a new property and update the schema, and without reloading the database you ask for validation, then you will get an error about the property you just added.
- We want to encourage validation before reloading the configuration, so this behaviour was very unhelpful.
- BUGFIX: Templates with conditions on biskit-valued properties give error [10.0]
- If you add a biskit-valued property to a user, and then reference it in an advanced condition on a template, then whenever a user that has no value for that property views the bookings calendar, they get an error.
- Issue: 2951
- BUGFIX: Workflow history gives exception when click on old entry
- We didn’t record the full history of a workflow in the past, so some recorded history doesn’t include everything it now does.
- When you view the history of a workflow and click on one of those older items, it gave an exception if it contained a CreateVariablesWorkflowAction.
- Ticket: 6026
Back to Top
10.0.36 June 21, 2021
Bug Fixes
- BUGFIX: Email address validation considered upper case letters illegal
Back to Top
10.0.37 June 25, 2021
Bug Fixes
- BUGFIX: Workflow validation fails if function action defines no function
- If you create a function workflow action, but do not select a function for it to call, then the workflow validation produces an exception and stops, rather than providing a good error about that particular workflow.
- BUGFIX: Put Booking dateRange after repeat in bakery and get boot errors
- If you change the definition of Booking in the bakery so that you put the property dateRange after the property repeat, then when you restart the server, the log file shows errors while validating DTO classes.
- BUGFIX: “toPDF” function prevents system boot if can’t find config file
- The workflow function “toPDF” that is used to convert XSL-FO formatted XML files to a PDF file now requires a configuration file to be available at boot time.
- If it can’t find it, then it prevents the system as a whole from booting rather than simply making the function not work.
Back to Top
10.0.38 June 28, 2021
Bug Fixes
- BUGFIX: Drag-and-drop can cause screen to go blank
- The first time you initiate a drag-and-drop action after logging in can cause the screen to go completely blank.
- There are some specific requirements for this problem to manifest.
- Unfortunately, the problem does not reliably manifest across systems, and you can’t even clone a database that demonstrates the problem and have the clone demonstrate the problem as well.
- What is required though is:
- Refresh the browser while logged out
- Log in
- Initiate a drag (for example on the booking calendar)
- Issue: 2948
- BUGFIX: Assigning fixed value to BiskitDef property fails validation
- If you have a biskit that has a property that contains a BiskitDef, and a workflow assigns a fixed value to that property, then the workflow validation claimed there was an error when there wasn’t.
Back to Top
10.0.39 July 9, 2021
This includes everything in 9.0.87 and no other changes.
Back to Top
10.0.40 August 3, 2021
Bug Fixes
- BUGFIX: XQuery example workflows do not load cleanly into non-Calpendo DB
- If you upgrade from 9.0 to 10.0 for any non-Calpendo system, then the example workflows for how to use XQuery include an error.
- They use a search of users as the basis for the examples, but the type they search for (CalpendoUser) does not exist in a non-Calpendo system.
- BUGFIX: Upgrading a database 9 to 10.0 with master-to-slave properties complains
- There are warnings generated when upgrading a database from 9.0 to 10.0 if there are any biskits set up with a master-to-slave relationship.
- The warnings in this case are false positives.
- It was complaining that the column for a biskit column referencing from a master biskit to a slave did not exist.
- However, a master and slave share the same primary key, and so there is no need for a column to reference the slave from the master.
- This change removes the warnings for master-to-slave.
Back to Top
10.0.41 August 25, 2021
This includes everything in 9.0.88 and 9.0.89 (all listed below).
Changes from 9.0.88 and 9.0.89
- Overhauled handling of incoming CAR (Calpendo Activity Recorder) data
- There were issues with the way incoming CAR data was handled.
- In particular, it was excessively slow. This could lead to a downward spiral in which CAR would send data, think Calpendo had not imported it when it had because it was slow, and next time would send the same data plus a little bit more making it slower.
- Reduced memory requirement when loading large files from CAR
- Calpendo would use a lot of memory when loading a file from CAR that contained many items (such as you would get when after a period of a network outage between Calpendo and CAR).
Changes
- Upgraded MariaDB database connector from version 2.3.0 to 2.7.4
Bug Fixes From 9.0.88
- BUGFIX: Server killed if rename biskit type with exists+path permission
- Suppose:
- you have a dynamic biskit type, let’s call it X.
- X has a property “search”, which has a property “owner” of type user
- you also have an exists permission on X, which applies to search.owner
- If you then go to the bakery and change the biskit type of X to something else and do the rest of the steps you’re supposed to (update the DB schema and reload the database config), then you will no longer be able to get to the login screen.
- Open a new browser, and it will fail.
- The original browser tab will still work, if it’s still open.
- Issue: 3011
Back to Top
10.0.42 September 16, 2021
This includes everything in 9.0.90 (all listed below).
Changes
- Convert default initial displayed page when it references an ID number
- You can configure Calpendo to have any page as its default to display when it starts.
- If that initial page contains an ID number, then it will need converting to the new format.
- We now look specifically for something of the form “&id=NNN&” where the NNN is a number. If we find that, then we replace NNN with the equivalent value assuming it’s an ID number.
Bug Fixes from 9.0.90
- BUGFIX: Emails sent unnecessarily when Calpendo receives CAR data
- Under normal CAR activity, Calpendo was logging informational messages as if they were errors.
- This in turn caused emails to be sent to Exprodo Software.
- These messages are no longer logged as errors.
- BUGFIX: Boot-time workflow validation creates error event when all is well
- At boot time, we do a validation of all workflows. A system event is then created to register whether there was a problem or not.
- However, the event is logged as an error regardless of whether a problem was found with the workflows.
- BUGFIX: Remove false-positive upgrade warnings if workflow assigns id to pk
- When upgrading from 9.0 to 10.0, one of the things that is checked for is whether there are any workflow actions with an item that does something with a property path that ends “.id” or equals “id”.
- If so, then a warning is issued that this might need checking since ids are not longs and not ints.
- However, these warnings are now not generated if the item also references a property name that include “pk” in it.
- Such properties are considered to be expected to store a primary key, and will therefore presumably have been dealt with.
- In particular, if there is a biskit create or biskit update action, and one of the items in the action assigns the value of an id to the “pk1” property of a Registers biskit, then this should not generate a warning.
- Registers.pk1 through pk9 are properties whose type is integer in 9.0 and updated to long in 10.0.
- The use of Registers is deprecated since there are now better ways of achieving their purpose. However, the pk1 through pk9 properties were introduced specifically to allow somebody to modify workflows referencing ids to make the upgrade smoother.
- So if the workflow references one of these pk* properties, then it is reasonable to assume no warning is required.
Back to Top