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
Пример #2
0
 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])
Пример #3
0
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'
Пример #4
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))
Пример #5
0
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)
Пример #6
0
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()
Пример #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
Пример #8
0
 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.'))
Пример #9
0
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})
Пример #10
0
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'
Пример #11
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
Пример #12
0
# 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:
Пример #13
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): ')
Пример #14
0
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
Пример #16
0
    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()
Пример #17
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)

        self.ui.tableWidget.itemClicked.connect(self.skypeMessage)
Пример #18
0
                '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): ')
Пример #19
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)
Пример #20
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)
Пример #21
0
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