Skip to content

Commit 93d9be2

Browse files
authored
Fix the ability to create identical events (#109)
* Fix the ability to create identical events * Fix the ability to create identical events * Fix unique events list comp fix * Fix unique events dict get fix
1 parent 5b553c0 commit 93d9be2

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

calendar_backend/routes/event/event.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,35 @@ async def create_events(
108108
result = []
109109
for event in events:
110110
event_dict = event.model_dump()
111-
rooms = [Room.get(room_id, session=db.session) for room_id in event_dict.pop("room_id", [])]
112-
lecturers = [Lecturer.get(lecturer_id, session=db.session) for lecturer_id in event_dict.pop("lecturer_id", [])]
113-
groups = [Group.get(group_id, session=db.session) for group_id in event_dict.pop("group_id", [])]
114-
result.append(
115-
Event.create(
116-
**event_dict,
117-
room=rooms,
118-
lecturer=lecturers,
119-
group=groups,
120-
session=db.session,
121-
)
111+
existing_events_query = (
112+
Event.get_all(session=db.session)
113+
.filter(Event.name == event_dict.get("name"))
114+
.filter(Event.start_ts == event_dict.get("start_ts"))
115+
.filter(Event.end_ts == event_dict.get("end_ts"))
122116
)
117+
is_unique = True
118+
for existing_event in existing_events_query.all():
119+
if (
120+
{column.id for column in existing_event.group} == set(event_dict["group_id"])
121+
and {column.id for column in existing_event.room} == set(event_dict["room_id"])
122+
and {column.id for column in existing_event.lecturer} == set(event_dict["lecturer_id"])
123+
):
124+
is_unique = False
125+
if is_unique:
126+
rooms = [Room.get(room_id, session=db.session) for room_id in event_dict.pop("room_id", [])]
127+
lecturers = [
128+
Lecturer.get(lecturer_id, session=db.session) for lecturer_id in event_dict.pop("lecturer_id", [])
129+
]
130+
groups = [Group.get(group_id, session=db.session) for group_id in event_dict.pop("group_id", [])]
131+
result.append(
132+
Event.create(
133+
**event_dict,
134+
room=rooms,
135+
lecturer=lecturers,
136+
group=groups,
137+
session=db.session,
138+
)
139+
)
123140
db.session.commit()
124141
adapter = TypeAdapter(list[EventGet])
125142
return adapter.validate_python(result)

tests/event/event.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,52 @@ def test_create_many(client_auth: TestClient, dbsession: Session, room_factory,
9898
assert [row.id for row in response_model.group] == request_obj[1]["group_id"]
9999

100100

101+
def test_create_many_clones(client_auth: TestClient, dbsession: Session, room_factory, group_factory, lecturer_factory):
102+
time_stamp = datetime.datetime.now()
103+
name1 = f"name1_{time_stamp}"
104+
room_path1 = room_factory(client_auth)
105+
group_path1 = group_factory(client_auth)
106+
lecturer_path1 = lecturer_factory(client_auth)
107+
name2 = f"name2_{time_stamp}"
108+
room_path2 = room_factory(client_auth)
109+
group_path2 = group_factory(client_auth)
110+
lecturer_path2 = lecturer_factory(client_auth)
111+
room_id1 = int(room_path1.split("/")[-1])
112+
group_id1 = int(group_path1.split("/")[-1])
113+
lecturer_id1 = int(lecturer_path1.split("/")[-1])
114+
room_id2 = int(room_path2.split("/")[-1])
115+
group_id2 = int(group_path2.split("/")[-1])
116+
lecturer_id2 = int(lecturer_path2.split("/")[-1])
117+
request_obj = [
118+
{
119+
"name": name1,
120+
"room_id": [room_id1],
121+
"group_id": [group_id1],
122+
"lecturer_id": [lecturer_id1],
123+
"start_ts": "2022-08-26T22:32:38.575Z",
124+
"end_ts": "2022-08-26T22:32:38.575Z",
125+
},
126+
{
127+
"name": name2,
128+
"room_id": [room_id2],
129+
"group_id": [group_id2],
130+
"lecturer_id": [lecturer_id2],
131+
"start_ts": "2022-08-26T22:32:38.575Z",
132+
"end_ts": "2022-08-26T22:32:38.575Z",
133+
},
134+
]
135+
response = client_auth.post(f"{RESOURCE}bulk", json=request_obj)
136+
assert response.status_code == status.HTTP_200_OK, response.json()
137+
assert response.json()[0]["name"] == request_obj[0]["name"]
138+
response = client_auth.post(f"{RESOURCE}bulk", json=request_obj)
139+
assert response.status_code == status.HTTP_200_OK
140+
assert len(response.json()) == 0
141+
events = dbsession.query(Event).filter(Event.name == name1).all()
142+
assert len(events) == 1
143+
events = dbsession.query(Event).filter(Event.name == name2).all()
144+
assert len(events) == 1
145+
146+
101147
def test_delete(client_auth: TestClient, dbsession: Session, room_path, lecturer_path, group_path):
102148
room_id = int(room_path.split("/")[-1])
103149
group_id = int(group_path.split("/")[-1])

0 commit comments

Comments
 (0)