Source code for oarepo_config.communities
#!/usr/bin/env python3
#
# Copyright (c) 2026 CESNET z.s.p.o.
#
# This file is a part of oarepo-config (see https://github.com/oarepo/oarepo-config).
#
# oarepo-config is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
#
"""Configuration for communities."""
from __future__ import annotations
from invenio_administration.generators import Administration
from invenio_communities.generators import (
CommunityManagersForRole,
)
from invenio_communities.permissions import CommunityPermissionPolicy
from invenio_i18n import lazy_gettext as _
from invenio_records_permissions.generators import Disable, SystemProcess
from .base import set_constants_in_caller
try:
from oarepo_communities.services.permissions.generators import (
CanSubmitRecordInCommunity,
PrimaryCommunityRole,
)
from oarepo_workflows.services.permissions.composite import (
BooleanPermissionPolicyMixin,
)
[docs]
class DefaultCommunitiesPermissionPolicy(BooleanPermissionPolicyMixin, CommunityPermissionPolicy): # type: ignore[reportIncompatibleVariableOverride]
"""Default permission policy for communities."""
can_create = (Administration(), SystemProcess())
can_submit_record = (CanSubmitRecordInCommunity(), SystemProcess())
can_include_directly = (SystemProcess(),)
can_members_add = (SystemProcess(),)
can_members_search = (
PrimaryCommunityRole("owner"),
PrimaryCommunityRole("curator"),
SystemProcess(),
)
can_members_search_public = (
PrimaryCommunityRole("owner"),
PrimaryCommunityRole("curator"),
SystemProcess(),
)
can_members_update = (
CommunityManagersForRole(),
SystemProcess(),
)
can_members_delete = can_members_update
can_request_membership = (Disable(),)
except ImportError:
from invenio_communities.permissions import CommunityPermissionPolicy
DefaultCommunitiesPermissionPolicy = CommunityPermissionPolicy # type: ignore[misc,assignment]
[docs]
def configure_communities(
communities_roles: list | None = None,
) -> None:
"""Set up the configuration for communities.
Communities let you organize records into collections with their own
managers and settings. This function configures who can do what in
each community (the roles), how records are submitted to communities,
and other community-related settings.
Args:
communities_roles: Custom role definitions for communities. If not
provided, defaults to owner/curator/member roles. If omitted, three
default roles are used: "owner" (can manage the community
and its members), "curator" (can review/curate submitted
records) and "member" (can only view). Pass your own list to
replace the defaults, e.g. to add a "submitter" role. Each
role dictionary understands the keys ``name``, ``title``,
``description``, ``is_owner``, ``can_manage``,
``can_curate`` and ``can_manage_roles`` (the names of the
roles this role is allowed to add/remove).
Invenio configuration variables set:
* ``COMMUNITIES_REGISTER_UI_BLUEPRINT`` - always ``True``; enables
the communities UI.
* ``COMMUNITIES_PERMISSION_POLICY`` - the permission policy class for
communities.
* ``COMMUNITIES_ROLES`` - the list of available roles in communities.
Example:
.. code-block:: python
config.configure_communities()
# or with custom settings:
config.configure_communities(
communities_roles=[
dict(
name="owner",
title=_("Community owner"),
is_owner=True,
can_manage=True,
can_manage_roles=[
"owner",
"curator",
"member",
"submitter",
],
),
dict(
name="curator",
title=_("Curator"),
can_manage=True,
can_manage_roles=[
"member",
"submitter",
],
),
dict(
name="submitter",
title=_("Submitter"),
can_manage=True,
),
dict(
name="member",
title=_("Member"),
),
]
)
"""
COMMUNITIES_REGISTER_UI_BLUEPRINT = True
COMMUNITIES_PERMISSION_POLICY = DefaultCommunitiesPermissionPolicy
COMMUNITIES_ROLES = communities_roles or [
# note: order matters, roles should be sorted by importance
# from the most important to the least
{
"name": "owner",
"title": _("Community owner"),
"description": _("Can manage community."),
"is_owner": True,
"can_manage": True,
"can_manage_roles": ["owner", "curator", "member"],
},
{
"name": "curator",
"title": _("Curator"),
"description": _("Can curate records."),
"can_manage": True,
"can_manage_roles": ["member"],
},
{
"name": "member",
"title": _("Member"),
"description": _("Community member with read permissions."),
},
]
set_constants_in_caller(locals())