Skip to content

Commit 2cb39d9

Browse files
committed
feat(import): multi event import from single file
1 parent f5f9e22 commit 2cb39d9

File tree

9 files changed

+649
-30
lines changed

9 files changed

+649
-30
lines changed

bin/WiSe_2023_Terminplan_Studierende.ics

Lines changed: 474 additions & 0 deletions
Large diffs are not rendered by default.

bin/event_database

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
1-
04.10.2023 00:00:00::14.03.2024 00:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
2-
04.10.2023 00:00:00::14.03.2024 00:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
3-
04.10.2023 00:00:00::14.03.2024 00:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
4-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
5-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
6-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
7-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
8-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
9-
04.10.2023 08:15:00::14.03.2024 12:00:00::Semesterende::Semesterzeitraum des Wintersemesters 2023/24.
10-
04.10.2024 09:00:10::10.10.2024 12:00:00:ST::SD
11-
16.10.2027 14:00:00::17.10.2028 00:00:00::Semesterende::SD
12-
04.10.2045 00:13:20::14.03.2049 13:24:00::Sem::SZDOASMKDSOPDAKPOD
1+
17.12.2023 00:00:00::18.12.2023 23:59:59::↑ Prüfungsterminplanentwürfe\; Bekanntgabe::Hochschulöffentliche Bekanntgabe der Prüfungsterminplanentwürfe (diese deutlich als noch unverbindlich kennzeichnen).\n
2+
17.12.2023 00:00:00::31.12.2023 23:59:59::Abmeldemöglichkeit von Prüfungen::Abmeldemöglichkeit der Studierenden von den Prüfungsleistungen über den Studienplaner im Studierenden-Serviceportal (SSP).
3+
22.12.2023 00:00:00::07.01.2024 23:59:59::Keine Lehrveranstaltung\; Weihnachten::Keine Lehrveranstaltung\, Weihnachten gem. § 1 Abs. 4\; am 22.12.23 Vorlesungsfrei gemäß § 1 Abs. 5 der Satzung über die Vorlesungszeit an der OTH Regensburg.
4+
08.01.2024 00:00:00::08.01.2024 23:59:59::↑ Rückmeldung::Voraussichtlicher Beginn des Rückmeldezeitraums für die Studierenden zum nächsten Semester über das Studierenden-Serviceportal (SSP). Bitte weitere Informationen auf der Homepage der OTH Regensburg beachten.\n
5+
09.01.2024 00:00:00::09.01.2024 23:59:59::↓ Prüfungsterminpläne\; Bekanntgabe::Verbindliche Bekanntgabe der Prüfungsterminpläne.\n
6+
12.01.2024 00:00:00::12.01.2024 23:59:59::↓ Abschlussarbeiten\; Abgabefrist für Studierende::Abgabefrist für Abschlussarbeiten mit Korrektur im aktuellen Semester. Bei späterer Abgabe kann eine Rückmeldung für das Folgesemester erforderlich werden.
7+
23.01.2024 00:00:00::13.02.2024 23:59:59::Semesterprüfungszeitraum::Die ersten drei Prüfungstage sind reserviert (§ 24 Abs. 6 APO) für zentral geplante Prüfungsleistungen. Der 1. Tag für studienbegleitende allgemeinwissenschaftliche Prüfungsleistungen (AW)\, der 2. Tag für Prüfungsleistungen der Regensburg School of Digital Sciences (RSDS) und der 3. Tag für studienbegleitende Prüfungsleistungen (SLNZ).\nIm Übrigen finden Vorlesungen weiterhin bis einschließlich 25. Januar 2024 statt. \nSoweit ein Teilnahmenachweis Voraussetzung für die Zulassung zu einer Prüfungsleistung ist\, erfolgt spätestens eine Woche vor der jeweiligen Prüfung die Bekanntgabe der Nichtzulassung.
8+
23.01.2024 00:00:00::23.01.2024 23:59:59::Studienbegleitende AW-Prüfungsleistungen (zentral geplant)::Studienbegleitende Prüfungsleistungen in allgemeinwissenschaftlichen Wahlpflichtmodulen\, soweit zentral geplant.\n
9+
24.01.2024 00:00:00::24.01.2024 23:59:59::Prüfungsleistungen der Regensburg School of Digital Sciences (zentral geplant)::Zentral geplante Prüfungsleistungen der Regensburg School of Digital Sciences (RSDS).
10+
25.01.2024 00:00:00::25.01.2024 23:59:59::Studienbegleitende Prüfungsleistungen (zentral geplant)::Studienbegleitende Prüfungsleistungen\, soweit zentral geplant.
11+
25.01.2024 20:00:00::25.01.2024 20:00:00::Ende aller Lehrveranstaltungen::Ende aller Lehrveranstaltungen\n
12+
26.01.2024 00:00:00::13.02.2024 23:59:59::Prüfungsleistunge::Prüfungsleistungen im Sinne von § 11 Abs. 2 APO.\n
13+
23.02.2024 00:00:00::23.02.2024 23:59:59::↓ Prüfungsergebnisse und Zulassung zum Pflichtpraktikum\; Veröffentlichung::Veröffentlichung der Prüfungsergebnisse und der im Folgesemester zum Pflichtpraktikum zugelassenen Studierenden durch das Referat III/2 über das Studierenden-Serviceportal (SSP).\n
14+
01.03.2024 00:00:00::01.03.2024 23:59:59::↓ Nicht bestandene Prüfungsergebnisse\; Bekanntgabe::Alle Studierenden\, die Prüfungen nicht bestanden haben\, werden durch das Referat III/2 benachrichtigt.\n
15+
01.03.2024 00:00:00::01.03.2024 23:59:59::↓ Stundenplan\; Bekanntgabe::Bekanntgabe des Stundenplans mit den Lehrveranstaltungen für das nächste Semester online auf den Fakultätsseiten.\n
16+
04.03.2024 00:00:00::04.03.2024 23:59:59::↑ Abschlussprüfungszeugnisse\; Aushändigung::Gegen Ausweis Abholung der Abschlussprüfungszeugnisse durch die Studierenden\, deren bestandene Abschlussprüfung in der Sitzung der Prüfungskommission am 16.02.2024 festgestellt wurde\, im Sekretariat der Fakultät oder ggf. im Referat III/2 (vorherige telefonische Rücksprache der Studierenden wird empfohlen).\n
17+
04.03.2024 00:00:00::15.03.2024 23:59:59::Wiederholungsprüfungszeitrau::Die Anmeldung für den Wiederholungszeitraum nach § 24 Abs. 3 erfolgt bei der jeweiligen Prüferin oder dem Prüfer.
18+
18.03.2024 00:00:00::18.03.2024 23:59:59::Semesteranfang Sommersemester 2024::Semesteranfang Sommersemester 2024\; vorläufige Terminplanung!\nVorlesungsfrei am 15.03.2024\n
19+
18.03.2024 08:30:00::18.03.2024 08:30:00::Semesteranfangsgebet/Meditation::Ökumenisches Semesteranfangsgebet/Meditation\; Art und Ort organisiert und angeboten durch die katholische Hochschulgemeinde (KHG) und die evangelische Studentengemeinde (ESG)\; lt. gesonderter Ankündigung.\n
20+
18.03.2024 09:00:00::18.03.2024 09:00:00::Erstsemesterbegrüßung durch Hochschulleitung und Fakultäten::Begrüßung und Information der Erstsemester durch die Hochschulleitung und Vertreter der Stadt Regensburg.\nAnschließend: Begrüßung und Information der Erstsemester durch die Fakultätsleitungen (fakultätsinterne Organisation und Bekanntmachung).\n
21+
18.03.2024 10:00:00::18.03.2024 10:00:00::↑ Beginn Lehrveranstaltungen (Bachelor- und Masterstudiengänge)::Beginn der Lehrveranstaltungen für Nicht-Erstsemester\, für Erstsemester am nächsten Vorlesungstag gemäß Stundenplan.\n

