From 5f2db7ed75a20663b7d29b240c3145dfe2d48b97 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 24 Jul 2018 14:20:35 +0200 Subject: [PATCH 01/76] projects: user in ProjectQuerySetBase.for_admin_user is mandatory --- readthedocs/projects/querysets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/projects/querysets.py b/readthedocs/projects/querysets.py index 43db415c14d..3eabcf5b244 100644 --- a/readthedocs/projects/querysets.py +++ b/readthedocs/projects/querysets.py @@ -31,7 +31,7 @@ def for_user_and_viewer(self, user, viewer): queryset = queryset.filter(users__in=[user]) return queryset - def for_admin_user(self, user=None): + def for_admin_user(self, user): if user.is_authenticated(): return self.filter(users__in=[user]) return self.none() From ddb6f198eed15dccf64721b3707974f78a460b2a Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Tue, 24 Jul 2018 10:40:43 -0300 Subject: [PATCH 02/76] More tips about how to reduce resources usage --- docs/guides/build-using-too-many-resources.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/guides/build-using-too-many-resources.rst b/docs/guides/build-using-too-many-resources.rst index 68e164f3421..9b5d40096c5 100644 --- a/docs/guides/build-using-too-many-resources.rst +++ b/docs/guides/build-using-too-many-resources.rst @@ -23,3 +23,20 @@ If there are extra packages that you don't need for building docs, you can create a custom requirements file just for documentation. This should speed up your documentation builds, as well as reduce your memory footprint. + +Use pip when possible +--------------------- + +In case you are using `conda` to create your environment, +you could consider using `pip` instead since `conda` could require too much memory to calculate the dependency tree. + +Use system site-packages for pre-installed libs +----------------------------------------------- + +There are a few libraries that Read the Docs has already installed (scipy, numpy, matplotlib, pandas, etc) +in the Docker image used to build your docs. You can check the updated list of pre-installed libraries in the `Docker image repository`_. + +To use these pre-installed libraries and avoid consuming time re-downloading/compiling them, +you ca use the :ref:`yaml-config:Python-use-system-site-packages` option to have access to them. + +.. _Docker image repository: https://github.com/rtfd/readthedocs-docker-images From 77be9ab12415d5070e6affe5db0e24a58c2b936e Mon Sep 17 00:00:00 2001 From: David Fischer Date: Tue, 24 Jul 2018 12:58:54 -0700 Subject: [PATCH 03/76] Add Cloudflare to the sponsors list and footer --- docs/sponsors.rst | 2 ++ media/css/core.css | 1 + media/images/cloudflare.png | Bin 0 -> 3979 bytes readthedocs/templates/base.html | 2 ++ 4 files changed, 5 insertions(+) create mode 100644 media/images/cloudflare.png diff --git a/docs/sponsors.rst b/docs/sponsors.rst index 4e363ae0f8e..dfa565a2d8d 100644 --- a/docs/sponsors.rst +++ b/docs/sponsors.rst @@ -11,6 +11,7 @@ Current sponsors * `Rackspace`_ - They cover all of our hosting expenses every month. This is a pretty large sum of money, averaging around $3,000/mo, and we are really grateful to have them as a sponsor. * `Mozilla`_ - Mozilla has given us a `MOSS grant`_ for building specific features, and have funded Eric Holscher to work on Read the Docs at $1,000/mo for 2016. +* `Cloudflare`_ - Cloudflare is providing us with an enterprise plan of their SSL for SaaS Providers product that enables us to provide SSL certificates for custom domains. * You? (Email us at rev@readthedocs.org for more info) Past sponsors @@ -32,6 +33,7 @@ Past sponsors .. _Rackspace: http://www.rackspace.com/ .. _Mozilla: https://www.mozilla.org/en-US/ .. _Twilio: http://twilio.com/ +.. _Cloudflare: https://www.cloudflare.com/ Sponsorship Information diff --git a/media/css/core.css b/media/css/core.css index 1c71374ed72..41c037bb00e 100644 --- a/media/css/core.css +++ b/media/css/core.css @@ -652,6 +652,7 @@ p.build-missing { font-size: .8em; color: #9d9a55; margin: 0 0 3px; } #footer li { margin-bottom: 5px; } #footer a, #footer a:visited { color: #e3e3e3; text-decoration: none; } #footer a:hover, #footer a:active { color: white; text-decoration: underline; } +#footer .sponsor { height: 16px; margin: 8px 0; float: right; } /* Social icons */ #footer .social { font-family: FontAwesome; text-align: center; } diff --git a/media/images/cloudflare.png b/media/images/cloudflare.png new file mode 100644 index 0000000000000000000000000000000000000000..79972d5d8755c9dd2922e97523abbc687cd5a3fe GIT binary patch literal 3979 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 W*N8H){|x890bpzCWYK!s7x^!|xUgdY literal 0 HcmV?d00001 diff --git a/readthedocs/templates/base.html b/readthedocs/templates/base.html index 57d80a18f52..7a6d6cae1c2 100644 --- a/readthedocs/templates/base.html +++ b/readthedocs/templates/base.html @@ -231,6 +231,8 @@

{% trans 'Business Info' %}

