Skip to content

Commit 51b6030

Browse files
committed
Fix security scan warning on glob imports in __init__.py
1 parent 126f217 commit 51b6030

11 files changed

Lines changed: 230 additions & 11 deletions

File tree

core/embeddings.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from uuid import uuid4
77

88
import httpx
9-
from django.conf import settings
9+
from django.conf import settings as django_settings
1010
from django.utils.dateparse import parse_datetime
1111
from qdrant_client import QdrantClient
1212
from qdrant_client.models import (
@@ -19,8 +19,10 @@
1919
)
2020

2121
from core.models import Content
22+
from core.settings_types import CoreSettings
2223

2324
SentenceTransformer = None
25+
settings = cast(CoreSettings, django_settings)
2426

2527

2628
def get_sentence_transformer_class():
@@ -110,7 +112,7 @@ def collection_name_for_project(project_id: int) -> str:
110112

111113
@lru_cache(maxsize=1)
112114
def get_qdrant_client() -> QdrantClient:
113-
return QdrantClient(url=settings.QDRANT_URL, timeout=10)
115+
return QdrantClient(url=settings.QDRANT_URL, timeout=10, check_compatibility=False)
114116

115117

116118
@lru_cache(maxsize=1)

core/settings_types.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from typing import Protocol
2+
3+
4+
class CoreSettings(Protocol):
5+
QDRANT_URL: str
6+
EMBEDDING_MODEL: str
7+
EMBEDDING_PROVIDER: str
8+
EMBEDDING_TRUST_REMOTE_CODE: bool
9+
OLLAMA_URL: str
10+
OPENROUTER_API_KEY: str
11+
OPENROUTER_API_BASE: str
12+
OPENROUTER_APP_URL: str
13+
OPENROUTER_APP_NAME: str

