Customizing

ppms.rights

The rights package facilitates the implementation of custom rights logic.

Classes

RightsDecorator

Base class for decorators that work with the ModuleWithRightCheck module subclass

  • The methods is_user_allowed(self, user) and user_is_not_allowed_response(self, *args, **kwargs) must be implemented in a subclass

Methods

Function

Parameters

Return Value

Description

RightsDecorator.current_user_is_allowed(self)


True or False

Check whether the current user has the necessary rights

RightsDecorator.is_user_allowed(self, user)

user: User

Should return True or False

This method must be implemented in a subclass to perform the right check for a given user

RightsDecorator.user_is_allowed_response(self, *args, **kwargs)

args: Original arguments of the function call
kwargs: Original keyword arguments of the function call

Value of the original function call

Calls the function that has been decorated

RightsDecorator.user_is_not_allowed_response(self, *args, **kwargs)

args: Original arguments of the function call
kwargs: Original keyword arguments of the function call


This method must be implemented in a subclass to notify the user that he/she does not have the necessary rights

ModuleContextRightDecorator

Base class for decorators that conditionally hide actions in PLANTA

  • This decorator is not (!) invoked when calling the decorated function, but instead works in tandem with the ModuleWithRightCheck to check via the is_functionality_allowed method if certain actions / buttons / links / context menu entries should be hidden/shown in a module

Methods

Function

Parameters

Return Value

Description

is_functionality_allowed(self, module)


module: Current module context

Should return True or False

This method must be implemented in a subclass to perform the right check for a given module

ModuleWithRightCheck

Base class for modules that use a RightsDecorator to gate their methods.

  • The module will automatically hide buttons for which the current user does not have access rights

  • If the current user has the necessary rights, the buttons will be shown in the window they are customized in

  • Remember to call the base implementations of the methods ModuleWithRightCheck overrides if you further override them.

  • When a user uses the "Save Customizing" function to save to the base MV, a ModuleWithRightCheck keeps the customized window settings regardless of whether the current user can see the button or not.

Methods

Function

Parameters

Return Value

Description

ModuleWithRightCheck.control_action_display(self)



Checks the module code for decorated functions and either unhides or hides them based on the rights of the user

ModuleWithRightCheck.create_mv(self, title)

title: MV name

Module variant ID

Extends the default MV creation to prevent data fields connected to a RightsDecorator from being moved to a different window in a MV

ModuleWithRightCheck.get_subclass_method_datafields(self)


A dictionary of {method_name: (DA, DF, Window)}

Fetches all data fields that have a customized module subclass method

ModuleWithRightCheck.has_methods_with_right_check(self)


True or False

Checks if any methods of the current class are decorated with a RightsDecorator

ModuleWithRightCheck.menu_override(self, menu_id)

menu_id: Menu item id

Default menu override return values

Extends the default module variant saving menu item to prevent data fields connected to a RightsDecorator from being moved to a different window in a MV

ModuleWithRightCheck.on_after_mv_switch(self, old_mv, new_mv)

old_mv: Previous module variant
new_mv: Newly selected module variant


Calls control_action_display

ModuleWithRightCheck.on_load(self)



Calls control_action_display

ModuleWithRightCheck.save_mv_by_id(self, id)

id: Module variant ID

True or False

Extends the default implementation to prevent data fields connected to a RightsDecorator from being moved to a different window in a MV

Examples

Implementing a new decorator

Python
from ppms.rights import RightsDecorator


class R41ExclusivityDecorator(RightsDecorator):
    
    def is_user_allowed(self, user):
        return user == 'R41'

    def user_is_not_allowed_response(self, *args, **kwargs):
        return ppms.ui_message_box('Only R41 is allowed to use this function!')


@R41ExclusivityDecorator
def some_function_exclusive_to_r41():
    ppms.ui_message_box('Hello R41!')

Using the new decorator in a module subclass

Python
from ppms.rights import ModuleWithRightCheck


class R41ExclusiveModule(ModuleWithRightCheck)

    @R41ExclusivityDecorator
    def exclusive_method(self):
        ppms.ui_message_box('Hello R41!')

    def on_load(self):
        super(R41ExclusiveModule, self).on_load()
        self.menu(MENU_FILTER)