I have created an issue STEVE-19 <https://issues.apache.org/jira/browse/STEVE-19> for this kind of future work.
Best regards, Pierre Smits *ORRTIZ.COM <http://www.orrtiz.com>* Services & Solutions for Cloud- Based Manufacturing, Professional Services and Retail & Trade http://www.orrtiz.com On Wed, Mar 25, 2015 at 5:17 PM, <[email protected]> wrote: > 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 > > >
