From e7c825842752257c4ad73185b7d8ba448de222f1 Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 27 Apr 2016 01:54:15 -0500 Subject: [PATCH 1/6] Handled stripe payment errors , Added invoice template, Added view to handle invoice data --- hosting/templates/hosting/invoice.html | 79 ++++++++++++++++++++++++++ hosting/templates/hosting/payment.html | 14 ++++- hosting/urls.py | 4 +- hosting/views.py | 66 +++++++++++++++++---- utils/stripe_utils.py | 55 +++++++++++++++++- 5 files changed, 202 insertions(+), 16 deletions(-) create mode 100644 hosting/templates/hosting/invoice.html diff --git a/hosting/templates/hosting/invoice.html b/hosting/templates/hosting/invoice.html new file mode 100644 index 00000000..302028fe --- /dev/null +++ b/hosting/templates/hosting/invoice.html @@ -0,0 +1,79 @@ +{% extends "hosting/base_short.html" %} +{% load staticfiles bootstrap3 %} +{% block content %} + + + +
+
+
+
+

Invoice

Order # {{order.id}}

+
+
+
+
+
+

Billed To:

+ John Smith
+ 1234 Main
+ Apt. 4B
+ Springfield, ST 54321 +
+
+
+
+ Order Date:
+ {{order.created_at}}

+
+
+
+
+
+
+ Payment Method:
+ {{brand}} ending **** {{last4}}
+ {{user.email}} +
+
+
+
+
+ +
+
+

Order summary

+
+
+

Type {{request.session.vm_specs.hosting_company_name}}

+
+

Cores {{request.session.vm_specs.cores}}

+
+

Memory {{request.session.vm_specs.memory}} GiB

+
+

Disk space {{request.session.vm_specs.disk_size}} GiB

+
+

Total

{{request.session.vm_specs.final_price}} CHF

+
+
+
+
+{%endblock%} diff --git a/hosting/templates/hosting/payment.html b/hosting/templates/hosting/payment.html index 1ebb1770..ec942131 100644 --- a/hosting/templates/hosting/payment.html +++ b/hosting/templates/hosting/payment.html @@ -1,6 +1,6 @@ {% extends "hosting/base_short.html" %} {% load staticfiles bootstrap3 %} -{%block content %} +{% block content %}
@@ -64,6 +64,17 @@

+ {% if paymentError %} +
+
+

+ {% bootstrap_alert paymentError alert_type='danger' %} +

