@@ -135,7 +135,7 @@ def process_recurring(self, builder):
135135 self ._build_schedule (request , builder .entity ,
136136 builder .transaction_type )
137137 elif builder .transaction_type is TransactionType .Search :
138- for key , value in builder .search_criteria :
138+ for key , value in builder .search_criteria . iteritems () :
139139 request [key ] = value
140140
141141 response = self .do_transaction (
@@ -233,9 +233,7 @@ def _map_url(self, builder):
233233
234234 if isinstance (builder .entity , Schedule ):
235235 return '{}{}' .format (
236- 'searchSchedules' \
237- if builder .transaction_type == TransactionType .Search \
238- else 'schedules' ,
236+ 'searchSchedules' if builder .transaction_type == TransactionType .Search else 'schedules' ,
239237 suffix
240238 )
241239
@@ -562,11 +560,19 @@ def _hydrate_schedule(self, response):
562560 return schedule
563561
564562 def _has_token (self , payment_method ):
565- if isinstance (payment_method ,
566- Tokenizable ) and payment_method .token is not None :
563+ if self ._has_attr (payment_method , 'token' ) and payment_method .token is not None :
567564 return True , payment_method .token
568565 return False , None
569566
567+ def _has_attr (self , obj , attr ):
568+ if not obj :
569+ return False
570+
571+ try :
572+ return getattr (obj , attr )
573+ except AttributeError as _exc :
574+ return False
575+
570576
571577class PorticoConnector (XmlGateway ):
572578 site_id = None
@@ -708,15 +714,20 @@ def process_authorization(self, builder):
708714 et .SubElement (manual_entry , 'TokenValue' if has_token else
709715 'CardNbr' ).text = token_value or card .number
710716
711- et .SubElement (manual_entry , 'ExpMonth' ).text = card .exp_month
712- et .SubElement (manual_entry , 'ExpYear' ).text = card .exp_year
713- et .SubElement (manual_entry , 'CVV2' ).text = card .cvn
717+ if card .exp_month is not None :
718+ et .SubElement (manual_entry , 'ExpMonth' ).text = card .exp_month
719+ if card .exp_year is not None :
720+ et .SubElement (manual_entry , 'ExpYear' ).text = card .exp_year
721+ if card .cvn is not None :
722+ et .SubElement (manual_entry , 'CVV2' ).text = card .cvn
723+
714724 et .SubElement (
715725 manual_entry ,
716726 'ReaderPresent' ).text = 'Y' if card .reader_present else 'N'
717727 et .SubElement (
718728 manual_entry ,
719729 'CardPresent' ).text = 'Y' if card .card_present else 'N'
730+
720731 block1 .append (card_data )
721732
722733 if isinstance (card , CreditCardData ):
@@ -1031,11 +1042,11 @@ def process_report(self, builder):
10311042
10321043 if builder .start_date is not None :
10331044 et .SubElement (transaction ,
1034- 'RptStartUtcDT' ).text = builder .start_date
1045+ 'RptStartUtcDT' ).text = builder .start_date . strftime ( "%Y-%m-%dT%H:%M:%S.%f" )
10351046
10361047 if builder .end_date is not None :
10371048 et .SubElement (transaction ,
1038- 'RptEndUtcDT' ).text = builder .end_date
1049+ 'RptEndUtcDT' ).text = builder .end_date . strftime ( "%Y-%m-%dT%H:%M:%S.%f" )
10391050
10401051 if builder .transaction_id :
10411052 et .SubElement (transaction ,
@@ -1378,10 +1389,8 @@ def _map_report_type(report_type):
13781389
13791390 raise UnsupportedTransactionException ()
13801391
1381- @staticmethod
1382- def _has_token (payment_method ):
1383- if isinstance (payment_method ,
1384- Tokenizable ) and payment_method .token is not None :
1392+ def _has_token (self , payment_method ):
1393+ if self ._has_attr (payment_method , 'token' ) and payment_method .token is not None :
13851394 return True , payment_method .token
13861395
13871396 return False , None
0 commit comments