Euphorie – Euphorie Risk Assessment tool¶
Translations¶
The following translations are available for this document:
About¶
Euphorie is a tool for risk assessment. It was developed by SYSLAB and TNO in cooperation with Simplon and Cornelis Kolbach in commission of The European Agency for Safety and Health at Work as part of the Healthy Workplaces campaign.
Introduction¶
The euphorie risk assessment tool is based on hierarchical questionnaires. A questionnaire (or survey) covers all possible risks for a specific sector of industry.
Each sector organisation can have one or more surveys published simultaneously. In order to facilitate development and testing of surveys the system supports multiple versions for a survey. Only a single version of a survey can be public at any point in time.
Manuals¶
The ‘What’ and ‘Why’ of a Risk Assessment¶
Running a business means running risks¶
An entrepreneur is exposed to risks; you know this better than anyone. The product in which you have invested needs to succeed. What if your customers do not pay, or if there is a burglary at your premises? These are all risks. This is all part of being an entrepreneur. As long as all is well, you and your employees will be able to earn a decent living.
Are you aware of all the risks? Including the risks to your employees and your equipment?¶
What if there is an accident with one of the machines? What if an employee is exposed to hazardous substances? What if somebody is unable to work because the work is too demanding, or too much? This will cause production to halt, or you will have to cope with one less person. Then there are still the costs for repairs and healthcare. Not to mention the danger to your reputation. These are substantial risks.
An RA will allow you to define these risks. This enables you to tackle them head on!¶
You have probably heard of a Risk Assessment, or RA, before. An RA consists of two parts: a LIST with all the risks to your company and a PLAN to deal with them. These two components allow you to limit the risks to your employees and your company, and therefore also the financial risk.
The RA is not complicated. It is compulsory for almost every entrepreneur with employees!¶
Complicated? Not really. It just takes a bit of time. However, the RA is important. So important that the government has made it compulsory for almost all entrepreneurs with employees.
An RA is a legal requirement¶
Every company must conduct an RA and draw up a Plan of Action. A company is responsible for the health and safety of its employees. That is logical. As an employer, you want to live up to this responsibility. To do so, you need to know what the health and safety risks are for your company. These risks can be determined using this RA. They can be determined in such a way that you know where to improve the working conditions and what risks to eliminate.
How often should an RA be performed?¶
Conduct an RA regularly. Especially if there are any changes in your company. For example, when you buy a new machine, after reconstruction or after moving. A rule of thumb is once every four to five years. You do not have to start the RA from scratch every time.
How should an RA be conducted?¶
You can conduct the RA yourself. You can also ask your employees to complete some of the questions. This is a good opportunity to ask them whether they have seen points for improvement, which is motivational! Also involve the employee representative body.
Reducing risks in four steps¶
These four steps are the best way of reducing the risks:
- Identification. All the hazards in your company on one list
- Evaluation. Determine the level of each risk
- Action Plan . Indicate how to solve the risk and plan who does what and when?
- Report and Keep it up-to-date. Done? Then you are on your way!
Step 1: Identification¶
All the hazards on one list: draw up a list of all the hazards in your company. You can draw this list up yourself. (Or you can ask an expert to conduct your RA.)
Your RA must answer the following six questions:
- Have there been accidents in the past in my company?
- What could currently go wrong in my company, causing accidents or absenteeism?
- How great is the chance of this happening?
- How do I limit a risk? Or limit the damage if something does go wrong?
- What precautions are necessary? And how do I implement these?
- How do I ensure that the precautions continue to work?
Step 2: Evaluation¶
The result is a summary of the bottlenecks in your company. For each bottleneck you will evaluate the magnitude of the hazards: you define the risks.
Step 3: Action Plan¶
You indicate how you will solve the bottlenecks. Compare all the risks on the list and place them in the correct order. Which risks are the most threatening? Are there situations in your company that are not legally permissible? Which risks could cause damage to your employees, equipment or the production process? Which risks would your employees like you to tackle? Which modifications are technically feasible and – also important – how much can you invest?
Next step: compare who does what and when? You now have a list of ‘Things to Do’. The third step is: set time periods for tackling the risks in your company. Who will start working on which risk? And when will you be satisfied? What will it provide? In short, a plan of action. This allows you to resolve the risks one at a time, preferably at the source. Perhaps you can solve several problems at once.
Step 4: Report - Keep it up-to-date¶
Done? Then you are on your way! That sounds odd. Once you are done that means you are finished, right? This does not apply to the RA. You will implement the Plan. You will discuss the progress with your employees every year. If you make changes in the company, you must change the RA too. New machines, new working method, reorganisation? Changes in your company mean a modified RA. So, if you have finished your (first) RA, you have only just started. You have started to improve the health and safety standards in your company. And improvements are never finished!
A Guide to creating a Risk Assessment tool¶
1. Introduction¶
Your goal is to create the content of the OiRA tool for enterprises in your sector, and to offer this sector-specific tool to them. The OiRA tool promotes a stepwise approach to risk assessment and is made up of 5 steps:
- Preparation > the sector introduces the end-users (enterprises) to the risk assessment
- Identification > the end-user goes through the hazards/problems and answers YES or NO
- Evaluation > the end-user evaluates the risks for each problem/hazard spotted
- Action plan > the end-user fills in an action plan with measures to tackle all stated risks
- Report > the action plan becomes a report to be downloaded and printed
1.1 Keep in mind your end-user¶
It is important to keep in mind your end-user: the micro and small sized enterprise (employer and worker(s)) and the structure of the risk assessment tool should be as relevant as possible to the daily activities of the enterprises; the end-user thinks and acts in terms of his own business processes. Often, the expert’s way of thinking differs from the practice of the end-user. The latter thinks in terms of his own work processes and uses his own language. Some examples:
- the expert thinks of physical workload; the end-user of physical work
- the expert thinks of the thermal environment; the end-user of working in the heat/in the cold
- the expert thinks of safety and creates a module containing everything in that area; the end-user may think of opening and closing a shop, for example, and what that involves, or dealing with aggressive customers and what to do about them.
1.2 Use easy language¶
Structuring the content of the risk assessment tool so that it is in line with the way the average end-user thinks and acts makes the content recognisable, and it makes it easier to carry out an action plan to tackle the risks with feasible measures.
Another decisive aspect is the language used. The language should be easy to understand with no need for interpretation, referring to things by names that are familiar and usual to enterprises.
Short sentences (at best no longer than ten words) and clear everyday language that can be easily read by the layman will prevent the end-user from developing an aversion, and enable him to draw up an assessment and use the OiRA tool properly.
At the beginning of the tool you will be given the chance to write a short introductory text sending a positive and encouraging message regarding:
- the importance of risk assessment
- the fact that risk assessment is not necessarily complicated (the idea is to contribute to demystify risk assessment)
- the fact that the tool has especially been conceived to meet the needs of the enterprises in the sector
It is important that the text is not too long; otherwise it could discourage the end-user from using the tool.
2.Team¶
Although it is important to keep the project team manageable in terms of size, it should preferably consist of:
- representative(s) of the trade association(s)
- representative(s) of the trade union(s)
- the OiRA developer
- an expert in occupational safety and health (with knowledge of and affinity with the sector)
- end-users (e.g. management or staff from companies, trade unions officials, etc.)
3. Structure¶
3.1 Structure the content hierarchically¶
Before you start creating an OiRA tool, we recommend considering the number of matters which you want to address. Thorough consideration of the structure will pay dividends later on, so classify the subjects in a way that is relevant to end-users.
The system offers a way to group topics, subtopics and types of risks together. The main goal of this grouping is to make it easier/more logical for the end-user to complete the risk assessment tool. Your risk assessment tool will therefore consist of:

MODULES = subjects (locations, activities, …)
- Example:
- Module 1: Hair Shampooing (hairdresser sector)
![]()
SUB-MODULES (not compulsory) = sub-subjects
- Example:
Sub-module 1: Working posture
Sub-module 2: Contact with water and cosmetic products
![]()
RISKS = statements about a situation which is in order
- Example:
1.1 The shampoo station is adjustable
2.1 Suitable protective equipment, such as disposable safety gloves, is purchased
![]()
SOLUTIONS = preventive measures to solve the problem recommended by the expert
- Example:
1.1 Taking regular breaks to be able to recover from physical work
2.1 Using dust-free products
The system also offers the possibility to:
- skip one/a whole set of modules in case the content does not apply to the company activity
- repeat some modules in the case of enterprises having multiple locations.
3.2 Think about the risk as an affirmative statement¶
Once you have decided about the main structure of the risk assessment tool you can start to identify and explain the various risks.
The system works with affirmative statements; that is, it states whether a situation is ‘in order’ (the goal to be attained) or ‘not in order’;
Note
Example: Good lighting is present.
The end-user answer is either a clear ‘yes’ or ‘no’. If the end-user answers with NO (= the situation is not in order), then the problem is automatically included in the action plan step and the end-user will have to propose a measure to tackle the risk.
3.3 Consider the different types of risks¶
You can choose from 3 types of risks:
priority risk: refers to a risk considered by the sector to be among the high risks in the sector.
Note
Example: Working at height in the construction sector: the scaffold is erected on a firm foundation
risk: refers to existing risks at the workplace or linked to the work carried out.
Note
Example: All office chairs are adjustable
To identify and evaluate the above two types of risk it is often necessary to examine the workplace (to walk around the workplace and look at what could cause harm; consult workers, …).
policy: refers to agreements, procedures, and management decisions regarding OSH issues.
Note
Example: Manufacturers are regularly asked about alternative safe products
These policy statements can be answered from behind a desk (no need to examine the workplace).
3.4 Pre-set evaluation for the risk¶
For each “risk” type you can choose from 2 evaluation methods:
- Estimated: by selecting from high, medium or low.
- Calculated: by evaluating the probability, frequency and severity separately. The OiRA tool will then automatically calculate the priority.
End-users will not have to evaluate the following risks in the “Evaluation” step:
- Priority risks (considered by default as “high priority” and displayed as “high” in the action plan)
- Policy (strictly speaking this is not a risk).
3.5 Propose solutions¶
The sector is generally well-informed of the risks that are most likely to lead to occupational accidents and diseases. In order to help the end-user to find solutions to these risks, you can include the solutions recommended by the sector/experts. While working on the action plan, the end-user will have the possibility to select the solutions and rework them (modify the text) according to the situation that prevails in their enterprise.
Note
All the necessary documents are available on the OiRA community site http://www.oiraproject.eu/documentation
Client manual¶
Authentication¶
Is this your first visit? Then you must first start an RA. You already started with an e-mail address and a password. After that you give the RA a title. Next you can start the RA.
Stopping and starting an existing RA¶
Once you have started an RA, you will be able to stop before the end. Log out: the data will be stored. If you forgot to log out and just ended the RA, the data will be stored too. For security reasons it is better to officially log out. Of course your must remember your e-mail address, password and the title that you have given the RA. You can start the stored RA again at a later date: select the title of the RA. You can save more than one RA, provided you have given them different titles names.
Sessions¶
Just start. The programme will point you in the right direction.
You will find buttons:
- Next: this takes you to the next screen.
- Previous: this takes you to the previous screen.
- Help: this takes you to the online manual.
- Log out : use this button if you want to stop before the end. The data that you have entered will be saved. Keep in mind: remember the title of the RA.
- Status. The button will show you your progress handling the RA tool. Why view the status? Drawing up an RA is not something you can do in one session. Therefore, it can be useful to see where you ended the last session. This can be done on these pages.
You will also see:
- Buttons at the top: these list the steps in the RA, such as Identification, Evaluation and Action Plan.
- On the left side: the question overview, with modules and questions. You can select these by clicking on them
- In the modules you will find a progress indicator (how far am I?) and a status indicator (what has been organised properly: green, what could be improved: red, what will I answer at a later stage: orange).
Preparation¶
Why do you need a company profile?
Before starting with the RA, you must first determine your company profile. This is particularly important if your company consists of more than one business unit. For example, if your store has more than one branch, then you must answer the RA questions separately for each branch. By indicating the composition of your company here, this means that it will be automatically included in the Inventory. It is useful to give company sections a clear name.
How to determine a company profile?
- On the page ‘Determine your company profile’ you indicate the type of business units that occur in your company.
- Does your company consist of several stores, branches or similar? Enter each store, branch or similar separately and give them a name.
Have you forgotten to determine your company profile? Start again with the RA and give the RA a different name. Remember that what you have already filled in will have to be filled in again.
Identification¶
Evaluation¶
Why evaluate?¶
Once you have answered all the questions, you can evaluate. That means that you will receive a summary of all the bottlenecks in your company. Please bear in mind that: one bottleneck may be more severe than another. Therefore, the magnitude of the risk is determined here.
High, medium and low¶
The step Evaluate is performed by answering three questions for each bottleneck. Your three answers will be used in a calculation, based on which the programme determines whether the risk is high, medium or low. In the next step, ‘Action Plan’, you will find more information about the outcome of this calculation.
What are bottlenecks?¶
Bottlenecks are questions in the phase Identify that were answered with a ‘No’. These questions are flagged again here. However, it is possible that you answered ‘No’ to certain questions but these questions do not pop up in the phase “Evaluation”. There are two possible reasons for this.
- Either: a certain bottleneck is known to cause high risks in your sector (for example, in the case of occupational diseases). In that case the bottleneck will only be listed in the Action Plan, with the warning ‘Risk: high’.
- Or: this is a bottleneck for which the risk cannot be determined based on these three questions (for example for the bottleneck: absence of policy). In that case the bottleneck will also only be listed in the Action Plan, with the warning ‘Risk: not defined’.
You will assign priorities to these bottlenecks yourself in the Action Plan.
How can you check that all bottlenecks have been evaluated?¶
They will appear in the Action Plan with the warning ‘Risk: not defined’.
What if there are no bottlenecks?¶
That is possible. This is good as it means there are no health or safety risks in your company. You can simply skip the steps ‘Evaluation’ and ‘Action Plan’.
How to evaluate?¶
The step Evaluation is performed by answering the following three questions for each bottleneck:
- How often are people exposed to this risk? You can select: ‘Never’, ‘Almost never’, ‘Regularly’ or ‘Constantly’.
- What is the chance of this risk occurring? You can select: ‘Small’, ‘Medium’ or ‘Very big’.
- Which is the severity of the damage? You can select: ‘Weak severity’, ‘Significant severity’ or ‘High (very high) severity’.
An example¶
There are hazardous substances in a storeroom. The employees enter this room briefly several times per week. The storage has been fitted with an extractor. The chance of hazardous substances being released (for example by leakage or vaporisation) is estimated to be medium (there are various substances in different types of packaging). The exposure is defined as regular (the employees enter the room several times per week). And the severity is significant (the substances are irritating, but not toxic).
Suggestion!¶
Use your common sense when filling in the forms. Do not pay any attention to all sorts of other possible and conceivable effects.
Action Plan¶
Why set up an Action Plan?¶
You have defined the bottlenecks in your company. You have determined the level of risk for each bottleneck. The question that remains is: what can you do about it? In other words: what measures can you implement to remove these bottlenecks?
First priority...¶
The programme runs through the bottlenecks one at a time. First you must set the priority: how important do you think it is that this bottleneck is tackled quickly? The programme automatically assigns a high priority to a bottleneck with a high risk et cetera. You can modify the priorities yourself.
...then the measures¶
Now there are two options for each bottleneck: you select one of the standard measures suggested by the programme. These are measures that are normally used in your sector. Some sectors list several standard measures, others do not. Or you decide on the best measures by yourself.
How to set the priority?¶
You select a high, medium or low priority for the bottleneck. You leave the priority as set by the programme, or you modify it.
How to select measures?¶
Sometimes one or more standard measures are suggested. You can select one or more of these measures, or you can modify the text of the measure yourself! Or you can add your own measures. If you have added at the phase Identify your own notes, you can see them at the page Action Plan.
Fill in
- Prevention plan: the tasks that have to be carried out.
- Requirements: the knowledge and experience needed to carry out the tasks.
- Responsibility: the person in charge of the implementation.
- Budget: the costs that will have to be incurred.
- The start date and end date.
Report¶
Why report and print? You have now completed your RA. You can print copies for yourself and your employees. Please ensure that you always have a printed version of your RA available. This is useful when a Labour Inspectorate team visits. They will ask to see this document. (This can vary in each country).
How to modify the RA?¶
Once you have saved the report, you can modify it using your word processor (for example, Microsoft Word or Windows WordPad). Or restart the digital RA, and modify.
Note
The changes with your word processor will not be automatically adopted in the programme used to complete the RA.
Why add additional information to the report?¶
If you have saved the report you can add additional information like the name of your company, person(s) who carried out the examination, date of the RA. This additional information can be useful for supervisory authorities.
Final words¶
Keep it safe! Store your RA safely. You have put a lot of effort into it. You can close the RA by clicking on the button ‘Log out RA’ on the top right. This will automatically save the RA and close it. Your data have been stored. Once the save has been completed you will return to the screen ‘Select RA’. Here you can open another (existing) or new RA if necessary. However, you will probably just want to close the programme.
What will happen next?¶
You will start to implement your Action Plan. Conduct an RA regularly. Especially if there are any changes in your company. For example, when you buy a new machine, before and after reconstruction or moving. A rule of thumb is once every four to five years. You do not have to start the RA from scratch every time.
Admin manual¶
This document explains how you can administer users and countries so that these users can start creating online surveys.
Log-in¶
First you need to log in with an account with administrative privileges. Go to http://admin.oiraproject.eu/ and you are prompted with a login form:

Type login and password and click Login.
Note that there is a link below the login button which allows you to request an account if you don’t have one yet.
You can also change the language of the page by clicking the arrow on the right side of the page opening the language menu.

It will slide open when you move your mouse over it:

Structure¶
Online Surveys are stored in a structured way. To access a survey, you have to first pick a country and then a sector. The sector contains surveys. Once you logged in, you see the available countries represented by their flag on the overview page. Clicking a flag leads you to the sector overview of this country. You see a link for each sector present in that country.
Countries¶
You can add a new country by accessing the Actions menu in the top right section of the page.
- Go to the country overview page (e.g. by clicking Surveys)
- Move your mouse over Actions and in the section Add new select Country
- Provide a Title and a Description for the new country
- Click Save

Note: Usually adding a country would not be a day to day task and it also requires system intervention to provide the proper flag at this moment.
Click a country to access the list of sectors available there. In the beginning this will be empty.

Manage countries:
- If you log in using administrator credentials, you are directed to the overview page with all the flags for the countries.
- Click on a flag and then click Edit in the top right area to manage this country.
Country manager¶
You can add a country manager to delegate the user administration for a country. The country manager has full control over all content and structure within that country. He will be able to add sectors and manage the users within that country.
Follow these steps to add a Country manager:
- Hover your mouse over Actions and in the section Add new click Country manager
- The Add Country manager form appears
- Fill in the fields
- Note that you can lock the account initially. It will then be inaccessible until you unlock it later.
- Click Save
- A feedback page states that the user has been created

You can now contact the responsible person - in this example the HSE Country admin - and communicate the credentials to log into the site.
Note: If the country administrator logs in, he will be directed directly to his country’s overview page where he can start adding sectors. He will not see the flag overview page.
Add Documentation¶
You can add country specific documentation.
- Hover your mouse over Actions and in the section Add new click Documentation
- Provide a Title
- Provide a Description
- Click Save

Note: The documentation added here will be availabe in the user frontend and therefore must be targeted at the end user who will later fill in the surveys - not the content creator.
Within this documentation section, you can manage
- The Appendix Pages created in the appendix folder are available via links in the footer of the online client.
- The Online help text The online help text can also be modified.
XXX TBD
Sectors¶
As Country manager you are responsible for the sectors. You can add and manage them.
Add a sector:
- Hover your mouse over Actions and in the section Add new click Sector
- Provide a Title and an ID for this sector
- Provide a password. The sector manager will use this later to log into the sector
- Give a description for the sector. This will be displayed whenever the sector is shown
- Provide a Contact name and a Contact email address of the sector manager
- You can upload a logo of the sector and provide a Main colour and a Support colour. These will be used to customize the user interface in the client.
- Click Save
Note: The ID you chose will be the user name for the sector admin to log in with. The sector admin will use the ID and the password as credentials. Once logged in, he can then add and manage surveys.

Manage sectors:
- If you log in using your Country manager credentials, you are directed to an overview page with all the sectors in your country.
- Click on a sector and then click Edit in the top right area to manage this sector.
Within the sector edit form, you can configure your sector further

Edit the Description

Edit the color scheme

Upload your own logo

Pick a new password

Edit the Contact name and email
User management¶
In the user management you are able to edit existing Sectors and Country managers. You can also add a new country manager or a new sector to your country.

Clicking the Lock button deactivates an account temporarily without the need to delete it.
Surveys¶
As sector manager you are responsible for the surveys in your sector. You can add and manage them. In a newly created sector there are no surveys. You can either use the Actions dropdown or the link add a new survey in the content area.

Read the next chapter, the content editor manual, on how to add and edit surveys.
OiRA tools generator User Manual¶
This User Manual is also available to download on:
Note: the images in this User Manual are generally more legible in printed form (preferably in colour) than on the screen.
General¶
Requesting a Login Account¶
To request a Login Account, send an email to OiRA Support (oira@osha.europa.eu) with the following information:
- The name of your sector (as known by the general public).
- Your fore- and surname.
- Your email address.
- Your preferred password for the OiRA tools generator (with a minimum of 5 characters, the user name will be confirmed by the EU-OSHA OiRA Team)
- The name of your sector (as known by the general public) and NACE code
In addition, clearly state in your email that you are requesting an account for the OiRA Tool, and explain why.
We will use this information to create your sector and will link this your Login Account.
Once your account has been created you will receive an email, at the provided address, containing the login information. Please note: Both your user name and password are case sensitive!
In addition to the login information you will receive an agreement, which determines the Terms and Conditions for using the OiRA tools generator (such as: full public access, responsibility to keep the sector’s OiRA tool up-to-date). The agreement has to be signed and returned within three weeks.
Logging in¶
Preferred web browsers are: Mozilla Firefox version 3.6, or any later version, or Google Chrome (both are available to download for free). Alternatively Microsoft Internet Explorer version 7, or any later version.
You start on: http://admin.oiraproject.eu/
![]()
And login with your User Name and Password. Did you forget your password? Check the confirmation email or click at the bottom of the page on ‘request a password reset’. Then add your user name and click on ‘Send’.
![]()
The password will be sent to the email address you provided.
![]()
If your login has been successful, a green bar with a confirmation will appear.
![]()
After logging in, you will be brought to a page with an overview of the Risk Assessment Tool for your sector. Here you can: click on a tool to amend it, or start a new OiRA tool by clicking on –> ‘Add New OiRA tool’ at the bottom of the page.
Logging out¶
Don’t forget to logout when you stop working in the OiRA tools generator. This is done with the button at the top right: click on your login name and select ‘Logout’. After logging out successfully, you will be brought back to the login screen where you will see the notification ‘Logout successful’.
Creating a new OiRA tool¶
After clicking on ‘Add New OiRA tool’ you will be brought to the page below:
![]()
When creating a new OiRA tool you can choose from the following three options:
- Start with a blank OiRA tool
- Base my OiRA tool on an existing OiRA tool of my organisation.
- Base my OiRA tool on an existing OiRA tool of another organisation.
Ad 1) Starting with a blank OiRA tool is particularly useful when you already have a paper-based OiRA tool for your organisation and would like to transfer this to the digital system.
Ad 2) This option is recommended when you are: (a) planning to revise the contents of your OiRA tool and/or (b) would like to add new modules. This option is also useful for organisations which manage multiple (sector-)OiRA tools, of which the base modules are applicable to other OiRA tools.
Note
When dealing with minor amendments, e.g. typos, it would be best to implement these in the existing OiRA tool and simply republish it.
Note
When the risks won’t be amended, but, for instance, only the clarifications you can simply create a new version (a copy) of the existing OiRA tool.
Ad 3) You can decide which existing OiRA tool is most suitable for your sector. You can copy and modify it, and thus avoid having to create one from scratch. You have to determine the amendments for your own sector. For example, the butcher could copy and modify the OiRA tool of the fish retailer.
In addition to the OiRA tool of a specific sector, you can also use the so-called generic checklist as a starting point. It’s slightly more general, but it does contain all the relevant aspects for an OiRA tool. The base-OiRA tool has been an inspiration for many sector-specific Digital OiRA tools and is considered to be a suitable starting point.
Note
THE BASE-OiRA TOOL WILL BE AVAILABLE IN THE FUTURE
The base-OiRA tool provides solutions at module level, which you can copy and modify if needed. It doesn’t provide solutions at a risk level. In addition, most modules of the base-OiRA tool start with a ‘filter question’, which determines whether the situation concerned will be applicable to the end-user.
Note
After you’ve copied an existing OiRA tool, any changes made to the ‘source-OiRA tool’ will not automatically be reflected in your own OiRA tool. When, for example, the butcher has copied the OiRA tool of the fish retailer and the fish retailer implements changes in their OiRA tool afterwards, these changes will not appear in the OiRA tool of the butcher.
If you would like to copy the OiRA tool of another sector as a starting point, you need to first select the country in the drop-down menu and subsequently the sector of your choice.
When this sector provides more than one version, you can view these versions and select one.
Give the OiRA tool a name (title). This name will be shown to the end-user in the overview. Tip: The overview is in alphabetical order, so make sure to choose a name based on your sector, for example ‘New Risk Assessment 2010’.
Then click on ‘Save Changes’ at the bottom of the page.
Your OiRA tool will then be created. Please note that this can take a while if you’ve chosen to use a copy of an existing OiRA tool.
In case of a new (blank) OiRA tool you will see a screen as shown below:
![]()
Editing an OiRA tool¶
On the main page (top navigation tree) you indicate those things, that are of priority for the OiRA tool as a whole. You can modify these later, by clicking on ‘Edit’:
![]()
Name: you can modify the name of the OiRA tool. The name you enter here will not be visible to the end-user and is mainly intended to facilitate you in managing the version. For the first version (new OiRA tool) the name ‘Standard’ will automatically be selected.
Description: short content description.
Introduction: Please provide some relevant and encouraging information for end-users of the OiRA tool:
- The importance of risk assessment
- The fact that risk assessment is not necessarily something complicated (the idea is to demystify risk assessment)
- The fact that the tool has especially been conceived to meet the needs of the enterprises of the sector. It is important to specify here precisely which end-users are expected to use the tool (who is the end-user of the tool).
Please adapt this text according to your sector needs, but try to keep it short.
You can add a hyperlink to a page/file containing the questionnaire for employees as an input for the assessment if social partners in your sector have decided that this is important.
You can insert hyperlinks
The evaluation can be skipped: If this option is selected, users are not obliged to fill in the evaluation phase.
Language: choose the language of the OiRA tool in the drop-down menu.
Classification Code: we plan to show the sector codes for all of Europe here in the near future (according to the NACE-standard). For now you can write the name of your sector.
Note
If you edit an OiRA Tool, you are in fact editing one of its versions. If you haven’t added any versions yet, you are still editing the “standard” version, which was added for you automatically. If you want to change title or description of the version container, you currently have to call its edit form directly like this: http://admin.oiraproject.eu/sectors/gb/bakery-sector/new-risk-assessment-2010/edit
Warning
Once a tool has been published, you cannot rename it anymore.
In the larger fields you can add both normal and formatted text. You will be able to identify this option from the grey bar at the top of the page (the ‘formatting bar’). The formatting bar will only be visible when you’re in a field where formatting is possible.
We would recommend you to type the text into the field without formatting. When you paste text into the field from another program, e.g. Word, the font used in Word will automatically be copied over. You will then not be able to change the font with the formatting bar. Word generates code to convert the text to html (which is used in the OiRA tools generator).You will not see this code when you paste the text from Word into the OiRA tools generator, but it does exist ‘underneath’ the text. Hyperlinks also have a fixed format in Word (colour and underlining), which is unchangeable after pasting into the OiRA tools generator. It’s best to implement hyperlinks after the text has been entered correctly into the OiRA tools generator (see the explanation further below for creating links).
Therefore, please keep in mind that pasting text from Word can cause unexpected effects. In addition, pasting text from programs other than Word can cause similar unexpected effects. This applies to all fields in the OiRA tools generator where formatting is possible. This is why we advise you to type the text into the field without formatting, instead of pasting from Word. When you do decide to paste from Word, it’s best to ensure that all the text is already formatted correctly (font, size and colour). In addition, all text you paste in should ideally have consistent font, size and colour properties.
The formatting bar offers the following options:
Bold (fat): you select (by dragging the mouse) a portion of text and click on ‘B’ in the formatting bar above the field.
Selecting the same text again and re-clicking ‘B’ will undo the bold font (this applies to all formatting options).
Italic (italicized): you select (by dragging the mouse) a portion of text and click on the ‘I’ in the formatting bar above the field. NB: Italicized text is generally not very legible on a screen.
Bullet points: you select the required lines and click on the icon with the dots.
Numbered list: you select the required lines and click on the icon with ‘1-2’.
Hyperlink (to a website): first type the text on which you would like to apply the hyperlink, for example: ‘Also see this website’. Subsequently you select the text (by dragging the mouse). You then click on the button with the chain icon in the formatting bar. A new screen will then open:
![]()
At ‘URL’ you enter the web address, this must start with: http://. Subsequently, you enter a title and indicate whether the link should open in a new screen by selecting the box. Then click on ‘Save’. The link will appear as underlined text. Modify the link:: double click on the link. Delete the link: delete the linked word and retype it.
Note
URLs are the way to link to documents from the sector, which you want to add to the OiRA tool. For example: concept plans, concept drafts, etc. Simply place the documents onto a website and create a hyperlink to the site in the OiRA tool.
If you would like to offer actual documents (e.g. Word or PDF files) on your OiRA tool, you first have to place the documents onto a website (e.g. the site of your sector’s organisation) and then create a link to these files as described above.
With ‘Ctrl-z’ you can undo formatting and textual changes you made in the OiRA tools generator field (multiple changes can be undone, as long as you haven’t clicked ‘Save’).
In addition, you can click the right button of your mouse when you are in a field, which will provide you with an applicable menu. When you select a word you will also see options such as: cut, copy, paste, etc.
Alternatively, you can use the following keyboard shortcuts:
- Copy: Ctrl-c.
- Paste: Ctrl-v.
- Cut: Ctrl-x.
- Select all: Ctrl-a.
- Undo: Ctrl-z.
- Search (within the field): Ctrl-f.
Click the ‘Save’ button (at the bottom) when you’re finished, this will take you back to the last screen. A yellow bar at the top will confirm that the item has been modified, which means that the information has been saved.
The functions described above apply to all fields in the entire OiRA tools generator where formatting is possible.
Creating the structure of an OiRA tool¶
When completing/modifying the content it’s essential to first consider which structure you will give your OiRA tool. With structure we mean: which main modules and/or submodules with risks will there be?
The OiRA tool can contain main modules and submodules. ‘Sub-submodules’ are not possible.
Within a module you can either add submodules or risks, a combination of both isn’t possible. You can however add risks to a submodule.
When you base the OiRA tool on an existing OiRA tool, it will already have a structure. Main modules and/or submodules can be added to, or removed from this structure. You can also copy and move modules, both within the OiRA tool and to other OiRA tools under your management (see the overview on the left).
Click on the module/risk which you want to copy or move, and open the menu ‘Actions’ (top right). Choose the desired option, go to the area where you want to move it (click in the desired OiRA tool and folder) and choose ‘Paste’ in the Action menu.
How can you determine the structure?
When using an existing OiRA tool as a starting point, you should study the structure and adjust it where required.
For example, the structure of a base-OiRA tool consisting of modules and sub modules is as follows:
- The building
- Every building
- Specific buildings
- Storage room / warehouse
- Type of work
- Office work
- Delivery and removal of material
- Physical work
- Working on site
- Working with customers / clients / guests
- Special circumstances
- Noise
- Climate: heat, radiation, cold, outdoors
- Vibrations
- Hazardours substances as raw material.
- Hazardours substances as a result / during work.
- Heights / crawl spaces / closed spaces.
- Tools / machines / means of transport.
- In case of emergencies
- Working and resting times
- Tasks / functions of workers
- Unwanted behaviour of colleagues
- General information
- Accidents
- Organisation of preventive measures. Prevention duties.
In the base-OiRA tool it’s easy to add main modules to the OiRA tools generator (half way through or at the end) or to create more submodules under existing main modules.
It’s also easy to delete main modules through the Action menu (top right) or move them up or down by dragging them.
It’s worth noting that in practice most sectors mainly expand and/or further specify the sections: ‘Type of Work’ (module 2), ‘Special circumstances’ (module 3) and occasionally ‘The Building’ (module 1), when modifying the basic OiRA tool.
Now you can complete the OiRA tool with modules, submodules, risks and measures (solutions).
In short the structure could look like this:
Main page OiRA tool
Profiling
- ‘Optional’ profile module (Do you have a store?)
- ‘Repeatable’ profile module (Name each store you have)
Modules
- ‘Optional’ module (filter question: Do you use dangerous substances?)
- ‘Mandatory’ module (must be filled in)
- Submodules
- Risks
- Measures (solutions)
Note
Terms used in the above example will be further clarified in the following chapters.
Using Profile questions¶
What are profile questions?¶
It is possible to skip or repeat modules in case they do not apply to the activity of the end user (optional profile question) or they apply to multiple objects (repeatable profile question).
Such questions are asked before starting the risk identification and evaluation. If the end-user does not tick the optional profile questions or does not add multiple objects, the related modules and risks are not displayed.
When determining which main modules and potential submodules should be created, it’s important to consider the option of using a so-called profile, a profile question is asked before one starts the OiRA tool. It is used to determine the main sections, activities, etc. of the company.
For example, for the bakery owner:
- Do you have a store?
- Do you have a stall at the market?
- Do you own a sales truck?
When the end-user answers with ‘Yes’, the submodules/risks are activated. The answer ‘No’ does not activate the submodules/risks. Imagine this to be the same as if you would include or exclude a certain part of a checklist, because it applies or does not apply to your situation.
Apart from this, the end-user will be required to complete a certain number of obligatory modules.
If you use a repeatable profile question, it will be possible for the end-user to indicate ownership of more than one object (e.g. multiple stores, stalls, sales trucks). Instead of putting a question, you would ask the user to name each object (“Name your bakery locations”) and the user will name the objects with names relevant to him (e.g. city center bakery, bakery head quarters, bakery city park). Through this, the modules associated with this repeatable profile will get repeated in the tool - once for each object. Imagine this to be the same as if you would make paper copies of a certain part of a checklist, because it needs to be filled for each location’s characteristics.
Using a profile is particularly useful in sectors, where it’s probable that a substantial number of modules with risks aren’t relevant to all companies. If you expect that most companies will complete practically all modules, creating a profile will be unnecessary unless you would like to have the possibility of completing part of the modules multiple times (as in the example with the multiple stores).
When someone replies with ‘No’ to an optional profile question, all subsequent risks will be nullified (when you don’t own a market stall, these risks won’t be shown). If someone replies with ‘Yes’, then all the applicable risks will be shown.
This module can thus be further completed as a normal module.
Adding profile questions¶
You can create profile questions as follows: click on the top level of the OiRA tool (top link in the navigation tree on the left-hand side) and in the grey bar underneath the title you will find the button ‘Add Profile Question’.
You will see the following page:
![]()
Here you can add:
Title: the title of this module, for instance ‘Working Circumstances’, ‘Acquisition’ or ‘Physical Strain’, etc. The end-user will see this title at the top of the page for the duration of answering this module’s risks. Don’t put a full stop after the title. A number isn’t needed either, the module will be numbered automatically.
Description: a short description of this module.
Type:
- optional: when you would like this module to start with a filter question.
- repeatable: when you would like to offer this module multiple times (e.g. per object).
The profile question acts as a module. You now have to add submodules and risks to it. You can do that by clicking the “Add Risk” or the “Add Module” button on the profile question object.
![]()
You can modify the modules at a later stage by using the ‘Edit’ button. With the Action menu (top right) you can cut, copy and delete modules and by dragging them (up or down) you can change their sequence.
Using the ‘optional’ feature in modules¶
Instead of determining which modules apply to the end-user through asking profile questions, there’s also the possibility of initially offering all modules. The first question of a module will then be, if this module is applicable to the end-user. We do this by asking a ‘filter statement’ expressed in a positive way, for instance a statement such as: ‘Dangerous substances are used’. As such, the end-user will initially deal with the module ‘Dangerous substances’, If the user answers with ‘No’ to this statement he will skip the whole module and potential sub-modules. It isn’t possible to skip risks by answering ‘Yes’ to a filter question, only by answering ‘No’.
If a filter question in a main module is answered with ‘No’, any potential submodules will also be skipped. It’s also possible to start submodules with a filter question. A combination of a main module with a filter question and related submodules with further filter questions (‘nested filter questions’), is possible.
Filter questions are not allowed to refer to potential risk, they only determine whether something is applicable or not.
Only one filter question may be used in a (sub)module. This is always the first question of the module. When there is a necessity to ask a ‘double filter question’, it’s best solved by amalgamating the two questions and adding an explanation of what happens when one answers with ‘Yes’ or ‘No’.
Example: ‘Physically demanding activities occur AND the prevention programme for physical strain has not yet been fully implemented.’
Answer with ‘Yes’ when physically demanding activities occur AND the prevention programme for physical strain has not yet been fully implemented. Otherwise answer with ‘No’.
It’s useful to start determining which modules could or should start with a filter question during the preparation of the module structure.
Creating modules, risks and measures¶
When the module structure is clear and the decision has been made whether a profile will be used or not, it’s a good idea to first completely implement the module structure into the OiRA tools generator. Only after that should you add the risks to the modules. It’s not useful to start adding risks to modules when the structure has not yet been determined.
Add Modules¶
You can create modules as follows: click on the top level of the OiRA tool (top link in the navigation tree on the left-hand side) and in the grey bar underneath the title you will find the button ‘Add Module’.
![]()
For a module you will see the following page:
![]()
Here you can add:
- Title:
- The title of this module, for instance ‘Storage room’, ‘Working at height’ or ‘Physical Work’, etc. The end-user will see this title at the top of the page for the duration of answering this module’s risks. Don’t put a full stop after the title. A number isn’t needed either, the module will be numbered automatically. Keep it short and simple. Use everyday language and make sure end-user will immediately understand it.
- Description:
- Provide a short general description of the content of the module. You can create links to useful external pages providing additional relevant information.
- This module is optional:
- Choose if you want to force the end-user to go through this module and the related risks or if the module can be skipped, as not every company in the sector has the same activities.
- Question:
- If you have decided to make the module optional, you have to enter a question to ask the end-user if the activity is carried out in the enterprise. The answer has to be YES or NO. If NO is answered, the end-user will skip the module.
- Image:
- You can add an image.
- Overview of solution:
- At this level (module), in most of the cases only generic/orientative solutions can be provided. Here it is important to stress the importance of avoiding the risk, substituting the dangerous by the non-(or less) dangerous, combating risk at source. The solution can underline or focus on different aspects: technical and/or organisational, ... This text will appear in the action plan step. This overview of solution at module level is compatible/complementary with the measure(s) proposed at risk level.
Click on ‘Save’ at the bottom of the screen.
To add more main modules, again click on the top link in the navigation tree and select the button ‘New Module’.
To add a submodule to the current module, click on the module to which you want to add a submodule and select ‘Add Submodule’.
You can modify the modules at a later stage by using the ‘Edit’ button. With the Action menu (top right) you can cut, copy and delete modules and by dragging them (up or down) you can change their sequence.
Add Risks¶
A risk is always placed inside a module or submodule. You first select the required module on the left-hand side. Don’t add risks in the top level of the OiRA tool, only in the modules or submodules underneath.
Open the required module and click on ‘Add Risk’ in the grey bar underneath the title.
You will then see the screen below:
![]()
- Statement:
- Write a short positive statement about a possible risk For example: ‘There are no obstacles or trailing cables on the floors’. Put a full stop after the statement. For more information on how to properly formulate risk statements, see below.
- Problem description:
- This is the inverse of the statement = a negative statement This field is mandatory as the negative statement will appear in the risk evaluation and action plan steps (if the end-user answers NO to the positive statement). For example: ‘There are obstacles or trailing cables on the floors’.
- Description:
- Describe the risk and provide the end-user with any relevant information. You can create links to useful external pages providing additional relevant information. For example, put a clarification/explanation of the exact meaning of ‘timely inspection’
- Legal and Policy References:
- Provide relevant legal information related to the risk/topic/issue. You can create links to useful external pages providing additional relevant information.
- Identification Phase:
- If checked, this offers to the user the possibility to answer with ‘Not Applicable’ in addition to the usual Yes/No in the Identification phase.
![]()
- Evaluation Phase:
- Specify the risk type and the evaluation method. For more information on risk types and evaluation, see below.
![]()
- Main Image and Secondary Images:
On the risk page you can add images. One Main image, which will appear on a prominent position and up to three secondary images, which will appear below. You should use these images to help describe the risk situation and eventually also the correct situation as a contrast.
You will have to upload these images yourself. Make sure that the images are clear and legible, not too large in surface size (maximum 300 x 300 pixels on the screen) and file size (maximum 100 kB). Give the image a clear file name, without spaces (for example: Danger_logo.jpg). When the image is ready to upload, you select it from your computer by using the ‘Browse’ button. The location and file name will appear in the field.
This function will only allow you to upload images with a ‘gif’ or ‘jpeg’ extension. Any other files will first have to be placed onto a website and can be linked to from the text.
After uploading the image, click on ‘Save’ (at the bottom of the page).
You can modify the risks at a later stage by using the ‘Edit’ button. With the Action menu (top right) you can cut, copy and delete modules and by dragging them (up or down) you can change the sequence. You should do this before the OiRA tool has been published.
Formulating risks (positive statements)¶
The risks have the form of statements. Avoid words such as not / no / never in the statement (and also in profile questions). Given that the end-user can only answer with ‘Yes’ or ‘No’, a statement containing the word ‘not’ and the answer ‘No’ can lead to confusion. Reformulate for instance as follows:
There are no obstacles or trailing cables on the floors
->
Floors are free from obstacles or trailing cables
When reformulation is not a possibility, try to clarify with an explanation what will happen when the end-user answers with ‘No’, e.g.: ‘By answering ‘No’, there is a risk, when answering ‘Yes’, there is no risk’.
For all statements, the answer ‘No’ always indicates that there’s a risk and the answer ‘Yes’ indicates there isn’t a risk.
Any answers other than ‘Yes’ and ‘No’ are not possible, except for temporarily skipping the risk (‘parking’ it by not answering it) during the OiRA tool (when the end-user doesn’t know the answer immediately). In addition it’s possible to offer the option ‘Not Applicable’, if necessary (see below for the procedure). This is useful for risks of which you can’t predict whether they will be relevant to the end-user. Using the optional (filter) modules should however, to a large extent, avoid the end-user being presented with irrelevant risks.
Specify evaluation method¶
Chose one of these types:
- risk: refers to the existing risks at the workplace or linked to the work carried out. To identify and evaluate such risks it is often necessary to examine the workplace (to walk around the workplace and look at what could cause harm; consult workers, …).
- policy: refers to agreements, procedures, management decisions regarding OSH issues. These issues can be answered behind a desk (no need to examine the workplace). They are not evaluated by the end-users (in the evaluation step).
- top 5 risk: refers to a risk considered by the sector/authorities among the top 5 in the sector. “Top 5 risks” are considered by default as “high priority”, so end-users are not asked to evaluate them.
Risk¶
This handles risks other than the commonly known Top 5 risks which are typical for the sector. It concerns the risks which can occur inside the working area or during a working procedure. At this stage of creating the tool it isn’t clear how high the risk is. You can ask the end-user to specify how high the risk is in two ways:
- Calculated:
If you choose the CALCULATED method, the system will automatically calculate the priority depending on what you ticked in the probability, frequency and severity fields (based on the Kinney method). Chose wether to provide a pre-calculated risk (that will appear to the end-user in the evaluation step), or to leave the “no default” options (this means that you don’t want to orientate the end-user in the evaluation step). Anyway, the end-user is always free to overrule your presets.
![]()
The questions for probability - frequency - severity are:
How high is the probability that this risk will occur?
- Small
- Medium
- Large
How often is one exposed to this risk?
- Almost never
- Regularly
- Constantly
What is the severity?
- Weak severity
- Significant severity
- High (very high) severity
The program then calculates the level of the risk and it’s priority in relation to the answers.
You can help the end-user by pre-selecting the probability / frequency / severity options, according to your sector. The end-user will then be shown these options and can adapt them, if required. If you’re unsure, or if you want the end-user to evaluate this individually, add ‘No default’. The end-user will then see ‘blank’ bullet points in the evaluation.
- Estimated
Select ‘Estimated’ when a calculation isn’t necessary or possible.
![]()
Select the default priority by choosing wether to provide a rough estimation of the risk (high, medium or low that will appear to the end-user in the evaluation step) or to leave the “no default” option (this means that you don’t give directions to the end-user in the evaluation step). Anyway, the end-user is always free to overrule your estimation.
Policy risk¶
This concerns a question about policies (e.g. employment policy) or procedures (e.g. acquisition). The end-user isn’t asked to specify a priority here. When ‘Policy risk’ is selected, this doesn’t have to be added to the evaluation but will be referred to again in the Plan of Action.
Top 5 risk¶
A top 5 risk is determined by the sector and is a high risk by definition. Here too, the end-user won’t be asked to prioritise and it will be incorporated into the Plan of Action with a high priority.
Solutions / measures¶
One of the goals of this tool is to help users with information on how to solve problems they encounter during the process. This is done by providing typical solutions to general problem areas (by module) or specific problems (by risk). Therefore you can add such solution information in a module and attach it to a risk.
It is most comfortable for the end-user if you provide a solution for each risk, because then the user will be able to pick solutions with a click to prepopulate the action plan form.
In some cases it might however be not possible to provide that specific solution information. Then you should at least specify an ‘Overview of solution’ on the module. This text should contain an approach for the user how to tackle the risks described in that module in a general way. This information will be displayed in the Action plan before each specific risk is handled.
You can add the “Overview of solution” in the module edit form.
- When you don’t work with solutions per risk, it is important that you give an “Overview of solution”
- If you do work with solutions per risk, it is optional
Solutions/measures - per risk¶
In addition to an ‘Overview of solution’ per module level, it is recommended that you create solutions for all risks. You can do this as follows:
A solution is related to a concrete risk. First select the risk in the correct module and then click on ‘Add Measure’ in the grey bar.
You will see a new screen with blank fields:
![]()
- Description:
- Start with words which reflect the core message of the measure, for example: ‘Information and Instruction’, and then offer the rest of the solution. This text helps to get the end-user started and explains the possibilities. In this field you can format the text and include links to documents or websites. If you would like to include an image, you can do this at the risk itself. This description text will not be incorporated into the Plan of Action.
- General approach (to eliminate or reduce the risk):
- Describe what is your general approach to eliminate or (if the risk is not avoidable) reduce the risk. This text will be incorporated into the Plan of Action. For example: ‘Ensure the correct means of Personal Protection are used, according to...’. If the end-user selects this measure it will be copied over to the Plan of Action.
- Specific action(s) required to implement this approach:
- Describe the specific action(s) required to implement this approach (to eliminate or to reduce the risk). For example: ‘Purchase a new machine which produces less noise/dust’.
- Level of expertise and/or requirements needed:
- Describe the level of expertise needed to implement the measure, for instance “common sense (no OSH knowledge required)”, “no specific OSH expertise, but minimum OSH knowledge or training and/or consultation of OSH guidance required”, or “OSH expert”. You can also describe here any other additional requirement (if any). For example: Budgeting, Rraining for Prevention/Safety staff, incorporating this subject in team meetings, etc.
If the end-user selects this measure it will be copied over to the Action plan. End users can also rework the text.
If the end-user selects this measure it will be copied over to the Plan of Action.
Click on ‘Save’ at the bottom of the page.
You can add more standard measures for each risk if needed, by clicking on the button ‘Add Measure’.
Checking your OiRA tool¶
When all the work has been done, i.e. the structure, contents and profile have been completed, you can view your OiRA tool (prior to making it public).
This is done by clicking ‘Preview’ in the ‘Versions drawer’. The online program with your (unpublished) OiRA tool will be shown in a new window.
To view the preview you will have to register to the OiRA tool front-end, the end-user will have to undertake the same action when starting the OiRA tool. After registering, you can complete the OiRA tool as an end-user.
Tip
check as many boxes as possible in the profile, answer the filter questions with ‘Yes’ and the risks with ‘No’. This way you will view all risks and possibilities.
When you discover faults in the preview you can amend these in the OiRA tools generator. Access the Preview again to check your modifications.
Note
The preview is stored in a separate place on the server, it won’t be viewable to the end-users until you publish the OiRA tool.
Implementing your company logo and design into the OiRA tool(s)¶
Straight after logging into the OiRA tools generator, you go to the ‘Settings’ menu (top right).
You will see the following screen:
![]()
Here you can select the two most important colours: a main colour and a supporting colour. You can do this by clicking on the white circle (don’t let go of it!) and dragging this to the colour of your choice. You will immediately see the effect on the logo at the top.
You can also enter the colour code into the Hex-field underneath.
Note
It’s recommended to let a designer determine the colours, who can ensure amongst other things that:
- Appearance is clearly identifiable with the sector.
- Legibility of the text (the OiRA tool end-user will often have to read large portions of text).
- Forms of colour blindness (at 10% of the male population) are taken into account.
The design changes are made to the sector, so they will apply to all OiRA tools created within that sector.
Logo¶
One sector logo can be placed at the top left of the program. If you want to include several logos, you will have to amalgamate these into one image.
![]()
For best results, take a transparent ‘PNG’ file with a height of at least 110 pixels. Larger logos will be resized automatically.
Place the logo at your sector as follows:
Under ‘Logo’ you check the box ‘My logo’, you then click on ‘Browse’ next to ‘Choose file’ to navigate to your own computer. To upload the image and link it to your own OiRA tool, click on –> ‘Save’ at the bottom of the page. You can change the image at a later date if need be, or opt for the standard logo.
Ready? Publish!¶
Once you’ve successfully completed all steps it’s time to publish your OiRA tool.
When you click on ‘Publish’, the OiRA tool will be made available.
![]()
Note
It can take some time to perform this action.
A confirmation will appear in a green bar:
![]()
From now on, the public can view and complete your OiRA tool. If it’s a new OiRA tool we would like to be notified (oira@osha.europa.eu), and will put the link onto our site: www.oiraproject.eu. You don’t have to notify us when you’ve updated the OiRA tool.
Modifying an existing OiRA tool¶
The chapters prior to this are based on creating a new OiRA tool, potentially on the basis of an existing OiRA tool.
Naturally the process of creating an OiRA tool will be followed by managing and maintaining your OiRA tool. In actuality, the exact same considerations, focus points and functionalities apply to this process.
After adapting the OiRA tool you check it with the Preview and then publish it, as described above.
OiRA tool versions¶
The risk assessment tool allows you to store several versions of your OiRA tool and manage these versions. You can manage OiRA tool versions using the Version drawer on the right side of the browser window. It is hidden by default and appears when you hover your mouse over the grey triangle.
A OiRA tool should be revised periodically, usually to adapt it to the latest changes in legislation or other environmental changes. This is supported through versions of a OiRA tool, so that you can keep your old versions while you only publish the one that is most up to date. Updating an existing OiRA tool version usually means to only do minimal changes to adapt it to latest amendments in legislation or new findings. In this case you don’t want to create a new OiRA tool version but instead copy the old one and make amendments.
- Mark a OiRA tool version
- Click the Add version button.
- Provide a Title
- Make sure the correct base revision is selected
- Click the Create button.
Now you have a second OiRA tool version available and you can work on this one. Once you are done, you can publish it and it will replace the existing OiRA tool.
Where can you ask questions?¶
Direct your questions to:
Online Interactive Risk Assessment, EU-OSHA at oira@osha.europa.eu
We wish you all the best with creating your digital OiRA tool.
The EU-OSHA OiRA Team
Technical Information¶
Installation¶
Euphorie is implemented as a set of add-on products for Plone. The requirements for running an Euphorie site are:
- Plone 4.0 or later.
- a SQL database
- two separate virtual hosts
Development files required on the host operating system:
- libffi (Foreign Function Interface library development files)
e.g. on Debian/Ubuntu: sudo apt-get install libffi-dev
Plone instalation¶
To install Euphorie you will first need to download and install Plone. Euphorie requires Plone 3.3 or later. After installing Plone you can install Euphorie. To do this you will need to edit the buildout.cfg file of your Plone installation. This file is normally located in the zinstance directory if your Plone install. Look for an eggs line and add Euphorie there:
[buildout]
...
eggs =
Euphorie
This will instruct Plone to install the Euphorie software. Next you will need to add some zcml entries to load the necessary configuration as well:
[instance]
...
zcml =
euphorie.deployment-meta
euphorie.deployment
euphorie.deployment-overrides
After making these two changes you must (re)run buildout and restart your Zope instance. Navigate to your zinstance directory and type:
$ bin/buildout
$ bin/instance restart
A new Euphorie website option should now appear in the list of add-on products in your Plone control panel. Installing this will setup Euphorie in your site.
For more information on installing add-on products in your Plone site please see the article installing an add-on product in the Plone knowledge base.
Configuration¶
Euphorie uses z3c.appconfig to handle application configuration. All values are stored in the euphorie section. For example:
[euphorie]
client=http://oira.example.com
The available options are:
. table:: configuration options
options Description client URL for the client (see also Virtual hosting. terms-and-conditions Boolean flag indicating it the client must ask users to accept the terms and conditions of the site.
Google analytics¶
Euphorie includes complete Google Analytics support. To enable this you will need to configure the GA account, and optionally the domain name to use. This must be done separately for the CMS and the client.
[tile:footer]
type=analytics
account=UA-111111-1
domain=.example.com
[tile:client-analytics]
type=analytics
account=UA-111111-1
domain=.example.com
SQL database¶
Euphorie uses a SQL database to store information for users of the client. Any SQL database supported by SQLALchemy should work. If you have selected a database you will need to configure it in buildout.cfg. For example if you use postgres you will first need to make sure that the psycopg driver is installed by adding it to the eggs section:
[buildout]
...
eggs =
Euphorie
psycopg2
next you need to configure the database connection information. This requires a somewhat verbose statement in the instance section of buildout.cfg:
[instance]
zcml-additional =
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:db="http://namespaces.zope.org/db">
<include package="z3c.saconfig" file="meta.zcml" />
<db:engine name="session" url="postgres:///euphorie" />
<db:session engine="session" />
</configure>
Make sure The url parameter is correct for the database you want to use. It uses the standard SQLAlchemy connection URI format.
To setup the database you must run buildout and run the database initialisation command:
$ bin/buildout
$ bin/instance initdb
Note
You need Zope 2.12.12 or later to be able to use the initdb command. For earlier Zope versions you need to specify the path for the euphorie.deployment.commands.xmlimport module on the command line.
Virtual hosts¶
Euphorie requires two separate virtual hosts: one host for the client, and one for CMS tasks. It is common to use oira.example.com as hostname for the client and admin.oira.example.com as hostname for the CMS. The standard method for configuring virtual hosting for Plone sites apply here as well. The Plone website has instructions for configuring Plone with Apache and configuring Plone with Enfold Proxy on Windows. Here is an example Apache configuration:
<VirtualHost *:80>
ServerName admin.oira.example.com
ProxyPass / http://localhost:8080/VirtualHostBase/http/admin.oira.example.com:80/Plone/VirtualHostRoot/
# Prevent access to the client using the administrative site.
<Location /client>
order allow, deny
deny form all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName oira.example.com
ProxyPass / http://localhost:8080/VirtualHostBase/http/admin.oira.example.com:80/Plone/client/VirtualHostRoot/
</VirtualHost>
You will also need to configure the URL for the client in the euphorie.ini file:
[euphorie]
client=http://oira.example.com
XML survey format¶
Euphorie supports import and exporting of surveys via a simple XML format. The document used is similar to the structure of a survey as it appears in an Euphorie site. This chapter assumes that you are already familiar with the basic survey structure.
The current XML format is 1.0 and uses an XML namespace of http://xml.simplon.biz/euphorie/survey/1.0.
Note
It is mandatory to declare the XML namespace in your file. Without the namespace Euphorie will not correctly import your data.
sector element¶
The root of the XML file is the sector element.
Element | Mandatory | Description |
---|---|---|
title | No | Title for the sector organisation |
account | No | Account login information for this sector |
contact | No | Contact information for the sector |
logo | No | Inline image with sector logo |
survey | Yes | Survey |
The account, contact and logo elements are only used when a new sector is created from an XML file. This option is only available to site and country managers in Euphorie.
The contact element is a container supports optional name and email elements.
Example¶
<sector xmlns="http://xml.simplon.biz/euphorie/survey/1.0">
<title>Information technology</title>
<account login="coders" password="s3cr3t" />
<contact>
<name>Team lead</name>
<email>leader@example.com</email>
</contact>
<survey>
...
</survey>
</sector>
survey element¶
The survey element defines a survey. It contains all the profile questions, modules, risks, etc. that make up a survey.
Element | Mandatory | Description |
---|---|---|
title | Yes | Title of this survey |
classification-code | No | NACE-based classification code |
language | Yes | Language used in the survey |
evaluation-optional | No | Inline image with sector logo |
profile-question | No | A profile question (can be repeated) |
module | No | A module (can be repeated) |
The language must be specified using the ISO 3166 country code, possibly extended with a two letter alpha code to indicate the region. See the “Language tags in HTML and XML” document from W3C for more information on language codes.
The evaluation-optional element is a boolean and must contain either true or false.
Example¶
<survey>
<title>Software development</title>
<classification-code>A.1.2.3</classification-code>
<language>en</language>
<evaluation-optional>true</evaluation-optional>
<profile-question>
...
</profile-question>
<module>
...
</module>
<module>
...
</module>
</survey>
profile-question element¶
The profile-question element is used to create a profile question. It is very similar to the module element.
Element | Mandatory | Description |
---|---|---|
title | Yes | Title of this profile question |
description | No | Description (HTML) |
question | Yes | Question asked to determine use of profile section in survey. |
module | No | A module (can be repeated) |
risk | No | A risk (can be repeated) |
HTML tags used in the description must be properly escaped or wrapped in a CDATA block.
A profile question must contain either modules or risks; it is an error to use both module and risk elements as direct children of a profile-question. It is of course allowed use modules which themselves contain risk elements.
Example¶
<profile-question>
<title>Mobile access</title>
<question>Do your employees work remotely?</question>
<description><p>Working out of the office can introduce many
new risks that may not be under your direct control.</p>
</description>
<module>
...
</module>
<module>
...
</module>
</profile-question>
module element¶
A module is used to group a number of risks that belong together. This element is very similar to the profile-question element.
Element | Mandatory | Description |
---|---|---|
title | Yes | Title of this profile question |
description | No | Description (HTML) |
question | Yes/No | Question asked to determine if module should be skipped |
solution-direction | Yes | Solution suggestions for action plan e phase (HTML) |
module | No | A module (can be repeated) |
risk | No | A risk (can be repeated) |
image | No | Image for this module |
If a module is optional this can be indicated by setting the optional attribute to true. If this attribute is false or not present a module is assumed to be mandatory. If a module is optional the question element is mandatory.
HTML tags used in the description and solution direction must be properly escaped or wrapped in a CDATA block.
A module must contain either modules or risks; it is an error to use both module and risk elements as direct children of a module. It is of course allowed use modules which themselves contain risk elements.
See the image element for how to specify images.
Example¶
<module optional="yes">
<title>Laptops</title>
<question>Do your employees use laptops?</question>
<description>
<p>Laptops are very common in the modern workplace.</p>
</description>
<risk>
...
</risk>
<risk>
...
</risk>
</module>
risk element¶
The risk element is the workhorse of a survey: it defines a single risk.
Element | Mandatory | Description |
---|---|---|
title | Yes | Title of this profile question |
problem-description | Yes | Problem description shown if risk is present (HTML) |
description | Yes | Description (HTML) |
legal-reference | No | Legal and policy references (HTML) |
evaluation-method | Yes/No | Risk evaluation method |
solutions | No | Container for standard solutions |
image | No | Key image for this risk |
The type of risk is identified with a mandatory type attribute. This can be set to risk, policy or top5. For policy and top-5 risks the evaluation-method and default-* are not used.
For risks of type risk the evaluation-method method element must be present and set to calculated or direct. Default values for the evaluation method can be set via attributes. For risks with a calculated evaluation the attributes are:
- default-probability: one of small, medium or large
- default-frequency: one of almost-never, regular or constant
- default-effect: one of weak, significant or high
The attributes for risks with a direct evaluation method are:
- default-priority: one of low, medium or high
Standard solutions for a risk can be provided in a solutions container.
Up to four images for a risk can be defined by using image element.
Example¶
<risk type="risk">
<title>Are your desks at the right height?</title>
<problem-description>
<p>Not all desks have the correct height.</p>
</problem-description>
<description>
<p>The right height is important to prevent back problems.</p>
</description>
<evaluation-method default-probability="small" default-frequency="regular"
default-effect="high">calculated</evaluation-method>
<solutions>
<solution> ... </solution>
</solutions>
</risk>
solution element¶
Standard solutions for a risk are defined using the solution element
Element | Mandatory | Description |
---|---|---|
description | Yes | Description |
action-plan | No | Text for the action plan |
prevention-plan | No | Text for the prevention plan |
requirements | No | Text for the requirements |
Example¶
<solution>
<description>Use height-adjustable desks</description>
<action-plan>Order height-adjustable desks for desk workers.</action-plan>
</solution>
image element¶
The image element is used in module and risk elements to add extra images. The element has three optional attributes:
- caption
- The caption for the image.
- content-type
- The MIME content type for the image. This is generally one of image/gif, image/png or image/jpeg.
- filename
- The original filename for the image. If content-type is not provided this is used to guess the MIME type.
The contents of the element is the Base64 encoded raw image data.
Example¶
<image content-type="image/gif">R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7</image>
Full example¶
The XML document below demonstrates all elements documented here.
<?xml version="1.0"?>
<sector xmlns="http://xml.simplon.biz/euphorie/survey/1.0">
<title>Information technology</title>
<account login="coders" password="s3cr3t" />
<contact>
<name>Team lead</name>
<email>leader@example.com</email>
</contact>
<survey>
<title>Software development</title>
<classification-code>A.1.2.3</classification-code>
<language>en</language>
<evaluation-optional>true</evaluation-optional>
<profile-question>
<title>Mobile access</title>
<question>List your remote locations</question>
<description><p>Working out of the office can introduce many
new risks that may not be under your direct control.</p>
</description>
<module optional="yes">
<title>Laptops</title>
<question>Do your employees use laptops?</question>
<description>
<p>Laptops are very common in the modern workplace.</p>
</description>
</module>
</profile-question>
<module>
<title>Office environment</title>
<image content-type="image/gif">R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7</image>
<description>
<p>Your employees have to use office equipment every day.&t;/p>
</description>
<solution-direction>
<p>The standard health and safetety guidelines have
many useful tips for improving the office environment.</p>
</solution-direction>
<risk type="risk">
<title>Are your desks at the right height?</title>
<problem-description>
<p>Not all desks have the correct height.</p>
</problem-description>
<description>
<p>The right height is important to prevent back problems.</p>
</description>
<evaluation-method default-probability="small" default-frequency="regular"
default-effect="high">calculated</evaluation-method>
<solutions>
<solution>
<description>Use height-adjustable desks</description>
<action-plan>Order height-adjustable desks for desk workers.</action-plan>
</solution>
</solutions>
</risk>
</module>
</survey>
</sector>
Introduction¶
This document describes the client API for the Euphorie. This API allows interface with the client component of an Euphorie system and can be used to implement a custom frontend. It exposes client users, surveys, surveys sessions and all interactions with them. It does not allow for management of sectors or surveys: this must be done through the standard Euphorie CMS system.
Concepts¶
Country¶
A country is the top level grouping item for survey content. There are different country types to indicate the EU membership status. A country contains zero or more sectors.
Sector¶
A sector is a national organisation for a single sector of industry. A sector can have zero or more surveys.
Survey¶
A survey is a hierarchical questionnaire used identify risks in an environment and build a plan to tackle them.
Session¶
A session is an instance of a survey as created by a user and contains all information provided by the user.
API operations¶
Error responses¶
An error can occur for several reasons: bad data being passed to an API call, Euphorie encountering an internal error, a disk running out of space, etc. If this happens an error-response will be returned. These can be recognized by the type key being set to error.
{
"type": "error",
"message": "Required data missing",
}
Users¶
Create new user¶
Verb | URI | Description |
---|---|---|
POST | /users | Create a new user. |
Using this call you can create a new user. The user information must be supplied in a JSON dictionary:
{
"login": "jane@example.com",
"password": "john",
}
The login key is required. Specifying the password is optional: if a password is given the user can login with that password on the Euphorie client directly. If no password is given access is only possible with the authentication token returned by this call.
The response is a JSON dictionary with details for the newly created account:
{
"token": "e1490672-4015-4572-a036-ba53c45e9509",
"id": 17,
"login": "jane@example.com",
"email": "jane@example.com",
}
If the login is not a valid email address or another account with the same email address already exists an error is returned.
User authentication¶
Verb | URI | Description |
---|---|---|
POST | /users/authenticate | Authenticate a user. |
In order to authenticate you must submit a JSON object with two keys:
- login: the users login (this should be an email address)
- password: the users password
If authentication failed an error response is returned with status code 403. If authentication is succesful a JSON response is returned with an authentication token and a list of existing sessions:
{
"token": "e1490672-4015-4572-a036-ba53c45e9509",
"id": 17,
"login": "jane@example.com",
"email": "jane@example.com",
"sessions": [
{
"id": 1926,
"title": "Hoveniers en Groenvoorzieners",
"created": "2010-09-27T11:35:00Z",
"modified": "2012-04-23T10:29:13Z",
},
{
"id": 23945,
"title": "Vlakglas",
"created": "2010-09-27T11:35:00Z",
"modified": "2012-04-23T10:29:13Z",
},
],
}
The token should be supplied in an X-Euphorie-Token HTTP header for all requests that require authentication.
User details¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid> | Return user information. |
This will return information about the user, including all known sessions. A user can only request information for his own account: any attempt to request information on another user will result in a HTTP 403 error response.
{
"id": 17,
"login": "jane@example.com",
"email": "jane@example.com",
"sessions": [
{
"id": 1926,
"title": "Hoveniers en Groenvoorzieners",
"created": "2010-09-27T11:35:00Z",
"modified": "2012-04-23T10:29:13Z",
},
{
"id": 23945,
"title": "Vlakglas",
"modified": "2011-12-06T15:15:24Z",
},
],
This token should be supplied in an X-Euphorie-Token HTTP header for all requests that require authentication.
Update user¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid> | Update user information. |
This call allows updating the user information. The only key that can be updated is login. Currently the login name and email address are defined to be the same, so updating the login will also update the users email address.
{
"login": "jane@example.com",
"password": "bruce",
}
The response is identical to the user details query.
Survey catalog¶
List countries¶
Verb | URI | Description |
---|---|---|
GET | /surveys | List all defined countries |
Example response:
{
"countries": [
{
"id": "nl",
"title": "The Netherlands",
"type": "eu-member",
},
{
"id": "be",
"title": "Belgium",
"type": "eu-member",
},
}
The possible country types are:
- eu-member: country is a full EU member state
- candidate-eu: candidate member of the EU
- potential-candidate-eu: potentital candidate member of the EU
- efta: member of the European Free Trade Association
- region: generic region, not an individual country
Note that even though a country has a title frontends are encouraged to use use locale-specific name for the country. This can be based on the id, which is guaranteed to be a valid country code.
List sectors¶
Verb | URI | Description |
---|---|---|
GET | /surveys/<country> | List all sectors in a country. |
GET | /surveys/<country>?details | List all sectors in a country including its surveys. |
GET | /surveys/<country>?details&language=<lang> | List all sectors in a country including all surveys in the given language. |
Example response:
{
"id": "nl",
"title": "The Netherlands",
"type": "eu-member",
"sectors": [
{
"id": "bovag",
"title": "BOVAG",
},
{
"id": "bovag",
"title": "BOVAG",
},
}
Example detail response:
{
"id": "nl",
"title": "The Netherlands",
"type": "eu-member",
"sectors": [
{
"id": "stigas",
"title": "STIGAS",
"surveys": [
{
"id": "akkerbouw-en-vollegrondsgroenteteelt",
"title": "Akkerbouw en vollegrondsgroenteteelt",
"language": "nl",
},
{
"id": "bos-en-natuur",
"title": "Bos en natuur",
"language": "nl",
}
,
],
},
{
"id": "dierenartsen",
"title": "Dierenartsen",
"surveys": [
{
"id": "dierenartsen",
"title": "Dierenartsen",
"language": "nl",
},
],
},
}
List sector details¶
Verb | URI | Description |
---|---|---|
GET | /surveys/<country>/<sectorid> | List details of the given sector. |
GET | /surveys/<country>/<sectorid>?language=<lang> | List details of the given sector, only including surveys in the given language. |
Example response:
{
"id": "stigas",
"title": "STIGAS",
"surveys": [
{
"id": "nl/akkerbouw-en-vollegrondsgroenteteelt",
"title": "Akkerbouw en vollegrondsgroenteteelt",
"language": "nl",
},
{
"id": "nl/bos-en-natuur",
"title": "Bos en natuur",
"language": "nl",
},
],
}
Survey interaction¶
The general structure for interacting with a survey is as follows:
- Authenticate the user
- Start a new survey session
- Start identification phase and walk through all identification steps
- Start evaluation phase and walk through all evaluation steps
- Start action plan phase and walk through all action plan steps
Standard response components¶
All responses to API calls involving a survey session follow a standard structure. They include the following keys:
- phase: the current survey phase. This will be one of identification,
- type: an indicator of the response type. This will be one of survey, profile, module, risk, update or error.
- title: the title for the current context. Depending on the context this will be the title of the survey, module or the risk.
- previous-step: a URL pointing to the API location of the previous logical step. If the end start of the survey is reached this key will not be present.
- next-step: a URL pointing to the API location of the next logical step. If the end of the survey is reached this key will not be present.
If a survey was updated since the last interaction of the user with the survey and the structure of the survey has changed a survey-update response is generated. The response type can be identified by type set to update.
{
"type": "update",
"confirm-profile": true,
"next-step": "http://api.instrumenten.rie.nl/users/13/sessions/193714/update",
}
Start a new survey session¶
Verb | URI | Description |
---|---|---|
POST | /users/<userid>/sessions | Start a new survey session. |
To start a new survey session a POST request must be send. This must include a JSON body with the following keys:
- survey: path of the survey. This is a combination of the id of the sector id and survey id, separated by a slash.
- title: title of the new session. This should default to the title of the survey itself.
This requires that the user already authenticated and a suitable authentication token is set in the X-Euphorie-Token header.
Here is an example request:
{
"survey": "nl/stigas/bos-en-natuur",
"title": "Beheer stadspark oost",
}
The response will be a JSON block:
{
"id": "193714",
"survey": "nl/stigas/bos-en-natuur",
"type": "session",
"title": "Beheer stadspark oost",
"introduction": "Introduction text from the survey.",
"next-step: "http://api.instrumenten.rie.nl/users/13/sessions/193714/profile",
}
If the survey has a configurable profile next-step will either to the profile update API. For surveys without profile questions next-step will point directly to the start of the identification phase.
Survey session information¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<survey id> | Get information on survey. |
Note
This is also the API interface to use when resuming an existing survey session.
This function returns almost exactly the same response as the survey session creation method. The only difference is the addition of a modified entry.
{
"id": "193714",
"survey": "nl/stigas/bos-en-natuur",
"type": "session",
"created": "2011-12-06T15:15:24Z",
"modified": "2012-04-23T10:29:13Z",
"title": "The title of the survey",
"introduction": "Introduction text from the survey.",
"next-step: "http://api.instrumenten.rie.nl/users/13/sessions/193714/profile",
}
Remove survey session¶
Verb | URI | Description |
---|---|---|
DELETE | /users/<userid>/sessions/<session id> | Delete a survey session. |
This will delete an existing survey session.
View profile information¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/profile | Get survey profile. |
The response will be a JSON block:
{
"id": 15,
"type": "profile",
"title": "The title of the survey",
"profile": [
{
"id": "1",
"type": "optional",
"question": "Do you have a storeroom?",
"value": false,
},
{
"id": "3",
"type": "repetable",
"question": "Enter your shop locations",
"value": [
"New York",
"Paris",
],
},
],
}
Note
As you can see in the example the response does not have previous-step or next-step information.
The id is set to the survey id. Please note that not all surveys have a profile, so the profile list might be empty.
Update profile¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/profile | Update survey profile. |
The request body must be a JSON block specifying the new profile:
{
"1": false,
"3": [
"New York",
"Paris",
],
}
It is mandatory that all profile questions are included in the request data. If data for a question is missing or invalid an error will be returned.
The response to a profile update returns the same information as the profile information view. The id of the survey may change as a result of a profile update.
{
"id": 15,
"type": "profile",
"title": "The title of the survey",
}
Acknowledge survey update¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/update | Get update information. |
PUT | /users/<userid>/sessions/<session id>/update | Confirm survey update. |
If a survey was updated since the last user interaction and the survey structure was changed (for example a new risk has been added) the user must acknowledge the change and request that his survey session is updated accordingly.
These calls return the same information as the `profile information<View profile information>`_ and update profile calls. The only difference is that the type got a GET query will be set to update.
Start identification phase¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/identification | Request idenfication info. |
This call will return information that is needed to start the identification phase in a survey. A frontend may not need to display any of this information but only use it to find locate the first unanswered question in the survey session, which is given in the next-step key.
{
"type": "session",
"phase": "identification",
"title": "The title of the survey",
"next-step": "http://api.instrumenten.rie.nl/users/13/sessions/1931714/1",
"menu": [ ... ],
}
Start evaluation phase¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/evaluation | Request evaluation info. |
This call will return information that is needed to start the evaluation phase in a survey. A frontend may not need to display any of this information but only use it to find locate the first unanswered evaluation question in the survey session, which is given in the next-step key.
{
"type": "session",
"phase": "evaluation",
"title": "The title of the survey",
"next-step": "http://api.instrumenten.rie.nl/users/13/sessions/1931714/2/5/13",
"menu": [ ... ],
}
Start action plan phase¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/actionplan | Request evaluation info. |
This call will return information that is needed to start the action plan phase in a survey. A frontend may not need to display any of this information but only use it to find locate the first unanswered action plan question in the survey session, which is given in the next-step key.
{
"type": "session",
"phase": "actionplan",
"title": "The title of the survey",
"next-step": "http://api.instrumenten.rie.nl/users/13/sessions/1931714/2/5/13",
"menu": [ ... ],
}
Module information¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/<path> | Request module information |
GET | /users/<userid>/sessions/<session id>/<path>/<phase> | Request module information for the given phase. |
Note
The URL does not indicate if the data at that location is a module or a risk. That means a client must check the returned type information to determine the resource type and act accordingly.
previous-step and next-step can only be returned if the phase is provided. The phase must be one of identification, evaluation or actionplan.
Beyond the standard fields a module will return these extra fields:
Field | Type | Required | |
---|---|---|---|
image | object | No | An image related to the module. This has three keys: original, thumbnail and caption. |
solution-direction | string (HTML) | No | Explanation of how to handle risks in this module. |
optional | boolean | Yes | Flag indicating if this module is optional. |
question | string | No | For optional modules this is the question to ask users to determine if children of this module should be included or skipped. |
skip-children | boolean | No | The users answer to the question. If the question has not been answered yet this is set to null. |
Update module identification data¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/<path>/identification | Update module status |
This call is only useful for optional modules. For normal (ie mandatory) modules it is an error to use this call.
The request must be a JSON block with an answer for the skip-children flag:
{
"skip-children": false,
}
Risk information¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/<path> | Request risk information |
GET | /users/<userid>/sessions/<session id>/<path>/<phase> | Request risk information for the given phase. |
Note
The URL does not indicate if the data at that location is a module or a risk. That means a client must check the returned type information to determine the resource type and act accordingly.
previous-step and next-step can only be returned if the phase is provided. The phase must be one of identification, evaluation or actionplan.
Beyond the standard fields a risk will return these extra fields:
Field | Type | Required | |
---|---|---|---|
module-title | string | Yes | The title of the parent module. |
problem-description | string | Yes | The inverse of the risk title. This should be used instead of the title if risk is known to be present. |
evaluation-method | string | Yes | The evaluation method to use. Will be either direct or calcualated. |
images | list of objects | No | An list of image related to the risk. Each entry is an object with three keys: original, thumbnail and caption. |
standard-solutions | list of objects | No | A list of standard solutions for this risk. Each entry is with four keys: description, action-plan, prevention-plan and requirements. |
legal-reference | string (HTML) | No | A reference to related legal and policy references. |
show-not-applicable | boolean | Yes | Indicates of a not applicable option should be offered in the identification phase. |
present | string | Yes | Indicates if the risk is present. One of yes, no, n/a (only if show-not-applicable is set) or null of not yet known. |
priority | string | Yes | The priority of the risk. One low, medium, high or null if not known yet. |
comment | string | No | A comment added by the user. |
For risks with an evalution option of calculated these extra fields are included:
Field | Type | Required | |
---|---|---|---|
frequency-options | list of objects | Yes | A list of allowed frequency answers. Each entry is an object with two string keys: value and title. |
frequency | integer | Yes | Users answer to the frequency question. |
effect-options | list of objects | Yes | A list of allowed effect answers. Each entry is an object with two string keys: value and title. |
effect | integer | Yes | Users answer to the effect question. |
probability-options | list of objects | Yes | A list of allowed probability answers. Each entry is an object with two string keys: value and title. |
probability | integer | Yes | Users answer to the probability question. |
Update risk identification data¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/<path>/identification | Update risk status |
The request must be a JSON block with a (new) answer for the present flag. The comment can also be updated by including the comment field.
{
"present": "no",
"comment": "Verify with John at the shipping department!",
}
Update risk evaluation data¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/<path>/evaluation | Update risk status |
The possbile values depend on the evaluation method used for the risk. For risks that use a direct evaluation the priority field can be set directly. For risks using a calculated evaluation method the frequency, effect and probability information must be provided.
The comment can also be updated by including the comment field.
{
"frequency": 10,
"effect": 3,
"probability": 7,
}
Update risk action plan data¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/<path>/actionplan | Update risk status |
This method updates the action plan-specific information for a risk. For top-5 and policy risks only the commend field may be updated. For other risks the priority can be set directly as well (but it may be reset of the user re-evaluates the risk).
The possible values for priority are low, medium and high.
{
"comment": "We need to take another look at this",
"priority": "medium",
}
Action plans can be added, updated or deleted through the actionplans container (see below).
List action plans¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/<path>/actionplans | List action plans |
During the action plan phase a user is asked to indicate how he wants to tackle a risk by defining specific actions to be taken. This API call will return a list of all action plans provided by the user.
The response is returned in the form of a JSON object with a action-plans key containing a list of plans.
{
"action-plans": [
{
"id": 15,
"plan": "Clean the workplace",
"prevention": "Educate workers to clean daily.",
"requirements": "Soap, vacuumcleaner",
"responsible": "John Doe",
"budget": 1500,
"planning-start": "2012-04-15",
"planning-end": null,
"reference": "2012a16.5",
},
],
}
See the view action plan call for details on the returned information.
View action plan¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | View action plan details. |
The response is returned in the form of a JSON object containing all known information about an action plan.
{
"type": "actionplan",
"id": 15,
"plan": "Clean the workplace",
"prevention": "Educate workers to clean daily.",
"requirements": "Soap, vacuumcleaner",
"responsible": "John Doe",
"budget": 1500,
"planning-start": "2012-04-15",
"planning-end": null,
"reference": "2012a16.5",
}
The reference key is not part of the standard Euphorie user interface, but can be used by consumers of this API to link a measure to an external system.
Create new action plan¶
Verb | URI | Description |
---|---|---|
POST | /users/<userid>/sessions/<session id>/<path>/actionplans | Add new action plan. |
The request must be a JSON object with data for the action plan to be added. The only required field is plan; all either items are optional.
Field | Type | Required | |
---|---|---|---|
plan | string string | Yes | Description of actions needed to remove the current risk. |
prevention | string | No | Description of what should be done to remove this risk. |
requirements | string | No | A description of the requirements for this plan. |
responsible | string | No | The name of the person or group who is available for this task. |
budget | integer | No | The budget that is available for this task. |
planning-start | string (ISO date) | No | Start date for the plan. |
planning-end | string (ISO date) | No | Completion date for the plan. |
reference | string | No | Reference to external system. |
The reference key is not part of the standard Euphorie user interface, but can be used by consumers of this API to link a measure to an external system.
The response is a JSON object with complete information on the newly created action plan. See the view action plan call for details.
Update action plan¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | Update an action plan. |
The request must be a JSON object with all items that must be updated. Items not included in the request will not be changed.
Delete action plan¶
Verb | URI | Description |
---|---|---|
DELETE | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | Remove an action plan. |
This call will remove an action plan for a risk.
View company details¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<session id>/company | Request company information |
This interface will return information about the company to which this survey session applies. The response is returned in the form of a JSON object containing all known information about the company. The possible fields are:
Field | Type | Required | |
---|---|---|---|
country | string | No | ISO country code. . |
employees | string | No | Indicator of company size in terms of number of employees. One of 1-9, 10-49, 50-249 or 250+. |
conductor | string | No | Role of person who conducted the survey. Must be one of staff, third-party or both. |
referer | string | No | How the user learned about the tool. Must be one of employers-organisation, trade-union, national-public-institution eu-institution health-safety-experts or other. |
Update company details¶
Verb | URI | Description |
---|---|---|
PUT | /users/<userid>/sessions/<session id>/company | Update company details. |
This interface will update the company information for a survey session. See the View company details section for the supported fields.
Identifcation report¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<survey id>/report-identification | Download identifcation report. |
This API call will return the identification report. This is returned as a downloadable RTF file.
Action plan report¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<survey id>/report-actionplan | Download action plan report. |
This API call will return the action plan report. This is returned as a downloadable RTF file.
Action plan timeline report¶
Verb | URI | Description |
---|---|---|
GET | /users/<userid>/sessions/<survey id>/report-timeline | Download action plan timeline. |
This API call will return the action plan timeline. This is returned as a downloadable OpenXML (xlsx) file.
API reference¶
Verb | URI | Description |
---|---|---|
POST | /users | Create a new user. |
POST | /users/authenticate | Authenticate a user. |
GET | /users/<userid> | Return user information. |
PUT | /users/<userid> | Update user information. |
GET | /surveys | List all defined countries |
GET | /surveys/<country> | List all sectors in a country. |
GET | /surveys/<country>?details | List all sectors in a country including its surveys. |
GET | /surveys/<country>?details&language=<lang> | List all sectors in a country including all surveys in the given language. |
GET | /surveys/<country>/<sectorid> | List details of the given sector. |
GET | /surveys/<country>/<sectorid>?language=<lang> | List details of the given sector, only including surveys in the given language. |
POST | /users/<userid>/sessions | Start a new survey session. |
GET | /users/<userid>/sessions/<survey id> | Get information on survey. |
DELETE | /users/<userid>/sessions/<session id> | Delete a survey session. |
GET | /users/<userid>/sessions/<session id>/profile | Get survey profile. |
PUT | /users/<userid>/sessions/<session id>/profile | Update survey profile. |
GET | /users/<userid>/sessions/<session id>/update | Get update information. |
PUT | /users/<userid>/sessions/<session id>/update | Confirm survey update. |
GET | /users/<userid>/sessions/<session id>/identification | Request idenfication info. |
GET | /users/<userid>/sessions/<session id>/evaluation | Request evaluation info. |
GET | /users/<userid>/sessions/<session id>/actionplan | Request evaluation info. |
GET | /users/<userid>/sessions/<session id>/<path> | Request module information |
GET | /users/<userid>/sessions/<session id>/<path>/<phase> | Request module information for the given phase. |
PUT | /users/<userid>/sessions/<session id>/<path>/identification | Update module status |
GET | /users/<userid>/sessions/<session id>/<path> | Request risk information |
GET | /users/<userid>/sessions/<session id>/<path>/<phase> | Request risk information for the given phase. |
PUT | /users/<userid>/sessions/<session id>/<path>/identification | Update risk status |
PUT | /users/<userid>/sessions/<session id>/<path>/evaluation | Update risk status |
PUT | /users/<userid>/sessions/<session id>/<path>/actionplan | Update risk status |
GET | /users/<userid>/sessions/<session id>/<path>/actionplans | List action plans |
GET | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | View action plan details. |
POST | /users/<userid>/sessions/<session id>/<path>/actionplans | Add new action plan. |
PUT | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | Update an action plan. |
DELETE | /users/<userid>/sessions/<session id>/<path>/actionplans/<id> | Remove an action plan. |
GET | /users/<userid>/sessions/<session id>/company | Request company information |
PUT | /users/<userid>/sessions/<session id>/company | Update company details. |
GET | /users/<userid>/sessions/<survey id>/report-identification | Download identifcation report. |
GET | /users/<userid>/sessions/<survey id>/report-actionplan | Download action plan report. |
GET | /users/<userid>/sessions/<survey id>/report-timeline | Download action plan timeline. |
Introduction¶
This document describes the content management API for the Euphorie. This API allows interface with the CMS component of an Euphorie system and can be used to implement manage backend accounts.
Concepts¶
Country¶
A country is the top level grouping item for survey content. There are different country types to indicate the EU membership status. A country contains zero or more sectors.
Sector¶
A sector is a national organisation for a single sector of industry.
API operations¶
Error responses¶
An error can occur for several reasons: bad data being passed to an API call, Euphorie encountering an internal error, a disk running out of space, etc. If this happens an error-response will be returned. These can be recognized by the type key being set to error.
{
"type": "error",
"message": "Required data missing",
}
Authentication¶
Verb | URI | Description |
---|---|---|
POST | /authenticate | Authenticate a user. |
In order to authenticate you must submit a JSON object with two keys:
- login: the users login name
- password: the users password
If authentication failed an error response is returned with status code 403. If authentication is succesful a JSON response is returned with an authentication token and basic information on the user:
{
"token": "e1490672-4015-4572-a036-ba53c45e9509",
"login": "security",
"title": "UK security sector",
"url": "http://api.oira.com/countries/uk/sectors/security",
}
The token should be supplied in an X-Euphorie-Token HTTP header for all requests that require authentication.
Country management¶
List countries¶
Verb | URI | Description |
---|---|---|
GET | /countries | List all defined countries. |
Example response:
{
"countries": [
{
"id": "nl",
"title": "The Netherlands",
"country-type": "eu-member",
},
{
"id": "be",
"title": "Belgium",
"country-type": "eu-member",
},
}
This call will return information on all defined countries.
Country information¶
Verb | URI | Description |
---|---|---|
GET | /countries/<id> | Request country information. |
GET | /countries/<id>?details | Request country information including all sectors and country managers. |
Example normal response:
{
"type": "country",
"id": "nl",
"title": "The Netherlands",
"country-type": "eu-member",
}
Example detail response:
{
"type": "country",
"id": "nl",
"title": "The Netherlands",
"country-type": "eu-member",
"sectors": [
...
],
"managers": [
...
],
}
The returned fields are:
Field | Type | Required | |
---|---|---|---|
type | string | Yes | Always set to country. |
id | string | Yes | The country code. This must be the offical country code unless this is a generic region. |
title | string | No | The English title of the country. If not provided the name will be looked up based on the provided id. |
country-type | string | Yes | The country type. |
The possible country types are:
- eu-member: country is a full EU member state
- candidate-eu: candidate member of the EU
- potential-candidate-eu: potentital candidate member of the EU
- efta: member of the European Free Trade Association
- region: generic region, not an individual country
Note that even though a country has a title frontends are encouraged to use use locale-specific name for the country based on the id field.
Add a new country¶
Verb | URI | Description |
---|---|---|
POST | /countries | Add a new country. |
The request body must be a JSON block specifying the new profile:
{
"id": "nl",
"title": "The Netherlands",
"country-type": "eu-member",
}
This will return the country using the same format as the GET call.
Update country information¶
Verb | URI | Description |
---|---|---|
PUT | /countries/<id> | Update country information. |
The request body must be a JSON block specifying the changed fields:
{
"title": "The Netherlands",
"country-type": "eu-member",
}
Updating the id field is not allowed.
Country managers¶
List country managers¶
Verb | URI | Description |
---|---|---|
GET | /countries/<country id>/managers | List all country managers |
Example response:
{
"managers": [
{
"id": "steunpunt-rie",
"title": "Steuntpunt RI&E",
"email": "steunpunt@example.com",
"login": "steunpunt",
"locked": false,
},
],
}
Country manager information¶
Verb | URI | Description |
---|---|---|
GET | /countries/<country id>/managers/<id> | Request manager information. |
Example response:
{
"type": "countrymanager",
"id": "steunpunt-rie",
"title": "Steuntpunt RI&E",
"email": "steunpunt@example.com",
"login": "steunpunt",
"locked": false,
}
The returned fields are:
Field | Type | Required | |
---|---|---|---|
type | string | Yes | Always set to countrymanager. |
id | string | Yes | Identifier for the manager. |
title | string | Yes | The full name of the country manager. |
string | Yes | Contact email address. | |
login | string | Yes | Login name for the account. |
locked | boolean | No | Indicates if the account is locked. |
Add new country manager¶
Verb | URI | Description |
---|---|---|
POST | /countries/<country id>/managers | Add a new country manager. |
The request body must be a JSON block with the necessary information:
{
"title": "Steuntpunt RI&E",
"email": "steunpunt@example.com",
"login": "steunpunt",
"locked": false,
}
Please note that the id field can not be set manually: it will be generated automatically.
This will return the country manager information in the same format as returned by the GET call.
Update country manager information¶
Verb | URI | Description |
---|---|---|
PUT | /countries/<country id>/managers/<id> | Update country manager information. |
The request body must be a JSON block with the data that should be updated:
{
"locked": true,
}
Please note that the id and login fields can not be modified.
This will return the country manager information in the same format as returned by the GET call.
Delete country manager¶
Verb | URI | Description |
---|---|---|
DELETE | /countries/<country id>/managers/<id> | Delete a country manager. |
Sector organisations¶
List sectors¶
Verb | URI | Description |
---|---|---|
GET | /countries/<country id>/sectors | List all sectors. |
Example response:
{
"sectors": [
{
"id": "security",
"title": "Security",
"login": "security",
"locked": false,
},
],
}
Sector information¶
Verb | URI | Description |
---|---|---|
GET | /countries/<country id>/sectors/<id> | Request sector information. |
Example response:
{
"type": "sector",
"id": "security",
"title": "Security",
"login": "security",
"locked": false,
"contact": {
"name": "John Smith",
"email": "smith@example.com",
},
}
The returned fields are:
Field | Type | Required | |
---|---|---|---|
type | string | Yes | Always set to sector. |
id | string | Yes | Identifier for the sector. |
title | string | Yes | The full name of the sector |
login | string | Yes | Login name for the account. |
locked | boolean | No | Indicates if the account is locked. |
contact | object | Yes | Object specifying a contact for the sector organisation. This must have the following keys: name and email. |
Add new sector organisation¶
Verb | URI | Description |
---|---|---|
POST | /countries/<country id>/sectors | Add a new sector. |
The request body must be a JSON block with the necessary information:
{
"title": "Security",
"login": "security",
"locked": false,
"contact": {
"name": "John Smith",
"email": "smith@example.com",
},
}
Please note that the id field can not be set manually: it will be generated automatically.
This will return the sector information in the same format as returned by the GET call.
Update sector information¶
Verb | URI | Description |
---|---|---|
PUT | /countries/<country id>/sectors/<id> | Update sector information. |
The request body must be a JSON block with the data that should be updated:
{
"locked": true,
}
Please note that the id and login fields can not be modified.
This will return the country manager information in the same format as returned by the GET call.
Delete sector organisation¶
Verb | URI | Description |
---|---|---|
DELETE | /countries/<country id>/sectors/<id> | Delete a sector. |
API reference¶
Verb | URI | Description |
---|---|---|
POST | /authenticate | Authenticate a user. |
GET | /countries | List all defined countries. |
GET | /countries/<id> | Request country information. |
GET | /countries/<id>?details | Request country information including all sectors and country managers. |
POST | /countries | Add a new country. |
PUT | /countries/<id> | Update country information. |
GET | /countries/<country id>/managers | List all country managers |
GET | /countries/<country id>/managers/<id> | Request manager information. |
POST | /countries/<country id>/managers | Add a new country manager. |
PUT | /countries/<country id>/managers/<id> | Update country manager information. |
DELETE | /countries/<country id>/managers/<id> | Delete a country manager. |
GET | /countries/<country id>/sectors | List all sectors. |
GET | /countries/<country id>/sectors/<id> | Request sector information. |
POST | /countries/<country id>/sectors | Add a new sector. |
PUT | /countries/<country id>/sectors/<id> | Update sector information. |
DELETE | /countries/<country id>/sectors/<id> | Delete a sector. |
Implementation¶
Content managent¶
tralala
Plone modifications¶
Reducing Plone behaviour¶
Plone is a very rich Content Management System. Euphorie only requires a small subset of Plone’s features; all the extra features Plone offers add extra complexity to the user interface or have a possible performance impact.
This euphorie.deployment package disables various parts of Plone to make it better fit the Euphorie requirements:
- content rules are disabled
- automatic creation of redirects for moved content are disabled
- the sharing page is disabled
Login behaviour¶
Euphorie modifies the login behaviour of Plone a little bit: if a user has a home folder in the site he will be redirected to that folder after logging. This is used for sectors accounts: the home folder location in the portal_membership tool is set to the sectors object in the site root, which is where all sectors live. This means that if a sector account logs in he will automatically be redirected to his own home.
Content types¶
A survey is a hierarchical questionnaire. This maps very well on the hierarchical structure used for Plone content, which allows us to reuse the standard Plone interface for content editing.
Technology¶
Standard Plone content types are based on Archetypes. These are very flexible and well supported, but have some downsides that make them undesirable for Euphorie:
- Archetypes objects are large, which makes them slow to load from the ZODB, and reduces cache efficiency.
- Archetypes does not handle unicode text very well; while it stores data in unicode its API always uses encoded strings.
- Archetypes has lots of unneeded complexity and few tests, which can make debugging problems or extending it very hard.
For these reasons the implementation is based on Dexterity instead. Dexterity offers light weight objects, a clean design and has excellent test coverage, making it an excellent basis.
Security¶
The four roles¶
Euphorie recognizes four different types of users:
- Manage users. These are commonly SYSLAB staff members. Managers have full access to the entire site.
- Country managers. These are responsible for managing all sectors and country-specific content in the site.
- Sector users. Every sector is an account, and has full edit and publish access to itself and all data inside its sector.
- Anonymous visitors. These have no access at all.
Each user type is registered as a role in Plone. The standard Plone roles (Member, Reviewer, Reader, Editor and Contributor) are not used in Euphorie. The Sector role is special: unlike the other roles it is managed as a local role in a sector object.
Workflows¶
Data inside a euphorie.content.sector.Sector object has no workflow; all permissions are inherited from the Sector object itself. These are managed via a single-state sector workflow.
This approach has two advantages: it centralizes the management of permissions in a single location and workflow, and it makes it possible for the online client to copy the survey to another location with diffferent security settings, without having to update permissions inside the survey.
Content types¶
Sector¶
A sector is a sector of industry in a specific country. Sector objects act both as a container for all content for a sector organisation and as a Plone account object.
Survey group¶
A survey group is a container which can contain multiple versions of a survey. It only defines fields which have to be the same for all versions of a survey.
The title of a survey group is shown to users in the client. The title of surveys themselves are only used internally as a version name.
Each survey group is associate with a country specificy classification code, which uniquely identifes the type of industry the survey is targeted to. This code is based on the revision 2 of the NACE code, possibly extended with extra digits.
Field name | Description |
---|---|
title | Survey group title, shown to users in the client. |
classification_code | NACE-based classification code. |
language | Language used in the survey. |
Survey¶
The survey object is the root of a survey.
All content inside a sector has a unique id. This id is unique within the sector, not globally.
Content in a survey can only be deleted if the survey has not been published yet. This is managed via the survey workflow, which controls the Zope2 Delete objects permission. There is an exception for site managers (users with the Manager role): they are always allowed to delete objects.
Module¶
Questions in a survey can be grouped in modules. A module is normally used for grouping. An module can be marked as being optional.
Attention
Optional modules are a new feature in Euphorie. In the RIE system this was implemented by a special question type.
Field name | Description |
---|---|
title | Module title, shown in the navigation tree. |
description | Description, shown in identication and evaluation phases. |
solution_direction | Description text for solution directions for risks in this module. Shown during the action plan phase. |
optional | Indicates of this module is optional. |
Risk¶
The question content type is used for all questions asked (except profile questions). There are two major question types: filter questons and risks. A filter question can be used to make (part of) a module optional: if the user answers yes to a filter question all further elements in the same module will be skipped.
Field name | Description |
---|---|
title | Risk statement, shown in inventorisation phase. Also shown during evaluation and action plan phases if no problem_description is provided. |
description | Description, shown identification phase. Also shown during evaluation and action plan phases if no problem_description is provided. |
risk_type | The risk type (risk, policy or top5). |
show_notapplicable | Indicate if a ‘’not applicable’’ option should given in addition to the standard ‘’yes’’ and ‘’no’’ answers. |
evaluation_method | The evaluation method used for a risk. |
default_probability | Default probability for calculated evaluation. |
default_frequency | Default frequency for calculated evaluation. |
default_effect | Default effect for calculated evaluation. |
image | An image to show with this question. |
links | A list of URLs pointing to sites with more information. Every link has both a URL and a title. |
legal_reference | Text explaining related law and policies. |
skip_condition | An expression which determins if this question should be skipped. |
Attention
In the RIE system two fields are used for legal reference: a reference code for an article of law, and explanatory text.
A risk can have standard solutions. These are managed as children of the risk object.
There are three different question types:
- risk
- A possible risk.
- top5
- A top-5 risk. These risks do not have to be evaluated and are always considered to be present.
- policy
- A question related to health & safety policies.
Attention
The RIE system has a fourth type: filter. This has been replaces by the optional flag in a module.
A risk can be evaluated using several different mechanisms:
- direct
- Direct evaluation asks the user for the evaluation.
- calculated
- Users are asked for the probability, frequency and effect. The answers are multiplied to determine the evaluation.
- none
- No evaluation is necessary.
Solution¶
A risk can have standard solutions associated with it. These solutions can be used as a base for a new action plan measure.
Field name | Description |
---|---|
title | Title for the solution. |
solution | The solution text. This will be copied to the measure field of a new action plan measure. |
links | A list of links to pages with extra information. |
Survey publication¶
Publication of surveys is handled via the survey workflow. The workflow itself is very simple: it manages the Delete objects permission, prevent deletion of content in published surveys.
Extra behaviour is added via workflow event handlers:
- euphorie.content.surveygroup.handleSurveyPublish() updates the currently published survey instance variable on the survey group.
- euphorie.client.publish.handleSurveyPublish() copies the survey to the client.
- euphorie.content.survey.handleSurevyPublish() archives the published version.
Online client¶
euphorie.client contains client for the Euphorie surveys. The client is the web interface normal users interact with. It uses the content types from the euphorie.content package, combined with a SQL database to store session data.
This packages also contains the logic to copy a survey from the content management section of the Plone site to a special client area. This action is called publication of a survey.
Secure cookies¶
The client uses cookies to track account logins and active survey sessions. Both uses are security sensitive, which means the cookies should be authenticated before they can be trusted.
To do this we a simple signing system for both cookies. An account gets a new secret property which contains random data. This will be used to create a signature for cookie values. On each login a new secret is generated to prevent replay attacks.
See euphorie.client.cookie for the relevant API methods.
Workflow¶
A user must go through several phases in a survey:
- preparation: determine the profile of the organisation.
- identification: determine which risks are present.
- evaluation: prioritise all present risks.
- action plan: provide the steps that will be taken to remove the risks
- reporting: create reports with all collected information
Preparation¶
The preparation phase starts with an introduction screen explaining how the survey tool works. If a sector provided extra introductionary text that will also be included. On this screen the user can also give a title to this survey.
If the survey has any profile questions they will all be shown in a single screen, allowing the user to indicate the structure of his organisation. If no (non-deprecated) profile questions are found this option is skipped.
identification¶
During the identification phase all possible risks are shown, along with any extra information such as legal references, images or explanatory text. The user can indicate of a risk is present, or not applicable.
The identification phase starts with an introduction page with a brief explanation and an option to print a list of all questions.
Evaluation¶
During the evaluation phase the priority for possible risks, as determined during the identification phase, is determined. There are three possible ways to determine the priority:
- policy and top-5 risks will have priority, and do not need to be evaluated
- for risks with a direct priority the user can immediately select the priority
- for risks with a calculated priority the risk is determined using the effect, frequency and probability of a risk. The values of those three factors, as determined by the euphorie.content.question.IQuestion interface, are multiplied. If the resulting value is below or equal to 15 the priority is low, if the value is between 15 and 50 (included) the priority is high, and values above 50 indicate a high priority.
Note
Changing the effect/frequency/probability factors here will reset the priority, even if the user has changed it during the action plan phase.
The evaluation phase may be skipped by users if allowed.
Action plan¶
During the action plan phase users indicate what they plan to do to prevent a risk from (re)occurring. This can be done by selecting pre-defined solutions (if known) or adding their own solutions.
A priority also has to be assigned. The default priority is determined by the evaluation.
If a module has a solution direction text this will be shown during when the user enters a module. This makes the action plan phase the only phase during which a module will present information to the user.
Localisation¶
Fill in here.
The start screen shows a list of all supported countries and languages: For each country its flag is shown, with a list of languages for that country below it. The countries and languages are sorted by their ISO codes; this is the only neutral data available and uses a single character set, making it easily sortable.
Session handling¶
The state of a survey needs to be remembered. The state consists of a lot of data: the profile, evaluation, inventory, action plan answers and company details. This is too much information to manage via form variables or HTTP cookies so we need to use a server-side storage mechanism. The Zope session mechanism is known to quickly generate a lot of conflicts, which makes it unsuitable (the faster product improves things a lot though). An extra requirement to consider is that we expect to need to handle persistent sessions in the future. In light of these considerations the session system is based on a SQL database.
Survey tree¶
A survey starts with all profile questions. Once these have been answered a tree is generated for all items that are exposed to the user via the survey user interface. This also takes care of profile questions: modules are skipped or repeated as necessary based on the profile question answers.
This tree is stored in a mixed path enumeration (also called materialized tree) and adjancency list model. This combination of models allows for fast location of tree nodes during traversal as well as an efficient way to walk up the tree to find parent nodes.
As path a simple numbering scheme is used, which makes it possible to conver the path into a dotted numbering scheme in the user interface. For example this survey:
1. Do you have a mobile shop?
1.1 Is it serviced annually?
1.2 Is the tire pressured checked every week?
2. Are you open nights?
..
..
will have ‘‘001’‘, ‘‘001001’‘, ‘‘001002’’ and ‘‘002’’ as paths in the database.
Each survey has a session record in the database which holds data for the session ans is located using a HTTP cookie. Each session has its own tree with module and question information.
Schema structure¶
Session information is stored in a series of SQL tables.
Table | Description |
---|---|
account | Registered users. |
tree | Tree node data. |
session | User sessions. Each session is a tree root. |
profile_answer | An answer to a profile question. |
module | A module. |
risk | Answeres for a risk (for all phases). |
action_plan | Action plan items for questions. |
The session table has a modification timestamp which is used to remove stale sessions. This timestamp is also updated when the session is resumed. This guarantees that a session does not expire if a user looks at an earlier session but does not make any changes.
For performance reasons every row in the tree table lists the title for the item and a pointer to the root session. This makes it possible to build a tree without having to load any objects from the ZODB.
URL handling¶
It is important to have sensible URLs for every item in a survey. This means it is not possible to use the ZODB structure for URLs since: the ZODB structure does not map directly to the users unique survey tree due to profile questions influencing the tree contents, and every item must have separate URLs for the identification, evaluation and action plan phase.
To solve this a special publish traverser for the ZODB Survey object is used. This traverser is only triggered when using the IClientSkinLayer so as not to influence the normal content editing activities.
A second trigger for the traverser is one of the terms ‘’identification’‘, ‘’evaluation’’ and ‘’actionplan’‘. If one of these is the first path component the request is decorated with an extra skin layer indicating the current phase.
Next the traverse will look for numeric path elements that could reflect nodes in the survey tree as stored in the SQL database. It will look for the longest traversal path that can be found in the database, remove that from the traversal stack and build an acquisition chain that reflects the path with the SQLAlchemy model instance as tail node. This allows Zope2 to use SQL objects as normal data objects on which you can call absolute_url(), getPhysicalPath() and from where further traversal to find views or other objects can happen.
User management¶
Users must register before they can start a survey. Registration is used to provide a persistent state for a user, allowing them to stop working on a survey and continue it at a later point in time, or to manage multiple surveys at the same time.
Attention
The old RIE system did not use registration, but required users to manually download and upload a file with status information. This has proven to be confusing for users.
Registration is very simple: users only need to provide a preferred account name name and a password. No identifying information is required. Users can opt to provide an email address, which will only be used for password reminders.
Euphorie accounts are stored in the session SQL database. They are also exposed as very minimal Plone accounts: they do not get the standard Member role but a new EuphorieUser role.
The standard mutable_properties PAS plugin should be disabled in an Euphorie site since it can be a big performance bottleneck. Euphorie has two types of users, neither of which need the mutable properties plugin: Euphorie sector accounts provide their own properties directly and Euphorie users will never have any properties beyond their login name and password. Since we know that for Euphorie users the login name is their email address we do not need to have a separate email property.
Code reference¶
euphorie.content.behaviour¶
The euphorie.content.behaviour package implements variours behaviours of content in the site. Some of these are implemented using plone.behavior and configured using the FTI, others are implemented using more traditional patterns.
euphorie.content.risk¶
Views¶
Change History¶
Changelog¶
7.0.4 - April 1, 2015¶
Feature changes¶
- More IS translation changes #11552
Bugfixes¶
- When a survey gets imported from XML, make sure that the ‘introduction’ text gets imported too. Fixes #105
- XML export: the node for classification_code of a Survey had a typo that prevented correct import of that value
7.0.2 - February 12, 2015¶
Bugfixes¶
- Terms & Conditions: Change location, due to move of servers (OSHA #10858)
- Fix a bug in delete confirmation so that double quotes (which can come from translations) no longer break the Javascript (OSHA #10925)
- Translations changes in Icelandic (OSHA #11294)
7.0.0 - August 29, 2014¶
Upgrade notes¶
This release is dependent on Plone 4.3 and higher.
This release updates the profile version. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile.
Feature changes¶
- Add and enforce a password policy (OSHA #10286)
- When a sector our country manager is created, the new user receives an e-mail for setting the password; the admin no longer chooses the password initially
- On existing country and sector manager accounts, an admin can still manually set a new password.
- Lock users out after a certain amount of failed login attempts. Configured with the max_login_attempts setting in euphorie.ini. Set to 0 to disable completely. (OSHA #10286)
6.3.4 - July 07, 2014¶
Feature changes¶
- Differentiate between the CSS classes given to the active node in the navigation tree, and its parent. (OSHA #9953)
- CMS user’s passwords are now hashed. (OSHA #10285)
Bugfixes¶
- Translation corrections in IT (OSHA #10039 #10370)
6.3.3 - May 23, 2014¶
Feature changes¶
- Add two more questions to the company survey (OSHA #9281)
- Customise the name of “Macedonia” to “F.Y.R. Macedonia” due to political sensitivities (OSHA #10100)
- Translation correntions in SL (OSHA #10059 #9589)
6.3.2 - May 2, 2014¶
Feature changes¶
- For the left-hand navigation in the OSHA styles, make the current menu item white and bolder (OSHA #8472)
Bugfixes¶
- Translation corrections in SL (OSHA #9584)
- Translation corrections in FI (OSHA #9806)
- Translation corrections in BG (OSHA #9790)
6.3.1 - March 2, 2014¶
Bugfixes¶
- Added missing i18n statement around “Official OiRA logo” in the settings form
- Translation corrections in IS (OSHA #9345)
- Translation corrections in LT (OSHA #9510)
- Translation corrections in BG (OSHA #9324)
- Fix logo positioning on homepage in mobile view
6.3.0 - January 14, 2014¶
Feature changes¶
- Track clicks on externals links using an external-link event in Google Analytics.
- Track report downloads as a virtual pageview in Google Analytics.
- Add four new virtual page views for Google Analytics in the client:
- .../login/success - used after successfull login
- /<country>/register/success - used after successfully registering a new account.
- /<country>/<sector>/<survey>/start - used when starting a new survey session.
- /<country>/<sector>/<survey>/resume - used when resuming a survey session.
Bugfixes¶
- Various styling improvements for the online client on mobile devices.
- Remove default Google Analytics account information.
- Remove the Status button on the help page if the user is not in a survey session.
6.2.1 - January 02, 2014¶
Bugfixes¶
- Fix display of not-found page when accessing acquisitioned content from outside the client in the client. This fixes issue 99.
- In the client, write the current language as class into the body tag, so that language specific CSS rules can be applied.
- The default_priority field could overwrite the fixed_priority field when saving a Risk from the edit form.
- Improvements for the mobile view
- Re-ran yui-compression for the CSS files, since some changes had not made it in previously
6.2 - December 19, 2013¶
Bugfixes¶
- Restore add buttons for non-survey content in the content editor.
- Fix error in generation of RTF reports for sessions with a depth larger than 4. This fixes `TNO ticket 245 <https://code.simplon.biz/tracker/tno-euphorie/ticket/245`_.
- Move register link up in the frontpage to make it more noticable: too many people missed it in its original position, leading to support requests. This fixes `TNO ticket 247 <https://code.simplon.biz/tracker/tno-euphorie/ticket/247`_.
- New translations in Italian (IT) and Icelandic (IS). OSHA #8434
- New translations in Maltese (MT). OSHA #8435
- Translation fixes in PT. OSHA #9193
6.1.3 - November 15, 2013¶
Bugfixes¶
- Added missing English text for the “outdated browser” warning. OSHA #9094
- Add missing import statement. This caused a site error when trying to resume an existing session in the client.
6.1.2 - October 31, 2013¶
Bugfixes¶
- If a survey title was modified through the survey version edit form the title was not updated in the index, which caused the old title to still be shown in the navigation tree.
6.1 - October 30, 2013¶
Feature changes¶
- Add a new fixed evaluation method for risks. If this is used the sector organisation can set the risk priority directly, and the risk will be skipped during evaluation.
- Modify handling of profile questions in the client: include the profile question in the survey tree to make the naming more intuitive for users.
- Add a new obsolete flag to survey groups. When a survey with this flag is set is published it will be put into a new group of obsolete surveys in the client. This addresses part of TNO ticket 200.
- Make it possible to edit the survey group title from a survey edit screen. This addresses part of TNO ticket 200.
- Add page number to RTF reports. This fixes TNO ticket 241.
- For OSHA, show the legend only in the identification phase.
Bugfixes¶
- Security fix: modify client to always check if a survey session belongs to the current user.
- Fixed a typo in the client splash page. OSHA ticket #7261.
- Translation updates:
- Add Bulgarian help headers. OSHA ticket #7317.
- Add Portuguese translations of the splash page. OSHA ticket #7870.
- Translate label_keep_logged_in on the client login page. OSHA ticket #7823.
- Several minor translation fixes and updates. OSHA tickets #7830, #7766, #7810, #7829 and #8369.
- Kosovo, Montenegro and Republic of Serbia are now translatable, and add bulgarian translations. OSHA ticket #7808.
- Greek translation fixes. OSHA ticket #7704
- Portugese translation fixes. OSHA ticket #7934
- Applied new translations in 15 languages. OSHA tickets #7938, #8190, #8780
- Added MIT Licensed script to display browser warning so that we can support translations. This addresses part of OSHA ticket 7847 and `OSHA ticket 7929 <https://projects.syslab.com/issues/7929`_.
- Added missing CA translations in the “ancient browser” warnings. This fixes OSHA ticket 8418.
6.0.1 - June 3, 2013¶
- Changed tiles/AddBar to explicitly list every “Add” button with full label. Needed for languages where the object of “add” needs a different word form than the nominative case, such as Lithuanian.
- Include the top-level module in the downloadble action plan spreadsheet.
- Ensure that end date cannot be before start date in the action plan.
6.0 - May 1, 2013¶
- Use scheme-less URLs for fonts so they always use the same scheme as the current page.
- Update Dutch translations.
6.0rc3 - April 23, 2013¶
- Update Dutch, Latvian, Lithuanian and Finnish translations.
- Use https in stylesheets (for google fonts).
- Added Hungarian translations
6.0rc2 - April 15, 2013¶
- Added Hungarian translations
- Expand OiRA acronym in header on login page (agency #7262)
6.0rc1 - April 3, 2013¶
This is a release candidate with incomplete translations.
Bugfixes¶
- Display risk information in the client evaluation page as a message so links are readable. This fixes ticket 93.
- Include modules without a description in the navigation tree. This fixes TNO ticket 236.
- Fix a typo in the Dutch translations. This fixes TNO ticket 237.
- Show titles for profile questions in the right order in the profile form.
- Fixed the wrong translations for the timeline xls export priorities
- Fix header styling in the client. Added a body > in sector style before the h1 so that it is more specific
- Exchanged translation labels for priority names to match the translations in the action plan view. The timeline msgids seem to be fuzzy: the translation for low and high is translated as “default”
6.0b4 - March 19, 2013¶
This is a beta release with incomplete translations.
Bugfixes¶
- Add translations in fr, el, lv for “Keep me logged in”. Fixes #6846
- Require a newer NuPlone[r] version to fix CMS add and edit forms.
- Correct the navigation tree legend: the description for answered risks was not correct.
- Fixed IE9 navtree rendering bug.
- updated the text for the new login splash screen
6.0b2 - March 5, 2013¶
This is a beta release with incomplete translations.
Bugfixes¶
- Correctly initialise a newly added measure for a risk. This fixes ticket 86.
- Prevent users from entering non-digits in number input fields. This fixes part of ticket 84.
- Fix display of error messages in the risk action plan form. This fixes part of ticket 84.
- Always order the measures for a risk based on moment of creation. This prevents unexpected ordering changes.
- Renamed a default translation in content/help.py`` that lead to a duplication in the pot file
- Fix bad translations for column headers in the action plan timeline.
6.0b1 - February 15, 2013¶
Upgrade notes¶
This is a beta release with incomplete translations.
Python 2.7 is now fully supported and the recommended Python version to use. Python 2.6 is still supported.
zc.buildout has been updated to version 2. You will need to re-bootstrap your buildout when upgrading to Euphorie 6.
This release updates the profile version to 13. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
This release also updates the used Plone version to 4.2.4. You are advised to perform the Plone migrations through the Zope Management Interface (ZMI).
The Euphorie configuration file (etc/euphorie.ini in the standard buildout) no longer needs to include the complete configuration. You now only need to specify details that are specific to your deployment such as the Google Analytics accounts and client URL.
Feature changes¶
- Add a small FAQ to the login page.
- IE 6 is no longer supported. IE 7 is only provisionally supported: it might work, but any bugs will no longer be fixed.
- Add a legend to the client navigation tree to explain the used icons. This fixes ticket 51.
- Optional profile questions have been replaced with option modules. Previous versions supported both, and they did almost exactly the same thing which was a source of consution. All existing optional profile questions will automatically be converted to optional modules as part of the upgrade.
- Added translations for Finnish (FI) and Lithuanian (LT)
- Updated Bulgarian translations.
- Include a default application configuration file.
Bugfixes¶
- Correctly show the high-priority notice for risks in the online view of the action plan report.
- Start using the Patterns library for the client user interface.
- Use consistent styling of form error messages. This fixes tickets 45 and 46.
- Do render bold text as white on a light background in the risk action plan page for the client. This fixes ticket 75.
- Use a custom icon font to display the warning-icon in client reports. This helps for browsers/computers that do not include the unicode warning symbol in their font. This fixes ticket 61.
- Change default font for page titles in the client to a font which does not have problems with Greek characters. This fixes ticket 74.
- Dutch Translation: Fix bad column header in timeline report.
- Correct rendering of strong text in the client to make sure it is easy to read. This fixes ticket 65 and TNO ticket 232.
- Fix several positioning bugs in the client user interface. This fixes tickets 52 and 63
- Make sure pasted content does not violate any internal rules. It used to be possible to do things like mix risks and modules in a single container using copy & paste.
- Upgrade to zc.buildout 2, dexterity 1.2.1 and Plone 4.2.4.
- Registering from within a country would incorrectly skip terms and conditions page.
- Datepicker didn’t appear on newly created measures.
- Fix compatibility with plone.app.search.
5.1.1 - January 9, 2013¶
Feature changes¶
- Remove country headings and instead show countries alphabetically (with EU at the top).
Bugfixes¶
5.1 - December 12, 2012¶
Upgrade notes¶
This release changes the cookie format used to authenticate users in the client. As a result all currently logged in users will need to login again after upgrading to this version.
Feature changes¶
- Sort sessions on client start screen so most recently modified sessions are listed first.
- Display the survey introduction text on the survey view page in the CMS.
- Add a new API to manage country manager and sector CMS accounts.
- Add option in the client login to remember a user.
- CMS: update survey display to show profile questions and modules in a single list. This makes the display simpler and allows better reordering.
Bugfixes¶
- Remove extra space after risk severity in action plan report. This fixes TNO ticket 215.
- Fix broken translations for risk comments in identification phase. This fixes TNO ticket 230.
- Show our favicon in the client.
- IE8 fix in client. Adding a standard solution to an new/empty solution produces popup alerting user that they are overriding existing values.
- Fix for unicode error when providing non-ascii profile question values.
5.0 - November 22, 2012¶
Feature changes¶
- Update Dutch translations. This fixes TNO ticket 223.
- Add jQueryUI datepicker to the date fields in the risk action plan page [jcbrand]
- Modify all reports to always add a marker for present risks so users can more easily find them. This fixes TNO ticket 206.
Bugfixes¶
- Several fixes for the risk action plan form (client):
- i18n bugfix. [thomasw]
- Do not silently ignore start and end dates for action plan measures of no date was provided. This fixes TNO ticket 225.
- Handle internal error for dates with large years.
- Remove stray double quote in section titles in identification report. This fixes TNO ticket 222.
- Really show the notification that a password reminder has been sent. This fixes TNO ticket 229.
- Added missing i18n statement on conditions page [thomasw]
- Fix bad link in introduction text for action plan report. This fixes TNO ticket 227.
4.1.3 - October 1, 2012¶
Bugfixes¶
- Client API changes:
- Return the update-hint as JSON data.
- Remove invalid next-step hint which was included on the session action-plan response if a survey has no risks present.
- Use image URLs within the client API so images can be accessed by users who are not logged in on the client site. This reverts a change from 4.1.1.
4.1.2 - September 28, 2012¶
Bugfixes¶
- Client API changes:
- return a proper JSON error message if invalid JSON data is received.
- return a proper JSON error message if an unsupported HTTP method is used.
4.1.1 - September 27, 2012¶
Upgrade notes¶
This release upgrades Plone from version 4.1.3 to version 4.1.6. This may require to re-bootstrap your buildout if you see an error like this:
While:
Installing.
Getting section instance.
Initializing section instance.
Installing recipe plone.recipe.zope2instance.
Error: There is a version conflict.
We already have: Zope2 2.13.10
4.1 - August 29, 2012¶
Upgrade notes¶
This release updates the profile version to 12. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
Feature changes¶
- Add Flemish (nl_BE), Latvian (lv), Greek and Catalan (ca) translations. [thomasw]
- Client API modifications: - Add module title to the returned risk information. - Expose risk standard solutions.
- Updated privacy policy text. [jcbrand]
Bugfixes¶
- Report styling improvements: correct display of comments to they are readable when printing a report. [cornae]
- Implement missing export of image data for modules and risks in the client API. This also changes the datastructure used for images; this should not break existing clients since image data was never present in earlier versions. [wichert]
- Fix survey XML importer to generate filenames for images if not provided. This solves problems with not being able to see fullsize images for imported images. [wichert]
- Show proper help URL when outside of a survey. [jcbrand]
- Correct display of standard solution titles in the CMS navigation tree. [jcbrand]
4.0.2 - June 21, 2012¶
- Added Czech translations. [jcbrand]
- Fix access problem for survey session views in the client API. [wichert]
4.0.1 - June 18, 2012¶
- Fix bad release. [wichert]
4.0 - June 18, 2012¶
Upgrade notes¶
This release updates the profile version to 11. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version. For large systems this migration spent a long time in a SQL migration; in that situation it may be useful to run a manual SQL migration step by hand first: connect to the database and issue these SQL statements:
ALTER TABLE action_plan ADD COLUMN reference TEXT;
ALTER TABLE account ALTER COLUMN password DROP NOT NULL;
Feature changes¶
- Expose client functionality with via simple REST API. [wichert]
3.2.3 - May 16, 2012¶
- SQL performance work: revise SQL query used to copy survey session data on a survey update to use UPDATE FROM. This means we are no longer ANSI SQL compliant, but makes the query run 20-50 times faster. [wichert]
- SQL performance work: add two extra indices to improve performance for looking up risk data. [wichert]
3.2.2 - May 14, 2012¶
- 3.2.1 was a paper-brown-bag release. Try again. [wichert]
3.2 - May 10, 2012¶
Upgrade notes¶
This release updates the profile version to 10. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version. For large systems this migration spent a long time in a SQL migration; in that situation it may be useful to run a manual SQL migration step by hand first: connect to the database and issue this SQL statement:
ALTER TABLE tree ADD has_description bool DEFAULT 'f';
Feature changes¶
- Remove warning-icon for risks with a problem description in the action plan report. Since this report only contains present risks the icon was not useful. This fixes TNO ticket 219. [wichert]
- Change default for top5 risks to not be present to work around frequent abuse of top5 risks by sector organisations. They will still always be included in reports even if not present. This fixes TNO ticket 216. [wichert]
- Change default for optional modules to present based on user feedback. This fixes TNO ticket 197. [wichert]
- Make description for modules optional. If a module has no description it is skipped in the client. This fixes TNO ticket 213. [wichert]
Bugfixes¶
- Small grammar fix in Dutch translation for action plan introduction text. This fixes TNO ticket 220. [wichert]
- Add missing introductionary sentence in a direct survey view in the client which explains that a user can create a new survey. This fixes TNO ticket 193. [wichert]
- Fix case handling of email addresses when changing the email address in the client. Previously it was possible to change to an email address with capital, after which login was no longer possible. This fixes a final part of TNO ticket 194.
3.1.1 - April 27, 2012¶
Upgrade notes¶
No special upgrade steps are needed for this release.
Feature changes¶
- Add a caption field for module image captions. This fixes TNO ticket 210. [wichert]
- Position images for module views on the right side of the page so they do not break running text as badly. This should fix TNO ticket 211. [wichert]
- Use a slightly larger image size for the module views, and enable image zoom (fancybox). This fixes TNO ticket 209. [wichert]
Bugfixes¶
- Fix case handling of email addresses when changing the email address in the client. Previously it was possible to change to an email address with capital, after which login was no longer possible. This fixes a final part of TNO ticket 194. [wichert]
Other changes¶
- Small code restructuring to make it easier for derived sites to change filters for reports. [wichert]
3.1 - March 15, 2012¶
Upgrade notes¶
No special upgrade steps are needed for this release.
Feature changes¶
- Do not open list of all risks (under inventorisation) in a new window or tab. This fixes TNO ticket 205. [wichert]
- Add a new column with the risk number to the Action plan xlsx rendering. This fixes TNO ticket 203. [wichert]
- Update Dutch translations. [wichert]
- Added Bulgarian translations [thomasw]
Bugfixes¶
- Fix handling of text-style tags (strong/b/em/etc.) outside paragraphs when generating an RTF report. This fixes the second part of TNO ticket 208. [wichert]
- Fix colour of bold text in reports. This fixes TNO ticket 208. [wichert]
- The identification report wrongly showed the problem description for unanswered risks. This fixes TNO ticket 207. [wichert]
- Fix broken translations on risk action plan template. This fixes TNO ticket 201. [wichert]
- Use problem description instead of risk title in action timeline. This fixes TNO ticket 202. [wichert]
- No longer rotate the client navigation tree. [jcbrand, wichert]
- Bugfix, unpublishing a survey that’s in an active session raises KeyError. [jcbrand]
- Bugfix. CMS-style accessors must return bytestrings. [jcbrand]
- Removed setuptools_git as a dependency. [jcbrand]
- Fixed 2 typos that caused duplicate default translations [thomasw]
3.0.1 - December 28, 2011¶
- Fix packaging error. [wichert]
3.0 - December 28, 2011¶
Upgrade notes¶
Development of Euphorie and related projecst has moved to the euphorie organisation on github.
This release updates the profile version to 9. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
Feature changes¶
- Add a timeline export for the action plan: this generates an xlsx file with all measures for all risks. [wichert]
- Change risk priority terminology in Dutch. [wichert]
- Add an Currently unknown option for risk identification. This can be used to remove an existing answer. [wichert]
- Ignore case when checking the email address for client logins. [wichert]
- Use a better standard solution selector in the client. This fixes github ticket 5. [cornae, wichert]
- Group countries according to EU membership status. This fixes github tickets 1, 2 and 4. [cornae, wichert]
- Add another evaluation algorithm (French) for calculating risk priorities. [wichert]
- Upgrade client to jQuery 1.4.4 and jQuery UI 1.7.3. [wichert]
- Add an extra field ‘workers_participation’ to the Company form (and column to the SQL table). [jcbrand]
- Use z3c.zrtresource (and collective.zrtresource while still Plone < 4.1) to compile screen-ie6.css. This allows Cornelis to use physical paths in his Prototype, while zrtresource will give us the proper browserresource paths in Euphorie. One caveat is that we now have to minify the browserresource file (i.e http://localhost:4080/Plone2/client/++resource++screen-ie6.css) instead of the filesystem file. [jcbrand]
- Add delete validation on a sector to check that it doesn’t contain any published surveys. [jcbrand]
- Update Slovenian translations. [thomas_w]
Bugfixes¶
- Fix positioning of comments in the inventorisation report. This fixes TNO ticket 192. [cornae]
- Fix downloadable reports to correctly show a risks problem description. [wichert]
- Fix HTML->RTF conversion to not duplicate texts of links/bold/italic text in descriptions. [wichert]
- Fix survey tree update code to also rebuild the session for all tree changes instead of only profile changes. This fixes problems KeyErrors that appeared after publishing a survey which removes modules or risks. [wichert]
- Fix check for survey changes in the client: the old code falsely assumed client surveys were cataloged. [wichert]
- Hide hover beautytips on IE6 and clicktips on IE6 and IE7 [jcbrand]
- For extra robustness add extra check in new survey creation logic to make sure a valid survey was passed in. [wichert]
- Effect wasn’t set for French risks when added to the session tree. [jcbrand]
- #15: AttributeError is_region when publishing from a country not yet in the client. [jcbrand]
- For SurveyGroup, hide Evaluation Algorithm field on @@edit. [jcbrand]
- Allow the default sector colours to be customized via the euphorie.ini file [jcbrand]
- Change ordering of countries in the client to match the official EU ordering). This fixes github ticket 3. [wichert]
- Fixed Terms&Conditions page for anonymouse users. [jcbrand]
- During action plan phase, include all measures on request when validation fails. [jcbrand]
- Updated optional modules that are now mandatory must not have their children skipped. [jcbrand]
2.7 - April 26, 2011¶
- Various improvements for managing standard solutions:
- Use a separate view to show all information, and provided a point where solutions can be deleted. [wichert]
- Allow drag&drop ordering for standard solutions. [wichert]
- Use standard styling for Sphinx docs to make things more readable. [wichert]
- Hide removed surveys from session lists. [wichert]
- Fix incomplete display of errors on end dates for measures in the online client. This is part of TNO ticket 150. [wichert]
- Tweak screen-osha.css to show risk priorities on action plan report without any bells and whistles. [jcbrand]
- Fix common solution adding in the client for IE 7. This fixes the second part of TNO ticket 127. [wichert]
2.6 - April 7, 2011¶
Upgrade notes¶
This release updates the profile version to 6. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
Feature changes¶
- Add compatibility with SQLAlchemy 0.6. [wichert]
- Add a new EU region in addition to the existing countries. [wichert]
- Add unpublish feature to the CMS. [cornae, wichert]
- Clearly mark countries without surveys on the client frontpage. [cornae, wichert]
- Add options to change password, change email address or delete your account to the online client. [cornae, wichert]
Bug fixes¶
- Attempt to improve HTML->RTF conversion when generating downloadable reports. [wichert]
- Fix bug in handling of counting risk states for the client survey status screen. This fixes the second part of TNO ticket 155. [wichert]
- Added a euphorie.po for EN, so that we can also use the translation engine for that language, without the need to pass a default value. The file is a copy of euphorie.pot, with the msgstr being filled from the default entry or as a fallback from the msgid [thomasw]
2.5 - February 28, 2011¶
- Restore print button on identification report page; it seems users are unable to find the print function of their browser. This fixes TNO ticket 159. [wichert].
- Fix small errors in Dutch translation. This fixes TNO ticket 175. [wichert].
- Replace escape enters with proper newlines in downloadable report. This fixes TNO ticket 174. [wichert].
- Added some <br/> tags to avoid the navigation vanishing in IE7 [pilz]
- Update the minified css files from the originals to reflect recent changes cornae did to fix ie compatibility . [pilz]
- Add report header styles for an extra depth level. This fixes problems when generating reports for deeply nested surveys. This fixes TNO ticket 176. [wichert].
2.4 - January 25, 2011¶
Feature changes¶
- Enable the terms and conditions features introduced in release 2.3, but make it possible to disable it via a settings in the .ini file. This fixes ticket 107. [wichert]
- Replace downloadable action plan report with a RTF version. This solves problems with opening and editing the previous html fake-.doc approach. Downside of this approach is the loss of styling for the report. [wichert]
- Extend client form CSS to support percentage fields. [cornae]
- Added Greek translation provided by external translator for euphorie.pot; the latest additions are not translated yet [thomas]
Bugfixes¶
- Do not loose value of the referer field on the company details form. [wichert]
- The i18n msgid “label_login” was used for 2 different meanings. In content/user.py and content/upload.py, the msgid “label_login_name” is now used for the LoginField [thomas]
- Added msgid “label_preview”, Default “Preview”, as disambiguation from “header_preview” (Preview survey) and “button_preview” (Create preview) [thomas]
- in euphorie/content/risk.py changed Default translation for label_problem_description to “Inversed statement”, as given in euphorie/content/templates/risk_view.pt [thomas]
- in euphorie/content/upload.py added 2 new msgids, since the ones that were used already have a different meaning label_survey_title -> label_upload_survey_title help_surveygroup_title -> help_upload_surveygroup_title [thomas]
2.3 - January 11, 2011¶
Feature changes¶
- Change title of edit form for non-toplevel modules to Edit Submodule. [wichert]
- Allow deletion of content in published surveys. The old behaviour was theoretically better, but turned out to be very confusing for users for little benefit. [wichert]
- Add feature to require users of the client to agree to the terms and conditions of the site. Disabled until the terms and conditions document has been written. [wichert]
Bugfixes¶
- Fix bad workflow configuration for surveys. This is related to the fix for TNO ticket 124. [wichert]
- Correct METAL macro invocation in client templates. [brand]
2.2 - December 7, 2010¶
Feature changes¶
- Change the ordering of the risk types as requested by OSHA ticket 2253. [brand]
- Switch the client to the new OiRA logo. [cornae,pilz,wichert]
- When making a copy of a survey reset its workflow state back to draft. This allows deleting of content in a new survey that is based on a published survey. This is part of TNO ticket 124. [wichert]
Bugfixes¶
- The survey status screen could show module titles that do not match the current session. This fixes TNO ticket 155. [wichert]
- Stop declaring eupphorie to be a namespace package. [wichert]
- Require NuPlone 1.0rc1 or later so formatDate does not raise exceptions for pre-1900 dates. This fixes TNO ticket 150. [wichert]
- Do not accept pre-1900 dates in the action plan, since they break rendering of the report. This prevents TNO ticket 150 from occuring. [wichert]
2.1 - November 6, 2010¶
Feature changes¶
- Update Dutch translations. [wichert]
- Perform basic verification of email addresses in the client registration logic. This fixes TNO ticket 147. [wichert]
Bugfixes¶
- Purge cached scaled logos when publishing a survey and updating the sector logo. This fixes TNO ticket 136. [wichert]
- Translate subject of password reminer email. This fixes TNO ticket 148. [wichert]
- Rewrite client company form to use z3c.form instead of repoze.formapi. [wichert]
2.0, October 22, 2010¶
No changes.
2.0rc5, October 11, 2010¶
Bugfixes¶
- Fix rendering of profile questions in the client. This was caused by a bad fix for TNO ticket 135. [wichert]
- When creating a XML export of a survey use the title of the survey group instead of the survey version. [wichert]
- Fix javascript syntax on the client frontpage which broke IE7. [wichert]
- Added translation for the profile content type description [pilz]
2.0rc4, October 7, 2010¶
Bugfixes¶
- Fix spelling error in Dutch translation. This fixes TNO ticket 131. [wichert]
- Correct bad image scaling test when displaying a module in the client, which prevented images from being visible in action plan and evaluation phases. This fixes TNO ticket 135. [wichert]
2.0rc3, October 5, 2010¶
Upgrade notes¶
This release updates the profile version to 4. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
Feature changes¶
- Update the French translation of the survey creation guide. [pilz]
- Replace the collected company details with more generic information. The previous list is still used in the Dutch RI&E site and is now implemented in tno.euphorie. This fixes ticket 142. [wichert]
- Add missing question field to profile questions, and update the XML export code to export it. The XML import code and format specification already described this field. [wichert]
Bugfixes¶
- Use longer input boxes for title and question fields in the CMS. [pilz]
- Improve various texts. [pilz]
- Fix creation of report downloads for sessions with non-ASCII characters in their title. This fixes ticket 156. [wichert]
- Handle multiple buttons as returned by IE correctly in the company detail form. This could lead to site errors before. [wichert]
- Fix handling of partial date fields in company details forms. [wichert]
- Add publish permission to country managers. This fixes TNO ticket 126 [wichert]
- Declare dependency for question field in the module edit screen: it should only be shown for optional modules. [wichert]
- Fix bug in upgrade step for migration to 2.0rc2 which broke updating of security settings for existing content. [wichert]
2.0rc2, September 29, 2010¶
Upgrade notes¶
This release updates the profile version to 3. Please use the upgrade feature in portal_setup to upgrade the euphorie.deployment:default profile to this version.
Bugfixes¶
- Add Copy or Move permission information to the published state of the survey workflow. This fixes TNO ticket 124 [wichert]
- Correct link colour in the reports. This fixes TNO ticket 104 [cornae]
- Fix accidental yes/no swap in translations. This fixes TNO ticket 121 [wichert]
- Add french translations [pilz]
2.0rc1, September 23, 2010¶
- Improve IE8 rendering in the client. [cornae]
- Improve rendering on iOs devices (iPhone/iPod). [cornae]
- Multiple layout fixes for Internet Explorer browsers. [cornae]
- No longer rotate navtree in client for Firefox since Firefox renders the badly (more information can be found in Mozilla bug 492214). [cornae]
- Add XML import and export options to the site menu. This implements ticket 121 [wichert]
- Include policy and Top5 risks in identification. There is no need to evaluate them, but we do want to know if they are present in an organisation. [wichert]
- Include images in XML export of surveys. This fixes the last part of ticket 126 [wichert]
- Work around jQuery selector bug on IE which caused a javascript error on the company form in the report step of the client. [wichert]
- Add DOCTYPE to all CMS templates. This fixes rendering problems on IE8. [wichert]
- Modify login form to use a link instead of a button to go back. This fixes TNO ticket 107 [wichert]
- Replace lorem ipsum text on profile page in the client with proper instructions. [pilz]
- Always process all risks in identification, including top5 and policy risks. [wichert]
- Force the correct i18n domain in webhelper macros. This fixes TNO ticket 99 [wichert]
- Make updated legend item in versions tile translatable. This fixes TNO ticket 113 [wichert]
- Allow an extra depth level in surveys. This is needed for complicated surveys. It should not be used by normal survyes. [wichert]
- Fix URLs for fancybox CSS in Internet Explorer. [wichert]
- Update XML import to set image filenames as unicode strings, otherwise z3c.form would not allow you to change an object containing an image due to a type mismatch. [wichert]
- Add dependency on Products.PasswordResetTool 2.0.3 or later and fix password reset API. This fixes TNO ticket 111. [wichert]
- Update styling in the online client to work with current versions of iOS. [cornae]
- Use the zopectl command registration feature from Zope 2.12.12 for the database initialisation and XML import commandline commands. [wichert]
2.0b3, September 10, 2010¶
- Improve sector styling preview: correctly display the sector logo and show right default colours on initial page view. [wichert]
- Dutch translations updates. Fixes part of TNO ticket 71. [wichert]
- Update client to fake a risk-present answer for top-5 risks. This prevents them from being listed as unanswered in reports. Part of TNO ticket 93. [wichert]
- Fix preview feature to create a preview instead of doing a partial publish. This fixes TNO ticket 95. [wichert]
- Adjust importrie utility script to use login name instead of sector title as password when no password is explcitly provided. [wichert]
- Add a new about page to the client. This fixes ticket 153. [cornae, thomas, wichert].
- Correct test for duplicate logins when creating new sectors or country managers. This fixes ticket 152. [wichert]
- Improve display of multiple images for a risk in the CMS. [cornae]
2.0b2, September 3, 2010¶
- Correctly set risk type when generating a session in the client. This fixes TNO ticket 02 and ticket ticket 105. [wichert]
- Add an intermediate page with explanation and confirmation to the survey preview, similar to publication. This fixes TNO ticket 52. [wichert]
- Correct profile updates handling when not making any profile changes. This fixes problems with profile update appearing to do nothing. Fixes ticket 151, TNO ticket 36 and TNO ticket 85. [wichert]
- Change Module to Submodule in the addbar when already in a module. Fixes ticket 136. [wichert]
2.0b1, August 30, 2010¶
This release contains a completely overhauled editing backend and several fixes.
- Implement and use a new user interface for Plone (NuPlone[r]). [wichert, cornae]
- Add a new system to manage survey versions and publication. [wichert, cornae]
- Improve handling of top-5 risks in the online client. [wichert]
- Add support for multiple images for risks. [cornae, wichert]
- Documentation update [pilz, nielsen]
1.0¶
Unreleased.
- Do not fire before/after copy events when publishing a survey. This speeds up publishing enormously. [wichert]
- Make sure the survey importer returns unicode everywhere. [wichert]
- Add SQL database setup to the installation instructions. [wichert]
1.0b2¶
Released on February 24th, 2010
- Add the guide to creating a Risk Assessment (RA) tool, the online help text and the What and Why of a Risk Assessment documents. [wichert]
- Hide euphorie.content and euphorie.client from the list of Add-On products. They should never be installed by hand by normal users. [wichert]
- Add a table of contents to the reports. Implemented as part of the Dutch Euphorie extensions for TNO. [wichert]
- Fix site error for report pages in the client when using Plone 4. This fixes ticket 95. [wichert]
- Clarify package metadata and license. Euphorie is licensed under version 2 of the GNU General Public License. [wichert]