Skip to content
Snippets Groups Projects
Commit 2ec8eb29 authored by Remco Tukker's avatar Remco Tukker
Browse files

make lock admin work on the survey admin page

parent 2ded73ee
No related branches found
No related tags found
1 merge request!57Feature/survey locking system
...@@ -13,6 +13,7 @@ from compendium_v2.routes.policy import routes as policy ...@@ -13,6 +13,7 @@ from compendium_v2.routes.policy import routes as policy
from compendium_v2.routes.survey import routes as survey from compendium_v2.routes.survey import routes as survey
from compendium_v2.routes.user import routes as user_routes from compendium_v2.routes.user import routes as user_routes
from compendium_v2.routes.nren import routes as nren_routes from compendium_v2.routes.nren import routes as nren_routes
from compendium_v2.routes.response import routes as response_routes
routes = Blueprint('compendium-v2-api', __name__) routes = Blueprint('compendium-v2-api', __name__)
routes.register_blueprint(budget_routes, url_prefix='/budget') routes.register_blueprint(budget_routes, url_prefix='/budget')
...@@ -25,6 +26,7 @@ routes.register_blueprint(policy, url_prefix='/policy') ...@@ -25,6 +26,7 @@ routes.register_blueprint(policy, url_prefix='/policy')
routes.register_blueprint(survey, url_prefix='/survey') routes.register_blueprint(survey, url_prefix='/survey')
routes.register_blueprint(user_routes, url_prefix='/user') routes.register_blueprint(user_routes, url_prefix='/user')
routes.register_blueprint(nren_routes, url_prefix='/nren') routes.register_blueprint(nren_routes, url_prefix='/nren')
routes.register_blueprint(response_routes, url_prefix='/response')
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
......
...@@ -73,12 +73,21 @@ def list_surveys() -> Any: ...@@ -73,12 +73,21 @@ def list_surveys() -> Any:
status: str status: str
responses: List[Dict[str, str]] responses: List[Dict[str, str]]
def make_lock_description(locked_user):
if locked_user:
return f"Locked by: {locked_user.fullname} ({locked_user.email})"
return ""
entries: List[SurveyDict] = [ entries: List[SurveyDict] = [
{ {
"year": entry.year, "year": entry.year,
"status": entry.status.value, "status": entry.status.value,
"responses": [ "responses": [
{"nren": r.nren.name, "status": r.status.value} {
"nren": r.nren.name,
"status": r.status.value,
"lock_description": make_lock_description(r.locked_by_user)
}
for r in sorted(entry.responses, key=response_key) for r in sorted(entry.responses, key=response_key)
] ]
} }
...@@ -92,7 +101,7 @@ def list_surveys() -> Any: ...@@ -92,7 +101,7 @@ def list_surveys() -> Any:
continue continue
nrens_with_responses = set([r["nren"] for r in entry["responses"]]) nrens_with_responses = set([r["nren"] for r in entry["responses"]])
for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower): for nren_name in sorted(nren_names.difference(nrens_with_responses), key=str.lower):
entry["responses"].append({"nren": nren_name, "status": "not started"}) entry["responses"].append({"nren": nren_name, "status": "not started", "lock_description": ""})
return entries return entries
......
...@@ -19,7 +19,7 @@ function App(): ReactElement { ...@@ -19,7 +19,7 @@ function App(): ReactElement {
<Route path="survey/admin/users" element={<UserManagementComponent />} /> <Route path="survey/admin/users" element={<UserManagementComponent />} />
<Route path="survey/admin/inspect/:year" element={<SurveyContainerComponent loadFrom={'/api/response/inspect/'} />} /> <Route path="survey/admin/inspect/:year" element={<SurveyContainerComponent loadFrom={'/api/response/inspect/'} />} />
<Route path="survey/admin/try/:year" element={<SurveyContainerComponent loadFrom={'/api/response/try/'} />} /> <Route path="survey/admin/try/:year" element={<SurveyContainerComponent loadFrom={'/api/response/try/'} />} />
<Route path="survey/respond/:year/:nren" element={<SurveyContainerComponent loadFrom={'/api/response/load/'} saveTo={'/api/response/save/'} />} /> <Route path="survey/response/:year/:nren" element={<SurveyContainerComponent loadFrom={'/api/response/load/'} saveTo={'/api/response/save/'} />} />
<Route path="*" element={<Landing />} /> <Route path="*" element={<Landing />} />
</Routes> </Routes>
</UserProvider> </UserProvider>
......
...@@ -155,7 +155,7 @@ function SurveyContainerComponent({ loadFrom, saveTo = '' }) { ...@@ -155,7 +155,7 @@ function SurveyContainerComponent({ loadFrom, saveTo = '' }) {
removeEventListener("pagehide", pageHideListener); removeEventListener("pagehide", pageHideListener);
break; break;
case 'startEdit': { case 'startEdit': {
const response = await fetch('/api/survey/lock/' + year + '/' + nren, {method: "POST"}); const response = await fetch('/api/response/lock/' + year + '/' + nren, {method: "POST"});
const json = await response.json(); const json = await response.json();
console.log(json); console.log(json);
lockUUID.current = json.lock_uuid; lockUUID.current = json.lock_uuid;
......
...@@ -19,6 +19,7 @@ async function fetchSurveys(): Promise<Survey[]> { ...@@ -19,6 +19,7 @@ async function fetchSurveys(): Promise<Survey[]> {
interface Response { interface Response {
nren: string nren: string
status: string status: string
lock_description: string
} }
interface Survey { interface Survey {
...@@ -50,7 +51,14 @@ function SurveyManagementComponent() { ...@@ -50,7 +51,14 @@ function SurveyManagementComponent() {
}); });
} }
const newSurveyAllowed = surveys.every(s => s.status == 'published'); async function removeLock(year, nrenName) {
await fetch('/api/response/unlock/' + year + '/' + nrenName, { method: 'POST' });
fetchSurveys().then((surveyList) => {
setSurveys(surveyList);
});
}
const newSurveyAllowed = surveys.length > 0 && surveys.every(s => s.status == 'published');
const navigate = useNavigate(); const navigate = useNavigate();
...@@ -96,14 +104,16 @@ function SurveyManagementComponent() { ...@@ -96,14 +104,16 @@ function SurveyManagementComponent() {
<tr key={response.nren}> <tr key={response.nren}>
<td>{response.nren}</td> <td>{response.nren}</td>
<td>{response.status}</td> <td>{response.status}</td>
<td>locked by</td> <td>{response.lock_description}</td>
<td> <td>
<Button onClick={() => navigate(`/survey/respond/${survey.year}/${response.nren}`)} style={{ pointerEvents: 'auto' }} <Button onClick={() => navigate(`/survey/response/${survey.year}/${response.nren}`)} style={{ pointerEvents: 'auto' }}
title="Open the responses of the NREN."> title="Open the responses of the NREN.">
open open
</Button> </Button>
<Button onClick={() => removeLock(survey.year, response.nren)} disabled={response.lock_description == ''} style={{ pointerEvents: 'auto' }}
remove lock (only available when locked) title="Remove the lock from the survey so that another person can open the survey for editing. WARNING: The person that currently has the lock will not be abe to save their changes anymore once someone else starts editing!">
remove lock
</Button>
</td> </td>
</tr> </tr>
))} ))}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment