Install it
$ pip install leadrouter
First get a user
and token
from the lead_router
project, it will identify your project and which permissions you have.
If you're a Real Geeks client write a message to support asking for credentials for the Incoming Leads API for your site.
import leadrouter
client = leadrouter.Client('receivers.leadrouter.realgeeks.com',
user='me', token='secret')
with a Client
object created use one the methods below. For details on which fields you can send for lead
and activities
check our documentation
Send a new lead.
site_uuid
is a string with the RG2 Site UUIDlead
id a dictionary with lead fields
Update an existing lead.
site_uuid
is a string with the RG2 Site UUIDlead_uuid
is a string with the Lead Manager Lead UUIDlead
id a dictionary with lead fields to be overriden
Add activities to an existing lead.
site_uuid
is a string with the RG2 Site UUIDlead_uuid
is a string with the Lead Manager Lead UUIDactivities
is a list of dictionaries, each dictionary is an activitity
Send a new potential seller lead. Somebody who attempted to view a property valuation but didn't sign-up to give contact details. So all we have is the property they looked at.
site_uuid
is a string with the RG2 Site UUIDlead
id a dictionary with lead fields
All methods return None
on success. On failure will raise HTTPError
exception
with a generic error message.
If this exception was raises due to a invalid response from the server, like a 404, 400 or 500 the exception object will have two useful attributes;
status_code
: integer with the response status coderesponse_text
: original response body as string
We have a client implementation that instead of sending requests directly just put them in a queue to be sent asynchronously, it's the Publisher
and subscriber
.
First, you will need to install the beanstalkc
and pyyaml
client libraries from pip (optional dependencies)
Use Publisher
the same way you would use Client
:
import leadrouter
client = leadrouter.Publisher('receivers.leadrouter.realgeeks.com',
user='me', token='secret')
extra arguments could be given to customize the beanstalkd
address and tube to use: beanstalkd_host
, beanstalkd_port
, beanstalkd_tube
.
To consume the queue and actually make requests use:
$ leadrouter subscriber
make sure it's using the same beanstalkd
and same tube. The defaults should just work.
There is also a DebugPublisher
available for development. If you have a project using Publisher
but don't want to use beanstalkd
locally, it will record all method calls in a file for debugging.
When you use the Async send feature above sometimes a job could fail, most times it will retry but errors like validation errors will not retry. First look for the JSON body of a job, it will be logged and sent to Sentry. It looks like this:
{
"parsed_job_body": {
"host": "receivers.leadrouter.realgeeks.com",
"params": {
"lead_uuid": "8bac1437ad7b5433b248ebe8bf708b24",
"site_uuid": "089df7bf-db46-4453-b29a-6b02700c4426",
"activities": [{
"source": "My App",
"type": "property_viewed",
"property": {"full_baths": 2.5},
"created": "2019-02-06T21:19:51.284522+00:00"
}]
},
"method": "add_activities",
"auth": ["User", "Password"]
},
"retry": false,
"log_level": "ERROR",
"job_id": 1005832440,
"log_message": "send failed: Property field 'full_baths' is not a valid integer.",
"response_status": 422,
"response_body": "{\"error\": \"Property field 'full_baths' is not a valid integer.\"}\n",
"traceback": ""
}
Note how it failed to send to the lead_router
due to a validation error, these errors will not
retry. Now save this json in a file job.json
, modify the body to fix it and resend with:
$ leadrouter send job.json
If you want to use Async Send there is a docker image, quay.io/realgeeks/leadrouter_subscriber
. Set the following environment variables:
BEANSTALK_HOST
BEANSTALK_PORT
BEANSTALK_TUBE
LOGLEVEL
To help with development, first clone and create a virtualenv. Inside the project folder run:
$ pip install -e .
In order to run all tests beanstalkd
need to be
running:
$ brew install beanstalkd
$ beanstalkd -V
pid 80350
bind 4 0.0.0.0:11300
then run tests:
$ pip install tox
$ tox
If you're familiar with py.test custom arguments can be provided. This way you can run specific tests in a specific environment:
$ source .tox/py26/bin/activate
$ python setup.py test --pytest-args='-v --tb=short'
To build your docker environment, run:
$ docker-compose build
Now, open a shell in the docker container:
$ docker-compose run leadrouter_subscriber bash
then run tests:
root@container-sha:/usr/src/app# tox
It will calculate the coverage, if you want to view the coverage report in html, use:
$ coverage html # you need to 'pip install coverage' first
$ open htmlcov/index.html
Upload version to pypi:
$ python setup.py sdist
$ twine upload dist/*