Creating objects, switching to lxml, made main callable
[treecutter.git] / xinclude / events.py
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 from getpass import getpass
5 from dateutil.tz import *
6 from datetime import datetime
7 from dateutil.parser import parse
8 import vobject
9 import httplib
10 from urlparse import urlparse
11 from lxml import etree
12 from lxml.builder import ElementMaker
13 import sys
14 import re
15 from treecutter import constants as const
16
17
18 class Events(object):
19     def __init__(self, uri):
20         self.uri = uri
21         self.events = []
22         self.data = None
23         if uri.scheme == 'file':
24             with open(self.uri.path, 'r') as f:
25                 self.data = f.read()
26             f.closed
27         if uri.scheme == 'http':
28             pw = getpass()
29             print "http not yet implemented"
30         if uri.scheme == 'https':
31             pw = getpass()
32             headers = {"User-Agent": "Mozilla/5.0",
33                        "Content-Type": "text/xml",
34                        "Accept": "text/xml"}
35
36             headers['authorization'] = "Basic %s" % (("%s:%s" % (self.uri.username, pw)).encode('base64')[:-1])
37             handle = httplib.HTTPSConnection(self.uri.hostname,self.uri.port)
38             res = handle.request('GET', self.uri.path, "", headers)
39             r = handle.getresponse()
40             if r.status != 200:
41                 print "Failed to connect! Wrong Password ?"
42                 sys.exit(5)
43             self.data = r.read()
44             handle.close()
45         headers = ['dtstart','summary','location','description']
46         for cal in vobject.readComponents(self.data):
47             for ev in cal.vevent_list:
48                 details = {}
49                 for k in headers:
50                     details[k] = ""
51                 for p in ev.getChildren():
52                     details[p.name.lower()] = p.value
53                 self.events.append(Event(details))
54
55     def filter(self,query):
56         (key, name) = query.split(':')
57         fev = []
58         if key == 'year':
59             for ev in self.events:
60                 if ev.start.year == int(name):
61                     fev.append(ev)
62         self.events = fev
63
64     def sort(self,order):
65         sortedevents = sorted(events, key=lambda k: k['dtstart'], reverse=True)
66
67     def db_xml(self):
68         db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP)
69         evlist = db.variablelist(db.title(u'Stammtisch träffar'),
70                                  role=u'calendar')
71         for ev in self.events:
72             evlist.append(ev.db_xml())
73         return evlist
74
75
76 class Event(object):
77     def __init__(self,ev):
78         self.start = ev['dtstart']
79         self.end = ev['dtend']
80         self.summary = ev['summary']
81         self.location = ev['location']
82         self.description = ev['description']
83
84     def db_xml(self):
85         db = ElementMaker(namespace=const.DB_NS, nsmap=const.NSMAP)
86         # Build paragraphs from the description
87         paras = db.listitem(role="description")
88         for p in re.split('\n\n',unicode(self.description)):
89             paras.append(db.para(p,role="desc"))
90
91         lst = db.varlistentry(
92             db.term(db.date(self.start.strftime('%Y %b %d'),role='calendar')),
93             db.listitem(db.para(self.summary),db.variablelist(
94                     db.varlistentry(
95                         db.term("Tid"),
96                         db.listitem(db.para(self.start.strftime('%H:%M')))
97                         ),
98                     db.varlistentry(
99                         db.term("Plats"),
100                         db.listitem(db.para(self.location))
101                         ),
102                     db.varlistentry(
103                         db.term("Beskrivning"),
104                         paras
105                 )
106                     )
107                         )
108             )
109         return lst
110
111 # ln = db.link("Text",**{XLINK+"href": "https://"})
112
113 if __name__ == "__main__":
114     for arg in sys.argv[1:]:
115         al = arg.split("=")
116         if al[0] == "lang":
117             lang = al[1]
118         if al[0] == "xptr":
119             argument = al[1]
120
121     (uristr,query) = argument.split('|')
122     uri = urlparse(uristr)
123     events = Events(uri)
124     events.filter(query)
125     exml = events.db_xml()
126     #clean_db(exml)
127
128     #print(etree.tostring(cxml, pretty_print=True))
129     #sys.stdout.write(out.encode('utf-8'))
130     sys.stdout.write(etree.tostring(exml,encoding='UTF-8',pretty_print=True))