Code Monkey home page Code Monkey logo

Comments (7)

jmcarp avatar jmcarp commented on September 23, 2024

Thanks for reporting this. The result_or_error helper throws a BetfairAPIError if the response JSON doesn't include a result key. That may be the source of the error you're describing. I thought the Betfair API always returned a 'resultkey, even if there were no results, but if that's not the case, we can change theresult_or_error` methods so that it handles the missing key and returns an empty list.

from betfair.py.

goetzk avatar goetzk commented on September 23, 2024

I made the following (rather ugly) changes to print out the responses I was getting from the API.

diff --git a/betfair/betfair.py b/betfair/betfair.py
index 0ec4c5e..7ff64e1 100644
--- a/betfair/betfair.py
+++ b/betfair/betfair.py
@@ -70,6 +70,10 @@ class Betfair(object):

     def make_api_request(self, method, params, codes=None, model=None):
         payload = utils.make_payload(method, params)
+        print "\n"
+        print "payload"
+        print payload
+        print "\n"
         response = self.session.post(
             self.API_URL,
             data=json.dumps(payload),
@@ -77,6 +81,10 @@ class Betfair(object):
         )
         utils.check_status_code(response, codes=codes)
         result = utils.result_or_error(response)
+        print "\n"
+        print "result"
+        print result
+        print "\n"
         return utils.process_result(result, model)

     # Authentication methods
diff --git a/betfair/meta/model.py b/betfair/meta/model.py
index 48c9943..eee8eb7 100644
--- a/betfair/meta/model.py
+++ b/betfair/meta/model.py
@@ -29,6 +29,10 @@ class Model(object):

     def unserialize(self, kwargs):
         for key, value in six.iteritems(kwargs):
+            print "key"
+            print key
+            print "value"
+            print value
             key = self.unserialize_key(key)
             if key not in self._fields:
                 raise ValueError('Key {0} not in model schema'.format(key))

It produces the following output

kgoetz$ ./bf.py 


payload
{'params': {'orderBy': None, 'sortDir': None, 'recordCount': None, 'dateRange': None, 'betIds': None, 'orderProjection': None, 'marketIds': None, 'fromRecord': None}, 'jsonrpc': '2.0', 'method': 'SportsAPING/v1.0/listCurrentOrders', 'id': 1}




result
{u'currentOrders': [], u'moreAvailable': False}


key
currentOrders
value
[]
key
moreAvailable
value
False
Traceback (most recent call last):
  File "./longodds.py", line 27, in <module>
    all_current_bets = bf.list_current_orders()
  File "<string>", line 2, in list_current_orders
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/utils.py", line 125, in requires_login
    return func(*args, **kwargs)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/betfair.py", line 346, in list_current_orders
    model=models.CurrentOrderSummaryReport,
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/betfair.py", line 88, in make_api_request
    return utils.process_result(result, model)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/utils.py", line 82, in process_result
    return model(**result)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 16, in __init__
    self.unserialize(kwargs)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 40, in unserialize
    self.check_complete()
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.3-py2.7.egg/betfair/meta/model.py", line 50, in check_complete
    ', '.join(missing)
ValueError: Missing values on fields current_orders

As you can see from the stack trace I'm still on 0.1.3 - I will try and test again on the weekend with current git head.

from betfair.py.

goetzk avatar goetzk commented on September 23, 2024

I've just done two tests on this:
0.1.4 codebase produces the same error message displayed above.

python2.7 ./longodds.py 
Traceback (most recent call last):
  File "./longodds.py", line 37, in <module>
    cord = bf.list_current_orders()
  File "<string>", line 2, in list_current_orders
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/utils.py", line 125, in requires_login
    return func(*args, **kwargs)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/betfair.py", line 338, in list_current_orders
    model=models.CurrentOrderSummaryReport,
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/betfair.py", line 88, in make_api_request
    return utils.process_result(result, model)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/utils.py", line 82, in process_result
    return model(**result)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 20, in __init__
    self.unserialize(kwargs)
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 45, in unserialize
    self.check_complete()
  File "/Users/kgoetz/Library/Python/2.7/lib/python/site-packages/betfair.py-0.1.4-py2.7.egg/betfair/meta/model.py", line 55, in check_complete
    ', '.join(missing)
ValueError: Missing values on fields current_orders

Second was submitting the son manually

    {
        "jsonrpc": "2.0",
        "method": "SportsAPING/v1.0/listCurrentOrders",
        "id": 1
    }

The returned data has a result key

{
  "jsonrpc": "2.0",
  "result": {
    "currentOrders": [],
    "moreAvailable": false
  },
  "id": 1
}

Does this help figure out where the problem lies?

from betfair.py.

JohanSkoglund avatar JohanSkoglund commented on September 23, 2024

Hi.
My suggestion for a solution for getting "listcurrentorders" contains 4 different modifications:
1: return value from utils.result_or_error(response) is stored in a member variable in the betfair class which makes debugging much easier
2: unserialize in meta.datatype contains an if statement which handles types containing a single value or multiple values differently
3: removed "required=true" from currentordersummary in models.py. The documentation says that this field always exists but obviously this value is lost somewhere on the internet...
4: made all parameters used by list_current_orders optional

 betfair/betfair.py       | 6 ++++--
 betfair/meta/datatype.py | 5 ++++-
 betfair/models.py        | 2 +-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/betfair/betfair.py b/betfair/betfair.py
index ba5c764..bf77e31 100644
--- a/betfair/betfair.py
+++ b/betfair/betfair.py
@@ -80,6 +80,7 @@ class Betfair(object):
         )
         utils.check_status_code(response, codes=codes)
         result = utils.result_or_error(response)
+        self.resp=result
         return utils.process_result(result, model)

     # Authentication methods
@@ -314,8 +315,9 @@ class Betfair(object):

     @utils.requires_login
     def list_current_orders(
-            self, bet_ids, market_ids, order_projection, date_range, order_by,
-            sort_dir, from_record, record_count):
+            self, bet_ids=None, market_ids=None, order_projection=None, 
+            date_range=None, order_by=None,
+            sort_dir=None, from_record=None, record_count=None):
         """

         :param bet_ids:
diff --git a/betfair/meta/datatype.py b/betfair/meta/datatype.py
index 0b0df55..70fe6db 100644
--- a/betfair/meta/datatype.py
+++ b/betfair/meta/datatype.py
@@ -17,4 +17,7 @@ class DataType(object):
         processed = self.preprocess(value)
         if isinstance(processed, self.type):
             return processed
-        return self.type(processed)
+        if(isinstance(processed,dict)):
+           return self.type(**processed)
+        else:
+           return self.type(processed)
diff --git a/betfair/models.py b/betfair/models.py
index e3786eb..cb14e46 100644
--- a/betfair/models.py
+++ b/betfair/models.py
@@ -296,7 +296,7 @@ class CurrentOrderSummary(BetfairModel):
     persistence_type = Field(EnumType(constants.PersistenceType), required=True)
     order_type = Field(EnumType(constants.OrderType), required=True)
     placed_date = Field(datetime_type, required=True)
-    matched_date = Field(datetime_type, required=True)
+    matched_date = Field(datetime_type)
     average_price_matched = Field(DataType(float))
     size_matched = Field(DataType(float))
     size_remaining = Field(DataType(float))

from betfair.py.

jmcarp avatar jmcarp commented on September 23, 2024

Thanks for looking into this. @JohanSkoglund, parts 3 and 4 of your patch sound good--would you like to send a pull request, or should I make the changes myself?

About part 1, all things being equal, I'd prefer to store less state on the Betfair object. For debugging, the BetfairAPIError exception that gets raised exposes the response it died on, which you can get to like this:

# do something that raises a `BetfairAPIError`...
import sys
sys.last_value.response

And about part 2, unless it fixes a specific bug you're running into, I'd like to defer updates to the model logic while I evaluate porting the models to schematics, which is a more robust and fuller-featured library than the homegrown code we're using at the moment.

from betfair.py.

goetzk avatar goetzk commented on September 23, 2024

@JohanSkoglund Was that the correct hunk from models.py?

from betfair.py.

JohanSkoglund avatar JohanSkoglund commented on September 23, 2024

@goetzk
matched_date = Field(datetime_type, required=True)
is changed to
matched_date = Field(datetime_type)
because matched_date is not always available

from betfair.py.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.