Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Admin] Make it easier to add volunteers #97

Merged
merged 1 commit into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
130 changes: 17 additions & 113 deletions api/messages/messages_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -1073,7 +1073,7 @@ def update_npo(json):
return Message("NPO not found", status="error")

@limits(calls=100, period=ONE_MINUTE)
def single_add_volunteer(event_id, json, propel_id):
def single_add_volunteer(event_id, json, volunteer_type, propel_id):
db = get_db()
logger.info("Single Add Volunteer")
logger.info("JSON: " + str(json))
Expand All @@ -1082,143 +1082,47 @@ def single_add_volunteer(event_id, json, propel_id):
# Since we know this user is an admin, prefix all vars with admin_
admin_email, admin_user_id, admin_last_login, admin_profile_image, admin_name, admin_nickname = get_propel_user_details_by_id(propel_id)

# Rename json["type"] to volunteer_type
if "type" in json:
json["volunteer_type"] = json["type"]
del json["type"]
if volunteer_type not in ["mentor", "volunteer", "judge"]:
return Message (
"Error: Must be volunteer, mentor, judge"
)


json["volunteer_type"] = volunteer_type
json["event_id"] = event_id
name = json["name"]


# Add created_by and created_timestamp
json["created_by"] = admin_name
json["created_timestamp"] = datetime.now().isoformat()

fields_that_should_always_be_present = ["name", "timestamp"]

logger.info(f"Checking to see if person {name} is already in DB for event: {event_id}")
# We don't want to add the same name for the same event_id, so check that first
doc = db.collection('volunteers').where("event_id", "==", event_id).where("name", "==", json["name"]).stream()
doc = db.collection('volunteers').where("event_id", "==", event_id).where("name", "==", name).stream()
# If we don't have a duplicate, then return
if len(list(doc)) > 0:
logger.warning("Volunteer already exists")
return Message("Volunteer already exists")

logger.info(f"Checking to see if the event_id '{event_id}' provided exists")
# Query for event_id column in hackathons to ensure it exists
doc = db.collection('hackathons').where("event_id", "==", event_id).stream()
# If we don't find the event, return
if len(list(doc)) == 0:
logger.warning("No hackathon found")
return Message("No Hackathon Found")

logger.info(f"Looks good! Adding to volunteers collection JSON: {json}")
# Add the volunteer
doc = db.collection('volunteers').add(json)

return Message(
"Added Hackathon Volunteer"
)

@limits(calls=100, period=ONE_MINUTE)
def bulk_add_volunteers(event_id, json, propel_id):
db = get_db()
logger.info("Bulk Add Volunteers")
logger.info("JSON: " + str(json))
send_slack_audit(action="bulk_add_volunteers", message="Adding", payload=json)

# Since we know this user is an admin, prefix all vars with admin_
admin_email, admin_user_id, admin_last_login, admin_profile_image, admin_name, admin_nickname = get_propel_user_details_by_id(propel_id)

# Query for event_id column
doc = db.collection('hackathons').where("event_id", "==", event_id).stream()
doc = list(doc)
doc = doc[0] if len(doc) > 0 else None

# Convert from DocumentSnapshot to DocumentReference
if isinstance(doc, firestore.DocumentSnapshot):
doc = doc.reference

# If we don't find the event, return
if doc is None:
return Message("No Hackathon Found")

volunteer_type = json["type"]
volunteers = json["volunteers"]
# We will use timestamp and name to find the volunteer

if volunteer_type == "mentors":
logger.info("Adding Mentors")
# Get the mentor block
mentor_block = doc.get().to_dict()["mentors"]
# Add the new mentors
for mentor in volunteers:
# Do some sanity checks
if "name" not in mentor:
logger.info("Skipping mentor with no name")
continue
if "timestamp" not in mentor:
logger.info("Skipping mentor with no timestamp")
continue
if mentor["name"] == "" or mentor["timestamp"] == "":
logger.info("Skipping mentor with empty name, timestamp or email")
continue

