Skip to content
Merged

Dev #1361

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
baf7eb0
Add Juan Sebastian Velasquez and reorganize team section
Odzen Nov 30, 2025
3289a40
Merge branch 'main' into dev
Odzen Nov 30, 2025
6a0a06e
Add download functionality for partner mentors and mentees data in va…
Jan 6, 2026
1425490
format backend
Jan 6, 2026
1f9763e
reran black
Jan 6, 2026
fd45c95
format frontend
Jan 6, 2026
b94d297
Merge branch 'main' into dev
Odzen Jan 19, 2026
1fd03e7
Bug form submission (#1359)
Odzen Jan 19, 2026
0a27f45
format
Odzen Jan 19, 2026
a1ff34d
format
Odzen Jan 19, 2026
1299b34
updated version of python
Odzen Jan 19, 2026
1676943
fix: upgrade eventlet to 0.33.3 for Python 3.10 compatibility
Odzen Jan 19, 2026
710fb1b
chore: trigger rebuild with cleared cache
Odzen Jan 19, 2026
43ca85d
chore: force fresh Heroku build with eventlet 0.33.3
Odzen Jan 19, 2026
5383f1b
fix: update eventlet to 0.33.3 in ROOT requirements.txt for Heroku
Odzen Jan 19, 2026
a175fdd
fix: upgrade dnspython to 2.4.2 for Python 3.10 compatibility
Odzen Jan 19, 2026
1e9a3f0
fix: upgrade gunicorn to 21.2.0 for eventlet 0.33.3 compatibility
Odzen Jan 19, 2026
95f03d7
fix: regenerate all requirements with Python 3.10 compatible versions
Odzen Jan 19, 2026
40f579f
Merge branch 'main' into dev
Odzen Feb 7, 2026
3da16a4
fix: normalize email input in login function and update profile retri…
Odzen Feb 15, 2026
77bdf2a
chore: update .gitignore for agent files, clean up whitespace in Pyth…
Odzen Feb 15, 2026
562324c
chore: remove issue and pull request templates from GitHub and improv…
Odzen Feb 15, 2026
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
20 changes: 0 additions & 20 deletions .github/issue_template.md

This file was deleted.

23 changes: 0 additions & 23 deletions .github/pull_request_template.md

This file was deleted.

8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,10 @@ backend/app.log
tests/.env
tests/cypress/screenshots/

.cursor
# Agents
.cursor
.factory
.kilocode
.claude
.agents
.agent
4 changes: 2 additions & 2 deletions backend/api/views/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def newregister():
@auth.route("/login", methods=["POST"])
def login():
data = request.json
email = data.get("email")
email = (data.get("email") or "").strip().lower()
password = data.get("password")
role = int(data.get("role"))
path = data.get("path", None)
Expand All @@ -170,7 +170,7 @@ def login():
if not profile_model.objects(email=email):
profile_model = get_profile_model(Account.PARTNER)

profile = profile_model.objects.get(email=email)
profile = profile_model.objects(email=email).first()

try:
firebase_user = firebase_client.auth().sign_in_with_email_and_password(
Expand Down
54 changes: 34 additions & 20 deletions backend/api/views/download.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ def download_accounts_info():
elif account_type == Account.PARTNER:
# Check if we should include Hub accounts in Partners view
include_hubs = data.get("include_hubs", "false").lower() == "true"

if hub_user_id is not None:
accounts = PartnerProfile.objects.filter(
firebase_uid__nin=admin_ids, hub_id=hub_user_id
Expand Down Expand Up @@ -152,7 +152,9 @@ def download_accounts_info():
temp = []
for account in accounts:
if account.hub_id is not None:
account.hub_user_name = Hub_user_names_object.get(str(account.hub_id), "")
account.hub_user_name = Hub_user_names_object.get(
str(account.hub_id), ""
)
hub_details = Hub_user_details_object.get(str(account.hub_id))
if hub_details:
account.hub_email = hub_details.email
Expand Down Expand Up @@ -436,7 +438,7 @@ def download_partner_accounts(accounts):
",".join(acct.regions),
acct.intro,
acct.website,
acct.hub_user_name if hasattr(acct, 'hub_user_name') else "",
acct.hub_user_name if hasattr(acct, "hub_user_name") else "",
acct.linkedin,
acct.sdgs,
acct.topics,
Expand Down Expand Up @@ -474,7 +476,7 @@ def download_partner_accounts(accounts):

def download_hub_accounts(accounts):
"""Download Hub accounts separately from Partners.

Hubs are represented as PartnerProfile documents with a hub_id field.
This function exports Hub-specific data.
"""
Expand All @@ -487,18 +489,30 @@ def download_hub_accounts(accounts):
acct.organization,
acct.location,
acct.person_name,
",".join(acct.regions) if hasattr(acct, 'regions') and acct.regions else "",
acct.intro if hasattr(acct, 'intro') else "",
(
",".join(acct.regions)
if hasattr(acct, "regions") and acct.regions
else ""
),
acct.intro if hasattr(acct, "intro") else "",
acct.website,
acct.hub_user_name if hasattr(acct, 'hub_user_name') else "",
acct.hub_email if hasattr(acct, 'hub_email') else "",
acct.hub_url if hasattr(acct, 'hub_url') else "",
acct.linkedin if hasattr(acct, 'linkedin') else "",
acct.sdgs if hasattr(acct, 'sdgs') else "",
acct.topics if hasattr(acct, 'topics') else "",
acct.hub_user_name if hasattr(acct, "hub_user_name") else "",
acct.hub_email if hasattr(acct, "hub_email") else "",
acct.hub_url if hasattr(acct, "hub_url") else "",
acct.linkedin if hasattr(acct, "linkedin") else "",
acct.sdgs if hasattr(acct, "sdgs") else "",
acct.topics if hasattr(acct, "topics") else "",
acct.image.url if acct.image else "None",
len(acct.assign_mentors) if hasattr(acct, 'assign_mentors') and acct.assign_mentors else 0,
len(acct.assign_mentees) if hasattr(acct, 'assign_mentees') and acct.assign_mentees else 0,
(
len(acct.assign_mentors)
if hasattr(acct, "assign_mentors") and acct.assign_mentors
else 0
),
(
len(acct.assign_mentees)
if hasattr(acct, "assign_mentees") and acct.assign_mentees
else 0
),
(
int(acct.text_notifications)
if acct.text_notifications != None
Expand Down Expand Up @@ -536,7 +550,7 @@ def download_hub_accounts(accounts):

def download_guest_accounts(accounts):
"""Download Guest accounts.

Guests have basic information: firebase_uid, email, name, and roomName.
"""
accts = []
Expand All @@ -547,7 +561,7 @@ def download_guest_accounts(accounts):
acct.name,
acct.email,
acct.firebase_uid,
acct.roomName if hasattr(acct, 'roomName') and acct.roomName else "",
acct.roomName if hasattr(acct, "roomName") and acct.roomName else "",
]
)
columns = [
Expand All @@ -561,7 +575,7 @@ def download_guest_accounts(accounts):

def download_support_accounts(accounts):
"""Download Support accounts.

Support accounts have basic information: firebase_uid, email, name, and roomName.
"""
accts = []
Expand All @@ -572,7 +586,7 @@ def download_support_accounts(accounts):
acct.name,
acct.email,
acct.firebase_uid,
acct.roomName if hasattr(acct, 'roomName') and acct.roomName else "",
acct.roomName if hasattr(acct, "roomName") and acct.roomName else "",
]
)
columns = [
Expand All @@ -586,7 +600,7 @@ def download_support_accounts(accounts):

def download_moderator_accounts(accounts):
"""Download Moderator accounts.

Moderator accounts have basic information: firebase_uid, email, name, and roomName.
"""
accts = []
Expand All @@ -597,7 +611,7 @@ def download_moderator_accounts(accounts):
acct.name,
acct.email,
acct.firebase_uid,
acct.roomName if hasattr(acct, 'roomName') and acct.roomName else "",
acct.roomName if hasattr(acct, "roomName") and acct.roomName else "",
]
)
columns = [
Expand Down
9 changes: 5 additions & 4 deletions backend/api/views/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
from api.utils.require_auth import all_users, mentee_only, verify_user
from firebase_admin import auth as firebase_admin_auth


main = Blueprint("main", __name__) # initialize blueprint


Expand Down Expand Up @@ -156,10 +155,10 @@ def get_accounts(account_type):
"email": hub_user.email,
"image": hub_user.image,
}

