or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

access-control.mdattendees.mdcalendars.mdconferences.mdcore-operations.mdevents.mdfree-busy.mdindex.mdrecurrence.mdreminders.md

reminders.mddocs/

0

# Reminders and Notifications

1

2

GCSA provides comprehensive reminder and notification support through the Reminder, EmailReminder, and PopupReminder classes. These classes enable flexible timing options for both relative and absolute reminders to ensure users never miss important events.

3

4

## Package Information

5

6

```python

7

from gcsa.reminders import Reminder, EmailReminder, PopupReminder

8

from gcsa.event import Event

9

```

10

11

## Reminder Base Class

12

13

### Base Reminder Creation

14

15

```python { .api }

16

class Reminder:

17

def __init__(

18

self,

19

method: str,

20

minutes_before_start = None,

21

days_before = None,

22

at = None

23

):

24

"""

25

Create a base reminder object.

26

27

:param method: Reminder method ('email' or 'popup')

28

:param minutes_before_start: Minutes before event start to trigger reminder

29

:param days_before: Days before event to trigger reminder

30

:param at: Specific time to trigger reminder (time or datetime object)

31

"""

32

```

33

34

### Reminder Conversion Method

35

36

```python { .api }

37

def convert_to_relative(self, start):

38

"""

39

Convert absolute reminder to relative reminder based on event start time.

40

41

:param start: Event start datetime

42

:return: New Reminder object with relative timing

43

"""

44

```

45

46

## EmailReminder Class

47

48

### Email Reminder Creation

49

50

```python { .api }

51

class EmailReminder(Reminder):

52

def __init__(

53

self,

54

minutes_before_start = None,

55

days_before = None,

56

at = None

57

):

58

"""

59

Create an email reminder.

60

61

:param minutes_before_start: Minutes before event start to send email

62

:param days_before: Days before event to send email (used with 'at' parameter)

63

:param at: Specific time to send email (time object like time(9, 0) for 9 AM)

64

65

Note: Either use minutes_before_start OR combine days_before with at

66

"""

67

```

68

69

## PopupReminder Class

70

71

### Popup Reminder Creation

72

73

```python { .api }

74

class PopupReminder(Reminder):

75

def __init__(

76

self,

77

minutes_before_start = None,

78

days_before = None,

79

at = None

80

):

81

"""

82

Create a popup reminder.

83

84

:param minutes_before_start: Minutes before event start to show popup

85

:param days_before: Days before event to show popup (used with 'at' parameter)

86

:param at: Specific time to show popup (time object like time(9, 0) for 9 AM)

87

88

Note: Either use minutes_before_start OR combine days_before with at

89

"""

90

```

91

92

## Event Reminder Methods

93

94

### Adding Reminders to Events

95

96

```python { .api }

97

def add_email_reminder(

98

self,

99

minutes_before_start: int = None,

100

days_before: int = None,

101

at = None

102

):

103

"""

104

Add an email reminder to the event.

105

106

:param minutes_before_start: Minutes before event start to send reminder

107

:param days_before: Days before event to send reminder

108

:param at: Specific time to send reminder (datetime or time object)

109

"""

110

111

def add_popup_reminder(

112

self,

113

minutes_before_start: int = None,

114

days_before: int = None,

115

at = None

116

):

117

"""

118

Add a popup reminder to the event.

119

120

:param minutes_before_start: Minutes before event start to show popup

121

:param days_before: Days before event to show popup

122

:param at: Specific time to show popup (datetime or time object)

123

"""

124

125

def add_reminder(self, reminder):

126

"""

127

Add a generic reminder object to the event.

128

129

:param reminder: EmailReminder or PopupReminder object

130

"""

131

```

132

133

## Basic Usage Examples

134

135

### Simple Relative Reminders

136

137

```python

138

from gcsa.google_calendar import GoogleCalendar

139

from gcsa.event import Event

140

from gcsa.reminders import EmailReminder, PopupReminder

141

from datetime import datetime

142

143

gc = GoogleCalendar()

144

145

# Event with basic reminders

146

meeting = Event(

147

summary="Important Client Meeting",

148

start=datetime(2024, 2, 15, 14, 0),

149

end=datetime(2024, 2, 15, 15, 30),

150

description="Quarterly review with key client"

151

)

152

153

# Add reminders using event methods

154

meeting.add_email_reminder(minutes_before_start=60) # 1 hour before

155

meeting.add_popup_reminder(minutes_before_start=15) # 15 minutes before

156

157

gc.add_event(meeting)

158

```

