Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
b9945a1
initial
SKairinos Feb 10, 2026
43718f0
fix type errors
SKairinos Feb 10, 2026
a5cbd1f
fix linting errors
SKairinos Feb 11, 2026
dac77f8
fix tests
SKairinos Feb 11, 2026
4b30d45
fix
SKairinos Feb 11, 2026
c658dcc
upgrade packages
SKairinos Feb 11, 2026
7b37cb4
fix
SKairinos Feb 11, 2026
0f5d76b
fix imports
SKairinos Feb 11, 2026
a83b9d8
fix
SKairinos Feb 11, 2026
584963f
support git requirements
SKairinos Feb 11, 2026
e1a1a37
use separate encryption key
SKairinos Feb 12, 2026
b4cd735
final fixes
SKairinos Feb 12, 2026
056971f
subdirectory
SKairinos Feb 17, 2026
b976824
fix
SKairinos Feb 17, 2026
c5b44ea
dynamically define is_verified
SKairinos Feb 18, 2026
97b4f6a
merge from main
SKairinos Feb 23, 2026
ed633c3
merge from main
SKairinos Feb 23, 2026
422755f
handle old encrypted char fields
SKairinos Feb 23, 2026
66b7b9e
comment out otp bypass token tests
SKairinos Feb 23, 2026
3456914
fix linting errors
SKairinos Feb 23, 2026
663c526
test
SKairinos Feb 23, 2026
8945996
test
SKairinos Feb 23, 2026
c9184f6
test
SKairinos Feb 23, 2026
33555ed
fix
SKairinos Feb 23, 2026
4d55e43
delete ENCRYPTION_KEY
SKairinos Feb 24, 2026
8cbda58
dek models
SKairinos Feb 24, 2026
e2b7678
quick save
SKairinos Feb 24, 2026
69ac571
merge from main
SKairinos Mar 9, 2026
1e09dfe
fix migrations
SKairinos Mar 10, 2026
498d737
quick save
SKairinos Mar 10, 2026
97f8ea2
user fields
SKairinos Mar 10, 2026
730f9fe
house keeping
SKairinos Mar 10, 2026
0d77854
house keeping
SKairinos Mar 10, 2026
5fd5d06
class
SKairinos Mar 10, 2026
339095a
schoolteacherinvitation
SKairinos Mar 10, 2026
b196aaf
school
SKairinos Mar 10, 2026
977f9cd
parse args
SKairinos Mar 11, 2026
16d950b
pretty print
SKairinos Mar 11, 2026
2ea7887
headers and dividers
SKairinos Mar 12, 2026
9356efa
simplify
SKairinos Mar 12, 2026
8523ea2
support process indentation
SKairinos Mar 12, 2026
a99738b
add dek to fixtures
SKairinos Mar 13, 2026
7fbf0ff
remove username
SKairinos Mar 13, 2026
75fefcb
encrypt fields in fixtures
SKairinos Mar 13, 2026
f677352
hash credentials
SKairinos Mar 13, 2026
3b95a03
delete AWS code
SKairinos Mar 13, 2026
5f800b1
add hash fields
SKairinos Mar 16, 2026
28f96f3
remove aws code
SKairinos Mar 16, 2026
d8c6f3b
fix type errors
SKairinos Mar 16, 2026
c1b9bbd
fix linting errors
SKairinos Mar 16, 2026
0dd2839
encrypt fields
SKairinos Mar 16, 2026
694b5e8
fix user fields
SKairinos Mar 16, 2026
780b24e
sha256 field
SKairinos Mar 16, 2026
dcd7077
fix discovery and exclude test files
SKairinos Mar 17, 2026
7daccb1
delete
SKairinos Mar 17, 2026
3785d07
upgrade pyjwt
SKairinos Mar 17, 2026
3e0f72a
update
SKairinos Mar 18, 2026
16a0ec2
improve encrypt fields command
SKairinos Mar 18, 2026
4d33e4f
simplify
SKairinos Mar 18, 2026
c91d8b7
fix
SKairinos Mar 18, 2026
75841ce
set email to None
SKairinos Mar 18, 2026
e996cfe
make hash nullable
SKairinos Mar 18, 2026
f2fecf7
split
SKairinos Mar 18, 2026
51b1c2a
fix filter
SKairinos Mar 18, 2026
4f9fcc1
test
SKairinos Mar 18, 2026
435ad7a
test
SKairinos Mar 18, 2026
2e8817f
test
SKairinos Mar 18, 2026
939c7d9
test
SKairinos Mar 18, 2026
568be0e
test
SKairinos Mar 18, 2026
5d7b2ea
test
SKairinos Mar 18, 2026
c3f6dcf
exclude test files
SKairinos Mar 18, 2026
9078156
put back username field
SKairinos Mar 19, 2026
c8884e6
quick save
SKairinos Mar 19, 2026
c7939a7
quick save
SKairinos Mar 19, 2026
a387caf
quick save
SKairinos Mar 19, 2026
0a04cb0
quick save
SKairinos Mar 20, 2026
caef22b
prefetch data
SKairinos Mar 20, 2026
bec6005
quick save
SKairinos Mar 20, 2026
0160c34
house keeping and small fixes
SKairinos Mar 20, 2026
9c97be0
handle internal value
SKairinos Mar 20, 2026
39a84f9
fix
SKairinos Mar 20, 2026
a33291c
delete
SKairinos Mar 20, 2026
231e73c
field aliases and properties
SKairinos Mar 24, 2026
e2f8680
make meta fields private
SKairinos Mar 24, 2026
43e6d9e
set db_column
SKairinos Mar 24, 2026
8bfb2c2
fix
SKairinos Mar 24, 2026
9ee6ed7
fix
SKairinos Mar 24, 2026
f96a430
fix create dek
SKairinos Mar 24, 2026
38d5f4b
dek aead validation error
SKairinos Mar 24, 2026
9452c5d
fix linting errors
SKairinos Mar 24, 2026
03690dd
house keeping and clear pending encryptions
SKairinos Mar 25, 2026
502b839
update docs
SKairinos Mar 25, 2026
bd9eafc
fix docs 2
SKairinos Mar 25, 2026
b9da962
fix migrations
SKairinos Mar 25, 2026
2ebd8ed
merge from main
SKairinos Mar 25, 2026
a27a0af
set dek
SKairinos Mar 25, 2026
d1687cf
house keeping and anonymisation
SKairinos Mar 27, 2026
1d90e77
new requests version
SKairinos Mar 27, 2026
76c0a5a
remove if checks
SKairinos Mar 27, 2026
c0dc890
fix
SKairinos Mar 31, 2026
903a5e5
sort keys
SKairinos Apr 2, 2026
e43ab5e
create dek first
SKairinos Apr 2, 2026
0109b62
feedback
SKairinos Apr 2, 2026
9021bad
upgrade cryptography
SKairinos Apr 2, 2026
2d942f6
optimize query
SKairinos Apr 8, 2026
f5ace38
sort model classes
SKairinos Apr 8, 2026
0885777
secret manager
SKairinos Apr 10, 2026
8e84bd5
fix
SKairinos Apr 10, 2026
185d0c2
fix secret loading
SKairinos Apr 10, 2026
cb153d6
fix
SKairinos Apr 10, 2026
de7bb50
secrets per env
SKairinos Apr 10, 2026
37a96b9
make latest secret callable
SKairinos Apr 10, 2026
a1c707b
TypedLatestSecret
SKairinos Apr 10, 2026
951a12a
add TypedLatestSecret
SKairinos Apr 29, 2026
d69ba3b
cast if is str
SKairinos Apr 29, 2026
c44c8bf
exclude dirty data
SKairinos May 6, 2026
89ce5e1
multi-threading
SKairinos May 6, 2026
78192c9
update packages
SKairinos May 6, 2026
c1d8499
fix filters
SKairinos May 6, 2026
b652e68
fix
SKairinos May 6, 2026
ab6fc6b
exclude dirty data
SKairinos May 6, 2026
94e4306
delete unused packages
SKairinos May 8, 2026
de88270
merge from main
SKairinos May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 3 additions & 10 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,28 @@ verify_ssl = true
name = "pypi"

[packages]
celery = {version = "==5.4.0", extras = ["sqs"]}
cryptography = "==46.0.7"
boto3 = "==1.36.14"
django = "==5.2.13"
django = "==5.2.14"
djangorestframework = "==3.16.1"
django-filter = "==25.1"
django-countries = "==7.6.1"
django-cors-headers = "==4.7.0"
django-csp = "==3.8"
django-storages = {version = "==1.14.6", extras = ["s3"]}
pyotp = "==2.9.0"
python-dotenv = "==1.0.1"
psycopg2-binary = "==2.9.9"
redis = {version = "==5.2.1", extras = ["hiredis"]}
regex = "==2024.11.6"
requests = "==2.33.1"
gunicorn = "==23.0.0"
uvicorn-worker = "==0.2.0"
pyjwt = "==2.12.1"
psutil = "==7.0.0"
google-auth = "==2.48.0"
google-cloud-bigquery = "==3.38.0"
google-cloud-secret-manager = "==2.27.0"
google-crc32c = "==1.8.0"
tink = {version = "==1.13.0", extras = ["gcpkms"]}
cachetools = "==6.2.6"

[dev-packages]
celery-types = "==0.23.0"
black = "==24.8.0"
boto3-stubs = {version = "==1.38.39", extras = ["essential"]}
pytest = "==8.3.3"
pytest-cov = "==5.0.0"
pytest-env = "==0.8.1"
Expand Down
508 changes: 66 additions & 442 deletions Pipfile.lock

