forked from indymedia/epicyon
				
			
		
			
				
	
	
		
			125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
| __filename__ = "question.py"
 | |
| __author__ = "Bob Mottram"
 | |
| __license__ = "AGPL3+"
 | |
| __version__ = "1.1.0"
 | |
| __maintainer__ = "Bob Mottram"
 | |
| __email__ = "bob@freedombone.net"
 | |
| __status__ = "Production"
 | |
| 
 | |
| import os
 | |
| from utils import locatePost
 | |
| from utils import loadJson
 | |
| from utils import saveJson
 | |
| 
 | |
| 
 | |
| def questionUpdateVotes(baseDir: str, nickname: str, domain: str,
 | |
|                         replyJson: {}) -> {}:
 | |
|     """ For a given reply update the votes on a question
 | |
|     Returns the question json object if the vote totals were changed
 | |
|     """
 | |
|     if not replyJson.get('object'):
 | |
|         return None
 | |
|     if not isinstance(replyJson['object'], dict):
 | |
|         return None
 | |
|     if not replyJson['object'].get('inReplyTo'):
 | |
|         return None
 | |
|     if not replyJson['object']['inReplyTo']:
 | |
|         return None
 | |
|     if not replyJson['object'].get('name'):
 | |
|         return None
 | |
|     inReplyTo = replyJson['object']['inReplyTo']
 | |
|     questionPostFilename = locatePost(baseDir, nickname, domain, inReplyTo)
 | |
|     if not questionPostFilename:
 | |
|         return None
 | |
|     questionJson = loadJson(questionPostFilename)
 | |
|     if not questionJson:
 | |
|         return None
 | |
|     if not questionJson.get('object'):
 | |
|         return None
 | |
|     if not isinstance(questionJson['object'], dict):
 | |
|         return None
 | |
|     if not questionJson['object'].get('type'):
 | |
|         return None
 | |
|     if questionJson['type'] != 'Question':
 | |
|         return None
 | |
|     if not questionJson['object'].get('oneOf'):
 | |
|         return None
 | |
|     if not isinstance(questionJson['object']['oneOf'], list):
 | |
|         return None
 | |
|     if not questionJson['object'].get('content'):
 | |
|         return None
 | |
|     replyVote = replyJson['object']['name']
 | |
|     # does the reply name field match any possible question option?
 | |
|     foundAnswer = None
 | |
|     for possibleAnswer in questionJson['object']['oneOf']:
 | |
|         if not possibleAnswer.get('name'):
 | |
|             continue
 | |
|         if possibleAnswer['name'] == replyVote:
 | |
|             foundAnswer = possibleAnswer
 | |
|             break
 | |
|     if not foundAnswer:
 | |
|         return None
 | |
|     # update the voters file
 | |
|     votersFileSeparator = ';;;'
 | |
|     votersFilename = questionPostFilename.replace('.json', '.voters')
 | |
|     if not os.path.isfile(votersFilename):
 | |
|         # create a new voters file
 | |
|         votersFile = open(votersFilename, "w")
 | |
|         if votersFile:
 | |
|             votersFile.write(replyJson['actor'] +
 | |
|                              votersFileSeparator +
 | |
|                              foundAnswer + '\n')
 | |
|             votersFile.close()
 | |
|     else:
 | |
|         if replyJson['actor'] not in open(votersFilename).read():
 | |
|             # append to the voters file
 | |
|             votersFile = open(votersFilename, "a+")
 | |
|             if votersFile:
 | |
|                 votersFile.write(replyJson['actor'] +
 | |
|                                  votersFileSeparator +
 | |
|                                  foundAnswer + '\n')
 | |
|                 votersFile.close()
 | |
|         else:
 | |
|             # change an entry in the voters file
 | |
|             with open(votersFilename, "r") as votersFile:
 | |
|                 lines = votersFile.readlines()
 | |
|                 newlines = []
 | |
|                 saveVotersFile = False
 | |
|                 for voteLine in lines:
 | |
|                     if voteLine.startswith(replyJson['actor'] +
 | |
|                                            votersFileSeparator):
 | |
|                         newVoteLine = replyJson['actor'] + \
 | |
|                             votersFileSeparator + foundAnswer + '\n'
 | |
|                         if voteLine == newVoteLine:
 | |
|                             break
 | |
|                         saveVotersFile = True
 | |
|                         newlines.append(newVoteLine)
 | |
|                     else:
 | |
|                         newlines.append(voteLine)
 | |
|                 if saveVotersFile:
 | |
|                     with open(votersFilename, "w") as votersFile:
 | |
|                         for voteLine in newlines:
 | |
|                             votersFile.write(voteLine)
 | |
|                 else:
 | |
|                     return None
 | |
|     # update the vote counts
 | |
|     questionTotalsChanged = False
 | |
|     for possibleAnswer in questionJson['object']['oneOf']:
 | |
|         if not possibleAnswer.get('name'):
 | |
|             continue
 | |
|         totalItems = 0
 | |
|         with open(votersFilename, "r") as votersFile:
 | |
|             lines = votersFile.readlines()
 | |
|             for voteLine in lines:
 | |
|                 if voteLine.endswith(votersFileSeparator +
 | |
|                                      possibleAnswer['name'] + '\n'):
 | |
|                     totalItems += 1
 | |
|         if possibleAnswer['replies']['totalItems'] != totalItems:
 | |
|             possibleAnswer['replies']['totalItems'] = totalItems
 | |
|             questionTotalsChanged = True
 | |
|     if not questionTotalsChanged:
 | |
|         return None
 | |
|     # save the question with altered totals
 | |
|     saveJson(questionJson, questionPostFilename)
 | |
|     return questionJson
 |