@@ -127,13 +127,12 @@ def get_context_data(self, **kwargs):
127127    def  get_exporter (self , public = True ):
128128        url  =  resolve (self .request .path_info )
129129
130-         # Handle both  export and  export-tokenized URLs 
130+         calendar_exports   =  [ "export.google-calendar" ,  " export.my-google-calendar" ,  " export.other-calendar" ,  "export.my-other-calendar" ] 
131131        if  url .url_name  in  ["export" , "export-tokenized" ]:
132132            exporter  =  url .kwargs .get ("name" ) or  unquote (
133133                self .request .GET .get ("exporter" )
134134            )
135-         elif  url .url_name  in  ["export.google-calendar" , "export.my-google-calendar" ]:
136-             # Handle our explicit Google Calendar URL patterns 
135+         elif  url .url_name  in  calendar_exports :
137136            exporter  =  url .url_name .replace ("export." , "" )
138137        else :
139138            exporter  =  url .url_name 
@@ -360,20 +359,25 @@ class ChangelogView(EventPermissionRequired, TemplateView):
360359    permission_required  =  "agenda.view_schedule" 
361360
362361
363- class  GoogleCalendarRedirectView (EventPermissionRequired , ScheduleMixin , TemplateView ):
364-     # Define constant  for session key 
362+ class  CalendarRedirectView (EventPermissionRequired , ScheduleMixin , TemplateView ):
363+     """Handles redirects  for both Google Calendar and other calendar applications""" 
365364    MY_STARRED_ICS_TOKEN_SESSION_KEY  =  'my_starred_ics_token' 
366365    permission_required  =  "agenda.view_schedule" 
367366
368367    def  get (self , request , * args , ** kwargs ):
369-         # Use resolver_match.url_name for robust route detection  
368+         # Get URL name from resolver  
370369        url_name  =  request .resolver_match .url_name  if  request .resolver_match  else  None 
371-         if  url_name  ==  'export.my-google-calendar' :
372-             # Generate tokenized URL for my starred sessions 
370+         
371+         # Determine calendar type and starred status from URL pattern 
372+         is_google  =  "google"  in  url_name 
373+         is_my  =  "my"  in  url_name 
374+         
375+         if  is_my :
376+             # For starred sessions 
373377            if  not  request .user .is_authenticated :
374378                return  HttpResponseRedirect (self .request .event .urls .login )
375379
376-             # Use constant instead of hardcoded string  
380+             # Check for existing valid token  
377381            existing_token  =  request .session .get (self .MY_STARRED_ICS_TOKEN_SESSION_KEY )
378382            generate_new_token  =  True 
379383
@@ -384,12 +388,12 @@ def get(self, request, *args, **kwargs):
384388                    token  =  existing_token 
385389                    generate_new_token  =  False 
386390
387-             # Generate a  new token if needed 
391+             # Generate new token if needed 
388392            if  generate_new_token :
389393                token  =  self .generate_ics_token (request .user .id )
390-                 # Use constant here too 
391394                request .session [self .MY_STARRED_ICS_TOKEN_SESSION_KEY ] =  token 
392395
396+             # Build tokenized URL for starred sessions 
393397            ics_url  =  request .build_absolute_uri (
394398                reverse ('agenda:export-tokenized' , kwargs = {
395399                    'event' : self .request .event .slug ,
@@ -398,19 +402,32 @@ def get(self, request, *args, **kwargs):
398402                })
399403            )
400404        else :
401-             # Regular  public calendar 
405+             # Build  public calendar URL  
402406            ics_url  =  request .build_absolute_uri (
403407                reverse ('agenda:export' , kwargs = {
404408                    'event' : self .request .event .slug ,
405409                    'name' : 'schedule.ics' 
406410                })
407411            )
408412
409-         # Change scheme to webcal 
410-         parsed  =  urlparse (ics_url )
411-         ics_url  =  urlunparse (('webcal' ,) +  parsed [1 :])
412- 
413-         # Create Google Calendar URL 
414-         google_url  =  f"https://calendar.google.com/calendar/render?{ urlencode ({'cid' : ics_url })}  " 
415- 
416-         return  HttpResponseRedirect (google_url )
413+         # Handle redirect based on calendar type 
414+         if  is_google :
415+             # Google Calendar requires special URL format 
416+             google_url  =  f"https://calendar.google.com/calendar/render?{ urlencode ({'cid' : ics_url })}  " 
417+             response  =  HttpResponse (
418+                 f'<html><head><meta http-equiv="refresh" content="0;url={ google_url }  "></head>' 
419+                 f'<body><p style="text-align: center; padding:2vw; font-family: Roboto,Helvetica Neue,HelveticaNeue,Helvetica,Arial,sans-serif;">Redirecting to Google Calendar: { google_url }  </p><script>window.location.href="{ google_url }  ";</script></body></html>' ,
420+                 content_type = 'text/html' 
421+             )
422+             return  response 
423+         else :
424+             # Other calendars use webcal protocol 
425+             parsed  =  urlparse (ics_url )
426+             webcal_url  =  urlunparse (('webcal' ,) +  parsed [1 :])
427+             # Create a simple HTML redirect with meta refresh 
428+             response  =  HttpResponse (
429+                 f'<html><head><meta http-equiv="refresh" content="0;url={ webcal_url }  "></head>' 
430+                 f'<body><p style="text-align: center; padding:2vw; font-family: Roboto,Helvetica Neue,HelveticaNeue,Helvetica,Arial,sans-serif;">Redirecting to: { webcal_url }  </p><script>window.location.href="{ webcal_url }  ";</script></body></html>' ,
431+                 content_type = 'text/html' 
432+                 )
433+             return  response 
0 commit comments