github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/scripts/story-cleanup/story-cleanup.py (about) 1 #! /usr/bin/env python2 2 3 import datetime 4 import os 5 import requests 6 import sys 7 import traceback 8 9 from requests.exceptions import HTTPError 10 11 PT_PROJID_PRIMARY = os.getenv('PT_PROJID_PRIMARY') 12 PT_PROJID_STORAGE = os.getenv('PT_PROJID_STORAGE') 13 PT_URLPFX_FORMAT = 'https://www.pivotaltracker.com/services/v5/projects/{}' 14 PT_URLPFX_PRIMARY = PT_URLPFX_FORMAT.format(PT_PROJID_PRIMARY) 15 PT_HEADERS_BASE = {'X-TrackerToken':os.getenv('PT_API_TOKEN')} 16 PT_PARAMS_BASE = {'date_format':'millis', 'limit':50} 17 PT_DAYS_AGED = 190 if 'PT_DAYS_AGED' not in os.environ else int(os.getenv('PT_DAYS_AGED')) 18 19 if PT_DAYS_AGED < 30: 20 PT_DAYS_AGED = 30 21 22 def mergeDicts(base, added): 23 ps = base.copy() 24 ps.update(added) 25 return ps 26 27 def updBefFilter(daysAged): 28 date = datetime.datetime.now() - datetime.timedelta(days=daysAged) 29 return 'updated_before:{}'.format(date.strftime('%m/%d/%Y')) 30 31 # gather stories by limit set in PT_PARAMS_BASE or max allowed by API, whichever is lower 32 def getAgedStories(): 33 filterVal = ', '.join(['state:unscheduled', updBefFilter(PT_DAYS_AGED)]) 34 headers = PT_HEADERS_BASE 35 params = mergeDicts(PT_PARAMS_BASE, {'filter':filterVal}) 36 response = requests.get(PT_URLPFX_PRIMARY+'/stories', headers=headers, params=params) 37 response.raise_for_status() 38 return response.json() 39 40 def moveStory(story): 41 storyID = str(story['id']) 42 payload = {'project_id':int(PT_PROJID_STORAGE)} 43 headers = PT_HEADERS_BASE 44 response = requests.put(PT_URLPFX_PRIMARY+'/stories/'+storyID, headers=headers, json=payload) 45 response.raise_for_status() 46 47 def main(): 48 try: 49 agedStories = getAgedStories() 50 for story in agedStories: 51 moveStory(story) 52 except HTTPError as e: 53 print(e) 54 55 if __name__ == '__main__': 56 main()