Skip to content

Commit 3eac185

Browse files
committed
#835: fixes for JSON batching
1 parent b880908 commit 3eac185

File tree

9 files changed

+70
-26
lines changed

9 files changed

+70
-26
lines changed

examples/directory/users/update.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
Update users
3+
4+
https://learn.microsoft.com/en-us/graph/api/user-update
5+
"""
6+
7+
from office365.graph_client import GraphClient
8+
from tests import test_client_id, test_password, test_tenant, test_username
9+
10+
client = GraphClient.with_username_and_password(
11+
test_tenant, test_client_id, test_username, test_password
12+
)
13+
users = client.users.get().filter("startswith(displayName, 'testuser')").top(1).execute_query()
14+
15+
for u in users:
16+
u.set_property('officeLocation', "18/2111").update().execute_query()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""
2+
Update users in batch mode
3+
4+
https://learn.microsoft.com/en-us/graph/api/user-update
5+
"""
6+
7+
from office365.graph_client import GraphClient
8+
from tests import test_client_id, test_password, test_tenant, test_username
9+
10+
client = GraphClient.with_username_and_password(
11+
test_tenant, test_client_id, test_username, test_password
12+
)
13+
users = client.users.get().filter("startswith(displayName, 'testuser')").top(50).execute_query()
14+
15+
for u in users:
16+
u.set_property('officeLocation', "18/2111").update()
17+
18+
client.execute_batch()
19+
20+

generator/metadata/MicrosoftGraph.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22557,6 +22557,7 @@
2255722557
<Property Name="groupTypes" Type="Collection(Edm.String)" Nullable="false"/>
2255822558
<Property Name="hasMembersWithLicenseErrors" Type="Edm.Boolean"/>
2255922559
<Property Name="isAssignableToRole" Type="Edm.Boolean"/>
22560+
<Property Name="isManagementRestricted" Type="Edm.Boolean"/>
2256022561
<Property Name="licenseProcessingState" Type="graph.licenseProcessingState"/>
2256122562
<Property Name="mail" Type="Edm.String"/>
2256222563
<Property Name="mailEnabled" Type="Edm.Boolean"/>
@@ -22925,6 +22926,7 @@
2292522926
<Property Name="givenName" Type="Edm.String"/>
2292622927
<Property Name="identities" Type="Collection(graph.objectIdentity)"/>
2292722928
<Property Name="imAddresses" Type="Collection(Edm.String)"/>
22929+
<Property Name="isManagementRestricted" Type="Edm.Boolean"/>
2292822930
<Property Name="isResourceAccount" Type="Edm.Boolean"/>
2292922931
<Property Name="jobTitle" Type="Edm.String"/>
2293022932
<Property Name="lastPasswordChangeDateTime" Type="Edm.DateTimeOffset"/>
@@ -25913,6 +25915,7 @@
2591325915
<EntityType Name="administrativeUnit" BaseType="graph.directoryObject" OpenType="true">
2591425916
<Property Name="description" Type="Edm.String"/>
2591525917
<Property Name="displayName" Type="Edm.String"/>
25918+
<Property Name="isMemberManagementRestricted" Type="Edm.Boolean"/>
2591625919
<Property Name="membershipRule" Type="Edm.String"/>
2591725920
<Property Name="membershipRuleProcessingState" Type="Edm.String"/>
2591825921
<Property Name="membershipType" Type="Edm.String"/>
@@ -26294,6 +26297,7 @@
2629426297
<Property Name="enrollmentType" Type="Edm.String"/>
2629526298
<Property Name="isCompliant" Type="Edm.Boolean"/>
2629626299
<Property Name="isManaged" Type="Edm.Boolean"/>
26300+
<Property Name="isManagementRestricted" Type="Edm.Boolean"/>
2629726301
<Property Name="isRooted" Type="Edm.Boolean"/>
2629826302
<Property Name="managementType" Type="Edm.String"/>
2629926303
<Property Name="manufacturer" Type="Edm.String"/>
@@ -26376,6 +26380,7 @@
2637626380
<Property Name="supportedServices" Type="Collection(Edm.String)" Nullable="false"/>
2637726381
<NavigationProperty Name="domainNameReferences" Type="Collection(graph.directoryObject)"/>
2637826382
<NavigationProperty Name="federationConfiguration" Type="Collection(graph.internalDomainFederation)" ContainsTarget="true"/>
26383+
<NavigationProperty Name="rootDomain" Type="graph.domain"/>
2637926384
<NavigationProperty Name="serviceConfigurationRecords" Type="Collection(graph.domainDnsRecord)" ContainsTarget="true"/>
2638026385
<NavigationProperty Name="verificationDnsRecords" Type="Collection(graph.domainDnsRecord)" ContainsTarget="true"/>
2638126386
</EntityType>
@@ -35508,6 +35513,9 @@
3550835513
</Action>
3550935514
<Action Name="restore" IsBound="true">
3551035515
<Parameter Name="bindingParameter" Type="graph.directoryObject" Nullable="false"/>
35516+
<Parameter Name="autoReconcileProxyConflict" Type="Edm.Boolean">
35517+
<Annotation Term="Org.OData.Core.V1.OptionalParameter"/>
35518+
</Parameter>
3551135519
<ReturnType Type="graph.directoryObject"/>
3551235520
</Action>
3551335521
<Action Name="restore" IsBound="true">
@@ -40376,6 +40384,7 @@
4037640384
<EntitySet Name="domainDnsRecords" EntityType="microsoft.graph.domainDnsRecord"/>
4037740385
<EntitySet Name="domains" EntityType="microsoft.graph.domain">
4037840386
<NavigationPropertyBinding Path="domainNameReferences" Target="directoryObjects"/>
40387+
<NavigationPropertyBinding Path="rootDomain" Target="domains"/>
4037940388
</EntitySet>
4038040389
<EntitySet Name="groups" EntityType="microsoft.graph.group">
4038140390
<NavigationPropertyBinding Path="createdOnBehalfOf" Target="directoryObjects"/>

office365/graph_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,11 @@ def _acquire_token():
229229

230230
return GraphClient(_acquire_token)
231231

232-
def execute_batch(self, items_per_batch=100, success_callback=None):
232+
def execute_batch(self, items_per_batch=20, success_callback=None):
233233
"""Constructs and submit a batch request
234234
235+
Per Batch size limitations: JSON batch requests are currently limited to 20 individual requests.
236+
235237
:param int items_per_batch: Maximum to be selected for bulk operation
236238
:param (List[ClientObject|ClientResult])-> None success_callback: A success callback
237239
"""

office365/runtime/odata/v4/batch_request.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,8 @@ def _extract_response(response, query):
4646
yield qry, resp
4747

4848
def _prepare_payload(self, query):
49-
"""
50-
Serializes a batch request body.
51-
52-
:type query: office365.runtime.queries.batch.BatchQuery
53-
"""
49+
# type: (BatchQuery) -> Dict
50+
""" Serializes a batch request body. """
5451
requests_json = []
5552
for qry in query.queries:
5653
qry_id = str(len(requests_json))
@@ -63,16 +60,16 @@ def _normalize_request(query, query_id, depends_on=None):
6360
# type: (ClientQuery, str, Optional[List[str]]) -> Dict[str, Any]
6461
""" """
6562
request = query.build_request()
66-
allowed_props = ["id", "method", "headers", "url", "body"]
67-
request_json = dict(
68-
(k, v)
69-
for k, v in vars(request).items()
70-
if v is not None and k in allowed_props
71-
)
72-
request_json["id"] = query_id
63+
64+
request_json = {
65+
"id": query_id,
66+
"url": request.url.replace(query.context.service_root_url(), ""),
67+
"method": request.method,
68+
"headers": request.headers,
69+
}
70+
if request.data:
71+
request_json["body"] = request.data
72+
7373
if depends_on is not None:
7474
request_json["dependsOn"] = depends_on
75-
request_json["url"] = request_json["url"].replace(
76-
query.context.service_root_url(), ""
77-
)
7875
return request_json

office365/sharepoint/logger/log_export.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ def __init__(self, context):
1414
)
1515

1616
def get_files(self):
17+
""" """
1718
return_type = LogFileInfoCollection(self.context)
1819
qry = ServiceOperationQuery(self, "GetFiles", None, None, None, return_type)
1920
self.context.add_query(qry)
2021
return return_type
2122

2223
def get_log_types(self):
24+
""" """
2325
return_type = ClientResult(self.context)
2426
qry = ServiceOperationQuery(self, "GetLogTypes", None, None, None, return_type)
2527
self.context.add_query(qry)

office365/sharepoint/migrationcenter/service/performance/data.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ def __init__(self, context, resource_path=None):
3131
context, PerformanceData, resource_path
3232
)
3333

34-
def get_data(self, StartTime=None, EndTime=None, AgentId=None, TimeUnit=None):
34+
def get_data(self, start_time=None, end_time=None, agent_id=None, time_unit=None):
3535
""" """
3636
return_type = ClientResult(self.context, PerformanceDashboardData())
3737
payload = {
38-
"StartTime": StartTime,
39-
"EndTime": EndTime,
40-
"AgentId": AgentId,
41-
"TimeUnit": TimeUnit,
38+
"StartTime": start_time,
39+
"EndTime": end_time,
40+
"AgentId": agent_id,
41+
"TimeUnit": time_unit,
4242
}
4343
qry = ServiceOperationQuery(self, "GetData", None, payload, None, return_type)
4444
self.context.add_query(qry)

requirements-examples.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-r requirements-dev.txt
2+
3+
faker

tests/test_graph_client.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,6 @@ def test_12_resolve_term_children_path(self):
8888
str(path),
8989
)
9090

91-
# def test_12_build_operation_resource_path(self):
92-
# result = self.client.me.drive.root.get_by_path("archive/Sample.rtf")
93-
# .get_activities_by_interval().execute_query()
94-
# self.assertEqual("/me/drive/root/getActivitiesByInterval()", str(result.resource_path))
95-
9691
def test_13_resolve_me_resource_path(self):
9792
current_user = self.client.me.get().execute_query()
9893
self.assertEqual(

0 commit comments

Comments
 (0)