Merge branch 'tmslav-updating_calendar' into develop

This commit is contained in:
rascencio 2016-04-23 19:09:59 +02:00
commit a6256964e8
25 changed files with 6477 additions and 3800 deletions

View file

@ -0,0 +1,110 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calendar</title>
<link rel="stylesheet" href="stylesheet.css">
</head>
<body>
<div class="container">
<div class="calendar">
<header>
<h2>September</h2>
<a class="btn-prev fontawesome-angle-left" href="#"></a>
<a class="btn-next fontawesome-angle-right" href="#"></a>
</header>
<table>
<thead>
<tr>
<td>Mo</td>
<td>Tu</td>
<td>We</td>
<td>Th</td>
<td>Fr</td>
<td>Sa</td>
<td>Su</td>
</tr>
</thead>
<tbody>
<tr>
<td class="prev-month">26</td>
<td class="prev-month">27</td>
<td class="prev-month">28</td>
<td class="prev-month">29</td>
<td class="prev-month">30</td>
<td class="prev-month">31</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td class="event">10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
</tr>
<tr>
<td>16</td>
<td>17</td>
<td>18</td>
<td>19</td>
<td>20</td>
<td class="event">21</td>
<td>22</td>
</tr>
<tr>
<td class="current-day event">23</td>
<td>24</td>
<td>25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
</tr>
<tr>
<td>30</td>
<td class="next-month">1</td>
<td class="next-month">2</td>
<td class="next-month">3</td>
<td class="next-month">4</td>
<td class="next-month">5</td>
<td class="next-month">6</td>
</tr>
</tbody>
</table>
</div> <!-- end calendar -->
</div> <!-- end container -->
</body>
</html>

View file

@ -0,0 +1,107 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Calendar</title>
<link rel="stylesheet" href="stylesheet.css">
</head>
<body>
<div class="container">
<div class="calendar">
<header>
<a class="btn-prev fontawesome-angle-left" href="#"></a>
<span id="monthtitle">September</span>
<a class="btn-next fontawesome-angle-right" href="#"></a>
<table>
<thead>
<tr>
<td>Mo</td>
<td>Tu</td>
<td>We</td>
<td>Th</td>
<td>Fr</td>
<td>Sa</td>
<td>Su</td>
</tr>
</thead>
<tbody>
<tr>
<td class="prev-month">26</td>
<td class="prev-month">27</td>
<td class="prev-month">28</td>
<td class="prev-month">29</td>
<td class="prev-month">30</td>
<td class="prev-month">31</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>4</td>
<td>5</td>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td class="event">10</td>
<td>11</td>
<td>12</td>
<td>13</td>
<td>14</td>
<td>15</td>
</tr>
<tr>
<td>16</td>
<td>17</td>
<td>18</td>
<td>19</td>
<td>20</td>
<td class="event">21</td>
<td>22</td>
</tr>
<tr>
<td class="current-day event">23</td>
<td>24</td>
<td>25</td>
<td>26</td>
<td>27</td>
<td>28</td>
<td>29</td>
</tr>
<tr>
<td>30</td>
<td class="next-month">1</td>
<td class="next-month">2</td>
<td class="next-month">3</td>
<td class="next-month">4</td>
<td class="next-month">5</td>
<td class="next-month">6</td>
</tr>
</tbody>
</table>
</div> <!-- end calendar -->
</div> <!-- end container -->
</body>
</html>

View file

@ -0,0 +1,160 @@
@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;
}
/*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: #347D80;
color: #f9f9f9;
/*border: .1px solid #8BC4C9;*/
/*border-radius: 50%;*/
}
.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;
}

View file

@ -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>

View file

@ -0,0 +1,165 @@
@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%/1.5em 'Lato', sans-serif;
margin: 0;
}
a {
text-decoration: none;
}
/*Month size*/
h2 {
font-size: 1.5em;
line-height: 1.25em;
margin: .25em 0;
}
h3 {
font-size: 1.5em;
line-height: 1em;
margin: .33em 0;
}
table {
/*border-collapse: collapse;*/
border-spacing: 0;
margin:auto;
}
.container {
height: 558px;
left: 50%;
margin: -255px 0 0 -245px;
position: absolute;
top: 50%;
width: 540px;
}
/* ---------- CALENDAR ---------- */
.calendar {
text-align: center;
}
.calendar header {
position: relative;
}
.calendar h2 {
text-transform: uppercase;
color: #1A6687;
}
/*Title*/
.calendar thead {
font-weight: 600;
text-transform: uppercase;
color: #8BC4C9;
}
/*Body text*/
.calendar tbody {
color: #7c8a95;
}
/*select date*/
.calendar tbody td:hover {
border: .5px solid #8BC4C9;
-webkit-border: .5px solid none;
border-radius: 50%;
}
.calendar td {
border: .5px solid transparent;
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 {
color: #cbd1d2;
}
.calendar .prev-month:hover,
.calendar .next-month:hover {
border: .5px solid #cbd1d2;
}
/*Today*/
.current-day {
background: #8BC4C9;
color: #f9f9f9;
}
.event {
cursor: pointer;
position: relative;
}
/*Little dot*/
.event:after {
background: #8BC4C9;
border-radius: 50%;
bottom: .35em;
display: block;
content: '';
height: .35em;
left: 50%;
margin: -.25em 0 0 -.25em ;
position: absolute;
width: .35em;
}
.event.current-day:after {
background: #f9f9f9;
}
/*Next,Prev month*/
.btn-prev,
.btn-next {
border: 1px solid transparent;
color: #8BC4C9;
height: 2em;
font-size: .75em;
line-height: 2em;
margin: auto;
position: absolute;
top: .3em;
width: 10em;
}
.btn-prev:hover,
.btn-next:hover {
background: none;
color: #1A6687;
}
.btn-prev {
left: 6em;
}
.btn-next {
right: 6em;
}

View file

@ -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):

