feat(campaigns): add governed collaboration thread
Module Package Release / publish-packages (push) Successful in 13s
Module Package Release / publish-packages (push) Successful in 13s
This commit is contained in:
@@ -28,6 +28,7 @@ from govoplan_campaign.backend.db.models import (
|
||||
AttachmentInstance,
|
||||
CampaignIssue,
|
||||
Campaign,
|
||||
CampaignCollaborationEntry,
|
||||
CampaignJob,
|
||||
CampaignMessageAction,
|
||||
CampaignMessageActionAttempt,
|
||||
@@ -41,7 +42,13 @@ from govoplan_campaign.backend.db.models import (
|
||||
)
|
||||
|
||||
|
||||
READ_ACTIONS = {"campaigns:campaign:read", "campaign:read"}
|
||||
READ_ACTIONS = {
|
||||
"campaigns:campaign:read",
|
||||
"campaign:read",
|
||||
"campaigns:discussion:read",
|
||||
"campaigns:discussion:post",
|
||||
"campaigns:discussion:moderate",
|
||||
}
|
||||
CAMPAIGN_RESOURCE_TYPES = {
|
||||
"campaign",
|
||||
"campaign_object",
|
||||
@@ -51,6 +58,10 @@ CAMPAIGN_VERSION_RESOURCE_TYPES = {
|
||||
"campaign_version",
|
||||
"campaigns:version",
|
||||
}
|
||||
CAMPAIGN_COLLABORATION_RESOURCE_TYPES = {
|
||||
"campaign_collaboration_entry",
|
||||
"campaigns:collaboration_entry",
|
||||
}
|
||||
CAMPAIGN_DELIVERY_JOB_RESOURCE_TYPES = {
|
||||
"campaign_delivery_job",
|
||||
"campaign_job",
|
||||
@@ -558,6 +569,52 @@ class CampaignAccessService(CampaignAccessProvider):
|
||||
return tuple(items)
|
||||
if normalized_type in CAMPAIGN_RESOURCE_TYPES:
|
||||
campaign = session.get(Campaign, resource_id) # type: ignore[attr-defined]
|
||||
elif normalized_type in CAMPAIGN_COLLABORATION_RESOURCE_TYPES:
|
||||
entry = session.get(CampaignCollaborationEntry, resource_id) # type: ignore[attr-defined]
|
||||
if entry is None:
|
||||
return _missing_resource_provenance(
|
||||
principal,
|
||||
resource_type="campaign_collaboration_entry",
|
||||
resource_id=resource_id,
|
||||
)
|
||||
campaign = session.get(Campaign, entry.campaign_id) # type: ignore[attr-defined]
|
||||
normalized_action = action.strip().lower()
|
||||
required_actions = (
|
||||
("campaigns:discussion:moderate",)
|
||||
if normalized_action.endswith(":moderate")
|
||||
else (
|
||||
("campaigns:discussion:post",)
|
||||
if normalized_action.endswith(":post")
|
||||
else ("campaigns:discussion:read",)
|
||||
)
|
||||
)
|
||||
child_item = _child_provenance(
|
||||
principal,
|
||||
resource_id=entry.id,
|
||||
source="campaigns.collaboration_entry",
|
||||
label="Campaign collaboration entry",
|
||||
campaign=campaign,
|
||||
version_id=entry.campaign_version_id,
|
||||
details={
|
||||
"resource_type": "campaign_collaboration_entry",
|
||||
"visibility": entry.visibility,
|
||||
"reference_kind": entry.reference_kind,
|
||||
"reference_id": entry.reference_id,
|
||||
"state": (
|
||||
"redacted"
|
||||
if entry.redacted_at
|
||||
else "withdrawn" if entry.withdrawn_at else "posted"
|
||||
),
|
||||
"content_disclosed": False,
|
||||
"actor_identity_disclosed": False,
|
||||
"permission_classes": {
|
||||
"read": ["campaigns:discussion:read"],
|
||||
"post": ["campaigns:discussion:post"],
|
||||
"moderate": ["campaigns:discussion:moderate"],
|
||||
},
|
||||
},
|
||||
required_actions=required_actions,
|
||||
)
|
||||
elif normalized_type in CAMPAIGN_SHARE_RESOURCE_TYPES:
|
||||
share = session.get(CampaignShare, resource_id) # type: ignore[attr-defined]
|
||||
if share is None:
|
||||
|
||||
Reference in New Issue
Block a user