initial commit
This commit is contained in:
commit
9381e246ce
|
@ -0,0 +1,7 @@
|
||||||
|
# decal - a simple calendar with caldav events
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
```
|
||||||
|
pip install caldav
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,191 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
import configparser
|
||||||
|
import datetime
|
||||||
|
import calendar
|
||||||
|
import caldav
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
Version = "%(prog)s 0.1"
|
||||||
|
configpath = os.getenv("HOME")+"/.config/decal.conf"
|
||||||
|
config.read(configpath)
|
||||||
|
#define arguments
|
||||||
|
today = datetime.date.today()
|
||||||
|
parser = argparse.ArgumentParser(description="Cal with events.")
|
||||||
|
parser.add_argument("year",
|
||||||
|
action="store",
|
||||||
|
default=today.year,
|
||||||
|
nargs="?",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("month",
|
||||||
|
action="store",
|
||||||
|
default=today.month,
|
||||||
|
nargs="?",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("day",
|
||||||
|
action="store",
|
||||||
|
default=today.day,
|
||||||
|
nargs="?",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("-v", "--version",
|
||||||
|
action="version",
|
||||||
|
version=Version,
|
||||||
|
help="Display the version of the program")
|
||||||
|
parser.add_argument("--json",
|
||||||
|
action="store_true",
|
||||||
|
help="Dump events output to json")
|
||||||
|
parser.add_argument("--create",
|
||||||
|
action="store_true",
|
||||||
|
help="Create a new event")
|
||||||
|
parser.add_argument("--calendar",
|
||||||
|
action="append",
|
||||||
|
help="Specify a calendar (or multiple calendars) to sync from")
|
||||||
|
parser.add_argument("-1",
|
||||||
|
action="store_true",
|
||||||
|
help="show only a single month (default)")
|
||||||
|
parser.add_argument("-3",
|
||||||
|
action="store_true",
|
||||||
|
help="show three months spanning the date")
|
||||||
|
parser.add_argument("-y",
|
||||||
|
action="store_true",
|
||||||
|
help="show the whole year")
|
||||||
|
parser.add_argument("-n",
|
||||||
|
action="store_const",
|
||||||
|
const=int,
|
||||||
|
help="show n months")
|
||||||
|
|
||||||
|
args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#check some stuff, do some warnings, initiate the config, etc.
|
||||||
|
if not os.path.exists(configpath):
|
||||||
|
config['DEFAULT'] = {'uri': 'your caldap server here',
|
||||||
|
'user': 'your username here',
|
||||||
|
'password': 'your pass here'}
|
||||||
|
print("Creating an empty config in ~/.config/decal.conf")
|
||||||
|
with open(configpath,'w') as configfile:
|
||||||
|
config.write(configfile)
|
||||||
|
configfile.close()
|
||||||
|
print("To properly utilize decal, please fill out the fields in the config")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
for arg in ("user","password","uri"):
|
||||||
|
if not arg in config['DEFAULT']:
|
||||||
|
print("The config is incomplete, please check the \""+arg+"\" field")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if config['DEFAULT']['uri'] == "your caldap server here":
|
||||||
|
print("To properly utilize decal, please fill out the fields in the config")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
#actual works begins here
|
||||||
|
|
||||||
|
#generate the actual calendar, line by line, output an array of lines.
|
||||||
|
#it works trust me, idk what is happening in this one but it works.
|
||||||
|
def gencal(year,month,start_on_sunday=True,cell_modifier=lambda d: d,append_year=True):
|
||||||
|
firstweekday = 0
|
||||||
|
if start_on_sunday:
|
||||||
|
firstweekday = 6
|
||||||
|
cal = calendar.Calendar(firstweekday=firstweekday)
|
||||||
|
lines = [""]*6
|
||||||
|
monthstart = False
|
||||||
|
counter = 0
|
||||||
|
for date in cal.itermonthdates(year,month):
|
||||||
|
lines[counter//7]
|
||||||
|
day = str(date)[-2:]
|
||||||
|
if day == "01":
|
||||||
|
monthstart = not monthstart
|
||||||
|
if monthstart:
|
||||||
|
lines[counter//7] += cell_modifier(day)
|
||||||
|
else:
|
||||||
|
lines[counter//7] += " "
|
||||||
|
lines[counter//7] +=" "
|
||||||
|
counter+=1
|
||||||
|
month = datetime.date(year,month,1).strftime("%B %Y")
|
||||||
|
padding = (len(lines[0])-len(month))//2
|
||||||
|
rpadding = len(lines[0])%(padding+len(month)+padding)
|
||||||
|
if start_on_sunday:
|
||||||
|
lines.insert(0,"Su Mo Tu We Th Fr Sa ")
|
||||||
|
else:
|
||||||
|
lines.insert(0,"Mo Tu We Th Fr Sa Su ")
|
||||||
|
lines.insert(0,(" "*padding)+month+(" "*(padding+rpadding)))
|
||||||
|
lines[-1] += " "*(21-len(lines[-1]))
|
||||||
|
return lines
|
||||||
|
|
||||||
|
color_names = {
|
||||||
|
"red":"0;31",
|
||||||
|
"green":"0;32",
|
||||||
|
"brown":"0;33",
|
||||||
|
"orange":"0;33",
|
||||||
|
"blue":"0;34",
|
||||||
|
"purple":"0;35",
|
||||||
|
"cyan":"0;36",
|
||||||
|
"yellow":"1;33",
|
||||||
|
"white":"1;37",
|
||||||
|
"blink":"5",
|
||||||
|
"bold":"1",
|
||||||
|
"italic":"3",
|
||||||
|
"underline":"4",
|
||||||
|
"inverse":"7",
|
||||||
|
"strikethrough":"9",
|
||||||
|
"light red":"1;31",
|
||||||
|
"light green":"1;32",
|
||||||
|
"light blue":"1;34",
|
||||||
|
"light purple":"1;36",
|
||||||
|
"light cyan":"0;37"
|
||||||
|
}
|
||||||
|
def colorize(text,color):
|
||||||
|
if color in color_names:
|
||||||
|
return "\033["+color_names[color]+"m"+text+"\033[0m"
|
||||||
|
elif re.match("(\d{1,3}),(\d{1,3}),(\d{1,3})",color):
|
||||||
|
color = "\\"+re.sub("(\d{1,3}),(\d{1,3}),(\d{1,3})","38;2;\\1;\\2;\\3m",color)
|
||||||
|
|
||||||
|
return color+text+"\033[0m"
|
||||||
|
|
||||||
|
def span(year,month,offset):
|
||||||
|
return year+((month+offset-1)//12),((month+offset-1)%12)+1
|
||||||
|
|
||||||
|
def getbounds(y,m,offset):
|
||||||
|
start = datetime.date(y,m,1)
|
||||||
|
postnextmonth = span(y,m,offset)
|
||||||
|
nextmonth = span(postnextmonth[0],postnextmonth[1],-1)
|
||||||
|
end = datetime.date(nextmonth[0],
|
||||||
|
nextmonth[1],
|
||||||
|
(datetime.date(postnextmonth[0],postnextmonth[1],1)-datetime.timedelta(days=1)).day)
|
||||||
|
return start,end
|
||||||
|
|
||||||
|
start = None
|
||||||
|
end = None
|
||||||
|
if args["1"]:
|
||||||
|
start,end = getbounds(args["year"],args["month"],1)
|
||||||
|
elif args["3"]:
|
||||||
|
y,m = span(args["year"],args["month"],-1)
|
||||||
|
start,end = getbounds(y,m,3)
|
||||||
|
elif args["n"]:
|
||||||
|
start,end = getbounds(args["year"],args["month"],args["n"])
|
||||||
|
else:
|
||||||
|
start,end = getbounds(args["year"],args["month"],1)
|
||||||
|
|
||||||
|
client = caldav.DAVClient(url = config['DEFAULT']['uri'],
|
||||||
|
username = config['DEFAULT']['user'],
|
||||||
|
password = config['DEFAULT']['password'])
|
||||||
|
principal = client.principal()
|
||||||
|
calendars = principal.calendars()
|
||||||
|
if "calendar" in config['DEFAULT']:
|
||||||
|
calendars2 = []
|
||||||
|
cals = config['DEFAULT']["calendar"].split(",")
|
||||||
|
for cal in calendars:
|
||||||
|
if cal.name in cal:
|
||||||
|
calendars2.append(cal)
|
||||||
|
calendars = calendars2
|
||||||
|
|
||||||
|
|
||||||
|
events = []
|
||||||
|
for calendar in calendars:
|
||||||
|
events_fetched = calendar.date_search(start,end)
|
||||||
|
for event in events_fetched:
|
||||||
|
if not event in events:
|
||||||
|
events.append(event)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue