Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5821227

Browse files
authored
Merge pull request GetStream#91 from GetStream/feature/AC-109_batch_partial_update
[AC-109] add batch partial update
2 parents 8857aa2 + c0a355f commit 5821227

File tree

2 files changed

+106
-3
lines changed

2 files changed

+106
-3
lines changed

stream/client.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ def activity_partial_update(
377377
self, id=None, foreign_id=None, time=None, set={}, unset=[]
378378
):
379379
"""
380-
Partial update activity, via foreign ID or Foreign ID + timestamp
380+
Partial update activity, via activity ID or Foreign ID + timestamp
381381
382382
id: the activity ID
383383
foreign_id: the activity foreign ID
@@ -386,8 +386,6 @@ def activity_partial_update(
386386
unset: list of unset operations
387387
"""
388388

389-
auth_token = self.create_jwt_token("activities", "*", feed_id="*")
390-
391389
if id is None and (foreign_id is None or time is None):
392390
raise TypeError(
393391
"The id or foreign_id+time parameters must be provided and not be None"
@@ -405,6 +403,34 @@ def activity_partial_update(
405403
data["foreign_id"] = foreign_id
406404
data["time"] = time
407405

406+
return self.activities_partial_update(updates=[data])
407+
408+
def activities_partial_update(self, updates=[]):
409+
"""
410+
Partial update activity, via activity ID or Foreign ID + timestamp
411+
412+
:param updates: list of partial updates to perform.
413+
414+
eg.
415+
[
416+
{
417+
"foreign_id": "post:1",
418+
"time": datetime.datetime.utcnow(),
419+
"set": {
420+
"product.name": "boots",
421+
"product.price": 7.99,
422+
"popularity": 1000,
423+
"foo": {"bar": {"baz": "qux"}},
424+
},
425+
"unset": ["product.color"]
426+
}
427+
]
428+
"""
429+
430+
auth_token = self.create_jwt_token("activities", "*", feed_id="*")
431+
432+
data = {"changes": updates}
433+
408434
return self.post("activity/", auth_token, data=data)
409435

410436
def create_redirect_url(self, target_url, user_id, events):

stream/tests/test_client.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,83 @@ def test_activity_partial_update(self):
11901190
expected["popularity"] = 9000
11911191
self.assertEqual(updated, expected)
11921192

1193+
def test_activities_partial_update(self):
1194+
1195+
feed = self.c.feed("user", uuid4())
1196+
feed.add_activities(
1197+
[
1198+
{
1199+
"actor": "barry",
1200+
"object": "09",
1201+
"verb": "tweet",
1202+
"time": datetime.datetime.utcnow(),
1203+
"foreign_id": "fid:123",
1204+
"product": {"name": "shoes", "price": 9.99, "color": "blue"},
1205+
},
1206+
{
1207+
"actor": "jerry",
1208+
"object": "10",
1209+
"verb": "tweet",
1210+
"time": datetime.datetime.utcnow(),
1211+
"foreign_id": "fid:456",
1212+
"product": {"name": "shoes", "price": 9.99, "color": "blue"},
1213+
},
1214+
{
1215+
"actor": "tommy",
1216+
"object": "09",
1217+
"verb": "tweet",
1218+
"time": datetime.datetime.utcnow(),
1219+
"foreign_id": "fid:789",
1220+
"product": {"name": "shoes", "price": 9.99, "color": "blue"},
1221+
},
1222+
]
1223+
)
1224+
activities = feed.get()["results"]
1225+
1226+
batch = [
1227+
{
1228+
"id": activities[0]["id"],
1229+
"set": {"product.color": "purple", "custom": {"some": "extra data"}},
1230+
"unset": ["product.price"],
1231+
},
1232+
{
1233+
"id": activities[2]["id"],
1234+
"set": {"product.price": 9001, "on_sale": True},
1235+
},
1236+
]
1237+
1238+
# partial update by ID
1239+
self.c.activities_partial_update(batch)
1240+
updated = feed.get()["results"]
1241+
expected = activities
1242+
expected[0]["product"] = {"name": "shoes", "color": "purple"}
1243+
expected[0]["custom"] = {"some": "extra data"}
1244+
expected[2]["product"] = {"name": "shoes", "price": 9001, "color": "blue"}
1245+
expected[2]["on_sale"] = True
1246+
self.assertEqual(updated, expected)
1247+
1248+
# partial update by foreign ID + time
1249+
batch = [
1250+
{
1251+
"foreign_id": activities[1]["foreign_id"],
1252+
"time": activities[1]["time"],
1253+
"set": {"product.color": "beeeeeeige", "custom": {"modified_by": "me"}},
1254+
"unset": ["product.name"],
1255+
},
1256+
{
1257+
"foreign_id": activities[2]["foreign_id"],
1258+
"time": activities[2]["time"],
1259+
"unset": ["on_sale"],
1260+
},
1261+
]
1262+
self.c.activities_partial_update(batch)
1263+
updated = feed.get()["results"]
1264+
1265+
expected[1]["product"] = {"price": 9.99, "color": "beeeeeeige"}
1266+
expected[1]["custom"] = {"modified_by": "me"}
1267+
del expected[2]["on_sale"]
1268+
self.assertEqual(updated, expected)
1269+
11931270
def test_create_reference(self):
11941271
ref = self.c.collections.create_reference("item", "42")
11951272
self.assertEqual(ref, "SO:item:42")

0 commit comments

Comments
 (0)