Merge pull request #112 from ThomasRubini/questions
This commit is contained in:
		
						commit
						d951660bed
					
				| @ -1,4 +1,5 @@ | ||||
| import flask | ||||
| from sqlalchemy import select, or_ | ||||
| 
 | ||||
| from truthinquiry.ext.database.models import * | ||||
| from truthinquiry.ext.database.fsa import db | ||||
| @ -33,7 +34,29 @@ def npc(npc_id): | ||||
| 
 | ||||
| @routes_admin.route("/questions") | ||||
| def questions(): | ||||
|     return flask.render_template("admin/questions.html", langs=["FR", "EN"]) | ||||
|     lang = "FR" | ||||
| 
 | ||||
|     results = db.session.execute( | ||||
|         select(QuestionType, Text) | ||||
|         .select_from(QuestionType) | ||||
|         .join(Locale) | ||||
|         .join(Text, isouter=True) | ||||
|         .filter(or_(Text.LANG==None, Text.LANG==lang)) | ||||
|         .order_by(QuestionType.QUESTION_TYPE_ID) | ||||
|     ) | ||||
| 
 | ||||
|     data = [] | ||||
|     old_question_type_id = None | ||||
| 
 | ||||
|     for question_type, locale in results: | ||||
|         if question_type.QUESTION_TYPE_ID != old_question_type_id: | ||||
|             old_question_type_id = question_type.QUESTION_TYPE_ID | ||||
|             data.append({"questions": []}) | ||||
| 
 | ||||
|         if locale: | ||||
|             data[-1]["questions"].append({"text": locale.TEXT}) | ||||
|      | ||||
|     return flask.render_template("admin/questions.html", questions=data, langs=["FR", "EN"]) | ||||
| 
 | ||||
| @routes_admin.route("/places") | ||||
| def places(): | ||||
|  | ||||
| @ -7,41 +7,12 @@ from truthinquiry.ext.database.fsa import db | ||||
| 
 | ||||
| routes_api_admin = flask.Blueprint("api_admin", __name__) | ||||
| 
 | ||||
| @routes_api_admin.route("/getQuestions", methods=["GET", "POST"]) | ||||
| def get_questions(): | ||||
|     lang = flask.request.values.get("lang") | ||||
|     if lang is None: | ||||
|         return {"error": 1, "msg": "lang not set"} | ||||
| 
 | ||||
| 
 | ||||
|     results = db.session.execute( | ||||
|         select(QuestionType, Text) | ||||
|         .select_from(QuestionType) | ||||
|         .join(Locale) | ||||
|         .join(Text, isouter=True) | ||||
|         .filter(or_(Text.LANG==None, Text.LANG==lang)) | ||||
|         .order_by(QuestionType.QUESTION_TYPE_ID) | ||||
|     ) | ||||
| 
 | ||||
|     data = [] | ||||
|     old_question_type_id = None | ||||
| 
 | ||||
|     for question_type, locale in results: | ||||
|         if question_type.QUESTION_TYPE_ID != old_question_type_id: | ||||
|             old_question_type_id = question_type.QUESTION_TYPE_ID | ||||
|             data.append([]) | ||||
| 
 | ||||
|         if locale: | ||||
|             data[-1].append({"text": locale.TEXT}) | ||||
|      | ||||
|     return data | ||||
| 
 | ||||
| @routes_api_admin.route("/setQuestions", methods=["GET", "POST"]) | ||||
| def set_questions(): | ||||
|     if not flask.request.json: | ||||
|         return {"error": 1, "msg": "no json set"} | ||||
|     lang = flask.request.json["lang"] | ||||
|     question_types = flask.request.json["questions"] | ||||
|     all_questions = flask.request.json["questions"] | ||||
| 
 | ||||
