Skip to content

Commit ac97859

Browse files
authored
Merge pull request #328 from LleidaHack/integration
Integration
2 parents 6552444 + bc1faef commit ac97859

File tree

3 files changed

+179
-3
lines changed

3 files changed

+179
-3
lines changed

src/impl/Event/router_v1.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,25 @@ def get_pending_hackers_gruped(event_id: int, token: BaseToken = Depends(JWTBear
346346
return event_service.get_pending_hackers_gruped(event_id, token)
347347

348348

349+
@router.get("/{event_id}/hackers_participants_grouped_list")
350+
def get_hackers_participants_grouped_list(event_id: int,
351+
token: BaseToken = Depends(
352+
JWTBearer())):
353+
"""
354+
Get a grouped list of hacker participants for an event
355+
"""
356+
return event_service.get_hackers_participants_grouped_list(event_id, token)
357+
358+
359+
@router.get("/{event_id}/hackers_participants_list")
360+
def get_hackers_participants_list(event_id: int,
361+
token: BaseToken = Depends(JWTBearer())):
362+
"""
363+
Get a list of hacker participants for an event
364+
"""
365+
return event_service.get_hackers_participants_list(event_id, token)
366+
367+
349368
@router.get("/{event_id}/resend-accepted-mails")
350369
def resend_accept_mails(event_id: int, token: BaseToken = Depends(JWTBearer())):
351370
event_service.resend_mails(event_id, token)

src/impl/Event/service.py

Lines changed: 104 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@
2424
from src.impl.Mail.internall_templates import InternalTemplate
2525
from src.utils.Base.BaseClient import BaseClient
2626
from src.utils.Base.BaseService import BaseService
27-
from src.utils.service_utils import check_image, set_existing_data, subtract_lists
27+
from src.utils.service_utils import (
28+
check_image,
29+
set_existing_data,
30+
subtract_lists,
31+
get_hacker_info,
32+
)
2833
from src.utils.Token import AssistenceToken, BaseToken
2934
from src.utils.UserType import UserType
3035

@@ -53,8 +58,7 @@ def get_hackeps(self, year: int):
5358
e = (
5459
db.session.query(Event)
5560
.filter(
56-
Event.name.ilike("HackEPS%"),
57-
Event.start_date <= datetime(year, 12, 31)
61+
Event.name.ilike("HackEPS%"), Event.start_date <= datetime(year, 12, 31)
5862
)
5963
.order_by(desc(Event.end_date))
6064
.first()
@@ -557,6 +561,103 @@ def get_pending_hackers_gruped(self, event_id: int, data: BaseToken):
557561
# Combine group and nogroup data into a dictionary
558562
return {"groups": output_data, "nogroup": nogroup_data}
559563

564+
@BaseService.needs_service("HackerGroupService")
565+
def get_hackers_participants_list(
566+
self, event_id: int, data: BaseToken
567+
): ##Servei per obtindre la llista de participants amb status acceptat, rechazat o pending.
568+
if not data.check([UserType.LLEIDAHACKER]):
569+
raise AuthenticationException("Not authorized")
570+
# Extract hacker IDs from registered_hackers
571+
event = self.get_by_id(event_id)
572+
# Extract pending hackers
573+
pending_hackers_ids = [
574+
h.id
575+
for h in subtract_lists(
576+
subtract_lists(event.registered_hackers, event.accepted_hackers),
577+
event.rejected_hackers,
578+
)
579+
]
580+
registered_hackers = event.registered_hackers
581+
# Accepted hackers
582+
accepted_hackers_ids = [h.id for h in event.accepted_hackers]
583+
# Rejected hackers
584+
rejected_hackers_ids = [h.id for h in event.rejected_hackers]
585+
586+
# List hackers and add status as pending, accepted or rejected.
587+
participants_list = [
588+
get_hacker_info(
589+
hacker, pending_hackers_ids, accepted_hackers_ids, rejected_hackers_ids
590+
)
591+
for hacker in registered_hackers
592+
]
593+
# Combine group and nogroup data into a dictionary
594+
return {"participants": participants_list}
595+
596+
## This returns 2 lists: people going alone and people in groups. They will have status and food restrictions.
597+
@BaseService.needs_service("HackerGroupService")
598+
def get_hackers_participants_grouped_list(self, event_id: int, data: BaseToken):
599+
if not data.check([UserType.LLEIDAHACKER]):
600+
raise AuthenticationException("Not authorized")
601+
# Extract hacker IDs from registered_hackers
602+
event = self.get_by_id(event_id)
603+
pending_hackers_ids = [
604+
h.id
605+
for h in subtract_lists(
606+
subtract_lists(event.registered_hackers, event.accepted_hackers),
607+
event.rejected_hackers,
608+
)
609+
]
610+
# Registered hackers
611+
registered_hackers = event.registered_hackers
612+
# Accepted hackers
613+
accepted_hackers_ids = [h.id for h in event.accepted_hackers]
614+
# Rejected hackers
615+
rejected_hackers_ids = [h.id for h in event.rejected_hackers]
616+
617+
event_groups = event.groups
618+
group_users = []
619+
for group in event_groups:
620+
group_users.extend([hacker.id for hacker in group.members])
621+
622+
# List hackers and add status as pending, accepted or rejected.
623+
output_data = []
624+
non_group_hackers_ids = subtract_lists(
625+
pending_hackers_ids + accepted_hackers_ids + rejected_hackers_ids,
626+
group_users,
627+
)
628+
629+
non_group_hackers_ids_set = set(non_group_hackers_ids)
630+
non_group_hackers = [
631+
hacker
632+
for hacker in registered_hackers
633+
if hacker.id in non_group_hackers_ids_set
634+
]
635+
636+
non_group_hackers_participants = [
637+
get_hacker_info(
638+
hacker, pending_hackers_ids, accepted_hackers_ids, rejected_hackers_ids
639+
)
640+
for hacker in non_group_hackers
641+
]
642+
643+
for group in event_groups:
644+
group_data = {
645+
"name": group.name,
646+
"members": [
647+
get_hacker_info(
648+
hacker,
649+
pending_hackers_ids,
650+
accepted_hackers_ids,
651+
rejected_hackers_ids,
652+
)
653+
for hacker in group.members
654+
],
655+
}
656+
output_data.append(group_data)
657+
# Retrieve pending hacker groups
658+
# Combine group and nogroup data into a dictionary
659+
return {"groups": output_data, "nogroup": non_group_hackers_participants}
660+
560661
@BaseService.needs_service(HackerService)
561662
def confirm_assistance(self, data: AssistenceToken):
562663
# data = get_data_from_token(token, special=True)

src/utils/service_utils.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,59 @@ def generate_user_code(length=20):
5959

6060
def subtract_lists(list1, list2):
6161
return [item for item in list1 if item not in list2]
62+
63+
64+
def get_hacker_status(hacker_id, pending_hackers_ids, accepted_hackers_ids,
65+
rejected_hackers_ids):
66+
"""
67+
Determine the status of a hacker based on their ID and lists of pending, accepted, and rejected hacker IDs.
68+
69+
Args:
70+
hacker_id: The ID of the hacker to check.
71+
pending_hackers_ids: List of IDs for hackers with pending status.
72+
accepted_hackers_ids: List of IDs for hackers with accepted status.
73+
rejected_hackers_ids: List of IDs for hackers with rejected status.
74+
75+
Returns:
76+
A string representing the hacker's status ("pending", "accepted", "rejected"), or None if the ID is not found in any list.
77+
"""
78+
if hacker_id in pending_hackers_ids:
79+
return "pending"
80+
elif hacker_id in accepted_hackers_ids:
81+
return "accepted"
82+
elif hacker_id in rejected_hackers_ids:
83+
return "rejected"
84+
return None
85+
86+
87+
attribute_hacker_list = [
88+
"id",
89+
"name",
90+
"email",
91+
"birthdate",
92+
"address",
93+
"food_restrictions",
94+
"shirt_size",
95+
]
96+
97+
def get_hacker_info(hacker, pending_hackers_ids, accepted_hackers_ids, rejected_hackers_ids):
98+
"""
99+
Generate a dictionary containing hacker attributes and their status.
100+
101+
Args:
102+
hacker: The hacker object.
103+
pending_hackers_ids: List of IDs for pending hackers.
104+
accepted_hackers_ids: List of IDs for accepted hackers.
105+
rejected_hackers_ids: List of IDs for rejected hackers.
106+
107+
Returns:
108+
A dictionary with hacker attributes and their status.
109+
"""
110+
hacker_info = {
111+
attr: getattr(hacker, attr)
112+
for attr in attribute_hacker_list
113+
}
114+
hacker_info["status"] = get_hacker_status(
115+
hacker.id, pending_hackers_ids, accepted_hackers_ids, rejected_hackers_ids
116+
)
117+
return hacker_info

0 commit comments

Comments
 (0)