コード例 #1
0
def process_td(id):
    record = Record.objects.get(pk=id)
    pg_data = json.loads(record.pg_data)

    if record.name and record.name not in [
            entity['name']
            for entity in pg_data['entities'] if entity['tdata_id']
    ]:
        if record.organization:
            results = api._get_url_json('contributions.json',
                                        parse_json=False,
                                        contributor_ft=record.name,
                                        organization_ft=record.organization)
            if json.loads(results):
                record.td_sender_info = results

        if not record.td_sender_info:
            results = api._get_url_json('contributions.json',
                                        parse_json=False,
                                        contributor_ft=record.name)
            record.td_sender_info = results

    record.td_processed = True

    # do an update rather than a save, to avoid race conditions
    Record.objects.filter(pk=id).update(td_sender_info=record.td_sender_info,
                                        td_processed=record.td_processed)
コード例 #2
0
ファイル: views.py プロジェクト: thefuturewasnow/brisket
def bundling(request):
    return direct_to_template(
        request,
        'fec/bundling.html',
        extra_context = {
            'recipients': api._get_url_json('aggregates/lobbyist_bundling/recipients.json'),
            'firms': api._get_url_json('aggregates/lobbyist_bundling/firms.json')
        }
    )
コード例 #3
0
ファイル: tasks.py プロジェクト: imclab/oxtail
def process_td(id):
    record = Record.objects.get(pk=id)
    pg_data = json.loads(record.pg_data)
    
    if record.name and record.name not in [entity['name'] for entity in pg_data['entities'] if entity['tdata_id']]:
        if record.organization:
            results = api._get_url_json('contributions.json', parse_json=False, contributor_ft=record.name, organization_ft=record.organization)
            if json.loads(results):
                record.td_sender_info = results
        
        if not record.td_sender_info:
            results = api._get_url_json('contributions.json', parse_json=False, contributor_ft=record.name)
            record.td_sender_info = results
    
    record.td_processed = True
    
    # do an update rather than a save, to avoid race conditions
    Record.objects.filter(pk=id).update(td_sender_info=record.td_sender_info, td_processed=record.td_processed)
コード例 #4
0
ファイル: views.py プロジェクト: imclab/oxtail
def sender_info(request):
    # api key test
    if not (hasattr(request, 'apikey') and request.apikey.status == 'A'):
        return HttpResponse("Authorization Required", status=401)
    
    name = request.REQUEST.get('name', '').strip()
    email = request.REQUEST.get('email', '').strip()
    organization = None
    
    out = {}
    
    organization = ''
    org_info = None
    if email:
        parts = email.split("@")
        if len(parts) > 1:
            domain = parts[1]
            
            # if it's a US TLD, just use the actual purchased domain name (not subdomains) for a match
            if re.match(r'.*\.(com|net|org)$', domain):
                domain = '.'.join(domain.split('.')[-2:])
            
            orgs = lookup_domain(domain)
            
            if len(orgs) > 1:
                orgs = sorted(orgs, key=lambda org: Levenshtein.ratio(domain, org['name'].lower()), reverse=True)
            
            if orgs:
                organization = orgs[0]['name']
                matches = matching.match(organization)
                if matches:
                    org_info = get_entity_data(matches.keys()[0])
    
    results = None
    
    lat, lon = (None, None)
    geoip = ip_lookup(request.META['REMOTE_ADDR'])
    if geoip is not None:
        lat, lon = geoip
    
    if not lat or not lon:
        # hard-code DC's info for now so that it still works, since our API can't deal with not having geo data
        lat = '38.895112'
        lon = '-77.036366'
    
    if name and ' ' in name:
        results = api._get_url_json('contributions/contributor_geo.json', parse_json=True, query=name, lat=lat, lon=lon)
    
    sender_info = []
    if results:
        for result in results:
            loc = result['contributor_location'].split(', ')
            if len(loc) > 1:
                city = loc[0].split('-')[0]
                state = loc[1].replace(' MSA', '').split('-')[0]
            else:
                sloc = result['contributor_location'].split(' ')
                state = sloc[0]
                city = string.capwords(' '.join(sloc[1:]))
            sender_info.append({
                'name': standardize_name(result['contributor_name'], "individual"),
                'city': city,
                'state': state,
                'total': float(result['amount_total']),
                'dem_total': float(result['amount_democrat']),
                'rep_total': float(result['amount_republican']),
                'other_total': float(result['amount_total']) - (float(result['amount_democrat']) + float(result['amount_republican'])),
                'count': result['count'],
                'url': base64.b64encode(urllib.urlencode({'contributor_ft': name, 'msa_ft': result['contributor_location']}))
            })
    
    out = {
        'name': name,
        'email': email,
        'sender_info': sender_info,
        'url': base64.b64encode(urllib.urlencode({'contributor_ft': name})),
        'organization': organization,
        'org_info': org_info
    }
    
    if 'callback' in request.GET:
        return HttpResponse('%s(%s)' % (request.GET['callback'], json.dumps(out)), 'text/javascript')
    else:
        return HttpResponse(json.dumps(out), mimetype="application/json")
