1
by Joshua Hoover
Initial import |
1 |
#!/usr/bin/env python
|
2 |
from __future__ import with_statement |
|
3 |
||
4 |
import sys |
|
5 |
||
6 |
from BeautifulSoup import BeautifulSoup |
|
7 |
from ClientCookie import Cookie |
|
8 |
from ClientCookie import CookieJar |
|
9 |
from launchpadlib.credentials import Credentials |
|
10 |
from launchpadlib.launchpad import EDGE_SERVICE_ROOT |
|
11 |
from launchpadlib.launchpad import Launchpad |
|
12 |
from launchpadlib.launchpad import STAGING_SERVICE_ROOT |
|
13 |
from mechanize import Browser |
|
14 |
from mechanize import FormNotFoundError |
|
15 |
import os |
|
16 |
from urlparse import urljoin |
|
17 |
try: |
|
18 |
from xml.etree import ElementTree |
|
19 |
except ImportError: |
|
20 |
from elementtree import ElementTree |
|
21 |
import gdata.spreadsheet.service |
|
22 |
import gdata.service |
|
23 |
import atom.service |
|
24 |
import gdata.spreadsheet |
|
25 |
import atom |
|
26 |
import gdata.spreadsheet.service |
|
27 |
||
28 |
SERVICE_ROOT = EDGE_SERVICE_ROOT |
|
29 |
#SERVICE_ROOT = STAGING_SERVICE_ROOT
|
|
30 |
||
31 |
home = os.path.expanduser("~") |
|
32 |
cachedir = os.path.join(home, ".launchpadlib/cache/") |
|
33 |
credentialfile = os.path.join(home, ".launchpadlib/credentials") |
|
34 |
||
35 |
if os.path.exists(credentialfile): |
|
36 |
credentials = Credentials() |
|
37 |
with file(credentialfile) as f: |
|
38 |
credentials.load(f) |
|
39 |
launchpad = Launchpad(credentials, SERVICE_ROOT) |
|
40 |
else: |
|
41 |
launchpad = Launchpad.get_token_and_login('joshuahoover-taskstatus', SERVICE_ROOT, cachedir) |
|
42 |
launchpad.credentials.save(file(credentialfile, "w")) |
|
43 |
||
44 |
me = launchpad.me |
|
45 |
print "Hello %s, lets get started." % me.name |
|
46 |
||
47 |
# This means that we search across the whole ubuntuone project
|
|
48 |
# suite, including all sub projects.
|
|
49 |
ubunet = launchpad.projects['ubuntuone'] |
|
50 |
counter = 1 |
|
51 |
||
52 |
TEST_SPREADSHEET_KEY = 'riXzoej2Qo9VVokUoXpKxaA' |
|
53 |
WHOS_WORKING_ON_WHAT_KEY = 'p-Ix7K2HxhBAVFobBY53YQg' |
|
54 |
SPREADSHEET_KEY = WHOS_WORKING_ON_WHAT_KEY |
|
55 |
||
56 |
def authenticate_to_google_spreadsheet(): |
|
57 |
"""Get an authenticated google data client object."""
|
|
58 |
gd_client = gdata.spreadsheet.service.SpreadsheetsService() |
|
59 |
# A multi session token
|
|
60 |
gd_client.SetAuthSubToken('CN2z5oKlCRCfqfig-v____8B') |
|
61 |
return gd_client |
|
62 |
||
63 |
def get_auth_sub_url(): |
|
64 |
"""Generate a URL that will return a temp auth token to localhost."""
|
|
65 |
next = 'http://localhost' |
|
66 |
scope = 'http://spreadsheets.google.com/feeds/' |
|
67 |
domain = 'canonical.com' |
|
68 |
secure = False |
|
69 |
session = True |
|
70 |
gd_client = gdata.spreadsheet.service.SpreadsheetsService() |
|
71 |
return gd_client.GenerateAuthSubURL(next, scope, secure, session, domain); |
|
72 |
||
73 |
def delete_row(feed, index): |
|
74 |
gd_client.DeleteRow(feed.entry[index]) |
|
75 |
print 'Deleted row: ' + str(index) |
|
76 |
||
77 |
def insert_task_status_rows(tasks, spreadsheet_key, worksheet_id, spreadsheet_list): |
|
78 |
for task in tasks: |
|
79 |
task_name, status, username, importance, milestone = '', '', '', '', '' |
|
80 |
row_data = {} |
|
2
by Joshua Hoover
Cleaned up kanban.py to run unattended |
81 |
task_name = unicode(task.title) |
82 |
status = unicode(task.status) |
|
83 |
importance = unicode(task.importance) |
|
1
by Joshua Hoover
Initial import |
84 |
# Remove spaces for Google to accept as column label
|
85 |
status = status.replace(' ', '').lower() |
|
86 |
||
87 |
if task.assignee: |
|
88 |
username = str(task.assignee.name) |
|
89 |
else: |
|
90 |
username = 'Unassigned' |
|
91 |
||
92 |
if task.milestone: |
|
93 |
milestone = str(task.milestone.title) |
|
94 |
||
95 |
task_name = importance + ' - ' + task_name |
|
96 |
||
97 |
row_data['name'] = username |
|
98 |
row_data['storyid'] = '' |
|
99 |
row_data[status] = task_name |
|
100 |
row_data['milestone'] = milestone |
|
101 |
||
102 |
entry = gd_client.InsertRow(row_data, spreadsheet_key, worksheet_id) |
|
103 |
if isinstance(entry, spreadsheet_list): |
|
104 |
print '\n***************************************' |
|
105 |
print row_data |
|
106 |
print '***************************************' |
|
107 |
||
108 |
def get_this_spreadsheet_worksheet_id(feed, sheet_name): |
|
109 |
for i, entry in enumerate(feed.entry): |
|
110 |
if entry.title.text == sheet_name: |
|
111 |
return entry.id.text.rsplit('/', 1)[1] |
|
112 |
||
113 |
gd_client = authenticate_to_google_spreadsheet() |
|
114 |
||
115 |
# get the list of worksheets
|
|
116 |
feed = gd_client.GetWorksheetsFeed(SPREADSHEET_KEY) |
|
117 |
||
118 |
# get worksheet id's for task status tab
|
|
119 |
task_status_tab = get_this_spreadsheet_worksheet_id(feed, 'Task Status') |
|
120 |
if task_status_tab is None: |
|
121 |
print "Error finding the test data tab in the spreadsheet." |
|
122 |
task_worksheet = gd_client.GetListFeed(SPREADSHEET_KEY, task_status_tab) |
|
123 |
||
2
by Joshua Hoover
Cleaned up kanban.py to run unattended |
124 |
feed = gd_client.GetListFeed(SPREADSHEET_KEY, task_status_tab) |
125 |
for i, entry in enumerate(feed.entry): |
|
126 |
if i > 0: |
|
127 |
delete_row(feed, i) |
|
1
by Joshua Hoover
Initial import |
128 |
|
2
by Joshua Hoover
Cleaned up kanban.py to run unattended |
129 |
tag = 'ubuntuone-karmic' |
130 |
tasks = ubunet.searchTasks(tags=tag) |
|
1
by Joshua Hoover
Initial import |
131 |
insert_task_status_rows(tasks, SPREADSHEET_KEY, task_status_tab, gdata.spreadsheet.SpreadsheetsList) |