Skip to content

Commit

Permalink
Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
beaugunderson committed Jan 28, 2014
1 parent 6ab9653 commit 88df2ed
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 40 deletions.
15 changes: 5 additions & 10 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,31 @@

from flask import Flask, request, render_template, url_for
from flask.ext.jsonpify import jsonify
from flask.ext.sqlalchemy import SQLAlchemy
from raven.contrib.flask import Sentry
from twilio import TwilioRestException

from models import aggregate_stats # , log_call
from utils import get_database, play_or_say
from utils import play_or_say
from political_data import PoliticalData

app = Flask(__name__)

app.config.from_object('config.ConfigProduction')

db = SQLAlchemy(app)
sentry = Sentry(app)

db = get_database(app)

call_methods = ['GET', 'POST']

data = PoliticalData()
defaults_campaign = data.campaigns['default']


def full_url_for(route, **kwds):
return urlparse.urljoin(app.config['APPLICATION_ROOT'],
url_for(route, **kwds))


def get_campaign(cid):
return dict(defaults_campaign, **data.campaigns[cid])


def parse_params(r):
params = {
'userPhone': r.values.get('userPhone'),
Expand All @@ -44,7 +39,7 @@ def parse_params(r):
}

# lookup campaign by ID
campaign = get_campaign(params['campaignId'])
campaign = data.get_campaign(params['campaignId'])

# add repIds to the parameter set, if spec. by the campaign
if campaign.get('repIds', None):
Expand Down Expand Up @@ -288,7 +283,7 @@ def demo():
@app.route('/stats')
def stats():
pwd = request.values.get('password', None)
campaign = get_campaign(request.values.get('campaignId', 'default'))
campaign = data.get_campaign(request.values.get('campaignId', 'default'))

if pwd == app.config['SECRET_KEY']:
return jsonify(aggregate_stats(campaign['id']))
Expand Down
51 changes: 28 additions & 23 deletions models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from sqlalchemy import (Column, Integer, String, DateTime)
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import func
from datetime import datetime
import hashlib
import logging

from datetime import datetime
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import func, Column, Integer, String, DateTime

db = SQLAlchemy()


Expand All @@ -16,6 +16,7 @@ def hash_phone(number):
def to_dict(model):
d = model.__dict__
d.pop('_sa_instance_state')

return d


Expand All @@ -24,36 +25,38 @@ def to_dict(model):

class Call(db.Model):
__tablename__ = 'calls'

id = Column(Integer, primary_key=True)
timestamp = Column(DateTime)
campaign_id = Column(String(10))
member_id = Column(String(10)) # congress member sunlight identifier
member_id = Column(String(10)) # congress member sunlight identifier

# user attributes
user_id = Column(String(64)) # hashed phone number
user_id = Column(String(64)) # hashed phone number
zipcode = Column(String(5))
areacode = Column(String(3)) # first 3 digits of phone number
exchange = Column(String(3)) # next 3 digits of phone number
# twilio attributes
call_id = Column(String(40)) # twilio call ID
status = Column(String(25)) # twilio call status
duration = Column(Integer) # twilio call time in seconds

areacode = Column(String(3)) # first 3 digits of phone number
exchange = Column(String(3)) # next 3 digits of phone number

# twilio attributes
call_id = Column(String(40)) # twilio call ID
status = Column(String(25)) # twilio call status
duration = Column(Integer) # twilio call time in seconds

def __init__(self, campaign_id, member_id,
zipcode=None, phone_number=None,
call_id=None, status='unknown', duration=0):
def __init__(self, campaign_id, member_id, zipcode=None, phone_number=None,
call_id=None, status='unknown', duration=0):
self.timestamp = datetime.now()
self.status = status
self.duration = duration
self.campaign_id = campaign_id
self.member_id = member_id
self.call_id = call_id

if phone_number:
phone_number = phone_number.replace('-', '').replace('.', '')
self.user_id = hash_phone(phone_number)
self.areacode = phone_number[:3]
self.exchange = phone_number[3:6]

self.zipcode = zipcode

def __repr__(self):
Expand All @@ -64,12 +67,13 @@ def __repr__(self):
def log_call(db, params, campaign, request):
try:
i = int(request.values.get('call_index'))

kwds = dict(
campaign_id=campaign['id'],
member_id=params['repIds'][i],
zipcode=params['zipcode'],
phone_number=params['userPhone'],
call_id=request.values.get('CallSid', None), # twilio call id
call_id=request.values.get('CallSid', None), # twilio call id
status=request.values.get('DialCallStatus', 'unknown'),
duration=request.values.get('DialCallDuration', 0))

Expand All @@ -80,16 +84,17 @@ def log_call(db, params, campaign, request):


def aggregate_stats(cid):
zipcodes = db.session.query(Call.zipcode, func.Count(Call.zipcode))\
.filter(Call.campaign_id == cid)\
zipcodes = db.session.query(Call.zipcode, func.Count(Call.zipcode)) \
.filter(Call.campaign_id == cid) \
.group_by(Call.zipcode).all()
reps = db.session.query(Call.member_id, func.Count(Call.member_id))\
.filter(Call.campaign_id == cid)\

reps = db.session.query(Call.member_id, func.Count(Call.member_id)) \
.filter(Call.campaign_id == cid) \
.group_by(Call.member_id).all()

return dict(calls=dict(
zipcodes=dict(tuple(z) for z in zipcodes),
reps=dict(tuple(r) for r in reps)
))
reps=dict(tuple(r) for r in reps)))


def setUp(app):
Expand Down
3 changes: 3 additions & 0 deletions political_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ def __init__(self):
self.legislators = legislators
self.districts = districts

def get_campaign(self, campaign_id):
return dict(self.campaigns['default'], **self.campaigns[campaign_id])

def get_senators(self, districts):
states = [d['state'] for d in districts]

Expand Down
7 changes: 0 additions & 7 deletions utils.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
import pystache
import twilio.twiml

from flask.ext.sqlalchemy import SQLAlchemy


def get_database(app):
return SQLAlchemy(app)


def play_or_say(resp_or_gather, msg_template, **kwds):
Expand Down

0 comments on commit 88df2ed

Please sign in to comment.