Skip to content

Commit 0c9acf4

Browse files
committed
Sync Molnix appraisals – v0.1
1 parent 3ffba0d commit 0c9acf4

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import json
2+
3+
from django.conf import settings
4+
from django.core.management.base import BaseCommand
5+
6+
from api.logger import logger
7+
from api.molnix_utils import MolnixApi
8+
9+
DEBUG_LEVEL = 2 # Set to 0 for no debug, higher numbers for more verbose debug output
10+
11+
12+
def extract_appraisals(payload):
13+
if isinstance(payload, list):
14+
return payload
15+
if not isinstance(payload, dict):
16+
return []
17+
if "original" in payload and isinstance(payload["original"], dict):
18+
original = payload["original"]
19+
if "data" in original and isinstance(original["data"], list):
20+
return original["data"]
21+
if "appraisals" in payload:
22+
appraisals = payload["appraisals"]
23+
if isinstance(appraisals, dict) and "data" in appraisals:
24+
return appraisals["data"]
25+
if isinstance(appraisals, list):
26+
return appraisals
27+
if "data" in payload and isinstance(payload["data"], list):
28+
return payload["data"]
29+
return []
30+
31+
32+
def should_continue(payload, appraisals):
33+
if not appraisals:
34+
return False
35+
if not isinstance(payload, dict):
36+
return True
37+
original = payload.get("original")
38+
if isinstance(original, dict):
39+
if original.get("next_page_url") in ("", None, False):
40+
return False
41+
current_page = original.get("current_page")
42+
last_page = original.get("last_page")
43+
if isinstance(current_page, int) and isinstance(last_page, int) and current_page >= last_page:
44+
return False
45+
if "next" in payload and not payload["next"]:
46+
return False
47+
return True
48+
49+
50+
def log_debug(level, message):
51+
if DEBUG_LEVEL >= level:
52+
logger.info("[debug-%d] %s" % (level, message))
53+
54+
55+
class Command(BaseCommand):
56+
help = "Fetch and print Molnix appraisals"
57+
58+
def handle(self, *args, **options):
59+
logger.info("Starting Sync Molnix Appraisals job")
60+
molnix = MolnixApi(url=settings.MOLNIX_API_BASE, username=settings.MOLNIX_USERNAME, password=settings.MOLNIX_PASSWORD)
61+
try:
62+
molnix.login()
63+
logger.info("Logged into Molnix")
64+
except Exception as ex:
65+
logger.error("Failed to login to Molnix API: %s" % str(ex))
66+
return
67+
68+
page = 1
69+
total = 0
70+
while True:
71+
log_debug(1, "Fetching page %d" % page)
72+
data = molnix.call_api(path="appraisals", params={"page": page})
73+
appraisals = extract_appraisals(data)
74+
if isinstance(data, dict):
75+
original = data.get("original") if isinstance(data.get("original"), dict) else {}
76+
log_debug(
77+
1,
78+
"Pagination current=%s last=%s next_url=%s count=%d"
79+
% (
80+
original.get("current_page"),
81+
original.get("last_page"),
82+
original.get("next_page_url"),
83+
len(appraisals),
84+
),
85+
)
86+
log_debug(2, "Top-level keys: %s" % sorted(list(data.keys())))
87+
if original:
88+
log_debug(2, "Original keys: %s" % sorted(list(original.keys())))
89+
if not appraisals:
90+
log_debug(1, "No appraisals returned, stopping")
91+
break
92+
for appraisal in appraisals:
93+
self.stdout.write(json.dumps(appraisal, indent=2, sort_keys=True))
94+
total += 1
95+
if not should_continue(data, appraisals):
96+
log_debug(1, "Pagination indicates no more pages")
97+
break
98+
page += 1
99+
100+
logger.info("Printed %d appraisals" % total)
101+
molnix.logout()

0 commit comments

Comments
 (0)