View 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;
}

View file

@ -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">
@ -80,8 +98,8 @@
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
{# <pre> {% filter force_escape %} {% debug %} {% endfilter %} </pre>#}
{# {% show_menu 0 0 0 1 %}#}
{# <pre> {% filter force_escape %} {% debug %} {% endfilter %} </pre>#}
{# {% show_menu 0 0 0 1 %}#}
<li>
<a href="{% url 'digitalglarus:home' %}">Home</a>
</li>

View file

@ -10,6 +10,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'),

View file

@ -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)

View file

@ -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

View file

@ -5,18 +5,11 @@ from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.conf import settings
<<<<<<< HEAD
from hosting.views import railshosting, nodejshosting, djangohosting
=======
from hosting.views import RailsHostingView
>>>>>>> remotes/origin/feature/vm_pricing
from membership import urls as membership_urls
urlpatterns = [
url(r'^hosting/', include('hosting.urls', namespace="hosting")),
url(r'^railshosting/', railshosting, name="rails.hosting"),
url(r'^nodehosting/', nodejshosting, name="node.hosting"),
url(r'^djangohosting/', djangohosting, name="django.hosting"),
url(r'^railshosting/', RailsHostingView.as_view(), name="rails.hosting"),
url(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')),
url(r'^jsi18n/(?P<packages>\S+?)/$',
@ -33,7 +26,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')),
)

View file

@ -0,0 +1 @@
__author__ = 'tomislav'

View 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

View 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),
),
]

View file

@ -1,10 +1,13 @@
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
from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, AbstractUser
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)
@ -123,5 +127,26 @@ class CreditCards(models.Model):
card_number = models.CharField(max_length=50)
expiry_date = models.CharField(max_length=50, validators=[RegexValidator(r'\d{2}\/\d{4}', _(
'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')
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

View 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;
}

View 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>

View file

@ -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="">

View file

@ -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>

View file

@ -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>
<div class="cover">
<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,18 +53,44 @@
</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">&times;</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 class="section">
</div>
</div>
</div>
</div>
<div class="section">
<div class="container">
<div class="row">
<div class="col-md-12">
@ -57,16 +103,19 @@
</div>
</div>
</div>
</div>
<div class="section">
</div>
<div class="section">
<div class="container">
<div class="row">
<div class="col-md-6">
<img src="https://ununsplash.imgix.net/photo-1423753623104-718aaace6772?w=1024&amp;q=50&amp;fm=jpg&amp;s=1ffa61419561b5c796bca3158e7c704c" class="img-responsive">
<img src="https://ununsplash.imgix.net/photo-1423753623104-718aaace6772?w=1024&amp;q=50&amp;fm=jpg&amp;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
@ -83,13 +132,15 @@
</div>
</div>
</div>
</div>
<div class="section">
</div>
<div class="section">
<div class="container">
<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,16 +152,18 @@
<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&amp;q=50&amp;fm=jpg&amp;s=d9d6cbc32dd4968d0c21e331436a6af6" class="img-responsive">
<img src="https://unsplash.imgix.net/photo-1413834932717-29e7d4714192?w=1024&amp;q=50&amp;fm=jpg&amp;s=d9d6cbc32dd4968d0c21e331436a6af6"
class="img-responsive">
</div>
</div>
</div>
</div>
<div class="section">
</div>
<div class="section">
<div class="container">
<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>
@ -155,12 +208,13 @@
</div>
</div>
</div>
</div>
<footer class="section section-primary">
</div>
<footer class="section section-primary">
<div class="container">
<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>
@ -190,7 +245,8 @@
</div>
</div>
</div>
</footer>
</footer>
</body></html>
</body>
</html>

View file

@ -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>

View file

@ -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')
)

View file

@ -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')