44import textwrap
55from contextlib import suppress
66from urllib .parse import unquote , urlencode , urlparse , urlunparse
7+ from datetime import timedelta
78
89from django .contrib import messages
910from django .core import signing
1011from django .utils import timezone
11- from datetime import timedelta
1212from django .http import (
1313 Http404 ,
1414 HttpResponse ,
@@ -84,7 +84,7 @@ def parse_ics_token(token):
8484 raise ValueError ("Token expired" )
8585 return value ["user_id" ]
8686 except (signing .BadSignature , signing .SignatureExpired , KeyError , ValueError ) as e :
87- logger .warning (f" Failed to parse ICS token: { e } " )
87+ logger .warning (' Failed to parse ICS token: %s' , e )
8888 return None
8989
9090 @staticmethod
@@ -99,14 +99,10 @@ def check_token_expiry(token):
9999 try :
100100 value = signing .loads (token , salt = "my-starred-ics" )
101101 expiry_date = timezone .datetime .fromtimestamp (value ["exp" ], tz = timezone .utc )
102- days_until_expiry = (expiry_date - timezone .now ()).days
103-
104- # Token is valid but check if it's expiring soon
105- if days_until_expiry < 4 :
106- return False # Valid but expiring soon
107- return True # Valid and not expiring soon
108- except (signing .BadSignature , KeyError , ValueError ) as e :
109- logger .warning (f"Failed to check token expiry: { e } " )
102+ time_until_expiry = expiry_date - timezone .now ()
103+ return time_until_expiry >= timedelta (days = 4 )
104+ except Exception as e :
105+ logger .warning ('Failed to check token expiry: %s' , e )
110106 return None # Invalid token
111107
112108class ExporterView (EventPermissionRequired , ScheduleMixin , TemplateView ):
@@ -365,6 +361,8 @@ class ChangelogView(EventPermissionRequired, TemplateView):
365361
366362
367363class GoogleCalendarRedirectView (EventPermissionRequired , ScheduleMixin , TemplateView ):
364+ # Define constant for session key
365+ MY_STARRED_ICS_TOKEN_SESSION_KEY = 'my_starred_ics_token'
368366 permission_required = "agenda.view_schedule"
369367
370368 def get (self , request , * args , ** kwargs ):
@@ -375,22 +373,22 @@ def get(self, request, *args, **kwargs):
375373 if not request .user .is_authenticated :
376374 return HttpResponseRedirect (self .request .event .urls .login )
377375
378- # Get existing token from session if available
379- existing_token = request .session .get ('my_starred_ics_token' )
376+ # Use constant instead of hardcoded string
377+ existing_token = request .session .get (self . MY_STARRED_ICS_TOKEN_SESSION_KEY )
380378 generate_new_token = True
381379
382380 # If we have an existing token, check if it's still valid and not expiring soon
383381 if existing_token :
384382 token_status = self .check_token_expiry (existing_token )
385- if token_status is True : # Token is valid and not expiring soon
383+ if token_status is True :
386384 token = existing_token
387385 generate_new_token = False
388386
389387 # Generate a new token if needed
390388 if generate_new_token :
391389 token = self .generate_ics_token (request .user .id )
392- # Store the token in the session for future use
393- request .session ['my_starred_ics_token' ] = token
390+ # Use constant here too
391+ request .session [self . MY_STARRED_ICS_TOKEN_SESSION_KEY ] = token
394392
395393 ics_url = request .build_absolute_uri (
396394 reverse ('agenda:export-tokenized' , kwargs = {
0 commit comments