Last active
September 3, 2017 13:11
-
-
Save jeremylow/7a4cf2eb70859656f8d323d0869675f5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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