from typing import Dict, Optional, TYPE_CHECKING
from urllib.parse import urljoin, urlencode
from .base import Base
from .utils import clean_data
from .enums import MaxLogPolicy, InvalidDataPolicy, LoginFailurePolicy, MaxConcurrentSessionPolicy
if TYPE_CHECKING:
from . import GeoboxClient
[docs]
class SystemSettings(Base):
BASE_ENDPOINT = 'settings/'
[docs]
def __init__(self,
api: 'GeoboxClient',
data: Optional[Dict] = {}):
"""
Initialize a System Settings instance.
Args:
api (GeoboxClient): The GeoboxClient instance for making requests.
data (Dict, optional): The data of the Setting.
"""
super().__init__(api, data=data)
@property
def max_log_policy(self) -> 'MaxLogPolicy':
"""
Get max log policy
Returns:
MaxLogPolicy: max log policy
"""
return MaxLogPolicy(self.data.get('max_log_policy'))
@property
def invalid_data_policy(self) -> 'InvalidDataPolicy':
"""
Get invalid data policy
Returns:
InvalidDataPolicy: invalid data policy
"""
return InvalidDataPolicy(self.data.get('invalid_data_policy'))
@property
def login_failure_policy(self) -> 'LoginFailurePolicy':
"""
Get login failure policy
Returns:
LoginFailurePolicy: login failure policy
"""
return LoginFailurePolicy(self.data.get('login_failure_policy'))
@property
def max_concurrent_session_policy(self) -> 'MaxConcurrentSessionPolicy':
"""
Get max concurrent sessions
Returns:
MaxConcurrentSessionPolicy: max concurrent sessions
"""
return MaxConcurrentSessionPolicy(self.data.get('max_concurrent_session_policy'))
[docs]
def __repr__(self) -> str:
"""
Return a string representation of the system setting instance.
Returns:
str: A string representation of the system setting instance.
"""
return "SystemSettings()"
[docs]
@classmethod
def get_system_settings(cls, api: 'GeoboxClient') -> 'SystemSettings':
"""
Get System Settings object (Permission Required).
Args:
api (GeoboxClient): The GeoboxClient instance for making requests.
Returns:
SystemSetting: the system settings object.
Example:
>>> from geobox import GeoboxClient
>>> from geobox.setting import SystemSettings
>>> client = GeoboxClient()
>>> setting = SystemSettings.get_system_settings(client)
or
>>> setting = client.get_system_settings()
"""
params = clean_data({
'f': 'json'
})
query_string = urlencode(params)
endpoint = urljoin(cls.BASE_ENDPOINT, f"?{query_string}")
response = api.get(endpoint)
return SystemSettings(api, response)
[docs]
def update(self, **kwargs) -> Dict:
"""
Update the system settings.
Keyword Args:
brand_name (str)
brand_website (str)
max_log (int)
max_log_policy (MaxLogPolicy)
users_can_view_their_own_logs (bool)
max_upload_file_size (int)
invalid_data_policy (InvalidDataPolicy)
max_login_attempts (int)
login_failure_policy (LoginFailurePolicy)
login_attempts_duration (int)
min_password_length (int)
max_concurrent_session (int)
max_concurrent_session_policy (MaxConcurrentSessionPolicy)
session_timeout (int)
allowed_ip_addresses (Dict)
blocked_ip_addresses (Dict)
Returns:
Dict: The updated system settings data.
Raises:
ValidationError: If the system settings data is invalid.
Example:
>>> from geobox import GeoboxClient
>>> from geobox.setting import SystemSettings
>>> client = GeoboxClient()
>>> settings = SystemSetting.get_system_settings(client)
or
>>> settings = client.get_system_settings()
>>> settings.update_system_settings(max_log=100000)
"""
data = {
"brand_name": kwargs.get('brand_name'),
"brand_website": kwargs.get('brand_website'),
"max_log": kwargs.get('max_log'),
"max_log_policy": kwargs.get('max_log_policy').value if kwargs.get('max_log_policy') else None,
"max_upload_file_size": kwargs.get('max_upload_file_size'),
"invalid_data_policy": kwargs.get('invalid_data_policy').value if kwargs.get('invalid_data_policy') else None,
"max_login_attempts": kwargs.get('max_login_attempts'),
"login_failure_policy": kwargs.get('login_failure_policy').value if kwargs.get('login_failure_policy') else None,
"login_attempts_duration": kwargs.get('login_attempts_duration'),
"min_password_length": kwargs.get('min_password_length'),
"max_concurrent_session": kwargs.get('max_concurrent_session'),
"max_concurrent_session_policy": kwargs.get('max_concurrent_session_policy').value if kwargs.get('max_concurrent_session_policy') else None,
"session_timeout": kwargs.get('session_timeout'),
"allowed_ip_addresses": kwargs.get('allowed_ip_addresses'),
"blocked_ip_addresses": kwargs.get('blocked_ip_addresses'),
}
return super()._update(self.BASE_ENDPOINT, data)