core/tests/test_health.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def test_check_qdrant_returns_true_when_client_can_list_collections(mocker, sett
5959
client_cls.return_value.get_collections.return_value = SimpleNamespace(collections=[])
6060

6161
assert _check_qdrant() is True
62-
client_cls.assert_called_once_with(url=settings.QDRANT_URL, timeout=2)
62+
client_cls.assert_called_once_with(url=settings.QDRANT_URL, timeout=2, check_compatibility=False)
6363

6464

6565
def test_check_qdrant_returns_false_when_client_errors(mocker):

core/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
from http import HTTPStatus
2+
from typing import cast
23

3-
from django.conf import settings
4+
from django.conf import settings as django_settings
45
from django.db import connection
56
from django.http import JsonResponse
67
from qdrant_client import QdrantClient
78

9+
from core.settings_types import CoreSettings
10+
11+
settings = cast(CoreSettings, django_settings)
12+
813

914
def healthz_view(request):
1015
return JsonResponse({"status": "ok", "service": "newsletter-maker"}, status=HTTPStatus.OK)
@@ -35,7 +40,7 @@ def _check_database() -> bool:
3540

3641
def _check_qdrant() -> bool:
3742
try:
38-
client = QdrantClient(url=settings.QDRANT_URL, timeout=2)
43+
client = QdrantClient(url=settings.QDRANT_URL, timeout=2, check_compatibility=False)
3944
client.get_collections()
4045
except Exception:
4146
return False
Lines changed: 132 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,132 @@
1-
from .admin import * # noqa: F403
2-
from .ai import * # noqa: F403
3-
from .base import * # noqa: F403
4-
from .celery import * # noqa: F403
5-
from .logging import * # noqa: F403
6-
from .swagger import * # noqa: F403
1+
from .admin import UNFOLD
2+
from .ai import (
3+
AI_CLASSIFICATION_MODEL,
4+
AI_CLASSIFICATION_REVIEW_THRESHOLD,
5+
AI_MAX_NODE_RETRIES,
6+
AI_RELEVANCE_HIGH_THRESHOLD,
7+
AI_RELEVANCE_LOW_THRESHOLD,
8+
AI_RELEVANCE_MODEL,
9+
AI_RELEVANCE_REVIEW_THRESHOLD,
10+
AI_RELEVANCE_SUMMARIZE_THRESHOLD,
11+
AI_REQUEST_TIMEOUT_SECONDS,
12+
AI_SUMMARIZATION_MODEL,
13+
EMBEDDING_MODEL,
14+
EMBEDDING_PROVIDER,
15+
EMBEDDING_TRUST_REMOTE_CODE,
16+
OLLAMA_URL,
17+
OPENROUTER_API_BASE,
18+
OPENROUTER_API_KEY,
19+
OPENROUTER_APP_NAME,
20+
OPENROUTER_APP_URL,
21+
QDRANT_URL,
22+
)
23+
from .base import (
24+
ACCOUNT_EMAIL_VERIFICATION,
25+
ACCOUNT_LOGIN_METHODS,
26+
ACCOUNT_SIGNUP_FIELDS,
27+
ALLOWED_HOSTS,
28+
AUTH_PASSWORD_VALIDATORS,
29+
AUTHENTICATION_BACKENDS,
30+
BASE_DIR,
31+
CSRF_TRUSTED_ORIGINS,
32+
DATABASE_URL,
33+
DATABASES,
34+
DEBUG,
35+
DEFAULT_AUTO_FIELD,
36+
DRF_STANDARDIZED_ERRORS,
37+
INSTALLED_APPS,
38+
LANGUAGE_CODE,
39+
MIDDLEWARE,
40+
REDDIT_CLIENT_ID,
41+
REDDIT_CLIENT_SECRET,
42+
REDDIT_USER_AGENT,
43+
REST_FRAMEWORK,
44+
ROOT_URLCONF,
45+
SECRET_KEY,
46+
SECURE_PROXY_SSL_HEADER,
47+
SITE_ID,
48+
STATIC_ROOT,
49+
STATIC_URL,
50+
TEMPLATES,
51+
TIME_ZONE,
52+
USE_I18N,
53+
USE_TZ,
54+
USE_X_FORWARDED_HOST,
55+
WSGI_APPLICATION,
56+
)
57+
from .celery import (
58+
CELERY_BEAT_SCHEDULE,
59+
CELERY_BROKER_URL,
60+
CELERY_RESULT_BACKEND,
61+
CELERY_TASK_ALWAYS_EAGER,
62+
CELERY_TASK_SOFT_TIME_LIMIT,
63+
CELERY_TASK_TIME_LIMIT,
64+
REDIS_URL,
65+
)
66+
from .logging import LOG_LEVEL, LOGGING
67+
from .swagger import SPECTACULAR_SETTINGS
68+
69+
__all__ = [
70+
"ACCOUNT_EMAIL_VERIFICATION",
71+
"ACCOUNT_LOGIN_METHODS",
72+
"ACCOUNT_SIGNUP_FIELDS",
73+
"AI_CLASSIFICATION_MODEL",
74+
"AI_CLASSIFICATION_REVIEW_THRESHOLD",
75+
"AI_MAX_NODE_RETRIES",
76+
"AI_RELEVANCE_HIGH_THRESHOLD",
77+
"AI_RELEVANCE_LOW_THRESHOLD",
78+
"AI_RELEVANCE_MODEL",
79+
"AI_RELEVANCE_REVIEW_THRESHOLD",
80+
"AI_RELEVANCE_SUMMARIZE_THRESHOLD",
81+
"AI_REQUEST_TIMEOUT_SECONDS",
82+
"AI_SUMMARIZATION_MODEL",
83+
"ALLOWED_HOSTS",
84+
"AUTHENTICATION_BACKENDS",
85+
"AUTH_PASSWORD_VALIDATORS",
86+
"BASE_DIR",
87+
"CELERY_BEAT_SCHEDULE",
88+
"CELERY_BROKER_URL",
89+
"CELERY_RESULT_BACKEND",
90+
"CELERY_TASK_ALWAYS_EAGER",
91+
"CELERY_TASK_SOFT_TIME_LIMIT",
92+
"CELERY_TASK_TIME_LIMIT",
93+
"CSRF_TRUSTED_ORIGINS",
94+
"DATABASES",
95+
"DATABASE_URL",
96+
"DEBUG",
97+
"DEFAULT_AUTO_FIELD",
98+
"DRF_STANDARDIZED_ERRORS",
99+
"EMBEDDING_MODEL",
100+
"EMBEDDING_PROVIDER",
101+
"EMBEDDING_TRUST_REMOTE_CODE",
102+
"INSTALLED_APPS",
103+
"LANGUAGE_CODE",
104+
"LOGGING",
105+
"LOG_LEVEL",
106+
"MIDDLEWARE",
107+
"OLLAMA_URL",
108+
"OPENROUTER_API_BASE",
109+
"OPENROUTER_API_KEY",
110+
"OPENROUTER_APP_NAME",
111+
"OPENROUTER_APP_URL",
112+
"QDRANT_URL",
113+
"REDDIT_CLIENT_ID",
114+
"REDDIT_CLIENT_SECRET",
115+
"REDDIT_USER_AGENT",
116+
"REDIS_URL",
117+
"REST_FRAMEWORK",
118+
"ROOT_URLCONF",
119+
"SECRET_KEY",
120+
"SECURE_PROXY_SSL_HEADER",
121+
"SITE_ID",
122+
"SPECTACULAR_SETTINGS",
123+
"STATIC_ROOT",
124+
"STATIC_URL",
125+
"TEMPLATES",
126+
"TIME_ZONE",
127+
"UNFOLD",
128+
"USE_I18N",
129+
"USE_TZ",
130+
"USE_X_FORWARDED_HOST",
131+
"WSGI_APPLICATION",
132+
]

newsletter_maker/settings/admin.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@
3131
"show_all_applications": False,
3232
},
3333
}
34+
35+
__all__ = ["UNFOLD"]

