diff --git a/src/impl/Event/router_v1.py b/src/impl/Event/router_v1.py index 709ca668..f078d259 100644 --- a/src/impl/Event/router_v1.py +++ b/src/impl/Event/router_v1.py @@ -379,9 +379,20 @@ def resend_accept_mail( return {"success": True} -@router.get("/{event_id}/send_slack_mail/") -def send_slack_mail(event_id: int, token: BaseToken = Depends(JWTBearer())): - event_service.send_slack_mail(event_id, token) +@router.post("/{event_id}/send_slack_mail/") +def send_slack_mail(event_id: int, slackUrl: str, token: BaseToken = Depends(JWTBearer())): + event_service.send_slack_mail(event_id, slackUrl, token) + return {"success": True} + +@router.post("/{event_id}/send_reminder_mails/") +def send_reminder_mails( + event_id: int, + token: BaseToken = Depends(JWTBearer()), +): + """ + Send reminder mails to all accepted hackers of an event + """ + event_service.send_reminder_mails(event_id, token) return {"success": True} diff --git a/src/impl/Event/service.py b/src/impl/Event/service.py index 3b0f2dff..49fd510d 100644 --- a/src/impl/Event/service.py +++ b/src/impl/Event/service.py @@ -972,7 +972,7 @@ def resend_mail(self, event_id: int, hacker_id: int, data: BaseToken): db.session.commit() @BaseService.needs_service(MailClient) - def send_slack_mail(self, event_id: int, data: BaseToken): + def send_slack_mail(self, event_id: int, slackUrl: str, data: BaseToken): if not data.check([UserType.LLEIDAHACKER]): raise AuthenticationException("Not authorized") event = self.get_by_id(event_id) @@ -984,7 +984,7 @@ def send_slack_mail(self, event_id: int, data: BaseToken): hackers = event.accepted_hackers for hacker in hackers: - self.mail_client.create_mail( + mail = self.mail_client.create_mail( MailCreate( template_id=self.mail_client.get_internall_template_id( InternalTemplate.EVENT_SLACK_INVITE @@ -992,8 +992,73 @@ def send_slack_mail(self, event_id: int, data: BaseToken): subject="HackEPS2024 slack invitation", receiver_id=str(hacker.id), receiver_mail=str(hacker.email), - fields="https://join.slack.com/t/hackeps2024/shared_invite/zt-2usc9qny9-z3NkybNlCXFAI9m0Cl~FsQ", + fields=slackUrl, ) ) + # send the created mail + self.mail_client.send_mail_by_id(mail.id) db.session.commit() + + @BaseService.needs_service(MailClient) + def send_reminder_mails( + self, + event_id: int, + data: BaseToken, + ): + if not data.check([UserType.LLEIDAHACKER]): + raise AuthenticationException("Not authorized") + event = self.get_by_id(event_id) + if event.archived: + raise InvalidDataException( + "Unable to operate with an archived event, unarchive it first" + ) + + hackers = event.accepted_hackers + + for hacker in hackers: + try: + reg = ( + db.session.query(HackerRegistration) + .filter( + HackerRegistration.user_id == hacker.id, + HackerRegistration.event_id == event.id, + ) + .first() + ) + # send reminder only if registration exists and assistance not confirmed + if reg is None or reg.confirmed_assistance: + continue + + # ensure there is a confirmation token for this registration + if not reg.confirm_assistance_token: + reg.confirm_assistance_token = AssistenceToken(hacker, event.id).to_token() + + # compute days left until event (rounded down) + try: + delta = event.start_date - datetime.now() + days_left = max(0, int(delta.total_seconds() // 86400)) + except Exception: + days_left = 0 + + fields = f"{hacker.name},{event.name},{days_left},{reg.confirm_assistance_token}" + + mail = self.mail_client.create_mail( + MailCreate( + template_id=self.mail_client.get_internall_template_id( + InternalTemplate.EVENT_HACKER_REMINDER + ), + subject=f"{event.name} - Recordatori de confirmació d'assistència", + receiver_id=str(hacker.id), + receiver_mail=str(hacker.email), + fields=fields, + ) + ) + # send the created mail + self.mail_client.send_mail_by_id(mail.id) + db.session.commit() + except Exception as e: + db.session.rollback() + # Optionally log the error here, e.g.: + # print(f"Failed to send reminder to hacker {hacker.id}: {e}") + continue \ No newline at end of file diff --git a/src/impl/Mail/internall_templates.py b/src/impl/Mail/internall_templates.py index e50fd964..18b695ca 100644 --- a/src/impl/Mail/internall_templates.py +++ b/src/impl/Mail/internall_templates.py @@ -11,5 +11,7 @@ class InternalTemplate(Enum): EVENT_HACKER_REGISTERED = "event_hacker_registered" EVENT_HACKER_ACCEPTED = "event_hacker_accepted" + + EVENT_HACKER_REMINDER = "event_hacker_reminder" # EVENT_HACKER_REJECTED = 'event_hacker_accepted' # EVENT_HACKER_CONFIRMATION = 'event_hacker_confirmation'