diff --git a/docs/config-file/v2.rst b/docs/config-file/v2.rst index 8b0c25ef0e9..68db4944499 100644 --- a/docs/config-file/v2.rst +++ b/docs/config-file/v2.rst @@ -4,19 +4,34 @@ Configuration File V2 Read the Docs supports configuring your documentation builds with a YAML file. :doc:`The Read the Docs file ` must be in the root directory of your project. -Here is an example of how this file looks like: +Below is an example YAML file which may require some changes for your project's configuration: .. code:: yaml - # .readthedocs.yml + # .readthedocs.yml + # Read the Docs configuration file + # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - version: 2 + # Required + version: 2 + + # Build documentation in the docs/ directory with Sphinx + sphinx: + configuration: docs/conf.py + + # Build documentation with MkDocs + #mkdocs: + # configuration: mkdocs.yml + + # Optionally build your docs in additional formats such as PDF and ePub + formats: all + + # Optionally set the version of Python and requirements required to build your docs + python: + version: 3.7 + install: + - requirements: docs/requirements.txt - python: - version: 3.7 - install: - - method: pip - path: . Supported settings ------------------ diff --git a/readthedocs/projects/forms.py b/readthedocs/projects/forms.py index a32b6978df4..8a1938566bb 100644 --- a/readthedocs/projects/forms.py +++ b/readthedocs/projects/forms.py @@ -95,13 +95,7 @@ class Meta: ) def __init__(self, *args, **kwargs): - show_advanced = kwargs.pop('show_advanced', False) super().__init__(*args, **kwargs) - if show_advanced: - self.fields['advanced'] = forms.BooleanField( - required=False, - label=_('Edit advanced project options'), - ) self.fields['repo'].widget.attrs['placeholder'] = self.placehold_repo() self.fields['repo'].widget.attrs['required'] = True diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index 04d6d681b11..3a96bde3a02 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -39,7 +39,6 @@ ProjectAdvancedForm, ProjectAdvertisingForm, ProjectBasicsForm, - ProjectExtraForm, ProjectRelationshipForm, RedirectForm, TranslationForm, @@ -255,17 +254,11 @@ class ImportWizardView(ProjectSpamMixin, PrivateViewMixin, SessionWizardView): form_list = [ ('basics', ProjectBasicsForm), - ('extra', ProjectExtraForm), ] - condition_dict = {'extra': lambda self: self.is_advanced()} def get_form_kwargs(self, step=None): """Get args to pass into form instantiation.""" - kwargs = {} - kwargs['user'] = self.request.user - if step == 'basics': - kwargs['show_advanced'] = True - return kwargs + return {'user': self.request.user} def get_template_names(self): """Return template names based on step name.""" @@ -280,7 +273,6 @@ def done(self, form_list, **kwargs): finish by added the members to the project and saving. """ form_data = self.get_all_cleaned_data() - extra_fields = ProjectExtraForm.Meta.fields # expect the first form; manually wrap in a list in case it's a # View Object, as it is in Python 3. basics_form = list(form_list)[0] @@ -290,9 +282,6 @@ def done(self, form_list, **kwargs): tags = form_data.pop('tags', []) for tag in tags: project.tags.add(tag) - for field, value in list(form_data.items()): - if field in extra_fields: - setattr(project, field, value) project.save() # TODO: this signal could be removed, or used for sync task @@ -316,11 +305,6 @@ def trigger_initial_build(self, project): async_result = task_promise.apply_async() return async_result - def is_advanced(self): - """Determine if the user selected the `show advanced` field.""" - data = self.get_cleaned_data_for_step('basics') or {} - return data.get('advanced', True) - class ImportDemoView(PrivateViewMixin, View): diff --git a/readthedocs/rtd_tests/tests/test_project_views.py b/readthedocs/rtd_tests/tests/test_project_views.py index f561f78acd6..176921a18a2 100644 --- a/readthedocs/rtd_tests/tests/test_project_views.py +++ b/readthedocs/rtd_tests/tests/test_project_views.py @@ -145,115 +145,6 @@ def test_form_missing(self): self.assertWizardFailure(resp, 'repo_type') -class TestAdvancedForm(TestBasicsForm): - - def setUp(self): - super().setUp() - self.step_data['basics']['advanced'] = True - self.step_data['extra'] = { - 'description': 'Describe foobar', - 'language': 'en', - 'documentation_type': 'sphinx', - 'tags': 'foo, bar, baz', - } - - def test_form_pass(self): - """Test all forms pass validation.""" - resp = self.post_step('basics') - self.assertWizardResponse(resp, 'extra') - resp = self.post_step('extra', session=list(resp._request.session.items())) - self.assertIsInstance(resp, HttpResponseRedirect) - self.assertEqual(resp.status_code, 302) - self.assertEqual(resp['location'], '/projects/foobar/') - - proj = Project.objects.get(name='foobar') - self.assertIsNotNone(proj) - data = self.step_data['basics'] - del data['advanced'] - del self.step_data['extra']['tags'] - self.assertCountEqual( - [tag.name for tag in proj.tags.all()], - ['bar', 'baz', 'foo'], - ) - data.update(self.step_data['extra']) - for (key, val) in list(data.items()): - self.assertEqual(getattr(proj, key), val) - - def test_form_missing_extra(self): - """Submit extra form with missing data, expect to get failures.""" - # Remove extra data to trigger validation errors - self.step_data['extra'] = {} - - resp = self.post_step('basics') - self.assertWizardResponse(resp, 'extra') - resp = self.post_step('extra', session=list(resp._request.session.items())) - - self.assertWizardFailure(resp, 'language') - self.assertWizardFailure(resp, 'documentation_type') - - def test_remote_repository_is_added(self): - remote_repo = get(RemoteRepository, users=[self.user]) - self.step_data['basics']['remote_repository'] = remote_repo.pk - resp = self.post_step('basics') - self.assertWizardResponse(resp, 'extra') - resp = self.post_step('extra', session=list(resp._request.session.items())) - self.assertIsInstance(resp, HttpResponseRedirect) - self.assertEqual(resp.status_code, 302) - self.assertEqual(resp['location'], '/projects/foobar/') - - proj = Project.objects.get(name='foobar') - self.assertIsNotNone(proj) - self.assertEqual(proj.remote_repository, remote_repo) - - @patch( - 'readthedocs.projects.views.private.ProjectExtraForm.clean_description', - create=True, - ) - def test_form_spam(self, mocked_validator): - """Don't add project on a spammy description.""" - self.user.date_joined = timezone.now() - timedelta(days=365) - self.user.save() - mocked_validator.side_effect = ProjectSpamError - - with self.assertRaises(Project.DoesNotExist): - proj = Project.objects.get(name='foobar') - - resp = self.post_step('basics') - self.assertWizardResponse(resp, 'extra') - resp = self.post_step('extra', session=list(resp._request.session.items())) - self.assertIsInstance(resp, HttpResponseRedirect) - self.assertEqual(resp.status_code, 302) - self.assertEqual(resp['location'], '/') - - with self.assertRaises(Project.DoesNotExist): - proj = Project.objects.get(name='foobar') - self.assertFalse(self.user.profile.banned) - - @patch( - 'readthedocs.projects.views.private.ProjectExtraForm.clean_description', - create=True, - ) - def test_form_spam_ban_user(self, mocked_validator): - """Don't add spam and ban new user.""" - self.user.date_joined = timezone.now() - self.user.save() - mocked_validator.side_effect = ProjectSpamError - - with self.assertRaises(Project.DoesNotExist): - proj = Project.objects.get(name='foobar') - - resp = self.post_step('basics') - self.assertWizardResponse(resp, 'extra') - resp = self.post_step('extra', session=list(resp._request.session.items())) - self.assertIsInstance(resp, HttpResponseRedirect) - self.assertEqual(resp.status_code, 302) - self.assertEqual(resp['location'], '/') - - with self.assertRaises(Project.DoesNotExist): - proj = Project.objects.get(name='foobar') - self.assertTrue(self.user.profile.banned) - - class TestImportDemoView(MockBuildTestCase): """Test project import demo view.""" diff --git a/readthedocs/templates/projects/import_basics.html b/readthedocs/templates/projects/import_basics.html index 4f0406491bd..a53dba8c253 100644 --- a/readthedocs/templates/projects/import_basics.html +++ b/readthedocs/templates/projects/import_basics.html @@ -6,10 +6,9 @@

{% trans "Project Details" %}

{% blocktrans trimmed %} - To import a project, - start by entering a few details about your repository. - More advanced project options can be configured - if you select Edit advanced project options. + To import a project, start by entering a few details about your repository. + You can set additional configuration options for your documentation in a + .readthedocs.yml file. {% endblocktrans %}

diff --git a/readthedocs/templates/projects/import_extra.html b/readthedocs/templates/projects/import_extra.html deleted file mode 100644 index 2cd63d1447e..00000000000 --- a/readthedocs/templates/projects/import_extra.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "projects/import_base.html" %} -{% load i18n %} - -{% block content %} -

{% trans "Project Extra Details" %}

- -

- {% blocktrans trimmed %} - Here are a few more project options that you may need to configure. - {% endblocktrans %} -

- - {{ block.super }} -{% endblock %}