88from apps .common .constants import NL
99from apps .slack .blocks import get_pagination_buttons , markdown
1010
11+ PERMISSIONS_BLOCK = [markdown ("*You do not have the permission to access calendar events.*" )]
12+
1113
1214def get_cancel_reminder_blocks (reminder_schedule_id : int , slack_user_id : str ) -> list [dict ]:
1315 """Get the blocks for canceling a reminder."""
16+ from apps .nest .auth .calendar_events import has_calendar_events_permission
1417 from apps .nest .models .reminder_schedule import ReminderSchedule
1518 from apps .nest .schedulers .calendar_events .slack import SlackScheduler
1619
20+ if not has_calendar_events_permission (slack_user_id ):
21+ return PERMISSIONS_BLOCK
1722 try :
1823 reminder_schedule = ReminderSchedule .objects .get (pk = reminder_schedule_id )
1924 except ReminderSchedule .DoesNotExist :
@@ -31,18 +36,26 @@ def get_cancel_reminder_blocks(reminder_schedule_id: int, slack_user_id: str) ->
3136
3237def get_events_blocks (slack_user_id : str , presentation , page : int = 1 ) -> list [dict ]:
3338 """Get Google Calendar events blocks for Slack home view."""
39+ from apps .nest .auth .calendar_events import has_calendar_events_permission
3440 from apps .nest .clients .google_calendar import GoogleCalendarClient
3541 from apps .nest .models .google_account_authorization import GoogleAccountAuthorization
3642 from apps .owasp .models .event import Event
3743
44+ if not has_calendar_events_permission (slack_user_id ):
45+ return PERMISSIONS_BLOCK
46+
47+ # Authorize with Google
3848 auth = GoogleAccountAuthorization .authorize (slack_user_id )
49+ # If not authorized, we will get a tuple with the authorization URL
3950 if not isinstance (auth , GoogleAccountAuthorization ):
4051 return [markdown (f"*Please sign in with Google first through this <{ auth [0 ]} |link>*" )]
4152 try :
53+ # Get a 24-hour window of events
4254 client = GoogleCalendarClient (auth )
4355 min_time = timezone .now () + timezone .timedelta (days = (page - 1 ))
4456 max_time = min_time + timezone .timedelta (days = 1 )
4557 events = client .get_events (min_time = min_time , max_time = max_time )
58+ # Catch network errors
4659 except ServerNotFoundError :
4760 return [markdown ("*Please check your internet connection.*" )]
4861 parsed_events = Event .parse_google_calendar_events (events )
@@ -58,7 +71,11 @@ def get_events_blocks(slack_user_id: str, presentation, page: int = 1) -> list[d
5871 )
5972 ]
6073 for i , event in enumerate (parsed_events ):
74+ # We will need this number later to set reminders
75+ # We are multiplying by 1000 to avoid collisions between pages
76+ # as we don't get the length of events list from Google Calendar API.
6177 event_number = (i + 1 ) + 1000 * (page - 1 )
78+ # We will show the user the event number and cache the event ID for later use.
6279 cache .set (f"{ slack_user_id } _{ event_number } " , event .google_calendar_id , timeout = 3600 )
6380 blocks .append (
6481 markdown (
@@ -82,8 +99,12 @@ def get_events_blocks(slack_user_id: str, presentation, page: int = 1) -> list[d
8299
83100def get_reminders_blocks (slack_user_id : str ) -> list [dict ]:
84101 """Get reminders blocks for Slack home view."""
102+ from apps .nest .auth .calendar_events import has_calendar_events_permission
85103 from apps .nest .models .reminder_schedule import ReminderSchedule
86104
105+ if not has_calendar_events_permission (slack_user_id ):
106+ return PERMISSIONS_BLOCK
107+
87108 reminders_schedules = ReminderSchedule .objects .filter (
88109 reminder__member__slack_user_id = slack_user_id ,
89110 ).order_by ("scheduled_time" )
@@ -106,9 +127,13 @@ def get_reminders_blocks(slack_user_id: str) -> list[dict]:
106127
107128def get_setting_reminder_blocks (args , slack_user_id : str ) -> list [dict ]:
108129 """Get the blocks for setting a reminder."""
130+ from apps .nest .auth .calendar_events import has_calendar_events_permission
109131 from apps .nest .handlers .calendar_events import set_reminder
110132 from apps .nest .schedulers .calendar_events .slack import SlackScheduler
111133
134+ if not has_calendar_events_permission (slack_user_id ):
135+ return PERMISSIONS_BLOCK
136+
112137 try :
113138 reminder_schedule = set_reminder (
114139 channel = args .channel ,
0 commit comments