Search code examples
pythondjangosalesforcebeatboxdjango-salesforce

How to fetch Salesforce Attachment file content with django-salesforce?


I'm developing a Django 1.11 app serving as a UI for some Salesforce Objects using django-salesforce for the communication with Salesforce.

I have to give users the option to download files from Salesforce Attachment objects related to their Contact.

# Django Attachment model on my_app/models.py

...

class Attachment(models.Model):
    parent = models.ForeignKey(Contact, models.DO_NOTHING,
                               sf_read_only=models.NOT_UPDATEABLE)
    name = models.CharField(max_length=255, verbose_name='File Name')
    content_type = models.CharField(max_length=120, blank=True, null=True)
    body_length = models.IntegerField(sf_read_only=models.READ_ONLY)
    body = models.TextField()

...

On this Attachment model I can access the rest URL for the file content on the body field, but not the actual content.

Is there a way of getting file content from the Attachment without having to implement an OAuth client just for this?


Solution

  • A) by REST API request encapsulated by handle_api_exceptions

    from salesforce.backend.driver import handle_api_exceptions
    # from salesforce.dbapi.driver import handle_api_exceptions  # can be changed soon to this
    from django.db import connections
    
    session = connections['salesforce'].sf_session
    rows = Attachment.objects.filter(...)
    for row in rows:
        url = session.auth.instance_url + row.body
        blob = handle_api_exceptions(url, session.get).text
    

    B) You can get SOAP client (requires Beatbox) by

    from salesforce.utils import get_soap_client
    import base64
    
    soap = get_soap_client('salesforce')
    for ...:
        ret = soap.query("SELECT Body FROM Attachment WHERE Id = '...'")
        blob = base64.b64decode(ret)[0]['Body'])
    

    Useful related answers are:

    EDIT I expect that you mean User = some Contact, not a Contact necessarily related to SFDC object User with some form of paid license. They should download only through your site, not directly, for security reasons. Any OAuth can not probably improve it.