def updateFogbugzCases(site, username, password, ordered_changes, changemap, casemap, releasenotesmap): logging.info('Logging on to site ' + site + ' as user ' + username) fb = FogBugz('https://' + site + '.fogbugz.com/') fb.logon(username, password) logging.info('Updating fogbugz cases') for change in ordered_changes: logging.info(' Commit: ' + change) changetext = changemap[change] cases = casemap[change] # releasenotes = releasenotesmap[change] logging.info(' Cases: ' + str(cases)) logging.info(' Text: ' + changetext) # logging.info(' Release notes: ' + releasenotes) if cases: for case in cases: if hasChange(fb, case, change) == False: logging.info(' Updating case ' + str(case)) fb.edit(ixBug=case, sEvent=changetext) # fb.edit(ixBug=case, sReleaseNotes=releasenotes) else: logging.info(' Skipping case ' + str(case))
def cgi_callback(): ## Begin sample data loading ## ## Customize with your own logic ## fb = FogBugz(fbsettings.URL, fbsettings.TOKEN) resp = fb.search( q='project:inbox area:* status:active due:today orderby:due', cols="dtDue,sTitle") cases = [] for case in resp.cases: date = datetime.strptime(case.dtdue.string, '%Y-%m-%dT%H:%M:%SZ').strftime('%m/%d/%Y') time = case.dtdue.string[11:16] departure = case.stitle.string.encode('UTF-8').replace('\"', '') track = random.randrange(0, 100) if (datetime.strptime(case.dtdue.string, '%Y-%m-%dT%H:%M:%SZ') - datetime.now()).days < 0: status = 3 else: status = 2 cases.append({ 'sDate': date, 'sTime': time, 'sDeparture': departure, 'nStatus': status, 'nTrack': track, 'bLight': False })
def getData(fogBugzUrl, userName, password, today): oneMonthAgo = today - timedelta(days=28) fb = FogBugz(fogBugzUrl) fb.logon(userName, password) resp = fb.listIntervals(dtStart=asIso8601zDateString(oneMonthAgo), dtEnd=asIso8601zDateString(today)) return resp
def main(): if len(sys.argv) != 3: sys.exit("Incorrect number of arguments") c = readcFile(sys.argv[1]) c['test.build'] = sys.argv[2] rawCrashes = getCrashesFromDirectory(c['test.separator'], c['test.dir']) crashes = parseCrashes(rawCrashes, c) if (len(crashes) != 0): fb = FogBugz(c['fogbugz.url']) fogbugzQuery = 'project:\"' + c['fogbugz.project'] + '"' fb.logon(c['fogbugz.user'], c['fogbugz.pass']) fogBugzResp = fb.search(q=fogbugzQuery, cols='ixBug,sTitle,fOpen,events') crashes = flagExcludeList(c, crashes) crashes = flagFBDuplicates(fogBugzResp, crashes, c) logCrashesToFogbugz(fb, c, crashes) emailReport(c, crashes) print 'Done'
def fogbugz(fogbugz_uri): """Test fogbugz instance.""" httpretty.enable() httpretty.register_uri(httpretty.GET, fogbugz_uri + 'api.xml', body="""<response> <version>8</version> <minversion>1</minversion> <url>api.asp?</url> </response>""") yield FogBugz(fogbugz_uri) httpretty.disable()
def main(): # Program start and timer print("Started the program... ") print(str(datetime.now().strftime(FORMAT_OF_DATE))) start = time.time() # Fogbugz init fb = FogBugz(getpath(), getapikeyassistant(), api_version=8) bugcases = getcaseslist(fb, query=yes()) findowner(fb, bugcases) # Finish time end = time.time() print('Finished program. Time spent: ' + str(end - start)) print(str(datetime.now().strftime(FORMAT_OF_DATE)))
def update_tickets(args): cols = [ "ixBug", "sStatus", "sTitle", 'sTags', "ixPersonOpenedBy", "dtOpened", "sProject", 'plugin_customfields', "latestEvent" ] fb = FogBugz('https://daily.manuscript.com/') fb.logon(args.email, args.password) query = {"status": "Active", "AssignedTo": "Unassigned"} querystring = " ".join(["{}:{}".format(k, v) for k, v in query.items()]) resp = fb.search(q=querystring, cols=",".join(cols)) for casexml in resp.cases.childGenerator(): #logger.info("case:##{}".format(casexml)) logger.debug(casexml['ixBug']) id = casexml['ixBug'] question = casexml.sTitle.getText() latest_event = casexml.events event_id = latest_event.ixBugEvent.getText() message_body = latest_event.s.getText() answers_string = "" pdb.set_trace() if message_body == "": answers = googler(question) for ele in answers: answers_string += "\n".join( [ele['title'], ele['url'], ele['abstract']]) answers_string += '\n\n' fb.edit(ixBug=id, sEvent=answers_string, ixPersonAssignedTo=casexml.ixPersonOpenedBy.getText()) else: for line in [i for i in message_body.split('\n') if i != '']: answers_string = "" if line.startswith("##"): answers_string += '**' + line[3:].encode('utf-8') answers_string += '\n' answers = googler(line[3:]) for ele in answers: answers_string += "\n".join( [ele['title'], ele['url'], ele['abstract']]) answers_string += '\n\n' fb.edit( ixBug=id, ixPersonAssignedTo=casexml.ixPersonOpenedBy.getText(), sEvent=answers_string) #fb.edit(ixBug=id,ixBugEvent=event_id,sEvent=answers_string,ixPersonAssignedT=casexml.ixPersonOpenedBy.getText()) else: break
def findinguserbyevents(case): fb = FogBugz(getpath(), getapikeyassistant(), api_version=8) bugevents = particularcaseevents(fb, case) for event in bugevents['events']: s = event['sChanges'] # Looking for "Status changed from 'xxxxx' to 'Active' statuslines = [ sentence for sentence in s.split('\r\n') if 'Status changed' in sentence ] if statuslines: fromtostring = statuslines[0].split('\'') if fromtostring[3] == 'Active': if str(event['sPerson']) is not None: # print(str(bugevents['ixBug']) + " " + str(event['sPerson']) + " " + " to " + fromtostring[3]) return str(event['sPerson']) # If there is no status change, let's say a case was Active already, because reported internally # Looking for "Category changed from 'xxxxx' to 'Unity' statuslines = [ sentence for sentence in s.split('\r\n') if 'Project changed' in sentence ] if statuslines: fromtostring = statuslines[0].split('\'') if fromtostring[3] == 'Unity': if str(event['sPerson']) is not None: # print(str(bugevents['ixBug']) + " " + str(event['sPerson']) + " " + " to " + fromtostring[3]) return str(event['sPerson']) # If we cannot find a person by Status or Category, look for the case opener # Looking for "Opened by" for event in bugevents['events']: s = event['evtDescription'] statuslines = [ sentence for sentence in s.split('\r\n') if 'Opened by' in sentence ] if statuslines: if str(event['sPerson']) is not None: # print(str(event['sPerson'])) return str(event['sPerson'])
from fogbugz import FogBugz import csv import sys # Fill in the following values as appropriate to your installation S_FOGBUGZ_URL = 'https://fogbugz.unity3d.com' TOKEN = "" S_EMAIL = '' S_PASSWORD = '' fb = FogBugz(S_FOGBUGZ_URL, TOKEN) #fb.logon(S_EMAIL, S_PASSWORD) #Get all cases in milestone 2018.2 resp = fb.search(q='version:"'+ sys.argv[1] +'*"',cols="ixBug,ixBugParent,fOpen,sTitle,sProject,ixArea,sArea,sStatus,ixPriority,sFixFor,sVersion,sComputer,dtOpened,dtClosed,plugin_customfields_at_fogcreek_com_userxpainr32d") #print resp print "Started on version" + sys.argv[1] filename = "fogbugzData.csv" csv = open(filename, "w") columnTitleRow = "Bug ID,Bug Parent ID,is Open,Title,Project,Area ID,Area,Status,Priority,Fix For,Version,Computer,User Pain, Date Opened, Date Closed" csv.write(columnTitleRow) csv.write("\n") for case in resp.cases.childGenerator(): #assign the cols to variables if case.ixBug.string != None: bugID = case.ixBug.string
from fogbugz import FogBugz from datetime import datetime, timedelta import csv S_FOGBUGZ_URL = 'https://fogbugz.com/' S_EMAIL = '' S_PASSWORD = '' fb = FogBugz(S_FOGBUGZ_URL) fb.logon(S_EMAIL, S_PASSWORD) resp = fb.search( q='sFixFor="2018.2"', cols= 'ixBug, ixBugParent, fOpen, sTitle, ixProject, ixArea, sArea, ixStatus, ixPriority,sFixFor, dtFixFor, sVersion, sComputer, c, ixCategory, dtOpened, dtClosed' ) filename = "fogbugzData.csv" csv = open(filename, "w") columnTitleRow = "ixBug,ixBugParent,fOpen,sTitle,dtDue" csv.write(columnTitleRow) for case in resp.cases: bugID = case.ixBug.string title = case.sTitle.string open = case.fOpen.string version = case.ixProject.string priority = case.ixPriority.string status = case.ixStatus.string
article_ids = get_article_ids(fb, wiki_id) for article_id in article_ids: article = fb.viewArticle(ixWikiPage=article_id) headline = article.wikipage.sHeadline.string body = article.wikipage.sBody.string print(headline) filename = headline.replace('/', '') + '.html' path = os.path.join(wiki_name, filename) # Block for just writing out HTML if False: with open(path, 'w') as f: try: f.write(body) except: print("Unable to write {} - {}".format(wiki_name, headline)) # Convert to markdown and write try: output = pypandoc.convert_text(body, to='md', format='html', outputfile=path) except: print("Unable to write {} - {}".format(wiki_name, headline)) if __name__ == '__main__': fb = FogBugz(fbSettings.URL, fbSettings.TOKEN) download_wikis(fb)
def main(): fb = FogBugz(S_FOGBUGZ_URL) fb.logon(S_EMAIL, S_PASSWORD) # how ugly is this, do we export one bug or all? if EXPORT_BUG != 0: resp = fb.search(q=str(EXPORT_BUG), cols='ixBug', max=MAX_BUGS) else: resp = fb.search(q='type:"Cases"', cols='ixBug', max=MAX_BUGS) cases = resp.cases.findAll('case') num_cases = len(cases) counter = 0 batch = 1 issues = [] components = [] BACKUP_DIR = os.getcwd() + '/' + 'attachments' for case in cases: counter += 1 print("Processing case: " + str(counter) + " of " + str(num_cases)) ixBug = int(case['ixBug']) print(ixBug) respBug = fb.search( q='%s' % ixBug, cols= 'sTitle,sPersonAssignedTo,sProject,sArea,sCategory,sPriority,fOpen,events' ) xmlBug = respBug.cases.findAll('case')[0] issue = {} issue['externalId'] = int(xmlBug['ixBug']) issue['created'] = get_date_created(xmlBug) issue['summary'] = get_attribute(xmlBug, 'sTitle') issue['assignee'] = S_USER issue['reporter'] = S_USER component = get_attribute(xmlBug, 'sProject') issue['components'] = [component] # gathering all the components (Fogbugz projects) as we ecounter them if component not in components: components.append(component) issue['issueType'] = "Support" issue['priority'] = get_attribute(xmlBug, 'sPriority') issue['resolution'] = get_attribute(xmlBug, 'fOpen') issue['attachments'] = [] issue['comments'] = get_events(xmlBug, issue, BACKUP_DIR) print(issue) print("Long body running count = " + str(len(LONG_BODY_COMMENTS))) print("Long body issues = " + str([c for c in LONG_BODY_COMMENTS])) issues.append(issue) if counter % BATCH_SIZE == 0: dump_json(batch, counter, components, issues) issues = [] batch += 1 # one last dump dump_json(batch, counter, components, issues)
if branchPos is not -1: formattedText = formattedText[ 0: branchPos] + '<a href="' + gitweburl + '/gitweb/?p=' + reponame + ';a=shortlog;h=' + branchname + '">' + branchname + '</a>' + formattedText[ branchPos + len(branchname):] return formattedText def testFormatDescription(): test1 = formatDescription( 'quasar.git', 'https://gitweb.aphelion.se', 'commit 3b22351959e1e0e7a5ef6d1c067ab3ca4b6d6c94\nAuthor: Patrik Hoglund <*****@*****.**>\nDate: Mon Oct 1 13:06:34 2012 +0200\n\n case 4669: Added cvs export to Fx Report view\n\nBranch: refs/heads/develop', '3b22351959e1e0e7a5ef6d1c067ab3ca4b6d6c94', 'refs/heads/develop') return test1 def editFBCase(site, username, password, case, change, changetext): fb = FogBugz('https://' + site + '.fogbugz.com/') fb.logon(username, password) logging.info('Updating fogbugz cases') fb.edit(ixBug=case, sEvent=changetext) fb.logoff() desciption = testFormatDescription() editFBCase('apehlion', '*****@*****.**', '#01APhelion', '4675', '3b22351959e1e0e7a5ef6d1c067ab3ca4b6d6c94', desciption)
def run(): parser = argparse.ArgumentParser(description="JIRA to FogBugz importer") parser.add_argument('--jira-server', help="JIRA server URL, ex. http://jira.example.com", required=True) parser.add_argument('--jira-username', help="JIRA username", required=True) parser.add_argument('--jira-password', help="JIRA password", required=True) parser.add_argument('--jira-project', help="Which jira project to read cases", required=True) parser.add_argument('--jira-query', help="Jql query filter (in addition to the project)", required=False) parser.add_argument( '--fogbugz-server', help="FogBugz server URL, ex. http://example.fogbugz.com", required=True) parser.add_argument('--fogbugz-token', help="FogBugz access token", required=True) parser.add_argument('--fogbugz-project', help="Which FogBugz project to put cases in", required=True) parser.add_argument('--default-assignee', help="The email of the default assignee", required=True) # TODO: dynamically create projects based on JIRA data parser.add_argument('-v', '--verbose', dest="verbose", action="store_true", default=False, help="Get more verbose output") args = parser.parse_args() try: try: jira = JIRA(options={'server': args.jira_server}, basic_auth=(args.jira_username, args.jira_password)) except JIRAError as e: if e.status_code == 403: sys.stderr.write( 'Cannot connect to JIRA. Check username/password\n') sys.exit(1) else: msg = "Cannot connect to JIRA (return code={0})".format( e.status_code) if args.verbose: msg += "\n{0}".format('Response from JIRA:\n{0}'.format( e.text)) sys.stderr.write(msg + '\n') sys.exit(1) try: fb = FogBugz(args.fogbugz_server, token=args.fogbugz_token) except FogBugzConnectionError as e: sys.stderr.write('Cannot connect to FogBugz {}\n'.format(e)) sys.exit(1) except FobBugzLogonError: sys.stderr.write('Cannot login to FogBugz. Check token') sys.exit(1) # initialize an email to fogbugz User ID mapping email_map = {} resp = fb.listPeople(fIncludeActive=1, fIncludeNormal=1, fIncludeDeleted=1, fIncludeVirtual=1) for person in resp.people.childGenerator(): logging.debug("Found Fogbugz user {}".format( person.ixPerson.string)) email_map[person.sEmail.string.lower()] = int( person.ixPerson.string) try: default_assignee = email_map[args.default_assignee.lower()] except KeyError: parser.error( "Default assignee {0} does not exist in FogBugz".format( args.default_assignee)) query = 'project = "{}"'.format(args.jira_project) if args.jira_query: query += "AND " + args.jira_query logging.debug("Using Jira query: '{}'".format(query)) issues = get_jira_issues(jira, query) for issue in issues: fb_create_issue(fb, jira, issue, args.fogbugz_project, email_map, default_assignee) except SystemExit: raise except: sys.stderr.write("Unknown error occurred\n") traceback.print_exc(sys.stderr) sys.exit(1) return sys.exit(0)
URL_FROM = raw_input( 'set url from (eg. https://from.fogbugz.com): ') if EMAIL_FROM: print 'email from: ' + EMAIL_FROM else: EMAIL_FROM = raw_input('set email from (eg. [email protected]): ') if PASSWORD_FROM: print 'password from: ok' else: PASSWORD_FROM = raw_input('set password from: ') print '-----------------------------------------------------------' print 'Trying to login ........' fbz_from = FogBugz(URL_FROM) fbz_from.logon(EMAIL_FROM, PASSWORD_FROM) print 'ok' except BaseException or Exception: print '*** Cannot login to [{0}] ***'.format(URL_FROM) print 'copy aborted' sys.exit() print '-----------------------------------------------------------' try: print '** LOGIN DATA FOR ACCOUNT TO WHICH CASES WILL BE PASTED ***' if URL_TO: print 'url to: ' + URL_TO else: URL_TO = raw_input('set url to (eg. https://to.fogbugz.com): ')
import FbNotifier_UI from tactic_client_lib import TacticServerStub import Skype4Py from PySide import QtCore, QtGui server = TacticServerStub(setup=False) tactic_server_ip = socket.gethostbyname("vg.com") server.set_server(tactic_server_ip) server.set_project("simpleslot") ticket = server.get_ticket("julio", "1234") server.set_ticket(ticket) fb = FogBugz("https://fb.vir888.com") fb.logon("ART-Julio", "chicago") class MainWindow(QtGui.QDialog): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.ui = FbNotifier_UI.Ui_FbNotifier() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.listen) self.ui.tableWidget.setColumnWidth(0, 150) self.ui.tableWidget.setColumnWidth(1, 390) self.ui.tableWidget.setColumnWidth(2, 80) self.ui.tableWidget.setColumnWidth(3, 80) self.ui.tableWidget.setColumnWidth(4, 80)
def getFogBugzConnection(url, token): return FogBugz(url, token)
def main(): print("Started the program... ") print(str(datetime.now().strftime(FORMAT_OF_DATE))) start = time.time() sheets = initgooglesheets() # Fogbugz stuff fb = FogBugz(getpath(), getapikey(), api_version=8) # ---------------------------------------------------------------------------------------------------------- # Getting Day0 print('Query set to day0') query = getday0() resultListOfCases = getcaseslist(fb, query) firstTimeWriting = False listLength = str(len(resultListOfCases)) oldestCaseDate = resultListOfCases[0].lastUpdated # Calling all the information gathering functions writeoldestcases(sheets, resultListOfCases, 3, 1) writefiltercount(firstTimeWriting, sheets, datetime.now(), listLength, 10, 1, 500) writeday0age(sheets, oldestCaseDate, 10, 1, 7) print('Day 0 query finished') # ---------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------- # Continuing non day0 queues # ----------------------------------------------------------------------------------------------------------- # Getting oldest cases assigned to us without update print('Query set to oldest case without update') query = getoldestcasesnoupdate() resultListOfCases = getcaseslist(fb, query) oldestCaseDate = resultListOfCases[0].lastUpdated # Calling all the information gathering functions writeoldestcases(sheets, resultListOfCases, 3, 8) writeoldestcasenoupdateage(sheets, oldestCaseDate, 10, 8, 10) print('Oldest cases without an update query finished') # ---------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------- # Getting pro filter cases print('Query set to pro filter') query = getprofilter() resultListOfCases = getcaseslist(fb, query) listLength = str(len(resultListOfCases)) # Calling all the information gathering functions # writeoldestcases(sheets, resultListOfCases, 3, 15) writefiltercount(True, sheets, datetime.now(), listLength, 10, 15, 0) print('Pro filter query finished') # ---------------------------------------------------------------------------------------------------------- # Getting oldest resolved cases assigned to us print('Query set to oldest cases resolved and assigned to us') query = getoldestresolvedcases() resultListOfCases = getcaseslist(fb, query) oldestCaseDate = resultListOfCases[0].lastUpdated # Calling all the information gathering functions writeoldestcases(sheets, resultListOfCases, 3, 22) writeoldestcasenoupdateage(sheets, oldestCaseDate, 10, 22, 30) print('Oldest resolved cases without an update query finished') # ---------------------------------------------------------------------------------------------------------- writecrashnoncrashteams(sheets, fb, 3, 30) # ---------------------------------------------------------------------------------------------------------- # ---------------------------------------------------------------------------------------------------------- print('Data writing to Sheets finished') end = time.time() print('Finished program. Time spent: ' + str(end - start)) print(str(datetime.now().strftime(FORMAT_OF_DATE)))