Skip to content

Instantly share code, notes, and snippets.

@jeremylow
Last active September 3, 2017 13:11
Show Gist options
  • Save jeremylow/7a4cf2eb70859656f8d323d0869675f5 to your computer and use it in GitHub Desktop.
Save jeremylow/7a4cf2eb70859656f8d323d0869675f5 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (c) 2017 Jeremy Low
"""
National provides XLS workbooks with the following structure:
DSA Member ID | First Name | Last Name | Secondary First Name | Secondary Last Name | Organization | Street Address | Apt/Suite | Addr Line 2 | City | State | Zip | Home Phone | Alternative Phone Number | Email Address | Don't Mail? | Don't Call | Join Date | Xdate
123456 | Jeremy | Low | | | | 123 Main Street | | | PHILADELPHIA | PA | 19107- | 555-111-2222 | | [email protected] | 0 | 0 | 06/23/2017 | 04/01/2018
But for this, delete the `Secondary First Name`, `Secondary Last Name`, `Organization`, & `Alternative Phone Number` fields
and delete the first row (the header).
"""
from __future__ import print_function, unicode_literals
from pyactionnetwork.api import ActionNetworkApi
import csv
from collections import namedtuple
import datetime
api = ActionNetworkApi("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
class Person(namedtuple('Person', ['dsa_member_id', 'first_name', 'last_name',
'street_address', 'apt_suite', 'addr_line_2',
'city', 'state', 'nb_zip_code', 'home_phone',
'alternative_phone_number', 'email_address',
"nb_do_not_mail", "nb_do_not_call",
'nb_join_date', 'nb_x_date'])):
__slots__ = ()
@staticmethod
def _str_to_date(date_string):
"""converts a '10/24/2017' string to a datetime.date object"""
return datetime.datetime.strptime(date_string, "%m/%d/%Y").date()
@property
def zip_code(self):
"""returns a member's zip code, but just the first five digits"""
return self.nb_zip_code[:5]
@property
def join_date(self):
"""returns date on which membership began"""
try:
return self._str_to_date(self.nb_join_date)
except:
return ''
@property
def x_date(self):
"""returns date on which membership expires"""
try:
return self._str_to_date(self.nb_x_date)
except:
return ''
@property
def do_not_call(self):
return bool(int(self.nb_do_not_call))
@property
def do_not_mail(self):
return bool(int(self.nb_do_not_mail))
@property
def full_address(self):
if self.addr_line_2:
return ['{0} {1}'.format(self.street_address, self.apt_suite).strip(),
self.addr_line_2]
else:
return ['{0} {1}'.format(self.street_address, self.apt_suite).strip()]
@property
def expired_membership(self):
"""Returns true if membership exired, otherwise false"""
return bool(max(0, (datetime.datetime.now().date() - self.x_date).days))
def create_person_in_action_network(p):
if p.expired_membership:
return api.create_person(
email=p.email_address,
given_name=p.first_name,
family_name=p.last_name,
address=p.full_address,
city=p.city,
state=p.state,
postal_code=p.zip_code,
custom_fields={
'join_date': str(p.join_date),
'expires_date': str(p.x_date),
'Phone Number': p.home_phone,
'do_not_mail': p.do_not_mail,
'do_not_call': p.do_not_call,
'member_id': p.dsa_member_id,
},
tags=['membership_expired'])
else:
return api.create_person(
email=p.email_address,
given_name=p.first_name,
family_name=p.last_name,
address=p.full_address,
city=p.city,
state=p.state,
postal_code=p.zip_code,
custom_fields={
'join_date': str(p.join_date),
'expires_date': str(p.x_date),
'Phone Number': p.home_phone,
'do_not_mail': p.do_not_mail,
'do_not_call': p.do_not_call,
'member_id': p.dsa_member_id,
})
if __name__ == '__main__':
with open('member_list.csv', 'r') as f:
reader = csv.reader(f)
for idx, row in enumerate(reader):
person = Person(*row)
print(idx, person.first_name, person.last_name)
if not person.email_address:
print("\n\nNO EMAIL: {0}\n\n".format(person.dsa_member_id))
continue
print(create_person_in_action_network(person))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment