Sidebar

Using iTop

Creating your iTop

iTop Customization

"How to" examples
DataModel

User Interface

Automation & Ticket management

Portal Customization

Portal: Changing visible Tickets

Prerequisite: You must be familiar with the Syntax used in Tutorials, have already created an extension and be familiar with the XML portal logic.

learning:
Changing what users are able to view/modify in the Portal
level:
Intermediate
domains:
XML, Access rights, Portal
min version:
2.3.0

Let's modify the list of Tickets that a user can see in the portal:
Usecase: We want any users, to see not only the Ticket for which they are the caller, but also those for which they have been added as contact.

For that you will need to:

  • Have an iTop system with the enhanced portal installed,
  • Have access to an account having the Portal User profile,
  • Have a way to modify the datamodel definition (creating an extension or with ITSM Designer)

In order to achieve the above usecase, we will need to change the default settings of the Portal. This settings is purely defined in the XML structure, so we just need to alter it. For this:

  • Understand the XML portal logic
  • Retrieve the default Portal model in the file <itop>/data/datamodel-production.xml located on your installed iTop.
  • Check the Customer portal XML Reference for explanation on the XML structure and tags
  • Write XML code to alter the default Portal model

XML Portal Logic

For our usecase we will just need to modify the Ticket scopes.
A scope defines for a given class, the objects which can be viewed or modified, by users having or not a particular profile.

Existing Ticket Scopes

The default Ticket scopes are:

  • all: simple “Portal user” can only see the Ticket for which he is the “caller”.
  • portal-power-user: “Power Portal user” can see all all Tickets of his organization.
itop_design / module_designs
<module_design id="itop-portal">
  <classes>
    <class id="Ticket">
      <scopes>
        <scope id="all">
          <oql_view><![CDATA[
            SELECT Ticket AS T WHERE T.caller_id = :current_contact_id 
            AND T.finalclass IN ('UserRequest', 'Incident')]]>
          </oql_view>
          <!-- oql_edit is combined with oql_read -->
          <!-- you can never modify something that you cannot read -->
          <!-- the query below brings no further restriction to the read -->
          <oql_edit><![CDATA[SELECT Ticket AS T]]></oql_edit>
          <!-- No allowed profiles tag, so this scope applies to all users -->
        </scope>
        <scope id="portal-power-user">
          <oql_view><![CDATA[
            SELECT Ticket AS T WHERE T.org_id = :current_contact->org_id 
            AND T.finalclass IN ('UserRequest', 'Incident')]]>
          </oql_view>
          <oql_edit><![CDATA[SELECT Ticket AS T]]></oql_edit>
          <!-- This scope applies only to users having a particular Profile -->
          <allowed_profiles>
            <allowed_profile id="Portal power user"/>
          </allowed_profiles>
        </scope>
      </scopes>

Portal XML Tags

  • Read the comments in the XML examples to understand better the used tags and their purpose.
  • Check the Portal XML reference for all possible options.

Changed scope

Adding a new scope

Here is a new Ticket scope to allow: “Any portal user to see in the Portal, tickets they are linked to as contact.”

itop_design / module_designs / module_design@itop-portal
  <classes>
    <class id="Ticket" _delta="must_exist">
      <scopes>
        <scope id="all-in-contacts" _delta="define">
          <oql_view><![CDATA[
            SELECT Ticket AS T 
            JOIN lnkContactToTicket AS l ON l.ticket_id = T.id 
            WHERE l.contact_id = :current_contact_id 
            AND T.finalclass IN ('UserRequest', 'Incident')]]>
          </oql_view>
          <!-- no oql_edit tag mean no write access for this scope -->
        </scope>
      </...>

As-is this new scope:

  • Is available for all users.
  • Does not provide write access on Ticket for which I am a contact but not the Caller
Scopes which are applicable to the current User and the current class, are combined with a UNION. So as a simple Portal user, I will be allowed to view all Tickets which belongs to scopes all or all-in-contacts.

Changing an existing scope

I can also use this other method:

itop_design / module_designs / module_design@itop-portal
  <classes>
    <class id="Ticket" >
      <scopes>
        <scope id="all" _delta="must_exist">
          <oql_view _delta="redefine"><![CDATA[
            SELECT Ticket AS T 
            JOIN lnkContactToTicket AS l ON l.ticket_id = T.id 
            WHERE l.contact_id = :current_contact_id 
            AND T.finalclass IN ('UserRequest', 'Incident')
          UNION 
            SELECT Ticket AS T WHERE T.caller_id = :current_contact_id 
            AND T.finalclass IN ('UserRequest', 'Incident')]]>
            ]]>
          </oql_view>
        </scope>
      </...>

Then:

  • It still applies for all users.
  • But does provide write access on Ticket for which I am a contact or the Caller
  • With this implementation, I have no mean to prevent edition of ticket for which I am a contact but not the caller, unless I also deny the right to edit the Tickets for which I am the caller.

Other use cases

Limit to tickets of their team(s)

A similar usecase, would be to limit the Tickets visibility for a “Power Portal user” to those managed by his tea🤦s).

SELECT Ticket AS T 
  JOIN Team AS G ON T.team_id = G.id 
  JOIN lnkPersonToTeam AS l ON l.team_id = G.id 
WHERE T.org_id = :current_contact->org_id 
  AND T.finalclass IN ('UserRequest', 'Incident') 
  AND l.person_id = :current_contact->id

Extend to Tickets of their sub-orgs

Another usecase, would be to extend the Tickets visibility for a “Power Portal user” to tickets of his sub-organizations as well.

SELECT Ticket AS T 
  JOIN Organization AS root AS T.org_id = root.id 
  JOIN Organization AS child ON child.parent_id BELOW root.id 
WHERE T.org_id = :current_contact->org_id 
  AND T.finalclass IN ('UserRequest', 'Incident') 

Tickets of Allowed org without cascading

How to prevent a Portal User with Allowed Organizations to see Tickets belonging to sub-organizations of his Allowed Organizations.

  • Out of the box, iTop cascade the access rights on sub-organizations of a User Allowed Organizations, and in 3.1.0 there are no way to prevent this.
  • The below OQL scope is a workaround for Portal users to be strictly limited to their Allowed Organizations owned objects.
  • Cautious: doing this will prevent a Portal User without Allowed Organizations to see any Tickets
SELECT Ticket AS T
  JOIN Organization AS O ON T.org_id=O.id
  JOIN URP_UserOrg AS AO ON AO.allowed_org_id=O.id
  JOIN USER AS U ON AO.userid = U.id
WHERE U.contactid = :current_contact_id
  AND T.finalclass IN ('UserRequest', 'Incident')
latest/customization/portal_howto_change_scope.txt · Last modified: 2024/09/10 10:25 by 127.0.0.1
Back to top
Contact us