AttributeError: 'NoneType' object has no attribute 'str' in suds
Asked Answered
B

6

5

I am using suds client for WSDL in our project.

i have this code .

sudsclient = sudsClient(settings.WSDL_URL)
values = {
                                    "MerchantCode": settings.YP_MERCHANT_CODE,
                                    "MerchantReference": str(reference_id),
                                    "TransactionType":settings.YP_TRANSACTION_TYPE,
                                    "Amount":int(charged),
                                    "CurrencyCode":client.currency,
                                    "CardHolderName":str(form.cleaned_data['name_on_card']),
                                    "CardNumber": str(form.cleaned_data['card_number']),
                                    "ExpiryMonth":int(form.cleaned_data['exp_month']),
                                    "ExpiryYear":int(form.cleaned_data['exp_year']),
                                    "CardID":0,
                                    "CardSecurityCode":str(form.cleaned_data['security_code']),
                                    "CustomerAccountNumber":"",
                                    "BillNumber":0,
                                    "CardHolderEmail":str(form.cleaned_data['email']),
                                    "ClientIPAddress":get_ip,
                                    "Notes":"OK",
                                            }
response = sudsclient.service.OnlineTransaction(**values)

when i run my program i got this error:

Exception Type: AttributeError
Exception Value:    
'NoneType' object has no attribute 'str'
Exception Location: /usr/local/lib/python2.7/dist-packages/suds/sax/document.py in str, line 48

I am sure that my code in my local and test are same.

I think the problem is in the suds, but i don't have any idea on how to solve it.

Do anyone can help me in my case? thanks in advance ..

 Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/1/book/save/?csrfmiddlewaretoken=05e5bdb542c3be7515b87e8160c347a0&check_in=2012-04-24&check_out=2012-04-25&no_of_nights=1&quantity=1&product=4&price=900.0&chargedMasterCard=180.0&chargedVisa=90.0&totalcostMasterCard=720.0&totalcostVisa=810.0&totalcost=900.0&charged=10.0&price_rate=1000.0&old_totalcost=1000.0&discount_charged=100.0&first_name=dsnmbmh&last_name=jhbjhb&email=jdlabandero%40agile.com.ph&contact=657879&address=gjkj&no_of_adult=1&no_of_kid=0&memo=&card_type=MasterCard&card_number=40000234234210&security_code=788&name_on_card=ghjk&exp_month=1&exp_year=2012

Django Version: 1.3.1
Python Version: 2.7.1
Installed Applications:
['admin_tools',
 'admin_tools.theming',
 'admin_tools.menu',
 'admin_tools.dashboard',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'django.contrib.admin',
 'surebooked.booking',
 'surebooked.api',
 'surebooked.account_app',
 'surebooked.client_app',
 'surebooked.product_app',
 'surebooked.report_app',
 'debug_toolbar',
 'billing',
 'south',
 'paypal.standard.ipn',
 'django_extensions',
 'cms',
 'menus',
 'mptt',
 'south',
 'cms.plugins.text',
 'cms.plugins.picture',
 'cms.plugins.link',
 'cms.plugins.file',
 'cms.plugins.snippet',
 'cms.plugins.googlemap',
 'sekizai',
 'django.contrib.admin',
 'filer',
 'sorl.thumbnail',
 'easy_thumbnails',
 'cmsplugin_filer_file',
 'cmsplugin_filer_folder',
 'cmsplugin_filer_image',
 'cmsplugin_filer_teaser',
 'cmsplugin_filer_video',
 'media_tree',
 'django_cron']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware',
 'media_tree.middleware.SessionPostMiddleware',
 'cms.middleware.page.CurrentPageMiddleware',
 'cms.middleware.user.CurrentUserMiddleware',
 'cms.middleware.toolbar.ToolbarMiddleware')


    Traceback:
    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
      111.                         response = callback(request, *callback_args, **callback_kwargs)
    File "/home/agileone/workspace/surebooked/surebooked/../surebooked/booking/views.py" in booking_save_page
      752.                             response = sudsclient.service.OnlineTransaction(**values)
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py" in __call__
      542.             return client.invoke(args, kwargs)
    File "/usr/local/lib/python2.7/dist-packages/suds/client.py" in invoke
      595.         soapenv = binding.get_message(self.method, args, kwargs)
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py" in get_message
      120.         content = self.bodycontent(method, args, kwargs)
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py" in bodycontent
      63.             p = self.mkparam(method, pd, value)
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/document.py" in mkparam
      105.             return Binding.mkparam(self, method, pdef, object)
    File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py" in mkparam
      287.         return marshaller.process(content)
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py" in process
      62.             self.append(document, content)
    File "/usr/local/lib/python2.7/dist-packages/suds/mx/core.py" in append
      73.         log.debug('appending parent:\n%s\ncontent:\n%s', parent, content)
    File "/usr/lib/python2.7/logging/__init__.py" in debug
      1120.             self._log(DEBUG, msg, args, **kwargs)
    File "/usr/lib/python2.7/logging/__init__.py" in _log
      1250.         self.handle(record)
    File "/usr/lib/python2.7/logging/__init__.py" in handle
      1260.             self.callHandlers(record)
    File "/usr/lib/python2.7/logging/__init__.py" in callHandlers
      1300.                     hdlr.handle(record)
    File "/usr/lib/python2.7/logging/__init__.py" in handle
      744.                 self.emit(record)
    File "/home/agileone/workspace/surebooked/surebooked/.ve/src/django-debug-toolbar/debug_toolbar/panels/logger.py" in emit
      51.             'message': record.getMessage(),
    File "/usr/lib/python2.7/logging/__init__.py" in getMessage
      328.             msg = msg % self.args
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in __str__
      58.         return unicode(self).encode('utf-8')
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in __unicode__
      61.         return self.str()
    File "/usr/local/lib/python2.7/dist-packages/suds/sax/document.py" in str
      48.         s.append(self.root().str())

    Exception Type: AttributeError at /1/book/save/
    Exception Value: 'NoneType' object has no attribute 'str'

