From af803535c8d49a42a527d146ae998de9d589a00b Mon Sep 17 00:00:00 2001
From: Lucas Brandstaetter <lucas@brandstaetter.tech>
Date: Sun, 20 Oct 2024 09:58:18 +0000
Subject: [PATCH] Replace relative imports

---
 src/.ruff.toml                                |  1 -
 src/api/urls.py                               |  2 +-
 src/api/urls_metrics.py                       |  2 +-
 src/api/views/assemblies.py                   |  4 +--
 src/api/views/conferencemember.py             |  4 +--
 src/api/views/conferences.py                  |  4 +--
 src/api/views/events.py                       |  4 +--
 src/api/views/maps.py                         |  4 +--
 src/api/views/messages.py                     |  4 +--
 src/api/views/rooms.py                        |  4 +--
 src/api/views/schedule.py                     |  6 ++--
 src/api/views/users.py                        |  2 +-
 src/api/views/workadventure.py                |  4 +--
 src/backoffice/views/assemblies.py            |  3 +-
 src/backoffice/views/assemblyteam.py          |  3 +-
 src/backoffice/views/map.py                   |  4 +--
 src/backoffice/views/misc.py                  |  4 +--
 src/backoffice/views/profile.py               |  4 +--
 src/backoffice/views/schedules.py             |  4 +--
 src/backoffice/views/wiki.py                  |  4 +--
 src/backoffice/views/workadventure.py         |  4 +--
 .../commands/assembly_contact_mails.py        |  6 ++--
 src/core/management/commands/housekeeping.py  | 10 +++----
 .../commands/import_mapservice_resultfile.py  |  4 +--
 .../management/commands/sanitize_database.py  | 29 ++++++++-----------
 .../commands/schedule_join_rooms.py           |  2 +-
 src/core/management/commands/serviceusers.py  |  2 +-
 src/core/management/commands/stats.py         |  2 +-
 .../commands/test_schedule_import.py          |  2 +-
 src/core/models/assemblies.py                 | 16 +++++-----
 src/core/models/badges.py                     |  9 +++---
 src/core/models/conference.py                 | 15 +++++-----
 src/core/models/map.py                        |  4 +--
 src/core/models/messages.py                   |  4 +--
 src/core/models/metanavi.py                   |  2 +-
 src/core/models/pages.py                      |  9 +++---
 src/core/models/projects.py                   |  9 +++---
 src/core/models/schedules.py                  | 14 ++++-----
 src/core/models/tags.py                       |  3 +-
 src/core/models/ticket.py                     |  6 ++--
 src/core/models/users.py                      |  6 ++--
 src/core/models/voucher.py                    | 10 +++----
 src/core/models/workadventure.py              | 10 +++----
 src/core/tests/assemblies.py                  |  6 ++--
 src/core/tests/badges.py                      |  9 +++---
 src/core/tests/conference.py                  |  2 +-
 src/core/tests/exportcache.py                 |  4 +--
 src/core/tests/markdown.py                    |  3 +-
 src/core/tests/schedules.py                   | 18 ++++++------
 src/core/tests/search.py                      | 12 ++++----
 src/core/tests/tags.py                        |  8 ++---
 src/core/tests/tickets.py                     |  6 ++--
 src/core/tests/users.py                       |  4 +--
 src/core/tests/utils.py                       |  2 +-
 src/core/tests/vouchers.py                    |  8 ++---
 src/core/tests/workadventure.py               |  6 ++--
 src/hub/settings/default.py                   |  7 +++--
 57 files changed, 167 insertions(+), 177 deletions(-)

