Skip to content

Commit 8a128f4

Browse files
Merge pull request #15 from CivicDataLab/dev
Add collaborative support
2 parents 07178b9 + bdc2102 commit 8a128f4

28 files changed

+2456
-9
lines changed

api/activities/collaborative.py

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
from typing import Any, Dict, Optional
2+
3+
from django.http import HttpRequest
4+
5+
from api.activities.base import track_model_activity
6+
from api.models.Collaborative import Collaborative
7+
from authorization.models import User
8+
9+
10+
def track_collaborative_created(
11+
user: User, collaborative: Collaborative, request: Optional[HttpRequest] = None
12+
) -> None:
13+
"""
14+
Track when a collaborative is created.
15+
"""
16+
track_model_activity(
17+
actor=user,
18+
verb="created",
19+
model_instance=collaborative,
20+
target=collaborative.organization if collaborative.organization else None,
21+
request=request,
22+
extra_data={
23+
"collaborative_title": collaborative.title,
24+
"collaborative_id": str(collaborative.id),
25+
"organization_id": (
26+
str(collaborative.organization.id)
27+
if collaborative.organization
28+
else None
29+
),
30+
"organization_name": (
31+
collaborative.organization.name if collaborative.organization else None
32+
),
33+
},
34+
)
35+
36+
37+
def track_collaborative_updated(
38+
user: User,
39+
collaborative: Collaborative,
40+
updated_fields: Optional[Dict[str, Any]] = None,
41+
request: Optional[HttpRequest] = None,
42+
) -> None:
43+
"""
44+
Track when a collaborative is updated.
45+
46+
Args:
47+
user: The user performing the update
48+
collaborative: The collaborative being updated
49+
updated_fields: Dictionary of fields that were updated
50+
request: The current HTTP request
51+
"""
52+
track_model_activity(
53+
actor=user,
54+
verb="updated",
55+
model_instance=collaborative,
56+
target=collaborative.organization if collaborative.organization else None,
57+
request=request,
58+
extra_data={
59+
"collaborative_title": collaborative.title,
60+
"collaborative_id": str(collaborative.id),
61+
"updated_fields": updated_fields or {},
62+
},
63+
)
64+
65+
66+
def track_collaborative_published(
67+
user: User, collaborative: Collaborative, request: Optional[HttpRequest] = None
68+
) -> None:
69+
"""
70+
Track when a collaborative is published (status changed to PUBLISHED).
71+
"""
72+
track_model_activity(
73+
actor=user,
74+
verb="published",
75+
model_instance=collaborative,
76+
target=collaborative.organization if collaborative.organization else None,
77+
request=request,
78+
extra_data={
79+
"collaborative_title": collaborative.title,
80+
"collaborative_id": str(collaborative.id),
81+
},
82+
)
83+
84+
85+
def track_collaborative_deleted(
86+
user: User,
87+
collaborative_id: str,
88+
collaborative_title: str,
89+
organization_id: Optional[str] = None,
90+
request: Optional[HttpRequest] = None,
91+
) -> None:
92+
"""
93+
Track when a collaborative is deleted.
94+
Since the collaborative is deleted, we need to pass its ID and title separately.
95+
"""
96+
# For deleted objects, we can't pass the model instance directly
97+
# Instead, we create a dictionary with the relevant information
98+
extra_data = {
99+
"collaborative_title": collaborative_title,
100+
"collaborative_id": collaborative_id,
101+
"action": "deleted",
102+
}
103+
104+
# If we have the organization, we can use it as the target
105+
target = None
106+
if organization_id:
107+
from api.models.Organization import Organization
108+
109+
try:
110+
target = Organization.objects.get(id=organization_id)
111+
except Organization.DoesNotExist:
112+
pass
113+
114+
# Record the activity
115+
from authorization.activity import record_activity
116+
117+
record_activity(
118+
actor=user,
119+
verb="deleted",
120+
action_object=None, # No action object since it's deleted
121+
target=target,
122+
request=request,
123+
data=extra_data,
124+
)
125+
126+
127+
def track_dataset_added_to_collaborative(
128+
user: User,
129+
collaborative: Collaborative,
130+
dataset_id: str,
131+
dataset_title: str,
132+
request: Optional[HttpRequest] = None,
133+
) -> None:
134+
"""
135+
Track when a dataset is added to a use case.
136+
"""
137+
from api.models.Dataset import Dataset
138+
139+
try:
140+
dataset = Dataset.objects.get(id=dataset_id)
141+
track_model_activity(
142+
actor=user,
143+
verb="added dataset to",
144+
model_instance=collaborative,
145+
target=dataset,
146+
request=request,
147+
extra_data={
148+
"collaborative_title": collaborative.title,
149+
"collaborative_id": str(collaborative.id),
150+
"dataset_id": dataset_id,
151+
"dataset_title": dataset_title,
152+
},
153+
)
154+
except Dataset.DoesNotExist:
155+
# If the dataset doesn't exist, we still want to track the activity
156+
# but we can't use the dataset as the target
157+
track_model_activity(
158+
actor=user,
159+
verb="added dataset to",
160+
model_instance=collaborative,
161+
request=request,
162+
extra_data={
163+
"collaborative_title": collaborative.title,
164+
"collaborative_id": str(collaborative.id),
165+
"dataset_id": dataset_id,
166+
"dataset_title": dataset_title,
167+
},
168+
)
169+
170+
171+
def track_dataset_removed_from_collaborative(
172+
user: User,
173+
collaborative: Collaborative,
174+
dataset_id: str,
175+
dataset_title: str,
176+
request: Optional[HttpRequest] = None,
177+
) -> None:
178+
"""
179+
Track when a dataset is removed from a use case.
180+
"""
181+
from api.models.Dataset import Dataset
182+
183+
try:
184+
dataset = Dataset.objects.get(id=dataset_id)
185+
track_model_activity(
186+
actor=user,
187+
verb="removed dataset from",
188+
model_instance=collaborative,
189+
target=dataset,
190+
request=request,
191+
extra_data={
192+
"collaborative_title": collaborative.title,
193+
"collaborative_id": str(collaborative.id),
194+
"dataset_id": dataset_id,
195+
"dataset_title": dataset_title,
196+
},
197+
)
198+
except Dataset.DoesNotExist:
199+
# If the dataset doesn't exist, we still want to track the activity
200+
# but we can't use the dataset as the target
201+
track_model_activity(
202+
actor=user,
203+
verb="removed dataset from",
204+
model_instance=collaborative,
205+
request=request,
206+
extra_data={
207+
"collaborative_title": collaborative.title,
208+
"collaborative_id": str(collaborative.id),
209+
"dataset_id": dataset_id,
210+
"dataset_title": dataset_title,
211+
},
212+
)

0 commit comments

Comments
 (0)