bin/ical-cli

0 Bytes
Binary file not shown.

docs/timesheet/timesheet.xlsx

48 Bytes
Binary file not shown.

src/import.lisp

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
do (progn
3333
(if (= 0 index)
3434
(checkICS line))
35-
(if (and (checkForVEVENT line)
35+
(if (and (checkForBEGINEVENT line)
3636
(not inVEVENT))
3737
(setf inVEVENT t))
3838
(if (and (checkForStart line) inVEVENT)
@@ -50,16 +50,23 @@
5050
(if (and (checkForDesc line) inVEVENT)
5151
(progn
5252
(setf descFound t)
53-
(setf desc (getSummaryDesc line)))))))
54-
(if (and inVEVENT startTimeFound endTimeFound summaryFound)
55-
(progn
56-
(with-standard-io-syntax
57-
(if descFound
58-
(setf output (format nil "~$::~$::~$::~$" startTime endTime summary desc))
59-
(setf output (format nil "~$::~$::~$" startTime endTime summary)))
60-
(addEvent output)
61-
(format t "Imported Event (start, end, summary): ~a, ~a, ~a~%" startTime endTime summary)))
62-
(format t "ICS file is either missing start time, end time or summary."))))
53+
(setf desc (getSummaryDesc line))))
54+
(if (and (checkForENDEVENT line) inVEVENT)
55+
(progn
56+
(if (and startTimeFound endTimeFound summaryFound)
57+
(progn
58+
(with-standard-io-syntax
59+
(if descFound
60+
(setf output (format nil "~$::~$::~$::~$" startTime endTime summary desc))
61+
(setf output (format nil "~$::~$::~$" startTime endTime summary)))
62+
(addEvent output)
63+
(format t "Imported event (start, end, summary): ~a, ~a, ~a~%" startTime endTime summary))))
64+
(setf inVEVENT nil)
65+
(setf startTimeFound nil)
66+
(setf endTimeFound nil)
67+
(setf summaryFound nil)
68+
(setf descFound nil))))))
69+
(format t "Import finished.~%")))
6370

