| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | __filename__ = "webapp_question.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							| 
									
										
										
										
											2021-01-26 10:07:42 +00:00
										 |  |  | __version__ = "1.2.0" | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							| 
									
										
										
										
											2021-09-10 16:14:50 +00:00
										 |  |  | __email__ = "bob@libreserver.org" | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | __status__ = "Production" | 
					
						
							| 
									
										
										
										
											2021-06-15 15:08:12 +00:00
										 |  |  | __module_group__ = "Web Interface" | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | from question import isQuestion | 
					
						
							|  |  |  | from utils import removeIdEnding | 
					
						
							| 
									
										
										
										
											2021-07-13 21:59:53 +00:00
										 |  |  | from utils import acctDir | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def insertQuestion(baseDir: str, translate: {}, | 
					
						
							|  |  |  |                    nickname: str, domain: str, port: int, | 
					
						
							|  |  |  |                    content: str, | 
					
						
							|  |  |  |                    postJsonObject: {}, pageNumber: int) -> str: | 
					
						
							|  |  |  |     """ Inserts question selection into a post
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not isQuestion(postJsonObject): | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  |     if len(postJsonObject['object']['oneOf']) == 0: | 
					
						
							|  |  |  |         return content | 
					
						
							|  |  |  |     messageId = removeIdEnding(postJsonObject['id']) | 
					
						
							|  |  |  |     if '#' in messageId: | 
					
						
							|  |  |  |         messageId = messageId.split('#', 1)[0] | 
					
						
							|  |  |  |     pageNumberStr = '' | 
					
						
							|  |  |  |     if pageNumber: | 
					
						
							|  |  |  |         pageNumberStr = '?page=' + str(pageNumber) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     votesFilename = \ | 
					
						
							| 
									
										
										
										
											2021-07-13 21:59:53 +00:00
										 |  |  |         acctDir(baseDir, nickname, domain) + '/questions.txt' | 
					
						
							| 
									
										
										
										
											2020-11-09 19:41:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     showQuestionResults = False | 
					
						
							|  |  |  |     if os.path.isfile(votesFilename): | 
					
						
							|  |  |  |         if messageId in open(votesFilename).read(): | 
					
						
							|  |  |  |             showQuestionResults = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not showQuestionResults: | 
					
						
							|  |  |  |         # show the question options | 
					
						
							|  |  |  |         content += '<div class="question">' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<form method="POST" action="/users/' + \ | 
					
						
							|  |  |  |             nickname + '/question' + pageNumberStr + '">\n' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<input type="hidden" name="messageId" value="' + \ | 
					
						
							|  |  |  |             messageId + '">\n<br>\n' | 
					
						
							|  |  |  |         for choice in postJsonObject['object']['oneOf']: | 
					
						
							|  |  |  |             if not choice.get('type'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not choice.get('name'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             content += \ | 
					
						
							|  |  |  |                 '<input type="radio" name="answer" value="' + \ | 
					
						
							|  |  |  |                 choice['name'] + '"> ' + choice['name'] + '<br><br>\n' | 
					
						
							|  |  |  |         content += \ | 
					
						
							|  |  |  |             '<input type="submit" value="' + \ | 
					
						
							|  |  |  |             translate['Vote'] + '" class="vote"><br><br>\n' | 
					
						
							|  |  |  |         content += '</form>\n</div>\n' | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         # show the responses to a question | 
					
						
							|  |  |  |         content += '<div class="questionresult">\n' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # get the maximum number of votes | 
					
						
							|  |  |  |         maxVotes = 1 | 
					
						
							|  |  |  |         for questionOption in postJsonObject['object']['oneOf']: | 
					
						
							|  |  |  |             if not questionOption.get('name'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not questionOption.get('replies'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             votes = 0 | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 votes = int(questionOption['replies']['totalItems']) | 
					
						
							|  |  |  |             except BaseException: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             if votes > maxVotes: | 
					
						
							|  |  |  |                 maxVotes = int(votes+1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # show the votes as sliders | 
					
						
							|  |  |  |         questionCtr = 1 | 
					
						
							|  |  |  |         for questionOption in postJsonObject['object']['oneOf']: | 
					
						
							|  |  |  |             if not questionOption.get('name'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if not questionOption.get('replies'): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             votes = 0 | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 votes = int(questionOption['replies']['totalItems']) | 
					
						
							|  |  |  |             except BaseException: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             votesPercent = str(int(votes * 100 / maxVotes)) | 
					
						
							|  |  |  |             content += \ | 
					
						
							|  |  |  |                 '<p><input type="text" title="' + str(votes) + \ | 
					
						
							|  |  |  |                 '" name="skillName' + str(questionCtr) + \ | 
					
						
							|  |  |  |                 '" value="' + questionOption['name'] + \ | 
					
						
							|  |  |  |                 ' (' + str(votes) + ')" style="width:40%">\n' | 
					
						
							|  |  |  |             content += \ | 
					
						
							|  |  |  |                 '<input type="range" min="1" max="100" ' + \ | 
					
						
							|  |  |  |                 'class="slider" title="' + \ | 
					
						
							|  |  |  |                 str(votes) + '" name="skillValue' + str(questionCtr) + \ | 
					
						
							|  |  |  |                 '" value="' + votesPercent + '"></p>\n' | 
					
						
							|  |  |  |             questionCtr += 1 | 
					
						
							|  |  |  |         content += '</div>\n' | 
					
						
							|  |  |  |     return content |