Compare commits
No commits in common. "master" and "1.0.24" have entirely different histories.
8
.gitignore
vendored
|
|
@ -35,11 +35,3 @@ secret-key
|
|||
|
||||
.env
|
||||
*.mo
|
||||
*.log
|
||||
*.sql
|
||||
|
||||
/utils/optimize/
|
||||
|
||||
# to keep empty dirs
|
||||
!.gitkeep
|
||||
*.orig
|
||||
|
|
|
|||
12
.travis.yml
|
|
@ -1,15 +1,13 @@
|
|||
language: python
|
||||
python:
|
||||
- "3.4.2"
|
||||
# - "3.6"
|
||||
- "3.5"
|
||||
- "3.6"
|
||||
|
||||
env:
|
||||
- DJANGO_SECRET_KEY=0 OPENNEBULA_USERNAME='test' OPENNEBULA_PASSWORD='test' OPENNEBULA_PROTOCOL='http' OPENNEBULA_DOMAIN='test_domain' OPENNEBULA_PORT='2633' OPENNEBULA_ENDPOINT='/RPC2' DCL_TEXT='Data Center Light' CELERY_MAX_RETRIES=0 UNGLEICH_SITE_CONFIGS='{"localhost":{"MULTISITE_CMS_URL":"dynamicweb.urls"}}'
|
||||
# Set a dummy secret key
|
||||
- DJANGO_SECRET_KEY=0
|
||||
# install dependencies
|
||||
install: "pip install -r requirements.txt"
|
||||
script:
|
||||
- flake8
|
||||
- python manage.py compilemessages
|
||||
- python manage.py test -v 3
|
||||
# - coverage run --source='.' manage.py test dynamicweb -v 3
|
||||
# - coverage report
|
||||
- python manage.py test
|
||||
|
|
|
|||
355
Changelog
|
|
@ -1,343 +1,3 @@
|
|||
2.6.9: 2019-11-15
|
||||
* feature: Allow creating yearly subscriptions for Generic Products (MR!718)
|
||||
Notes for deployment:
|
||||
- do a db migrate for new column added to Generic Product model
|
||||
./manage.py migrate hosting
|
||||
2.6.8: 2019-11-15
|
||||
* feature: [EU VAT] Add EU VAT feature for generic products (MR!717)
|
||||
Notes for deployment:
|
||||
- do a db migrate a to create VATRates table
|
||||
./manage.py migrate hosting
|
||||
- load vat_rates.csv
|
||||
./manage.py import_vat_rates vat_rates.csv
|
||||
2.6.7: 2019-11-04
|
||||
* bugfix: [admin] Improve dumpuser: show proper dates + bugfix
|
||||
* bugfix: [admin] Improve fetch_stripe_bills:
|
||||
- fix wrong assigment of string to num_invoice_created
|
||||
variable,
|
||||
- return None (do not handle the case) if we don't have an
|
||||
order
|
||||
* bugfix: [admin] Improve deleteuser: do not delete order, bill and vm_detail
|
||||
2.6.6: 2019-11-04
|
||||
* feature: [admin] Add dumpuser management command that dumps a user's data in json (MR!716)
|
||||
2.6.5: 2019-09-24
|
||||
* #7169: [hosting] Fix server error while vm terminate takes longer than 30 seconds
|
||||
* #7170: [hosting] Improve admin email body contents for hosting vm terminate error case
|
||||
2.6.4: 2019-09-15
|
||||
* #7147: [OpenBSD vm] Add an explanatory text for username puffy on OpenBSD (MR!714)
|
||||
2.6.3: 2019-08-28
|
||||
* #7032: [hosting] Bugfix: Reentering the same SSH key used before does allow user to proceed further; complains key exists (MR!712)
|
||||
* #7070: [check_vm/api] Bugfix: Provide oneadmin credentials to check whether a user is the owner of a VM (MR!713)
|
||||
2.6.2: 2019-08-22
|
||||
* #7068: [django/node/rails] Remove public- prefix from OS template names (MR!711)
|
||||
2.6.1: 2019-07-09
|
||||
* #6941: [hosting dashboard] Show the card's expiry year & month too in the list of added cards (MR!710)
|
||||
2.6: 2019-07-03
|
||||
* #5509: Getting rid of our key by still supporting multiple user keys (MR!709)
|
||||
2.5.11: 2019-06-11
|
||||
* #6672: [api] Check VM belongs to user in the infrastructure directly (MR!707)
|
||||
* #bugfix: DE translation fix "Learn mehr" -> "Lerne mehr" (MR!708)
|
||||
2.5.10: 2019-05-16
|
||||
* #6672: [api] REST endpoint for ungleich-cli to verify if a VM belongs to a user (MR!705)
|
||||
* #6670: [hosting/save_ssh_key] Upgrade cdist version to 5.0.1 to manage keys on Alpine linux
|
||||
2.5.9: 2019-05-09
|
||||
* #6669: [hosting] Fix opennebula vm query takes long (MR!703)
|
||||
* [hosting] Increase VMDetail model's configuration parameter length to 128 (MR!702)
|
||||
2.5.8: 2019-05-06
|
||||
* #6631: Add `deleteuser` management command (MR!701)
|
||||
2.5.7: 2019-05-05
|
||||
* #6657: [all] Remove dependency on code.jquery.com, maxcdn.bootstrapcdn.com and oss.maxcdn.com and add them locally (MR!700)
|
||||
2.5.6: 2019-05-05
|
||||
* [blog] Check if the blog page is IPv6.Blog and load header image accordingly
|
||||
2.5.5: 2019-05-04
|
||||
* [blog] Use modified djangocms_blog module to not show "Category - ... " (MR!699)
|
||||
2.5.4: 2019-05-04
|
||||
* #6124: [blog] Allow setting title, subtitle of the blog page by passing GET params (MR!698)
|
||||
2.5.3: 2019-04-20
|
||||
* #6561: [bills] Show mutiple line items in the invoice details (MR!697)
|
||||
* #6561: [bills] Link line item to a Stripe Plan (MR!697)
|
||||
2.5.2: 2019-04-20
|
||||
* #6561: [bills] Fix fetch_stripe_bills to import bills containing multiple line items belonging to same subscription (MR!695)
|
||||
2.5.1: 2019-04-17
|
||||
* #6561: [hosting] Preparation for monthly invoices for customers (MR!689)
|
||||
* [logging] Enhance logger, Include timestamp + module name in the logging messages (MR!693)
|
||||
2.5: 2019-04-11
|
||||
* #6589: [vm creation, listing] Fix obtaining ip address/template related info from oca api call (MR!690, MR!691 and MR!692)
|
||||
[python-oca] VirtualMachinePool infoextended (https://github.com/ungleich/python-oca/pull/3)
|
||||
2.4.10: 2019-02-14
|
||||
* #6451: [dg, gdpr banner] Update phone number (MR!688 by pcoder)
|
||||
2.4.9: 2019-02-01
|
||||
* bugfix: Fix inconsistent styles in GDPR modal (MR!679 by pcoder)
|
||||
2.4.8: 2019-01-31
|
||||
* #5151: [all] Add GDPR banner (MR!678 by pcoder)
|
||||
* #6059: [dcl] Change topnav font to 400 by default (MR! 680 by Sanghee)
|
||||
2.4.7: 2019-01-30
|
||||
* #6213: [cms] Make ungleich product items equal heights and add option to animate or not animate the contents (MR!682 by Aatish)
|
||||
2.4.6: 2019-01-09
|
||||
* #6261: Add ungleich black logo to blog template for mobile view (MR!685)
|
||||
2.4.5: 2019-01-07
|
||||
* bugfix: [blog] Fix DE language option not being shown in the blog (MR!684) and revert back the RSS URL to the old one
|
||||
2.4.4: 2019-01-02
|
||||
* bugfix: [blog] Create blog config for ungleich.ch and change RSS URL accordingly
|
||||
2.4.3: 2018-12-24
|
||||
* #6260: Add viewport and other missing meta tags (MR!683)
|
||||
2.4.2: 2018-12-23
|
||||
* Update djangcocms-blog version (0.7.0 -> 0.9.0)
|
||||
* #6038: Change datacenterlight.ch message form to send email to support@ungleich.ch (MR!679)
|
||||
* bugfix: Use correct version of django-multisite (MR #676)
|
||||
2.4.1: 2018-10-18
|
||||
* bugfix: Update pycryptodome module from 3.4 to 3.6.6 (PR #674)
|
||||
2.4: 2018-10-18
|
||||
* #5681: [hosting,dcl] Allow admin to lower minimum RAM to 512 MB (PR #672)
|
||||
2.3.1: 2018-10-17
|
||||
* bugfix: [hosting, dcl] Show VAT percent rounded to 2 decimal places in the order confirmation page (PR #673)
|
||||
2.3: 2018-10-08
|
||||
* #5690: Generic payment page - allow admin to add a onetime/monthly product and the frontend for user to pay for this product (PR #666)
|
||||
2.2.2: 2018-09-28
|
||||
* #5721: Set calculator OS list in alphabetical order and set `Devuan Ascii` as the default (PR #668)
|
||||
* bugfix: Fix some typos and correct DE translations (PR #667)
|
||||
2.2.1: 2018-09-25
|
||||
* feature: Change DCLNavbarPlugin to show login option only if set (PR #665)
|
||||
* bugfix: Log opennebula errors and send proper message when vm terminate is not completed in the stipulated time (PR #648)
|
||||
2.2: 2018-09-06
|
||||
* bugfix: Include price in the Stripe plan name to make it distinct and to correct pricing since version 1.9
|
||||
2.1.2: 2018-08-30
|
||||
* bugfix: [blog, comic] Set blog rss feed for all blog templates
|
||||
2.1.1: 2018-08-24
|
||||
* #5487: [hosting] Add explicit warning message for teminating VM (PR #656)
|
||||
* bugfix: [dg] Send email to admin on dg subscription and increase cc_brand field to 128 characters (PR #652)
|
||||
* #5458: [admin] Make hostingorder more readable (PR #657)
|
||||
* bugfix: [CMS templates] Set description meta field of ungleich template (was missing before) and set ungleich glarus ag uniformly as author of various CMS pages (PR #653)
|
||||
* #5473: Ping a VM before saving ssh key of the user (PR #655)
|
||||
2.1: 2018-08-21
|
||||
* Bugfix: Increase CC brand name fields from 10 to 128 characters (PR #654)
|
||||
2.0.5: 2018-08-08
|
||||
* Fix IPv6 VM name in the billing invoice
|
||||
2.0.4: 2018-08-07
|
||||
* Add RSS feed link to the footer of the blog template (PR #651)
|
||||
* #5308: [ipv6only] Fix - when creating a VM, the name begins with v6only (PR #649)
|
||||
* #5293: Use `terminate-hard` action instead of `terminate` in the opennebula call to terminate a vm (PR #650)
|
||||
2.0.3: 2018-07-18
|
||||
* Remove unused /comic url (PR #644)
|
||||
* #5126: Allow dynamicweb sites to be iframed on other by setting `X_FRAME_OPTIONS_ALLOW_FROM_URI` (PR #645)
|
||||
2.0.2: 2018-07-14
|
||||
* bugfix: [blog] Add missing content block in the blog_ungleich.html template file
|
||||
2.0.1: 2018-07-14
|
||||
* bugfix: [blog] Enable content/structure mode in blog page
|
||||
2.0: 2018-07-07
|
||||
* #3747: [dcl,hosting] Add multiple cards support (PR #530)
|
||||
* #3934: [dcl,hosting] Create HostingOrder outside celery task and add and associate OrderDetail with HostingOrder (PR #624)
|
||||
* #4890: [hosting] Manage SSH keys using IPv6 of the VM (PR #640)
|
||||
* bugfix: Fix flake8 error that was ignored in release 1.9.1
|
||||
1.9.1: 2018-06-24
|
||||
* #4799: [dcl] Show selected vm templates only in calculator (PR #638)
|
||||
* #4847: [comic] Add google analytics code for comic.ungleich.ch (PR #639)
|
||||
* feature: add vm_type option to vm_template and dcl calculator to distinguish between public and ipv6only templates (PR #635)
|
||||
1.9: 2018-05-16
|
||||
* #4559: [cms] enable discount on cms calculator
|
||||
1.8: 2018-05-01
|
||||
* #4527: [hosting] cms calculator on non-cms pages for the hosting app
|
||||
* bgfix: [dcl] navbar dropdown target fix
|
||||
* bgfix: [hosting] login/signup pages footer link fix
|
||||
1.7.2: 2018-04-30
|
||||
* bgfix: [cms] add favicon extension to ungleich cms pages
|
||||
* #4474: [cms] reduce heading slider side padding
|
||||
1.7.1: 2018-04-21
|
||||
* #4481: [blog] fix de blog pages 500 error
|
||||
* #4370: [comic] new url /comic to show only comic blogs
|
||||
1.7: 2018-04-20
|
||||
* bgfix: [all] Make /blog available on all domains
|
||||
* #4367: [dcl] email logo resolution fix
|
||||
* #4376: [cms] dcl promo section plugin link color changed to brighter shade
|
||||
* #4379: [dcl] pricing without VAT
|
||||
* bgfix: [blog] fix top menu items to show only one item
|
||||
* #4297: [cms] favicon as a page attribute for dcl template
|
||||
1.6.5: 2018-04-08
|
||||
* #4396: [ungleich] add favicon to ungleich blog
|
||||
* #4327: [dcl] fix navbar logo repeat
|
||||
* bgfix: [hosting] fix broken footer links
|
||||
* bgfix: [dcl] remove ghost migrations from squashed migration
|
||||
* bgfix: [cms] redirect multi-tenant urls to /cms also
|
||||
1.6.4: 2018-04-06
|
||||
* #4362: [cms] Fix the need of dummy home page for different CMS-based sites
|
||||
1.6.3: 2018-04-05
|
||||
* #4377: [cms] header btn external link fix
|
||||
* #4378: [dcl cms] update CMS Integration to have different content for different domains
|
||||
1.6.2: 2018-04-01
|
||||
* bgfix: [dcl] Fix user activation email style; add/correct some DE text
|
||||
* #4373: [dcl] update footer menu for pw reset/login/signup/activation request pages
|
||||
1.6.1: 2018-03-28
|
||||
* bgfix: fix header slider interval issue
|
||||
* #4315: [cms] navbar consistency from cms page to static page
|
||||
* #4313: [hosting] footer style fix
|
||||
1.6: 2018-03-25
|
||||
* #4266: [dcl cms] add promotional section plugin
|
||||
* #3842: [dcl, hosting] change number formatting for all the numbers from german to english locale
|
||||
1.5.5: 2018-03-22
|
||||
* #4278: [dcl cms] edit options for cms navbar and header plugins
|
||||
* bgfix: [dcl cms] fix link plugin issues and section image alignment
|
||||
1.5.4: 2018-03-17
|
||||
* bgfix: [dcl cms] update DCLNavbarPlugin to allow change of brand logo and url
|
||||
1.5.3: 2018-03-16
|
||||
* #4262: [dcl] Bugfix for incorrect template name
|
||||
1.5.2: 2018-03-14
|
||||
* [devuan, ipv6] Add google analytics code for devuanhosting.com, ipv6onlyhosting.{com,net}
|
||||
* #4246: [dcl cms] Enable full width options for DCL plugins
|
||||
* #4247: [dcl cms] Fix alignment issues with the "plain heading" option
|
||||
1.5.1: 2018-03-11
|
||||
* bgfix: [dcl cms] Remove datacenterlight_content placeholder conf so that we can create a cms page without calculator
|
||||
1.5: 2018-03-09
|
||||
* #3554: [dcl] Remove some more beta access resources (some were left in the earlier release)
|
||||
* #3452: [hosting] Back button management and cache control for hosting views
|
||||
* #3718: [dcl] downtime page
|
||||
* #4119: [dcl] CMS plugins for dcl pages
|
||||
* #4231: [hosting] add company fiscal number to invoice footer
|
||||
1.4.1: 2018-02-23
|
||||
* bgfix: [dcl] fix header style for tos page
|
||||
* #3798: [dg] Redirect user to digital glarus on clicking logo in the email
|
||||
* #3554: [dcl] Remove beta access resources
|
||||
* #4166: [glasfaser] heading text not to be blocked by topnav on mobile after navbar menu click
|
||||
* bgfix: [hosting] Change sdd_size to ssd_size in VirtualMachineSerializer
|
||||
* bgfix: [dg] fix error on /digitalglarus/supporters/
|
||||
* #4166: [dcl] Fix scroll on top menu click
|
||||
* #4150: [ungleich] mobile font alignment
|
||||
* #3713: [dcl] clean up css
|
||||
* bgfix: [glasfaser] mobile top navigation toggle button fixed
|
||||
1.4: 2018-02-22
|
||||
* #4104: [cms, nuglarus] Multisite and access control of cms pages per user
|
||||
1.3.3: 2018-02-21
|
||||
* Add ALLOWED_HOST nüglarus.ch IDN
|
||||
* #4105: [cms] Add cms footer plugin
|
||||
* #4049: [blog] Replace header background image
|
||||
* #3670: [hosting] Shorten ssh key name
|
||||
* #4046: [hosting] Add sdd_size, hdd_size to VirtualMachineSerializer (No visual change)
|
||||
* bgfix: [hosting] increase invoice pdf resolution
|
||||
1.3.2: 2018-01-16
|
||||
* #4000: [all] Replace all ungleich.com with ungleich.ch
|
||||
* #4067: [ungleich] mobile navbar toggle fix
|
||||
* #4103: [dcl] Add "Terms of Service" item to the footer
|
||||
1.3.1: 2017-12-31
|
||||
* feature: [all] Load email configurations host, port and use_tls from env
|
||||
* bugfix: [all] Use ungleich's smtp as relayhost for sending emails
|
||||
1.3: 2017-12-27
|
||||
* #3911: [dcl] Integrate resend activation link into dcl landing payment page
|
||||
* #3972: [hosting] Add ungleich company info to invoice footer
|
||||
* #3974: [hosting] Improve invoice number: Show 404 for invoice resources that do not belong to the user
|
||||
* #3961: [ungleich] Add video cover to the header on ungleich.ch landing page and add corresponding cms plugin
|
||||
* #3774: [hosting] Update Stripe subscription on vm delete
|
||||
* [ungleich] Update text on landing page
|
||||
* #3601: [dcl, hosting] Change minimum required RAM from 2GB to 1GB
|
||||
* #3973: [dcl] Update datacenterlight and glasfaser contact address to Linthal and company name to "ungleich glarus ag"
|
||||
* #3993: [dg] Fix new user membership payment by setting cardholder_name field for UserBillingAddressForm
|
||||
* #3799: [dg] Make digital glarus billing work as monthly subscription
|
||||
* #3994: [dg] Add a line on signup for clarifying dcl users can login without new signup
|
||||
1.2.13: 2017-12-09
|
||||
* [cms] Introduce UngleichHeaderBackgroundImageAndTextSliderPlugin that allows to have scrolling images and texts
|
||||
* [cms] Remove <p> tag for ungleich cms customer item template
|
||||
1.2.12: 2017-12-09
|
||||
* #3594: [digitalglarus] Remove white scroll bar on the right in mobile
|
||||
* #3905: [ungleich] Update ungleich.ch header into a slider
|
||||
* #3968: [ungleich] Fix navbar logo alignment
|
||||
* [all] Enable logging custom modules
|
||||
1.2.11: 2017-11-30
|
||||
* [all] TravisCI: Test against python 3.4.2 only
|
||||
* [ungleich] Remove data-replaced image in ungleich CMS services item plugin template
|
||||
1.2.10: 2017-11-26
|
||||
* #3843: [ungleich] Add generic ungleich CMS template
|
||||
* #3672: [all] Clean existing automated tests
|
||||
1.2.9: 2017-11-13
|
||||
* #3848: [ungleich] Optimize ungleich.ch landing page
|
||||
* #3360: [ungleich] Ungleich.ch landing page animation fix
|
||||
* #3421: [hosting] Signup form placeholder translations
|
||||
* #3856: [ungleich] Glasfaser text modified
|
||||
* bugfix: [blog] Redirect user to ungleich home on ungleich logo click
|
||||
* #3858: [dcl] Change "affordable vm ..." text to "Ready in 30 seconds ..."
|
||||
1.2.8: 2017-10-21
|
||||
* Remove ALLOWED_HOST alplora.ch
|
||||
* Add ALLOWED_HOST hack4glarus.ch
|
||||
* Fetch page_title and meta_description dynamically in glasfaser CMS template
|
||||
1.2.7: 2017-10-20
|
||||
* Bugfix: [dcl, hosting] Fix Stripe js error in confirm payment page
|
||||
* #3847: [ungleich] change text 'hosting products' -> 'our products'
|
||||
* #3829: [dcl] Handle landing login fail in payment page itself
|
||||
* #3794: [dcl, hosting] Update email styles
|
||||
* #3828: [dcl, hosting] invoice period set to show monthly subscription
|
||||
* #3838: [hosting] restyle signup/login/password reset/password pages
|
||||
* Bugfix: [dg] Remove validate email link in the registration email
|
||||
* Feature: [ungleich_page] Add new glasfaser CMS template
|
||||
1.2.6: 2017-10-10
|
||||
* Bugfix: [dcl] Refactor and optimize images, links in glasfaser page
|
||||
* Bugfix: [dcl] Fix email not being sent issue
|
||||
1.2.5: 2017-10-10
|
||||
* #3785: [hosting] update 'my bills' page design
|
||||
* Bugfix: [hosting] card details input form alignment fix
|
||||
* #3823: [hosting] favicon link fixed
|
||||
* #3844: [dcl] Add Glasfaser page for advertisement
|
||||
1.2.4: 2017-10-02
|
||||
* #3780: [hosting] Store VM details locally
|
||||
* #3764: [hosting] Show cancelled VMs' invoices
|
||||
* #3736: [dcl] Refactor the place where we compute the VM price
|
||||
* #3730: [dcl] Refactor price parameter passed in the DCL flow
|
||||
* #3807: [dcl] Remove PricingView as it is no more used
|
||||
* #3813: [hosting] JS error in create ssh key page
|
||||
* #3756: [dcl] Update landing calculator and billing info page
|
||||
* Bugfix: Fix PR 493 bug that creates a new StripeCustomer for each buying of VM with the same email id
|
||||
* #3835: [all] Forbidden (403) CSRF verification failed issue.
|
||||
* Bugfix: [hosting] Dashboard strictly available after login
|
||||
* #3808: [dcl] Order confirmation page redesign
|
||||
1.2.3: 2017-09-25
|
||||
* #3484: [dcl, hosting] Refactored account activation, password reset, VM order and cancellation email
|
||||
* #3731: [dcl, hosting] Added cdist ssh key handler
|
||||
* #3628: [dcl] on hosting, VM is created at credit card info submit
|
||||
* #3772: [dcl] Updated hosting app billing into monthly subscription and added new text and translations
|
||||
* #3786: [hosting] Redesigned the hosting invoice and order-confirmation page
|
||||
* #3728: [hosting] VM Termination animation added
|
||||
* #3777: [hosting] Create new VM calculator added like dcl landing
|
||||
* #3781: [hosting] Resend activation mail
|
||||
* #3806: [hosting] Fix can not create VMs after password reset
|
||||
* #3812: [hosting] Modal check icon made thin and font-size fixed
|
||||
* Feature: [cms, blog] Added /cms prefix for all the django-cms generated urls
|
||||
* Bugfix: [dcl, hosting] added host to celery error mails
|
||||
* Bugfix: [ungleich] Fixed wrong subdomain digitalglarus.ungleich.ch
|
||||
1.2.2: 2017-09-08
|
||||
* #3704: [hosting] Added my settings page
|
||||
* #3771: [datacenterlight] Fixed the inconsistency in navbar style in billing page and onward
|
||||
* #3769: [datacenterlight] Fixed EN dashboard url redirecting to the wrong page
|
||||
* #3775: [hosting] Made the dashboard as the default start page for hosting app
|
||||
* #3779: [hosting] Changed signup validation and activation page navbar transparent
|
||||
* #3759: [hosting] Made the navbar style consistent to the dcl navbar and changed font weight from 300 to 400 for mobile navbar text
|
||||
* #3644: [datacenterlight] Added a login button on landing
|
||||
* #3659: [hosting] Changed hosting navbar design
|
||||
1.2.1: 2017-09-06
|
||||
* #3757: [datacenterlight] Added /l route for linkedin
|
||||
1.2: 2017-09-01
|
||||
* #3703: [hosting] Added a new dashboard
|
||||
* #3717: [datacenterlight, hosting] Changed warning color for box
|
||||
* #3748: [datacenterlight] Changed order msg position for mobile
|
||||
* #3762: [hosting] Text fix View details to See Invoice
|
||||
* #3765: [hosting] Text fix Your SSH Keys to My SSH Keys
|
||||
* #3639: [datacenterlight] Added navbar menu after payment page on landing
|
||||
* #3735: [hosting] Increased modal width and modal button width
|
||||
* #3709: Activated Text Plugin by default for the Page Title Text, enabled <title> tag text management
|
||||
* #3768: [datacenterlight, hosting] Fixed missing DE translation
|
||||
* #3678: [datacenterlight, hosting] Removed Lato font files
|
||||
1.1.1: 2017-08-29
|
||||
* #3709: [datacenterlight] Added faq tos cms template
|
||||
* #3657: [datacenterlight] Added a new contact section at landing
|
||||
* #3740: [datacenterlight] Made contact section to send email to info when user submits a message
|
||||
* #3757: [datacenterlight] Added new routes to dcl
|
||||
1.1: 2017-08-24
|
||||
* #3637: [datacenterlight, hosting] Added Stripe error handler
|
||||
* #3695: [hosting] Applied new design for VM list in hosting
|
||||
* #3565: [datacenterlight, hosting] Changed warning text color
|
||||
* #3622: [datacenterlight] Moved the create vm xml-rpc call made in the DCL VM purchase flow into a celery asynchronous task
|
||||
[datacenterlight] Added test for create vm celery task
|
||||
* #3711: [hosting] Displayed all IPv4s and IPv6s in the VM list
|
||||
* #3697: [hosting] Applied new design for VM detail page
|
||||
* #3645: [hosting] Fixed navbar movement on modal popup
|
||||
* #3698: [hosting] Applied new design for My Orders page
|
||||
* #3737: [all] Corrected/added missing google analytics and reformated code, fixed broken head tag
|
||||
* #3701: [datacenterlight] Enabled monthly Stripe subscriptions
|
||||
1.0.24: 2017-08-15
|
||||
* #3699: [datacenterlight] Added oneadmin ssh key by default to the created VM via DCL landing
|
||||
* #3687: [datacenterlight] Added the name of the customer as description field of the stripe metadata
|
||||
|
|
@ -364,7 +24,7 @@
|
|||
1.0.22: 2017-07-30
|
||||
* #3593: [datacenterlight] Removed underbars between social icons in index
|
||||
* #3509: [datacenterlight, hosting] Made navbar transparent and removed mobile navbar bug in login/signup/reset-password
|
||||
* #3592: [datacenterlight] Changed “Order Now” button text to “Continue/weiter”
|
||||
* #3592: [datacenterlight] Changed “Order Now” button text to “Continue/weiter”
|
||||
* #3579: [datacenterlight] Removed “blinks” on click on navbar menus
|
||||
* #3577: [datacenterlight] Added backend CPU, RAM, SSD fields validation
|
||||
* #3615: [datacenterlight] Decoupled landing VM templates from OpenNebula
|
||||
|
|
@ -375,7 +35,7 @@
|
|||
* #3629: [datacenterlight] Fixed navbar language switching bug
|
||||
1.0.21: 2017-07-21
|
||||
* #3591: [datacenterlight, payment] Fixed card holder name to appear on Confirm Order page
|
||||
* #3558: [datacenterlight] Changed font family and background color for header
|
||||
* #3558: [datacenterlight] Changed font family and background color for header
|
||||
* #3581: [datacenterlight] Lead font weight change
|
||||
* #3584: [all] Add flag is_superuser=True in MyUserManager
|
||||
1.0.20: 2017-07-18
|
||||
|
|
@ -447,14 +107,14 @@
|
|||
1.0.5: 2017-06-06
|
||||
* [all] General cleanup
|
||||
* [datacenterlight] Add German translations
|
||||
* [datacenterlight] Change beta access to subscriptions
|
||||
* [hosting] Add German translations
|
||||
* [datacenterlight] Change beta access to subscriptions
|
||||
* [hosting] Add German translations
|
||||
* [blog] Add German translation for header
|
||||
* [opennebula_api] Improve testing, add ssh key functions
|
||||
* [opennebula_api] Remove template views
|
||||
* [datacenterlight] Allow user to have multiple ssh keys
|
||||
* [datacenterlight] Allow user to have multiple ssh keys
|
||||
* [datacenterlight] Changed stripe.js v2 to v3
|
||||
* [datacenterlight] Added support for stripe payment errors on current user language
|
||||
* [datacenterlight] Added support for stripe payment errors on current user language
|
||||
1.0.4: 2017-06-05
|
||||
* [all] Added new Domains to accept
|
||||
1.0.3: 2017-06-02
|
||||
|
|
@ -466,3 +126,6 @@
|
|||
* [datacenterlight] Fix initially shown price
|
||||
1.0.0: 2017-05-25
|
||||
* Initial stable release
|
||||
|
||||
Next:
|
||||
[datacenterlight] Fixed credit card input issue
|
||||
|
|
|
|||
|
|
@ -3,10 +3,6 @@ ungleich
|
|||
|
||||
dynamicweb
|
||||
----------
|
||||
|
||||
.. image:: https://travis-ci.org/ungleich/dynamicweb.svg?branch=master
|
||||
:target: https://travis-ci.org/ungleich/dynamicweb
|
||||
|
||||
Website for ungleich GmbH
|
||||
=======
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-10 21:35+0530\n"
|
||||
"POT-Creation-Date: 2017-05-30 13:47+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
|
@ -18,99 +18,137 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:6
|
||||
msgid "New message"
|
||||
msgstr "Neue Nachricht"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:13
|
||||
msgid "Name:"
|
||||
msgstr "Name:"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:15
|
||||
msgid "What is your name ?"
|
||||
msgstr "Was ist Dein Name?"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:19
|
||||
msgid "From:"
|
||||
msgstr "Von:"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:21
|
||||
msgid "You email"
|
||||
msgstr "Deine Email"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:25
|
||||
msgid "Message:"
|
||||
msgstr "Nachricht:"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:27
|
||||
msgid "Leave us your message"
|
||||
msgstr "Schreibe hier Deine Nachricht"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:32
|
||||
msgid "Close"
|
||||
msgstr "schliessen"
|
||||
|
||||
#: alplora/templates/alplora/contact.html:33
|
||||
msgid "Send message"
|
||||
msgstr "Nachricht senden"
|
||||
|
||||
#: alplora/templates/alplora/contact_success.html:6
|
||||
msgid "Message Sent"
|
||||
msgstr "Nachricht gesendet"
|
||||
|
||||
#: alplora/templates/alplora/contact_success.html:9
|
||||
msgid "Thank you, we will contact you as soon as possible"
|
||||
msgstr "Dankeschön! Wir melden uns sobald wie möglich!"
|
||||
|
||||
#: alplora/templates/alplora/index.html:13
|
||||
msgid "Find your animal anywhere, anytime"
|
||||
msgstr "Finde deine Tiere"
|
||||
|
||||
#: alplora/templates/alplora/index.html:99
|
||||
#: alplora/templates/alplora/index.html:463
|
||||
msgid "About"
|
||||
msgstr "Über"
|
||||
|
||||
#: alplora/templates/alplora/index.html:102
|
||||
#: alplora/templates/alplora/index.html:248
|
||||
#: alplora/templates/alplora/index.html:469
|
||||
msgid "Why Alplora?"
|
||||
msgstr "Warum Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:105
|
||||
#: alplora/templates/alplora/index.html:466
|
||||
msgid "Usecase"
|
||||
msgstr ""
|
||||
|
||||
#: alplora/templates/alplora/index.html:108
|
||||
#: alplora/templates/alplora/index.html:358
|
||||
msgid "Testimonials"
|
||||
msgstr "Referenzen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:111
|
||||
#: alplora/templates/alplora/index.html:423
|
||||
#: alplora/templates/alplora/index.html:477
|
||||
msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
|
||||
#: alplora/templates/alplora/index.html:114
|
||||
msgid "Login"
|
||||
msgstr "Login"
|
||||
|
||||
#: alplora/templates/alplora/index.html:137
|
||||
msgid "Find your herd anytime, anywhere"
|
||||
msgstr "Finde deine Herde jederzeit und überall"
|
||||
|
||||
#: alplora/templates/alplora/index.html:138
|
||||
msgid "Perfect fit for Swiss Alps"
|
||||
msgstr "Perfekt für die Schweizer Alpen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:163
|
||||
msgid "What is Alplora?"
|
||||
msgstr "Was ist Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:164
|
||||
msgid ""
|
||||
"Alplora is an animal tracker made for outdoor grazing animals in Swiss Alps."
|
||||
msgstr ""
|
||||
"Alplora ist ein Sender, der speziell für Weidetiere in den Schweizer Alpen "
|
||||
"entwickelt wurde."
|
||||
|
||||
#: alplora/templates/alplora/index.html:165
|
||||
msgid "Alplora is just like a cattle bell, but much better."
|
||||
msgstr "Alplora ist wie eine Kuhglocke, nur viel besser."
|
||||
|
||||
#: alplora/templates/alplora/index.html:174
|
||||
msgid "LOST"
|
||||
msgstr "VERLOREN"
|
||||
|
||||
#: alplora/templates/alplora/index.html:176
|
||||
msgid "When an animal gets separated from the herd and is lost."
|
||||
msgstr "Wenn ein Tier sich von der Herde absondert und verloren geht."
|
||||
|
||||
#: alplora/templates/alplora/index.html:184
|
||||
msgid "WOLF"
|
||||
msgstr "WOLF"
|
||||
|
||||
#: alplora/templates/alplora/index.html:186
|
||||
msgid "When a wolf gets close to the herd."
|
||||
msgstr "Wenn ein Wolf sich der Herde nähert."
|
||||
|
||||
#: alplora/templates/alplora/index.html:193
|
||||
msgid "INJURED"
|
||||
msgstr "VERLETZT"
|
||||
|
||||
#: alplora/templates/alplora/index.html:195
|
||||
msgid "When one of the animals is hurt."
|
||||
msgstr "Wenn eins der Tiere verletzt ist."
|
||||
|
||||
#: alplora/templates/alplora/index.html:205
|
||||
msgid "How does Alplora track my animals?"
|
||||
msgstr "Wie kann Alplora meine Tiere verfolgen und ausfindig machen ?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:206
|
||||
msgid ""
|
||||
"Each animal will be wearing a small tracker,<P></P>and the tracker will be "
|
||||
"sending a signal every 30 to 60 minutes."
|
||||
|
|
@ -118,27 +156,33 @@ msgstr ""
|
|||
"Jedes Tier wird einen kleinen Sender tragen, <P></P> welcher alle 30 bis 60 "
|
||||
"Minuten ein Signal senden wird."
|
||||
|
||||
#: alplora/templates/alplora/index.html:215
|
||||
msgid "Access app"
|
||||
msgstr "Zugang zur App"
|
||||
|
||||
#: alplora/templates/alplora/index.html:217
|
||||
msgid ""
|
||||
"You can see the animal locations on a map by logging into our Alplora app."
|
||||
msgstr ""
|
||||
"Du kannst den Standort deiner Tiere jederzeit auf einer Karte verfolgen, "
|
||||
"indem du dich in unsere Alplora App einloggst."
|
||||
|
||||
#: alplora/templates/alplora/index.html:225
|
||||
msgid "Get an alarm"
|
||||
msgstr "Erhalte ein Warnsignal"
|
||||
|
||||
#: alplora/templates/alplora/index.html:227
|
||||
msgid ""
|
||||
"When certain signals for danger are detected, Alplora sends an alarm to you."
|
||||
msgstr ""
|
||||
"Wenn Anzeichen von Gefahr bestehen, sendet dir die Alplora App einen "
|
||||
"Warnsignal."
|
||||
|
||||
#: alplora/templates/alplora/index.html:235
|
||||
msgid "Find your animal"
|
||||
msgstr "Finde deine Tiere"
|
||||
|
||||
#: alplora/templates/alplora/index.html:238
|
||||
msgid ""
|
||||
"You can locate the animal in trouble on the realtime map and can take "
|
||||
"actions for keeping the animal safe."
|
||||
|
|
@ -146,9 +190,11 @@ msgstr ""
|
|||
"Du kannst dein Tier in Notsituationen auf einer Echtzeit-Karte lokalisieren "
|
||||
"und hast die Möglichkeit es in Sicherheit zu bringen."
|
||||
|
||||
#: alplora/templates/alplora/index.html:255
|
||||
msgid "Perfect fit for Swiss mountains"
|
||||
msgstr "Perfekt für die Schweizer Alpen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:257
|
||||
msgid ""
|
||||
"Alplora is made and tested for Swiss Alps. It is a perfect fit for Swiss "
|
||||
"environment."
|
||||
|
|
@ -156,9 +202,11 @@ msgstr ""
|
|||
"Alplora wurde speziell für die Schweizer Alpen entwickelt und vor Ort "
|
||||
"getestet. Das Produkt passt perfekt in die Schweiz!"
|
||||
|
||||
#: alplora/templates/alplora/index.html:263
|
||||
msgid "Energy efficient"
|
||||
msgstr "Energieeffizient"
|
||||
|
||||
#: alplora/templates/alplora/index.html:265
|
||||
msgid ""
|
||||
"Alplora uses the latest wireless technology, our batteries last the whole "
|
||||
"alp season."
|
||||
|
|
@ -166,9 +214,11 @@ msgstr ""
|
|||
"Alplora arbeitet mit den neuesten Technologien, so dass der Akku die gesamte "
|
||||
"Alpsaison überdauert."
|
||||
|
||||
#: alplora/templates/alplora/index.html:271
|
||||
msgid "Made with love"
|
||||
msgstr "Mit Liebe gemacht"
|
||||
|
||||
#: alplora/templates/alplora/index.html:273
|
||||
msgid ""
|
||||
"With a lot of love and respect for Swiss agriculture and nature, Alplora is "
|
||||
"made by a Swiss company."
|
||||
|
|
@ -176,49 +226,61 @@ msgstr ""
|
|||
"Alplora wurde mit viel Liebe und Respekt für die Schweizer Natur und "
|
||||
"Landwirtschaft von einer Schweizer Firma entwickelt."
|
||||
|
||||
#: alplora/templates/alplora/index.html:285
|
||||
msgid "Who needs Alplora?"
|
||||
msgstr "Wer benötigt Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:301
|
||||
msgid " Are your animals..."
|
||||
msgstr "Sind deine Tiere..."
|
||||
|
||||
#: alplora/templates/alplora/index.html:304
|
||||
msgid "sheep, goats, cows or llamas living freely in the Alps?"
|
||||
msgstr "Schafe, Ziegen, Kühe oder Lamas, die frei in den Alpen leben?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:306
|
||||
msgid "wearing bells?"
|
||||
msgstr "solche, die Glocken tragen?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:308
|
||||
msgid ""
|
||||
"sometimes getting confused and going too far away from where they are "
|
||||
"supposed to be?"
|
||||
msgstr ""
|
||||
"manchmal verwirrt und entfernen sich zu weit von ihrem vorgesehenen Standort?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:332
|
||||
msgid "Do you..."
|
||||
msgstr "Möchtest du..."
|
||||
|
||||
#: alplora/templates/alplora/index.html:335
|
||||
msgid "have animals which are staying outdoor during some time of the year?"
|
||||
msgstr ""
|
||||
"deine Tiere, die eine längere Zeit im Jahr unbeobachtet Draussen verbringen, "
|
||||
"schützen und überwachen können?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:337
|
||||
msgid "want to get an alarm when your animal is hurt, or in danger?"
|
||||
msgstr ""
|
||||
"alarmiert werden, wenn sich eines deiner Tiere verletzt oder in Gefahr "
|
||||
"befindet ?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:339
|
||||
msgid "want to see where your animals are on your cell phone map?"
|
||||
msgstr ""
|
||||
"mit deinem Smartphone auf einer Karte sehen können, wo sich deine Tiere "
|
||||
"befinden? "
|
||||
|
||||
#: alplora/templates/alplora/index.html:341
|
||||
msgid "want to make sure 24/7 that your animals are safe?"
|
||||
msgstr ""
|
||||
"sicherstellen, dass sich deine Tiere rund um die Uhr in Sicherheit befinden?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:359
|
||||
msgid "What our customers say"
|
||||
msgstr ""
|
||||
|
||||
#: alplora/templates/alplora/index.html:379
|
||||
msgid ""
|
||||
"“Alplora is an innovation in looking after my cows. I can check where my "
|
||||
"cows have been in the higher mountain all day while doing other works at the "
|
||||
|
|
@ -230,9 +292,11 @@ msgstr ""
|
|||
"selben Zeit andereDinge auf dem Hof unten im Dorf erledigen. Dank Alplora "
|
||||
"kann ich meinen Kühenmehr Sicherheit gewährleisten."
|
||||
|
||||
#: alplora/templates/alplora/index.html:382
|
||||
msgid "Farmer in canton Glarus"
|
||||
msgstr "Bauern im Kanton Glarus"
|
||||
|
||||
#: alplora/templates/alplora/index.html:388
|
||||
msgid ""
|
||||
"\"Alplora is exactly what I was waiting for. I have lost my sheep almost "
|
||||
"every year. Finally I have a way when I want to locate them.\""
|
||||
|
|
@ -241,9 +305,11 @@ msgstr ""
|
|||
"Schafe fastjedes Jahr aus den Augen verloren. Nun habe ich endlich die "
|
||||
"Möglichkeit, sie zulokalisieren.\""
|
||||
|
||||
#: alplora/templates/alplora/index.html:391
|
||||
msgid "Owner of 50 sheep "
|
||||
msgstr "Besitzerin von 50 Schafen"
|
||||
|
||||
#: alplora/templates/alplora/index.html:397
|
||||
msgid ""
|
||||
"\"I have a farm down all the way down in the village and y goats are always "
|
||||
"freely grazing in the Alps. There are times that I am worried about them but "
|
||||
|
|
@ -257,23 +323,30 @@ msgstr ""
|
|||
"noch um meineanderen Tiere kümmern muss. Mit Alplora kann ich nun ohne "
|
||||
"Probleme beides tun.\""
|
||||
|
||||
#: alplora/templates/alplora/index.html:401
|
||||
msgid "Farmer at Berner Oberland"
|
||||
msgstr "Bauer aus dem Berner Oberland"
|
||||
|
||||
#: alplora/templates/alplora/index.html:418
|
||||
msgid "How do I get Alplora?"
|
||||
msgstr "Wie kriege ich Zugriff zu Alplora?"
|
||||
|
||||
#: alplora/templates/alplora/index.html:419
|
||||
msgid "Click the button below and leave us your contact."
|
||||
msgstr "Klicke unten auf Kontakt und hinterlasse uns deine Angaben."
|
||||
|
||||
#: alplora/templates/alplora/index.html:419
|
||||
msgid "Team Alplora will contact you and visit you with a tracking device."
|
||||
msgstr "Das Alpora Team wird sich mit Dir schnellstens in Verbindung setzen."
|
||||
|
||||
#: alplora/templates/alplora/index.html:459
|
||||
msgid "Home"
|
||||
msgstr "Startseite"
|
||||
|
||||
#: alplora/templates/alplora/index.html:472
|
||||
msgid "Testimonials "
|
||||
msgstr "Referenzen"
|
||||
|
||||
#: alplora/views.py:24
|
||||
msgid "Message Successfully Sent"
|
||||
msgstr ""
|
||||
|
|
|
|||
|
|
@ -6,6 +6,14 @@
|
|||
{% block content_blog %}
|
||||
<section class="blog-list">
|
||||
{% block blog_title %}
|
||||
<header>
|
||||
<h2>
|
||||
{% if author %}{% trans "Articles by" %} {{ author.get_full_name }}
|
||||
{% elif archive_date %}{% trans "Archive" %} – {% if month %}{{ archive_date|date:'F' }} {% endif %}{{ year }}
|
||||
{% elif tagged_entries %}{% trans "Tag" %} – {{ tagged_entries|capfirst }}
|
||||
{% elif category %}{% trans "Category" %} – {{ category }}{% endif %}
|
||||
</h2>
|
||||
</header>
|
||||
{% endblock %}
|
||||
{% for post in post_list %}
|
||||
{% include "djangocms_blog/includes/blog_item.html" with post=post image="true" TRUNCWORDS_COUNT=TRUNCWORDS_COUNT %}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,9 @@
|
|||
from django.contrib import admin
|
||||
from cms.admin.placeholderadmin import PlaceholderAdminMixin
|
||||
from cms.extensions import PageExtensionAdmin
|
||||
from .cms_models import CMSIntegration, CMSFaviconExtension
|
||||
from .models import VMPricing, VMTemplate
|
||||
|
||||
from .models import BetaAccess, BetaAccessVMType, BetaAccessVM
|
||||
# Register your models here.
|
||||
|
||||
|
||||
class CMSIntegrationAdmin(PlaceholderAdminMixin, admin.ModelAdmin):
|
||||
list_display = ('name', 'domain')
|
||||
|
||||
|
||||
class CMSFaviconExtensionAdmin(PageExtensionAdmin):
|
||||
pass
|
||||
|
||||
|
||||
admin.site.register(CMSIntegration, CMSIntegrationAdmin)
|
||||
admin.site.register(CMSFaviconExtension, CMSFaviconExtensionAdmin)
|
||||
admin.site.register(VMPricing)
|
||||
admin.site.register(VMTemplate)
|
||||
admin.site.register(BetaAccess)
|
||||
admin.site.register(BetaAccessVMType)
|
||||
admin.site.register(BetaAccessVM)
|
||||
|
|
|
|||
|
|
@ -1,364 +0,0 @@
|
|||
from cms.extensions import PageExtension
|
||||
from cms.extensions.extension_pool import extension_pool
|
||||
from cms.models.fields import PlaceholderField
|
||||
from cms.models.pluginmodel import CMSPlugin
|
||||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from django.contrib.sites.models import Site
|
||||
from django.db import models
|
||||
from django.utils.safestring import mark_safe
|
||||
from djangocms_text_ckeditor.fields import HTMLField
|
||||
from filer.fields.file import FilerFileField
|
||||
from filer.fields.image import FilerImageField
|
||||
|
||||
from datacenterlight.models import VMPricing, VMTemplate
|
||||
|
||||
|
||||
class CMSIntegration(models.Model):
|
||||
name = models.CharField(
|
||||
max_length=100, default='default',
|
||||
help_text=(
|
||||
'A unique name for the Integration. This name will be used to '
|
||||
'fetch the Integration into pages'
|
||||
)
|
||||
)
|
||||
footer_placeholder = PlaceholderField(
|
||||
'datacenterlight_footer', related_name='dcl-footer-placeholder+'
|
||||
)
|
||||
navbar_placeholder = PlaceholderField(
|
||||
'datacenterlight_navbar', related_name='dcl-navbar-placeholder+'
|
||||
)
|
||||
calculator_placeholder = PlaceholderField(
|
||||
'datacenterlight_calculator',
|
||||
related_name='dcl-calculator-placeholder+'
|
||||
)
|
||||
domain = models.ForeignKey(Site, null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('name', 'domain')
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class CMSFaviconExtension(PageExtension):
|
||||
favicon = FilerFileField(related_name="cms_favicon_image")
|
||||
|
||||
|
||||
extension_pool.register(CMSFaviconExtension)
|
||||
|
||||
|
||||
# Models for CMS Plugins
|
||||
|
||||
class DCLSectionPluginModel(CMSPlugin):
|
||||
heading = models.CharField(
|
||||
blank=True, null=True, max_length=100,
|
||||
help_text='An optional heading for the Section',
|
||||
)
|
||||
content = HTMLField()
|
||||
TEXT_DIRECTIONS = (
|
||||
('left', 'Left'),
|
||||
('right', 'Right')
|
||||
)
|
||||
text_direction = models.CharField(
|
||||
choices=TEXT_DIRECTIONS, max_length=10, default=True,
|
||||
help_text='The alignment of text in the section'
|
||||
)
|
||||
html_id = models.SlugField(
|
||||
blank=True, null=True,
|
||||
help_text=(
|
||||
'An optional html id for the Section. Required to set as target '
|
||||
'of a link on page'
|
||||
)
|
||||
)
|
||||
plain_heading = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to keep the heading style simpler.'
|
||||
)
|
||||
center_on_mobile = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to center align content on small screens.'
|
||||
)
|
||||
background_gradient = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to add a gradient background to the section.'
|
||||
)
|
||||
|
||||
def get_extra_classes(self):
|
||||
extra_classes = self.text_direction
|
||||
if self.center_on_mobile:
|
||||
extra_classes += ' section-sm-center'
|
||||
if self.background_gradient:
|
||||
extra_classes += ' section-gradient'
|
||||
if self.plain_heading:
|
||||
extra_classes += ' split-section-plain'
|
||||
return extra_classes
|
||||
|
||||
def __str__(self):
|
||||
return '#' + self.html_id if self.html_id else str(self.pk)
|
||||
|
||||
|
||||
class DCLBannerListPluginModel(CMSPlugin):
|
||||
heading = models.CharField(
|
||||
blank=True, null=True, max_length=100,
|
||||
help_text='An optional heading for the Section',
|
||||
)
|
||||
html_id = models.SlugField(
|
||||
blank=True, null=True,
|
||||
help_text=(
|
||||
'An optional html id for the Section. Required to set as target '
|
||||
'of a link on page'
|
||||
)
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return '#' + self.html_id if self.html_id else str(self.pk)
|
||||
|
||||
|
||||
class DCLBannerItemPluginModel(CMSPlugin):
|
||||
content = HTMLField()
|
||||
banner_text = HTMLField(
|
||||
blank=True, null=True, max_length=100,
|
||||
help_text='Optional text to be shown as banner in other half.',
|
||||
)
|
||||
banner_image = FilerImageField(
|
||||
on_delete=models.CASCADE, null=True, blank=True,
|
||||
help_text='Optional image to be used in the banner in other half.'
|
||||
)
|
||||
TEXT_DIRECTIONS = (
|
||||
('left', 'Left'),
|
||||
('right', 'Right')
|
||||
)
|
||||
text_direction = models.CharField(
|
||||
choices=TEXT_DIRECTIONS, max_length=10, default=True,
|
||||
help_text='The alignment of text in the section'
|
||||
)
|
||||
|
||||
def get_extra_classes(self):
|
||||
extra_classes = ''
|
||||
if self.text_direction == 'left':
|
||||
extra_classes = 'flex-row-rev'
|
||||
return extra_classes
|
||||
|
||||
|
||||
class DCLLinkPluginModel(CMSPlugin):
|
||||
target = models.CharField(
|
||||
max_length=100,
|
||||
help_text='Url or #id to navigate to'
|
||||
)
|
||||
text = models.CharField(
|
||||
max_length=50,
|
||||
help_text='Text for the menu item'
|
||||
)
|
||||
title = models.CharField(
|
||||
blank=True, null=True, max_length=100,
|
||||
help_text=(
|
||||
'Optional title text, that will be shown when a user '
|
||||
'hovers over the link'
|
||||
)
|
||||
)
|
||||
separator = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to include a separator after the previous link'
|
||||
)
|
||||
|
||||
|
||||
class DCLNavbarPluginModel(CMSPlugin):
|
||||
logo_light = FilerImageField(
|
||||
on_delete=models.CASCADE, null=True, blank=True,
|
||||
help_text='Logo to be used on transparent navbar',
|
||||
related_name="dcl_navbar_logo_light",
|
||||
)
|
||||
logo_dark = FilerImageField(
|
||||
on_delete=models.CASCADE, null=True, blank=True,
|
||||
help_text='Logo to be used on white navbar',
|
||||
related_name="dcl_navbar_logo_dark",
|
||||
)
|
||||
logo_url = models.URLField(max_length=300, null=True, blank=True)
|
||||
language_dropdown = models.BooleanField(
|
||||
default=True,
|
||||
help_text='Select to include the language selection dropdown.'
|
||||
)
|
||||
show_login_option = models.BooleanField(
|
||||
default=True,
|
||||
help_text='Uncheck this if you do not want to show login/dashboard.'
|
||||
)
|
||||
|
||||
def get_logo_dark(self):
|
||||
# used only if atleast one logo exists
|
||||
return self.logo_dark.url if self.logo_dark else self.logo_light.url
|
||||
|
||||
def get_logo_light(self):
|
||||
# used only if atleast one logo exists
|
||||
return self.logo_light.url if self.logo_light else self.logo_dark.url
|
||||
|
||||
|
||||
class DCLNavbarDropdownPluginModel(CMSPlugin):
|
||||
target = models.CharField(
|
||||
max_length=100, null=True, blank=True,
|
||||
help_text='Optional Url or #id to navigate on click'
|
||||
)
|
||||
text = models.CharField(
|
||||
max_length=50,
|
||||
help_text='Text for the dropdown toggle'
|
||||
)
|
||||
|
||||
|
||||
class DCLContactPluginModel(CMSPlugin):
|
||||
heading = models.CharField(max_length=100, default="Contact", blank=True)
|
||||
organization_name = models.CharField(
|
||||
max_length=100, default="ungleich glarus ag", blank=True
|
||||
)
|
||||
email = models.EmailField(max_length=200, default="info@ungleich.ch")
|
||||
address = models.CharField(
|
||||
max_length=100, default="In der Au 7, Schwanden 8762", blank=True
|
||||
)
|
||||
country = models.CharField(
|
||||
max_length=100, default="Switzerland", blank=True
|
||||
)
|
||||
form_header = models.CharField(
|
||||
max_length=100, default="Send us a message.", blank=True
|
||||
)
|
||||
|
||||
|
||||
class DCLFooterPluginModel(CMSPlugin):
|
||||
copyright_label = models.CharField(
|
||||
max_length=100, default='ungleich glarus ag', blank=True,
|
||||
help_text='Name of the company alongside the copyright year'
|
||||
)
|
||||
|
||||
|
||||
class DCLSectionIconPluginModel(CMSPlugin):
|
||||
fontawesome_icon_name = models.CharField(
|
||||
max_length=30,
|
||||
help_text=mark_safe(
|
||||
'Name of the fontawesome icon to use. '
|
||||
'<a href="https://fontawesome.com/v4.7.0/icons/" target="_blank">'
|
||||
'Refer docs.</a>'
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class DCLSectionImagePluginModel(CMSPlugin):
|
||||
image = FilerImageField(
|
||||
on_delete=models.CASCADE,
|
||||
help_text=(
|
||||
'Image file to be used in section. Add multiple plugins '
|
||||
'to add more than one image'
|
||||
)
|
||||
)
|
||||
caption = models.CharField(
|
||||
max_length=100, null=True, blank=True,
|
||||
help_text='Optional caption for the image.'
|
||||
)
|
||||
|
||||
|
||||
class DCLSectionPromoPluginModel(CMSPlugin):
|
||||
background_image = FilerImageField(
|
||||
on_delete=models.CASCADE, null=True, blank=True,
|
||||
help_text=('Optional background image for the Promo Section'),
|
||||
related_name="dcl_section_promo_promo",
|
||||
)
|
||||
heading = models.CharField(
|
||||
blank=True, null=True, max_length=100,
|
||||
help_text='An optional heading for the Promo Section',
|
||||
)
|
||||
subheading = models.CharField(
|
||||
blank=True, null=True, max_length=200,
|
||||
help_text='An optional subheading for the Promo Section',
|
||||
)
|
||||
content = HTMLField()
|
||||
html_id = models.SlugField(
|
||||
blank=True, null=True,
|
||||
help_text=(
|
||||
'An optional html id for the Section. Required to set as target '
|
||||
'of a link on page'
|
||||
)
|
||||
)
|
||||
plain_heading = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to keep the heading style simpler.'
|
||||
)
|
||||
text_center = models.BooleanField(
|
||||
default=False,
|
||||
help_text='Select to center align content on small screens.'
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return '#' + self.html_id if self.html_id else str(self.pk)
|
||||
|
||||
def get_extra_classes(self):
|
||||
extra_classes = ''
|
||||
if self.text_center:
|
||||
extra_classes += ' text-center'
|
||||
if self.plain_heading:
|
||||
extra_classes += ' promo-section-plain'
|
||||
if self.background_image:
|
||||
extra_classes += ' promo-with-bg'
|
||||
return extra_classes
|
||||
|
||||
|
||||
class MultipleChoiceArrayField(ArrayField):
|
||||
"""
|
||||
A field that allows us to store an array of choices.
|
||||
Uses Django's Postgres ArrayField
|
||||
and a MultipleChoiceField for its formfield.
|
||||
"""
|
||||
VMTemplateChoices = []
|
||||
if settings.OPENNEBULA_DOMAIN != 'test_domain':
|
||||
VMTemplateChoices = list(
|
||||
(
|
||||
str(obj.opennebula_vm_template_id),
|
||||
(obj.name + ' - ' + VMTemplate.IPV6.title()
|
||||
if obj.vm_type == VMTemplate.IPV6 else obj.name
|
||||
)
|
||||
)
|
||||
for obj in VMTemplate.objects.all()
|
||||
)
|
||||
|
||||
def formfield(self, **kwargs):
|
||||
defaults = {
|
||||
'form_class': forms.MultipleChoiceField,
|
||||
'choices': self.VMTemplateChoices,
|
||||
}
|
||||
defaults.update(kwargs)
|
||||
# Skip our parent's formfield implementation completely as we don't
|
||||
# care for it.
|
||||
# pylint:disable=bad-super-call
|
||||
return super(ArrayField, self).formfield(**defaults)
|
||||
|
||||
|
||||
class DCLCalculatorPluginModel(CMSPlugin):
|
||||
pricing = models.ForeignKey(
|
||||
VMPricing,
|
||||
related_name="dcl_custom_pricing_vm_pricing",
|
||||
help_text='Choose a pricing that will be associated with this '
|
||||
'Calculator'
|
||||
)
|
||||
vm_type = models.CharField(
|
||||
max_length=50, choices=VMTemplate.VM_TYPE_CHOICES,
|
||||
default=VMTemplate.PUBLIC
|
||||
)
|
||||
vm_templates_to_show = MultipleChoiceArrayField(
|
||||
base_field=models.CharField(
|
||||
blank=True,
|
||||
max_length=256,
|
||||
),
|
||||
default=list,
|
||||
blank=True,
|
||||
help_text="Recommended: If you wish to show all templates of the "
|
||||
"corresponding VM Type (public/ipv6only), please do not "
|
||||
"select any of the items in the above field. "
|
||||
"This will allow any new template(s) added "
|
||||
"in the backend to be automatically listed in this "
|
||||
"calculator instance."
|
||||
)
|
||||
default_selected_template = models.CharField(
|
||||
default="Devuan Ascii",
|
||||
null=True,
|
||||
max_length=128,
|
||||
help_text="Write the name of the template that you need selected as"
|
||||
" default when the calculator loads"
|
||||
)
|
||||
enable_512mb_ram = models.BooleanField(default=False)
|
||||
|
|
@ -1,180 +0,0 @@
|
|||
from cms.plugin_base import CMSPluginBase
|
||||
from cms.plugin_pool import plugin_pool
|
||||
|
||||
from .cms_models import (
|
||||
DCLBannerItemPluginModel, DCLBannerListPluginModel, DCLContactPluginModel,
|
||||
DCLFooterPluginModel, DCLLinkPluginModel, DCLNavbarDropdownPluginModel,
|
||||
DCLSectionIconPluginModel, DCLSectionImagePluginModel,
|
||||
DCLSectionPluginModel, DCLNavbarPluginModel,
|
||||
DCLSectionPromoPluginModel, DCLCalculatorPluginModel
|
||||
)
|
||||
from .models import VMTemplate
|
||||
from datacenterlight.utils import clear_all_session_vars
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLSectionPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Section Plugin"
|
||||
model = DCLSectionPluginModel
|
||||
render_template = "datacenterlight/cms/section.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = [
|
||||
'DCLSectionIconPlugin', 'DCLSectionImagePlugin',
|
||||
'DCLSectionPromoPlugin', 'UngleichHTMLPlugin', 'DCLCalculatorPlugin'
|
||||
]
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
context = super(DCLSectionPlugin, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
context['children_to_side'] = []
|
||||
context['children_to_content'] = []
|
||||
context['children_calculator'] = []
|
||||
if instance.child_plugin_instances is not None:
|
||||
right_children = [
|
||||
'DCLSectionImagePluginModel',
|
||||
'DCLSectionIconPluginModel',
|
||||
]
|
||||
for child in instance.child_plugin_instances:
|
||||
if child.__class__.__name__ in right_children:
|
||||
context['children_to_side'].append(child)
|
||||
elif child.plugin_type == 'DCLCalculatorPlugin':
|
||||
context['children_calculator'].append(child)
|
||||
else:
|
||||
context['children_to_content'].append(child)
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLSectionIconPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Section Icon Plugin"
|
||||
model = DCLSectionIconPluginModel
|
||||
render_template = "datacenterlight/cms/section_icon.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLSectionImagePlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Section Image Plugin"
|
||||
model = DCLSectionImagePluginModel
|
||||
render_template = "datacenterlight/cms/section_image.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLSectionPromoPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Section Promo Plugin"
|
||||
model = DCLSectionPromoPluginModel
|
||||
render_template = "datacenterlight/cms/section_promo.html"
|
||||
cache = False
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLCalculatorPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Calculator Plugin"
|
||||
model = DCLCalculatorPluginModel
|
||||
render_template = "datacenterlight/cms/calculator.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
|
||||
def render(self, context, instance, placeholder):
|
||||
clear_all_session_vars(context['request'])
|
||||
context = super(DCLCalculatorPlugin, self).render(
|
||||
context, instance, placeholder
|
||||
)
|
||||
ids = instance.vm_templates_to_show
|
||||
if ids:
|
||||
context['templates'] = VMTemplate.objects.filter(
|
||||
vm_type=instance.vm_type
|
||||
).filter(opennebula_vm_template_id__in=ids).order_by('name')
|
||||
else:
|
||||
context['templates'] = VMTemplate.objects.filter(
|
||||
vm_type=instance.vm_type
|
||||
).order_by('name')
|
||||
context['instance'] = instance
|
||||
context['min_ram'] = 0.5 if instance.enable_512mb_ram else 1
|
||||
return context
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLBannerListPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Banner List Plugin"
|
||||
model = DCLBannerListPluginModel
|
||||
render_template = "datacenterlight/cms/banner_list.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['DCLBannerItemPlugin']
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLBannerItemPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Banner Item Plugin"
|
||||
model = DCLBannerItemPluginModel
|
||||
render_template = "datacenterlight/cms/banner_item.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
parent_classes = ['DCLBannerListPlugin']
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLNavbarPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Navbar Plugin"
|
||||
model = DCLNavbarPluginModel
|
||||
render_template = "datacenterlight/cms/navbar.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['DCLLinkPlugin', 'DCLNavbarDropdownPlugin']
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLNavbarDropdownPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Navbar Dropdown Plugin"
|
||||
model = DCLNavbarDropdownPluginModel
|
||||
render_template = "datacenterlight/cms/navbar_dropdown.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['DCLLinkPlugin']
|
||||
require_parent = True
|
||||
parent_classes = ['DCLNavbarPlugin']
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLLinkPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Link Plugin"
|
||||
model = DCLLinkPluginModel
|
||||
render_template = "datacenterlight/cms/link.html"
|
||||
cache = False
|
||||
require_parent = True
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLContactPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Contact Plugin"
|
||||
model = DCLContactPluginModel
|
||||
render_template = "datacenterlight/cms/contact.html"
|
||||
cache = False
|
||||
|
||||
|
||||
@plugin_pool.register_plugin
|
||||
class DCLFooterPlugin(CMSPluginBase):
|
||||
module = "Datacenterlight"
|
||||
name = "DCL Footer Plugin"
|
||||
model = DCLFooterPluginModel
|
||||
render_template = "datacenterlight/cms/footer.html"
|
||||
cache = False
|
||||
allow_children = True
|
||||
child_classes = ['DCLLinkPlugin']
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
from cms.extensions.toolbar import ExtensionToolbar
|
||||
from cms.toolbar_pool import toolbar_pool
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from .cms_models import CMSFaviconExtension
|
||||
|
||||
|
||||
@toolbar_pool.register
|
||||
class CMSFaviconExtensionToolbar(ExtensionToolbar):
|
||||
# defineds the model for the current toolbar
|
||||
model = CMSFaviconExtension
|
||||
|
||||
def populate(self):
|
||||
# setup the extension toolbar with permissions and sanity checks
|
||||
current_page_menu = self._setup_extension_toolbar()
|
||||
# if it's all ok
|
||||
if current_page_menu:
|
||||
# retrieves the instance of the current extension (if any) and the toolbar item url
|
||||
page_extension, url = self.get_page_extension_admin()
|
||||
if url:
|
||||
# adds a toolbar item
|
||||
current_page_menu.add_modal_item(
|
||||
_('CMS Favicon'), url=url, disabled=not self.toolbar.edit_mode
|
||||
)
|
||||
|
|
@ -1,9 +1,19 @@
|
|||
from django import forms
|
||||
|
||||
from .models import ContactUs
|
||||
from .models import BetaAccess
|
||||
|
||||
|
||||
class ContactForm(forms.ModelForm):
|
||||
class BetaAccessForm(forms.ModelForm):
|
||||
email = forms.CharField(widget=forms.EmailInput())
|
||||
|
||||
class Meta:
|
||||
fields = ['name', 'email', 'message']
|
||||
model = ContactUs
|
||||
fields = ['name', 'email']
|
||||
model = BetaAccess
|
||||
|
||||
|
||||
# class BetaAccessVMForm(forms.ModelForm):
|
||||
# type = forms.CharField(widget=forms.EmailInput())
|
||||
|
||||
# class Meta:
|
||||
# fields = ['email']
|
||||
# model = BetaAccessVM
|
||||
|
|
|
|||
|
|
@ -8,154 +8,37 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-11-15 17:33+0000\n"
|
||||
"PO-Revision-Date: 2018-03-30 23:22+0000\n"
|
||||
"Last-Translator: b'Anonymous User <coder.purple+25@gmail.com>'\n"
|
||||
"POT-Creation-Date: 2017-08-03 03:10+0530\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Translated-Using: django-rosetta 0.8.1\n"
|
||||
|
||||
msgid "CMS Favicon"
|
||||
msgstr "CMS Favicon"
|
||||
|
||||
#, python-format
|
||||
msgid "Your New VM %(vm_name)s at Data Center Light"
|
||||
msgstr "Deine neue VM %(vm_name)s bei Data Center Light"
|
||||
|
||||
msgid "Your VM is almost ready!"
|
||||
msgstr "Deine VM ist fast fertig!"
|
||||
|
||||
msgid ""
|
||||
"You need to specify your public SSH key to access your VM. You can either "
|
||||
"add your existing key, or generate a new key pair by clicking the generate "
|
||||
"button below. After choosing your public SSH key option you’ll be directed "
|
||||
"to the order confirmation page."
|
||||
msgstr ""
|
||||
"Du musst deinen öffentlichen SSH-Schlüssel angeben, um auf deine VM "
|
||||
"zugreifen zu können. Du kannst entweder deinen vorhandenen Schlüssel "
|
||||
"hinzufügen oder ein neues Schlüsselpaar generieren, indem du auf die "
|
||||
"Schaltfläche \"Generieren\" unten klickst. Nachdem du deine öffentliche SSH-"
|
||||
"Schlüsseloption ausgewählt hast, wirst du zur Bestellbestätigungsseite "
|
||||
"weitergeleitet. "
|
||||
|
||||
msgid "All Rights Reserved"
|
||||
msgstr "Alle Rechte vorbehalten"
|
||||
|
||||
msgid "Toggle navigation"
|
||||
msgstr "Umschalten"
|
||||
|
||||
msgid "Login"
|
||||
msgstr "Anmelden"
|
||||
|
||||
msgid "Dashboard"
|
||||
msgstr "Dashboard"
|
||||
|
||||
msgid "Thank you for contacting us."
|
||||
msgstr "Nachricht gesendet."
|
||||
|
||||
msgid "Your message was successfully sent to our team."
|
||||
msgstr "Vielen Dank für Deine Nachricht."
|
||||
|
||||
msgid "Get in touch with us!"
|
||||
msgstr "Sende uns eine Nachricht."
|
||||
|
||||
msgid "Name"
|
||||
msgid "Enter name"
|
||||
msgstr "Name"
|
||||
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
msgid "Email"
|
||||
msgid "Enter email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
msgid "Request Beta Access"
|
||||
msgstr "Beantrage Beta-Zugang"
|
||||
|
||||
msgid "Message"
|
||||
msgstr "Nachricht"
|
||||
msgid "Request Sent"
|
||||
msgstr "Anfrage verschickt"
|
||||
|
||||
msgid "Sorry, there was an unexpected error. Kindly retry."
|
||||
msgid ""
|
||||
"Thank you for your subscription! You will receive a confirmation mail from "
|
||||
"our team"
|
||||
msgstr ""
|
||||
"Bitte entschuldige, es scheint ein unerwarteter Fehler aufgetreten zu sein. "
|
||||
"Versuche es doch bitte noch einmal."
|
||||
|
||||
msgid "SUBMIT"
|
||||
msgstr "ABSENDEN"
|
||||
|
||||
msgid "Data Center Light Account Activation"
|
||||
msgstr "Data Center Light Account Aktivierung"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can activate your Data Center Light account by clicking <a href="
|
||||
"\"%(base_url)s%(activation_link)s\" style=\"text-decoration: none; color: "
|
||||
"#4382c8; font-weight: 400;\">here</a>."
|
||||
msgstr ""
|
||||
"Klicke <a href=\"%(base_url)s%(activation_link)s\"style=\"text-decoration: "
|
||||
"none; color: #4382c8; font-weight: 400;\">hier</a> um deinen Data Center "
|
||||
"Light Account zu aktivieren."
|
||||
|
||||
msgid ""
|
||||
"You can also copy and paste the following link into the address bar of your "
|
||||
"browser to activate your Data Center Light account."
|
||||
msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers."
|
||||
|
||||
msgid "Your account details are as follows"
|
||||
msgstr "Deine Account Details sind unten aufgelistet"
|
||||
|
||||
msgid "Username"
|
||||
msgstr "Benusername"
|
||||
|
||||
msgid "Your email address"
|
||||
msgstr "Deine E-Mail-Adresse"
|
||||
|
||||
msgid "Password"
|
||||
msgstr "Passwort"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You can reset your password <a href=\"%(base_url)s%(reset_password_url)s\" "
|
||||
"style=\"text-decoration: none; color: #4382c8; font-weight: 400;\">here</a>."
|
||||
msgstr ""
|
||||
"Du kannst dein Passwort <a href=\"%(base_url)s%(reset_password_url)s\" style="
|
||||
"\"text-decoration: none; color: #4382c8; font-weight: 400;\">hier</a> "
|
||||
"zurücksetzen."
|
||||
|
||||
msgid "Your Data Center Light Team"
|
||||
msgstr "Dein Data Center Light Team"
|
||||
|
||||
msgid ""
|
||||
"You can copy and paste the following link into the address bar of your "
|
||||
"browser to activate your Data Center Light account."
|
||||
msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers."
|
||||
|
||||
msgid "You can reset your password here"
|
||||
msgstr "Du kannst dein Passwort hier zurücksetzen"
|
||||
|
||||
msgid "Welcome to Data Center Light!"
|
||||
msgstr "Willkommen beim Data Center Light!"
|
||||
|
||||
msgid ""
|
||||
"Thanks for joining us! We provide the most affordable virtual machines from "
|
||||
"the heart of Switzerland."
|
||||
msgstr "Bei uns findest Du die günstiges VMs aus der Schweiz."
|
||||
|
||||
msgid "Try now, order a VM. VM price starts from only 15CHF per month."
|
||||
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
|
||||
|
||||
msgid "ORDER VM"
|
||||
msgstr "VM BESTELLEN"
|
||||
|
||||
#, python-format
|
||||
msgid "Please enter a value in range %(min_ram)s - 200."
|
||||
msgstr "Bitte gib einen Wert von %(min_ram)s bis 200 ein."
|
||||
"Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine Bestätigungsmail "
|
||||
"von unserem Team"
|
||||
|
||||
msgid "VM hosting"
|
||||
msgstr "VM Hosting"
|
||||
msgstr ""
|
||||
|
||||
msgid "month"
|
||||
msgstr "Monat"
|
||||
|
|
@ -163,39 +46,138 @@ msgstr "Monat"
|
|||
msgid "VAT included"
|
||||
msgstr "MwSt. inklusive"
|
||||
|
||||
msgid "You save"
|
||||
msgstr "Du sparst"
|
||||
|
||||
msgid "Hosted in Switzerland"
|
||||
msgstr "Standort: Schweiz"
|
||||
|
||||
msgid "Please enter a value in range 1 - 48."
|
||||
msgstr "Bitte gib einen Wert von 1 bis 48 ein."
|
||||
|
||||
msgid "Please enter a value in range 2 - 200."
|
||||
msgstr "Bitte gib einen Wert von 2 bis 200 ein."
|
||||
|
||||
msgid "Please enter a value in range 10 - 2000."
|
||||
msgstr "Bitte gib einen Wert von 10 bis 2000 ein."
|
||||
msgstr "Bitte gib einen Wert von 10 bis 200 ein."
|
||||
|
||||
msgid "GB Storage (SSD)"
|
||||
msgstr "GB Storage (SSD)"
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Your Name"
|
||||
msgstr "Dein Name"
|
||||
|
||||
msgid "Please enter your name."
|
||||
msgstr "Bitte gib Deinen Namen ein."
|
||||
|
||||
msgid "Email"
|
||||
msgstr "E-Mail-Adresse"
|
||||
|
||||
msgid "Your Email"
|
||||
msgstr "Deine E-Mail"
|
||||
|
||||
msgid "Please enter a valid email address."
|
||||
msgstr "Bitte gib eine gültige E-Mailadresse ein."
|
||||
|
||||
msgid "Continue"
|
||||
msgstr "Weiter"
|
||||
|
||||
msgid "Home"
|
||||
msgstr "Home"
|
||||
msgid "Thank you for your request."
|
||||
msgstr "Vielen Dank für Ihre Anfrage."
|
||||
|
||||
msgid "You are one step away from being our beta tester!"
|
||||
msgstr ""
|
||||
"Sie sind nur noch einen Schritt davon entfernt, unser Beta-Tester zu werden!"
|
||||
|
||||
msgid ""
|
||||
"Currently we are running our tests to make sure everything runs perfectly."
|
||||
msgstr ""
|
||||
"Momentan testen wir die Beta-Umgebung um sie für Ihren Gebrauch "
|
||||
"sicherzustellen."
|
||||
|
||||
msgid ""
|
||||
"In the meantime, we would like to ask you a little patience<br/> until our "
|
||||
"team contacts you with beta access."
|
||||
msgstr ""
|
||||
"Wir werden dann sobald als möglich Ihren Beta-Zugang erstellen und Sie "
|
||||
"daraufhin kontaktieren.Bis dahin bitten wir Sie um etwas Geduld."
|
||||
|
||||
msgid "Thank you!"
|
||||
msgstr "Vielen Dank!"
|
||||
|
||||
msgid "account activation"
|
||||
msgstr "Accountaktivierung"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" You can activate your %(dcl_text)s account by <a href="
|
||||
"\"%(base_url)s%(activation_link)s\">clicking here</a>.<br/><br/>\n"
|
||||
" You can also copy and paste the following link into the "
|
||||
"address bar of your browser and follow the link in order to activate your "
|
||||
"datacenterlight account.<br/>\n"
|
||||
" %(base_url)s%(activation_link)s\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <a href=\"%(base_url)s%(activation_link)s\">Klicke hier</a> "
|
||||
"um deinen %(dcl_text)s zu aktivieren.<br/><br/>\n"
|
||||
" Oder kopiere den folgenden Link in die Adressleiste deines "
|
||||
"Browsers und folge dann dem Link um deinen %(dcl_text)s Account zu "
|
||||
"aktivieren.<br/>\n"
|
||||
" %(base_url)s%(activation_link)s\n"
|
||||
" "
|
||||
|
||||
msgid "Your"
|
||||
msgstr "Dein"
|
||||
|
||||
msgid "team"
|
||||
msgstr "Team"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
"Hi,\n"
|
||||
"\n"
|
||||
"You can activate your %(dcl_text)s account by clicking here %(base_url)s"
|
||||
"%(activation_link)s\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Hallo,\n"
|
||||
"\n"
|
||||
"Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst "
|
||||
"%(base_url)s%(activation_link)s\n"
|
||||
|
||||
msgid "Highlights"
|
||||
msgstr ""
|
||||
|
||||
msgid "Scale out"
|
||||
msgstr "Skalierung"
|
||||
|
||||
msgid "Reliable and light"
|
||||
msgstr "Zuverlässig und leicht"
|
||||
|
||||
msgid "Order VM"
|
||||
msgstr "VM bestellen"
|
||||
|
||||
msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
|
||||
msgid "Terms of Service"
|
||||
msgstr "Nutzungsbedingungen"
|
||||
msgid "Home"
|
||||
msgstr "Home"
|
||||
|
||||
msgid "Pricing"
|
||||
msgstr "Preise"
|
||||
|
||||
msgid "All Rights Reserved"
|
||||
msgstr "Alle Rechte vorbehalten"
|
||||
|
||||
msgid "Why Data Center Light?"
|
||||
msgstr "Warum Data Center Light?"
|
||||
|
||||
msgid "Finally, an affordable VM hosting in Switzerland!"
|
||||
msgstr "Endlich: bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
msgid "Highlights"
|
||||
msgstr ""
|
||||
|
||||
msgid "I want it!"
|
||||
msgstr "Das will ich haben!"
|
||||
|
||||
|
|
@ -207,14 +189,14 @@ msgstr ""
|
|||
|
||||
msgid "Only wants you to pay for what you actually need."
|
||||
msgstr ""
|
||||
"Du möchtest nur das bezahlen, was du auch wirklich brauchst: Wähle deine "
|
||||
"Möchte, dass du nur bezahlst, was du auch wirklich brauchst: Wähle deine "
|
||||
"Ressourcen individuell aus!
"
|
||||
|
||||
msgid ""
|
||||
"Is creative, using a modern and alternative design for a data center in "
|
||||
"order to make it more sustainable and affordable at the same time."
|
||||
msgstr ""
|
||||
"Es ist kreativ, da es sich ein modernes und alternatives Layout zu Nutze"
|
||||
"Ist kreativ, indem es sich ein modernes und alternatives Layout zu Nutze "
|
||||
"macht um Nachhaltigkeit zu fördern und somit erschwingliche Preise bieten zu "
|
||||
"können.
"
|
||||
|
||||
|
|
@ -222,12 +204,9 @@ msgid ""
|
|||
"Cuts down the costs for you by using FOSS (Free Open Source Software) "
|
||||
"exclusively, wherefore we can save money from paying licenses."
|
||||
msgstr ""
|
||||
"Um unnötige Kosten zu sparen werden, wird ausschliesslich Software auf"
|
||||
"Basis von FOSS (Free Open Source Software) eingesetzt und dadurch können auf "
|
||||
"Lizenzgebühren verzichtet werden.
"
|
||||
|
||||
msgid "Scale out"
|
||||
msgstr "Skalierung"
|
||||
"Sorgt dafür, dass unnötige Kosten erspart werden, indem es ausschliesslich "
|
||||
"mit FOSS (Free Open Source Software) arbeitet und wir daher auf "
|
||||
"Lizenzgebühren verzichten können.
"
|
||||
|
||||
msgid ""
|
||||
"We don't use special hardware. We use commodity hardware: we buy computers "
|
||||
|
|
@ -238,9 +217,6 @@ msgstr ""
|
|||
"erschwingliche Systeme. Bei grösserer Auslastung werden mehr "
|
||||
"Standardkomponenten hinzugekauft und skalieren so das Datencenter."
|
||||
|
||||
msgid "Reliable and light"
|
||||
msgstr "Zuverlässig und leicht"
|
||||
|
||||
msgid ""
|
||||
"Our VMs are located in Switzerland, with reliable power supply and fast "
|
||||
"internet connection. Our VM costs less thanks to our featherlight "
|
||||
|
|
@ -255,66 +231,35 @@ msgstr ""
|
|||
"Einfach und bezahlbar: Teste nun unsere virtuellen Maschinen mit "
|
||||
"federleichten Preisen."
|
||||
|
||||
msgid ""
|
||||
"Ready in 30 seconds.<br/>Experience the unbeatable speed from Data Center "
|
||||
"Light."
|
||||
msgstr ""
|
||||
"Fertig in 30 Sekunden.<br/>Erlebe die unschlagbare Geschwindigkeit von Data "
|
||||
"Center Light."
|
||||
|
||||
msgid "Contact us"
|
||||
msgstr "Kontaktiere uns"
|
||||
msgid "Affordable VM hosting based in Switzerland"
|
||||
msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
msgid "Switzerland "
|
||||
msgstr "Schweiz "
|
||||
msgstr "Schweiz"
|
||||
|
||||
msgid "Welcome back"
|
||||
msgstr "Willkommen zurück"
|
||||
msgid "Questions?"
|
||||
msgstr "Fragen?"
|
||||
|
||||
msgid ""
|
||||
"Review your billing address and card details and proceed to make payment."
|
||||
msgstr ""
|
||||
"Überprüfe die Rechnungsadresse und Kreditkartendaten und fahre mit der "
|
||||
"Zahlung fort."
|
||||
msgid "Contact us!"
|
||||
msgstr "Kontaktiere uns!"
|
||||
|
||||
msgid "Log in"
|
||||
msgstr "Anmelden"
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
msgid ""
|
||||
"Already signed up?<br>By logging in you can retrieve saved billing "
|
||||
"information."
|
||||
msgstr ""
|
||||
"Bereits eingeloggt? Nach der Anmeldung kannst Du gespeicherte "
|
||||
"Rechnungsinformationen abrufen."
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
msgid "LOGIN"
|
||||
msgstr "ANMELDEN"
|
||||
|
||||
msgid "Don't have an account yet?"
|
||||
msgstr "Besitzt du kein Benutzerkonto?"
|
||||
|
||||
msgid "You can sign up by filling in the information below."
|
||||
msgstr ""
|
||||
"Du kannst Dich anmelden, indem Du die die untenstehenden Informationen "
|
||||
"ausfüllst."
|
||||
|
||||
msgid "Forgot password?"
|
||||
msgstr "Passwort vergessen?"
|
||||
|
||||
msgid "Resend activation link"
|
||||
msgstr "Aktivierungslink noch einmal senden"
|
||||
|
||||
msgid "Sign up"
|
||||
msgstr "Registrieren"
|
||||
|
||||
msgid "Billing Address"
|
||||
msgid "Billed To:"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Make a payment"
|
||||
msgstr "Tätige eine Bezahlung"
|
||||
msgid "Payment Method:"
|
||||
msgstr "Bezahlmethode"
|
||||
|
||||
msgid "Your Order"
|
||||
msgstr "Deine Bestellung"
|
||||
msgid "ending"
|
||||
msgstr "endend in"
|
||||
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
msgid "Cores"
|
||||
msgstr "Prozessorkerne"
|
||||
|
|
@ -329,183 +274,45 @@ msgid "Configuration"
|
|||
msgstr "Konfiguration"
|
||||
|
||||
msgid "Total"
|
||||
msgstr "Gesamt"
|
||||
|
||||
msgid "including VAT"
|
||||
msgstr "inkl. Mehrwertsteuer"
|
||||
|
||||
msgid "excluding VAT"
|
||||
msgstr "exkl. Mehrwertsteuer"
|
||||
|
||||
msgid "Month"
|
||||
msgstr "Monat"
|
||||
|
||||
msgid "Discount"
|
||||
msgstr "Rabatt"
|
||||
|
||||
msgid "Will be applied at checkout"
|
||||
msgstr "wird an der Kasse angewendet"
|
||||
|
||||
msgid "Credit Card"
|
||||
msgstr "Kreditkarte"
|
||||
|
||||
msgid ""
|
||||
"Please select one of the cards that you used before or fill in your credit "
|
||||
"card information below. We are using <a href=\"https://stripe.com\" target="
|
||||
"\"_blank\">Stripe</a> for payment and do not store your information in our "
|
||||
"database."
|
||||
msgstr ""
|
||||
"Bitte wähle eine der zuvor genutzten Kreditkarten oder gib Deine "
|
||||
"Kreditkartendetails unten an. Die Bezahlung wird über <a href=\"https://"
|
||||
"stripe.com\" target=\"_blank\">Stripe</a> abgewickelt. Wir speichern Deine "
|
||||
"Kreditkartendetails nicht in unserer Datenbank."
|
||||
|
||||
msgid ""
|
||||
"Please fill in your credit card information below. We are using <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> for payment and do not "
|
||||
"store your information in our database."
|
||||
msgstr ""
|
||||
"Bitte fülle Deine Kreditkarteninformationen unten aus. Wir nutzen <a href="
|
||||
"\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und "
|
||||
"speichern keine Informationen in unserer Datenbank."
|
||||
|
||||
msgid "Last"
|
||||
msgstr "Letzten"
|
||||
|
||||
msgid "Type"
|
||||
msgstr "Typ"
|
||||
|
||||
msgid "Expiry"
|
||||
msgstr "Ablaufdatum"
|
||||
|
||||
msgid "SELECT"
|
||||
msgstr "AUSWÄHLEN"
|
||||
|
||||
msgid "Add a new credit card"
|
||||
msgstr "Eine neue Kreditkarte hinzufügen"
|
||||
|
||||
msgid "NEW CARD"
|
||||
msgstr "NEUE KARTE"
|
||||
|
||||
msgid "New Credit Card"
|
||||
msgstr "Neue Kreditkarte"
|
||||
|
||||
msgid "Processing"
|
||||
msgstr "Weiter"
|
||||
|
||||
msgid "Enter your credit card number"
|
||||
msgstr "Deine Kreditkartennummer"
|
||||
|
||||
#, python-format
|
||||
msgid "%(page_header_text)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
msgid "Billed to"
|
||||
msgstr "Rechnungsadresse"
|
||||
|
||||
msgid "Payment method"
|
||||
msgstr "Bezahlmethode"
|
||||
|
||||
msgid "ending in"
|
||||
msgstr "endend in"
|
||||
|
||||
msgid "Order summary"
|
||||
msgstr "Bestellungsübersicht"
|
||||
|
||||
msgid "Product"
|
||||
msgstr "Produkt"
|
||||
|
||||
msgid "Price"
|
||||
msgstr "Preise"
|
||||
|
||||
msgid "VAT for"
|
||||
msgstr "MwSt für"
|
||||
|
||||
msgid "Total Amount"
|
||||
msgstr "Gesamtsumme"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Betrag"
|
||||
|
||||
msgid "Description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
msgid "Recurring"
|
||||
msgstr "Wiederholend"
|
||||
|
||||
msgid "Subtotal"
|
||||
msgstr "Zwischensumme"
|
||||
|
||||
msgid "VAT"
|
||||
msgstr "Mehrwertsteuer"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "By clicking \"Place order\" this plan will charge your credit card "
|
||||
#| "account with %(total_price)s CHF/month"
|
||||
msgid ""
|
||||
"By clicking \"Place order\" this plan will charge your credit card account "
|
||||
"with %(total_price)s CHF/year"
|
||||
msgstr ""
|
||||
"Wenn Du \"bestellen\" auswählst, wird Deine Kreditkarte mit %(total_price)s "
|
||||
"CHF pro Jahr belastet"
|
||||
|
||||
|
||||
msgid ""
|
||||
"By clicking \"Place order\" this plan will charge your credit card account "
|
||||
"with %(total_price)s CHF/month"
|
||||
msgstr ""
|
||||
"Wenn Du \"bestellen\" auswählst, wird Deine Kreditkarte mit %(total_price)s "
|
||||
"CHF pro Monat belastet"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "By clicking \"Place order\" this payment will charge your credit card "
|
||||
#| "account with a one time amount of %(total_price)s CHF"
|
||||
msgid ""
|
||||
"By clicking \"Place order\" this payment will charge your credit card "
|
||||
"account with a one time amount of %(total_price)s CHF"
|
||||
msgstr ""
|
||||
"Wenn Du \"bestellen\" auswählst, wird Deine Kreditkarte mit "
|
||||
"%(vm_total_price)s CHF pro Monat belastet"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"By clicking \"Place order\" this plan will charge your credit card account "
|
||||
"with %(vm_total_price)s CHF/month"
|
||||
msgstr ""
|
||||
"Wenn Du \"bestellen\" auswählst, wird Deine Kreditkarte mit "
|
||||
"%(vm_total_price)s CHF pro Monat belastet"
|
||||
|
||||
msgid "Place order"
|
||||
msgstr "Bestellen"
|
||||
|
||||
msgid "Processing..."
|
||||
msgstr "Abarbeitung..."
|
||||
msgid "We are cutting down the costs significantly!"
|
||||
msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
|
||||
|
||||
msgid "Hold tight, we are processing your request"
|
||||
msgstr "Bitte warten - wir verarbeiten Deine Anfrage gerade"
|
||||
msgid "Order Now!"
|
||||
msgstr "Bestelle jetzt!"
|
||||
|
||||
msgid "OK"
|
||||
msgstr "Ok"
|
||||
msgid ""
|
||||
"Our VMs are hosted in Glarus, Switzerland, and our website is currently "
|
||||
"running in BETA mode. If you want more information that you did not find on "
|
||||
"our website, or if your order is more detailed, or if you encounter any "
|
||||
"technical hiccups, please contact us at support@datacenterlight.ch, our team "
|
||||
"will get in touch with you asap."
|
||||
msgstr ""
|
||||
"Unsere VMs werden in der Schweiz im Kanton Glarus gehostet und befinden sich "
|
||||
"zur Zeit noch in der BETA-Phase. Möchtest du mehr über uns erfahren und hast "
|
||||
"auf unserer Website nicht genügend Informationen gefunden? Möchtest eine "
|
||||
"detailliertere Bestellung aufgeben? Bist du auf technische Probleme "
|
||||
"gestossen, die du uns mitteilen möchtest? Dann zögere nicht und kontaktiere "
|
||||
"uns unter support@datacenterlight.ch. Unser Team wird sich umgehend um dein "
|
||||
"Anliegen kümmern!"
|
||||
|
||||
msgid "Close"
|
||||
msgstr "Schliessen"
|
||||
msgid "Thank you for order! Our team will contact you via email"
|
||||
msgstr ""
|
||||
"Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich mit "
|
||||
"Ihnen via E-Mail in Verbindung."
|
||||
|
||||
msgid "Some problem encountered. Please try again later."
|
||||
msgstr "Ein Problem ist aufgetreten. Bitte versuche es später noch einmal."
|
||||
|
||||
msgid "Why Data Center Light?"
|
||||
msgstr "Warum Data Center Light?"
|
||||
msgid "as soon as possible!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Tech Stack"
|
||||
msgstr "Tech Stack"
|
||||
|
||||
msgid "We are seriously open source."
|
||||
msgstr "Wir sind vollends Open Source."
|
||||
msgstr "Wir sind vollends opensource."
|
||||
|
||||
msgid ""
|
||||
" Our full software stack is open source – We don't use anything that isn't "
|
||||
|
|
@ -515,7 +322,7 @@ msgstr ""
|
|||
"nicht Open-Source ist.<br/>Yep, so cool sind wir."
|
||||
|
||||
msgid "Our services run on"
|
||||
msgstr "Unsere Dienste läufen auf"
|
||||
msgstr "Unsere Dienste läuft auf"
|
||||
|
||||
msgid "Our monitoring"
|
||||
msgstr "Unser Monitoring"
|
||||
|
|
@ -575,218 +382,22 @@ msgid "Starting from only 15CHF per month. Try now."
|
|||
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
|
||||
|
||||
msgid "Actions speak louder than words. Let's do it, try our VM now."
|
||||
msgstr "Taten sagen mehr als Worte – Teste jetzt unsere VM!"
|
||||
msgstr "Tagen sagen mehr als Worte – Teste jetzt unsere VM!"
|
||||
|
||||
msgid "Invalid number of cores"
|
||||
msgstr "Ungültige Anzahle CPU-Kerne"
|
||||
|
||||
msgid "Invalid calculator properties"
|
||||
msgstr "Ungültige Berechnungseigenschaften"
|
||||
|
||||
msgid "Invalid RAM size"
|
||||
msgstr "Ungültige RAM-Grösse"
|
||||
|
||||
msgid "Invalid storage size"
|
||||
msgstr "Ungültige Speicher-Grösse"
|
||||
|
||||
#, python-brace-format
|
||||
msgid "Incorrect pricing name. Please contact support{support_email}"
|
||||
msgstr "Ungültige Preisbezeichnung. Bitte kontaktiere den Support{support_email}"
|
||||
msgid "is not a proper name"
|
||||
msgstr "ist kein gültiger Name"
|
||||
|
||||
#, python-brace-format
|
||||
msgid "{user} does not have permission to access the card"
|
||||
msgstr "{user} hat keine Erlaubnis auf diese Karte zuzugreifen"
|
||||
|
||||
msgid "An error occurred. Details: {}"
|
||||
msgstr "Ein Fehler ist aufgetreten. Details: {}"
|
||||
|
||||
msgid "Confirm Order"
|
||||
msgstr "Bestellung Bestätigen"
|
||||
|
||||
msgid "Error."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"There was a payment related error. On close of this popup, you will be "
|
||||
"redirected back to the payment page."
|
||||
msgstr ""
|
||||
"Es ist ein Fehler bei der Zahlung betreten. Du wirst nach dem Schliessen vom "
|
||||
"Popup zur Bezahlseite weitergeleitet."
|
||||
|
||||
#, python-brace-format
|
||||
msgid "An error occurred while associating the card. Details: {details}"
|
||||
msgstr ""
|
||||
"Beim Verbinden der Karte ist ein Fehler aufgetreten. Details: {details}"
|
||||
|
||||
msgid " This is a monthly recurring plan."
|
||||
msgstr "Dies ist ein monatlich wiederkehrender Plan."
|
||||
|
||||
msgid " This is an yearly recurring plan."
|
||||
msgstr "Dies ist ein jährlich wiederkehrender Plan."
|
||||
|
||||
msgid "Confirmation of your payment"
|
||||
msgstr "Bestätigung deiner Zahlung"
|
||||
|
||||
#, python-brace-format
|
||||
msgid ""
|
||||
"Hi {name},\n"
|
||||
"\n"
|
||||
"thank you for your order!\n"
|
||||
"We have just received a payment of CHF {amount:.2f} from you.{recurring}\n"
|
||||
"\n"
|
||||
"Cheers,\n"
|
||||
"Your Data Center Light team"
|
||||
msgstr "Hallo {name},\n" "\n" "vielen Dank für deine Bestellung!\n" "Wir haben deine Bezahlung in Höhe von {amount:.2f} CHF erhalten. {recurring}\n" "\n" "Grüsse\n"
|
||||
"Dein Data Center Light Team"
|
||||
|
||||
msgid "Thank you for the payment."
|
||||
msgstr "Danke für Deine Bestellung."
|
||||
|
||||
msgid ""
|
||||
"You will soon receive a confirmation email of the payment. You can always "
|
||||
"contact us at info@ungleich.ch for any question that you may have."
|
||||
msgstr "Du wirst bald eine Bestätigungs-E-Mail über die Zahlung erhalten. Du kannst jederzeit unter info@ungleich.ch kontaktieren."
|
||||
|
||||
msgid "Thank you for the order."
|
||||
msgstr "Danke für Deine Bestellung."
|
||||
|
||||
msgid ""
|
||||
"Your VM will be up and running in a few moments. We will send you a "
|
||||
"confirmation email as soon as it is ready."
|
||||
msgstr ""
|
||||
"Deine VM ist gleich bereit. Wir senden Dir eine Bestätigungsemail, sobald Du "
|
||||
"auf sie zugreifen kannst."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You are not making any payment yet. After submitting your card "
|
||||
#~ "information, you will be taken to the Confirm Order Page."
|
||||
#~ msgstr ""
|
||||
#~ "Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst "
|
||||
#~ "ausgelöst, nachdem Du die Bestellung auf der nächsten Seite bestätigt "
|
||||
#~ "hast."
|
||||
|
||||
#~ msgid "Card Number"
|
||||
#~ msgstr "Kreditkartennummer"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You are not making any payment yet. After placing your order, you will be "
|
||||
#~ "taken to the Submit Payment Page."
|
||||
#~ msgstr ""
|
||||
#~ "Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst "
|
||||
#~ "ausgelöst, nachdem Du die Bestellung auf der nächsten Seite bestätigt "
|
||||
#~ "hast."
|
||||
|
||||
#~ msgid "Order VM"
|
||||
#~ msgstr "VM bestellen"
|
||||
|
||||
#~ msgid "Enter name"
|
||||
#~ msgstr "Name"
|
||||
|
||||
#~ msgid "Enter email"
|
||||
#~ msgstr "E-Mail-Adresse"
|
||||
|
||||
#~ msgid "Request Beta Access"
|
||||
#~ msgstr "Beantrage Beta-Zugang"
|
||||
|
||||
#~ msgid "Request Sent"
|
||||
#~ msgstr "Anfrage verschickt"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Thank you for your subscription! You will receive a confirmation mail "
|
||||
#~ "from our team"
|
||||
#~ msgstr ""
|
||||
#~ "Vielen dank für Ihre Anmeldung. Sie erhalten in kürze eine "
|
||||
#~ "Bestätigungsmail von unserem Team"
|
||||
|
||||
#~ msgid "Thank you for your request."
|
||||
#~ msgstr "Vielen Dank für Deine Anfrage."
|
||||
|
||||
#~ msgid "You are one step away from being our beta tester!"
|
||||
#~ msgstr ""
|
||||
#~ "Sie sind nur noch einen Schritt davon entfernt, unser Beta-Tester zu "
|
||||
#~ "werden!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Currently we are running our tests to make sure everything runs perfectly."
|
||||
#~ msgstr ""
|
||||
#~ "Momentan testen wir die Beta-Umgebung um sie für Ihren Gebrauch "
|
||||
#~ "sicherzustellen."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "In the meantime, we would like to ask you a little patience<br/> until "
|
||||
#~ "our team contacts you with beta access."
|
||||
#~ msgstr ""
|
||||
#~ "Wir werden dann sobald als möglich Ihren Beta-Zugang erstellen und Sie "
|
||||
#~ "daraufhin kontaktieren.Bis dahin bitten wir Sie um etwas Geduld."
|
||||
|
||||
#~ msgid "Thank you!"
|
||||
#~ msgstr "Vielen Dank!"
|
||||
|
||||
#~ msgid "Thank you for order! Our team will contact you via email"
|
||||
#~ msgstr ""
|
||||
#~ "Vielen Dank für die Bestellung. Unser Team setzt sich sobald wie möglich "
|
||||
#~ "mit Dir via E-Mail in Verbindung."
|
||||
|
||||
#~ msgid "Affordable VM hosting based in Switzerland"
|
||||
#~ msgstr "Bezahlbares VM Hosting in der Schweiz"
|
||||
|
||||
#~ msgid "Submit"
|
||||
#~ msgstr "Absenden"
|
||||
|
||||
#~ msgid "We are cutting down the costs significantly!"
|
||||
#~ msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen"
|
||||
|
||||
#~ msgid "Order Now!"
|
||||
#~ msgstr "Bestelle jetzt!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Our VMs are hosted in Glarus, Switzerland, and our website is currently "
|
||||
#~ "running in BETA mode. If you want more information that you did not find "
|
||||
#~ "on our website, or if your order is more detailed, or if you encounter "
|
||||
#~ "any technical hiccups, please contact us at support@datacenterlight.ch, "
|
||||
#~ "our team will get in touch with you asap."
|
||||
#~ msgstr ""
|
||||
#~ "Unsere VMs werden in der Schweiz im Kanton Glarus gehostet und befinden "
|
||||
#~ "sich zur Zeit noch in der BETA-Phase. Möchtest du mehr über uns erfahren "
|
||||
#~ "und hast auf unserer Website nicht genügend Informationen gefunden? "
|
||||
#~ "Möchtest eine detailliertere Bestellung aufgeben? Bist du auf technische "
|
||||
#~ "Probleme gestossen, die du uns mitteilen möchtest? Dann zögere nicht und "
|
||||
#~ "kontaktiere uns unter support@datacenterlight.ch. Unser Team wird sich "
|
||||
#~ "umgehend um dein Anliegen kümmern!"
|
||||
|
||||
#~ msgid "is not a proper name"
|
||||
#~ msgstr "ist kein gültiger Name"
|
||||
|
||||
#~ msgid "is not a proper email"
|
||||
#~ msgstr "ist keine gültige E-Mailadresse"
|
||||
|
||||
#~ msgid "Your Name"
|
||||
#~ msgstr "Dein Name"
|
||||
|
||||
#~ msgid "Your Email"
|
||||
#~ msgstr "Deine E-Mail"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ "Hi,\n"
|
||||
#~ "\n"
|
||||
#~ "You can activate your %(dcl_text)s account by clicking here %(base_url)s"
|
||||
#~ "%(activation_link)s\n"
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ "Hallo,\n"
|
||||
#~ "\n"
|
||||
#~ "Du kannst deinen %(dcl_text)s Account aktivieren, indem du hier klickst "
|
||||
#~ "%(base_url)s%(activation_link)s\n"
|
||||
|
||||
#~ msgid "Your"
|
||||
#~ msgstr "Dein"
|
||||
|
||||
#~ msgid "team"
|
||||
#~ msgstr "Team"
|
||||
|
||||
#~ msgid "Questions?"
|
||||
#~ msgstr "Fragen?"
|
||||
msgid "is not a proper email"
|
||||
msgstr "ist keine gültige E-Mailadresse"
|
||||
|
||||
#~ msgid "Please enter a value greater than or equal to 1."
|
||||
#~ msgstr "Bitte gib einen Wert größer oder gleich 1 ein."
|
||||
|
|
@ -853,6 +464,9 @@ msgstr ""
|
|||
#~ msgid "Buy Now!"
|
||||
#~ msgstr "Kaufe jetzt!"
|
||||
|
||||
#~ msgid "Email address"
|
||||
#~ msgstr "E-Mail Adresse"
|
||||
|
||||
#~ msgid "Our promise"
|
||||
#~ msgstr "Unser Versprechen"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
from datacenterlight.cms_models import CMSIntegration
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Creates cms integration objects for datacenterlight'''
|
||||
|
||||
def handle(self, *args, **options):
|
||||
self.create_cms_integration()
|
||||
|
||||
def create_cms_integration(self, site=None):
|
||||
obj, created = CMSIntegration.objects.get_or_create(
|
||||
name='default', domain=site
|
||||
)
|
||||
domain_name = site.domain if site else 'All Sites'
|
||||
if created:
|
||||
print('created the default CMSIntegration object for', domain_name)
|
||||
else:
|
||||
print(
|
||||
'default CMSIntegration object already exists for', domain_name
|
||||
)
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
|
||||
from datacenterlight.models import VMPricing
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Creates default VMPricing object'''
|
||||
DEFAULT_VMPRICING_NAME = 'default'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
self.create_default_vm_pricing()
|
||||
|
||||
def create_default_vm_pricing(self):
|
||||
obj, created = VMPricing.objects.get_or_create(
|
||||
name=self.DEFAULT_VMPRICING_NAME,
|
||||
defaults={
|
||||
"vat_inclusive": True,
|
||||
"cores_unit_price": 5,
|
||||
"ram_unit_price": 2,
|
||||
"ssd_unit_price": 0.6,
|
||||
"hdd_unit_price": 0.01
|
||||
}
|
||||
)
|
||||
|
||||
if created:
|
||||
print(
|
||||
'Successfully created {} VMPricing object'.format(
|
||||
self.DEFAULT_VMPRICING_NAME
|
||||
)
|
||||
)
|
||||
else:
|
||||
print(
|
||||
'{} VMPricing exists already.'.format(
|
||||
self.DEFAULT_VMPRICING_NAME
|
||||
)
|
||||
)
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
import logging
|
||||
import sys
|
||||
import uuid
|
||||
|
||||
import oca
|
||||
import stripe
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
from hosting.models import (
|
||||
UserCardDetail, UserHostingKey
|
||||
)
|
||||
from membership.models import CustomUser, DeletedUser
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def query_yes_no(question, default="yes"):
|
||||
"""Ask a yes/no question via raw_input() and return their answer.
|
||||
|
||||
"question" is a string that is presented to the user.
|
||||
"default" is the presumed answer if the user just hits <Enter>.
|
||||
It must be "yes" (the default), "no" or None (meaning
|
||||
an answer is required of the user).
|
||||
|
||||
The "answer" return value is True for "yes" or False for "no".
|
||||
"""
|
||||
valid = {"yes": True, "y": True, "ye": True,
|
||||
"no": False, "n": False}
|
||||
if default is None:
|
||||
prompt = " [y/n] "
|
||||
elif default == "yes":
|
||||
prompt = " [Y/n] "
|
||||
elif default == "no":
|
||||
prompt = " [y/N] "
|
||||
else:
|
||||
raise ValueError("invalid default answer: '%s'" % default)
|
||||
|
||||
while True:
|
||||
sys.stdout.write(question + prompt)
|
||||
choice = input().lower()
|
||||
if default is not None and choice == '':
|
||||
return valid[default]
|
||||
elif choice in valid:
|
||||
return valid[choice]
|
||||
else:
|
||||
sys.stdout.write("Please respond with 'yes' or 'no' "
|
||||
"(or 'y' or 'n').\n")
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Deletes all resources of the user from the project'''
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('customer_email', nargs='+', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
for email in options['customer_email']:
|
||||
r = query_yes_no("Are you sure you want to delete {} ?".format(
|
||||
email, None
|
||||
))
|
||||
if r:
|
||||
logger.debug("Deleting user {}".format(email))
|
||||
# Get stripe customer instance and delete the customer
|
||||
try:
|
||||
cus_user = CustomUser.objects.get(email=email)
|
||||
except CustomUser.DoesNotExist as dne:
|
||||
logger.error("CustomUser with email {} does "
|
||||
"not exist".format(email))
|
||||
sys.exit(1)
|
||||
stripe_customer = cus_user.stripecustomer
|
||||
c = stripe.Customer.retrieve(
|
||||
stripe_customer.stripe_id
|
||||
)
|
||||
cus_delete_obj = c.delete()
|
||||
if cus_delete_obj.deleted:
|
||||
logger.debug(
|
||||
"StripeCustomer {} associated with {} deleted"
|
||||
"".format(stripe_customer.stripe_id, email)
|
||||
)
|
||||
else:
|
||||
logger.error("Error while deleting the StripeCustomer")
|
||||
|
||||
# delete UserCardDetail
|
||||
ucds = UserCardDetail.objects.filter(
|
||||
stripe_customer=stripe_customer
|
||||
)
|
||||
for ucd in ucds:
|
||||
if ucd is not None:
|
||||
logger.debug(
|
||||
"User Card Detail {} associated with {} deleted"
|
||||
"".format(ucd.id, email)
|
||||
)
|
||||
ucd.delete()
|
||||
else:
|
||||
logger.error(
|
||||
"Error while deleting the User Card Detail")
|
||||
|
||||
# delete UserHostingKey
|
||||
uhks = UserHostingKey.objects.filter(
|
||||
user=cus_user
|
||||
)
|
||||
for uhk in uhks:
|
||||
uhk.delete()
|
||||
|
||||
# delete stripe customer
|
||||
stripe_customer.delete()
|
||||
|
||||
# add user to deleteduser
|
||||
DeletedUser.objects.create(
|
||||
email=cus_user.email, name=cus_user.name,
|
||||
user_id = cus_user.id
|
||||
)
|
||||
|
||||
# reset CustomUser
|
||||
cus_user.email = str(uuid.uuid4())
|
||||
cus_user.validated = 0
|
||||
cus_user.save()
|
||||
|
||||
# remove user from OpenNebula
|
||||
manager = OpenNebulaManager()
|
||||
user_pool = manager._get_user_pool()
|
||||
on_user = user_pool.get_by_name(email)
|
||||
if on_user.id > 0:
|
||||
logger.debug(
|
||||
"Deleting user {} => ID={} from opennebula".format(
|
||||
email, on_user.id)
|
||||
)
|
||||
manager.oneadmin_client.call(
|
||||
oca.User.METHODS['delete'], on_user.id
|
||||
)
|
||||
else:
|
||||
logger.error(
|
||||
"User not found with email {}. "
|
||||
"Not doing anything".format(email)
|
||||
)
|
||||
|
||||
logger.debug("Deleted {} SUCCESSFULLY.".format(email))
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
import json
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from membership.models import CustomUser
|
||||
from hosting.models import (
|
||||
HostingOrder, VMDetail, UserCardDetail, UserHostingKey
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Dumps the data of a customer into a json file'''
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('customer_email', nargs='+', type=str)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
for email in options['customer_email']:
|
||||
try:
|
||||
cus_user = CustomUser.objects.get(email=email)
|
||||
except CustomUser.DoesNotExist as dne:
|
||||
logger.error("CustomUser with email {} does "
|
||||
"not exist".format(email))
|
||||
sys.exit(1)
|
||||
|
||||
hosting_orders = HostingOrder.objects.filter(
|
||||
customer=cus_user.stripecustomer.id
|
||||
)
|
||||
|
||||
vm_ids = []
|
||||
orders_dict = {}
|
||||
for order in hosting_orders:
|
||||
order_dict = {}
|
||||
vm_ids.append(order.vm_id)
|
||||
order_dict["VM_ID"] = order.vm_id
|
||||
order_dict["Order Nr."] = order.id
|
||||
order_dict["Created On"] = str(order.created_at)
|
||||
order_dict["Price"] = order.price
|
||||
order_dict["Payment card details"] = {
|
||||
"last4": order.last4,
|
||||
"brand": order.cc_brand
|
||||
}
|
||||
if order.subscription_id is not None and order.stripe_charge_id is None:
|
||||
order_dict["Order type"] = "Monthly susbcription"
|
||||
else:
|
||||
order_dict["Order type"] = "One time payment"
|
||||
|
||||
# billing address
|
||||
if order.billing_address is not None:
|
||||
order_dict["Billing Address"] = {
|
||||
"Street": order.billing_address.street_address,
|
||||
"City": order.billing_address.city,
|
||||
"Country": order.billing_address.country,
|
||||
"Postal code": order.billing_address.postal_code,
|
||||
"Card holder name": order.billing_address.cardholder_name
|
||||
}
|
||||
else:
|
||||
logger.error(
|
||||
"did not find billing_address")
|
||||
|
||||
# Order Detail
|
||||
if order.order_detail is not None:
|
||||
order_dict["Specifications"] = {
|
||||
"RAM": "{} GB".format(order.order_detail.memory),
|
||||
"Cores": order.order_detail.cores,
|
||||
"Disk space (SSD)": "{} GB".format(
|
||||
order.order_detail.ssd_size)
|
||||
}
|
||||
else:
|
||||
logger.error(
|
||||
"Did not find order_detail. None")
|
||||
|
||||
vm_detail = VMDetail.objects.get(vm_id=order.vm_id)
|
||||
if vm_detail is not None:
|
||||
order_dict["VM Details"] = {
|
||||
"VM_ID": order.vm_id,
|
||||
"IPv4": vm_detail.ipv4,
|
||||
"IPv6": vm_detail.ipv6,
|
||||
"OS": vm_detail.configuration,
|
||||
}
|
||||
order_dict["Terminated on"] = str(vm_detail.terminated_at)
|
||||
|
||||
orders_dict[order.vm_id] = order_dict
|
||||
|
||||
|
||||
# UserCardDetail
|
||||
cards = {}
|
||||
ucds = UserCardDetail.objects.filter(
|
||||
stripe_customer=cus_user.stripecustomer
|
||||
)
|
||||
for ucd in ucds:
|
||||
card = {}
|
||||
if ucd is not None:
|
||||
card["Last 4"] = ucd.last4
|
||||
card["Brand"] = ucd.brand
|
||||
card["Expiry month"] = ucd.exp_month
|
||||
card["Expiry year"] = ucd.exp_year
|
||||
card["Preferred"] = ucd.preferred
|
||||
cards[ucd.id] = card
|
||||
else:
|
||||
logger.error(
|
||||
"Error while deleting the User Card Detail")
|
||||
|
||||
# UserHostingKey
|
||||
keys = {}
|
||||
uhks = UserHostingKey.objects.filter(
|
||||
user=cus_user
|
||||
)
|
||||
for uhk in uhks:
|
||||
key = {
|
||||
"Public key": uhk.public_key,
|
||||
"Name": uhk.name,
|
||||
"Created on": str(uhk.created_at)
|
||||
}
|
||||
if uhk.private_key:
|
||||
key["Private key"] = uhk.private_key
|
||||
keys[uhk.name] = key
|
||||
output_dict = {
|
||||
"User details": {
|
||||
"Name": cus_user.name,
|
||||
"Email": cus_user.email,
|
||||
"Activated": "yes" if cus_user.validated == 1 else "no",
|
||||
"Last login": str(cus_user.last_login)
|
||||
},
|
||||
"Orders": orders_dict,
|
||||
"Payment cards": cards,
|
||||
"SSH Keys": keys
|
||||
}
|
||||
print(json.dumps(output_dict, indent=4))
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
||||
|
|
@ -7,31 +7,18 @@ logger = logging.getLogger(__name__)
|
|||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''Fetches the VM templates from OpenNebula and populates the dcl
|
||||
VMTemplate model'''
|
||||
|
||||
def get_templates(self, manager, prefix):
|
||||
templates = manager.get_templates('%s-' % prefix)
|
||||
dcl_vm_templates = []
|
||||
for template in templates:
|
||||
template_name = template.name.lstrip('%s-' % prefix)
|
||||
template_id = template.id
|
||||
dcl_vm_template = VMTemplate.create(
|
||||
template_name, template_id, prefix
|
||||
)
|
||||
dcl_vm_templates.append(dcl_vm_template)
|
||||
return dcl_vm_templates
|
||||
help = 'Fetches the VM templates from OpenNebula and populates the dcl VMTemplate model'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
try:
|
||||
manager = OpenNebulaManager()
|
||||
templates = manager.get_templates()
|
||||
dcl_vm_templates = []
|
||||
dcl_vm_templates.extend(
|
||||
self.get_templates(manager, VMTemplate.PUBLIC)
|
||||
)
|
||||
dcl_vm_templates.extend(
|
||||
self.get_templates(manager, VMTemplate.IPV6)
|
||||
)
|
||||
for template in templates:
|
||||
template_name = template.name.strip('public-')
|
||||
template_id = template.id
|
||||
dcl_vm_template = VMTemplate.create(template_name, template_id)
|
||||
dcl_vm_templates.append(dcl_vm_template)
|
||||
|
||||
old_vm_templates = VMTemplate.objects.all()
|
||||
old_vm_templates.delete()
|
||||
|
|
@ -39,5 +26,4 @@ class Command(BaseCommand):
|
|||
for dcl_vm_template in dcl_vm_templates:
|
||||
dcl_vm_template.save()
|
||||
except Exception as e:
|
||||
logger.error('Error connecting to OpenNebula. Error Details: '
|
||||
'{err}'.format(err=str(e)))
|
||||
logger.error('Error connecting to OpenNebula. Error Details: {err}'.format(err=str(e)))
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-19 21:08
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0006_vmtemplate'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ContactUs',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=250)),
|
||||
('email', models.CharField(max_length=250)),
|
||||
('message', models.TextField()),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-16 19:47
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0006_vmtemplate'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='StripePlan',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('stripe_plan_id', models.CharField(max_length=100, null=True)),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-21 20:24
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0007_stripeplan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='stripeplan',
|
||||
name='stripe_plan_id',
|
||||
field=models.CharField(max_length=256, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-23 13:06
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
from django.utils.timezone import utc
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0007_contactus'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contactus',
|
||||
name='field',
|
||||
field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2017, 8, 23, 13, 6, 24, 650869, tzinfo=utc)),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-27 07:55
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0007_contactus'),
|
||||
('datacenterlight', '0008_auto_20170821_2024'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2017-08-27 08:02
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0009_merge'),
|
||||
('datacenterlight', '0008_contactus_field'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-02-20 14:23
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0010_merge'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='betaaccessvm',
|
||||
name='access',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='betaaccessvm',
|
||||
name='type',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='BetaAccess',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='BetaAccessVM',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='BetaAccessVMType',
|
||||
),
|
||||
]
|
||||
|
|
@ -1,138 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-01 20:41
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import djangocms_text_ckeditor.fields
|
||||
import filer.fields.image
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
('datacenterlight', '0011_auto_20180220_1423'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DCLSectionPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('heading', models.CharField(blank=True, help_text='An optional heading for the Section', max_length=100, null=True)),
|
||||
('content', djangocms_text_ckeditor.fields.HTMLField()),
|
||||
('text_direction', models.CharField(choices=[('left', 'Left'), ('right', 'Right')], default=True, help_text='The alignment of text in the section', max_length=10)),
|
||||
('html_id', models.SlugField(blank=True, help_text='An optional html id for the Section. Required to set as target of a link on page', null=True)),
|
||||
('center_on_mobile', models.BooleanField(default=False, help_text='Select to center align content on small screens.')),
|
||||
('background_gradient', models.BooleanField(default=False, help_text='Select to add a gradient background to the section.')),
|
||||
('plain_heading', models.BooleanField(default=False, help_text='Select to keep the heading style simpler.')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLNavbarDropdownPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('text', models.CharField(help_text='Text for the dropdown toggle', max_length=50)),
|
||||
('target', models.CharField(blank=True, help_text='Optional Url or #id to navigate on click', max_length=100, null=True)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLContactPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('heading', models.CharField(blank=True, default='Contact', max_length=100)),
|
||||
('organization_name', models.CharField(blank=True, default='ungleich GmbH', max_length=100)),
|
||||
('email', models.EmailField(default='info@ungleich.ch', max_length=200)),
|
||||
('address', models.CharField(blank=True, default='In der Au 7, Schwanden 8762', max_length=100)),
|
||||
('country', models.CharField(blank=True, default='Switzerland', max_length=100)),
|
||||
('form_header', models.CharField(blank=True, default='Send us a message.', max_length=100)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLFooterPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('copyright_label', models.CharField(blank=True, default='ungleich GmbH', help_text='Name of the company alongside the copyright year', max_length=100)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLLinkPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('target', models.CharField(help_text='Url or #id to navigate to', max_length=100)),
|
||||
('text', models.CharField(help_text='Text for the menu item', max_length=50)),
|
||||
('title', models.CharField(blank=True, help_text='Optional title text, that will be shown when a user hovers over the link', max_length=100, null=True)),
|
||||
('separator', models.BooleanField(default=False, help_text='Select to include a separator after the previous link')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLSectionIconPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('fontawesome_icon_name', models.CharField(help_text='Name of the fontawesome icon to use. <a href="https://fontawesome.com/v4.7.0/icons/" target="_blank">Refer docs.</a>', max_length=30)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLSectionImagePluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('caption', models.CharField(blank=True, help_text='Optional caption for the image.', max_length=100, null=True)),
|
||||
('image', filer.fields.image.FilerImageField(help_text='Image file to be used in section. Add multiple plugins to add more than one image', on_delete=django.db.models.deletion.CASCADE, to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLBannerListPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('heading', models.CharField(blank=True, help_text='An optional heading for the Section', max_length=100, null=True)),
|
||||
('html_id', models.SlugField(blank=True, help_text='An optional html id for the Section. Required to set as target of a link on page', null=True)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DCLBannerItemPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('content', djangocms_text_ckeditor.fields.HTMLField()),
|
||||
('banner_text', djangocms_text_ckeditor.fields.HTMLField(blank=True, help_text='Optional text to be shown as banner in other half.', max_length=100, null=True)),
|
||||
('text_direction', models.CharField(choices=[('left', 'Left'), ('right', 'Right')], default=True, help_text='The alignment of text in the section', max_length=10)),
|
||||
('banner_image', filer.fields.image.FilerImageField(blank=True, help_text='Optional image to be used in the banner in other half.', null=True, on_delete=django.db.models.deletion.CASCADE, to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-17 07:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import filer.fields.image
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0012_dclcalculatorpluginmodel'),
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DCLNavbarPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('logo_url', models.URLField(blank=True, max_length=300, null=True)),
|
||||
('logo_dark', filer.fields.image.FilerImageField(blank=True, help_text='Logo to be used on white navbar', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dcl_navbar_logo_dark', to='filer.Image')),
|
||||
('logo_light', filer.fields.image.FilerImageField(blank=True, help_text='Logo to be used on transparent navbar', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dcl_navbar_logo_light', to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-19 20:46
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0013_dclnavbarpluginmodel'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclnavbarpluginmodel',
|
||||
name='language_dropdown',
|
||||
field=models.BooleanField(
|
||||
default=True, help_text='Select to include the language selection dropdown.'),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-21 19:09
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import djangocms_text_ckeditor.fields
|
||||
import filer.fields.image
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
('datacenterlight', '0013_dclnavbarpluginmodel'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DCLSectionPromoPluginModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE,
|
||||
parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
('heading', models.CharField(
|
||||
blank=True, help_text='An optional heading for the Promo Section', max_length=100, null=True)),
|
||||
('subheading', models.CharField(
|
||||
blank=True, help_text='An optional subheading for the Promo Section', max_length=200, null=True)),
|
||||
('content', djangocms_text_ckeditor.fields.HTMLField()),
|
||||
('html_id', models.SlugField(
|
||||
blank=True, help_text='An optional html id for the Section. Required to set as target of a link on page', null=True)),
|
||||
('plain_heading', models.BooleanField(default=False,
|
||||
help_text='Select to keep the heading style simpler.')),
|
||||
('center_on_mobile', models.BooleanField(default=False,
|
||||
help_text='Select to center align content on small screens.')),
|
||||
('background_image', filer.fields.image.FilerImageField(blank=True, help_text='Optional background image for the Promo Section',
|
||||
null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dcl_section_promo_promo', to='filer.Image')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-22 19:22
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0014_dclsectionpromopluginmodel'),
|
||||
('datacenterlight', '0014_dclnavbarpluginmodel_language_dropdown'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='dclsectionpromopluginmodel',
|
||||
old_name='center_on_mobile',
|
||||
new_name='text_center',
|
||||
),
|
||||
]
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-27 15:31
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import cms.models.fields
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0015_auto_20180323_0011'),
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CMSIntegration',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True,
|
||||
primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('navbar_placeholder', cms.models.fields.PlaceholderField(editable=False, null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE, slotname='datacenterlight_navbar', to='cms.Placeholder')),
|
||||
('footer_placeholder', cms.models.fields.PlaceholderField(editable=False, null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE, slotname='datacenterlight_footer', to='cms.Placeholder')),
|
||||
('name', models.CharField(default='default',
|
||||
help_text='A unique name for the Integration. This name will be used to fetch the Integration into pages', max_length=100, unique=True)),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-03-28 19:26
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import cms.models.fields
|
||||
from django.db import migrations
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0016_cmsintegration'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='cmsintegration',
|
||||
name='footer_placeholder',
|
||||
field=cms.models.fields.PlaceholderField(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dcl-footer-placeholder+', slotname='datacenterlight_footer', to='cms.Placeholder'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cmsintegration',
|
||||
name='navbar_placeholder',
|
||||
field=cms.models.fields.PlaceholderField(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dcl-navbar-placeholder+', slotname='datacenterlight_navbar', to='cms.Placeholder'),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-04-03 17:08
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0017_auto_20180329_0056'),
|
||||
('sites', '0002_alter_domain_unique'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='dclcontactpluginmodel',
|
||||
name='organization_name',
|
||||
field=models.CharField(blank=True, default='ungleich glarus ag', max_length=100),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='dclfooterpluginmodel',
|
||||
name='copyright_label',
|
||||
field=models.CharField(blank=True, default='ungleich glarus ag', help_text='Name of the company alongside the copyright year', max_length=100),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='cmsintegration',
|
||||
name='domain',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cmsintegration',
|
||||
name='name',
|
||||
field=models.CharField(default='default', help_text='A unique name for the Integration. This name will be used to fetch the Integration into pages', max_length=100),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='cmsintegration',
|
||||
unique_together=set([('name', 'domain')]),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-04-15 22:36
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
('datacenterlight', '0018_auto_20180403_1930'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DCLCustomPricingModel',
|
||||
fields=[
|
||||
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=('cms.cmsplugin',),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='VMPricing',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255, unique=True)),
|
||||
('vat_inclusive', models.BooleanField(default=True)),
|
||||
('vat_percentage', models.DecimalField(blank=True, decimal_places=5, default=0, max_digits=7)),
|
||||
('cores_unit_price', models.DecimalField(decimal_places=5, default=0, max_digits=7)),
|
||||
('ram_unit_price', models.DecimalField(decimal_places=5, default=0, max_digits=7)),
|
||||
('ssd_unit_price', models.DecimalField(decimal_places=5, default=0, max_digits=7)),
|
||||
('hdd_unit_price', models.DecimalField(decimal_places=6, default=0, max_digits=7)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='dclcustompricingmodel',
|
||||
name='pricing',
|
||||
field=models.ForeignKey(help_text='Choose a pricing that will be associated with this Calculator', on_delete=django.db.models.deletion.CASCADE, related_name='dcl_custom_pricing_vm_pricing', to='datacenterlight.VMPricing'),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-04-12 03:16
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import filer.fields.file
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0018_auto_20180403_1930'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CMSFaviconExtension',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('extended_object', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, to='cms.Page')),
|
||||
('favicon', filer.fields.file.FilerFileField(on_delete=django.db.models.deletion.CASCADE, related_name='cms_favicon_image', to='filer.File')),
|
||||
('public_extension', models.OneToOneField(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='draft_extension', to='datacenterlight.CMSFaviconExtension')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-04-20 15:04
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0019_auto_20180415_2236'),
|
||||
('datacenterlight', '0019_cmsfaviconextension'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
]
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-04-25 09:20
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import cms.models.fields
|
||||
from django.db import migrations
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0020_merge'),
|
||||
('cms', '0014_auto_20160404_1908'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='cmsintegration',
|
||||
name='calculator_placeholder',
|
||||
field=cms.models.fields.PlaceholderField(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='dcl-calculator-placeholder+', slotname='datacenterlight_calculator', to='cms.Placeholder'),
|
||||
),
|
||||
migrations.RenameModel(
|
||||
old_name='DCLCustomPricingModel',
|
||||
new_name='DCLCalculatorPluginModel',
|
||||
),
|
||||
]
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-05-07 02:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0021_cmsintegration_calculator_placeholder'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='vmpricing',
|
||||
name='discount_amount',
|
||||
field=models.DecimalField(
|
||||
decimal_places=2, default=0, max_digits=6),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='vmpricing',
|
||||
name='discount_name',
|
||||
field=models.CharField(blank=True, max_length=255, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-05-23 22:19
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0022_auto_20180506_1950'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclcalculatorpluginmodel',
|
||||
name='vm_type',
|
||||
field=models.CharField(choices=[('public', 'Public'), ('ipv6only', 'Ipv6Only')], default='public', max_length=50),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='vmtemplate',
|
||||
name='vm_type',
|
||||
field=models.CharField(choices=[('public', 'Public'), ('ipv6only', 'Ipv6Only')], default='public', max_length=50),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-06-24 08:23
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datacenterlight.cms_models
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0023_auto_20180524_0349'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclcalculatorpluginmodel',
|
||||
name='vm_templates_to_show',
|
||||
field=datacenterlight.cms_models.MultipleChoiceArrayField(base_field=models.CharField(blank=True, max_length=256), blank=True, default=list, help_text='Recommended: If you wish to show all templates of the corresponding VM Type (public/ipv6only), please do not select any of the items in the above field. This will allow any new template(s) added in the backend to be automatically listed in this calculator instance.', size=None),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-09-25 20:27
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0024_dclcalculatorpluginmodel_vm_templates_to_show'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclnavbarpluginmodel',
|
||||
name='show_login_option',
|
||||
field=models.BooleanField(default=True, help_text='Uncheck this if you do not want to show login/dashboard.'),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-09-27 20:32
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0025_dclnavbarpluginmodel_show_login_option'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclcalculatorpluginmodel',
|
||||
name='default_selected_template',
|
||||
field=models.CharField(default='Devuan Ascii', help_text='Write the name of the template that you need selected as default when the calculator loads', max_length=128, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2018-09-29 05:36
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0026_dclcalculatorpluginmodel_default_selected_template'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='dclcalculatorpluginmodel',
|
||||
name='enable_512mb_ram',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2019-04-20 09:52
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0027_dclcalculatorpluginmodel_enable_512mb_ram'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='stripeplan',
|
||||
name='stripe_plan_name',
|
||||
field=models.CharField(default='', max_length=512, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2019-04-20 10:22
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('datacenterlight', '0028_stripeplan_stripe_plan_name'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='stripeplan',
|
||||
name='amount',
|
||||
field=models.PositiveIntegerField(default=0),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='stripeplan',
|
||||
name='interval',
|
||||
field=models.CharField(default='', max_length=128, null=True),
|
||||
),
|
||||
]
|
||||
|
|
@ -1,123 +1,61 @@
|
|||
import logging
|
||||
|
||||
from django.db import models
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class BetaAccessVMType(models.Model):
|
||||
ssd = models.IntegerField()
|
||||
ram = models.IntegerField()
|
||||
cpu = models.IntegerField()
|
||||
price = models.FloatField()
|
||||
|
||||
def __str__(self):
|
||||
return "ID: %s - SSD %s - RAM %s - CPU %s - Price %s " % \
|
||||
(self.id, str(self.ssd), self.ram, self.cpu, self.price)
|
||||
|
||||
|
||||
class BetaAccess(models.Model):
|
||||
email = models.CharField(max_length=250)
|
||||
name = models.CharField(max_length=250)
|
||||
|
||||
# vm = models.ForeignKey(BetaAccessVM)
|
||||
|
||||
def __str__(self):
|
||||
vms = self.betaaccessvm_set.all()
|
||||
rep = "Email: %s " % self.email
|
||||
for vm in vms:
|
||||
rep += "(vm:%s - amount:%s) - " % (vm.type.id, vm.amount)
|
||||
return rep
|
||||
|
||||
|
||||
class BetaAccessVM(models.Model):
|
||||
type = models.ForeignKey(BetaAccessVMType)
|
||||
access = models.ForeignKey(BetaAccess)
|
||||
amount = models.IntegerField()
|
||||
|
||||
@classmethod
|
||||
def create(cls, data):
|
||||
VM_KEY_ID = 0
|
||||
VM_AMOUNT = 1
|
||||
ZERO = 0
|
||||
email = data.get('email')
|
||||
beta_access = BetaAccess.objects.create(email=email)
|
||||
vm_data = [(key, value) for key, value in data.items() if 'vm' in key]
|
||||
created_vms = []
|
||||
for vm in vm_data:
|
||||
if int(vm[VM_AMOUNT]) == ZERO:
|
||||
continue
|
||||
vm_id = vm[VM_KEY_ID].split('-').pop()
|
||||
vm_type = BetaAccessVMType.objects.get(id=vm_id)
|
||||
created_vms.append(cls.objects.create(access=beta_access,
|
||||
amount=vm[VM_AMOUNT], type=vm_type))
|
||||
|
||||
return created_vms
|
||||
|
||||
|
||||
class VMTemplate(models.Model):
|
||||
PUBLIC = 'public'
|
||||
IPV6 = 'ipv6only'
|
||||
VM_TYPE_CHOICES = (
|
||||
(PUBLIC, PUBLIC.title()),
|
||||
(IPV6, IPV6.title()),
|
||||
)
|
||||
name = models.CharField(max_length=50)
|
||||
opennebula_vm_template_id = models.IntegerField()
|
||||
vm_type = models.CharField(
|
||||
max_length=50, choices=VM_TYPE_CHOICES, default=PUBLIC
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return '%s - %s - %s' % (
|
||||
self.opennebula_vm_template_id, self.vm_type, self.name
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def create(cls, name, opennebula_vm_template_id, vm_type):
|
||||
vm_template = cls(
|
||||
name=name, opennebula_vm_template_id=opennebula_vm_template_id,
|
||||
vm_type=vm_type
|
||||
)
|
||||
def create(cls, name, opennebula_vm_template_id):
|
||||
vm_template = cls(name=name, opennebula_vm_template_id=opennebula_vm_template_id)
|
||||
return vm_template
|
||||
|
||||
|
||||
class VMPricing(models.Model):
|
||||
name = models.CharField(max_length=255, unique=True)
|
||||
vat_inclusive = models.BooleanField(default=True)
|
||||
vat_percentage = models.DecimalField(
|
||||
max_digits=7, decimal_places=5, blank=True, default=0
|
||||
)
|
||||
cores_unit_price = models.DecimalField(
|
||||
max_digits=7, decimal_places=5, default=0
|
||||
)
|
||||
ram_unit_price = models.DecimalField(
|
||||
max_digits=7, decimal_places=5, default=0
|
||||
)
|
||||
ssd_unit_price = models.DecimalField(
|
||||
max_digits=7, decimal_places=5, default=0
|
||||
)
|
||||
hdd_unit_price = models.DecimalField(
|
||||
max_digits=7, decimal_places=6, default=0
|
||||
)
|
||||
discount_name = models.CharField(max_length=255, null=True, blank=True)
|
||||
discount_amount = models.DecimalField(
|
||||
max_digits=6, decimal_places=2, default=0
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
display_str = self.name + ' => ' + ' - '.join([
|
||||
'{}/Core'.format(self.cores_unit_price.normalize()),
|
||||
'{}/GB RAM'.format(self.ram_unit_price.normalize()),
|
||||
'{}/GB SSD'.format(self.ssd_unit_price.normalize()),
|
||||
'{}/GB HDD'.format(self.hdd_unit_price.normalize()),
|
||||
'{}% VAT'.format(self.vat_percentage.normalize())
|
||||
if not self.vat_inclusive else 'VAT-Incl',
|
||||
])
|
||||
if self.discount_amount:
|
||||
display_str = ' - '.join([
|
||||
display_str,
|
||||
'{} {}'.format(
|
||||
self.discount_amount,
|
||||
self.discount_name if self.discount_name else 'Discount'
|
||||
)
|
||||
])
|
||||
return display_str
|
||||
|
||||
@classmethod
|
||||
def get_vm_pricing_by_name(cls, name):
|
||||
try:
|
||||
pricing = VMPricing.objects.get(name=name)
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
"Error getting VMPricing with name {name}. "
|
||||
"Details: {details}. Attempting to return default"
|
||||
"pricing.".format(name=name, details=str(e))
|
||||
)
|
||||
pricing = VMPricing.get_default_pricing()
|
||||
return pricing
|
||||
|
||||
@classmethod
|
||||
def get_default_pricing(cls):
|
||||
""" Returns the default pricing or None """
|
||||
try:
|
||||
default_pricing = VMPricing.objects.get(name='default')
|
||||
except Exception as e:
|
||||
logger.error(str(e))
|
||||
default_pricing = None
|
||||
return default_pricing
|
||||
|
||||
|
||||
class StripePlan(models.Model):
|
||||
"""
|
||||
A model to store Data Center Light's created Stripe plans
|
||||
"""
|
||||
stripe_plan_id = models.CharField(max_length=256, null=True)
|
||||
stripe_plan_name = models.CharField(max_length=512, default="", null=True)
|
||||
amount = models.PositiveIntegerField(default=0)
|
||||
interval = models.CharField(max_length=128, default="", null=True)
|
||||
|
||||
@classmethod
|
||||
def create(cls, stripe_plan_id):
|
||||
stripe_plan = cls(stripe_plan_id=stripe_plan_id)
|
||||
return stripe_plan
|
||||
|
||||
|
||||
class ContactUs(models.Model):
|
||||
name = models.CharField(max_length=250)
|
||||
email = models.CharField(max_length=250)
|
||||
message = models.TextField()
|
||||
field = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
|
|
|||
6584
datacenterlight/static/datacenterlight/css/bootstrap.css
vendored
Executable file
5
datacenterlight/static/datacenterlight/css/bootstrap.min.css
vendored
Executable file
|
|
@ -1,15 +0,0 @@
|
|||
/* only for cms editing mode */
|
||||
.section-figure .cms-plugin {
|
||||
flex-basis: 50%;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.split-section-plain .section-figure .cms-plugin {
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.section-figure .cms-plugin {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,193 +0,0 @@
|
|||
body,
|
||||
html {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-family: 'Lato', sans-serif;
|
||||
}
|
||||
|
||||
|
||||
/* bootstrap danger color override from #a94442 */
|
||||
|
||||
.text-danger,
|
||||
.has-error .help-block,
|
||||
.has-error .control-label,
|
||||
.has-error .radio,
|
||||
.has-error .checkbox,
|
||||
.has-error .radio-inline,
|
||||
.has-error .checkbox-inline,
|
||||
.has-error.radio label,
|
||||
.has-error.checkbox label,
|
||||
.has-error.radio-inline label,
|
||||
.has-error.checkbox-inline label,
|
||||
.has-error .form-control-feedback,
|
||||
.alert-danger,
|
||||
.list-group-item-danger,
|
||||
a.list-group-item-danger,
|
||||
a.list-group-item-danger:hover,
|
||||
a.list-group-item-danger:focus,
|
||||
.panel-danger>.panel-heading {
|
||||
color: #eb4d5c;
|
||||
}
|
||||
|
||||
.alert-danger {
|
||||
background: rgba(235, 204, 209, 0.2);
|
||||
}
|
||||
|
||||
.has-error .form-control,
|
||||
.has-error .form-control:focus,
|
||||
.has-error .form-control:active,
|
||||
.has-error .input-group-addon {
|
||||
color: #eb4d5c;
|
||||
border-color: #eb4d5c;
|
||||
}
|
||||
|
||||
a.list-group-item-danger.active,
|
||||
a.list-group-item-danger.active:hover,
|
||||
a.list-group-item-danger.active:focus {
|
||||
background-color: #eb4d5c;
|
||||
border-color: #eb4d5c;
|
||||
}
|
||||
|
||||
.panel-danger>.panel-heading .badge {
|
||||
background-color: #eb4d5c;
|
||||
}
|
||||
|
||||
.topnav {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.navbar-default {
|
||||
background: #fff;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.navbar-brand > img {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#logoWhite,
|
||||
.navbar-transparent #logoBlack {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#logoBlack,
|
||||
.navbar-transparent #logoWhite {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.navbar-right {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.navbar-brand {
|
||||
padding-right: 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.navbar .dcl-link {
|
||||
display: block;
|
||||
padding: 15px;
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.navbar .dcl-link:focus,
|
||||
.navbar .dcl-link:active,
|
||||
.navbar .dcl-link:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.navbar .dropdown-menu .dcl-link {
|
||||
padding: 1px 10px;
|
||||
}
|
||||
|
||||
p.copyright {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-weight: 300;
|
||||
padding: 25px 0;
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
|
||||
footer .list-inline {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: #777;
|
||||
}
|
||||
|
||||
footer .dcl-link-separator {
|
||||
position: relative;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
footer .dcl-link-separator::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
top: 9px;
|
||||
bottom: 0;
|
||||
left: -2px;
|
||||
right: 0;
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
border-radius: 100%;
|
||||
background: #777;
|
||||
}
|
||||
|
||||
.mb-0 {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.thin-hr {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.payment-container .credit-card-info {
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.credit-card-info {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.credit-card-info .align-bottom {
|
||||
align-self: flex-end;
|
||||
padding-right: 0 !important;
|
||||
}
|
||||
|
||||
.new-card-head {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.new-card-button-margin button{
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.input-no-border {
|
||||
border: none !important;
|
||||
background: transparent !important;
|
||||
resize: none;
|
||||
}
|
||||
|
||||
.existing-keys-title {
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
.btn-trans {
|
||||
color: #fff;
|
||||
border: 2px solid #fff;
|
||||
padding: 4px 18px;
|
||||
letter-spacing: 0.6px;
|
||||
background: rgba(0,0,0,0.35);
|
||||
}
|
||||
|
||||
.btn-trans:focus,
|
||||
.btn-trans:active,
|
||||
.btn-trans:hover {
|
||||
background: #fff;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.header_slider > .carousel .carousel-inner {
|
||||
min-height: 95vh;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.header_slider > .carousel .carousel-inner > .next,
|
||||
.header_slider > .carousel .carousel-inner > .prev {
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.header_slider .carousel-indicators {
|
||||
width: 100%;
|
||||
left: 0;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.header_slider .carousel-indicators li {
|
||||
margin-right: 25px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.header_slider .carousel-indicators li.active {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.header_slider .carousel-control {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.header_slider .carousel-control .fa {
|
||||
font-size: 2em;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
margin-top: -50px;
|
||||
}
|
||||
|
||||
.header_slider > .carousel .item {
|
||||
background: rgba(0,0,0,0.5);
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.header_slider > .carousel .item .container-fluid {
|
||||
overflow: auto;
|
||||
padding: 50px 20px 60px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-end;
|
||||
/* background: rgba(0,0,0,0.5); */
|
||||
}
|
||||
|
||||
.header_slider .intro-cap {
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
line-height: 1.1;
|
||||
font-size: 23px;
|
||||
padding-bottom: 10px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.header_slider .btn-trans {
|
||||
align-self: flex-end;
|
||||
z-index: 2;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.header_slider .intro-cap,
|
||||
.header_slider .intro_lead {
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.header_slider .intro-cap {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
.header_slider .carousel-control {
|
||||
width: 50px;
|
||||
display: block;
|
||||
}
|
||||
.header_slider .carousel-control .fa-angle-left {
|
||||
left: 25px;
|
||||
}
|
||||
.header_slider .carousel-control .fa-angle-right {
|
||||
right: 25px;
|
||||
}
|
||||
.header_slider .carousel-control .fa {
|
||||
font-size: 4em;
|
||||
}
|
||||
.header_slider > .carousel .item .container-fluid {
|
||||
overflow: auto;
|
||||
padding: 75px;
|
||||
}
|
||||
.header_slider .btn-trans {
|
||||
padding: 8px 15px;
|
||||
min-width: 175px;
|
||||
letter-spacing: 1px;
|
||||
font-size: 1.25em;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) {
|
||||
.header_slider .intro-cap {
|
||||
font-size: 3.25em;
|
||||
}
|
||||
}
|
||||
|
||||
.header_slider .intro_lead {
|
||||
color: #fff;
|
||||
font-size: 1.55em;
|
||||
text-align: right;
|
||||
line-height: 1.4;
|
||||
margin-bottom: 0;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.header_slider .intro_lead {
|
||||
font-size: 1.1em;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.header_slider .carousel-indicators li {
|
||||
margin: 1px 25px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.header_slider .carousel-indicators li.active {
|
||||
margin: 0 25px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
.bg_img {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
.bg_vid {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
@media (min-aspect-ratio: 16/9) {
|
||||
.bg_vid > video {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-aspect-ratio: 16/9) {
|
||||
.bg_vid > video {
|
||||
/* width: auto; */
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,616 +0,0 @@
|
|||
.navbar-transparent #logoWhite {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar-transparent #logoBlack {
|
||||
display: block;
|
||||
width: 220px;
|
||||
}
|
||||
|
||||
.topnav .navbar-fixed-top .navbar-collapse {
|
||||
max-height: 740px;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-header {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.navbar-right .highlights-dropdown .dropdown-menu {
|
||||
left: 0 !important;
|
||||
min-width: 155px;
|
||||
margin-left: 15px;
|
||||
padding: 0 5px 8px !important;
|
||||
}
|
||||
|
||||
@media(min-width: 768px) {
|
||||
.navbar-default .navbar-nav>li a,
|
||||
.navbar-right .highlights-dropdown .dropdown-menu>li a {
|
||||
font-weight: 300;
|
||||
}
|
||||
.navbar-right .highlights-dropdown .dropdown-menu {
|
||||
border-width: 0 0 1px 0;
|
||||
border-color: #e7e7e7;
|
||||
box-shadow: -8px 14px 20px -5px rgba(77, 77, 77, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
.navbar-right .highlights-dropdown .dropdown-menu>li a {
|
||||
font-size: 13px;
|
||||
font-family: 'Lato', sans-serif;
|
||||
padding: 1px 10px 1px 18px !important;
|
||||
background: transparent;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:hover,
|
||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:focus,
|
||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:active {
|
||||
background: transparent;
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
.un-icon {
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
opacity: 0.5;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
|
||||
/***** DCL payment page **********/
|
||||
|
||||
.dcl-order-container {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.dcl-place-order-text {
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
.card-warning-content {
|
||||
font-weight: 300;
|
||||
border: 1px solid #a1a1a1;
|
||||
border-radius: 3px;
|
||||
padding: 5px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.card-warning-error {
|
||||
border: 1px solid #EB4D5C;
|
||||
color: #EB4D5C;
|
||||
}
|
||||
|
||||
.card-warning-addtional-margin {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.card-cvc-element label {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.card-element {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.card-element label {
|
||||
width: 100%;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.my-input {
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.card-cvc-element .my-input {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
#card-errors {
|
||||
clear: both;
|
||||
padding: 0 0 10px;
|
||||
color: #eb4d5c;
|
||||
}
|
||||
|
||||
.credit-card-goup {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.card-expiry-element {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.card-cvc-element {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
#billing-form .form-control {
|
||||
box-shadow: none !important;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.dcl-order-container {
|
||||
width: 990px;
|
||||
padding: 0 15px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
.footer-vm p.copyright {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.navbar-default .navbar-nav>.open>a,
|
||||
.navbar-default .navbar-nav>.open>a:focus,
|
||||
.navbar-default .navbar-nav>.open>a:hover,
|
||||
.navbar-default .navbar-nav>.active>a,
|
||||
.navbar-default .navbar-nav>.active>a:focus,
|
||||
.navbar-default .navbar-nav>.active>a:hover {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.navbar-default .navbar-nav .open .dropdown-menu>.active a,
|
||||
.navbar-default .navbar-nav .open .dropdown-menu>.active a:focus,
|
||||
.navbar-default .navbar-nav .open .dropdown-menu>.active a:hover {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* bootstrap input box-shadow disable */
|
||||
|
||||
.has-error .form-control:focus,
|
||||
.has-error .form-control:active,
|
||||
.has-success .form-control:focus,
|
||||
.has-success .form-control:active {
|
||||
box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
.content-dashboard {
|
||||
min-height: calc(100vh - 96px);
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
max-width: 1120px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.content-dashboard {
|
||||
padding: 0 15px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 575px) {
|
||||
select {
|
||||
width: 280px;
|
||||
}
|
||||
}
|
||||
|
||||
.btn:focus,
|
||||
.btn:active:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***********Styles for Model********************/
|
||||
|
||||
.modal-content {
|
||||
border-radius: 0px;
|
||||
font-family: Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
width: 100%;
|
||||
float: left;
|
||||
border-radius: 0;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
min-height: 30px;
|
||||
border-bottom: 0px solid #e5e5e5;
|
||||
padding: 0px 15px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.modal-header .close {
|
||||
font-size: 75px;
|
||||
font-weight: 300;
|
||||
margin-top: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 11px;
|
||||
z-index: 10;
|
||||
line-height: 60px;
|
||||
}
|
||||
|
||||
.modal-header .close span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.modal-header .close:focus {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
float: left;
|
||||
padding: 0px 30px 15px 30px;
|
||||
}
|
||||
|
||||
.modal-body .modal-icon i {
|
||||
font-size: 80px;
|
||||
font-weight: 100;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.modal-body .modal-icon {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
margin: 0;
|
||||
line-height: 1.42857143;
|
||||
font-size: 25px;
|
||||
padding: 0;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.modal-text {
|
||||
padding-top: 5px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.modal-text p:not(:last-of-type) {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.modal-title+.modal-footer {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
border-top: 0px solid #e5e5e5;
|
||||
width: 100%;
|
||||
float: left;
|
||||
text-align: center;
|
||||
padding: 15px 15px;
|
||||
}
|
||||
|
||||
.modal {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.modal-dialog {
|
||||
display: inline-block;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
width: 40%;
|
||||
margin: 15px auto;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 991px) {
|
||||
.modal-dialog {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.modal-dialog {
|
||||
width: 95%;
|
||||
}
|
||||
}
|
||||
|
||||
@media(min-width: 576px) {
|
||||
.modal:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
vertical-align: middle;
|
||||
margin-right: -4px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ========= */
|
||||
|
||||
.btn-wide {
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.choice-btn {
|
||||
min-width: 110px;
|
||||
background-color: #3C5480;
|
||||
color: #fff;
|
||||
border: 2px solid #3C5480;
|
||||
padding: 4px 10px;
|
||||
transition: 0.3s all ease-out;
|
||||
}
|
||||
|
||||
.choice-btn:focus,
|
||||
.choice-btn:hover,
|
||||
.choice-btn:active {
|
||||
color: #3C5480;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.choice-btn {
|
||||
margin-top: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
.payment-container {
|
||||
padding-top: 70px;
|
||||
padding-bottom: 11%;
|
||||
}
|
||||
|
||||
.last-p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.dcl-payment-section {
|
||||
max-width: 391px;
|
||||
margin: 0 auto 30px;
|
||||
padding: 0 10px 30px;
|
||||
border-bottom: 1px solid #edebeb;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.dcl-payment-section hr {
|
||||
margin-top: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.dcl-payment-section .top-hr {
|
||||
margin-left: -10px;
|
||||
}
|
||||
|
||||
.dcl-payment-section h3 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.dcl-payment-section p {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.dcl-payment-section .card-warning-content {
|
||||
padding: 8px 10px;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.dcl-payment-order strong {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.dcl-payment-order p {
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
.dcl-payment-section .form-group {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.dcl-payment-section .form-control {
|
||||
box-shadow: none;
|
||||
padding: 6px 12px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.dcl-payment-user {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.dcl-payment-user h4 {
|
||||
font-weight: 600;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.dcl-payment-grid {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.dcl-payment-box {
|
||||
width: 50%;
|
||||
position: relative;
|
||||
padding: 0 30px;
|
||||
}
|
||||
.dcl-payment-box:nth-child(2) {
|
||||
order: 1;
|
||||
}
|
||||
.dcl-payment-box:nth-child(4) {
|
||||
order: 2;
|
||||
}
|
||||
.dcl-payment-section {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
margin-bottom: 0;
|
||||
border-bottom-width: 5px;
|
||||
}
|
||||
.dcl-payment-box:nth-child(2n) .dcl-payment-section {
|
||||
border-bottom: none;
|
||||
}
|
||||
.dcl-payment-box:nth-child(1):after,
|
||||
.dcl-payment-box:nth-child(2):after {
|
||||
content: ' ';
|
||||
display: block;
|
||||
background: #eee;
|
||||
width: 1px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
top: 20px;
|
||||
bottom: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
#virtual_machine_create_form {
|
||||
padding: 15px 0;
|
||||
}
|
||||
|
||||
.btn-vm-contact {
|
||||
color: #fff;
|
||||
background: #A3C0E2;
|
||||
border: 2px solid #A3C0E2;
|
||||
padding: 5px 25px;
|
||||
font-size: 12px;
|
||||
letter-spacing: 1.3px;
|
||||
}
|
||||
|
||||
.btn-vm-contact:hover,
|
||||
.btn-vm-contact:focus {
|
||||
background: #fff;
|
||||
color: #a3c0e2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* hosting-order */
|
||||
|
||||
.order-detail-container {
|
||||
max-width: 600px;
|
||||
margin: 100px auto 40px;
|
||||
border: 1px solid #ccc;
|
||||
padding: 30px 30px 20px;
|
||||
color: #595959;
|
||||
}
|
||||
|
||||
.order-detail-container .dashboard-title-thin {
|
||||
margin-top: 0;
|
||||
margin-left: -3px;
|
||||
}
|
||||
|
||||
.order-detail-container .dashboard-title-thin .un-icon {
|
||||
margin-top: -6px;
|
||||
}
|
||||
|
||||
.order-detail-container .dashboard-container-head {
|
||||
position: relative;
|
||||
padding: 0;
|
||||
margin-bottom: 38px;
|
||||
}
|
||||
|
||||
.order-detail-container .order-details {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.order-detail-container h4 {
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.order-detail-container p {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.order-detail-container hr {
|
||||
margin: 15px 0;
|
||||
}
|
||||
|
||||
.order-detail-container .thin-hr {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.order-detail-container .subtotal-price {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.order-detail-container .subtotal-price .text-primary {
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.order-detail-container .total-price {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.order-detail-container {
|
||||
padding: 15px;
|
||||
}
|
||||
.order-confirm-btn {
|
||||
text-align: center;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.order-detail-container .dashboard-container-options {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: -4px;
|
||||
}
|
||||
.order-detail-container .dashboard-container-options .svg-img {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
.order_detail_footer {
|
||||
font-size: 9px;
|
||||
letter-spacing: 1px;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.order_detail_footer strong {
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.order_detail_footer small {
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.dashboard-title-thin {
|
||||
font-weight: 300;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.dashboard-title-thin .un-icon {
|
||||
height: 34px;
|
||||
margin-right: 5px;
|
||||
margin-top: -2px;
|
||||
width: 34px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
@media (max-width:767px) {
|
||||
.dashboard-title-thin {
|
||||
font-size: 22px;
|
||||
}
|
||||
.dashboard-title-thin .un-icon {
|
||||
height: 22px;
|
||||
width: 22px;
|
||||
margin-top: -3px;
|
||||
}
|
||||
}
|
||||
|
||||
.locale_date {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.locale_date.done {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.btn-vm-back {
|
||||
color: #fff;
|
||||
background: #C4CEDA;
|
||||
border: 2px solid #C4CEDA;
|
||||
padding: 5px 25px;
|
||||
font-size: 12px;
|
||||
letter-spacing: 1.3px;
|
||||
}
|
||||
|
||||
.btn-vm-back:hover,
|
||||
.btn-vm-back:focus {
|
||||
color: #fff;
|
||||
background: #8da4c0;
|
||||
border-color: #8da4c0;
|
||||
}
|
||||
10
datacenterlight/static/datacenterlight/css/main.css
Normal file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Black.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-BlackItalic.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Bold.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-BoldItalic.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Hairline.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-HairlineItalic.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Italic.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Light.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-LightItalic.ttf
Executable file
BIN
datacenterlight/static/datacenterlight/fonts/Lato/Lato-Regular.ttf
Executable file
92
datacenterlight/static/datacenterlight/fonts/Lato/OFL.txt
Executable file
|
|
@ -0,0 +1,92 @@
|
|||
Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
datacenterlight/static/datacenterlight/img/beta-img.png
Normal file
|
After Width: | Height: | Size: 9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
|
@ -1,11 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="57px" height="66px" viewBox="0 0 57 66" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Slice 20</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="contact-us" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<ellipse id="Oval-2" fill="#FFFFFF" cx="28.7865939" cy="33.4691264" rx="19.7865939" ry="19.4691264"></ellipse>
|
||||
<path d="M35.3784886,34.6387051 L30.2336176,34.6387051 L30.2336176,50.2467762 L22.6226844,50.2467762 L22.6226844,34.6387051 L19,34.6387051 L19,29.1194625 L22.6226844,29.1194625 L22.6226844,25.5403791 C22.6226844,22.9849851 24.0459888,19 30.3115248,19 L35.9567996,19.0178699 L35.9567996,24.3762836 L31.8546864,24.3762836 C31.1894789,24.3762836 30.2426069,24.6596489 30.2426069,25.8824599 L30.2426069,29.1194625 L36.0436961,29.1194625 L35.3784886,34.6387051 Z" id="Shape" fill="#5E79AD" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
|
@ -2,32 +2,32 @@
|
|||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="156.5px" height="30.5px" viewBox="0 0 156.5 30.5" enable-background="new 0 0 156.5 30.5" xml:space="preserve">
|
||||
width="156.5px" height="40px" viewBox="0 0 156.5 40" enable-background="new 0 0 156.5 40" xml:space="preserve">
|
||||
<g display="none">
|
||||
<g display="inline">
|
||||
<path fill="#231916" d="M32.599,25.896c0-0.43,0.15-0.846,0.453-1.25c0.303-0.408,0.734-0.773,1.296-1.098v-0.092
|
||||
c-0.294-0.16-0.554-0.389-0.777-0.674c-0.22-0.289-0.332-0.662-0.332-1.119c0-0.354,0.115-0.712,0.345-1.076
|
||||
<path fill="#231916" d="M32.599,25.896c0-0.429,0.15-0.845,0.453-1.25c0.303-0.408,0.734-0.773,1.296-1.097v-0.092
|
||||
c-0.294-0.16-0.554-0.388-0.777-0.674c-0.22-0.289-0.332-0.662-0.332-1.119c0-0.354,0.115-0.712,0.345-1.076
|
||||
c0.227-0.36,0.55-0.683,0.964-0.962v-0.09c-0.386-0.28-0.711-0.654-0.978-1.12c-0.263-0.464-0.397-1.021-0.397-1.67
|
||||
c0-0.606,0.118-1.149,0.354-1.63c0.236-0.48,0.555-0.889,0.954-1.229c0.398-0.34,0.86-0.598,1.385-0.775
|
||||
c0.523-0.178,1.081-0.266,1.672-0.266c0.605,0,1.152,0.088,1.64,0.266h4.452v1.662h-2.702c0.222,0.237,0.42,0.528,0.598,0.875
|
||||
c0.178,0.348,0.267,0.735,0.267,1.165c0,0.59-0.111,1.117-0.332,1.572c-0.222,0.459-0.525,0.846-0.91,1.163
|
||||
c-0.384,0.318-0.834,0.558-1.351,0.72c-0.517,0.162-1.071,0.247-1.663,0.247c-0.265,0-0.55-0.032-0.854-0.092
|
||||
c-0.302-0.058-0.601-0.147-0.896-0.267c-0.503,0.326-0.753,0.7-0.753,1.131c0,0.397,0.185,0.687,0.553,0.864
|
||||
c0.369,0.177,0.901,0.267,1.596,0.267h2.303c1.42,0,2.47,0.203,3.159,0.606c0.687,0.406,1.029,1.076,1.029,2.007
|
||||
c0,0.518-0.145,1.004-0.431,1.461c-0.29,0.459-0.699,0.86-1.23,1.209c-0.531,0.348-1.174,0.621-1.929,0.819
|
||||
c-0.751,0.199-1.594,0.299-2.525,0.299c-1.537,0-2.747-0.25-3.633-0.743C33.042,27.586,32.599,26.857,32.599,25.896z
|
||||
c-0.384,0.318-0.834,0.558-1.351,0.72c-0.517,0.162-1.071,0.246-1.663,0.246c-0.265,0-0.55-0.031-0.854-0.091
|
||||
c-0.302-0.058-0.601-0.147-0.896-0.267c-0.503,0.326-0.753,0.701-0.753,1.131c0,0.398,0.185,0.686,0.553,0.865
|
||||
c0.369,0.176,0.901,0.266,1.596,0.266h2.303c1.42,0,2.47,0.203,3.159,0.607c0.687,0.406,1.029,1.076,1.029,2.006
|
||||
c0,0.518-0.145,1.004-0.431,1.461c-0.29,0.459-0.699,0.861-1.23,1.209c-0.531,0.348-1.174,0.621-1.929,0.82
|
||||
c-0.751,0.199-1.594,0.299-2.525,0.299c-1.537,0-2.747-0.25-3.633-0.744C33.042,27.586,32.599,26.857,32.599,25.896z
|
||||
M34.458,25.633c0,0.516,0.285,0.932,0.854,1.25s1.393,0.477,2.47,0.477c0.577,0,1.097-0.055,1.562-0.166
|
||||
c0.465-0.109,0.864-0.258,1.197-0.441s0.585-0.396,0.764-0.631c0.177-0.234,0.266-0.486,0.266-0.754
|
||||
c0-0.475-0.196-0.785-0.587-0.941c-0.392-0.152-0.979-0.23-1.762-0.23h-1.905c-0.34,0-0.641-0.012-0.907-0.033
|
||||
c-0.268-0.021-0.519-0.07-0.754-0.145c-0.444,0.25-0.753,0.51-0.932,0.775C34.549,25.057,34.458,25.334,34.458,25.633z
|
||||
c0.465-0.11,0.864-0.258,1.197-0.442s0.585-0.396,0.764-0.631c0.177-0.234,0.266-0.486,0.266-0.754
|
||||
c0-0.474-0.196-0.785-0.587-0.941c-0.392-0.153-0.979-0.231-1.762-0.231h-1.905c-0.34,0-0.641-0.012-0.907-0.033
|
||||
c-0.268-0.021-0.519-0.07-0.754-0.145c-0.444,0.25-0.753,0.51-0.932,0.776C34.549,25.057,34.458,25.334,34.458,25.633z
|
||||
M37.539,19.095c0.621,0,1.152-0.206,1.597-0.62c0.442-0.414,0.665-0.989,0.665-1.727c0-0.71-0.223-1.279-0.665-1.707
|
||||
c-0.445-0.428-0.976-0.643-1.597-0.643s-1.152,0.215-1.595,0.643c-0.442,0.428-0.665,0.997-0.665,1.707
|
||||
c0,0.738,0.223,1.313,0.665,1.727C36.386,18.889,36.918,19.095,37.539,19.095z"/>
|
||||
</g>
|
||||
<path display="inline" fill="#231916" d="M15.983,24.24h-1.857l-0.183-1.854h-0.092c-0.551,0.642-1.151,1.154-1.8,1.548
|
||||
c-0.649,0.387-1.401,0.582-2.258,0.582c-1.329,0-2.3-0.384-2.91-1.156c-0.612-0.771-0.917-1.897-0.917-3.38V14.35L3,14.293
|
||||
c-0.649,0.387-1.401,0.582-2.258,0.582c-1.329,0-2.3-0.384-2.91-1.156c-0.612-0.771-0.917-1.898-0.917-3.381V14.35L3,14.293
|
||||
l5.258-2.023l-0.023,1.529v5.882c0,0.994,0.176,1.724,0.528,2.189c0.351,0.467,0.954,0.7,1.811,0.7
|
||||
c0.581,0,1.111-0.144,1.593-0.426c0.48-0.283,0.998-0.763,1.547-1.434v-7.678h2.269V24.24z"/>
|
||||
c0.581,0,1.111-0.143,1.593-0.426c0.48-0.283,0.998-0.762,1.547-1.433v-7.678h2.269V24.24z"/>
|
||||
<path display="inline" fill="#231916" d="M19.742,13.033h1.856l0.184,1.812h0.091c0.565-0.582,1.176-1.075,1.834-1.479
|
||||
c0.655-0.405,1.42-0.607,2.292-0.607c1.313,0,2.278,0.39,2.888,1.168c0.611,0.778,0.917,1.903,0.917,3.37v6.942h-2.271v-6.646
|
||||
c0-0.976-0.174-1.7-0.525-2.165c-0.352-0.467-0.955-0.701-1.811-0.701c-0.597,0-1.131,0.151-1.605,0.447
|
||||
|
|
@ -36,28 +36,28 @@
|
|||
c0.533-0.511,1.146-0.902,1.834-1.17c0.687-0.267,1.398-0.4,2.13-0.4c0.826,0,1.555,0.13,2.19,0.39
|
||||
c0.633,0.26,1.172,0.621,1.615,1.086c0.443,0.468,0.779,1.025,1.01,1.676c0.229,0.648,0.344,1.362,0.344,2.142
|
||||
c0,0.229-0.012,0.447-0.035,0.652c-0.022,0.208-0.049,0.38-0.08,0.516h-8.436c0.077,1.1,0.485,1.96,1.229,2.58
|
||||
c0.739,0.619,1.675,0.928,2.807,0.928c0.611,0,1.18-0.084,1.708-0.252c0.527-0.166,1.042-0.402,1.546-0.709l0.802,1.443
|
||||
c-0.578,0.367-1.23,0.676-1.959,0.928c-0.726,0.252-1.525,0.377-2.396,0.377c-0.842,0-1.631-0.131-2.371-0.398
|
||||
c-0.742-0.268-1.387-0.65-1.938-1.156c-0.551-0.504-0.982-1.119-1.296-1.846C55.286,20.386,55.129,19.566,55.129,18.65z
|
||||
c0.739,0.619,1.675,0.928,2.807,0.928c0.611,0,1.18-0.084,1.708-0.252c0.527-0.166,1.042-0.403,1.546-0.709l0.802,1.443
|
||||
c-0.578,0.367-1.23,0.676-1.959,0.928c-0.726,0.252-1.525,0.377-2.396,0.377c-0.842,0-1.631-0.131-2.371-0.399
|
||||
c-0.742-0.267-1.387-0.65-1.938-1.156c-0.551-0.504-0.982-1.119-1.296-1.846C55.286,20.386,55.129,19.566,55.129,18.65z
|
||||
M63.909,17.665c0-1.01-0.263-1.781-0.779-2.317c-0.521-0.534-1.262-0.8-2.225-0.8c-0.84,0-1.587,0.266-2.245,0.8
|
||||
c-0.658,0.536-1.062,1.307-1.214,2.317H63.909z"/>
|
||||
<path display="inline" fill="#231916" d="M73.475,12.679l0.008,11.793h-2.27v-8.612h-4.256L73.475,12.679z M72.152,10.368
|
||||
<path display="inline" fill="#231916" d="M73.475,12.679l0.008,11.793h-2.27v-8.611h-4.256L73.475,12.679z M72.152,10.368
|
||||
c-0.488,0-0.894-0.146-1.215-0.435c-0.32-0.291-0.48-0.681-0.48-1.17c0-0.489,0.16-0.882,0.48-1.18
|
||||
c0.321-0.298,0.727-0.446,1.215-0.446c0.488,0,0.896,0.148,1.215,0.446c0.32,0.298,0.482,0.691,0.482,1.18
|
||||
c0,0.489-0.162,0.879-0.482,1.17C73.049,10.221,72.641,10.368,72.152,10.368z"/>
|
||||
c0.321-0.298,0.727-0.446,1.215-0.446s0.896,0.148,1.215,0.446c0.32,0.298,0.482,0.691,0.482,1.18c0,0.489-0.162,0.879-0.482,1.17
|
||||
C73.049,10.221,72.641,10.368,72.152,10.368z"/>
|
||||
<path display="inline" fill="#231916" d="M76.629,18.878c0-0.932,0.168-1.766,0.504-2.497c0.336-0.735,0.795-1.353,1.375-1.859
|
||||
c0.582-0.503,1.25-0.884,2.008-1.145c0.756-0.26,1.562-0.389,2.416-0.389c0.918,0,1.719,0.156,2.406,0.469
|
||||
c0.689,0.312,1.262,0.693,1.721,1.135l-1.1,1.443c-0.443-0.367-0.904-0.653-1.379-0.86c-0.471-0.206-0.984-0.309-1.535-0.309
|
||||
c-0.594,0-1.143,0.095-1.65,0.287c-0.502,0.19-0.936,0.462-1.293,0.813c-0.357,0.352-0.639,0.776-0.838,1.272
|
||||
c-0.594,0-1.143,0.095-1.65,0.287c-0.502,0.19-0.936,0.462-1.293,0.813c-0.358,0.352-0.639,0.776-0.838,1.272
|
||||
c-0.197,0.495-0.297,1.042-0.297,1.638c0,0.595,0.096,1.144,0.287,1.64c0.189,0.496,0.465,0.92,0.824,1.273
|
||||
c0.359,0.35,0.785,0.623,1.273,0.812c0.486,0.188,1.027,0.283,1.627,0.283c0.686,0,1.307-0.129,1.855-0.387
|
||||
c0.549-0.264,1.043-0.574,1.488-0.939l0.965,1.467c-0.645,0.551-1.348,0.975-2.111,1.271c-0.764,0.298-1.559,0.445-2.383,0.445
|
||||
c-0.871,0-1.688-0.129-2.439-0.391c-0.756-0.26-1.41-0.643-1.961-1.146c-0.55-0.506-0.98-1.121-1.293-1.847
|
||||
c0.359,0.35,0.785,0.623,1.273,0.812c0.487,0.188,1.028,0.284,1.627,0.284c0.686,0,1.307-0.129,1.856-0.387
|
||||
c0.549-0.263,1.043-0.574,1.488-0.94l0.965,1.467c-0.644,0.551-1.347,0.975-2.111,1.272c-0.764,0.298-1.559,0.445-2.383,0.445
|
||||
c-0.871,0-1.687-0.129-2.44-0.39c-0.756-0.26-1.41-0.643-1.961-1.146c-0.55-0.506-0.98-1.121-1.293-1.847
|
||||
C76.785,20.641,76.629,19.811,76.629,18.878z"/>
|
||||
<path display="inline" fill="#231916" d="M87.4,8.285l4.752-2.356v6.601l-0.139,2.521c0.564-0.58,1.178-1.07,1.836-1.467
|
||||
c0.654-0.396,1.42-0.595,2.293-0.595c1.312,0,2.273,0.389,2.885,1.168c0.611,0.78,0.918,1.903,0.918,3.371v6.945h-2.271v-6.647
|
||||
c0-0.978-0.176-1.7-0.525-2.165c-0.354-0.466-0.953-0.7-1.812-0.7c-0.596,0-1.131,0.149-1.604,0.448
|
||||
c-0.476,0.298-1.002,0.745-1.582,1.342v7.727H89.88L89.836,8.189L87.4,8.285z"/>
|
||||
<path display="inline" fill="#231916" d="M87.4,8.285l4.752-2.356v6.601l-0.139,2.521c0.565-0.58,1.178-1.07,1.836-1.467
|
||||
c0.655-0.396,1.42-0.595,2.293-0.595c1.312,0,2.274,0.389,2.885,1.168c0.611,0.78,0.918,1.903,0.918,3.371v6.945h-2.271v-6.648
|
||||
c0-0.978-0.176-1.7-0.526-2.165c-0.353-0.466-0.953-0.7-1.812-0.7c-0.596,0-1.131,0.149-1.604,0.448
|
||||
c-0.475,0.298-1.002,0.745-1.582,1.342v7.726h-2.27L89.836,8.189L87.4,8.285z"/>
|
||||
<g display="inline">
|
||||
<polygon fill="#010000" points="100.371,3.218 99.607,4.815 109.109,4.855 109.873,3.228 "/>
|
||||
<polygon fill="#010000" points="99.619,6.703 98.83,8.378 108.346,8.397 109.109,6.74 "/>
|
||||
|
|
@ -65,120 +65,117 @@
|
|||
</g>
|
||||
<g display="inline">
|
||||
<path fill="#231916" d="M49.446,20.596c0,0.754,0.188,1.297,0.566,1.631c0.376,0.33,0.866,0.498,1.472,0.498
|
||||
c0.295,0,0.599-0.037,0.909-0.11c0.31-0.074,0.658-0.193,1.042-0.355l0.532,1.644c-0.252,0.086-0.492,0.166-0.721,0.242
|
||||
c-0.231,0.073-0.461,0.135-0.698,0.187c-0.237,0.055-0.483,0.099-0.741,0.135c-0.26,0.035-0.543,0.058-0.853,0.058
|
||||
c-1.212,0-2.131-0.349-2.76-1.043c-0.627-0.692-0.941-1.696-0.941-3.014V5.711h-3.544l5.737-4.043"/>
|
||||
c0.295,0,0.599-0.037,0.909-0.111s0.658-0.193,1.042-0.355l0.532,1.643c-0.252,0.086-0.492,0.166-0.721,0.242
|
||||
c-0.231,0.074-0.461,0.135-0.698,0.187c-0.237,0.055-0.483,0.098-0.741,0.135c-0.26,0.035-0.543,0.058-0.853,0.058
|
||||
c-1.212,0-2.131-0.349-2.76-1.043c-0.627-0.693-0.941-1.697-0.941-3.014V5.711h-3.544l5.737-4.043"/>
|
||||
</g>
|
||||
</g>
|
||||
<path fill="#29427A" d="M12.927,23.014v-1.461h-0.045c-0.359,0.569-0.873,1.008-1.539,1.313s-1.374,0.461-2.122,0.461
|
||||
c-0.839,0-1.587-0.165-2.246-0.494c-0.659-0.329-1.216-0.769-1.673-1.313c-0.457-0.547-0.805-1.18-1.044-1.897
|
||||
c-0.24-0.718-0.359-1.467-0.359-2.245c0-0.778,0.124-1.523,0.371-2.234s0.599-1.337,1.055-1.875c0.457-0.539,1.011-0.966,1.662-1.28
|
||||
<path fill="#29427A" d="M12.927,23.013v-1.46h-0.045c-0.359,0.569-0.873,1.007-1.539,1.313s-1.374,0.461-2.122,0.461
|
||||
c-0.839,0-1.587-0.165-2.246-0.494c-0.659-0.329-1.216-0.768-1.673-1.313c-0.457-0.547-0.805-1.18-1.044-1.898
|
||||
c-0.24-0.718-0.359-1.467-0.359-2.245s0.124-1.523,0.371-2.234s0.599-1.337,1.055-1.875c0.457-0.539,1.011-0.966,1.662-1.28
|
||||
c0.651-0.314,1.381-0.472,2.189-0.472c0.823,0,1.52,0.157,2.089,0.472c0.568,0.314,1.011,0.659,1.325,1.033h0.045V6.035h3.683
|
||||
v16.979H12.927z M12.792,17.398c0-0.359-0.064-0.711-0.191-1.056c-0.128-0.345-0.307-0.651-0.54-0.921
|
||||
v16.978H12.927z M12.792,17.398c0-0.359-0.064-0.711-0.191-1.056c-0.128-0.345-0.307-0.651-0.54-0.921
|
||||
c-0.232-0.27-0.513-0.486-0.842-0.651c-0.329-0.164-0.704-0.247-1.123-0.247c-0.434,0-0.816,0.083-1.145,0.247
|
||||
c-0.33,0.165-0.606,0.379-0.831,0.64c-0.225,0.263-0.393,0.565-0.505,0.91c-0.112,0.345-0.168,0.696-0.168,1.056
|
||||
c0,0.358,0.056,0.715,0.168,1.066c0.112,0.351,0.281,0.663,0.505,0.932c0.225,0.27,0.501,0.487,0.831,0.651
|
||||
c0.329,0.165,0.711,0.247,1.145,0.247c0.419,0,0.793-0.082,1.123-0.247c0.33-0.164,0.61-0.382,0.842-0.651s0.412-0.575,0.54-0.921
|
||||
c-0.33,0.165-0.606,0.379-0.831,0.64c-0.225,0.263-0.393,0.565-0.505,0.91s-0.168,0.696-0.168,1.056
|
||||
c0,0.358,0.056,0.715,0.168,1.066s0.281,0.663,0.505,0.932c0.225,0.27,0.501,0.487,0.831,0.651c0.329,0.165,0.711,0.247,1.145,0.247
|
||||
c0.419,0,0.793-0.082,1.123-0.247c0.33-0.164,0.61-0.382,0.842-0.651c0.232-0.269,0.412-0.575,0.54-0.921
|
||||
C12.728,18.109,12.792,17.758,12.792,17.398z"/>
|
||||
<path fill="#29427A" d="M19.08,13.355c0.659-0.628,1.426-1.1,2.302-1.415s1.771-0.472,2.684-0.472c0.944,0,1.741,0.116,2.392,0.348
|
||||
s1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.187,0.74,0.281,1.62,0.281,2.639v5.637H25.84v-1.189h-0.067
|
||||
c-0.285,0.464-0.715,0.822-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.062-1.393-0.181
|
||||
c-0.479-0.119-0.917-0.313-1.313-0.584c-0.397-0.27-0.723-0.629-0.977-1.078c-0.255-0.448-0.382-1.002-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953c0.442-0.494,1.011-0.876,1.707-1.146c0.696-0.27,1.471-0.449,2.324-0.539
|
||||
c0.853-0.09,1.685-0.135,2.493-0.135v-0.18c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393
|
||||
c-0.524,0-1.03,0.112-1.516,0.337c-0.487,0.225-0.902,0.494-1.247,0.809L19.08,13.355z M25.84,18.139h-0.472
|
||||
c-0.404,0-0.812,0.02-1.224,0.057c-0.412,0.037-0.779,0.108-1.101,0.213c-0.322,0.105-0.588,0.259-0.797,0.461
|
||||
c-0.21,0.202-0.314,0.468-0.314,0.797c0,0.21,0.049,0.39,0.146,0.539c0.097,0.15,0.221,0.27,0.371,0.358
|
||||
c0.149,0.091,0.322,0.153,0.517,0.191c0.194,0.037,0.382,0.057,0.562,0.057c0.749,0,1.321-0.205,1.718-0.618
|
||||
c0.396-0.412,0.595-0.97,0.595-1.673L25.84,18.139L25.84,18.139z"/>
|
||||
c0.651,0.232,1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.187,0.74,0.281,1.62,0.281,2.639v5.637H25.84v-1.19
|
||||
h-0.067c-0.285,0.464-0.715,0.823-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.061-1.393-0.18
|
||||
c-0.479-0.12-0.917-0.314-1.313-0.584c-0.397-0.27-0.723-0.629-0.977-1.078c-0.255-0.449-0.382-1.003-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953s1.011-0.876,1.707-1.146c0.696-0.27,1.471-0.449,2.324-0.539s1.685-0.135,2.493-0.135v-0.18
|
||||
c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393c-0.524,0-1.03,0.112-1.516,0.337
|
||||
c-0.487,0.225-0.902,0.494-1.247,0.809L19.08,13.355z M25.84,18.139h-0.472c-0.404,0-0.812,0.02-1.224,0.057
|
||||
c-0.412,0.037-0.779,0.108-1.101,0.213c-0.322,0.105-0.588,0.259-0.797,0.461c-0.21,0.202-0.314,0.468-0.314,0.797
|
||||
c0,0.21,0.049,0.39,0.146,0.539c0.097,0.15,0.221,0.27,0.371,0.359c0.149,0.09,0.322,0.153,0.517,0.191
|
||||
c0.194,0.037,0.382,0.056,0.562,0.056c0.749,0,1.321-0.205,1.718-0.617c0.396-0.412,0.595-0.97,0.595-1.673V18.139z"/>
|
||||
<path fill="#29427A" d="M36.067,14.568v4.283c0,0.526,0.101,0.921,0.303,1.184c0.202,0.264,0.565,0.395,1.089,0.395
|
||||
c0.18,0,0.371-0.015,0.573-0.045c0.202-0.029,0.371-0.074,0.505-0.135l0.045,2.695c-0.255,0.09-0.577,0.169-0.966,0.234
|
||||
c-0.389,0.067-0.779,0.103-1.168,0.103c-0.749,0-1.377-0.095-1.886-0.281c-0.509-0.188-0.917-0.458-1.224-0.812
|
||||
s-0.528-0.772-0.662-1.26c-0.135-0.489-0.202-1.033-0.202-1.634v-4.729h-1.797v-2.74h1.774v-2.94h3.616v2.942h2.627v2.74
|
||||
L36.067,14.568L36.067,14.568z"/>
|
||||
c0.18,0,0.371-0.015,0.573-0.045c0.202-0.029,0.371-0.074,0.505-0.135l0.045,2.695c-0.255,0.09-0.577,0.169-0.966,0.235
|
||||
c-0.389,0.067-0.779,0.102-1.168,0.102c-0.749,0-1.377-0.094-1.886-0.281c-0.509-0.188-0.917-0.458-1.224-0.811
|
||||
c-0.307-0.354-0.528-0.773-0.662-1.261c-0.135-0.488-0.202-1.032-0.202-1.633v-4.729h-1.797v-2.74h1.774V8.887h3.616v2.942h2.627
|
||||
v2.74H36.067z"/>
|
||||
<path fill="#29427A" d="M40.957,13.355c0.659-0.628,1.426-1.1,2.302-1.415s1.771-0.472,2.684-0.472c0.943,0,1.741,0.116,2.392,0.348
|
||||
s1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.188,0.74,0.281,1.62,0.281,2.639v5.637h-3.369v-1.189H47.65
|
||||
c-0.285,0.464-0.715,0.822-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.062-1.392-0.181
|
||||
s-0.917-0.313-1.314-0.584c-0.397-0.27-0.723-0.629-0.977-1.078c-0.254-0.448-0.382-1.002-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953c0.442-0.494,1.011-0.876,1.707-1.146c0.696-0.27,1.471-0.449,2.324-0.539
|
||||
c0.853-0.09,1.685-0.135,2.493-0.135v-0.18c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393
|
||||
c-0.524,0-1.03,0.112-1.516,0.337c-0.486,0.225-0.902,0.494-1.247,0.809L40.957,13.355z M47.717,18.139h-0.471
|
||||
c-0.404,0-0.812,0.02-1.224,0.057c-0.412,0.037-0.779,0.108-1.101,0.213c-0.322,0.105-0.587,0.259-0.797,0.461
|
||||
c-0.209,0.202-0.314,0.468-0.314,0.797c0,0.21,0.049,0.39,0.146,0.539c0.097,0.15,0.22,0.27,0.37,0.358
|
||||
c0.149,0.091,0.322,0.153,0.517,0.191c0.194,0.037,0.382,0.057,0.562,0.057c0.749,0,1.321-0.205,1.718-0.618
|
||||
c0.396-0.412,0.595-0.97,0.595-1.673L47.717,18.139L47.717,18.139z"/>
|
||||
c0.651,0.232,1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.188,0.74,0.281,1.62,0.281,2.639v5.637h-3.369v-1.19
|
||||
h-0.067c-0.285,0.464-0.715,0.823-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.061-1.392-0.18
|
||||
c-0.479-0.12-0.917-0.314-1.314-0.584c-0.397-0.27-0.723-0.629-0.977-1.078s-0.382-1.003-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953s1.011-0.876,1.707-1.146s1.471-0.449,2.324-0.539s1.685-0.135,2.493-0.135v-0.18
|
||||
c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393c-0.524,0-1.03,0.112-1.516,0.337s-0.902,0.494-1.247,0.809
|
||||
L40.957,13.355z M47.717,18.139h-0.471c-0.404,0-0.812,0.02-1.224,0.057c-0.412,0.037-0.779,0.108-1.101,0.213
|
||||
c-0.322,0.105-0.587,0.259-0.797,0.461c-0.209,0.202-0.314,0.468-0.314,0.797c0,0.21,0.049,0.39,0.146,0.539
|
||||
c0.097,0.15,0.22,0.27,0.37,0.359c0.149,0.09,0.322,0.153,0.517,0.191c0.194,0.037,0.382,0.056,0.562,0.056
|
||||
c0.749,0,1.321-0.205,1.718-0.617c0.396-0.412,0.595-0.97,0.595-1.673V18.139z"/>
|
||||
<path fill="#5A74AF" d="M61.874,15.197c-0.375-0.389-0.768-0.685-1.179-0.887c-0.412-0.202-0.902-0.304-1.471-0.304
|
||||
c-0.554,0-1.037,0.102-1.449,0.304s-0.756,0.479-1.033,0.831c-0.277,0.352-0.487,0.756-0.629,1.212
|
||||
C55.971,16.81,55.9,17.286,55.9,17.78c0,0.494,0.082,0.962,0.247,1.403s0.396,0.827,0.696,1.156c0.3,0.33,0.659,0.588,1.078,0.775
|
||||
s0.891,0.28,1.415,0.28c0.568,0,1.055-0.102,1.459-0.304c0.404-0.202,0.778-0.498,1.123-0.888l1.438,1.438
|
||||
c-0.524,0.584-1.134,1.004-1.831,1.258c-0.696,0.254-1.434,0.383-2.212,0.383c-0.823,0-1.576-0.135-2.257-0.404
|
||||
c-0.681-0.27-1.269-0.646-1.763-1.135c-0.494-0.485-0.876-1.07-1.146-1.751c-0.27-0.682-0.404-1.434-0.404-2.258
|
||||
c0-0.822,0.135-1.579,0.404-2.268s0.647-1.28,1.134-1.774c0.486-0.494,1.07-0.879,1.751-1.156c0.681-0.277,1.441-0.416,2.279-0.416
|
||||
c-0.554,0-1.037,0.102-1.449,0.304c-0.412,0.202-0.756,0.479-1.033,0.831s-0.487,0.756-0.629,1.212
|
||||
c-0.142,0.457-0.213,0.933-0.213,1.427s0.082,0.962,0.247,1.403c0.165,0.441,0.396,0.827,0.696,1.156
|
||||
c0.3,0.33,0.659,0.588,1.078,0.775c0.419,0.188,0.891,0.28,1.415,0.28c0.568,0,1.055-0.101,1.459-0.303s0.778-0.498,1.123-0.888
|
||||
l1.438,1.438c-0.524,0.584-1.134,1.003-1.831,1.258c-0.696,0.254-1.434,0.382-2.212,0.382c-0.823,0-1.576-0.135-2.257-0.404
|
||||
s-1.269-0.647-1.763-1.135c-0.494-0.485-0.876-1.07-1.146-1.751c-0.27-0.682-0.404-1.434-0.404-2.258
|
||||
c0-0.822,0.135-1.579,0.404-2.268s0.647-1.28,1.134-1.774c0.486-0.494,1.07-0.879,1.751-1.156s1.441-0.416,2.279-0.416
|
||||
c0.779,0,1.523,0.139,2.235,0.416c0.711,0.277,1.329,0.7,1.853,1.269L61.874,15.197z"/>
|
||||
<path fill="#5A74AF" d="M66.612,18.432c0,0.464,0.101,0.887,0.304,1.269c0.201,0.382,0.467,0.707,0.797,0.977
|
||||
c0.329,0.271,0.711,0.479,1.145,0.629c0.435,0.15,0.884,0.226,1.348,0.226c0.629,0,1.176-0.146,1.64-0.438
|
||||
c0.464-0.292,0.891-0.678,1.28-1.157l1.527,1.168c-1.123,1.451-2.695,2.179-4.717,2.179c-0.838,0-1.598-0.144-2.279-0.427
|
||||
c-0.681-0.284-1.258-0.678-1.729-1.18c-0.473-0.502-0.836-1.093-1.09-1.774c-0.254-0.681-0.382-1.418-0.382-2.212
|
||||
s0.139-1.531,0.416-2.213c0.276-0.681,0.658-1.271,1.146-1.773c0.486-0.501,1.066-0.895,1.74-1.18
|
||||
c0.674-0.284,1.406-0.426,2.201-0.426c0.942,0,1.74,0.165,2.391,0.494c0.652,0.33,1.187,0.76,1.605,1.292
|
||||
c0.42,0.531,0.723,1.13,0.91,1.796c0.188,0.667,0.281,1.345,0.281,2.033v0.719h-8.534V18.432z M72.99,16.814
|
||||
c-0.016-0.449-0.086-0.861-0.213-1.235c-0.128-0.374-0.318-0.7-0.573-0.978c-0.255-0.276-0.573-0.493-0.954-0.65
|
||||
c-0.383-0.157-0.828-0.236-1.337-0.236c-0.493,0-0.946,0.094-1.358,0.281c-0.412,0.187-0.76,0.43-1.044,0.729
|
||||
c-0.284,0.299-0.505,0.633-0.663,0.999c-0.156,0.367-0.235,0.73-0.235,1.09H72.99z"/>
|
||||
c0.329,0.27,0.711,0.479,1.145,0.629c0.435,0.15,0.884,0.225,1.348,0.225c0.629,0,1.176-0.146,1.64-0.438
|
||||
c0.464-0.292,0.891-0.678,1.28-1.157l1.527,1.168c-1.123,1.452-2.695,2.179-4.717,2.179c-0.838,0-1.598-0.143-2.279-0.427
|
||||
s-1.258-0.678-1.729-1.179c-0.473-0.502-0.836-1.093-1.09-1.774s-0.382-1.418-0.382-2.212s0.139-1.531,0.416-2.213
|
||||
c0.276-0.681,0.658-1.271,1.146-1.773c0.486-0.501,1.066-0.895,1.74-1.18c0.674-0.284,1.406-0.426,2.201-0.426
|
||||
c0.942,0,1.74,0.165,2.391,0.494c0.652,0.33,1.187,0.76,1.605,1.292c0.42,0.531,0.723,1.13,0.91,1.796
|
||||
c0.188,0.667,0.281,1.345,0.281,2.033v0.719H66.612z M72.99,16.814c-0.016-0.449-0.086-0.861-0.213-1.235
|
||||
c-0.128-0.374-0.318-0.7-0.573-0.978c-0.255-0.276-0.573-0.493-0.954-0.65c-0.383-0.157-0.828-0.236-1.337-0.236
|
||||
c-0.493,0-0.946,0.094-1.358,0.281s-0.76,0.43-1.044,0.729s-0.505,0.633-0.663,0.999c-0.156,0.367-0.235,0.73-0.235,1.09H72.99z"/>
|
||||
<path fill="#5A74AF" d="M77.572,12.368h2.021v1.639h0.046c0.254-0.568,0.695-1.029,1.324-1.381s1.355-0.528,2.178-0.528
|
||||
c0.51,0,1,0.079,1.473,0.236c0.472,0.157,0.883,0.4,1.234,0.73c0.353,0.329,0.633,0.752,0.842,1.269
|
||||
c0.209,0.516,0.314,1.126,0.314,1.83v6.851h-2.021v-6.289c0-0.494-0.065-0.917-0.2-1.269c-0.136-0.353-0.314-0.637-0.539-0.854
|
||||
c-0.226-0.216-0.483-0.373-0.775-0.471c-0.292-0.098-0.596-0.146-0.909-0.146c-0.418,0-0.809,0.067-1.168,0.202
|
||||
c-0.358,0.135-0.674,0.349-0.943,0.641c-0.27,0.291-0.479,0.662-0.629,1.111c-0.149,0.449-0.225,0.98-0.225,1.595v5.479h-2.021
|
||||
L77.572,12.368L77.572,12.368z"/>
|
||||
<path fill="#5A74AF" d="M95.762,14.119h-2.896v4.829c0,0.299,0.008,0.595,0.022,0.887c0.014,0.292,0.07,0.554,0.168,0.786
|
||||
c0.098,0.232,0.246,0.419,0.449,0.561c0.201,0.145,0.497,0.215,0.887,0.215c0.239,0,0.486-0.022,0.741-0.067
|
||||
s0.486-0.127,0.696-0.247v1.842c-0.24,0.135-0.551,0.229-0.932,0.28c-0.383,0.053-0.678,0.079-0.889,0.079
|
||||
c-0.777,0-1.382-0.109-1.808-0.325c-0.427-0.218-0.741-0.498-0.943-0.843c-0.202-0.346-0.321-0.73-0.358-1.156
|
||||
c-0.037-0.427-0.058-0.857-0.058-1.292V14.12h-2.336v-1.751h2.336V9.381h2.021v2.987h2.896v1.751H95.762z"/>
|
||||
<path fill="#5A74AF" d="M99.895,18.432c0,0.464,0.103,0.887,0.305,1.269c0.201,0.382,0.467,0.707,0.797,0.977
|
||||
c0.329,0.271,0.711,0.479,1.146,0.629c0.434,0.15,0.883,0.226,1.348,0.226c0.628,0,1.175-0.146,1.639-0.438s0.891-0.678,1.28-1.157
|
||||
l1.526,1.168c-1.123,1.451-2.694,2.179-4.715,2.179c-0.84,0-1.6-0.144-2.281-0.427c-0.681-0.284-1.256-0.678-1.729-1.18
|
||||
c-0.471-0.502-0.834-1.093-1.088-1.774c-0.256-0.682-0.383-1.418-0.383-2.212s0.139-1.531,0.416-2.213
|
||||
c0.275-0.681,0.658-1.271,1.145-1.773c0.487-0.501,1.067-0.895,1.741-1.18c0.674-0.284,1.407-0.426,2.201-0.426
|
||||
c0.942,0,1.739,0.165,2.392,0.494c0.65,0.33,1.186,0.76,1.605,1.292c0.419,0.531,0.723,1.13,0.908,1.796
|
||||
c0.188,0.667,0.281,1.345,0.281,2.033v0.719h-8.535V18.432z M106.271,16.814c-0.016-0.449-0.086-0.861-0.213-1.235
|
||||
s-0.317-0.7-0.572-0.978c-0.256-0.276-0.572-0.493-0.954-0.65c-0.382-0.157-0.828-0.236-1.337-0.236
|
||||
c-0.493,0-0.946,0.094-1.358,0.281c-0.411,0.188-0.76,0.43-1.044,0.729c-0.285,0.3-0.506,0.633-0.663,0.999
|
||||
c-0.157,0.367-0.235,0.73-0.235,1.09H106.271z"/>
|
||||
<path fill="#5A74AF" d="M110.854,12.368h2.021v1.639h0.045c0.135-0.284,0.314-0.542,0.539-0.774s0.475-0.431,0.752-0.595
|
||||
c0.277-0.164,0.58-0.295,0.909-0.393c0.33-0.097,0.659-0.146,0.987-0.146c0.33,0,0.629,0.045,0.899,0.135l-0.091,2.178
|
||||
c-0.165-0.045-0.329-0.082-0.494-0.112c-0.165-0.029-0.329-0.045-0.492-0.045c-0.988,0-1.746,0.277-2.27,0.831
|
||||
c-0.523,0.554-0.786,1.415-0.786,2.583v5.345h-2.021V12.368L110.854,12.368z"/>
|
||||
<path fill="#5E6060" d="M120.156,5.513h1.367v11.493h-1.367V5.513z"/>
|
||||
<path fill="#5E6060" d="M123.484,7.215c0-0.274,0.1-0.509,0.298-0.707c0.196-0.198,0.433-0.296,0.706-0.296s0.51,0.099,0.707,0.296
|
||||
c0.197,0.198,0.297,0.433,0.297,0.707c0,0.273-0.1,0.509-0.297,0.707c-0.197,0.198-0.434,0.297-0.707,0.297s-0.51-0.099-0.706-0.297
|
||||
C123.584,7.725,123.484,7.489,123.484,7.215z M123.805,9.799h1.368v7.207h-1.368V9.799z"/>
|
||||
<path fill="#5E6060" d="M134.566,16.944c0,0.548-0.094,1.047-0.28,1.498c-0.188,0.45-0.453,0.841-0.798,1.17
|
||||
c-0.346,0.329-0.76,0.586-1.246,0.768c-0.487,0.183-1.024,0.272-1.611,0.272c-0.689,0-1.32-0.096-1.895-0.287
|
||||
c-0.571-0.193-1.116-0.527-1.633-1.003l0.926-1.156c0.355,0.386,0.74,0.677,1.156,0.874c0.416,0.198,0.887,0.297,1.414,0.297
|
||||
c0.506,0,0.928-0.074,1.262-0.221s0.601-0.337,0.799-0.569c0.197-0.234,0.337-0.5,0.418-0.799s0.121-0.601,0.121-0.904V15.82h-0.045
|
||||
c-0.264,0.436-0.621,0.758-1.072,0.966s-0.926,0.312-1.421,0.312c-0.527,0-1.017-0.094-1.468-0.281s-0.838-0.446-1.164-0.775
|
||||
c-0.323-0.329-0.576-0.72-0.76-1.171c-0.183-0.45-0.272-0.939-0.272-1.467c0-0.527,0.086-1.021,0.259-1.482
|
||||
c0.172-0.461,0.418-0.864,0.737-1.208c0.319-0.345,0.704-0.613,1.155-0.806c0.449-0.192,0.955-0.289,1.513-0.289
|
||||
c0.485,0,0.96,0.106,1.421,0.319s0.822,0.512,1.087,0.896h0.03V9.799h1.367V16.944L134.566,16.944z M130.828,10.894
|
||||
c-0.365,0-0.694,0.063-0.988,0.19c-0.294,0.126-0.542,0.299-0.744,0.517c-0.203,0.218-0.359,0.481-0.472,0.791
|
||||
c-0.112,0.309-0.167,0.646-0.167,1.011c0,0.729,0.213,1.315,0.639,1.756c0.426,0.44,1.004,0.661,1.732,0.661
|
||||
s1.307-0.221,1.732-0.661c0.426-0.44,0.639-1.026,0.639-1.756c0-0.365-0.057-0.702-0.167-1.011
|
||||
c-0.111-0.309-0.269-0.572-0.472-0.791c-0.203-0.218-0.451-0.39-0.744-0.517C131.521,10.958,131.193,10.894,130.828,10.894z"/>
|
||||
<path fill="#5E6060" d="M136.29,5.513h1.368v5.397h0.029c0.172-0.385,0.472-0.697,0.896-0.935c0.425-0.238,0.917-0.357,1.475-0.357
|
||||
c0.346,0,0.678,0.053,0.996,0.16c0.319,0.107,0.598,0.271,0.836,0.494s0.43,0.509,0.57,0.859c0.141,0.35,0.213,0.763,0.213,1.239
|
||||
v4.637h-1.367V12.75c0-0.334-0.047-0.62-0.138-0.858c-0.092-0.238-0.213-0.431-0.364-0.578c-0.152-0.147-0.328-0.253-0.525-0.32
|
||||
c-0.197-0.065-0.402-0.099-0.615-0.099c-0.283,0-0.547,0.046-0.79,0.137c-0.243,0.091-0.456,0.236-0.64,0.434
|
||||
c-0.183,0.198-0.323,0.448-0.426,0.752c-0.101,0.304-0.15,0.664-0.15,1.079v3.71h-1.368V5.513L136.29,5.513z"/>
|
||||
<path fill="#5E6060" d="M148.604,10.985h-1.961v3.269c0,0.203,0.006,0.402,0.016,0.601c0.01,0.197,0.048,0.375,0.113,0.532
|
||||
c0.065,0.157,0.168,0.283,0.305,0.38s0.337,0.145,0.602,0.145c0.161,0,0.328-0.016,0.502-0.046c0.172-0.03,0.328-0.086,0.471-0.167
|
||||
v1.246c-0.162,0.092-0.373,0.154-0.631,0.19c-0.258,0.035-0.459,0.053-0.601,0.053c-0.526,0-0.937-0.073-1.224-0.221
|
||||
c-0.289-0.146-0.502-0.336-0.639-0.569c-0.138-0.233-0.22-0.494-0.244-0.783c-0.024-0.289-0.037-0.58-0.037-0.874v-3.755h-1.582
|
||||
V9.799h1.582V7.778h1.367v2.021h1.961V10.985L148.604,10.985z"/>
|
||||
<path fill="#95BDE5" d="M142.227,20.314c-0.039,0.215-0.129,0.432-0.129,0.432c-0.023,0.059-0.106,0.25-0.125,0.288
|
||||
c-0.063,0.138-0.097,0.224-0.17,0.38c-0.084,0.178,0,0-0.136,0.268c-1.126,2.234-4.158,4.756-8.376,4.658
|
||||
c-3.922-0.09-6.719-1.806-8.072-4.173c-0.103-0.181-0.262-0.42-0.383-0.685c-0.033-0.073-0.242-0.51-0.266-0.574
|
||||
c-0.115-0.333-0.199-0.368-0.215-0.594c0,0,0.258,0.528,0.778,1.09c1.228,1.326,3.915,3.427,8.156,3.478
|
||||
c4.144,0.05,6.907-2.123,8.163-3.478C141.973,20.85,142.227,20.314,142.227,20.314z"/>
|
||||
c0.51,0,1,0.079,1.472,0.236s0.883,0.4,1.235,0.73c0.352,0.329,0.633,0.752,0.842,1.269c0.209,0.516,0.314,1.126,0.314,1.83v6.85
|
||||
h-2.021v-6.288c0-0.494-0.066-0.917-0.201-1.269c-0.135-0.353-0.314-0.637-0.539-0.854c-0.225-0.216-0.483-0.373-0.775-0.471
|
||||
s-0.596-0.146-0.91-0.146c-0.418,0-0.808,0.067-1.167,0.202s-0.674,0.349-0.943,0.641c-0.27,0.291-0.479,0.662-0.629,1.111
|
||||
s-0.225,0.98-0.225,1.595v5.479h-2.021V12.368z"/>
|
||||
<path fill="#5A74AF" d="M95.762,14.119h-2.896v4.829c0,0.299,0.008,0.595,0.022,0.887s0.071,0.554,0.169,0.786
|
||||
c0.097,0.232,0.246,0.419,0.449,0.561c0.201,0.144,0.497,0.214,0.887,0.214c0.239,0,0.486-0.022,0.741-0.067
|
||||
s0.486-0.127,0.696-0.247v1.842c-0.24,0.135-0.551,0.229-0.932,0.28c-0.383,0.053-0.678,0.079-0.888,0.079
|
||||
c-0.778,0-1.382-0.109-1.808-0.325c-0.427-0.218-0.741-0.498-0.943-0.843s-0.322-0.73-0.359-1.156
|
||||
c-0.037-0.427-0.057-0.857-0.057-1.292v-5.547h-2.336v-1.751h2.336V9.381h2.021v2.987h2.896V14.119z"/>
|
||||
<path fill="#5A74AF" d="M99.895,18.432c0,0.464,0.102,0.887,0.304,1.269s0.467,0.707,0.797,0.977
|
||||
c0.329,0.27,0.711,0.479,1.146,0.629c0.434,0.15,0.883,0.225,1.348,0.225c0.628,0,1.175-0.146,1.639-0.438
|
||||
c0.464-0.292,0.891-0.678,1.28-1.157l1.527,1.168c-1.123,1.452-2.695,2.179-4.716,2.179c-0.839,0-1.599-0.143-2.28-0.427
|
||||
c-0.681-0.284-1.257-0.678-1.729-1.179c-0.471-0.502-0.834-1.093-1.088-1.774c-0.256-0.682-0.383-1.418-0.383-2.212
|
||||
s0.139-1.531,0.416-2.213c0.276-0.681,0.658-1.271,1.145-1.773c0.487-0.501,1.067-0.895,1.741-1.18
|
||||
c0.674-0.284,1.407-0.426,2.201-0.426c0.942,0,1.74,0.165,2.392,0.494c0.65,0.33,1.186,0.76,1.605,1.292
|
||||
c0.419,0.531,0.723,1.13,0.909,1.796c0.188,0.667,0.281,1.345,0.281,2.033v0.719H99.895z M106.272,16.814
|
||||
c-0.016-0.449-0.086-0.861-0.213-1.235c-0.128-0.374-0.318-0.7-0.573-0.978c-0.255-0.276-0.572-0.493-0.954-0.65
|
||||
s-0.828-0.236-1.337-0.236c-0.493,0-0.946,0.094-1.358,0.281c-0.411,0.188-0.76,0.43-1.044,0.729
|
||||
c-0.285,0.3-0.506,0.633-0.663,0.999c-0.157,0.367-0.235,0.73-0.235,1.09H106.272z"/>
|
||||
<path fill="#5A74AF" d="M110.854,12.368h2.021v1.639h0.045c0.135-0.284,0.314-0.542,0.539-0.774
|
||||
c0.225-0.232,0.475-0.431,0.752-0.595s0.58-0.295,0.909-0.393c0.33-0.097,0.659-0.146,0.988-0.146c0.33,0,0.629,0.045,0.899,0.135
|
||||
l-0.091,2.178c-0.165-0.045-0.329-0.082-0.494-0.112c-0.165-0.029-0.329-0.045-0.493-0.045c-0.988,0-1.745,0.277-2.269,0.831
|
||||
c-0.524,0.554-0.786,1.415-0.786,2.583v5.345h-2.021V12.368z"/>
|
||||
<path fill="#5E6060" d="M120.156,5.513h1.368v11.493h-1.368V5.513z"/>
|
||||
<path fill="#5E6060" d="M123.485,7.215c0-0.274,0.099-0.509,0.297-0.707c0.197-0.198,0.433-0.296,0.707-0.296
|
||||
c0.273,0,0.509,0.099,0.707,0.296c0.197,0.198,0.296,0.433,0.296,0.707c0,0.273-0.099,0.509-0.296,0.707
|
||||
c-0.198,0.198-0.434,0.297-0.707,0.297c-0.274,0-0.51-0.099-0.707-0.297C123.584,7.725,123.485,7.489,123.485,7.215z M123.805,9.799
|
||||
h1.368v7.207h-1.368V9.799z"/>
|
||||
<path fill="#5E6060" d="M134.567,16.944c0,0.548-0.094,1.047-0.281,1.498c-0.188,0.45-0.453,0.841-0.798,1.17
|
||||
s-0.76,0.586-1.246,0.768c-0.487,0.183-1.024,0.273-1.611,0.273c-0.689,0-1.32-0.096-1.894-0.288
|
||||
c-0.572-0.193-1.117-0.527-1.634-1.003l0.927-1.156c0.355,0.386,0.74,0.677,1.156,0.874c0.415,0.198,0.887,0.297,1.413,0.297
|
||||
c0.507,0,0.928-0.074,1.262-0.221c0.335-0.146,0.601-0.337,0.799-0.569c0.197-0.234,0.337-0.5,0.418-0.799s0.121-0.601,0.121-0.904
|
||||
v-1.064h-0.045c-0.264,0.436-0.621,0.758-1.072,0.966s-0.925,0.312-1.421,0.312c-0.527,0-1.017-0.094-1.468-0.281
|
||||
s-0.838-0.446-1.163-0.775c-0.324-0.329-0.577-0.72-0.76-1.171c-0.183-0.45-0.273-0.939-0.273-1.467
|
||||
c0-0.527,0.086-1.021,0.259-1.482c0.172-0.461,0.418-0.864,0.737-1.208c0.319-0.345,0.704-0.613,1.155-0.806
|
||||
c0.45-0.192,0.955-0.289,1.513-0.289c0.486,0,0.96,0.106,1.421,0.319s0.823,0.512,1.087,0.896h0.03V9.799h1.368V16.944z
|
||||
M130.828,10.894c-0.365,0-0.694,0.063-0.988,0.19c-0.294,0.126-0.542,0.299-0.745,0.517c-0.202,0.218-0.359,0.481-0.471,0.791
|
||||
c-0.112,0.309-0.167,0.646-0.167,1.011c0,0.729,0.213,1.315,0.638,1.756c0.426,0.44,1.004,0.661,1.733,0.661
|
||||
s1.307-0.221,1.733-0.661c0.426-0.44,0.638-1.026,0.638-1.756c0-0.365-0.056-0.702-0.167-1.011s-0.269-0.572-0.471-0.791
|
||||
c-0.203-0.218-0.451-0.39-0.745-0.517C131.522,10.958,131.193,10.894,130.828,10.894z"/>
|
||||
<path fill="#5E6060" d="M136.29,5.513h1.368v5.397h0.03c0.172-0.385,0.471-0.697,0.896-0.935s0.917-0.357,1.475-0.357
|
||||
c0.345,0,0.677,0.053,0.996,0.16s0.598,0.271,0.836,0.494c0.238,0.223,0.429,0.509,0.57,0.859s0.213,0.763,0.213,1.239v4.637h-1.368
|
||||
v-4.257c0-0.334-0.046-0.62-0.137-0.858c-0.092-0.238-0.213-0.431-0.365-0.578c-0.152-0.147-0.327-0.253-0.524-0.32
|
||||
c-0.198-0.065-0.403-0.099-0.616-0.099c-0.283,0-0.547,0.046-0.79,0.137c-0.243,0.091-0.456,0.236-0.639,0.434
|
||||
s-0.324,0.448-0.426,0.752c-0.101,0.304-0.151,0.664-0.151,1.079v3.71h-1.368V5.513z"/>
|
||||
<path fill="#5E6060" d="M148.604,10.985h-1.961v3.269c0,0.203,0.005,0.402,0.015,0.601c0.01,0.197,0.048,0.375,0.114,0.532
|
||||
c0.065,0.157,0.167,0.283,0.304,0.38s0.337,0.145,0.601,0.145c0.162,0,0.329-0.016,0.502-0.046c0.172-0.03,0.329-0.086,0.471-0.167
|
||||
v1.246c-0.162,0.092-0.372,0.154-0.631,0.19c-0.258,0.035-0.458,0.053-0.6,0.053c-0.527,0-0.936-0.073-1.224-0.221
|
||||
c-0.289-0.146-0.502-0.336-0.639-0.569s-0.219-0.494-0.244-0.783c-0.024-0.289-0.037-0.58-0.037-0.874v-3.755h-1.581V9.799h1.581
|
||||
V7.778h1.368v2.021h1.961V10.985z"/>
|
||||
<path fill="#95BDE5" d="M142.227,20.314c-0.039,0.215-0.129,0.432-0.129,0.432c-0.024,0.059-0.107,0.25-0.125,0.288
|
||||
c-0.064,0.138-0.097,0.224-0.17,0.38c-0.084,0.178,0,0-0.136,0.268c-1.126,2.234-4.158,4.755-8.376,4.658
|
||||
c-3.922-0.09-6.719-1.806-8.072-4.173c-0.103-0.18-0.262-0.42-0.383-0.684c-0.034-0.074-0.242-0.511-0.265-0.575
|
||||
c-0.116-0.333-0.2-0.368-0.216-0.594c0,0,0.259,0.528,0.779,1.091c1.227,1.325,3.915,3.426,8.156,3.477
|
||||
c4.143,0.049,6.907-2.123,8.163-3.477C141.972,20.849,142.227,20.314,142.227,20.314z"/>
|
||||
</svg>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 181 KiB |
55
datacenterlight/static/datacenterlight/js/beta.js
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
(function($){
|
||||
'use strict'; // Start of use strict
|
||||
|
||||
|
||||
|
||||
$(document).ready(function(){
|
||||
verifiedUrl();
|
||||
init_options_interested();
|
||||
init_nav();
|
||||
change_values();
|
||||
});
|
||||
|
||||
function verifiedUrl(){
|
||||
if(window.location.href.indexOf('#success') > -1){
|
||||
form_success();
|
||||
}
|
||||
}
|
||||
|
||||
function init_options_interested(){
|
||||
$('.row-vms').click(function(){
|
||||
$('.row-vms').removeClass('row-vms__active');
|
||||
$(this).addClass('row-vms__active');
|
||||
var number = $('.row-vms__active input').val();
|
||||
var price = $('.row-vms__active input').data('price');
|
||||
_calculate(number, price);
|
||||
});
|
||||
}
|
||||
|
||||
function init_nav(){
|
||||
|
||||
$('.nav-local').click(function(){
|
||||
$('html, body').animate({
|
||||
scrollTop: $('#'+$(this).data('href')).offset().top
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function change_values(){
|
||||
$('.number-vms').keyup(function () {
|
||||
var number = $(this).val();
|
||||
var price = $(this).data('price');
|
||||
_calculate(number, price);
|
||||
});
|
||||
|
||||
}
|
||||
function form_success(){
|
||||
$('#sucessModal').modal('show');
|
||||
}
|
||||
function _calculate(numbers, price){
|
||||
$('#valueTotal').text(numbers*price*31);
|
||||
}
|
||||
|
||||
|
||||
})(jQuery); // End of use strict
|
||||
2317
datacenterlight/static/datacenterlight/js/bootstrap.js
vendored
Executable file
0
datacenterlight/static/datacenterlight/bootstrap-3.3.4/js/bootstrap.min.js → datacenterlight/static/datacenterlight/js/bootstrap.min.js
vendored
Normal file → Executable file
|
|
@ -1,8 +0,0 @@
|
|||
/*
|
||||
HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
||||
*/
|
||||
(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
|
||||
a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>";
|
||||
c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
|
||||
"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);
|
||||
if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
|
||||
4
datacenterlight/static/datacenterlight/js/jquery.js
vendored
Executable file
|
|
@ -5,10 +5,6 @@
|
|||
/* ---------------------------------------------
|
||||
Scripts initialization
|
||||
--------------------------------------------- */
|
||||
var minRam = 1;
|
||||
if(window.minRam){
|
||||
minRam = window.minRam;
|
||||
}
|
||||
var cardPricing = {
|
||||
'cpu': {
|
||||
'id': 'coreValue',
|
||||
|
|
@ -20,7 +16,7 @@
|
|||
'ram': {
|
||||
'id': 'ramValue',
|
||||
'value': 2,
|
||||
'min': minRam,
|
||||
'min': 2,
|
||||
'max': 200,
|
||||
'interval': 1
|
||||
},
|
||||
|
|
@ -43,8 +39,7 @@
|
|||
_initScroll();
|
||||
_initNavUrl();
|
||||
_initPricing();
|
||||
ajaxForms();
|
||||
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||
|
||||
});
|
||||
|
||||
$(window).resize(function() {
|
||||
|
|
@ -59,7 +54,7 @@
|
|||
Nav panel classic
|
||||
--------------------------------------------- */
|
||||
if (window.matchMedia("(min-width: 767px)").matches) {
|
||||
$('ul.nav .dropdown').hover(function() {
|
||||
$('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);
|
||||
|
|
@ -90,52 +85,22 @@
|
|||
}
|
||||
}
|
||||
|
||||
_navScroll();
|
||||
|
||||
function _initNavUrl() {
|
||||
$('.url-init').each(function(idx, el) {
|
||||
var $this = $(el);
|
||||
var currentPath = window.location.pathname;
|
||||
var thisPaths = $this.attr('href').split('#')
|
||||
if ($this.hasClass('dropdown-toggle') && window.matchMedia("(max-width: 767px)").matches) {
|
||||
$this.removeClass('url-init');
|
||||
$this.attr('href', '');
|
||||
} else if ($('#'+thisPaths[1]).length) {
|
||||
$this.removeClass('url-init').addClass('url');
|
||||
$this.attr('href', '#' + thisPaths[1]);
|
||||
} else {
|
||||
$this.removeClass('url-init');
|
||||
}
|
||||
});
|
||||
$('.url').click(function(event) {
|
||||
event.preventDefault();
|
||||
var $this = $(this);
|
||||
var href = $this.attr('href');
|
||||
var href = $(this).attr('data-url');
|
||||
$('.navbar-collapse').removeClass('in');
|
||||
$('.navbar-collapse').addClass('collapsing');
|
||||
if (href[0] === "#") {
|
||||
scrollToElement(href);
|
||||
} else if (href) {
|
||||
var path = $(this).prop('href').split('#');
|
||||
var currentPath = window.location.origin + window.location.pathname;
|
||||
if (currentPath == path[0] && path[1]) {
|
||||
scrollToElement('#' + path[1]);
|
||||
} else {
|
||||
window.location = href;
|
||||
}
|
||||
if ($(href).length) {
|
||||
$('html, body').animate({
|
||||
scrollTop: $(href).offset().top
|
||||
}, 1000);
|
||||
} else {
|
||||
window.location.href = '/datacenterlight' + href;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function scrollToElement(el) {
|
||||
var $el = $(el);
|
||||
if ($el.length) {
|
||||
$('html, body').animate({
|
||||
scrollTop: $el.offset().top - 50
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
function verifiedUrl() {
|
||||
if (window.location.href.indexOf('#success') > -1) {
|
||||
form_success();
|
||||
|
|
@ -149,84 +114,39 @@
|
|||
var data = $(this).data('minus');
|
||||
|
||||
if (cardPricing[data].value > cardPricing[data].min) {
|
||||
if(data === 'ram' && String(cardPricing[data].value) === "1" && minRam === 0.5){
|
||||
cardPricing[data].value = 0.5;
|
||||
$('#ramValue').val('0.5');
|
||||
$("#ramValue").attr('step', 0.5);
|
||||
} else {
|
||||
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
||||
}
|
||||
cardPricing[data].value = Number(cardPricing[data].value) - cardPricing[data].interval;
|
||||
}
|
||||
_fetchPricing();
|
||||
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||
});
|
||||
$('.fa-plus-circle.right').click(function(event) {
|
||||
var data = $(this).data('plus');
|
||||
if (cardPricing[data].value < cardPricing[data].max) {
|
||||
if(data === 'ram' && String(cardPricing[data].value) === "0.5" && minRam === 0.5){
|
||||
cardPricing[data].value = 1;
|
||||
$('#ramValue').val('1');
|
||||
$("#ramValue").attr('step', 1);
|
||||
} else {
|
||||
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
||||
}
|
||||
cardPricing[data].value = Number(cardPricing[data].value) + cardPricing[data].interval;
|
||||
}
|
||||
_fetchPricing();
|
||||
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||
});
|
||||
|
||||
$('.input-price').change(function() {
|
||||
var data = $(this).attr("name");
|
||||
var input = $('input[name=' + data + ']');
|
||||
var inputValue = input.val();
|
||||
|
||||
if(data === 'ram') {
|
||||
var ramInput = $('#ramValue');
|
||||
if ($('#ramValue').data('old-value') < $('#ramValue').val()) {
|
||||
if($('#ramValue').val() === '1' && minRam === 0.5) {
|
||||
$("#ramValue").attr('step', 1);
|
||||
$('#ramValue').val('1');
|
||||
}
|
||||
} else {
|
||||
if($('#ramValue').val() === '0' && minRam === 0.5) {
|
||||
$("#ramValue").attr('step', 0.5);
|
||||
$('#ramValue').val('0.5');
|
||||
}
|
||||
}
|
||||
inputValue = $('#ramValue').val();
|
||||
$('#ramValue').data('old-value', $('#ramValue').val());
|
||||
}
|
||||
cardPricing[data].value = inputValue;
|
||||
cardPricing[data].value = $('input[name=' + data + ']').val();
|
||||
_fetchPricing();
|
||||
});
|
||||
}
|
||||
|
||||
function _fetchPricing() {
|
||||
Object.keys(cardPricing).map(function(element) {
|
||||
//$('#'+cardPricing[element].id).val(cardPricing[element].value);
|
||||
$('input[name=' + element + ']').val(cardPricing[element].value);
|
||||
});
|
||||
_calcPricing();
|
||||
}
|
||||
|
||||
function _calcPricing() {
|
||||
if(typeof window.coresUnitPrice === 'undefined'){
|
||||
window.coresUnitPrice = 5;
|
||||
}
|
||||
if(typeof window.ramUnitPrice === 'undefined'){
|
||||
window.ramUnitPrice = 2;
|
||||
}
|
||||
if(typeof window.ssdUnitPrice === 'undefined'){
|
||||
window.ssdUnitPrice = 0.6;
|
||||
}
|
||||
if(typeof window.discountAmount === 'undefined'){
|
||||
window.discountAmount = 0;
|
||||
}
|
||||
var total = (cardPricing['cpu'].value * window.coresUnitPrice) +
|
||||
(cardPricing['ram'].value * window.ramUnitPrice) +
|
||||
(cardPricing['storage'].value * window.ssdUnitPrice) -
|
||||
window.discountAmount;
|
||||
var total = (cardPricing['cpu'].value * 5) + (2 * cardPricing['ram'].value) + (0.6 * cardPricing['storage'].value);
|
||||
total = parseFloat(total.toFixed(2));
|
||||
|
||||
$("#total").text(total);
|
||||
$('input[name=total]').val(total);
|
||||
}
|
||||
|
||||
function form_success() {
|
||||
|
|
@ -237,27 +157,4 @@
|
|||
$('#valueTotal').text(numbers * price * 31);
|
||||
}
|
||||
|
||||
function ajaxForms() {
|
||||
$('body').on('submit', '.ajax-form', function(e){
|
||||
e.preventDefault();
|
||||
var $form = $(this);
|
||||
$form.find('[type=submit]').addClass('sending');
|
||||
$.ajax({
|
||||
url: $form.attr('action'),
|
||||
type: $form.attr('method'),
|
||||
data: $form.serialize(),
|
||||
|
||||
success: function(response) {
|
||||
var responseContain = $($form.attr('data-response'));
|
||||
responseContain.html(response);
|
||||
$form.find('[type=submit]').removeClass('sending');
|
||||
},
|
||||
|
||||
error: function() {
|
||||
$form.find('[type=submit]').removeClass('sending');
|
||||
$form.find('.form-error').removeClass('hide');
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
||||
})(jQuery);
|
||||
|
|
|
|||
1
datacenterlight/static/datacenterlight/js/plugin.js
Normal file
|
|
@ -1,5 +0,0 @@
|
|||
/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
|
||||
* Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
|
||||
* */
|
||||
|
||||
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
|
||||
4
datacenterlight/static/datacenterlight/js/vendor.js
Normal file
1
datacenterlight/static/datacenterlight/js/vendor/modernizr.js
vendored
Normal file
181
datacenterlight/static/datacenterlight/logo_black.svg
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="156.5px" height="40px" viewBox="0 0 156.5 40" enable-background="new 0 0 156.5 40" xml:space="preserve">
|
||||
<g display="none">
|
||||
<g display="inline">
|
||||
<path fill="#231916" d="M32.599,25.896c0-0.429,0.15-0.845,0.453-1.25c0.303-0.408,0.734-0.773,1.296-1.097v-0.092
|
||||
c-0.294-0.16-0.554-0.388-0.777-0.674c-0.22-0.289-0.332-0.662-0.332-1.119c0-0.354,0.115-0.712,0.345-1.076
|
||||
c0.227-0.36,0.55-0.683,0.964-0.962v-0.09c-0.386-0.28-0.711-0.654-0.978-1.12c-0.263-0.464-0.397-1.021-0.397-1.67
|
||||
c0-0.606,0.118-1.149,0.354-1.63c0.236-0.48,0.555-0.889,0.954-1.229c0.398-0.34,0.86-0.598,1.385-0.775
|
||||
c0.523-0.178,1.081-0.266,1.672-0.266c0.605,0,1.152,0.088,1.64,0.266h4.452v1.662h-2.702c0.222,0.237,0.42,0.528,0.598,0.875
|
||||
c0.178,0.348,0.267,0.735,0.267,1.165c0,0.59-0.111,1.117-0.332,1.572c-0.222,0.459-0.525,0.846-0.91,1.163
|
||||
c-0.384,0.318-0.834,0.558-1.351,0.72c-0.517,0.162-1.071,0.246-1.663,0.246c-0.265,0-0.55-0.031-0.854-0.091
|
||||
c-0.302-0.058-0.601-0.147-0.896-0.267c-0.503,0.326-0.753,0.701-0.753,1.131c0,0.398,0.185,0.686,0.553,0.865
|
||||
c0.369,0.176,0.901,0.266,1.596,0.266h2.303c1.42,0,2.47,0.203,3.159,0.607c0.687,0.406,1.029,1.076,1.029,2.006
|
||||
c0,0.518-0.145,1.004-0.431,1.461c-0.29,0.459-0.699,0.861-1.23,1.209c-0.531,0.348-1.174,0.621-1.929,0.82
|
||||
c-0.751,0.199-1.594,0.299-2.525,0.299c-1.537,0-2.747-0.25-3.633-0.744C33.042,27.586,32.599,26.857,32.599,25.896z
|
||||
M34.458,25.633c0,0.516,0.285,0.932,0.854,1.25s1.393,0.477,2.47,0.477c0.577,0,1.097-0.055,1.562-0.166
|
||||
c0.465-0.11,0.864-0.258,1.197-0.442s0.585-0.396,0.764-0.631c0.177-0.234,0.266-0.486,0.266-0.754
|
||||
c0-0.474-0.196-0.785-0.587-0.941c-0.392-0.153-0.979-0.231-1.762-0.231h-1.905c-0.34,0-0.641-0.012-0.907-0.033
|
||||
c-0.268-0.021-0.519-0.07-0.754-0.145c-0.444,0.25-0.753,0.51-0.932,0.776C34.549,25.057,34.458,25.334,34.458,25.633z
|
||||
M37.539,19.095c0.621,0,1.152-0.206,1.597-0.62c0.442-0.414,0.665-0.989,0.665-1.727c0-0.71-0.223-1.279-0.665-1.707
|
||||
c-0.445-0.428-0.976-0.643-1.597-0.643s-1.152,0.215-1.595,0.643c-0.442,0.428-0.665,0.997-0.665,1.707
|
||||
c0,0.738,0.223,1.313,0.665,1.727C36.386,18.889,36.918,19.095,37.539,19.095z"/>
|
||||
</g>
|
||||
<path display="inline" fill="#231916" d="M15.983,24.24h-1.857l-0.183-1.854h-0.092c-0.551,0.642-1.151,1.154-1.8,1.548
|
||||
c-0.649,0.387-1.401,0.582-2.258,0.582c-1.329,0-2.3-0.384-2.91-1.156c-0.612-0.771-0.917-1.898-0.917-3.381V14.35L3,14.293
|
||||
l5.258-2.023l-0.023,1.529v5.882c0,0.994,0.176,1.724,0.528,2.189c0.351,0.467,0.954,0.7,1.811,0.7
|
||||
c0.581,0,1.111-0.143,1.593-0.426c0.48-0.283,0.998-0.762,1.547-1.433v-7.678h2.269V24.24z"/>
|
||||
<path display="inline" fill="#231916" d="M19.742,13.033h1.856l0.184,1.812h0.091c0.565-0.582,1.176-1.075,1.834-1.479
|
||||
c0.655-0.405,1.42-0.607,2.292-0.607c1.313,0,2.278,0.39,2.888,1.168c0.611,0.778,0.917,1.903,0.917,3.37v6.942h-2.271v-6.646
|
||||
c0-0.976-0.174-1.7-0.525-2.165c-0.352-0.467-0.955-0.701-1.811-0.701c-0.597,0-1.131,0.151-1.605,0.447
|
||||
c-0.473,0.299-1.002,0.744-1.582,1.343v7.721h-2.268V13.033z"/>
|
||||
<path display="inline" fill="#231916" d="M55.129,18.65c0-0.917,0.162-1.74,0.482-2.465c0.321-0.725,0.748-1.345,1.284-1.856
|
||||
c0.533-0.511,1.146-0.902,1.834-1.17c0.687-0.267,1.398-0.4,2.13-0.4c0.826,0,1.555,0.13,2.19,0.39
|
||||
c0.633,0.26,1.172,0.621,1.615,1.086c0.443,0.468,0.779,1.025,1.01,1.676c0.229,0.648,0.344,1.362,0.344,2.142
|
||||
c0,0.229-0.012,0.447-0.035,0.652c-0.022,0.208-0.049,0.38-0.08,0.516h-8.436c0.077,1.1,0.485,1.96,1.229,2.58
|
||||
c0.739,0.619,1.675,0.928,2.807,0.928c0.611,0,1.18-0.084,1.708-0.252c0.527-0.166,1.042-0.403,1.546-0.709l0.802,1.443
|
||||
c-0.578,0.367-1.23,0.676-1.959,0.928c-0.726,0.252-1.525,0.377-2.396,0.377c-0.842,0-1.631-0.131-2.371-0.399
|
||||
c-0.742-0.267-1.387-0.65-1.938-1.156c-0.551-0.504-0.982-1.119-1.296-1.846C55.286,20.386,55.129,19.566,55.129,18.65z
|
||||
M63.909,17.665c0-1.01-0.263-1.781-0.779-2.317c-0.521-0.534-1.262-0.8-2.225-0.8c-0.84,0-1.587,0.266-2.245,0.8
|
||||
c-0.658,0.536-1.062,1.307-1.214,2.317H63.909z"/>
|
||||
<path display="inline" fill="#231916" d="M73.475,12.679l0.008,11.793h-2.27v-8.611h-4.256L73.475,12.679z M72.152,10.368
|
||||
c-0.488,0-0.894-0.146-1.215-0.435c-0.32-0.291-0.48-0.681-0.48-1.17c0-0.489,0.16-0.882,0.48-1.18
|
||||
c0.321-0.298,0.727-0.446,1.215-0.446s0.896,0.148,1.215,0.446c0.32,0.298,0.482,0.691,0.482,1.18c0,0.489-0.162,0.879-0.482,1.17
|
||||
C73.049,10.221,72.641,10.368,72.152,10.368z"/>
|
||||
<path display="inline" fill="#231916" d="M76.629,18.878c0-0.932,0.168-1.766,0.504-2.497c0.336-0.735,0.795-1.353,1.375-1.859
|
||||
c0.582-0.503,1.25-0.884,2.008-1.145c0.756-0.26,1.562-0.389,2.416-0.389c0.918,0,1.719,0.156,2.406,0.469
|
||||
c0.689,0.312,1.262,0.693,1.721,1.135l-1.1,1.443c-0.443-0.367-0.904-0.653-1.379-0.86c-0.471-0.206-0.984-0.309-1.535-0.309
|
||||
c-0.594,0-1.143,0.095-1.65,0.287c-0.502,0.19-0.936,0.462-1.293,0.813c-0.358,0.352-0.639,0.776-0.838,1.272
|
||||
c-0.197,0.495-0.297,1.042-0.297,1.638c0,0.595,0.096,1.144,0.287,1.64c0.189,0.496,0.465,0.92,0.824,1.273
|
||||
c0.359,0.35,0.785,0.623,1.273,0.812c0.487,0.188,1.028,0.284,1.627,0.284c0.686,0,1.307-0.129,1.856-0.387
|
||||
c0.549-0.263,1.043-0.574,1.488-0.94l0.965,1.467c-0.644,0.551-1.347,0.975-2.111,1.272c-0.764,0.298-1.559,0.445-2.383,0.445
|
||||
c-0.871,0-1.687-0.129-2.44-0.39c-0.756-0.26-1.41-0.643-1.961-1.146c-0.55-0.506-0.98-1.121-1.293-1.847
|
||||
C76.785,20.641,76.629,19.811,76.629,18.878z"/>
|
||||
<path display="inline" fill="#231916" d="M87.4,8.285l4.752-2.356v6.601l-0.139,2.521c0.565-0.58,1.178-1.07,1.836-1.467
|
||||
c0.655-0.396,1.42-0.595,2.293-0.595c1.312,0,2.274,0.389,2.885,1.168c0.611,0.78,0.918,1.903,0.918,3.371v6.945h-2.271v-6.648
|
||||
c0-0.978-0.176-1.7-0.526-2.165c-0.353-0.466-0.953-0.7-1.812-0.7c-0.596,0-1.131,0.149-1.604,0.448
|
||||
c-0.475,0.298-1.002,0.745-1.582,1.342v7.726h-2.27L89.836,8.189L87.4,8.285z"/>
|
||||
<g display="inline">
|
||||
<polygon fill="#010000" points="100.371,3.218 99.607,4.815 109.109,4.855 109.873,3.228 "/>
|
||||
<polygon fill="#010000" points="99.619,6.703 98.83,8.378 108.346,8.397 109.109,6.74 "/>
|
||||
<polygon fill="#010000" points="101.475,10.278 105.832,1 107.512,1.024 103.203,10.281 "/>
|
||||
</g>
|
||||
<g display="inline">
|
||||
<path fill="#231916" d="M49.446,20.596c0,0.754,0.188,1.297,0.566,1.631c0.376,0.33,0.866,0.498,1.472,0.498
|
||||
c0.295,0,0.599-0.037,0.909-0.111s0.658-0.193,1.042-0.355l0.532,1.643c-0.252,0.086-0.492,0.166-0.721,0.242
|
||||
c-0.231,0.074-0.461,0.135-0.698,0.187c-0.237,0.055-0.483,0.098-0.741,0.135c-0.26,0.035-0.543,0.058-0.853,0.058
|
||||
c-1.212,0-2.131-0.349-2.76-1.043c-0.627-0.693-0.941-1.697-0.941-3.014V5.711h-3.544l5.737-4.043"/>
|
||||
</g>
|
||||
</g>
|
||||
<path fill="#29427A" d="M12.927,23.013v-1.46h-0.045c-0.359,0.569-0.873,1.007-1.539,1.313s-1.374,0.461-2.122,0.461
|
||||
c-0.839,0-1.587-0.165-2.246-0.494c-0.659-0.329-1.216-0.768-1.673-1.313c-0.457-0.547-0.805-1.18-1.044-1.898
|
||||
c-0.24-0.718-0.359-1.467-0.359-2.245s0.124-1.523,0.371-2.234s0.599-1.337,1.055-1.875c0.457-0.539,1.011-0.966,1.662-1.28
|
||||
c0.651-0.314,1.381-0.472,2.189-0.472c0.823,0,1.52,0.157,2.089,0.472c0.568,0.314,1.011,0.659,1.325,1.033h0.045V6.035h3.683
|
||||
v16.978H12.927z M12.792,17.398c0-0.359-0.064-0.711-0.191-1.056c-0.128-0.345-0.307-0.651-0.54-0.921
|
||||
c-0.232-0.27-0.513-0.486-0.842-0.651c-0.329-0.164-0.704-0.247-1.123-0.247c-0.434,0-0.816,0.083-1.145,0.247
|
||||
c-0.33,0.165-0.606,0.379-0.831,0.64c-0.225,0.263-0.393,0.565-0.505,0.91s-0.168,0.696-0.168,1.056
|
||||
c0,0.358,0.056,0.715,0.168,1.066s0.281,0.663,0.505,0.932c0.225,0.27,0.501,0.487,0.831,0.651c0.329,0.165,0.711,0.247,1.145,0.247
|
||||
c0.419,0,0.793-0.082,1.123-0.247c0.33-0.164,0.61-0.382,0.842-0.651c0.232-0.269,0.412-0.575,0.54-0.921
|
||||
C12.728,18.109,12.792,17.758,12.792,17.398z"/>
|
||||
<path fill="#29427A" d="M19.08,13.355c0.659-0.628,1.426-1.1,2.302-1.415s1.771-0.472,2.684-0.472c0.944,0,1.741,0.116,2.392,0.348
|
||||
c0.651,0.232,1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.187,0.74,0.281,1.62,0.281,2.639v5.637H25.84v-1.19
|
||||
h-0.067c-0.285,0.464-0.715,0.823-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.061-1.393-0.18
|
||||
c-0.479-0.12-0.917-0.314-1.313-0.584c-0.397-0.27-0.723-0.629-0.977-1.078c-0.255-0.449-0.382-1.003-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953s1.011-0.876,1.707-1.146c0.696-0.27,1.471-0.449,2.324-0.539s1.685-0.135,2.493-0.135v-0.18
|
||||
c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393c-0.524,0-1.03,0.112-1.516,0.337
|
||||
c-0.487,0.225-0.902,0.494-1.247,0.809L19.08,13.355z M25.84,18.139h-0.472c-0.404,0-0.812,0.02-1.224,0.057
|
||||
c-0.412,0.037-0.779,0.108-1.101,0.213c-0.322,0.105-0.588,0.259-0.797,0.461c-0.21,0.202-0.314,0.468-0.314,0.797
|
||||
c0,0.21,0.049,0.39,0.146,0.539c0.097,0.15,0.221,0.27,0.371,0.359c0.149,0.09,0.322,0.153,0.517,0.191
|
||||
c0.194,0.037,0.382,0.056,0.562,0.056c0.749,0,1.321-0.205,1.718-0.617c0.396-0.412,0.595-0.97,0.595-1.673V18.139z"/>
|
||||
<path fill="#29427A" d="M36.067,14.568v4.283c0,0.526,0.101,0.921,0.303,1.184c0.202,0.264,0.565,0.395,1.089,0.395
|
||||
c0.18,0,0.371-0.015,0.573-0.045c0.202-0.029,0.371-0.074,0.505-0.135l0.045,2.695c-0.255,0.09-0.577,0.169-0.966,0.235
|
||||
c-0.389,0.067-0.779,0.102-1.168,0.102c-0.749,0-1.377-0.094-1.886-0.281c-0.509-0.188-0.917-0.458-1.224-0.811
|
||||
c-0.307-0.354-0.528-0.773-0.662-1.261c-0.135-0.488-0.202-1.032-0.202-1.633v-4.729h-1.797v-2.74h1.774V8.887h3.616v2.942h2.627
|
||||
v2.74H36.067z"/>
|
||||
<path fill="#29427A" d="M40.957,13.355c0.659-0.628,1.426-1.1,2.302-1.415s1.771-0.472,2.684-0.472c0.943,0,1.741,0.116,2.392,0.348
|
||||
c0.651,0.232,1.179,0.591,1.583,1.078c0.404,0.486,0.7,1.101,0.887,1.842c0.188,0.74,0.281,1.62,0.281,2.639v5.637h-3.369v-1.19
|
||||
h-0.067c-0.285,0.464-0.715,0.823-1.291,1.078c-0.577,0.254-1.202,0.382-1.875,0.382c-0.449,0-0.913-0.061-1.392-0.18
|
||||
c-0.479-0.12-0.917-0.314-1.314-0.584c-0.397-0.27-0.723-0.629-0.977-1.078s-0.382-1.003-0.382-1.662
|
||||
c0-0.809,0.221-1.459,0.663-1.953s1.011-0.876,1.707-1.146s1.471-0.449,2.324-0.539s1.685-0.135,2.493-0.135v-0.18
|
||||
c0-0.554-0.195-0.962-0.584-1.225c-0.389-0.262-0.868-0.393-1.437-0.393c-0.524,0-1.03,0.112-1.516,0.337s-0.902,0.494-1.247,0.809
|
||||
L40.957,13.355z M47.717,18.139h-0.471c-0.404,0-0.812,0.02-1.224,0.057c-0.412,0.037-0.779,0.108-1.101,0.213
|
||||
c-0.322,0.105-0.587,0.259-0.797,0.461c-0.209,0.202-0.314,0.468-0.314,0.797c0,0.21,0.049,0.39,0.146,0.539
|
||||
c0.097,0.15,0.22,0.27,0.37,0.359c0.149,0.09,0.322,0.153,0.517,0.191c0.194,0.037,0.382,0.056,0.562,0.056
|
||||
c0.749,0,1.321-0.205,1.718-0.617c0.396-0.412,0.595-0.97,0.595-1.673V18.139z"/>
|
||||
<path fill="#5A74AF" d="M61.874,15.197c-0.375-0.389-0.768-0.685-1.179-0.887c-0.412-0.202-0.902-0.304-1.471-0.304
|
||||
c-0.554,0-1.037,0.102-1.449,0.304c-0.412,0.202-0.756,0.479-1.033,0.831s-0.487,0.756-0.629,1.212
|
||||
c-0.142,0.457-0.213,0.933-0.213,1.427s0.082,0.962,0.247,1.403c0.165,0.441,0.396,0.827,0.696,1.156
|
||||
c0.3,0.33,0.659,0.588,1.078,0.775c0.419,0.188,0.891,0.28,1.415,0.28c0.568,0,1.055-0.101,1.459-0.303s0.778-0.498,1.123-0.888
|
||||
l1.438,1.438c-0.524,0.584-1.134,1.003-1.831,1.258c-0.696,0.254-1.434,0.382-2.212,0.382c-0.823,0-1.576-0.135-2.257-0.404
|
||||
s-1.269-0.647-1.763-1.135c-0.494-0.485-0.876-1.07-1.146-1.751c-0.27-0.682-0.404-1.434-0.404-2.258
|
||||
c0-0.822,0.135-1.579,0.404-2.268s0.647-1.28,1.134-1.774c0.486-0.494,1.07-0.879,1.751-1.156s1.441-0.416,2.279-0.416
|
||||
c0.779,0,1.523,0.139,2.235,0.416c0.711,0.277,1.329,0.7,1.853,1.269L61.874,15.197z"/>
|
||||
<path fill="#5A74AF" d="M66.612,18.432c0,0.464,0.101,0.887,0.304,1.269c0.201,0.382,0.467,0.707,0.797,0.977
|
||||
c0.329,0.27,0.711,0.479,1.145,0.629c0.435,0.15,0.884,0.225,1.348,0.225c0.629,0,1.176-0.146,1.64-0.438
|
||||
c0.464-0.292,0.891-0.678,1.28-1.157l1.527,1.168c-1.123,1.452-2.695,2.179-4.717,2.179c-0.838,0-1.598-0.143-2.279-0.427
|
||||
s-1.258-0.678-1.729-1.179c-0.473-0.502-0.836-1.093-1.09-1.774s-0.382-1.418-0.382-2.212s0.139-1.531,0.416-2.213
|
||||
c0.276-0.681,0.658-1.271,1.146-1.773c0.486-0.501,1.066-0.895,1.74-1.18c0.674-0.284,1.406-0.426,2.201-0.426
|
||||
c0.942,0,1.74,0.165,2.391,0.494c0.652,0.33,1.187,0.76,1.605,1.292c0.42,0.531,0.723,1.13,0.91,1.796
|
||||
c0.188,0.667,0.281,1.345,0.281,2.033v0.719H66.612z M72.99,16.814c-0.016-0.449-0.086-0.861-0.213-1.235
|
||||
c-0.128-0.374-0.318-0.7-0.573-0.978c-0.255-0.276-0.573-0.493-0.954-0.65c-0.383-0.157-0.828-0.236-1.337-0.236
|
||||
c-0.493,0-0.946,0.094-1.358,0.281s-0.76,0.43-1.044,0.729s-0.505,0.633-0.663,0.999c-0.156,0.367-0.235,0.73-0.235,1.09H72.99z"/>
|
||||
<path fill="#5A74AF" d="M77.572,12.368h2.021v1.639h0.046c0.254-0.568,0.695-1.029,1.324-1.381s1.355-0.528,2.178-0.528
|
||||
c0.51,0,1,0.079,1.472,0.236s0.883,0.4,1.235,0.73c0.352,0.329,0.633,0.752,0.842,1.269c0.209,0.516,0.314,1.126,0.314,1.83v6.85
|
||||
h-2.021v-6.288c0-0.494-0.066-0.917-0.201-1.269c-0.135-0.353-0.314-0.637-0.539-0.854c-0.225-0.216-0.483-0.373-0.775-0.471
|
||||
s-0.596-0.146-0.91-0.146c-0.418,0-0.808,0.067-1.167,0.202s-0.674,0.349-0.943,0.641c-0.27,0.291-0.479,0.662-0.629,1.111
|
||||
s-0.225,0.98-0.225,1.595v5.479h-2.021V12.368z"/>
|
||||
<path fill="#5A74AF" d="M95.762,14.119h-2.896v4.829c0,0.299,0.008,0.595,0.022,0.887s0.071,0.554,0.169,0.786
|
||||
c0.097,0.232,0.246,0.419,0.449,0.561c0.201,0.144,0.497,0.214,0.887,0.214c0.239,0,0.486-0.022,0.741-0.067
|
||||
s0.486-0.127,0.696-0.247v1.842c-0.24,0.135-0.551,0.229-0.932,0.28c-0.383,0.053-0.678,0.079-0.888,0.079
|
||||
c-0.778,0-1.382-0.109-1.808-0.325c-0.427-0.218-0.741-0.498-0.943-0.843s-0.322-0.73-0.359-1.156
|
||||
c-0.037-0.427-0.057-0.857-0.057-1.292v-5.547h-2.336v-1.751h2.336V9.381h2.021v2.987h2.896V14.119z"/>
|
||||
<path fill="#5A74AF" d="M99.895,18.432c0,0.464,0.102,0.887,0.304,1.269s0.467,0.707,0.797,0.977
|
||||
c0.329,0.27,0.711,0.479,1.146,0.629c0.434,0.15,0.883,0.225,1.348,0.225c0.628,0,1.175-0.146,1.639-0.438
|
||||
c0.464-0.292,0.891-0.678,1.28-1.157l1.527,1.168c-1.123,1.452-2.695,2.179-4.716,2.179c-0.839,0-1.599-0.143-2.28-0.427
|
||||
c-0.681-0.284-1.257-0.678-1.729-1.179c-0.471-0.502-0.834-1.093-1.088-1.774c-0.256-0.682-0.383-1.418-0.383-2.212
|
||||
s0.139-1.531,0.416-2.213c0.276-0.681,0.658-1.271,1.145-1.773c0.487-0.501,1.067-0.895,1.741-1.18
|
||||
c0.674-0.284,1.407-0.426,2.201-0.426c0.942,0,1.74,0.165,2.392,0.494c0.65,0.33,1.186,0.76,1.605,1.292
|
||||
c0.419,0.531,0.723,1.13,0.909,1.796c0.188,0.667,0.281,1.345,0.281,2.033v0.719H99.895z M106.272,16.814
|
||||
c-0.016-0.449-0.086-0.861-0.213-1.235c-0.128-0.374-0.318-0.7-0.573-0.978c-0.255-0.276-0.572-0.493-0.954-0.65
|
||||
s-0.828-0.236-1.337-0.236c-0.493,0-0.946,0.094-1.358,0.281c-0.411,0.188-0.76,0.43-1.044,0.729
|
||||
c-0.285,0.3-0.506,0.633-0.663,0.999c-0.157,0.367-0.235,0.73-0.235,1.09H106.272z"/>
|
||||
<path fill="#5A74AF" d="M110.854,12.368h2.021v1.639h0.045c0.135-0.284,0.314-0.542,0.539-0.774
|
||||
c0.225-0.232,0.475-0.431,0.752-0.595s0.58-0.295,0.909-0.393c0.33-0.097,0.659-0.146,0.988-0.146c0.33,0,0.629,0.045,0.899,0.135
|
||||
l-0.091,2.178c-0.165-0.045-0.329-0.082-0.494-0.112c-0.165-0.029-0.329-0.045-0.493-0.045c-0.988,0-1.745,0.277-2.269,0.831
|
||||
c-0.524,0.554-0.786,1.415-0.786,2.583v5.345h-2.021V12.368z"/>
|
||||
<path fill="#5E6060" d="M120.156,5.513h1.368v11.493h-1.368V5.513z"/>
|
||||
<path fill="#5E6060" d="M123.485,7.215c0-0.274,0.099-0.509,0.297-0.707c0.197-0.198,0.433-0.296,0.707-0.296
|
||||
c0.273,0,0.509,0.099,0.707,0.296c0.197,0.198,0.296,0.433,0.296,0.707c0,0.273-0.099,0.509-0.296,0.707
|
||||
c-0.198,0.198-0.434,0.297-0.707,0.297c-0.274,0-0.51-0.099-0.707-0.297C123.584,7.725,123.485,7.489,123.485,7.215z M123.805,9.799
|
||||
h1.368v7.207h-1.368V9.799z"/>
|
||||
<path fill="#5E6060" d="M134.567,16.944c0,0.548-0.094,1.047-0.281,1.498c-0.188,0.45-0.453,0.841-0.798,1.17
|
||||
s-0.76,0.586-1.246,0.768c-0.487,0.183-1.024,0.273-1.611,0.273c-0.689,0-1.32-0.096-1.894-0.288
|
||||
c-0.572-0.193-1.117-0.527-1.634-1.003l0.927-1.156c0.355,0.386,0.74,0.677,1.156,0.874c0.415,0.198,0.887,0.297,1.413,0.297
|
||||
c0.507,0,0.928-0.074,1.262-0.221c0.335-0.146,0.601-0.337,0.799-0.569c0.197-0.234,0.337-0.5,0.418-0.799s0.121-0.601,0.121-0.904
|
||||
v-1.064h-0.045c-0.264,0.436-0.621,0.758-1.072,0.966s-0.925,0.312-1.421,0.312c-0.527,0-1.017-0.094-1.468-0.281
|
||||
s-0.838-0.446-1.163-0.775c-0.324-0.329-0.577-0.72-0.76-1.171c-0.183-0.45-0.273-0.939-0.273-1.467
|
||||
c0-0.527,0.086-1.021,0.259-1.482c0.172-0.461,0.418-0.864,0.737-1.208c0.319-0.345,0.704-0.613,1.155-0.806
|
||||
c0.45-0.192,0.955-0.289,1.513-0.289c0.486,0,0.96,0.106,1.421,0.319s0.823,0.512,1.087,0.896h0.03V9.799h1.368V16.944z
|
||||
M130.828,10.894c-0.365,0-0.694,0.063-0.988,0.19c-0.294,0.126-0.542,0.299-0.745,0.517c-0.202,0.218-0.359,0.481-0.471,0.791
|
||||
c-0.112,0.309-0.167,0.646-0.167,1.011c0,0.729,0.213,1.315,0.638,1.756c0.426,0.44,1.004,0.661,1.733,0.661
|
||||
s1.307-0.221,1.733-0.661c0.426-0.44,0.638-1.026,0.638-1.756c0-0.365-0.056-0.702-0.167-1.011s-0.269-0.572-0.471-0.791
|
||||
c-0.203-0.218-0.451-0.39-0.745-0.517C131.522,10.958,131.193,10.894,130.828,10.894z"/>
|
||||
<path fill="#5E6060" d="M136.29,5.513h1.368v5.397h0.03c0.172-0.385,0.471-0.697,0.896-0.935s0.917-0.357,1.475-0.357
|
||||
c0.345,0,0.677,0.053,0.996,0.16s0.598,0.271,0.836,0.494c0.238,0.223,0.429,0.509,0.57,0.859s0.213,0.763,0.213,1.239v4.637h-1.368
|
||||
v-4.257c0-0.334-0.046-0.62-0.137-0.858c-0.092-0.238-0.213-0.431-0.365-0.578c-0.152-0.147-0.327-0.253-0.524-0.32
|
||||
c-0.198-0.065-0.403-0.099-0.616-0.099c-0.283,0-0.547,0.046-0.79,0.137c-0.243,0.091-0.456,0.236-0.639,0.434
|
||||
s-0.324,0.448-0.426,0.752c-0.101,0.304-0.151,0.664-0.151,1.079v3.71h-1.368V5.513z"/>
|
||||
<path fill="#5E6060" d="M148.604,10.985h-1.961v3.269c0,0.203,0.005,0.402,0.015,0.601c0.01,0.197,0.048,0.375,0.114,0.532
|
||||
c0.065,0.157,0.167,0.283,0.304,0.38s0.337,0.145,0.601,0.145c0.162,0,0.329-0.016,0.502-0.046c0.172-0.03,0.329-0.086,0.471-0.167
|
||||
v1.246c-0.162,0.092-0.372,0.154-0.631,0.19c-0.258,0.035-0.458,0.053-0.6,0.053c-0.527,0-0.936-0.073-1.224-0.221
|
||||
c-0.289-0.146-0.502-0.336-0.639-0.569s-0.219-0.494-0.244-0.783c-0.024-0.289-0.037-0.58-0.037-0.874v-3.755h-1.581V9.799h1.581
|
||||
V7.778h1.368v2.021h1.961V10.985z"/>
|
||||
<path fill="#95BDE5" d="M142.227,20.314c-0.039,0.215-0.129,0.432-0.129,0.432c-0.024,0.059-0.107,0.25-0.125,0.288
|
||||
c-0.064,0.138-0.097,0.224-0.17,0.38c-0.084,0.178,0,0-0.136,0.268c-1.126,2.234-4.158,4.755-8.376,4.658
|
||||
c-3.922-0.09-6.719-1.806-8.072-4.173c-0.103-0.18-0.262-0.42-0.383-0.684c-0.034-0.074-0.242-0.511-0.265-0.575
|
||||
c-0.116-0.333-0.2-0.368-0.216-0.594c0,0,0.259,0.528,0.779,1.091c1.227,1.325,3.915,3.426,8.156,3.477
|
||||
c4.143,0.049,6.907-2.123,8.163-3.477C141.972,20.849,142.227,20.314,142.227,20.314z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
|
@ -1,217 +0,0 @@
|
|||
from datetime import datetime
|
||||
|
||||
from celery import current_task
|
||||
from celery.exceptions import MaxRetriesExceededError
|
||||
from celery.utils.log import get_task_logger
|
||||
from django.conf import settings
|
||||
from django.core.mail import EmailMessage
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils import translation
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from dynamicweb.celery import app
|
||||
from hosting.models import HostingOrder
|
||||
from membership.models import CustomUser
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
from opennebula_api.serializers import VirtualMachineSerializer
|
||||
from utils.hosting_utils import (
|
||||
get_all_public_keys, get_or_create_vm_detail
|
||||
)
|
||||
from utils.mailer import BaseEmail
|
||||
from utils.stripe_utils import StripeUtils
|
||||
from .models import VMPricing
|
||||
|
||||
logger = get_task_logger(__name__)
|
||||
|
||||
|
||||
def retry_task(task, exception=None):
|
||||
"""Retries the specified task using a "backing off countdown",
|
||||
meaning that the interval between retries grows exponentially
|
||||
with every retry.
|
||||
|
||||
Arguments:
|
||||
task:
|
||||
The task to retry.
|
||||
|
||||
exception:
|
||||
Optionally, the exception that caused the retry.
|
||||
"""
|
||||
|
||||
def backoff(attempts):
|
||||
return 2 ** attempts
|
||||
|
||||
kwargs = {
|
||||
'countdown': backoff(task.request.retries),
|
||||
}
|
||||
|
||||
if exception:
|
||||
kwargs['exc'] = exception
|
||||
|
||||
raise task.retry(**kwargs)
|
||||
|
||||
|
||||
@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
|
||||
def create_vm_task(self, vm_template_id, user, specs, template, order_id):
|
||||
logger.debug(
|
||||
"Running create_vm_task on {}".format(current_task.request.hostname))
|
||||
vm_id = None
|
||||
try:
|
||||
final_price = (
|
||||
specs.get('total_price') if 'total_price' in specs
|
||||
else specs.get('price')
|
||||
)
|
||||
|
||||
if 'pass' in user:
|
||||
on_user = user.get('email')
|
||||
on_pass = user.get('pass')
|
||||
logger.debug("Using user {user} to create VM".format(user=on_user))
|
||||
vm_name = None
|
||||
else:
|
||||
on_user = settings.OPENNEBULA_USERNAME
|
||||
on_pass = settings.OPENNEBULA_PASSWORD
|
||||
logger.debug("Using OpenNebula admin user to create VM")
|
||||
vm_name = "{email}-{template_name}-{date}".format(
|
||||
email=user.get('email'),
|
||||
template_name=template.get('name'),
|
||||
date=int(datetime.now().strftime("%s")))
|
||||
|
||||
# Create OpenNebulaManager
|
||||
manager = OpenNebulaManager(email=on_user, password=on_pass)
|
||||
|
||||
custom_user = CustomUser.objects.get(email=user.get('email'))
|
||||
pub_keys = get_all_public_keys(custom_user)
|
||||
if manager.email != settings.OPENNEBULA_USERNAME:
|
||||
manager.save_key_in_opennebula_user('\n'.join(pub_keys))
|
||||
vm_id = manager.create_vm(
|
||||
template_id=vm_template_id,
|
||||
specs=specs,
|
||||
ssh_key='\n'.join(pub_keys),
|
||||
vm_name=vm_name
|
||||
)
|
||||
|
||||
if vm_id is None:
|
||||
raise Exception("Could not create VM")
|
||||
|
||||
# Update HostingOrder with the created vm_id
|
||||
hosting_order = HostingOrder.objects.filter(id=order_id).first()
|
||||
error_msg = None
|
||||
|
||||
try:
|
||||
hosting_order.vm_id = vm_id
|
||||
hosting_order.save()
|
||||
logger.debug(
|
||||
"Updated hosting_order {} with vm_id={}".format(
|
||||
hosting_order.id, vm_id
|
||||
)
|
||||
)
|
||||
except Exception as ex:
|
||||
error_msg = (
|
||||
"HostingOrder with id {order_id} not found. This means that "
|
||||
"the hosting order was not created and/or it is/was not "
|
||||
"associated with VM with id {vm_id}. Details {details}".format(
|
||||
order_id=order_id, vm_id=vm_id, details=str(ex)
|
||||
)
|
||||
)
|
||||
logger.error(error_msg)
|
||||
|
||||
stripe_utils = StripeUtils()
|
||||
result = stripe_utils.set_subscription_metadata(
|
||||
subscription_id=hosting_order.subscription_id,
|
||||
metadata={"VM_ID": str(vm_id)}
|
||||
)
|
||||
|
||||
if result.get('error') is not None:
|
||||
emsg = "Could not update subscription metadata for {sub}".format(
|
||||
sub=hosting_order.subscription_id
|
||||
)
|
||||
logger.error(emsg)
|
||||
if error_msg:
|
||||
error_msg += ". " + emsg
|
||||
else:
|
||||
error_msg = emsg
|
||||
|
||||
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': final_price,
|
||||
'template': template.get('name'),
|
||||
'vm_name': vm.get('name'),
|
||||
'vm_id': vm['vm_id'],
|
||||
'order_id': order_id
|
||||
}
|
||||
|
||||
if error_msg:
|
||||
context['errors'] = error_msg
|
||||
if 'pricing_name' in specs:
|
||||
context['pricing'] = str(VMPricing.get_vm_pricing_by_name(
|
||||
name=specs['pricing_name']
|
||||
))
|
||||
email_data = {
|
||||
'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']],
|
||||
}
|
||||
email = EmailMessage(**email_data)
|
||||
email.send()
|
||||
|
||||
if 'pass' in user:
|
||||
lang = 'en-us'
|
||||
if user.get('language') is not None:
|
||||
logger.debug(
|
||||
"Language is set to {}".format(user.get('language')))
|
||||
lang = user.get('language')
|
||||
translation.activate(lang)
|
||||
# Send notification to the user as soon as VM has been booked
|
||||
context = {
|
||||
'base_url': "{0}://{1}".format(user.get('request_scheme'),
|
||||
user.get('request_host')),
|
||||
'order_url': reverse('hosting:orders',
|
||||
kwargs={'pk': order_id}),
|
||||
'page_header': _(
|
||||
'Your New VM %(vm_name)s at Data Center Light') % {
|
||||
'vm_name': vm.get('name')},
|
||||
'vm_name': vm.get('name')
|
||||
}
|
||||
email_data = {
|
||||
'subject': context.get('page_header'),
|
||||
'to': user.get('email'),
|
||||
'context': context,
|
||||
'template_name': 'new_booked_vm',
|
||||
'template_path': 'hosting/emails/',
|
||||
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||
}
|
||||
email = BaseEmail(**email_data)
|
||||
email.send()
|
||||
|
||||
logger.debug("New VM ID is {vm_id}".format(vm_id=vm_id))
|
||||
if vm_id > 0:
|
||||
get_or_create_vm_detail(custom_user, manager, vm_id)
|
||||
except Exception as e:
|
||||
logger.error(str(e))
|
||||
try:
|
||||
retry_task(self)
|
||||
except MaxRetriesExceededError:
|
||||
msg_text = 'Finished {} retries for create_vm_task'.format(
|
||||
self.request.retries)
|
||||
logger.error(msg_text)
|
||||
# Try sending email and stop
|
||||
email_data = {
|
||||
'subject': '{} CELERY TASK ERROR: {}'.format(settings.DCL_TEXT,
|
||||
msg_text),
|
||||
'from_email': current_task.request.hostname,
|
||||
'to': settings.DCL_ERROR_EMAILS_TO_LIST,
|
||||
'body': ',\n'.join(str(i) for i in self.request.args)
|
||||
}
|
||||
email = EmailMessage(**email_data)
|
||||
email.send()
|
||||
return
|
||||
|
||||
return vm_id
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
|
||||
{% load staticfiles bootstrap3 i18n custom_tags humanize %}
|
||||
|
||||
{% block content %}
|
||||
{% block userkey_form %}
|
||||
{% with form_title=_("Your VM is almost ready!") form_sub_title=_("You need to specify your public SSH key to access your VM. You can either add your existing key, or generate a new key pair by clicking the generate button below. After choosing your public SSH key option you’ll be directed to the order confirmation page.") %}
|
||||
{% include 'hosting/user_key.html' with title=form_title sub_title=form_sub_title %}
|
||||
{% endwith %}
|
||||
{% endblock userkey_form %}
|
||||
{%endblock%}
|
||||
|
|
@ -1,67 +1,68 @@
|
|||
{% load static i18n cms_tags sekizai_tags %}
|
||||
{% load staticfiles i18n%}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{LANGUAGE_CODE}}">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Data Center Light by ungleich">
|
||||
<meta name="author" content="ungleich glarus ag">
|
||||
<title>Data Center Light - {% block title %}VM hosting made in Switzerland{% endblock %}</title>
|
||||
<head>
|
||||
|
||||
<!-- Vendor CSS -->
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="{% static 'datacenterlight/css/bootstrap-3.3.7.min.css' %}" rel="stylesheet">
|
||||
<!-- Icon Fonts -->
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'datacenterlight/css/common.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
|
||||
{% block css_extra %}
|
||||
{% endblock css_extra %}
|
||||
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Data Center Light by ungleich">
|
||||
<meta name="author" content="ungleich GmbH">
|
||||
|
||||
<!-- External Fonts -->
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,600,700" rel="stylesheet" type="text/css">
|
||||
<title>Data Center Light -
|
||||
{% block title %}VM hosting made in Switzerland{% endblock %}</title>
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="{% static 'datacenterlight/css/bootstrap.min.css' %}" rel="stylesheet">
|
||||
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
<!-- Custom Fonts -->
|
||||
<!--Import Google Icon Font-->
|
||||
<link href="//fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic" rel="stylesheet" type="text/css">
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon" />
|
||||
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.min.css" rel="stylesheet">
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
|
||||
|
||||
<!-- Google analytics -->
|
||||
{% include "google_analytics.html" %}
|
||||
<!-- End Google Analytics -->
|
||||
</head>
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!-- Google analytics -->
|
||||
{% include "google_analytics.html" %}
|
||||
<!-- End Google Analytics -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% include "gdpr_banner.html" %}
|
||||
{% block navbar %}
|
||||
<body>
|
||||
|
||||
<!-- Navigation -->
|
||||
{% include "datacenterlight/includes/_navbar.html" %}
|
||||
{% endblock navbar %}
|
||||
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
|
||||
{% include "datacenterlight/includes/_footer.html" %}
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'datacenterlight/js/jquery-2.2.4.min.js' %}"></script>
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{% static 'datacenterlight/js/bootstrap-3.3.7.min.js' %}"></script>
|
||||
<!-- Bootstrap Validator -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
{% include "datacenterlight/includes/_footer.html" %}
|
||||
<!-- Footer -->
|
||||
|
||||
<!-- Custom JS -->
|
||||
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'datacenterlight/js/jquery.js' %}"></script>
|
||||
|
||||
</body>
|
||||
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
|
||||
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{% static 'datacenterlight/js/bootstrap.min.js' %}"></script>
|
||||
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
|
||||
<!-- Load form js -->
|
||||
<script src="{% static 'datacenterlight/js/form.js' %}"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.5.4/bootstrap-select.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,95 +0,0 @@
|
|||
{% load staticfiles i18n cms_tags sekizai_tags %}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{LANGUAGE_CODE}}">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="Data Center Light by ungleich">
|
||||
<meta name="author" content="ungleich glarus ag">
|
||||
|
||||
<title>Data Center Light - {% block title %}VM hosting made in Switzerland{% endblock %}</title>
|
||||
|
||||
<!-- Vendor CSS -->
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="{% static 'datacenterlight/css/bootstrap-3.3.7.min.css' %}" rel="stylesheet">
|
||||
<!-- Icon Fonts -->
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,600,700" rel="stylesheet" type="text/css">
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'datacenterlight/css/common.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/hosting.css' %}" rel="stylesheet">
|
||||
{% if request.toolbar.edit_mode %}
|
||||
<link href="{% static 'datacenterlight/css/cms.css' %}" rel="stylesheet">
|
||||
{% endif %}
|
||||
{% block css_extra %}
|
||||
{% endblock css_extra %}
|
||||
|
||||
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
|
||||
<!-- External Fonts -->
|
||||
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Google analytics -->
|
||||
{% include "google_analytics.html" %}
|
||||
<!-- End Google Analytics -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% include "gdpr_banner.html" %}
|
||||
{% cms_toolbar %}
|
||||
|
||||
{% render_placeholder cms_integration.navbar_placeholder %}
|
||||
|
||||
<div class="{% if request.user.is_authenticated %}content-dashboard{% endif %}">
|
||||
{% block content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
|
||||
{% render_placeholder cms_integration.footer_placeholder %}
|
||||
|
||||
|
||||
<!-- Moment -->
|
||||
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
|
||||
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.js"></script>
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'datacenterlight/js/jquery-2.2.4.min.js' %}"></script>
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{% static 'datacenterlight/js/bootstrap-3.3.7.min.js' %}"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
<!-- Copy Clipboard (not required for dcl, but dependency in virtual_machine_detail.js) -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.10/clipboard.min.js"></script>
|
||||
|
||||
<!-- Custom JS -->
|
||||
<script src="{% static 'hosting/js/virtual_machine_detail.js' %}"></script>
|
||||
<script src="{% static 'hosting/js/createvm.js' %}"></script>
|
||||
<script src="{% static 'hosting/js/initial.js' %}"></script>
|
||||
{% block js_extra %}
|
||||
{% comment %}
|
||||
this block is above some files, because on stripe error scripts below the stripe
|
||||
script are not properly executed.
|
||||
{% endcomment %}
|
||||
{% endblock js_extra %}
|
||||
|
||||
<!-- Stripe Lib -->
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<script src="https://js.stripe.com/v2/"></script>
|
||||
|
||||
<!-- Proccess payment lib -->
|
||||
<script type="text/javascript" src="{% static 'hosting/js/payment.js' %}"></script>
|
||||
</body>
|
||||
</html>
|
||||
27
datacenterlight/templates/datacenterlight/beta_access.html
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{% load i18n %}
|
||||
|
||||
<form novalidate id ="beta_access" class="form-beta" method="POST" action="{% url 'datacenterlight:beta_access'%}">
|
||||
{% csrf_token %}
|
||||
{{ form.non_field_errors }}
|
||||
<div>
|
||||
{% for message in messages %}
|
||||
<strong>{{ message }}</strong>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="inputs">
|
||||
<div class="form-group">
|
||||
<input type="text" name="name" class="form-control" id="name" placeholder="{% trans 'Enter name' %}">
|
||||
<span style="color: white">{{ form.name.errors|striptags}}</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="email" name="email" class="form-control" id="email" placeholder="{% trans 'Enter email' %}">
|
||||
<span style="color: white">{{ form.email.errors|striptags}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-default btn-transparent btn-lg">{% trans "Request Beta Access" %}</button>
|
||||
</form>
|
||||
<script>
|
||||
$('#beta_access').ajaxForm({
|
||||
target: '#beta_access_form', success: function(response) { }
|
||||
});
|
||||
</script>
|
||||
47
datacenterlight/templates/datacenterlight/beta_success.html
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
|
||||
{% load i18n %}
|
||||
|
||||
<div class="modal fade bs-example-modal-sm" style="color:black;" id="successModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="modal-icon"><i class="fa fa-check" aria-hidden="true"></i></div>
|
||||
<h4 class="modal-title">{% trans "Request Sent" %}</h4>
|
||||
<p class="modal-text">{% trans "Thank you for your subscription! You will receive a confirmation mail from our team" %}</p>
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div>
|
||||
</div><!-- /.modal -->
|
||||
<script>
|
||||
// Show modal
|
||||
$('#successModal').modal('show');
|
||||
// close the modal after 3 seconds
|
||||
setTimeout(function() {
|
||||
$('#successModal').modal('hide');
|
||||
}, 5000);
|
||||
</script>
|
||||
<style>
|
||||
.vertical-alignment-helper {
|
||||
display:table;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
pointer-events:none; /* This makes sure that we can still click outside of the modal to close it */
|
||||
}
|
||||
.vertical-align-center {
|
||||
/* To center vertically */
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
pointer-events:none;
|
||||
}
|
||||
.modal-content {
|
||||
/* Bootstrap sets the size of the modal in the modal-dialog class, we need to inherit it */
|
||||
width:inherit;
|
||||
height:inherit;
|
||||
/* To center horizontally */
|
||||
margin: 0 auto;
|
||||
pointer-events: all;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,35 +1,14 @@
|
|||
{% load staticfiles i18n%}
|
||||
|
||||
{% if vm_pricing %}
|
||||
<script type="application/javascript">
|
||||
window.vat_inclusive = {% if vm_pricing.vat_inclusive %}true{% else %}false{% endif%};
|
||||
window.vat_percentage = {{vm_pricing.vat_percentage|default:0}};
|
||||
window.coresUnitPrice = {{vm_pricing.cores_unit_price|default:0}};
|
||||
window.ramUnitPrice = {{vm_pricing.ram_unit_price|default:0}};
|
||||
window.ssdUnitPrice = {{vm_pricing.ssd_unit_price|default:0}};
|
||||
window.hddUnitPrice = {{vm_pricing.hdd_unit_price|default:0}};
|
||||
window.discountAmount = {{vm_pricing.discount_amount|default:0}};
|
||||
window.minRam = {{min_ram}};
|
||||
window.minRamErr = '{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}';
|
||||
</script>
|
||||
{% endif %}
|
||||
|
||||
<form id="order_form" method="POST" action="{{calculator_form_url}}" data-toggle="validator" role="form">
|
||||
<form id="order_form" method="POST" action="" data-toggle="validator" role="form">
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="pid" value="{{instance.id}}">
|
||||
<div class="title">
|
||||
<h3>{% trans "VM hosting" %} </h3>
|
||||
</div>
|
||||
<div class="price">
|
||||
<span id="total"></span>
|
||||
<span id="total">15</span>
|
||||
<span>CHF/{% trans "month" %}</span>
|
||||
<div class="price-text">
|
||||
<p>
|
||||
{% if vm_pricing.vat_inclusive %}{% trans "VAT included" %} <br>{% endif %}
|
||||
{% if vm_pricing.discount_amount %}
|
||||
{% trans "You save" %} {{ vm_pricing.discount_amount }} CHF
|
||||
{% endif %}
|
||||
</p>
|
||||
<p>{% trans "VAT included" %}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="descriptions">
|
||||
|
|
@ -47,9 +26,9 @@
|
|||
<div class="help-block with-errors">
|
||||
{% for message in messages %}
|
||||
{% if 'cores' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>{{ message|safe }}</li>
|
||||
</ul>
|
||||
<ul class="list-unstyled"><li>
|
||||
{{ message|safe }}
|
||||
</li></ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
|
@ -57,8 +36,8 @@
|
|||
<div class="form-group">
|
||||
<div class="description input">
|
||||
<i class="fa fa-minus-circle left" data-minus="ram" aria-hidden="true"></i>
|
||||
<input id="ramValue" class="input-price select-number" type="number" min="{% if min_ram == 0.5 %}0{% else %}1{% endif %}" max="200" name="ram"
|
||||
data-error="{% blocktrans with min_ram=min_ram %}Please enter a value in range {{min_ram}} - 200.{% endblocktrans %}" required step="1">
|
||||
<input id="ramValue" class="input-price select-number" type="number" min="2" max="200" name="ram"
|
||||
data-error="{% trans 'Please enter a value in range 2 - 200.' %}" required>
|
||||
<span> GB RAM</span>
|
||||
<i class="fa fa-plus-circle right" data-plus="ram" aria-hidden="true"></i>
|
||||
</div>
|
||||
|
|
@ -92,14 +71,53 @@
|
|||
</div>
|
||||
<div class="description select-configuration input form-group justify-center">
|
||||
<label for="config">OS</label>
|
||||
<select name="config">
|
||||
<select name="config" id="">
|
||||
{% for template in templates %}
|
||||
|
||||
<option value="{{template.opennebula_vm_template_id}}" {% if template.name|lower == instance.default_selected_template|lower %}selected="selected"{% endif %}>{{template.name}}</option>
|
||||
<option value="{{template.opennebula_vm_template_id}}">{{template.name}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<input type="hidden" name="total">
|
||||
<!--<div class="description check-ip">
|
||||
<input type="checkbox" name="ipv6"> Ipv6 Only<br>
|
||||
</div>-->
|
||||
<div class="form-group">
|
||||
<div class="description input justify-center">
|
||||
<label for="name" class="control-label">{% trans "Name"%}</label>
|
||||
<input type="text" name="name" class="form-control" placeholder="{% trans 'Your Name'%}"
|
||||
data-minlength="3" data-error="{% trans 'Please enter your name.' %}" required>
|
||||
</div>
|
||||
<div class="help-block with-errors">
|
||||
{% for message in messages %}
|
||||
{% if 'name' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
{{ message|safe }}
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="description input justify-center">
|
||||
<label for="email" class="control-label">{% trans "Email"%}</label>
|
||||
<input name="email" type="email" pattern="^[^@\s]+@([^@\s]+\.)+[^@\s]+$" class="form-control"
|
||||
placeholder="{% trans 'Your Email' %}"
|
||||
data-error="{% trans 'Please enter a valid email address.' %}" required>
|
||||
</div>
|
||||
<div class="help-block with-errors">
|
||||
{% for message in messages %}
|
||||
{% if 'email' in message.tags %}
|
||||
<ul class="list-unstyled">
|
||||
<li>
|
||||
{{ message|safe }}
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="pricing_name" value="{% if vm_pricing.name %}{{vm_pricing.name}}{% else %}unknown{% endif%}"></input>
|
||||
<input type="submit" class="btn btn-primary disabled" value="{% trans 'Continue' %}"></input>
|
||||
</form>
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
<div class="flex-row {{ instance.get_extra_classes }}">
|
||||
<div class="percent-text">
|
||||
{% if instance.banner_text %}
|
||||
<div class="text">{{ instance.banner_text }}</div>
|
||||
{% endif %}
|
||||
{% if instance.banner_image %}
|
||||
<div class="ssdimg">
|
||||
<img class="img-responsive" src="{{ instance.banner_image.url }}" alt="image">
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="desc-text padding-vertical">
|
||||
<div class="lead">
|
||||
{{ instance.content }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
{% load cms_tags %}
|
||||
|
||||
<div class="banner-list" id="{{ instance.html_id }}">
|
||||
<div class="container">
|
||||
{% if instance.heading %}
|
||||
<div class="banner-list-heading">
|
||||
<h2>{{ instance.heading }}</h2>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% for plugin in instance.child_plugin_instances %}
|
||||
{% render_plugin plugin %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
{% load static i18n cms_tags sekizai_tags %}
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{LANGUAGE_CODE}}">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="author" content="ungleich glarus ag">
|
||||
<meta name="description" content="{% page_attribute 'meta_description' %}">
|
||||
<title>{% page_attribute "page_title" %}</title>
|
||||
|
||||
<!-- Vendor CSS -->
|
||||
<!-- Bootstrap Core CSS -->
|
||||
<link href="{% static 'datacenterlight/css/bootstrap-3.3.7.min.css' %}" rel="stylesheet">
|
||||
<!-- Icon Fonts -->
|
||||
<link href="{% static 'datacenterlight/font-awesome/css/font-awesome.min.css' %}" rel="stylesheet" type="text/css">
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'datacenterlight/css/common.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'datacenterlight/css/header-slider.css' %}" rel="stylesheet">
|
||||
{% if request.toolbar.edit_mode %}
|
||||
<link href="{% static 'datacenterlight/css/cms.css' %}" rel="stylesheet">
|
||||
{% endif %}
|
||||
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
|
||||
<!-- External Fonts -->
|
||||
<link href="//fonts.googleapis.com/css?family=Lato:300,400,600,700" rel="stylesheet" type="text/css">
|
||||
|
||||
{% if request.current_page.cmsfaviconextension %}
|
||||
<link rel="shortcut icon" href="{% static request.current_page.cmsfaviconextension.favicon.url %}" type="image/x-icon">
|
||||
{% else %}
|
||||
<link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
|
||||
{% endif %}
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
|
||||
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
|
||||
<!-- Google analytics -->
|
||||
{% include "google_analytics.html" %}
|
||||
<!-- End Google Analytics -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
{% include "gdpr_banner.html" %}
|
||||
{% cms_toolbar %}
|
||||
|
||||
{% placeholder 'datacenterlight_navbar' %}
|
||||
|
||||
{% placeholder 'Datacenterlight Header' or %}
|
||||
<div class="dcl-header">
|
||||
<div class="container">
|
||||
<h1>{% page_attribute "page_title" %}</h1>
|
||||
</div>
|
||||
</div>
|
||||
{% endplaceholder %}
|
||||
|
||||
{% url 'datacenterlight:index' as calculator_form_url %}
|
||||
{% placeholder 'Datacenterlight Content' %}
|
||||
|
||||
{% placeholder 'datacenterlight_footer'%}
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="{% static 'datacenterlight/js/jquery-2.2.4.min.js' %}"></script>
|
||||
<!-- Bootstrap Core JavaScript -->
|
||||
<script src="{% static 'datacenterlight/js/bootstrap-3.3.7.min.js' %}"></script>
|
||||
<!-- Bootstrap Validator -->
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
|
||||
|
||||
<!-- Custom JS -->
|
||||
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
<div class="price-calc-section">
|
||||
<div class="card">
|
||||
{% include "datacenterlight/includes/_calculator_form.html" with vm_pricing=instance.pricing %}
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
<div id="contact" class="full-contact-section">
|
||||
<div class="intro-header-2 contact-section">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
{% if instance.heading%}
|
||||
<div class="title">
|
||||
<h2>{{ instance.heading}}</h2>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="contact-details">
|
||||
{% if instance.organization_name %}
|
||||
<div class="subtitle">
|
||||
<h3>{{ instance.organization_name }}</h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="description">
|
||||
{% if instance.email %}
|
||||
<p>{{ instance.email }}</p>
|
||||
{% endif %}
|
||||
{% if instance.address %}
|
||||
<p>{{ instance.address }}</p>
|
||||
{% endif %}
|
||||
{% if instance.country %}
|
||||
<p>{{ instance.country }}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="social">
|
||||
<a target="_blank" href="https://twitter.com/datacenterlight"><i class="fa fa-twitter fa-fw"></i></a>
|
||||
<a target="_blank" href="https://github.com/ungleich"><i class="fa fa-github fa-fw"></i></a>
|
||||
<a target="_blank" href="https://www.facebook.com/ungleich.ch/"><i class="fa fa-facebook"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div id="contact-form" class="contact-form">
|
||||
{% include "datacenterlight/contact_form.html" with form_header=instance.form_header %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||