159

160

### Multiple Email Reminders

161

162

```python

163

from gcsa.event import Event

164

from gcsa.reminders import EmailReminder

165

from datetime import datetime

166

167

# Event with multiple email reminders at different intervals

168

project_deadline = Event(

169

summary="Project Deadline",

170

start=datetime(2024, 3, 1, 17, 0),

171

end=datetime(2024, 3, 1, 18, 0)

172

)

173

174

# Add multiple email reminders

175

reminders = [

176

EmailReminder(minutes_before_start=10080), # 1 week before (7 days × 24 hours × 60 minutes)

177

EmailReminder(minutes_before_start=2880), # 2 days before

178

EmailReminder(minutes_before_start=1440), # 1 day before

179

EmailReminder(minutes_before_start=240), # 4 hours before

180

EmailReminder(minutes_before_start=60) # 1 hour before

181

]

182

183

for reminder in reminders:

184

project_deadline.add_reminder(reminder)

185

186

gc.add_event(project_deadline)

187

```

188

189

### Absolute Time Reminders

190

191

```python

192

from gcsa.event import Event

193

from gcsa.reminders import EmailReminder, PopupReminder

194

from datetime import datetime, time

195

196

# Event with absolute time reminders

197

conference = Event(

198

summary="Tech Conference",

199

start=datetime(2024, 4, 15, 9, 0),

200

end=datetime(2024, 4, 15, 17, 0),

201

location="Convention Center"

202

)

203

204

# Email reminders at specific times

205

conference.add_email_reminder(days_before=7, at=time(9, 0)) # Week before at 9 AM

206

conference.add_email_reminder(days_before=3, at=time(18, 0)) # 3 days before at 6 PM

207

conference.add_email_reminder(days_before=1, at=time(8, 0)) # Day before at 8 AM

208

209

# Popup reminder 30 minutes before

210

conference.add_popup_reminder(minutes_before_start=30)

211

212

gc.add_event(conference)

213

```

214

215

### Creating Reminders with Objects

216

217

```python

218

from gcsa.event import Event

219

from gcsa.reminders import EmailReminder, PopupReminder

220

from datetime import datetime, time

221

222

# Create reminder objects first, then add to event

223

early_warning = EmailReminder(days_before=5, at=time(10, 0))

224

day_before = EmailReminder(days_before=1, at=time(9, 0))

225

last_minute = PopupReminder(minutes_before_start=30)

226

227

important_meeting = Event(

228

summary="Board Meeting",

229

start=datetime(2024, 5, 20, 10, 0),

230

end=datetime(2024, 5, 20, 12, 0),

231

reminders=[early_warning, day_before, last_minute]

232

)

233

234

gc.add_event(important_meeting)

235

```

236

237

### Reminder Patterns for Different Event Types

238

239

```python

240

from gcsa.event import Event

241

from gcsa.reminders import EmailReminder, PopupReminder

242

from datetime import datetime, time

243

244

# Doctor's appointment - early and immediate reminders

245

doctor_appointment = Event(

246

summary="Doctor Appointment",

247

start=datetime(2024, 3, 10, 14, 30),

248

end=datetime(2024, 3, 10, 15, 30)

249

)

250

doctor_appointment.add_email_reminder(days_before=3, at=time(19, 0)) # 3 days at 7 PM

251

doctor_appointment.add_popup_reminder(minutes_before_start=60) # 1 hour before

252

253

# Flight departure - multiple warnings

254

flight = Event(

255

summary="Flight to New York",

256

start=datetime(2024, 6, 1, 8, 0),

257

end=datetime(2024, 6, 1, 10, 0),

258

location="Airport Gate B12"

259

)

260

flight.add_email_reminder(days_before=1, at=time(20, 0)) # Night before at 8 PM

261

flight.add_popup_reminder(minutes_before_start=180) # 3 hours before (for travel time)

262

flight.add_popup_reminder(minutes_before_start=60) # 1 hour before

263

264

# Birthday reminder - well in advance

265

birthday = Event(

266

summary="John's Birthday",

267

start=datetime(2024, 7, 15, 0, 0),

268

end=datetime(2024, 7, 16, 0, 0)

269

)

270

birthday.add_email_reminder(days_before=14, at=time(9, 0)) # 2 weeks before

271

birthday.add_email_reminder(days_before=7, at=time(9, 0)) # 1 week before

272

birthday.add_email_reminder(days_before=1, at=time(9, 0)) # Day before

273

274

gc.add_event(doctor_appointment)

275

gc.add_event(flight)

276

gc.add_event(birthday)

277

```