{% endblock language-select-form %} + + {% endblock %} From e64d5edadca73bf976b9a477eb439ba5dba0505f Mon Sep 17 00:00:00 2001 From: Anthony Johnson Date: Tue, 24 Jul 2018 16:14:36 -0600 Subject: [PATCH 04/76] Replace old mimeparse package with python-mimeparse Note! These packages occupy the same namespace. You might need to uninstall `mimeparse` and reinstall `python-mimeparse`. --- requirements/pip.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/pip.txt b/requirements/pip.txt index 839329c91ae..feb9646adb0 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -59,7 +59,7 @@ pytz==2018.4 beautifulsoup4==4.6.0 Unipath==1.1 django-kombu==0.9.4 -mimeparse==0.1.3 +python-mimeparse==1.6.0 mock==2.0.0 # stripe 1.20.2 is the latest compatible with our code base (otherwise From 80189f34795f17d98f4b7e3cc482326783de42cf Mon Sep 17 00:00:00 2001 From: David Fischer Date: Wed, 1 Aug 2018 10:25:34 -0700 Subject: [PATCH 05/76] Add additional sponsors --- media/css/core.css | 28 ++++++++++++++++++- media/images/cloudflare.png | Bin 3979 -> 0 bytes media/images/sponsors/azure.png | Bin 0 -> 5743 bytes media/images/sponsors/cloudflare.png | Bin 0 -> 3063 bytes media/images/sponsors/elastic.png | Bin 0 -> 4434 bytes media/images/sponsors/newrelic.png | Bin 0 -> 10481 bytes media/images/sponsors/pagerduty.png | Bin 0 -> 2162 bytes media/images/sponsors/sentry.png | Bin 0 -> 4909 bytes readthedocs/templates/base.html | 40 +++++++++++++++++++++++++-- 9 files changed, 65 insertions(+), 3 deletions(-) delete mode 100644 media/images/cloudflare.png create mode 100644 media/images/sponsors/azure.png create mode 100644 media/images/sponsors/cloudflare.png create mode 100644 media/images/sponsors/elastic.png create mode 100644 media/images/sponsors/newrelic.png create mode 100644 media/images/sponsors/pagerduty.png create mode 100644 media/images/sponsors/sentry.png diff --git a/media/css/core.css b/media/css/core.css index 41c037bb00e..0a9dcdcb47a 100644 --- a/media/css/core.css +++ b/media/css/core.css @@ -652,7 +652,33 @@ p.build-missing { font-size: .8em; color: #9d9a55; margin: 0 0 3px; } #footer li { margin-bottom: 5px; } #footer a, #footer a:visited { color: #e3e3e3; text-decoration: none; } #footer a:hover, #footer a:active { color: white; text-decoration: underline; } -#footer .sponsor { height: 16px; margin: 8px 0; float: right; } + +/* Sponsors */ +#footer .sponsors { + margin-top: 30px; + text-align: center; +} +#footer .sponsors .sponsor { + display: inline-block; + text-align: center; + text-decoration: none; + padding: 10px; +} +#footer .sponsors .sponsor img { + width: 90px; + height: auto; +} +#footer .sponsors .sponsor-name { + font-size: 12px; +} +#footer .sponsors .sponsor-description { + font-size: 10px; + color: #BCC1C3; +} +#footer .sponsors .sponsor-name, #footer .sponsors .sponsor-description { + text-align: center; + line-height: 1.4; +} /* Social icons */ #footer .social { font-family: FontAwesome; text-align: center; } diff --git a/media/images/cloudflare.png b/media/images/cloudflare.png deleted file mode 100644 index 79972d5d8755c9dd2922e97523abbc687cd5a3fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3979 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 W*N8H){|x890bpzCWYK!s7x^!|xUgdY diff --git a/media/images/sponsors/azure.png b/media/images/sponsors/azure.png new file mode 100644 index 0000000000000000000000000000000000000000..c33d69b324890af00f637dd9f55d24ddb94f6f62 GIT binary patch literal 5743 zcmW-l2RIyE8-|A{tCxr#M2U?EV)ah+-n+1R?=|{rL6(S4ln{J^s4IGnh%SVP8bpie zpWgoS{j=BXTzlr)nN!~PdGF`MYilZz5YiJu5JaM)EUyc$4d66`;eqejrD{8H!LwFV zl80{p`xLg9rGgd$Ph}Gy2qL2V@5Gu|2)hD}_`WI{3ivB9EDAzWW==jO&~)EP-`Mw= zhnt(7yD#_&LC?JHkiK@dECEiwjx0(l8rrrzcK8rqh*ac35HuQU<&)cxpJO}|*I z4{a&a9R$SUwRSX#pYq3};7yU03)%*IWKR9$GUM(oX4}C@N~EEe)TfJD*MEY4^h6kR zI?XmXX+M8Xs-mKj@bcwLuduK%0~#Ll!kL`feC?=IJMThNgNE_Qd-+qaCVrd6>@kq&)|j;&uQo$BlASl7IRvbEtM zFhnn(wxwlfjSp4hRi$CYQb0gJI0^Hb5j%5U7Y2EO$RCk1B><- z$Km2imc`#-^k_wH>O{6R?{j~&VpP500JfWO`INJ=h6XMafo2ePKRG$&_RV&RU{MOXl3vjmG|p7kQyWdyk_lawi55!A;D1g=a)oI^j;D;!!XArP z22wFGF?=un-4uzJ=f5xeI<8xRo${QFQDlE^p*7(4^Rx)VJ2$RG{ORrEr+4s(MR=(b z)AOEu>2-`mY8x3Dy-82^^8rC%vA(*p!cU^0Q#q*t^~RFSz0Jyk(~J9an{9EAPaDa} zq1M8!kN->&wY9Y+@Dbnj$FJ`b&rDC}xC3!pwEQbvuzh^N2f_BZ$Qb)W+uPe6zz_-T z$MQ#nAfg68j7>l3%f!UH#B}_>?~;)vk0h%lv%u!tg99d)d*fVMFU*U-v9P8%awYe# z`e(+emJG(n$9wU@;Z_V0xU(&TqoYjZl$73Y*#|`1RkU>U*%Wk`&91y1oG_;G+VHni zdeIx6BJ*Freocm;o}Qi=MXSg#F$G0MY^ZB6{c(Q^dypR+l#+WHnakQf_YrL zytk3aEFOoO+1c6HRS~H|&O*9aET&{(Q4S7{-@|nNUQ9&)>V0TvpyEd$Y`~~*;#goy z`MZ+1oAacEU5p4@s5Lk;hcp70d;&b0V#-wZdB68RSVdpN`! z1p=_%Va%FA$aUsHx~kq&;$HA~2-27=ZE0!A!;6aCa(@Ib7-Qz8B9siyj(-6v|&7#dy-o(Lk8Y(M8%RY_~R+){E!l)Ldm$eY_~r)`Y2y%*}2$NG^bIp z8dMzt8f27}VVk}!@mN?`WoIEBzg4Uh$#I75j{^Go`qa3%xP~nxvBItnl*XMg)t=4s zL80;E)D$?~8%O6%NF*`_o-iSOdxcQra}i~NOGz<75G5t0cAjP?IW6tkScmUT%l@cu zXz2CFVx?pu|Fyit#KiyW5l12X;{6Zko%R`*g3fBveen~|CDzB(jx!h+8VJI{!*eHr z!Dbe757zRFe9X+u{6PPuB6b7bwwu;jM2dxSz^XGsP(f>$c&eV;72 z0uO)9-t4_LnEo*+DCn=|!N$E!$>5W&4+a$vFE1~{2iCmfq(+Kwb*6s&pmAO5xOUdE ziiwUsD}w)VLvKGNz9W(p{8GM1`oz`?gsE4RN&Ul#k&zwpq*Y3nZgm}fi)YVzzwCC^ z$t=#!(kCLb43yH9-wdlOE7J~JUom1={n+kfR|%6L$3Z^H5?5r>bg;GcZLR-|-K<)o zTDR_p#l($zanMI|BtTC>O+nE;aU}s=Pn&sQK@l=6S);25v1YvpX|a}roli?21I@+q zG=+f-RAg4!;2nUF-6Y`Dd~4+t#uRZgw{(N2mdRtVAJ}%9!kIm?Df`J|Nvg%BKglO~ zJMH}P^7dPf@I*B|xk3uo9Xv)WoiNgf#!3hOfPk?yWp*aRM*1BM4UH{Hzd_IyTL*{W zr^Gghf+0R)Sd82`h*F_C5$RqT7mO+V$rD`A4gH6yBeh>VO*jjA?@?1f|N98tZ55G` zk#Rs9tKw#22qd00ID>WH5JLtuJx!@9EuF79Al$>D^Y2!Sj={CAuZ2 zNl6i9`E(d702KGgq5-goqL~Acpvv7#SFH z=O(duw3hSscIQ6v;zL$T9ift?nab?(Fx1Rir2|jq_Q!9I{9th?@7?Re-l^oLN54)> z6F`k^Xw{y`HbnCu71r0+-*QtCR!Mz`K+?_w z?UQkG+Cq;yNCZp+r3-?g)Ef_bS~yWT{i`F!VBPkN3-h$a@+BLQZVidVgtpY#MF-X86}g&+Hgt&RL#Xd za{VVCG{o|Dojt_fpYAT?;z5*3|1iWNBZk&4?sU0A5yFdsQMj|;{C$U-=bYGYJ*4A zQ2Yl>2A}QM*W{q|{hURhAZTZ2M@HwnrD64Rw~oNt{un=UIywSQt$bH^C#QH950C1G z!-?%ON(CKIa_lt=q(bG9$YsP%Ngll;0I=4kCR;WbYmLH9RaI31@AI}MBcf1MH8m`V z<rKR>nkc^|FV|Ax6 z7~A;vaoL9tA6DQA{NitpUk|NSmz0#W-*B6emRY!!O>WIwSXfARdzsruB~fLmKYRv` zhZ>XXfSpb+S~GbpP_JGQvm+4o60EG)porXMEMJso)tMQ8_becV-KitwoS)&{PSxkn z@(`q5u77|dOI#NdPzoo^$;r7ftNtOJFA-FywPexc`M}oJmJfo|GPq5GPIoQhf~LIs zOJ^flQ#Q%KOou&eZ_wk}58rD)#Uo>qIAfJ1H#dXagmNECU2GOVklaz;LIZaEb-CBc z3Fz@G#+aKlAbNm$h{Q}+cg0X&U%yw;Q5@7i!Z&Z;@G&zNbb2?N=XSkff$3RTw2xZx zHMAcNKGsS%^748L{6KcV-v#GK%~EEk8uiqsi~zC&7#A4%wcr+CMotvB#06Rr*JZG!7wK zHi@>6Y)n-|)8j%AcBBAr7=h6%8K<_zw`~(i}sElM*&5# zgpp@DX$a3>T@piIiNy!Mjqw4v>;-j+y0x{n|L0)hgup^0pzcS4f`U(`hXeK&+abvF zO>Eq}^RIz9Pk^VV=l&7}j?;_zQp;&?W7&-Q zEeT1 zMYtphSn6|MUoFM#v{?9!#OE(x@bGYP@6GTRWsj`$E(LAmxk=xg6>AKozJ3iAgr3kv z$Hrz5#`Ms-FxT(1uN(yOUYwm>`Sd5uFjfI>0)m;h-FWP=DGBb-fBrPaJ z=oa6t2@A8#Es&C6a#lXauXlBI@t5n1MFD)=F&Tp=tmu}1*L$b^_vq-TIQ(oGf7*LS z4!FgL!ootMK#4`TnSuk3>@Q$7&M!~*Zp%A|J^@X#adWF`1WewSZ}a{B9On7S>1p`! zukI*K$*9e785aTi`N_#6o6oUT8ain|ZTUm3k`EOW6uJ-BhLWeIrb_05sVNk6@^#D2 z?=vtA`K(U`l9Kp_gj|_2B|9K0z8#1)?g6{u`G}jla%spx)Y@umqJ&{@zWJ!5y;z`N zjEt0!@B$$|h`htW$$3eDgEBTFbG!a`QfrTn81Djzum58gb92VDw6scBM@M+*M5edt zHXf%6|06aw8R{QNwV`!9nlPz(^|ST4q@BfQLu(_u3jJacFJ!ufPi&*@&Wl zDnJxJva_>uTU%T6=M8pqd%`FYNKVQmF~gpsEOmN(e4W~UL(SMP%R&yyEdB;px@sBy z7oRNHeUNpE#T03(YxY0CtvOf^i&Xf3EP!(9qC4)7MYaw5bVS7i zb}NIg{rcy5O?7p#EyJ$`0jK{CKHdFk_du$bk0o{B3S;V)gFpw0M8|db@6f+5DZy=O zX$gyFc{x%VDc(oup02HBAVt`_ixST`zzS1CL zerhehScB}P&s$#0C$$mP=bGXNzP_c|^cPw8LleEZ};Um@PzAzj3=X?1QrlCQ9 z#%2Y#moG-2%OXD|1WLr;Ow2AE0f=H})G@LG0Ur2;%abz6B7 z7A7VnSoK5`yw1%vyUWCM;~`ZbO(Od`j7*+gC5ct#&?a79&Z5;HjULa#xc=k^IqT<_ zH@teFIQzouKZOy{2!}zh3kt|a-`CZF+sc}ni@;g5l0z5Q1W~JjujAsB)Gfyz1-VB& zZ}ooyLgk2^azMyTT2cJ(m)g6WnpfDGm04M|Gr$U-TwGkV-83@6P!ZMDdzxs)Uc1O$ z#oF51xoEj}6VrypAi=9Xd~god(McJ|j+FAtth`HI>QBamc?L`%bf2QZ#GH%7hq8>p|nWpHT`?V6Mkgl$77D(UNy1F_70gcmbf-*qO3-j~ScOYOu z<0?2?tKiIn&QwnP*`}Av9)-ks&nir-{Qvl*Y>X8o?*~dSX-oox6_cBoI22J@`j8pL zvI2HHYHqH~9CJ#mEn0=d5eOe?B7uq}`NdJ;9L3@XtZZyCAgCsCg+1_)wA8HWs{QeO z*5Np^IK;g$9jY}GF_&w}sF?%%8X_QJtGwn-A_KfvvHYW=YzrB@khW~k>P5skG;dy_K6WW+NtoZ$V+qs?? zBIMEfh--A%D721dmJTcI?Cj)3vG8W8mmPt!!}58pbsw(MW?((V#lg7umt&9y=%HcXXdQMTxqx>~ zO-)aE+xF#NwzdYtG$!2zG+KQ`7>$T~<@c>*X$Ge!s(1R+9~+gn-`-rt85i!b07gX9 zAryC4SJ^UEOKko8j@3e>q`?kECIM>SmSQIu|C_6j<@NbSfuML&v$Gm~DZA(|Uh}zNg9xe_$)8@m#lo*ga8+>< RjQqFntD>MO|545g^*<2@&Ex<8 literal 0 HcmV?d00001 diff --git a/media/images/sponsors/cloudflare.png b/media/images/sponsors/cloudflare.png new file mode 100644 index 0000000000000000000000000000000000000000..b2998a6451dd00808ff36b27823b76d9a0d791f1 GIT binary patch literal 3063 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 YKgt1Xb5=aEa{vGU07*qoM6N<$f~3J_9smFU literal 0 HcmV?d00001 diff --git a/media/images/sponsors/newrelic.png b/media/images/sponsors/newrelic.png new file mode 100644 index 0000000000000000000000000000000000000000..836d5ea88a0bb00b513116c5a1f328ee9b2f0980 GIT binary patch literal 10481 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 le=*&y@t^MMKuAM#phn*%?jIDE7ia(g literal 0 HcmV?d00001 diff --git a/media/images/sponsors/sentry.png b/media/images/sponsors/sentry.png new file mode 100644 index 0000000000000000000000000000000000000000..803243f9f0115b954173cfa0455f4b491807710c GIT binary patch literal 4909 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 literal 0 HcmV?d00001 diff --git a/readthedocs/templates/base.html b/readthedocs/templates/base.html index 7a6d6cae1c2..fe6b55c81b0 100644 --- a/readthedocs/templates/base.html +++ b/readthedocs/templates/base.html @@ -202,6 +202,8 @@