newsletter_maker/settings/ai.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,25 @@ def env_int(name: str, default: int) -> int:
3535
EMBEDDING_MODEL = os.getenv("EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2")
3636
EMBEDDING_TRUST_REMOTE_CODE = env_bool("EMBEDDING_TRUST_REMOTE_CODE", default=False)
3737
OLLAMA_URL = os.getenv("OLLAMA_URL", "http://localhost:11434")
38+
39+
__all__ = [
40+
"QDRANT_URL",
41+
"OPENROUTER_API_KEY",
42+
"OPENROUTER_API_BASE",
43+
"OPENROUTER_APP_URL",
44+
"OPENROUTER_APP_NAME",
45+
"AI_CLASSIFICATION_MODEL",
46+
"AI_RELEVANCE_MODEL",
47+
"AI_SUMMARIZATION_MODEL",
48+
"AI_CLASSIFICATION_REVIEW_THRESHOLD",
49+
"AI_RELEVANCE_LOW_THRESHOLD",
50+
"AI_RELEVANCE_HIGH_THRESHOLD",
51+
"AI_RELEVANCE_REVIEW_THRESHOLD",
52+
"AI_RELEVANCE_SUMMARIZE_THRESHOLD",
53+
"AI_MAX_NODE_RETRIES",
54+
"AI_REQUEST_TIMEOUT_SECONDS",
55+
"EMBEDDING_PROVIDER",
56+
"EMBEDDING_MODEL",
57+
"EMBEDDING_TRUST_REMOTE_CODE",
58+
"OLLAMA_URL",
59+
]

newsletter_maker/settings/base.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,38 @@ def env_list(name: str, default: str = "") -> list[str]:
171171
USE_X_FORWARDED_HOST = True
172172

173173
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
174+
175+
__all__ = [
176+
"BASE_DIR",
177+
"SECRET_KEY",
178+
"DEBUG",
179+
"ALLOWED_HOSTS",
180+
"CSRF_TRUSTED_ORIGINS",
181+
"DATABASE_URL",
182+
"SITE_ID",
183+
"REDDIT_CLIENT_ID",
184+
"REDDIT_CLIENT_SECRET",
185+
"REDDIT_USER_AGENT",
186+
"INSTALLED_APPS",
187+
"MIDDLEWARE",
188+
"ROOT_URLCONF",
189+
"TEMPLATES",
190+
"WSGI_APPLICATION",
191+
"DATABASES",
192+
"AUTH_PASSWORD_VALIDATORS",
193+
"AUTHENTICATION_BACKENDS",
194+
"ACCOUNT_EMAIL_VERIFICATION",
195+
"ACCOUNT_LOGIN_METHODS",
196+
"ACCOUNT_SIGNUP_FIELDS",
197+
"LANGUAGE_CODE",
198+
"TIME_ZONE",
199+
"USE_I18N",
200+
"USE_TZ",
201+
"STATIC_URL",
202+
"STATIC_ROOT",
203+
"REST_FRAMEWORK",
204+
"DRF_STANDARDIZED_ERRORS",
205+
"SECURE_PROXY_SSL_HEADER",
206+
"USE_X_FORWARDED_HOST",
207+
"DEFAULT_AUTO_FIELD",
208+
]

newsletter_maker/settings/celery.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,13 @@
1717
"schedule": 60 * 60 * 6,
1818
},
1919
}
20+
21+
__all__ = [
22+
"REDIS_URL",
23+
"CELERY_BROKER_URL",
24+
"CELERY_RESULT_BACKEND",
25+
"CELERY_TASK_ALWAYS_EAGER",
26+
"CELERY_TASK_TIME_LIMIT",
27+
"CELERY_TASK_SOFT_TIME_LIMIT",
28+
"CELERY_BEAT_SCHEDULE",
29+
]

newsletter_maker/settings/logging.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@
4646
"level": LOG_LEVEL,
4747
},
4848
}
49+
50+
__all__ = ["LOG_LEVEL", "LOGGING"]

0 commit comments

Comments
 (0)