Skip to content

Commit bcd6b3a

Browse files
authored
Make update for data field is deep in telegram_bots/hub app (#233)
1 parent 1654a93 commit bcd6b3a

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

telegram_bots/hub/serializers/database_record.py

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from rest_framework import fields, serializers
22

3+
from utils.deep_merge import deep_merge_data
4+
35
from ...models import DatabaseRecord
46
from ...serializers.mixins import TelegramBotMixin
57

@@ -14,27 +16,15 @@ def run_validation(self, data: Any = fields.empty) -> dict[str, Any]:
1416
def update(
1517
self, records: list[DatabaseRecord], validated_data: dict[str, Any]
1618
) -> list[DatabaseRecord]:
17-
new_data: Any = validated_data['data']
19+
new_data: Any | None = validated_data.get('data')
20+
21+
if new_data is None:
22+
return records
1823

1924
for record in records:
20-
if self.partial:
21-
data: dict[str, Any] | list[Any] = record.data.copy()
22-
23-
if isinstance(data, dict):
24-
data.update(
25-
new_data
26-
if isinstance(new_data, dict)
27-
else {'new_data': new_data}
28-
)
29-
elif isinstance(data, list):
30-
if isinstance(new_data, list):
31-
data.extend(new_data)
32-
else:
33-
data.append(new_data)
34-
35-
record.data = data
36-
else:
37-
record.data = new_data
25+
record.data = (
26+
deep_merge_data(record.data, new_data) if self.partial else new_data
27+
)
3828

3929
DatabaseRecord.objects.bulk_update(records, fields=['data'])
4030

@@ -62,7 +52,14 @@ def create(self, validated_data: dict[str, Any]) -> DatabaseRecord:
6252
def update(
6353
self, record: DatabaseRecord, validated_data: dict[str, Any]
6454
) -> DatabaseRecord:
65-
record.data = validated_data.get('data', record.data)
55+
new_data: Any | None = validated_data.get('data')
56+
57+
if new_data is None:
58+
return record
59+
60+
record.data = (
61+
deep_merge_data(record.data, new_data) if self.partial else new_data
62+
)
6663
record.save(update_fields=['data'])
6764

6865
return record

utils/deep_merge.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from typing import Any
2+
3+
4+
def deep_merge_data(target: Any, source: Any) -> Any:
5+
if isinstance(target, dict) and isinstance(source, dict):
6+
result: dict[str, Any] = target.copy()
7+
result.update(
8+
{
9+
key: deep_merge_data(result[key], value) if key in result else value
10+
for key, value in source.items()
11+
}
12+
)
13+
return result
14+
elif isinstance(target, list):
15+
return target + (source if isinstance(source, list) else [source])
16+
17+
return source

0 commit comments

Comments
 (0)