Skip to content
Snippets Groups Projects
Commit b80e9326 authored by Bjarke Madsen's avatar Bjarke Madsen
Browse files

simplify /survey/list api

parent 4eb77948
Branches
Tags
No related merge requests found
...@@ -116,16 +116,11 @@ def list_surveys() -> Any: ...@@ -116,16 +116,11 @@ def list_surveys() -> Any:
).order_by(Survey.year.desc()) ).order_by(Survey.year.desc())
).unique() ).unique()
def response_key(response):
return response.status.value + response.nren.name.lower()
class SurveyDict(TypedDict): class SurveyDict(TypedDict):
year: int year: int
status: str status: str
responses: List[Dict[str, Any]] responses: List[Dict[str, Any]]
entries: List[SurveyDict] = []
def _get_response(response: SurveyResponse) -> Dict[str, Any]: def _get_response(response: SurveyResponse) -> Dict[str, Any]:
res = { res = {
"nren": { "nren": {
...@@ -136,42 +131,43 @@ def list_surveys() -> Any: ...@@ -136,42 +131,43 @@ def list_surveys() -> Any:
"lock_description": response.lock_description, "lock_description": response.lock_description,
"notes": response.notes.notes if response.notes else "" "notes": response.notes.notes if response.notes else ""
} }
if current_user.is_observer:
res["lock_description"] = response.lock_description
return res return res
for entry in surveys: def sort_key(response: SurveyResponse):
# only include lock description if the user is an admin return response.status.value + response.nren.name.lower()
entries.append(
{
"year": entry.year,
"status": entry.status.value,
"responses": [_get_response(r) for r in sorted(entry.responses, key=response_key)]
})
all_nrens = db.session.scalars(select(NREN)).all() all_nrens = db.session.scalars(select(NREN)).all()
nrens = {nren.name: nren.id for nren in all_nrens} nrens = {nren.name: nren.id for nren in all_nrens}
nren_names = set(nrens.keys()) nren_names = set(nrens.keys())
for survey_dict in entries:
# add in nrens without a response if the survey is open all_surveys: List[SurveyDict] = []
if survey_dict["status"] == SurveyStatus.open.value:
nrens_with_responses = set([r["nren"]['name'] for r in survey_dict["responses"]]) for survey in surveys:
for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower): status = survey.status
survey_dict["responses"].append( responses = [_get_response(r) for r in sorted(survey.responses, key=sort_key)]
{"nren": { survey_dict: SurveyDict = {
'name': nren_name, "year": survey.year,
'id': nrens[nren_name] "status": status.value,
}, "status": RESPONSE_NOT_STARTED, "lock_description": ""}) "responses": responses
# 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"]]) if status in [SurveyStatus.open, SurveyStatus.closed, SurveyStatus.published]:
for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower): # add in nrens without a response and set a custom response status depending on the survey status
survey_dict["responses"].append( nrens_with_responses = set([r["nren"]["name"] for r in survey_dict["responses"]])
{"nren": { 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, 'name': nren_name,
'id': nrens[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']) @routes.route('/new', methods=['POST'])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment