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 fogbugzOnFail(self,logfp): print "Creating FogBuz Ticket" cfp=Config(self.__fpath) attempts=0 run=True while run is True and attempts < 3: try: site=FogBugz(cfp.getVar("fogbugz","site","string")) try: site.logon(cfp.getVar("fogbugz","user","string"), cfp.getVar("fogbugz","pass","string")) cfp=Config(self.__fpath) with open(logfp,'rb') as fp: print site.new(sTitle="The Parser "+os.path.join(self.__logbase,self.__execute)+" Failed",ixPersonAssignedTo="Andy",Files={"faillog.txt":fp}) attempts+=1 run=False except Exception,e: print str(e) for frame in traceback.extract_tb(sys.exc_info()[2]): print '\n'.join([str(x) for x in frame]) finally: site.logoff() except Exception,e: print str(e) for frame in traceback.extract_tb(sys.exc_info()[2]): print '\n'.join([str(x) for x in frame])
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 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 run(): parser = argparse.ArgumentParser(description="JIRA to FogBugz importer") parser.add_argument('jira_url', help="JIRA URL, ex. http://jira.example.com") parser.add_argument('jira_username', help="JIRA username") parser.add_argument('jira_password', help="JIRA password") parser.add_argument('fogbugz_url', help="FogBugz URL, ex. http://example.fogbugz.com") parser.add_argument('fogbugz_username', help="FogBugz username") parser.add_argument('fogbugz_password', help="FogBugz password") parser.add_argument('default_assignee', help="The email of the default assignee") # TODO: dynamically create projects based on JIRA data parser.add_argument('project', help="Which FogBugz project to put cases in") 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_url}, basic_auth=(args.jira_username, args.jira_password)) except JIRAError, 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_url) fb.logon(args.fogbugz_username, args.fogbugz_password) except FogBugzConnectionError: sys.stderr.write('Cannot connect to FogBugz\n') sys.exit(1) except FobBugzLogonError: sys.stderr.write('Cannot login to FogBugz. Check username/password') sys.exit(1) # initialize an email to fogbugz User ID mapping email_map = {} resp = fb.listPeople() for person in resp.people.childGenerator(): email_map[person.semail.string] = int(person.ixperson.string) try: default_assignee = email_map[args.default_assignee] except KeyError: parser.error("Default assignee {0} does not exist in FogBugz".format(args.default_assignee)) for issue in get_jira_issues(jira, query): create_issue(fb, issue, project_name, email_map, default_assignee)
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()
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 doPrivmsg(self, irc, msg): if(self.registryValue('enable', msg.args[0])): match = re.search('.*Bug[sz]id *: *(\d{1,5})', msg.args[1], re.IGNORECASE) if match: fb = FogBugz(fbSettings.fb_url) fb.logon(fbSettings.fb_user, fbSettings.fb_pass) query_cols='sTitle,sStatus,sPriority' resp = fb.search(q=match.group(1), cols = query_cols) if len(resp.findAll('case')) > 0 : for cur_case in resp.cases.childGenerator(): # Dump Title title_message = '[BugzID ' + match.group(1) + '] ' + ircutils.bold(str(cur_case.stitle.string).replace('<![CDATA[','').replace(']]>','')) + ' (' + cur_case.sstatus.string + ', ' + cur_case.spriority.string +')' irc.queueMsg(ircmsgs.privmsg(msg.args[0], title_message)) # Dump URL to ticket url_message = fbSettings.fb_url + '/default.asp?' + match.group(1) irc.queueMsg(ircmsgs.privmsg(msg.args[0], url_message)) else : irc.queueMsg(ircmsgs.privmsg(msg.args[0], 'Sorry, ' + ircutils.bold(match.group(1)) + ' is not a known BugID.'))
def login(request): fogbugz_error = None if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): email_address = str(request.POST.get('email_address','')) password = str(request.POST.get('password','')) fb = FogBugz(settings.FOGBUGZ_URL) try: fb.logon(email_address, password) except FogBugzAPIError as e: fogbugz_error = e.message mail_error = 'Error on login:\n\n' + e.message send_error_email(mail_error) fb_token = fb._token # pylint: disable=W0212 # save token into model if fb_token: login = FogBugzLogin.objects.filter(email=email_address) if not login: login = FogBugzLogin(email=email_address, fogbugz_token=fb_token) login.save() else: login.update(fogbugz_token=fb_token) return render_to_response('fogbugz_login_complete.html') else: form = LoginForm() return render_to_response('login.html', {'login_form': form, 'fogbugz_error': fogbugz_error, 'fogbugz_site': settings.FOGBUGZ_URL})
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'
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
# Usage: python milestone_manager.py -p <Project> -m <Milestone Name> (optional: rm True | False (default is false)) # todo: handling of adding milestones that have been deleted. import fbSettings from fogbugz import FogBugz import argparse fogbugz = FogBugz(fbSettings.URL) fogbugz.logon(fbSettings.Login, fbSettings.pw) parser = argparse.ArgumentParser( description="Usage: python milestone_maker -p <Project> -m <Milestone Name> -rm True|False (Default is false)" ) parser.add_argument("-p", "--project", type=str, help="Project Name", required=True) parser.add_argument("-m", "--milestone", type=str, help="New Milestone name", required=True) parser.add_argument("-rm", "--delete", type=bool, help="Delete the milestone", default=False, required=False) args = parser.parse_args() project_map = {} projects = fogbugz.listProjects() for item in projects.findAll("project"): proj_number = item.ixproject.string.encode("UTF-8") proj_name = item.sproject.string.encode("UTF-8") project_map.update({proj_name: proj_number}) milestone_map = {} milestones = fogbugz.listFixFors() for item in milestones.findAll("fixfor"): milestone_number = item.ixfixfor.string.encode("UTF-8") milestone_name = item.sfixfor.string.encode("UTF-8") milestone_map.update({milestone_name: milestone_number}) try:
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): ')
parser = argparse.ArgumentParser(description='Docs docs docs these are my docs') parser.add_argument('-o','--o_variable', type=str, help='Old Milestone name', required=True) parser.add_argument('-n','--n_variable', type=str, help='New Milestone name', required=True) args = parser.parse_args() fb = FogBugz("https://sailthru.fogbugz.com/") # To run this needs a d.txt file that contains the json of: {"login":"******","pass":"******"} with open('../d.txt') as json_data: data = json.load(json_data) login = data["login"] passw = data["pass"] fb.logon(login,passw) milestones = fb.listFixFors() #this is not being used now ... it gets the most current milestone... i could probably trash it.. milestone_dates, sep, tail = milestones.sfixfor.renderContents().partition('T') miled = milestones.findAll('dt',limit=2)[1] work = miled.renderContents().partition('T') milestone = work[0] milestone = milestone.replace("-","/") print milestone search = 'milestone'+':'+args.o_variable+' '+'status:open -status:Merged -milestone:Undecided Project:Sailthru' print search
from trello import TrelloApi __author__ = "Jacob Sanford" __license__ = "GPL" __version__ = "1.0.0" __maintainer__ = "Jacob Sanford" __email__ = "*****@*****.**" __status__ = "Development" # Explicit testing / error would be nice here. trello = TrelloApi(os.environ['TRELLO_API_KEY']) if not os.environ['TRELLO_USER_TOKEN']=='' : trello.set_token(os.environ['TRELLO_USER_TOKEN']) fb = FogBugz(os.environ['FOGBUGZ_URL']) fb.logon(os.environ['FOGBUGZ_USER'],os.environ['FOGBUGZ_PASSWORD']) # Find cards in board with specified label. for cur_card in trello.boards.get_card(os.environ['TRELLO_BOARD_TO_PARSE']): for cur_card_label in cur_card['labels']: if cur_card_label['name'] == os.environ['TRELLO_LABEL_TO_PARSE'] : # Create case in Fogbugz if not exist fogbugz_response=fb.search(q='tag:"' + cur_card['id'] + '"',cols='ixBug') if len(fogbugz_response.cases) == 0 : fb.new(sTitle=cur_card['name'], sTags=cur_card['id'], ixProject=os.environ['FOGBUGZ_DEFAULT_PROJECT']) # Get ixBug value fogbugz_response=fb.search(q='tag:"' + cur_card['id'] + '"',cols='ixBug') fogbugz_id=fogbugz_response.ixbug.string
for ticket in db_entry: return ticket["related_to"] def checkDupe(db_field,ticket_related): if db_field == ticket_related: print "halt, this has happened before" return True else: print "no, update with the new db field" return False """ def updateRelated(new_ticket,ticket_related,editor,title): colorPrint(1, "updating " + ticket_related + " with " + new_ticket) response = fogbugz.edit(ixBug=ticket_related,sEvent=('case %s (%s) has been opened by %s' % (new_ticket, title, editor))) addRelated(new_ticket,ticket_related) def addRelated(new_ticket,ticket_related): db['related_ticket'].update({"case_number":new_ticket},{'$set':{"related_to":ticket_related}}) colorPrint(1,"Update the db") if hasattr(fbSettings,'TOKEN'): fogbugz = FogBugz(fbSettings.URL, fbSettings.TOKEN) else: fogbugz = FogBugz(fbSettings.URL) fogbugz.logon(fbSettings.LOGIN, fbSettings.PW) if __name__ == '__main__': init() getTicketInfo()
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) self.ui.tableWidget.itemClicked.connect(self.skypeMessage)
'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): ')
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 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)
import settings from optparse import OptionParser parser = OptionParser() parser.add_option('-s', '--search', dest='search', help="Search for the given keywords", metavar="KEYWORDS") (options, args) = parser.parse_args() print options print args from fogbugz import FogBugz fb = FogBugz(settings.url) fb.logon(settings.user_email, settings.user_pass) if options.search: resp = fb.search(q=settings.default_search_prefix + options.search, cols="sTitle,ixPriority,hrsOrigEst,hrsCurrEst,hrsElapsed,ixBugParent" ) for case in resp.cases.childGenerator(): print case['ixbug'], case.stitle.string print case
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