33import logging
44import os
55from configparser import ConfigParser
6- from dataclasses import dataclass
6+ from dataclasses import dataclass , field
77from enum import Enum
88from io import TextIOWrapper
99from pathlib import Path
3333 TO_SANDBOX_ID = config ["board_meta" ]["to_sandbox_id" ]
3434 TO_PRODUCTION_ID = config ["board_meta" ]["to_production_id" ]
3535 BLOCKED_ID = config ["board_meta" ]["blocked_id" ]
36+
37+ GF_BOARD_ID = config ["gf_board_meta" ]["board_id" ]
38+ GF_BOARD_STATUS_FIELD_ID = config ["gf_board_meta" ]["board_id" ]
39+ GF_BOARD_PR_GF_ID = config ["gf_board_meta" ]["pr_gf_id" ]
40+ GF_BOARD_IN_DEV_ID = config ["gf_board_meta" ]["in_dev_id" ]
41+ GF_BOARD_IN_SANDBOX_ID = config ["gf_board_meta" ]["in_sandbox_id" ]
42+ GF_BOARD_LIVE_ID = config ["gf_board_meta" ]["live_id" ]
3643else :
3744 TRAFFIC_JAM_ID = os .environ .get ("TRAFFIC_JAM_ID" )
3845 STATUS_FIELD_ID = os .environ .get ("STATUS_FIELD_ID" )
4552 TO_PRODUCTION_ID = os .environ .get ("TO_PRODUCTION_ID" )
4653 BLOCKED_ID = os .environ .get ("BLOCKED_ID" )
4754
55+ GF_BOARD_ID = os .environ .get ("GF_BOARD_ID" )
56+ GF_BOARD_STATUS_FIELD_ID = os .environ .get ("GF_BOARD_STATUS_FIELD_ID" )
57+ GF_BOARD_PR_GF_ID = os .environ .get ("GF_BOARD_PR_GF_ID" )
58+ GF_BOARD_IN_DEV_ID = os .environ .get ("GF_BOARD_IN_DEV_ID" )
59+ GF_BOARD_IN_SANDBOX_ID = os .environ .get ("GF_BOARD_IN_SANDBOX_ID" )
60+ GF_BOARD_LIVE_ID = os .environ .get ("GF_BOARD_LIVE_ID" )
61+
4862
4963class STATUS_OPTION_IDS (Enum ):
5064 PR_GF = PR_GF_ID
@@ -53,6 +67,13 @@ class STATUS_OPTION_IDS(Enum):
5367 LIVE = LIVE_ID
5468
5569
70+ class GF_BOARD_STATUS_OPTION_IDS (Enum ):
71+ PR_GF = GF_BOARD_PR_GF_ID
72+ IN_DEV = GF_BOARD_IN_DEV_ID
73+ IN_SANDBOX = GF_BOARD_IN_SANDBOX_ID
74+ LIVE = GF_BOARD_LIVE_ID
75+
76+
5677class LIST_OPTION_IDS (Enum ):
5778 TO_SANDBOX = TO_SANDBOX_ID
5879 TO_PRODUCTION = TO_PRODUCTION_ID
@@ -145,6 +166,16 @@ def from_string(string: str): # type: ignore[misc]
145166 name
146167 }
147168 }
169+ closingIssuesReferences(first: 10) {
170+ nodes {
171+ url
172+ projectItems(first: 10) {
173+ nodes {
174+ id
175+ }
176+ }
177+ }
178+ }
148179 merged
149180 closed
150181 }
@@ -181,6 +212,7 @@ class PushItem:
181212 push_list : Optional [PushList ] = None
182213 merged : Optional [bool ] = None
183214 id_ : Optional [str ] = None
215+ linked_issues : list = field (default_factory = lambda : [])
184216
185217 def __hash__ (self ) -> int :
186218 return hash (self .path )
@@ -227,7 +259,16 @@ def set_server(self, server: STATUS_OPTION_IDS):
227259 STATUS_FIELD_ID ,
228260 server .value ,
229261 )
230- g ._run_graphql (mutation , {})
262+ # Update the projects board as well
263+ for linked_issue in self .linked_issues :
264+ for project_item in linked_issue ["projectItems" ]["nodes" ]:
265+ mutation = GOOGLE_FONTS_UPDATE_ITEM % (
266+ GF_BOARD_ID ,
267+ project_item ["id" ],
268+ GF_BOARD_STATUS_FIELD_ID ,
269+ getattr (GF_BOARD_STATUS_OPTION_IDS , server .name ).value ,
270+ )
271+ g ._run_graphql (mutation , {})
231272
232273 def set_pushlist (self , listt : LIST_OPTION_IDS ):
233274 from gftools .gfgithub import GitHubClient
@@ -522,6 +563,8 @@ def from_traffic_jam(cls, fp=None):
522563 continue
523564 labels = [i ["name" ] for i in item ["content" ]["labels" ]["nodes" ]]
524565
566+ linked_issues = item ["content" ]["closingIssuesReferences" ]["nodes" ]
567+
525568 files = [Path (i ["path" ]) for i in item ["content" ]["files" ]["nodes" ]]
526569 url = item ["content" ]["url" ]
527570 merged = item ["content" ]["merged" ]
@@ -548,5 +591,9 @@ def from_traffic_jam(cls, fp=None):
548591 cat = PushCategory .OTHER
549592
550593 for f in files :
551- results .add (PushItem (Path (f ), cat , status , url , push_list , merged , id_ ))
594+ results .add (
595+ PushItem (
596+ Path (f ), cat , status , url , push_list , merged , id_ , linked_issues
597+ )
598+ )
552599 return results
0 commit comments