Skip to content

Academic calendar widget

Shows the undergraduate academic events within the next 30 days, ordered by start date. No login is needed.

Names follow Python snake_case; Node.js takes a camelCase options object ({ start, end }) and Java takes positional arguments. No login is needed.

Method Parameter Type Required Default Meaning
calendar start string Yes Start date (yyyy-MM-dd)
end string Yes End date (yyyy-MM-dd)
category_code string No 0001 Category code (0001 undergraduate, 0002 to 0007 graduate)
graduate_calendar site_id string Yes Graduate site name (for example graduate). Passed by the caller, so a new graduate school needs no release
year / month integer Yes Year / month to fetch

One entry of the list calendar(start, end) returns. Field names are Python snake_case; Node.js uses camelCase (start_date -> startDate) and Java uses getters (getStartDate()). Values only show the shape.

[
{
"year": "2026",
"month": "3",
"category_code": "0001",
"category_name": "학부",
"title": "2학기 중간고사 성적 입력",
"title_en": "Grades input for Fall semester Midterm Examination",
"start_date": "2026-03-02",
"end_date": "2026-03-08",
"extra": {}
}
]
Field Meaning
title / title_en Title / English title (school text)
start_date / end_date Start / end date (yyyy-MM-dd for undergraduate; same value for a one-day event)
year / month Year / month the entry belongs to
category_code / category_name Category code / name (0001 is undergraduate)
extra Other school fields (empty for undergraduate events)

All fields: Academic calendar.

On failure: when the school server fails you get the last cached value or an empty list, without an exception. It looks the same as a period with no events.

  • Date formats differ: yyyy-MM-dd for undergraduate, MM.dd for graduate sites. Academic calendar
  • Opening the widget does not hit the school each time. The same arguments are cached for 24 hours. Failure isolation and cache
  • Titles are the school’s own text (Korean). The English title is title_en / titleEn.
import java.time.LocalDate;
import java.util.List;
import kr.suhsaechan.sejongpeia.publicdata.SejongPublicData;
import kr.suhsaechan.sejongpeia.publicdata.model.CalendarEvent;
class AcademicCalendarWidget {
static List<CalendarEvent> upcomingAcademicEvents(SejongPublicData publicData, int daysAhead) {
LocalDate today = LocalDate.now();
return publicData.calendar(today.toString(), today.plusDays(daysAhead).toString()).stream()
.sorted(java.util.Comparator.comparing(CalendarEvent::getStartDate))
.toList();
}
}