Merge branch 'master' into feature/3517/ssh_keys

This commit is contained in:
ARvind Tiwari 2017-07-31 18:50:07 +05:30
commit a2f705f012
14 changed files with 170 additions and 109 deletions

View file

@ -1,20 +1,24 @@
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”
* #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
* #3604: [datacenterlight, hosting] Font colour change for better visibility in signup/login/password request footer links
[all] Introduced ENABLE_DEBUG_LOGGING
* #3542: [datacenterlight, hosting] Fixed warning messages and deprecated url
* #3603: [datacenterlight] Removed navbar language option dropdown
* #3629: [datacenterlight] Fixed navbar language switching bug
1.0.21: 2017-07-21 1.0.21: 2017-07-21
* #3591: [datacenterlight, payment] Fixed card holder name to appear on Confirm Order page * #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 * #3581: [datacenterlight] Lead font weight change
* #3584: [all] Add flag is_superuser=True in MyUserManager * #3584: [all] Add flag is_superuser=True in MyUserManager
1.0.20: 2017-07-18 1.0.20: 2017-07-18
* #3590: [digitalglarus] Added impact hub partner logo and text in digitalglarus
[datacenterlight, hosting] Fixed overlapping of date and billing address in the mobile view
* #3580: [datacenterlight, hosting] Introduced newly designed payment page. Cust1.0.20: 2017-07-18
* #3590: [digitalglarus] Added impact hub partner logo and text in digitalglarus * #3590: [digitalglarus] Added impact hub partner logo and text in digitalglarus
[datacenterlight, hosting] Fixed overlapping of date and billing address in the mobile view [datacenterlight, hosting] Fixed overlapping of date and billing address in the mobile view
* #3580: [datacenterlight, hosting] Introduced newly designed payment page. Customized Stripe credit card input fields * #3580: [datacenterlight, hosting] Introduced newly designed payment page. Customized Stripe credit card input fields
* #3568: [all] Improved the way of adding Google analytics (ga) code. We now have ga code for ungleich, digitalglarus, blog, hosting
and datacenterlight
* #3564: [datacenterlight] Improved calculator form validations, both client side and server side
[datacenterlight] Changed "Place order" button to "Submit" in the payment page
* #3540: [datacenterlight] Improved credit card section with Stripe clarification texts and corresponding DE translationsomized Stripe credit card input fields
* #3568: [all] Improved the way of adding Google analytics (ga) code. We now have ga code for ungleich, digitalglarus, blog, hosting * #3568: [all] Improved the way of adding Google analytics (ga) code. We now have ga code for ungleich, digitalglarus, blog, hosting
and datacenterlight and datacenterlight
* #3564: [datacenterlight] Improved calculator form validations, both client side and server side * #3564: [datacenterlight] Improved calculator form validations, both client side and server side

View file

@ -4,9 +4,9 @@ from .views import IndexView, LoginView, ContactView
urlpatterns = [ urlpatterns = [
url(r'^/?$', IndexView.as_view(), name='index'), url(r'^$', IndexView.as_view(), name='index'),
url(r'/login/', LoginView.as_view(), name='login'), url(r'login/', LoginView.as_view(), name='login'),
url(r'/contact', ContactView.as_view(), name='contact'), url(r'contact', ContactView.as_view(), name='contact'),
# url(r'^/beta-program/?$', BetaProgramView.as_view(), name='beta'), # url(r'^/beta-program/?$', BetaProgramView.as_view(), name='beta'),
# url(r'^/landing/?$', LandingProgramView.as_view(), name='landing'), # url(r'^/landing/?$', LandingProgramView.as_view(), name='landing'),
] ]

View file