i really2x don't know why i got this error. Now I got the same error in my local and my production. btw, when i separate the code and try to run. it runs ok.

sudstest.py

#!/usr/bin/env python
import os
from suds.client import Client as abo

WSDL = 'DirectConnect.production.wsdl'

#def test_api():
url = 'file://' + os.path.join(os.path.abspath(os.path.dirname(__file__)), WSDL)
print url
client = abo(url)

data = {
    'MerchantCode': 'HELLO',
    'MerchantReference':  '3252',
    'TransactionType': 20,
    'Amount': 10,
    'CurrencyCode': 'USD',
    'CardHolderName': 'RAUL O REVECHE',
    'CardNumber': 4005550000000001,
    'ExpiryMonth': 5,
    'ExpiryYear': 2013,
    'CardID': 0,
    'CardSecurityCode': 400,
    'CustomerAccountNumber': '',
    'BillNumber': 0,
    'CardHolderEmail': '[email protected]',
    'ClientIPAddress': 'http://127.0.0.1:8000/',
    'Notes': 'This is test',
}

print data
result = client.service.OnlineTransaction(**data)
print result.ResponseDescription
Brainless answered 10/3, 2012 at 6:46 Comment(1)
now i have the same error in my local and the production.Brainless
K
2

The Exception is caued by the None value returned by self.root, as following in suds.sax.Document,

def root(self): 
    if len(self.children): 
        return self.children[0] 
    else: 
        return None 

So it seems caused by lacking some data fields. Replay the exact data which you fill on the test server, on local machine again might help. Also check Django settings on the test server to make sure they are similar as your local settings.

Kinsey answered 10/3, 2012 at 9:19 Comment(1)
thanks for the reply okm... i try to check my settings but there is no problem...Brainless
C
13

The bug is in suds. @okm was close, but the problem is really in Document.__str__. However the bug is only exposed when using django-debug-toolbar, as the logging panel shows all the messages that have been logged. This triggers the suds bug.

I've created a patched version of suds that fixes this problem: https://github.com/bradleyayers/suds-htj

Edit: My patch has now been merged into https://github.com/htj/suds-htj – use that repository instead

Cattegat answered 4/5, 2012 at 3:7 Comment(3)
Thank you, this fix was also needed to get suds to run on App Engine. Cheers!Strobotron
I think the newest SUDS is maintained here: bitbucket.org/jurko/suds pip install suds-jurkoCornelie
@Cattegat I am facing the same issue with Django custom management command. Any thoughts?Garner
E
3

As @bradley.ayers says, the problem is in suds library (which is dead). You can use the fork he suggests: https://github.com/htj/suds-htj

However, the issue has been fixed in later versions of Debug Toolbar (> 0.9.4) by adding a try-catch statement around the related code. You can use the in-development version of the Debug Toolbar using:

   pip install django-debug-toolbar==dev

or or simply monkey-patch the try-catch block yourself somewhere in your module init files:

import debug_toolbar.panels.logger

original_emit = debug_toolbar.panels.logger.ThreadTrackingHandler.emit
def emit(self, record):
    try:
        original_emit(self, record)
    except:
        pass
debug_toolbar.panels.logger.ThreadTrackingHandler.emit = emit
Edger answered 22/10, 2013 at 19:8 Comment(0)
K
2

The Exception is caued by the None value returned by self.root, as following in suds.sax.Document,

def root(self): 
    if len(self.children): 
        return self.children[0] 
    else: 
        return None 

So it seems caused by lacking some data fields. Replay the exact data which you fill on the test server, on local machine again might help. Also check Django settings on the test server to make sure they are similar as your local settings.

Kinsey answered 10/3, 2012 at 9:19 Comment(1)
thanks for the reply okm... i try to check my settings but there is no problem...Brainless
B
0

I got this problem in our test server, the IP address is blocked by the WSDL server so when doing the process the WSDL server return an error to the test server.

Brainless answered 27/3, 2012 at 3:12 Comment(0)
E
0

I had to comment out the INTERNAL_IPS in my settings to make this bug disappear. Makes very little sense, but I hope this helps somebody else. =)

Extravehicular answered 8/4, 2012 at 21:34 Comment(2)
hi bahoo thanks for the reply, i don't have INTERNAL_IPS in my settings.Brainless
Try disabling your toolbar. Shot in the dark; but my INTERNAL_IPS setting that I had to disable was for the django-debug-toolbar, so maybe it's related. I had the same situation, standalone Python ran fine, but it blew up within my app... hope it helps.Extravehicular
F
0

@bradley.ayers is right. This issue is in suds library. I'm using suds==0.4 in my celery task.

workaround : Things started working for me when I switched the celeryd process' log level back to INFO from DEBUG.

Fixture answered 20/12, 2012 at 8:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.