# Check if we should include Hub accounts in Partners view
include_hubs = request.args.get("include_hubs", "false").lower() == "true"

if "restricted" in request.args:
if request.args["restricted"] == "true":
if "hub_user_id" in request.args:
Expand Down Expand Up @@ -192,7 +191,9 @@ def get_accounts(account_type):
else:
# Filter by include_hubs parameter
if include_hubs:
accounts = PartnerProfile.objects.filter(restricted__ne=True)
accounts = PartnerProfile.objects.filter(
restricted__ne=True
)
else:
accounts = PartnerProfile.objects.filter(
restricted__ne=True, hub_id=None
Expand Down
1 change: 0 additions & 1 deletion backend/api/views/meeting.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

from api.utils.jaas_jwt_builder import JaaSJwtBuilder


meeting = Blueprint("meeting", __name__)

API_KEY = os.environ.get("EIGHT_X_EIGHT_API_KEY")
Expand Down
1 change: 0 additions & 1 deletion backend/api/views/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
from mongoengine.queryset.visitor import Q
from urllib.parse import unquote


messages = Blueprint("messages", __name__)


Expand Down
1 change: 0 additions & 1 deletion backend/api/views/training.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import pytz
from mongoengine.queryset.visitor import Q


training = Blueprint("training", __name__) # initialize blueprint


Expand Down
1 change: 0 additions & 1 deletion backend/manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from api import create_app, socketio
from flask import request


# sets up the app
app = create_app()

Expand Down
2 changes: 1 addition & 1 deletion backend/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 9 additions & 5 deletions frontend/src/components/AdminDropdowns.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ export function SortByApptDropdown(props) {

return (
<Dropdown overlay={overlay} className={props.className} trigger={["click"]}>
<Button style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
<Button style={{ display: "flex", alignItems: "center", gap: 8 }}>
<SortAscendingOutlined />
<span style={{ fontWeight: 500 }}>{option ? option.text : "Sort by"}</span>
<span style={{ fontWeight: 500 }}>
{option ? option.text : "Sort by"}
</span>
<DownOutlined style={{ fontSize: 12 }} />
</Button>
</Dropdown>
Expand Down Expand Up @@ -115,7 +117,7 @@ export function MenteeMentorDropdown(props) {
);
return (
<Dropdown overlay={overlay} className={props.className} trigger={["click"]}>
<Button style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
<Button style={{ display: "flex", alignItems: "center", gap: 8 }}>
<span style={{ fontWeight: 500 }}>{option.text}</span>
<DownOutlined style={{ fontSize: 12 }} />
</Button>
Expand Down Expand Up @@ -249,7 +251,7 @@ export function HubsDropdown(props) {
{props.options &&
props.options.map((element, i) => {
return (
<Menu.Item
<Menu.Item
key={element.value}
onClick={() => handleClick(element.value, element.label)}
>
Expand All @@ -269,7 +271,9 @@ export function HubsDropdown(props) {
trigger={["click"]}
overlayStyle={{ overflowY: "auto", maxHeight: 300 }}
>
<Button style={{ display: 'flex', alignItems: 'center', gap: 8, minWidth: 140 }}>
<Button
style={{ display: "flex", alignItems: "center", gap: 8, minWidth: 140 }}
>
<span style={{ fontWeight: 500 }}>{option}</span>
<DownOutlined style={{ fontSize: 12 }} />
</Button>
Expand Down
Loading
Loading