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…
	
	Add table
		Add a link
		
	
		Reference in a new issue