Example #1
0
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))
Example #2
0
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'
Example #5
0
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()
Example #6
0
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)))
Example #7
0
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
Example #8
0
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'])
Example #9
0
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
Example #10
0
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
Example #11
0
        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)
Example #12
0
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)
Example #13
0
    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)
Example #14
0
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)
Example #15
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): ')
Example #16
0
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)
Example #17
0
def getFogBugzConnection(url, token):
    return FogBugz(url, token)
Example #18
0
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)))