Last active
May 15, 2019 10:25
-
-
Save kaapstorm/f5c48b1e0bb74f0f8fac30089a65031e to your computer and use it in GitHub Desktop.
Set your current FogBugz case from the command line
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
#!/usr/bin/env python3 | |
from datetime import datetime | |
import os | |
import re | |
import sys | |
import requests | |
import yaml | |
RC_FILENAME = '~/.fbworkonrc' | |
# Example ~.fbworkonrc file: | |
# | |
# --- | |
# fogbugz_url: 'https://fogbugz.example.com/default.asp' | |
# fogbugz_username: 'auser@example.com' | |
# fogbugz_password: 'bigsecret' | |
# fogbugz_cases: | |
# bugs: 170207 | |
# email: 271733 | |
# timecards: 268143 | |
# | |
FB_NOTHING_CASE = 0 | |
def load_config(): | |
rc_path = os.path.expanduser(RC_FILENAME) | |
with open(rc_path) as rc_file: | |
config = yaml.load(rc_file.read(), Loader=yaml.SafeLoader) | |
config['fogbugz_cases']['nothing'] = FB_NOTHING_CASE | |
return config | |
def log_in(fb_url, fb_username, fb_password): | |
session = requests.Session() | |
data = { | |
'pre': 'preLogon', | |
'dest': '', | |
'sPerson': fb_username, | |
'sPassword': fb_password, | |
} | |
response = session.post(fb_url, data) | |
response.raise_for_status() | |
return session | |
def get_current_case(fb_url, session): | |
response = session.get(fb_url) | |
response.raise_for_status() | |
match = re.search(r'Working on (\d+)', response.text) | |
if match: | |
(case_str,) = match.groups() | |
return int(case_str) | |
return None | |
def work_on_case(fb_url, session, case_num=FB_NOTHING_CASE): | |
timestamp = int(datetime.now().timestamp() * 1000) | |
params = { | |
'fAlaCarte': 1, | |
'pre': 'preChangeWorkOnAlaCarte', | |
'ixBug': case_num, | |
'_': timestamp, | |
} | |
response = session.get(fb_url, params=params) | |
response.raise_for_status() | |
return response.status_code == 200 | |
if __name__ == '__main__': | |
config = load_config() | |
if len(sys.argv) < 2: | |
print('Cases: ' + '; '.join(config['fogbugz_cases'])) | |
session = log_in( | |
config['fogbugz_url'], | |
config['fogbugz_username'], | |
config['fogbugz_password'], | |
) | |
case = get_current_case( | |
config['fogbugz_url'], | |
session, | |
) | |
cases_by_id = {v: k for k, v in config['fogbugz_cases'].items()} | |
if case is None: | |
case_str = 'nothing' | |
elif case in cases_by_id: | |
case_str = '"%s"' % cases_by_id[case] | |
else: | |
case_str = 'case %s' % case | |
print('Currently working on %s' % case_str) | |
sys.exit(0) | |
case_name = sys.argv[1] | |
if case_name not in config['fogbugz_cases']: | |
print('Unknown case "{}"'.format(case_name)) | |
sys.exit(1) | |
session = log_in( | |
config['fogbugz_url'], | |
config['fogbugz_username'], | |
config['fogbugz_password'], | |
) | |
success = work_on_case( | |
config['fogbugz_url'], | |
session, | |
config['fogbugz_cases'][case_name] | |
) | |
if success: | |
print('OK') | |
sys.exit(0) | |
else: | |
print("That didn't work") | |
sys.exit(2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment