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

1.8k views Asked by At

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?

2

There are 2 answers

3
hynekcer On BEST ANSWER

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.

0
Jasneet Dua On

Salesforce has a dedicated endpoint to stream blob of file

{{endpoint}}/services/data/v{{version}}/connect/files/{{file_id}}/content

Parameters:

  1. endpoint: instance URL
  2. version: API version
  3. file_id: contentDocument record id