Skip to content

Commit fa5d272

Browse files
committed
Merge tag '2.8.4' into rel
2 parents 785563f + 2796e15 commit fa5d272

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

40 files changed

+245
-61
lines changed

.codecov.yml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
comment:
2-
layout: "diff, files"
1+
comment: off
2+
coverage:
3+
status:
4+
project: off
5+

CHANGELOG.rst

+33
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,36 @@
1+
Version 2.8.4
2+
-------------
3+
4+
:Date: December 17, 2018
5+
6+
* `@davidfischer <http://github.com/davidfischer>`__: Tweak sidebar ad priority (`#5005 <https://github.com/rtfd/readthedocs.org/pull/5005>`__)
7+
* `@davidfischer <http://github.com/davidfischer>`__: Backport jquery 2432 to Read the Docs (`#5001 <https://github.com/rtfd/readthedocs.org/pull/5001>`__)
8+
* `@ericholscher <http://github.com/ericholscher>`__: Remove codecov comments and project coverage CI status (`#4996 <https://github.com/rtfd/readthedocs.org/pull/4996>`__)
9+
* `@stsewd <http://github.com/stsewd>`__: Remove `LOCAL_GIT_BRANCHES` from settings (`#4993 <https://github.com/rtfd/readthedocs.org/pull/4993>`__)
10+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Link update on FAQ page (`#4988 <https://github.com/rtfd/readthedocs.org/pull/4988>`__)
11+
* `@ericholscher <http://github.com/ericholscher>`__: Only use remote branches for our syncing. (`#4984 <https://github.com/rtfd/readthedocs.org/pull/4984>`__)
12+
* `@humitos <http://github.com/humitos>`__: Sanitize output and chunk it at DATA_UPLOAD_MAX_MEMORY_SIZE (`#4982 <https://github.com/rtfd/readthedocs.org/pull/4982>`__)
13+
* `@humitos <http://github.com/humitos>`__: Modify DB field for container_time_limit to be an integer (`#4979 <https://github.com/rtfd/readthedocs.org/pull/4979>`__)
14+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Remove deprecated imports from "urlresolvers" (`#4976 <https://github.com/rtfd/readthedocs.org/pull/4976>`__)
15+
* `@davidfischer <http://github.com/davidfischer>`__: Workaround for a django-storages bug (`#4963 <https://github.com/rtfd/readthedocs.org/pull/4963>`__)
16+
* `@ericholscher <http://github.com/ericholscher>`__: Release 2.8.3 (`#4961 <https://github.com/rtfd/readthedocs.org/pull/4961>`__)
17+
* `@monsij <http://github.com/monsij>`__: Remove -e option (`#4960 <https://github.com/rtfd/readthedocs.org/pull/4960>`__)
18+
* `@nutann3 <http://github.com/nutann3>`__: Update "install Sphinx" URL (`#4959 <https://github.com/rtfd/readthedocs.org/pull/4959>`__)
19+
* `@stsewd <http://github.com/stsewd>`__: Shallow git clone (`#4939 <https://github.com/rtfd/readthedocs.org/pull/4939>`__)
20+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Validate profile form fields (`#4910 <https://github.com/rtfd/readthedocs.org/pull/4910>`__)
21+
* `@davidfischer <http://github.com/davidfischer>`__: Calculate actual ad views (`#4885 <https://github.com/rtfd/readthedocs.org/pull/4885>`__)
22+
* `@humitos <http://github.com/humitos>`__: Allow all /api/v2/ CORS if the Domain is known (`#4880 <https://github.com/rtfd/readthedocs.org/pull/4880>`__)
23+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Disable django.security.DisallowedHost from logging (`#4879 <https://github.com/rtfd/readthedocs.org/pull/4879>`__)
24+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Remove 'Sphinx Template Changes' From Docs (`#4878 <https://github.com/rtfd/readthedocs.org/pull/4878>`__)
25+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Make form for adopting project a choice field (`#4841 <https://github.com/rtfd/readthedocs.org/pull/4841>`__)
26+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Add 'Branding' under the 'Business Info' section and 'Guidelines' on 'Design Docs' (`#4830 <https://github.com/rtfd/readthedocs.org/pull/4830>`__)
27+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Raise 404 at SubdomainMiddleware if the project does not exist. (`#4795 <https://github.com/rtfd/readthedocs.org/pull/4795>`__)
28+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Add help_text in the form for adopting a project (`#4781 <https://github.com/rtfd/readthedocs.org/pull/4781>`__)
29+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Remove /embed API endpoint (`#4771 <https://github.com/rtfd/readthedocs.org/pull/4771>`__)
30+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Improve unexpected error message when build fails (`#4754 <https://github.com/rtfd/readthedocs.org/pull/4754>`__)
31+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Change the way of using login_required decorator (`#4723 <https://github.com/rtfd/readthedocs.org/pull/4723>`__)
32+
* `@dojutsu-user <http://github.com/dojutsu-user>`__: Fix the form for adopting a project (`#4721 <https://github.com/rtfd/readthedocs.org/pull/4721>`__)
33+
134
Version 2.8.3
235
-------------
336