6471
(defun import/command ()
6572
(clingon:make-command
@@ -78,12 +85,18 @@
7885
(format t "The specified file to import is not a true ICS file, exiting program.~%")
7986
(SB-EXT:QUIT))))
8087

81-
(defun checkForVEVENT (line)
82-
"Checks if the line contains a VEVENT property."
88+
(defun checkForBEGINEVENT (line)
89+
"Checks if the line contains a BEGIN:VEVENT property."
8390
(if (search "BEGIN:VEVENT" line)
8491
t
8592
nil))
8693

94+
(defun checkForENDEVENT (line)
95+
"Checks if the line contains a END:VEVENT property."
96+
(if (search "END:VEVENT" line)
97+
t
98+
nil))
99+
87100
(defun checkForStart (line)
88101
"Checks if the line contains a DTSTART property."
89102
(if (search "DTSTART" line)
@@ -122,4 +135,4 @@
122135

123136
(defun getSummaryDesc (line)
124137
"Gets the summary or description from the line and returns it as a string."
125-
(subseq (subseq line (+ (position #\: line :test #'equal) 1)) 0 (- (length (subseq line (+ (position #\: line :test #'equal) 1))) 1)))
138+
(subseq (subseq line (+ (position #\: line :test #'equal) 1)) 0 (- (length (subseq line (+ (position #\: line :test #'equal) 1))) 1)))

src/import.lisp~

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
(in-package :ical-cli)
2+
3+
;; when importing a file, we need to check, if it is a true ICS file (has a VCALENDAR and VEVENT property)
4+
5+
(defun import/options ()
6+
(list
7+
(clingon:make-option
8+
:filepath
9+
:short-name #\f
10+
:long-name "file"
11+
:description "(REQUIRED) The ical file to import"
12+
:key :file
13+
:required t)))
14+
15+
(defun import/handler (cmd)
16+
(let ((file (clingon:getopt cmd :file))
17+
(inVEVENT nil)
18+
(startTime nil)
19+
(startTimeFound nil)
20+
(endTime nil)
21+
(endTimeFound nil)
22+
(summary nil)
23+
(summaryFound nil)
24+
(desc nil)
25+
(descFound nil)
26+
(output nil))
27+
(cleanupDatabase)
28+
(format t "Importing file ~a~%" file)
29+
(with-open-file (stream file)
30+
(loop for line = (read-line stream nil nil) for index from 0
31+
while line
32+
do (progn
33+
(if (= 0 index)
34+
(checkICS line))
35+
(if (and (checkForVEVENT line)
36+
(not inVEVENT))
37+
(setf inVEVENT t))
38+
(if (and (checkForStart line) inVEVENT)
39+
(progn
40+
(setf startTimeFound t)
41+
(setf startTime (getStartTime line))))
42+
(if (and (checkForEndOrDuration line) inVEVENT)
43+
(progn
44+
(setf endTimeFound t)
45+
(setf endTime (getEndTime startTime line))))
46+
(if (and (checkForSummary line) inVEVENT)
47+
(progn
48+
(setf summaryFound t)
49+
(setf summary (getSummaryDesc line))))
50+
(if (and (checkForDesc line) inVEVENT)
51+
(progn
52+
(setf descFound t)
53+
(setf desc (getSummaryDesc line)))))))
54+
(if (and inVEVENT startTimeFound endTimeFound summaryFound)
55+
(progn
56+
(with-standard-io-syntax
57+
(if descFound
58+
(setf output (format nil "~$::~$::~$::~$" startTime endTime summary desc))
59+
(setf output (format nil "~$::~$::~$" startTime endTime summary)))
60+
(addEvent output)
61+
(format t "Imported Event (start, end, summary): ~a, ~a, ~a~%" startTime endTime summary)))
62+
(format t "ICS file is either missing start time, end time or summary."))))
63+
64+
(defun import/command ()
65+
(clingon:make-command
66+
:name "import"
67+
:description "Import an ical file into the database"
68+
:examples '(("Import Standup.ics file:" . "ical-cli import -f Standup.ics"))
69+
:options (import/options)
70+
:handler #'import/handler))
71+
72+
(defun checkICS (line)
73+
"Checks if the file is a true ICS file, if not, the program will exit."
74+
(if (search "BEGIN:VCALENDAR" line)
75+
(progn
76+
(format t "File passed ICS check, program will be continued.~%"))
77+
(progn
78+
(format t "The specified file to import is not a true ICS file, exiting program.~%")
79+
(SB-EXT:QUIT))))
80+
81+
(defun checkForVEVENT (line)
82+
"Checks if the line contains a VEVENT property."
83+
(if (search "BEGIN:VEVENT" line)
84+
t
85+
nil))
86+
87+
(defun checkForStart (line)
88+
"Checks if the line contains a DTSTART property."
89+
(if (search "DTSTART" line)
90+
t
91+
nil))
92+
93+
(defun checkForEndOrDuration (line)
94+
"Checks if the line contains a DTEND or DURATION property."
95+
(if (or (search "DTEND" line) (search "DURATION" line))
96+
t
97+
nil))
98+
99+
(defun checkForSummary (line)
100+
"Checks if the line contains a SUMMARY property."
101+
(if (search "SUMMARY" line)
102+
t
103+
nil))
104+
105+
(defun checkForDesc (line)
106+
"Checks if the line contains a DESCRIPTION property."
107+
(if (search "DESCRIPTION" line)
108+
t
109+
nil))
110+
111+
(defun getStartTime (line)
112+
"Gets the start time from the line and returns it as a local timestamp."
113+
(formatLocalTime (createLocalTimestamp (subseq line (+ (position #\: line :test #'equal) 1)))))
114+
115+
(defun getEndTime (startTime line)
116+
"Gets the end time from the line (calculates it if necessary by using duration and start time) and returns it as a local timestamp."
117+
(cond ((search "DTEND" line) (progn
118+
(formatLocalTime (createLocalTimestamp (subseq line (+ (position #\: line :test #'equal) 1))))))
119+
((search "DURATION" line) (progn
120+
(formatLocalTime (calcEndTime (createLocalFromHR startTime) (subseq line (+ (position #\: line :test #'equal) 1))))))
121+
(t (format t "FAILURE, NO DTEND OR DURATION FOUND."))))
122+
123+
(defun getSummaryDesc (line)
124+
"Gets the summary or description from the line and returns it as a string."
125+
(subseq (subseq line (+ (position #\: line :test #'equal) 1)) 0 (- (length (subseq line (+ (position #\: line :test #'equal) 1))) 1)))

src/show.lisp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
(format t "Showing events for ~a~%" (formatDateOnly (formatLocalTime (local-time:timestamp+ (local-time:today) 1 :day))))
3232
(showEvents (formatLocalTime (local-time:timestamp+ (local-time:today) 1 :day))))
3333
(showAll
34-
(format t "Showing all upcoming events~%~%")
34+
(format t "Showing all upcoming events~%")
3535
(showAllEvents))
3636
(date
3737
(format t "Showing events for ~a~%" date)

src/show.lisp~

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
(format t "Showing events for ~a~%" (formatDateOnly (formatLocalTime (local-time:timestamp+ (local-time:today) 1 :day))))
3232
(showEvents (formatLocalTime (local-time:timestamp+ (local-time:today) 1 :day))))
3333
(showAll
34-
(format t "Showing all upcoming events~%")
34+
(format t "Showing all upcoming events~%~%")
3535
(showAllEvents))
3636
(date
3737
(format t "Showing events for ~a~%" date)

src/sort.lisp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
(in-package :ical-cli)
22

3-
4-
53
(defun mergeSortOld (buffer)
64
"Perform a mergeSort on the given buffer and return the sorted buffer"
75
(let ((left (list))

0 commit comments

Comments
 (0)