Skip to content

Commit db2ad45

Browse files
authored
Domains: add expired queryset (#9667)
This is going to be used in rtd-ext to remove expired domains from CF.
1 parent 5e870d4 commit db2ad45

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

readthedocs/domains/querysets.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""Querysets for domain related models."""
22

3+
from datetime import timedelta
4+
35
from django.conf import settings
46
from django.db.models import Q
57
from django.utils import timezone
@@ -9,8 +11,11 @@
911

1012

1113
class DomainQueryset(RelatedProjectQuerySet):
14+
15+
"""Domain querysets."""
16+
1217
def pending(self, include_recently_expired=False):
13-
max_date = timezone.now() - timezone.timedelta(
18+
max_date = timezone.now() - timedelta(
1419
days=settings.RTD_CUSTOM_DOMAINS_VALIDATION_PERIOD
1520
)
1621
queryset = self.exclude(
@@ -20,5 +25,26 @@ def pending(self, include_recently_expired=False):
2025
return queryset.filter(validation_process_start__date__gte=max_date)
2126
return queryset.filter(validation_process_start__date__gt=max_date)
2227

28+
def expired(self, when=None):
29+
"""
30+
Return domains that have their validation process expired.
31+
32+
:param when: If given, return domains that expired on this date only.
33+
"""
34+
queryset = self.exclude(
35+
Q(ssl_status=SSL_STATUS_VALID) | Q(skip_validation=True)
36+
)
37+
if when:
38+
start_date = when - timedelta(
39+
days=settings.RTD_CUSTOM_DOMAINS_VALIDATION_PERIOD
40+
)
41+
queryset = queryset.filter(validation_process_start__date=start_date)
42+
else:
43+
max_date = timezone.now() - timedelta(
44+
days=settings.RTD_CUSTOM_DOMAINS_VALIDATION_PERIOD
45+
)
46+
queryset = queryset.filter(validation_process_start__date__lte=max_date)
47+
return queryset
48+
2349
def valid(self):
2450
return self.filter(ssl_status=SSL_STATUS_VALID)

readthedocs/domains/tests/test_querysets.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import timedelta
2+
13
from django.conf import settings
24
from django.contrib.auth.models import User
35
from django.test import TestCase
@@ -33,15 +35,15 @@ def setUp(self):
3335
self.domain_recently_expired = get(
3436
Domain, project=self.project, ssl_status=SSL_STATUS_PENDING
3537
)
36-
self.domain_recently_expired.validation_process_start -= timezone.timedelta(
38+
self.domain_recently_expired.validation_process_start -= timedelta(
3739
days=settings.RTD_CUSTOM_DOMAINS_VALIDATION_PERIOD
3840
)
3941
self.domain_recently_expired.save()
4042

4143
self.domain_expired = get(
4244
Domain, project=self.project, ssl_status=SSL_STATUS_PENDING
4345
)
44-
self.domain_expired.validation_process_start -= timezone.timedelta(
46+
self.domain_expired.validation_process_start -= timedelta(
4547
days=settings.RTD_CUSTOM_DOMAINS_VALIDATION_PERIOD + 10
4648
)
4749
self.domain_expired.save()
@@ -59,3 +61,16 @@ def test_pending(self):
5961
def test_valid(self):
6062
domains = set(Domain.objects.valid().all())
6163
self.assertEqual(domains, {self.domain})
64+
65+
def test_expired(self):
66+
# All expired domains.
67+
domains = set(Domain.objects.expired())
68+
self.assertEqual(domains, {self.domain_expired, self.domain_recently_expired})
69+
70+
# Domains that expired today.
71+
domains = set(Domain.objects.expired(when=timezone.now()))
72+
self.assertEqual(domains, {self.domain_recently_expired})
73+
74+
# Domains that expired 10 days ago.
75+
domains = set(Domain.objects.expired(when=timezone.now() - timedelta(days=10)))
76+
self.assertEqual(domains, {self.domain_expired})

0 commit comments

Comments
 (0)