diff --git a/compendium_v2/routes/survey.py b/compendium_v2/routes/survey.py index c96fd31ab14e6fd2545325a66205360a1553cfe7..73cc56b21c532f63b4c1c91566c55da085d0e9a5 100644 --- a/compendium_v2/routes/survey.py +++ b/compendium_v2/routes/survey.py @@ -116,16 +116,11 @@ def list_surveys() -> Any: ).order_by(Survey.year.desc()) ).unique() - def response_key(response): - return response.status.value + response.nren.name.lower() - class SurveyDict(TypedDict): year: int status: str responses: List[Dict[str, Any]] - entries: List[SurveyDict] = [] - def _get_response(response: SurveyResponse) -> Dict[str, Any]: res = { "nren": { @@ -136,42 +131,43 @@ def list_surveys() -> Any: "lock_description": response.lock_description, "notes": response.notes.notes if response.notes else "" } - if current_user.is_observer: - res["lock_description"] = response.lock_description return res - for entry in surveys: - # only include lock description if the user is an admin - entries.append( - { - "year": entry.year, - "status": entry.status.value, - "responses": [_get_response(r) for r in sorted(entry.responses, key=response_key)] - }) + def sort_key(response: SurveyResponse): + return response.status.value + response.nren.name.lower() + all_nrens = db.session.scalars(select(NREN)).all() nrens = {nren.name: nren.id for nren in all_nrens} nren_names = set(nrens.keys()) - for survey_dict in entries: - # add in nrens without a response if the survey is open - if survey_dict["status"] == SurveyStatus.open.value: - nrens_with_responses = set([r["nren"]['name'] for r in survey_dict["responses"]]) - for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower): - survey_dict["responses"].append( - {"nren": { - 'name': nren_name, - 'id': nrens[nren_name] - }, "status": RESPONSE_NOT_STARTED, "lock_description": ""}) - # add in nrens without a response if the survey is closed - if survey_dict["status"] in [SurveyStatus.closed.value, SurveyStatus.published.value]: - nrens_with_responses = set([r["nren"]['name'] for r in survey_dict["responses"]]) - for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower): - survey_dict["responses"].append( - {"nren": { + + all_surveys: List[SurveyDict] = [] + + for survey in surveys: + status = survey.status + responses = [_get_response(r) for r in sorted(survey.responses, key=sort_key)] + survey_dict: SurveyDict = { + "year": survey.year, + "status": status.value, + "responses": responses + } + + if status in [SurveyStatus.open, SurveyStatus.closed, SurveyStatus.published]: + # add in nrens without a response and set a custom response status depending on the survey status + nrens_with_responses = set([r["nren"]["name"] for r in survey_dict["responses"]]) + missing_responses = nren_names.difference(nrens_with_responses) + for nren_name in sorted(missing_responses, key=str.lower): + responses.append({ + "status": RESPONSE_NOT_STARTED if status == SurveyStatus.open else RESPONSE_NOT_COMPLETED, + "lock_description": "", + "nren": { 'name': nren_name, 'id': nrens[nren_name] - }, "status": RESPONSE_NOT_COMPLETED, "lock_description": ""}) + }, + }) + + all_surveys.append(survey_dict) - return entries + return all_surveys @routes.route('/new', methods=['POST'])