jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/351215 )
Change subject: Normalize subscr_ messages from SAR files
......................................................................
Normalize subscr_ messages from SAR files
Oops, missed these in the first round of normalization fixes!
Bug: T164226
Change-Id: Ied710a6f34a0c6ecb007a517849765cd564037cc
---
M audit/paypal/SarFile.py
A audit/paypal/tests/data/classic_subscr_cancel.csv
A audit/paypal/tests/data/classic_subscr_signup.csv
A audit/paypal/tests/test_sar_file.py
4 files changed, 102 insertions(+), 21 deletions(-)
Approvals:
XenoRyet: Looks good to me, approved
jenkins-bot: Verified
diff --git a/audit/paypal/SarFile.py b/audit/paypal/SarFile.py
index f86e8e6..3f864f0 100644
--- a/audit/paypal/SarFile.py
+++ b/audit/paypal/SarFile.py
@@ -4,10 +4,11 @@
'''
from process.logging import Logger as log
-from process.globals import config
-from queue.redis_wrap import Redis
+import process.globals
+import queue.redis_wrap
import ppreport
-from civicrm.civicrm import Civicrm
+
+import civicrm.civicrm
class SarFile(object):
@@ -48,7 +49,9 @@
def __init__(self, path):
self.path = path
- self.crm = Civicrm(config.civicrm_db)
+ self.config = process.globals.get_config()
+ print(self.config)
+ self.crm = civicrm.civicrm.Civicrm(self.config.civicrm_db)
def parse(self):
ppreport.read(self.path, self.VERSION, self.parse_line,
self.column_headers)
@@ -70,50 +73,60 @@
raise RuntimeError("Message is missing some important fields:
[{fields}]".format(fields=", ".join(missing_fields)))
names = row['Subscription Payer Name'].split(' ')
+ date = ppreport.parse_date(row['Subscription Creation Date'])
out = {
'subscr_id': row['Subscription ID'],
- 'mc_currency': row['Subscription Currency'],
- 'mc_amount3': float(row['Period 3 Amount']) / 100,
- 'period3': row['Subscription Period 3'],
- 'subscr_date': row['Subscription Creation Date'],
- 'payer_email': row['Subscription Payer email address'],
+ 'currency': row['Subscription Currency'],
+ 'gross': float(row['Period 3 Amount']) / 100,
+ 'email': row['Subscription Payer email address'],
'first_name': names[0],
'last_name': " ".join(names[1:]),
- 'address_street': row['Shipping Address Line1'],
- 'address_city': row['Shipping Address City'],
- 'address_zip': row['Shipping Address Zip'],
- 'address_state': row['Shipping Address State'],
- 'address_country_code': row['Shipping Address Country'],
- 'gateway': 'paypal',
+ 'street_address': row['Shipping Address Line1'],
+ 'city': row['Shipping Address City'],
+ 'postal_code': row['Shipping Address Zip'],
+ 'state_province': row['Shipping Address State'],
+ 'country': row['Shipping Address Country'],
+ 'gateway': 'paypal', # TODO: Express checkout
}
# FIXME what historical evil caused...
if row['Subscription Period 3'] != "1 M":
raise RuntimeError("Unknown subscription period
{period}".format(period=row['Subscription Period 3']))
+ else:
+ out['frequency_interval'] = '1'
+ out['frequency_unit'] = 'month'
+
+ log_params = {
+ 'id': out['subscr_id'],
+ 'date': row['Subscription Creation Date'],
+ }
if row['Subscription Action Type'] == 'S0000':
out['txn_type'] = 'subscr_signup'
+ out['start_date'] = date
+ out['create_date'] = date
if self.crm.subscription_exists(out['subscr_id']):
-
log.info("-Duplicate\t{id}\t{date}\tsubscr_signup".format(id=out['subscr_id'],
date=out['subscr_date']))
+
log.info("-Duplicate\t{id}\t{date}\tsubscr_signup".format(**log_params))
return
elif row['Subscription Action Type'] == 'S0100':
-
log.info("-Ignored\t{id}\t{date}\tsubscr_modify".format(id=out['subscr_id'],
date=out['subscr_date']))
+
log.info("-Ignored\t{id}\t{date}\tsubscr_modify".format(**log_params))
return
elif row['Subscription Action Type'] == 'S0200':
out['txn_type'] = 'subscr_cancel'
- out['cancel_date'] = out['subscr_date']
+ out['cancel_date'] = date
elif row['Subscription Action Type'] == 'S0300':
out['txn_type'] = 'subscr_eot'
- if config.no_thankyou:
+ if self.config.no_thankyou:
out['thankyou_date'] = 0
- log.info("+Sending\t{id}\t{date}\t{type}".format(id=out['subscr_id'],
date=out['subscr_date'], type=out['txn_type']))
+ log_params['type'] = out['txn_type']
+ log.info("+Sending\t{id}\t{date}\t{type}".format(**log_params))
self.send(out)
def send(self, msg):
if not self.redis:
- self.redis = Redis()
+ self.redis = queue.redis_wrap.Redis()
self.redis.send('recurring', msg)
diff --git a/audit/paypal/tests/data/classic_subscr_cancel.csv
b/audit/paypal/tests/data/classic_subscr_cancel.csv
new file mode 100644
index 0000000..39be7aa
--- /dev/null
+++ b/audit/paypal/tests/data/classic_subscr_cancel.csv
@@ -0,0 +1,2 @@
+"CH","Subscription ID","Subscription Action Type","Subscription
Currency","Subscription Creation Date","Subscription Period 1","Period 1
Amount","Subscription Period 2","Period 2 Amount","Subscription Period
3","Period 3 Amount","Recurring","Recurrence number","Subscription Payer PayPal
Account ID","Subscription Payer email address","Subscription Payer
Name","Subscription Payer Business Name","Shipping Address Line1","Shipping
Address City","Shipping Address State","Shipping Address Zip","Shipping Address
Country","Subscription Description","Subscription Memo","Subscription Custom
Field"
+"SB","S-7J123456DS987654B","S0200","EUR",2017/04/30 01:00:00
-0700,"","","","","1
M","300","N",-1,"D8ABCDE6ZYXWV","[email protected]","Donantus
Recurricus","Donantus Recurricus","Rue Faux,
41","Paris","Paris","12345","FR","Donacion Recourante","","12345678"
diff --git a/audit/paypal/tests/data/classic_subscr_signup.csv
b/audit/paypal/tests/data/classic_subscr_signup.csv
new file mode 100644
index 0000000..97ac980
--- /dev/null
+++ b/audit/paypal/tests/data/classic_subscr_signup.csv
@@ -0,0 +1,2 @@
+"CH","Subscription ID","Subscription Action Type","Subscription
Currency","Subscription Creation Date","Subscription Period 1","Period 1
Amount","Subscription Period 2","Period 2 Amount","Subscription Period
3","Period 3 Amount","Recurring","Recurrence number","Subscription Payer PayPal
Account ID","Subscription Payer email address","Subscription Payer
Name","Subscription Payer Business Name","Shipping Address Line1","Shipping
Address City","Shipping Address State","Shipping Address Zip","Shipping Address
Country","Subscription Description","Subscription Memo","Subscription Custom
Field"
+"SB","S-7J123456DS987654B","S0000","EUR",2017/04/30 01:00:00
-0700,"","","","","1
M","300","N",-1,"D8ABCDE6ZYXWV","[email protected]","Donantus
Recurricus","Donantus Recurricus","Rue Faux,
41","Paris","Paris","12345","FR","Donacion Recourante","","12345678"
diff --git a/audit/paypal/tests/test_sar_file.py
b/audit/paypal/tests/test_sar_file.py
new file mode 100644
index 0000000..be2c50c
--- /dev/null
+++ b/audit/paypal/tests/test_sar_file.py
@@ -0,0 +1,64 @@
+import csv
+from mock import patch
+import nose.tools
+import os
+
+import audit.paypal.SarFile
+
+# weird thing we have to do to get better assert_equals feedback
+nose.tools.assert_equals.im_class.maxDiff = None
+
+
+def get_csv_row(filename):
+ path = os.path.dirname(__file__) + "/data/" + filename + ".csv"
+ with open(path, 'r') as datafile:
+ r = csv.DictReader(datafile)
+ return r.next()
+
+
+@patch("queue.redis_wrap.Redis")
+@patch("civicrm.civicrm.Civicrm")
+@patch("process.globals.get_config")
+def test_subscr_signup(MockConfig, MockCivicrm, MockRedis):
+ '''
+ Test that subscr_signup messages are correctly filed
+ '''
+ row = get_csv_row("classic_subscr_signup")
+
+ MockConfig.return_value.no_thankyou = False
+ MockCivicrm().subscription_exists.return_value = False
+
+ parser = audit.paypal.SarFile.SarFile("dummy_path")
+
+ parser.parse_line(row)
+
+ # Did we send it?
+ args = MockRedis().send.call_args
+ expected = {'subscr_id': 'S-7J123456DS987654B', 'txn_type':
'subscr_signup', 'currency': 'EUR', 'gross': 3.0, 'frequency_unit': 'month',
'frequency_interval': '1', 'create_date': 1493539200, 'start_date': 1493539200,
'email': '[email protected]', 'first_name': 'Donantus', 'last_name':
'Recurricus', 'street_address': 'Rue Faux, 41', 'city': 'Paris',
'state_province': 'Paris', 'country': 'FR', 'postal_code': '12345', 'gateway':
'paypal'}
+ nose.tools.assert_equals('recurring', args[0][0])
+ actual = args[0][1]
+ nose.tools.assert_equals(expected, actual)
+
+
+@patch("queue.redis_wrap.Redis")
+@patch("civicrm.civicrm.Civicrm")
+@patch("process.globals.get_config")
+def test_subscr_cancel(MockConfig, MockCivicrm, MockRedis):
+ '''
+ Test that subscr_cancel messages are correctly filed
+ '''
+ row = get_csv_row("classic_subscr_cancel")
+
+ MockConfig.return_value.no_thankyou = False
+ MockCivicrm().subscription_exists.return_value = True
+
+ parser = audit.paypal.SarFile.SarFile("dummy_path")
+
+ parser.parse_line(row)
+
+ # Did we send it?
+ args = MockRedis().send.call_args
+ expected = {'subscr_id': 'S-7J123456DS987654B', 'txn_type':
'subscr_cancel', 'currency': 'EUR', 'gross': 3.0, 'frequency_unit': 'month',
'frequency_interval': '1', 'cancel_date': 1493539200, 'email':
'[email protected]', 'first_name': 'Donantus', 'last_name':
'Recurricus', 'street_address': 'Rue Faux, 41', 'city': 'Paris',
'state_province': 'Paris', 'country': 'FR', 'postal_code': '12345', 'gateway':
'paypal'}
+ nose.tools.assert_equals('recurring', args[0][0])
+ actual = args[0][1]
+ nose.tools.assert_equals(expected, actual)
--
To view, visit https://gerrit.wikimedia.org/r/351215
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ied710a6f34a0c6ecb007a517849765cd564037cc
Gerrit-PatchSet: 2
Gerrit-Project: wikimedia/fundraising/tools
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
Gerrit-Reviewer: XenoRyet <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits