You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@steve.apache.org by hu...@apache.org on 2015/03/25 17:17:31 UTC

svn commit: r1669142 - in /steve/trunk/pysteve: lib/election.py lib/voter.py steve.cfg

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



Re: svn commit: r1669142 - in /steve/trunk/pysteve: lib/election.py lib/voter.py steve.cfg

Posted by Daniel Gruno <hu...@apache.org>.
righto, I'll remember that for next commit :)

With regards,
Daniel

On 2015-03-25 17:26, Pierre Smits wrote:
> 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, <hu...@apache.org> 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
>>
>>
>>


Re: svn commit: r1669142 - in /steve/trunk/pysteve: lib/election.py lib/voter.py steve.cfg

Posted by Pierre Smits <pi...@gmail.com>.
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, <hu...@apache.org> 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
>
>
>