Skip to main content

Django app for enabling and tracking CSV downloads

Project description

Django CSV Downloads

Django app for tracking queryset-backed CSV downloads

Version support

The current version of the this app support Python 3.8+ and Django 3.2+

What does this app do?

This app is used to track user downloads of CSVs that are derived from Django QuerySets. You provide the filename, queryset and the list of columns that you want to output.

It has a single model (CsvDownload) that tracks downloads and stores the user, filename, row count and timestamp.

Usage

The recommended way to use this app is to rely on django_csv.views.download_csv, which wraps up the creation of the download object and the generation of the CSV itself:

# DISPLAY PURPOSES ONLY: DO NOT ENABLE USER DATA DOWNLOADS IN PRODUCTION
def download_users(request: HttpRequest) -> HttpResponse:
    data = User.objects.all()
    columns = ("first_name", "last_name", "email")
    return download_csv(request.user, "users.csv", data, *columns)

Settings

There is a CSV_DOWNLOAD_MAX_ROWS setting that is used to truncate output. Defaults to 10000. This is a backstop, and can be overridden on a per use basis.

Examples

Caution: All of these examples invåolve the User model as it's ubiquitous - DO NOT DO THIS ON A PRODUCTION ENVIRONMENT.

Example of writing a QuerySet to a file:

>>> data = User.objects.all()
>>> columns = ("first_name", "last_name", "email")
>>> with open('users.csv', 'w') as csvfile:
>>>     csv.write_csv(csvfile, data, *columns)
10  #<--- row count

adding a custom header:

>>> data = User.objects.all()
>>> columns = ("first_name", "last_name", "email")
>>> column_headers = ("given_name", "family_name", "email_address")
>>> with open('users.csv', 'w') as csvfile:
>>>     csv.write_csv(csvfile, data, *columns, column_headers=column_headers)
10

Example of writing to an HttpResponse:

>>> response = HttpResponse(content_type="text/csv")
>>> response["Content-Disposition"] = 'attachment; filename="users.csv"'
>>> csv.write_csv(response, data, *columns)
10

Example of writing to an in-memory text buffer:

>>> buffer = io.StringIO()
>>> csv.write_csv(buffer, data, *columns)
10

Example of writing directly to S3:

>>> with s3.s3_upload("bucket_name", "object_key") as buffer:
...     csv.write_csv(fileobj, queryset, *columns)
10
>>> # one-line convenience function
>>> s3.write_csv_s3("bucket_name/object_key", queryset, *columns)
10

Example of writing directly to SFTP:

# requires a paramiko.SFTPClient to have been created / connected.
>>> with sft.sftp_upload(client, remote_filepath) as fileobj:
...     write_csv(fileobj, queryset, *columns)
10
>>> # one-line convenience function
>>> sftp.write_csv_sftp("sftp://user:pass@host:port/path", queryset, *columns)
10

Example of a custom admin action to download User data:

class CustomUserAdmin(UserAdmin):

    actions = ['download']
    csv_fields = ("first_name", "last_name", "email", "is_staff")
    csv_filename = "users.csv"

    def download(self, request, queryset):
        """Download selected users as a CSV."""
        return download_csv(
            user=request.user,
            filename=CustomUserAdmin.csv_filename,
            queryset=queryset,
            *CustomUserAdmin.csv_fields
        )

    download.short_description = "Download selected users"

Example CBV that restricts queryset based on request.user:

class DownloadUsers(CsvDownloadView):

    def has_permission(self, request: HttpRequest) -> bool:
        return request.user.is_authenticated

    def get_queryset(self, request: HttpRequest) -> QuerySetWriter:
        """Allow superusers to download Users."""
        if request.user.is_superuser:
            return User.objects.all().order_by("first_name", "last_name")
        return User.objects.none()

    def get_filename(self, request: HttpRequest) -> str:
        return "users.csv"

    def get_columns(self, request: HttpRequest) -> str:
        return ("first_name", "last_name")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_csv_downloads-1.3.tar.gz (10.3 kB view details)

Uploaded Source

Built Distribution

django_csv_downloads-1.3-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

Details for the file django_csv_downloads-1.3.tar.gz.

File metadata

  • Download URL: django_csv_downloads-1.3.tar.gz
  • Upload date:
  • Size: 10.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.10.10 Darwin/23.1.0

File hashes

Hashes for django_csv_downloads-1.3.tar.gz
Algorithm Hash digest
SHA256 7e42d6823481ad5f6ba9998d7bb4af17738abac92aee263635c6f1e82dac3168
MD5 66b84596b7a9000e9a7def14dcde4d53
BLAKE2b-256 3abbe24a6c54235fb4affc03ee01543234aaf6608788fc9101237ec2a6f9f583

See more details on using hashes here.

File details

Details for the file django_csv_downloads-1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for django_csv_downloads-1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 240bc2c16a294a2ab7f52a6d157d29d4d0516b9d20890b2a3bffd6e4e2f57c27
MD5 2e88c0aed7284142b46b40127a08485e
BLAKE2b-256 d65994f77163b77027cbac6e002dedd4cf2d9b51aa53eb9fb4faa4197d2b4d3f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page