From 13b67702b44b79cdde6134323279ec2293da25dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 15 Jun 2017 11:06:01 +0200 Subject: [PATCH] Let Pillar extensions register new roles. These will be available via the app.user_roles property. --- pillar/__init__.py | 22 ++++++++++++++++++++++ pillar/extension.py | 3 +++ 2 files changed, 25 insertions(+) diff --git a/pillar/__init__.py b/pillar/__init__.py index 86f10002..fc24a1ae 100644 --- a/pillar/__init__.py +++ b/pillar/__init__.py @@ -70,6 +70,13 @@ class PillarServer(Eve): self.pillar_extensions: map_type = collections.OrderedDict() self.pillar_extensions_template_paths = [] # list of paths + # The default roles Pillar uses. Will probably all move to extensions at some point. + self._user_roles: typing.Set[str] = { + 'demo', 'admin', 'subscriber', 'homeproject', + 'protected', + 'service', 'badger', 'svner', 'urler', + } + self.app_root = os.path.abspath(app_root) self._load_flask_config() self._config_logging() @@ -356,6 +363,16 @@ class PillarServer(Eve): self.log.info('Pinging Celery workers') self.log.info('Response: %s', self.celery.control.ping()) + def _config_user_roles(self): + """Gathers all user roles from extensions. + + The union of all user roles can be obtained from self.user_roles. + """ + + for extension in self.pillar_extensions.values(): + self._user_roles.update(extension.user_roles) + self.log.info('Loaded %i user roles from extensions', len(self._user_roles)) + def register_static_file_endpoint(self, url_prefix, endpoint_name, static_folder): from pillar.web.staticfile import PillarStaticFile @@ -526,6 +543,7 @@ class PillarServer(Eve): self._config_jinja_env() self._config_static_dirs() + self._config_user_roles() # Only enable this when debugging. # self._list_routes() @@ -678,3 +696,7 @@ class PillarServer(Eve): schema = self.config['DOMAIN'][resource_name]['schema'] validator = self.validator(schema, resource_name) return validator + + @property + def user_roles(self) -> typing.FrozenSet[str]: + return frozenset(self._user_roles) diff --git a/pillar/extension.py b/pillar/extension.py index e9310f66..d709fe16 100644 --- a/pillar/extension.py +++ b/pillar/extension.py @@ -32,6 +32,9 @@ class PillarExtension(object, metaclass=abc.ABCMeta): # List of Celery task modules introduced by this extension. celery_task_modules: typing.List[str] = [] + # Set of user roles used/introduced by this extension. + user_roles: typing.Set[str] = set() + @property @abc.abstractmethod def name(self):