Skip to content

Commit a3108c3

Browse files
committed
feat(persons): adding add delete person (#279)
1 parent 978d021 commit a3108c3

2 files changed

Lines changed: 134 additions & 0 deletions

File tree

churchtools_api/persons.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,107 @@ def get_persons_masterdata(
128128
response.content,
129129
)
130130
return None
131+
132+
def create_person(self, person_data: dict) -> dict | None:
133+
"""Function to create a person to ChurchTools.
134+
135+
Arguments:
136+
person_data: dict with person data according to CT API
137+
firstName
138+
lastName
139+
email
140+
141+
and additional optional fields using the following deafults:
142+
* departmentIds defaults to 0
143+
* statusId defaults to 0 (unknown)
144+
* campusId defaults to 0 (first campus)
145+
* privacyPolicyAgreementTypeId defaults to 1 (Gruppenanmeldeforumular)
146+
* privacyPolicyAgreementWhoId defaults to 1 (Person selbst)
147+
* privacyPolicyAgreementDate defaults to "1900-01-01"
148+
149+
Permissions:
150+
create person
151+
152+
Returns:
153+
dict with created person data including new ID
154+
"""
155+
# add default keys if not provided
156+
required_keys = ["firstName", "lastName", "email"]
157+
if not all(key in person_data for key in required_keys):
158+
logger.error(
159+
"Person creation failed: missing required keys in person_data: %s",
160+
required_keys,
161+
)
162+
return None
163+
164+
default_keys = {
165+
"departmentIds": [1],
166+
"statusId": 0, # Unkonwn
167+
"campusId": 0, # First Campus
168+
"email": "no-mail@nomail.xx",
169+
"privacyPolicyAgreementTypeId": 1, # Gruppenanmeldeforumular
170+
"privacyPolicyAgreementWhoId": 1, # Person selbst
171+
"privacyPolicyAgreementDate": "1900-01-01",
172+
}
173+
174+
for key in default_keys:
175+
if key not in person_data:
176+
person_data[key] = default_keys[key]
177+
178+
# prepare request
179+
180+
url = self.domain + "/api/persons"
181+
182+
headers = {
183+
"accept": "application/json",
184+
"Content-Type": "application/json",
185+
}
186+
187+
response = self.session.post(
188+
url=url, headers=headers, data=json.dumps(person_data)
189+
)
190+
191+
# use reposonse
192+
193+
if response.status_code == requests.codes.created:
194+
response_content = json.loads(response.content)
195+
response_data = response_content["data"].copy()
196+
197+
logger.debug("Person creation successful id=%s", response_data.get("id"))
198+
return response_data
199+
logger.warning(
200+
"Person creation failed: %s %s",
201+
response.status_code,
202+
response.content,
203+
)
204+
return None
205+
206+
def delete_person(self, personId: int) -> bool:
207+
"""Function to delete a person from ChurchTools.
208+
209+
Arguments:
210+
personId: ID of the person to delete
211+
212+
Permissions:
213+
delete person
214+
215+
Returns:
216+
bool indicating success
217+
"""
218+
url = self.domain + f"/api/persons/{personId}"
219+
220+
headers = {
221+
"accept": "application/json",
222+
}
223+
response = self.session.delete(url=url, headers=headers)
224+
225+
if response.status_code == requests.codes.no_content:
226+
logger.debug("Person deletion successful id=%s", personId)
227+
return True
228+
logger.warning(
229+
"Person deletion failed id=%s: %s %s",
230+
personId,
231+
response.status_code,
232+
response.content,
233+
)
234+
return False

tests/test_churchtools_api_persons.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,33 @@ def test_get_persons_sex_id_none(self) -> None:
133133
result = gender_map[None]
134134

135135
assert result == EXPECTED_RESULT
136+
137+
def test_create_delete_person(self) -> None:
138+
"""Tests creating and deleting a person.
139+
140+
IMPORTANT - This test method and the parameters used depend on target system!
141+
the hard coded sample exists on ELKW1610.KRZ.TOOLS
142+
"""
143+
SAMPLE_FIRST_NAME = "TestFirstName"
144+
SAMPLE_LAST_NAME = "TestLastName"
145+
SAMPLE_MAIL = "TestMail@Example.com"
146+
147+
sample_person_data = {
148+
"firstName": SAMPLE_FIRST_NAME,
149+
"lastName": SAMPLE_LAST_NAME,
150+
"email": SAMPLE_MAIL,
151+
}
152+
153+
# create person
154+
new_person = self.api.create_person(sample_person_data)
155+
assert isinstance(new_person["id"], int)
156+
157+
# retrieve person and check data
158+
check_person = self.api.get_persons(ids=[new_person["id"]])[0]
159+
assert check_person["firstName"] == SAMPLE_FIRST_NAME
160+
assert check_person["lastName"] == SAMPLE_LAST_NAME
161+
assert check_person["email"] == SAMPLE_MAIL
162+
163+
# delete person
164+
delete_result = self.api.delete_person(personId=new_person["id"])
165+
assert delete_result is True

0 commit comments

Comments
 (0)