278

279

### Working with All-Day Events

280

281

```python

282

from gcsa.event import Event

283

from gcsa.reminders import EmailReminder

284

from datetime import date, time

285

286

# All-day event with timed reminders

287

company_picnic = Event(

288

summary="Annual Company Picnic",

289

start=date(2024, 8, 15), # All-day event

290

end=date(2024, 8, 16),

291

location="City Park"

292

)

293

294

# Add reminders at specific times for all-day events

295

company_picnic.add_email_reminder(days_before=7, at=time(12, 0)) # Week before at noon

296

company_picnic.add_email_reminder(days_before=2, at=time(17, 0)) # 2 days before at 5 PM

297

company_picnic.add_email_reminder(days_before=0, at=time(8, 0)) # Day of event at 8 AM

298

299

gc.add_event(company_picnic)

300

```

301

302

### Customizing Default Calendar Reminders

303

304

```python

305

from gcsa.google_calendar import GoogleCalendar

306

from gcsa.calendar import CalendarListEntry

307

from gcsa.reminders import EmailReminder, PopupReminder

308

309

gc = GoogleCalendar()

310

311

# Set default reminders for a calendar

312

calendar_entry = gc.get_calendar_list_entry("calendar_id")

313

calendar_entry.default_reminders = [

314

EmailReminder(minutes_before_start=1440), # 1 day before via email

315

PopupReminder(minutes_before_start=30) # 30 minutes before via popup

316

]

317

318

gc.update_calendar_list_entry(calendar_entry)

319

320

# New events on this calendar will automatically get these reminders

321

# unless overridden with custom reminders

322

```

323

324

### Complex Reminder Schedules

325

326

```python

327

from gcsa.event import Event

328

from gcsa.reminders import EmailReminder, PopupReminder

329

from datetime import datetime, time

330

331

# Project milestone with escalating reminders

332

milestone = Event(

333

summary="Project Phase 1 Completion",

334

start=datetime(2024, 4, 30, 23, 59), # End of day deadline

335

end=datetime(2024, 5, 1, 0, 0),

336

description="All deliverables must be completed"

337

)

338

339

# Escalating reminder schedule

340

milestone.add_email_reminder(days_before=30, at=time(9, 0)) # Monthly notice

341

milestone.add_email_reminder(days_before=14, at=time(9, 0)) # Bi-weekly notice

342

milestone.add_email_reminder(days_before=7, at=time(9, 0)) # Weekly notice

343

milestone.add_email_reminder(days_before=3, at=time(17, 0)) # 3 days at EOD

344

milestone.add_email_reminder(days_before=1, at=time(8, 0)) # Day before morning

345

milestone.add_popup_reminder(minutes_before_start=480) # 8 hours before

346

milestone.add_popup_reminder(minutes_before_start=120) # 2 hours before

347

milestone.add_popup_reminder(minutes_before_start=30) # 30 minutes before

348

349

gc.add_event(milestone)

350

```

351

352

### Recurring Events with Reminders

353

354

```python

355

from gcsa.event import Event

356

from gcsa.reminders import EmailReminder, PopupReminder

357

from gcsa.recurrence import Recurrence, WEEKLY, MONDAY

358

from datetime import datetime

359

360

# Weekly recurring meeting with consistent reminders

361

weekly_standup = Event(

362

summary="Weekly Team Standup",

363

start=datetime(2024, 1, 15, 9, 0),

364

end=datetime(2024, 1, 15, 9, 30),

365

recurrence=[

366

Recurrence.rule(freq=WEEKLY, by_weekday=MONDAY, count=26)

367

]

368

)

369

370

# Reminders apply to all instances

371

weekly_standup.add_email_reminder(minutes_before_start=1440) # Day before

372

weekly_standup.add_popup_reminder(minutes_before_start=15) # 15 minutes before

373

374

gc.add_event(weekly_standup)

375

```

