|
|
@@ -1,10 +1,13 @@
|
|
|
from datetime import timedelta
|
|
|
from importlib import import_module
|
|
|
|
|
|
+import requests
|
|
|
from django.conf import settings
|
|
|
+from django.core.cache import cache
|
|
|
from django.core.management.base import BaseCommand
|
|
|
from django.db import DEFAULT_DB_ALIAS
|
|
|
from django.utils import timezone
|
|
|
+from packaging import version
|
|
|
|
|
|
from extras.models import ObjectChange
|
|
|
|
|
|
@@ -48,4 +51,37 @@ class Command(BaseCommand):
|
|
|
f"\tSkipping: No retention period specified (CHANGELOG_RETENTION = {settings.CHANGELOG_RETENTION})"
|
|
|
)
|
|
|
|
|
|
+ # Check for new releases (if enabled)
|
|
|
+ self.stdout.write("[*] Checking for latest release")
|
|
|
+ if settings.RELEASE_CHECK_URL:
|
|
|
+ headers = {
|
|
|
+ 'Accept': 'application/vnd.github.v3+json',
|
|
|
+ }
|
|
|
+
|
|
|
+ try:
|
|
|
+ self.stdout.write(f"\tFetching {settings.RELEASE_CHECK_URL}")
|
|
|
+ response = requests.get(
|
|
|
+ url=settings.RELEASE_CHECK_URL,
|
|
|
+ headers=headers,
|
|
|
+ proxies=settings.HTTP_PROXIES
|
|
|
+ )
|
|
|
+ response.raise_for_status()
|
|
|
+
|
|
|
+ releases = []
|
|
|
+ for release in response.json():
|
|
|
+ if 'tag_name' not in release or release.get('devrelease') or release.get('prerelease'):
|
|
|
+ continue
|
|
|
+ releases.append((version.parse(release['tag_name']), release.get('html_url')))
|
|
|
+ latest_release = max(releases)
|
|
|
+ self.stdout.write(f"\tFound {len(response.json())} releases; {len(releases)} usable")
|
|
|
+ self.stdout.write(f"\tLatest release: {latest_release[0]}")
|
|
|
+
|
|
|
+ # Cache the most recent release
|
|
|
+ cache.set('latest_release', latest_release, None)
|
|
|
+
|
|
|
+ except requests.exceptions.RequestException as exc:
|
|
|
+ self.stdout.write(f"\tRequest error: {exc}")
|
|
|
+ else:
|
|
|
+ self.stdout.write(f"\tSkipping: RELEASE_CHECK_URL not set")
|
|
|
+
|
|
|
self.stdout.write("Finished.", self.style.SUCCESS)
|