From 007fc794c38bf4d109ef146e47da8bd5b9d9d320 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Tue, 27 Jun 2017 23:47:30 +0300 Subject: [PATCH 01/92] Add google analytics to data center light --- datacenterlight/context_processor.py | 16 ++++++++++++++++ .../templates/datacenterlight/base.html | 3 +++ .../includes/_google_analytics.html | 15 +++++++++++++++ .../templates/datacenterlight/order_detail.html | 2 +- dynamicweb/settings/base.py | 5 +++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 datacenterlight/context_processor.py create mode 100644 datacenterlight/templates/datacenterlight/includes/_google_analytics.html diff --git a/datacenterlight/context_processor.py b/datacenterlight/context_processor.py new file mode 100644 index 00000000..b49ea364 --- /dev/null +++ b/datacenterlight/context_processor.py @@ -0,0 +1,16 @@ +from django.conf import settings + + +def google_analytics(request): + """ + Use the variables returned in this function to + render your Google Analytics tracking code template. + """ + ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_ID', False) + ga_domain = getattr(settings, 'GOOGLE_ANALYTICS_DOMAIN', False) + if not settings.DEBUG and ga_prop_id and ga_domain: + return { + 'GOOGLE_ANALYTICS_PROPERTY_ID': ga_prop_id, + 'GOOGLE_ANALYTICS_DOMAIN': ga_domain, + } + return {} diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html index c62d92f7..bf0e0ca0 100644 --- a/datacenterlight/templates/datacenterlight/base.html +++ b/datacenterlight/templates/datacenterlight/base.html @@ -47,6 +47,9 @@ {% include "datacenterlight/includes/_footer.html" %} + + {% include "datacenterlight/includes/_google_analytics.html" %} + diff --git a/datacenterlight/templates/datacenterlight/includes/_google_analytics.html b/datacenterlight/templates/datacenterlight/includes/_google_analytics.html new file mode 100644 index 00000000..d074dfd3 --- /dev/null +++ b/datacenterlight/templates/datacenterlight/includes/_google_analytics.html @@ -0,0 +1,15 @@ + +{% if GOOGLE_ANALYTICS_PROPERTY_ID %} + +{% else %} + +{% endif %} + \ No newline at end of file diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index cb412558..8b53df5d 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -2,7 +2,7 @@ {% load staticfiles bootstrap3 %} {% load i18n %} {% block content %} - +{% include 'datacenterlight/includes/_google_analytics.html' %}
{% if messages %}
diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index d276f022..f3a80470 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -161,6 +161,7 @@ TEMPLATES = [ "django.contrib.messages.context_processors.messages", 'sekizai.context_processors.sekizai', 'cms.context_processors.cms_settings', + 'datacenterlight.context_processor.google_analytics', ], }, }, @@ -509,3 +510,7 @@ OPENNEBULA_ENDPOINT = env('OPENNEBULA_ENDPOINT') # dcl email configurations DCL_TEXT = env('DCL_TEXT') DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') + +# Settings for Google analytics +GOOGLE_ANALYTICS_PROPERTY_ID = 'UA-62285904-9' +GOOGLE_ANALYTICS_DOMAIN = 'auto' From 4930e7d06533067d298f6347523a321494635691 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 12:58:10 +0530 Subject: [PATCH 02/92] Added styles for whydcl page --- .../datacenterlight/css/landing-page.css | 78 ++++++++++++++++++- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index bcfa3f83..6a42cd02 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -571,6 +571,64 @@ h6 { width: 70px; right: 0; } +/*Why DCL*/ +.full-blue-bg-sec { + padding: 60px 0; + background: #2D457A; + color: #fff; + text-align: center; +} +.single-heading h2 { + font-size: 65px; + margin: 0; + padding: 0; +} +#tech_stack { + background: #fff; +} +#tech_stack h3 { + font-size: 45px; + width: 70%; +} +hr.thick-divider { + border-top: 3px solid #eee !important; +} +.space { + padding: 50px 0; +} +tech-sub-sec h2 { + font-size: 45px; + line-height: 60px; + padding-bottom: 25px; + color: #3a3a3a; + letter-spacing: 1px; +} +.logo-wrap { + text-align: center; + min-height: 125px; + padding: 20px 40px 30px 40px; +} +.btm-space{ +padding-bottom: 8px; +} +.percent-text { + font-size: 60px; + color: #999; +} +.tech-sub-sec h2 { + font-size: 40px; + line-height: 55px; +} +.space-middle{ +padding: 35px 0; +} +.padding-vertical{ +padding: 35px 0; +} +.percent-text img{margin-left:20px;} +.space-block { + padding: 30px 0; +} /*Pricing page*/ @@ -742,6 +800,18 @@ h6 { } @media(max-width:768px) { + .percent-text { + font-size: 57px; + } + .tech-sub-sec h2 { + font-size: 30px; +} +.single-heading h2 { + font-size: 50px; + } +.logo-wrap { + padding: 10px; +} .intro-message { padding-bottom: 15%; } @@ -984,9 +1054,11 @@ h6 { margin-top: 15px; } } - - - +@media(min-width:1200px) { +.container-small{ + width:980px; +} +} footer { padding: 50px 0; From d27eff94415ef937df9c7ecc1195938e888d36b4 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 12:59:30 +0530 Subject: [PATCH 03/92] Added function for dropdown menu --- datacenterlight/static/datacenterlight/js/main.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/datacenterlight/static/datacenterlight/js/main.js b/datacenterlight/static/datacenterlight/js/main.js index 26688e8e..2a0cb4ac 100644 --- a/datacenterlight/static/datacenterlight/js/main.js +++ b/datacenterlight/static/datacenterlight/js/main.js @@ -53,6 +53,11 @@ /* --------------------------------------------- Nav panel classic --------------------------------------------- */ + $('ul.nav li.dropdown').hover(function() { + $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500); + }, function() { + $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500); + }); function _initScroll(){ From 36fd7913fe5413c47526a4445bcd7a46c4a08f7b Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 13:03:32 +0530 Subject: [PATCH 04/92] Added nav dropdown and added OR condition for Whydatacenterlight page --- .../datacenterlight/includes/_navbar.html | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/includes/_navbar.html b/datacenterlight/templates/datacenterlight/includes/_navbar.html index 0d2f43f1..6a7e4002 100644 --- a/datacenterlight/templates/datacenterlight/includes/_navbar.html +++ b/datacenterlight/templates/datacenterlight/includes/_navbar.html @@ -11,7 +11,7 @@ - {% if request.resolver_match.url_name == "index" %} + {% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %} {% else %} @@ -22,18 +22,18 @@ - \ No newline at end of file + From 2c1c36cf945191ba9a83454dcb13795f419bd7f5 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 13:05:32 +0530 Subject: [PATCH 05/92] Added url for whydatacenterlight page --- datacenterlight/urls.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datacenterlight/urls.py b/datacenterlight/urls.py index 65401b13..d880dc34 100644 --- a/datacenterlight/urls.py +++ b/datacenterlight/urls.py @@ -1,10 +1,11 @@ from django.conf.urls import url -from .views import IndexView, BetaProgramView, LandingProgramView, BetaAccessView, PricingView, SuccessView, PaymentOrderView, OrderConfirmationView +from .views import IndexView, BetaProgramView, LandingProgramView, BetaAccessView, PricingView, SuccessView, PaymentOrderView, OrderConfirmationView, WhyDataCenterLightView urlpatterns = [ url(r'^/?$', IndexView.as_view(), name='index'), + url(r'^/whydatacenterlight/?$', WhyDataCenterLightView.as_view(), name='whydatacenterlight'), url(r'^/beta-program/?$', BetaProgramView.as_view(), name='beta'), url(r'^/landing/?$', LandingProgramView.as_view(), name='landing'), url(r'^/pricing/?$', PricingView.as_view(), name='pricing'), From 1311e7ea89de33f94dd28e838f5f7ff764c43d6f Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 13:06:24 +0530 Subject: [PATCH 06/92] Created view for whydatacenterlight page --- datacenterlight/views.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index e4329b89..949e2aa8 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -179,6 +179,28 @@ class BetaProgramView(CreateView): return HttpResponseRedirect(self.get_success_url()) +class WhyDataCenterLightView(CreateView): + template_name = "datacenterlight/whydatacenterlight.html" + model = BetaAccess + form_class = BetaAccessForm + @cache_control(no_cache=True, must_revalidate=True, no_store=True) + def get(self, request, *args, **kwargs): + try: + manager = OpenNebulaManager() + templates = manager.get_templates() + context = { + 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, + } + except: + messages.error( request, + 'We have a temporary problem to connect to our backend. \ + Please try again in a few minutes' + ) + context = { + 'error' : 'connection' + } + return render(request, self.template_name, context) + class IndexView(CreateView): template_name = "datacenterlight/index.html" model = BetaAccess From 86984145e997dcdf9ff74b9dfce0b812a3d68101 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 13:08:28 +0530 Subject: [PATCH 07/92] Some logo images for whydatacenterlight page --- .../static/datacenterlight/img/Ceph_Logo.png | Bin 0 -> 9942 bytes .../datacenterlight/img/cdistbyungleich.png | Bin 0 -> 12346 bytes .../static/datacenterlight/img/devuan.png | Bin 0 -> 8871 bytes .../static/datacenterlight/img/django.png | Bin 0 -> 16953 bytes .../static/datacenterlight/img/opennebula.png | Bin 0 -> 12295 bytes .../static/datacenterlight/img/prometheus.png | Bin 0 -> 6730 bytes .../static/datacenterlight/img/python-logo.png | Bin 0 -> 11262 bytes .../static/datacenterlight/img/ssd.jpg | Bin 0 -> 5623 bytes .../static/datacenterlight/img/tayga.png | Bin 0 -> 13034 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 datacenterlight/static/datacenterlight/img/Ceph_Logo.png create mode 100644 datacenterlight/static/datacenterlight/img/cdistbyungleich.png create mode 100644 datacenterlight/static/datacenterlight/img/devuan.png create mode 100644 datacenterlight/static/datacenterlight/img/django.png create mode 100644 datacenterlight/static/datacenterlight/img/opennebula.png create mode 100644 datacenterlight/static/datacenterlight/img/prometheus.png create mode 100644 datacenterlight/static/datacenterlight/img/python-logo.png create mode 100644 datacenterlight/static/datacenterlight/img/ssd.jpg create mode 100644 datacenterlight/static/datacenterlight/img/tayga.png diff --git a/datacenterlight/static/datacenterlight/img/Ceph_Logo.png b/datacenterlight/static/datacenterlight/img/Ceph_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..44046920e722e5df95c8fabe87e2c17038f7805c GIT binary patch literal 9942 zcmV;{CMns8P)spt(!5|>Y1eFY6RmcgF6PDU)w|lF-x3$;X z-r8$xull>ydfRKOZ5477-~@4l2`HJMm1RQR&|0;wy;ZA1awZ^mDERRPfAoF$=q5tp2!Mt_#%rRo{qGaQ z5w^slJ`wg<@>^`=i54yfW&o!HX944YVIGTW1-1jPr9K-ZJRP*`f9!i#Suw%#Dt}h{ z@Zp^ZM*@w&AAyYsxh!5&{W8D>(=X?_^-uals3iTF2D)Xp|9iB+4NA1NDe}uDT0vX^ z@`XTv#Hb~<3$WcNVXVEvpW!}ys1e}^VAr94mqK18q^OO@qKyMdLhN-SbQT!sOZO3A zA@EJ$GGJ6MS49Gw09&{0djT5f&1LlRmHsUE;iH>Gm_id!E#SvnV$p5BM3_bbtT*Ql z)6gyi9tVQ`s4o@)>-3cB>@1p({!pbq<9+z>PJ{;#jCiJIQjQ8QAM{1Xxqq&^X-|Lx|TPd&@-KxSd zjSB?wUI~->d4G%szUi38H-I_%gZ3l-RQBPchg_Ka^lRiyB6O}_)J}rG0k%lQqyaQ| z0$Amk#x}<^G=M}|u|K7K_&7|Fbs}_3Be@Oi{`3^bG+qO4$hG8|L!1q?Ii^uuP+o;o zS}f|XEAwZK4}oOae)zVUFv}IQ(yIzFl0NyNh#I{;obrA zCCSjHpjF|f`@u(Zt`Z+eVdW;G`*tgJ*U(_udw~q z;ln4w0ZN43Ru|vDdVcaBuB-#bcbfzyf0Hl+wBvNkzN@~h1R!f92r%yVt4Nd?B#b!} zRNAlTmi;*p=L73{uz?Ikh!>st#xXt#`tUKZ(Jdl$N)3*Cq!Ophr~uCGu6haFtykD5 z1}*zZ*L9l##+2tK@IgVjO@aOJzW;C0cD|}x_6#YR1iaqeV$pcMVg9_KiA7iYv&n~# z!9;|5g^g2c+>T^^H{ZKaz!|z_f4BV)V=8-Bsyb?Elvl4j@>aZ<=JNQNcJT<#T! zooL!W3YIS4+1;`erN)I)uogJ78$bUQ0se_5(3kgbRe9!R*R$rS`wxo={Kac0@anR< ztd;krSzqR*)sOXAdnQkx&Bpal%y9dT1R3l#FYM>050E`6kQy-D~xFlU|np6LMNka7y z^6nX7RW>V*XeO=A!4?4_`%Vtsc)arggg!{)ha)uCMgo`_(lkpT9 z+8!y{*_uD}-RGWMwP#h=X#44gyq`r`y7 zpUF`$xpzpmB?&;H3(MNIHvJ+;2yf~+LBRTldvvm*)u(~cX?`Xyx@U+ zSG#^hqua zC|qQK_#M3;z_)!d??EyvUK_2QFfBq|Z8R4|Xl|)pQ?YLon^r_!Z8a086`d-Dc$%ck zSGLg%MB=e%jhATB*^mfB;aO*byE#W=`VlZL9*ZjVz1PE%KXju)=e|Dv9Vv^xlAZv~ zB+m%JV#hT83fz|i5(Eech&ZOv>X^p=D3G9lW)tx0|Mayst#wRaG0$rcy@H$HI$eVg z`j`X(jsdo}wd|SJ9TEgmBp6u^VnrX3V7tI@1cF#799dFV8*L}JoZ!66r*qkadDPWb z6ADLuC53oBMI+I{qb1zhFnU7p>X7U;JIEMEsb;I>pQnmb}13o&o^i^jbnj@UL~Uf%if+y<5H5i zc22t*{5cox%|0MONS+LT#2uIWv8n(^TX8QQEOo9N{hr*Hn%#lP* zs4#LDu({Vq%Ox5rj0_K5QPe#mbj-PoskCX6MDS+Bd{DRS-!+&91&5ptHQ!2J!T@x7pBt%%UHD^8Gt|D^xo?$Go|w!_%vg~E|v0_F5#8jVBn z&57a2m)qrSyYWbCTX+l zOSth^G|+9;7>3{Cu^Vp_Q)YZeFSkjQ9xTNLD{VI3 z{(A!XeAi1yNQm{GY%6Y~|0CSh0~7ZfwXYcf?U{4Y^vH-%;mmB6H?BW4N~CUCg$g5C zDz48-5I_qRMo#cdgbk)aL#Z(gJYA!ELbs|Obj;#(<%veq$Rp{S)juJ*$1#l=1!)dW zCf{-$qaL&qLNLX{1PC~$ac*LMFXTIs;)Vf09LE7%aY^QAZClnyx#+UUN%ZVAQF{3F z#GzbsT`r5)tl==jXD41B85XaJ9$u}Inb&Sc8%NNxNth+NM1Dc>HO;_Hj%f%zjl*)# zvZZ4h&(Xc>Ywh@$WK#A7Nk5_gL((DzM+-QSWEQ$p=zbswfX5xv_^fW(A9pYlEG$7b zxtqxoe@(roE93)TE~u<}F;`=ILE&ujW$Wou-8SfwjQ99Fhz(MTL?A#Tng>GAkZnz( zK%?z*5@sSOQI%#U7S1?sUCr9}JA0Js*@gl^74`qEeJy-Jtp>X7Ml2N!-2I}5;P4uQLym~wE z7ElwKHuDDvsg%H5%D_V4_D-uPQT$RJ(-;3=MfJCTyAL6-b^G25G-Fwu-tCZE&Fe}WtWh=FWj9g z9%na{m4pu@!2_XN_HR*lr8zcXmYk9c5MW3o-ak4*FvgaT$`p} zi-e1~8Bq1*9C=no%*L74>`0o=MzFMg&Q<%=bx#Hy+*ftW zz83ht=Y=3;P3KaJP&WKY!QN!xrAW21Qp9Y?$xYXXu z#mlEmnS}>Qqf^OM3UPv}bc@T|xoFSk79~t0?PMruZu}5+FZrVrrg7Z%vU$0h+^49`NcmbWUjFQ}s{tAm zAMezbskt1btmfB7cjc->1+)V7YAq5+F>s)I!>2%qoZR`(1w0U;=0!D@f@GK@B@I-! zmUoaeocVLx%kn~m>vYSWvwLCo-Az*WhL-?dY-Fd)45!?pYMlgLP@PmR96z=^M-geH z8WFmX%dC65)j6h9iSQWuhmWZXe5%y_k^w`6LZEu;tV`qoAwr>gtu!Dq%&ZPJfQAM0 zpsfvr(A8$OxF>BdR<6V;oqGugFOgV&=FFeN5lcGe3T`MXCRkpDV;1LwI373;m9h6P#}xpaSyl4S6NQUbWYZlmoxCcyIWiD9Rei#^Kh4~g+7CP|=HKa-{YSm>;q(TJ@+#^V z%smIhJHQ*jN?;!FWeInZly=@|FpYm7Te18g65LOQ6^yc$wIIZm>eZ4r0_jK)-Ljwc z(7y3GoC$e~i~Ext)?trwPh`^BYSt>Z1!QARmsav5Qt8B2ND2lD5pLYDM!nyJ$m{p>8?KG}(RA}9*>MZ1wawKcL-2PhQR~B{nd;4`a$27jHx!Ox44<0hvnT`_hQ^zzm zee{*9(mqqa@LKfp6)%IbihyGlpV^68v_)}cWt|8wxzt+#ZB2+=65+?dDuyW_Z zV$sz2eutM9B*S(62=+xHQL!IgG_-lhYos|u7_(&AJ~bSuP+S(5lEJuPV(ofHE{(#?@dB~McP z{Y#z9qSH|ix%1AbB~=|r&?z%Oay;F;>T|MV8vmkO_J3#i{!b+RkA^C&i1Rx6_WuUT zV7soHvs@~vkmzm}ic*sZ1vw=`E!h|~M_q}2IFf^4@DO27W1e-E7=4s_hl^DmRpNQc za9Dynpxcg}{{-;yHKplV{vObxI3dRFC@T@^g#os!R%Yi{%&f->3{8%x$9EH=c>v5w zwUbIIcI2`Wn`6=TtcWT&;&3DfAr8-Wd5{Q|@qSNtc7OtF#g>jL@$&ZFwkOf6Pi!bH zIV)IE(ZMdIFSVN-(@?#>bacRVQ%Tx7s1M4vD%sj}0+3Z-zP2GE5XeDBx;})WIYrJ6 zg(LDXSx3E%HkE#sa=^8#&m_XmcFg>qR&LhE;u^lBuM-QZ3b7ywd z2ZyMpVr2GrZK?Tl(kDWXP;xyI3}Pa5W*MTFCv--stkqQth13;J$h_t8k?KU3X=IO) zE4{^`lj^|)Jgh+1C&Io*{s615tN761B|?3*?MdC(k@?z~s^L5UkSHxlM;zHWIdU2j;Rv|5jhNFSvA1A~38OvwY?5hV(f@K98zxM~Llu8zQNCw7 z;*rWWdHbzd9l+K+4!6lVXck`|?lo!xfE2BRrAIOm;meA@&zKuTN?!J$9-rpSn z`#ojG>`$rrG|=6o<@Yv}8U!n=(tUR^st(^$c6NS3WM0Lej4go1|@e?QbQ)1NX2D{N(lWnc!whm6!8TGrtU-Lf4mFYmN&v~7`Y z*-r)!$w*hfKZ(1S^q0?cq7$j5os?=3oIMYq5Q9=8l*rWraRkW-(S7!jFjng#2TMPc z2o)oMi^FY`&4|48Gf`A%$X_VUS}Dho*|9o`Y67K}wrEO9JNVDvyNUd}?%tUwEBU;X zat-jsE=p9b3&b%NwU9p(waxs9KY;|1@D-RmQ z6HV=iEwMFwP>*`!V?V*EYC?loBCIbfL6cJX`cgoMyEFE;biLdWp5l}l*BXv;b@Le)Hgsu{xkAw$O1a{Du3A30)S+OqQztlHR`7MC@Ydg9LIi}$y zoJUbRfbp~8rO&>PKSMq39TauitmeGT<;dmFG#rO( zs)^+5fxn-(>^FTn*ln7dGx8W8o-s~CdtX6{a9x*Uw{D0!8NT1ExJU<0WRyM>lNtw4 zQ`4ZpvZWNtVde8BOg)eU_YsC^pusOa)~O(28tX?}RXC+R&t2k_?jykxP|wqx+ByG6 zue3X;YQc&XNKKAIJ^tQDx@BiQDC!Ru%=abVB!bnTx^uuceg-C_7!( zMnmR~JfxPVsB}ru+Nlv<_3&dvt{2CI!pKm%_O%s423q5>C;EMevrSK~_4K^Z*u@}0 z#zEFA?H4?hGtM#Rop&G!w&TM&^U*E)YrwnSMnT+^Fz24_G>xNSfziFzebOXSMAV%` zv9k^!^MlBJds*=?0rx1E!zdDpgq%YuN-75)kTShn#^g({XlM0)0U`O7kZkMX z^D4C6Hc%G)_;5ry$F_8(TzK=%gPRDGT*Qymi*nO$H=lX9U25Uyo|hKdHhsv>Kyazu zt;Xrgs-$BY>+v4-Wvy=68Bclhq`1*TS#RhScCJs~-c;*PKA*!nC3ovJxEAFo8l(QUL7GEjz7`N#mko8s-~$BwctE%M>Rn_fE;2%VtSS{=6pkF3tHzWccZopp3Z_&~Zr|sSNL9PGgQS^3f{aAiP*wuT z0p6y%=A{rzbjy~G*-@2sOhf3FJsb7wd+nI&n8ltY8NGZ3z)w8Q5x|A;t_A5si;aG$ z3K3ut>W2CzSITvtnx(lO$2Sz8J1vKG2r53;7O#!UP6k1l2;0=dsC7p%);vhL|H#ry zd&7ZQl?W43bQ;2La1ddzd%pP{7GK>(S(WTvd0Yzhy;Q)7)tQr;fXbNky}B)v^l}pKE9yI?N}+ zeFRov{~B)w?5{V>FCLLt)G^gagIUan*UTWG1$2@DQ&r17yRod~_#^I9;~?j&hSrS( zl7(Zem0Ro0xs0h?dGOY_FA|P>pQp9ds(q=K#!=Pfq+mk0=)@PFdL|cj_(C?Mp6A!E z-HrN80gbHUOk|ElTQ)4jkaaLX|#SNiwq&awc@TRt=wterOP#Eb^u@k2y z-DW0)XP)6fEBN%q>Q#Oiu0ux1%e}0zLKBY`qzRx9w5s^bsXb5^Nnmoq}?kM49nrz)L^;am@1NALe=hCr+D{wC5;G zQR06?;YijlCr=9RTckHB{zT=rf~sxmU$;FO%X**2Yt|rzn2q8MBsb9ZZWdpk5Bvi7 zdng=PHz6E3sjeo<)JqGyUEr45wM@BqTAo1uS$)k9o?9iT5K*FRE>Z?Yfqa`}#0^#a zhi=)oCFU6vEI;JVZ)phy6)SK|<3B<9Wcn2Z=j-KNpTIh%aU1YM#d2TOE&I%r4YLE8 z)GsIznk&yFY1>qD*h_ZpRFHp6XC}zH1QRYA3*rORb7#BvBVF7`$*ce8%f?w>0Y2z$#4W?fU|(b%ETFqicZ=h=y_-{ z2UrDs1SCMocGo^Wqe$9P7kcUn$-=tY=+aKwH3GF%8WK1!9*e$|yZIk^1vpdT(ai`k zIbO3ydM3jCI}7LNm3G?0k-yI=W90BXM}hWN)T2D>x@9L6>e>iGHLvnD zLhwjId1k_DFpZr8ykwwzTes{l(2EF#Bk$2!qN;v^ggfkr*EX!m=rn!VHP`Ues#Wx( zRGnR+E*^`9a!iE1j(998E}U^Ce_H$apddmeG5OO42D(-C-@sEI74H`u)3~61e#cYf z&pup^Zms-8B9+Ni!j)YvG_yFMPJ(i$ZrN!`u)ef}Pp&EsIHvJuk0eOTk;6~v{i!Q& z9RTaA>9q~3_Iznt=3#tl)xLf6odLob%ML?L@mYYO?=>)3phSctmfCz&Y5;s6@DlbZ z0Q_=HWoBvX7qaT79(1ty zUGd}lLu>W(YXIU`lc#^V%cm}xv5h8O+z-Q2V1g$%iuMyw%?(`P zt#gr%X>{husp>AFl4n)bvA15xPSyO+c?q9gUNb+}E28l8CG0v9+&+`g;`f zz9zzbYI5bWohd&+FSfAJoqU(gBr&QIL~AnsY)9-cjUlMtDggLddybSNbAOAZ3pF{q zr%4XIfRsJ1AK)!CCdX@{yS@Bqb4@j&aD;d)dOyiX;Gg!Rb#rGt7X4vp>I~wsXl~xn zN=v*p`c2?E)Nc-T7YQl2rY^ST(L+ovJ`r}>Ye_%AXMtNh>^Fb!D92*ks9W|AH{P(A-tZah3KPOJd9n797DS+sK-($wt?R~bTU*4b@%7PnLfyC> z5syVlNnESrvFJzvzv<)dZIg)8iQx!aV$p8^-v~{ML=a3M={I={ z$;dbD5wNqPB_`*EL(+-)eOI_Ex7MtEzJ0UV*U!CxRNKFMVff1L2WYzynu1g_2WTvPtgykj0L-7rtztwD*C2w*`506HJHY~3H3a) zX&tm1%1Q{9ufQ>l7s#B%{==34C*`%WH&|iQ-w~P~A-+D^EAP7H)bDfq8+Ycc{3%6K zdA9l)1_Hb|R0}E0EwyWU#kLYEjC6Z*N|`MBOaEr2E?GN~b4=q-QVw7T?+5Z6y`t*n z9Sg4I$fe8D{BG{~psD8kyUoG zm@+o0Li_MB;E2%2!N|(x`$Xwnbj$ue@cRS){LXXFJtgFk$Gr@sCBak`%02LQmr93tH82P1gZ}buZJ~VlsAZiR{HSa6QKgyQ+Mi?{Z*h8 zSk&6WX@!4jAb9URnIuTzn8sPC+Xvqf(*3|OOFALs_V1*!+kvLZJ4a_Y03jc(bMx@9lXhRRN(#H1p&%Xu`kD{7V4Zh=;#uqxNCwmuOi*DI5-Lh|OTs+60H9mYCX6SXV{RYzz z!)Vc($lpxT`Bw>2$dSSFDrH|X$28hJkZh9%<6Y#-x>e=R3Lja6ZzCLp5@Bc9v2ZQ` zc`%}h{B>SP5V$8;UiE21nWu#Br+RpHs0&XE#03E9?jQT`;ln4w9^=R*E2&>ld~RDZ z(T$gIyB~o3kz*PJ%hjZ{lwI#F;9d{!2}+13N{u^4SJ=o4ZuDn|4 zBJ^p9BWFQL0c~;t0t1+GNX>50%kBHK@}8ud&a)hx65ws1Qo^#JWxwiA1s}P9e^}y6 zgk7t!OIIY&_#fS}FV-zv0Jo8}AzrMP+xIt=U6ZX>z2dqY3;YFG+uBOLZrNYZE&E4# zuI7`Vk6fc3_@s+Z6AYe&>OL|cVHW$H;A7BZ%G4|UPVnKwhYuen+a07*qoM6N<$g0)k0c>n+a literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/cdistbyungleich.png b/datacenterlight/static/datacenterlight/img/cdistbyungleich.png new file mode 100644 index 0000000000000000000000000000000000000000..433db7d5dfe198250d90d2aad1a8ef38779f5b84 GIT binary patch literal 12346 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 S(K49whZJR1WGbahLjDJG8UIcI literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/devuan.png b/datacenterlight/static/datacenterlight/img/devuan.png new file mode 100644 index 0000000000000000000000000000000000000000..102dd47615bd4861a03038a1a22eb79f72ea043d GIT binary patch literal 8871 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 QAOHXW07*qoM6N<$f)x1F`2YX_ literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/opennebula.png b/datacenterlight/static/datacenterlight/img/opennebula.png new file mode 100644 index 0000000000000000000000000000000000000000..da2ce1c66f2505d68d5a512f2497f5f9bae34de8 GIT binary patch literal 12295 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 literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/prometheus.png b/datacenterlight/static/datacenterlight/img/prometheus.png new file mode 100644 index 0000000000000000000000000000000000000000..e7cca8e3ce848975fb1e70d7c4a81578eb9c86fb GIT binary patch literal 6730 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 literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/ssd.jpg b/datacenterlight/static/datacenterlight/img/ssd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a0cdfe9069f8ebaa01c5797456d806c6efaaea2 GIT binary patch literal 5623 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 literal 0 HcmV?d00001 diff --git a/datacenterlight/static/datacenterlight/img/tayga.png b/datacenterlight/static/datacenterlight/img/tayga.png new file mode 100644 index 0000000000000000000000000000000000000000..07b9e092343e8fe0de8c4003e14ecbe103b084ba GIT binary patch literal 13034 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%0DwXud@>^PVd**;%;qrNpn?@3d`hZiR- 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 literal 0 HcmV?d00001 From ab5b35f06699800bdf41f3bfff71f4aee65deff8 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 13:10:45 +0530 Subject: [PATCH 08/92] Created seperate page for whydatacenterlight page --- .../datacenterlight/whydatacenterlight.html | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 datacenterlight/templates/datacenterlight/whydatacenterlight.html diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html new file mode 100644 index 00000000..e4b5f901 --- /dev/null +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -0,0 +1,220 @@ +{% extends "datacenterlight/base.html" %} +{% load staticfiles i18n%} +{% get_current_language as LANGUAGE_CODE %} + +{% block content %} + + + +

