CentreForDigitalHumanities / CentreForDigitalHumanities/django-shared-core

Debian 13: I/O operation on closed file

Open
#140 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
1
Forks
2
PR merge metrics
No merged PRs in 30d

Description

Occurs when uploading a on a CDHFileField, Debian 13 with DSC-3.4pre2.

```
[23/Jun/2026 10:35:40] ERROR [django.request:246] Internal Server Error: /proposals/attach_proposal/dmp/52/
Traceback (most recent call last):
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/sentry_sdk/integrations/django/views.py", line 108, in sentry_wrapped_callback
return callback(request, *args, **kwargs)
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/views/generic/base.py", line 105, in view
return self.dispatch(request, *args, **kwargs)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/views/generic/base.py", line 144, in dispatch
return handler(request, *args, **kwargs)
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/views/generic/edit.py", line 184, in post
return super().post(request, *args, **kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/views/generic/edit.py", line 153, in post
return self.form_valid(form)
~~~~~~~~~~~~~~~^^^^^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/views/generic/edit.py", line 135, in form_valid
self.object = form.save()
~~~~~~~~~^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/source/proposals/views/attachment_views.py", line 70, in save
self.instance.save()
~~~~~~~~~~~~~~~~~~^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/db/models/base.py", line 814, in save
self.save_base(
~~~~~~~~~~~~~~^
using=using,
^^^^^^^^^^^^
...<2 lines>...
update_fields=update_fields,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/db/models/base.py", line 873, in save_base
with context_manager:
^^^^^^^^^^^^^^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/db/transaction.py", line 307, in __exit__
connection.set_autocommit(True)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/db/backends/base/base.py", line 500, in set_autocommit
self.run_and_clear_commit_hooks()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/db/backends/base/base.py", line 778, in run_and_clear_commit_hooks
func()
~~~~^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/cdh/files/db/wrappers.py", line 198, in
transaction.on_commit(lambda: _save_file(
~~~~~~~~~~^
self.storage,
^^^^^^^^^^^^^
self.name_on_disk,
^^^^^^^^^^^^^^^^^^
content, self.field.max_length
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
))
^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/cdh/files/db/wrappers.py", line 36, in _save_file
storage.save(
~~~~~~~~~~~~^
name_on_disk,
^^^^^^^^^^^^^
content,
^^^^^^^^
max_length=max_length
^^^^^^^^^^^^^^^^^^^^^
)
^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/core/files/storage/base.py", line 49, in save
name = self._save(name, content)
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/core/files/storage/filesystem.py", line 105, in _save
for chunk in content.chunks():
~~~~~~~~~~~~~~^^
File "/hum/web/gw-d13-portaldev-fetc-tst.im.hum.uu.nl/data/env/lib/python3.13/site-packages/django/core/files/uploadedfile.py", line 119, in chunks
self.file.seek(0)
~~~~~~~~~~~~~~^^^
ValueError: I/O operation on closed file.
```

Steps to reproduce in ethics:

1. Clone `master` of ethics
2. `python manage.py load_fixtures`, create a local user, and `runserver`
3. Create a new proposal, navigate to the documents step, and attempt to attach a file

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the upload flow in ethics using `python manage.py load_fixtures` and `runserver`, following the proposal and documents steps. Start with `proposals/views/attachment_views.py` at line 70 and the `cdh/files/db/wrappers.py` callback at line 198, then trace why the uploaded content is closed before `storage.save`; done means attaching a file no longer raises the reported error.

Written by the indexing model from the issue text.

Assessment

Tech stack
django, python
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.