Skip to content

Commit 2f4334d

Browse files
authored
Import: remove extra/advanced step from project import wizard (#10603)
* Import: remove extra/advanced step from project import wizard This commit removes the "Extra/Advanced" step and moves the "language" attribute to the "Basics" step -- the first one, since that field is important. Closes #10392 * Update tests
1 parent 87cdbb6 commit 2f4334d

File tree

5 files changed

+33
-109
lines changed

5 files changed

+33
-109
lines changed

readthedocs/projects/forms.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,15 @@ class ProjectBasicsForm(ProjectForm):
8686

8787
class Meta:
8888
model = Project
89-
fields = ("name", "repo", "default_branch")
89+
fields = ("name", "repo", "default_branch", "language")
9090

9191
remote_repository = forms.IntegerField(
9292
widget=forms.HiddenInput(),
9393
required=False,
9494
)
9595

9696
def __init__(self, *args, **kwargs):
97-
show_advanced = kwargs.pop('show_advanced', False)
9897
super().__init__(*args, **kwargs)
99-
if show_advanced:
100-
self.fields['advanced'] = forms.BooleanField(
101-
required=False,
102-
label=_('Edit advanced project options'),
103-
)
10498
self.fields['repo'].widget.attrs['placeholder'] = self.placehold_repo()
10599
self.fields['repo'].widget.attrs['required'] = True
106100

readthedocs/projects/views/mixins.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,11 @@ class ProjectImportMixin:
100100

101101
"""Helpers to import a Project."""
102102

103-
def finish_import_project(self, request, project, tags=None):
103+
def finish_import_project(self, request, project):
104104
"""
105105
Perform last steps to import a project into Read the Docs.
106106
107107
- Add the user from request as maintainer
108-
- Set all the tags to the project
109108
- Send Django Signal
110109
- Trigger initial build
111110
@@ -115,18 +114,11 @@ def finish_import_project(self, request, project, tags=None):
115114
:param project: Project instance just imported (already saved)
116115
:param tags: tags to add to the project
117116
"""
118-
if not tags:
119-
tags = []
120-
121117
project.users.add(request.user)
122-
for tag in tags:
123-
project.tags.add(tag)
124-
125118
log.info(
126119
'Project imported.',
127120
project_slug=project.slug,
128121
user_username=request.user.username,
129-
tags=tags,
130122
)
131123

132124
# TODO: this signal could be removed, or used for sync task

readthedocs/projects/views/private.py

+1-21
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
ProjectAdvertisingForm,
5555
ProjectBasicsForm,
5656
ProjectConfigForm,
57-
ProjectExtraForm,
5857
ProjectRelationshipForm,
5958
RedirectForm,
6059
TranslationForm,
@@ -262,9 +261,7 @@ class ImportWizardView(ProjectImportMixin, PrivateViewMixin, SessionWizardView):
262261
form_list = [
263262
("basics", ProjectBasicsForm),
264263
("config", ProjectConfigForm),
265-
("extra", ProjectExtraForm),
266264
]
267-
condition_dict = {'extra': lambda self: self.is_advanced()}
268265

269266
initial_dict_key = 'initial-data'
270267

@@ -298,8 +295,6 @@ def get_form_kwargs(self, step=None):
298295
"""Get args to pass into form instantiation."""
299296
kwargs = {}
300297
kwargs['user'] = self.request.user
301-
if step == 'basics':
302-
kwargs['show_advanced'] = True
303298
return kwargs
304299

305300
def get_template_names(self):
@@ -314,32 +309,17 @@ def done(self, form_list, **kwargs):
314309
other side effects for now, by signalling a save without commit. Then,
315310
finish by added the members to the project and saving.
316311
"""
317-
form_data = self.get_all_cleaned_data()
318-
extra_fields = ProjectExtraForm.Meta.fields
319312
basics_form = form_list[0]
320313
# Save the basics form to create the project instance, then alter
321314
# attributes directly from other forms
322315
project = basics_form.save()
323316

324-
# Remove tags to avoid setting them in raw instead of using ``.add``
325-
tags = form_data.pop('tags', [])
326-
327-
for field, value in list(form_data.items()):
328-
if field in extra_fields:
329-
setattr(project, field, value)
330-
project.save()
331-
332-
self.finish_import_project(self.request, project, tags)
317+
self.finish_import_project(self.request, project)
333318

334319
return HttpResponseRedirect(
335320
reverse('projects_detail', args=[project.slug]),
336321
)
337322

338-
def is_advanced(self):
339-
"""Determine if the user selected the `show advanced` field."""
340-
data = self.get_cleaned_data_for_step('basics') or {}
341-
return data.get('advanced', True)
342-
343323

344324
class ImportView(PrivateViewMixin, TemplateView):
345325

readthedocs/rtd_tests/tests/test_project_forms.py

+24-17
Original file line numberDiff line numberDiff line change
@@ -74,28 +74,31 @@ def test_import_repo_url(self):
7474
with override_settings(ALLOW_PRIVATE_REPOS=False):
7575
for url, valid in public_urls:
7676
initial = {
77-
'name': 'foo',
78-
'repo_type': 'git',
79-
'repo': url,
77+
"name": "foo",
78+
"repo_type": "git",
79+
"repo": url,
80+
"language": "en",
8081
}
8182
form = ProjectBasicsForm(initial)
8283
self.assertEqual(form.is_valid(), valid, msg=url)
8384

8485
with override_settings(ALLOW_PRIVATE_REPOS=True):
8586
for url, valid in private_urls:
8687
initial = {
87-
'name': 'foo',
88-
'repo_type': 'git',
89-
'repo': url,
88+
"name": "foo",
89+
"repo_type": "git",
90+
"repo": url,
91+
"language": "en",
9092
}
9193
form = ProjectBasicsForm(initial)
9294
self.assertEqual(form.is_valid(), valid, msg=url)
9395

9496
def test_empty_slug(self):
9597
initial = {
96-
'name': "''",
97-
'repo_type': 'git',
98-
'repo': 'https://github.com/user/repository',
98+
"name": "''",
99+
"repo_type": "git",
100+
"repo": "https://github.com/user/repository",
101+
"language": "en",
99102
}
100103
form = ProjectBasicsForm(initial)
101104
self.assertFalse(form.is_valid())
@@ -112,9 +115,10 @@ def test_changing_vcs_should_not_change_latest_is_not_none(self):
112115

113116
form = ProjectBasicsForm(
114117
{
115-
'repo': 'http://github.com/test/test',
116-
'name': 'name',
117-
'repo_type': REPO_TYPE_GIT,
118+
"repo": "http://github.com/test/test",
119+
"name": "name",
120+
"repo_type": REPO_TYPE_GIT,
121+
"language": "en",
118122
},
119123
instance=project,
120124
)
@@ -144,11 +148,14 @@ def test_length_of_tags(self):
144148
self.assertDictEqual(form.errors, {'tags': [error_msg]})
145149

146150
def test_strip_repo_url(self):
147-
form = ProjectBasicsForm({
148-
'name': 'foo',
149-
'repo_type': 'git',
150-
'repo': 'https://github.com/rtfd/readthedocs.org/'
151-
})
151+
form = ProjectBasicsForm(
152+
{
153+
"name": "foo",
154+
"repo_type": "git",
155+
"repo": "https://github.com/rtfd/readthedocs.org/",
156+
"language": "en",
157+
}
158+
)
152159
self.assertTrue(form.is_valid())
153160
self.assertEqual(
154161
form.cleaned_data['repo'],

readthedocs/rtd_tests/tests/test_project_views.py

+6-55
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,11 @@ class TestBasicsForm(WizardTestCase):
6969

7070
def setUp(self):
7171
self.user = get(User)
72-
self.step_data['basics'] = {
73-
'name': 'foobar',
74-
'repo': 'http://example.com/foobar',
75-
'repo_type': 'git',
72+
self.step_data["basics"] = {
73+
"name": "foobar",
74+
"repo": "http://example.com/foobar",
75+
"repo_type": "git",
76+
"language": "en",
7677
}
7778
self.step_data["config"] = {
7879
"confirm": True,
@@ -199,10 +200,6 @@ def setUp(self):
199200
}
200201

201202
def test_initial_params(self):
202-
extra_initial = {
203-
'description': 'An amazing project',
204-
'project_url': "https://foo.bar",
205-
}
206203
config_initial = {
207204
"confirm": True,
208205
}
@@ -213,7 +210,7 @@ def test_initial_params(self):
213210
'default_branch': 'main',
214211
'remote_repository': '',
215212
}
216-
initial = dict(**extra_initial, **config_initial, **basic_initial)
213+
initial = dict(**config_initial, **basic_initial)
217214
self.client.force_login(self.user)
218215

219216
# User selects a remote repo to import.
@@ -223,61 +220,17 @@ def test_initial_params(self):
223220
form = resp.context_data['form']
224221
self.assertEqual(form.initial, basic_initial)
225222

226-
# User selects advanced.
227-
basic_initial['advanced'] = True
228-
step_data = {
229-
f'basics-{k}': v
230-
for k, v in basic_initial.items()
231-
}
232-
step_data[f'{self.wizard_class_slug}-current_step'] = 'basics'
233-
resp = self.client.post(self.url, step_data)
234-
235-
step_data = {f"config-{k}": v for k, v in config_initial.items()}
236-
step_data[f"{self.wizard_class_slug}-current_step"] = "config"
237-
resp = self.client.post(self.url, step_data)
238-
239-
# The correct initial data for the advanced form is set.
240-
form = resp.context_data['form']
241-
self.assertEqual(form.initial, extra_initial)
242-
243223
def test_form_pass(self):
244224
"""Test all forms pass validation."""
245225
resp = self.post_step("basics")
246226
self.assertWizardResponse(resp, "config")
247227
resp = self.post_step("config", session=list(resp._request.session.items()))
248-
self.assertWizardResponse(resp, "extra")
249-
self.assertEqual(resp.status_code, 200)
250-
resp = self.post_step('extra', session=list(resp._request.session.items()))
251228
self.assertIsInstance(resp, HttpResponseRedirect)
252229
self.assertEqual(resp.status_code, 302)
253230
self.assertEqual(resp['location'], '/projects/foobar/')
254231

255232
proj = Project.objects.get(name='foobar')
256233
self.assertIsNotNone(proj)
257-
data = self.step_data['basics']
258-
del data['advanced']
259-
del self.step_data['extra']['tags']
260-
self.assertCountEqual(
261-
[tag.name for tag in proj.tags.all()],
262-
['bar', 'baz', 'foo'],
263-
)
264-
data.update(self.step_data['extra'])
265-
for (key, val) in list(data.items()):
266-
self.assertEqual(getattr(proj, key), val)
267-
268-
def test_form_missing_extra(self):
269-
"""Submit extra form with missing data, expect to get failures."""
270-
# Remove extra data to trigger validation errors
271-
self.step_data['extra'] = {}
272-
273-
resp = self.post_step("basics")
274-
self.assertWizardResponse(resp, "config")
275-
resp = self.post_step("config", session=list(resp._request.session.items()))
276-
self.assertWizardResponse(resp, "extra")
277-
resp = self.post_step("extra", session=list(resp._request.session.items()))
278-
279-
self.assertWizardFailure(resp, 'language')
280-
self.assertWizardFailure(resp, 'documentation_type')
281234

282235
def test_remote_repository_is_added(self):
283236
remote_repo = get(RemoteRepository, default_branch="default-branch")
@@ -292,8 +245,6 @@ def test_remote_repository_is_added(self):
292245
resp = self.post_step("basics")
293246
self.assertWizardResponse(resp, "config")
294247
resp = self.post_step("config", session=list(resp._request.session.items()))
295-
self.assertWizardResponse(resp, "extra")
296-
resp = self.post_step("extra", session=list(resp._request.session.items()))
297248
self.assertIsInstance(resp, HttpResponseRedirect)
298249
self.assertEqual(resp.status_code, 302)
299250
self.assertEqual(resp['location'], '/projects/foobar/')

0 commit comments

Comments
 (0)