コード例 #5
0
ファイル: views.py プロジェクト: mazharul-miraz/oxtail
def sender_info(request):
    # api key test
    if not (hasattr(request, 'apikey') and request.apikey.status == 'A'):
        return HttpResponse("Authorization Required", status=401)

    name = request.REQUEST.get('name', '').strip()
    email = request.REQUEST.get('email', '').strip()
    organization = None

    out = {}

    organization = ''
    org_info = None
    if email:
        parts = email.split("@")
        if len(parts) > 1:
            domain = parts[1]

            # if it's a US TLD, just use the actual purchased domain name (not subdomains) for a match
            if re.match(r'.*\.(com|net|org)$', domain):
                domain = '.'.join(domain.split('.')[-2:])

            orgs = lookup_domain(domain)

            if len(orgs) > 1:
                orgs = sorted(orgs,
                              key=lambda org: Levenshtein.ratio(
                                  domain, org['name'].lower()),
                              reverse=True)

            if orgs:
                organization = orgs[0]['name']
                matches = matching.match(organization)
                if matches:
                    org_info = get_entity_data(matches.keys()[0])

    results = None

    lat, lon = (None, None)
    geoip = ip_lookup(request.META['REMOTE_ADDR'])
    if geoip is not None:
        lat, lon = geoip

    if not lat or not lon:
        # hard-code DC's info for now so that it still works, since our API can't deal with not having geo data
        lat = '38.895112'
        lon = '-77.036366'

    if name and ' ' in name:
        results = api._get_url_json('contributions/contributor_geo.json',
                                    parse_json=True,
                                    query=name,
                                    lat=lat,
                                    lon=lon)

    sender_info = []
    if results:
        for result in results:
            loc = result['contributor_location'].split(', ')
            if len(loc) > 1:
                city = loc[0].split('-')[0]
                state = loc[1].replace(' MSA', '').split('-')[0]
            else:
                sloc = result['contributor_location'].split(' ')
                state = sloc[0]
                city = string.capwords(' '.join(sloc[1:]))
            sender_info.append({
                'name':
                standardize_name(result['contributor_name'], "individual"),
                'city':
                city,
                'state':
                state,
                'total':
                float(result['amount_total']),
                'dem_total':
                float(result['amount_democrat']),
                'rep_total':
                float(result['amount_republican']),
                'other_total':
                float(result['amount_total']) -
                (float(result['amount_democrat']) +
                 float(result['amount_republican'])),
                'count':
                result['count'],
                'url':
                base64.b64encode(
                    urllib.urlencode({
                        'contributor_ft': name,
                        'msa_ft': result['contributor_location']
                    }))
            })

    out = {
        'name': name,
        'email': email,
        'sender_info': sender_info,
        'url': base64.b64encode(urllib.urlencode({'contributor_ft': name})),
        'organization': organization,
        'org_info': org_info
    }

    if 'callback' in request.GET:
        return HttpResponse(
            '%s(%s)' % (request.GET['callback'], json.dumps(out)),
            'text/javascript')
    else:
        return HttpResponse(json.dumps(out), mimetype="application/json")