forked from picklepete/pyicloud
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
604fe68
commit 9982477
Showing
3 changed files
with
156 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
from __future__ import absolute_import | ||
from datetime import datetime, timedelta | ||
from calendar import monthrange | ||
import time | ||
import uuid | ||
import pytz | ||
import json | ||
|
||
class RemindersService(object): | ||
def __init__(self, service_root, session, params): | ||
self.session = session | ||
self.params = params | ||
self._service_root = service_root | ||
self.lists={} | ||
self.collections = {} | ||
|
||
self.refresh() | ||
|
||
def get_all_possible_timezones_of_local_machine(self): | ||
""" | ||
Return all possible timezones in Olson TZ notation | ||
This has been taken from | ||
http://stackoverflow.com/questions/7669938 | ||
""" | ||
local_names = [] | ||
if time.daylight: | ||
local_offset = time.altzone | ||
localtz = time.tzname[1] | ||
else: | ||
local_offset = time.timezone | ||
localtz = time.tzname[0] | ||
|
||
local_offset = timedelta(seconds=-local_offset) | ||
|
||
for name in pytz.all_timezones: | ||
timezone = pytz.timezone(name) | ||
if not hasattr(timezone, '_tzinfos'): | ||
continue | ||
for (utcoffset, daylight, tzname), _ in timezone._tzinfos.items(): | ||
if utcoffset == local_offset and tzname == localtz: | ||
local_names.append(name) | ||
return local_names | ||
|
||
|
||
|
||
def get_system_tz(self): | ||
""" | ||
Retrieves the system's timezone from a list of possible options. | ||
Just take the first one | ||
""" | ||
return self.get_all_possible_timezones_of_local_machine()[0] | ||
|
||
|
||
|
||
def refresh(self): | ||
host = self._service_root.split('//')[1].split(':')[0] | ||
self.session.headers.update({'host': host}) | ||
|
||
params_reminders=dict(self.params) | ||
params_reminders.update({ | ||
'clientVersion': '4.0', | ||
'lang': 'en-us', | ||
'usertz':self.get_system_tz() | ||
}) | ||
|
||
# Open reminders | ||
req = self.session.get( | ||
self._service_root + '/rd/startup', | ||
params=params_reminders | ||
) | ||
|
||
startup = req.json() | ||
|
||
self.lists={} | ||
self.collections = {} | ||
for collection in startup['Collections']: | ||
temp = [] | ||
self.collections[collection['title']] = { | ||
'guid': collection['guid'], | ||
'ctag': collection['ctag'] | ||
} | ||
for reminder in startup['Reminders']: | ||
|
||
if reminder['pGuid'] != collection['guid']: | ||
continue | ||
if reminder.has_key("dueDate"): | ||
if reminder['dueDate']: | ||
due = datetime( | ||
reminder['dueDate'][1], | ||
reminder['dueDate'][2],reminder['dueDate'][3], | ||
reminder['dueDate'][4],reminder['dueDate'][5] | ||
) | ||
else: | ||
due = None | ||
else: | ||
due = None | ||
desc=reminder['description'] if reminder['description'] else "" | ||
temp.append({ | ||
"title": reminder['title'], | ||
"desc": desc, | ||
"due": due | ||
}) | ||
self.lists[collection['title']] = temp | ||
|
||
def post(self, title, description = "", collection=None): | ||
pguid = 'tasks' | ||
if collection: | ||
if self.collections.has_key(collection): | ||
pguid = self.collections[collection]['guid'] | ||
|
||
host = self._service_root.split('//')[1].split(':')[0] | ||
self.session.headers.update({'host': host}) | ||
|
||
params_reminders=dict(self.params) | ||
params_reminders.update({ | ||
'clientVersion': '4.0', | ||
'lang': 'en-us', | ||
'usertz':self.get_system_tz() | ||
}) | ||
|
||
req = self.session.post( | ||
self._service_root + '/rd/reminders/tasks', | ||
data=json.dumps({ | ||
"Reminders":{ | ||
'title': title, | ||
"description":description, | ||
"pGuid":pguid, | ||
"etag":None, | ||
"order":None, | ||
"priority":0, | ||
"recurrence":None, | ||
"alarms":[], | ||
"startDate":None, | ||
"startDateTz":None, | ||
"startDateIsAllDay":False, | ||
"completedDate":None, | ||
"dueDate":None, | ||
"dueDateIsAllDay":False, | ||
"lastModifiedDate":None, | ||
"createdDate":None, | ||
"isFamily":None, | ||
"createdDateExtended":int(time.time()*1000), | ||
"guid":str(uuid.uuid4()) | ||
}, | ||
"ClientState": {"Collections": self.collections.values() } | ||
}), | ||
params=params_reminders) |