Skip to content
Merged
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
1d49bdd
removed barrier
Sep 4, 2025
19f09b2
reverting to old code
Sep 4, 2025
a117658
modified contributor
Sep 5, 2025
42c224e
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Sep 5, 2025
4f4aea8
bug testing
Sep 5, 2025
55c1a57
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Sep 5, 2025
9290e38
changed varibale of .env
Sep 5, 2025
3c0f384
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Sep 5, 2025
f389e53
dev revert
Sep 6, 2025
fec0f43
revert old code
Sep 6, 2025
0345190
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Sep 6, 2025
5350590
changed to use default handler for contributor id as 0
Sep 17, 2025
dccefc1
modified contributor issue in pull request as well
Sep 19, 2025
5826ec5
modified api program ticket
Oct 8, 2025
090962f
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Oct 8, 2025
bbc24d7
modified tickets table api
Nov 24, 2025
e179eb6
changed docker from bluster to bullseye
Nov 24, 2025
c828229
testing tickets api
Nov 24, 2025
cd41615
added ticket filter
Nov 27, 2025
7c00b4e
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Nov 27, 2025
73cc401
added ticket filter
Nov 27, 2025
178315a
added ticket filter
Nov 27, 2025
68dee4e
Update app.py
praveenkumar911 Nov 27, 2025
d108471
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Nov 27, 2025
25461c0
Refactor issue data parsing for improved safety
praveenkumar911 Nov 27, 2025
4a0ce86
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Nov 27, 2025
8feadd2
added ticket filter
Nov 27, 2025
2293a00
Merge branch 'dev' into 04/sep_removing_community_contrbutor_barrier
praveenkumar911 Nov 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 66 additions & 58 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,70 +308,81 @@ async def get_role_master():
print('role master ', role_masters)
return role_masters.data


@app.route("/program-tickets-user", methods=['POST'])
async def get_program_tickets_user():
try:
print('getting data for users leaderboard')

# -------- request body parsing --------
request_data = request.body._data
filter = ''
if request_data:
filter = json.loads(request_data.decode('utf-8'))
# ------------------ Read Body ------------------
raw_body = request.body._data
filters = {}

if raw_body:
try:
filters = json.loads(raw_body.decode('utf-8'))
except Exception as e:
print("JSON parse failed:", e)
filters = {}

# ------------------ Query DB ------------------
postgres_client = ServerQueries()
all_issues = await postgres_client.fetch_filtered_issues(filter)
print('length of all issues before filtering: ', len(all_issues))
all_issues = await postgres_client.fetch_filtered_issues(filters)

issue_result = []
print("Total from DB:", len(all_issues))

# -------- 6-month cutoff --------
result = []

# 6 month cutoff
six_months_ago = datetime.utcnow() - timedelta(days=180)

for issue in all_issues:

issue_data = issue.get("issue", {}) or {}
org_data = issue.get("org", {}) or {}
contrib = issue.get("contributors_registration", {}) or {}
points = issue.get("points", {}) or {}

# -------------------------------------------------------
# SAFE TIMESTAMP PARSING
# created_at — ALWAYS SAFE
# -------------------------------------------------------
created_at_raw = issue["issue"].get("created_at")
created_at_raw = issue_data.get("created_at")
created_at = None

if created_at_raw:
try:
created_at = parser.parse(created_at_raw)
except:
created_at = None

# -------- FILTER if older than 6 months --------
# skip if older than 6 months
if created_at and created_at < six_months_ago:
continue

# -------------------------------------------------------
# REQUIRED SKILLS
# reqd_skills parsing
# -------------------------------------------------------
reqd = issue_data.get("technology")
reqd_skills = []
tech = issue["issue"].get("technology")
if tech:
reqd_skills = [
skill.strip().replace('"', '')
for skill in tech.split(',')
]
if reqd:
reqd_skills = [x.strip().replace('"', '') for x in reqd.split(",")]

# -------------------------------------------------------
# PROJECT TYPE
# project_type parsing
# -------------------------------------------------------
ptype_raw = issue_data.get("project_type")
project_type = []
ptype = issue["issue"].get("project_type")
if ptype:
project_type = [
pt.strip().replace('"', '')
for pt in ptype.split(',')
]
if ptype_raw:
if isinstance(ptype_raw, list):
project_type = ptype_raw
else:
project_type = [
x.strip().replace('"', '') for x in str(ptype_raw).split(",")
]

# -------------------------------------------------------
# LABELS CLEANING
# normalize labels
# -------------------------------------------------------
labels = issue["issue"].get("labels") or []
labels = issue_data.get("labels") or []
if len(labels) == 1:
labels = ["C4GT Coding"]
else:
Expand All @@ -381,52 +392,49 @@ async def get_program_tickets_user():
] or ["C4GT Coding"]

# -------------------------------------------------------
# CONTRIBUTOR NAME
# contributor name resolution
# -------------------------------------------------------
contributors_data = issue.get("contributors_registration")
contributors_name = None

if contributors_data:
contributors_name = contributors_data.get("name")

if not contributors_name:
url_parts = contributors_data.get("github_url", "").split("/")
contributors_name = url_parts[-1] if url_parts else None
contributor = None
if contrib:
contributor = contrib.get("name")
if not contributor:
gh_url = contrib.get("github_url", "")
contributor = gh_url.split("/")[-1] if "/" in gh_url else None

# -------------------------------------------------------
# SAFE closed_at
# closed_at SAFE
# -------------------------------------------------------
closed_raw = issue["issue"].get("closed_at") # prevents KeyError
closed_at = issue_data.get("closed_at")

# -------------------------------------------------------
# FINAL STRUCTURED RESPONSE
# FINAL object
# -------------------------------------------------------
formatted_issue = {
formatted = {
"created_at": created_at_raw,
"name": issue["issue"].get("title"),
"complexity": issue["issue"].get("complexity"),
"name": issue_data.get("title"),
"complexity": issue_data.get("complexity"),
"category": labels,
"reqd_skills": reqd_skills or None,
"issue_id": issue["issue"].get("issue_id"),
"url": issue["issue"].get("link"),
"ticket_points": issue.get("points", {}).get("points"),
"issue_id": issue_data.get("issue_id"),
"url": issue_data.get("link"),
"ticket_points": points.get("points"),
"mentors": ["Amoghavarsh"],
"status": issue["issue"].get("status"),
"domain": issue["issue"].get("domain"),
"organization": issue["org"].get("name"),
"closed_at": closed_raw, # SAFE VALUE
"assignees": contributors_name,
"status": issue_data.get("status"),
"domain": issue_data.get("domain"),
"organization": org_data.get("name"),
"closed_at": closed_at,
"assignees": contributor,
"project_type": project_type or None,
"is_assigned": contributors_data is not None
"is_assigned": bool(contrib)
}

issue_result.append(formatted_issue)
result.append(formatted)

print("Final issues returned:", len(issue_result))
return issue_result
print("Final issues returned:", len(result))
return result

except Exception as e:
print('Exception occurred in getting users leaderboard data:', e)
print("Exception:", e)
return {"success": False, "error": str(e)}


Expand Down