Skip to content

Commit 39fff43

Browse files
committed
feat(events): get_event_services_counts (#149)
1 parent 10c5d19 commit 39fff43

2 files changed

Lines changed: 74 additions & 54 deletions

File tree

churchtools_api/events.py

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,9 @@ def update_event(
220220

221221
return True
222222

223-
def get_event_services_counts_ajax(self, eventId: int, **kwargs: dict) -> dict:
223+
def get_event_services_counts(self, eventId: int, **kwargs: dict) -> dict:
224224
"""Retrieve the number of services currently set for one specific event id.
225225
226-
optionally get the number of services for one specific id on that event only.
227-
228226
Arguments:
229227
eventId: id number of the calendar event
230228
**kwargs: keyword arguments as listed below
@@ -236,32 +234,32 @@ def get_event_services_counts_ajax(self, eventId: int, **kwargs: dict) -> dict:
236234
Returns:
237235
dict of service types and the number of services required for this event
238236
"""
239-
event = self.get_events(eventId=eventId)[0]
240-
237+
serviceGroupServiceIds = None
241238
if "serviceId" in kwargs and "serviceGroupId" not in kwargs:
242-
service_count = 0
243-
for service in event["eventServices"]:
244-
if service["serviceId"] == kwargs["serviceId"]:
245-
service_count += 1
246-
return {kwargs["serviceId"]: service_count}
239+
serviceGroupServiceIds = [kwargs["serviceId"]]
240+
247241
if "serviceId" not in kwargs and "serviceGroupId" in kwargs:
248242
all_services = self.get_services()
249243
serviceGroupServiceIds = [
250244
service["id"]
251245
for service in all_services
252246
if service["serviceGroupId"] == kwargs["serviceGroupId"]
253247
]
248+
if serviceGroupServiceIds:
249+
event_detail = self.get_events(eventId=eventId, include="EventServices")[0]
250+
result = {}
251+
for serviceId in serviceGroupServiceIds:
252+
result.update(
253+
{
254+
serviceId: sum(
255+
1
256+
for service in event_detail["eventServices"]
257+
if service["serviceId"] == serviceId
258+
)
259+
}
260+
)
261+
return result
254262

255-
services = {}
256-
for service in event["eventServices"]:
257-
serviceId = service["serviceId"]
258-
if serviceId in serviceGroupServiceIds:
259-
if serviceId in services:
260-
services[serviceId] += 1
261-
else:
262-
services[serviceId] = 1
263-
264-
return services
265263
logger.warning("Illegal combination of kwargs - check documentation either")
266264
return None
267265

@@ -281,12 +279,21 @@ def set_event_services_counts_ajax(
281279
headers = {"accept": "application/json"}
282280
params = {"q": "churchservice/ajax"}
283281

282+
# TODO@bensteUEM: legacy API is obsolete once correct endpoint is publishd
283+
# CT API already includes ability to change count therefore endpoint exists
284+
# CT Support issue - 147953
285+
# https://github.com/bensteUEM/ChurchToolsAPI/issues/149
286+
logging.warning(
287+
"Using undocumented AJAX API because "
288+
"function does not exist as REST endpoint"
289+
)
290+
284291
# restore other ServiceGroup assignments required for request form data
285292

286293
services = self.get_services(returnAsDict=True)
287294
serviceGroupId = services[serviceId]["serviceGroupId"]
288-
servicesOfServiceGroup = self.get_event_services_counts_ajax(
289-
eventId,
295+
servicesOfServiceGroup = self.get_event_services_counts(
296+
eventId=eventId,
290297
serviceGroupId=serviceGroupId,
291298
)
292299
# set new assignment
@@ -305,27 +312,28 @@ def set_event_services_counts_ajax(
305312

306313
response = self.session.post(url=url, headers=headers, params=params, data=data)
307314

308-
if response.status_code == requests.codes.ok:
309-
response_content = json.loads(response.content)
310-
response_success = response_content["status"] == "success"
311-
312-
number_match = (
313-
self.get_event_services_counts_ajax(eventId, serviceId=serviceId)[
314-
serviceId
315-
]
316-
== servicesCount
317-
)
318-
if number_match and response_success:
319-
return True
320-
logger.warning(
321-
"Request was successful but serviceId %s not changed to count %s ",
322-
serviceId,
323-
servicesCount,
315+
if response.status_code != requests.codes.ok:
316+
logger.info(
317+
"set_event_services_counts_ajax not successful: %s",
318+
response.status_code,
324319
)
325320
return False
326-
logger.info(
327-
"set_event_services_counts_ajax not successful: %s",
328-
response.status_code,
321+
322+
response_content = json.loads(response.content)
323+
response_success = response_content["status"] == "success"
324+
325+
number_match = (
326+
self.get_event_services_counts(eventId=eventId, serviceId=serviceId)[
327+
serviceId
328+
]
329+
== servicesCount
330+
)
331+
if number_match and response_success:
332+
return True
333+
logger.warning(
334+
"Request was successful but serviceId %s not changed to count %s ",
335+
serviceId,
336+
servicesCount,
329337
)
330338
return False
331339

tests/test_churchtools_api_events.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,38 +145,50 @@ def test_get_set_event_services_counts(self) -> None:
145145
tries to increase that number
146146
tries to get the number again
147147
tries to set it back to original
148+
verifies original value is restored
149+
148150
On ELKW1610.KRZ.TOOLS event ID 2626 is an existing test Event
149151
with schedule (1. Jan 2023)
150152
On ELKW1610.KRZ.TOOLS serviceID 1 is Predigt (1. Jan 2023)
151-
:return:
153+
154+
Returns:
155+
None
152156
"""
153157
eventId = 2626
154158
serviceId = 1
155-
original_count_comapre = 3
156159

157160
self.api.get_events(eventId=eventId)
158161

159-
original_count = self.api.get_event_services_counts_ajax(
162+
original_count = self.api.get_event_services_counts(
160163
eventId=eventId,
161164
serviceId=serviceId,
162165
)
163-
assert original_count == {serviceId: original_count_comapre}
164166

165-
result = self.api.set_event_services_counts_ajax(eventId, serviceId, 2)
166-
assert result
167+
is_updated = self.api.set_event_services_counts_ajax(
168+
eventId=eventId,
169+
serviceId=serviceId,
170+
servicesCount=original_count[serviceId] + 1,
171+
)
172+
assert is_updated
167173

168-
new_count = self.api.get_event_services_counts_ajax(
174+
new_count = self.api.get_event_services_counts(
169175
eventId=eventId,
170176
serviceId=serviceId,
171177
)
172-
assert new_count == {serviceId: 2}
178+
assert new_count == {serviceId: original_count[serviceId] + 1}
173179

174-
result = self.api.set_event_services_counts_ajax(
175-
eventId,
176-
serviceId,
177-
original_count[serviceId],
180+
is_updated = self.api.set_event_services_counts_ajax(
181+
eventId=eventId,
182+
serviceId=serviceId,
183+
servicesCount=original_count[serviceId],
178184
)
179-
assert result
185+
assert is_updated
186+
187+
original_count = self.api.get_event_services_counts(
188+
eventId=eventId,
189+
serviceId=serviceId,
190+
)
191+
assert original_count == {serviceId: original_count[serviceId]}
180192

181193
def test_get_set_event_admins(self) -> None:
182194
"""IMPORTANT - This test method and the parameters used depend on target system!

0 commit comments

Comments
 (0)