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)
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') } )
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)
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")
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")