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()