From fc5e7d3e77cc78ec864a8fe99a82d6cebab982a0 Mon Sep 17 00:00:00 2001 From: Talley Lambert Date: Wed, 26 Nov 2025 11:53:50 -0500 Subject: [PATCH] use absolute imports --- backend/favit/admin.py | 2 +- backend/favit/models.py | 2 +- backend/favit/templatetags/favit_tags.py | 2 +- backend/favit/views.py | 3 +-- backend/fpbase/__init__.py | 2 +- backend/fpbase/users/admin.py | 2 +- backend/fpbase/users/api/views.py | 2 +- backend/fpbase/users/urls.py | 2 +- backend/fpbase/users/views.py | 2 +- backend/fpseq/__init__.py | 10 ++++---- backend/fpseq/align.py | 4 +-- backend/fpseq/fpseq.py | 8 +++--- backend/fpseq/mutations.py | 4 +-- backend/fpseq/skbio_protein.py | 2 +- backend/proteins/api/urls.py | 2 +- backend/proteins/api/views.py | 9 +++---- backend/proteins/fields.py | 2 +- backend/proteins/filters.py | 4 +-- backend/proteins/forms/microscope.py | 16 ++---------- backend/proteins/index.py | 2 +- backend/proteins/models/__init__.py | 30 +++++++++++------------ backend/proteins/schema/__init__.py | 2 +- backend/proteins/schema/query.py | 8 +++--- backend/proteins/schema/relay.py | 4 +-- backend/proteins/schema/types.py | 3 +-- backend/proteins/tasks.py | 2 +- backend/proteins/urls.py | 3 +-- backend/proteins/util/__init__.py | 4 +-- backend/proteins/util/blast.py | 2 +- backend/proteins/util/helpers.py | 2 +- backend/proteins/util/importers.py | 6 ++--- backend/proteins/util/maintain.py | 2 +- backend/proteins/util/spectra.py | 2 +- backend/proteins/util/spectra_import.py | 4 +-- backend/proteins/validators.py | 3 +-- backend/proteins/views/ajax.py | 5 ++-- backend/proteins/views/autocomplete.py | 2 +- backend/proteins/views/blast.py | 3 +-- backend/proteins/views/collection.py | 7 +++--- backend/proteins/views/fret.py | 5 ++-- backend/proteins/views/protein.py | 13 +++++----- backend/proteins/views/search.py | 5 ++-- backend/proteins/views/spectra.py | 9 +++---- backend/references/index.py | 2 +- backend/references/schema.py | 2 +- backend/references/urls.py | 7 +----- backend/references/views.py | 3 +-- backend/tests/test_proteins/test_forms.py | 3 +-- backend/tests/test_users/test_admin.py | 3 +-- backend/tests/test_users/test_avatar.py | 2 +- backend/tests/test_users/test_models.py | 2 +- backend/tests/test_users/test_urls.py | 2 +- backend/tests/test_users/test_views.py | 3 +-- pyproject.toml | 6 ++++- 54 files changed, 107 insertions(+), 136 deletions(-) diff --git a/backend/favit/admin.py b/backend/favit/admin.py index cb0f7a3e1..ee93cba92 100644 --- a/backend/favit/admin.py +++ b/backend/favit/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import Favorite +from favit.models import Favorite @admin.register(Favorite) diff --git a/backend/favit/models.py b/backend/favit/models.py index e805df09b..f9273e76a 100644 --- a/backend/favit/models.py +++ b/backend/favit/models.py @@ -8,7 +8,7 @@ from django.db import models from django.utils.translation import gettext_lazy as _ -from .managers import FavoriteManager +from favit.managers import FavoriteManager if TYPE_CHECKING: from fpbase.users.models import User diff --git a/backend/favit/templatetags/favit_tags.py b/backend/favit/templatetags/favit_tags.py index b7253edcf..80adf504a 100644 --- a/backend/favit/templatetags/favit_tags.py +++ b/backend/favit/templatetags/favit_tags.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType from django.template.loader import render_to_string -from ..models import Favorite +from favit.models import Favorite register = template.Library() diff --git a/backend/favit/views.py b/backend/favit/views.py index fe2bdffc3..96456290f 100644 --- a/backend/favit/views.py +++ b/backend/favit/views.py @@ -4,10 +4,9 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponseBadRequest, JsonResponse +from favit.models import Favorite from fpbase.util import uncache_protein_page -from .models import Favorite - logger = logging.getLogger(__name__) diff --git a/backend/fpbase/__init__.py b/backend/fpbase/__init__.py index b054ff49f..541014019 100644 --- a/backend/fpbase/__init__.py +++ b/backend/fpbase/__init__.py @@ -1,6 +1,6 @@ # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -from .celery import app as celery_app +from fpbase.celery import app as celery_app __version__ = "0.1.0" __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace("-", ".", 1).split(".")]) diff --git a/backend/fpbase/users/admin.py b/backend/fpbase/users/admin.py index 69d53013c..aa2877133 100644 --- a/backend/fpbase/users/admin.py +++ b/backend/fpbase/users/admin.py @@ -8,7 +8,7 @@ from django.urls import reverse from django.utils.safestring import mark_safe -from .models import User +from fpbase.users.models import User class MyUserChangeForm(UserChangeForm): diff --git a/backend/fpbase/users/api/views.py b/backend/fpbase/users/api/views.py index d5114fe07..2e28cafc0 100644 --- a/backend/fpbase/users/api/views.py +++ b/backend/fpbase/users/api/views.py @@ -5,7 +5,7 @@ from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet -from .serializers import UserSerializer +from fpbase.users.api.serializers import UserSerializer User = get_user_model() diff --git a/backend/fpbase/users/urls.py b/backend/fpbase/users/urls.py index c56cfbd10..c5e434f2e 100644 --- a/backend/fpbase/users/urls.py +++ b/backend/fpbase/users/urls.py @@ -1,7 +1,7 @@ from django.contrib.admin.views.decorators import staff_member_required from django.urls import path, re_path -from . import views +from fpbase.users import views app_name = "users" urlpatterns = [ diff --git a/backend/fpbase/users/views.py b/backend/fpbase/users/views.py index fbcaaeb5a..2bf414cf5 100644 --- a/backend/fpbase/users/views.py +++ b/backend/fpbase/users/views.py @@ -2,7 +2,7 @@ from django.urls import reverse from django.views.generic import DetailView, ListView, RedirectView, UpdateView -from .models import User +from fpbase.users.models import User class UserDetailView(LoginRequiredMixin, DetailView): diff --git a/backend/fpseq/__init__.py b/backend/fpseq/__init__.py index c6dcda155..84dea8b81 100644 --- a/backend/fpseq/__init__.py +++ b/backend/fpseq/__init__.py @@ -1,8 +1,8 @@ -from .align import SequenceAlignment, align_seqs -from .fpseq import FPSeq, from_fpbase -from .mutations import Mutation, MutationSet, get_mutations, mutate_sequence -from .skbio_protein import SkbSequence -from .util import protein_weight +from fpseq.align import SequenceAlignment, align_seqs +from fpseq.fpseq import FPSeq, from_fpbase +from fpseq.mutations import Mutation, MutationSet, get_mutations, mutate_sequence +from fpseq.skbio_protein import SkbSequence +from fpseq.util import protein_weight __all__ = [ "FPSeq", diff --git a/backend/fpseq/align.py b/backend/fpseq/align.py index 0dfdf7bb5..eb34d53a7 100644 --- a/backend/fpseq/align.py +++ b/backend/fpseq/align.py @@ -9,7 +9,7 @@ from Bio import Align from Bio.Align import substitution_matrices -from .util import chunked_lines +from fpseq.util import chunked_lines def align_seqs(query, target, gop=5, gep=1, band_size=0): @@ -223,7 +223,7 @@ def as_mutations(self, reference=None): MutationSet Set of mutations between sequences """ - from .mutations import MutationSet, _get_aligned_muts + from fpseq.mutations import MutationSet, _get_aligned_muts seq1, seq2 = self mutstring = "/".join(_get_aligned_muts(seq1, seq2)) diff --git a/backend/fpseq/fpseq.py b/backend/fpseq/fpseq.py index 288277cfb..d970566c8 100644 --- a/backend/fpseq/fpseq.py +++ b/backend/fpseq/fpseq.py @@ -2,10 +2,10 @@ import requests -from .align import align_seqs, parental_numbering -from .mutations import get_mutations, mutate_sequence -from .skbio_protein import SkbSequence -from .util import protein_weight, slugify +from fpseq.align import align_seqs, parental_numbering +from fpseq.mutations import get_mutations, mutate_sequence +from fpseq.skbio_protein import SkbSequence +from fpseq.util import protein_weight, slugify def generate_labels(seq, mods=None, zeroindex=1): diff --git a/backend/fpseq/mutations.py b/backend/fpseq/mutations.py index cefe3361c..38830a06b 100644 --- a/backend/fpseq/mutations.py +++ b/backend/fpseq/mutations.py @@ -38,8 +38,8 @@ import numpy as np -from .align import align_seqs, parental_numbering -from .skbio_protein import SkbSequence +from fpseq.align import align_seqs, parental_numbering +from fpseq.skbio_protein import SkbSequence if TYPE_CHECKING: from collections.abc import Sequence diff --git a/backend/fpseq/skbio_protein.py b/backend/fpseq/skbio_protein.py index e5c3afbe6..e575a052d 100644 --- a/backend/fpseq/skbio_protein.py +++ b/backend/fpseq/skbio_protein.py @@ -36,7 +36,7 @@ import numpy as np -from .util import chunk_string +from fpseq.util import chunk_string class classproperty(property): diff --git a/backend/proteins/api/urls.py b/backend/proteins/api/urls.py index 3a4623a7b..49a85177a 100644 --- a/backend/proteins/api/urls.py +++ b/backend/proteins/api/urls.py @@ -2,7 +2,7 @@ from django.views.generic import TemplateView from django.views.generic.base import RedirectView -from . import views +from proteins.api import views app_name = "api" diff --git a/backend/proteins/api/views.py b/backend/proteins/api/views.py index a5ab9e7f0..b73f29398 100644 --- a/backend/proteins/api/views.py +++ b/backend/proteins/api/views.py @@ -15,11 +15,7 @@ import proteins.models as pm from fpbase.cache_utils import get_model_version - -from ..filters import ProteinFilter, SpectrumFilter, StateFilter -from ..models.microscope import get_cached_optical_configs -from ..models.spectrum import get_cached_spectra_info -from .serializers import ( +from proteins.api.serializers import ( BasicProteinSerializer, ProteinSerializer, ProteinSerializer2, @@ -28,6 +24,9 @@ SpectrumSerializer, StateSerializer, ) +from proteins.filters import ProteinFilter, SpectrumFilter, StateFilter +from proteins.models.microscope import get_cached_optical_configs +from proteins.models.spectrum import get_cached_spectra_info def _spectra_etag(request: HttpRequest) -> str: diff --git a/backend/proteins/fields.py b/backend/proteins/fields.py index 2840452e6..13fcac94b 100644 --- a/backend/proteins/fields.py +++ b/backend/proteins/fields.py @@ -3,7 +3,7 @@ from django.core.exceptions import ValidationError from django.db.models import Lookup, TextField, fields -from .util.helpers import wave_to_hex +from proteins.util.helpers import wave_to_hex class Around(Lookup): diff --git a/backend/proteins/filters.py b/backend/proteins/filters.py index b715182f6..ad77f4408 100644 --- a/backend/proteins/filters.py +++ b/backend/proteins/filters.py @@ -3,8 +3,8 @@ from django import forms from django_filters import rest_framework as filters -from .models import Organism, Protein, Spectrum, State -from .validators import cdna_sequence_validator +from proteins.models import Organism, Protein, Spectrum, State +from proteins.validators import cdna_sequence_validator class SpectrumFilter(filters.FilterSet): diff --git a/backend/proteins/forms/microscope.py b/backend/proteins/forms/microscope.py index 998b4f891..d39d7d451 100644 --- a/backend/proteins/forms/microscope.py +++ b/backend/proteins/forms/microscope.py @@ -6,20 +6,8 @@ from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist from django.forms.models import inlineformset_factory -from ..models import ( - Camera, - Filter, - FilterPlacement, - Light, - Microscope, - OpticalConfig, - ProteinCollection, -) -from ..util.importers import ( - add_filter_to_database, - check_chroma_for_part, - check_semrock_for_part, -) +from proteins.models import Camera, Filter, FilterPlacement, Light, Microscope, OpticalConfig, ProteinCollection +from proteins.util.importers import add_filter_to_database, check_chroma_for_part, check_semrock_for_part User = get_user_model() diff --git a/backend/proteins/index.py b/backend/proteins/index.py index 0799c6072..7c3daa176 100644 --- a/backend/proteins/index.py +++ b/backend/proteins/index.py @@ -1,7 +1,7 @@ from algoliasearch_django import AlgoliaIndex from algoliasearch_django.decorators import register -from .models import Organism, Protein +from proteins.models import Organism, Protein @register(Protein) diff --git a/backend/proteins/models/__init__.py b/backend/proteins/models/__init__.py index f1fde659a..5a58ed38a 100644 --- a/backend/proteins/models/__init__.py +++ b/backend/proteins/models/__init__.py @@ -1,18 +1,18 @@ -from .bleach import BleachMeasurement -from .collection import ProteinCollection -from .dye import Dye, DyeState -from .efficiency import OcFluorEff -from .excerpt import Excerpt -from .fluorescence_measurement import FluorescenceMeasurement -from .fluorophore import FluorState -from .lineage import Lineage -from .microscope import FilterPlacement, Microscope, OpticalConfig -from .organism import Organism -from .oser import OSERMeasurement -from .protein import Protein, State -from .snapgene import SnapGenePlasmid -from .spectrum import Camera, Filter, Light, Spectrum -from .transition import StateTransition +from proteins.models.bleach import BleachMeasurement +from proteins.models.collection import ProteinCollection +from proteins.models.dye import Dye, DyeState +from proteins.models.efficiency import OcFluorEff +from proteins.models.excerpt import Excerpt +from proteins.models.fluorescence_measurement import FluorescenceMeasurement +from proteins.models.fluorophore import FluorState +from proteins.models.lineage import Lineage +from proteins.models.microscope import FilterPlacement, Microscope, OpticalConfig +from proteins.models.organism import Organism +from proteins.models.oser import OSERMeasurement +from proteins.models.protein import Protein, State +from proteins.models.snapgene import SnapGenePlasmid +from proteins.models.spectrum import Camera, Filter, Light, Spectrum +from proteins.models.transition import StateTransition __all__ = [ "BleachMeasurement", diff --git a/backend/proteins/schema/__init__.py b/backend/proteins/schema/__init__.py index 350b7f92a..229dc3389 100644 --- a/backend/proteins/schema/__init__.py +++ b/backend/proteins/schema/__init__.py @@ -1,3 +1,3 @@ -from .query import Query +from proteins.schema.query import Query __all__ = ["Query"] diff --git a/backend/proteins/schema/query.py b/backend/proteins/schema/query.py index 7ab280396..9b3b71b12 100644 --- a/backend/proteins/schema/query.py +++ b/backend/proteins/schema/query.py @@ -5,10 +5,10 @@ from graphene_django.filter import DjangoFilterConnectionField from graphql import FieldNode, GraphQLError, GraphQLResolveInfo -from .. import models -from ..filters import ProteinFilter -from ..models.spectrum import get_spectra_list -from . import relay, types +from proteins import models +from proteins.filters import ProteinFilter +from proteins.models.spectrum import get_spectra_list +from proteins.schema import relay, types def get_cached_spectrum(id, timeout=60 * 60 * 24): diff --git a/backend/proteins/schema/relay.py b/backend/proteins/schema/relay.py index a307fbb1a..59a90c1e9 100644 --- a/backend/proteins/schema/relay.py +++ b/backend/proteins/schema/relay.py @@ -1,7 +1,7 @@ import graphene -from .. import models -from .types import Protein +from proteins import models +from proteins.schema.types import Protein class ProteinNode(Protein): diff --git a/backend/proteins/schema/types.py b/backend/proteins/schema/types.py index 7e7daf0d5..b712efaa5 100644 --- a/backend/proteins/schema/types.py +++ b/backend/proteins/schema/types.py @@ -5,10 +5,9 @@ from graphene_django.converter import get_choices from graphene_django.types import DjangoObjectType +from proteins import models from references.schema import Reference -from .. import models - def nullable_enum_from_field(_model, _field): field = _model._meta.get_field(_field) diff --git a/backend/proteins/tasks.py b/backend/proteins/tasks.py index 3dd5107e8..c39574c0d 100644 --- a/backend/proteins/tasks.py +++ b/backend/proteins/tasks.py @@ -1,7 +1,7 @@ from celery import shared_task from sentry_sdk import capture_exception -from .util.helpers import forster_list +from proteins.util.helpers import forster_list @shared_task diff --git a/backend/proteins/urls.py b/backend/proteins/urls.py index bd99bb020..272e66b69 100644 --- a/backend/proteins/urls.py +++ b/backend/proteins/urls.py @@ -4,8 +4,7 @@ from django.views.generic import TemplateView from fpbase.decorators import login_required_message_and_redirect as login_required - -from . import views +from proteins import views app_name = "proteins" diff --git a/backend/proteins/util/__init__.py b/backend/proteins/util/__init__.py index b258e9eca..b1432f153 100644 --- a/backend/proteins/util/__init__.py +++ b/backend/proteins/util/__init__.py @@ -1,4 +1,4 @@ -from .blurb import long_blurb -from .helpers import getprot +from proteins.util.blurb import long_blurb +from proteins.util.helpers import getprot __all__ = ["getprot", "long_blurb"] diff --git a/backend/proteins/util/blast.py b/backend/proteins/util/blast.py index 8cdafbe37..f90383e73 100644 --- a/backend/proteins/util/blast.py +++ b/backend/proteins/util/blast.py @@ -9,7 +9,7 @@ from shutil import copyfileobj from subprocess import run -from ..models import Protein +from proteins.models import Protein ROOT = Path(__file__).parent.parent.parent BIN_DIR = ROOT / "bin" diff --git a/backend/proteins/util/helpers.py b/backend/proteins/util/helpers.py index 7ea107372..407b9da45 100644 --- a/backend/proteins/util/helpers.py +++ b/backend/proteins/util/helpers.py @@ -331,7 +331,7 @@ def forster_list(): from django.core.cache import cache - from ..models import Protein + from proteins.models import Protein # Try to get cached results first cache_key = "forster_list_results" diff --git a/backend/proteins/util/importers.py b/backend/proteins/util/importers.py index dcfec492a..3bc4b9d4e 100644 --- a/backend/proteins/util/importers.py +++ b/backend/proteins/util/importers.py @@ -7,7 +7,7 @@ from django.core.validators import URLValidator from django.template.defaultfilters import slugify -from ..models import Filter +from proteins.models import Filter ############################################ # Importing Tools @@ -266,7 +266,7 @@ def text_to_spectra(text, wavecol=0): def import_chroma_spectra(part=None, url=None, **kwargs): - from ..util.spectra_import import import_spectral_data + from proteins.util.spectra_import import import_spectral_data if isinstance(part, str): text = fetch_chroma_part(part) @@ -305,7 +305,7 @@ def import_chroma_spectra(part=None, url=None, **kwargs): def import_semrock_spectra(part=None, **kwargs): - from ..util.spectra_import import import_spectral_data + from proteins.util.spectra_import import import_spectral_data if isinstance(part, str): part = normalize_semrock_part(part) diff --git a/backend/proteins/util/maintain.py b/backend/proteins/util/maintain.py index d7cf694be..4eb4075d0 100644 --- a/backend/proteins/util/maintain.py +++ b/backend/proteins/util/maintain.py @@ -91,7 +91,7 @@ def check_lineages(qs=None, correct_offset=False): good = set() if not qs: - from ..models import Lineage + from proteins.models import Lineage qs = Lineage.objects.all() diff --git a/backend/proteins/util/spectra.py b/backend/proteins/util/spectra.py index 63f474fb7..1a9979242 100644 --- a/backend/proteins/util/spectra.py +++ b/backend/proteins/util/spectra.py @@ -6,7 +6,7 @@ import numpy as np from django.http import HttpResponse -from . import _scipy as scipy +from proteins.util import _scipy as scipy if TYPE_CHECKING: from collections.abc import Iterable diff --git a/backend/proteins/util/spectra_import.py b/backend/proteins/util/spectra_import.py index eb64d1131..1b9e90dce 100644 --- a/backend/proteins/util/spectra_import.py +++ b/backend/proteins/util/spectra_import.py @@ -1,8 +1,8 @@ import numpy as np from django.contrib.auth import get_user_model -from ..forms import SpectrumForm -from .helpers import zip_wave_data +from proteins.forms import SpectrumForm +from proteins.util.helpers import zip_wave_data User = get_user_model() diff --git a/backend/proteins/validators.py b/backend/proteins/validators.py index 82603a3b3..5f8236f7e 100644 --- a/backend/proteins/validators.py +++ b/backend/proteins/validators.py @@ -7,8 +7,7 @@ from django.core.validators import RegexValidator from fpseq.mutations import Mutation - -from .fields import Spectrum +from proteins.fields import Spectrum validate_doi = RegexValidator(r"^10.\d{4,9}/[-._;()/:a-zA-Z0-9]+$", "Not a valid DOI string") validate_uniprot = RegexValidator( diff --git a/backend/proteins/views/ajax.py b/backend/proteins/views/ajax.py index 0fdc7776b..d75c4f57c 100644 --- a/backend/proteins/views/ajax.py +++ b/backend/proteins/views/ajax.py @@ -14,11 +14,10 @@ from django.views.generic import DetailView from fpbase.util import uncache_protein_page +from proteins.models import FluorState, Lineage, Organism, Protein, Spectrum, State +from proteins.models.spectrum import Camera, Filter, Light from proteins.util.maintain import validate_node -from ..models import FluorState, Lineage, Organism, Protein, Spectrum, State -from ..models.spectrum import Camera, Filter, Light - logger = logging.getLogger(__name__) diff --git a/backend/proteins/views/autocomplete.py b/backend/proteins/views/autocomplete.py index 59ed1c00e..ea2494507 100644 --- a/backend/proteins/views/autocomplete.py +++ b/backend/proteins/views/autocomplete.py @@ -1,6 +1,6 @@ from dal import autocomplete -from ..models import Filter, Lineage, Protein, State +from proteins.models import Filter, Lineage, Protein, State # from django.contrib.postgres.search import TrigramSimilarity diff --git a/backend/proteins/views/blast.py b/backend/proteins/views/blast.py index 019a0acef..67bee14c8 100644 --- a/backend/proteins/views/blast.py +++ b/backend/proteins/views/blast.py @@ -3,8 +3,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie from fpbase.util import is_ajax - -from ..util.blast import blast +from proteins.util.blast import blast @ensure_csrf_cookie diff --git a/backend/proteins/views/collection.py b/backend/proteins/views/collection.py index 30636a46d..2781a1473 100644 --- a/backend/proteins/views/collection.py +++ b/backend/proteins/views/collection.py @@ -24,10 +24,9 @@ ) from fpbase.util import is_ajax - -from ..forms import CollectionForm -from ..models import Protein, ProteinCollection, State, StateTransition -from .mixins import OwnableObject +from proteins.forms import CollectionForm +from proteins.models import Protein, ProteinCollection, State, StateTransition +from proteins.views.mixins import OwnableObject def serialized_proteins_response(queryset, format="json", filename="FPbase_proteins"): diff --git a/backend/proteins/views/fret.py b/backend/proteins/views/fret.py index 0f9393d6a..36427087a 100644 --- a/backend/proteins/views/fret.py +++ b/backend/proteins/views/fret.py @@ -6,9 +6,8 @@ from fpbase.celery import app from fpbase.util import is_ajax - -from ..models import FluorState -from ..tasks import calc_fret +from proteins.models import FluorState +from proteins.tasks import calc_fret def fret_chart(request): diff --git a/backend/proteins/views/protein.py b/backend/proteins/views/protein.py index ce959f001..57e64958d 100644 --- a/backend/proteins/views/protein.py +++ b/backend/proteins/views/protein.py @@ -41,12 +41,7 @@ from fpbase.util import is_ajax, uncache_protein_page from proteins.extrest.entrez import get_cached_gbseqs from proteins.extrest.ga import cached_ga_popular -from proteins.util.helpers import link_excerpts, most_favorited -from proteins.util.maintain import check_lineages, suggested_switch_type -from proteins.util.spectra import spectra2csv -from references.models import Reference # breaks application modularity - -from ..forms import ( +from proteins.forms import ( BleachComparisonForm, BleachMeasurementForm, LineageFormSet, @@ -55,7 +50,11 @@ StateTransitionFormSet, bleach_items_formset, ) -from ..models import BleachMeasurement, Excerpt, Organism, Protein, Spectrum, State +from proteins.models import BleachMeasurement, Excerpt, Organism, Protein, Spectrum, State +from proteins.util.helpers import link_excerpts, most_favorited +from proteins.util.maintain import check_lineages, suggested_switch_type +from proteins.util.spectra import spectra2csv +from references.models import Reference # breaks application modularity if TYPE_CHECKING: from proteins.forms.forms import BaseStateFormSet diff --git a/backend/proteins/views/search.py b/backend/proteins/views/search.py index 267cc5fd9..9537f58e6 100644 --- a/backend/proteins/views/search.py +++ b/backend/proteins/views/search.py @@ -4,12 +4,11 @@ from django.db.models import Count, Prefetch, Q from django.shortcuts import redirect, render +from proteins.filters import ProteinFilter +from proteins.models import Organism, Protein, State from proteins.util.helpers import getprot from references.models import Author, Reference -from ..filters import ProteinFilter -from ..models import Organism, Protein, State - def protein_search(request): """renders html for protein search page""" diff --git a/backend/proteins/views/spectra.py b/backend/proteins/views/spectra.py index 7ccc43678..511e74082 100644 --- a/backend/proteins/views/spectra.py +++ b/backend/proteins/views/spectra.py @@ -20,11 +20,10 @@ from django.views.generic import CreateView from fpbase.util import is_ajax, uncache_protein_page - -from ..forms import SpectrumForm -from ..models import Filter, Protein, Spectrum, State -from ..util.importers import add_filter_to_database -from ..util.spectra import spectra2csv +from proteins.forms import SpectrumForm +from proteins.models import Filter, Protein, Spectrum, State +from proteins.util.importers import add_filter_to_database +from proteins.util.spectra import spectra2csv # @cache_page(60 * 10) diff --git a/backend/references/index.py b/backend/references/index.py index 33d1851a7..5e0c8240a 100644 --- a/backend/references/index.py +++ b/backend/references/index.py @@ -1,7 +1,7 @@ from algoliasearch_django import AlgoliaIndex from algoliasearch_django.decorators import register -from .models import Reference +from references.models import Reference @register(Reference) diff --git a/backend/references/schema.py b/backend/references/schema.py index 4a9d69bad..733e0e5cb 100644 --- a/backend/references/schema.py +++ b/backend/references/schema.py @@ -1,7 +1,7 @@ import graphene import graphene_django_optimizer as gdo -from . import models +from references import models class Author(gdo.OptimizedDjangoObjectType): diff --git a/backend/references/urls.py b/backend/references/urls.py index e24004e1f..ba7f1f535 100644 --- a/backend/references/urls.py +++ b/backend/references/urls.py @@ -1,11 +1,6 @@ from django.urls import path, re_path -from .views import ( - AuthorDetailView, - ReferenceAutocomplete, - ReferenceDetailView, - add_excerpt, -) +from references.views import AuthorDetailView, ReferenceAutocomplete, ReferenceDetailView, add_excerpt app_name = "references" diff --git a/backend/references/views.py b/backend/references/views.py index 5833c5bc6..d67bad07f 100644 --- a/backend/references/views.py +++ b/backend/references/views.py @@ -8,8 +8,7 @@ from fpbase.util import is_ajax from proteins.models import Excerpt from proteins.util.helpers import link_excerpts - -from .models import Author, Reference +from references.models import Author, Reference class AuthorDetailView(DetailView): diff --git a/backend/tests/test_proteins/test_forms.py b/backend/tests/test_proteins/test_forms.py index 791d7a9e9..84208e615 100644 --- a/backend/tests/test_proteins/test_forms.py +++ b/backend/tests/test_proteins/test_forms.py @@ -4,8 +4,7 @@ from proteins.forms import CollectionForm, ProteinForm, SpectrumForm, StateForm from proteins.models import Protein, Spectrum, State - -from ..test_users.factories import UserFactory +from tests.test_users.factories import UserFactory User = get_user_model() diff --git a/backend/tests/test_users/test_admin.py b/backend/tests/test_users/test_admin.py index 4543bbf39..98bb2c675 100644 --- a/backend/tests/test_users/test_admin.py +++ b/backend/tests/test_users/test_admin.py @@ -1,8 +1,7 @@ from django.test import TestCase from fpbase.users.admin import MyUserCreationForm - -from .factories import UserFactory +from tests.test_users.factories import UserFactory class TestMyUserCreationForm(TestCase): diff --git a/backend/tests/test_users/test_avatar.py b/backend/tests/test_users/test_avatar.py index 5b323b86c..d8d60751c 100644 --- a/backend/tests/test_users/test_avatar.py +++ b/backend/tests/test_users/test_avatar.py @@ -12,7 +12,7 @@ from django.urls import reverse from PIL import Image -from .factories import UserFactory +from tests.test_users.factories import UserFactory User = get_user_model() diff --git a/backend/tests/test_users/test_models.py b/backend/tests/test_users/test_models.py index d5ba3ffee..243595557 100644 --- a/backend/tests/test_users/test_models.py +++ b/backend/tests/test_users/test_models.py @@ -1,6 +1,6 @@ from django.test import TestCase -from .factories import UserFactory +from tests.test_users.factories import UserFactory class TestUser(TestCase): diff --git a/backend/tests/test_users/test_urls.py b/backend/tests/test_users/test_urls.py index 722bf7b74..a7f1e0ec7 100644 --- a/backend/tests/test_users/test_urls.py +++ b/backend/tests/test_users/test_urls.py @@ -1,7 +1,7 @@ from django.test import TestCase from django.urls import resolve, reverse -from .factories import UserFactory +from tests.test_users.factories import UserFactory class TestUserURLs(TestCase): diff --git a/backend/tests/test_users/test_views.py b/backend/tests/test_users/test_views.py index 8dccaff77..a6727a74a 100644 --- a/backend/tests/test_users/test_views.py +++ b/backend/tests/test_users/test_views.py @@ -1,8 +1,7 @@ from django.test import RequestFactory, TestCase from fpbase.users.views import UserRedirectView, UserUpdateView - -from .factories import UserFactory +from tests.test_users.factories import UserFactory class BaseUserTestCase(TestCase): diff --git a/pyproject.toml b/pyproject.toml index 149aa200d..47bc7b4d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -131,7 +131,8 @@ select = [ "RUF", # Ruff-specific rules "LOG", # flake8-logging "G", # flake8-logging-format - "TC", # flake8-type-checking + "TC", # flake8-type-checking + "TID", # flake8-tidy-imports ] ignore = [ "B905", # `zip()` without an explicit `strict=` parameter @@ -141,6 +142,9 @@ ignore = [ [tool.ruff.lint.per-file-ignores] "backend/config/settings/*" = ["F405"] +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" + [tool.django-stubs] django_settings_module = "config.settings.test"