Release Notes For Version 8.2
Table Of Contents
- New Features
- Minor Changes
- Updates
- 8.2.1 March 7th, 2017
- 8.2.2 March 8th, 2017
- 8.2.3 March 9th, 2017
- 8.2.4 March 16th, 2017
- 8.2.5 March 16th, 2017
- 8.2.6 March 17th, 2017
- 8.2.7 March 28th, 2017
- 8.2.8 April 11th, 2017
- 8.2.9 April 13th, 2017
- 8.2.10 April 21st, 2017
- 8.2.11 April 28th, 2017
- 8.2.12 April 29th, 2017
- 8.2.13 May 4th, 2017
- 8.2.14 May 25th, 2017
- 8.2.15 May 29th, 2017
- 8.2.16 June 5th, 2017
- 8.2.17 June 14th, 2017
- 8.2.18 June 22nd, 2017
- 8.2.19 July 4th, 2017
- 8.2.20 July 6th, 2017
- 8.2.21 July 16th, 2017
- 8.2.22 July 18th, 2017
- 8.2.23 July 18th, 2017
- 8.2.24 July 19th, 2017
- 8.2.25 July 25th, 2017
- 8.2.26 July 26th, 2017
- 8.2.27 August 2nd, 2017
- 8.2.28 August 24th, 2017
- 8.2.29 September 7th, 2017
- 8.2.30 September 12th, 2017
- 8.2.31 October 2nd, 2017
- 8.2.32 October 20th, 2017
- 8.2.33 October 22nd, 2017
- 8.2.34 October 25th, 2017
- 8.2.35 October 30th, 2017
- 8.2.36 October 31st, 2017
- 8.2.37 October 31st, 2017
- 8.2.38 November 1st, 2017
- 8.2.39 November 7th, 2017
- 8.2.40 November 17th, 2017
- 8.2.41 November 20th, 2017
- 8.2.42 November 29th, 2017
- 8.2.43 December 7th, 2017
- 8.2.44 January 8th, 2018
- 8.2.45 January 10th, 2018
- 8.2.46 January 29th, 2018
- 8.2.47 February 5th, 2018
- 8.2.48 February 22nd, 2018
- 8.2.49 March 1st, 2018
- 8.2.50 March 6th, 2018
- 8.2.51 March 12th, 2018
- 8.2.52 April 4th, 2018
- 8.2.53 April 27th, 2018
- 8.2.54 May 25th, 2018
- 8.2.55 November 21st, 2018
- 8.2.56 November 23rd, 2018
- 8.2.57 December 7th, 2018
New Features
Version 8.2 provides a large number of improvements to workflows, in particular
with many new functions being added. It also includes support for business date
calculations so you can, for example, send an email 2 business days before
a booking.
We also introduce the concept of "Activities". This will be expanded in future
releases, and forms the basis of a means of defining a more intuitive manner
of interacting with the system, particular for a mobile app.
The details of these and other new features are explained below.
Back to Top
New Workflow Functions
There are lots of new workflow functions available in 8.2, as follows:
Add workflow function to convert a biskit via a docx or odt template to a
PDF
- Add Biskit identity function
- This is a function which is given a biskit and returns that biskit
unchanged.
- This can be useful for some workflows, particularly when providing a
fixed, rather than a variable, value.
Add ping to workflow network functions
Add business date and working hours functions
Add min and max workflow functions that take a list of numbers or dates
- Add workflow function to find templates that cover any part of a booking
- This is available in the "Calendar" section, and called
GetBookingTemplates.
Add workflow function find to load a biskit from the database given its
type and id.
- Add new workflow function contains that is given a collection and a
second argument, and it returns a boolean that indicates whether that
second argument is in the collection or not.
- There are multiple overloaded flavours of the "contains" function,
depending on whether it is given a collection of integers, longs,
doubles, dates or biskits.
Add workflow functions to calculate the min or max of a collection of
integers, longs, doubles or dates.
- Add logical operators that are given a list of booleans, and reduces them
to a single boolean by applying AND, OR, NAND and NOR operations to them.
- NAND can be thought of as being true when not all of the given
values are true.
- NOR can be thought of as being true when none of the given values are
true.
Add workflow functions to extract properties of a date or date/time, such as
the year, month, date, hour, minute or second
Add workflow functions to set properties of a date or date/time, such as
the year, month, date, hour, minute or second
- Add workflow functions relating to JSON-formatting
- String toJson(Biskit) -- converts Biskit to JSON
- Biskit fromJson(String) -- converts from JSON to a Biskit
- Biskit fromJson(String, BiskitDef) -- converts from JSON to a Biskit of
the given type
- String pretttyPrintJson(String) -- makes JSON more human readable
Add workflow function printBiskit to print the contents of a biskit to a string
Add a workflow function randomDistinct to make a string with distinct chars
Add random workflow function to calculate random value in given range
and output the value both as a double and as an integer so that it's easier
to generate random integers.
Add parseDate(...) workflow function to parse a string as a date/datetime
- Add getAsBiskit which gets the value of a property containing a biskit
- This is useful when you have a biskit of an unknown type, but you
know that a particular property contains a biskit value.
- For example, you have received some JSON from somewhere, and have
converted that to a biskit using the fromJson function.
- There are two versions of "getAsBiskit". One where you can specify the
type of biskit you're expecting, and the other where you don't specify.
- Add workflow function copy which copies the properties of one biskit to
another
- You can either copy to a biskit that already exists (by specifying that
biskit in an argument to the function) or else ask that a biskit be
created for you instead (by specifying the type of biskit to be created
in an argument to the function).
- If a particular property has a different type in the source and
destination, then we will try to convert between those types.
- There are also optional arguments to the copy function to specify a
format for date and date-time properties. Any date or date-time properties
needing to be parsed would then use the formats you specify.
- If the biskit being copied to has previously been saved to or loaded from
the database, then this function will update the database with the new
values.
- Add workflow function createNumericSequence which generates a list of numeric
values from a linear sequence which may optionally repeat.
- See the built-in help description for this function for more details.
Add workflow function randomListOrder which generates a new list from an
old list, and randomises the order of the items in the process.
- Add setProperty workflow functions
- You specify a biskit, a property name and a value to set. The function
will then set the named property on the biskit to the value you provide.
- There are multiple overloaded versions of setProperty, depending on the
type of value you are setting.
- Add workflow function mapBiskitProperties
- This function can be used when you have a biskit with property names
that you would like to change by adding or removing a particular
prefix or suffix.
- For example, if you collect data from people multiple times, and you
collect those data without any particular prefix or suffix to the
property names, but want to store this onto a biskit that has a prefix
indicating the timepoint. This might mean you have properties x, y
and z, but want to end up with properties time1_x", time1_y* and
time1_z". And then later you collect more data which should result in
time2_x", time2_y and *time2_z".
- Added support for reading cookies from an anonymous workflow HTTP event
- There's a new workflow function GetCookie to return the value of a
particular cookie.
- The output from the anonymous workflow HTTP event also includes all the
cookies provided with the request so that a workflow may use it.
Add workflow function getUserInfo to see if can log in or receive email
Add workflow function getBookableProjects to get a list of projects that a
user is allowed to associate with a booking for a particular resource.
Add workflow function getUsableBookings to get a list of bookings that are
candidates for being associated with a user's use of a resource. Typically
this would be associated with a ResourceUsage during a workflow that gets
actual usage information.
Add workflow function getCookie returns the value of a particular cookie
from an AnonymousHttpWorkflowEvent. Also, note that the output from an
AnonymousHttpWorkflowEvent now includes all cookies.
Add workflow function getUserInfo to see if can log in or receive email
Add workflow function getBookableProjects to get a list of projects that
a user is allowed to associate with a booking for a particular resource.
Add workflow function getUsableBookings to get a list of bookings that
are candidates for being associated with a user's use of a resource.
Typically this would be associated with a ResourceUsage during a
workflow that gets actual usage information.
- Add workflow function authenticate to allow a user to be authenticated
from within a workflow:
- For example, if you use a check-in/check-out style page on a browser to
control instrument access, and use a workflow to drive that page, then
you might have the user provide a username and password.
- The workflow would then want to check the user's name and password
Back to Top
Changed Workflow Functions
As well as the above new functions, there are also some changes to existing
workflow functions in version 8.2 as follows:
Back to Top
Other Workflow Changes
- TemplatedTextWorkflowAction no longer applies "nobody" permissions
- When sending out an email, we take the view that data should only be
insertable into that email if those data are world readable.
- We check this by looking to see whether the special user "nobody" can
view it.
- This sometimes causes unexpected problems because people expect something
to appear in an email, but instead of the real value, it shows as
"[hidden]".
- Previously, you would have to change permissions for the special user
nobody to work around this. It was a bit of a pain, but forcing people to
think about what happens with data they have previously controlled with
permissions is probably a good thing.
- TemplatedTextWorkflowAction actions were also subject to the same
restrictions.
- With this change, TemplatedTextWorkflowAction no longer checks to see
if "nobody" can view the data, but instead uses the roles and/or user
type specified on the action itself.
- This means you can easily ensure otherwise hidden data will appear in an
email by generating the body of the email with a
TemplatedTextWorkflowAction, and then using the result of that in the
email action.
- NetworkMessageWorkflowAction continues to apply the nobody check,
as does EmailWorkflowAction.
- Added the ability to limit the number of results found by a
SearchWorkflowAction
- This is for cases where the amount of data that would be found would be
too much, perhaps for memory consumption reasons.
- The default is to find all possible values, so existing workflows will
not change their behaviour.
New Workflow Features
8.2 sees the introduction of more improvements to workflows, as follows:
- Allow each workflow event and action to choose whether it or its
children save system events when they are run.
- Normally, you want want system event recorded so that whenever anything
goes wrong, you can look at the system events to see what happened.
- However, if you have events that are run many times, then you should
disable recording system events so that it does not generate enourmous
numbers of system events.
- For example, you can have TV screens displaying a calendar, and have the
screens auto-rotating between views of different resources. This is
handled by using workflows triggered by an anonymous http/https event,
which might be triggered by some third party software that makes the
appropriate calls to Calpendo. In this case, you might rotate the
screens every 30 or 60 seconds, and so generate large numbers of system
events.
- Add support for relative time workflow events to be offset by business days.
- When selecting the time units for the relative offset, you can now select
"Business days" as an option.
- Saturdays and Sundays are assumed to be non-business-days.
- You can also create instances of a new type of biskit called "HolidayDate"
to dictate which other days are treated as non-business-days.
- Add support for being able to provide a fixed value in a workflow where
the value is expected to be a biskit, but there is nothing that says which
type of biskit can be provided.
- Previously, you wouldn't have been able to select a fixed value in such
circumstances.
- Now, you choose the type of biskit you want, and then select the
particular biskit of that type.
- Add support for adding an attachment to an email without being forced to
add some text into the body or subject of the email.
- When setting up an email in the workflow manager, you can reference a
biskit attachment within the text, and the UI will insert the attachment
name into the text of the email body or subject. This will also cause the
attachment to be attached to the email as well.
- You can now modify the path inserted into the email so that instead of
selecting the attachment name, you select the attachment itself.
- For example, selecting an attachment when building the content of the
email will insert a path like "foo.attachment.name". You can now modify
the path to "foo.attachment", and the email still has the attachment
attached to it, but no text is added to the email's body or subject.
- Add support for adding an attachment generated by a workflow as an attachment
to an email
- You could already add an attachment that has previously been attached to
a biskit and saved as an email attachment just by referencing the
attachment in the subject or body of the email.
- This change now removes the need for the attachment to be saved in a
biskit property before being attached to an email.
- Add support for repeated text extraction in FindTextWorkflowAction
- This allows a regular expression to be matched multiple times.
- This should be a regular expression that captures one or more groups.
Then, the output from the action will be a list of biskits, each of
which has the items captured from a particular invocation of the
regular expression.
- For example, if you use the "Extract text from input repeatedly" option
with a regular expression of "^([^,]),(.)" and feed it with a CSV file
with two items on each line, then you will get back a list of biskits
with properties "group1" and "group2".
- Add support for workflows to be able to modify the result of booking rules
- A "Booking Rule Workflow Event" is fired once just before rules run
(with the rule set to null), and then again once after each individual
rule (with the rule set to the appropriate value).
- The output from the rules, that is the "message", "rejection level"
and "try booking request" properties, have now been moved. They are
no longer properties directly on "Booking Rule Workflow Event", but
available on a child biskit with the name "rules result".
- As a consequence, any workflows that used a
"Booking Rule Workflow Event" and used these properties will need to
be changed.
- Also, it now means the processing you do after being triggered from the
event can modify the result.
- This includes being able to modify the result of individual rules,
but also you can set a rules result in response to the initial call to
"Booking Rule Workflow Event".
- Consequently, you now have the option of creating booking rules using
workflows.
- Add new Reminder Workflow Event that is triggered whenever a reminder is
fired for a Calpendo Booking or an Exprodo SDM Event.
- You can use this to run other actions whenever a reminder is sent.
- You can also use it to customise the email that is sent as a part of
the remider.
Added new standard biskit called "Registers" that has multiple properties
of each atomic type. This cannot be saved to the database, and is intended
to be used in a workflow as a temporary storage for things that you calculate.
Use a Biskit Create action to create a Registers biskit, and the children
and descendants of that Biskit Create action can then reference the Registers
as a place to store and get values.
- Allow initial process step to be customised via process workflow event
- A Process Workflow Event will now be called with Button set to null
whenever a user first tries to view a stepped editor.
- A workflow can listen out for this and use it to customise the initial
step to be used.
- Process Workflow Event has a new check box to choose whether you want
to listen to "Initial Events", which is what will turn on listening
for these new events.
On copy/paste a workflow event or action into a workflow, it renumbers the
items within it to be self-consistent. Sometimes an event or action can
reference another event or action that are not part of the copied items, and
is out of scope for the resulting event or action. Whenever this happens,
you now get a pop-up message telling you exactly what has happened.
Add visual guides when your mouse hovers over a workflow's actions to help
see which actions are its children, parent and siblings.
Keep workflow tree items open when you add new actions or press edit/save
- Allow Biskit Create workflow actions to create a biskit of an unknown type
- You can now leave the type of biskit to create unset.
- This will then create a biskit of an unknown type. This means it will
not know anything about what sort of properties it has.
- Biskits of this nature:
- can be useful as a place to store information during a workflow.
- can never be saved to the database.
Improved vertical alignment of actions in the workflow manager
- Add support for running child actions even when the parent action fails
- An example of when this can be useful is if you try to parse a string as
a date. If a call to the function parseDate fails, then you know the
string is in the wrong format.
- That is something you might want to be able to detect and to take action
on.
- On each action, there is now an "On Error" choice, with options of
"Abort" or "Continue".
Back to Top
Activities
8.2 sees the introduction of "Activities". Initial support for this is very
limited, but more will be coming. You define the activities that users should
be able to perform. This will be the basis for a mobile app, and also for
providing a more intuitive/user-friendly interaction with the system.
There are currently no sub-types of Activity, but there will be many subtypes,
each of which indicates a different sort of activity that will be performed.
For the moment, every activity is treated as if it were a "biskit detail
activity".
- Add biskit detail activity
- Searches for biskits of the type given by the activity's target BiskitDef.
- Uses the conditions on the activity to filter the selected biskits.
- Allows the use of metaproperty conditions so that you can return only
biskits related to the currently logged-in user.
- If multiple biskits are found from the search, then display a list of them.
- If one biskit is found from the search, display its details.
- If no biskits are found, display a suitable message.
- When displaying the detail of a biskit, it will offer an edit button
that will edit the biskit via a stepped-editor if there is a process
defined for it.
- When displaying a list of biskits, it will simplify the display by:
- Not display hyperlinks for biskits
- Not display checkboxes in each row
- Allow a Biskit Tree Viewer page to have activities attached to each node
- If the type of biskit being displayed in a Biskit Tree Viewer has a
property that stores an activity, and that property is not null for a
particular node, then when viewing that node, the activity will be
displayed instead of whatever the Biskit Tree Viewer would normally
display.
Back to Top
Project Rendering
Calpendo Projects are now rendered using the Exprodo standard mechanism.
This means that you can control the way things are displayed by creating
your own tabs, and these can be nested inside other tabs if you require.
To do this, you would go to Admin-->Layout Editor and create a layout for
Project.
See the documentation for more details about
how to use the layout editor
It also means that the way projects are rendered will be slightly different,
depending on your configuration.
Files and Directories
Add support for storing files and directories in the database
- This currently includes a basic means of finding and creating files
on the menu as Admin-->File Manager
- This will be replaced by something more intuitive in a minor update
release of 8.2
- For now, this serves as a means of storing a docx or odt file that
is a template for PDF generation.
Global Preferences Changes
- Add support for specifying a port number for your email SMTP server
- Add global preference for the time to include in a vertical timeline calendar
view, and allow user personal settings to defer to the system default.
- Previously, there was a user personal setting, but no global setting.
- Add a new "Buttons" tab to the global preferences.
- This controls what buttons appear when viewing a single biskit or a
list of biskits.
- This initially only controls whether the relatively new "Send Email"
button is displayed, but other buttons are likely to appear here in
the future.
User Settings Changes
- Add a new "Buttons" tab to user settings to allow individual users to
override the system default buttons setting.
Extend memberOf and containsMember Condition Relations
- Add support for memberOf/containsMember relations for resource & project
- For a very long time, you've been able to create a condition to check
whether a user is a member of a particular user group, or whether a
user group contains a particular user.
- In Calpendo, you can now do the same with resources and projects.
- That means you can have a condition to check whether a resource is a
member of a particular resource group, or a project is a member of a
particular project group, and also whether a resource group contains a
particular resource, or a project group contains a particular project.
- Add new custom menu page called "Create Biskit" to let you have a menu item
that takes you to a page that creates a particular type of biskit.
- In the menu editor, select Custom Page and then Create Biskit Page,
and fill in all the details it asks for
API Changes
Layout Changes
- Add support for custom layouts that can place "tabs" in multiple columns
- You could already define layouts that put your properties into tabs,
and tabs can contain sub-tabs.
- Each tab chooses how it wants to lay out its properties.
- But now, when using either the Captions or the Flow method of
grouping tabs, you can now choose that child tabs display in columns.
- This means you can display tables of properties side-by-side, and this
produces the effect of separate areas of data that are all viewable
at the same time.
- Add "self" property to Root Biskit Layout.
- This makes it easier to write permissions that hide some particular
layout from some users, and so allows you to better control which
layouts somebody will see.
Import Changes
- Prevent import until after a preview has been done
- Previews are fast in the import page, and they are a good way to see
problems before attempting an import.
- We've had errors in an import that are much harder to deal with than
if a preview had been done, so we've now made the preview mandatory.
- Add tooltips to the import and preview buttons on the import page
Template Changes
When a user has no projects, then the background of the bookings calendar
will indicate that the user has no projects and therefore cannot book. This
applies for any resource that requires a project.
If a user has multiple projects, and a template would prevent the user
from booking one of those projects, but allow a different one, then the
templates are said to be indeterminate. This is because the templates
depend on the user's actual choice of project when making a booking. There
is now a new "Indeterminate" colour and tooltip text option available in the
global preferences, and users can override the colour in their settings.
Minor Changes
- Add support for automatically adding a newly created user role to the user
that created the role.
- This is required because otherwise, somebody who has permission to create
roles (by editing the Role MappedInt) cannot then give that role to
anybody. That's because a security restriction requires that you must
have a role yourself before you can give that role to anybody else.
- In order to prevent a security hole whereby somebody could remove a
role, and then add that same role back in and so gain a role they
otherwise could not get, there is a new restriction that has been added.
- You can no longer remove a role unless you have that role yourself.
When creating a copy of a Calpendo project, it no longer resets the project
type or name to that of the template project, but retains the values from
the project being copied.
A Biskit Tree Viewer page will now automatically open all items in the tree
when first viewed. This tends to make it better for use as a navigation
system.
- Process changes (aka Stepped Editor)
- There is no longer a requirement that a biskit have a currentStep
property to record what the current step is. Without such a property,
every time you start a stepped editor, it will start at the initial step
regardless of which step you had previously reached. If you do have a
currentStep property that stores a Step, then when you edit a biskit
in stepped-edit mode, it will always start off at the step you last
used. That is, the step referenced by the currentStep property.
- You can no longer assign a value to the currentStep property in a
workflow triggered by a Process Workflow Event and have it change the
step that will next be displayed. That's because currentStep is no longer
a requirement, and so it can not be used in this way.
- A Process Workflow Event now has a new property in its output, called
"Response". This lets a workflow set the next step, when you don't want
the default next step to be used, and also set a message to be displayed
to the user.
When a biskit selection has an empty set of possibilities, for example
selecting from user groups when no user groups have been created, then
it no longer shows a drop-down button, only the text box. This is to
prevent the drop-down which used to show but had no purpose in this
situation.
- Search randomisation changes (for Sort Workflow Action and Privileged Search
Def)
- When using a weighted randomisation, the weight can be found as a direct
path on the biskits being sorted, or it can be on an indirect path via
some other biskits. For example, suppose volunteers who participate in a
research study are represented by a biskit, and each time they are invited
to join a new study, there is an invitation biskit created.
- In this case, when searching for volunteers to join a new study, the
search randomisation should prefer to choose volunteers who were last
invited longer ago.
- So you specify:
- an indirect path to the weight, which means the weight is
not stored on the volunteer, but another biskit (in this case, the
invitations).
- A referee path of "Invitation.volunteer" indicates that the weight
for a particular volunteer is found from all invitations whose
"volunteer" property references that particular volunteer.
- In this indirect configuration, you can end up with multiple weights
if there are multiple invitations for the same volunteer.
- So version 8.2 adds options for whether to select the highest or lowest
weight from each of the weights found.
- Another change is that with direct and indirect paths, it's possible
that the weight found will be null. So there's also now an option to
choose a default weight whenever no valid weight can be found.
- Add support for retrying booking as tentative, not just retry as request
- This means booking rules now have an extra option to allow you to
indicate to the user when retrying as a tentative booking might be
helpful, not just retrying as a request.
- Add support for predefined slot bookings to use time outside slots
- When you define predefined time slots, you define times when bookings
should match exactly the time slots you created or (optionally) multiple
such time slots.
- However, sometimes you might not want to define time slots for the full
24 hour period.
- Previously, if there were periods without time slots, then the time slots
would would treat bookings outside time slots as somebody trying to do
something illegal.
- Consequently, any time outside time slots would become unusable.
- There's now a new option on a Predefined Slots Rule that lets you choose
whether time outside the defined time slots should be usable or not.
- Add seconds to time search options in system events page
- When there are lots of system events in a short period of time, such as
with workflows, then selecting the time of events to display with only
minute accuracy can sometimes yield too much output.
- This change now allows you to specify seconds on your search parameters.
- Set default end search time for system events to be end of today
- It was start of tomorrow, which is only one second different.
- However, you typically then want to set the end time earlier, and it's
easy to forget to set the date to today.
- So it just makes more sense to default it to the end of today instead of
the start of tomorrow.
- Reduce formula logging noise unless explicitly enabled
- If you have a large number of formulaic properties, then the log files
would be filled with lots of output at boot time and whenever you reload
the database configuration in the bakery.
- This was logging information showing how the formula had been parsed.
- We now disable this formulaic property logging output by default.
- Hide content of multi-line and HTML string properties in group reports
- If you have a report that shows a column containing a multi-line string
or an HTML string, it will now show a hyperlink labelled "Show content"
instead of the actual data.
- However your mouse over the hyperlink, and you will see a tooltip pop up
containing the actual content.
- Click on the hyperlink, and you get a drop-down showing the content in
a manner suitable for selecting and copying, should you want to.
- This has been done because multi-line strings are often very long, and
reports with many rows were sometimes taking a long time to render
because the browser was being asked to render an awful lot of data.
- This simplifies the browser's job, making the display of reports with
these properties much faster.
- This change has no impact on the data generated when you export the
report to a downloadable file.
- Allow max-date-range extracted from conditions to accept fuzzier values
When you search for bookings using the general Search->Search page and
not the Bookings Search page, then you can select the dates you want
bookings for in various ways.
For example, if you want bookings for all of 2017, you might choose
something like:
all of the following are true
dateRange.start later than January 2017
dateRange.finish earlier than December 2017
or
all of the following are true
dateRange.start later than January 2017
dateRange.start earlier than December 2017
or
all of the following are true
dateRange.finish later than January 2017
dateRange.finish earlier than December 2017
but those sort of conditions are not quite right because they don't
pick up bookings that start in 2016 and finish in 2017, or start in
2017 and finish in 2018.
The ideal conditions, that catches all bookings that are in any part
of 2017 are:
all of the following are true
dateRange.finish later than January 2017
dateRange.start earlier than December 2017
Now if you use one of the earlier type of conditions, then your
intentions are clear, although it doesn't quite pick up all the
bookings you probably want.
The problem is that we only expand repeat bookings if the search gives
a time period during which we should limit the repeat expansion.
Previously, we didn't accept the first three style of conditions above
as providing a time frame within which to expand repeat bookings, so a
search would generate only a single entry for repeat bookings, and not
show all the repeating instances.
The change we've made is to accept the slightly fuzzier search conditions
as providing a time frame for the expansion of repeats.
So if you now search using any of the above conditions in the
Search->Search page, then it will expand repeats using the dates from
the conditions.
This should match user expectations much more closely.
- Add "Full View" display option to waterfall notes (was excerpt & list)
- Calpendo supports adding notes to objects. For example, you can add
notes to a project, so that people can add a note at any time, and then
use that as a means of communication of annotating things in general.
- Previously, when viewing the notes, you had the option of seeing a list
with very little information per note or an excerpt view that showed
3-4 lines per item. To see the full text of a note, you had to click a
link to see it.
- There's now a "Full View" option that shows you all the notes with
all their detail.
- Add a new module called "Project Notes" to make it easier to add support
for notes to be added to projects.
- Once the module is loaded, just add or edit a layout for projects and
add enable dynamic notes in the layout.
- Add a "Fullscreen" button to view a biskit alone
- When viewing a list of biskits, you click on one of them and its details
are shown below.
- There's now a new button labelled "Fullscreen" that shows the
selected item without the list.
Add support for shift-click on a list of biskits to view the selected item
fullscreen rather than at the bottom of the list.
- Add CSS classes to the booking pop-up's "all day" selector so you can hide it
Back to Top
Updates
8.2.1 March 7th, 2017
Bug Fixes
- BUGFIX: DB upgrade for 8.2.0/21 gave error on non-Calpendo databases
- BUGFIX: DB downgrade for 8.2.0/19 had SQL syntax error
- BUGFIX: Anonymous http requests were unable to read the contents of a web form
Back to Top
8.2.2 March 8th, 2017
Bug Fixes
- BUGFIX: Advanced rules were run with "booking" set to null
- This fixes a recently-introduced bug in which creating a booking resulted
in that booking not being set when running an advanced rule.
- BUGFIX: Workflows sometimes get permissions wrong when updating data
- The permissions that apply when a workflow runs can be a bit tricky,
because they are sometimes run as a direct consequence of a real user
and sometimes they are not.
- This bug fixes the way this works in some cases.
- This problem only applied to changes made by workflows.
- BUGFIX: Workflows could fail when running two things at the same time
- We keep a record of the last time a workflow event or action ran.
- If two things happened at the same time so that the same event or action
was run concurrently, then they would both fail with an error.
- BUGFIX: Workflows sometimes mishandled references to booking subtypes
- If you have a hierarchy of booking subtypes, so that bookings for one
resource have different properties from bookings for other resources,
and you store a reference to a booking from another booking, then
workflows could mishandle the referenced booking.
- In situations where the system should know the referenced booking is of
a particular subtype, it actually would not. So when trying to use
properties on the booking that only belong to the subtype, it would fail.
- BUGFIX: Installation files for PC-based actual usage tracking named incorrectly
- A Newtonsoft JSON DLL file had to have a particular file name or it would
not work.
- We had renamed it to put the version number in the file name, but that
broke it.
- BUGFIX: Data loss if edit/save project without view users/resources/service
- If you edit a project and then save it without ever viewing the users,
resource settings or service settings tabs, then the data that was on
those tabs would be destroyed.
- This bug did not affect 8.1.x.
Back to Top
8.2.3 March 9th, 2017
Bug Fixes
- BUGFIX: Exception on saving global preferences (introduced in 8.2.2)
Back to Top
8.2.4 March 16th, 2017
Changes
Add a workflow function randomDistinct to make a string with distinct chars
- Add "random" workflow function to calculate random value in given range
- The existing workflow function called random always produces a value
between zero and one.
- The new function produces values in whatever range you want.
- It also outputs the value both as a double and as an integer so that
it's easier to generate random integers.
Extend getAsDate/getAsDateTime to convert from String & Long to Date
Add parseDate(...) workflow function to parse a string as a date/datetime
- Support any indexed type in first item in Search Workflow Action conditions
Previously, the search workflow action would only allow search conditions
where you are comparing the value of the biskit being searched for against
something. This now extends it so that you can also check the greater
environment values.
This means that you can use different search conditions depending on the
environment at the time the search is run.
For example, suppose you have parse some text which contains the string
"male" or "female" and this is in Source#2.string, and you want to look
for subjects that are of the appropriate sex.
Suppose further that you map the sex as a mapped int.
Then you can use conditions like this:
any of the following are true
all of the following are true
Source#2 string equals "male"
Value of sex equals Male
all of the following are true
Source#2 string equals "female"
Value of sex equals Female
Bug Fixes
- BUGFIX: Single quotes (') in names broke SQL export of biskit, BiskitDef and
permission
- BUGFIX: do-not-record-system-events still logged sys event on action start
- BUGFIX: NPE in JsonReaderOrgJson.parse(null)
- BUGFIX: function getAsString gave "null" instead of null for null values
- When a biskit's property is missing or contains a null value, the
getAsString workflow function returned the string "null".
- This is not what a caller would expect, since you couldn't check whether
a particular property was null by looking at the result.
- BUGFIX: Renumbering workflow triggers generated errors
- BUGFIX: Unsafe threaded use of SimpleDateFormat
- BUGFIX: Layout-rendered displays dropped data in hidden tabs
- BUGFIX: User identification workflow not run when remote name matched user
while user remote resource usage (when called from pgina)
Back to Top
8.2.5 March 16th, 2017
Bug Fixes
- BUGFIX: Projects->Create Project had save button greyed out
- BUGFIX: Copying a booking did not also copy the booking owner
Back to Top
8.2.6 March 17th, 2017
Bug Fixes
- BUGFIX: fromJson workflow function had a typo in its help text
Back to Top
8.2.7 March 28th, 2017
Changes
- Add support for self-signed email certificates via blind trust for server
- In global preferences, you can choose to use an encrypted connection to
an email server for sending emails.
- This did not work when the email server used a self-signed certificate.
- This change now adds an option to blindly trust an email server's
certificate.
- This is only applicable when using an encrypted connection to the email
server, and only needed when you don't have a certificate installed on
the email server that is trustable using the normal means.
- We recommend that you do not use this option unless you absolutely have to.
Bug Fixes
- BUGFIX: "random" workflow function had typo in its help text
- BUGFIX: some "shallow" exceptions when failing to handle well shallow
property values sent over the network.
Back to Top
8.2.8 April 11th, 2017
Changes
- Prevent accidental downgrade of the database by going back to an older
version.
- Small bugfix release upgrades will automatically be rolled back.
- Larger release upgrades will only be rolled back with manual intervention.
- If you are prevented from downgrading, the error message you receive will
tell you exactly what you need to know if you really want the downgrade.
- This measure is here to prevent accidental data destruction by
inadvertently running an older version of the software against a newer
database.
- Change on-the-fly layout construction to put hidden props into hidden tab
- Calpendo 8.2.x now uses customisable layouts for rendering projects.
- If you do not define a layout for how to display a layout, then we
automatically create one one-the-fly.
- This auto-created layout was supposed to replicate the display you would
have seen in 8.1, but it displayed all properties, including those that
had previously been invisible due to bakery settings.
- Those bakery settings to choose whether a property is visible in a
biskit's detail view are now respected when generating this layout
on-the-fly.
- Add support for EXISTS/EXECUTE permission for choosing layouts
- Permissions to choose who can see which layouts were not working because
the request for layouts ignored permissions. This was not entirely stupid
since a layout is useless if you hide some of its properties. However,
hiding existence does make sense because it means you can control who
gets to use which layout.
- But using only EXISTS permissions is not convenient. That's because you
may want to control which layout an admin uses but still allow admins
to see all layouts because they need to edit them.
- So we now require that you need EXISTS to see a layout (for example in
the layout editor), and in addition you now need EXECUTE permission to
use a layout.
- This update also creates a permission to allow everybody EXECUTE
permission on all layouts.
- Optimise the work done whenever data is sent to the browser to avoid
unnecessary work.
- We are careful to ensure that users do not receive data that the
permissions say they should not receive.
- However, sometimes we send data in a way that cuts out a lot of
information anyway, and so we were checking for permissions on things that
were irrelevant.
- This will make some operations faster and should have no adverse effects.
- Add workflow functions fromJson, copy, createNumericSequence and
randomListOrder
- fromJson has had a new version created that lets you specify
what type of biskit you want to create, as well as the original version
of the function that does not let you specify the type of biskit to
create.
- This is for those occasions where the JSON does not specify the type
of the underlying biskit, and you want to specify it yourself so that
the conversion will use knowledge of the target type you're creating
instead of just a generic conversion.
- getAsBiskit gets the value of a property containing a biskit
- This is useful when you have a biskit of an unknown type, but you
know that a particular property contains a biskit value.
- For example, you have received some JSON from somewhere, and have
converted that to a biskit using the fromJson function.
- There are two versions of "getAsBiskit". One where you can specify the
type of biskit you're expecting, and the other where you don't specify.
- copy copies the properties of one biskit to another
- If the biskit being changed has previously been saved to or loaded from
the database, then this function will update the database with the new
values.
- createNumericSequence generates a list of numeric values from a linear
sequence which may optionally repeat. See the built-in help description
for this function for more details.
- randomListOrder generates a new list from an old list, and randomises
the order of the items in the process.
Security Bug Fixes
- BUGFIX: Empty and null collections were seen as different
- Within workflows, it is possible to generate an update that does not
change a property that contains a collection of biskits, and for the
value of that property to be seen as null.
- The old value of that property would be seen as an empty set.
- For collections of values like this, null and the empty set are
semantically identical and should always be treated the same.
- However, they were seen as different and so the permissions system would
not behave in the manner expected or prescribed.
- It is likely that this only affects permissions for actions run in a
workflow, and that the preconditions necessary for this to occur are
rare and with limited impact.
Bug Fixes
Back to Top
8.2.9 April 13th, 2017
Bug Fixes
- BUGFIX: BiskitUpdate would not let you set a property value to null
- BUGFIX: Resource.self did not work when used in a search condition
Back to Top
8.2.10 April 21st, 2017
Bug Fixes
- BUGFIX: Bakery schema update failing on Resource.self property
Back to Top
8.2.11 April 28th, 2017
Security Bug Fixes
- SECURITY BUGFIX: normally hidden data could be read
This is a serious problem, the details of which will not be published
in these release notes so that system administrators can be notified
of the problem and given chance to fix it.
It involves a way for a user to be able to read data that they should
be denied access to.
Anybody may request further details. If you are requesting such details
a long time from when this was written, please quote this reference:
f5ca71cbb79aa3fdde84302f5d5cbe5c12d27830
- SECURITY BUGFIX: Possible to create pre-approved user without admin approval
- It was possible for a non-admin user to create another user that was
already approved and could allow somebody else to log in.
- This problem did not allow anybody to create a user with more roles that
the original user had.
- Exploiting this required modification of the client HTML.
- This change fixes the problem on the server and does not rely on the
client to be well behaved.
- SECURITY BUGFIX: LoginAttempt EXISTS permission allowed for all
- Non-admin users could see how many login attempts there had been in
total.
- They couldn't see any more than that, but they shouldn't really have been
able to do that much.
- The fix for this is to create an additional permission that denies EXISTS
rights on LoginAttempt instances for non-admin users.
Security Hardening
- Prevent non-admins from accessing system events
- This adds a new permission to deny EXISTS on system events to non-admins
- This is because there may be information stored in system events that
should not be generally accessible.
- Added entropy in temporary file random key to improve security on file
downloads
- When you export a report and download it, there's a random key assigned
that is used in the export.
- If an attacker were to guess (or bruteforce) the key, it would
potentially allow them to download a report somebody else had run and
exported for download.
- There were 6 numeric digits with 900,000 possible values for this key
(about 19 bits).
- The key has now been extended to 16 characters with 62 possible values
each, making 10^28 possible values and about 95 bits, making a brute
force attack much less likely to succeed.
Changes
Add workflow function AddBusinessDays to add a given number of
business days to a date or date-time.
Add date-time properties to the Registers biskit, which is useful only
for storing temporary values in a workflow
Add size workflow functions taking list of non-biskits (as well as biskits)
Add removeDuplicates functions taking lists of non-biskits (as well as biskits)
Add support for a For Each workflow action to loop through non-Biskit lists
Bug Fixes
BUGFIX: Selecting Bookmark page from menu gave exception
BUGFIX: Sort workflow action failed when given an empty collection to sort
BUGFIX: Conditions on custom biskit properties on Registers workflow biskit
failed
BUGFIX: The auto-created layout tab for hidden properties had no name
(this was only visible when you create a new layout in the layout editor)
BUGFIX: Auto-created layout for projects still showing hidden properties
BUGFIX: Sort workflow action was returning the order the wrong way round
BUGFIX: Conditions on unset workflow action properties fail
- BUGFIX: Sort workflow action displays no weight path the first time
- The first time you view a sort workflow action, the weight path showed no
path had been set.
- But click on the action again, or press Edit, and it showed correctly.
- BUGFIX: Exported permissions upgrade script mal-quoted database directive
- This applies to a hidden page that can generate SQL for copying
permissions from one system to another. This will eventually be part of
a means of exporting configuration plugins from one system that can
be imported into another.
- The generated upgrade script for permissions put single quotes around the
permission name in the permission directive part, which it should not.
- It meant that it was looking for a permission with a name that started
and ended with a single quote.
- BUGFIX: Exported permission downgrade script mishandled null subject prop
- The downgrade script generated by the same permissions exporter as the
above would match a pre-existing permission's subjectProperty with
"=null" if it was supposed to be null.
- This doesn't work for null values, and needed to be "is null" instead.
Back to Top
8.2.12 April 29th, 2017
Bug Fixes
- BUGFIX: TemporaryFile.randomKey did not set its string property type
Back to Top
8.2.13 May 4th, 2017
Changes
- Some files required for the system to work have been compressed. This saves
about 100MB disk space in an installed system.
- Optimisation: reuse database connection to fetch biskit layouts
Bug Fixes
- BUGFIX: Default layout execute permission not match server permission check
- The default permission created to allow everybody to use all layouts
gave away execute permission on all BiskitLayout biskits.
- However, we looked for execute permission for BiskitLayoutRoot instead.
- Consequently, layouts weren't always usable when they should be.
- This change switches to checking for permission for execute on
BiskitLayout instead, which matches the permissions actually created
by default in all systems.
- BUGFIX: Ask for layouts for biskit type did not include referenced types
- If you want to display a particular type of biskit, then it generates
a request for the layout(s) for it.
- This should automatically receive any layouts that relate to biskit
types referenced by that initial type, in particular for slave properties.
- However, that wasn't happening, so slaves were not being displayed
correctly.
Back to Top
8.2.14 May 25th, 2017
Non-Workflow Changes
- Add support for custom layouts that can place "tabs" in multiple columns
- You could already define layouts that put your properties into tabs,
and tabs can contain sub-tabs.
- Each tab chooses how it wants to lay out its properties.
- But now, when using either the Captions or the Flow method of
grouping tabs, you can now choose that child tabs display in columns.
- This means you can display tables of properties side-by-side, and this
produces the effect of separate areas of data that are all viewable
at the same time.
- Add support for the API to query data through collections
- What this means is that you can, in a single API call, ask for all the
users that own a project in a particular Project Group, or all the
users associated with projects in a particular Project Group.
- For example, to find all the users that belong to projects in project
group number 7:
webdav/q/Calpendo.CalpendoUser/self/MEMBER_OF/Calpendo.ProjectGroup-7.projects.users
- and to find all the owners of projects in project group 9:
webdav/q/Calpendo.CalpendoUser/self/MEMBER_OF/Calpendo.ProjectGroup-9.projects.owner
Importing data is now slightly faster than before
Workflow Changes
Add visual guides when your mouse hovers over a workflow's actions to help
see which actions are its children, parent and siblings.
Keep workflow tree items open when you add new actions or press edit/save
Extend getAsDate and getAsDateTime workflow functions to optionally support
specifying a format for the date
Allow functions getAsDouble/getAsLong/getAsInt/getAsBoolean to parse strings
- Allow Biskit copy function to interpret/parse values in source
- The copy function lets you copy values from one biskit to another.
- The copy function previously required that the biskit you are copying
to already existed. You can now optionally specify a type of biskit
instead, and a biskit of that type will be created for you and used as
the destination.
- This change now lets values be interpreted as they are copied from one
to the other. That is, if a particular property has a different type in
the source and destination, then we will try to convert between those
types.
- There are also optional arguments to the copy function to specify a
format for date and date-time properties. Any date or date-time properties
needing to be parsed would then use the formats you specify.
- Note that if you copy to a pre-existing biskit that has previously been
saved to the database, then the copy will also cause an update to be
sent to the database. If, on the other hand, you either copy to a
pre-existing biskit that has never been saved to the database, or you
don't copy to a pre-existing biskit, then the copy is not saved to the
database.
- Add setProperty workflow functions
- You specify a biskit, a property name and a value to set. The function
will then set the named property on the biskit to the value you provide.
- There are multiple overloaded versions of setProperty, depending on the
type of value you are setting.
- Rename workflow function setStringProperty to setProperty
- Any existing workflows using setStringProperty will automatically be
converted to using the replacement setProperty function.
- Allow Biskit Create workflow actions to create a biskit of an unknown type
- You can now leave the type of biskit to create unset.
- This will then create a biskit of an unknown type. This means it will
not know anything about what sort of properties it has.
- Biskits of this nature:
- can be useful as a place to store information during a workflow.
- can never be saved to the database.
- Add workflow function mapBiskitProperties
- This function can be used when you have a biskit with property names
that you would like to change by adding or removing a particular
prefix or suffix.
- For example, if you collect data from people multiple times, and you
collect those data without any particular prefix or suffix to the
property names, but want to store this onto a biskit that has a prefix
indicating the timepoint. This might mean you have properties x, y
and z, but want to end up with properties time1_x", time1_y* and
time1_z". And then later you collect more data which should result in
time2_x", time2_y and *time2_z".
Improved vertical alignment of actions in the workflow manager
- Optimisation: update the time when a workflow action last ran only at the
end of processing each event.
- If you have a workflow that causes the same actions to be run many times,
for example by doing a For Each action on a large list, then each
action run would be updated every time to indicate when it last ran.
- This has now been changed so that this information is only updated at
the end of processing the event.
- This means it will do less when running repetitive tasks and so will be
a little faster.
Optimisation: a List Extract workflow action now runs a little more
efficiently.
- Add support for running child actions even when the parent action fails
- An example of when this can be useful is if you try to parse a string as
a date. If a call to the function parseDate fails, then you know the
string is in the wrong format.
- That is something you might want to be able to detect and to take action
on.
- On each action, there is now an "On Error" choice, with options of
"Abort" or "Continue".
Bug Fixes
- BUGFIX: "get" workflow function produced null when value was not a biskit
- If the value you're extracting from the list is not a biskit
(which you'd expect if this is a list of integers, for example) then
instead of returning the relevant integer, it would return null.
- BUGFIX: Biskits displayed with custom layout can fail to save second time
- If a particular biskit has a custom layout, and it is configured to
generate a new version number each time it is saved, then this issue
applies.
- When such a biskit was re-displayed after saving it once, the new
version number did not get recorded correctly. So when you then
edit again, the server gets given the wrong version number.
- This causes the server to reject your change because it thinks you were
editing from an out-of-date version.
- BUGFIX: Upgrade 7.0 to 8.0 mishandled custom multi-column table layouts
- Where previously a multi-column-table layout had been configured to show
default row labels, after the upgrade to 8.0, it was showing no row
labels.
- This only affects 7.0 databases that use custom layouts, which was
probably only in Exprodo SDM and Exprodo DB systems, and not Calpendo.
BUGFIX: Typo in error message when trying to create resource usage in the future
- BUGFIX: Workflow could not create ResourceUsage (creator set to fake user)
- The creator on a ResourceUsage records who created that record.
- When run from a workflow, there may not be any user in the context.
- This wasn't handled correctly, so workflows would not be able to create
a ResourceUsage.
- This is now fixed, but adds a requirement for any workflow that creates
a ResourceUsage to set the creator property.
- Failing to do so will now generate an appropriate error message to tell
you what to do.
BUGFIX: Contacts app had repeated web.xml entry for servlet mapping
- BUGFIX: Pasting a workflow action would incorrectly modify the conditions
of children
- Where conditions reference the output values of a previous item in the
workflow, and that previous item is also a part of what has just been
pasted in, then it would produce an incorrect result.
- Each event and action is assigned an index, displayed as "Source #5"
for index 5 etc. When you paste in a copy of an action, the pasted
actions' are assigned new indexes. Conditions therefore had to be
modified so they referenced the new indexes, but this calculation was
done incorrectly so conditions could be referring to the wrong thing.
- BUGFIX: NPE running add workflow function when second argument is null
- This also applied to other functions taking two integers and returning an
integer.
- It worked okay when the first argument was null, but not the second.
- BUGFIX: Some drop-down boxes ignored the specified sorting order
- This applies when a drop-down box is built from a selection of biskits,
and only when there is a custom sorting order specified on those biskits.
- It does not apply to MappedInt or MappedString or other drop downs.
BUGFIX: layouts not always showing (we can falsely think fetched already)
- BUGFIX: Refresh page on a URL of #ba&type=Foo&action=Create failed
- There are circumstances in which creating a new biskit would display a
page with the above URL fragment.
- If you were then to refresh your browser, or press you browser's back
button to go back to such a page, it would fail.
- BUGFIX: URL shown when you order a service works badly when refreshed
- If you have Calpendo Services enabled, and order a service, and then
press the browser's refresh button, it would not be able to display the
page.
- Also, if you order a service and then go to another page and press the
browser's Back button, it would not be able to display it.
- BUGFIX: Custom Biskit Tree Editor page exception on click non-enumerable type
- This applies when:
- you add a custom page to the menu of type Biskit Tree Editor
- and one of the biskit types displayed is marked as non-enumerable in
the bakery
- If you then click on that biskit type in the tree, it shows a search page
on the right. This search page normally defaults to a "Single Item Report"
type, but that report type cannot be used for biskits that cannot be
enumerated (and therefore cannot be used to populate a drop down).
- However, there was a bug that meant it would give an error in these
circumstances.
- BUGFIX: parseDate workflow function failed when given a null value to parse
- Parsing a null value should cleanly parse to a null date instead of
causing an error.
- BUGFIX: Exception reports emailed back to Exprodo Software did not include
stack trace information
- These are reports sent to us to help us diagnose and fix problems without
always requiring detailed reports from customers.
- These can be disabled in global preferences, but we much prefer they be
left enabled because they greatly assist in making our software better.
- Stack trace information got lost because of the recent security fix that
changed permissions relating to what can be done with system event
information.
BUGFIX: All emails sent out were declaring an incorrect "localhost" name on
connection to the SMTP server.
Back to Top
8.2.15 May 29th, 2017
Changes
- Prevent import until after a preview has been done
- Previews are fast in the import page, and they are a good way to see
problems before attempting an import.
- We've had errors in an import that are much harder to deal with than
if a preview had been done, so we've now made the preview mandatory.
- Add tooltips to the import and preview buttons on the import page
- Extend "contains member" condition relations to collections of any biskit,
not just grouped biskits.
- You could add conditions like "foo contains member bar" where foo is a
UserGroup or (in Calpendo) a ProjectGroup or ResourceGroup. It would also
work where "foo" is a collection of users or (in Calpendo) projects or
resources.
- This change now means that you can use conditions of this form for
collections of any biskit.
- This is particularly useful for workflows where you can generate
collections of anything.
Bug Fixes
8.2.16 June 5th, 2017
Security Changes
- Hardened security slightly by marking session cookie as secure when you log
in over https
- This means that the session cookie will not be sent over an insecure
connection.
- Connections over http instead of https should not be used in production.
- All services hosted by us are https-only unless somebody has a good
reason for needing
http access.
- We recommend disabling http or (preferably) redirecting all http
requests to the equivalent https page.
- Plain http, rather than https, is useful when first installing Calpendo
since it provides a way of checking everything is working before applying
encryption.
- In order to support this usage, it means that any login over plain http
will result in a cookie that is not marked as secure.
Changes
Bug Fixes
- BUGFIX: MappedInt/String editor shows wrong value on double spaced label
- If you have a MappedInt or MappedString value whose label contains two
consecutive spaces, and you store that value into a biskit's property,
then editing that biskit would not recognise the value, resulting in
the first possible value being selected.
- BUGFIX: Login failed without catch-all EXISTS permission
- Removing the catch-all EXISTS permission is not a good idea. If you do
it though, you couldn't log in.
- This bug fix means that even if you remove this permission, you can
still log in and thereby fix the problem.
- BUGFIX: non-repeatable date range mangler used open search range not closed
- This breaks the principle of least surprise.
- When searching for (for example) system events, you expect that the range
you enter will be inclusive dates so that a search of 21:40:10 to
21:40:12 will look for a 3 second range and not a 1 second range.
- However, in this example it was searching for a 1 second range because
the search would exclude the start and finish range time.
BUGFIX: Exception converting a biskit to JSON when a mapped string property
on the biskit had a value that was not recognised by the mapped string
definition.
- BUGFIX: Column width in the bookings calendar could come out as negative
and so cause an exception.
- This can happen if the available width, split amongst a large number of
columns, calculates a small number (like 0 or 1) and then you take away
1 for left padding and 1 for right padding.
- This change now makes sure the column width is at least one, although
now you could be drawing the columns too wide.
- If this happens, it's too narrow to be useful anyway, so we're better
off without the exception.
BUGFIX: Multiple corner-cases went wrong when converting biskit to and from
a JSON format
Back to Top
8.2.17 June 14th, 2017
Bug fixes
- BUGFIX: PredefinedSlots rule failed in some cases. This corrects a bug
created in 8.2.16.
- BUGFIX: Bad FreeMarker types for numeric/dateRange biskit properties
- When converting a biskit to a freemarker model (for use in exporting
workflows or biskit definitions or for generating PDF files), it got
some properties wrong.
- All numeric types converted directly to strings, preventing the consumer
from being able to choose the format.
- DateRange properties were converted to strings instead of proper
start/finish dates.
Back to Top
8.2.18 June 22nd, 2017
Changes
- Hide content of multi-line and HTML string properties in group reports
- If you have a report that shows a column containing a multi-line string
or an HTML string, it will now show a hyperlink labelled "Show content"
instead of the actual data.
- However your mouse over the hyperlink, and you will see a tooltip pop up
containing the actual content.
- Click on the hyperlink, and you get a drop-down showing the content in
a manner suitable for selecting and copying, should you want to.
- This has been done because multi-line strings are often very long, and
reports with many rows were sometimes taking a long time to render
because the browser was being asked to render an awful lot of data.
- This simplifies the browser's job, making the display of reports with
these properties much faster.
- This change has no impact on the data generated when you export the
report to a downloadable file.
- Optimise fetch of some data from the server, aggregating multiple identical
requests.
- Make workflow manager faster in edit mode
- When clicking on some actions, it could generate requests to the server
for data that it should not ask for.
- Some workflow biskit definitions have been marked as not enumerable
and this avoids server requests to enumerate them.
- Add a "session" local variable that is available in all BeanShell reports
for accessing the database.
Bug fixes
- BUGFIX: Calpendo Resource's booking tooltip path marked automated
- This property is manually modified and not automated, but some databases
have it set as automated.
- This prevents somebody from manually modifying multiple tooltips
at once.
- BUGFIX: Custom report types complain if there are no columns defined
- This is an error because custom reports can display whatever content
they please, and do not (have to) use user-supplied columns.
- BUGFIX: When you've changed a report and ask to load a different report,
it would ask if you want to throw away the current changes, but it would
then effectively ignore your request by staying on that original report.
- Asking to load the different report a second time would then work.
- This has now been fixed so that your answer to the first question is
obeyed.
- BUGFIX: Custom report types would not save a user's choice of columns
- This often doesn't matter, because not many people have custom reports
and most of the customer reports that exist do not care about a choice
of columns.
- BUGFIX: Conversion of biskits to and from JSON had various issues
- This conversion can currently be used in workflows. For example, you
might do this to parse JSON data provided by a web form, or for sending
data from one Exprodo database to another.
- JSON-formatted data will be more important in version 8.3, where we use
JSON for the audit log and system events.
Back to Top
8.2.19 July 4th, 2017
Changes
- Optimisation: reduced overhead in running workflow actions
- Optimisation: reduced work done by some central code that fetches data
from biskits
- Optimisation: creating new biskits did more than necessary
- This is a small improvement, but it happens a lot when running workflows
and also at other times. So it can add up to a significant change.
- Optimisation: running a workflow function built unnecessary information
- The UI shows an HTML description of each function.
- When running a function, it generated that description when it didn't
need to.
- Optimisation: replacement of templated text (in an email or templated text
workflow action) ran pattern matching more than necessary
- Optimisation: use much less memory building workflow stack traces
Bug fixes
- BUGFIX: Converting a biskit to JSON sometimes mishandled null biskits
- BUGFIX: Search for biskits that have multiple set properties can gives bad
result
- If a particular biskit has one of the sets being empty and the other not
empty, then we could think the empty set actually had a single null value.
- BUGFIX: Database upgrade for 8.1.6 no longer worked
- This gave permission for all users to perform checked-edit operations
- BUGFIX: A map of all defined workflow functions was not cached properly
- Every time a workflow function ran, it caused a map of all defined
workflow functions to be generated.
- It was a trivial bug, but it meant workflow functions caused a lot of
memory and CPU time to be used unnecessarily.
- BUGFIX: Workflow output BiskitDefs contained unblessed values
- Internally, we work out what the output of each workflow action looks like
and generate a biskit definition for that output.
- This often includes parts that are regular biskit definitions stored in
the database.
- However, we were sometimes using versions of these Biskit definitions that
had links to the database, so that using them caused a database access.
- This bug fix now means that these biskit definitions are replaced with
versions that are fully-loaded from the database.
- This makes workflows run faster and using less memory.
- BUGFIX: AuditLog sometimes created without workflow references
- Whenever a biskit is updated by a workflow, the audit log record of that
change did not always record the workflow and action that made the change.
- BUGFIX: When viewing column definitions in the Report Manager, it always left
the "ignore nulls" checkbox always writeable even when it should not be.
- BUGFIX: Memory leak on reloading biskit definitions
- When reloading biskit definitions in the bakery, there would be a memory
leak that caused the old definitions of how to persist biskits into the
database to be stored in memory.
Back to Top
8.2.20 July 6th, 2017
Bug fixes
- BUGFIX: Some workflows were broken by one of the optimisations in 8.2.19
- This workflows where you have multiple workflow events triggered by the
same underlying system event, but for different biskit types.
- For example, if you defined one database workflow event for Booking, and
another database workflow event for a subtype of booking. In this case,
if the subtype of booking is created or modified, then both events would
trigger.
- The bug would show up depending on the order in which events happened to
fire, and also depending on whether the workflow accessed properties
on the booking subtype.
Back to Top
8.2.21 July 16th, 2017
Bug fixes
- BUGFIX: PropertyDef with defaultValue can cause UI to fail to start
- BUGFIX: Hiding resources could cause errors
- BUGFIX: PropertyDefSelector showed prop list & error msg when no source BD
- For example, go to permission page, click create and then it would tell
you there's no BiskitDef selected yet, but also show a drop-down for
choosing a property.
- The drop-down would be empty at this point, but should not be visible.
- BUGFIX: User "self" property not selectable in ExprodoUser permission paths
- BUGFIX: "None" was displayed as a selectable path in permission paths
- BUGFIX: Summary report sometimes failed due to needing much more memory than
it should
- BUGFIX: Exception in summary report when there is no data found
- BUGFIX: Rule Validator mishandled allDay/MultiDay bookings
- BUGFIX: background calendar templates calculated incorrectly
- If a user has multiple projects, and some of those projects match a
template group that means automatic denial, and some of them do not match
an automatic denial, then the end result was that we would get an automatic
denial.
- But this is wrong because the user could have chosen a project to which
the template did not apply, and then they would be allowed to make a
request.
Back to Top
8.2.22 July 18th, 2017
Bug fixes
- BUGFIX: Shallow exception on cancelling a booking with hidden project
- If a booking has a project that has been hidden through permissions, then
cancelling that booking would yield a shallow exception.
- BUGFIX: History of a booking on booking approvals page gave exception
- BUGFIX: Setting null value for PRS properties stopped logins from working
- In particullar, numberOfSessions, minutesPerSession and costPerSession
properties on ProjectResourceSettings all would cause the system to fail
to let you log in if any of the values were null.
- This wouldn't normally be possible, but workflows allow you to set these
properties to null, triggering the issue.
- BUGFIX: Bad value from UI Booleans rendered read only with custom true text
- When using custom text on a boolean property, and with permissions set
so that some people cannot modify the value of that property, then
editing a biskit like that would result in the value of the property
always being perceived as being false.
- This could then cause a "permission denied" error to be reported.
- BUGFIX: creating a copy of a workflow could sometimes fail
Back to Top
8.2.23 July 18th, 2017
Bug fixes
- BUGFIX: Templates logic for the calendar background was wrong for admins
- When you don't know which project somebody is trying to book for, you
have to look at each of the user's projects to see what the acceptability
might be. But there were two problems with how this was done:
- If the user is an admin or a member of the resource's manager user
group, then they could book for any project, and not just their
projects.
- If the template does not place any requirements on the project type
or project group, then it doesn't matter what projects the user has.
- BUGFIX: Exception applying an update query for a null-valued attachment
property
- For example, if you have a biskit in the database which has an attachment
property, but there is nothing attached, and then you edit the biskit
via a checked-editting change, then there would be an exception.
Back to Top
8.2.24 July 19th, 2017
Bug fixes
- BUGFIX: New user registration emails broken
- Emails sent to admins when a user registers with Calpendo contain a link
that is broken.
- The problem relates to a recent security fix, which hid all audit log
information from everybody. This fix to that earlier problem denied
EXISTS permission on all audit log data to non-admins.
- This meant that the id of audit log entries could not be placed into an
email, and so the link failed.
- This fix changes the permission so that instead of denying EXISTS, it
denies READ permission. That means non-admins can't see the content of
the audit log, but can see that there is something in the audit log.
- Any emails sent in response to a user registering in versions 8.2.11 to
8.2.23 would have a bad link in them.
Back to Top
8.2.25 July 25th, 2017
Changes
- Create system events showing the Timer Manager's cache of items it is
expecting to trigger over the next 24 hours.
- This includes things for a relative time workflow action, timed workflow
action, and delay workflow action.
- This change is to allow greater understanding of what will fire, when
and why.
- Create a system event when all processing of a workflow event completes
- This is here to make it easier to see when processing of an event has
finished, and easier to see how long it took.
- Delay validation of BiskitCreate action so changing name won't trigger msg
- You can specify the type of biskit to create in a Biskit Create Workflow
Action, which defaults to null.
- It is legal to create a biskit without specifying a type to create. If you
do this, then you get a biskit of no particular type. It can't be saved
to the database, but you can use it as a temporary store of data in a
workflow.
- You also specify on the BiskitCreate action whether the biskit it is
creating should be saved to the database. This defaults to true, because
this is what you will want most of the time.
- However, this means the defaults do not constitute a legal thing between
them because you can't save a biskit that has no particular type. When
information about the action is read from the user interface, it would
warn you about the inconsistency and modify the "save to database" flag
for you. This used to be triggered by simply changing the name of the
action, which was annoying.
- We no longer trigger the validation check on changing the name of any
event or action.
- We do still trigger it on pressing Save or when clicking on another
event or action. In that case, the error message it shows has now been
modified so that it tells you the type index of the action that has the
problem.
Bug fixes
- BUGFIX: Exception generating a drop-down selecting from multiple biskits when
one of them has a null name
- BUGFIX: predefined slots rule erroneously checked on next day if the booking
ends at midnight
Back to Top
8.2.26 July 26th, 2017
Bug fixes
- BUGFIX: RelativeTime events using business day would sometimes fail to run
- Business day calculations were wrong when starting the day before a
holiday or weekend and adding some business days.
- It had the effect of causing events to be missed.
Back to Top
8.2.27 August 2nd, 2017
Security bug fixes
- SECURITY BUGFIX: RUN_REPORT permissions were being ignored
- The permissions page lets you create and modify permissions that control
which reports somebody is allowed to run.
- These were all being ignored.
- This only applies to the ability to run a report, and not to whether you
can access the underlying data; any permissions controlling what data
could be viewed would still have applied.
- So this failure would not have meant people could access data that
otherwise wouldn't have been able to access, but it would have allowed
them to view it in a form we wouldn't otherwise have provided.
- SECURITY BUGFIX: Permissions optimisation could get wrong result
- We have an optimisation that avoids creating a new context object each
time we check permissions. Instead, we re-use a previously-created
context.
- This makes things faster, but is susceptible to errors because the
previous context wasn't cleared properly before being used again.
- It is unlikely, but may have been possible, that this could have resulted
in calculating the wrong permissions.
- This fix ensures the previous context is properly cleaned before
being used next time.
Changes
Bug fixes
Back to Top
8.2.28 August 24th, 2017
Security Related Changes
- TemplatedTextWorkflowAction no longer applies "nobody" permissions
- When sending out an email, we take the view that data should only be
insertable into that email if those data are world readable.
- We check this by looking to see whether the special user "nobody" can
view it.
- This sometimes causes unexpected problems because people expect something
to appear in an email, but instead of the real value, it shows as
"[hidden]".
- Previously, you would have to change permissions for the special user
nobody to work around this. It was a bit of a pain, but forcing people to
think about what happens with data they have previously controlled with
permissions is probably a good thing.
- TemplatedTextWorkflowAction actions were also subject to the same
restrictions.
- With this change, TemplatedTextWorkflowAction no longer checks to see
if "nobody" can view the data, but instead uses the roles and/or user
type specified on the action itself.
- This means you can easily ensure otherwise hidden data will appear in an
email by generating the body of the email with a
TemplatedTextWorkflowAction, and then using the result of that in the
email action.
- NetworkMessageWorkflowAction continues to apply the nobody check,
as does EmailWorkflowAction.
Changes
Bug fixes
- BUGFIX: Occasional IndexOutOfBoundsException with a TreeBox
- This happened very rarely, and is hard to make happen deliberately,
but was seen in production.
- On typing into a text box that generates a property selection drop-down,
it could occasionally give an exception.
- BUGFIX: Exception possible if create a repeat booking in the past
- BUGFIX: Workflow error restarting a server that's been down for long time
- If your server is down for about one month, and then start it up again,
you can have workflow timer jobs that should have been carried out over
that whole period.
- When sorting them, so we can run them in the right order, we get an
integer overflow error that prevents the system from booting if the jobs
to run are too far apart in time (about 25 days).
- The nature of this bug means it would not affect normal production systems
which are generally always running.
- BUGFIX: Exception validating PropertyDef with a null type (which should not
normally be possible)
- BUGFIX: BiskitTree can give an exception on updating a biskit
- BUGFIX: Exception possible when checking permissions
- An automated bug report produced evidence of this happening in production,
but we were not able to replicate it.
- This is not thought to be a security issue because when the error
happened, the current task would have been aborted by the exception.
- BUGFIX: Some Calpendos couldn't customise the date/time when creating/editing
bookings
- This was because some static properties were erroneously marked as
formulaic after saving a bikistDef in the bakery.
- This was caused by a bug in 8.2.27, and affected anybody that edited
Booking's BiskitDef in the bakery using 8.2.27.
- The fix for this bug includes resetting the biskit definitions as they
were (and as they should be).
- This would also have affected a few other types, all of which are
automatically fixed, if required, by this bug fix.
- BUGFIX: ExprodoUserSettings.biskitButtonBarButtons marked as indirect
- This property should have been marked as static.
- The error meant that changing its value would not have worked in Calpendo.
- BUGFIX: exporting anonymous http event workflows broken by Cookie support
- The recent support for detecting cookies in an anonymous http event
workflow broke the ability to export some workflows.
- BUGFIX: Workflow could not update ResourceUsage (modifier set to fake user)
- If a workflow triggered by an anonymous http event needs to update
a ResourceUsage, so that it can maintain a record of actual usage
(as opposed to bookings), then the update failed.
- The fix employed requires that the workflow mark the ResourceUsage with
the user that has caused it to be modified.
- This means this can only work if the workflow can determine which user is
doing this.
- This failure happened because Calpendo had no way to know who had modified
the resource usage record, but it attempts to record the modifier, and
fails without the right information.
- BUGFIX: biskit loaded via find(BiskitType,int) has inaccessible properties
- When calling function "find", giving it a BiskitDef and a primary key, the
function produces an output biskit which includes the found biskit as a
nested property.
- However, the properties on that biskit found were not always accessible.
- For example, run find(BiskitDef, int pk) to load a biskit, and then
insert some of its properties into a TemplatedTextWorkflowAction, and
you would see that only the id and biskitType pseudo properties would be
accessible.
Back to Top
8.2.29 September 7th, 2017
Changes
- Add workflow functions:
- getUserInfo to see if can log in or receive email
- getBookableProjects to get a list of projects that a user is allowed
to associate with a booking for a particular resource.
- getUsableBookings to get a list of bookings that are candidates for
being associated with a user's use of a resource. Typically this would
be associated with a ResourceUsage during a workflow that gets actual
usage information.
- Protect against users bookmarking bad URLs to a BiskitTreeEditor or
BiskitTreeViewer
We have some users who appear to have a bookmark that is of the form
https://server/#Facilities&id=1&type=Facilities*
where a "Facilities" page has been created in the menu editor to display
a BiskitTreeView page.
Notice there's a "Facilities*" passed as the type, which is not legal
This change protects against illegal characters in a BiskitTreeEditor
or BiskitTreeViewer type parameter, and gives the user a suitable error
message.
Bug Fixes
- BUGFIX: user settings table missing column for recently created databases
- 8.2.28 made ExprodoUserSettings.biskitButtonBarButtons static, as it
was always intended to be.
- However, databases created after the 8.2.0 release and before 8.2.28
did not create a column for the property.
- So databases upgraded to 8.2.28 that were first created in 8.2.0 to 8.2.27
had a missing column that did not let users log in.
- BUGFIX: Report-running permissions checks were too draconian
- We were checking that the report's owner has RUN_REPORT permission as
well as the user running the report. This is necessary for emailed reports
to avoid a situation where a report is run by somebody other than its
owner.
- However, if the report has never been persisted, then we should only
check the user running the report, and not the report owner (which will
be null if the report hasn't been persisted).
- Some databases have permissions that prevent a null user from running
a report (because you need a particular role). But this is wrong when the
user meets the requirements, and that user is running a dynamically created
report.
- BUGFIX: Copy/paste a biskit update workflow action duplicated update items
- If you had a BiskitUpdateWorkflowAction that set a single property, X, to
a value of Y, then on copy/paste, the newly pasted action would set
X to Y, and then again set X to Y.
BUGFIX: Export of Layout failed for PropertyLayout with null PropertyDef
BUGFIX: Exporting workflows failed on SortWorkflowAction
- BUGFIX: Virgin DB denied EXISTS for non-admin on AuditLog & fails NUR email
- New user request emails on recently created databases fail to generate a
valid link to the audit log because the audit log PK is hidden from
nobody.
BUGFIX: Multi-integer custom search page selection failed if no "to" value
- BUGFIX: An expired user is only sometimes told they are expired on login
- When trying to log in, a user whose status is Expired is not told they
are expired.
- Whereas, a user whose status is normal, but whose expiry date has passed,
is told their account has expired.
- While we don't generally tell people why a login is refused for
security reasons (to avoid helping them know whether they guessed a
username correctly), it seems reasonable that users should know their
account has expired.
- So we now tell expired users their account has expired when they try to
log in regardless of whether they are expired by virtue of their user
status or their expiry date having passed.
BUGFIX: Group reports (+) drop-down had sub-items inside "Count of" item
- BUGFIX: Bookings search uses includes bookings at the boundary of the time
search that you would expect not to be included
- If you search for bookings from 8am to 6pm on a particular day, it was
including bookings that ended at exactly 8am or started at exactly 6pm.
- This has been changed so it only includes bookings where there's some
cross over between the time you're searching for and the booking period.
Back to Top
8.2.30 September 12th, 2017
Bug Fixes
- BUGFIX: Emails not being sent out
- This was a bug introduced in 8.2.29
- BUGFIX: Exception preventing event logging when new user created
- When the permission cache is reloaded, there's an event to say so.
- One of the things that triggers the permissions cache being rebuilt is a
new user being created.
- However, in this case, there's an exception because the event tries to
reference the new user as the one that caused the event, but this happens
before the new user has been saved, meaning it can't yet be referenced
from an event.
Back to Top
8.2.31 October 2nd, 2017
Changes
- Allow max-date-range extracted from conditions to accept fuzzier values
When you search for bookings using the general Search->Search page and
not the Bookings Search page, then you can select the dates you want
bookings for in various ways.
For example, if you want bookings for all of 2017, you might choose
something like:
all of the following are true
dateRange.start later than January 2017
dateRange.finish earlier than December 2017
or
all of the following are true
dateRange.start later than January 2017
dateRange.start earlier than December 2017
or
all of the following are true
dateRange.finish later than January 2017
dateRange.finish earlier than December 2017
but those sort of conditions are not quite right because they don't
pick up bookings that start in 2016 and finish in 2017, or start in
2017 and finish in 2018.
The ideal conditions, that catches all bookings that are in any part
of 2017 are:
all of the following are true
dateRange.finish later than January 2017
dateRange.start earlier than December 2017
Now if you use one of the earlier type of conditions, then your
intentions are clear, although it doesn't quite pick up all the
bookings you probably want.
The problem is that we only expand repeat bookings if the search gives
a time period during which we should limit the repeat expansion.
Previously, we didn't accept the first three style of conditions above
as providing a time frame within which to expand repeat bookings, so a
search would generate only a single entry for repeat bookings, and not
show all the repeating instances.
The change we've made is to accept the slightly fuzzier search conditions
as providing a time frame for the expansion of repeats.
So if you now search using any of the above conditions in the
Search->Search page, then it will expand repeats using the dates from
the conditions.
This should match user expectations much more closely.
Bug Fixes
- BUGFIX: Drop-downs appear in wrong place when page scrolled in Chrome 61
- This is due to a change in Chrome 61 that removes a bug in Chrome, but
a third party library we use has a work-around for the bug.
- So when the bug was fixed, we started displaying things in the wrong place.
- This happens only when the page has been scrolled away from the top or left
and you click on something that shows a pop-up.
- The pop-up does appear, but its position is offset from the position it
ought to have by the amount the page has been scrolled.
- BUGFIX: history button on project and user approvals pages produced error
- BUGFIX: Search Workflow Action displays wrong limit on first render
- A search that is limited to a particular number of results should show
a text label of "Limit" and the number it is limited to.
- But when first rendered (read only) it displays "No limit" and the number.
- BUGFIX: Rendering a bookmark sometimes gives an exception
- BUGFIX: calculateWorkingHoursFunction produced wrong value on some bookings
- This was wrong on bookings that were single day and completely out-of-hours
Back to Top
8.2.32 October 20th, 2017
Changes
- Add "Full View" display option to waterfall notes (was excerpt & list)
- Calpendo supports adding notes to objects. For example, you can add
notes to a project, so that people can add a note at any time, and then
use that as a means of communication of annotating things in general.
- Previously, when viewing the notes, you had the option of seeing a list
with very little information per note or an excerpt view that showed
3-4 lines per item. To see the full text of a note, you had to click a
link to see it.
- There's now a "Full View" option that shows you all the notes with
all their detail.
- Add a new module called "Project Notes" to make it easier to add support
for notes to be added to projects.
- Once the module is loaded, just add or edit a layout for projects and
add enable dynamic notes in the layout.
Bug Fixes
Back to Top
8.2.33 October 22nd, 2017
Bug Fixes
Back to Top
8.2.34 October 25th, 2017
Changes
Bug Fixes
- BUGFIX: Downgrading from 8.2.32 to 8.2.31 or earlier failed
- BUGFIX: Email action doesn't let you choose parent of one-to-many child
- Suppose you have a set of attachments defined on a project. This means
you have a one-to-many property on the project, and there's a child
biskit which will have a reference back to the parent.
- If you have a workflow database event that is triggered by a change to the
child, you might want an email action to put some of the data from the
child into the email.
- However, when choosing the properties to put into the email, there is no
option to choose the project from the child.
- This would apply to accessing the parent of any one-to-many child.
Back to Top
8.2.35 October 30th, 2017
Changes
- Show template message in booking calendar background for user with no projects
- If a user has no projects, then they cannot make a booking for a resource
that requires a project.
- Consequently, the background colouring of the bookings calendar now
shows a message indicating that they can't book, and sets a colour
accordingly.
- Display booking calendar background differently if indeterminate templates
- If a user has multiple projects, then it's quite possible that booking
for one project would be approved, while booking for another project
would be denied, depending on how the templates have been defined.
- In case like this, it is indeterminate whether a booking would be
approved or denied until a particular project is chosen.
- To account for this, the background of the bookings calendar now
displays a different colour to indicate this "indeterminate" status.
- There's a global preferences setting to choose the colour that should
be displayed, and the message that should be used for a tooltip (and
whether to display such a tooltip).
- There's also a user preferences setting that can override the colour if
required.
- Add info to system event about changes made by BiskitCreate/Update actions
- This is so that when looking at system events to see what happened, and
you look at an entry for an action that created or updated something,
you can see the actual changes that were made.
Bug Fixes
Back to Top
8.2.36 October 31st, 2017
Changes
- Add support for a global preferences setting for half-hour height
- For a very long time now, users have been able to choose the vertical
resolution of the display on their bookings calendar.
- However, when an admin chooses the start and end hours of the day to be
displayed on everybody's calendar, it makes sense that there's also a
global preferences setting for the vertical resolution too.
- So this has been added and is in the Bookings tab on global preferences,
and all user settings can now choose to select a custom value or to
defer to the global setting.
- All current users that happen to have the value of 30, which is the
default number of pixels to display per half hour, will automatically
be set to defer to the global preferences setting.
- Order alphabetically the non-standard properties on a system event's detail
- When displaying the details of a system event, you get to see some
standard properties that exist on every system event, and some
non-standard ones that are particular to each event.
- They were all displayed in a random order, but have now been changed
so that the standard ones all come first in a fixed order, and then all
the non-standard properties are displayed in alphabetical order by the
property name.
- Add global preferences item for booking background when user has no suitable
projects
- By default, we now display in the background of the bookings calendar
an indication when the user has no suitable projects so that it displays
with the same colour as a template automatic denial.
- This release adds a global preferences setting so that you can choose
whether you want these displayed on the calendar, or whether you want it
to be displayed with a lower priority than "automatic denial".
- The idea is that, for those places that don't let users make bookings
themselves, and only use templates to display messages about odd things
like maintenance periods or people being away, they don't care about
whether the end user has a project.
Bug Fixes
- BUGFIX: Exception setting dateRange properties inside BiskitCreate/Update
Back to Top
8.2.37 October 31st, 2017
Changes
- Add support for choosing how to deal with indeterminate templates
- A new global preferences option has been added, on the Bookings tab.
- This provides a choice about how to handle indeterminate templates
when displaying the background of the bookings calendar.
The options are to show them as indeterminate or to show the least
restrictive option.
- A summary of how templates work:
- When applying a single template to a single booking, it's the most
lenient of the applicable options that will apply.
- When multiple templates apply to a single booking, it the most
restrictive of those templates that applies.
- When a user has multiple projects that could be used to make a
booking, and those projects would yield a different template result,
you now have the option of displaying an indication of it being
indeterminate (until the project is chosen) or of displaying the
least restrictive of those that apply.
- The global preferences option to take the most lenient of the applicable
templates replicates the original behaviour of displaying templates in
the background of the bookings calendar, but without the bugs that it
used to have.
Bug Fixes
- BUGFIX: Indeterminate colour wasn't being saved from global preferences
Back to Top
8.2.38 November 1st, 2017
Changes
- Replaced the "Printable View" button seen on some biskit lists with
"Fullscreen", and changed its behaviour to that expected for Fullscreen.
- You could see this on the following pages:
- #allProjects (This is no longer the default page for generating a
list of projects.)
- Report Manager page when clicking on "System Reports" or
"Personal Reports"
- Added an empty "Action" tab to a Simple workflow action in the workflows
manager.
- Without this empty tab, the currently displayed tab can change when you
click from one action to another, which is very annoying.
- For example:
- you select the "Action" tab for a particular action.
- If you click on another action that has an "Action" or
"Event" tab, then that tab remains selected.
- If you click on a Simple action, which had no such tab, then the
"Conditions" tab would become selected.
- On then clicking an action that did have an "Action" or "Event"
tab, the "Conditions" tab would remain selected.
- This provided a more clunky experience than desirable.
Bug Fixes
- BUGFIX: Shift-click a user in a user list showed no projects
- Shift-click displayed the selected item, but only the data that had been
fetched for displaying the list.
- It needed another server round-trip to fetch additional information.
Back to Top
8.2.39 November 7th, 2017
Changes
- Reverse order of workflow stack traces (most recent now first)
- This makes a bit more sense when looking over the results of running
a workflow in the system events.
- In particular, if an action is deeply nested and so the stack trace
is very long, then the most recent stack element was displayed at the
end of the stack trace, which would require that you scroll the stack
to be able to see it.
- Reversing the order in which the stack trace is displayed removed this
annoyance.
- Make workflow function "copy" use case insensitive search for PropertyDefs
- When copying properties from biskit A to biskit B, you can specify a way
to transform the property names on A before writing to B. When you decide
to write a property X to B, it first checks if there is a property
called X and finds its PropertyDef so it can tailor the way the property
is copied according to the destination type.
- If it doesn't find a property with the exact name X, it now looks to see
if there's one whose name matches with a case insensitive comparison.
If there is, then it writes to that property instead.
- Generate warnings if you have any workflows that call functions identity,
find, copy or getAsBiskit.
- The bug fix below that references workflow functions has caused some
semantic changes to how these functions are handled.
- Whether this matters or not depends on the details of the arguments
you are passing to these functions.
- In particular, it only matters if:
- You pass a BiskitDef as an argument to identity
- You pass a variable BiskitDef argument to find, copy or
getAsBiskit
- However, the warnings will be generated on any call to any of these
functions.
Bug Fixes
Back to Top
8.2.40 November 17th, 2017
Changes
- Require string properties have content when PropertyDef marked required
- We enforce non-null constraints when a property is marked required.
- But string editors don't generally support setting a null value.
- So the equivalent for a string property is to require that they enter
something, which how it now works.
- Add support for forcing a booking to have reminders on it. To make this work,
you would need to:
Once you do that, the booking reminder check boxes will all be displayed
read-only and with the right values when somebody makes a booking or
edits an existing booking.
Note that you can make the permissions apply only to some of the people
so that you can have some people forced to use the default values and
other people free to do as they please.
Add pop-up help when you hover over a custom HTML layout panel in the
layout editor.
- Return only first booking for workflow function getUsableBookingsFunction
- When a user selects a booking to associate with a ResourceUsage, they
can select a repeat booking. That is, a repeat that is still a repeat
because either it is in the future, or it hasn't yet been converted to
a non-repeat and repeat instance.
- If they choose such a booking, then we only ever want them to select the
first instance of the repeat, because anything else doesn't make sense.
- So this commit modifies things so that they are only offered the first
repeating instance.
Bug Fixes
- BUGFIX: Resource usage checks not using given session breaks repeats
- When selecting a future repeat booking as the one to use for a new
instance of a resource usage from an anonymous http event, you can get
an exception deep in hibernate.
- When picking a repeat booking that's in the future, we convert that repeat
to a non-repeating instance plus a repeat. (ie it's done a little earlier
than it might otherwise be done).
- But this conversion was done on its own session, and so didn't see the
changes already made on the workflow's transaction.
- BUGFIX: Booking rules don't see uncommitted workflow changes to bookings
- If a workflow modifies multiple bookings, then the rules will be run
after each update.
- However, when each booking is updated, the rules will see the latest
version of that booking, but the original version of all other
bookings.
- This means the rules will not always make the right decision because they
aren't seeing all the data they should.
- BUGFIX: Global Preferences' "Version" tab table not coloured like others
- The rows in the table were not coloured yellow/green like most tables are.
- BUGFIX: Save button disabled on create if can't save with default values
- This applies to most places where there's a save button.
- BUGFIX: Renumbering a workflow's triggers did not renumber the selected item
- The currently selected event or action would not be renumbered when you
asked a workflow to renumber everything.
- This would lead to the workflow being in a poor state if the currently
selected item was affected by the renumbering.
- BUGFIX: Paste workflow action with condition references out of scope is silent
- When you do a copy and paste to a workflow, and one of the pasted items
has conditions that reference something that is now out of scope in the
pasted context, it used to not give any warnings.
- It now shows what is making the bad reference, and what to.
- BUGFIX: renumbering workflows caused exceptions due to incorrect parentage
- After renumbering a workflow, the record of what was the parent of each
action could become corrupted as it got confused between the new and
old numbers assigned.
- You could demonstrate this by clicking on various actions after a
renumber.
- This fixes issue #2062
Back to Top
8.2.41 November 20th, 2017
Changes
- Make ExprodoLicence.departmentName and companyName not required
- These have historically been marked as required, but that wasn't enforced
because they are string properties.
- Version 8.2.39 enforces that string properties marked as required should
be not null and not be the empty string.
- By changing departmentName and companyName to be marked as not required,
this effectively puts things back as they were for the licence.
Bug Fixes
- BUGFIX: Empty email addresses were not accepted even if not marked required
- This follows a change in 8.2.39 which enforces that string properties
marked as required should be not null and not be the empty string.
- BUGFIX: FreeMarker reports fail if a biskit-valued property has a default value
- If you set a biskit-valued property on some biskit of type X to have a
default value, and then run a report built by FreeMarker that uses values
of X, then there's an exception while building the model that is fed to
FreeMarker.
Back to Top
8.2.42 November 29th, 2017
Security Hardening
- Disable login auto-complete by default for new systems
- There's a global preferences setting to choose whether the login page
has auto-complete turned on, and this has existed for a long time.
- Newly created systems allowed browsers to auto-complete a user's login
detail.
- This has now changed so that systems created from now onwards will
disable a browser's auto-complete functionality in the login page.
- This does not affect existing systems.
- Hide last login information
- The last login time and IP address is recorded for each user.
- This information could be sensitive, and so this is now hidden from
everybody apart from admins and the user concerned.
- Hide temporary file information
- When you upload a file, for example to attach it to something, there is
a temporary file that is stored and an entry for it in the database.
- This temporary file information is now hidden from everybody apart from
the user that uploaded it.
- This makes it harder for somebody to download such temporary files.
- It was already unlikely somebody could look at such files, but this
change makes it harder.
Changes
- Avoid closing Booking Popup when user cancels "retry as request or tentative"
question
- When a rule has rejected a booking and suggested it be retried as either
a request or tentative booking, the user is asked whether they want
to do the retry.
- When asked the question, the user has the option of retrying the booking
or "Cancel".
- The cancel button should just abort sending the booking to the server,
but it was also hiding the booking popup.
- This change now leaves the booking popup on screen so the user can
possibly make changes to it before submitting again.
Bug Fixes
Back to Top
8.2.43 December 7th, 2017
Changes
Bug Fixes
- BUGFIX: Occasional deadlock on completing a workflow run concurrently
- This happens when the same workflow multiple times at the same time,
through independent invocations. In other words, when not trigged by the
same originating server event.
- At the end of running a workflow, we mark each of the events and actions
with a timestamp when they last ran. If we run the same workflow at
concurrently, then we have have two competing attempts to write the
same data out.
- The problem with this is that the data in the workflow would not get
flushed to the database as things were. So this change now updates
the timestamp on the events and actions separately from running the
workflow so the two are guaranteed to be independent.
BUGFIX: Potential memory leak with message bus threads not cleaned up at exit
BUGFIX: Exception on booking update when can't find the original booking
- BUGFIX: Cleaned up the language in user tracker resource usage README files
- These are README files delivered in the downloadable installation file
for installing PC-based actual usage tracking scripts.
- BUGFIX: pGina plugin for gathering actual usage could not talk to TLS
1.2-only server
- Our servers are being updated to drop older and insecure protocols, like
TLS 1.1, but the pGina plugin wasn't configured to be able to talk TLS 1.2
- This change adds TLS 1.2 support to the plugin, and also mandates it.
- BUGFIX: Fixed width on new user request page looks poor with wide content
- The new user request page fixed the content of the main detail to 400
pixels.
- If you have custom drop-downs that are wider than that, then it
looks poor because inner content is wider than the outer box.
BUGFIX: "find" workflow functions couldn't find biskits created in workflow
Back to Top
8.2.44 January 8th, 2018
Changes
- Rendering some actions in writeable mode in workflow manager made much faster
- Whenever there's a drop-down with a list of biskits in it, it now
downloads from the server only as much information as required to
populate the drop-down.
- It used to download much more information, which could make it slow.
- Make property selection use names instead of labels when ambiguous
- This applies when using a BiskitCreateWorkflowAction or
BiskitUpdateWorkflowAction and you specify the value for some properties.
- The property selector used to show the properties by their label,
which didn't work well when multiple properties shared the same label.
- When there's a conflict like that, it now shows properties by name
instead.
- Labels are generally nicer, so this change sticks with the use of labels
unless the labels are ambiguous.
Set the default Anonymous HTTP event response code to 501 (Not implemented)
instead of 500 (Internal server error) so that the message somebody gets
better reflects reality when a workflow doesn't respond to a particular
anonymous http request.
Add "getAsBiskitList" workflow function
- Set default DateRange duration to one hour
- When create a Booking from the search page, it sets the finish date to
December 2999 by default.
- This is now changed to be one hour into the future instead.
- Support format, null values & onchange on templated text biskit list html
drop-downs
This adds support for specifying a custom format for the biskits
displayed in a drop-down generated by TemplatedTextWorkflowAction using
a [listSelect ...] and also adds support for specifying a null value label.
A null value label means the drop-down will include an option that
represents null, or no biskit selected.
The format specifier allows you to choose how each biskit in the
drop-down will be displayed (eg which properties from the biskit will
be used for the labels in the drop-down)
If there's a non-empty format or a non-empty null value label, they will
be used. Otherwise they will be ignored.
Example:
[listSelect source="..." format="%foo%" nullValueLabel="No value here"]
There's also support for specifying some javascript to be executed
when the drop-down value is changed by the user. For example:
[listSelect source="..." format="%foo%" nullValueLabel="No value here" onchange="myfunction()"]
Add a time period to ResourceUsage search conditions by default
- Add support for StringEnum/MappedString comparisons against any strings
- Equals and Not Equals relations both result in seeing a drop-down in a
condition, as it always has been.
- For any other condition relation, it displays a free-text entry for the
comparison.
- Note that in both cases, it compares the value the user enters with the
value stored in the database, and NOT the label.
- For StringEnum, the label is what's stored in the database, but for
MappedString, it is not.
- This may go against what the user expects. There are reasons for doing it
this way:
- MappedInt relations (other than == and !=) compare against the
number stored in the db. So this is consistent with that.
- The point of MappedString is that you can change the label without
anything breaking. Having conditions use the label would break this
feature and would be likely to yield hard-to-diagnose support issues
in future.
- Conditions all check against what's in the database. Doing anything
else here, as well as lacking consistency, would be difficult to
achieve.
- Avoid complaint if BiskitCreate has no BiskitDef selected with "save to db"
- You can't save a biskit to the database is that biskit is marked abstract.
- Similarly, there was a complaint issued if you left the type-to-create as
a fixed value of null while "temporary biskit" is set to "save to database"
- The complaint was annoying, and not entirely useful, so it was removed.
Bug Fixes
BUGFIX: Workflow function "getAsString" exception when given null biskit
- BUGFIX: Infinite loop possible with FindText workflow action bad regex
- Somebody can provide a regex that might match zero characters.
- If that happens, we used to hit an infinite loop.
- BUGFIX: reports don't show durationInMinutes when the property is indirect
- If you search for ResourceUsage, and add a column to a group report to
show booking.durationInMinutes, and nothing else, then you find that
durationInMinutes is always null.
- BUGFIX: Unselected function in FunctionWorkflowAction prevented system boot
- If you add a FunctionWorkflowAction and never set which function you want
it to call, and save it like that, then the system would not boot.
BUGFIX I2092: BiskitCreate action shows extra label after select BiskitDef
BUGFIX: Diff Workflow Action gives an exception when it's run if an
attachment property exists and contains a non-null attachment.
BUGFIX: All getAsXXX(biskit, string) methods failed given a fixed first arg
BUGFIX: All-day bookings give exception in calendar when description hidden
Back to Top
8.2.45 January 10th, 2018
Changes
Back to Top
8.2.46 January 29th, 2018
Changes
- Add description of parameters in bookingsWeekView(...) workflow function
- Add database version information to the third party licences page
- Display third party licence properties in alphabetical order
- Adhere to global prefs first-day-of-week in date picker
- Whenever you enter a date, you get a pop-up that helps you select the
date.
- That pop-up displayed the days of the month using a locale-specific
first-day-of-week, which ignored the global preferences setting for
what the first day of the week is.
- This is now changed so that the date picker respects the chosen first
day of the week.
- Change mouse cursor to a pointer when over header of sortable tables
- This is to give better feedback that clicking there will do something.
- Display all visible properties in list columns selector
- Previously, a list report would show a columns selector that contained
only properties marked in the bakery as visible in a biskit list.
- This change alters it so that all visible properties are displayed,
and those that are visible in a biskit list are the ones ticked.
Bug Fixes
- BUGFIX: Slaves in a not-loaded sub-tab lose data on saving master biskit
- If you have a biskit with a slave, and set up a layout so that the slave
is displayed in a subtab rather than at the top-level, then editing the
master biskit would cause the slave's properties to be lost.
- This is a serious error because it can cause data loss. It's a
long-standing bug that has not been noticed until now because it's been
our standard practice to display slaves in a top-level tab, which
avoided the bug.
- BUGFIX: properties in a slave's subtabs are not rendered
- This bug applies anywhere we're using layouts with master-slave
properties, and the slave has a layout that itself uses subtabs for some
of its properties.
- Except that it doesn't apply in SDM's subject editor, because it calls a
different rendering method that happens to avoid the bug.
- And it's an SDM subject where we generally have complex biskits that use
master-slave relationships, and so this bug has been around for a long
time without being noticed.
- BUGFIX: Drop-downs with biskits sometimes display wrong value on edit
- This bug happens when you're editing a biskit which has a property:
- of type Biskit
- where null is not a value that is allowed to be displayed in the
drop-down options
- where there are fewer than 20 possible values
- and the currently selected value is the one displayed first in the
drop-down list
In these circumstances, then editing the biskit would result in the
value displayed for this property being whatever value was previously
displayed when biskits of the same type were edited.
For example, edit Resource X and save it. Then edit Resource Y, and
the resource's type could show the type of X instead of resource Y's
type.
Back to Top
8.2.47 February 5th, 2018
Security Bug Fixes
- SECURITY BUGFIX: Conditions could sometimes incorrectly compare things
- If you have a biskit type hierarchy so that BiskitDef B extends
BiskitDef A, then it means that a biskit of type A with ID 47 is really
the exact same object as a biskit of type B with ID 47.
- However, when conditions compare biskits, it wasn't allowing for this
equivalence.
- It can be demonstrated in Calpendo as follows:
- If there is no sub-BiskitDef of Resource, create one in the bakery
- Create a resource of this type
- Create a booking for this resource
- Go to the general search page (not the booking search page) and
search for bookings. Add a condition to search where the resource
is the particular resource you just created.
- The search will not find any bookings, even if the one you created
is within the selected date range.
- This is marked as a security bug because it would affect permissions
if you have Biskit definitions and a permission that includes a condition
that replicates the situation described above.
Bug Fixes
- BUGFIX: In Exprodo SDM, the Search->Event Search page failed to find events
when looking for events for a particular subject.
- This is a different bug from the above security bug, and only affects
Exprodo SDM, and only its event search page.
- BUGFIX: Going to next or previous month in calendar month selector may skip
a month
- If you navigate the calendar's month selector to January and then click on
Jan 31, and then click for the next month, it skips ahead to March.
- This is because it adds on one month, making February 31, and then it
rounds that off to March 3, and so it shows March.
Back to Top
8.2.48 February 22nd, 2018
Changes
Bug Fixes
- BUGFIX Issue 2117: Message when project has no resources/services misleading
- The message says you can't book resource or order service, but that's
only true when an authorised project is required.
- BUGFIX Issue 2118: Prevent services orders with inappropriate project
- This means preventing them having no project, and also requiring they
have authorised projects when required.
- BUGFIX: DB upgrade for 8.2.35 could create multiple properties of same name
- Specifically, the 8.2.35 release included these new properties:
- Calpendo.UserSettings.acceptabilityColourIndeterminate
- Calpendo.CalpendoConfig.acceptabilityColourIndeterminate
- Calpendo.CalpendoConfig.acceptabilityTextIndeterminate
- Calpendo.CalpendoConfig.acceptabilityShowTextIndeterminate
- However, the database upgrade had incorrect database directives, and so
did not prevent the upgrade from running multiple times.
- Consequuently, rebooting a system multiple times would result in
creating a new copy of these properties.
- This fix updates the 8.2.35 upgrade (for those who haven't yet upgraded)
and removes duplicate property definitions (for those who have upgraded).
Back to Top
8.2.49 March 1st, 2018
Bug Fixes
Back to Top
8.2.50 March 6th, 2018
Bug Fixes
- BUGFIX: Changes to the CSS (both system-generated and custom CSS entered in
global preferences) could be ignored by browsers that continue to use a
cached version.
- This fix involves sending a header in response to a request for the CSS
that tells it to always ask the server for the CSS.
- The server will still check whether it's actually changed and may only
send a response to say it's not been modified, if appropriate.
- This change will take a while to take effect as browsers that cache
the CSS will have to either decide to check with the server or be forced
to do so (via a user emptying their cache or doing a shift-refresh)
before the browser will see the new header.
Back to Top
8.2.51 March 12th, 2018
Bug Fixes
- BUGFIX: Illegal project in booking caused problem for ResourceUsageRecorder
- If a booking contains a project that is not legal for a user using the
resource usage recorder, then there would be no message to the user
about the problem, but the wrong project could be used, or no project
used, and no way to choose a different project.
- BUGFIX: Some databases have the wrong type for RemoteUserLog.type
- This is used for actual usage recording done on remote PCs that send
usage information to Calpendo.
- It was set to be of type "CRUD", but should be "RemoteLogType"
- This affects anybody that has PCs driving their instruments and that uses
Calpendo's remote activity recording.
Back to Top
8.2.52 April 4th, 2018
Bug Fixes
- BUGFIX: permissions that deny global preferences read/exists prevent login
- Even root could not log in if you disable the permission that allows
read permission on everything by default.
Back to Top
8.2.53 April 27th, 2018
Security Bug Fixes
- SECURITY BUGFIX: Permissions relying on UserGroup can fail in reports
- When running a report on biskits that contain user groups (such as a
Calpendo Resource, which has a reference to its manager user group), if
you have permissions that rely on the content of that user group to
control access to the original biskit (eg the Calpendo resource), then
that permission will likely fail.
- This is because the server didn't load all the data from the user group,
and so the result is that checking whether a user is a member of the user
group could give a false negative.
- The most likely impact of this bug is that people won't see data they
should have access to, since that's what would normally happen with a
Calpendo resource and its manager user group. But there could be other
situations in which this could give a false positive, and so this is
marked as a security bug.
- This problem could be demonstrated by adding a custom property onto a
Calpendo resource to store a user group, and then having resources
EXISTS permission that requires you to be a member of the user group
referenced on the resource.
- From the resource editor page, you would then see a tree of resources
correctly, but if you run a search for resources, it would find none
because of this bug.
- SECURITY BUGFIX: Brute force login checking not enforcing temp blocking
- When you have too many failed login attempts in too short a time, we
would send an email back to Exprodo Software so we knew when it happened.
- However, it was supposed to temporarily prevent logging in, even with the
correct password, if there had been too many failures.
- This temporary blocking of an account was not happening.
- It used to happen, but a change made quite some time ago broke it.
Back to Top
8.2.54 May 25th, 2018
Bug Fixes
- BUGFIX: Rendering a biskit with a hierarchy property could give exception
- This could only apply when a biskit-valued property used a biskit that
was configured as a hierarchy.
Back to Top
8.2.55 November 21st, 2018
Changes
- Allow date/times to be parsed that include milliseconds
- This provides compatibility for 8.2 to parse json generated by 8.3 and 8.4
Back to Top
8.2.56 November 23rd, 2018
Changes
- Optimisation: Allow ServerDataAccess to avoid DB access for self-references
- This applies when a biskit-valued property is a formulaic property with
the formula "id". In this case, we can avoid a database call.
Bug Fixes
- BUGFIX: Accessing data can sometimes generate an exception
Back to Top
8.2.57 December 7th, 2018
Security Bug Fixes
Back to Top