docs/faq.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ We think that our theme is badass, and better than the default for many reasons.
153153
I want to use the Read the Docs theme locally
154154
---------------------------------------------
155155

156-
There is a repository for that: https://github.com/snide/sphinx_rtd_theme.
156+
There is a repository for that: https://github.com/rtfd/sphinx_rtd_theme.
157157
Simply follow the instructions in the README.
158158

159159
Image scaling doesn't work in my documentation

media/javascript/jquery/jquery-2.0.3.min.js

-1
This file was deleted.

media/javascript/jquery/jquery-2.0.3.min.js

+24
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

readthedocs/builds/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from builtins import object
1515
from django.contrib.auth.decorators import login_required
16-
from django.core.urlresolvers import reverse
16+
from django.urls import reverse
1717
from django.http import (
1818
HttpResponseForbidden,
1919
HttpResponsePermanentRedirect,

readthedocs/core/middleware.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from django.contrib.sessions.middleware import SessionMiddleware
1010
from django.core.cache import cache
1111
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
12-
from django.core.urlresolvers import get_urlconf, set_urlconf
12+
from django.urls.base import get_urlconf, set_urlconf
1313
from django.http import Http404, HttpResponseBadRequest
1414
from django.utils.deprecation import MiddlewareMixin
1515
from django.utils.translation import ugettext_lazy as _

readthedocs/core/signals.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from django.db.models import Q, Count
1414
from django.dispatch import receiver
1515
from future.backports.urllib.parse import urlparse
16+
from rest_framework.permissions import SAFE_METHODS
1617

1718
from readthedocs.oauth.models import RemoteOrganization
1819
from readthedocs.projects.models import Project, Domain
@@ -49,6 +50,12 @@ def decide_if_cors(sender, request, **kwargs): # pylint: disable=unused-argumen
4950
if request.path_info.startswith('/api/v2/sustainability'):
5051
return True
5152

53+
# Don't do domain checking for APIv2 when the Domain is known
54+
if request.path_info.startswith('/api/v2/') and request.method in SAFE_METHODS:
55+
domain = Domain.objects.filter(domain__icontains=host)
56+
if domain.exists():
57+
return True
58+
5259
valid_url = False
5360
for url in WHITELIST_URLS:
5461
if request.path_info.startswith(url):
@@ -69,7 +76,7 @@ def decide_if_cors(sender, request, **kwargs): # pylint: disable=unused-argumen
6976

7077
domain = Domain.objects.filter(
7178
Q(domain__icontains=host),
72-
Q(project=project) | Q(project__subprojects__child=project)
79+
Q(project=project) | Q(project__subprojects__child=project),
7380
)
7481
if domain.exists():
7582
return True

readthedocs/core/static-src/core/js/doc-embed/sponsorship.js

+3
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ function create_sidebar_placement() {
6767
if (!offset || offset.top > $(window).height()) {
6868
// If this is off screen, lower the priority
6969
priority = constants.LOW_PROMO_PRIORITY;
70+
} else if (bowser && !bowser.mobile) {
71+
// If this isn't mobile, then the ad will be ATF, so raise the priority
72+
priority = constants.MAXIMUM_PROMO_PRIORITY;
7073
}
7174

7275
return {

readthedocs/core/static/core/js/readthedocs-doc-embed.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

readthedocs/doc_builder/environments.py

+23
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
absolute_import, division, print_function, unicode_literals)
77

88
import logging
9+
import json
910
import os
1011
import re
1112
import socket
@@ -186,6 +187,9 @@ def sanitize_output(self, output):
186187
avoid PostgreSQL db to fail:
187188
https://code.djangoproject.com/ticket/28201
188189
190+
3. Chunk at around ``DATA_UPLOAD_MAX_MEMORY_SIZE`` bytes to be sent
191+
over the API call request
192+
189193
:param output: stdout/stderr to be sanitized
190194
:type output: bytes
191195
@@ -198,6 +202,25 @@ def sanitize_output(self, output):
198202
sanitized = sanitized.replace('\x00', '')
199203
except (TypeError, AttributeError):
200204
sanitized = None
205+
206+
# Chunk the output data to be less than ``DATA_UPLOAD_MAX_MEMORY_SIZE``
207+
output_length = len(output) if output else 0
208+
# Left some extra space for the rest of the request data
209+
threshold = 512 * 1024 # 512Kb
210+
allowed_length = settings.DATA_UPLOAD_MAX_MEMORY_SIZE - threshold
211+
if output_length > allowed_length:
212+
log.info(
213+
'Command output is too big: project=[%s] version=[%s] build=[%s] command=[%s]', # noqa
214+
self.build_env.project.slug,
215+
self.build_env.version.slug,
216+
self.build_env.build.get('id'),
217+
self.get_command(),
218+
)
219+
sanitized = sanitized[:allowed_length]
220+
sanitized += '\n\n\nOutput is too big. Chunked at {} bytes'.format(
221+
allowed_length,
222+
)
223+
201224
return sanitized
202225

203226
def get_command(self):

readthedocs/gold/views.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22
"""Gold subscription views."""
33

44
from __future__ import (
5-
absolute_import, division, print_function, unicode_literals)
5+
absolute_import,
6+
division,
7+
print_function,
8+
unicode_literals
9+
)
610

711
from django.conf import settings
812
from django.contrib import messages
913
from django.contrib.auth.decorators import login_required
1014
from django.contrib.messages.views import SuccessMessageMixin
11-
from django.core.urlresolvers import reverse, reverse_lazy
15+
from django.urls import reverse, reverse_lazy
1216
from django.http import HttpResponseRedirect
1317
from django.shortcuts import get_object_or_404, render
1418
from django.utils.translation import ugettext_lazy as _

readthedocs/integrations/admin.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from __future__ import absolute_import
44
from django.contrib import admin
5-
from django.core import urlresolvers
5+
from django import urls
66
from django.utils.safestring import mark_safe
77
from pygments.formatters import HtmlFormatter
88

@@ -96,7 +96,7 @@ def exchanges(self, obj):
9696
JSONField doesn't do well with fieldsets for whatever reason. This is
9797
just to link to the exchanges.
9898
"""
99-
url = urlresolvers.reverse('admin:{0}_{1}_changelist'.format(
99+
url = urls.reverse('admin:{0}_{1}_changelist'.format(
100100
HttpExchange._meta.app_label, # pylint: disable=protected-access
101101
HttpExchange._meta.model_name, # pylint: disable=protected-access
102102
))

readthedocs/oauth/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from allauth.socialaccount.models import SocialAccount
1111
from django.conf import settings
1212
from django.contrib.auth.models import User
13-
from django.core.urlresolvers import reverse
13+
from django.urls import reverse
1414
from django.core.validators import URLValidator
1515
from django.db import models
1616
from django.db.models import Q

readthedocs/oauth/notifications.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- coding: utf-8 -*-
22
from __future__ import division, print_function, unicode_literals
33

4-
from django.core.urlresolvers import reverse
4+
from django.urls import reverse
55
from django.utils.translation import ugettext_lazy as _
66
from messages_extends.constants import ERROR_PERSISTENT
77

readthedocs/oauth/services/bitbucket.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import re
88

99
from django.conf import settings
10-
from django.core.urlresolvers import reverse
10+
from django.urls import reverse
1111
from requests.exceptions import RequestException
1212
from allauth.socialaccount.providers.bitbucket_oauth2.views import (
1313
BitbucketOAuth2Adapter)

readthedocs/oauth/services/github.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import re
88

99
from django.conf import settings
10-
from django.core.urlresolvers import reverse
10+
from django.urls import reverse
1111
from requests.exceptions import RequestException
1212
from allauth.socialaccount.models import SocialToken
1313
from allauth.socialaccount.providers.github.views import GitHubOAuth2Adapter

readthedocs/oauth/services/gitlab.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from allauth.socialaccount.providers.gitlab.views import GitLabOAuth2Adapter
1111
from django.conf import settings
12-
from django.core.urlresolvers import reverse
12+
from django.urls import reverse
1313
from requests.exceptions import RequestException
1414

1515
from readthedocs.builds.utils import get_gitlab_username_repo

readthedocs/profiles/views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from django.contrib.auth import logout
1313
from django.contrib.auth.decorators import login_required
1414
from django.contrib.auth.models import User
15-
from django.core.urlresolvers import reverse
15+
from django.urls import reverse
1616
from django.http import HttpResponseRedirect
1717
from django.shortcuts import get_object_or_404, redirect, render
1818
from django.utils.translation import ugettext_lazy as _
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.16 on 2018-12-10 11:19
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('projects', '0034_remove_unused_project_model_fields'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='project',
17+
name='container_time_limit',
18+
field=models.IntegerField(blank=True, null=True, verbose_name='Container time limit in seconds'),
19+
),
20+
]

readthedocs/projects/models.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from django.conf import settings
1313
from django.contrib.auth.models import User
14-
from django.core.urlresolvers import NoReverseMatch, reverse
14+
from django.urls import NoReverseMatch, reverse
1515
from django.db import models
1616
from django.utils.encoding import python_2_unicode_compatible
1717
from django.utils.translation import ugettext_lazy as _
@@ -138,8 +138,11 @@ class Project(models.Model):
138138
_('Container memory limit'), max_length=10, null=True, blank=True,
139139
help_text=_('Memory limit in Docker format '
140140
'-- example: <code>512m</code> or <code>1g</code>'))
141-
container_time_limit = models.CharField(
142-
_('Container time limit'), max_length=10, null=True, blank=True)
141+
container_time_limit = models.IntegerField(
142+
_('Container time limit in seconds'),
143+
null=True,
144+
blank=True,
145+
)
143146
build_queue = models.CharField(
144147
_('Alternate build queue id'), max_length=32, null=True, blank=True)
145148
allow_promos = models.BooleanField(

readthedocs/projects/tasks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from builtins import str
2727
from celery.exceptions import SoftTimeLimitExceeded
2828
from django.conf import settings
29-
from django.core.urlresolvers import reverse
29+
from django.urls import reverse
3030
from django.db.models import Q
3131
from django.utils import timezone
3232
from django.utils.translation import ugettext_lazy as _

readthedocs/projects/views/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from datetime import timedelta
99

1010
from django.conf import settings
11-
from django.core.urlresolvers import reverse
11+
from django.urls import reverse
1212
from django.http import HttpResponseRedirect
1313
from django.shortcuts import get_object_or_404
1414
from django.utils import timezone

readthedocs/projects/views/private.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from django.contrib import messages
1717
from django.contrib.auth.decorators import login_required
1818
from django.contrib.auth.models import User
19-
from django.core.urlresolvers import reverse
19+
from django.urls import reverse
2020
from django.http import (
2121
Http404,
2222
HttpResponseBadRequest,

readthedocs/projects/views/public.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from django.contrib import messages
1717
from django.contrib.auth.models import User
1818
from django.core.cache import cache
19-
from django.core.urlresolvers import reverse
19+
from django.urls import reverse
2020
from django.http import Http404, HttpResponse, HttpResponseRedirect
2121
from django.shortcuts import get_object_or_404, render
2222
from django.views.decorators.cache import never_cache

readthedocs/restapi/views/task_views.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import logging
1111

12-
from django.core.urlresolvers import reverse
12+
from django.urls import reverse
1313
from redis import ConnectionError
1414
from rest_framework import decorators, permissions
1515
from rest_framework.renderers import JSONRenderer

readthedocs/rtd_tests/tests/projects/test_admin_actions.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import django_dynamic_fixture as fixture
33
from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
44
from django.contrib.auth.models import User
5-
from django.core import urlresolvers
5+
from django import urls
66
from django.test import TestCase
77

88
from readthedocs.core.models import UserProfile
@@ -33,7 +33,7 @@ def test_project_ban_owner(self):
3333
'index': 0,
3434
}
3535
resp = self.client.post(
36-
urlresolvers.reverse('admin:projects_project_changelist'),
36+
urls.reverse('admin:projects_project_changelist'),
3737
action_data
3838
)
3939
self.assertTrue(self.project.users.filter(profile__banned=True).exists())
@@ -51,7 +51,7 @@ def test_project_ban_multiple_owners(self):
5151
'index': 0,
5252
}
5353
resp = self.client.post(
54-
urlresolvers.reverse('admin:projects_project_changelist'),
54+
urls.reverse('admin:projects_project_changelist'),
5555
action_data
5656
)
5757
self.assertFalse(self.project.users.filter(profile__banned=True).exists())
@@ -68,7 +68,7 @@ def test_project_delete(self, broadcast):
6868
'post': 'yes',
6969
}
7070
resp = self.client.post(
71-
urlresolvers.reverse('admin:projects_project_changelist'),
71+
urls.reverse('admin:projects_project_changelist'),
7272
action_data
7373
)
7474
self.assertFalse(Project.objects.filter(pk=self.project.pk).exists())

readthedocs/rtd_tests/tests/test_api.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from allauth.socialaccount.models import SocialAccount
1515
from builtins import str
1616
from django.contrib.auth.models import User
17-
from django.core.urlresolvers import reverse
17+
from django.urls import reverse
1818
from django.http import QueryDict
1919
from django.test import TestCase
2020
from django.utils import six

0 commit comments

Comments
 (0)