Creating test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...
test_fix_cave_bare_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_bare_url115)
Expect to get Page Not Found and status 404 ... ok
test_fix_cave_slug115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_slug115)
Expect to get Page Not Found and status 404 ... ok
test_fix_cave_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url115) ... ERROR
test_fix_cave_url284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url284) ... ERROR
test_fix_caves284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_caves284) ... ERROR
test_fix_expedition (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_expedition) ... ERROR
test_fix_person (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_person) ... ok
test_fix_personexped (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_personexped) ... ok
test_fix_cave_loaded115 (troggle.core.TESTS.test_caves.FixtureTests.test_fix_cave_loaded115) ... ok
test_fix_cave_loaded284 (troggle.core.TESTS.test_caves.FixtureTests.test_fix_cave_loaded284) ... ok
test_fix_person_loaded (troggle.core.TESTS.test_caves.FixtureTests.test_fix_person_loaded) ... ok
test_page_personexpedition (troggle.core.TESTS.test_caves.FixtureTests.test_page_personexpedition) ... ok
test_logbook_exists (troggle.core.TESTS.test_imports.ImportTest.test_logbook_exists) ... ok
test_installs (troggle.core.TESTS.test_imports.SubprocessTest.test_installs)
Expects external software installed: cavern, survexport, git ... ok
test_loser_survex_status (troggle.core.TESTS.test_imports.SubprocessTest.test_loser_survex_status)
Expects no failures of survex files ... FAIL
test_repos_git_status (troggle.core.TESTS.test_imports.SubprocessTest.test_repos_git_status)
Expects clean git repos with no added files and no merge failures ... FAIL
test_utf8 (troggle.core.TESTS.test_imports.SubprocessTest.test_utf8)
Expects that utf8 is the default encoding when opening files ... ok
test_admin_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_admin_login) ... ok
test_authentication_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_authentication_login) ... ok
test_noinfo_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_noinfo_login) ... ok
test_ordinary_login (troggle.core.TESTS.test_logins.ComplexLoginTests.test_ordinary_login) ... ok
test_user_force (troggle.core.TESTS.test_logins.ComplexLoginTests.test_user_force) ... ok
test_fix_admin_login_fail (troggle.core.TESTS.test_logins.FixturePageTests.test_fix_admin_login_fail) ... ok
test_dwg_upload_drawing (troggle.core.TESTS.test_logins.PostTests.test_dwg_upload_drawing)
Expect no-suffix file to upload ... ok
test_dwg_upload_txt (troggle.core.TESTS.test_logins.PostTests.test_dwg_upload_txt)
Expect .pdf file to be refused upload ... ok
test_file_permissions (troggle.core.TESTS.test_logins.PostTests.test_file_permissions)
Expect to be allowed to write to SCANS_ROOT, DRAWINGS_DATA, SURVEX_DATA, EXPOWEB ... ok
test_photo_folder_create (troggle.core.TESTS.test_logins.PostTests.test_photo_folder_create)
Create folder for new user ... ERROR
test_photo_upload (troggle.core.TESTS.test_logins.PostTests.test_photo_upload)
Expect photo upload to work on any file (contrary to msg on screen) ... ERROR
test_photo_upload_rename (troggle.core.TESTS.test_logins.PostTests.test_photo_upload_rename)
Expect photo upload to work on any file (contrary to msg on screen) ... ERROR
test_scan_upload (troggle.core.TESTS.test_logins.PostTests.test_scan_upload)
Expect scan upload to wallet to work on any file ... ok
test_aliases (troggle.core.TESTS.test_parsers.ImportTest.test_aliases) ... ok
test_lbe (troggle.core.TESTS.test_parsers.ImportTest.test_lbe) ... ok
test_lbe_edit (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_edit)
This page requires the user to be logged in first, hence the extra shenanigans ... ok
test_lbe_new (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_new)
This page requires the user to be logged in first, hence the extra shenanigans ... ERROR
test_logbook_exists (troggle.core.TESTS.test_parsers.ImportTest.test_logbook_exists) ... ok
test_logbook_parse_issues (troggle.core.TESTS.test_parsers.ImportTest.test_logbook_parse_issues)
This is just testing the db not the web page ... ok
test_people (troggle.core.TESTS.test_parsers.ImportTest.test_people) ... ok
test_survexfiles (troggle.core.TESTS.test_parsers.ImportTest.test_survexfiles) ... ERROR
test_statistics (troggle.core.TESTS.test_urls.URLTests.test_statistics) ... ok
test_stats (troggle.core.TESTS.test_urls.URLTests.test_stats) ... ok
test_url_allscans (troggle.core.TESTS.test_urls.URLTests.test_url_allscans)
Test the {% url "allscans" %} reverse resolution ... ok
test_url_stats (troggle.core.TESTS.test_urls.URLTests.test_url_stats)
Test the {% url "stats" %} reverse resolution ... ok
test_url_survexcaveslist (troggle.core.TESTS.test_urls.URLTests.test_url_survexcaveslist)
Test the {% url "allscans" %} reverse resolution ... ok
test_url_threed (troggle.core.TESTS.test_urls.URLTests.test_url_threed)
Test the {% url "threed" %} reverse resolution ... ok
test_cave_kataster_not_found (troggle.core.TESTS.tests.PageTests.test_cave_kataster_not_found) ... ok
test_caves_page (troggle.core.TESTS.tests.PageTests.test_caves_page) ... ok
test_caves_page_kataster_not_found (troggle.core.TESTS.tests.PageTests.test_caves_page_kataster_not_found) ... ok
test_dataissues (troggle.core.TESTS.tests.PageTests.test_dataissues) ... ok
test_expoweb_dir (troggle.core.TESTS.tests.PageTests.test_expoweb_dir) ... ok
test_expoweb_dir_no_index (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_no_index) ... ok
test_expoweb_dir_with_index2 (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index2) ... ok
test_expoweb_dir_with_index_htm (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index_htm) ... ok
test_expoweb_dir_with_index_html (troggle.core.TESTS.tests.PageTests.test_expoweb_dir_with_index_html) ... ok
test_expoweb_dirslash (troggle.core.TESTS.tests.PageTests.test_expoweb_dirslash) ... ok
test_expoweb_htm (troggle.core.TESTS.tests.PageTests.test_expoweb_htm) ... ok
test_expoweb_no_dir (troggle.core.TESTS.tests.PageTests.test_expoweb_no_dir) ... ok
test_expoweb_notfound (troggle.core.TESTS.tests.PageTests.test_expoweb_notfound) ... ok
test_expoweb_paths (troggle.core.TESTS.tests.PageTests.test_expoweb_paths) ... ok
test_expoweb_root (troggle.core.TESTS.tests.PageTests.test_expoweb_root) ... ok
test_expoweb_root_slash (troggle.core.TESTS.tests.PageTests.test_expoweb_root_slash) ... ok
test_expoweb_troggle_default (troggle.core.TESTS.tests.PageTests.test_expoweb_troggle_default) ... ok
test_expoweb_troggle_default_slash (troggle.core.TESTS.tests.PageTests.test_expoweb_troggle_default_slash) ... ok
test_expoweb_via_areaid (troggle.core.TESTS.tests.PageTests.test_expoweb_via_areaid) ... ok
test_not_found_survexfile_cave (troggle.core.TESTS.tests.PageTests.test_not_found_survexfile_cave) ... ok
test_page_admin (troggle.core.TESTS.tests.PageTests.test_page_admin) ... ok
test_page_admindocs_exped (troggle.core.TESTS.tests.PageTests.test_page_admindocs_exped) ... ok
test_page_dwgallfiles_empty (troggle.core.TESTS.tests.PageTests.test_page_dwgallfiles_empty) ... ok
test_page_dwgallfiles_empty_slash (troggle.core.TESTS.tests.PageTests.test_page_dwgallfiles_empty_slash) ... ok
test_page_dwgdataraw_empty (troggle.core.TESTS.tests.PageTests.test_page_dwgdataraw_empty) ... ok
test_page_expofile_document_loeffler_pdf (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_loeffler_pdf) ... ok
test_page_expofile_document_png (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_png) ... ok
test_page_expofile_document_rope_pdf (troggle.core.TESTS.tests.PageTests.test_page_expofile_document_rope_pdf) ... ok
test_page_expofile_documents (troggle.core.TESTS.tests.PageTests.test_page_expofile_documents) ... ok
test_page_expofile_documents_slash (troggle.core.TESTS.tests.PageTests.test_page_expofile_documents_slash) ... ok
test_page_expofile_writeup (troggle.core.TESTS.tests.PageTests.test_page_expofile_writeup) ... ok
test_page_expofiles_badness (troggle.core.TESTS.tests.PageTests.test_page_expofiles_badness) ... ok
test_page_expofiles_docs_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_docs_dir) ... ok
test_page_expofiles_root_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_root_dir) ... ok
test_page_expofiles_root_slash_dir (troggle.core.TESTS.tests.PageTests.test_page_expofiles_root_slash_dir) ... ok
test_page_folk (troggle.core.TESTS.tests.PageTests.test_page_folk) ... ok
test_page_photos_dir (troggle.core.TESTS.tests.PageTests.test_page_photos_dir) ... ok
test_page_photos_not_ok (troggle.core.TESTS.tests.PageTests.test_page_photos_not_ok) ... ok
test_page_photos_ok (troggle.core.TESTS.tests.PageTests.test_page_photos_ok) ... ok
test_page_site_media_css (troggle.core.TESTS.tests.PageTests.test_page_site_media_css) ... ok
test_page_site_media_ok (troggle.core.TESTS.tests.PageTests.test_page_site_media_ok) ... ok
test_page_slash_empty (troggle.core.TESTS.tests.PageTests.test_page_slash_empty) ... ok
test_page_ss (troggle.core.TESTS.tests.PageTests.test_page_ss) ... ok
test_page_survey_scans_dir (troggle.core.TESTS.tests.PageTests.test_page_survey_scans_dir) ... ok
test_page_survey_scans_empty (troggle.core.TESTS.tests.PageTests.test_page_survey_scans_empty) ... ok
test_stations (troggle.core.TESTS.tests.PageTests.test_stations) ... ok
test_survexdebug (troggle.core.TESTS.tests.PageTests.test_survexdebug) ... ok
test_surveximport (troggle.core.TESTS.tests.PageTests.test_surveximport) ... ok
test_therionissues (troggle.core.TESTS.tests.PageTests.test_therionissues) ... ok
test_allscans_view (troggle.core.TESTS.tests_copilot.TestSurveyScansView.test_allscans_view) ... ok
test_walletslistyear_view (troggle.core.TESTS.tests_copilot.TestSurveyScansView.test_walletslistyear_view) ... ok
test_import_Cave (troggle.core.TESTS.test_imports.SimpleTest.test_import_Cave) ... ok
test_import_TroggleModel (troggle.core.TESTS.test_imports.SimpleTest.test_import_TroggleModel) ... ok
test_import_core_views_caves (troggle.core.TESTS.test_imports.SimpleTest.test_import_core_views_caves) ... ok
test_import_imports (troggle.core.TESTS.test_imports.SimpleTest.test_import_imports) ... ok
test_import_parsers_QMs (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_QMs) ... ok
test_import_parsers_logbooks (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_logbooks) ... ok
test_import_parsers_mix (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_mix) ... ok
test_import_parsers_people (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_people) ... ok
test_import_parsers_survex (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_survex) ... ok
test_import_parsers_surveys (troggle.core.TESTS.test_imports.SimpleTest.test_import_parsers_surveys) ... ok
test_import_urls (troggle.core.TESTS.test_imports.SimpleTest.test_import_urls) ... ok
test_import_views_uploads (troggle.core.TESTS.test_imports.SimpleTest.test_import_views_uploads) ... ok
test_import_views_walletedit (troggle.core.TESTS.test_imports.SimpleTest.test_import_views_walletedit) ... ok
test_test_setting (troggle.core.TESTS.test_imports.SimpleTest.test_test_setting) ... ok

