2017-10-02 62 views
0

우리는 모든 FogBugz 데이터의 스냅 샷을 만들려고하지만 GUI는 사례/사례의 최상위 수준 목록 만 내보낼 수있는 것으로 보이지만 세부 정보/첨부 파일은 내보낼 수 없습니다. 내가 찾을 수있는 유일한 해결책을 중심으로 검색하는 것은 현재 구식 인 응용 프로그램과 관련이 있습니다.FogBugz에서 사례 세부 정보 내보내기

답변

0

매우 도움이되는 내용을 찾았지만 결국 스크립트를 작성하는 방법을 알아 냈습니다. 공유하고 싶었습니다. 파이썬 프로그래머도 아니고 HTML/CSS 녀석도 아니므로주의하시기 바랍니다.

도움말 사이트에서 샘플 스크립트로 시작한이 스크립트는 첨부 파일을 포함하고 독립적으로 작동하도록 수정했습니다.

먼저 Python3을 다운로드하여 설치하십시오. 그런 다음 pip를 설치하여 fogbugz 및 jinja2를 설치하십시오. 이 두 파일을 파이썬 디렉토리에 놓고 변수를 채우고 (스크립트의 아래쪽에있는 토큰을 포함하여) backit을 실행하십시오.

1 backit.py

from fogbugz import FogBugz 
import sys 
from jinja2 import Template 
import os 
import urllib 

def main(): 

    S_FOGBUGZ_URL = 'https://whatever.fogbugz.com/' 
    S_EMAIL   = 'email' 
    S_PASSWORD  = 'pass' 
    MAX_BUGS  = 9999 

    TEMPLATE_FILE = 'C:\\Users\\zzz\\AppData\\Local\\Programs\\Python\\Python36\\fbBackupTemplate.html' 

    fb = FogBugz(S_FOGBUGZ_URL) 
    fb.logon(S_EMAIL, S_PASSWORD) 

    resp = fb.search(q='type:"Cases"', 
        cols='ixBug', 
        max=MAX_BUGS) 

    tmpl = Template(open(TEMPLATE_FILE,'r').read()) 

    for case in resp.cases.findAll('case'): 
     ixBug = int(case['ixBug']) 
     print(ixBug) 



     respBug = fb.search(q='%s' % ixBug,cols ='sTitle,sPersonAssignedTo,sProject,sArea,sCategory,sPriority,events') 
     xmlBug = respBug.cases.findAll('case')[0] 



     bug = {} 
     bug['ixBug'] = int(xmlBug['ixBug']) 
     bug['sTitle'] = xmlBug.sTitle.string if xmlBug.sTitle.string else '' 
     bug['sPersonAssignedTo'] = xmlBug.sPersonAssignedTo.string if xmlBug.sPersonAssignedTo.string else '' 
     bug['sProject'] = xmlBug.sProject.string if xmlBug.sProject.string else '' 
     bug['sArea'] = xmlBug.sArea.string if xmlBug.sArea.string else '' 
     bug['sCategory'] = xmlBug.sCategory.string if xmlBug.sCategory.string else '' 
     bug['sPriority'] = xmlBug.sPriority.string if xmlBug.sPriority.string else '' 
     bug['events'] = [] 

     BACKUP_DIR = 'C:\\Temp\\FBBack' 
     BACKUP_DIR += '\\' + xmlBug.sProject.string if xmlBug.sProject.string else '' 

     if not os.path.exists(BACKUP_DIR): 
     os.makedirs(BACKUP_DIR) 

     BACKUP_DIR += '\\' + str(xmlBug['ixBug']) 

     if not os.path.exists(BACKUP_DIR): 
     os.makedirs(BACKUP_DIR) 

     for event in xmlBug.events.findAll('event'): 
     bugEvent = {} 
     bugEvent['ixBugEvent'] = int(event['ixBugEvent']) 
     bugEvent['sVerb'] = event.sVerb.string if event.sVerb.string else '' 
     bugEvent['dt'] = event.dt.string if event.dt.string else '' 
     bugEvent['s'] = event.s.string if event.s.string else '' 
     bugEvent['sChanges'] = event.sChanges.string if event.sChanges.string else '' 
     bugEvent['evtDescription'] = event.evtDescription.string if event.evtDescription.string else '' 
     bugEvent['sPerson'] = event.sPerson.string if event.sPerson.string else ''  
     bugEvent['s'] = event.s.string.encode('ascii', 'ignore').decode('utf-8') if event.s.string else '' 
     theAttachments = '' 
     for att in event.rgAttachments: 
      theAttachments += 'Attachment: ' +att.sFileName.string + '\n' 

      print('Downloading attachment: ' + att.sFileName.string) 
      str1 = att.sURL.string 
      str2 = 'ixAttachment=' 
      loc1 = str1.find(str2) + len(str2) 
      loc2 = str1.find('&sFileName') 

      str3 = ';sFileName=' 
      loc3 = str1.find(str3) + len(str3) 
      loc4 = str1.find('&sTicket') 

      theURL = S_FOGBUGZ_URL #+ att.sURL.string 
      theURL += 'default.asp?' 
      theURL += 'ixAttachment=' + str1[loc1:loc2] 
      theURL += '&pg=pgDownload&pgType=pgFile&sFilename=' + str1[loc3:loc4] 
      theURL += '&token=123456sometoken' 

      #fix the replace 
      newFileName = att.sFileName.string.replace('\\','') 
      newFileName = newFileName.replace(':','') 
      newFileName = BACKUP_DIR+'\\'+newFileName 
      #print(newFileName) 
      urllib.request.urlretrieve(theURL, newFileName) 
     bugEvent['attachment'] = theAttachments 
     bug['events'].append(bugEvent) 




     f = open('%s\\%s.html' % (BACKUP_DIR,bug['ixBug']),'w') 
     f.write(tmpl.render(bug=bug)) 
     f.close() 
     fb.view(ixBug=ixBug) 