+
+
+
+
+

{% trans "Why Data Center Light?" %}

+
+
+
+
+
+
+
+
+
+
+
+

{% trans "Tech Stack" %}

+
+
+

{% trans "We are seriously open source." %}

+

{% blocktrans %} Our full software stack is opensource-We don't use anything that isn't opensource.
Yes we are that cool. {% endblocktrans %}

+
+
+
+
+
+ Devuan + {% trans "Our services run on" %} +
+
+ Prometheus + {% trans "Our monitoring" %} +
+
+ Ceph + {% trans "Our storage layer" %} +
+
+ Django + {% trans "Our web frontend" %} +
+
+ Opennebula + {% trans "Our cloud" %} +
+
+ Cdist byu ngleich + {% trans "Our configuration management system" %} +
+
+ Python + {% trans "Our awesome juice" %} +
+
+ Tayga + {% trans "Our NAT64 gateway" %} +
+ +
+
+
+ +
+
+
+
+
+ Opennebula +
+
+ Cdist byu ngleich +
+
+ Prometheus +
+
+
+
+

{% trans "We believe in giving back to FOSS community." %}

+

{% blocktrans %}Data Center Light is the child of free and open source(FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

+
+
+
+
+ +
+
+
+
+
+
+

{% trans "We bring the future to you" %}

+

{% blocktrans %} Data Center Light uses the most modren technologies out there.
+ Your VM needs only IPv6. Data Center Light provide
transparent two-way IPv6/IPv4 translation. + {% endblocktrans %}

+
+
+
+ 100% IPv6 +
+
+
+
+
+ 100%SSD SSD +
+
+
+

{% blocktrans %} No more hard disks with spinning metal plates!
+ Data Center Light uses only SSDs.
+ We keep things faster and lighter. {% endblocktrans %}

+
+
+
+ + + +
+
+ +
+ +
+ +
+ +
+
+

{% trans "Starting from only 15CHF per month. Try now." %}

+

{% trans "Actions speak louder words. Let's do it, try our VM now." %}

+
+ +
+
+
+ +
+
+ {% csrf_token %} +
+

{% trans "VM hosting" %}

+
+
+ 15 + CHF/{% trans "month" %} +
+

{% trans "VAT included" %}

+
+
+
+
+

{% trans "Hosted in Switzerland" %}

+
+
+ + + Core + +
+
+ + + GB RAM + +
+
+ + + {% trans "GB Storage (SSD)" %} + +
+
+ + +
+ + +
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+ + + + + {% endblock %} From f8dfe1b00ac2a0d0fbd5ec1647fdbe0311b79ba5 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 15:06:20 +0530 Subject: [PATCH 09/92] Added some style support on screen 768 --- .../datacenterlight/css/landing-page.css | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 6a42cd02..f90568cd 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -573,7 +573,7 @@ h6 { } /*Why DCL*/ .full-blue-bg-sec { - padding: 60px 0; + padding: 150px 0 60px 0; background: #2D457A; color: #fff; text-align: center; @@ -625,10 +625,26 @@ padding: 35px 0; .padding-vertical{ padding: 35px 0; } -.percent-text img{margin-left:20px;} +.percent-text img { + margin-left:20px; + } .space-block { padding: 30px 0; } +.dropdown-menu { + border: 1px solid #fff; + -webkit-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); + -moz-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); + box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); + display: none; + text-align: center; + border-radius: 4px !important; + padding: 5px !important; +} +.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover { + background: transparent; + text-decoration: underline !important; +} /*Pricing page*/ @@ -803,14 +819,23 @@ padding: 35px 0; .percent-text { font-size: 57px; } + #tech_stack h3 { + font-size: 30px; +line-height: 40px; + width: 100%; +} .tech-sub-sec h2 { font-size: 30px; +line-height: 40px; } .single-heading h2 { font-size: 50px; } .logo-wrap { padding: 10px; +} +.navbar-transparent li a { + color: #777 !important; } .intro-message { padding-bottom: 15%; From 524b9c809054ebd18f21b97d24cc9d33a0324ce6 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 15:07:07 +0530 Subject: [PATCH 10/92] Added trasparent menu dropdown script --- datacenterlight/static/datacenterlight/js/main.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/datacenterlight/static/datacenterlight/js/main.js b/datacenterlight/static/datacenterlight/js/main.js index 2a0cb4ac..d78c1d84 100644 --- a/datacenterlight/static/datacenterlight/js/main.js +++ b/datacenterlight/static/datacenterlight/js/main.js @@ -71,9 +71,13 @@ if($(window).scrollTop() > 10 ){ $(".navbar").removeClass("navbar-transparent"); $(".navbar-default .btn-link").css("color", "#777"); + $(".dropdown-menu").removeClass("navbar-transparent"); + $(".dropdown-menu > li > a").css("color", "#777"); }else{ $(".navbar").addClass("navbar-transparent"); $(".navbar-default .btn-link").css("color", "#fff"); + $(".dropdown-menu").addClass("navbar-transparent"); + $(".dropdown-menu > li > a").css("color", "#fff"); } } function _initNavUrl(){ From 4bf4d250c9b3df8c8c650b0d5c22e581513b80f6 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 15:08:12 +0530 Subject: [PATCH 11/92] Changed URLs of sections as pages that redirect to home page from whydatacerterlight page --- .../datacenterlight/includes/_navbar.html | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/includes/_navbar.html b/datacenterlight/templates/datacenterlight/includes/_navbar.html index 6a7e4002..69e07712 100644 --- a/datacenterlight/templates/datacenterlight/includes/_navbar.html +++ b/datacenterlight/templates/datacenterlight/includes/_navbar.html @@ -12,11 +12,11 @@ {% if request.resolver_match.url_name == "index" or request.resolver_match.url_name == "whydatacenterlight" %} - - + + {% else %} - - + + {% endif %}
@@ -24,19 +24,19 @@
-
+
+
@@ -68,9 +69,11 @@
+
-
-
+
+
+
@@ -91,9 +94,11 @@
+
-
-
+
+
+
@@ -110,22 +115,23 @@
-
- 100%SSD SSD -
-
-
-

{% blocktrans %} No more hard disks with spinning metal plates!
- Data Center Light uses only SSDs.
- We keep things faster and lighter. {% endblocktrans %}

+
+ 100%SSD SSD +
+
+
+

{% blocktrans %} No more hard disks with spinning metal plates!
+ Data Center Light uses only SSDs.
+ We keep things faster and lighter. {% endblocktrans %}

+
-
+
From 7cbc001d6a2b0bdb51fca207e0b10e7bd9b13053 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 15:15:19 +0530 Subject: [PATCH 13/92] Added style for 540 device and images --- datacenterlight/static/datacenterlight/css/landing-page.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index f90568cd..d76f3663 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -1015,6 +1015,12 @@ line-height: 40px; } @media(max-width:540px) { +.logo-wrap { + padding: 30px; +} +.percent-text { + text-align: center; +} .pricing-section .card { width: 90%; } From e84897db18993b79b750a3f4b98f91147de17226 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 17:13:02 +0530 Subject: [PATCH 14/92] Removed unnesassary BetaAccessForm class --- datacenterlight/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 949e2aa8..76cc54aa 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -182,7 +182,7 @@ class BetaProgramView(CreateView): class WhyDataCenterLightView(CreateView): template_name = "datacenterlight/whydatacenterlight.html" model = BetaAccess - form_class = BetaAccessForm + @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): try: From 1a994d1e70cf950d716780ef12a142e7483e4761 Mon Sep 17 00:00:00 2001 From: Geetha Mondi Date: Wed, 28 Jun 2017 17:52:19 +0530 Subject: [PATCH 15/92] Removed unnecassary href link from nav logo --- .../templates/datacenterlight/includes/_navbar.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/includes/_navbar.html b/datacenterlight/templates/datacenterlight/includes/_navbar.html index 69e07712..b907453c 100644 --- a/datacenterlight/templates/datacenterlight/includes/_navbar.html +++ b/datacenterlight/templates/datacenterlight/includes/_navbar.html @@ -15,8 +15,8 @@ {% else %} - - + + {% endif %}
From a3c3a5cd2e1bece294cd6b22bdce9e4c1fe544de Mon Sep 17 00:00:00 2001 From: PCoder Date: Thu, 29 Jun 2017 13:04:13 +0530 Subject: [PATCH 16/92] Changed the way we get info in dcl order_detail template --- .../templates/datacenterlight/order_detail.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index cb412558..c2c15894 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -1,7 +1,8 @@ {% extends "hosting/base_short.html" %} {% load staticfiles bootstrap3 %} {% load i18n %} -{% block content %} +{% load custom_tags %} +{% block content %}
{% if messages %} @@ -27,15 +28,16 @@

{% trans "Billed To:"%}

- {{user.name}}
- {{order.billing_address.street_address}},{{order.billing_address.postal_code}}
- {{order.billing_address.city}}, {{order.billing_address.country}}. + {% with request.session.billing_address_data as billing_address %} + {{request.session.user.name}}
{{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}
+ {{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}. + {% endwith %}
{% trans "Date"%}:
- {{order.created_at}}

+ {% now "jS F Y" %}

@@ -45,7 +47,7 @@
{% trans "Payment Method:"%}
{{order.cc_brand}} ending **** {{order.last4}}
- {{user.email}} + {{request.session.user.email}}
From 3313dab485979df7cc9f8fdf95e2a9a977dcdcf0 Mon Sep 17 00:00:00 2001 From: PCoder Date: Thu, 29 Jun 2017 13:05:06 +0530 Subject: [PATCH 17/92] Added get_value_from_dict filter to obtain values from a dict in templates --- datacenterlight/templatetags/custom_tags.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/datacenterlight/templatetags/custom_tags.py b/datacenterlight/templatetags/custom_tags.py index 915e68fe..e7b15b5b 100644 --- a/datacenterlight/templatetags/custom_tags.py +++ b/datacenterlight/templatetags/custom_tags.py @@ -21,4 +21,14 @@ def change_lang(context, lang=None, *args, **kwargs): activate(cur_language) - return "%s" % url \ No newline at end of file + return "%s" % url + +@register.filter('get_value_from_dict') +def get_value_from_dict(dict_data, key): + """ + usage example {{ your_dict|get_value_from_dict:your_key }} + """ + if key: + return dict_data.get(key) + else : + return None From a2153777e45c36307f8a1e9539c82e1521d14b49 Mon Sep 17 00:00:00 2001 From: PCoder Date: Thu, 29 Jun 2017 13:06:05 +0530 Subject: [PATCH 18/92] We do not have order created when in Order Confirmation page. So removed the id parameter in url --- datacenterlight/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/urls.py b/datacenterlight/urls.py index 65401b13..ca844278 100644 --- a/datacenterlight/urls.py +++ b/datacenterlight/urls.py @@ -9,7 +9,7 @@ urlpatterns = [ url(r'^/landing/?$', LandingProgramView.as_view(), name='landing'), url(r'^/pricing/?$', PricingView.as_view(), name='pricing'), url(r'^/payment/?$', PaymentOrderView.as_view(), name='payment'), - url(r'^/order-confirmation/(?P\d+)/?$', OrderConfirmationView.as_view(), name='order_confirmation'), + url(r'^/order-confirmation/?$', OrderConfirmationView.as_view(), name='order_confirmation'), url(r'^/order-success/?$', SuccessView.as_view(), name='order_success'), url(r'^/beta_access?$', BetaAccessView.as_view(), name='beta_access'), ] From cb6aeae1ae1e2a7f7c35cd61ed28ad84f4d9baa1 Mon Sep 17 00:00:00 2001 From: PCoder Date: Thu, 29 Jun 2017 13:08:24 +0530 Subject: [PATCH 19/92] Refactored the logic to OrderConfirmationView from the PaymentOrderView --- datacenterlight/views.py | 227 ++++++++++++++++++++------------------- 1 file changed, 115 insertions(+), 112 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index e4329b89..628d0c03 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -13,11 +13,12 @@ from django.core.exceptions import ValidationError from django.views.decorators.cache import cache_control from django.conf import settings from utils.forms import BillingAddressForm, UserBillingAddressForm +from utils.models import BillingAddress from membership.models import StripeCustomer from hosting.models import HostingOrder, HostingBill from utils.stripe_utils import StripeUtils from datetime import datetime -from membership.models import CustomUser, StripeCustomer +from membership.models import CustomUser, StripeCustomer, CreditCards from opennebula_api.models import OpenNebulaManager from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer @@ -322,13 +323,9 @@ class PaymentOrderView(FormView): if form.is_valid(): # Get billing address data billing_address_data = form.cleaned_data - context = self.get_context_data() - template = request.session.get('template') - specs = request.session.get('specs') - user = request.session.get('user') - vm_template_id = template.get('id', 1) - final_price = specs.get('price') token = form.cleaned_data.get('token') + user = request.session.get('user') + try: custom_user = CustomUser.objects.get(email=user.get('email')) except CustomUser.DoesNotExist: @@ -340,99 +337,20 @@ class PaymentOrderView(FormView): app='dcl', base_url=None, send_email=False) - # Get or create stripe customer customer = StripeCustomer.get_or_create(email=user.get('email'), - token=token) + token=token) if not customer: form.add_error("__all__", "Invalid credit card") return self.render_to_response(self.get_context_data(form=form)) # Create Billing Address billing_address = form.save() - - # Make stripe charge to a customer - stripe_utils = StripeUtils() - charge_response = stripe_utils.make_charge(amount=final_price, - customer=customer.stripe_id) - charge = charge_response.get('response_object') - - # Check if the payment was approved - if not charge: - context.update({ - 'paymentError': charge_response.get('error'), - 'form': form - }) - return render(request, self.template_name, context) - - charge = charge_response.get('response_object') - - # Create OpenNebulaManager - manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME, - password=settings.OPENNEBULA_PASSWORD) - - # Create a vm using logged user - vm_id = manager.create_vm( - template_id=vm_template_id, - specs=specs, - vm_name="{email}-{template_name}-{date}".format( - email=user.get('email'), - template_name=template.get('name'), - date=int(datetime.now().strftime("%s"))) - ) - - # Create a Hosting Order - order = HostingOrder.create( - price=final_price, - vm_id=vm_id, - customer=customer, - billing_address=billing_address - ) - - # Create a Hosting Bill - bill = HostingBill.create( - customer=customer, billing_address=billing_address) - - # Create Billing Address for User if he does not have one - if not customer.user.billing_addresses.count(): - billing_address_data.update({ - 'user': customer.user.id - }) - billing_address_user_form = UserBillingAddressForm( - billing_address_data) - billing_address_user_form.is_valid() - billing_address_user_form.save() - - # Associate an order with a stripe payment - order.set_stripe_charge(charge) - - # If the Stripe payment was successed, set order status approved - order.set_approved() - - vm = VirtualMachineSerializer(manager.get_vm(vm_id)).data - - context = { - 'name': user.get('name'), - 'email': user.get('email'), - 'cores': specs.get('cpu'), - 'memory': specs.get('memory'), - 'storage': specs.get('disk_size'), - 'price': specs.get('price'), - 'template': template.get('name'), - 'vm.name': vm['name'], - 'vm.id': vm['vm_id'], - 'order.id': order.id - } - email_data = { - 'subject': "Data Center Light Order from %s" % context['email'], - 'from_email': '(Data Center Light) Data Center Light Support ', - 'to': ['info@ungleich.ch'], - 'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]), - 'reply_to': [context['email']], - } - email = EmailMessage(**email_data) - email.send() - return HttpResponseRedirect(reverse('datacenterlight:order_confirmation', kwargs={'pk': order.id})) + request.session['billing_address_data'] = billing_address_data + request.session['billing_address'] = billing_address.id + request.session['token'] = token + request.session['customer'] = customer.id + return HttpResponseRedirect(reverse('datacenterlight:order_confirmation')) else: return self.form_invalid(form) @@ -440,25 +358,110 @@ class OrderConfirmationView(DetailView): template_name = "datacenterlight/order_detail.html" context_object_name = "order" model = HostingOrder - def get_context_data(self, **kwargs): - # Get context - context = super(DetailView, self).get_context_data(**kwargs) - obj = self.get_object() + + def get(self, request, *args, **kwargs): + if 'specs' not in request.session or 'user' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:index')) + print(request.session.get('billing_address_data')) + print(request.session.get('specs')) + stripe_customer_id = request.session.get('customer') + customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() + custom_user = CustomUser.objects.get(email=request.session.get('user').get('email')) + print(custom_user) + obj = CreditCards.objects.filter(user_id=custom_user.id).first() + print(obj) + return render(request, self.template_name, {}) + + def post(self, request, *args, **kwargs): + template = request.session.get('template') + specs = request.session.get('specs') + user = request.session.get('user') + customer = request.session.get('customer') + billing_address_data = request.session.get('billing_address_data') + billing_address_id = request.session.get('billing_address') + billing_address = BillingAddress.objects.filter(id=billing_address_id) + token = request.session.get('token') + vm_template_id = template.get('id', 1) + final_price = specs.get('price') + + # Make stripe charge to a customer + stripe_utils = StripeUtils() + charge_response = stripe_utils.make_charge(amount=final_price, + customer=customer.stripe_id) + charge = charge_response.get('response_object') + + # Check if the payment was approved + if not charge: + context.update({ + 'paymentError': charge_response.get('error'), + 'form': form + }) + return render(request, self.template_name, context) + + charge = charge_response.get('response_object') + + # Create OpenNebulaManager manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME, password=settings.OPENNEBULA_PASSWORD) - try: - vm = manager.get_vm(obj.vm_id) - context['vm'] = VirtualMachineSerializer(vm).data - context['next_url'] = reverse('datacenterlight:order_success') - except WrongIdError: - messages.error(self.request, - 'The VM you are looking for is unavailable at the moment. \ - Please contact Data Center Light support.' - ) - self.kwargs['error'] = 'WrongIdError' - context['error'] = 'WrongIdError' - except ConnectionRefusedError: - messages.error(self.request, - 'In order to create a VM, you need to create/upload your SSH KEY first.' - ) - return context + + # Create a vm using logged user + vm_id = manager.create_vm( + template_id=vm_template_id, + specs=specs, + vm_name="{email}-{template_name}-{date}".format( + email=user.get('email'), + template_name=template.get('name'), + date=int(datetime.now().strftime("%s"))) + ) + + # Create a Hosting Order + order = HostingOrder.create( + price=final_price, + vm_id=vm_id, + customer=customer, + billing_address=billing_address + ) + + # Create a Hosting Bill + bill = HostingBill.create( + customer=customer, billing_address=billing_address) + + # Create Billing Address for User if he does not have one + if not customer.user.billing_addresses.count(): + billing_address_data.update({ + 'user': customer.user.id + }) + billing_address_user_form = UserBillingAddressForm( + billing_address_data) + billing_address_user_form.is_valid() + billing_address_user_form.save() + + # Associate an order with a stripe payment + order.set_stripe_charge(charge) + + # If the Stripe payment was successed, set order status approved + order.set_approved() + + vm = VirtualMachineSerializer(manager.get_vm(vm_id)).data + + context = { + 'name': user.get('name'), + 'email': user.get('email'), + 'cores': specs.get('cpu'), + 'memory': specs.get('memory'), + 'storage': specs.get('disk_size'), + 'price': specs.get('price'), + 'template': template.get('name'), + 'vm.name': vm['name'], + 'vm.id': vm['vm_id'], + 'order.id': order.id + } + email_data = { + 'subject': "Data Center Light Order from %s" % context['email'], + 'from_email': '(Data Center Light) Data Center Light Support ', + 'to': ['info@ungleich.ch'], + 'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]), + 'reply_to': [context['email']], + } + email = EmailMessage(**email_data) + email.send() From 4fc11bbe17fcc03b1ed120af0b3522c9911d8f3f Mon Sep 17 00:00:00 2001 From: PCoder Date: Thu, 29 Jun 2017 13:14:13 +0530 Subject: [PATCH 20/92] Made WhyDataCenterLightView a subclass of the IndexView --- datacenterlight/views.py | 44 +++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 76cc54aa..205216e9 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -178,29 +178,6 @@ class BetaProgramView(CreateView): messages.add_message(self.request, messages.SUCCESS, self.success_message) return HttpResponseRedirect(self.get_success_url()) - -class WhyDataCenterLightView(CreateView): - template_name = "datacenterlight/whydatacenterlight.html" - model = BetaAccess - - @cache_control(no_cache=True, must_revalidate=True, no_store=True) - def get(self, request, *args, **kwargs): - try: - manager = OpenNebulaManager() - templates = manager.get_templates() - context = { - 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, - } - except: - messages.error( request, - 'We have a temporary problem to connect to our backend. \ - Please try again in a few minutes' - ) - context = { - 'error' : 'connection' - } - return render(request, self.template_name, context) - class IndexView(CreateView): template_name = "datacenterlight/index.html" model = BetaAccess @@ -321,6 +298,27 @@ class IndexView(CreateView): messages.add_message(self.request, messages.SUCCESS, self.success_message) return super(IndexView, self).form_valid(form) +class WhyDataCenterLightView(IndexView): + template_name = "datacenterlight/whydatacenterlight.html" + model = BetaAccess + + @cache_control(no_cache=True, must_revalidate=True, no_store=True) + def get(self, request, *args, **kwargs): + try: + manager = OpenNebulaManager() + templates = manager.get_templates() + context = { + 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, + } + except: + messages.error( request, + 'We have a temporary problem to connect to our backend. \ + Please try again in a few minutes' + ) + context = { + 'error' : 'connection' + } + return render(request, self.template_name, context) class PaymentOrderView(FormView): template_name = 'hosting/payment.html' From e7fea1ea390658babd1368a3ad680b11a654a070 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 14:49:03 +0530 Subject: [PATCH 21/92] Changed the background pattren of Whydatacenterlight page header --- .../templates/datacenterlight/whydatacenterlight.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index 08275a82..faa82cdc 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -6,7 +6,8 @@ -
+
+
@@ -17,6 +18,7 @@
+
From b9222c71ad4e34372b713969391498234a51da6b Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 14:50:14 +0530 Subject: [PATCH 22/92] Nezwly Added styles for whydatacenterlight page header --- .../datacenterlight/css/landing-page.css | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index d76f3663..f7eaf051 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -572,11 +572,34 @@ h6 { right: 0; } /*Why DCL*/ -.full-blue-bg-sec { - padding: 150px 0 60px 0; - background: #2D457A; +.full-whydcl-sec { color: #fff; text-align: center; + background-image: -ms-linear-gradient(right, #29427A 50%, #4F6699 100%); + background-image: -moz-linear-gradient(right, #29427A 50%, #4F6699 100%); + background-image: -o-linear-gradient(right, #29427A 50%, #4F6699 100%); + background-image: -webkit-gradient(linear, right top, left top, color-stop(50, #29427A), color-stop(100, #4F6699)); + background-image: -webkit-linear-gradient(right, #29427A 50%, #4F6699 100%); + background-image: linear-gradient(to left, #29427A 50%, #4F6699 100%); +} +.whydcl-header { + padding: 150px 0 150px 0; + text-align: center; + color: #f8f8f8; + background: url(../img/whydcl-pattren.jpg) no-repeat center center; + background-size: cover; + position: relative; + background-attachment: fixed; +} +.whydcl-header::before { + content: ""; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(90, 116, 175,0.85); + /*background: rgba(45,70,122,0.8);*/ } .single-heading h2 { font-size: 65px; From 80e463c3bfdcd376edf9c1c2de9fc97ac1134672 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 14:51:30 +0530 Subject: [PATCH 23/92] Added image whydatacenterlight heder --- .../datacenterlight/img/whydcl-pattren.jpg | Bin 0 -> 65065 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg diff --git a/datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg b/datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d15a828c88d6fdd33563b23cf9f61928d773065 GIT binary patch literal 65065 zcmbTd1yr2R5+^#iI}Gl@eQ< VEhVFm`*kf0$!g1Zcm5Fo)NxI==wYal?dAQM6$ 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
@U}`1h1mW1qXW%9 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 z
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 Date: Thu, 29 Jun 2017 13:53:10 +0200 Subject: [PATCH 24/92] Fixed typos --- .../templates/datacenterlight/whydatacenterlight.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index 08275a82..ac0891f5 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -116,7 +116,7 @@
- 100%SSD SSD + 100% SSD SSD
@@ -142,7 +142,7 @@

{% trans "Starting from only 15CHF per month. Try now." %}

-

{% trans "Actions speak louder words. Let's do it, try our VM now." %}

+

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

From 7eaaea58e346fb56488ce4b1baf9466995bffd0e Mon Sep 17 00:00:00 2001 From: geethamondi Date: Thu, 29 Jun 2017 14:00:31 +0200 Subject: [PATCH 25/92] Fixed some spelling mistakes --- .../datacenterlight/whydatacenterlight.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index ac0891f5..7f6ef4b9 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -28,7 +28,7 @@

{% trans "We are seriously open source." %}

-

{% blocktrans %} Our full software stack is opensource-We don't use anything that isn't opensource.
Yes we are that cool. {% endblocktrans %}

+

{% blocktrans %} Our full software stack is opensource – We don't use anything that isn't opensource.
Yes, we are that cool. {% endblocktrans %}

@@ -88,8 +88,8 @@
-

{% trans "We believe in giving back to FOSS community." %}

-

{% blocktrans %}Data Center Light is the child of free and open source(FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

+

{% trans "We believe in giving back to the FOSS community." %}

+

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

@@ -104,8 +104,8 @@

{% trans "We bring the future to you" %}

-

{% blocktrans %} Data Center Light uses the most modren technologies out there.
- Your VM needs only IPv6. Data Center Light provide
transparent two-way IPv6/IPv4 translation. +

{% blocktrans %} Data Center Light uses the most modern technologies out there.
+ Your VM needs only IPv6. Data Center Light provides
transparent two-way IPv6/IPv4 translation. {% endblocktrans %}

@@ -120,7 +120,7 @@
-

{% blocktrans %} No more hard disks with spinning metal plates!
+

{% blocktrans %} No more spinning metal plates!
Data Center Light uses only SSDs.
We keep things faster and lighter. {% endblocktrans %}

From e7c652588aeebad29165d09aa8fcd6276ad97aa9 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 17:34:15 +0530 Subject: [PATCH 26/92] Reformated the code --- .../static/datacenterlight/css/landing-page.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index f7eaf051..97705329 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -632,7 +632,7 @@ tech-sub-sec h2 { padding: 20px 40px 30px 40px; } .btm-space{ -padding-bottom: 8px; + padding-bottom: 8px; } .percent-text { font-size: 60px; @@ -643,14 +643,14 @@ padding-bottom: 8px; line-height: 55px; } .space-middle{ -padding: 35px 0; + padding: 35px 0; } .padding-vertical{ -padding: 35px 0; + padding: 35px 0; } .percent-text img { margin-left:20px; - } +} .space-block { padding: 30px 0; } From 445e8e3583a864bb1ef5a14e69be3d19c98e6f99 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 20:25:30 +0530 Subject: [PATCH 27/92] Adjusted some sections as per templates --- .../datacenterlight/whydatacenterlight.html | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index d0376024..2be6e9a3 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -30,7 +30,7 @@

{% trans "We are seriously open source." %}

-

{% blocktrans %} Our full software stack is opensource – We don't use anything that isn't opensource.
Yes, we are that cool. {% endblocktrans %}

+

{% blocktrans %} Our full software stack is opensource – We don't use anything that isn't opensource.
Yes, we are that cool. {% endblocktrans %}

@@ -77,21 +77,21 @@
-
-
+
+
Opennebula
-
+
Cdist byu ngleich
-
+
Prometheus
-
+

{% trans "We believe in giving back to the FOSS community." %}

-

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

+

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

@@ -103,26 +103,26 @@
-
+
-

{% trans "We bring the future to you" %}

-

{% blocktrans %} Data Center Light uses the most modern technologies out there.
+

{% trans "We bring the future to you." %}

+

{% blocktrans %} Data Center Light uses the most modern technologies out there.
Your VM needs only IPv6. Data Center Light provides
transparent two-way IPv6/IPv4 translation. {% endblocktrans %}

-
+
100% IPv6
-
+
100% SSD SSD
-
+
-

{% blocktrans %} No more spinning metal plates!
+

{% blocktrans %} No more spinning metal plates!
Data Center Light uses only SSDs.
We keep things faster and lighter. {% endblocktrans %}

@@ -144,7 +144,7 @@

{% trans "Starting from only 15CHF per month. Try now." %}

-

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

+

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

From 059f1bb680a797e8ca7f4f2b679b4bbecf34e2da Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 20:30:36 +0530 Subject: [PATCH 28/92] Changed font-family 'Lato-Regular' to 'Lato-light' except Navbar and order form and changed some styles as per template --- .../datacenterlight/css/landing-page.css | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 97705329..6e5c9410 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -20,7 +20,7 @@ h3, h4, h5, h6 { - font-family: 'Lato-Regular', sans-serif; + font-family: 'Lato-light', sans-serif; font-weight: 300; } /*blue light #5A74AF*/ @@ -108,10 +108,12 @@ h6 { } .navbar-default .navbar-nav>li>a { cursor: pointer; + font-family: 'Lato-Regular', sans-serif; } .navbar-transparent .navbar-nav>li>a { color: #fff; cursor: pointer; + font-family: 'Lato-Regular', sans-serif; } .navbar-transparent .navbar-nav>li>a:hover { color: #fff; @@ -145,11 +147,13 @@ h6 { } .navbar-transparent .nav-language .select-language{ color: #fff; + font-family: 'Lato-Regular', sans-serif; } .nav-language .select-language span{ margin-left: 5px; margin-right: 5px; + font-family: 'Lato-Regular', sans-serif; } .nav-language .drop-language{ @@ -171,6 +175,7 @@ h6 { } .nav-language .drop-language a{ cursor: pointer; + font-family: 'Lato-Regular', sans-serif; } .navbar-transparent .nav-language .drop-language{ background: transparent; @@ -178,6 +183,7 @@ h6 { } .navbar-transparent .nav-language .drop-language a{ color: #fff; + font-family: 'Lato-Regular', sans-serif; } .nav-language:hover .drop-language{ display: block; @@ -610,7 +616,7 @@ h6 { background: #fff; } #tech_stack h3 { - font-size: 45px; + font-size: 42px; width: 70%; } hr.thick-divider { @@ -628,14 +634,14 @@ tech-sub-sec h2 { } .logo-wrap { text-align: center; - min-height: 125px; + min-height: 140px; padding: 20px 40px 30px 40px; } .btm-space{ padding-bottom: 8px; } .percent-text { - font-size: 60px; + font-size: 53px; color: #999; } .tech-sub-sec h2 { @@ -668,7 +674,18 @@ tech-sub-sec h2 { background: transparent; text-decoration: underline !important; } - +.logo-wrap .logo-caption { + padding-top: 20px; + display: inline-block; + color: #999 !important; +} +.lead-light { + color: #999 !important; + line-height: 32px !important; +} +.logo-wrap-1 { + padding-top: 50px; +} /*Pricing page*/ .price-calc-section{ @@ -676,6 +693,7 @@ tech-sub-sec h2 { background: -webkit-linear-gradient(top, #f0f4f7, #fff) no-repeat; background: linear-gradient(to bottom, #f0f4f7, #fff) no-repeat; display: flex; + font-family: 'Lato-Regular', sans-serif; } .price-calc-section .text{ width: 50%; @@ -731,6 +749,7 @@ tech-sub-sec h2 { padding: 15px 40px; } .price-calc-section .card .title h3{ + font-family: 'Lato-Regular', sans-serif; } .price-calc-section .card .price{ background: #5A74AF; From d2457f71e4f5e97c8acee3d9f59844512680a025 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 21:54:45 +0530 Subject: [PATCH 29/92] Changed some styles for font sizes and dropdown --- .../static/datacenterlight/css/landing-page.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 6e5c9410..4f81bf06 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -451,7 +451,8 @@ h6 { text-align: left; } .pricing-section .text .section-heading{ - font-size: 50px; + /*font-size: 50px;*/ + font-size: 40px; line-height: 50px; padding-bottom: 25px; color: #3a3a3a; @@ -686,6 +687,12 @@ tech-sub-sec h2 { .logo-wrap-1 { padding-top: 50px; } +.dropdown-menu > li > a { + padding: 1px 10px !important; +} +.dropdown-menu{ + left: 0 !important; +} /*Pricing page*/ .price-calc-section{ From 4ec47c687b0225963a9598779505e876319fb771 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Thu, 29 Jun 2017 21:56:09 +0530 Subject: [PATCH 30/92] Added dropdown toggle function for highlets menu --- datacenterlight/templates/datacenterlight/includes/_navbar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/templates/datacenterlight/includes/_navbar.html b/datacenterlight/templates/datacenterlight/includes/_navbar.html index b907453c..239159f0 100644 --- a/datacenterlight/templates/datacenterlight/includes/_navbar.html +++ b/datacenterlight/templates/datacenterlight/includes/_navbar.html @@ -24,7 +24,7 @@
+
+
+ From 2ad984504c584320ac7fe83125f2024df48028a3 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Fri, 30 Jun 2017 01:23:35 +0300 Subject: [PATCH 34/92] Add GOOGLE_ANALYTICS_PROPERTY_IDS for dynamic set ID --- datacenterlight/templates/datacenterlight/base.html | 6 +++--- .../templates/datacenterlight/order_detail.html | 3 +-- dynamicweb/settings/base.py | 9 ++++++--- .../google_analytics.html | 6 ++---- {datacenterlight => utils}/context_processor.py | 12 ++++++------ 5 files changed, 18 insertions(+), 18 deletions(-) rename datacenterlight/templates/datacenterlight/includes/_google_analytics.html => templates/google_analytics.html (75%) rename {datacenterlight => utils}/context_processor.py (52%) diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html index bf0e0ca0..f4f659df 100644 --- a/datacenterlight/templates/datacenterlight/base.html +++ b/datacenterlight/templates/datacenterlight/base.html @@ -33,6 +33,9 @@ + + {% include "google_analytics.html" %} + @@ -47,9 +50,6 @@ {% include "datacenterlight/includes/_footer.html" %} - - {% include "datacenterlight/includes/_google_analytics.html" %} - diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index 8b53df5d..24511463 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -1,8 +1,7 @@ {% extends "hosting/base_short.html" %} {% load staticfiles bootstrap3 %} {% load i18n %} -{% block content %} -{% include 'datacenterlight/includes/_google_analytics.html' %} +{% block content %}
{% if messages %}
diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index f3a80470..31723853 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -138,6 +138,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(PROJECT_DIR, 'cms_templates/'), + os.path.join(PROJECT_DIR, 'templates'), os.path.join(PROJECT_DIR, 'cms_templates/djangocms_blog/'), os.path.join(PROJECT_DIR, 'membership'), os.path.join(PROJECT_DIR, 'hosting/templates/'), @@ -161,7 +162,7 @@ TEMPLATES = [ "django.contrib.messages.context_processors.messages", 'sekizai.context_processors.sekizai', 'cms.context_processors.cms_settings', - 'datacenterlight.context_processor.google_analytics', + 'utils.context_processor.google_analytics', ], }, }, @@ -512,5 +513,7 @@ DCL_TEXT = env('DCL_TEXT') DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') # Settings for Google analytics -GOOGLE_ANALYTICS_PROPERTY_ID = 'UA-62285904-9' -GOOGLE_ANALYTICS_DOMAIN = 'auto' +GOOGLE_ANALYTICS_PROPERTY_IDS = { + 'datacenterlight.ch': 'UA-62285904-9', + 'digitalglarus.ch': 'UA-62285904-2' +} diff --git a/datacenterlight/templates/datacenterlight/includes/_google_analytics.html b/templates/google_analytics.html similarity index 75% rename from datacenterlight/templates/datacenterlight/includes/_google_analytics.html rename to templates/google_analytics.html index d074dfd3..64dbae40 100644 --- a/datacenterlight/templates/datacenterlight/includes/_google_analytics.html +++ b/templates/google_analytics.html @@ -1,4 +1,3 @@ - {% if GOOGLE_ANALYTICS_PROPERTY_ID %} {% else %} -{% endif %} - \ No newline at end of file +{% endif %} \ No newline at end of file diff --git a/datacenterlight/context_processor.py b/utils/context_processor.py similarity index 52% rename from datacenterlight/context_processor.py rename to utils/context_processor.py index b49ea364..43c27336 100644 --- a/datacenterlight/context_processor.py +++ b/utils/context_processor.py @@ -6,11 +6,11 @@ def google_analytics(request): Use the variables returned in this function to render your Google Analytics tracking code template. """ - ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_ID', False) - ga_domain = getattr(settings, 'GOOGLE_ANALYTICS_DOMAIN', False) - if not settings.DEBUG and ga_prop_id and ga_domain: + host = request.get_host() + ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS', False).get(host) + print(ga_prop_id) + if ga_prop_id: return { - 'GOOGLE_ANALYTICS_PROPERTY_ID': ga_prop_id, - 'GOOGLE_ANALYTICS_DOMAIN': ga_domain, + 'GOOGLE_ANALYTICS_PROPERTY_ID': ga_prop_id } - return {} + return {} \ No newline at end of file From ebf8b0646d7a3ca94b79307dee7406ad497a15ff Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Fri, 30 Jun 2017 01:33:12 +0300 Subject: [PATCH 35/92] Fix not add analytics if DEBUG=True --- utils/context_processor.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/utils/context_processor.py b/utils/context_processor.py index 43c27336..740591ba 100644 --- a/utils/context_processor.py +++ b/utils/context_processor.py @@ -8,9 +8,8 @@ def google_analytics(request): """ host = request.get_host() ga_prop_id = getattr(settings, 'GOOGLE_ANALYTICS_PROPERTY_IDS', False).get(host) - print(ga_prop_id) - if ga_prop_id: + if not settings.DEBUG and ga_prop_id: return { 'GOOGLE_ANALYTICS_PROPERTY_ID': ga_prop_id } - return {} \ No newline at end of file + return {} From d0376f35f8e1ab4f013fc72dd35fa8bb2ca156b5 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 11:05:34 +0530 Subject: [PATCH 36/92] Now getting info in Order Confirmation from session and context --- .../datacenterlight/order_detail.html | 60 ++++++++++--------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index c2c15894..1c3dd6b7 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -20,20 +20,20 @@ {% if not error %}
-
-

{% trans "Confirm Order"%}

{% trans "Order #"%} {{order.id}}

-
-
-
-
-
+
+

{% trans "Confirm Order"%}

+
+
+
+
+

{% trans "Billed To:"%}

{% with request.session.billing_address_data as billing_address %} - {{request.session.user.name}}
{{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}
+ {{request.session.user.name}}
{{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}
{{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}. {% endwith %} -
-
+
+
{% trans "Date"%}:
@@ -41,17 +41,17 @@
-
-
-
-
- {% trans "Payment Method:"%}
- {{order.cc_brand}} ending **** {{order.last4}}
- {{request.session.user.email}} -
-
-
-
+
+
+
+
+ {% trans "Payment Method:"%}
+ {{cc_brand}} ending **** {{cc_last4}}
+ {{request.session.user.email}} +
+
+
+
@@ -59,19 +59,21 @@

{% trans "Order summary"%}


-

{% trans "Cores"%} {{vm.cores}}

-
-

{% trans "Memory"%} {{vm.memory}} GB

-
-

{% trans "Disk space"%} {{vm.disk_size}} GB

-
-

{% trans "Total"%}

{{vm.price}} CHF

+ {% with request.session.specs as vm %} +

{% trans "Cores"%} {{vm.cpu}}

+
+

{% trans "Memory"%} {{vm.memory}} GB

+
+

{% trans "Disk space"%} {{vm.disk_size}} GB

+
+

{% trans "Total"%}

{{vm.price}} CHF

+ {% endwith %}

{% url 'datacenterlight:payment' as payment_url %} {% if payment_url in request.META.HTTP_REFERER %} {% endif %}
From 4c3d8627b161204e4c10e10f8f2f91e051fe2e12 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 11:06:58 +0530 Subject: [PATCH 37/92] Added code to fetch cc data and put in context --- datacenterlight/views.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 628d0c03..8e8858c6 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -362,15 +362,15 @@ class OrderConfirmationView(DetailView): def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) - print(request.session.get('billing_address_data')) - print(request.session.get('specs')) stripe_customer_id = request.session.get('customer') customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() - custom_user = CustomUser.objects.get(email=request.session.get('user').get('email')) - print(custom_user) - obj = CreditCards.objects.filter(user_id=custom_user.id).first() - print(obj) - return render(request, self.template_name, {}) + stripe_utils = StripeUtils() + card_details = stripe_utils.get_card_details(customer.stripe_id, request.session.get('token')) + context = { + 'cc_last4' : card_details.get('response_object').get('last4'), + 'cc_brand' : card_details.get('response_object').get('brand') + } + return render(request, self.template_name, context) def post(self, request, *args, **kwargs): template = request.session.get('template') From d161a285b8a26b47a3ff70e1bd9bde6e75440d16 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 11:08:00 +0530 Subject: [PATCH 38/92] Added get_card_details function to stripe_utils --- utils/stripe_utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py index 29b45d8e..3b20b708 100644 --- a/utils/stripe_utils.py +++ b/utils/stripe_utils.py @@ -77,6 +77,16 @@ class StripeUtils(object): } return new_card_data + @handleStripeError + def get_card_details(self, customer_id, token): + customer = stripe.Customer.retrieve(customer_id) + credit_card_raw_data = customer.sources.data.pop() + card_details = { + 'last4': credit_card_raw_data.last4, + 'brand': credit_card_raw_data.brand + } + return card_details + def check_customer(self, id, user, token): customers = self.stripe.Customer.all() if not customers.get('data'): From 9431e9846c9d88ed0ed7cd7ec9ffd370a32eae79 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Fri, 30 Jun 2017 08:44:39 +0300 Subject: [PATCH 39/92] Add middleware for fix "get_host() method fails when the host is behind multiple proxies" --- dynamicweb/settings/base.py | 4 +++- utils/middleware.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 utils/middleware.py diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index 31723853..08ed7fe5 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -118,6 +118,7 @@ INSTALLED_APPS = ( MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', + 'utils.middleware.MultipleProxyMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -515,5 +516,6 @@ DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') # Settings for Google analytics GOOGLE_ANALYTICS_PROPERTY_IDS = { 'datacenterlight.ch': 'UA-62285904-9', - 'digitalglarus.ch': 'UA-62285904-2' + 'digitalglarus.ch': 'UA-62285904-2', + '127.0.0.1:8000': 'test' } diff --git a/utils/middleware.py b/utils/middleware.py new file mode 100644 index 00000000..d37bdbfd --- /dev/null +++ b/utils/middleware.py @@ -0,0 +1,17 @@ +class MultipleProxyMiddleware(object): + FORWARDED_FOR_FIELDS = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED_HOST', + 'HTTP_X_FORWARDED_SERVER', + ] + + def process_request(self, request): + """ + Rewrites the proxy headers so that only the most + recent proxy is used. + """ + for field in self.FORWARDED_FOR_FIELDS: + if field in request.META: + if ',' in request.META[field]: + parts = request.META[field].split(',') + request.META[field] = parts[-1].strip() \ No newline at end of file From d32d2a89767f338b9daae8fedef6be5bc341b537 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:06:41 +0530 Subject: [PATCH 40/92] Added a form in order confirmation page --- datacenterlight/templates/datacenterlight/order_detail.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index 1c3dd6b7..affb8ef5 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -70,12 +70,12 @@ {% endwith %}

- {% url 'datacenterlight:payment' as payment_url %} - {% if payment_url in request.META.HTTP_REFERER %} +
+ {% csrf_token %} - {% endif %} +
{% endif %} From 3eca55a32a89742bb1e0183f42d847a97f0b1420 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:08:07 +0530 Subject: [PATCH 41/92] Fixed billing address bug. Fixed back button issues in the new flow --- datacenterlight/views.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 8e8858c6..cd2aa660 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -32,9 +32,14 @@ class SuccessView(TemplateView): def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) - else : - del request.session['specs'] - del request.session['user'] + elif 'token' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:payment')) + elif 'order_confirmation' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:order_confirmation')) + else: + for session_var in ['specs', 'user', 'template', 'billing_address', 'billing_address_data', 'token', 'customer']: + if session_var in request.session: + del request.session[session_var] return render(request, self.template_name) class PricingView(TemplateView): @@ -356,12 +361,16 @@ class PaymentOrderView(FormView): class OrderConfirmationView(DetailView): template_name = "datacenterlight/order_detail.html" + payment_template_name = 'hosting/payment.html' context_object_name = "order" model = HostingOrder - + + @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) + if 'token' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:payment')) stripe_customer_id = request.session.get('customer') customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() stripe_utils = StripeUtils() @@ -371,15 +380,16 @@ class OrderConfirmationView(DetailView): 'cc_brand' : card_details.get('response_object').get('brand') } return render(request, self.template_name, context) - + def post(self, request, *args, **kwargs): template = request.session.get('template') specs = request.session.get('specs') user = request.session.get('user') - customer = request.session.get('customer') + stripe_customer_id = request.session.get('customer') + customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() billing_address_data = request.session.get('billing_address_data') billing_address_id = request.session.get('billing_address') - billing_address = BillingAddress.objects.filter(id=billing_address_id) + billing_address = BillingAddress.objects.filter(id=billing_address_id).first() token = request.session.get('token') vm_template_id = template.get('id', 1) final_price = specs.get('price') @@ -393,10 +403,11 @@ class OrderConfirmationView(DetailView): # Check if the payment was approved if not charge: context.update({ - 'paymentError': charge_response.get('error'), - 'form': form + 'paymentError': charge_response.get('error') + # TODO add logic in payment form to autofill data + #'form': form }) - return render(request, self.template_name, context) + return render(request, self.payment_template_name, context) charge = charge_response.get('response_object') @@ -404,7 +415,7 @@ class OrderConfirmationView(DetailView): manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME, password=settings.OPENNEBULA_PASSWORD) - # Create a vm using logged user + # Create a vm using oneadmin, also specify the name vm_id = manager.create_vm( template_id=vm_template_id, specs=specs, @@ -465,3 +476,5 @@ class OrderConfirmationView(DetailView): } email = EmailMessage(**email_data) email.send() + request.session['order_confirmation'] = True + return HttpResponseRedirect(reverse('datacenterlight:order_success')) From 1deeec4c3345c8d35af645bd637a511660990700 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:18:31 +0530 Subject: [PATCH 42/92] Added the locale time code to new flow order detail --- .../templates/datacenterlight/order_detail.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index affb8ef5..00aa840f 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -37,7 +37,7 @@
{% trans "Date"%}:
- {% now "jS F Y" %}

+ {% now "Y-m-d H:i" %}

@@ -80,4 +80,16 @@
{% endif %}
+ + + {%endblock%} From 2350247cdb145dd12d90ce3fb6451a8189308f9a Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:27:18 +0530 Subject: [PATCH 43/92] Removed unused code --- datacenterlight/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index cd2aa660..49891730 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -18,7 +18,7 @@ from membership.models import StripeCustomer from hosting.models import HostingOrder, HostingBill from utils.stripe_utils import StripeUtils from datetime import datetime -from membership.models import CustomUser, StripeCustomer, CreditCards +from membership.models import CustomUser, StripeCustomer from opennebula_api.models import OpenNebulaManager from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer @@ -344,7 +344,7 @@ class PaymentOrderView(FormView): # Get or create stripe customer customer = StripeCustomer.get_or_create(email=user.get('email'), - token=token) + token=token) if not customer: form.add_error("__all__", "Invalid credit card") return self.render_to_response(self.get_context_data(form=form)) From 699326dc57275eac4dd6144658a77ea10d6cf867 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:33:28 +0530 Subject: [PATCH 44/92] Made to return empty string for the template filter get_value_from_dict instead of None --- datacenterlight/templatetags/custom_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/templatetags/custom_tags.py b/datacenterlight/templatetags/custom_tags.py index e7b15b5b..ed59af9a 100644 --- a/datacenterlight/templatetags/custom_tags.py +++ b/datacenterlight/templatetags/custom_tags.py @@ -31,4 +31,4 @@ def get_value_from_dict(dict_data, key): if key: return dict_data.get(key) else : - return None + return "" From 160df7685ca22bdeb7e802f2979bf720e7838738 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 30 Jun 2017 12:47:04 +0530 Subject: [PATCH 45/92] Refactored dcl text and support email --- datacenterlight/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 49891730..ffc16eb9 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -468,8 +468,8 @@ class OrderConfirmationView(DetailView): 'order.id': order.id } email_data = { - 'subject': "Data Center Light Order from %s" % context['email'], - 'from_email': '(Data Center Light) Data Center Light Support ', + 'subject': settings.DCL_TEXT + " Order from %s" % context['email'], + 'from_email': settings.DCL_SUPPORT_FROM_ADDRESS, 'to': ['info@ungleich.ch'], 'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]), 'reply_to': [context['email']], From 6a96a86fd1276cabcc54059791092bf7c23ea0c5 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Fri, 30 Jun 2017 13:55:55 +0530 Subject: [PATCH 46/92] Fixed paragraph text back to old color --- .../templates/datacenterlight/whydatacenterlight.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index 2be6e9a3..ee3264e0 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -30,7 +30,7 @@

{% trans "We are seriously open source." %}

-

{% blocktrans %} Our full software stack is opensource – We don't use anything that isn't opensource.
Yes, we are that cool. {% endblocktrans %}

+

{% blocktrans %} Our full software stack is opensource – We don't use anything that isn't opensource.
Yes, we are that cool. {% endblocktrans %}

@@ -91,7 +91,7 @@

{% trans "We believe in giving back to the FOSS community." %}

-

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

+

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

@@ -106,7 +106,7 @@

{% trans "We bring the future to you." %}

-

{% blocktrans %} Data Center Light uses the most modern technologies out there.
+

{% blocktrans %} Data Center Light uses the most modern technologies out there.
Your VM needs only IPv6. Data Center Light provides
transparent two-way IPv6/IPv4 translation. {% endblocktrans %}

@@ -122,7 +122,7 @@
-

{% blocktrans %} No more spinning metal plates!
+

{% blocktrans %} No more spinning metal plates!
Data Center Light uses only SSDs.
We keep things faster and lighter. {% endblocktrans %}

@@ -144,7 +144,7 @@

{% trans "Starting from only 15CHF per month. Try now." %}

-

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

+

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

From 34395f68eb6a34bead3bd1a1ffa0b04514d95c47 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Fri, 30 Jun 2017 14:42:10 +0530 Subject: [PATCH 47/92] Fixed lead text align with 100% IPv6 --- .../templates/datacenterlight/whydatacenterlight.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index ee3264e0..d8ef8b67 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -103,15 +103,15 @@
+
+

{% trans "We bring the future to you." %}

+
-
-

{% trans "We bring the future to you." %}

{% blocktrans %} Data Center Light uses the most modern technologies out there.
Your VM needs only IPv6. Data Center Light provides
transparent two-way IPv6/IPv4 translation. {% endblocktrans %}

-
-
+
100% IPv6
From 646f1b07601d8f6363c1953d5620ed0f54682d5c Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Fri, 30 Jun 2017 14:44:01 +0530 Subject: [PATCH 48/92] Fixed dropdown text alinment, Why data center Light header background and some alignment issues --- .../datacenterlight/css/landing-page.css | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 81fd2e08..e8698244 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -188,6 +188,7 @@ h6 { .nav-language:hover .drop-language{ display: block; } + .intro-header { height: 100vh; text-align: center; @@ -593,7 +594,7 @@ h6 { padding: 150px 0 150px 0; text-align: center; color: #f8f8f8; - background: url(../img/whydcl-pattren.jpg) no-repeat center center; + background: url(../img/pattern.jpg) no-repeat center center; background-size: cover; position: relative; background-attachment: fixed; @@ -642,7 +643,7 @@ tech-sub-sec h2 { padding-bottom: 8px; } .percent-text { - font-size: 53px; + font-size: 50px; color: #999; } .tech-sub-sec h2 { @@ -697,6 +698,11 @@ tech-sub-sec h2 { background: transparent; color: #fff; } +.dropdown-menu > li > a { + font-size: 13px; + font-weight: 300; + font-family: 'Lato-Regular', sans-serif; +} /*Pricing page*/ @@ -854,13 +860,19 @@ tech-sub-sec h2 { font-size: 17px; margin: 0 8px; } -@media(min-width:767px) { - .visible-desktop{ - display:block !important; - } - .hidden-desktop{ - display:none !important; - } +@media(max-width:767px) { + .percent-text { + font-size: 50px; + } + #tech_stack h3 { + font-size: 30px; + line-height: 40px; + width: 100%; + } + .navbar-nav .open .dropdown-menu { + text-align: left; + font-size: 12px; +} } @media(max-width:990px) { .pricing-section .text { @@ -877,20 +889,8 @@ tech-sub-sec h2 { } @media(max-width:768px) { - .visible-mobile{ - display:block !important; - } - .hidden-mobile{ - display:none !important; - } - - .percent-text { - font-size: 57px; - } - #tech_stack h3 { - font-size: 30px; -line-height: 40px; - width: 100%; +.percent-text { + font-size: 43px; } .tech-sub-sec h2 { font-size: 30px; @@ -946,7 +946,7 @@ line-height: 40px; display: none; } .navbar-transparent .navbar-nav>li>a { - font-size: 15px; + font-size: 14px; color: #777; } .nav-language:hover{ @@ -1110,6 +1110,10 @@ line-height: 40px; font-size: 15px; margin-left: 0px; } + .pull-left.space-middle { + width: 50%; + padding: 20px; +} } From 3a26b9308291eff84fa854318708e391f9175325 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Fri, 30 Jun 2017 21:18:45 +0530 Subject: [PATCH 49/92] Fixed Lato light font and navbar alignment --- .../datacenterlight/css/landing-page.css | 27 +++++++++++++++++-- .../datacenterlight/includes/_navbar.html | 14 +++++----- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index e8698244..4f5d5a01 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -7,6 +7,7 @@ font-family: 'Lato-Regular'; src: url('../fonts/Lato/Lato-Regular.ttf'); } + body, html { width: 100%; @@ -20,7 +21,7 @@ h3, h4, h5, h6 { - font-family: 'Lato-light', sans-serif; + font-family: 'Lato', sans-serif; font-weight: 300; } /*blue light #5A74AF*/ @@ -453,7 +454,7 @@ h6 { } .pricing-section .text .section-heading{ /*font-size: 50px;*/ - font-size: 40px; + font-size: 48px; line-height: 50px; padding-bottom: 25px; color: #3a3a3a; @@ -693,6 +694,9 @@ tech-sub-sec h2 { } .dropdown-menu{ left: 0 !important; + min-width: 130px; + text-align: left; + margin-left: 15px; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:focus, .navbar-default .navbar-nav > .open > a:hover { background: transparent; @@ -703,6 +707,11 @@ tech-sub-sec h2 { font-weight: 300; font-family: 'Lato-Regular', sans-serif; } +.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:focus, .navbar-default .navbar-nav > .active > a:hover { + background: #2D457A; + color: #fff; + border-radius: 6px; +} /*Pricing page*/ @@ -872,7 +881,21 @@ tech-sub-sec h2 { .navbar-nav .open .dropdown-menu { text-align: left; font-size: 12px; + } + .visible-mobile { + display:block; + } + .visible-desktop { + display:none !important; + } } +@media(min-width:768px) { + .visible-mobile { + display:none !important; + } + .visible-desktop { + display:block; + } } @media(max-width:990px) { .pricing-section .text { diff --git a/datacenterlight/templates/datacenterlight/includes/_navbar.html b/datacenterlight/templates/datacenterlight/includes/_navbar.html index a62dc3a7..cb1a7180 100644 --- a/datacenterlight/templates/datacenterlight/includes/_navbar.html +++ b/datacenterlight/templates/datacenterlight/includes/_navbar.html @@ -23,14 +23,14 @@
- Cdist byu ngleich + Cdist by ungleich {% trans "Our configuration management system" %}
@@ -106,21 +106,21 @@

{% trans "We bring the future to you." %}

-
+

{% blocktrans %} Data Center Light uses the most modern technologies out there.
Your VM needs only IPv6. Data Center Light provides
transparent two-way IPv6/IPv4 translation. {% endblocktrans %}

-
+
100% IPv6
-
- 100% SSD SSD +
+ 100% SSD SSD
-
+

{% blocktrans %} No more spinning metal plates!
Data Center Light uses only SSDs.
From b4caccaec84e89729dbbdcde508f2d08b8060567 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 00:35:17 +0530 Subject: [PATCH 52/92] Fixed dropdown menu width for de --- datacenterlight/static/datacenterlight/css/landing-page.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 1507f83f..320862a4 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -694,7 +694,7 @@ tech-sub-sec h2 { } .dropdown-menu{ left: 0 !important; - min-width: 130px; + min-width: 155px; text-align: left; margin-left: 15px; } From a936c6cb1718d4cc14c98a3d54d9d975fc0cd4b2 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 00:36:00 +0530 Subject: [PATCH 53/92] Deleted whydcl-pattren.jpg --- .../datacenterlight/img/whydcl-pattren.jpg | Bin 65065 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg diff --git a/datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg b/datacenterlight/static/datacenterlight/img/whydcl-pattren.jpg deleted file mode 100644 index 3d15a828c88d6fdd33563b23cf9f61928d773065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65065 zcmbTd1yr2R5+^#iI}Gl@eQ< VEhVFm`*kf0$!g1Zcm5Fo)NxI==wYal?dAQM6$ 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
@U}`1h1mW1qXW%9 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 z
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 Date: Sat, 1 Jul 2017 00:47:29 +0530 Subject: [PATCH 54/92] Left aligned We bring future to you section --- .../templates/datacenterlight/whydatacenterlight.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index 02d587a4..b7686805 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -100,7 +100,7 @@


-
+
From adb792770e7046616e2dde42361799b6f951c413 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 00:55:49 +0530 Subject: [PATCH 55/92] Fixed alignment for 100% SSD --- datacenterlight/static/datacenterlight/css/landing-page.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index 320862a4..b406c752 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -652,7 +652,7 @@ tech-sub-sec h2 { line-height: 55px; } .space-middle{ - padding: 35px 0; + padding: 45px 0; } .padding-vertical{ padding: 35px 0; From dfd910465ca97c9fce1cbb4c427cb420bf790a8e Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 01:40:17 +0530 Subject: [PATCH 56/92] Added dcl translations used in new flow --- .../locale/de/LC_MESSAGES/django.po | 62 ++++++++++++++++--- .../datacenterlight/order_detail.html | 2 +- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/datacenterlight/locale/de/LC_MESSAGES/django.po b/datacenterlight/locale/de/LC_MESSAGES/django.po index f6628b9f..69e140f9 100644 --- a/datacenterlight/locale/de/LC_MESSAGES/django.po +++ b/datacenterlight/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-19 12:22+0530\n" +"POT-Creation-Date: 2017-07-01 01:37+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -99,15 +99,18 @@ msgid "" "datacenterlight account.
\n" " %(base_url)s%(activation_link)s\n" " " -msgstr "\n" -" Klicke hier um deinen %(dcl_text)s zu aktivieren.

\n" -" Oder kopiere den folgenden Link in die Adressleiste deines Browsers und folge dann dem Link um deinen %(dcl_text)s Account zu aktivieren.
\n" +msgstr "" +"\n" +" Klicke hier " +"um deinen %(dcl_text)s zu aktivieren.

\n" +" Oder kopiere den folgenden Link in die Adressleiste deines " +"Browsers und folge dann dem Link um deinen %(dcl_text)s Account zu " +"aktivieren.
\n" " %(base_url)s%(activation_link)s\n" " " #: templates/datacenterlight/emails/user_activation.html:123 #: templates/datacenterlight/emails/user_activation.txt:11 -#| msgid "Your Name" msgid "Your" msgstr "Dein" @@ -128,8 +131,9 @@ msgstr "" "\n" "Hallo,\n" "\n" -"Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst %(base_url)s" -"%(activation_link)s\n" +"Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst " +"%(base_url)s%(activation_link)s\n" + #: templates/datacenterlight/includes/_footer.html:11 #: templates/datacenterlight/includes/_footer.html:31 #: templates/datacenterlight/includes/_navbar.html:27 @@ -298,6 +302,50 @@ msgstr "Fragen?" msgid "Contact us!" msgstr "Kontaktiere uns!" +#: templates/datacenterlight/order_detail.html:24 +msgid "Confirm Order" +msgstr "Bestellung Bestätigen" + +#: templates/datacenterlight/order_detail.html:30 +msgid "Billed To:" +msgstr "Rechnungsadresse" + +#: templates/datacenterlight/order_detail.html:39 +msgid "Date" +msgstr "Datum" + +#: templates/datacenterlight/order_detail.html:48 +msgid "Payment Method:" +msgstr "Bezahlmethode" + +#: templates/datacenterlight/order_detail.html:49 +msgid "ending" +msgstr "endend in" + +#: templates/datacenterlight/order_detail.html:59 +msgid "Order summary" +msgstr "Bestellungsübersicht" + +#: templates/datacenterlight/order_detail.html:63 +msgid "Cores" +msgstr "Prozessorkerne" + +#: templates/datacenterlight/order_detail.html:65 +msgid "Memory" +msgstr "Arbeitsspeicher" + +#: templates/datacenterlight/order_detail.html:67 +msgid "Disk space" +msgstr "Festplattenkapazität" + +#: templates/datacenterlight/order_detail.html:69 +msgid "Total" +msgstr "" + +#: templates/datacenterlight/order_detail.html:76 +msgid "Place order" +msgstr "Bestellen" + #: templates/datacenterlight/pricing.html:9 msgid "We are cutting down the costs significantly!" msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index 00aa840f..3f0ef0b5 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -46,7 +46,7 @@
{% trans "Payment Method:"%}
- {{cc_brand}} ending **** {{cc_last4}}
+ {{cc_brand}} {% trans "ending" %} **** {{cc_last4}}
{{request.session.user.email}}
From 0b0892a299ae80e2f64e99d3d9db932e1a787794 Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 01:59:24 +0530 Subject: [PATCH 57/92] Added OS to the payment page --- hosting/templates/hosting/payment.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hosting/templates/hosting/payment.html b/hosting/templates/hosting/payment.html index e41f57d7..c101e5e2 100644 --- a/hosting/templates/hosting/payment.html +++ b/hosting/templates/hosting/payment.html @@ -22,6 +22,9 @@

{%trans "Disk space"%} {{request.session.specs.disk_size|floatformat}} GB

+
+

{%trans "OS"%} {{request.session.template.name}}


Total

{{request.session.specs.price }} CHF

From e286fc8aaf393080d7e480e1b61bf09380b8442c Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 02:10:30 +0530 Subject: [PATCH 58/92] Added OS configuration to the payment page --- hosting/locale/de/LC_MESSAGES/django.po | 55 +++++++++++++------------ hosting/templates/hosting/payment.html | 2 +- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/hosting/locale/de/LC_MESSAGES/django.po b/hosting/locale/de/LC_MESSAGES/django.po index 674f3db4..b3cc6c0b 100644 --- a/hosting/locale/de/LC_MESSAGES/django.po +++ b/hosting/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-23 02:28+0530\n" +"POT-Creation-Date: 2017-07-01 02:09+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,47 +26,47 @@ msgstr "Dein Account wurde noch nicht aktiviert." msgid "Paste here your public key" msgstr "Fügen Sie Ihren public key ein" -#: templates/hosting/base_short.html:67 +#: templates/hosting/base_short.html:68 msgid "My Virtual Machines" msgstr "Meine virtuellen Maschinen" -#: templates/hosting/base_short.html:72 templates/hosting/orders.html.py:12 +#: templates/hosting/base_short.html:73 templates/hosting/orders.html.py:12 msgid "My Orders" msgstr "Meine Bestellungen" -#: templates/hosting/base_short.html:81 +#: templates/hosting/base_short.html:82 msgid "Keys" msgstr "Schlüssel" -#: templates/hosting/base_short.html:86 +#: templates/hosting/base_short.html:87 msgid "Notifications " msgstr "Benachrichtigungen" -#: templates/hosting/base_short.html:89 +#: templates/hosting/base_short.html:90 msgid "Logout" msgstr "Abmelden" -#: templates/hosting/base_short.html:94 +#: templates/hosting/base_short.html:95 msgid "How it works" msgstr "So funktioniert es" -#: templates/hosting/base_short.html:97 +#: templates/hosting/base_short.html:98 msgid "Your infrastructure" msgstr "deine Infrastruktur" -#: templates/hosting/base_short.html:100 +#: templates/hosting/base_short.html:101 msgid "Our inftrastructure" msgstr "Unsere Infrastruktur" -#: templates/hosting/base_short.html:103 +#: templates/hosting/base_short.html:104 msgid "Pricing" msgstr "Preise" -#: templates/hosting/base_short.html:106 +#: templates/hosting/base_short.html:107 msgid "Contact" msgstr "Kontakt" -#: templates/hosting/base_short.html:109 +#: templates/hosting/base_short.html:110 #: templates/hosting/confirm_reset_password.html:38 #: templates/hosting/login.html:17 templates/hosting/login.html.py:26 #: templates/hosting/reset_password.html:32 templates/hosting/signup.html:30 @@ -347,11 +347,11 @@ msgstr "Bestellung stornieren" msgid "Do You want to delete your order?" msgstr "Willst du deine Bestellung löschen?" -#: templates/hosting/orders.html:63 templates/hosting/user_keys.html.py:62 +#: templates/hosting/orders.html:63 templates/hosting/user_keys.html.py:63 msgid "Close" msgstr "Schliessen" -#: templates/hosting/orders.html:65 templates/hosting/user_keys.html.py:64 +#: templates/hosting/orders.html:65 templates/hosting/user_keys.html.py:65 msgid "Delete" msgstr "Löschen" @@ -359,31 +359,36 @@ msgstr "Löschen" msgid "Billing Amount" msgstr "Rechnungsbetrag" -#: templates/hosting/payment.html:35 +#: templates/hosting/payment.html:26 +#: templates/hosting/virtual_machine_detail.html:98 +msgid "Configuration" +msgstr "Konfiguration" + +#: templates/hosting/payment.html:38 msgid "Billing Address" msgstr "Rechnungsadresse" -#: templates/hosting/payment.html:49 +#: templates/hosting/payment.html:52 msgid "Payment Details" msgstr "Rechnungsdetails" -#: templates/hosting/payment.html:62 +#: templates/hosting/payment.html:65 msgid "Submit Payment" msgstr "Betrag überweisen" -#: templates/hosting/payment.html:81 +#: templates/hosting/payment.html:84 msgid "CARD NUMBER" msgstr "Kreditkartennummer" -#: templates/hosting/payment.html:86 +#: templates/hosting/payment.html:89 msgid "Valid Card Number" msgstr "Gültige Kreditkartennummer" -#: templates/hosting/payment.html:95 +#: templates/hosting/payment.html:98 msgid "EXPIRATION DATE" msgstr "Ablaufdatum" -#: templates/hosting/payment.html:106 +#: templates/hosting/payment.html:109 msgid "CV CODE" msgstr "CV Code" @@ -425,13 +430,13 @@ msgstr "Schlüssel hinzufügen" msgid "Created at" msgstr "Erstellt am" -#: templates/hosting/user_keys.html:42 +#: templates/hosting/user_keys.html:43 #, fuzzy #| msgid "Delete" msgid "Delete Key" msgstr "Löschen" -#: templates/hosting/user_keys.html:55 +#: templates/hosting/user_keys.html:56 #, fuzzy #| msgid "Do You want do delete your order?" msgid "Do You want to delete this key?" @@ -453,10 +458,6 @@ msgstr "Ip nicht zugewiesen" msgid "Disk" msgstr "Festplatte" -#: templates/hosting/virtual_machine_detail.html:98 -msgid "Configuration" -msgstr "Konfiguration" - #: templates/hosting/virtual_machine_detail.html:108 msgid "Current pricing" msgstr "Aktueller Preis" diff --git a/hosting/templates/hosting/payment.html b/hosting/templates/hosting/payment.html index c101e5e2..a09061bb 100644 --- a/hosting/templates/hosting/payment.html +++ b/hosting/templates/hosting/payment.html @@ -23,7 +23,7 @@

{%trans "Disk space"%} {{request.session.specs.disk_size|floatformat}} GB


-

{%trans "OS"%} {%trans "Configuration"%} {{request.session.template.name}}


Total

Date: Sat, 1 Jul 2017 02:16:24 +0530 Subject: [PATCH 59/92] Added OS configuration to the Order Confirmation page --- datacenterlight/locale/de/LC_MESSAGES/django.po | 8 ++++++-- .../templates/datacenterlight/order_detail.html | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/datacenterlight/locale/de/LC_MESSAGES/django.po b/datacenterlight/locale/de/LC_MESSAGES/django.po index 69e140f9..6eeb605b 100644 --- a/datacenterlight/locale/de/LC_MESSAGES/django.po +++ b/datacenterlight/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-01 01:37+0530\n" +"POT-Creation-Date: 2017-07-01 02:15+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -339,10 +339,14 @@ msgid "Disk space" msgstr "Festplattenkapazität" #: templates/datacenterlight/order_detail.html:69 +msgid "Configuration" +msgstr "Konfiguration" + +#: templates/datacenterlight/order_detail.html:71 msgid "Total" msgstr "" -#: templates/datacenterlight/order_detail.html:76 +#: templates/datacenterlight/order_detail.html:78 msgid "Place order" msgstr "Bestellen" diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index 3f0ef0b5..42f916e3 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -66,6 +66,8 @@


{% trans "Disk space"%} {{vm.disk_size}} GB


+

{% trans "Configuration"%} {{request.session.template.name}}

+

{% trans "Total"%}

{{vm.price}} CHF

{% endwith %}
From bd766e207332d183fa32e8150832dcb8840ca645 Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 03:11:16 +0530 Subject: [PATCH 60/92] Fixed filling up of users details while going back to payment page from order confirmation page --- datacenterlight/views.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index ffc16eb9..066089b3 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -309,6 +309,30 @@ class IndexView(CreateView): class PaymentOrderView(FormView): template_name = 'hosting/payment.html' form_class = BillingAddressForm + + def get_form_kwargs(self): + form_kwargs = super(PaymentOrderView, self).get_form_kwargs() + user = self.request.session.get('user') + if user: + custom_user = None + try: + custom_user = CustomUser.objects.get(email=user.get('email')) + except CustomUser.DoesNotExist: + return form_kwargs + current_billing_address = custom_user.billing_addresses.first() + form_kwargs = super(PaymentOrderView, self).get_form_kwargs() + if not current_billing_address: + return form_kwargs + form_kwargs.update({ + 'initial': { + 'street_address': current_billing_address.street_address, + 'city': current_billing_address.city, + 'postal_code': current_billing_address.postal_code, + 'country': current_billing_address.country, + } + }) + return form_kwargs + return def get_context_data(self, **kwargs): context = super(PaymentOrderView, self).get_context_data(**kwargs) From 4857bc2cd8735068756bd838c91c34c8fcb94e16 Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 03:54:08 +0530 Subject: [PATCH 61/92] Now fetching billing address data from session variable --- datacenterlight/views.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 066089b3..c0fbdb6f 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -198,6 +198,8 @@ class IndexView(CreateView): del request.session['specs'] if 'user' in request.session : del request.session['user'] + if 'billing_address_data' in request.session : + del request.session['billing_address_data'] try: manager = OpenNebulaManager() templates = manager.get_templates() @@ -312,27 +314,18 @@ class PaymentOrderView(FormView): def get_form_kwargs(self): form_kwargs = super(PaymentOrderView, self).get_form_kwargs() - user = self.request.session.get('user') - if user: - custom_user = None - try: - custom_user = CustomUser.objects.get(email=user.get('email')) - except CustomUser.DoesNotExist: - return form_kwargs - current_billing_address = custom_user.billing_addresses.first() - form_kwargs = super(PaymentOrderView, self).get_form_kwargs() - if not current_billing_address: - return form_kwargs + billing_address_data = self.request.session.get('billing_address_data') + if billing_address_data: form_kwargs.update({ 'initial': { - 'street_address': current_billing_address.street_address, - 'city': current_billing_address.city, - 'postal_code': current_billing_address.postal_code, - 'country': current_billing_address.country, + 'street_address': billing_address_data['street_address'], + 'city': billing_address_data['city'], + 'postal_code': billing_address_data['postal_code'], + 'country': billing_address_data['country'], } }) - return form_kwargs - return + return form_kwargs + def get_context_data(self, **kwargs): context = super(PaymentOrderView, self).get_context_data(**kwargs) From b502cb5da842803782d1d6be5dc93d4c6da912f8 Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 04:29:11 +0530 Subject: [PATCH 62/92] Fixed logo in payment/order confirmation page not redirecting to index issue --- datacenterlight/views.py | 6 ++++-- hosting/templates/hosting/base_short.html | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index c0fbdb6f..07709981 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -204,7 +204,7 @@ class IndexView(CreateView): manager = OpenNebulaManager() templates = manager.get_templates() context = { - 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, + 'templates': VirtualMachineTemplateSerializer(templates, many=True).data } except: messages.error( request, @@ -330,7 +330,8 @@ class PaymentOrderView(FormView): def get_context_data(self, **kwargs): context = super(PaymentOrderView, self).get_context_data(**kwargs) context.update({ - 'stripe_key': settings.STRIPE_API_PUBLIC_KEY + 'stripe_key': settings.STRIPE_API_PUBLIC_KEY, + 'site_url': reverse('datacenterlight:index') }) return context @@ -393,6 +394,7 @@ class OrderConfirmationView(DetailView): stripe_utils = StripeUtils() card_details = stripe_utils.get_card_details(customer.stripe_id, request.session.get('token')) context = { + 'site_url': reverse('datacenterlight:index'), 'cc_last4' : card_details.get('response_object').get('last4'), 'cc_brand' : card_details.get('response_object').get('brand') } diff --git a/hosting/templates/hosting/base_short.html b/hosting/templates/hosting/base_short.html index e1a6a027..c1ba46b1 100644 --- a/hosting/templates/hosting/base_short.html +++ b/hosting/templates/hosting/base_short.html @@ -57,7 +57,7 @@ - +
{% if request.user.is_authenticated %} From f847302acd89d6dcfd3202bd02e83369c6e64953 Mon Sep 17 00:00:00 2001 From: PCoder Date: Sat, 1 Jul 2017 11:22:12 +0530 Subject: [PATCH 63/92] Fixed hosting template footer for unauthenticated case (direct payment + order confirmation) --- hosting/templates/hosting/base_short.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hosting/templates/hosting/base_short.html b/hosting/templates/hosting/base_short.html index c1ba46b1..c3b19c8c 100644 --- a/hosting/templates/hosting/base_short.html +++ b/hosting/templates/hosting/base_short.html @@ -131,6 +131,8 @@
+ {% else %} + {% include "datacenterlight/includes/_footer.html" %} {% endif %} From 36877d613dd43293aa1d0d08ba395f28af388ff3 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 17:58:42 +0530 Subject: [PATCH 64/92] Added styles for proper positioning of error msgs --- .../datacenterlight/css/landing-page.css | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index bcfa3f83..bf71eff1 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -430,7 +430,6 @@ h6 { } .pricing-section .card .description{ padding: 12px; - border-bottom: 1px solid rgba(128, 128, 128, 0.3); } .pricing-section .card .descriptions{ padding: 10px 30px; @@ -646,11 +645,10 @@ h6 { } .price-calc-section .card .description{ padding: 12px; - border-bottom: 1px solid rgba(128, 128, 128, 0.3); position: relative; display: flex; - justify-content: space-around; - align-items: center; + justify-content: space-around !important; + align-items: center !important; } .price-calc-section .card .description span { @@ -661,10 +659,10 @@ h6 { width: 30%; text-align: left; } -.price-calc-section .card .description input{ - font-size: 20px; - text-align: center; - width: 60px; +.price-calc-section .card .description .select-number{ + font-size: 20px; + text-align: center; + width: 60px; } .price-calc-section .card .description i{ color: #29427A; @@ -701,8 +699,8 @@ h6 { .price-calc-section .card .check-ip{ font-size: 18px; } -.price-calc-section .card .description.input{ - justify-content: center; +.price-calc-section .card .justify-center{ + justify-content: center !important; } .price-calc-section .card .description.input label{ font-size: 15px; @@ -711,10 +709,11 @@ h6 { margin-bottom: 0; width: 40px; } -.price-calc-section .card .description.input input{ - width: 200px; - font-size: 14px; - text-align: left; +/*Changed class****.price-calc-section .card .description.input input*/ +.price-calc-section .card .description input{ + width: 200px; + font-size: 14px; + text-align: left; padding: 5px 10px; border-radius: 4px; border: 1px solid #d0d0d0; @@ -726,6 +725,15 @@ h6 { font-size: 17px; margin: 0 8px; } +.help-block.with-errors { + text-align: center; + margin: 0; + padding: 0; +} +.form-group { + margin: 0; + border-bottom: 1px solid rgba(128, 128, 128, 0.3); +} @media(max-width:990px) { .pricing-section .text { @@ -911,7 +919,7 @@ h6 { text-align: center; } - .price-calc-section .card .description input { + .price-calc-section .card .description .select-number{ font-size: 17px; text-align: center; width: 60px; From afcec7eb0308dfdb9321d716210a96d237cc042e Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 17:59:34 +0530 Subject: [PATCH 65/92] Removed unwanted code and add bootstrap-validator cdn js --- .../templates/datacenterlight/base.html | 50 +------------------ 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html index c62d92f7..becb36d8 100644 --- a/datacenterlight/templates/datacenterlight/base.html +++ b/datacenterlight/templates/datacenterlight/base.html @@ -60,53 +60,5 @@ - - - - - + From e4cfcbf618d28526d9c1f4216d6a0fd77e05354a Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 18:01:08 +0530 Subject: [PATCH 66/92] Added some classes and divs for error msg alignment alongside the input field --- .../templates/datacenterlight/index.html | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/index.html b/datacenterlight/templates/datacenterlight/index.html index 6d63b29b..b05f617a 100755 --- a/datacenterlight/templates/datacenterlight/index.html +++ b/datacenterlight/templates/datacenterlight/index.html @@ -139,7 +139,7 @@
-
+ {% csrf_token %}

{% trans "VM hosting" %}

@@ -152,28 +152,37 @@
-
+

{% trans "Hosted in Switzerland" %}

-
+
+
- + Core +
+
-
+
+
- + GB RAM +
+
-
+
+
- + {% trans "GB Storage (SSD)" %} +
+
-
+
-
-
- - -
+
+
+ + +
+
+ {% for message in messages %} + {% if 'name' in message.tags %} +
  • + {{ message|safe }} +
+ {% endif %} + {% endfor %} +
+
+
+
+ + +
+
+ {% for message in messages %} + {% if 'email' in message.tags %} +
  • + {{ message|safe }} +
+ {% endif %} + {% endfor %} +
+
-
-
-
@@ -250,4 +278,4 @@
- {% endblock %} \ No newline at end of file + {% endblock %} From 0c969946f7ee6a3e8ff999d23920a3c00cd8d0cb Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sat, 1 Jul 2017 18:02:10 +0530 Subject: [PATCH 67/92] Added code for proper return when name/email are not good --- datacenterlight/views.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 07709981..b7c08a63 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -12,6 +12,7 @@ from django import forms from django.core.exceptions import ValidationError from django.views.decorators.cache import cache_control from django.conf import settings +from django.utils.translation import ugettext_lazy as _ from utils.forms import BillingAddressForm, UserBillingAddressForm from utils.models import BillingAddress from membership.models import StripeCustomer @@ -194,12 +195,9 @@ class IndexView(CreateView): @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): - if 'specs' in request.session : - del request.session['specs'] - if 'user' in request.session : - del request.session['user'] - if 'billing_address_data' in request.session : - del request.session['billing_address_data'] + for session_var in ['specs', 'user', 'billing_address_data']: + if session_var in request.session: + del request.session[session_var] try: manager = OpenNebulaManager() templates = manager.get_templates() @@ -233,14 +231,16 @@ class IndexView(CreateView): try: name = name_field.clean(name) except ValidationError as err: - messages.add_message(self.request, messages.ERROR, '%(value) is not a proper name.'.format(name)) - return HttpResponseRedirect(reverse('datacenterlight:index')) + msg='{} {}.'.format(name, _('is not a proper name')) + messages.add_message(self.request, messages.ERROR, msg, extra_tags='name') + return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form") try: email = email_field.clean(email) except ValidationError as err: - messages.add_message(self.request, messages.ERROR, '%(value) is not a proper email.'.format(email)) - return HttpResponseRedirect(reverse('datacenterlight:index')) + msg='{} {}.'.format(email, _('is not a proper email')) + messages.add_message(self.request, messages.ERROR, msg, extra_tags='email') + return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form") specs = { 'cpu': cores, From 8fb4607bdd46bc0ecce487b5f987ad35198666ea Mon Sep 17 00:00:00 2001 From: "M.Ravi" Date: Sat, 1 Jul 2017 15:53:25 +0200 Subject: [PATCH 68/92] Fixed issues reported by flake --- datacenterlight/templatetags/custom_tags.py | 3 +- datacenterlight/views.py | 47 +++++++++------------ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/datacenterlight/templatetags/custom_tags.py b/datacenterlight/templatetags/custom_tags.py index d954b1b9..ce6e6724 100644 --- a/datacenterlight/templatetags/custom_tags.py +++ b/datacenterlight/templatetags/custom_tags.py @@ -21,6 +21,7 @@ def change_lang(context, lang=None, *args, **kwargs): return "%s" % url + @register.filter('get_value_from_dict') def get_value_from_dict(dict_data, key): """ @@ -28,5 +29,5 @@ def get_value_from_dict(dict_data, key): """ if key: return dict_data.get(key) - else : + else: return "" diff --git a/datacenterlight/views.py b/datacenterlight/views.py index f215a2c9..1e4297ec 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -14,12 +14,10 @@ from django.views.decorators.cache import cache_control from django.conf import settings from utils.forms import BillingAddressForm, UserBillingAddressForm from utils.models import BillingAddress -from membership.models import StripeCustomer from hosting.models import HostingOrder, HostingBill from utils.stripe_utils import StripeUtils from datetime import datetime from membership.models import CustomUser, StripeCustomer -from oca.pool import WrongIdError from opennebula_api.models import OpenNebulaManager from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer @@ -35,15 +33,17 @@ class SuccessView(TemplateView): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) elif 'token' not in request.session: - return HttpResponseRedirect(reverse('datacenterlight:payment')) + return HttpResponseRedirect(reverse('datacenterlight:payment')) elif 'order_confirmation' not in request.session: - return HttpResponseRedirect(reverse('datacenterlight:order_confirmation')) + return HttpResponseRedirect(reverse('datacenterlight:order_confirmation')) else: - for session_var in ['specs', 'user', 'template', 'billing_address', 'billing_address_data', 'token', 'customer']: + for session_var in ['specs', 'user', 'template', 'billing_address', 'billing_address_data', + 'token', 'customer']: if session_var in request.session: del request.session[session_var] return render(request, self.template_name) + class PricingView(TemplateView): template_name = "datacenterlight/pricing.html" @@ -74,7 +74,6 @@ class PricingView(TemplateView): price = request.POST.get('total') template_id = int(request.POST.get('config')) - manager = OpenNebulaManager() template = manager.get_template(template_id) @@ -199,7 +198,7 @@ class IndexView(CreateView): del request.session['specs'] if 'user' in request.session: del request.session['user'] - if 'billing_address_data' in request.session : + if 'billing_address_data' in request.session: del request.session['billing_address_data'] try: manager = OpenNebulaManager() @@ -312,7 +311,7 @@ class IndexView(CreateView): class PaymentOrderView(FormView): template_name = 'hosting/payment.html' form_class = BillingAddressForm - + def get_form_kwargs(self): form_kwargs = super(PaymentOrderView, self).get_form_kwargs() billing_address_data = self.request.session.get('billing_address_data') @@ -327,7 +326,6 @@ class PaymentOrderView(FormView): }) return form_kwargs - def get_context_data(self, **kwargs): context = super(PaymentOrderView, self).get_context_data(**kwargs) context.update({ @@ -349,9 +347,8 @@ class PaymentOrderView(FormView): billing_address_data = form.cleaned_data token = form.cleaned_data.get('token') user = request.session.get('user') - try: - custom_user = CustomUser.objects.get(email=user.get('email')) + CustomUser.objects.get(email=user.get('email')) except CustomUser.DoesNotExist: password = CustomUser.get_random_password() # Register the user, and do not send emails @@ -384,7 +381,7 @@ class OrderConfirmationView(DetailView): payment_template_name = 'hosting/payment.html' context_object_name = "order" model = HostingOrder - + @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: @@ -397,11 +394,11 @@ class OrderConfirmationView(DetailView): card_details = stripe_utils.get_card_details(customer.stripe_id, request.session.get('token')) context = { 'site_url': reverse('datacenterlight:index'), - 'cc_last4' : card_details.get('response_object').get('last4'), - 'cc_brand' : card_details.get('response_object').get('brand') + 'cc_last4': card_details.get('response_object').get('last4'), + 'cc_brand': card_details.get('response_object').get('brand') } return render(request, self.template_name, context) - + def post(self, request, *args, **kwargs): template = request.session.get('template') specs = request.session.get('specs') @@ -411,7 +408,6 @@ class OrderConfirmationView(DetailView): billing_address_data = request.session.get('billing_address_data') billing_address_id = request.session.get('billing_address') billing_address = BillingAddress.objects.filter(id=billing_address_id).first() - token = request.session.get('token') vm_template_id = template.get('id', 1) final_price = specs.get('price') @@ -423,29 +419,28 @@ class OrderConfirmationView(DetailView): # Check if the payment was approved if not charge: + context = {} context.update({ 'paymentError': charge_response.get('error') - # TODO add logic in payment form to autofill data - #'form': form }) return render(request, self.payment_template_name, context) charge = charge_response.get('response_object') - + # Create OpenNebulaManager manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME, password=settings.OPENNEBULA_PASSWORD) - + # Create a vm using oneadmin, also specify the name vm_id = manager.create_vm( template_id=vm_template_id, specs=specs, vm_name="{email}-{template_name}-{date}".format( - email=user.get('email'), + email=user.get('email'), template_name=template.get('name'), date=int(datetime.now().strftime("%s"))) ) - + # Create a Hosting Order order = HostingOrder.create( price=final_price, @@ -453,9 +448,9 @@ class OrderConfirmationView(DetailView): customer=customer, billing_address=billing_address ) - + # Create a Hosting Bill - bill = HostingBill.create( + HostingBill.create( customer=customer, billing_address=billing_address) # Create Billing Address for User if he does not have one @@ -473,9 +468,9 @@ class OrderConfirmationView(DetailView): # If the Stripe payment was successed, set order status approved order.set_approved() - + vm = VirtualMachineSerializer(manager.get_vm(vm_id)).data - + context = { 'name': user.get('name'), 'email': user.get('email'), From 0a2b2c815de27157dc85b70736b54dc4de663238 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sun, 2 Jul 2017 02:14:18 +0530 Subject: [PATCH 69/92] Aligned Logo, Text, Signature to left --- .../emails/request_access_confirmation.html | 8 ++++---- .../emails/request_access_notification.html | 8 ++++---- .../emails/request_beta_access_notification.html | 8 ++++---- .../templates/datacenterlight/emails/user_activation.html | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html b/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html index e96a8ef1..2f71944f 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html +++ b/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html @@ -74,7 +74,7 @@
-
+ logo @@ -95,12 +95,12 @@
- -
+ {% trans "Thank you for your request." %}
+

{% trans "You are one step away from being our beta tester!" %}

{% trans "Currently we are running our tests to make sure everything runs perfectly." %}
{% trans "In the meantime, we would like to ask you a little patience
until our team contacts you with beta access." %}
@@ -117,7 +117,7 @@

-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/request_access_notification.html b/datacenterlight/templates/datacenterlight/emails/request_access_notification.html index 09531ba6..095c917e 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_access_notification.html +++ b/datacenterlight/templates/datacenterlight/emails/request_access_notification.html @@ -73,7 +73,7 @@
-
+ logo @@ -94,12 +94,12 @@
- - @@ -113,7 +113,7 @@
+ An user requested a beta access
+

User {{email}} requested beta access

-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html b/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html index 7991eb69..c6f3033e 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html +++ b/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html @@ -73,7 +73,7 @@
-
+ logo @@ -94,14 +94,14 @@
- -
+ An user requested a beta access
+

User {{email}} requested beta access

{% for vm in vms %} Type: {{vm.type}} - Amount: {{vm.amount}} @@ -119,7 +119,7 @@
-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/user_activation.html b/datacenterlight/templates/datacenterlight/emails/user_activation.html index bf688127..e591fc54 100644 --- a/datacenterlight/templates/datacenterlight/emails/user_activation.html +++ b/datacenterlight/templates/datacenterlight/emails/user_activation.html @@ -74,7 +74,7 @@
-
+ logo @@ -95,12 +95,12 @@
- -
+ {{dcl_text}} {% trans 'account activation' %}
+

{% blocktrans %} You can activate your {{dcl_text}} account by clicking here.

@@ -120,7 +120,7 @@

-
{% trans 'Your' %} {{dcl_text}} {% trans 'team' %}
+
{% trans 'Your' %} {{dcl_text}} {% trans 'team' %}
From f48ea4714e7ba8036e46c6f7a13170c3df76e250 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sun, 2 Jul 2017 18:34:17 +0530 Subject: [PATCH 70/92] changed error message color --- datacenterlight/static/datacenterlight/css/landing-page.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datacenterlight/static/datacenterlight/css/landing-page.css b/datacenterlight/static/datacenterlight/css/landing-page.css index bf71eff1..d943a8e9 100755 --- a/datacenterlight/static/datacenterlight/css/landing-page.css +++ b/datacenterlight/static/datacenterlight/css/landing-page.css @@ -730,6 +730,9 @@ h6 { margin: 0; padding: 0; } +.has-error .checkbox, .has-error .checkbox-inline, .has-error .control-label, .has-error .help-block, .has-error .radio, .has-error .radio-inline, .has-error.checkbox label, .has-error.checkbox-inline label, .has-error.radio label, .has-error.radio-inline label{ +color: #eb4d5c; +} .form-group { margin: 0; border-bottom: 1px solid rgba(128, 128, 128, 0.3); From 871237d84fec92a2336e5dc0f70269e1da374764 Mon Sep 17 00:00:00 2001 From: "M.Ravi" Date: Sun, 2 Jul 2017 15:33:11 +0200 Subject: [PATCH 71/92] Updated Changelog for the release 1.0.18 --- Changelog | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index fcf3c16c..95b7dab8 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,11 @@ +1.0.18: 2017-07-02 + * [datacenterlight] Introduced the new flow. Landing page -> Payment -> Order confirmation -> Success + * [datacenterlight] Fixed issue showing local time to the user in order confirmation page, vm pages (like ssh keys) + * [hosting] Fixed responsive issue while user signup + * [hosting] Fixed 500 error when user requests for a vm whose id does not belong to him + * [datacenterlight] Refactored partially dcl text and dcl support email to be obtained from env parameters + * [datacenterlight] Updated DE translations + * [hosting] Updated email text for user activation 1.0.17: 2017-06-16 * [datacenterlight] Cleanup OrderView useless code * [datacenterlight] Replaced GiB to GB @@ -5,7 +13,7 @@ * [datacenterlight] Fixed translations * [datacenterlight] Added email confirmation feature * [datacenterlight] Changed logo on datacerlight dashboard - * [datacenterlight] Credit card input disappearance fix + * [datacenterlight] Credit card input disappearance fix 1.0.16: 2017-06-15 * [datacenterlight] .po file issue with multiple definition fixed * [datacenterlight] Navbar items in dcl user area rearranged From 1f658a425f5bdea15eb9cbd981af466bdee20c56 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Sun, 2 Jul 2017 17:56:49 +0300 Subject: [PATCH 72/92] Merge with master --- digitalglarus/templates/base_glarus.html | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/digitalglarus/templates/base_glarus.html b/digitalglarus/templates/base_glarus.html index 424f3aac..b94c813e 100644 --- a/digitalglarus/templates/base_glarus.html +++ b/digitalglarus/templates/base_glarus.html @@ -39,27 +39,13 @@ - + + {% include 'google_analytics.html' %} + From fd856d7613d3db5c5eba45a01c5c7b73ba9fac71 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sun, 2 Jul 2017 20:55:08 +0530 Subject: [PATCH 73/92] Reverted back email templates as they are part of another PR --- .../emails/request_access_confirmation.html | 8 ++++---- .../emails/request_access_notification.html | 8 ++++---- .../emails/request_beta_access_notification.html | 8 ++++---- .../templates/datacenterlight/emails/user_activation.html | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html b/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html index 2f71944f..e96a8ef1 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html +++ b/datacenterlight/templates/datacenterlight/emails/request_access_confirmation.html @@ -74,7 +74,7 @@
-
+ logo @@ -95,12 +95,12 @@
- -
+ {% trans "Thank you for your request." %}
+

{% trans "You are one step away from being our beta tester!" %}

{% trans "Currently we are running our tests to make sure everything runs perfectly." %}
{% trans "In the meantime, we would like to ask you a little patience
until our team contacts you with beta access." %}
@@ -117,7 +117,7 @@

-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/request_access_notification.html b/datacenterlight/templates/datacenterlight/emails/request_access_notification.html index 095c917e..09531ba6 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_access_notification.html +++ b/datacenterlight/templates/datacenterlight/emails/request_access_notification.html @@ -73,7 +73,7 @@
-
+ logo @@ -94,12 +94,12 @@
- - @@ -113,7 +113,7 @@
+ An user requested a beta access
+

User {{email}} requested beta access

-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html b/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html index c6f3033e..7991eb69 100644 --- a/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html +++ b/datacenterlight/templates/datacenterlight/emails/request_beta_access_notification.html @@ -73,7 +73,7 @@
-
+ logo @@ -94,14 +94,14 @@
- -
+ An user requested a beta access
+

User {{email}} requested beta access

{% for vm in vms %} Type: {{vm.type}} - Amount: {{vm.amount}} @@ -119,7 +119,7 @@
-
Your data center light team
+
Your data center light team
diff --git a/datacenterlight/templates/datacenterlight/emails/user_activation.html b/datacenterlight/templates/datacenterlight/emails/user_activation.html index e591fc54..bf688127 100644 --- a/datacenterlight/templates/datacenterlight/emails/user_activation.html +++ b/datacenterlight/templates/datacenterlight/emails/user_activation.html @@ -74,7 +74,7 @@
-
+ logo @@ -95,12 +95,12 @@
- -
+ {{dcl_text}} {% trans 'account activation' %}
+

{% blocktrans %} You can activate your {{dcl_text}} account by clicking here.

@@ -120,7 +120,7 @@

-
{% trans 'Your' %} {{dcl_text}} {% trans 'team' %}
+
{% trans 'Your' %} {{dcl_text}} {% trans 'team' %}
From 5b6a0691379a7c259d80f9f895d262b54475a220 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sun, 2 Jul 2017 23:16:19 +0530 Subject: [PATCH 74/92] Added DE translations for error messages --- .../locale/de/LC_MESSAGES/django.po | 56 +++++++++++++------ .../templates/datacenterlight/index.html | 2 +- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/datacenterlight/locale/de/LC_MESSAGES/django.po b/datacenterlight/locale/de/LC_MESSAGES/django.po index 6eeb605b..a0c9a470 100644 --- a/datacenterlight/locale/de/LC_MESSAGES/django.po +++ b/datacenterlight/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-01 02:15+0530\n" +"POT-Creation-Date: 2017-07-02 23:08+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,14 +18,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: templates/datacenterlight/base.html:72 -msgid "Please enter your name" -msgstr "Bitte gib Deinen Namen ein" - -#: templates/datacenterlight/base.html:73 -msgid "Please enter a valid email address" -msgstr "Bitte gib eine gültige E-Mail-Adresse ein" - #: templates/datacenterlight/beta_access.html:13 msgid "Enter name" msgstr "Name" @@ -264,41 +256,61 @@ msgstr "MwSt. inklusive" msgid "Hosted in Switzerland" msgstr "Standort: Schweiz" -#: templates/datacenterlight/index.html:173 +#: templates/datacenterlight/index.html:161 +msgid "Please enter a value greater than or equal to 1." +msgstr "Bitte gib einen Wert größer oder gleich 1 ein." + +#: templates/datacenterlight/index.html:170 +msgid "Please enter a value greater than or equal to 2." +msgstr "Bitte gib einen Wert größer oder gleich 2 ein." + +#: templates/datacenterlight/index.html:179 +msgid "Please enter a value greater than or equal to 10." +msgstr "Bitte gib einen Wert größer oder gleich 10 ein" + +#: templates/datacenterlight/index.html:180 #: templates/datacenterlight/pricing.html:50 msgid "GB Storage (SSD)" msgstr "GB Storage (SSD)" -#: templates/datacenterlight/index.html:189 +#: templates/datacenterlight/index.html:199 msgid "Name" msgstr "" -#: templates/datacenterlight/index.html:190 +#: templates/datacenterlight/index.html:200 msgid "Your Name" msgstr "Dein Name" -#: templates/datacenterlight/index.html:193 +#: templates/datacenterlight/index.html:200 +msgid "Please enter your name" +msgstr "Bitte gib Deinen Namen ein" + +#: templates/datacenterlight/index.html:214 msgid "Email" msgstr "E-Mail-Adresse" -#: templates/datacenterlight/index.html:194 +#: templates/datacenterlight/index.html:215 msgid "Your Email" msgstr "Deine E-Mail" -#: templates/datacenterlight/index.html:197 +#: templates/datacenterlight/index.html:215 +msgid "Please enter a valid email address" +msgstr "Bitte gib eine gültige E-Mailadresse ein" + +#: templates/datacenterlight/index.html:228 #: templates/datacenterlight/pricing.html:79 msgid "Order Now!" msgstr "Bestelle jetzt!" -#: templates/datacenterlight/index.html:226 +#: templates/datacenterlight/index.html:254 msgid "Switzerland " msgstr "Schweiz" -#: templates/datacenterlight/index.html:243 +#: templates/datacenterlight/index.html:271 msgid "Questions?" msgstr "Fragen?" -#: templates/datacenterlight/index.html:243 +#: templates/datacenterlight/index.html:271 msgid "Contact us!" msgstr "Kontaktiere uns!" @@ -380,6 +392,14 @@ msgstr "" msgid "as soon as possible!" msgstr "" +#: views.py:234 +msgid "is not a proper name" +msgstr "ist kein gültiger Name" + +#: views.py:241 +msgid "is not a proper email" +msgstr "ist keine gültige E-Mailadresse" + #~ msgid "Buy VM" #~ msgstr "VM Kaufen" diff --git a/datacenterlight/templates/datacenterlight/index.html b/datacenterlight/templates/datacenterlight/index.html index b05f617a..31e02fb9 100755 --- a/datacenterlight/templates/datacenterlight/index.html +++ b/datacenterlight/templates/datacenterlight/index.html @@ -211,7 +211,7 @@
- +
From 3a865bd01089612b3d44a324786d537afeae88cf Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Sun, 2 Jul 2017 23:33:33 +0530 Subject: [PATCH 75/92] Increased minimum length of the name to 3 --- datacenterlight/templates/datacenterlight/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datacenterlight/templates/datacenterlight/index.html b/datacenterlight/templates/datacenterlight/index.html index 31e02fb9..6807575d 100755 --- a/datacenterlight/templates/datacenterlight/index.html +++ b/datacenterlight/templates/datacenterlight/index.html @@ -197,7 +197,7 @@
- +
{% for message in messages %} From f67343ab5c6ef7b960394830bed7f81ab3f8b9c9 Mon Sep 17 00:00:00 2001 From: "M.Ravi" Date: Sun, 2 Jul 2017 21:26:10 +0200 Subject: [PATCH 76/92] Added missing validation code --- datacenterlight/templates/datacenterlight/base.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html index becb36d8..6074ece9 100644 --- a/datacenterlight/templates/datacenterlight/base.html +++ b/datacenterlight/templates/datacenterlight/base.html @@ -61,4 +61,9 @@ + From 5ea35bd4d8966759c0f30182a6aa7be554712483 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Sun, 2 Jul 2017 23:00:56 +0300 Subject: [PATCH 77/92] add ids for dev and staging server --- dynamicweb/settings/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index 08ed7fe5..ba304ff9 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -517,5 +517,7 @@ DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') GOOGLE_ANALYTICS_PROPERTY_IDS = { 'datacenterlight.ch': 'UA-62285904-9', 'digitalglarus.ch': 'UA-62285904-2', - '127.0.0.1:8000': 'test' + '127.0.0.1:8000': 'localhost', + 'dynamicweb-development.ungleich.ch': 'development', + 'dynamicweb-staging.ungleich.ch': 'staging' } From 8b9359ede52786ff4c8b54b945f61bfed7cb44a0 Mon Sep 17 00:00:00 2001 From: "M.Ravi" Date: Sun, 2 Jul 2017 23:37:31 +0200 Subject: [PATCH 78/92] Reverted back to the default behavior of bootstrap-validator --- datacenterlight/templates/datacenterlight/base.html | 5 ----- datacenterlight/templates/datacenterlight/index.html | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/base.html b/datacenterlight/templates/datacenterlight/base.html index 6074ece9..becb36d8 100644 --- a/datacenterlight/templates/datacenterlight/base.html +++ b/datacenterlight/templates/datacenterlight/base.html @@ -61,9 +61,4 @@ - diff --git a/datacenterlight/templates/datacenterlight/index.html b/datacenterlight/templates/datacenterlight/index.html index 6807575d..822858ae 100755 --- a/datacenterlight/templates/datacenterlight/index.html +++ b/datacenterlight/templates/datacenterlight/index.html @@ -139,7 +139,7 @@
-
+ {% csrf_token %}

{% trans "VM hosting" %}

From e19d2e3c137db2d76c3204ede0089654699112a5 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Mon, 3 Jul 2017 23:31:35 +0530 Subject: [PATCH 79/92] Updated Pricing Form with updated error messages --- .../datacenterlight/whydatacenterlight.html | 74 +++++++++++++------ 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index b7686805..f249ea57 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -136,15 +136,15 @@
- +
-

{% trans "Starting from only 15CHF per month. Try now." %}

-

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

+

{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}

+

{% trans "Affordable VM hosting based in Switzerland" %}

@@ -152,7 +152,7 @@
- + {% csrf_token %}

{% trans "VM hosting" %}

@@ -165,28 +165,37 @@
-
+

{% trans "Hosted in Switzerland" %}

-
+
+
- + Core +
+
-
+
+
- + GB RAM +
+
-
+
+
- + {% trans "GB Storage (SSD)" %} +
+
-
+
-
-
- - -
+
+
+ + +
+
+ {% for message in messages %} + {% if 'name' in message.tags %} +
  • + {{ message|safe }} +
+ {% endif %} + {% endfor %} +
+
+
+
+ + +
+
+ {% for message in messages %} + {% if 'email' in message.tags %} +
  • + {{ message|safe }} +
+ {% endif %} + {% endfor %} +
+
-
-
-
From cac84f54333d9df0439987a604087dd2a7389e13 Mon Sep 17 00:00:00 2001 From: Mondi Geetha Date: Tue, 4 Jul 2017 00:10:23 +0530 Subject: [PATCH 80/92] Changed some text --- .../templates/datacenterlight/whydatacenterlight.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datacenterlight/templates/datacenterlight/whydatacenterlight.html b/datacenterlight/templates/datacenterlight/whydatacenterlight.html index f249ea57..fd0f01c7 100644 --- a/datacenterlight/templates/datacenterlight/whydatacenterlight.html +++ b/datacenterlight/templates/datacenterlight/whydatacenterlight.html @@ -91,7 +91,7 @@

{% trans "We believe in giving back to the FOSS community." %}

-

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and belive in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

+

{% blocktrans %}Data Center Light is the child of free and open source software (FOSS).
We grew up with it, live by it, and believe in it.
The more we work on our data center,
the more we contribute back to the FOSS community.{% endblocktrans %}

@@ -143,8 +143,8 @@
-

{% trans "Simple and affordable: Try our virtual machine with featherlight price." %}

-

{% trans "Affordable VM hosting based in Switzerland" %}

+

{% trans "Starting from only 15CHF per month. Try now." %}

+

{% trans "Actions speak louder than words. Let's do it, try our VM now." %}

From bc73ad3c4cc86130ab1fe61e83e45cfebc27faa5 Mon Sep 17 00:00:00 2001 From: Andrii Marynets Date: Mon, 3 Jul 2017 22:32:32 +0300 Subject: [PATCH 81/92] Ticket #3539. Fix issues: not loading favicon.ico on digitalglarus.ch --- digitalglarus/templates/new_base_glarus.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/digitalglarus/templates/new_base_glarus.html b/digitalglarus/templates/new_base_glarus.html index c970f79b..826b49c0 100644 --- a/digitalglarus/templates/new_base_glarus.html +++ b/digitalglarus/templates/new_base_glarus.html @@ -56,7 +56,7 @@ ga('send', 'pageview'); - +