======================================================================
ERROR: test_fix_cave_url115 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url115)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_caves.py", line 140, in test_fix_cave_url115
    response = self.client.get("/1623/115.url")  # yes this is intentional, see the inserted data above & fixture
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/caves.py", line 353, in cavepage
    return rendercave(request, cave, cave.slug())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/caves.py", line 301, in rendercave
    "year": current_expo()
            ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_fix_cave_url284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_cave_url284)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_caves.py", line 148, in test_fix_cave_url284
    response = self.client.get("/1623/284/284.html")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/caves.py", line 353, in cavepage
    return rendercave(request, cave, cave.slug())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/caves.py", line 301, in rendercave
    "year": current_expo()
            ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_fix_caves284 (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_caves284)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_caves.py", line 190, in test_fix_caves284
    response = self.client.get("/caves")
               ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/caves.py", line 156, in caveindex
    "cavepage": True, "year": current_expo()},
                              ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_fix_expedition (troggle.core.TESTS.test_caves.FixturePageTests.test_fix_expedition)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_caves.py", line 103, in test_fix_expedition
    response = self.client.get("/expedition/2019")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/logbooks.py", line 69, in expedition
    current = current_expo() # creates new expo after 31st Dec.
              ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_photo_folder_create (troggle.core.TESTS.test_logins.PostTests.test_photo_folder_create)
