Amsterdam-Music-Lab / MUSCLE

An application to easily set up and run online listening experiments for music research.
https://www.amsterdammusiclab.nl/
MIT License
4 stars 1 forks source link

Update django to 4.2.0, update python to 3.11 #1158

Closed Evert-R closed 1 week ago

Evert-R commented 1 week ago

This PR updates python and django. When CSRF_TRUSTED_ORIGINS is present, all backend tests are now succesfull, but I suggest we test this update thoroughly. I ran all the experiments on my machine and everything seems to be working fine.

Updated:

This needs to be added to the environment variables:

See: Django documentation

Deprecated functions

This is used by Django inline actions which hasn't been updated since 2021.

Fixed by: putting django.utils.translation.ugettext_lazy = gettext_lazy in base_settings.py

Behaviour changes

When creating a new playlist and selecting a csv file, the csv was always processed even though process_csv was not selected

Fixed by: Only reading the csv file to the Playlist.csv field when process_csv is selected.

Syntax changes

Fixed by converting the output to a list. old_songs = random.sample(list(old_new_song_set), k=n_old)

Fixed by replacing:

    @classmethod
    def setUpTestData(self):
        self.factory = RequestFactory()
        self.site = AdminSite()
        self.admin = PhaseAdmin(
            Phase,
            self.site
        )

with:

    def setUp(self):
        self.admin = PhaseAdmin(model=Phase,
                                admin_site=AdminSite
                                )

In python 3.11 this caused the following error:

======================================================================
ERROR: test_search_fields (image.tests.test_admin.ImageAdminTest.test_search_fields)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/server/image/tests/test_admin.py", line 34, in test_search_fields
    self.assertEqual(self.admin.search_fields, expected_search_fields)
                     ^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/test/testcases.py", line 1402, in __get__
    data = deepcopy(self.data, memo)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 271, in _reconstruct
    state = deepcopy(state, memo)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 146, in deepcopy
    y = copier(x, memo)
        ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 231, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
                             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 271, in _reconstruct
    state = deepcopy(state, memo)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 146, in deepcopy
    y = copier(x, memo)
        ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 231, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
                             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 271, in _reconstruct
    state = deepcopy(state, memo)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 146, in deepcopy
    y = copier(x, memo)
        ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 231, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
                             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 146, in deepcopy
    y = copier(x, memo)
        ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 231, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
                             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 271, in _reconstruct
    state = deepcopy(state, memo)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 146, in deepcopy
    y = copier(x, memo)
        ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 231, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
                             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/copy.py", line 161, in deepcopy
    rv = reductor(4)
         ^^^^^^^^^^^
TypeError: cannot pickle 'module' object
Evert-R commented 1 week ago

If the tests succeed and (ideally) don't take 15 minutes to complete, I'd say this is good to go. Perhaps you could deploy it to the test environment just in case before merging its to see if it works "in real life".

Yes, I'll do that tomorrow ! Nice to have this done for my holiday