sogo/Tests/Integration/carddav.py

140 lines
4.6 KiB
Python

from config import hostname, port, username, password
import webdavlib
import simplejson
import sogoLogin
DEBUG=True
DEBUG=False
class HTTPPreferencesPOST (webdavlib.HTTPPOST):
cookie = None
def prepare_headers (self):
headers = webdavlib.HTTPPOST.prepare_headers(self)
if self.cookie:
headers["Cookie"] = self.cookie
return headers
class HTTPPreferencesGET (webdavlib.HTTPGET):
cookie = None
def prepare_headers (self):
headers = webdavlib.HTTPGET.prepare_headers(self)
if self.cookie:
headers["Cookie"] = self.cookie
return headers
class Carddav:
login = username
passw = password
def __init__(self, otherLogin = None, otherPassword = None):
if otherLogin and otherPassword:
self.login = otherLogin
self.passw = otherPassword
self.client = webdavlib.WebDAVClient(hostname, port)
authCookie = sogoLogin.getAuthCookie(hostname, port, self.login, self.passw)
self.cookie = authCookie
self.cards = None
self.calendars = None
self.fields = None
self.events = None
#- If this is not set, we CAN'T save preferences
self.preferences = None
def _get(self, url):
get = HTTPPreferencesGET(url)
get.cookie = self.cookie
self.client.execute(get)
if DEBUG: print "(url):", url
if DEBUG: print "(status):", get.response["status"]
if DEBUG: print "(body):", get.response['body']
content = simplejson.loads(get.response['body'])
return content
def _post(self, url, data, errormsg="failure POST"):
if DEBUG: print "URL:", url
post = HTTPPreferencesPOST(url, simplejson.dumps(data))
post.content_type = "application/json"
post.cookie = self.cookie
self.client.execute(post)
# Raise an exception if the pref wasn't properly set
if post.response["status"] != 200:
raise Exception ("%s, (code = %d)" % (errormsg, post.response["status"]))
def load_cards(self):
if not self.cards:
url = "/SOGo/so/%s/Contacts/personal/view" % (self.login)
content = self._get(url)
#print "\nCONTENT:", content
if 'headers' in content:
self.cards = []
fields = content['headers'][0]
for h in content['headers'][1:]:
card = {}
for i, f in enumerate(fields):
card[f] = h[i]
self.cards.append(card)
else:
self.cards = []
return self.cards
def get_cards(self, pattern):
self.load_cards()
return [a for a in self.cards if pattern in a.values()]
def get_card(self, idstr):
url = "/SOGo/so/%s/Contacts/personal/%s/view" % (self.login, idstr)
content = self._get(url)
return content
def save_card(self, card):
url = "/SOGo/so/%s/Contacts/personal/%s/saveAsContact" % (self.login, card['id'])
self._post(url, card, "failure saving card")
def load_calendars(self):
if not self.calendars:
url = "/SOGo/so/%s/Calendar/calendarslist" % (self.login)
content = self._get(url)
self.calendars = content['calendars']
return self.calendars
def get_calendars(self, pattern):
self.load_calendars()
return [a for a in self.calendars if pattern in a.values()]
def get_calendar(self, idstr):
self.load_calendars()
callist = [a for a in self.calendars if a['id'] == idstr]
if len(callist):
return callist[0]
return None
def save_calendar(self, calendar):
url = "/SOGo/so/%s/Contacts/personal/%s/saveAsContact" % (self.login, calendar['id'])
self._post(url, card, "failure saving calendar")
def load_events(self):
if not self.events:
url = "/SOGo/so/%s/Calendar/eventslist" % (self.login)
content = self._get(url)
tmp_events = content['events']
self.fields = content['fields']
self.events = [dict(zip(self.fields, event)) for event in tmp_events]
return self.events
def newguid(self, folderpath):
url = "/SOGo/so/%s/%s/newguid" % (self.login, folderpath)
content = self._get(url)
return content['id']
def save_event(self, event, folder, gid):
#url = "/SOGo/so/%s/%s/%s/save" % (self.login, event['c_folder'], event['c_name'])
url = "/SOGo/so/%s/%s/%s/saveAsAppointment" % (self.login, folder, gid)
self._post(url, event, "failure saving event")