• Stars
    star
    288
  • Rank 143,818 (Top 3 %)
  • Language
    Python
  • License
    BSD 3-Clause "New...
  • Created over 15 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A generic Django application to attach Files (Attachments) to any model.
https://travis-ci.org/bartTC/django-attachments.svg?branch=master Codacy Badge https://api.codacy.com/project/badge/Coverage/e13db6df2a2148b08c662798642aa611

django-attachments

django-attachments is a generic set of template tags to attach any kind of files to models.

Installation:

  1. Put attachments to your INSTALLED_APPS in your settings.py within your django project:

    INSTALLED_APPS = (
        ...
        'attachments',
    )
  2. Add the attachments urlpattern to your urls.py:

    url(r'^attachments/', include('attachments.urls', namespace='attachments')),
  3. Migrate your database:

    ./manage.py migrate
  4. Grant the user some permissions:

    • For adding attachments grant the user (or group) the permission attachments.add_attachment.
    • For deleting attachments grant the user (or group) the permission attachments.delete_attachment. This allows the user to delete their attachments only.
    • For deleting foreign attachments (attachments by other users) grant the user the permission attachments.delete_foreign_attachments.
  5. Set DELETE_ATTACHMENTS_FROM_DISK to True if you want to remove files from disk when Attachment objects are removed!

  6. Configure FILE_UPLOAD_MAX_SIZE (optional). This is the maximum size in bytes before raising form validation errors. If not set there is no restriction on file size.

Mind that you serve files!

django-attachments stores the files in your site_media directory and does not modify them. For example, if an user uploads a .html file your webserver will probably display it in HTML. It's a good idea to serve such files as plain text. In a Apache2 configuration this would look like:

<Location /site_media/attachments>
    AddType text/plain .html .htm .shtml .php .php5 .php4 .pl .cgi
</Location>

House-keeping

django-attachments provides the delete_stale_attachments management command. It will remove all attachments for which the related objects don't exist anymore! Sys-admins could then:

./manage.py delete_stale_attachments

You may also want to execute this via cron.

Local development

Installing a local devel environment with pipenv. It creates a virtualenv for you with the right ENV variables loaded from .env.

# pip install pipenv

$ pipenv install
Loading .env environment variables...
Installing dependencies from Pipfile.lock (a053bc)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

Tests

Run the testsuite in your local environment using pipenv:

$ cd django-attachments/
$ pipenv install --dev
$ pipenv run pytest attachments/

Or use tox to test against various Django and Python versions:

$ tox -r

You can also invoke the test suite or other 'manage.py' commands by calling the django-admin tool with the test app settings:

$ cd django-attachments/
$ pipenv install --dev
$ pipenv run test
$ pipenv run django-admin.py runserver
$ pipenv run django-admin makemigrations --dry-run

Building a new release

$ git tag
$ change version in setup.cfg
$ pip install -U setuptools
$ python setup.py sdist && python setup.py bdist_wheel --universal
$ twine upload --sign dist/*

Usage:

In contrib.admin:

django-attachments provides a inline object to add a list of attachments to any kind of model in your admin app.

Simply add AttachmentInlines to the admin options of your model. Example:

from django.contrib import admin
from attachments.admin import AttachmentInlines

class MyEntryOptions(admin.ModelAdmin):
    inlines = (AttachmentInlines,)

http://cloud.github.com/downloads/bartTC/django-attachments/attachments_screenshot_admin.png

In your frontend templates:

First of all, load the attachments_tags in every template you want to use it:

{% load attachments_tags %}

django-attachments comes with some templatetags to add or delete attachments for your model objects in your frontend.

  1. get_attachments_for [object]: Fetches the attachments for the given model instance. You can optionally define a variable name in which the attachment list is stored in the template context (this is required in Django 1.8). If you do not define a variable name, the result is printed instead.

    {% get_attachments_for entry as attachments_list %}
  2. attachments_count [object]: Counts the attachments for the given model instance and returns an int:

    {% attachments_count entry %}
  3. attachment_form: Renders a upload form to add attachments for the given model instance. Example:

    {% attachment_form [object] %}

    It returns an empty string if the current user is not logged in.

  4. attachment_delete_link: Renders a link to the delete view for the given attachment. Example:

    {% for att in attachments_list %}
        {{ att }} {% attachment_delete_link att %}
    {% endfor %}

    This tag automatically checks for permission. It returns only a html link if the give n attachment's creator is the current logged in user or the user has the delete_foreign_attachments permission.

Quick Example:

{% load attachments_tags %}
{% get_attachments_for entry as my_entry_attachments %}

<span>Object has {% attachments_count entry %} attachments</span>
{% if my_entry_attachments %}
<ul>
{% for attachment in my_entry_attachments %}
    <li>
        <a href="{{ attachment.attachment_file.url }}">{{ attachment.filename }}</a>
        {% attachment_delete_link attachment %}
    </li>
{% endfor %}
</ul>
{% endif %}

{% attachment_form entry %}

{% if messages %}
<ul class="messages">
{% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {{ message }}
    </li>
{% endfor %}
</ul>
{% endif %}

Settings

  • DELETE_ATTACHMENTS_FROM_DISK will delete attachment files when the attachment model is deleted. Default False!
  • FILE_UPLOAD_MAX_SIZE in bytes. Deny file uploads exceeding this value. Undefined by default.
  • AppConfig.attachment_validators - a list of custom form validator functions which will be executed against uploaded files. If any of them raises ValidationError the upload will be denied. Empty by default. See attachments/tests/testapp/apps.py for an example.

More Repositories

1

django-memcache-status

Django admin extension that displays statistics about your memcached instances.
Python
269
star
2

django-frontendadmin

Not in active development; see README -- django-frontendadmin is a set of templatetags to allow an easy and unobstrusive way to edit model-data in the frontend of your page. See wiki for screencast!
Python
188
star
3

pip-check

pip-check gives you a quick overview of all installed packages and their update status.
Python
156
star
4

django-markup

Convert text markup to html. Markdown, rST, Textile etc.
Python
143
star
5

django-wakawaka

A simple wiki app written in Python using the Django framework.
Python
114
star
6

django-generic-flatblocks

A flatpages/flatblock application using generic relations to content models.
Python
67
star
7

django-templatesadmin

Not in active development. See readme. A Django app to make minor changes to your templates on the fly.
Python
54
star
8

django-eventlog

django-eventlog is a very simple event logger you can use to track certain actions in your code. Events are stored in a Django model and can be viewed in the Django Admin.
Python
29
star
9

django-comments-spamfighter

Not in active development; see README -- A Django app that contributes Akismet and Keyword blocking to your django comments.
Python
17
star
10

dpasteGUI

The OS X gui to quickly paste snippets to the dpaste.de pastebin.
Objective-C
10
star
11

django-staticinline

Django template tag to load static files inline with your template.
Python
9
star
12

SubDpaste

Paste code snippets on dpaste.de.
Python
8
star
13

tab

Opens a new OS X Terminal window with the current directory and runs an optional command in it.
Python
5
star
14

starcel

Starcel is a static page generator that helps you to transforms HTML/CSS/JS using ParcelJS.
HTML
3
star
15

fetch-sitemap

Python
1
star
16

go-like

It's like a Facebook Like button, but without Facebook.
Go
1
star