diff --git a/blechreiz/calendarCredentials.dat b/blechreiz/calendarCredentials.dat index 32a5754..efd1a9e 100644 --- a/blechreiz/calendarCredentials.dat +++ b/blechreiz/calendarCredentials.dat @@ -1 +1 @@ -{"_module": "oauth2client.client", "token_expiry": "2014-04-26T10:33:34Z", "access_token": "ya29.1.AADtN_WzqSiT0Ir0jy8f_InaX_NAUAs98E5YwU_uHYMMCvhfc90boeQSVPQpJQTWHw", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "ya29.1.AADtN_WzqSiT0Ir0jy8f_InaX_NAUAs98E5YwU_uHYMMCvhfc90boeQSVPQpJQTWHw", "token_type": "Bearer", "expires_in": 3600}, "client_id": "34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com", "id_token": null, "client_secret": "y4t9XBrJdCODPTO5UvtONWWn", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "1/7-6-m_lLAKX8IeD7OuGtkcIiprty_nZUSxhMunSC5b0", "user_agent": null} \ No newline at end of file +{"_module": "oauth2client.client", "token_expiry": "2014-06-20T09:36:07Z", "access_token": "ya29.LgA4Q4jhQqjEoBwAAABv_luKCAgrb2C-s1IcYmGZ8nZViS_QHvHKT-IkSo31RQ", "token_uri": "https://accounts.google.com/o/oauth2/token", "invalid": false, "token_response": {"access_token": "ya29.LgA4Q4jhQqjEoBwAAABv_luKCAgrb2C-s1IcYmGZ8nZViS_QHvHKT-IkSo31RQ", "token_type": "Bearer", "expires_in": 3600}, "client_id": "34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com", "id_token": null, "client_secret": "y4t9XBrJdCODPTO5UvtONWWn", "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", "_class": "OAuth2Credentials", "refresh_token": "1/7-6-m_lLAKX8IeD7OuGtkcIiprty_nZUSxhMunSC5b0", "user_agent": null} \ No newline at end of file diff --git a/eventplanner/serializers.py b/eventplanner/serializers.py index f7cd4b0..509126e 100644 --- a/eventplanner/serializers.py +++ b/eventplanner/serializers.py @@ -12,8 +12,7 @@ class ParticipationSerializer(serializers.ModelSerializer): def get_identity(self, data): """ This hook is required for bulk update. """ try: - print "get_identity event:" + str( data.get('event', None) ) + " user " + str( data.get('user') ) - return ( data.get('event', None), data.get('user') ) + return data.get('event', None), data.get('user') except AttributeError: return None diff --git a/eventplanner_gcal/google_sync.py b/eventplanner_gcal/google_sync.py index 22ffc6a..57f3894 100644 --- a/eventplanner_gcal/google_sync.py +++ b/eventplanner_gcal/google_sync.py @@ -4,11 +4,12 @@ import datetime import time from eventplanner.models import Event, EventParticipation -from eventplanner_gcal.models import GCalMapping, GCalPushChannel +from eventplanner_gcal.models import GCalMapping, GCalPushChannel,UserGCalCoupling from apiclient.http import BatchHttpRequest from django.contrib.auth.models import User from django.conf import settings +from pprint import pprint logger = logging.getLogger(__name__) @@ -54,21 +55,22 @@ def buildGCalAttendeesObj( event ): """Builds a attendees object that is inserted into the GCal event. Attendees are all users that have a google mail address. """ result = [] - for u in User.objects.all(): - if u.email.endswith( "@gmail.com") or u.email.endswith("@googlemail.com"): - participation = EventParticipation.get_or_create( u, event ) - status = "tentative" - if participation.status == 'Yes': status = "accepted" - if participation.status == 'No' : status = "declined" - o = { - 'id': u.email, - 'email': u.email, - 'displayName': u.username, - 'comment': participation.comment, - 'responseStatus': status, - } - result.append( o ) + for userMapping in UserGCalCoupling.objects.all(): + u = userMapping.user + participation = EventParticipation.get_or_create( u, event ) + status = "tentative" + if participation.status == 'Yes': status = "accepted" + if participation.status == 'No' : status = "declined" + + o = { + 'id': userMapping.email, + 'email': u.email, + 'displayName': u.username, + 'comment': participation.comment, + 'responseStatus': status, + } + result.append( o ) return result @@ -222,6 +224,9 @@ def syncFromLocalToGoogle( service = None ): eventDjangoID = int( gcalEv['extendedProperties']['private']['blechreizID'] ) try: djangoEv = Event.objects.get( pk=eventDjangoID ) + if 'attendees' not in gcalEv: + gcalEv['attendees'] = [] + if gcalEv['attendees'] != buildGCalAttendeesObj( djangoEv ): batch.add( updateGCalEvent( service, djangoEv ) ) batchIsEmpty = False diff --git a/eventplanner_gcal/models.py b/eventplanner_gcal/models.py index b764ced..40d087a 100644 --- a/eventplanner_gcal/models.py +++ b/eventplanner_gcal/models.py @@ -1,6 +1,8 @@ import logging import uuid from eventplanner.models import Event +from django.contrib.auth.models import User + from apiclient.channel import Channel from django.db import models @@ -9,6 +11,12 @@ from django.db import models logger = logging.getLogger(__name__) +class UserGCalCoupling( models.Model ): + # For every user in this table the gcal coupling is activated + user = models.OneToOneField( User ) + email = models.CharField( max_length=1024 ) + + class GCalMapping( models.Model ): """Mapping between event id at google and local event id""" gcal_id = models.CharField( max_length=64 ) diff --git a/eventplanner_gcal/signals.py b/eventplanner_gcal/signals.py index f2c319e..7cd5927 100644 --- a/eventplanner_gcal/signals.py +++ b/eventplanner_gcal/signals.py @@ -9,10 +9,10 @@ import logging logger = logging.getLogger( __name__ ) -@receiver( post_save, sender=User ) -def user_changed( **kwargs ): - logger.info("Synchronizing with google - user information changed") - syncFromLocalToGoogle( getServiceObject() ) +#@receiver( post_save, sender=User ) +#def user_changed( **kwargs ): +# logger.info("Synchronizing with google - user information changed") +# syncFromLocalToGoogle( getServiceObject() ) @receiver( post_save,sender= Event) diff --git a/eventplanner_gcal/static/css/bootstrap-switch.css b/eventplanner_gcal/static/css/bootstrap-switch.css new file mode 100644 index 0000000..5104c20 --- /dev/null +++ b/eventplanner_gcal/static/css/bootstrap-switch.css @@ -0,0 +1,184 @@ +/* ======================================================================== + * bootstrap-switch - v2.0.1 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +.has-switch { + display: inline-block; + cursor: pointer; + border-radius: 4px; + border: 1px solid; + border-color: #cccccc; + position: relative; + text-align: left; + overflow: hidden; + line-height: 8px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; + vertical-align: middle; + min-width: 100px; + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.has-switch:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); +} +.has-switch.switch-mini { + min-width: 72px; +} +.has-switch.switch-mini span, +.has-switch.switch-mini label { + padding-bottom: 4px; + padding-top: 4px; + font-size: 10px; + line-height: 9px; +} +.has-switch.switch-mini i.switch-mini-icons { + height: 1.20em; + line-height: 9px; + vertical-align: text-top; + text-align: center; + transform: scale(0.6); + margin-top: -1px; + margin-bottom: -1px; +} +.has-switch.switch-small { + min-width: 80px; +} +.has-switch.switch-small span, +.has-switch.switch-small label { + padding-bottom: 3px; + padding-top: 3px; + font-size: 12px; + line-height: 18px; +} +.has-switch.switch-large { + min-width: 120px; +} +.has-switch.switch-large span, +.has-switch.switch-large label { + padding-bottom: 9px; + padding-top: 9px; + font-size: 16px; + line-height: normal; +} +.has-switch.switch-animate > div { + -webkit-transition: left 0.5s; + transition: left 0.5s; +} +.has-switch.switch-off > div { + left: -50%; +} +.has-switch.switch-on > div { + left: 0%; +} +.has-switch.disabled { + opacity: 0.5; + filter: alpha(opacity=50); + cursor: default !important; +} +.has-switch.disabled span, +.has-switch.disabled label { + cursor: default !important; +} +.has-switch > div { + display: inline-block; + width: 150%; + position: relative; + top: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.has-switch input[type=radio], +.has-switch input[type=checkbox] { + display: none; +} +.has-switch span, +.has-switch label { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; + position: relative; + display: inline-block !important; + height: 100%; + padding-bottom: 4px; + padding-top: 4px; + font-size: 14px; + line-height: 20px; +} +.has-switch label { + text-align: center; + margin-top: -1px; + margin-bottom: -1px; + z-index: 100; + width: 33.333333333%; + background: #ffffff; +} +.has-switch label i { + color: #000; + text-shadow: 0 1px 0 #fff; + line-height: 18px; + pointer-events: none; +} +.has-switch span { + text-align: center; + z-index: 1; + width: 33.333333333%; +} +.has-switch span.switch-left { + color: #f00; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.has-switch span.switch-right { + color: #000; + background: #eeeeee; +} +.has-switch span.switch-primary, +.has-switch span.switch-left { + color: #fff; + background: #428bca; +} +.has-switch span.switch-info { + color: #fff; + background: #5bc0de; +} +.has-switch span.switch-success { + color: #fff; + background: #5cb85c; +} +.has-switch span.switch-warning { + background: #f0ad4e; + color: #fff; +} +.has-switch span.switch-danger { + color: #fff; + background: #d9534f; +} +.has-switch span.switch-default { + color: #000; + background: #eeeeee; +} diff --git a/eventplanner_gcal/static/css/bootstrap-switch.min.css b/eventplanner_gcal/static/css/bootstrap-switch.min.css new file mode 100644 index 0000000..2bc64af --- /dev/null +++ b/eventplanner_gcal/static/css/bootstrap-switch.min.css @@ -0,0 +1,22 @@ +/* ======================================================================== + * bootstrap-switch - v2.0.1 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.has-switch{display:inline-block;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);position:relative;text-align:left;overflow:hidden;line-height:8px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;vertical-align:middle;min-width:100px;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-moz-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.has-switch.switch-mini{min-width:72px}.has-switch.switch-mini label,.has-switch.switch-mini span{padding-bottom:4px;padding-top:4px;font-size:10px;line-height:9px}.has-switch.switch-mini i.switch-mini-icons{height:1.2em;line-height:9px;vertical-align:text-top;text-align:center;transform:scale(0.6);margin-top:-1px;margin-bottom:-1px}.has-switch.switch-small{min-width:80px}.has-switch.switch-small label,.has-switch.switch-small span{padding-bottom:3px;padding-top:3px;font-size:12px;line-height:18px}.has-switch.switch-large{min-width:120px}.has-switch.switch-large label,.has-switch.switch-large span{padding-bottom:9px;padding-top:9px;font-size:16px;line-height:normal}.has-switch.switch-animate>div{-webkit-transition:left .5s;-moz-transition:left .5s;-o-transition:left .5s;transition:left .5s}.has-switch.switch-off>div{left:-50%}.has-switch.switch-on>div{left:0}.has-switch.disabled{opacity:.5;filter:alpha(opacity=50);cursor:default!important}.has-switch.disabled label,.has-switch.disabled span{cursor:default!important}.has-switch:focus{border-color:#08c;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(red(@btnPrimaryBackground),green(@btnPrimaryBackground),blue(@btnPrimaryBackground),.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(red(@btnPrimaryBackground),green(@btnPrimaryBackground),blue(@btnPrimaryBackground),.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(red(@btnPrimaryBackground),green(@btnPrimaryBackground),blue(@btnPrimaryBackground),.6)}.has-switch>div{display:inline-block;width:150%;position:relative;top:0}.has-switch input[type=checkbox],.has-switch input[type=radio]{display:none}.has-switch label,.has-switch span{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;position:relative;display:inline-block!important;height:100%;padding-bottom:4px;padding-top:4px;font-size:14px;line-height:20px}.has-switch label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;width:34%;border-left:1px solid #ccc;border-right:1px solid #ccc;color:#333;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch label.active,.has-switch label.disabled,.has-switch label:active,.has-switch label:focus,.has-switch label:hover,.has-switch label[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.has-switch label.active,.has-switch label:active{background-color:#ccc \9}.has-switch label i{color:#000;text-shadow:0 1px 0 #fff;line-height:18px;pointer-events:none}.has-switch span{text-align:center;z-index:1;width:33%}.has-switch span.switch-left{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px}.has-switch span.switch-right{color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f0f0f0;background-image:-moz-linear-gradient(top,#e6e6e6,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e6e6e6),to(#fff));background-image:-webkit-linear-gradient(top,#e6e6e6,#fff);background-image:-o-linear-gradient(top,#e6e6e6,#fff);background-image:linear-gradient(to bottom,#e6e6e6,#fff);background-repeat:repeat-x;border-color:#fff #fff #d9d9d9;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-right.active,.has-switch span.switch-right.disabled,.has-switch span.switch-right:active,.has-switch span.switch-right:focus,.has-switch span.switch-right:hover,.has-switch span.switch-right[disabled]{color:#333;background-color:#fff;*background-color:#f2f2f2}.has-switch span.switch-right.active,.has-switch span.switch-right:active{background-color:#e6e6e6 \9}.has-switch span.switch-left,.has-switch span.switch-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#005fcc;background-image:-moz-linear-gradient(top,#04c,#08c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#04c),to(#08c));background-image:-webkit-linear-gradient(top,#04c,#08c);background-image:-o-linear-gradient(top,#04c,#08c);background-image:linear-gradient(to bottom,#04c,#08c);background-repeat:repeat-x;border-color:#08c #08c #005580;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#08c;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-left.active,.has-switch span.switch-left.disabled,.has-switch span.switch-left:active,.has-switch span.switch-left:focus,.has-switch span.switch-left:hover,.has-switch span.switch-left[disabled],.has-switch span.switch-primary.active,.has-switch span.switch-primary.disabled,.has-switch span.switch-primary:active,.has-switch span.switch-primary:focus,.has-switch span.switch-primary:hover,.has-switch span.switch-primary[disabled]{color:#fff;background-color:#08c;*background-color:#0077b3}.has-switch span.switch-left.active,.has-switch span.switch-left:active,.has-switch span.switch-primary.active,.has-switch span.switch-primary:active{background-color:#069 \9}.has-switch span.switch-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#41a7c5;background-image:-moz-linear-gradient(top,#2f96b4,#5bc0de);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2f96b4),to(#5bc0de));background-image:-webkit-linear-gradient(top,#2f96b4,#5bc0de);background-image:-o-linear-gradient(top,#2f96b4,#5bc0de);background-image:linear-gradient(to bottom,#2f96b4,#5bc0de);background-repeat:repeat-x;border-color:#5bc0de #5bc0de #28a1c5;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#5bc0de;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-info.active,.has-switch span.switch-info.disabled,.has-switch span.switch-info:active,.has-switch span.switch-info:focus,.has-switch span.switch-info:hover,.has-switch span.switch-info[disabled]{color:#fff;background-color:#5bc0de;*background-color:#46b8da}.has-switch span.switch-info.active,.has-switch span.switch-info:active{background-color:#31b0d5 \9}.has-switch span.switch-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#58b058;background-image:-moz-linear-gradient(top,#51a351,#62c462);background-image:-webkit-gradient(linear,0 0,0 100%,from(#51a351),to(#62c462));background-image:-webkit-linear-gradient(top,#51a351,#62c462);background-image:-o-linear-gradient(top,#51a351,#62c462);background-image:linear-gradient(to bottom,#51a351,#62c462);background-repeat:repeat-x;border-color:#62c462 #62c462 #3b9e3b;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#62c462;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-success.active,.has-switch span.switch-success.disabled,.has-switch span.switch-success:active,.has-switch span.switch-success:focus,.has-switch span.switch-success:hover,.has-switch span.switch-success[disabled]{color:#fff;background-color:#62c462;*background-color:#4fbd4f}.has-switch span.switch-success.active,.has-switch span.switch-success:active{background-color:#42b142 \9}.has-switch span.switch-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#f9a123;background-image:-moz-linear-gradient(top,#f89406,#fbb450);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f89406),to(#fbb450));background-image:-webkit-linear-gradient(top,#f89406,#fbb450);background-image:-o-linear-gradient(top,#f89406,#fbb450);background-image:linear-gradient(to bottom,#f89406,#fbb450);background-repeat:repeat-x;border-color:#fbb450 #fbb450 #f89406;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#fbb450;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-warning.active,.has-switch span.switch-warning.disabled,.has-switch span.switch-warning:active,.has-switch span.switch-warning:focus,.has-switch span.switch-warning:hover,.has-switch span.switch-warning[disabled]{color:#fff;background-color:#fbb450;*background-color:#faa937}.has-switch span.switch-warning.active,.has-switch span.switch-warning:active{background-color:#fa9f1e \9}.has-switch span.switch-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25);background-color:#d14641;background-image:-moz-linear-gradient(top,#bd362f,#ee5f5b);background-image:-webkit-gradient(linear,0 0,0 100%,from(#bd362f),to(#ee5f5b));background-image:-webkit-linear-gradient(top,#bd362f,#ee5f5b);background-image:-o-linear-gradient(top,#bd362f,#ee5f5b);background-image:linear-gradient(to bottom,#bd362f,#ee5f5b);background-repeat:repeat-x;border-color:#ee5f5b #ee5f5b #e51d18;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#ee5f5b;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-danger.active,.has-switch span.switch-danger.disabled,.has-switch span.switch-danger:active,.has-switch span.switch-danger:focus,.has-switch span.switch-danger:hover,.has-switch span.switch-danger[disabled]{color:#fff;background-color:#ee5f5b;*background-color:#ec4844}.has-switch span.switch-danger.active,.has-switch span.switch-danger:active{background-color:#e9322d \9}.has-switch span.switch-default{color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f0f0f0;background-image:-moz-linear-gradient(top,#e6e6e6,#fff);background-image:-webkit-gradient(linear,0 0,0 100%,from(#e6e6e6),to(#fff));background-image:-webkit-linear-gradient(top,#e6e6e6,#fff);background-image:-o-linear-gradient(top,#e6e6e6,#fff);background-image:linear-gradient(to bottom,#e6e6e6,#fff);background-repeat:repeat-x;border-color:#fff #fff #d9d9d9;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);*background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.has-switch span.switch-default.active,.has-switch span.switch-default.disabled,.has-switch span.switch-default:active,.has-switch span.switch-default:focus,.has-switch span.switch-default:hover,.has-switch span.switch-default[disabled]{color:#333;background-color:#fff;*background-color:#f2f2f2}.has-switch span.switch-default.active,.has-switch span.switch-default:active{background-color:#e6e6e6 \9} \ No newline at end of file diff --git a/eventplanner_gcal/static/img/google_cal.png b/eventplanner_gcal/static/img/google_cal.png new file mode 100644 index 0000000..65de6ee Binary files /dev/null and b/eventplanner_gcal/static/img/google_cal.png differ diff --git a/eventplanner_gcal/static/js/bootstrap-switch.min.js b/eventplanner_gcal/static/js/bootstrap-switch.min.js new file mode 100644 index 0000000..81dfa14 --- /dev/null +++ b/eventplanner_gcal/static/js/bootstrap-switch.min.js @@ -0,0 +1,22 @@ +/* ======================================================================== + * bootstrap-switch - v2.0.1 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +(function(){!function(a){return a.fn.bootstrapSwitch=function(b){var c;return c={init:function(){return this.each(function(){var b,c,d,e,f,g,h,i;return c=a(this),f=a("",{"class":"switch-left",html:function(){var a,b;return a="ON",b=c.data("on-label"),null!=b&&(a=b),a}}),g=a("",{"class":"switch-right",html:function(){var a,b;return a="OFF",b=c.data("off-label"),null!=b&&(a=b),a}}),e=a("