@ -156,6 +156,14 @@ h6 {
background-color: transparent; background-color: transparent;
} }
.navbar-transparent .navbar-nav>li>.on-hover-border {
transition: all 0.3s linear;
box-shadow: none;
}
.navbar-transparent .navbar-nav>li>.on-hover-border:hover {
box-shadow: 0 0 0 1px #eee;
border-radius: 5px;
}
.navbar-default .btn-link { .navbar-default .btn-link {
box-shadow: none; box-shadow: none;
} }
@ -196,28 +204,46 @@ h6 {
margin-right: 5px; margin-right: 5px;
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
} }
.nav-language .drop-language{ .nav-language .drop-language{
position: absolute; /*position: absolute;*/
top: 45px; top: 45px;
left: -8px; left: auto !important;
background: #fff; /* background: #fff; */
width: 100px; width: 100px;
min-width: 100px;
height: 40px; height: 40px;
padding: 9px 10px; padding: 9px 10px;
-webkit-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); -webkit-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
-moz-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); -moz-box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
box-shadow: -8px 13px 31px -8px rgba(77,77,77,1); box-shadow: -8px 13px 31px -8px rgba(77,77,77,1);
display: none; /*display: none;*/
z-index: 100; z-index: 100;
/* margin-left: 10px; */ /* margin-left: 10px; */
text-align: center; text-align: center;
border-radius: 4px; border-radius: 4px;
} }
.nav-language .open .drop-language{
width: 100px;
min-width: 100px;
}
.nav-language .drop-language a{ .nav-language .drop-language a{
cursor: pointer; cursor: pointer;
font-family: 'Lato', sans-serif; padding: 5px 10px !important;
font-family: 'Lato-Light', sans-serif;
}
/* Show the dropdown menu on hover */
@media (min-width: 769px) {
.nav-language .dropdown:hover .dropdown-menu {
display: block;
}
}
@media (max-width: 767px){
.nav-language .open .dropdown-menu>li>a {
line-height: 1.42857143;
}
} }
.navbar-transparent .nav-language .drop-language{ .navbar-transparent .nav-language .drop-language{
@ -227,13 +253,12 @@ h6 {
.navbar-transparent .nav-language .drop-language a { .navbar-transparent .nav-language .drop-language a {
color: #fff; color: #fff;
padding: 5px 10px !important;
font-family: 'Lato-Light', sans-serif; font-family: 'Lato-Light', sans-serif;
} }
/* .nav-language:hover .drop-language{
.nav-language:hover .drop-language {
display: block; display: block;
} } */
.intro-header { .intro-header {
height: 100vh; height: 100vh;
text-align: center; text-align: center;
@ -1189,7 +1214,7 @@ tech-sub-sec h2 {
color: #777; color: #777;
} }
.nav-language:hover{ .nav-language:hover{
height: 80px; /*height: 80px;*/
} }
.navbar-transparent .nav-language .select-language { .navbar-transparent .nav-language .select-language {
color: #777; color: #777;

View file

@ -91,16 +91,12 @@
var href = $(this).attr('data-url'); var href = $(this).attr('data-url');
$('.navbar-collapse').removeClass('in'); $('.navbar-collapse').removeClass('in');
$('.navbar-collapse').addClass('collapsing'); $('.navbar-collapse').addClass('collapsing');
var url = window.location.pathname; if ($(href).length) {
var urlSplit = url.split('/');
if (urlSplit.length === 3 && urlSplit[2] === 'datacenterlight') {
$('html, body').animate({ $('html, body').animate({
scrollTop: $(href).offset().top scrollTop: $(href).offset().top
}, 1000); }, 1000);
} else { } else {
var allUrl = window.location.href; window.location.href = '/datacenterlight' + href;
var redirect = allUrl.split('whydatacenterlight')
window.location.href = '/en-us/datacenterlight' + href;
} }
}); });
} }

View file

