Skip to content

Commit 0280d04

Browse files
inglorjelly
authored andcommitted
feat(api): add deprecation headers to releng legacy JSON endpoint
Add `deprecated_json_endpoint` decorator in `api/deprecation.py` (RFC 8594). Apply to `releng/views.py` `releases_json` - response now includes `Deprecation: true` and `Link: </api/v1/releng/releases/>; rel="successor-version"`.
1 parent 553500d commit 0280d04

4 files changed

Lines changed: 31 additions & 12 deletions

File tree

api/deprecation.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from functools import wraps
2+
3+
4+
def deprecated_json_endpoint(successor_path: str):
5+
def decorator(view_func):
6+
@wraps(view_func)
7+
def wrapper(request, *args, **kwargs):
8+
response = view_func(request, *args, **kwargs)
9+
response['Deprecation'] = 'true'
10+
response['Link'] = f'<{successor_path}>; rel="successor-version"'
11+
return response
12+
return wrapper
13+
return decorator

api/schemas/releng.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,28 @@
11
from datetime import date, datetime
2-
from typing import Optional
32

43
from ninja import Schema
54

65

76
class ReleaseSchema(Schema):
87
version: str
9-
kernel_version: Optional[str] = None
8+
kernel_version: str | None = None
109
release_date: date
1110
available: bool
1211
info: str
13-
iso_url: Optional[str] = None
14-
magnet_uri: Optional[str] = None
15-
torrent_url: Optional[str] = None
16-
md5_sum: Optional[str] = None
17-
sha1_sum: Optional[str] = None
18-
sha256_sum: Optional[str] = None
19-
b2_sum: Optional[str] = None
20-
wkd_email: Optional[str] = None
21-
pgp_fingerprint: Optional[str] = None
12+
iso_url: str | None = None
13+
magnet_uri: str | None = None
14+
torrent_url: str | None = None
15+
md5_sum: str | None = None
16+
sha1_sum: str | None = None
17+
sha256_sum: str | None = None
18+
b2_sum: str | None = None
19+
wkd_email: str | None = None
20+
pgp_fingerprint: str | None = None
2221
created: datetime
2322
last_modified: datetime
2423

2524

2625
class ReleasesSchema(Schema):
2726
version: int
2827
releases: list[ReleaseSchema]
29-
latest_version: Optional[str] = None
28+
latest_version: str | None = None

api/tests/test_deprecation.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def test_releng_releases_json_deprecation_headers(db, client):
2+
response = client.get('/releng/releases/json/')
3+
assert response.status_code == 200
4+
assert response['Deprecation'] == 'true'
5+
assert response['Link'] == '</api/v1/releng/releases/>; rel="successor-version"'

releng/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.urls import reverse
99
from django.views.generic import DetailView, ListView
1010

11+
from api.deprecation import deprecated_json_endpoint
1112
from main.models import Package
1213
from mirrors.models import MirrorUrl
1314

@@ -59,6 +60,7 @@ def default(self, obj):
5960
return super().default(obj)
6061

6162

63+
@deprecated_json_endpoint('/api/v1/releng/releases/')
6264
def releases_json(request):
6365
releases = Release.objects.all()
6466
try:

0 commit comments

Comments
 (0)