taiga_audit.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import requests
  2. import json
  3. import urllib3
  4. import os
  5. from dotenv import load_dotenv
  6. load_dotenv()
  7. urllib3.disable_warnings()
  8. TAIGA_USER = os.environ.get('TAIGA_USER', 'FrancoisLange')
  9. TAIGA_PASS = os.environ.get('TAIGA_PASS', 'your_db_password_here')
  10. base_url = 'https://192.168.130.161/taiga/api/v1'
  11. auth = requests.post(f'{base_url}/auth', json={'type': 'normal', 'username': TAIGA_USER, 'password': TAIGA_PASS}, verify=False).json()
  12. h = {'Authorization': f'Bearer {auth["auth_token"]}', 'Content-Type': 'application/json', 'x-disable-pagination': 'true'}
  13. project_id = 21
  14. out = []
  15. # Sprints (Milestones)
  16. sprints = requests.get(f'{base_url}/milestones?project={project_id}', headers=h, verify=False).json()
  17. out.append("SPRINTS:")
  18. for s in sprints:
  19. out.append(f" - {s['name']} (Closed: {s['closed']})")
  20. # User Stories
  21. us = requests.get(f'{base_url}/userstories?project={project_id}', headers=h, verify=False).json()
  22. out.append("\nUSER STORIES:")
  23. for u in us:
  24. sprint_name = "NO SPRINT"
  25. if u['milestone']:
  26. sprint_name = next((s['name'] for s in sprints if s['id'] == u['milestone']), "Unknown")
  27. out.append(f" - [{u['status_extra_info']['name']}] {u['subject']} (Sprint: {sprint_name})")
  28. # Tasks
  29. tasks = requests.get(f'{base_url}/tasks?project={project_id}', headers=h, verify=False).json()
  30. out.append("\nTASKS:")
  31. unassigned_tasks = []
  32. empty_description_tasks = []
  33. no_sprint_tasks = []
  34. no_us_tasks = []
  35. for t in tasks:
  36. if not t.get('description'):
  37. empty_description_tasks.append(t)
  38. if not t.get('user_story'):
  39. no_us_tasks.append(t)
  40. if not t.get('milestone'):
  41. no_sprint_tasks.append(t)
  42. status = t.get('status_extra_info', {}).get('name', 'Unknown')
  43. us_ref = t.get('user_story_extra_info', {}).get('ref', 'None') if t.get('user_story_extra_info') else 'None'
  44. sprint = "None"
  45. if t.get('milestone'):
  46. sprint = next((s['name'] for s in sprints if s['id'] == t['milestone']), "Unknown")
  47. out.append(f" - TG-{t['ref']} [{status}] {t['subject']} (Sprint: {sprint}, US: {us_ref}, Has Desc: {bool(t.get('description'))})")
  48. out.append("\nPROBLEMS FOUND IN TASKS:")
  49. out.append(f"Tasks without User Story: {len(no_us_tasks)}")
  50. out.append(f"Tasks without Sprint: {len(no_sprint_tasks)}")
  51. out.append(f"Tasks without Description: {len(empty_description_tasks)}")
  52. # Wiki Pages
  53. wikis = requests.get(f'{base_url}/wiki?project={project_id}', headers=h, verify=False).json()
  54. out.append("\nWIKI PAGES:")
  55. for w in wikis:
  56. out.append(f" - {w['slug']}")
  57. with open('scratch/taiga_audit.txt', 'w', encoding='utf-8') as f:
  58. f.write("\n".join(out))