Author: humbedooh
Date: Wed Mar 25 16:17:30 2015
New Revision: 1669142
URL: http://svn.apache.org/r1669142
Log:
Allow for other ways of fetching vote data in the future (ElasticSearch
anyone??)
Modified:
steve/trunk/pysteve/lib/election.py
steve/trunk/pysteve/lib/voter.py
steve/trunk/pysteve/steve.cfg
Modified: steve/trunk/pysteve/lib/election.py
URL:
http://svn.apache.org/viewvc/steve/trunk/pysteve/lib/election.py?rev=1669142&r1=1669141&r2=1669142&view=diff
==============================================================================
--- steve/trunk/pysteve/lib/election.py (original)
+++ steve/trunk/pysteve/lib/election.py Wed Mar 25 16:17:30 2015
@@ -27,114 +27,125 @@ from plugins import *
def exists(election, *issue):
"Returns True if an election/issue exists, False otherwise"
- elpath = os.path.join(homedir, "issues", election)
- if issue:
- elpath += "/" + issue[0] + ".json"
- return os.path.isfile(elpath)
- else:
- return os.path.isdir(elpath)
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ if issue:
+ elpath += "/" + issue[0] + ".json"
+ return os.path.isfile(elpath)
+ else:
+ return os.path.isdir(elpath)
def getBasedata(election, hideHash=False):
"Get base data from an election"
- elpath = os.path.join(homedir, "issues", election)
- if os.path.isdir(elpath):
- with open(elpath + "/basedata.json", "r") as f:
- data = f.read()
- f.close()
- basedata = json.loads(data)
- if hideHash and 'hash' in basedata:
- del basedata['hash']
- basedata['id'] = election
- return basedata
+
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ if os.path.isdir(elpath):
+ with open(elpath + "/basedata.json", "r") as f:
+ data = f.read()
+ f.close()
+ basedata = json.loads(data)
+ if hideHash and 'hash' in basedata:
+ del basedata['hash']
+ basedata['id'] = election
+ return basedata
return None
def close(election, reopen = False):
"Mark an election as closed"
- elpath = os.path.join(homedir, "issues", election)
- if os.path.isdir(elpath):
- basedata = {}
- with open(elpath + "/basedata.json", "r") as f:
- data = f.read()
- f.close()
- basedata = json.loads(data)
- if reopen:
- basedata['closed'] = False
- else:
- basedata['closed'] = True
- with open(elpath + "/basedata.json", "w") as f:
- f.write(json.dumps(basedata))
- f.close()
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ if os.path.isdir(elpath):
+ basedata = {}
+ with open(elpath + "/basedata.json", "r") as f:
+ data = f.read()
+ f.close()
+ basedata = json.loads(data)
+ if reopen:
+ basedata['closed'] = False
+ else:
+ basedata['closed'] = True
+ with open(elpath + "/basedata.json", "w") as f:
+ f.write(json.dumps(basedata))
+ f.close()
def getIssue(electionID, issueID):
"Get JSON data from an issue"
- issuepath = os.path.join(homedir, "issues", electionID, issueID) +
".json"
issuedata = None
- if os.path.isfile(issuepath):
- ihash = ""
- with open(issuepath, "r") as f:
- data = f.read()
- ihash = hashlib.sha224(data).hexdigest()
- f.close()
- issuedata = json.loads(data)
- issuedata['hash'] = ihash
- issuedata['id'] = issueID
- issuedata['APIURL'] = "https://%s/steve/voter/view/%s/%s" %
(config.get("general", "rooturl"), electionID, issueID)
- issuedata['prettyURL'] = "https://%s/steve/ballot?%s/%s" %
(config.get("general", "rooturl"), electionID, issueID)
-
- # Add vote category for JS magic
- for vtype in constants.VOTE_TYPES:
- if vtype['key'] == issuedata['type']:
- issuedata['category'] = vtype['category']
- break
+ if config.get("database", "dbsys") == "file":
+ issuepath = os.path.join(homedir, "issues", electionID, issueID)
+ ".json"
+ if os.path.isfile(issuepath):
+ ihash = ""
+ with open(issuepath, "r") as f:
+ data = f.read()
+ ihash = hashlib.sha224(data).hexdigest()
+ f.close()
+ issuedata = json.loads(data)
+ issuedata['hash'] = ihash
+ issuedata['id'] = issueID
+ issuedata['APIURL'] = "https://%s/steve/voter/view/%s/%s" %
(config.get("general", "rooturl"), electionID, issueID)
+ issuedata['prettyURL'] = "https://%s/steve/ballot?%s/%s" %
(config.get("general", "rooturl"), electionID, issueID)
+ # Add vote category for JS magic
+ for vtype in constants.VOTE_TYPES:
+ if vtype['key'] == issuedata['type']:
+ issuedata['category'] = vtype['category']
+ break
+
return issuedata
def getVotes(electionID, issueID):
"Read votes from the vote file"
- issuepath = os.path.join(homedir, "issues", electionID, issueID) +
".json.votes"
- issuedata = {}
- if os.path.isfile(issuepath):
- with open(issuepath, "r") as f:
- data = f.read()
- f.close()
- issuedata = json.loads(data)
- return issuedata
+ if config.get("database", "dbsys") == "file":
+ issuepath = os.path.join(homedir, "issues", electionID, issueID)
+ ".json.votes"
+ issuedata = {}
+ if os.path.isfile(issuepath):
+ with open(issuepath, "r") as f:
+ data = f.read()
+ f.close()
+ issuedata = json.loads(data)
+ return issuedata
+ return {}
def createElection(eid, title, owner, monitors, starts, ends, isopen):
- elpath = os.path.join(homedir, "issues", eid)
- os.mkdir(elpath)
- with open(elpath + "/basedata.json", "w") as f:
- f.write(json.dumps({
- 'title': title,
- 'owner': owner,
- 'monitors': monitors,
- 'starts': starts,
- 'ends': ends,
- 'hash': hashlib.sha512("%f-stv-%s" % (time.time(),
os.environ['REMOTE_ADDR'] if 'REMOTE_ADDR' in os.environ else
random.randint(1,99999999999))).hexdigest(),
- 'open': isopen
- }))
- f.close()
- with open(elpath + "/voters.json", "w") as f:
- f.write("{}")
- f.close()
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", eid)
+ os.mkdir(elpath)
+ with open(elpath + "/basedata.json", "w") as f:
+ f.write(json.dumps({
+ 'title': title,
+ 'owner': owner,
+ 'monitors': monitors,
+ 'starts': starts,
+ 'ends': ends,
+ 'hash': hashlib.sha512("%f-stv-%s" % (time.time(),
os.environ['REMOTE_ADDR'] if 'REMOTE_ADDR' in os.environ else
random.randint(1,99999999999))).hexdigest(),
+ 'open': isopen
+ }))
+ f.close()
+ with open(elpath + "/voters.json", "w") as f:
+ f.write("{}")
+ f.close()
def listIssues(election):
"List all issues in an election"
issues = []
- elpath = os.path.join(homedir, "issues", election)
- if os.path.isdir(elpath):
- issues = [f.strip(".json") for f in os.listdir(elpath) if
os.path.isfile(os.path.join(elpath, f)) and f != "basedata.json" and f !=
"voters.json" and f.endswith(".json")]
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ if os.path.isdir(elpath):
+ issues = [f.strip(".json") for f in os.listdir(elpath) if
os.path.isfile(os.path.join(elpath, f)) and f != "basedata.json" and f !=
"voters.json" and f.endswith(".json")]
return issues
def listElections():
"List all elections"
elections = []
- path = os.path.join(homedir, "issues")
- if os.path.isdir(path):
- elections = [f for f in os.listdir(path) if
os.path.isdir(os.path.join(path, f))]
+ if config.get("database", "dbsys") == "file":
+ path = os.path.join(homedir, "issues")
+ if os.path.isdir(path):
+ elections = [f for f in os.listdir(path) if
os.path.isdir(os.path.join(path, f))]
+
return elections
def getVoteType(issue):
@@ -148,43 +159,45 @@ def vote(electionID, issueID, voterID, v
votes = {}
basedata = getBasedata(electionID)
if basedata:
- issuepath = os.path.join(homedir, "issues", electionID, issueID)
+ ".json"
- if os.path.isfile(issuepath + ".votes"):
- with open(issuepath + ".votes", "r") as f:
- votes = json.loads(f.read())
- f.close()
- votes[voterID] = vote
- with open(issuepath + ".votes", "w") as f:
- f.write(json.dumps(votes))
- f.close()
votehash = hashlib.sha224(basedata['hash'] + issueID + voterID +
vote).hexdigest()
- # LURK on who voted :O :O :O
- if config.has_option("general", "lurk") and config.get("general",
"lurk") == "yes":
- email = voter.get(electionID, basedata, voterID)
- lurks = {}
- lurkpath = os.path.join(homedir, "issues", electionID,
"who.voted")
- if os.path.isfile(lurkpath):
- with open(lurkpath, "r") as f:
- lurks = json.loads(f.read())
+ if config.get("database", "dbsys") == "file":
+ issuepath = os.path.join(homedir, "issues", electionID,
issueID) + ".json"
+ if os.path.isfile(issuepath + ".votes"):
+ with open(issuepath + ".votes", "r") as f:
+ votes = json.loads(f.read())
f.close()
- lurks[email] = True
- with open(lurkpath, "w") as f:
- f.write(json.dumps(lurks))
+ votes[voterID] = vote
+ with open(issuepath + ".votes", "w") as f:
+ f.write(json.dumps(votes))
f.close()
+
+ # LURK on who voted :O :O :O
+ if config.has_option("general", "lurk") and
config.get("general", "lurk") == "yes":
+ email = voter.get(electionID, basedata, voterID)
+ lurks = {}
+ lurkpath = os.path.join(homedir, "issues", electionID,
"who.voted")
+ if os.path.isfile(lurkpath):
+ with open(lurkpath, "r") as f:
+ lurks = json.loads(f.read())
+ f.close()
+ lurks[email] = True
+ with open(lurkpath, "w") as f:
+ f.write(json.dumps(lurks))
+ f.close()
return votehash
else:
raise Exception("No such election")
def getVotes(electionID, issueID):
- issuepath = os.path.join(homedir, "issues", electionID, issueID) +
".json.votes"
- if os.path.isfile(issuepath):
- with open(issuepath, "r") as f:
- votes = json.loads(f.read())
- f.close()
- return votes
- else:
- return {}
+ if config.get("database", "dbsys") == "file":
+ issuepath = os.path.join(homedir, "issues", electionID, issueID)
+ ".json.votes"
+ if os.path.isfile(issuepath):
+ with open(issuepath, "r") as f:
+ votes = json.loads(f.read())
+ f.close()
+ return votes
+ return {}
def validType(issueType):
for voteType in constants.VOTE_TYPES:
@@ -206,12 +219,14 @@ def tally(votes, issue):
def deleteIssue(electionID, issueID):
"Deletes an issue if it exists"
+
if exists(electionID):
- issuepath = os.path.join(homedir, "issues", electionID, issueID)
+ ".json"
- if os.path.isfile(issuepath):
- os.unlink(issuepath)
- if os.path.isfile(issuepath + ".votes"):
- os.unlink(issuepath + ".votes")
+ if config.get("database", "dbsys") == "file":
+ issuepath = os.path.join(homedir, "issues", electionID,
issueID) + ".json"
+ if os.path.isfile(issuepath):
+ os.unlink(issuepath)
+ if os.path.isfile(issuepath + ".votes"):
+ os.unlink(issuepath + ".votes")
return True
else:
raise Exception("No such election")
Modified: steve/trunk/pysteve/lib/voter.py
URL:
http://svn.apache.org/viewvc/steve/trunk/pysteve/lib/voter.py?rev=1669142&r1=1669141&r2=1669142&view=diff
==============================================================================
--- steve/trunk/pysteve/lib/voter.py (original)
+++ steve/trunk/pysteve/lib/voter.py Wed Mar 25 16:17:30 2015
@@ -26,49 +26,54 @@ from smtplib import SMTPException
def get(election, basedata, uid):
- elpath = os.path.join(homedir, "issues", election)
- with open(elpath + "/voters.json", "r") as f:
- voters = json.loads(f.read())
- f.close()
- xhash = hashlib.sha512(basedata['hash'] + uid).hexdigest()
- for voter in voters:
- if voters[voter] == xhash:
- return voter
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ with open(elpath + "/voters.json", "r") as f:
+ voters = json.loads(f.read())
+ f.close()
+ xhash = hashlib.sha512(basedata['hash'] + uid).hexdigest()
+ for voter in voters:
+ if voters[voter] == xhash:
+ return voter
return None
def add(election, basedata, email):
uid = hashlib.sha224("%s%s%s%s" % (email, basedata['hash'],
time.time(), random.randint(1,99999999))).hexdigest()
xhash = hashlib.sha512(basedata['hash'] + uid).hexdigest()
- elpath = os.path.join(homedir, "issues", election)
- with open(elpath + "/voters.json", "r") as f:
- voters = json.loads(f.read())
- f.close()
- voters[email] = xhash
- with open(elpath + "/voters.json", "w") as f:
- f.write(json.dumps(voters))
- f.close()
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ with open(elpath + "/voters.json", "r") as f:
+ voters = json.loads(f.read())
+ f.close()
+ voters[email] = xhash
+ with open(elpath + "/voters.json", "w") as f:
+ f.write(json.dumps(voters))
+ f.close()
return uid, xhash
def remove(election, basedata, email):
- elpath = os.path.join(homedir, "issues", election)
- with open(elpath + "/voters.json", "r") as f:
- voters = json.loads(f.read())
- f.close()
- if email in voters:
- del voters[email]
- with open(elpath + "/voters.json", "w") as f:
- f.write(json.dumps(voters))
- f.close()
+ if config.get("database", "dbsys") == "file":
+ elpath = os.path.join(homedir, "issues", election)
+ with open(elpath + "/voters.json", "r") as f:
+ voters = json.loads(f.read())
+ f.close()
+ if email in voters:
+ del voters[email]
+ with open(elpath + "/voters.json", "w") as f:
+ f.write(json.dumps(voters))
+ f.close()
def hasVoted(election, issue, uid):
issue = issue.strip(".json")
- path = os.path.join(homedir, "issues", election, issue)
- votes = {}
- if os.path.isfile(path + ".json.votes"):
- with open(path + ".json.votes", "r") as f:
- votes = json.loads(f.read())
- f.close()
- return True if uid in votes else False
+ if config.get("database", "dbsys") == "file":
+ path = os.path.join(homedir, "issues", election, issue)
+ votes = {}
+ if os.path.isfile(path + ".json.votes"):
+ with open(path + ".json.votes", "r") as f:
+ votes = json.loads(f.read())
+ f.close()
+ return True if uid in votes else False
+ return False
def email(rcpt, subject, message):
sender = config.get("email", "sender")
Modified: steve/trunk/pysteve/steve.cfg
URL:
http://svn.apache.org/viewvc/steve/trunk/pysteve/steve.cfg?rev=1669142&r1=1669141&r2=1669142&view=diff
==============================================================================
--- steve/trunk/pysteve/steve.cfg (original)
+++ steve/trunk/pysteve/steve.cfg Wed Mar 25 16:17:30 2015
@@ -4,6 +4,11 @@ homedir: /home/voter
rooturl: http://demo.stv.website
lurk: yes
+
+[database]
+dbsys: file
+
+
[karma]
admin: 5
chairman: 4