mentor["created_by"] = admin_name
mentor["created_timestamp"] = datetime.now().isoformat()
mentor_block.append(mentor)
# Update the mentor block with the new mentors
doc.update({
"mentors": mentor_block
})
elif volunteer_type == "judges":
logger.info("Adding Judges")
# Get the judge block
judge_block = doc.get().to_dict()["judges"]
# Add the new judges
for judge in volunteers:
# Do some sanity checks
if "name" not in judge:
logger.info("Skipping judge with no name")
continue
if "timestamp" not in judge:
logger.info("Skipping judge with no timestamp")
continue
if judge["name"] == "" or judge["timestamp"] == "":
logger.info("Skipping judge with empty name, timestamp")
continue

judge["created_by"] = admin_name
judge["created_timestamp"] = datetime.now().isoformat()
judge_block.append(judge)
# Update the judge block with the new judges
doc.update({
"judges": judge_block
})
elif volunteer_type == "volunteers":
logger.info("Adding Volunteers")
# Get the volunteer block
volunteer_block = doc.get().to_dict()["volunteers"]
# Add the new volunteers
for volunteer in volunteers:
# Do some sanity checks
if "name" not in volunteer:
logger.info("Skipping volunteer with no name")
continue
if "timestamp" not in volunteer:
logger.info("Skipping volunteer with no timestamp")
continue
if volunteer["name"] == "" or volunteer["timestamp"] == "":
logger.info("Skipping volunteer with empty name, timestamp")
continue

volunteer["created_by"] = admin_name
volunteer["created_timestamp"] = datetime.now().isoformat()
volunteer_block.append(volunteer)
# Update the volunteer block with the new volunteers
doc.update({
"volunteers": volunteer_block
})

# Clear cache
get_single_hackathon_event.cache_clear()

return Message(
"Added Hackathon Volunteers"
)


@limits(calls=50, period=ONE_MINUTE)
def update_hackathon_volunteers(event_id, volunteer_type, json, propel_id):
Expand Down
39 changes: 24 additions & 15 deletions api/messages/messages_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@
remove_npo,
get_npo_list,
get_single_npo,
get_single_hackathon_event,
bulk_add_volunteers,
get_single_hackathon_event,
single_add_volunteer,
get_single_hackathon_id,
save_hackathon,
Expand Down Expand Up @@ -149,19 +148,7 @@ def add_hackathon():
return vars(save_hackathon(request.get_json()))


@bp.route("/hackathon/<event_id>/volunteers/bulk", methods=["POST"])
@auth.require_user
@auth.require_org_member_with_permission("volunteer.admin", req_to_org_id=getOrgId)
def add_bulk_volunteers(event_id):
if auth_user and auth_user.user_id:
return vars(bulk_add_volunteers(event_id, request.get_json(), auth_user.user_id))

@bp.route("/hackathon/<event_id>/volunteers", methods=["POST"])
@auth.require_user
@auth.require_org_member_with_permission("volunteer.admin", req_to_org_id=getOrgId)
def add_single_volunteer(event_id):
if auth_user and auth_user.user_id:
return vars(single_add_volunteer(event_id, request.get_json(), auth_user.user_id))


@bp.route("/hackathons", methods=["GET"])
def list_hackathons():
Expand All @@ -174,6 +161,28 @@ def list_hackathons():
return get_hackathon_list() #all


@bp.route("/hackathon/<event_id>/mentor", methods=["POST"])
@auth.require_user
@auth.require_org_member_with_permission("volunteer.admin", req_to_org_id=getOrgId)
def add_single_mentor(event_id):
if auth_user and auth_user.user_id:
return vars(single_add_volunteer(event_id, request.get_json(), "mentor", auth_user.user_id))

@bp.route("/hackathon/<event_id>/judge", methods=["POST"])
@auth.require_user
@auth.require_org_member_with_permission("volunteer.admin", req_to_org_id=getOrgId)
def add_single_judge(event_id):
if auth_user and auth_user.user_id:
return vars(single_add_volunteer(event_id, request.get_json(), "judge", auth_user.user_id))

@bp.route("/hackathon/<event_id>/volunteer", methods=["POST"])
@auth.require_user
@auth.require_org_member_with_permission("volunteer.admin", req_to_org_id=getOrgId)
def add_single_volunteer(event_id):
if auth_user and auth_user.user_id:
return vars(single_add_volunteer(event_id, request.get_json(), "volunteer", auth_user.user_id))


@bp.route("/hackathon/<event_id>", methods=["GET"])
def get_single_hackathon_by_event(event_id):
return (get_single_hackathon_event(event_id))
Expand Down
Loading