Skip to content

Instantly share code, notes, and snippets.

@kaapstorm
Last active May 15, 2019 10:25
Show Gist options
  • Save kaapstorm/f5c48b1e0bb74f0f8fac30089a65031e to your computer and use it in GitHub Desktop.
Save kaapstorm/f5c48b1e0bb74f0f8fac30089a65031e to your computer and use it in GitHub Desktop.
Set your current FogBugz case from the command line
#!/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