scripts/deploy/deploy.py (91 lines of code) (raw):
import argparse
import os
import tempfile
from dotenv import load_dotenv
import json
from googleads import ad_manager, common, oauth2
import datetime
from termcolor import cprint
load_dotenv()
template_dir = os.path.realpath(
os.path.join(os.path.dirname(os.path.abspath(__file__)),
"../../build-static")
)
config = {
"application_name": os.environ.get("GAM_APPLICATION_NAME"),
"network_code": os.environ.get("GAM_NETWORK_CODE")
}
html_prefix = "<!-- DO NOT EDIT -- FILE GENERATED AND DEPLOYED AUTOMATICALLY FROM https://github.com/guardian/commercial-templates ON {} -->".format(
datetime.datetime.now().strftime("%m/%d/%Y")
)
css_prefix = "/* DO NOT EDIT -- FILE GENERATED AND DEPLOYED AUTOMATICALLY FROM https://github.com/guardian/commercial-templates ON {} */".format(
datetime.datetime.now().strftime("%m/%d/%Y")
)
# Uploads a native style template to GAM given a directory name
def upload_template(
native_style_service: common.GoogleSoapService, root: str, dir: str
):
try:
info_json = open(os.path.join(root, dir, "ad.json"), "r").read()
html = open(os.path.join(root, dir, "index.html"), "r").read()
css = open(os.path.join(root, dir, "style.css"), "r").read()
except:
cprint(
'[!] Skipping "%s" because index.html, style.css, or ad.json was missing.'
% dir,
"yellow",
)
return
templateInfo = json.loads(info_json)
html = html_prefix + html
css = css_prefix + css
statement = ad_manager.StatementBuilder(
version="v202208", where="id = %s" % templateInfo["nativeStyleId"]
)
response = native_style_service.getNativeStylesByStatement(
statement.ToStatement())
if "results" in response and len(response["results"]):
style = response["results"][0]
cprint(
'[✔️] Native style "%s" with ID "%d" was found for template "%s".'
% (style["name"], style["id"], dir),
"green",
)
style["htmlSnippet"] = html
style["cssSnippet"] = css
print('[i] Updating native style "%s".' % (style["name"]))
try:
native_style_service.updateNativeStyles([style])
except Exception as e:
cprint("[!] Error updating native style: %s" % e, "red")
return
cprint('[✔️] Native style "%s" was updated.' %
(style["name"]), "green")
else:
cprint(
'[i] No native styles found to update for "%s" with nativeStyleId "%s"'
% (dir, templateInfo["nativeStyleId"]),
"yellow",
)
def main(native_style_service: common.GoogleSoapService):
for root, dirs, files in os.walk(template_dir):
for dir in dirs:
upload_template(native_style_service, root, dir)
if __name__ == "__main__":
key_json = os.environ.get("SERVICE_ACCOUNT_KEY_FILE")
if key_json is None:
cprint("[!] SERVICE_ACCOUNT_KEY_FILE is not set in .env", "red")
exit(1)
fd, key_file = tempfile.mkstemp()
try:
with os.fdopen(fd, 'w') as tmp:
tmp.write(key_json)
oauth2_client = oauth2.GoogleServiceAccountClient(
key_file, oauth2.GetAPIScope('ad_manager'))
ad_manager_client = ad_manager.AdManagerClient(
oauth2_client, config['application_name'], config['network_code'])
native_style_service = ad_manager_client.GetService(
"NativeStyleService", version="v202405"
)
main(native_style_service)
finally:
os.remove(key_file)