main() 

2 fbBackupTemplate.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>{{bug.ixBug|e}} | {{bug.sTitle|e}}</title> 
    <style type="text/css"> 
    .bugHeader { 
     outline-width: 2px; 
     outline-style: solid; 
     width: 90%; 
     padding: 5px; 
     background: #B8DDFF; 
     font: 24px "Trebuchet MS", Arial, Helvetica, sans-serif; 
    } 
    .bugEvent { 
     outline-width: 2px; 
     outline-style: solid; 
     outline-color: blue; 
     width: 90%; 
     padding: 5px; 
     background: #D2E9FF; 
     font: 12px Arial, Helvetica, sans-serif; 
    } 

    pre.s { 
     white-space: pre-wrap; 
    } 
    </style>  
</head> 
<body> 
    <div class="bugHeader"> 
    <span class="ixBug">Bug ID: {{bug.ixBug|e}}</span><br> 
    <span class="sTitle">Title: {{bug.sTitle|e}}</span><br> 
    <span class="sPersonAssignedTo">Assigned To: {{bug.sPersonAssignedTo|e}}</span><br> 
    <span class="sProject">Project: {{bug.sProject|e}}</span><br> 
    <span class="sArea">Area: {{bug.sArea|e}}</span><br> 
    <span class="sCategory">Category: {{bug.sCategory|e}}</span><br> 
    <span class="sPriority">Title: {{bug.sPriority|e}}</span><br> 
    </div> 
    <div class="bugEvents"> 
    {% for event in bug.events %} 
     <div class="bugEvent"> 
     <span class="ixBugEvent">BugEvent ID: {{event.ixBugEvent|e}}</span><br> 
     <span class="dt">Date/Time: {{event.dt|e}}</span><br> 
     <span class="sVerb">Verb: {{event.sVerb|e}}</span><br> 
     <span class="evtDescription">Event Description: {{event.evtDescription|e}}</span><br> 
     <span class="sChanges">Changes: {{event.sChanges|e}}</span><br> 
     <span class="sPerson">Person: {{event.sPerson|e}}</span><br> 
     <span class="Text">Text: </span><br> 
     <pre class="s">{{event.s|e}}</pre><br> 
     <pre class="s">{{event.attachment|e}}</pre><br> 
     </div> 
    {% endfor %} 
    </div> 
</body> 
</html> 
백업 스크립트에 대한

원래 URL : https://developers.fogbugz.com/?W211

이 API 호출에 대한 토큰을 가져 오기 : http://help.fogcreek.com/8447/how-to-get-a-fogbugz-xml-api-token