24
24
from django .utils .translation import ugettext_lazy as _
25
25
from django .views .generic import ListView , TemplateView , View
26
26
from formtools .wizard .views import SessionWizardView
27
- from vanilla import CreateView , DeleteView , DetailView , GenericView , UpdateView
27
+ from vanilla import (
28
+ CreateView ,
29
+ DeleteView ,
30
+ DetailView ,
31
+ GenericModelView ,
32
+ GenericView ,
33
+ UpdateView ,
34
+ )
28
35
29
36
from readthedocs .builds .forms import VersionForm
30
37
from readthedocs .builds .models import Version
@@ -143,25 +150,36 @@ def get_success_url(self):
143
150
return reverse ('projects_detail' , args = [self .object .slug ])
144
151
145
152
146
- @login_required
147
- def project_version_detail (request , project_slug , version_slug ):
148
- """Project version detail page."""
149
- project = get_object_or_404 (
150
- Project .objects .for_admin_user (request .user ),
151
- slug = project_slug ,
152
- )
153
- version = get_object_or_404 (
154
- Version .internal .public (
155
- user = request .user ,
156
- project = project ,
153
+ class ProjectVersionMixin (ProjectAdminMixin , PrivateViewMixin ):
154
+
155
+ model = Version
156
+ context_object_name = 'version'
157
+ form_class = VersionForm
158
+ lookup_url_kwarg = 'version_slug'
159
+ lookup_field = 'slug'
160
+
161
+ def get_success_url (self ):
162
+ return reverse (
163
+ 'project_version_list' ,
164
+ kwargs = {'project_slug' : self .get_project ().slug },
165
+ )
166
+
167
+
168
+ class ProjectVersionDetail (ProjectVersionMixin , UpdateView ):
169
+
170
+ template_name = 'projects/project_version_detail.html'
171
+
172
+ def get_queryset (self ):
173
+ return Version .internal .public (
174
+ user = self .request .user ,
175
+ project = self .get_project (),
157
176
only_active = False ,
158
- ),
159
- slug = version_slug ,
160
- )
177
+ )
161
178
162
- form = VersionForm (request .POST or None , instance = version )
179
+ def get_form (self , data = None , files = None , ** kwargs ):
180
+ return self .get_form_class ()(data , files , ** kwargs )
163
181
164
- if request . method == 'POST' and form . is_valid ( ):
182
+ def form_valid ( self , form ):
165
183
version = form .save ()
166
184
if form .has_changed ():
167
185
if 'active' in form .changed_data and version .active is False :
@@ -173,14 +191,28 @@ def project_version_detail(request, project_slug, version_slug):
173
191
)
174
192
version .built = False
175
193
version .save ()
176
- url = reverse ('project_version_list' , args = [project .slug ])
177
- return HttpResponseRedirect (url )
194
+ return HttpResponseRedirect (self .get_success_url ())
178
195
179
- return render (
180
- request ,
181
- 'projects/project_version_detail.html' ,
182
- {'form' : form , 'project' : project , 'version' : version },
183
- )
196
+
197
+ class ProjectVersionDeleteHTML (ProjectVersionMixin , GenericModelView ):
198
+
199
+ http_method_names = ['get' ]
200
+
201
+ def get (self , request , * args , ** kwargs ):
202
+ version = self .get_object ()
203
+ if not version .active :
204
+ version .built = False
205
+ version .save ()
206
+ broadcast (
207
+ type = 'app' ,
208
+ task = tasks .remove_dirs ,
209
+ args = [version .get_artifact_paths ()],
210
+ )
211
+ else :
212
+ return HttpResponseBadRequest (
213
+ "Can't delete HTML for an active version." ,
214
+ )
215
+ return HttpResponseRedirect (self .get_success_url ())
184
216
185
217
186
218
@login_required
@@ -654,43 +686,6 @@ def project_redirects_delete(request, project_slug):
654
686
)
655
687
656
688
657
- @login_required
658
- def project_version_delete_html (request , project_slug , version_slug ):
659
- """
660
- Project version 'delete' HTML.
661
-
662
- This marks a version as not built
663
- """
664
- project = get_object_or_404 (
665
- Project .objects .for_admin_user (request .user ),
666
- slug = project_slug ,
667
- )
668
- version = get_object_or_404 (
669
- Version .internal .public (
670
- user = request .user ,
671
- project = project ,
672
- only_active = False ,
673
- ),
674
- slug = version_slug ,
675
- )
676
-
677
- if not version .active :
678
- version .built = False
679
- version .save ()
680
- broadcast (
681
- type = 'app' ,
682
- task = tasks .remove_dirs ,
683
- args = [version .get_artifact_paths ()],
684
- )
685
- else :
686
- return HttpResponseBadRequest (
687
- "Can't delete HTML for an active version." ,
688
- )
689
- return HttpResponseRedirect (
690
- reverse ('project_version_list' , kwargs = {'project_slug' : project_slug }),
691
- )
692
-
693
-
694
689
class DomainMixin (ProjectAdminMixin , PrivateViewMixin ):
695
690
model = Domain
696
691
form_class = DomainForm
0 commit comments