{% trans 'Business Info' %}

- {% endblock %} +
+ + + + {% endblock footer-content %} From 7c7dba58f7bbf447efee7dabf2cd8ab8909d07b3 Mon Sep 17 00:00:00 2001 From: David Fischer Date: Wed, 1 Aug 2018 10:31:28 -0700 Subject: [PATCH 06/76] Spell out Microsoft Azure --- readthedocs/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/templates/base.html b/readthedocs/templates/base.html index fe6b55c81b0..1d99729c1c8 100644 --- a/readthedocs/templates/base.html +++ b/readthedocs/templates/base.html @@ -241,7 +241,7 @@

{% trans 'Business Info' %}

commercial support contract. This will help us cover our costs, @@ -63,7 +63,7 @@

Read the Docs Gold

{% trans 'Becoming a Gold Member also makes Read the Docs ad-free for as long as you are logged-in.' %}

- {% blocktrans %} + {% blocktrans trimmed %} You can also make one-time donations on our sustainability page. {% endblocktrans %}

@@ -71,7 +71,7 @@

Read the Docs Gold

{% if domains.count %}

Domains

- {% blocktrans %} + {% blocktrans trimmed %} We ask that folks who use custom Domains give Read the Docs $5 per domain they are using. This is optional, but it really does help us maintain the site going forward. {% endblocktrans %} diff --git a/readthedocs/templates/account/login.html b/readthedocs/templates/account/login.html index 0dc0c073316..afc4322ce55 100644 --- a/readthedocs/templates/account/login.html +++ b/readthedocs/templates/account/login.html @@ -11,7 +11,7 @@

