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)
anduser_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 theis_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
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
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)