Large diffs are not rendered by default.

86 changes: 1 addition & 85 deletions codeforlife/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,7 @@

import os
import sys
import typing as t
from io import StringIO
from pathlib import Path
from types import SimpleNamespace

from .types import Env

# Do NOT set manually!
# This is auto-updated by python-semantic-release in the pipeline.
Expand All @@ -22,52 +17,24 @@
USER_DIR = BASE_DIR.joinpath("user")


if t.TYPE_CHECKING:
from mypy_boto3_s3.client import S3Client


# pylint: disable-next=too-few-public-methods
class Secrets(SimpleNamespace):
"""The secrets for this service.

If a key does not exist, the value None will be returned.
"""

def __getattribute__(self, name: str) -> t.Optional[str]:
try:
return super().__getattribute__(name)
except AttributeError:
return None


def set_up_settings(service_base_dir: Path, service_name: str):
"""Set up the settings for the service.

*This needs to be called before importing the CFL settings!*

To expose a secret to your Django project, you'll need to create a setting
for it following Django's conventions.

Examples:
```
from codeforlife import set_up_settings

# Must set up settings before importing them!
secrets = set_up_settings(BASE_DIR, service_name="my-service")
set_up_settings(BASE_DIR, service_name="my-service")

from codeforlife.settings import *

# Expose secret to django project.
SECRET_KEY = secrets.SECRET_KEY
```

Args:
service_base_dir: The base directory of the service.
service_name: The name of the service.

Returns:
The secrets. These are not loaded as environment variables so that 3rd
party packages cannot read them.
"""

# Validate CFL settings have not been imported yet.
Expand All @@ -76,57 +43,6 @@ def set_up_settings(service_base_dir: Path, service_name: str):
"You must set up the CFL settings before importing them."
)

# pylint: disable-next=import-outside-toplevel
from dotenv import dotenv_values, load_dotenv

# Set required environment variables.
os.environ["SERVICE_BASE_DIR"] = str(service_base_dir)
os.environ["SERVICE_NAME"] = service_name

# Get environment name.
os.environ.setdefault("ENV", "local")
env = t.cast(Env, os.environ["ENV"])

# Load environment variables.
load_dotenv(service_base_dir / f"env/.env.{env}", override=False)
load_dotenv(service_base_dir / "env/.env", override=False)

# Get secrets.
if env == "local":
secrets_path = service_base_dir / "env/.env.local.secrets"
# TODO: move this to the dev container setup script.
if not os.path.exists(secrets_path):
# pylint: disable=line-too-long
secrets_file_comment = (
"# 📝 Local Secret Variables 📝\n"
"# These secret variables are only loaded in your local environment (on your PC).\n"
"#\n"
"# This file is git-ignored intentionally to keep these variables a secret.\n"
"#\n"
"# 🚫 DO NOT PUSH SECRETS TO THE CODE REPO 🚫\n"
"\n"
)
# pylint: enable=line-too-long

with open(secrets_path, "w+", encoding="utf-8") as secrets_file:
secrets_file.write(secrets_file_comment)

secrets = dotenv_values(secrets_path)
else:
# pylint: disable-next=import-outside-toplevel
import boto3

s3: "S3Client" = boto3.client("s3")
secrets_object = s3.get_object(
Bucket=os.environ["aws_s3_app_bucket"],
Key=(
os.environ["aws_s3_app_folder"]
+ f"/secure/.env.secrets.{service_name}"
),
)

secrets = dotenv_values(
stream=StringIO(secrets_object["Body"].read().decode("utf-8"))
)

return Secrets(**secrets)
90 changes: 0 additions & 90 deletions codeforlife/auth.py

This file was deleted.

Loading
Loading