From f0578f858b60682ef644acfd7757eaeffd5dee23 Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 24 May 2022 16:45:28 -0500 Subject: [PATCH] initial commit --- .idea/.gitignore | 8 ++ .idea/inspectionProfiles/Project_Default.xml | 16 +++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/webcalDashboard.iml | 21 ++++ Dockerfile | 6 + app/__init__.py | 3 + app/static/hellovetica.ttf | Bin 0 -> 8736 bytes app/static/sun.gif | Bin 0 -> 9319 bytes app/templates/dashboard.html | 118 ++++++++++++++++++ app/views.py | 54 ++++++++ main.py | 1 + requirements.txt | 4 + start.sh | 6 + test.py | 28 +++++ uwsgi.ini | 4 + 17 files changed, 287 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/webcalDashboard.iml create mode 100644 Dockerfile create mode 100644 app/__init__.py create mode 100755 app/static/hellovetica.ttf create mode 100755 app/static/sun.gif create mode 100644 app/templates/dashboard.html create mode 100644 app/views.py create mode 100644 main.py create mode 100644 requirements.txt create mode 100755 start.sh create mode 100644 test.py create mode 100644 uwsgi.ini diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..cfb257f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ffad4e2 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c069186 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/webcalDashboard.iml b/.idea/webcalDashboard.iml new file mode 100644 index 0000000..02d2170 --- /dev/null +++ b/.idea/webcalDashboard.iml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f2376b0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM tiangolo/uwsgi-nginx-flask:python3.8-alpine +RUN apk --update add bash nano +ENV STATIC_URL /static +ENV STATIC_PATH /var/www/app/static +COPY ./requirements.txt /var/www/requirements.txt +RUN pip install -r /var/www/requirements.txt \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..8f5986d --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,3 @@ +from flask import Flask +app = Flask(__name__) +from app import views \ No newline at end of file diff --git a/app/static/hellovetica.ttf b/app/static/hellovetica.ttf new file mode 100755 index 0000000000000000000000000000000000000000..f9d262b4210a8ceb00a374e0ab95ca48f66c9e48 GIT binary patch literal 8736 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 R8t5NMvsx|_6~_Q}{|8gbQ0xEz literal 0 HcmV?d00001 diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html new file mode 100644 index 0000000..858cc16 --- /dev/null +++ b/app/templates/dashboard.html @@ -0,0 +1,118 @@ + + + + + + + +
+
+
+{# #} +
+
+ {{ today.strftime('%a') }}
+ {{ today.strftime('%b %-d') }}
+ {{ today.strftime('%Y') }}
+
+
+
+ + {% for day, event in days %} +
+
+ {{ day.strftime('%A') }} +
+ {% if event %} +
+ {{ event.summary.value }}
+ {% if event.dtstart.value.strftime('%H') != "00" %} + {{ event.dtstart.value.strftime('%-I:%M %p') }}
{{ event.dtend.value.strftime('%-I:%M %p') }} + {% endif %} +
+ {% endif %} +
+ {% endfor %} +
+
+ + diff --git a/app/views.py b/app/views.py new file mode 100644 index 0000000..327ea04 --- /dev/null +++ b/app/views.py @@ -0,0 +1,54 @@ +from app import app +from datetime import datetime, timedelta +import os +import caldav +import datetime +from icalendar import cal, Event +import requests +url = os.getenv('caldav_url') +username = os.getenv('username') +password = os.getenv('password') +cal_id = os.getenv('cal_id') + + +def daterange(start_date, end_date): + for n in range(int((end_date - start_date).days)): + yield datetime.datetime.date(start_date + timedelta(n)) + +@app.route('/') +def hello_world(): + date_obj = datetime.datetime.now() + + start_of_week = date_obj - timedelta(days=date_obj.weekday()) # Monday + end_of_week = start_of_week + timedelta(days=7) # Sunday + + with caldav.DAVClient(url=url, username=username, password=password) as client: + my_principal = client.principal() + + calendars = my_principal.calendars() + calendar = my_principal.calendar(cal_id=cal_id) + events_fetched = calendar.date_search( + start=start_of_week, end=end_of_week, expand=False) + + events_fetched_by_date = {} + for event in events_fetched: + value = event.vobject_instance.vevent.dtstart.value + if isinstance(value, datetime.datetime): + events_fetched_by_date[datetime.datetime.date(value)] = event + elif isinstance(value, datetime.date): + events_fetched_by_date[value] = event + else: + raise Exception + + days = [] + for single_date in daterange(start_of_week, end_of_week): + event = events_fetched_by_date.get(single_date) + if event: + days.append((single_date, event.vobject_instance.vevent)) + else: + days.append((single_date,[])) + + # breakpoint() + pass + # r = "
".join([event.vobject_instance.vevent.summary.value for event in events_fetched if event.vobject_instance.vevent.dtstart.value < datetime.now()]) + return render_template("dashboard.html", days=days, today=datetime.datetime.now()) \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..e524e69 --- /dev/null +++ b/main.py @@ -0,0 +1 @@ +from app import app \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b0097ee --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +caldav~=0.9.0 +requests~=2.27.1 +icalendar~=4.0.9 +Flask~=2.1.2 \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..00f890b --- /dev/null +++ b/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash +app="webcal-dashboard" +docker build -t ${app} . +docker run -d -p 56733:80 \ + --name=${app} \ + -v $PWD:/app ${app} \ No newline at end of file diff --git a/test.py b/test.py new file mode 100644 index 0000000..846ba67 --- /dev/null +++ b/test.py @@ -0,0 +1,28 @@ +import os +import caldav +from datetime import datetime +import requests +from icalendar import Calendar, cal, Event + +url = 'http://ical-cdn.teamsnap.com/team_schedule/5f1ddc9e-15b0-4912-84a2-11cc70e9e375.ics' +r = requests.get(url) +username = os.getenv('username') +password = os.getenv('password') +c = cal.Calendar.from_ical(r.content) + +calendar_ical = [{ + 'dtstart':e['DTSTART'].dt, + 'dtstart': e['DTEND'].dt, + 'summary': e['summary'] + } + for e in c.subcomponents + if isinstance(e, Event)] + +with caldav.DAVClient(url=url, username=username, password=password) as client: + my_principal = client.principal() + +calendars = my_principal.calendars() +calendar = my_principal.calendar(cal_id="9E2AC562-4328-4CA0-B4D1-D730D9F5E9EF") +events_fetched = calendar.date_search( + start=datetime(2022, 5, 23), end=datetime(2022, 5, 24), expand=True) +pass \ No newline at end of file diff --git a/uwsgi.ini b/uwsgi.ini new file mode 100644 index 0000000..1cf8434 --- /dev/null +++ b/uwsgi.ini @@ -0,0 +1,4 @@ +[uwsgi] +module = main +callable = app +master = true \ No newline at end of file