+
+
+ {% endif %} + + @@ -88,6 +99,7 @@ + diff --git a/hosting/urls.py b/hosting/urls.py index 1dbd1a54..f50b7a2f 100644 --- a/hosting/urls.py +++ b/hosting/urls.py @@ -1,7 +1,8 @@ from django.conf.urls import url from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \ - NodeJSHostingView, LoginView, SignupView, IndexView + NodeJSHostingView, LoginView, SignupView, IndexView, \ + InvoiceVMView urlpatterns = [ url(r'index/?$', IndexView.as_view(), name='index'), @@ -11,4 +12,5 @@ urlpatterns = [ url(r'login/?$', LoginView.as_view(), name='login'), url(r'signup/?$', SignupView.as_view(), name='signup'), url(r'payment/?$', PaymentVMView.as_view(), name='payment'), + url(r'invoice/?$', InvoiceVMView.as_view(), name='invoice'), ] diff --git a/hosting/views.py b/hosting/views.py index 16556bc1..75ce03eb 100644 --- a/hosting/views.py +++ b/hosting/views.py @@ -12,6 +12,7 @@ from membership.forms import PaymentForm from membership.models import CustomUser, StripeCustomer from utils.stripe_utils import StripeUtils from utils.forms import BillingAddressForm +from utils.models import BillingAddress from .models import VirtualMachineType, VirtualMachinePlan, HostingOrder from .forms import HostingUserSignupForm, HostingUserLoginForm from .mixins import ProcessVMSelectionMixin @@ -155,7 +156,7 @@ class PaymentVMView(FormView): form = self.get_form() if form.is_valid(): - + context = self.get_context_data() specifications = request.session.get('vm_specs') vm_type = specifications.get('hosting_company') vm = VirtualMachineType.objects.get(hosting_company=vm_type) @@ -185,20 +186,63 @@ class PaymentVMView(FormView): # Make stripe charge to a customer stripe_utils = StripeUtils() - charge = stripe_utils.make_charge(amount=final_price, + charge_response = stripe_utils.make_charge(amount=final_price, customer=customer.stripe_id) - order.set_stripe_charge(charge) + charge = charge_response.get('response_object') - if not charge.paid: - # raise an error - pass + # Check if the payment was approved + if not charge: + context.update({ + 'paymentError': charge_response.get('error'), + 'form':form + }) + return render(request, self.template_name, context) + + charge = charge_response.get('response_object') + + # Associate an order with a stripe payment + order.set_stripe_charge(charge) # If the Stripe payment was successed, set order status approved order.set_approved() - # order.charge = - - # Billing Address should be store here - - return HttpResponseRedirect(reverse('hosting:payment')) + request.session.update({ + 'charge':charge, + 'order':order.id, + 'billing_address':billing_address.id + }) + return HttpResponseRedirect(reverse('hosting:invoice')) else: return self.form_invalid(form) + + +class InvoiceVMView(View): + template_name = "hosting/invoice.html" + + def get_context_data(self, **kwargs): + charge = self.request.session.get('charge') + order_id = self.request.session.get('order') + billing_address_id = self.request.session.get('billing_address') + last4 = charge.get('source').get('last4') + brand = charge.get('source').get('brand') + + order = get_object_or_404(HostingOrder, pk=order_id) + billing_address = get_object_or_404(BillingAddress, pk=billing_address_id) + + if not charge: + return + + context = { + 'last4': last4, + 'brand': brand, + 'order': order, + 'billing_address': billing_address, + } + return context + + + def get(self, request, *args, **kwargs): + + context = self.get_context_data() + + return render(request, self.template_name, context) + diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py index cfe1e63a..eb49fcde 100644 --- a/utils/stripe_utils.py +++ b/utils/stripe_utils.py @@ -2,6 +2,54 @@ import stripe from django.conf import settings + +def handleStripeError(f): + def handleProblems(*args, **kwargs): + response = { + 'paid': False, + 'response_object': None, + 'error': None + } + common_message = "Currently its not possible to make payments." + + try: + response_object = f(*args, **kwargs) + response = { + 'response_object': response_object, + 'error': None + } + return response + except stripe.error.CardError as e: + # Since it's a decline, stripe.error.CardError will be caught + body = e.json_body + err = body['error'] + response.update({'error':err['message']}) + return response + except stripe.error.RateLimitError as e: + response.update({'error':"Too many requests made to the API too quickly"}) + return response + except stripe.error.InvalidRequestError as e: + response.update({'error':"Invalid parameters"}) + return response + except stripe.error.AuthenticationError as e: + # Authentication with Stripe's API failed + # (maybe you changed API keys recently) + response.update({'error':common_message}) + return response + except stripe.error.APIConnectionError as e: + response.update({'error':common_message}) + return response + except stripe.error.StripeError as e: + # maybe send email + response.update({'error':common_message}) + return response + except Exception as e: + # maybe send email + response.update({'error':common_message}) + return response + return handleProblems + + class StripeUtils(object): CURRENCY = 'chf' @@ -12,18 +60,18 @@ class StripeUtils(object): self.stripe = stripe self.stripe.api_key = settings.STRIPE_API_PRIVATE_KEY + @handleStripeError def create_customer(self, token, email): - stripe.api_key = settings.STRIPE_API_PRIVATE_KEY - customer = stripe.Customer.create( + customer = self.stripe.Customer.create( source=token, description='description for testing', email=email ) return customer + @handleStripeError def make_charge(self, amount=None, customer=None): amount = int(amount * 100) # stripe amount unit, in cents - charge = self.stripe.Charge.create( amount=amount, # in cents currency=self.CURRENCY, @@ -31,6 +79,7 @@ class StripeUtils(object): ) return charge + @handleStripeError def create_plan(self, amount, name, id): self.stripe.Plan.create( amount=amount, From 3459dc6cbcdb9566956ff63604820eefbb0c3c02 Mon Sep 17 00:00:00 2001 From: Levi Date: Fri, 29 Apr 2016 01:53:24 -0500 Subject: [PATCH 2/6] =?UTF-8?q?Fixes=20digitalglarus=20urls,=20Added=20tra?= =?UTF-8?q?nslated=20text=20to=20ungleich=20landing=20page,=20Create=20use?= =?UTF-8?q?r=E2=80=99s=20order=20template,=20Created=20view=20=20to=20=20l?= =?UTF-8?q?ist=20all=20user=E2=80=99s=20orders,=20Adding=20some=20style=20?= =?UTF-8?q?to=20pricing=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- digitalglarus/urls.py | 4 +- hosting/static/hosting/css/pricing.css | 14 + hosting/templates/hosting/base_short.html | 25 +- hosting/templates/hosting/checkout.html | 158 ------- .../templates/hosting/includes/_header.html | 2 +- .../templates/hosting/includes/_pricing.html | 29 +- hosting/templates/hosting/index.html | 391 ------------------ hosting/templates/hosting/orders.html | 36 ++ hosting/urls.py | 9 +- hosting/views.py | 28 +- ungleich_page/locale/de/LC_MESSAGES/django.mo | Bin 611 -> 2551 bytes ungleich_page/locale/de/LC_MESSAGES/django.po | 63 ++- .../ungleich_page/base_ungleich.html | 78 ---- .../templates/ungleich_page/contact.html | 38 -- .../ungleich_page/includes/_contact_us.html | 2 +- .../templates/ungleich_page/index.html | 3 - .../templates/ungleich_page/page.html | 5 - ungleich_page/urls.py | 1 + 18 files changed, 149 insertions(+), 737 deletions(-) delete mode 100644 hosting/templates/hosting/checkout.html delete mode 100644 hosting/templates/hosting/index.html create mode 100644 hosting/templates/hosting/orders.html delete mode 100644 ungleich_page/templates/ungleich_page/base_ungleich.html delete mode 100644 ungleich_page/templates/ungleich_page/contact.html delete mode 100644 ungleich_page/templates/ungleich_page/index.html delete mode 100644 ungleich_page/templates/ungleich_page/page.html diff --git a/digitalglarus/urls.py b/digitalglarus/urls.py index 4270fe2b..99216b8a 100644 --- a/digitalglarus/urls.py +++ b/digitalglarus/urls.py @@ -6,8 +6,8 @@ from .views import ContactView, IndexView, AboutView urlpatterns = [ # url(r'^$', IndexView.as_view(), name='home'), - url(_(r'home/?$'), IndexView.as_view(), name='home'), - url(_(r'about/?$'), AboutView.as_view(), name='about'), + # url(_(r'home/?$'), IndexView.as_view(), name='home'), + # url(_(r'about/?$'), AboutView.as_view(), name='about'), url(_(r'contact/?$'), ContactView.as_view(), name='contact'), url(_(r'supporters/?$'), views.supporters, name='supporters'), url(r'calendar_api/(?P\d+)/(?P\d+)?$',views.CalendarApi.as_view()), diff --git a/hosting/static/hosting/css/pricing.css b/hosting/static/hosting/css/pricing.css index 870b3cf9..7fb6f51f 100644 --- a/hosting/static/hosting/css/pricing.css +++ b/hosting/static/hosting/css/pricing.css @@ -1,3 +1,7 @@ +.pricing-container{ + margin-left: 5%; +} + .pricing { text-align: center; border: 1px solid #f0f0f0; @@ -7,6 +11,8 @@ margin-bottom: 30px; font-family: 'Lato'; } + + .pricing img { display: block; margin: auto; @@ -23,6 +29,13 @@ .pricing li + li { border-top: 1px solid #f0f0f0; } + +.pricing li.type { + list-style: none; + padding: 13px; + height: 200px; +} + .pricing big { font-size: 32px; } @@ -81,6 +94,7 @@ .pricing .short-input{ min-width: 0; width: 90px; + display: inline; } .p-red button { diff --git a/hosting/templates/hosting/base_short.html b/hosting/templates/hosting/base_short.html index 3ffca138..fabfa030 100644 --- a/hosting/templates/hosting/base_short.html +++ b/hosting/templates/hosting/base_short.html @@ -55,20 +55,25 @@ @@ -93,20 +98,20 @@
  • - How it works
  • + How it works
  • - Your infrastructure
  • + Your infrastructure
  • - Our infrastructure
  • + Our infrastructure
  • - Pricing + Pricing
  • - Contact + Contact
  • diff --git a/hosting/templates/hosting/checkout.html b/hosting/templates/hosting/checkout.html deleted file mode 100644 index 90ff2bc7..00000000 --- a/hosting/templates/hosting/checkout.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - Rails Hosting.ch - Ruby on Rails as easy as possible - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
     
    -
    -

    Check Out

    -
    - -
      -
    • -

      OS : Ubuntu 14.04

      -
    • -
    • -

      RAM : 1GiB

    • -
    • CPU Cores : 4

    • -
    • Additional Disk: 20 GB -

    - -
    -
    -

     

    -
    - -

    -
      - -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - diff --git a/hosting/templates/hosting/includes/_header.html b/hosting/templates/hosting/includes/_header.html index a75e797c..9e609816 100644 --- a/hosting/templates/hosting/includes/_header.html +++ b/hosting/templates/hosting/includes/_header.html @@ -13,7 +13,7 @@
    • - how it works + how it works
    • Let me start diff --git a/hosting/templates/hosting/includes/_pricing.html b/hosting/templates/hosting/includes/_pricing.html index e782ce47..98e90196 100644 --- a/hosting/templates/hosting/includes/_pricing.html +++ b/hosting/templates/hosting/includes/_pricing.html @@ -1,11 +1,11 @@ -
      -
      +
      +
      -
      +

      -

      Hosting Price Samples

      +

      Hosting Price

      Here are samples of our {{ hosting_long }} hosting offers, suited for different projects. Our offer examples come in different size, speed, and storage.

      @@ -13,18 +13,19 @@
      +
      -
      +
      {% for vm in vm_types %} -
      +
      {% csrf_token %}
        -
      • +
      • {{vm.hosting_company_name}}

      • @@ -44,7 +45,7 @@
    • -
    • +
    • @@ -59,11 +60,13 @@
    • -
    • -
      - - - GiB +
    • +
      +
      + + + GiB +
    • diff --git a/hosting/templates/hosting/index.html b/hosting/templates/hosting/index.html deleted file mode 100644 index 446534d4..00000000 --- a/hosting/templates/hosting/index.html +++ /dev/null @@ -1,391 +0,0 @@ -{% load staticfiles %} - - - - - - - - - - - - - Rails Hosting.ch - Ruby on Rails as easy as possible - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      - -
      -
      - -
      - -

      rails-hosting.ch

      -

      Ruby on Rails as easy as possible

      -
      - -
      -
      -
      - -
      - - -
      - - - - -
      - -
      - -
      -
      -
      -
      -

      How it works :

        -
      • -

        Ubuntu 14.04 as the operating system, full root access!

        -
      • -
      • rbenv to let you decide which Ruby version you want to use

      • -
      • nginx as the frontend Server (optional with SSL Support)

      • -
      • unicorn to have your application talk to nginx and vice versa -

      • PostgreSQL as the database

        -
      -
      -
      - -
      -
      - -
      - - -
      - -
      -
      -
      -
      -
      -
      -

      Option 1 : Your own infrastructure

      -

      We configure your own infrastructure for Ruby on Rails. Keep the comfort and safety of being at your home, while we set things up for you.

      -
      -
      - -
      -
      - -
      - -
      - - - - -
      - -
      - -
      -
      -
      -
      -

      Option 2 : Our infrastructure

      -

      We take care of everything for you! You don't need your infrastructure. We give you everything you need in Ruby on Rails hosting. Full root access, 24x7 support.

      -
      -
      - -
      -
      - -
      - - -
      - - - -
      - -
      - -
      -
      -
      -
      -

      Hosting Price Samples

      -

      Here are samples of our Ruby on Rails hosting offers, suited for different projects. Our offer examples come in different size, speed, and storage.

      -
      - -
      -
      -
      - - - -
      - -
      -
      - -
      -

      Economy

      -

      Suited for smaller applications

      -

      1 core,

      -

      1 GiB RAM,

      -

      10 GiB system image (25 CHF)

      -

      - Buy Now! More Info

      -
      -
      -
      - -
      -
      - -
      -

      Standard

      -

      Suited for standard Ruby on Rails applications

      -

      1 core,

      -

      2 GiB RAM,

      -

      10 GiB system image (30 CHF)

      -

      - Buy Now! More Info -

      -
      -
      -
      - -
      -
      - -
      -

      Deluxe

      -

      Suited for performance critical project

      -

      2 cores,

      -

      4 GiB Ram,

      -

      10 GiB system image (50 CHF)

      -

      - Buy Now! More Info

      -
      -
      -
      - -
      -
      - -
      -

      Presidential Premium

      -

      Suited for performance critical &

      -

      high storage demand projects

      -

      4 Cores, 8 GiB RAM, 10 GiB System image,

      -

      100 GiB Data image (190 CHF)

      -

      - Buy Now! More Info -

      -
      -
      -
      - -
      - -
      - -
      - - -
      - - -
      -
      - -
      -
      - -
      -

      Let me try!

      -

       

      -

       

      - {% if error_message %}

      {{ error_message }}

      {% endif %} - {{ form.non_field_errors }} - {{ form.email.errors }} - - {% csrf_token %} -
      - - -
      - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hosting/templates/hosting/orders.html b/hosting/templates/hosting/orders.html new file mode 100644 index 00000000..df5e6216 --- /dev/null +++ b/hosting/templates/hosting/orders.html @@ -0,0 +1,36 @@ +{% extends "hosting/base_short.html" %} +{% load staticfiles bootstrap3 %} +{% block content %} +
    +
    +
    +
    + + + + + + + + + + + + {% for order in orders %} + + + + + + + {% endfor %} + +
    My orders.
    #DateAmountStatus
    {{order.id}}{{order.created_at}}{{order.VMPlan.price}}{{order.approved}}
    +
    + +
    +
    + +
    + +{%endblock%} \ No newline at end of file diff --git a/hosting/urls.py b/hosting/urls.py index f50b7a2f..9f18e836 100644 --- a/hosting/urls.py +++ b/hosting/urls.py @@ -2,15 +2,18 @@ from django.conf.urls import url from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \ NodeJSHostingView, LoginView, SignupView, IndexView, \ - InvoiceVMView + InvoiceVMView, OrdersHostingView urlpatterns = [ url(r'index/?$', IndexView.as_view(), name='index'), url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), url(r'rails/?$', RailsHostingView.as_view(), name='railshosting'), - url(r'login/?$', LoginView.as_view(), name='login'), - url(r'signup/?$', SignupView.as_view(), name='signup'), url(r'payment/?$', PaymentVMView.as_view(), name='payment'), url(r'invoice/?$', InvoiceVMView.as_view(), name='invoice'), + url(r'orders/?$', OrdersHostingView.as_view(), name='orders'), + url(r'login/?$', LoginView.as_view(), name='login'), + url(r'signup/?$', SignupView.as_view(), name='signup'), + url(r'^logout/?$', 'django.contrib.auth.views.logout', + {'next_page': '/ungleich_page'}, name='logout') ] diff --git a/hosting/views.py b/hosting/views.py index 75ce03eb..ecebdd80 100644 --- a/hosting/views.py +++ b/hosting/views.py @@ -1,6 +1,9 @@ from django.shortcuts import get_object_or_404, render from django.core.urlresolvers import reverse_lazy, reverse +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.decorators import login_required +from django.utils.decorators import method_decorator from django.views.generic import View, CreateView, FormView from django.shortcuts import redirect @@ -214,9 +217,9 @@ class PaymentVMView(FormView): else: return self.form_invalid(form) - -class InvoiceVMView(View): +class InvoiceVMView(LoginRequiredMixin, View): template_name = "hosting/invoice.html" + login_url = reverse_lazy('hosting:login') def get_context_data(self, **kwargs): charge = self.request.session.get('charge') @@ -246,3 +249,24 @@ class InvoiceVMView(View): return render(request, self.template_name, context) + +class OrdersHostingView(LoginRequiredMixin, View): + template_name = "hosting/orders.html" + login_url = reverse_lazy('hosting:login') + + def get_context_data(self, **kwargs): + user = self.request.user + orders = HostingOrder.objects.filter(customer__user=user) + context = { + 'orders':orders + } + + return context + + def get(self, request, *args, **kwargs): + + context = self.get_context_data() + + return render(request, self.template_name, context) + + diff --git a/ungleich_page/locale/de/LC_MESSAGES/django.mo b/ungleich_page/locale/de/LC_MESSAGES/django.mo index 0b16e963c073e6d0f784b498f44f1f4c56dc847b..ef04e0dae6d90fec8960faea3dc5846525199f7d 100644 GIT binary patch literal 2551 zcmai#O>7%Q6vqeX2Lvdzd=<*a3rIjIne%- zo;^s8^*97_`w5WqFM=G$6%cAA9`-k8dzHfn?|DRw0-T^s|mmb*QD2NnA9()R%0=ZsSLC${-d<=XC1P*Sv+F@TIY;i#dxh)9Yw)~V7tg`-v*rhIKZl#+;#^rbq?_e~a5G(iOb;gE zhTOf2>&;qhU0hGjg)fesb>^C|4kCYkZm}jN6VudDYNgkSA?Zj`RoP`7DsJ*J^t9;k z+Fi9eYI*wd6G}}KD;>6Ix>KJaQP7e0GN$QR+SKj%q^?b_snCm=Jk2D|YZHkbq!bqQFteKCFc{nnnj0f6qf3heJ1Is{#P?e zO+z*MKWqzSCLe4SyEi(PsR>)k^#^pVLS;SDr)6n%0wo|yQ(0wDNrCObJ18hMf=kLe zY=<1p=O-`br;Bu{xKJ(4%?>OmPBEysNH>D>Y2<=hlB0q7xmqyEdSXyekY43zba>=M zFnlZ+IZh*|a{PXLco-dn1+}bs^38sii}{71G8YuEZ|8EA(vdgkW{U%56f~$=Xy)2ZtW5iS4)?nQr#!CPv3;<8|UyLxU4Ea(H||tlz9FOIx)P7wt zEnc?0<|0v5D~$Osm)PM7J3iR~uBrC_n?&0yv82q#irPl-gB2BHH_?=Z)CSH`S2&|C zZ0WGwkBpQyO$o;W6%_-VS(ryPY{eQ@vDweDr6CR2iaLm~(ag1Pao@hl{6rV~h zI7enDLC;RwuoJNaukG~KI4igW?e))$$;LZsZ?8{^jbsIKrxiY{7V@Ag3O$(wOPelJ z&0GdP$;+Z=1AxUSBQS(-YOddIS&x~Kt%=re8(1@Io|#N_!(>?C%xDTK^;jlzmuxmm zkb6bxHIX0!v1nj6il7aq!G9Cyp%)fov8EM9viOQ3g%V&C;{R6zid19~4VPt0^Q~C> j{=zZ(-bQ6OBFH_%Tg5*^C}ezOH(K3Gs{gb mWDRFGR4_8MGBDbFo|TW0-y5VSyCgHUC{-aeuXu7jyEg!&8Xm&{ diff --git a/ungleich_page/locale/de/LC_MESSAGES/django.po b/ungleich_page/locale/de/LC_MESSAGES/django.po index 3d564b18..a5cb93c7 100644 --- a/ungleich_page/locale/de/LC_MESSAGES/django.po +++ b/ungleich_page/locale/de/LC_MESSAGES/django.po @@ -20,105 +20,105 @@ msgstr "" #: templates/ungleich_page/includes/_about.html:8 msgid "ABOUT" -msgstr "" +msgstr "Über ungleich" #: templates/ungleich_page/includes/_about.html:9 msgid "The timeline of ungleich" -msgstr "" +msgstr "Die Chronik von ungleich" #: templates/ungleich_page/includes/_about.html:24 msgid "The first incarnation of ungleich" -msgstr "" +msgstr "Die erste Inkarnation von ungleich" #: templates/ungleich_page/includes/_about.html:25 msgid "in Germany" -msgstr "" +msgstr "in Deutschland" #: templates/ungleich_page/includes/_about.html:37 msgid "ungleich founded" -msgstr "" +msgstr "ungleich gegründet" #: templates/ungleich_page/includes/_about.html:38 msgid "in Switzerland" -msgstr "" +msgstr "in der Schweiz" #: templates/ungleich_page/includes/_about.html:51 msgid "ungleich present at various conferences" -msgstr "" +msgstr "ungleich präsent an mehreren Konferenzen" #: templates/ungleich_page/includes/_about.html:65 msgid "ungleich introduces HA-Hosting" -msgstr "" +msgstr "ungleich führt HA-Hosting ein" #: templates/ungleich_page/includes/_about.html:66 msgid "and introduces affordable 24X7 support." -msgstr "" +msgstr "und führt kostengünstigen 24X7 Support ein." #: templates/ungleich_page/includes/_about.html:67 msgid "ungleich launches" -msgstr "" +msgstr "ungleich lanciert" #: templates/ungleich_page/includes/_about.html:68 msgid "Digital Glarus project" -msgstr "" +msgstr "Digital Glarus Projekt" #: templates/ungleich_page/includes/_about.html:74 msgid "and" -msgstr "" +msgstr "und" #: templates/ungleich_page/includes/_about.html:74 msgid "the story continues!" -msgstr "" +msgstr "Die Geschichte geht weiter!" #: templates/ungleich_page/includes/_contact_us.html:14 #: templates/ungleich_page/includes/_contact_us.html:21 views.py:35 msgid "Contact Us" -msgstr "Kontaktiere Uns" +msgstr "Kontaktieren Sie uns" #: templates/ungleich_page/includes/_contact_us.html:16 msgid "Join us at" -msgstr "" +msgstr "Schliessen Sie sich uns an" #: templates/ungleich_page/includes/_contact_us.html:16 msgid "Digital Glarus" -msgstr "" +msgstr "Digital Glarus" #: templates/ungleich_page/includes/_contact_us.html:17 msgid "a great co-working space in the middle of Alps!" -msgstr "" +msgstr "ein wunderschöner Co-Working Space mitten in den Alpen" #: templates/ungleich_page/includes/_contact_us.html:17 msgid "You can contact us at" -msgstr "" +msgstr "Sie können uns kontaktieren unter" #: templates/ungleich_page/includes/_contact_us.html:20 msgid "or" -msgstr "" +msgstr "oder" #: templates/ungleich_page/includes/_contact_us.html:50 msgid "Submit" -msgstr "" +msgstr "Absenden" #: templates/ungleich_page/includes/_footer.html:8 msgid "Copyright © ungleich GmbH " -msgstr "" +msgstr "Copyright © ungleich GmbH" #: templates/ungleich_page/includes/_footer.html:22 msgid "ungleich Home" -msgstr "" +msgstr "ungleich Home" #: templates/ungleich_page/includes/_header.html:11 msgid "We Design, Configure & Maintain
    Your Linux Infrastructure " -msgstr "" +msgstr "Wir designen, erstellen und warten Ihre Linux-Infrastruktur" #: templates/ungleich_page/includes/_portfolio.html:8 #: templates/ungleich_page/includes/_portfolio.html:9 msgid "Hosting Products " -msgstr "" +msgstr "Hosting Produkte" #: templates/ungleich_page/includes/_portfolio.html:16 msgid "HA Hosting" -msgstr "" +msgstr "HA Hosting" #: templates/ungleich_page/includes/_portfolio.html:18 msgid "" @@ -151,11 +151,11 @@ msgstr "" #: templates/ungleich_page/includes/_services.html:8 msgid "our services" -msgstr "" +msgstr "Unsere Dienstleistungen" #: templates/ungleich_page/includes/_services.html:18 msgid "Hosting" -msgstr "" +msgstr "Hosting" #: templates/ungleich_page/includes/_services.html:20 msgid "" @@ -165,7 +165,7 @@ msgstr "" #: templates/ungleich_page/includes/_services.html:28 msgid "Configuration as a Service" -msgstr "" +msgstr "Konfiguration als Service" #: templates/ungleich_page/includes/_services.html:30 msgid "" @@ -186,7 +186,7 @@ msgstr "" #: templates/ungleich_page/includes/_team.html:8 msgid "Why ungleich?*" -msgstr "" +msgstr "Warum ungleich?" #: templates/ungleich_page/includes/_team.html:9 msgid "What our customers say" @@ -257,9 +257,8 @@ msgstr "" #: views.py:25 msgid "Message Successfully Sent" -msgstr "" +msgstr "Nachricht erfolgreich versendet" #: views.py:36 msgid "If you have any question, just send us an email." -msgstr "" -"Wenn Sie irgendwelche Fragen haben, schicken Sie uns einfach eine E-Mail." +msgstr "Wenn Sie irgendwelche Fragen haben, schicken Sie uns einfach eine E-Mail." diff --git a/ungleich_page/templates/ungleich_page/base_ungleich.html b/ungleich_page/templates/ungleich_page/base_ungleich.html deleted file mode 100644 index 49ceefe9..00000000 --- a/ungleich_page/templates/ungleich_page/base_ungleich.html +++ /dev/null @@ -1,78 +0,0 @@ -{% load cms_tags menu_tags sekizai_tags staticfiles bootstrap3 %} - - - - - {% block title %} - {% page_attribute "page_title" %} - {% endblock %} - - {% addtoblock "external-css" %} - {% bootstrap_css %} - - - - - - - - - {% endaddtoblock %} - - {% addtoblock "css" %} - - {% endaddtoblock %} - {% block meta %} - - - {% include 'meta.html' %} - {% endblock %} - {% render_block "external-css" %} - {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %} - - - {% cms_toolbar %} - {% show_menu 0 0 0 1 "cms/ungleichch/_menu.html" %} - - - {% block base_header %} - {% include "ungleich_page/_header_base.html" %} - {% endblock %} -
    -
    -
    - {% block base_content %} - {% placeholder "default" %} - {% endblock %} -
    -
    -
    - - {% include "cms/ungleichch/_footer.html" %} - {% addtoblock "external-js" %} - {% bootstrap_javascript %} - {% endaddtoblock %} - {% addtoblock "js" %} - - -