202 lines
6.6 KiB
Python
202 lines
6.6 KiB
Python
"""
|
|
Author: Michel Peltriaux
|
|
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
|
Contact: michel.peltriaux@sgdnord.rlp.de
|
|
Created on: 25.11.20
|
|
|
|
"""
|
|
from django.contrib.auth.models import User
|
|
|
|
from konova.enums import BaseEnum
|
|
from organisation.enums import RoleTypeEnum
|
|
|
|
|
|
class ProcessStateEnum(BaseEnum):
|
|
"""
|
|
ProcessStates define in which state a process can be:
|
|
|
|
private
|
|
Only the user can see and edit this process. Not viewable by any others
|
|
accessible
|
|
The user and all participated users can see this process. Only the responsible next user can edit
|
|
the process
|
|
licensed
|
|
The user and all participated users can see this process. Only the responsible next user can edit
|
|
the process
|
|
official
|
|
The user and all participated users can see this process. Only the registration office user can now
|
|
change details. If a process is changed in this state, the state will be set back to accessible, so all
|
|
participated users need to take a look on the changed data again.
|
|
recorded [Will be set automatically after certain time]
|
|
The user and all participated users can see this process. No one can edit data. To change any details,
|
|
the process has to be set to accessible manually again.
|
|
"""
|
|
PRIVATE = 0
|
|
ACCESSIBLE = 1
|
|
LICENSED = 2
|
|
OFFICIAL = 3
|
|
RECORDED = 4
|
|
|
|
@classmethod
|
|
def as_choices(cls, drop_empty_choice: bool = False) -> list:
|
|
""" Extends as_choices, so choices will be translated
|
|
|
|
Args:
|
|
drop_empty_choice (bool): Whether the empty choice shall be dropped or not
|
|
|
|
Returns:
|
|
trans_choices (list): Translated choices
|
|
"""
|
|
choices = super().as_choices(drop_empty_choice)
|
|
return ProcessStateEnum.__translate_choices(choices)
|
|
|
|
@staticmethod
|
|
def __translate_choices(choices: list) -> list:
|
|
""" Translates a list of prepared but untranslated choices
|
|
|
|
Args:
|
|
choices (list): A list of tuple chocies
|
|
|
|
Returns:
|
|
choices (list): The same list but translated
|
|
"""
|
|
from process.settings import PROCESS_STATE_STRINGS
|
|
trans_choices = []
|
|
# Translate
|
|
for choice in choices:
|
|
if choice[0] is not None:
|
|
choice = list(choice)
|
|
trans = PROCESS_STATE_STRINGS.get(choice[0])
|
|
choice[1] = trans
|
|
choice = tuple(choice)
|
|
trans_choices.append(choice)
|
|
return trans_choices
|
|
|
|
@classmethod
|
|
def is_state(cls, state: int) -> bool:
|
|
""" Checks whether the given state is a valid Enum
|
|
|
|
Args:
|
|
state (int): The state to be checked
|
|
|
|
Returns:
|
|
is_valid (bool)
|
|
"""
|
|
valid_vals = {enum.value for enum in cls}
|
|
return state in valid_vals
|
|
|
|
@classmethod
|
|
def as_role_choices(cls, user: User) -> list:
|
|
""" Checks whether the given state is a valid Enum
|
|
|
|
Args:
|
|
user (User): The performing user
|
|
|
|
Returns:
|
|
is_valid (bool)
|
|
"""
|
|
role = user.current_role
|
|
if role is None:
|
|
return []
|
|
role_type = role.role.type
|
|
role_type_enum = RoleTypeEnum[role_type]
|
|
choices = PROCESS_ROLE_STATES.get(role_type_enum)
|
|
choices = [(enum.value, enum.name) for enum in choices]
|
|
choices = ProcessStateEnum.__translate_choices(choices)
|
|
return choices
|
|
|
|
@classmethod
|
|
def as_next_role_choices(cls, user: User, current_state: int, is_owner: bool = False) -> list:
|
|
""" Returns a list of valid choices depending on the current role of the user and the current state
|
|
|
|
Args:
|
|
user (User): The performing user
|
|
current_state (int): The current state of the process
|
|
|
|
Returns:
|
|
choices (list): A list of valid choices
|
|
"""
|
|
role = user.current_role
|
|
if role is None:
|
|
return []
|
|
role_type = role.role.type
|
|
role_type_enum = RoleTypeEnum[role_type]
|
|
|
|
# Merge the possible choices depending on the current user role
|
|
# with the possible choices depending on the process state
|
|
role_choices = PROCESS_ROLE_STATES.get(role_type_enum)
|
|
status_choices = PROCESS_STATE_NEXT_CHOICES.get(current_state)
|
|
current_choice = {ProcessStateEnum(current_state)}
|
|
choices = (status_choices & role_choices) | current_choice
|
|
|
|
# If user is owner of this process, we shall add the private choice if not existing, yet
|
|
if is_owner:
|
|
choices = {ProcessStateEnum.PRIVATE} | choices
|
|
|
|
# Make sure enums are ordered by numerical value
|
|
choices = sorted(choices, key=lambda _enum: _enum.value)
|
|
|
|
# Create selectable and translated choices from enum list
|
|
choices = [(enum.value, enum.name) for enum in choices]
|
|
choices = ProcessStateEnum.__translate_choices(choices)
|
|
return choices
|
|
|
|
|
|
# DEFINES THE AVAILABLE STATES FOR EACH ROLE
|
|
PROCESS_ROLE_STATES = {
|
|
RoleTypeEnum.DATAPROVIDER: {
|
|
ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
},
|
|
RoleTypeEnum.LICENSINGAUTHORITY: {
|
|
#ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
ProcessStateEnum.LICENSED,
|
|
},
|
|
RoleTypeEnum.REGISTRATIONOFFICE: {
|
|
#ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
ProcessStateEnum.OFFICIAL,
|
|
},
|
|
}
|
|
|
|
# DEFINES POSSIBLE NEXT STATES FOR EACH PROCESS STATE
|
|
PROCESS_STATE_NEXT_CHOICES = {
|
|
ProcessStateEnum.PRIVATE.value: {
|
|
ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
},
|
|
ProcessStateEnum.ACCESSIBLE.value: {
|
|
ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
ProcessStateEnum.LICENSED,
|
|
},
|
|
ProcessStateEnum.LICENSED.value: {
|
|
ProcessStateEnum.PRIVATE,
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
ProcessStateEnum.LICENSED,
|
|
ProcessStateEnum.OFFICIAL,
|
|
},
|
|
ProcessStateEnum.OFFICIAL.value: {
|
|
ProcessStateEnum.ACCESSIBLE,
|
|
ProcessStateEnum.OFFICIAL,
|
|
ProcessStateEnum.RECORDED,
|
|
},
|
|
}
|
|
|
|
# DEFINES FOR EACH STATE WHICH ROLE CAN EDIT THE PROCESS
|
|
PROCESS_EDITABLE_STATE = {
|
|
ProcessStateEnum.PRIVATE.value: {
|
|
RoleTypeEnum.DATAPROVIDER,
|
|
RoleTypeEnum.LICENSINGAUTHORITY,
|
|
},
|
|
ProcessStateEnum.ACCESSIBLE.value: {
|
|
RoleTypeEnum.LICENSINGAUTHORITY,
|
|
},
|
|
ProcessStateEnum.LICENSED.value: {
|
|
RoleTypeEnum.REGISTRATIONOFFICE,
|
|
},
|
|
ProcessStateEnum.OFFICIAL.value: {
|
|
RoleTypeEnum.REGISTRATIONOFFICE,
|
|
}
|
|
} |