From aed2080b53cfa450f973cfedcf53f04faa0c91de Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Tue, 2 May 2023 11:29:10 -0700 Subject: [PATCH] Bare bones backend. Frontend just starting. --- .vscode/launch.json | 23 ++ .vscode/settings.json | 6 + app/__init__.py | 9 +- app/__pycache__/__init__.cpython-310.pyc | Bin 728 -> 892 bytes app/__pycache__/app.cpython-310.pyc | Bin 0 -> 695 bytes app/__pycache__/models.cpython-310.pyc | Bin 882 -> 1890 bytes app/__pycache__/tracker.cpython-310.pyc | Bin 0 -> 2396 bytes app/__pycache__/views.cpython-310.pyc | Bin 1561 -> 2407 bytes app/codes.csv | 110 +++++++ app/export.csv | 366 +++++++++++++++++++++++ app/models.py | 29 +- app/sqlite.db | Bin 12288 -> 176128 bytes app/static/ltx.css | 49 ++- app/templates/categories.html | 27 ++ app/templates/colors.css | 51 ++++ app/templates/forms/select-color.html | 15 + app/templates/forms/update-entry.html | 14 + app/templates/index.html | 45 --- app/templates/layout.html | 19 ++ app/templates/table.html | 26 ++ app/templates/table2.html | 56 ++++ app/templates/table_.html | 57 ++++ app/tracker.py | 76 +++++ app/views.py | 105 ++++--- 24 files changed, 982 insertions(+), 101 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 app/__pycache__/app.cpython-310.pyc create mode 100644 app/__pycache__/tracker.cpython-310.pyc create mode 100644 app/codes.csv create mode 100644 app/export.csv create mode 100644 app/templates/categories.html create mode 100644 app/templates/colors.css create mode 100644 app/templates/forms/select-color.html create mode 100644 app/templates/forms/update-entry.html delete mode 100644 app/templates/index.html create mode 100644 app/templates/layout.html create mode 100644 app/templates/table.html create mode 100644 app/templates/table2.html create mode 100644 app/templates/table_.html create mode 100644 app/tracker.py diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9f2fa72 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + "version": "0.2.0", + "configurations": [ + + { + "name": "Python: Flask", + "type": "python", + "request": "launch", + "module": "flask", + "env": { + "FLASK_APP": "app.py", + "FLASK_DEBUG": "1" + }, + "args": [ + "run", + "--no-debugger", + "--no-reload" + ], + "jinja": true, + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5c80254 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.autopep8" + }, + "python.formatting.provider": "none" +} diff --git a/app/__init__.py b/app/__init__.py index 7be15bf..8f9f7fd 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -2,7 +2,8 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy import os -persistent_path = os.getenv("PERSISTENT_STORAGE_DIR", os.path.dirname(os.path.realpath(__file__))) +persistent_path = os.getenv( + "PERSISTENT_STORAGE_DIR", os.path.dirname(os.path.realpath(__file__))) app = Flask(__name__) @@ -16,8 +17,12 @@ db = SQLAlchemy() from app import views from app import models +from app.tracker import Tracker db.init_app(app) +sheets_path = os.path.join(persistent_path, "export.csv") +codes_path = os.path.join(persistent_path, "codes.csv") with app.app_context(): - db.create_all() \ No newline at end of file + db.create_all() + app.tracker = Tracker(codes_path=codes_path, sheets_path=sheets_path) diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc index c06de74648f5accaa4685fc7b27163b1c5bd9115..27d7d35765aab1877590a1e626c5ba214ef177b2 100644 GIT binary patch delta 340 zcmcb?`iG4-pO=@50SJoM`lfuJ$Scdl#W+!CT73#b3U7{Zu1J&!BSWgd0?|~Sg^WNJ zOBUM#-c+s>zJ*LtVsIWmkSCtXvp`}YLq9~l%=P`HQ($SvXq5|aa&B!zCVLzS&$C{hH;C{8YBax~BZGIMYpiHC`Yk%y6siI0&FNOCX=Fe?260NJ%sM*si- delta 169 zcmeyvc7v5SpO=@50SIQv`J{+VDqJGK4dvFtaeQFf=nW0$ITfh785YMJBNrnZ6Au#)BNr18 IGAjKC0N05h5&!@I diff --git a/app/__pycache__/app.cpython-310.pyc b/app/__pycache__/app.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b69a4bbb8173874a268ac4e221af8e3059b40874 GIT binary patch literal 695 zcmYjO&63hU5bl|T5JFf`SG{a`@FbT_?bV_zBR?+X0!mP8xl9FSSiqH1NwC$3mxB0u8|ndy9?W&&PA}6kKVS2PS+W=`y=Lz21EOG zo3*;b+fwq$_fm1nC%49)KDR7OKF(S%n&<7_C2QFu`<3mq+52I)BdZ6QcJq87pBw~6 zL%aEg^#-kOr`xng-9g`xddr($PgZGKe<*2`$iggJFUB_kS<5-Y!R~&~SjoaVW1$-e z#-!pdmr}bDsR%zyb?K&aS>#@vWu+bq*Uv*(KlA*ozPc1~;w4y~vOJ|OA}_?A$zE#H zD4cm$lJbevz0gZpHlU2aFq4X#R2oyfHxUYP!b_ypI=;qNnR9tFaR*KTOF zqUkEYQHj-zxUl^6#=@I2KV7b+-UuST^2G~+&B;>)9ZX^povQShsCP$7jT*!t8Z|N_ ICwHdu58$%Gw*UYD literal 0 HcmV?d00001 diff --git a/app/__pycache__/models.cpython-310.pyc b/app/__pycache__/models.cpython-310.pyc index fab97f467517b04e142019b203d3275675224c7d..a3c0c7ec49f2ae728688fa2c9e4bb41d51072cb2 100644 GIT binary patch literal 1890 zcmb7EOOM+&5EiM2Wm(>AoS;C_wB4djTQ!A!FAO8aF8V}$*`NnqRIN$xYNLlk$wjOr zr{>!KuzSo;=wIQrr=D}`sozMpYh+^-6~IsA3^^RmH#0@Q?-}_1&{Oe?Wf*_bV)uj0 zc!*I>0m2Y0H8K`5MsuF>kbi3kQ&=wzVM%sr{$_?2B(`uMan=$Wl8$g8an}+@@KYn` z{so&xz%&;ymF5-cyVorA@b3wW ze1XPqJqY`vE4-IRcp!T4z}MzUyn6JC>E1#mS*%vkW4Xf8S?0-;rPS7U#ZqZg#3byT z#k0ps&Sz}LPnz2p#~9@RAlQ}h+_+>{T<~jl&2Wu5t-E7f^wrU`7n7Rbe;SzDnHMUH zD{YCmlG-gRHLsFP;u@=z>HL+UZo}B$4@MV7CP!)&=cAKiw#;N+m80WA$WdB79mR{q zD8nKxhl`bVqe#hxilQElzUF`dt9@KN+$e6iPEp>vUcv3>c!1#G3h{*N*7U{^dhsbn z=>YIjECMzS7+o)tSrtW?v!e081qzFH$7!6MiFk60&XRMEQQsrys^W*T$cN*!n8j&1 z!KB>?GaVu4@iMIfuB}UK(zaM;i&Bw|H!pBnI|rn?3#h$+jZcGHTl}zI* zDf03nS!nwLNmHsj#ho3uV;_3e$NZEjD4 z19cBO)cXV<5D=Z}LxLlK?rq!$nd%D?e@yUz;6A~p0Bz5Tv`{U5Z)5H=Y$6KZV9sYg zSERea9L4V;9T0&1%r%|M22&f>Y;fcX6HSB@dyU?Me#2d>w;H|Q_FVM04nplVbhY%= z9AL7lk@yXxoR(Lcq8k2`=W?mw4XJ~UrLNEYd*V+io@Vdu!4>@(M{Ww qp+wX6Pt;hOVr+PAw(XR0lN;;S*0z%gwZ@W4!#7+uFbDm2dj9~Z@{J<^ literal 882 zcmah{y>8nu5GJW#J96r#MUk~LBYo`Kzf=<1&)4&A+^nm-wyW<^s_fd5^Z36PE|51FWg#18bUu-Z=K+Bf^f(V+D zj7F4_w?r^uT@ztRx@2Fi$O4Zo9Pl`I9$UC)r04yFOwyx~A6DV9lO}muo?3QTE{QV+as7!{siSzJOP3uhNRT++ykYQSV4&$N-GceM!Uo^(& zT+2dp?&Hl2AfW32?&|*yjC%o|%HvFOZrYqfa-HHn;QXSF(_KVku5m{yt+U*C@AFE| zr8cgJ8=eT`o>e-@=f=)eB~74Z8dr(R%SBRXpzwZvmS>C%86(tvIK zQ*iwwE?6g^~}!exyBE&?#6YsP`bZcprLWE ztsg-|cM%>V-~jXy!V>`FA>Y`#T_u?`?KeuxWS)PJjed%U9_sZN0_ZQ1ja{$DRHJtc k53+!|-I$$ENZ@t^+vr2Zj6c{hHN?+V;$#AH#GbYO0BZ2Vr2qf` diff --git a/app/__pycache__/tracker.cpython-310.pyc b/app/__pycache__/tracker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb6dfacaff966cd9b9dababd22f7965f5c0f43cb GIT binary patch literal 2396 zcmZuz-ESL35Z~SVKA#<@Bx%!6D72C*sHs2*p{fEJS{}ec0#U^(I$gaRa_-sZ>}}fG zoS#y7tN0VJUqHO@2kj#~puF-}RSGkEaY<6v+PT@Cot@d8-^@C%*FysB?jK+BRp9=@ z!O>>H;A7~;r$9L2G$RArr4)IVv4PdK26opTI9a0Qck*zN1So% zDeYR7k*>{M?mZ=4hxsqlbgsKK`2D=d1mh?bX`apgs60h|6+wJXqAlh=A4BH!d zZ+9Sus%YPaZQ7Z7(oROBwyGSuJ{oI3j?-bP;uyCmY#=TT>7;q+^Yw+eM?th`$m3Gu zdjl9wXQU)EIwx~HGwV$1HxGCC==C3_x8NY|RxSsLLWA2$u^q=PDg#h8PFJJ`LzGJ~ zl5rftsK6U)9CN1<_E4~B$m3SVoezPTI0~+FkKTi8w27kQbClq3;we_myJQn&)$Atl z7^=tU`2GPj1V}nmI{Y@tcEx8>=2AObS)QmCGfr!(Q1YbbjZq>C5hsUmS^`H*U>RI! zL>X;Rm->{wn5-=>_qf8bE5=Y_NX(gj1qMz;`f#S7H>R|tGd3qvrmUG=vN@evrL{r6 zyEe5;`#zgGQx}5alnzKd<@UXquYx(9g(~RRO79_P%p%bDOJBaTv#f&BE8SUr4!7`( zO#`FRC_#e~kfQ$59Pa8K@O>O5R zF*G>UffNbP(xE7{)hixp7so=%RXCu;Flw(5MUm!1?dbM5x>!5~$wunLY3TgRXRF7QMp+Nmts_|ZQ47GwBMqfxV^E1sl0p#g6`N!{1A4_(AQ6N!gpL$>c3@*?j56j^_n^TddikHp$|BrHH#rt;O#hbv zz7N^;GT6T?g3X~O{K(c{4f;#xiKv>;nmYo)sfJOK6TGy;I0F5NO(hl(++8_hFn9c-Od z>-}?O-GKBw*lnl_WmGm`uGYWEqi5E1>Conq0cif8)t%M?7#* z&muVoz^BL@R*ZQImafsV;O z#{RtgVsh$a{(%A3>9l-&Yp_Peu@2*Skn`OP`6!Nec9X1KBlKrNqu>$Y$CL9}cntpLi^XjB!t5V-4LQ)Gn+Z*}n|A_getCrPEV}>z literal 0 HcmV?d00001 diff --git a/app/__pycache__/views.cpython-310.pyc b/app/__pycache__/views.cpython-310.pyc index 0a8646a52c993f4fb781a4372add6f686eaed406..d377301b8e087a11ea132159a3649295b2f2b368 100644 GIT binary patch literal 2407 zcmaJ?Npl-T6z-l~qp__hPMnavilR_J9^gQ+gcOuR!2t|a$w?QNqHft^&uBz7Bco1F3x`* zEWU=OJyk~^L_Fi7E)t?_5a-&Gb6so@y+QQGl72xn ziGG13Tm%W5;u2As#Cdtixh1X;{UXt?F6r-xYee59`gL(*Zre?9i|Cic?T4&&=M3Z1 za;)1O4y_{|w>-O{B6glSd`OJ%J4-M5cg+=hiT2c^(Gv|{l=ZkPjY z2b#VKoneRkgdMY~Gh-Y_7f0g>{+xpk&hAT|wtR(WY-m)scO;cfDouO6Qb=v%#Y#U> zfDG2+ssY0brY^$p@@{%i7BW@i?jU_o_C|#q7@h9G(KI*DQix6ZB$H3|_Hb-#b5Y_k z3epjDffI53)g@S{4d`BR2-Yiyklz6G7N$q(++r{Z1(HGMx=o;256wfl8l8+BwS}CQ zp?gJ<3j`k;MXm!A!=`-3j3c;kPWcsfvZA<1*($NCJjHi=F5aW1zHOp&)7brnd~9h6U7 ziK^q=Hzn|@1m+5DwV{?;XXU{905COH7#th)v)n)iK`wyL?dG|{i>t0d2YB;_U4UZH zADNMoq~o<{QD!l08dKbKntT)TMsi!>cy;{j4-}Z} zlmi2RZ$BCj=qzn>{>$WMUp2gq<2yOq!6Zc=I4 zBQ3~98M^KyT(w~}xkGMKOwRed2*dySty&-eVKw(h%N(j~n`ABgi58OH^ohVlKGhdY zpiX^=PGD%ks}$$k*!_oBr0Zi~(0EUi<<&`C^$`#zYboGjurDj4toQRz45l+cwtf5pqt*^=v zlt_AR=qbQTN9BPo9>I{ZMY_*rdUa=`d!S^L%lmi*HD0#{yTUhlgRi62Va(S(Xfe!# L`P_#wT<8A+y!yzYMIjjNVT;;(4FbnVngqQRZqfLpiy?`Wwd;K-B$Zmi z>f~Jg3xWdHF@K4NUV7>e=*2*b4!LS=Hz*n|I2_InXTBM7rs{Sh1mnlgzvB-XLciM0 z?LlGl7^a#6;fUiL6=;A8JiyrQNlprH;1zU03xD7{nU}L77z9N)2r&{UYjMi`Q_R^V z;Q-Ojl9h}PTuC-7bx!i2HsFij5nOk4B?~LGh0%WT*wnGidjC?!UR&h zoC~E*kg2LnCkxPLPv&}BNkhM>s0S;1eT)kG#uYuBhd9%sQf~+ns9oFS8SsN_HS!}9hSBK-xBw0{04Eb z1~jNq)`Ks05$uqN{{ksm|-|6CcqVx?Afc@vcy)A+_vOC5aUl$30=U4w3gc4DAW_@ zhK;MjzWl(}B~)1)nw`_U8V&OkC#go67;AU?roE{}`vgpPvk~X1(yFmY?GgE@^%qK^ zW>u+#tI~$tvp-lQ{H diff --git a/app/codes.csv b/app/codes.csv new file mode 100644 index 0000000..e17a6ad --- /dev/null +++ b/app/codes.csv @@ -0,0 +1,110 @@ +-1, Undefined +0, Sleep +, +, +0.4, Airplane sleep +0.5, Nap +, +, +, +, +, +1, Family +, +, +, +15, Neighborhood / Community work +, +, +, +, +, +2, Friends +, +, +, +, +, +, +28, Meal +29, Drugs +, +3, Dating / Partner +31, Jen's family +32, Jen's friends +33, Sex +34, Exploring +35, Errands and logistics +36, Watching something +37," Hiking, adventuring " +38, Meal +39, Relaxing +, +4, Flying +41," Airports, etc." +43, Flying with Jen +45, Flying for business +46, Maintenance +47, Training +, +, +, +, +, +, +5, Work +, +, +, +56, Inbox +57, Work meditation +58, Socializing +, +, +, +6, Productive +61, Cleaning +63, Home project +65, Personal finances / life admin +66, Outdoor exercise +67, Gym +, +69, Bureaucracy / bullshit +7, Hobbies and Skills +, +, +73, Home Improvement +, +, +, +, +, +, +8, Relaxation and Leisure +81, TV / Movies +82, Hot tub / Sauna +83, Masturbation +, +, +, +, +88, Video games +89, Social Media +9, Waste +91, Waiting / killing time +, +, +, +96, Disaster +, +, +98, Can't sleep +99, Stress eating +10, Health and Travel +101, Food +, +103, Bath +104, In transit +105, Shower and get ready +106," Cleaning, packing " +108, Massage \ No newline at end of file diff --git a/app/export.csv b/app/export.csv new file mode 100644 index 0000000..0937b96 --- /dev/null +++ b/app/export.csv @@ -0,0 +1,366 @@ +DATE,DAY,12 AM,1 AM,2 AM,3 AM,4 AM,5 AM,6 AM,7 AM,8 AM,9 AM,10 AM,11 AM,12 PM,1 PM,2 PM,3 PM,4 PM,5 PM,6 PM,7 PM,8 PM,9 PM,10 PM,11 PM,Mood,Comments,#, Name +1/1,SUN,2,2,2,0,0,0,0,0,0,0,0,9,2,3,3,2,2,2,2,2,2,2,2,2,5,"Upstate with Hil, Averi, Lex, etc",0, Sleep +1/2,MON,2,2,0,0,0,0,0,0,0,0,2,2,10,10,10,9,9,9,10,2,2,2,2,2,6,Hungover return; dinner with Gabe and Jackie,1, Family +1/3,TUE,3,9,0,0,0,0,0,0,0,8,8,6,3,8,9,9,5,9,9,9,9,9,3,7,3,Languishing ,2, Friends +1/4,WED,7,9,0,0,0,0,0,0,0,0,8,9,7,7,6,0,3,3,3,3,3,8,9,9,4,Still languishing,3, Dating / Partner +1/5,THU,9,0,0,0,0,0,0,0,0,0,8,9,9,10,9,9,9,10,4,4,4,4,4,10,3,Finally on the way home,4,Flying +1/6,FRI,10,0,0,0,0,0,0,0,3,10,10,10,10,10,10,10,10,10,10,10,10,8,8,8,6,"En route via Springfield, IL!",5, Work +1/7,SAT,8,8,0,0,0,0,0,0,6,6,3,3,8,8,8,8,8,1,1,1,3,8,8,8,8,First day back; gym; family; fast,6, Productive +1/8,SUN,0,0,0,0,0,0,0,0,0,8,8,8,10,10,10,10,10,3,6,7,7,9,9,9,8,"Cleaning, relaxing, getting shit done.",7, Hobbies and Skills +1/9,MON,0,0,0,0,0,0,0,0,8,9,8,5,6,8,5,8,5,5,6,6,8,3,3,9,6,Lazy first Monday. Couple calls. Worked from home. Caught up on wedding and house needs.,8, Relaxation and Leisure +1/10,TUE,0,0,0,0,0,0,0,0,8,7,7,6,5,5,5,5,5,5,3,8,8,8,6,8,6,Prep for tomorrow,9, Waste +1/11,WED,9,0,0,0,0,0,0,0,8,10,5,5,5,5,5,5,5,5,5,5,5,8,3,9,7,SK,10, Health and Travel +1/12,THU,0,0,0,0,0,0,0,10,5,10,5,5,5,5,5,5,5,5,5,5,5,3,8,9,8,Ontario Teachers OTPP,, +1/13,FRI,0,0,0,0,0,0,0,3,8,3,6,5,3,3,5,10,10,7,7,1,1,1,3,0,8,Jamaican dinner for Peru/Kiri and parents,, +1/14,SAT,0,0,0,0,0,0,0,0,0,0,8,10,10,7,0,0,7,10,8,9,9,9,9,9,7,"Nice needed lazy day. Did some drugs, probably too many.",, +1/15,SUN,6,8,0,0,0,0,0,0,0,0,0,10,10,8,8,7,7,3,8,2,2,2,3,8,8,Lazy rainy day. Saw Andrew and sienna in the evening.,, +1/16,MON,9,0,0,0,0,0,0,0,0,0,3,8,6,7,8,8,8,8,8,8,3,3,3,9,6,Stressed about work. Had vodka and popcorn.,, +1/17,TUE,3,0,0,0,0,0,0,9,0,0,9,6,5,7,7,5,8,8,8,8,7,7,8,8,7,Hindi lessons!,, +1/18,WED,9,0,0,0,0,0,0,10,5,5,5,5,8,6,6,3,3,7,7,3,8,8,3,3,7,Lazy,, +1/19,THU,8,0,0,0,0,0,0,0,0,10,10,3,8,10,0,6,8,8,6,3,6,3,9,9,5,not sure,, +1/20,FRI,9,0,0,0,8,0,0,0,0,0,10,6,6,5,3,6,8,7,7,3,3,3,9,9,6,long Hindi lesson and RDR2,, +1/21,SAT,9,9,9,9,0,0,0,0,0,0,10,8,3,3,10,3,8,0,0,6,6,6,6,6,6,Polestar demo; In n out; Cleaning and packing,, +1/22,SUN,7,3,8,0,0,0,0,0,10,10,1,1,10,10,10,10,10,10,10,10,10,10,10,10,7,Flying to Chicago,, +1/23,MON,9,0,0,0,0,0,0,10,10,5,5,5,5,5,5,5,5,5,5,5,5,5,8,0,7,First day with TM,, +1/24,TUE,0,0,0,0,0,0,0,10,10,10,10,5,5,5,5,5,1,1,2,2,2,3,10,9,6,Second day with TM; basketball game,, +1/25,WED,0,0,0,0,0,0,0,10,10,10,5,10,10,10,10,10,10,10,3,3,3,5,8,0,7,No-Go Decision! Commercial to NY,, +1/26,THU,0,0,0,0,0,10,10,10,10,6,6,5,10,10,10,3,3,3,3,3,5,8,3,0,6,Driving upstate for wedding rentals,, +1/27,FRI,0,0,0,0,0,0,0,0,5,5,5,10,8,8,10,9,9,9,5,5,5,9,9,0,5,Board meeting sucked,, +1/28,SAT,0,0,0,0,0,0,0,0,5,8,8,5,3,8,6,8,8,10,3,3,3,3,0,0,4,Hangover and day wastage,, +1/29,SUN,0,8,0,0,0,0,0,0,0,9,9,8,7,7,7,3,9,9,9,9,9,0,0,0,6,Quiet day in feat several hours of Hindi,, +1/30,MON,0,0,0,0,0,0,10,3,3,3,8,8,6,10,7,10,10,10,10,10,10,0,0,0,6,Another wedding rentals; flight to India,, +1/31,TUE,0,0,0,0,0,10,10,10,0,0,0,0,10,10,8,0,0,0,8,10,10,10,10,10,7,Endless travel forever,, +2/1,WED,5,5,5,5,5,5,0,5,5,8,0,0,0,0,0,0,0,5,8,10,8,5,5,5,4,Cool safari. why the fuck are we in India.,, +2/2,THU,5,5,5,5,5,5,5,5,5,5,9,9,0,0,0,0,0,0,0,0,10,10,10,10,3,"welp, I'm sick ",, +2/3,FRI,10,10,10,10,10,10,10,10,10,10,10,10,0,0,0,0,0,0,0,0,10,5,5,5,2,and still in fucking India,, +2/4,SAT,8,10,5,5,5,5,5,5,5,5,5,3,0,0,0,0,0,0,0,0,10,10,10,10,1,planned how to continue drowning; met Aftab,, +2/5,SUN,10,10,10,10,10,8,8,8,8,8,0,0,0,0,0,0,0,0,10,5,5,5,5,5,1,Why does it take fucking forever to travel anywhere in India,, +2/6,MON,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,10,5,5,5,5,5,4,A little better. PD India day 1,, +2/7,TUE,5,5,5,5,5,5,0,0,9,9,9,10,10,10,10,10,10,0,0,10,10,10,10,10,1,"PD India Day 2, town hall, doomsday, our fates, getting home.",, +2/8,WED,10,0,0,0,0,0,10,10,0,0,0,0,10,10,10,10,10,10,10,10,10,10,10,10,5,Infinity travel and flying,, +2/9,THU,10,3,3,0,0,0,0,0,0,5,5,8,8,5,8,8,0,0,0,9,3,3,8,7,7,Nice to be home.,, +2/10,FRI,9,9,9,9,0,0,0,0,0,0,10,5,9,0,0,0,9,5,8,3,3,8,0,0,6,avoidance ,, +2/11,SAT,0,0,0,0,0,0,10,8,9,9,6,8,8,8,8,8,8,0,7,8,8,8,3,8,7,,, +2/12,SUN,0,0,0,0,0,0,0,0,0,8,8,8,8,2,2,2,1,1,1,1,1,8,0,0,6,Annie and family.,, +2/13,MON,0,0,0,0,0,0,0,10,6,6,5,5,5,5,5,5,5,5,5,9,3,0,0,0,4,Connecting with folks at the office. Doomsday planning.,, +2/14,TUE,0,0,0,0,0,0,0,0,0,10,8,5,5,5,5,6,10,6,6,7,3,3,3,3,3,Dreading work. Good Valentine's dinner with Jen.,, +2/15,WED,0,0,0,0,0,0,0,0,5,7,5,5,5,7,5,5,5,5,3,9,10,6,9,0,2,Coming to terms with / trying to fight killing marketing at PD,, +2/16,THU,0,0,0,0,0,0,8,7,7,7,7,7,10,9,5,7,8,7,9,9,3,8,9,0,4,Waste of a day.,, +2/17,FRI,0,0,0,0,0,0,0,8,9,6,6,6,6,6,10,8,7,7,7,7,7,7,10,8,6,Playing with AI and cooking!,, +2/18,SAT,0,0,0,0,0,0,0,0,0,7,10,10,10,10,3,3,3,3,3,3,3,3,0,0,7,Birthday weekend!,, +2/19,SUN,0,0,0,0,0,0,0,8,10,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,7,Birthday weekend part 2,, +2/20,MON,0,0,0,9,0,0,0,0,8,3,3,10,10,10,9,9,3,5,5,5,5,3,9,9,6,Mostly helping Jen with her case study,, +2/21,TUE,0,0,0,0,0,0,0,10,10,5,5,5,5,5,5,5,5,5,5,1,1,3,6,0,5,First day of construction! Dilhan lunch. ,, +2/22,WED,0,0,0,0,0,0,0,0,10,9,3,9,5,10,5,9,8,3,9,9,3,3,3,3,2,ugh everything is so exhausting,, +2/23,THU,0,0,0,0,0,0,0,0,0,3,6,2,5,8,8,8,3,3,6,8,6,3,8,0,4,Yeah,, +2/24,FRI,0,0,0,0,0,0,0,0,0,8,8,5,6,7,7,6,6,6,6,6,6,6,6,6,4,moving out (temporarily),, +2/25,SAT,8,8,9,9,0,0,0,0,8,3,6,6,6,6,6,6,6,10,2,2,2,2,2,2,5,"more moving, friends and bwc",, +2/26,SUN,3,9,9,9,9,9,9,9,0,0,6,6,10,10,10,10,0,0,0,0,0,0,0,0,5,MDMA night and flight to Dubai,, +2/27,MON,10,0,0,0,0,10,10,10,0,0,9,9,0,0,0,0,0,3,8,10,10,5,5,5,5,Meeting with CG.,, +2/28,TUE,5,5,5,5,5,5,5,5,0,0,0,0,10,8,0,0,0,8,10,5,5,5,5,5,5,Meeting with mubadala/strata.,, +3/1,WED,5,5,5,5,5,5,10,10,0,5,0,0,0,0,0,0,5,5,8,8,8,3,0,5,6,Conference in Abu Dhabi ,, +3/2,THU,5,5,5,5,5,5,5,8,0,0,0,0,0,5,0,0,0,8,10,5,5,5,8,8,7,Maybe things are looking up?,, +3/3,FRI,8,10,10,10,8,0,0,0,10,5,5,8,8,8,0,0,10,10,8,8,10,10,10,0,7,Nalin; coming home,, +3/4,SAT,0,0,0,0,0,0,0,0,0,10,10,10,10,10,10,8,8,3,3,3,3,3,3,0,8,Good to be back. Emily Calkins and Co like it in the Bay! Lasagna in a restaurant with a bad memory.,, +3/5,SUN,0,9,9,9,0,0,0,0,0,0,0,3,6,3,10,3,10,10,10,10,10,8,0,0,8,Home and flight to Scottsdale,, +3/6,MON,0,0,0,0,0,10,7,7,7,7,7,7,7,7,7,7,7,7,10,10,10,10,10,3,7,Recurrent training for PA46,, +3/7,TUE,9,9,9,0,0,0,0,0,0,6,8,6,6,6,6,8,8,10,10,10,10,10,10,10,4,Flew to Lummi Island. Got in late. No dinner for us,, +3/8,WED,8,0,0,0,0,0,0,3,5,5,6,5,5,3,5,9,0,3,5,3,3,3,3,8,4,"Nail biting for both of us. yet, enjoying the cabin and northwest.",, +3/9,THU,0,0,0,0,9,0,0,0,0,5,3,10,5,6,6,7,5,5,5,5,3,3,3,3,3,"Hiked, cooked, talked to TM. Worlds starting and ending for Jen and me.",, +3/10,FRI,3,9,0,0,0,0,0,0,8,5,5,3,5,6,6,10,10,1,1,1,1,1,1,1,6,"Seattle, meeting Josh's sister Kyra",, +3/11,SAT,0,0,0,0,0,0,0,0,0,0,10,3,3,10,10,10,10,10,10,3,8,8,8,9,5,basically just getting home,, +3/12,SUN,0,0,0,0,0,0,0,7,8,0,0,0,0,3,3,6,10,10,3,3,2,3,3,3,6,Checked into the Claremont hotel. Bonnie Cole. grey's anatomy.,, +3/13,MON,0,0,0,0,0,0,0,5,10,3,8,5,3,8,8,8,8,3,1,1,1,3,3,3,5,Stressed about TM/Allison decision. Enjoying Claremont and new tablet.,, +3/14,TUE,3,9,9,0,0,0,0,9,9,0.5,0.5,10,5,9,0.5,0.5,0.5,5,8,8,3,3,8,3,1,One more circuit down the spiral to the drain?,, +3/15,WED,0,0,0,0,0,0,0,0,5,0.5,10,5,6,5,5,8,9,5,0.5,5,9,9,3,3,2,Still shitty,, +3/16,THU,0,0,0,0,0,0,0,0,8,8,10,10,5,5,5,5,3,5,5,10,5,5,9,9,3,Chewing glass internally. Edward. Drinking. Embarrassing myself with KG.,, +3/17,FRI,9,0,0,0,0,9,9,0,0,10,9,5,6,6,6,6,10,1,1,1,5,5,5,3,1,True colors revealed? and a nice dinner at Daytrip with Ashley and Elie. Wedding invites finally sent.,, +3/18,SAT,9,9,0,0,0,9,0,9,9,9,0,8,10,0.5,9,9,9,9,10,6,6,6,6,8,4,"Getting some good perspective, cleaning the house",, +3/19,SUN,6,6,9,0,0,0,0,0,0,0,0,0,8,10,6,6,8,8,10,8,8,8,8,8,5,Gym and sushi. New lowest weight this year!,, +3/20,MON,8,8,0,0,0,0,0,0,0,10,5,5,5,5,5,5,9,9,3,10,8,5,8,0,2,shitty,, +3/21,TUE,9,9,0,0,0,0,0,0,0,10,9,10,10,5,5,5,5,5,5,10,10,2,5,0,4,The transition day. layoffs happened. power went out. slept at the office. ran into Mario,, +3/22,WED,0,0,0,0,0,0,0,0,0,0,8,10,3,5,5,5,9,9,5,10,10,8,9,0,5,Getting there.,, +3/23,THU,0,9,9,0,0,9,0,9,10,5,5,8,0.5,10,108,108,108,8,8,8,8,8,8,9,6,Relaxed.,, +3/24,FRI,8,0,0,0,0,0,0,0,10,10,6,0.5,0.5,8,5,8,6,6,8,8,8,8,8,0,5,Didn't do much with my day.,, +3/25,SAT,0,0,0,0,0,0,0,0,0,0,8,10,6,6,6,6,5,6,8,8,8,9,9,9,6,At least I've gotten exercise and haven't eaten or drank too much,, +3/26,SUN,9,9,9,9,9,9,9,0,0,0,0,0,10,0.5,0.5,8,8,3,8,8,8,8,8,8,5,Lazy day,, +3/27,MON,9,9,0,0,0,0,0,0,0,10,8,8,5,5,5,7,1,1,67,67,8,8,8,8,6,Feeling alright today.,, +3/28,TUE,83,9,0,0,0,0,0,0,0,5,103,0.5,0.5,89,89,81,101,81,81,0.5,0.5,8,89,89,4,Kinda aimless. ,, +3/29,WED,3,3,33,0,0,0,0,0,0,105,35,73,10,65,65,5,31,31,35,35,33,57,101,99,7,Good to have Jen back!,, +3/30,THU,83,0,0,0,0,98,98,3,10,5,5,6,6,6,73,5,0.5,0.5,3,3,3,3,33,83,5,"Alright, but stressed. Good life admin progress.",, +3/31,FRI,0,0,0,0,0,0,0,0,0,10,5,5,57,2,9,5,5,5,10,3,2,2,2,0,3,ugh,, +4/1,SAT,0,0,0,0,0,0,0,0,0,103,101,83,106,104,2,2,2,2,2,2,28,2,104,104,4,Graziano! Radio show! Rushed stressful trip!,, +4/2,SUN,10,0.4,0.4,0.4,10,10,10,10,10,10,0.4,0.4,0.4,104,0.4,0.4,10,10,10,10,10,10,10,10,6,"I mean, stressed kinda, but nice to be in Pategonia!",, +4/3,MON,10,10,10,10,10,10,10,37,37,10,10,10,10,103,8,3,3,3,3,0,0,0,0,0,7,Long (excessive) but very good and beautiful hike up Mt Fitz Roy in Patagonia,, +4/4,TUE,0,0,0,0,37,37,37,37,37,37,37,37,37,37,38,10,3,8,33,8,0,0,0,0,7,Long (way too long) but very nice hike!,, +4/5,WED,0,0,0,0,0,0,37,37,37,37,38,38,3,65,37,37,10,38,38,38,3,0,0,0,7,Pretty much same as above!,, +4/6,THU,0,0,0,0,106,37,37,37,37,38,10,104,104,104,104,104,104,104,104,38,38,10,0,0,6,Beautiful trip.,, +4/7,FRI,0,0,0,0,0,0,0,33,38,56,56,65,38,39,83,2,2,2,2,2,2,2,33,0,8,"Gabe, Jackie, tango lessons!",, +4/8,SAT,0,0,0,0,0,0,83,106,106,38,10,2,2,2,2,2,10,28,28,28,28,0,0,0,8,"Gorgeous hotel ""home"" in BA. Day with Gabe and Jackie. dinner with Phoebe.",, +4/9,SUN,0,0,0,0,0,38,38,103,28,28,34,34,39,39,36,36,28,28,28,2,3,0,0,0,8,Really fun day!,, +4/10,MON,0,0,0,0,0,0,0.5,36,103,39,38,38,38,3,39,2,28,28,28,2,8,0,0,0,8,Don Julio and more Buenos Aires!,, +4/11,TUE,0,0,0,0,0,108,108,106,104,104,38,34,34,34,104,104,38,104,104,104,104,0.4,0.4,0.4,8,Day in Uruguay; heading home,, +4/12,WED,0.4,0.4,98,0.4,0.4,104,104,104,104,0.4,0.4,0.4,104,104,5,103,89,101,38,103,8,8,8,83,7,Back home.,, +4/13,THU,0,0,0,0,0,0,0,83,5,6,6,5,8,8,6,88,88,88,88,88,88,88,88,83,6,Pretty much just video games ,, +4/14,FRI,0,0,0,0,0,0,0,0,8,8,8,6,8,88,66,66,101,8,8,3,38,38,36,36,5,Good walk. Not productive,, +4/15,SAT,0,0,0,0,0,0,33,8,88,88,33,88,88,104,3,38,104,1,1,3,88,88,88,88,6,Family time,, +4/16,SUN,88,0,0,0,0,0,0,0,0,0,3,82,69,69,66,66,1,1,3,36,38,88,88,83,6,"Walked, saw parents.",, +4/17,MON,0,0,0,0,0,0,0,3,83,105,69,69,69,69,83,88,0.5,99,3,36,88,36,36,99,5,Jen's first day! My 3200th. No work done.,, +4/18,TUE,0,0,0,0,0,0,0,98,0,61,61,61,5,5,5,5,69,89,91,3,3,3,3,3,5,Finally cleaned (annoyed how long it goes).,, +4/19,WED,83,0,0,0,0,0,0,0,83,89,89,5,101,5,0.5,5,9,9,1,36,36,8,33,8,4,IDK,, +4/20,THU,0,0,0,0,0,0,0,98,103,8,83,8,101,88,66,66,88,104,31,31,31,36,36,0,4,IDK still,, +4/21,FRI,0,0,0,0,0,0,0,5,33,103,8,101,5,63,46,46,46,46,3,5,3,3,9,83,2,I guess drugs?,, +4/22,SAT,83,83,9,9,9,0,0,0,0,0,0,0,0,3,103,104,2,2,3,3,104,96,96,96,3,Burglarized!!,, +4/23,SUN,0,0,0,0,0,0,0,0,0,96,96,96,96,96,36,96,96,63,8,8,36,36,8,36,4,Aftermath. Goose chase at the flea market and in Antioch,, +4/24,MON,0,0,0,0,0,0,0,0,5,83,63,63,5,89,5,0.5,99,9,9,9,36,106,36,8,4,didn't do much. had a few calls,, +4/25,TUE,0,0,0,0,0,0,0,0,8,10,5,67,67,5,5,5,10,8,0.5,3,89,36,36,36,6,Caught up. Worked out,, +4/26,WED,98,0,0,0,0,0,0,0,0,103,83,5,5,67,67,101,5,5,7,5,5,3,3,3,6,Starting to feel more on top of things,, +4/27,THU,0,0,0,0,98,98,0,0,0,89,91,91,67,67,101,5,65,58,10,15,15,38,3,89,6,Neighborhood meeting re public safety. Caught up. Nice to see Perumal a bit more.,, +4/28,FRI,0,0,0,0,0,0,0,0,0,33,6,7,7,9,9,9,9,7,91,1,1,1,8,36,5,"Kind of wasted due to Jen's struggle, but overall a good day. saw family and Samoti.",, +4/29,SAT,8,83,0,0,0,0,0,0,,,,,,,,,,,,,,,,,,,, +4/30,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/1,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/2,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/3,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/4,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/5,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/6,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/7,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/8,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/9,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/10,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/11,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/12,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/13,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/14,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/15,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/16,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/17,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/18,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/19,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/20,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/21,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/22,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/23,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/24,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/25,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/26,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/27,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/28,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/29,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/30,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +5/31,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/1,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/2,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/3,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/4,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/5,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/6,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/7,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/8,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/9,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/10,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/11,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/12,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/13,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/14,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/15,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/16,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/17,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/18,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/19,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/20,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/21,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/22,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/23,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/24,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/25,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/26,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/27,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/28,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/29,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +6/30,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/1,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/2,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/3,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/4,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/5,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/6,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/7,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/8,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/9,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/10,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/11,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/12,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/13,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/14,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/15,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/16,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/17,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/18,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/19,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/20,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/21,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/22,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/23,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/24,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/25,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/26,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/27,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/28,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/29,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/30,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +7/31,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/1,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/2,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/3,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/4,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/5,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/6,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/7,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/8,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/9,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/10,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/11,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/12,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/13,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/14,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/15,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/16,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/17,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/18,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/19,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/20,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/21,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/22,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/23,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/24,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/25,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/26,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/27,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/28,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/29,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/30,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +8/31,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/1,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/2,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/3,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/4,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/5,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/6,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/7,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/8,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/9,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/10,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/11,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/12,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/13,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/14,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/15,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/16,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/17,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/18,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/19,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/20,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/21,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/22,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/23,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/24,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/25,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/26,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/27,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/28,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/29,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +9/30,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/1,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/2,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/3,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/4,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/5,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/6,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/7,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/8,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/9,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/10,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/11,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/12,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/13,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/14,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/15,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/16,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/17,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/18,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/19,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/20,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/21,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/22,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/23,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/24,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/25,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/26,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/27,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/28,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/29,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/30,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +10/31,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/1,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/2,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/3,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/4,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/5,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/6,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/7,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/8,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/9,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/10,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/11,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/12,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/13,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/14,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/15,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/16,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/17,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/18,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/19,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/20,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/21,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/22,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/23,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/24,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/25,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/26,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/27,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/28,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/29,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +11/30,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/1,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/2,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/3,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/4,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/5,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/6,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/7,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/8,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/9,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/10,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/11,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/12,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/13,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/14,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/15,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/16,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/17,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/18,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/19,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/20,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/21,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/22,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/23,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/24,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/25,MON,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/26,TUE,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/27,WED,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/28,THU,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/29,FRI,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/30,SAT,,,,,,,,,,,,,,,,,,,,,,,,,,,, +12/31,SUN,,,,,,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/app/models.py b/app/models.py index d9c41e2..c0862e9 100644 --- a/app/models.py +++ b/app/models.py @@ -1,16 +1,37 @@ from app import db +import json + class Day(db.Model): day_id = db.Column(db.Integer, primary_key=True) + date = db.Column(db.Date, unique=True) note = db.Column(db.String) - books = db.relationship("Hour", backref="day") + hours = db.relationship("Hour", backref="day") def __repr__(self): - return ''.format(self.hours) + return ''.format(self.date.strftime("%x")) + + def toJson(self): + return json.dumps(self, default=lambda o: o.__dict__) + + +class Activity(db.Model): + activity_id = db.Column(db.Integer, primary_key=True) + code = db.Column(db.Integer, unique=True) + name = db.Column(db.String) + hours = db.relationship("Hour", backref="activity") + color = db.Column(db.String) + + def __repr__(self): + return "".format(self.code, self.name) class Hour(db.Model): hour_id = db.Column(db.Integer, primary_key=True) time = db.Column(db.Integer) - day_id = db.Column(db.Integer, db.ForeignKey("author.author_id")) - + day_id = db.Column(db.Integer, db.ForeignKey("day.day_id")) + note = db.Column(db.String) + activity_code = db.Column(db.Integer, db.ForeignKey("activity.code")) + + def __repr__(self): + return "".format(self.time, self.day_id) diff --git a/app/sqlite.db b/app/sqlite.db index 820c49be51c82714f2f9b6784e3af37f0a6a6609..8f7519baadfa04a19aa598cdd5c80b21e2d4e6b5 100644 GIT binary patch literal 176128 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 N9SttyGaa?y{{qMyMYjL| delta 349 zcmZp8z}1j2K}v{$g@J*A8HizkX`+r1NK`M}ix()y#CMW`zn$;oWzu0c8qT%0ADB{`{+@AFC4gVX^fH9?|o{z0yu?tTj1u8|sWZJG)}u5PYDu71w0 z!3q#j1teK6&2mO|aY;$WMo+M-ASxgv6N<}Vdbv0uEU=R%x9|$H*krX&{!BMSqkC`c9nBO_qW diff --git a/app/static/ltx.css b/app/static/ltx.css index ff5e826..c64dca5 100644 --- a/app/static/ltx.css +++ b/app/static/ltx.css @@ -12,7 +12,7 @@ body{ table { font-family: "Monospace"; border-collapse: collapse; - width: 100%; + font-size: 11pt; } th{ @@ -26,10 +26,51 @@ tr.htmx-swapping td { td, th { border: 1px solid #383737; - text-align: left; - padding: 8px; + text-align: center; + padding: 4px; + min-width: 4em; +} + +td.now, th.now{ + background: var(--fg); + color: var(--bg); + border-left: 0px; + border-right: 0px; +} + +td.day-note{ + width: max-content; } tr:nth-child(even) { - background-color: #dddddd; + background-color: #2f3941; } + +input.update-entry-form{ + width: 3em; + text-align: center; +} + +div#color-chooser{ + position:absolute; + display:flex; + margin: 2px; +} + +.color-choice{ + padding: 1px 5px; + border: 1px solid black; +} +.color-choice:hover{ + border: 1px solid white; +} +div.upcase{ text-transform: uppercase;} +div#table{font-family:monospace;display: grid;grid-template-columns: repeat(28, 1fr);} +div#header{border-bottom:2px solid gray;} +div.table-row{border-bottom:1px solid gray;} +div.cell{ + width: 75px; + font-size:10pt; + text-align: center; padding: 1px 5px} + + .hot-display-license-info{display:none;} \ No newline at end of file diff --git a/app/templates/categories.html b/app/templates/categories.html new file mode 100644 index 0000000..fcb7f55 --- /dev/null +++ b/app/templates/categories.html @@ -0,0 +1,27 @@ +{% extends "layout.html" %} + +{% block content %} + +

+ Category Editor +

+ + + + + + + + + + + {%for activity in activities %} + + + + + + {% endfor %} + +
CodeNameColor
{{ activity.code }}{{ activity.name }}{{ activity.color }}
+{% endblock %} \ No newline at end of file diff --git a/app/templates/colors.css b/app/templates/colors.css new file mode 100644 index 0000000..9e72112 --- /dev/null +++ b/app/templates/colors.css @@ -0,0 +1,51 @@ +:root{ + --black: #273036; + --red: #c71634; + --cyan: #005744; + --pink: #ff65ae; + --blue: #00a9b3; + --green: #189749; + --yellow: #fff336; + --orange: #ff6d01; + --purple: #5b3ab1; + --darkred: #ff2816; + --lime: #bfff55; +} +tr.color-black{ + background: var(--black); +} +tr.color-red{ + background: var(--red); +} +tr.color-blue{ + background: var(--blue); +} +tr.color-green{ + background: var(--green); +} +tr.color-purple{ + background: var(--purple); +} +tr.color-lime{ + background: var(--lime); + color: var(--black); +} +tr.color-cyan{ + background: var(--cyan); +} +tr.color-darkred{ + background: var(--darkred); +} +tr.color-pink{ + background: var(--pink); +} +tr.color-orange{ + background: var(--orange); +} +tr.color-yellow{ + background: var(--yellow); + color: var(--black); +} +h2{ + color:green; +} \ No newline at end of file diff --git a/app/templates/forms/select-color.html b/app/templates/forms/select-color.html new file mode 100644 index 0000000..78caaef --- /dev/null +++ b/app/templates/forms/select-color.html @@ -0,0 +1,15 @@ +
+ {% for color in [ + "black", "red", "cyan", "blue", "green", + "purple", "yellow", "darkred", "orange", + "pink", "lime"] %} +
+ {{ color.capitalize() }} +
+ {% endfor %} +
\ No newline at end of file diff --git a/app/templates/forms/update-entry.html b/app/templates/forms/update-entry.html new file mode 100644 index 0000000..1160b38 --- /dev/null +++ b/app/templates/forms/update-entry.html @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html deleted file mode 100644 index 2b44b9c..0000000 --- a/app/templates/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - Life Tracker Expanded - - - - - - -

Life Tracker, Expanded

- - - - - - {% for m in ["am", "pm"]%} - - {% for t in range(1,12) %} - - {% endfor %} - {% endfor %} - - - - {%for book in books%} - - - - - - - {%endfor%} - -
DateDay12 {{m}}{{t}} {{m}}
{{book.Book.title}}{{book.Author.name}} - - - -
- - \ No newline at end of file diff --git a/app/templates/layout.html b/app/templates/layout.html new file mode 100644 index 0000000..137d587 --- /dev/null +++ b/app/templates/layout.html @@ -0,0 +1,19 @@ + + + + Life Tracker Expanded + + + + + + + + + +

Life Tracker, Expanded

+ + {% block content %}{% endblock %} + + \ No newline at end of file diff --git a/app/templates/table.html b/app/templates/table.html new file mode 100644 index 0000000..cb99e30 --- /dev/null +++ b/app/templates/table.html @@ -0,0 +1,26 @@ +{% extends "layout.html" %} + +{% block content %} + +
+ + +{% endblock %} \ No newline at end of file diff --git a/app/templates/table2.html b/app/templates/table2.html new file mode 100644 index 0000000..18f3d3b --- /dev/null +++ b/app/templates/table2.html @@ -0,0 +1,56 @@ +{% extends "layout.html" %} +{% block content %} +

+ {{ days[0].date.strftime("%h %d") }} + – + {{ days[-1].date.strftime("%h %d") }} +

+
+
Date
+
Day
+ {% for m in ["am", "pm"]%} + {% for t in [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] %} + {% if now.strftime("%P") == m and now.strftime("%l").strip() == "{}".format(t) %} +
+ {% else %} +
+ + {% endif %} + {{t}} {{m}} +
+ {% endfor %} + {% endfor %} +
Mood
+
Comments
+ + {%for day in days%} + + {% if day.date.strftime("%x") == now.strftime("%x") %} +
+ {% else %} +
+ {% endif %} + {{day.date.strftime("%m/%d")}} +
+ {% if day.date.strftime("%x") == now.strftime("%x") %} +
+ {% else %} +
+ {% endif %} + {{day.date.strftime("%a").upper()}} +
+ {%for hour in day.hours%} +
+ {% if hour.activity.code != -1 %} + {{hour.activity.code}} + {% endif %} +
+ {% endfor %} +
{{day.mood}}
+ +
{{day.note}}
+ {%endfor%} + +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/table_.html b/app/templates/table_.html new file mode 100644 index 0000000..616b518 --- /dev/null +++ b/app/templates/table_.html @@ -0,0 +1,57 @@ +{% extends "layout.html" %} +{% block content %} +

+ {{ days[0].date.strftime("%h %d") }} + – + {{ days[-1].date.strftime("%h %d") }} +

+ + + + + + {% for m in ["am", "pm"]%} + {% for t in [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] %} + {% if now.strftime("%P") == m and now.strftime("%l").strip() == "{}".format(t) %} + + {% endfor %} + {% endfor %} + + + + {%for day in days%} + + {% if day.date.strftime("%x") == now.strftime("%x") %} + + {% if day.date.strftime("%x") == now.strftime("%x") %} + + {%for hour in day.hours%} + + {% endfor %} + + + {%endfor%} + +
DateDay + {% else %} + + + {% endif %} + {{t}} {{m}} +
+ {% else %} + + {% endif %} + {{day.date.strftime("%m/%d")}} + + {% else %} + + {% endif %} + {{day.date.strftime("%a").upper()}} + + {% if hour.activity.code != -1 %} + {{hour.activity.code}} + {% endif %} + {{day.note}}
+{% endblock %} \ No newline at end of file diff --git a/app/tracker.py b/app/tracker.py new file mode 100644 index 0000000..441fdf3 --- /dev/null +++ b/app/tracker.py @@ -0,0 +1,76 @@ +from app import db +from app.models import Day, Hour, Activity +import csv +import datetime + + +class Tracker(): + def __init__(self, codes_path=None, sheets_path=None): + self.codes_path = codes_path + self.sheets_path = sheets_path + + def __repr__(self): + return "".format(self.__hash__()) + + def parse_activity(self, str): + try: + return int(str) + except ValueError: + try: + return float(str) + except: + return -1 + + def import_codes(self): + with open(self.codes_path) as csv_file: + data = csv_file.readlines() + lines = csv.reader(data) + for line in lines: + [code_str, name] = line + code = self.parse_activity(code_str) + exists = db.session.query(Activity).filter( + Activity.code == code).first() + if exists: + pass + else: + activity = Activity( + code=code, name=name.strip()) + db.session.add(activity) + db.session.commit() + + def import_csv(self): + with open(self.sheets_path) as csv_file: + # Skip the header row + data = csv_file.readlines()[1:] + lines = csv.reader(data) + for line in lines: + # Parse each row + date_str = line[0] + hours_str = line[2:26] + note = line[27] + + # Create the right date + [month, day] = date_str.split("/") + date = datetime.datetime(2023, int(month), int(day)) + + # Initialize the Day + try: + entry = db.session.execute( + db.select(Day).filter_by(date=date.strftime("%F"))).scalar_one() + except: + entry = Day(date=date, note=note) + db.session.add(entry) + db.session.commit() + + print("Parsed {}".format(entry.date)) + + # Create an Hour for each hour + for t in range(len(hours_str)): + activity_code = self.parse_activity(hours_str[t]) + activity = db.session.query(Activity).filter( + Activity.code == activity_code).first() + hour = Hour( + time=t, activity_code=activity.code, day_id=entry.day_id) + db.session.add(hour) + + db.session.commit() diff --git a/app/views.py b/app/views.py index 7ee7ae2..18a015a 100644 --- a/app/views.py +++ b/app/views.py @@ -1,54 +1,67 @@ from app import app, db -from flask import render_template, request, jsonify -from app.models import Author, Book +from flask import render_template, request, jsonify, redirect +from app.models import Day, Hour, Activity +from datetime import datetime, timedelta -@app.route("/", methods=["GET"]) + +@app.route("/import", methods=["GET"]) +def import_db(): + tracker = app.tracker + tracker.import_codes() + tracker.import_csv() + return redirect("/") + + +@app.route("/") def home(): - books = db.session.query(Book, Author).filter(Book.author_id == Author.author_id).all() - return render_template("index.html", books=books) -@app.route("/submit", methods=["POST"]) + return redirect("/tracker") -def submit(): - global_book_object = Book() - title = request.form["title"] - author_name = request.form["author"] +@app.route("/tracker", methods=["GET"]) +def tracker(): + past = datetime.today() - timedelta(days=5) + future = datetime.today() + timedelta(days=1) - author_exists = db.session.query(Author).filter(Author.name == author_name).first() - print(author_exists) - # check if author already exists in db - if author_exists: - author_id = author_exists.author_id - book = Book(author_id=author_id, title=title) - db.session.add(book) - db.session.commit() - global_book_object = book - else: - author = Author(name=author_name) - db.session.add(author) - db.session.commit() + days = db.session.query(Day).filter(Day.date >= past, + Day.date <= future).all() - book = Book(author_id=author.author_id, title=title) - db.session.add(book) - db.session.commit() - global_book_object = book + return render_template("table.html", days=days, now=datetime.now()) - response = f""" - - {title} - {author_name} - - - - - - - - """ - return response \ No newline at end of file + +@app.route("/categories", methods=["GET"]) +def categories(): + activities = db.session.query(Activity).all() + + return render_template("categories.html", activities=activities) + + +@app.route("/colors.css") +def colors(): + return render_template("colors.css"), 200, {'Content-Type': 'text/css; charset=utf-8'} + + +@app.route("/get-activity-form/", methods=["GET"]) +def update_entry(hour_id): + hour = db.session.query(Hour).filter(Hour.hour_id == hour_id).first() + return render_template("forms/update-entry.html", hour=hour) + + +@app.route("/get-color-form/", methods=["GET"]) +def update_color(activity_id): + activity = db.session.query(Activity).filter( + Activity.activity_id == activity_id).first() + + return render_template("forms/select-color.html", activity=activity) + + +@app.route("/change-color", methods=["POST"]) +def change_color(): + activity_id = request.form.get("activity_id") + color = request.form.get("color") + + activity = db.session.query(Activity).filter( + Activity.activity_id == activity_id).first() + + activity.color = color + db.session.commit() + return render_template("/categories.html")