Create folder for new user
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_logins.py", line 259, in test_photo_folder_create
    response = self.client.post("/photoupload/", data={"photographer": "GussieFinkNottle"})
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
    response = super().post(
               ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
    return self.f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
    return view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
    year = current_expo()
           ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_photo_upload (troggle.core.TESTS.test_logins.PostTests.test_photo_upload)
Expect photo upload to work on any file (contrary to msg on screen)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_logins.py", line 189, in test_photo_upload
    response = self.client.post(
               ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
    response = super().post(
               ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
    return self.f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
    return view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
    year = current_expo()
           ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_photo_upload_rename (troggle.core.TESTS.test_logins.PostTests.test_photo_upload_rename)
Expect photo upload to work on any file (contrary to msg on screen)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_logins.py", line 228, in test_photo_upload_rename
    response = self.client.post(
               ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1070, in post
    response = super().post(
               ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 490, in post
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
    return self.f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
    return view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/uploads.py", line 611, in photoupload
    year = current_expo()
           ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_lbe_new (troggle.core.TESTS.test_parsers.ImportTest.test_lbe_new)
This page requires the user to be logged in first, hence the extra shenanigans
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_parsers.py", line 141, in test_lbe_new
    response = self.client.get(f"/logbookedit/")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/auth.py", line 25, in __call__
    return self.f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapper_view
    return view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/uploads.py", line 192, in logbookedit
    year = current_expo()
           ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
ERROR: test_survexfiles (troggle.core.TESTS.test_parsers.ImportTest.test_survexfiles)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_parsers.py", line 195, in test_survexfiles
    response = self.client.get("/survexfile/caves/")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1049, in get
    response = super().get(path, data=data, secure=secure, headers=headers, **extra)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 465, in get
    return self.generic(
           ^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 617, in generic
    return self.request(**r)
           ^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 1013, in request
    self.check_exception(response)
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/test/client.py", line 743, in check_exception
    raise exc_value
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/views/survex.py", line 655, in survexcaveslist
    "year": current_expo(),
            ^^^^^^^^^^^^^^
  File "/home/philip/troggle/core/utils.py", line 126, in current_expo
    make_new_expo(str(y))
  File "/home/philip/troggle/core/utils.py", line 96, in make_new_expo
    u = User.objects.get(username='expo')
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/philip/p12d5/lib/python3.12/site-packages/django/db/models/query.py", line 649, in get
    raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

======================================================================
FAIL: test_loser_survex_status (troggle.core.TESTS.test_imports.SubprocessTest.test_loser_survex_status)
Expects no failures of survex files
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_imports.py", line 261, in test_loser_survex_status
    self.assertTrue(sp.returncode == 0, f"{cwd} - survex is unhappy")
AssertionError: False is not true : /home/philip/loser - survex is unhappy

======================================================================
FAIL: test_repos_git_status (troggle.core.TESTS.test_imports.SubprocessTest.test_repos_git_status)
Expects clean git repos with no added files and no merge failures
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/philip/troggle/core/TESTS/test_imports.py", line 233, in test_repos_git_status
    self.assertIsNotNone(phmatch, msg)
AssertionError: unexpectedly None : /home/philip/troggle - Failed to find expected git output: "nothing to commit, working tree clean"

----------------------------------------------------------------------
Ran 109 tests in 13.383s

FAILED (failures=2, errors=9)
Destroying test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...