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/21 12:43:55 UTC

svn commit: r1668245 - in /steve/trunk/pytest/www: cgi-bin/rest_admin.py htdocs/edit_election.html

Author: humbedooh
Date: Sat Mar 21 11:43:55 2015
New Revision: 1668245

URL: http://svn.apache.org/r1668245
Log:
add invite feature

Modified:
    steve/trunk/pytest/www/cgi-bin/rest_admin.py
    steve/trunk/pytest/www/htdocs/edit_election.html

Modified: steve/trunk/pytest/www/cgi-bin/rest_admin.py
URL: http://svn.apache.org/viewvc/steve/trunk/pytest/www/cgi-bin/rest_admin.py?rev=1668245&r1=1668244&r2=1668245&view=diff
==============================================================================
--- steve/trunk/pytest/www/cgi-bin/rest_admin.py (original)
+++ steve/trunk/pytest/www/cgi-bin/rest_admin.py Sat Mar 21 11:43:55 2015
@@ -359,6 +359,47 @@ else:
                     response.respond(404, {'message': 'No such election'})
             else:
                     response.respond(404, {'message': 'No such election'})
+        elif action == "invite" and karma >= 3:
+            # invite one or more people to an election
+            if election:
+                email = form.getvalue('email')
+                msgtype = form.getvalue('msgtype')
+                msgtemplate = form.getvalue('msgtemplate')
+                if not email or len(email) > 300 or not re.match(r"([^@]+@[^@]+)", email):
+                    response.respond(400, {'message': 'Could not request voter ID: Invalid email address specified'})
+                elif not msgtemplate or len(msgtemplate) < 10:
+                    response.respond(400, {'message': 'No message template specified'})
+                else:
+                    js = []
+                    elpath = os.path.join(homedir, "issues", election)
+                    if os.path.isdir(elpath):
+                        basedata = {}
+                        try:
+                            with open(elpath + "/basedata.json", "r") as f:
+                                basedata = json.loads(f.read())
+                                f.close()
+                            if (not 'open' in basedata or basedata['open'] != "true") and msgtype == "open":
+                                raise Exception("An open vote invite was requested, but this election is not public")
+                            if msgtype != "open":
+                                voterid, xhash = voter.add(election, basedata, email)
+                                message = msgtemplate.replace("$votelink", "%s/election.html?%s/%s" % (config.get("general", "rooturl"), election, voterid))
+                                message = message.replace("$title", basedata['title'])
+                                subject = "Election open for votes: %s (%s)" % (election, basedata['title'])
+                                voter.email(email, subject, message)
+                            else:
+                                message = msgtemplate.replace("$votelink", "%s/request_link.html?%s" % (config.get("general", "rooturl"), election))
+                                message = message.replace("$title", basedata['title'])
+                                subject = "Public election open for votes: %s (%s)" % (election, basedata['title'])
+                                voter.email(email, subject, message)
+                            response.respond(200, {'message': "Vote link sent"})
+                        except Exception as err:
+                            response.respond(500, {'message': 'Could not load base data: %s' % err})
+                        
+                        response.respond(200, {'message': "Vote link sent to %s" % email})
+                    else:
+                        response.respond(404, {'message': 'No such election'})
+            else:
+                    response.respond(404, {'message': 'No such election'})
                     
         else:
             response.respond(400, {'message': "No (or invalid) action supplied"})

Modified: steve/trunk/pytest/www/htdocs/edit_election.html
URL: http://svn.apache.org/viewvc/steve/trunk/pytest/www/htdocs/edit_election.html?rev=1668245&r1=1668244&r2=1668245&view=diff
==============================================================================
--- steve/trunk/pytest/www/htdocs/edit_election.html (original)
+++ steve/trunk/pytest/www/htdocs/edit_election.html Sat Mar 21 11:43:55 2015
@@ -6,9 +6,48 @@
 <script src="js/steve_rest.js" type="text/javascript"></script>
 <script src="js/jquery.js" type="text/javascript"></script>
 <script src="js/jquery-ui.js" type="text/javascript"></script>
+<script type="text/javascript">
+    var ecount = 0;
+    function seedInvite(type) {
+        if (type == "closed") {
+            document.getElementById('msgtemplate').value = "A private election for \"$title\" has been called\n\nTo vote, please visit: $votelink\nThis is a private vote URL for your eyes only."
+        } else {
+            document.getElementById('msgtemplate').value = "A public election for \"$title\" has been called\n\nTo vote, please register for a vote at: $votelink\nAnyone can register to vote."
+        }
+    }
+    function removeEmail(code, response, state) {
+        if (code == 200) {
+            ecount--;
+            document.getElementById('invitestatus').innerHTML = ecount + " emails left to send..."
+            if (ecount == 0) {
+                document.getElementById('invitestatus').innerHTML = "All invites have been sent!"
+            }
+        } else {
+            alert(response.message)
+        }
+    }
+    function sendInvites() {
+        var emails = document.getElementById('emails').value.split(/\r?\n/)
+        var msgtype = document.getElementById('msgtype').value;
+        var msgtemplate = document.getElementById('msgtemplate').value;
+        var election = document.location.search.substr(1);
+        ecount = emails.length;
+        for (i in emails) {
+            var email = emails[i]
+            postREST("/steve/admin/invite/" + election, {
+                email: email,
+                msgtype: msgtype,
+                msgtemplate: msgtemplate
+            },
+            undefined,
+            removeEmail,
+            null)
+        }
+    }
+</script>
 <title>Edit election</title>
 </head>
-<body onload="window.setTimeout(loadAdminElectionData, 1000);">
+<body onload="window.setTimeout(loadAdminElectionData, 1000); seedInvite('closed');">
     <div id="popups"></div>
     <p style="text-align: center;">
         <img src="/images/steve_logo.png"/>
@@ -75,6 +114,30 @@
         <input type="button" onclick="createIssue();" value="Create issue" class="btn-green"/>
     </div>
     </fieldset>
+    
+    
+    <fieldset>
+        <legend>Invite one or more users to this election</legend>
+    <div class="keyvaluepair">
+        <div class="keyfield">Invitation type:</div>
+        <select id="msgtype" onchange="seedInvite(this.value)">
+            <option value="closed">Closed (private) invite</option>
+            <option value="open">Open (public) invite</option>
+        </select>
+    </div>
+    <div class="keyvaluepair">
+        <div class="keyfield">Invitation type:</div>
+        <textarea id="msgtemplate" style="width: 600px; height: 200px;">
+            
+        </textarea>
+    </div>
+    <div class="keyvaluepair">
+        <div class="keyfield">Email address(es) to invite<br/>(one per line):</div>
+        <textarea id="emails" style="width: 300px; height: 300px;"></textarea>
+    </div>
+    <input type="button" value="Send invitation(s)" onclick="sendInvites()"/><br/>
+    <span id="invitestatus"></span>
+    </fieldset>
 </form>
 </div>
 </body>