weltlink/django-quickbooks

queue_manager.py _get_connection function failing

mccluret opened this issue · 10 comments

When BlockingConnection is being called it is basically just timing out.
Is there additional setup that is not documented? I get that there is a link to formal documentation.
So is there more to what I need in order to get this working?

I am rusty on how rabbitMQ works, you can use redis which is much easier to use AND reliable
let me know if you want any help setting it up with django_quickbooks
if you want to use RabbitMQ for some reason, please share with us the code snippet and the exception you get.

@hassaanalansary ohh okay, I just noticed that the queue_manager.py in django-quickbooks was using RabbitMQ, this is where I am currently stuck. Will switch to Celery/Redis and try to reimplement QueueManager.

Also, I am new to message queues, etc so if you wouldn't mind helping (and I don't mind paying for your time either if you want to hop on a zoom call) that would be awesome :)

Also, once I learn this project I can contribute several other QB objects like Sales Orders, etc. and help any way I can.

I have Redis and Celery setup/installed in my Django project. I am having a hard time understanding what the publish_message() function now needs to be.

    @shared_task()
    def publish_message(self, msg, queue_name, delete_queue=False):
        return msg

Thanks for your enthusiasm, your help is highly appreciated

You don't have to implement redis yourself, @bedilbek has done all the hard work and it is working out of the box.
Copy these to your settings.py and you should be good to go.
check the inline comments

QBWC_SETTINGS = {
    'QUEUE_MANAGER_CLASS': 'django_quickbooks.queue_manager.RedisManager',
    'REDIS_DEFAULT_HOST': 'localhost',
    'REDIS_DEFAULT_PORT': 6379,
    'REDIS_DEFAULT_DB': 0,
    'REDIS_DEFAULT_PASSWORD': None,
}

you can additionally add these to the same dict. It is not related to the issue, but I think it will be useful

Objects that have POS in their name are present only in my fork, as I use this repo for QBPOS not QBFS

    'APP_URL': 'YOUR_URL_ENDPOINT', # i.e. YOUR_DOMAIN/qwc/quickbooks-desktop/
    'APP_SUPPORT': 'YOUR_SUPPORT_URL_ENDPOINT' # i.e. YOUR_DOMAIN/qwc/quickbooks-desktop/support/,
    'APP_ID': '',
    'APP_NAME': 'YOUR_APP_NAME',
    'APP_DESCRIPTION': "YOUR_APP_DESCRIPTION",
    'OWNER_ID': 'GENERATE YOUR UUID',
    'LOCAL_MODEL_CLASSES': {
    # This is a pointing to my Customer Model in my app, replace with your own
        'Invoice': '',
        'Customer': '',
        'CustomerPOS': 'Inventory.models.Customer',  
        'ItemInventoryPOS': 'Inventory.models.Level7',
        'VoucherPOS': 'Inventory.models.OrderVoucher',
        'VendorPOS': 'Inventory.models.QBVendor',
        'SalesReceiptPOS': 'Inventory.models.OrderReceipt',
    },
    # if you want to handle Responses in some custom way you can inherit from the ResponseProcessor and point to it in this tuple
    'RESPONSE_PROCESSORS': (), 
    # same as above but this is for POS (only in my fork)
    'POS_RESPONSE_PROCESSORS': (
        'Inventory.qbd.ItemInventoryResponseProcessor',
        'Inventory.qbd.Level7AddResponseProcessor',
        'django_quickbooks.processors.VoucherQueryResponseProcessor',
        'django_quickbooks.processors.VoucherAddResponseProcessor',
        'django_quickbooks.processors.VendorQueryResponseProcessor',
        'django_quickbooks.processors.VendorAddResponseProcessor',
        'django_quickbooks.processors.CustomerQueryResponseProcessor',
        'django_quickbooks.processors.CustomerModResponseProcessor',
        'django_quickbooks.processors.CustomerAddResponseProcessor',
        'django_quickbooks.processors.SalesReceiptQueryResponseProcessor',
        'Inventory.qbd.SalesReceiptResponseProcessor',
    ),
    'TASKS_PER_REQUEST_LIMIT': 200, #only in my fork

If you are still having difficulties getting it to run we, lets have a talk later today
It would be great to have you as a contributor

@hassaanalansary If you're offering I'd love to take you up on a call. I've implemented an API client in R that connects via ODBC that I'd like to port. I have a working django app and am syncing customers using the admin module but am having trouble mapping fields.

@hassaanalansary Ahhh I pip installed and it looks like RedisManager in queue_manager.py isn't there on pypi.
Thank you for the input, will test more today.

If you would be interested in a paid call that would be great, I'll make availability at your convenience. A quick review, some general architectural questions for adding/contributing, creating my own response processor, etc.

Please advise!

PS: I did get it working for adding a customer so thanks a lot for the help. I will be adding sales orders and I think a call would paint a better picture and allow me to contribute meaningfully.

@mccluret I am glad you were able to add customers.
@mccluret @bill-ash I'd be happy to talk to you both, we can try tomorrow between 11EST - 1EST send me a meeting invitation on hassaanalansary@yahoo.com .

@hassaanalansary Awesome, just sent you one for 11am tomorrow.

@bill-ash If you want to hop on the same call you can, send me your email and I'll send you the zoom invite.

@hassaanalansary One last confusion I have is how to build the model and to_qbd function for many. Example is I need to add many SalesOrderLines

class SalesOrderLineAdd(models.Model):
    list_id = models.CharField(max_length=255, null=True)
    full_name = models.CharField(max_length=255, null=True)
    rate = models.FloatField(null=True)
    desc = models.CharField(max_length=255, null=True)
    quantity = models.IntegerField(max_length=255, null=True)
    item_ref_list_id = models.CharField(max_length=255, null=True)
    item_ref_full_name = models.CharField(max_length=255, null=True)


class SalesOrder(QBDModelMixin):
    customer_ref_list_id = models.CharField(max_length=255, null=True)
    customer_ref_full_name = models.CharField(max_length=255, null=True)
    template_ref_list_id = models.CharField(max_length=255, null=True)
    template_ref_full_name = models.CharField(max_length=255, null=True)
    sales_order_line_add = models.ForeignKey(SalesOrderLineAdd, on_delete=models.CASCADE)

    def to_qbd_obj(self, **fields):
        from django_quickbooks.objects import SalesOrder as QBSalesOrder
        # map your fields to the qbd_obj fields
        return QBSalesOrder(
            # todo map fields to qbd obj
            SalesOrderLineAdd=(??????)
            CustomerRef=(ListID=qbd_obj.customer_ref_list_id, FullName=qbd_obj.customer_ref_full_name)
        )

    @classmethod
    def from_qbd_obj(cls, qbd_obj):
        # map qbd_obj fields to your model fields
        return cls(
            # todo map fields from
            qbd_object_id=qbd_obj.ListID,
            qbd_object_version=qbd_obj.EditSequence
        )