This simple app provides:
- a Document model with:
- a generic many to many relation
- a file field that uploads to a private directory
- a method get_download_url()
- a view to download a document which allows custom security checks through a signal
- a signal, document_pre_download, that is emited by the download view, and which responds with 503 if emiting the signal raises a DownloadForbidden exception
- clean admin integration
- south support
Refer to django-generic-m2m installation documentation, do "Installation" and "Adding to your Django Project".
Refer to django-autocomplete-light installation documentation, do "Quick install" and "Quick admin integration".
Download the lastest release:
pip install django-documents
Or install the development version:
pip install -e git+https://github.com/yourlabs/django-documents.git#egg=documents
Add to settings.INSTALLED_APPS:
If using south, run:
Add to urls.py:
Set settings.DOCUMENTS_UPLOAD_TO to the absolute path where uploads should be stored. This must be a private directory.
Prepare the generic many to many autocomplete
Register a generic autocomplete, with name "AutocompleteDocumentRelations". There is an example in test_project which is imported in urls.py. Refer the django-autocomplete-light documentation about the registry for alternative methods.
If the project already uses django-generic-m2m and django-autocomplete-light, a good solution is to re-register the project's generic autocomplete with name='AutocompleteDocumentRelations', ie.:
# your project specific autocomplete class AutocompleteProject(autocomplete_light.AutocompleteGenericBase): # .... # register for your project needs autocomplete_light.register(AutocompleteProject) # registery for documents relations autocomplete_light.register(AutocompleteProject, name='AutocompleteDocumentRelations')
Secure your documents
Connect to document_pre_import, for example:
# project specific document permissions import documents def document_security(sender, request, document, **kwargs): if not request.user.is_staff: raise documents.DownloadForbidden() documents.document_pre_download.connect(document_security)