Skip to content

Commit fab340d

Browse files
authored
Merge pull request #5255 from rtfd/agj/add-admin-build-version
Add admin actions for building versions
2 parents 460a019 + d6a69c2 commit fab340d

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed

readthedocs/builds/admin.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
"""Django admin interface for `~builds.models.Build` and related models."""
44

5-
from django.contrib import admin
5+
from django.contrib import admin, messages
66
from guardian.admin import GuardedModelAdmin
77

88
from readthedocs.builds.models import Build, BuildCommandResult, Version
9+
from readthedocs.core.utils import trigger_build
910

1011

1112
class BuildCommandResultInline(admin.TabularInline):
@@ -54,7 +55,26 @@ class VersionAdmin(GuardedModelAdmin):
5455
'built',
5556
)
5657
list_filter = ('type', 'privacy_level', 'active', 'built')
58+
search_fields = ('slug', 'project__slug')
5759
raw_id_fields = ('project',)
60+
actions = ['build_version']
61+
62+
def build_version(self, request, queryset):
63+
"""Trigger a build for the project version."""
64+
total = 0
65+
for version in queryset:
66+
trigger_build(
67+
project=version.project,
68+
version=version,
69+
)
70+
total += 1
71+
messages.add_message(
72+
request,
73+
messages.INFO,
74+
'Triggered builds for {} version(s).'.format(total),
75+
)
76+
77+
build_version.short_description = 'Build version'
5878

5979

6080
admin.site.register(Build, BuildAdmin)

readthedocs/projects/admin.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22

3-
"""Django administration interface for `projects.models`"""
3+
"""Django administration interface for `projects.models`."""
44

55
from django.contrib import admin, messages
66
from django.contrib.admin.actions import delete_selected
@@ -9,7 +9,7 @@
99

1010
from readthedocs.builds.models import Version
1111
from readthedocs.core.models import UserProfile
12-
from readthedocs.core.utils import broadcast
12+
from readthedocs.core.utils import broadcast, trigger_build
1313
from readthedocs.notifications.views import SendNotificationView
1414
from readthedocs.redirects.models import Redirect
1515

@@ -47,7 +47,7 @@ def get_object_recipients(self, obj):
4747

4848
class ProjectRelationshipInline(admin.TabularInline):
4949

50-
"""Project inline relationship view for :py:class:`ProjectAdmin`"""
50+
"""Project inline relationship view for :py:class:`ProjectAdmin`."""
5151

5252
model = ProjectRelationship
5353
fk_name = 'parent'
@@ -56,14 +56,14 @@ class ProjectRelationshipInline(admin.TabularInline):
5656

5757
class VersionInline(admin.TabularInline):
5858

59-
"""Version inline relationship view for :py:class:`ProjectAdmin`"""
59+
"""Version inline relationship view for :py:class:`ProjectAdmin`."""
6060

6161
model = Version
6262

6363

6464
class RedirectInline(admin.TabularInline):
6565

66-
"""Redirect inline relationship view for :py:class:`ProjectAdmin`"""
66+
"""Redirect inline relationship view for :py:class:`ProjectAdmin`."""
6767

6868
model = Redirect
6969

@@ -77,7 +77,15 @@ class DomainInline(admin.TabularInline):
7777
# class ImpressionInline(admin.TabularInline):
7878
# from readthedocs.donate.models import ProjectImpressions
7979
# model = ProjectImpressions
80-
# readonly_fields = ('date', 'promo', 'offers', 'views', 'clicks', 'view_ratio', 'click_ratio')
80+
# readonly_fields = (
81+
# 'date',
82+
# 'promo',
83+
# 'offers',
84+
# 'views',
85+
# 'clicks',
86+
# 'view_ratio',
87+
# 'click_ratio',
88+
# )
8189
# extra = 0
8290
# can_delete = False
8391
# max_num = 15
@@ -137,7 +145,7 @@ class ProjectAdmin(GuardedModelAdmin):
137145
]
138146
readonly_fields = ('feature_flags',)
139147
raw_id_fields = ('users', 'main_language_project')
140-
actions = ['send_owner_email', 'ban_owner']
148+
actions = ['send_owner_email', 'ban_owner', 'build_default_version']
141149

142150
def feature_flags(self, obj):
143151
return ', '.join([str(f.get_feature_display()) for f in obj.features])
@@ -162,8 +170,9 @@ def ban_owner(self, request, queryset):
162170
for project in queryset:
163171
if project.users.count() == 1:
164172
count = (
165-
UserProfile.objects.filter(user__projects=project
166-
).update(banned=True)
173+
UserProfile.objects.filter(
174+
user__projects=project,
175+
).update(banned=True)
167176
) # yapf: disabled
168177
total += count
169178
else:
@@ -199,6 +208,20 @@ def delete_selected_and_artifacts(self, request, queryset):
199208
)
200209
return delete_selected(self, request, queryset)
201210

211+
def build_default_version(self, request, queryset):
212+
"""Trigger a build for the project version."""
213+
total = 0
214+
for project in queryset:
215+
trigger_build(project=project)
216+
total += 1
217+
messages.add_message(
218+
request,
219+
messages.INFO,
220+
'Triggered builds for {} project(s).'.format(total),
221+
)
222+
223+
build_default_version.short_description = 'Build default version'
224+
202225
def get_actions(self, request):
203226
actions = super().get_actions(request)
204227
actions['delete_selected'] = (
@@ -211,7 +234,7 @@ def get_actions(self, request):
211234

212235
class ImportedFileAdmin(admin.ModelAdmin):
213236

214-
"""Admin view for :py:class:`ImportedFile`"""
237+
"""Admin view for :py:class:`ImportedFile`."""
215238

216239
raw_id_fields = ('project', 'version')
217240
list_display = ('path', 'name', 'version')

0 commit comments

Comments
 (0)