{% trans "Sign In" %}

-

{% blocktrans %}If you have not created an account yet, then please +

{% blocktrans trimmed %}If you have not created an account yet, then please sign up first.{% endblocktrans %}

diff --git a/readthedocs/templates/builds/build_detail.html b/readthedocs/templates/builds/build_detail.html index 0111805741e..4aa528eaba0 100644 --- a/readthedocs/templates/builds/build_detail.html +++ b/readthedocs/templates/builds/build_detail.html @@ -72,7 +72,7 @@
- {% blocktrans with build_id=build.pk %} + {% blocktrans trimmed with build_id=build.pk %} Build #{{ build_id }} {% endblocktrans %}
@@ -118,7 +118,7 @@

{% url 'wipe_version' build.version.project.slug build.version.slug as wipe_url %} - {% blocktrans %} + {% blocktrans trimmed %} Having trouble with your build environment? Try resetting it. {% endblocktrans %} @@ -128,7 +128,7 @@

{% url 'projects_advanced' build.version.project.slug as advanced_url %} - {% blocktrans %} + {% blocktrans trimmed %} Don't want setup.py install called? Change the Install Project setting in your advanced settings. {% endblocktrans %} diff --git a/readthedocs/templates/core/project_bar_base.html b/readthedocs/templates/core/project_bar_base.html index aad9c0fecac..efcbcfde27b 100644 --- a/readthedocs/templates/core/project_bar_base.html +++ b/readthedocs/templates/core/project_bar_base.html @@ -28,7 +28,7 @@

{% if project.skip %}

- {% blocktrans %} + {% blocktrans trimmed %} Your project is currently disabled for abuse of the system. Please make sure it isn't using unreasonable amounts of resources or triggering lots of builds in a short amount of time. Please file a ticket to get your project re-enabled. diff --git a/readthedocs/templates/core/project_detail_right.html b/readthedocs/templates/core/project_detail_right.html index cbf45b80348..4218add34b5 100644 --- a/readthedocs/templates/core/project_detail_right.html +++ b/readthedocs/templates/core/project_detail_right.html @@ -79,7 +79,7 @@

{% trans "Tags" %}

{% if request.user|is_admin:project %} {% url 'projects_edit' project.slug as edit_url %} - {% blocktrans %} + {% blocktrans trimmed %} Add some in your project settings. {% endblocktrans %} {% endif %} diff --git a/readthedocs/templates/homepage.html b/readthedocs/templates/homepage.html index 9e66a3e1510..d68d6c41d3e 100644 --- a/readthedocs/templates/homepage.html +++ b/readthedocs/templates/homepage.html @@ -44,7 +44,7 @@

{% trans "Technical documentation lives here" %}

- {% blocktrans %} + {% blocktrans trimmed %} Read the Docs simplifies software documentation by automating building, versioning, and hosting of your docs for you. {% endblocktrans %} @@ -57,7 +57,7 @@

{% trans "Technical documentation lives here" %}

Free docs hosting

{% with projects_count_intcomma=projects_count|intcomma %} - {% blocktrans %} + {% blocktrans trimmed %} We will host your documentation for free forever. There are no tricks. We help {{ projects_count_intcomma }} open source projects share their docs. @@ -68,7 +68,7 @@

Free docs hosting

Webhooks

- {% blocktrans %} + {% blocktrans trimmed %} Whenever you push code to your favorite version control system, whether that is Git, Mercurial, Bazaar, or Subversion, we will automatically build your docs so your code and documentation are @@ -83,7 +83,7 @@

Webhooks

Multiple formats

- {% blocktrans %} + {% blocktrans trimmed %} Of course we build and host your docs for the web, but they are also vieweable as PDFs, as single page HTML, and for eReaders. No additional configuration is required. @@ -93,7 +93,7 @@

Multiple formats

Multiple versions

- {% blocktrans %} + {% blocktrans trimmed %} We can host and build multiple versions of your docs so having a 1.0 version of your docs and a 2.0 version of your docs is as easy as having a separate branch or tag in your version control system. @@ -139,7 +139,7 @@

{% trans "Read the Docs is funded by the community" %}

{% url "donate" as sponsors_url %} {% url "gold_detail" as gold_detail %} - {% blocktrans %} + {% blocktrans trimmed %} Read the Docs is a huge resource that millions of developers rely on for software documentation. It would not be possible without the support of our @@ -150,7 +150,7 @@

{% trans "Read the Docs is funded by the community" %}

- {% blocktrans %} + {% blocktrans trimmed %} Read the Docs is community supported. It depends on users like you to contribute to development, support, and operations. You can learn more about how to contribute in our docs. @@ -160,7 +160,7 @@

{% trans "Read the Docs is funded by the community" %}

- {% blocktrans %} + {% blocktrans trimmed %} Hosting for the project is graciously provided by Rackspace. {% endblocktrans %}

diff --git a/readthedocs/templates/notifications/send_notification_form.html b/readthedocs/templates/notifications/send_notification_form.html index 4551c1d8788..1832ff9ffde 100644 --- a/readthedocs/templates/notifications/send_notification_form.html +++ b/readthedocs/templates/notifications/send_notification_form.html @@ -6,7 +6,7 @@

{% trans 'Send Email' %}

- {% blocktrans %} + {% blocktrans trimmed %} An email message will be sent to the following email addresses: {% endblocktrans %}

@@ -18,7 +18,7 @@

{% trans 'Send Email' %}

{% with extra_recipients=recipients|slice:"20:" %} {% if extra_recipients|length > 0 %}
  • - {% blocktrans count counter=extra_recipients|length %} + {% blocktrans trimmed count counter=extra_recipients|length %} And 1 other recipient. {% plural %} And {{ counter }} other recipients... @@ -29,7 +29,7 @@

    {% trans 'Send Email' %}

    - {% blocktrans %} + {% blocktrans trimmed %} Specify the email content you wish to send: {% endblocktrans %}

    diff --git a/readthedocs/templates/profiles/private/advertising_profile.html b/readthedocs/templates/profiles/private/advertising_profile.html index a238bff8eb0..9ff453f31b1 100644 --- a/readthedocs/templates/profiles/private/advertising_profile.html +++ b/readthedocs/templates/profiles/private/advertising_profile.html @@ -12,14 +12,14 @@ {% if request.user.gold.exists or request.user.goldonce.exists %}

    - {% blocktrans %} + {% blocktrans trimmed %} Since you are a Gold Member or Supporter, you are ad-free for as long as you are logged-in. Thank you for supporting Read the Docs. {% endblocktrans%}

    {% else %}

    - {% blocktrans %} + {% blocktrans trimmed %} Read the Docs is an open source project. In order to maintain service, we rely on both the support of our users, and from sponsor support. @@ -27,7 +27,7 @@

    - {% blocktrans %} + {% blocktrans trimmed %} For more details on advertising on Read the Docs including the privacy protections we have in place for users and community advertising we run on behalf of the open source community, @@ -38,7 +38,7 @@

    {% url "gold_detail" as gold_detail %} {% url "donate" as donate_url %} - {% blocktrans %} + {% blocktrans trimmed %} You can go ad-free by becoming a Gold Member or Supporter of Read the Docs. {% endblocktrans %}

    diff --git a/readthedocs/templates/projects/import_basics.html b/readthedocs/templates/projects/import_basics.html index 13a9a7a4ef7..4f0406491bd 100644 --- a/readthedocs/templates/projects/import_basics.html +++ b/readthedocs/templates/projects/import_basics.html @@ -5,7 +5,7 @@

    {% trans "Project Details" %}

    - {% blocktrans %} + {% blocktrans trimmed %} To import a project, start by entering a few details about your repository. More advanced project options can be configured diff --git a/readthedocs/templates/projects/import_extra.html b/readthedocs/templates/projects/import_extra.html index b52d4ad338c..2cd63d1447e 100644 --- a/readthedocs/templates/projects/import_extra.html +++ b/readthedocs/templates/projects/import_extra.html @@ -5,7 +5,7 @@

    {% trans "Project Extra Details" %}

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

    diff --git a/readthedocs/templates/projects/integration_generic_webhook_detail.html b/readthedocs/templates/projects/integration_generic_webhook_detail.html index 59ff097383c..893cf4933d5 100644 --- a/readthedocs/templates/projects/integration_generic_webhook_detail.html +++ b/readthedocs/templates/projects/integration_generic_webhook_detail.html @@ -4,7 +4,7 @@ {% block integration_details %}

    - {% blocktrans %} + {% blocktrans trimmed %} The following parameters are configured for this integration: {% endblocktrans %}

    diff --git a/readthedocs/templates/projects/integration_webhook_detail.html b/readthedocs/templates/projects/integration_webhook_detail.html index 485bc894b09..a42067f5886 100644 --- a/readthedocs/templates/projects/integration_webhook_detail.html +++ b/readthedocs/templates/projects/integration_webhook_detail.html @@ -10,7 +10,7 @@ {% block project-integrations-active %}active{% endblock %} {% block project_edit_content_header %} - {% blocktrans with type=integration.get_integration_type_display %} + {% blocktrans trimmed with type=integration.get_integration_type_display %} Integration - {{ type }} {% endblocktrans %} {% endblock %} @@ -18,7 +18,7 @@ {% block project_edit_content %} {% if integration.has_sync and integration.can_sync %}

    - {% blocktrans %} + {% blocktrans trimmed %} This webhook was configured when this project was imported. If this integration is not functioning correctly, try resyncing the webhook: {% endblocktrans %} @@ -39,7 +39,7 @@ {% endcomment %} {% if integration.has_sync and not integration.can_sync %}

    - {% blocktrans %} + {% blocktrans trimmed %} This integration was created automatically from an existing webhook configured on your repository. To make any changes to this webhook, you'll need to update the configuration there. You can use the @@ -48,7 +48,7 @@

    {% else %}

    - {% blocktrans %} + {% blocktrans trimmed %} To manually configure this webhook with your provider, use the following address: {% endblocktrans %} @@ -63,7 +63,7 @@ {% block integration_details %}{% endblock %}

    - {% blocktrans %} + {% blocktrans trimmed %} For more information on manually configuring a webhook, refer to our webhook documentation @@ -80,7 +80,7 @@

    {% trans "Recent Activity" %}

  • {{ exchange.status_code }} - {% blocktrans with date=exchange.date|timesince %} + {% blocktrans trimmed with date=exchange.date|timesince %} {{ date }} ago {% endblocktrans %} diff --git a/readthedocs/templates/projects/onboard_detail.html b/readthedocs/templates/projects/onboard_detail.html index 63ce9dfb4bc..3d217dc8d0a 100644 --- a/readthedocs/templates/projects/onboard_detail.html +++ b/readthedocs/templates/projects/onboard_detail.html @@ -8,7 +8,7 @@ {% if not onboard.build %}

    {% trans "Start building your documentation" %}

    - {% blocktrans %} + {% blocktrans trimmed %} This project has not been built yet. Try building the latest version now, or if you would like to build a specific version, @@ -30,7 +30,7 @@

    {% trans "Your documentation is ready to use" %}

    - {% blocktrans %} + {% blocktrans trimmed %} Your documentation has been built. Ensure your documentation is kept up to date with every commit to your repository, by @@ -46,7 +46,7 @@

    {% trans "Your documentation failed to build" %}

    - {% blocktrans %} + {% blocktrans trimmed %} There was a problem building your documentation, you can see what went wrong in the build output. If you need more help, check out some of the @@ -62,7 +62,7 @@

    {% trans "Your documentation failed to build" %}

    {% trans "Your documentation is building" %}

    - {% blocktrans %} + {% blocktrans trimmed %} You'll be able to view your documentation in a minute or two, once your project is done building. {% endblocktrans %} diff --git a/readthedocs/templates/projects/onboard_import.html b/readthedocs/templates/projects/onboard_import.html index 08190480b6a..d383ba74f7e 100644 --- a/readthedocs/templates/projects/onboard_import.html +++ b/readthedocs/templates/projects/onboard_import.html @@ -7,7 +7,7 @@

    {% trans "Ready to share your documentation" %}{% if request.user.first_name {% with getting_started_url="http://docs.readthedocs.io/en/latest/getting_started.html" %}

    - {% blocktrans %} + {% blocktrans trimmed %} You don't have any projects yet, but you can start building documentation by importing one. Not sure how to start documenting your project? Check out the Getting Started Guide to learn how. @@ -16,7 +16,7 @@

    {% trans "Ready to share your documentation" %}{% if request.user.first_name

    {% url "projects_import_demo" as import_demo_url %} - {% blocktrans %} + {% blocktrans trimmed %} Want to try a demo? Import our own demo project. {% endblocktrans %}

    diff --git a/readthedocs/templates/projects/project_advertising.html b/readthedocs/templates/projects/project_advertising.html index 51b24653f6d..47de78bffbd 100644 --- a/readthedocs/templates/projects/project_advertising.html +++ b/readthedocs/templates/projects/project_advertising.html @@ -13,7 +13,7 @@ {% block project_edit_content %}

    - {% blocktrans %} + {% blocktrans trimmed %} Read the Docs is an open source project. In order to maintain service, we rely on both the support of our users, and from sponsor support. @@ -21,7 +21,7 @@

    - {% blocktrans %} + {% blocktrans trimmed %} We will periodically run advertisements on built documentation pages for sponsors, however we have strict guidelines on advertisements: {% endblocktrans %} @@ -29,17 +29,17 @@

    • - {% blocktrans %} + {% blocktrans trimmed %} We don't give sponsors access to user information {% endblocktrans %}
    • - {% blocktrans %} + {% blocktrans trimmed %} We only report the number of impressions and number of ad clicks {% endblocktrans %}
    • - {% blocktrans %} + {% blocktrans trimmed %} We only allow and image and text, no Javascript besides our existing tracking {% endblocktrans %} @@ -47,7 +47,7 @@

    - {% blocktrans %} + {% blocktrans trimmed %} For more details on advertising on Read the Docs including the privacy protections we have in place for users and community advertising we run on behalf of the open source community, @@ -58,7 +58,7 @@

    {% trans "Opting out" %}

    - {% blocktrans %} + {% blocktrans trimmed %} If you do not wish to support Read the Docs with use of this ad space, we ask that you help support Read the Docs in one of following ways: {% endblocktrans %} @@ -66,7 +66,7 @@

    {% trans "Opting out" %}

    • - {% blocktrans %} + {% blocktrans trimmed %} If you have an open source project, and can contribute financially, consider a gold subscription. Gold subscribers can disable ads for projects they author. @@ -78,7 +78,7 @@

      {% trans "Opting out" %}

    • - {% blocktrans %} + {% blocktrans trimmed %} If your project is an open source project, you most certainly also lack funding. If you can't contribute financially to Read the Docs, consider donating your time. We can always use help with support @@ -91,7 +91,7 @@

      {% trans "Opting out" %}

    • - {% blocktrans %} + {% blocktrans trimmed %} If you are part of a company that uses Read the Docs to host documentation for a commercial product, we offer paid plans that offer email support, additional build resources, and features like @@ -107,7 +107,7 @@

      {% trans "Opting out" %}

      {% trans "Still can't help?" %}

      - {% blocktrans %} + {% blocktrans trimmed %} If you can't contribute your support for your open source project, but are conflicted by allowing support through advertising, we still would like to give you the option to disable showing promotions inside your @@ -117,7 +117,7 @@

      {% trans "Still can't help?" %}

      - {% blocktrans %} + {% blocktrans trimmed %} If you are a company hosting commercial documentation on our community site, but can't offer support for Read the Docs, we do not allow removing sponsor advertisements on your documentation. This goes diff --git a/readthedocs/templates/projects/project_dashboard_base.html b/readthedocs/templates/projects/project_dashboard_base.html index 452f2f604c4..c1146d5e95b 100644 --- a/readthedocs/templates/projects/project_dashboard_base.html +++ b/readthedocs/templates/projects/project_dashboard_base.html @@ -74,7 +74,7 @@

      {% trans "Projects" %}

      {% else %} - {% blocktrans count counter=builds %} + {% blocktrans trimmed count counter=builds %} 1 build {% plural %} {{ builds }} builds @@ -134,7 +134,7 @@

      {% trans "Projects" %}

      {% trans "Connect your Accounts" %}

      - {% blocktrans %} + {% blocktrans trimmed %} Have a GitHub account? Connect your account and import your existing projects automatically. {% endblocktrans %}

      @@ -152,7 +152,7 @@

      {% trans "Connect your Accounts" %}

      {% trans "Learn More" %}

      - {% blocktrans with rtd_docs_url="http://docs.readthedocs.io/en/latest/index.html" %} + {% blocktrans trimmed with rtd_docs_url="http://docs.readthedocs.io/en/latest/index.html" %} Check out the documentation for Read the Docs. It contains lots of information about how to get the most out of RTD. {% endblocktrans %} diff --git a/readthedocs/templates/projects/project_import.html b/readthedocs/templates/projects/project_import.html index 5cd04405198..be3c351480d 100644 --- a/readthedocs/templates/projects/project_import.html +++ b/readthedocs/templates/projects/project_import.html @@ -81,7 +81,7 @@

      {% trans "Import a Repository" %}

    • {% if has_connected_accounts %}

      - {% blocktrans with binding='data-bind="click: sync_projects"' trimmed %} + {% blocktrans trimmed with binding='data-bind="click: sync_projects"' %} No remote repositories found, try refreshing your accounts. {% endblocktrans %} diff --git a/readthedocs/templates/security.html b/readthedocs/templates/security.html index 18047320db4..1f49ca192d5 100644 --- a/readthedocs/templates/security.html +++ b/readthedocs/templates/security.html @@ -8,7 +8,7 @@

      {% trans 'Security at Read the Docs' %}

      -{% blocktrans %} +{% blocktrans trimmed %} For more details on security at Read the Docs or to report a security issue, please see our security policy. {% endblocktrans %} diff --git a/readthedocs/templates/socialaccount/connections.html b/readthedocs/templates/socialaccount/connections.html index 9ebab9019e4..c1206c23a79 100644 --- a/readthedocs/templates/socialaccount/connections.html +++ b/readthedocs/templates/socialaccount/connections.html @@ -13,7 +13,7 @@

      - {% blocktrans %} + {% blocktrans trimmed %} The following services are currently connected to your account: {% endblocktrans %}

      @@ -47,7 +47,7 @@ {% if base_account.provider == 'bitbucket' %}

      - {% blocktrans %} + {% blocktrans trimmed %} The API version this connection uses is no longer supported, please reconnect your Bitbucket account. {% endblocktrans %} diff --git a/readthedocs/templates/socialaccount/snippets/provider_list.html b/readthedocs/templates/socialaccount/snippets/provider_list.html index 9ca9482030d..2cc2525ea93 100644 --- a/readthedocs/templates/socialaccount/snippets/provider_list.html +++ b/readthedocs/templates/socialaccount/snippets/provider_list.html @@ -11,7 +11,7 @@ class="socialaccount-provider {{ provider.id }} {{ brand.id }} button" href="{% provider_login_url provider.id openid=brand.openid_url process=process next=next %}" > - {% blocktrans with brand_name=brand.name verbiage=verbiage|default:'Connect to' %} + {% blocktrans trimmed with brand_name=brand.name verbiage=verbiage|default:'Connect to' %} {{ verbiage }} {{ brand_name }} {% endblocktrans %} @@ -24,7 +24,7 @@ class="socialaccount-provider {{ provider.id }} button" href="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params next=next %}" > - {% blocktrans with provider_name=provider.name verbiage=verbiage|default:'Connect to' %} + {% blocktrans trimmed with provider_name=provider.name verbiage=verbiage|default:'Connect to' %} {{ verbiage }} {{ provider_name }} {% endblocktrans %} diff --git a/readthedocs/templates/wipe_version.html b/readthedocs/templates/wipe_version.html index e11235cc7b2..d842e9b3266 100644 --- a/readthedocs/templates/wipe_version.html +++ b/readthedocs/templates/wipe_version.html @@ -13,19 +13,19 @@ {% block content %}

      -{% blocktrans with slug=version.slug %} +{% blocktrans trimmed with slug=version.slug %} Remove build environment for {{ slug }} version. {% endblocktrans %}

      {% if deleted %}

      - {% blocktrans %} + {% blocktrans trimmed %} Your project environment has been wiped. {% endblocktrans %}

      {% else %} - {% blocktrans %} + {% blocktrans trimmed %} Having trouble getting your documentation build to complete? By clicking on the button below you'll clean out your build checkouts and environment, but not your generated documentation. {% endblocktrans %} From e015a1772d8fede37592775871c05061f7864bb3 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Mon, 6 Aug 2018 18:23:25 -0300 Subject: [PATCH 10/76] Note with the developer flow to update our app translations --- docs/i18n.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/i18n.rst b/docs/i18n.rst index cca997b8cad..c0aac3ce1ec 100644 --- a/docs/i18n.rst +++ b/docs/i18n.rst @@ -287,3 +287,22 @@ the `Compiling to MO`_ section). For more information about the ``tx`` command, read the `Transifex client's help pages `_. + + +.. note:: + + For Read the Docs community site, we use a `fabric script`_ to follow this process: + + .. _fabric script: https://github.com/rtfd/readthedocs.org/blob/master/fabfile.py + + #. Update files and push sources (English) to Transifex: + + .. code-block:: console + + $ fab i18n_push_source + + #. Pull changes (new translations) from Transifex: + + .. code-block:: console + + $ fab i18n_pull From ac37f53e0f21e5227a3b69c44744f8df60411593 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 7 Aug 2018 14:39:12 +0200 Subject: [PATCH 11/76] projects: don't explode trying to update UpdateDocsTaskStep state If we don't have it because setup_env hasn't been called yet. Traceback (most recent call last): File "/readthedocs/projects/tasks.py", line 313, in run self.version = self.get_version(self.project, version_pk) File "/readthedocs/projects/tasks.py", line 84, in get_version version_data = api_v2.version(version_pk).get() File "/lib/python3.5/site-packages/slumber/__init__.py", line 155, in get resp = self._request("GET", params=kwargs) File "/lib/python3.5/site-packages/slumber/__init__.py", line 101, in _request raise exception_class("Client Error %s: %s" % (resp.status_code, url), response=resp, content=resp.content) slumber.exceptions.HttpNotFoundError: Client Error 404: http://localhost:8002/api/v2/version/868/ During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/docsitalia/management/commands/rebuild_projects.py", line 33, in handle task.run(version.project.pk, version_pk=version.pk, build_pk=build.pk) File "/readthedocs/projects/tasks.py", line 332, in run build_id=build_pk, AttributeError: 'UpdateDocsTaskStep' object has no attribute 'setup_env' While at it do the same for build_env that may be not set if run_build fail early. --- readthedocs/projects/tasks.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index d781311d9eb..871857b7e48 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -286,6 +286,7 @@ def __init__(self, build_env=None, python_env=None, config=None, if config is not None: self.config = config self.task = task + self.setup_env = None def _log(self, msg): log.info(LOG_TEMPLATE @@ -355,12 +356,13 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, }, }, ) - self.setup_env.failure = BuildEnvironmentError( - BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( - build_id=build_pk, + if self.setup_env is not None: + self.setup_env.failure = BuildEnvironmentError( + BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( + build_id=build_pk, + ) ) - ) - self.setup_env.update_build(BUILD_STATE_FINISHED) + self.setup_env.update_build(BUILD_STATE_FINISHED) return False else: # No exceptions in the setup step, catch unhandled errors in the @@ -379,12 +381,13 @@ def run(self, pk, version_pk=None, build_pk=None, record=True, }, }, ) - self.build_env.failure = BuildEnvironmentError( - BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( - build_id=build_pk, + if self.build_env is not None: + self.build_env.failure = BuildEnvironmentError( + BuildEnvironmentError.GENERIC_WITH_BUILD_ID.format( + build_id=build_pk, + ) ) - ) - self.build_env.update_build(BUILD_STATE_FINISHED) + self.build_env.update_build(BUILD_STATE_FINISHED) return False return True From 2159b2049a3bfcd497f921e62b97ea32c644f2d0 Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Tue, 7 Aug 2018 19:24:28 -0300 Subject: [PATCH 12/76] Correct usage of the verb tense --- docs/i18n.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/i18n.rst b/docs/i18n.rst index 11cf00922b7..8a82b8c3c76 100644 --- a/docs/i18n.rst +++ b/docs/i18n.rst @@ -167,7 +167,7 @@ plural %}`` tag:: .. note:: The previous multi-lines examples also use the ``trimmed`` option. - This remove newline characters and replace any whitespace at the beginning and end of a line, + This removes newline characters and replaces any whitespace at the beginning and end of a line, helping translators when translating these strings. From 908df7541e41d5e3b638eba896873a1a1f8958ad Mon Sep 17 00:00:00 2001 From: Manuel Kaufmann Date: Tue, 7 Aug 2018 19:27:16 -0300 Subject: [PATCH 13/76] Grammar mistake --- docs/i18n.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/i18n.rst b/docs/i18n.rst index c0aac3ce1ec..fb4326c6437 100644 --- a/docs/i18n.rst +++ b/docs/i18n.rst @@ -291,7 +291,7 @@ help pages `_. .. note:: - For Read the Docs community site, we use a `fabric script`_ to follow this process: + For the Read the Docs community site, we use a `fabric script`_ to follow this process: .. _fabric script: https://github.com/rtfd/readthedocs.org/blob/master/fabfile.py From 17bcb7f641f1cade3b986bf1af7ecf5a43d7b274 Mon Sep 17 00:00:00 2001 From: David Fischer Date: Tue, 7 Aug 2018 15:50:45 -0700 Subject: [PATCH 14/76] All static media is run through "collectstatic" --- .gitignore | 1 + media/css/badge_only.css | 2 +- media/css/sphinx_rtd_theme.css | 2 +- media/font/fontawesome_webfont.eot | 2 +- media/font/fontawesome_webfont.svg | 2 +- media/font/fontawesome_webfont.ttf | 2 +- media/font/fontawesome_webfont.woff | 2 +- media/font/fontawesome_webfont.woff2 | 1 + media/fonts | 2 +- media/javascript/jquery/jquery-2.0.3.min.js | 2 +- media/javascript/jquery/jquery-migrate-1.2.1.min.js | 2 +- media/javascript/jquery/jquery-ui-1.8.24.custom.min.js | 2 +- media/javascript/readthedocs-doc-embed.js | 2 +- media/javascript/underscore.js | 2 +- readthedocs/settings/base.py | 7 +++++-- 15 files changed, 19 insertions(+), 14 deletions(-) create mode 120000 media/font/fontawesome_webfont.woff2 diff --git a/.gitignore b/.gitignore index 6ff593282ab..d4939081a95 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ media/json media/man media/pdf media/static +/static node_modules package-lock.json readthedocs/rtd_tests/builds diff --git a/media/css/badge_only.css b/media/css/badge_only.css index 5485c8af4c9..12c15c72a6b 120000 --- a/media/css/badge_only.css +++ b/media/css/badge_only.css @@ -1 +1 @@ -../static/core/css/badge_only.css \ No newline at end of file +../../readthedocs/core/static/core/css/badge_only.css \ No newline at end of file diff --git a/media/css/sphinx_rtd_theme.css b/media/css/sphinx_rtd_theme.css index d506abba5aa..d8b2a0137ff 120000 --- a/media/css/sphinx_rtd_theme.css +++ b/media/css/sphinx_rtd_theme.css @@ -1 +1 @@ -../static/core/css/theme.css \ No newline at end of file +../../readthedocs/core/static/core/css/theme.css \ No newline at end of file diff --git a/media/font/fontawesome_webfont.eot b/media/font/fontawesome_webfont.eot index d7ddd3244bc..0692b78ab30 120000 --- a/media/font/fontawesome_webfont.eot +++ b/media/font/fontawesome_webfont.eot @@ -1 +1 @@ -../static/core/font/fontawesome-webfont.eot \ No newline at end of file +../../readthedocs/core/static/core/font/fontawesome-webfont.eot \ No newline at end of file diff --git a/media/font/fontawesome_webfont.svg b/media/font/fontawesome_webfont.svg index abc7434505e..4f3efa81d26 120000 --- a/media/font/fontawesome_webfont.svg +++ b/media/font/fontawesome_webfont.svg @@ -1 +1 @@ -../static/core/font/fontawesome-webfont.svg \ No newline at end of file +../../readthedocs/core/static/core/font/fontawesome-webfont.svg \ No newline at end of file diff --git a/media/font/fontawesome_webfont.ttf b/media/font/fontawesome_webfont.ttf index e0067becadf..79ce9444c0c 120000 --- a/media/font/fontawesome_webfont.ttf +++ b/media/font/fontawesome_webfont.ttf @@ -1 +1 @@ -../static/core/font/fontawesome-webfont.ttf \ No newline at end of file +../../readthedocs/core/static/core/font/fontawesome-webfont.ttf \ No newline at end of file diff --git a/media/font/fontawesome_webfont.woff b/media/font/fontawesome_webfont.woff index 549827633c5..84464078e31 120000 --- a/media/font/fontawesome_webfont.woff +++ b/media/font/fontawesome_webfont.woff @@ -1 +1 @@ -../static/core/font/fontawesome-webfont.woff \ No newline at end of file +../../readthedocs/core/static/core/font/fontawesome-webfont.woff \ No newline at end of file diff --git a/media/font/fontawesome_webfont.woff2 b/media/font/fontawesome_webfont.woff2 new file mode 120000 index 00000000000..d8b851262b1 --- /dev/null +++ b/media/font/fontawesome_webfont.woff2 @@ -0,0 +1 @@ +../../readthedocs/core/static/core/font/fontawesome-webfont.woff2 \ No newline at end of file diff --git a/media/fonts b/media/fonts index eee2d551896..fb346f06d29 120000 --- a/media/fonts +++ b/media/fonts @@ -1 +1 @@ -static/core/font/ \ No newline at end of file +../readthedocs/core/static/core/font \ No newline at end of file diff --git a/media/javascript/jquery/jquery-2.0.3.min.js b/media/javascript/jquery/jquery-2.0.3.min.js index 2c7ebab0232..5123af31c90 120000 --- a/media/javascript/jquery/jquery-2.0.3.min.js +++ b/media/javascript/jquery/jquery-2.0.3.min.js @@ -1 +1 @@ -../../static/vendor/jquery-standalone.js \ No newline at end of file +../../../readthedocs/static/vendor/jquery-standalone.js \ No newline at end of file diff --git a/media/javascript/jquery/jquery-migrate-1.2.1.min.js b/media/javascript/jquery/jquery-migrate-1.2.1.min.js index b5930ced444..d7405a0b65d 120000 --- a/media/javascript/jquery/jquery-migrate-1.2.1.min.js +++ b/media/javascript/jquery/jquery-migrate-1.2.1.min.js @@ -1 +1 @@ -../../static/vendor/jquery-migrate-standalone.js \ No newline at end of file +../../../readthedocs/static/vendor/jquery-migrate-standalone.js \ No newline at end of file diff --git a/media/javascript/jquery/jquery-ui-1.8.24.custom.min.js b/media/javascript/jquery/jquery-ui-1.8.24.custom.min.js index efd82f5b996..1c410298d15 120000 --- a/media/javascript/jquery/jquery-ui-1.8.24.custom.min.js +++ b/media/javascript/jquery/jquery-ui-1.8.24.custom.min.js @@ -1 +1 @@ -../../static/vendor/jquery-ui-standalone.js \ No newline at end of file +../../../readthedocs/static/vendor/jquery-ui-standalone.js \ No newline at end of file diff --git a/media/javascript/readthedocs-doc-embed.js b/media/javascript/readthedocs-doc-embed.js index 3774ea7a77b..53269f13920 120000 --- a/media/javascript/readthedocs-doc-embed.js +++ b/media/javascript/readthedocs-doc-embed.js @@ -1 +1 @@ -../static/core/js/readthedocs-doc-embed.js \ No newline at end of file +../../readthedocs/core/static/core/js/readthedocs-doc-embed.js \ No newline at end of file diff --git a/media/javascript/underscore.js b/media/javascript/underscore.js index a49ca8b3847..57efbbba0aa 120000 --- a/media/javascript/underscore.js +++ b/media/javascript/underscore.js @@ -1 +1 @@ -../static/vendor/underscore-standalone.js \ No newline at end of file +../../readthedocs/static/vendor/underscore-standalone.js \ No newline at end of file diff --git a/readthedocs/settings/base.py b/readthedocs/settings/base.py index f469a3499cc..d5d95455695 100644 --- a/readthedocs/settings/base.py +++ b/readthedocs/settings/base.py @@ -167,12 +167,15 @@ def USE_PROMOS(self): # noqa PRODUCTION_MEDIA_ARTIFACTS = os.path.join(PRODUCTION_ROOT, 'media') # Assets and media - STATIC_ROOT = os.path.join(SITE_ROOT, 'media/static/') + STATIC_ROOT = os.path.join(SITE_ROOT, 'static') STATIC_URL = '/static/' MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/') MEDIA_URL = '/media/' ADMIN_MEDIA_PREFIX = '/media/admin/' - STATICFILES_DIRS = [os.path.join(SITE_ROOT, 'readthedocs', 'static')] + STATICFILES_DIRS = [ + os.path.join(SITE_ROOT, 'media'), + os.path.join(SITE_ROOT, 'readthedocs', 'static'), + ] TEMPLATES = [ { From 1e0b3190006a3c0dbf203733bbf3888be6b0f72c Mon Sep 17 00:00:00 2001 From: David Fischer Date: Tue, 7 Aug 2018 16:23:45 -0700 Subject: [PATCH 15/76] MEDIA_URL -> static --- readthedocs/templates/admin.html | 12 ------------ readthedocs/templates/base.html | 6 +++--- readthedocs/templates/builds/build_list.html | 3 ++- 3 files changed, 5 insertions(+), 16 deletions(-) delete mode 100644 readthedocs/templates/admin.html diff --git a/readthedocs/templates/admin.html b/readthedocs/templates/admin.html deleted file mode 100644 index 7487a941b2b..00000000000 --- a/readthedocs/templates/admin.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/readthedocs/templates/base.html b/readthedocs/templates/base.html index 57d80a18f52..26b7aa6c13c 100644 --- a/readthedocs/templates/base.html +++ b/readthedocs/templates/base.html @@ -10,7 +10,7 @@ {% block extra_metas %}{% endblock extra_metas %} - + {% block title %}{% endblock %}{% block head_title %}{% endblock %} | {% block branding %}Read the Docs {% endblock %} @@ -47,7 +47,7 @@ - + {% block extra_links %}{% endblock %} @@ -58,7 +58,7 @@ require('jquery'); - + + - + + - + +