diff --git a/src/.ruff.toml b/src/.ruff.toml
index 1e623c4d3..d274a7fb4 100644
--- a/src/.ruff.toml
+++ b/src/.ruff.toml
@@ -35,7 +35,6 @@ ignore = [
     "SIM102",
     "SIM108",
     "TD002",
-    "TID252",
     "ERA001",
     # Disabled due to format conflicts
     # see https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
diff --git a/src/api/urls.py b/src/api/urls.py
index 8b618b974..82e9218b9 100644
--- a/src/api/urls.py
+++ b/src/api/urls.py
@@ -4,7 +4,7 @@ from rest_framework.urlpatterns import format_suffix_patterns
 from django.conf import settings
 from django.urls import path
 
-from .views import api_root, assemblies, badges, bbb, conferencemember, conferences, events, maps, messages, metanav, rooms, schedule, users, workadventure
+from api.views import api_root, assemblies, badges, bbb, conferencemember, conferences, events, maps, messages, metanav, rooms, schedule, users, workadventure
 
 app_name = 'api'
 urlpatterns = [
diff --git a/src/api/urls_metrics.py b/src/api/urls_metrics.py
index e4e2ecada..4d54c32a4 100644
--- a/src/api/urls_metrics.py
+++ b/src/api/urls_metrics.py
@@ -1,6 +1,6 @@
 from django.urls import path
 
-from .views import metrics
+from api.views import metrics
 
 app_name = 'api'
 
diff --git a/src/api/views/assemblies.py b/src/api/views/assemblies.py
index 98c5ec518..d880d10a3 100644
--- a/src/api/views/assemblies.py
+++ b/src/api/views/assemblies.py
@@ -4,8 +4,8 @@ from core.models.assemblies import Assembly
 from core.models.events import Event
 from core.models.rooms import Room
 
-from ..serializers import AssemblySerializer, EventSerializer, RoomSerializer
-from .mixins import ConferenceSlugAssemblyMixin, ConferenceSlugMixin
+from api.serializers import AssemblySerializer, EventSerializer, RoomSerializer
+from api.views.mixins import ConferenceSlugAssemblyMixin, ConferenceSlugMixin
 
 
 class ConferenceAssemblyList(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/conferencemember.py b/src/api/views/conferencemember.py
index 22eda299a..795ea8136 100644
--- a/src/api/views/conferencemember.py
+++ b/src/api/views/conferencemember.py
@@ -9,8 +9,8 @@ from django.conf import settings
 from core.models.conference import ConferenceMember
 from core.sso import SSO
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/conferences.py b/src/api/views/conferences.py
index 917181cba..35ce79526 100644
--- a/src/api/views/conferences.py
+++ b/src/api/views/conferences.py
@@ -2,8 +2,8 @@ from rest_framework import generics
 
 from core.models.conference import Conference, ConferenceTrack
 
-from ..serializers import ConferenceSerializer, ConferenceTrackSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import ConferenceSerializer, ConferenceTrackSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 
 class ConferenceList(generics.ListAPIView):
diff --git a/src/api/views/events.py b/src/api/views/events.py
index dccc9dd8e..94596144e 100644
--- a/src/api/views/events.py
+++ b/src/api/views/events.py
@@ -6,8 +6,8 @@ from django.shortcuts import get_object_or_404
 
 from core.models.events import Event
 
-from ..serializers import EventSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import EventSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 
 class EventList(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/maps.py b/src/api/views/maps.py
index 030f68178..2b2824ff3 100644
--- a/src/api/views/maps.py
+++ b/src/api/views/maps.py
@@ -10,8 +10,8 @@ from core.models.assemblies import Assembly
 from core.models.conference import ConferenceExportCache
 from core.models.map import MapPOI
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 _cts = {}  # cache of CoordTransforms (if needed)
 
diff --git a/src/api/views/messages.py b/src/api/views/messages.py
index 01a3ecf32..cecabad36 100644
--- a/src/api/views/messages.py
+++ b/src/api/views/messages.py
@@ -4,14 +4,14 @@ from django.db.models import Q
 
 from core.models.messages import DirectMessage
 
-from ..serializers import (
+from api.serializers import (
     DirectMessageSendSerializer,
     DirectMessageSerializerReceived,
     DirectMessageSerializerReceivedShort,
     DirectMessageSerializerSent,
     DirectMessageSerializerSentShort,
 )
-from .mixins import ConferenceSlugMixin
+from api.views.mixins import ConferenceSlugMixin
 
 
 class DirectMessagesReceived(ConferenceSlugMixin, generics.ListAPIView):
diff --git a/src/api/views/rooms.py b/src/api/views/rooms.py
index b55800b38..716e8795e 100644
--- a/src/api/views/rooms.py
+++ b/src/api/views/rooms.py
@@ -4,8 +4,8 @@ from rest_framework import generics
 
 from core.models.rooms import Room
 
-from ..serializers import RoomSerializer
-from .mixins import ConferenceSlugMixin
+from api.serializers import RoomSerializer
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/schedule.py b/src/api/views/schedule.py
index d9c2c433d..b728ff439 100644
--- a/src/api/views/schedule.py
+++ b/src/api/views/schedule.py
@@ -16,9 +16,9 @@ from core.models.events import Event
 from core.models.rooms import Room
 from core.schedules.base import filter_additional_data, schedule_time_to_timedelta
 
-from ..permissions import IsApiUserOrReadOnly
-from ..schedule import Schedule, ScheduleEncoder
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsApiUserOrReadOnly
+from api.schedule import Schedule, ScheduleEncoder
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/api/views/users.py b/src/api/views/users.py
index 6f52f687b..371269fc9 100644
--- a/src/api/views/users.py
+++ b/src/api/views/users.py
@@ -14,7 +14,7 @@ from core.choices import UserBadgeVisibility
 from core.models.badges import Badge, UserBadge
 from core.models.users import PlatformUser, UserTimelineEntry
 
-from ..serializers import UserTimelineEntrySerializer
+from api.serializers import UserTimelineEntrySerializer
 
 
 @api_view(['GET'])
diff --git a/src/api/views/workadventure.py b/src/api/views/workadventure.py
index dae2b66c4..4cc556758 100644
--- a/src/api/views/workadventure.py
+++ b/src/api/views/workadventure.py
@@ -19,8 +19,8 @@ from core.models.badges import BadgeToken
 from core.models.rooms import Room
 from core.models.workadventure import WorkadventureSession
 
-from ..permissions import IsConferenceService, IsSuperUser
-from .mixins import ConferenceSlugMixin
+from api.permissions import IsConferenceService, IsSuperUser
+from api.views.mixins import ConferenceSlugMixin
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/backoffice/views/assemblies.py b/src/backoffice/views/assemblies.py
index bae1782e3..44fc93ece 100644
--- a/src/backoffice/views/assemblies.py
+++ b/src/backoffice/views/assemblies.py
@@ -28,7 +28,7 @@ from core.models.tags import ConferenceTag
 from core.models.users import PlatformUser
 from core.models.voucher import Voucher
 
-from ..forms import (
+from backoffice.forms import (
     AssemblyAddApplicationForm,
     AssemblyAddMemberForm,
     AssemblyCreateForm,
@@ -43,6 +43,7 @@ from ..forms import (
     EditAssemblyRoomHangarForm,
     EditAssemblyRoomWorkAdventureForm,
 )
+
 from .mixins import AssemblyMixin, ConferenceLoginRequiredMixin
 
 logger = logging.getLogger(__name__)
diff --git a/src/backoffice/views/assemblyteam.py b/src/backoffice/views/assemblyteam.py
index 2be313cf9..abd09724d 100644
--- a/src/backoffice/views/assemblyteam.py
+++ b/src/backoffice/views/assemblyteam.py
@@ -21,7 +21,8 @@ from core.models.assemblies import Assembly, AssemblyMember
 from core.models.conference import ConferenceExportCache
 from core.models.users import UserCommunicationChannel
 
-from ..templatetags.c3assemblies import get_language_item
+from backoffice.templatetags.c3assemblies import get_language_item
+
 from .mixins import AssemblyMixin, ConferenceLoginRequiredMixin
 
 logger = logging.getLogger(__name__)
diff --git a/src/backoffice/views/map.py b/src/backoffice/views/map.py
index dc635ba4a..b30b9dd6b 100644
--- a/src/backoffice/views/map.py
+++ b/src/backoffice/views/map.py
@@ -10,8 +10,8 @@ from django.views.generic.edit import CreateView, ModelFormMixin, UpdateView
 
 from core.models.map import MapFloor, MapPOI
 
-from ..forms import POIForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import POIForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/backoffice/views/misc.py b/src/backoffice/views/misc.py
index 18c785b9f..3ccbe69d9 100644
--- a/src/backoffice/views/misc.py
+++ b/src/backoffice/views/misc.py
@@ -4,8 +4,8 @@ from django.views.generic.edit import FormView
 
 from core.models import Assembly, Conference
 
-from ..forms import ConferenceForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ConferenceForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ConferenceSelectionView(ConferenceLoginRequiredMixin, FormView):
diff --git a/src/backoffice/views/profile.py b/src/backoffice/views/profile.py
index 224d50fed..765ea3ee9 100644
--- a/src/backoffice/views/profile.py
+++ b/src/backoffice/views/profile.py
@@ -3,8 +3,8 @@ from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import FormView
 
-from ..forms import ProfileForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ProfileForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ProfileView(ConferenceLoginRequiredMixin, FormView):
diff --git a/src/backoffice/views/schedules.py b/src/backoffice/views/schedules.py
index 9b1408574..b4ffa0b23 100644
--- a/src/backoffice/views/schedules.py
+++ b/src/backoffice/views/schedules.py
@@ -9,8 +9,8 @@ from django.views.generic.detail import SingleObjectMixin
 from core.models import ScheduleSource, ScheduleSourceImport
 from core.schedules import ScheduleTypeManager
 
-from ..forms import ScheduleSourceCreateForm
-from .mixins import ConferenceLoginRequiredMixin
+from backoffice.forms import ScheduleSourceCreateForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin
 
 
 class ScheduleAdminMixin(ConferenceLoginRequiredMixin):
diff --git a/src/backoffice/views/wiki.py b/src/backoffice/views/wiki.py
index ca6ec52a7..c4326412e 100644
--- a/src/backoffice/views/wiki.py
+++ b/src/backoffice/views/wiki.py
@@ -16,8 +16,8 @@ from django.views.generic.edit import DeleteView, UpdateView
 
 from core.models import Conference, Lock, StaticPage, StaticPageNamespace, StaticPageRevision
 
-from ..forms import StaticPageEditForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import StaticPageEditForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 
 class WikiAdminMixin(ConferenceLoginRequiredMixin):
diff --git a/src/backoffice/views/workadventure.py b/src/backoffice/views/workadventure.py
index 51753a413..985857aa7 100644
--- a/src/backoffice/views/workadventure.py
+++ b/src/backoffice/views/workadventure.py
@@ -19,8 +19,8 @@ from core.models import Assembly, ConferenceMember, PlatformUser
 from core.models.rooms import Room
 from core.models.workadventure import WorkadventureSession, WorkadventureTexture
 
-from ..forms import CreateWorkadventureTextureForm
-from .mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
+from backoffice.forms import CreateWorkadventureTextureForm
+from backoffice.views.mixins import ConferenceLoginRequiredMixin, guess_active_sidebar_item
 
 logger = logging.getLogger(__name__)
 MAX_ROWS = 42
diff --git a/src/core/management/commands/assembly_contact_mails.py b/src/core/management/commands/assembly_contact_mails.py
index 4caf3905b..f7c4755eb 100644
--- a/src/core/management/commands/assembly_contact_mails.py
+++ b/src/core/management/commands/assembly_contact_mails.py
@@ -1,8 +1,8 @@
 from django.core.management.base import BaseCommand
 
-from ...models.assemblies import AssemblyMember
-from ...models.conference import Conference
-from ...models.users import UserCommunicationChannel
+from core.models.assemblies import AssemblyMember
+from core.models.conference import Conference
+from core.models.users import UserCommunicationChannel
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/housekeeping.py b/src/core/management/commands/housekeeping.py
index 8e7ab72ca..a81d4bf19 100644
--- a/src/core/management/commands/housekeeping.py
+++ b/src/core/management/commands/housekeeping.py
@@ -4,11 +4,11 @@ from django.core.management.base import BaseCommand, CommandError
 from django.db.models import Max
 from django.utils import timezone
 
-from ...models import StaticPageNamespace
-from ...models.conference import Conference, ConferenceExportCache
-from ...models.messages import DirectMessage
-from ...models.schedules import ScheduleSource, ScheduleSourceImport
-from ...models.voucher import Voucher
+from core.models.conference import Conference, ConferenceExportCache
+from core.models.messages import DirectMessage
+from core.models.pages import StaticPageNamespace
+from core.models.schedules import ScheduleSource, ScheduleSourceImport
+from core.models.voucher import Voucher
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/import_mapservice_resultfile.py b/src/core/management/commands/import_mapservice_resultfile.py
index 4c9956521..241054f0e 100644
--- a/src/core/management/commands/import_mapservice_resultfile.py
+++ b/src/core/management/commands/import_mapservice_resultfile.py
@@ -3,9 +3,9 @@ import json
 
 from django.core.management.base import BaseCommand
 
-from api.views.workadventure import MapServiceView
+from core.models.conference import Conference
 
-from ...models import Conference
+from api.views.workadventure import MapServiceView
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/sanitize_database.py b/src/core/management/commands/sanitize_database.py
index df3c22063..0b56489e4 100644
--- a/src/core/management/commands/sanitize_database.py
+++ b/src/core/management/commands/sanitize_database.py
@@ -4,26 +4,21 @@ from django.conf import settings
 from django.core.management.base import BaseCommand
 from django.db.models import Max
 
-from ...models import (
-    Assembly,
-    AssemblyLogEntry,
-    AssemblyMember,
+from core.models.assemblies import Assembly, AssemblyLogEntry, AssemblyMember
+from core.models.badges import UserBadge
+from core.models.conference import (
     ConferenceMember,
-    ConferenceMemberTicket,
-    ConferenceTag,
     ConferenceTrack,
-    DirectMessage,
-    Event,
-    PlatformUser,
-    ScheduleSource,
-    ScheduleSourceImport,
-    StaticPage,
-    TagItem,
-    UserBadge,
-    UserCommunicationChannel,
-    UserDereferrerAllowlist,
-    WorkadventureSession,
 )
+from core.models.dereferrer import UserDereferrerAllowlist
+from core.models.events import Event
+from core.models.messages import DirectMessage
+from core.models.pages import StaticPage
+from core.models.schedules import ScheduleSource, ScheduleSourceImport
+from core.models.tags import ConferenceTag, TagItem
+from core.models.ticket import ConferenceMemberTicket
+from core.models.users import PlatformUser, UserCommunicationChannel
+from core.models.workadventure import WorkadventureSession
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/schedule_join_rooms.py b/src/core/management/commands/schedule_join_rooms.py
index a9d4b9cd6..7aa3c2546 100644
--- a/src/core/management/commands/schedule_join_rooms.py
+++ b/src/core/management/commands/schedule_join_rooms.py
@@ -1,7 +1,7 @@
 from django.core.management.base import BaseCommand, CommandError
 from django.db import transaction
 
-from ...models import Event, Room, RoomLink, ScheduleSourceMapping
+from core.models import Event, Room, RoomLink, ScheduleSourceMapping
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/serviceusers.py b/src/core/management/commands/serviceusers.py
index 2d857bf11..d298295db 100644
--- a/src/core/management/commands/serviceusers.py
+++ b/src/core/management/commands/serviceusers.py
@@ -2,7 +2,7 @@ from rest_framework.authtoken.models import Token
 
 from django.core.management.base import BaseCommand
 
-from ...models.users import PlatformUser
+from core.models.users import PlatformUser
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/stats.py b/src/core/management/commands/stats.py
index 08368fe71..7eb4aca69 100644
--- a/src/core/management/commands/stats.py
+++ b/src/core/management/commands/stats.py
@@ -1,6 +1,6 @@
 from django.core.management.base import BaseCommand
 
-from ...models import Assembly, Badge, Conference, Event, Room, UserBadge
+from core.models import Assembly, Badge, Conference, Event, Room, UserBadge
 
 
 class Command(BaseCommand):
diff --git a/src/core/management/commands/test_schedule_import.py b/src/core/management/commands/test_schedule_import.py
index 839f672d1..8108cf4ab 100644
--- a/src/core/management/commands/test_schedule_import.py
+++ b/src/core/management/commands/test_schedule_import.py
@@ -6,7 +6,7 @@ from django.core.exceptions import SuspiciousOperation
 from django.core.management.base import BaseCommand
 from django.db import transaction
 
-from ...models.conference import Conference
+from core.models.conference import Conference
 
 
 class Command(BaseCommand):
diff --git a/src/core/models/assemblies.py b/src/core/models/assemblies.py
index 3ac1a0f64..1ec7d59b9 100644
--- a/src/core/models/assemblies.py
+++ b/src/core/models/assemblies.py
@@ -19,18 +19,16 @@ from django.utils.safestring import mark_safe
 from django.utils.translation import gettext
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, render_markdown, store_relationships
 from core.models.base_managers import ConferenceManagerMixin
-from core.models.tags import TagItem
+from core.models.conference import Conference, ConferenceMember
+from core.models.map import MapFloor
+from core.models.tags import TaggedItemMixin, TagItem
+from core.models.users import PlatformUser
+from core.utils import render_markdown_as_text
 from core.validators import FileSizeValidator, ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, render_markdown, store_relationships
-from ..utils import render_markdown_as_text
-from .conference import Conference, ConferenceMember
-from .map import MapFloor
-from .tags import TaggedItemMixin
-from .users import PlatformUser
-
 
 class AssemblyManager(ConferenceManagerMixin['Assembly']):
     staff_permissions = ['assembly_team']
diff --git a/src/core/models/badges.py b/src/core/models/badges.py
index 07e949411..9cc1f957d 100644
--- a/src/core/models/badges.py
+++ b/src/core/models/badges.py
@@ -19,16 +19,15 @@ from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
 from core.choices import UserBadgeVisibility
+from core.fields import ConferenceReference
 from core.markdown import compile_translated_markdown_fields, store_relationships
+from core.models.assemblies import Assembly
 from core.models.base_managers import ConferenceManagerMixin
 from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
+from core.utils import generate_token
 from core.validators import ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..utils import generate_token
-from .assemblies import Assembly
-from .users import PlatformUser
-
 logger = logging.getLogger(__name__)
 
 TOKEN_VALIDATOR = RegexValidator(r'^[0-9a-z]*$', _('BadgeToken__validator_info__lower_alpha_num'))
diff --git a/src/core/models/conference.py b/src/core/models/conference.py
index ee4e2a4a5..f604e69bc 100644
--- a/src/core/models/conference.py
+++ b/src/core/models/conference.py
@@ -25,10 +25,9 @@ from django.utils.translation import get_language
 from django.utils.translation import gettext_lazy as _
 
 from core.choices import UserBadgeVisibility
-
-from ..fields import ConferenceReference
-from ..utils import render_markdown_as_text
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.users import PlatformUser
+from core.utils import render_markdown_as_text
 
 logger = logging.getLogger(__name__)
 
@@ -157,7 +156,7 @@ class ConferenceMember(models.Model):
         return f'{self.user.username}@{self.conference.slug}'
 
     def save(self, *args, update_fields=None, **kwargs) -> None:
-        from ..markdown import compile_translated_markdown_fields, store_relationships
+        from core.markdown import compile_translated_markdown_fields, store_relationships
 
         if update_fields is None or 'description' in update_fields:
             render_results = compile_translated_markdown_fields(self, self.conference, 'description')
@@ -547,7 +546,7 @@ class Conference(models.Model):
         if not self.mail_footer:
             return None
 
-        from ..markdown import render_markdown
+        from core.markdown import render_markdown
 
         return format_html(
             '<div id="footer" style="margin-top: 1em; border-top: 2px solid #999; color: #999; font-size: 80%;">{0}</div>',
@@ -708,7 +707,7 @@ class ConferenceExportCache(models.Model):
         return False
 
     def save(self, *args, **kwargs):
-        from ..utils import int_to_custom_string
+        from core.utils import int_to_custom_string
 
         if self.last_generated is not None:
             self.etag = int_to_custom_string(int(self.last_generated.timestamp() * 1000))
@@ -853,7 +852,7 @@ class ConferenceNavigationItem(models.Model):
     )
 
     def resolve_url(self):
-        from ..utils import resolve_internal_url
+        from core.utils import resolve_internal_url
 
         return resolve_internal_url(self.url, fallback_as_is=True)
 
diff --git a/src/core/models/map.py b/src/core/models/map.py
index a88ab66ae..d0f9f7444 100644
--- a/src/core/models/map.py
+++ b/src/core/models/map.py
@@ -7,8 +7,8 @@ from django.core.exceptions import ValidationError
 from django.db import models
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, store_relationships
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, store_relationships
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/core/models/messages.py b/src/core/models/messages.py
index 08315dce1..edcb87f3e 100644
--- a/src/core/models/messages.py
+++ b/src/core/models/messages.py
@@ -7,8 +7,8 @@ from django.urls import NoReverseMatch, reverse
 from django.utils.text import format_lazy
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import render_markdown
+from core.fields import ConferenceReference
+from core.markdown import render_markdown
 
 
 class DirectMessage(models.Model):
diff --git a/src/core/models/metanavi.py b/src/core/models/metanavi.py
index bf48236bb..b03b6b7c4 100644
--- a/src/core/models/metanavi.py
+++ b/src/core/models/metanavi.py
@@ -6,7 +6,7 @@ from django.db import models
 from django.utils.safestring import mark_safe
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
+from core.fields import ConferenceReference
 
 
 class MetaNavItemManager(models.Manager):
diff --git a/src/core/models/pages.py b/src/core/models/pages.py
index 9d0db7549..6577a977b 100644
--- a/src/core/models/pages.py
+++ b/src/core/models/pages.py
@@ -17,12 +17,11 @@ from django.utils.functional import cached_property
 from django.utils.html import strip_tags
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
 from core.markdown import render_markdown_ex, store_relationships
-
-from ..fields import ConferenceReference
-from ..utils import GitRepo
-from .conference import Conference
-from .users import PlatformUser
+from core.models.conference import Conference
+from core.models.users import PlatformUser
+from core.utils import GitRepo
 
 
 class StaticPageNamespace(models.Model):
diff --git a/src/core/models/projects.py b/src/core/models/projects.py
index e2b808b8c..b7c977689 100644
--- a/src/core/models/projects.py
+++ b/src/core/models/projects.py
@@ -9,16 +9,15 @@ from django.db.models import QuerySet
 from django.utils.text import slugify
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
+from core.markdown import compile_translated_markdown_fields, store_relationships
+from core.models.assemblies import Assembly
 from core.models.base_managers import ConferenceManagerMixin
+from core.models.conference import ConferenceMember
 from core.models.tags import TaggedItemMixin
 from core.models.users import PlatformUser
 from core.validators import FileSizeValidator, ImageDimensionValidator
 
-from ..fields import ConferenceReference
-from ..markdown import compile_translated_markdown_fields, store_relationships
-from ..models.conference import ConferenceMember
-from .assemblies import Assembly
-
 
 class ProjectManager(ConferenceManagerMixin['Project']):
     assembly_filter = 'assembly'
diff --git a/src/core/models/schedules.py b/src/core/models/schedules.py
index 271700e8d..1b24dc6d3 100644
--- a/src/core/models/schedules.py
+++ b/src/core/models/schedules.py
@@ -9,13 +9,13 @@ from django.db import models
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..schedules import ScheduleTypeManager
-from ..utils import mail2uuid, mask_url, str2bool
-from .assemblies import Assembly
-from .events import Event, EventAttachment
-from .rooms import Room
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.assemblies import Assembly
+from core.models.events import Event, EventAttachment
+from core.models.rooms import Room
+from core.models.users import PlatformUser
+from core.schedules import ScheduleTypeManager
+from core.utils import mail2uuid, mask_url, str2bool
 
 if TYPE_CHECKING:
     pass
diff --git a/src/core/models/tags.py b/src/core/models/tags.py
index d08324e97..630e5512f 100644
--- a/src/core/models/tags.py
+++ b/src/core/models/tags.py
@@ -9,10 +9,9 @@ from django.db.models import QuerySet
 from django.utils.functional import cached_property
 from django.utils.translation import gettext_lazy as _
 
+from core.fields import ConferenceReference
 from core.models.conference import Conference, ConferenceMember
 
-from ..fields import ConferenceReference
-
 
 class ConferenceTag(models.Model):
     class Meta:
diff --git a/src/core/models/ticket.py b/src/core/models/ticket.py
index e8804d537..6b4121648 100644
--- a/src/core/models/ticket.py
+++ b/src/core/models/ticket.py
@@ -7,9 +7,9 @@ from django.db import models
 from django.db.utils import IntegrityError
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from .conference import Conference
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.models.conference import Conference
+from core.models.users import PlatformUser
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/core/models/users.py b/src/core/models/users.py
index d3f600c12..b6b580e58 100644
--- a/src/core/models/users.py
+++ b/src/core/models/users.py
@@ -26,9 +26,9 @@ from django.utils.text import slugify
 from django.utils.timezone import now
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..utils import download_from_url
-from ..validators import ImageDimensionValidator
+from core.fields import ConferenceReference
+from core.utils import download_from_url
+from core.validators import ImageDimensionValidator
 
 if TYPE_CHECKING:
     from core.models import Assembly, Conference, ConferenceMember
diff --git a/src/core/models/voucher.py b/src/core/models/voucher.py
index 835d04b33..b6f437a50 100644
--- a/src/core/models/voucher.py
+++ b/src/core/models/voucher.py
@@ -9,11 +9,11 @@ from django.utils import timezone
 from django.utils.functional import cached_property
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..markdown import render_markdown
-from .assemblies import Assembly
-from .conference import Conference
-from .users import PlatformUser
+from core.fields import ConferenceReference
+from core.markdown import render_markdown
+from core.models.assemblies import Assembly
+from core.models.conference import Conference
+from core.models.users import PlatformUser
 
 
 class VoucherManager(models.Manager):
diff --git a/src/core/models/workadventure.py b/src/core/models/workadventure.py
index 5c9fc1d7a..f96769d71 100644
--- a/src/core/models/workadventure.py
+++ b/src/core/models/workadventure.py
@@ -10,11 +10,11 @@ from django.db.models import Q
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
-from ..fields import ConferenceReference
-from ..utils import generate_token
-from .assemblies import Assembly
-from .conference import Conference, ConferenceMember, PlatformUser
-from .rooms import Room
+from core.fields import ConferenceReference
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember, PlatformUser
+from core.models.rooms import Room
+from core.utils import generate_token
 
 
 class WorkadventureSession(models.Model):
diff --git a/src/core/tests/assemblies.py b/src/core/tests/assemblies.py
index be70aabad..3150f0ef2 100644
--- a/src/core/tests/assemblies.py
+++ b/src/core/tests/assemblies.py
@@ -2,9 +2,9 @@ from django.contrib.auth.models import Group, Permission
 from django.core import mail
 from django.test import TestCase, override_settings
 
-from ..models.assemblies import Assembly, AssemblyMember
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser, UserCommunicationChannel
+from core.models.assemblies import Assembly, AssemblyMember
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser, UserCommunicationChannel
 
 
 class AssembliesTestsMixin(TestCase):
diff --git a/src/core/tests/badges.py b/src/core/tests/badges.py
index f0f40ec9c..59ebfddb8 100644
--- a/src/core/tests/badges.py
+++ b/src/core/tests/badges.py
@@ -2,11 +2,10 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 
 from core.choices import UserBadgeVisibility
-
-from ..models.assemblies import Assembly
-from ..models.badges import Badge, UserBadge
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
+from core.models.assemblies import Assembly
+from core.models.badges import Badge, UserBadge
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
 
 
 class BadgeTests(TestCase):
diff --git a/src/core/tests/conference.py b/src/core/tests/conference.py
index 8e6a327f9..3ed7df0ec 100644
--- a/src/core/tests/conference.py
+++ b/src/core/tests/conference.py
@@ -4,7 +4,7 @@ from unittest.mock import patch
 from django.test import TestCase
 from django.utils import timezone
 
-from ..models.conference import Conference, ConferenceDay
+from core.models.conference import Conference, ConferenceDay
 
 
 class ConferenceTests(TestCase):
diff --git a/src/core/tests/exportcache.py b/src/core/tests/exportcache.py
index 090d9e82e..72e57d7e4 100644
--- a/src/core/tests/exportcache.py
+++ b/src/core/tests/exportcache.py
@@ -4,8 +4,8 @@ from django.test import TestCase, override_settings
 from django.utils import timezone
 from django.utils.timezone import now
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceExportCache
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceExportCache
 
 
 class ScheduleTests(TestCase):
diff --git a/src/core/tests/markdown.py b/src/core/tests/markdown.py
index e4cb46a8b..d30892ab8 100644
--- a/src/core/tests/markdown.py
+++ b/src/core/tests/markdown.py
@@ -7,10 +7,9 @@ from django.test import TestCase
 from django.test.utils import override_settings
 from django.urls import reverse
 
+from core.markdown import render_markdown, render_markdown_ex
 from core.models import Conference, ConferenceTag, PlatformUser, StaticPage
 
-from ..markdown import render_markdown, render_markdown_ex
-
 TEST_CONF_ID = uuid.uuid4()
 
 
diff --git a/src/core/tests/schedules.py b/src/core/tests/schedules.py
index a53bfff0e..1fea3d274 100644
--- a/src/core/tests/schedules.py
+++ b/src/core/tests/schedules.py
@@ -4,15 +4,15 @@ from pathlib import Path
 
 from django.test import TestCase, override_settings
 
-from ..models import Event, Room
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceMember
-from ..models.schedules import ScheduleSource, ScheduleSourceImport, ScheduleSourceMapping
-from ..models.users import PlatformUser
-from ..schedules.base import BaseScheduleSupport, ScheduleTypeManager, filter_additional_data, schedule_time_to_timedelta
-from ..schedules.schedulejson import ScheduleJSONSupport
-from ..schedules.schedulejsonfrab import ScheduleJSONFrabSupport
-from ..schedules.schedulexml import ScheduleXMLSupport
+from core.models import Event, Room
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember
+from core.models.schedules import ScheduleSource, ScheduleSourceImport, ScheduleSourceMapping
+from core.models.users import PlatformUser
+from core.schedules.base import BaseScheduleSupport, ScheduleTypeManager, filter_additional_data, schedule_time_to_timedelta
+from core.schedules.schedulejson import ScheduleJSONSupport
+from core.schedules.schedulejsonfrab import ScheduleJSONFrabSupport
+from core.schedules.schedulexml import ScheduleXMLSupport
 
 
 class FileBasedScheduleSupport(BaseScheduleSupport):
diff --git a/src/core/tests/search.py b/src/core/tests/search.py
index 1d9f4dadb..852e85858 100644
--- a/src/core/tests/search.py
+++ b/src/core/tests/search.py
@@ -1,12 +1,12 @@
 from django.contrib.auth.models import AnonymousUser
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceTrack
-from ..models.events import Event
-from ..models.pages import StaticPage
-from ..models.users import PlatformUser
-from ..search import search
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceTrack
+from core.models.events import Event
+from core.models.pages import StaticPage
+from core.models.users import PlatformUser
+from core.search import search
 
 
 class SearchTests(TestCase):
diff --git a/src/core/tests/tags.py b/src/core/tests/tags.py
index 6c411e158..1d5d5d7df 100644
--- a/src/core/tests/tags.py
+++ b/src/core/tests/tags.py
@@ -2,10 +2,10 @@ from django.contrib.auth.models import AnonymousUser
 from django.contrib.contenttypes.models import ContentType
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference
-from ..models.events import Event
-from ..models.tags import ConferenceTag, TaggedItemMixin, TagItem
+from core.models.assemblies import Assembly
+from core.models.conference import Conference
+from core.models.events import Event
+from core.models.tags import ConferenceTag, TaggedItemMixin, TagItem
 
 
 class TaggingTests(TestCase):
diff --git a/src/core/tests/tickets.py b/src/core/tests/tickets.py
index 1a7dfd5b1..4ac9ecee1 100644
--- a/src/core/tests/tickets.py
+++ b/src/core/tests/tickets.py
@@ -4,9 +4,9 @@ import jwt
 
 from django.test import TestCase, override_settings
 
-from ..models.conference import Conference
-from ..models.ticket import ConferenceMemberTicket, TicketValidationError
-from ..models.users import PlatformUser
+from core.models.conference import Conference
+from core.models.ticket import ConferenceMemberTicket, TicketValidationError
+from core.models.users import PlatformUser
 
 _GOOD_SECRET = 'F00Preti%'
 _BAD_SECRET = 'DämlicherFlanders'
diff --git a/src/core/tests/users.py b/src/core/tests/users.py
index c415cf859..d1047ef22 100644
--- a/src/core/tests/users.py
+++ b/src/core/tests/users.py
@@ -2,8 +2,8 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 from django.urls import reverse
 
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser, UserCommunicationChannel
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser, UserCommunicationChannel
 
 
 class UserCommunicationChannelStaticTests(TestCase):
diff --git a/src/core/tests/utils.py b/src/core/tests/utils.py
index 568be24a7..a69dab3c9 100644
--- a/src/core/tests/utils.py
+++ b/src/core/tests/utils.py
@@ -3,7 +3,7 @@ from datetime import timedelta
 
 from django.test import TestCase
 
-from ..utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
+from core.utils import GitRepo, mail2uuid, mask_url, scheme_and_netloc_from_url, str2timedelta
 
 
 class UtilsTests(TestCase):
diff --git a/src/core/tests/vouchers.py b/src/core/tests/vouchers.py
index dddc98caa..c598820be 100644
--- a/src/core/tests/vouchers.py
+++ b/src/core/tests/vouchers.py
@@ -4,10 +4,10 @@ from datetime import datetime, timezone
 from django.core.exceptions import ValidationError
 from django.test import TestCase
 
-from ..models.assemblies import Assembly
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
-from ..models.voucher import Voucher
+from core.models.assemblies import Assembly
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
+from core.models.voucher import Voucher
 
 
 class VoucherTests(TestCase):
diff --git a/src/core/tests/workadventure.py b/src/core/tests/workadventure.py
index 2e91edea3..fd6eb43b4 100644
--- a/src/core/tests/workadventure.py
+++ b/src/core/tests/workadventure.py
@@ -1,8 +1,8 @@
 from django.test import TestCase
 
-from ..models import Assembly, Room, WorkadventureSession
-from ..models.conference import Conference, ConferenceMember
-from ..models.users import PlatformUser
+from core.models import Assembly, Room, WorkadventureSession
+from core.models.conference import Conference, ConferenceMember
+from core.models.users import PlatformUser
 
 
 class WorkadventureSessionTests(TestCase):
diff --git a/src/hub/settings/default.py b/src/hub/settings/default.py
index 62069a573..7dd95cacf 100644
--- a/src/hub/settings/default.py
+++ b/src/hub/settings/default.py
@@ -58,9 +58,12 @@ assert SECRET_KEY is None or not SECRET_KEY.startswith('/'), (
 
 # Local Settings
 try:
-    from ..local_settings import *  # noqa: F403,F401
+    from hub.local_settings import *  # noqa: F403,F401
 except ImportError:
-    print('Unable to load (optional) local_settings.py.')
+    try:
+        from hub.settings.local_settings import *  # noqa: F403,F401
+    except ImportError:
+        print('Unable to load (optional) local_settings.py.')
 
 # read SECRET_KEY from a file not stored in git
 if DEBUG and SECRET_KEY is None:  # noqa: F405
-- 
GitLab