@ -1,6 +1,4 @@
{% load staticfiles i18n%} {% load staticfiles i18n%} {% get_current_language as LANGUAGE_CODE %} {% load custom_tags %}
{% get_current_language as LANGUAGE_CODE %}
{% load custom_tags %}
<nav class="navbar navbar-default navbar-fixed-top topnav"> <nav class="navbar navbar-default navbar-fixed-top topnav">
<div class="topnav"> <div class="topnav">
<!-- Brand and toggle get grouped for better mobile display --> <!-- Brand and toggle get grouped for better mobile display -->
@ -33,14 +31,25 @@
</ul> </ul>
</li> </li>
<li> <li>
<a href="{% url 'datacenterlight:index' %}/whydatacenterlight" >{% trans "Why Data Center Light?" %}</a> <a href="{% url 'datacenterlight:whydatacenterlight' %}" >{% trans "Why Data Center Light?" %}</a>
</li> </li>
<li> <li>
<a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a> <a class="url" href="{% url 'datacenterlight:index' %}#contact" data-url="#contact" >{% trans "Contact" %}</a>
</li> </li>
{% endif %} {% endif %}
<li>
{% if LANGUAGE_CODE == 'en-us'%}
<a class="on-hover-border" href="{% change_lang 'de' %}">Deutsch&nbsp;&nbsp;<i class="fa fa-globe" aria-hidden="true"></i></a>
{% else %}
<a class="on-hover-border" href="{% change_lang 'en-us' %}">English&nbsp;&nbsp;<i class="fa fa-globe" aria-hidden="true"></i></a>
{% endif %}
</li>
{% comment %}
<!-- to be used when more than one option for language -->
<li class="nav-language"> <li class="nav-language">
<div class="select-language"> <div class="dropdown">
<div class="dropdown-toggle select-language" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
{% if LANGUAGE_CODE == 'en-us'%} {% if LANGUAGE_CODE == 'en-us'%}
<span>English</span> <span>English</span>
{% else %} {% else %}
@ -48,18 +57,18 @@
{% endif %} {% endif %}
<i class="fa fa-globe" aria-hidden="true"></i> <i class="fa fa-globe" aria-hidden="true"></i>
</div> </div>
<ul class="dropdown-menu drop-language dropdown-menu-right">
<div class="drop-language">
{% if LANGUAGE_CODE == 'en-us'%} {% if LANGUAGE_CODE == 'en-us'%}
<a href="{% change_lang 'de' %}">Deutsch</a> <li><a class="url" href="{% change_lang 'de' %}">Deutsch</a></li>
{% else %} {% else %}
<a href="{% change_lang 'en-us' %}" >English</a> <li><a class="url" href="{% change_lang 'en-us' %}">English</a></li>
{% endif %} {% endif %}
</div>
</li>
</ul> </ul>
</div><!-- /.navbar-collapse -->
</div> </div>
</li>
{% endcomment %}
</ul>
</div>
<!-- /.navbar-collapse -->
</div> </div>
</nav> </nav>

View file

@ -5,13 +5,13 @@ from .views import IndexView, BetaProgramView, LandingProgramView, BetaAccessVie
urlpatterns = [ urlpatterns = [
url(r'^/?$', IndexView.as_view(), name='index'), url(r'^$', IndexView.as_view(), name='index'),
url(r'^/whydatacenterlight/?$', WhyDataCenterLightView.as_view(), name='whydatacenterlight'), url(r'^whydatacenterlight/?$', WhyDataCenterLightView.as_view(), name='whydatacenterlight'),
url(r'^/beta-program/?$', BetaProgramView.as_view(), name='beta'), url(r'^beta-program/?$', BetaProgramView.as_view(), name='beta'),
url(r'^/landing/?$', LandingProgramView.as_view(), name='landing'), url(r'^landing/?$', LandingProgramView.as_view(), name='landing'),
url(r'^/pricing/?$', PricingView.as_view(), name='pricing'), url(r'^pricing/?$', PricingView.as_view(), name='pricing'),
url(r'^/payment/?$', PaymentOrderView.as_view(), name='payment'), url(r'^payment/?$', PaymentOrderView.as_view(), name='payment'),
url(r'^/order-confirmation/?$', OrderConfirmationView.as_view(), name='order_confirmation'), url(r'^order-confirmation/?$', OrderConfirmationView.as_view(), name='order_confirmation'),
url(r'^/order-success/?$', SuccessView.as_view(), name='order_success'), url(r'^order-success/?$', SuccessView.as_view(), name='order_success'),
url(r'^/beta_access?$', BetaAccessView.as_view(), name='beta_access'), url(r'^beta_access?$', BetaAccessView.as_view(), name='beta_access'),
] ]

View file

