digitalglarus booking update
This commit is contained in:
parent
b546300891
commit
ae0c404951
22 changed files with 5935 additions and 3794 deletions
|
@ -84,7 +84,7 @@ table {
|
|||
|
||||
/*select date*/
|
||||
.calendar tbody td:hover {
|
||||
background: #8BC4C9;
|
||||
background: #347D80;
|
||||
color: #f9f9f9;
|
||||
/*border: .1px solid #8BC4C9;*/
|
||||
|
||||
|
|
|
@ -15,15 +15,15 @@
|
|||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="#"><span>Brand</span></a>
|
||||
<a class="navbar-brand" href="#"><span>Digital Glarus</span></a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar-ex-collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="active">
|
||||
<a href="#">Home</a>
|
||||
<a href="{% url 'digitalglarus:index' %}">Home</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">Contacts</a>
|
||||
<a href="{% url 'digitalglarus:contact' %}">Contacts</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from django.db import models
|
||||
from cms.models import CMSPlugin
|
||||
from filer.fields.image import FilerImageField
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
|
||||
class Supporter(models.Model):
|
||||
|
|
71
digitalglarus/static/digitalglarus/css/login.css
Normal file
71
digitalglarus/static/digitalglarus/css/login.css
Normal file
|
@ -0,0 +1,71 @@
|
|||
.user {
|
||||
padding-right: 2%;
|
||||
background-position: 6px 7px;
|
||||
background-repeat: no-repeat;
|
||||
background-color: white;
|
||||
padding: 5px 8px 4px 8px;
|
||||
-webkit-border-radius: 0px 0px 8px 8px;
|
||||
-moz-border-radius: 0px 0px 8px 8px;
|
||||
border-radius: 1px 1px 1px 1px;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
margin-left: 8px;
|
||||
background-color: #333;
|
||||
padding: 4px 4px 0px 4px;
|
||||
-webkit-border-radius: 0px 0px 10px 10px;
|
||||
-moz-border-radius: 0px 0px 10px 10px;
|
||||
border-radius: 0px 0px 10px 10px;
|
||||
font-size: 14px;
|
||||
line-height: 1.42857143;
|
||||
color: #794646;
|
||||
background-color: #fff;
|
||||
|
||||
}
|
||||
|
||||
.user_loggedin{
|
||||
padding-bottom: 2%;
|
||||
padding-right: 2%;
|
||||
background-position: 6px 7px;
|
||||
background-repeat: no-repeat;
|
||||
background-color: white;
|
||||
padding: 5px 8px 4px 8px;
|
||||
-webkit-border-radius: 0px 0px 8px 8px;
|
||||
-moz-border-radius: 0px 0px 8px 8px;
|
||||
border-radius: 1px 1px 1px 1px;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
float: left;
|
||||
margin-left: 8px;
|
||||
background-color: #333;
|
||||
padding: 4px 4px 0px 4px;
|
||||
-webkit-border-radius: 0px 0px 10px 10px;
|
||||
-moz-border-radius: 0px 0px 10px 10px;
|
||||
border-radius: 0px 0px 10px 10px;
|
||||
font-size: 14px;
|
||||
line-height: 1.42857143;
|
||||
color: #777;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.user > span {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.u_P {
|
||||
background-color: #fffcfc;
|
||||
text-transform: uppercase;
|
||||
padding-right: 2%;
|
||||
padding-left:2%;
|
||||
padding-bottom:0.5%;
|
||||
margin-right: 1%;
|
||||
}
|
||||
.u_P a{
|
||||
margin-bottom: 1%;
|
||||
color: #777;
|
||||
}
|
||||
.u_P a:hover{
|
||||
text-decoration: None;
|
||||
color: #000;
|
||||
}
|
|
@ -21,12 +21,15 @@
|
|||
|
||||
<!-- Custom CSS -->
|
||||
<link href="{% static 'digitalglarus/css/business-casual.css' %}" rel="stylesheet">
|
||||
<link href="{% static 'digitalglarus/css/login.css' %}" rel="stylesheet">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800"
|
||||
rel="stylesheet" type="text/css">
|
||||
<link href="//fonts.googleapis.com/css?family=Josefin+Slab:100,300,400,600,700,100italic,300italic,400italic,600italic,700italic"
|
||||
rel="stylesheet" type="text/css">
|
||||
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css"
|
||||
rel="stylesheet" type="text/css">
|
||||
|
||||
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
|
||||
|
@ -37,6 +40,7 @@
|
|||
<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]-->
|
||||
|
||||
<script>
|
||||
(function (i, s, o, g, r, a, m) {
|
||||
i['GoogleAnalyticsObject'] = r;
|
||||
|
@ -58,14 +62,28 @@
|
|||
|
||||
<body>
|
||||
{% cms_toolbar %}
|
||||
<div class="pull-right u_P user">
|
||||
{% if request.user.is_authenticated %}
|
||||
<div class="user_loggedin">
|
||||
<h4>{{ request.user.name }}
|
||||
<a href="{% url 'logout_glarus' %}"><i class="fa fa-1x fa-sign-out"
|
||||
aria-hidden="true"></i></a>
|
||||
</h4>
|
||||
</div>
|
||||
{% else %}
|
||||
<a href="{% url 'login_glarus' %}"><h4>Login</h4></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="brand">Digital Glarus</div>
|
||||
<div class="address-bar">The Swiss IT Valley | Schwanden, 8762 GL Switzerland | From 2015.10.13</div>
|
||||
<div>{% language_chooser "language_chooser.html" %}</div>
|
||||
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar navbar-default" role="navigation">
|
||||
|
||||
<div class="container">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse"
|
||||
data-target="#bs-example-navbar-collapse-1">
|
||||
|
|
|
@ -9,6 +9,8 @@ urlpatterns = [
|
|||
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<month>\d+)/(?P<year>\d+)?$'),views.CalendarApi.as_view()),
|
||||
url(_(r'calendar_api/'),views.CalendarApi.as_view()),
|
||||
url(_(r'support-us/?$'), views.support, name='support'),
|
||||
url(r'^blog/(?P<slug>\w[-\w]*)/$', views.blog_detail, name='blog-detail'),
|
||||
url(r'blog/$', views.blog, name='blog'),
|
||||
|
|
|
@ -9,12 +9,28 @@ from django.views.generic import TemplateView
|
|||
from django.utils.translation import get_language
|
||||
from djangocms_blog.models import Post
|
||||
from django.contrib import messages
|
||||
|
||||
from django.http import JsonResponse
|
||||
from django.views.generic import View
|
||||
|
||||
from .models import Supporter
|
||||
from utils.forms import ContactUsForm
|
||||
from django.views.generic.edit import FormView
|
||||
from membership.calendar.calendar import BookCalendar
|
||||
from membership.models import Calendar as CalendarModel
|
||||
import json
|
||||
from django.contrib.auth import logout
|
||||
|
||||
class CalendarApi(View):
|
||||
def get(self,request,month,year):
|
||||
calendar = BookCalendar(request.user,requested_month=month).formatmonth(int(year),int(month))
|
||||
ret = {'calendar':calendar,'month':month,'year':year}
|
||||
return JsonResponse(ret)
|
||||
|
||||
def post(self,request):
|
||||
pd = json.loads(request.POST.get('data',''))
|
||||
ret = {'status':'success'}
|
||||
CalendarModel.add_dates(pd,request.user)
|
||||
return JsonResponse(ret)
|
||||
|
||||
class ContactView(FormView):
|
||||
template_name = 'contact.html'
|
||||
|
@ -45,17 +61,6 @@ def detail(request, message_id):
|
|||
def about(request):
|
||||
return render(request, 'digitalglarus/about.html')
|
||||
|
||||
|
||||
|
||||
#def index(request):
|
||||
# return render(request, 'digitalglarus/index.html')
|
||||
#
|
||||
#def letscowork(request):
|
||||
# return render(request, 'digitalglarus/letscowork.html')
|
||||
|
||||
# def index(request):
|
||||
# return home(request)
|
||||
|
||||
def home(request):
|
||||
return render(request, 'index.html')
|
||||
|
||||
|
@ -92,3 +97,6 @@ def supporters(request):
|
|||
'supporters': Supporter.objects.order_by('name')
|
||||
}
|
||||
return render(request, 'supporters.html', context)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -282,9 +282,9 @@ CACHES = {
|
|||
}
|
||||
|
||||
if LOGIN_URL is None:
|
||||
LOGIN_URL = APP_ROOT_ENDPOINT + 'accounts/login/'
|
||||
LOGIN_URL = APP_ROOT_ENDPOINT + 'login/'
|
||||
if LOGOUT_URL is None:
|
||||
LOGOUT_URL = APP_ROOT_ENDPOINT + 'accounts/logout/'
|
||||
LOGOUT_URL = APP_ROOT_ENDPOINT + 'logout/'
|
||||
if LOGIN_REDIRECT_URL is None:
|
||||
LOGIN_REDIRECT_URL = APP_ROOT_ENDPOINT
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@ urlpatterns += i18n_patterns('',
|
|||
url(r'^digitalglarus/', include('digitalglarus.urls',
|
||||
namespace="digitalglarus"),name='digitalglarus'),
|
||||
url(r'^blog/',include('ungleich.urls',namespace='ungleich')),
|
||||
url(r'^',include('ungleich_page.urls',namespace='ungleich_page'),name="ungleich_page"),
|
||||
url(r'^login/',include(membership_urls)),
|
||||
url(r'^$',include('ungleich_page.urls',namespace='ungleich_page'),name="ungleich_page"),
|
||||
url(r'^', include('cms.urls')),
|
||||
)
|
||||
|
||||
|
|
1
membership/calendar/__init__.py
Normal file
1
membership/calendar/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
__author__ = 'tomislav'
|
136
membership/calendar/calendar.py
Normal file
136
membership/calendar/calendar.py
Normal file
|
@ -0,0 +1,136 @@
|
|||
from calendar import month_name, day_abbr
|
||||
from calendar import Calendar
|
||||
from membership.models import Calendar as CalendarModel
|
||||
import datetime
|
||||
|
||||
now = datetime.datetime.now()
|
||||
|
||||
|
||||
class CustomCalendar(Calendar):
|
||||
def __init__(self):
|
||||
super(CustomCalendar, self).__init__(firstweekday=0)
|
||||
|
||||
def itermonthdays(self, year, month):
|
||||
"""
|
||||
Like itermonthdates(), but will yield day numbers. For days outside
|
||||
the specified month the day number.
|
||||
"""
|
||||
for date in self.itermonthdates(year, month):
|
||||
yield date.day
|
||||
|
||||
def itermonthdays2(self, year, month):
|
||||
"""
|
||||
Like itermonthdates(), but will yield (day number, weekday number)
|
||||
tuples. For days outside the specified month the day number is 0.
|
||||
"""
|
||||
for date in self.itermonthdates(year, month):
|
||||
yield (date.day, date.weekday(), date.month)
|
||||
|
||||
|
||||
class CustomHTMLCalendar(CustomCalendar):
|
||||
"""
|
||||
This calendar returns complete HTML pages.
|
||||
"""
|
||||
|
||||
# CSS classes for the day <td>s
|
||||
|
||||
def __init__(self, requested_month):
|
||||
self.requested_month = requested_month
|
||||
super(CustomHTMLCalendar, self).__init__()
|
||||
|
||||
def formatday(self, day, weekday, month=None,year=None):
|
||||
"""
|
||||
Return a day as a table cell.
|
||||
"""
|
||||
|
||||
booked = CalendarModel.objects.filter(user_id=self.user.id)
|
||||
is_booked= booked.filter(datebooked=datetime.date(day=day,month=month,year=year))
|
||||
|
||||
if month < int(self.requested_month):
|
||||
return '<td class="prev-month %s">%d</td>' % ("selected" if is_booked else "",day)
|
||||
elif month > int(self.requested_month):
|
||||
return '<td class="next-month %s">%d</td>' % ("selected" if is_booked else "",day)
|
||||
else:
|
||||
return '<td class="%s">%d</td>' % ("selected" if is_booked else "",day)
|
||||
|
||||
def formatweek(self, theweek,year):
|
||||
"""
|
||||
Return a complete week as a table row.
|
||||
"""
|
||||
s = ''.join(self.formatday(d, wd, month,year) for (d, wd, month) in theweek)
|
||||
return '<tr>%s</tr>' % s
|
||||
|
||||
def formatmonthname(self, theyear, themonth, withyear=True):
|
||||
"""
|
||||
Return a month name as a table row.
|
||||
"""
|
||||
if withyear:
|
||||
s = '%s %s' % (month_name[themonth], theyear)
|
||||
else:
|
||||
s = '%s' % month_name[themonth]
|
||||
return '<tr><th colspan="7" class="month">%s</th></tr>' % s
|
||||
|
||||
def add_before(self):
|
||||
return '<a class="btn-prev fontawesome-angle-left" href="#"></a>'
|
||||
|
||||
def add_after(self):
|
||||
return '<a class="btn-next fontawesome-angle-right" href="#"></a>'
|
||||
|
||||
def formatmonth(self, theyear, themonth, withyear=True):
|
||||
"""
|
||||
Return a formatted month as a table.
|
||||
"""
|
||||
v = []
|
||||
a = v.append
|
||||
a('<table border="0" cellpadding="0" cellspacing="0" class="month">')
|
||||
a('\n')
|
||||
a(self.add_before())
|
||||
a('\n')
|
||||
a(self.formatmonthname(theyear, themonth, withyear=withyear))
|
||||
a('\n')
|
||||
a(self.add_after())
|
||||
a('\n')
|
||||
a(self.formatweekheader())
|
||||
a('\n')
|
||||
for week in self.monthdays2calendar(theyear, themonth):
|
||||
a(self.formatweek(week,theyear))
|
||||
a('\n')
|
||||
a('</table>')
|
||||
a('\n')
|
||||
a('<span id="datesbooked"></span>')
|
||||
return ''.join(v)
|
||||
|
||||
|
||||
class BookCalendar(CustomHTMLCalendar):
|
||||
def __init__(self, user,requested_month):
|
||||
self.user=user
|
||||
super(BookCalendar, self).__init__(requested_month)
|
||||
|
||||
def formatmonth(self, year, month):
|
||||
self.year, self.month = year, month
|
||||
return super(BookCalendar, self).formatmonth(year, month)
|
||||
|
||||
def day_cell(self, cssclass, body):
|
||||
return '<td>%s</td>' % body
|
||||
|
||||
def formatmonthname(self, theyear, themonth, withyear):
|
||||
"""
|
||||
Return a month name as a table row.
|
||||
"""
|
||||
s = '%s' % month_name[themonth]
|
||||
return '<span id="monthtitle">%s</span>' % s
|
||||
|
||||
def formatweekday(self, day):
|
||||
"""
|
||||
Return a weekday name as a table header.
|
||||
"""
|
||||
|
||||
ret = '<td>%s</td>' % day_abbr[day][0:2]
|
||||
return ret
|
||||
|
||||
def formatweekheader(self):
|
||||
"""
|
||||
Return a header for a week as a table row.
|
||||
"""
|
||||
s = ''.join(self.formatweekday(i) for i in self.iterweekdays())
|
||||
return '<thead>%s</thead>' % s
|
35
membership/migrations/0003_auto_20160422_1002.py
Normal file
35
membership/migrations/0003_auto_20160422_1002.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.4 on 2016-04-22 10:02
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('sites', '0002_alter_domain_unique'),
|
||||
('membership', '0002_auto_20160324_2336'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Calendar',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('datebooked', models.DateField()),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='customuser',
|
||||
name='site',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='sites.Site'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='calendar',
|
||||
name='user',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
|
@ -1,3 +1,5 @@
|
|||
from datetime import datetime
|
||||
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, AbstractUser
|
||||
|
@ -5,6 +7,7 @@ from django.contrib.auth.hashers import make_password
|
|||
from django.core.mail import send_mail
|
||||
from django.core.validators import RegexValidator
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.sites.models import Site
|
||||
|
||||
REGISTRATION_MESSAGE = {'subject': "Validation mail",
|
||||
'message': 'Please validate Your account under this link http://localhost:8000/en-us/login/validate/{}',
|
||||
|
@ -43,6 +46,7 @@ class MyUserManager(BaseUserManager):
|
|||
|
||||
class CustomUser(AbstractBaseUser):
|
||||
VALIDATED_CHOICES = ((0, 'Not validated'), (1, 'Validated'))
|
||||
site = models.ForeignKey(Site, default=1)
|
||||
name = models.CharField(max_length=50)
|
||||
email = models.EmailField(unique=True)
|
||||
|
||||
|
@ -125,3 +129,24 @@ class CreditCards(models.Model):
|
|||
'Use this pattern(MM/YYYY).'))])
|
||||
ccv = models.CharField(max_length=4, validators=[RegexValidator(r'\d{3,4}', _('Wrong CCV number.'))])
|
||||
payment_type = models.CharField(max_length=5, default='N')
|
||||
|
||||
|
||||
class Calendar(models.Model):
|
||||
datebooked = models.DateField()
|
||||
user = models.ForeignKey(CustomUser)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
if kwargs.get('datebooked'):
|
||||
user = kwargs.get('user')
|
||||
kwargs['datebooked'] = datetime.strptime(kwargs.get('datebooked', ''), '%d,%m,%Y')
|
||||
self.user_id = user.id
|
||||
super(Calendar, self).__init__(*args, **kwargs)
|
||||
|
||||
@classmethod
|
||||
def add_dates(cls,dates,user):
|
||||
old_dates = Calendar.objects.filter(user_id=user.id)
|
||||
if old_dates:
|
||||
old_dates.delete()
|
||||
for date in dates:
|
||||
Calendar.objects.create(datebooked=date,user=user)
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
168
membership/static/stylesheet.css
Normal file
168
membership/static/stylesheet.css
Normal file
|
@ -0,0 +1,168 @@
|
|||
@charset "utf-8";
|
||||
/* CSS Document */
|
||||
|
||||
/* ---------- FONTAWESOME ---------- */
|
||||
/* ---------- http://fortawesome.github.com/Font-Awesome/ ---------- */
|
||||
/* ---------- http://weloveiconfonts.com/ ---------- */
|
||||
|
||||
@import url(http://weloveiconfonts.com/api/?family=fontawesome);
|
||||
|
||||
*[class*="fontawesome-"]:before {
|
||||
font-family: 'FontAwesome', sans-serif;
|
||||
}
|
||||
|
||||
/* ---------- GENERAL ---------- */
|
||||
|
||||
/*body {*/
|
||||
/*background: #f9f9f9;*/
|
||||
/*color: #0e171c;*/
|
||||
/*font: 300 100%/1em 'Lato', sans-serif;*/
|
||||
/*margin: 0;*/
|
||||
/*}*/
|
||||
/**/
|
||||
/*a {*/
|
||||
/*text-decoration: none;*/
|
||||
/*}*/
|
||||
|
||||
/*Month size*/
|
||||
#monthtitle {
|
||||
font-size: 1.2em;
|
||||
line-height: 1.25em;
|
||||
margin: .25em 0;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
margin: .33em 0;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
margin:auto;
|
||||
|
||||
}
|
||||
|
||||
/*.container {*/
|
||||
/*height: 358px;*/
|
||||
/*left: 50%;*/
|
||||
/*margin: -255px 0 0 -245px;*/
|
||||
/*position: absolute;*/
|
||||
/*top: 50%;*/
|
||||
/*width: 340px;*/
|
||||
/*}*/
|
||||
|
||||
/* ---------- CALENDAR ---------- */
|
||||
|
||||
.calendar {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.calendar header {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.calendar #monthtitle {
|
||||
text-transform: uppercase;
|
||||
color: #1A6687;
|
||||
}
|
||||
|
||||
#datesbooked{
|
||||
color:#1a6687;
|
||||
padding-top: 2px;
|
||||
}
|
||||
/*Title*/
|
||||
.calendar thead {
|
||||
font-weight: 500;
|
||||
/*text-transform: uppercase;*/
|
||||
color: #8BC4C9;
|
||||
/*margin-bottom:1px;*/
|
||||
|
||||
}
|
||||
|
||||
/*Body text*/
|
||||
.calendar tbody {
|
||||
color: #7c8a95;
|
||||
}
|
||||
|
||||
/*select date*/
|
||||
.calendar tbody td:hover {
|
||||
background: #8BC4C9;
|
||||
color: #f9f9f9;
|
||||
/*border: .1px solid #8BC4C9;*/
|
||||
|
||||
/*border-radius: 50%;*/
|
||||
}
|
||||
.selected{
|
||||
background: #6b9699;
|
||||
color: #f9f9f9;
|
||||
}
|
||||
.calendar thead>tr>td{
|
||||
border-top:hidden;
|
||||
border-left:hidden;
|
||||
border-right: hidden;
|
||||
}
|
||||
|
||||
.calendar td {
|
||||
border: .1px solid #cbd1d2;
|
||||
/*border-radius: 50%;*/
|
||||
display: inline-block;
|
||||
height: 2.5em;
|
||||
line-height: 2.5em;
|
||||
text-align: center;
|
||||
width: 2.5em;
|
||||
|
||||
}
|
||||
|
||||
.calendar .prev-month,
|
||||
.calendar .next-month {
|
||||
/*border: .1px solid #cbd1d2;*/
|
||||
color: #cbd1d2;
|
||||
|
||||
}
|
||||
|
||||
.calendar .prev-month:hover,
|
||||
.calendar .next-month:hover {
|
||||
border: .5px solid #cbd1d2;
|
||||
background: #cbd1d2;
|
||||
color: #f9f9f9;
|
||||
}
|
||||
|
||||
/*Today*/
|
||||
.current-day {
|
||||
color: #8BC4C9;
|
||||
/*background-color: #8BC4C9;*/
|
||||
}
|
||||
|
||||
|
||||
/*Next,Prev month*/
|
||||
.btn-prev,
|
||||
.btn-next {
|
||||
border: 1px solid transparent;
|
||||
color: #8BC4C9;
|
||||
font-size: 1.5em;
|
||||
padding: 1em;
|
||||
/*height: .7em;*/
|
||||
/*line-height: .3em;*/
|
||||
/*margin: auto;*/
|
||||
/*position: absolute;*/
|
||||
/*top: .1em;*/
|
||||
/*width: 25em;*/
|
||||
}
|
||||
|
||||
|
||||
.btn-prev:hover,
|
||||
.btn-next:hover {
|
||||
background: none;
|
||||
color: #1A6687;
|
||||
}
|
||||
|
||||
.btn-prev {
|
||||
left: 6em;
|
||||
}
|
||||
|
||||
.btn-next {
|
||||
right: 6em;
|
||||
}
|
112
membership/templates/calendar/calendar.html
Normal file
112
membership/templates/calendar/calendar.html
Normal file
|
@ -0,0 +1,112 @@
|
|||
<script type="text/javascript">
|
||||
var date = new Date();
|
||||
var month = date.getMonth() + 1;
|
||||
var year = date.getFullYear();
|
||||
var selected_dates = [];
|
||||
var monthly_selected_dates = [];
|
||||
|
||||
$("#myModal").ready(function () {
|
||||
$.get('/digitalglarus/calendar_api/' + month + '/' + year, function (data) {
|
||||
$(".calendar").html(data.calendar)
|
||||
calendar_refresh();
|
||||
//calendar fields
|
||||
$(".calendar").on('click', 'td', function () {
|
||||
if (this.className != 'prev-month' && this.className != 'next-month') {
|
||||
if ($(this).className == 'selected') {
|
||||
date_text = this.textContent + "," +//day
|
||||
(date.getMonth() + 1).toString() + "," +
|
||||
date.getFullYear().toString();
|
||||
monthly_selected_dates.splice(monthly_selected_dates.indexOf(date_text), 1);
|
||||
}
|
||||
$(this).toggleClass('selected');
|
||||
}
|
||||
updateSelectedDates();
|
||||
})
|
||||
});
|
||||
})
|
||||
|
||||
</script>
|
||||
<div class="container">
|
||||
<div class="calendar">
|
||||
</div>
|
||||
<!-- end calendar -->
|
||||
</div> <!-- end container -->
|
||||
<script type="text/javascript">
|
||||
function updateSelectedDates() {
|
||||
monthly_selected_dates = [];
|
||||
$("tr>td.selected").each(function () {
|
||||
date_text = this.textContent + "," +//day
|
||||
(date.getMonth() + 1).toString() + "," +
|
||||
date.getFullYear().toString();
|
||||
if (monthly_selected_dates.indexOf(date_text) == -1)
|
||||
monthly_selected_dates.push(date_text);
|
||||
});
|
||||
console.log("monthly:");
|
||||
console.log(monthly_selected_dates);
|
||||
console.log("all:")
|
||||
console.log(selected_dates);
|
||||
}
|
||||
languageCode = $('body').attr('lang')
|
||||
function updateCurrentSelectedDates() {
|
||||
$("tbody>tr>td[class='']").each(function (i, el) {
|
||||
date_text = this.textContent + "," +//day
|
||||
(date.getMonth() + 1).toString() + "," +
|
||||
date.getFullYear().toString();
|
||||
if (selected_dates.indexOf(date_text) != -1) {
|
||||
$(this).addClass('selected');
|
||||
}
|
||||
});
|
||||
}
|
||||
function insertUnique() {
|
||||
selected_dates.push.apply(selected_dates, monthly_selected_dates);
|
||||
unique = []
|
||||
$.each(selected_dates, function (i, el) {
|
||||
if ($.inArray(el, unique) === -1) unique.push(el);
|
||||
});
|
||||
selected_dates = unique;
|
||||
}
|
||||
|
||||
function calendar_refresh() {
|
||||
$("#myModal")
|
||||
.on('click', 'a.btn-prev,a.btn-next', function () {
|
||||
if (/btn-prev/i.test(this.className)) {
|
||||
date.setMonth(date.getMonth() - 1);
|
||||
} else {
|
||||
date.setMonth(date.getMonth() + 1)
|
||||
}
|
||||
insertUnique();
|
||||
|
||||
$.get('/' + languageCode + '/digitalglarus/calendar_api/' + (date.getMonth() + 1) + '/' + date.getFullYear(),
|
||||
function (data) {
|
||||
$(".calendar").html(data.calendar);
|
||||
updateCurrentSelectedDates();
|
||||
});
|
||||
})
|
||||
.on('click', '#bookdate', function () {
|
||||
|
||||
insertUnique();
|
||||
if (selected_dates.length) {
|
||||
$.ajaxSetup({
|
||||
beforeSend: function (xhr, settings) {
|
||||
if (!this.crossDomain) {
|
||||
xhr.setRequestHeader("X-CSRFToken", '{{ csrf_token }}');
|
||||
}
|
||||
}
|
||||
});
|
||||
postData = {data: JSON.stringify(selected_dates)}
|
||||
console.log(postData)
|
||||
$.post('/' + languageCode + '/digitalglarus/calendar_api/', postData, function (data) {
|
||||
if (data.status == 'success') {
|
||||
$('#datesbooked').html("Dates booked!");
|
||||
setTimeout(function () {
|
||||
$('#close').click();
|
||||
location.reload();
|
||||
}, 800)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
$('#datesbooked').html("Please select date.");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
|
@ -36,7 +36,7 @@
|
|||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<a class="btn btn-primary" href="{% url 'login' %}">Back</a>
|
||||
<a class="btn btn-primary" href="{% url 'login_glarus' %}">Back</a>
|
||||
</div>
|
||||
</div>
|
||||
<a hrefhelp@digitalglarus.ch<="" p="">
|
||||
|
|
|
@ -20,15 +20,15 @@
|
|||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="#"><span>Brand</span></a>
|
||||
<a class="navbar-brand" href="#"><span>Digital Glarus</span></a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar-ex-collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="active">
|
||||
<a href="#">Home</a>
|
||||
<a href="{% url 'digitalglarus:index' %}">Home</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">Contacts</a>
|
||||
<a href="{% url 'digitalglarus:contact' %}">Contacts</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -1,17 +1,33 @@
|
|||
<html><head>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
|
||||
<script type="text/javascript"
|
||||
src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
|
||||
<script type="text/javascript"
|
||||
src="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
|
||||
<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css"
|
||||
rel="stylesheet" type="text/css">
|
||||
{% load static %}
|
||||
<link href="{% get_static_prefix %}membership.css" rel="stylesheet" type="text/css">
|
||||
</head><body>
|
||||
<link href="{% get_static_prefix %}stylesheet.css" rel="stylesheet" type="text/css">
|
||||
|
||||
</head>
|
||||
<body lang="{{ language_code }}">
|
||||
<div class="cover">
|
||||
<div class="navbar">
|
||||
<div class="pull-right u_P user">
|
||||
{% if request.user.is_authenticated %}
|
||||
<div class="user"><i class="fa fa-2x fa-user"
|
||||
aria-hidden="true"></i>{{ request.user.name }} (<a href="{% url 'logout_glarus' %}">Logout</a>)</div>
|
||||
{% else %}
|
||||
<a href="{% url 'login_glarus' %}"> Login </a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-ex-collapse">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse"
|
||||
data-target="#navbar-ex-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
|
@ -22,10 +38,14 @@
|
|||
<div class="collapse navbar-collapse" id="navbar-ex-collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li class="active">
|
||||
<a href="#">Home</a>
|
||||
<a href="{% url 'digitalglarus:index' %}">Home</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#">Contacts</a>
|
||||
<a href="{% url 'digitalglarus:contact' %}">Contacts</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -33,13 +53,39 @@
|
|||
</div>
|
||||
{% load static %}
|
||||
|
||||
<div class="cover-image" style="background-image : url('{% get_static_prefix %}photo-1418479631014-8cbf89db3431 2.jpg')"></div>
|
||||
<div class="cover-image"
|
||||
style="background-image : url('{% get_static_prefix %}photo-1418479631014-8cbf89db3431 2.jpg')"></div>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<h2 class="text-inverse">When do you want to cowork?</h2>
|
||||
|
||||
<p class="text-inverse">Pick a date!</p>
|
||||
<a class="btn btn-lg btn-primary">Calender</a>
|
||||
<button class="btn btn-lg btn-primary" data-toggle="modal" data-target="#myModal">Calender
|
||||
</button>
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="myModal" tabindex="-1" role="dialog"
|
||||
aria-labelledby="myModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<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>
|
||||
<h4 class="modal-title" id="myModalLabel">Pick coworking date.</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{% include 'calendar/calendar.html' %}
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" id="close" class="btn btn-default"
|
||||
data-dismiss="modal">Close
|
||||
</button>
|
||||
<button type="button" id='bookdate' class="btn btn-primary">Book date
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -62,11 +108,14 @@
|
|||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<img src="https://ununsplash.imgix.net/photo-1423753623104-718aaace6772?w=1024&q=50&fm=jpg&s=1ffa61419561b5c796bca3158e7c704c" class="img-responsive">
|
||||
<img src="https://ununsplash.imgix.net/photo-1423753623104-718aaace6772?w=1024&q=50&fm=jpg&s=1ffa61419561b5c796bca3158e7c704c"
|
||||
class="img-responsive">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<h2 class="text-muted">The Spontaneous</h2>
|
||||
|
||||
<h3>35CHF/Month (1 day pass included)</h3>
|
||||
|
||||
<p>Do you dream of having a place to be inspired in the middle of the Alps?
|
||||
With only 35CHF a month, you can enjoy the full benefit of a Digital Chalet
|
||||
Schwanden membership! You can enjoy high speed network connection and comfortable
|
||||
|
@ -89,7 +138,9 @@
|
|||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h2 class="text-muted">The Committed</h2>
|
||||
|
||||
<h3>360CHF/Year (2 free day per month included)</h3>
|
||||
|
||||
<p>Be a regular coworker in our Digital Chalet Schwanden! With only 360CHF,
|
||||
you can enjoy the full coworking space for the whole year, with additional
|
||||
2 free day passes for each month. It is an ideal deal for our busy and
|
||||
|
@ -101,7 +152,8 @@
|
|||
<a class="btn btn-primary" href="/login/buy/year/">Buy Now</a>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<img src="https://unsplash.imgix.net/photo-1413834932717-29e7d4714192?w=1024&q=50&fm=jpg&s=d9d6cbc32dd4968d0c21e331436a6af6" class="img-responsive">
|
||||
<img src="https://unsplash.imgix.net/photo-1413834932717-29e7d4714192?w=1024&q=50&fm=jpg&s=d9d6cbc32dd4968d0c21e331436a6af6"
|
||||
class="img-responsive">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -111,6 +163,7 @@
|
|||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<h2 class="text-center text-primary">A Quick Glance..</h2>
|
||||
|
||||
<p class="text-center">A short guide for membership features.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -161,6 +214,7 @@
|
|||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h1>Digital Glarus</h1>
|
||||
|
||||
<p>In der Au 7 8762 Schwanden
|
||||
<br>Copyright © ungleich GmbH 2016</p>
|
||||
</div>
|
||||
|
@ -169,6 +223,7 @@
|
|||
<br>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12 hidden-lg hidden-md hidden-sm text-left">
|
||||
<a href="#"><i class="fa fa-3x fa-fw fa-instagram text-inverse"></i></a>
|
||||
|
@ -193,4 +248,5 @@
|
|||
</footer>
|
||||
|
||||
|
||||
</body></html>
|
||||
</body>
|
||||
</html>
|
|
@ -19,7 +19,7 @@
|
|||
<br>Check your email to activate your account.</p>
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-center">
|
||||
<a class="btn btn-primary" href="{% url 'login' %}">Back</a>
|
||||
<a class="btn btn-primary" href="{% url 'login_glarus' %}">Back</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -5,9 +5,10 @@ from django.contrib.auth.decorators import login_required
|
|||
from . import views
|
||||
|
||||
urlpatterns = (
|
||||
url(r"^$", views.LoginRegistrationView.as_view(), name='login'),
|
||||
url(r"^$", views.LoginRegistrationView.as_view(), name='login_glarus'),
|
||||
url(r"^validate/(?P<validate_slug>.*)/$", views.validate_email),
|
||||
url(r"^membership/$", login_required(views.MembershipView.as_view()), name='membership'),
|
||||
url(r'logout/?$',views.logout_glarus,name='logout_glarus'),
|
||||
url(r"^buy/(?P<time>\w+)/$", login_required(views.CreditCardView.as_view()), name='payment'),
|
||||
url(r'^buy/(?P<time>\w+)/reset',login_required(views.reset),name='reset')
|
||||
)
|
||||
|
|
|
@ -4,6 +4,10 @@ from django.contrib.auth import authenticate, login
|
|||
from django.views.decorators.cache import cache_control
|
||||
from django.conf import settings
|
||||
from django.db.models import Q
|
||||
from django.utils.translation import get_language
|
||||
from django.contrib.auth import logout
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.core.urlresolvers import reverse_lazy,reverse
|
||||
|
||||
from .models import CustomUser
|
||||
from .forms import (LoginForm, RegisterForm, PaymentForm)
|
||||
|
@ -105,9 +109,14 @@ class LoginRegistrationView(View):
|
|||
|
||||
class MembershipView(View):
|
||||
def get(self, request):
|
||||
#if the user has payed allready
|
||||
#if the user has payed already
|
||||
member_payed = request.user.creditcards_set.filter(Q(payment_type='month') | Q(payment_type='year'))
|
||||
if member_payed:
|
||||
return redirect('/')
|
||||
request.session['next'] = 0
|
||||
return render(request, 'templates/membership.html')
|
||||
language = get_language()
|
||||
return render(request, 'templates/membership.html',context={'language_code':language})
|
||||
|
||||
def logout_glarus(request):
|
||||
logout(request)
|
||||
return HttpResponseRedirect('/digitalglarus')
|
Loading…
Reference in a new issue