|     # Delete old questions | ||||
|     text_ids_requ = ( | ||||
| @ -63,8 +34,8 @@ def set_questions(): | ||||
| 
 | ||||
|     # set new questions  | ||||
|     text_obs = [] | ||||
|     for question_lid, questions in zip(question_lids, question_types): | ||||
|         for question in questions: | ||||
|     for question_lid, questionType in zip(question_lids, all_questions): | ||||
|         for question in questionType["questions"]: | ||||
|             text_obs.append(Text(None, question_lid, lang, question["text"])) | ||||
| 
 | ||||
|     db.session.add_all(text_obs) | ||||
|  | ||||
| @ -19,7 +19,7 @@ | ||||
|         <input value="{{place['name']}}"> | ||||
|         <button onclick="deletePlace(this)">Delete place</button> | ||||
|     </section> | ||||
| {%endfor%} | ||||
|     {%endfor%} | ||||
| </section> | ||||
| <button onclick="addNewInput()">Add new</button> | ||||
| <button onclick="saveForm()">Save changes</button> | ||||
|  | ||||
| @ -1,24 +1,40 @@ | ||||
| <a href="/admin"> go Back </a> <br> | ||||
| 
 | ||||
| <select id="langs" onchange="langChangedEvent()"> | ||||
| <select id="langs" onchange="changeLang()"> | ||||
|     {%for lang in langs%} | ||||
|     <option value="{{lang}}">{{lang}}</option> | ||||
|     {%endfor%} | ||||
| </select> | ||||
| 
 | ||||
| 
 | ||||
| <form id="questionsTag" action="javascript:void(0);"> | ||||
| </form> | ||||
| <section id="allQuestions"> | ||||
|     {%for questionType in questions%} | ||||
|     <div class="questionType"> | ||||
|         <section class="questionTypeContent"> | ||||
|             {%for question in questionType["questions"]%} | ||||
|             <section class="question"> | ||||
|                 <input value="{{question['text']}}"> | ||||
|                 <button onclick="deleteEntry(this)">Delete question</button> | ||||
|             </section> | ||||
|             {%endfor%} | ||||
|         </section> | ||||
|         <button onclick="addEntry(this)">Add new</button> | ||||
|     </div> | ||||
|     {%endfor%} | ||||
| </section> | ||||
| 
 | ||||
| <br> | ||||
| 
 | ||||
| <button onclick="saveForm()"> Save changes </button> | ||||
| 
 | ||||
| <style> | ||||
|     .questionTypeTag{ | ||||
|     .questionType{ | ||||
|         border: thin solid red; | ||||
|         margin-top: 20px; | ||||
|     } | ||||
|     .questionTypeTag input{ | ||||
|     .question input{ | ||||
|         width: 100%; | ||||
|         margin: 10px; | ||||
|     } | ||||
| </style> | ||||
| 
 | ||||
| @ -26,69 +42,37 @@ | ||||
| <script> | ||||
| 
 | ||||
| 
 | ||||
|     let lang = null; | ||||
|     function addEntry(button){ | ||||
|         let questionTypeContent = button.parentNode.querySelector(".questionTypeContent"); | ||||
|         let newQuestion = questionTypeContent.querySelector(".question").cloneNode(true); | ||||
|         newQuestion.id = ""; | ||||
|         newQuestion.querySelector("input").value = ""; | ||||
|         questionTypeContent.appendChild(newQuestion); | ||||
|     } | ||||
| 
 | ||||
|     function deleteEntry(buttonNode){ | ||||
|         let placeNode = buttonNode.parentNode; | ||||
|         placeNode.parentNode.removeChild(placeNode); | ||||
|     } | ||||
| 
 | ||||
|     function saveForm(){ | ||||
|         var formData = new FormData(questionsTag); | ||||
|         let questionsJson = []; | ||||
|         let data = []; | ||||
| 
 | ||||
|         for(let questionTypeTag of questionsTag.querySelectorAll("fieldset")){ | ||||
|             let questionTypeJson = []; | ||||
|             questionsJson.push(questionTypeJson); | ||||
|         for(let questionTypeNode of allQuestions.querySelectorAll(".questionType")){ | ||||
|             let questionsJson = []; | ||||
|             let questionTypeJson = {"questions": questionsJson}; | ||||
|             data.push(questionTypeJson); | ||||
| 
 | ||||
|             for(let questionTag of questionTypeTag.children){ | ||||
|                 questionTypeJson.push({"text": questionTag.value}) | ||||
|             for(let questionNode of questionTypeNode.querySelectorAll("input")){ | ||||
|                 questionsJson.push({"text": questionNode.value}) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if(lang!==null){ | ||||
|             makeAPIRequest("admin/setQuestions", {"questions": questionsJson, "lang": lang}, {"content": "json"}) | ||||
|         } | ||||
|         makeAPIRequest("admin/setQuestions", {"questions": data, "lang": "FR"}, {"content": "json"}) | ||||
|     } | ||||
| 
 | ||||
|     let lastQueriedData = []; | ||||
|     function changeLang(){ | ||||
| 
 | ||||
|     async function changeLang(newLang){ | ||||
|         lang = null; | ||||
| 
 | ||||
|         console.log("Changing language to "+newLang); | ||||
|         resp = await makeAPIRequest("admin/getQuestions", {"lang": newLang}); | ||||
| 
 | ||||
|         questionsTag.innerHTML = ''; | ||||
| 
 | ||||
|         for(let questionType of resp){ | ||||
|              | ||||
|             let questionTypeTag = document.createElement("fieldset") | ||||
|             questionTypeTag.className = 'questionTypeTag'; | ||||
|             questionsTag.appendChild(questionTypeTag); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|             function addNewInput(value=""){ | ||||
|                 let questionTag = document.createElement("input"); | ||||
|                 questionTypeTag.appendChild(questionTag); | ||||
| 
 | ||||
|                 questionTag.value = value; | ||||
|             } | ||||
|              | ||||
|             for(let question of questionType){ | ||||
|                 addNewInput(question.text); | ||||
|             } | ||||
|              | ||||
|             let addNewTag = document.createElement("input") | ||||
|             addNewTag.type = 'button' | ||||
|             addNewTag.value = "Add new"; | ||||
|             addNewTag.onclick = () => addNewInput(); | ||||
|             questionsTag.appendChild(addNewTag); | ||||
|         } | ||||
| 
 | ||||
|         lang = newLang; | ||||
|     } | ||||
| 
 | ||||
|     function langChangedEvent(){ | ||||
|         changeLang(langs.value) | ||||
|     } | ||||
| 
 | ||||
|     changeLang(langs.value); | ||||
| 
 | ||||
| </script> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user