Source code for pyplanet.contrib.permission.manager

from peewee import DoesNotExist

from pyplanet.apps.core.maniaplanet.models import Player
from pyplanet.apps.core.pyplanet.models import Permission
from pyplanet.contrib import CoreContrib


[docs]class PermissionManager(CoreContrib): """ Permission Manager manges the permissions of all apps and players. .. todo:: Write introduction. .. warning:: Don't initiate this class yourself. """ def __init__(self, instance): """ Initiate, should only be done from the core instance. :param instance: Instance. :type instance: pyplanet.core.instance.Instance """ self._instance = instance
[docs] async def on_start(self): """ Handle startup, just before the apps will start. We will make sure we are ready to get requests for permissions. """ pass
[docs] async def has_permission(self, player, permission): """ Check if the player has the right permission. :param player: player instance. :param permission: permission name. :return: boolean if player is allowed. """ if isinstance(permission, str): perm_namespace, _, perm_name = permission.rpartition(':') permission = await self.get_perm(name=perm_name, namespace=perm_namespace) if isinstance(player, str): player = await self._instance.player_manager.get_player(login=player) if not isinstance(permission, Permission): raise Exception('Permission should be a string or permission object!') if not isinstance(player, Player): raise Exception('Player should be a string or player object!') return player.level >= permission.min_level
[docs] async def get_perm(self, namespace, name): """ Get permission by namespace and name. :param namespace: Namespace of the permission :param name: Name of the permission. :type name: str :type namespace: str """ return await Permission.get(namespace=namespace, name=name)
[docs] async def register(self, name, description='', app=None, min_level=1, namespace=None): """ Register a new permission. :param name: Name of permission :param description: Description in english. :param app: App instance to retrieve the label. :param min_level: Minimum level required. :param namespace: Namespace, only for core usage! :return: Permission instance. """ if not namespace and app: namespace = app.label if not namespace: raise Exception('Namespace is required. You should give your app instance with app=app instead!') try: perm = await self.get_perm(namespace=namespace, name=name) # TODO: Implement overrides on min_level here. if perm.min_level != min_level: perm.min_level = min_level await perm.save() except DoesNotExist: perm = Permission(namespace=namespace, name=name, description=description, min_level=min_level) await perm.save() return perm