Skip to content

Commit 1259825

Browse files
authored
Merge pull request #7524 from readthedocs/future-default-true
Add future default true to Feature flags
2 parents bf839aa + 2d9d8fe commit 1259825

File tree

6 files changed

+60
-4
lines changed

6 files changed

+60
-4
lines changed

readthedocs/projects/admin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ class DomainAdmin(admin.ModelAdmin):
366366
class FeatureAdmin(admin.ModelAdmin):
367367
model = Feature
368368
form = FeatureForm
369-
list_display = ('feature_id', 'project_count', 'default_true')
369+
list_display = ('feature_id', 'project_count', 'default_true', 'future_default_true')
370370
search_fields = ('feature_id',)
371371
filter_horizontal = ('projects',)
372372
readonly_fields = ('add_date',)

readthedocs/projects/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ class FeatureForm(forms.ModelForm):
722722

723723
class Meta:
724724
model = Feature
725-
fields = ['projects', 'feature_id', 'default_true']
725+
fields = ['projects', 'feature_id', 'default_true', 'future_default_true']
726726

727727
def __init__(self, *args, **kwargs):
728728
super().__init__(*args, **kwargs)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 2.2.16 on 2020-10-16 14:56
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('projects', '0063_extend_domain_from_timestamp_model'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='feature',
15+
name='future_default_true',
16+
field=models.BooleanField(default=False, verbose_name='Default all future projects to True'),
17+
),
18+
migrations.AlterField(
19+
model_name='feature',
20+
name='default_true',
21+
field=models.BooleanField(default=False, verbose_name='Default all past projects to True'),
22+
),
23+
]

readthedocs/projects/models.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -1742,8 +1742,14 @@ def add_features(sender, **kwargs):
17421742
_('Date feature was added'),
17431743
auto_now_add=True,
17441744
)
1745+
# TODO: rename this field to `past_default_true` and follow this steps when deploying
1746+
# https://github.com/readthedocs/readthedocs.org/pull/7524#issuecomment-703663724
17451747
default_true = models.BooleanField(
1746-
_('Historical default is True'),
1748+
_('Default all past projects to True'),
1749+
default=False,
1750+
)
1751+
future_default_true = models.BooleanField(
1752+
_('Default all future projects to True'),
17471753
default=False,
17481754
)
17491755

readthedocs/projects/querysets.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,8 @@ class FeatureQuerySet(models.QuerySet):
239239
def for_project(self, project):
240240
return self.filter(
241241
Q(projects=project) |
242-
Q(default_true=True, add_date__gt=project.pub_date),
242+
Q(default_true=True, add_date__gt=project.pub_date) |
243+
Q(future_default_true=True, add_date__lt=project.pub_date)
243244
).distinct()
244245

245246

readthedocs/rtd_tests/tests/test_project_querysets.py

+26
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,32 @@ def test_feature_for_project_is_implicitly_applied(self):
259259
ordered=False,
260260
)
261261

262+
def test_feature_future_default_true(self):
263+
project = fixture.get(Project, main_language_project=None)
264+
# Explicit feature
265+
feature1 = fixture.get(Feature, projects=[project])
266+
267+
# False implicit feature
268+
feature2 = fixture.get(
269+
Feature,
270+
projects=[],
271+
add_date=project.pub_date + timedelta(days=1),
272+
future_default_true=False,
273+
)
274+
275+
# True implicit feature after add date
276+
feature3 = fixture.get(
277+
Feature,
278+
projects=[],
279+
add_date=project.pub_date - timedelta(days=1),
280+
future_default_true=True,
281+
)
282+
self.assertQuerysetEqual(
283+
Feature.objects.for_project(project),
284+
[repr(feature1), repr(feature3)],
285+
ordered=False,
286+
)
287+
262288
def test_feature_multiple_projects(self):
263289
project1 = fixture.get(Project, main_language_project=None)
264290
project2 = fixture.get(Project, main_language_project=None)

0 commit comments

Comments
 (0)