376

377

### Working with Time Zones

378

379

```python

380

from gcsa.event import Event

381

from gcsa.reminders import EmailReminder

382

from datetime import datetime, time

383

import pytz

384

385

# Event in specific timezone with reminders

386

eastern = pytz.timezone('America/New_York')

387

event_time = eastern.localize(datetime(2024, 3, 15, 14, 0))

388

389

timezone_meeting = Event(

390

summary="Cross-Timezone Meeting",

391

start=event_time,

392

end=event_time.replace(hour=15),

393

timezone='America/New_York'

394

)

395

396

# Reminders will respect the event's timezone

397

timezone_meeting.add_email_reminder(days_before=1, at=time(9, 0)) # 9 AM Eastern

398

timezone_meeting.add_popup_reminder(minutes_before_start=30)

399

400

gc.add_event(timezone_meeting)

401

```

402

403

### Reminder Validation and Error Handling

404

405

```python

406

from gcsa.event import Event

407

from gcsa.reminders import EmailReminder, PopupReminder

408

from datetime import datetime, time

409

410

try:

411

event = Event(

412

summary="Test Event",

413

start=datetime(2024, 2, 15, 10, 0),

414

end=datetime(2024, 2, 15, 11, 0)

415

)

416

417

# Valid reminder combinations

418

event.add_email_reminder(minutes_before_start=60) # Relative reminder

419

event.add_email_reminder(days_before=1, at=time(9, 0)) # Absolute reminder

420

421

# Invalid: mixing relative and absolute parameters

422

# event.add_email_reminder(minutes_before_start=60, days_before=1, at=time(9, 0))

423

424

gc.add_event(event)

425

426

except ValueError as e:

427

print(f"Reminder validation error: {e}")

428

except Exception as e:

429

print(f"Unexpected error: {e}")

430

```

431

432

### Modifying Reminders on Existing Events

433

434

```python

435

from gcsa.google_calendar import GoogleCalendar

436

from gcsa.reminders import EmailReminder, PopupReminder

437

438

gc = GoogleCalendar()

439

440

# Get existing event and modify reminders

441

event = gc.get_event("event_id")

442

443

# Clear existing reminders and add new ones

444

event.reminders = []

445

event.add_email_reminder(minutes_before_start=120) # 2 hours before

446

event.add_popup_reminder(minutes_before_start=15) # 15 minutes before

447

448

# Update the event

449

gc.update_event(event)

450

451

# Or add additional reminders to existing ones

452

event.add_email_reminder(days_before=1, at=time(18, 0)) # Day before at 6 PM

453

gc.update_event(event)

454

```

455

456

### Business Hours Reminder Patterns

457

458

```python

459

from gcsa.event import Event

460

from gcsa.reminders import EmailReminder

461

from datetime import datetime, time

462

463

def create_business_reminders(event_start):

464

"""Create reminder pattern that respects business hours"""

465

business_day_reminder = EmailReminder(days_before=1, at=time(9, 0)) # 9 AM day before

466

business_hour_reminder = EmailReminder(days_before=0, at=time(8, 0)) # 8 AM day of

467

468

return [business_day_reminder, business_hour_reminder]

469

470

# Weekend event with business hour reminders

471

weekend_event = Event(

472

summary="Weekend Workshop",

473

start=datetime(2024, 3, 16, 10, 0), # Saturday

474

end=datetime(2024, 3, 16, 16, 0)

475

)

476

477

# Add business hour reminders

478

for reminder in create_business_reminders(weekend_event.start):

479

weekend_event.add_reminder(reminder)

480

481

gc.add_event(weekend_event)

482

```

483

484

The reminder system in GCSA provides flexible options for ensuring users are notified about upcoming events through both email and popup notifications. The system supports both relative timing (minutes/hours before) and absolute timing (specific times on specific days before the event), making it suitable for various scheduling needs from simple meetings to complex project deadlines.