@ -1,5 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.contrib.auth import views as auth_views
from . import views from . import views
from .views import ContactView, IndexView, HistoryView, LoginView, SignupView,\ from .views import ContactView, IndexView, HistoryView, LoginView, SignupView,\
@ -20,7 +21,7 @@ urlpatterns = [
url(_(r'contact/?$'), ContactView.as_view(), name='contact'), url(_(r'contact/?$'), ContactView.as_view(), name='contact'),
url(_(r'login/?$'), LoginView.as_view(), name='login'), url(_(r'login/?$'), LoginView.as_view(), name='login'),
url(_(r'signup/?$'), SignupView.as_view(), name='signup'), url(_(r'signup/?$'), SignupView.as_view(), name='signup'),
url(r'^logout/?$', 'django.contrib.auth.views.logout', url(r'^logout/?$', auth_views.logout,
{'next_page': '/digitalglarus/login?logged_out=true'}, name='logout'), {'next_page': '/digitalglarus/login?logged_out=true'}, name='logout'),
url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'), url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',

View file

@ -199,13 +199,11 @@ DATABASES = {
} }
} }
AUTHENTICATION_BACKENDS = ( AUTHENTICATION_BACKENDS = (
'guardian.backends.ObjectPermissionBackend', 'guardian.backends.ObjectPermissionBackend',
'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.ModelBackend',
) )
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/ # https://docs.djangoproject.com/en/1.7/topics/i18n/
@ -464,7 +462,6 @@ META_USE_SITES = True
PARLER_LANGUAGES = {1: ({'code': 'en-us'}, {'code': 'de'},)} PARLER_LANGUAGES = {1: ({'code': 'en-us'}, {'code': 'de'},)}
AUTH_USER_MODEL = 'membership.CustomUser' AUTH_USER_MODEL = 'membership.CustomUser'
# PAYMENT # PAYMENT
STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services" STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services"
@ -481,7 +478,6 @@ STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
ANONYMOUS_USER_NAME = 'anonymous@ungleich.ch' ANONYMOUS_USER_NAME = 'anonymous@ungleich.ch'
GUARDIAN_GET_INIT_ANONYMOUS_USER = 'membership.models.get_anonymous_user_instance' GUARDIAN_GET_INIT_ANONYMOUS_USER = 'membership.models.get_anonymous_user_instance'
############################################# #############################################
# configurations for opennebula-integration # # configurations for opennebula-integration #
############################################# #############################################
@ -508,7 +504,6 @@ OPENNEBULA_PORT = env('OPENNEBULA_PORT')
# default value is /RPC2 # default value is /RPC2
OPENNEBULA_ENDPOINT = env('OPENNEBULA_ENDPOINT') OPENNEBULA_ENDPOINT = env('OPENNEBULA_ENDPOINT')
# dcl email configurations # dcl email configurations
DCL_TEXT = env('DCL_TEXT') DCL_TEXT = env('DCL_TEXT')
DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS')
@ -526,6 +521,28 @@ GOOGLE_ANALYTICS_PROPERTY_IDS = {
'dynamicweb-staging.ungleich.ch': 'staging' 'dynamicweb-staging.ungleich.ch': 'staging'
} }
ENABLE_DEBUG_LOGGING = bool_env('ENABLE_DEBUG_LOGGING')
if ENABLE_DEBUG_LOGGING:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': "{PROJECT_DIR}/debug.log".format(PROJECT_DIR=PROJECT_DIR),
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
DEBUG = bool_env('DEBUG') DEBUG = bool_env('DEBUG')
if DEBUG: if DEBUG:

View file

@ -1,8 +1,8 @@
from django.conf.urls import patterns, include, url from django.conf.urls import include, url
from django.contrib import admin from django.contrib import admin
# deprecated in version 1.8
from django.conf.urls.i18n import i18n_patterns from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static from django.conf.urls.static import static
from django.views import i18n, static as static_view
from django.conf import settings from django.conf import settings
from hosting.views import RailsHostingView, DjangoHostingView, NodeJSHostingView from hosting.views import RailsHostingView, DjangoHostingView, NodeJSHostingView
@ -22,17 +22,17 @@ urlpatterns = [url(r'^index.html$', LandingView.as_view()),
url(r'^nosystemd/', include('nosystemd.urls', namespace="nosystemd")), url(r'^nosystemd/', include('nosystemd.urls', namespace="nosystemd")),
url(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')), url(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')),
url(r'^jsi18n/(?P<packages>\S+?)/$', url(r'^jsi18n/(?P<packages>\S+?)/$',
'django.views.i18n.javascript_catalog'), i18n.javascript_catalog),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# note the django CMS URLs included via i18n_patterns # note the django CMS URLs included via i18n_patterns
urlpatterns += i18n_patterns('', urlpatterns += i18n_patterns(
url(r'^/?$', LandingView.as_view()), url(r'^$', LandingView.as_view()),
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^datacenterlight', include('datacenterlight.urls', namespace="datacenterlight")), url(r'^datacenterlight/', include('datacenterlight.urls', namespace="datacenterlight")),
url(r'^hosting/', RedirectView.as_view( url(r'^hosting/', RedirectView.as_view(
url=reverse_lazy('hosting:login')), name='redirect_hosting_login'), url=reverse_lazy('hosting:login')), name='redirect_hosting_login'),
url(r'^alplora', include('alplora.urls', namespace="alplora")), url(r'^alplora/', include('alplora.urls', namespace="alplora")),
url(r'^membership/', include(membership_urls)), url(r'^membership/', include(membership_urls)),
url(r'^digitalglarus/', include('digitalglarus.urls', url(r'^digitalglarus/', include('digitalglarus.urls',
namespace="digitalglarus")), namespace="digitalglarus")),
@ -43,11 +43,11 @@ urlpatterns += i18n_patterns('',
url(r'^blog/', include('ungleich.urls', namespace='ungleich')), url(r'^blog/', include('ungleich.urls', namespace='ungleich')),
url(r'^', include('cms.urls')) url(r'^', include('cms.urls'))
) )
urlpatterns += patterns('', urlpatterns += [
url(r'^media/(?P<path>.*)$', url(r'^media/(?P<path>.*)$',
'django.views.static.serve', { static_view.serve, {
'document_root': settings.MEDIA_ROOT, 'document_root': settings.MEDIA_ROOT,
}), }),
) ]
if settings.DEBUG: if settings.DEBUG:
urlpatterns += patterns('', url(r'^__debug__/', include(debug_toolbar.urls))) urlpatterns += [url(r'^__debug__/', include(debug_toolbar.urls))]

View file

@ -714,3 +714,8 @@ a.unlink:hover {
width: 100% !important; width: 100% !important;
} }
} }
.footer-light a:hover, .footer-light a:focus, .footer-light a:active {
color: #ddd;
}

View file

@ -119,7 +119,9 @@
</div> </div>
</footer> </footer>
{% else %} {% else %}
<div class="footer-light">
{% include "datacenterlight/includes/_footer.html" %} {% include "datacenterlight/includes/_footer.html" %}
</div>
{% endif %} {% endif %}
<!-- jQuery --> <!-- jQuery -->
<script src="{% static 'hosting/js/jquery.js' %}"></script> <script src="{% static 'hosting/js/jquery.js' %}"></script>

View file

@ -1,4 +1,5 @@
from django.conf.urls import url from django.conf.urls import url
from django.contrib.auth import views as auth_views
from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
NodeJSHostingView, LoginView, SignupView, SignupValidateView, SignupValidatedView, IndexView, \ NodeJSHostingView, LoginView, SignupView, SignupValidateView, SignupValidatedView, IndexView, \
@ -41,7 +42,7 @@ urlpatterns = [
url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'), url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
PasswordResetConfirmView.as_view(), name='reset_password_confirm'), PasswordResetConfirmView.as_view(), name='reset_password_confirm'),
url(r'^logout/?$', 'django.contrib.auth.views.logout', url(r'^logout/?$', auth_views.logout,
{'next_page': '/hosting/login?logged_out=true'}, name='logout'), {'next_page': '/hosting/login?logged_out=true'}, name='logout'),
url(r'^validate/(?P<validate_slug>.*)/$', SignupValidatedView.as_view(), name='validate') url(r'^validate/(?P<validate_slug>.*)/$', SignupValidatedView.as_view(), name='validate')
] ]

View file

@ -1,4 +1,5 @@
from django.conf.urls import url from django.conf.urls import url
from django.contrib.auth import views as auth_views
from .views import LandingView, LoginView, SignupView, PasswordResetView,\ from .views import LandingView, LoginView, SignupView, PasswordResetView,\
PasswordResetConfirmView, DonationView, DonationDetailView, ChangeDonatorStatusDetailView,\ PasswordResetConfirmView, DonationView, DonationDetailView, ChangeDonatorStatusDetailView,\
@ -8,7 +9,7 @@ urlpatterns = [
url(r'^$', LandingView.as_view(), name='landing'), url(r'^$', LandingView.as_view(), name='landing'),
url(r'^login/?$', LoginView.as_view(), name='login'), url(r'^login/?$', LoginView.as_view(), name='login'),
url(r'^signup/?$', SignupView.as_view(), name='signup'), url(r'^signup/?$', SignupView.as_view(), name='signup'),
url(r'^logout/?$', 'django.contrib.auth.views.logout', url(r'^logout/?$', auth_views.logout,
{'next_page': '/nosystemd/login?logged_out=true'}, name='logout'), {'next_page': '/nosystemd/login?logged_out=true'}, name='logout'),
url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'), url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',