added new banner image for the indiegogo campaign

This commit is contained in:
Oliver Marks 2016-05-09 07:23:34 +01:00
parent 0b506d19f2
commit 8f4f67c31e
21 changed files with 448 additions and 156 deletions

View File

@ -11,7 +11,7 @@ RUN \
apt-get upgrade -y && \
apt-get install -y libssl-dev libffi-dev && \
apt-get install -y software-properties-common python-software-properties && \
apt-get install -y python-MySQLdb python-psycopg2 python-requests-oauthlib python-pip python-dev python-requests python-lxml python-flask python-flask-login && \
apt-get install -y python-MySQLdb python-psycopg2 python-requests-oauthlib python-pip python-dev python-dateutil python-requests python-lxml python-flask python-flask-login && \
apt-get install -y cssmin slimit && \
add-apt-repository -y ppa:oly/ppa && \
apt-get update && \

View File

@ -36,15 +36,13 @@ Both paypal and gocardless clearly show that you are using the sandbox in the ur
for paypal you can use this email and password
email = contact-buyer@maidstone-hackspace.org.uk
password = mhackspace
password = Mhackspace
To test the gocardless integration you can use these card details
sortcode = 200000
account number = 55779911
Run locally with uwsgi on port 9090
uwsgi --plugins python --http-socket :9090 -w wsgi

View File

@ -5,3 +5,4 @@ pytz
pip install -e bzr+lp:scaffold#egg=scaffold
python-requests-oauthlib
paypalrestsdk
dateutil

View File

@ -9,7 +9,7 @@ from flask import redirect, abort
from flask import make_response
from flask import request
from flask import Blueprint
from flask.ext.login import LoginManager, login_required, UserMixin, login_user, logout_user, make_secure_token
from flask.ext.login import current_user, LoginManager, login_required, UserMixin, login_user, logout_user, make_secure_token
from requests_oauthlib import OAuth2Session
from requests_oauthlib.compliance_fixes import facebook_compliance_fix
@ -51,6 +51,7 @@ def todict(data):
class User(UserMixin):
def __init__(self, user_id, active=True):
print user_id
self.id = None
user_details = site_user.get_user_details({'id': user_id}).get()
self.active = False
print 'user'
@ -77,6 +78,7 @@ class User(UserMixin):
@login_manager.user_loader
def load_user(userid):
"""Flask user loader hook, internal to flask login"""
return User(userid)
@ -98,9 +100,9 @@ def load_token(request):
return user
return None
def auth_required():
if not session.get('user_id'):
redirect(domain + '/login', 301)
#~ def auth_required():
#~ if not session.get('user_id'):
#~ redirect(domain + '/login', 301)
@authorize_pages.route("/register", methods=['GET'])
def register_form():
@ -145,10 +147,11 @@ def register_submit():
web.template.body.append(web.page.render())
return make_response(footer())
@authorize_pages.route("/oauth/<provider>/<state>", methods=['GET'])
@authorize_pages.route("/oauth/<provider>/<state>/", methods=['GET'])
@authorize_pages.route("/oauth/<provider>/<start_oauth_login>/", methods=['GET'])
@authorize_pages.route("/oauth/<provider>/<start_oauth_login>", methods=['GET'])
@authorize_pages.route("/oauth/<provider>/", methods=['GET'])
@authorize_pages.route("/oauth/<provider>", methods=['GET'])
def oauth(provider, state=None):
def oauth(provider, start_oauth_login=False):
oauth_verify = True
oauth_provider = oauth_conf.get(provider)
oauth_access_type = ''
@ -159,8 +162,8 @@ def oauth(provider, state=None):
oauth_approval_prompt = "force"
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
oauth_provider.get('redirect_uri')
if state:
if start_oauth_login:
print oauth_provider.get('redirect_uri')
oauth_session = OAuth2Session(
oauth_provider.get('client_id'),
scope=oauth_provider.get('scope'),
@ -169,9 +172,6 @@ def oauth(provider, state=None):
if provider == 'facebook':
oauth_session = facebook_compliance_fix(oauth_session)
# offline for refresh token
# force to always make user click authorize
# generate the google url we will use to authorize and redirect there
authorization_url, state = oauth_session.authorization_url(
oauth_provider.get('auth_uri'),
access_type=oauth_access_type,
@ -184,14 +184,18 @@ def oauth(provider, state=None):
return redirect(authorization_url)
# allready authorised so lets handle the callback
oauth_provider.get('redirect_uri')
oauth_session = OAuth2Session(
oauth_provider.get('client_id'),
state=session['oauth_state'],
redirect_uri=oauth_provider.get('redirect_uri'))
print '----------'
print oauth_provider.get('redirect_uri')
print request.url
if provider == 'facebook':
oauth_session = facebook_compliance_fix(oauth_session)
# code error is todo with authorisation response
oauth_session.fetch_token(
@ -212,33 +216,49 @@ def oauth(provider, state=None):
oauth_user = site_user.fetch_oauth_login({
'username': oauth_id or '',
'provider': provider_id
}).get()
}).get()
if oauth_user:
user_details = site_user.get_user_details({
'id': oauth_user.get('user_id')
}).get()
# we have matched a user so login and redirect
if user_details:
print user_details
# no E-Mail so lets ask the user to set there email before allowing login
#~ if not user_details.get('email'):
#~ return change_email()
login_user(User(user_details.get('user_id')))
# no E-Mail so lets ask the user to set there email before allowing login
if not user_details.get('email'):
return redirect('/profile/change_email')
return redirect('/profile')
flash('Your new profile has been created, and your now logged in')
print oauth_user
print 'current user'
print current_user.get_id()
if current_user.get_id():
# link oauth to users account
site_user.create_oauth_login().execute({
'user_id': current_user.get_id(),
'username': oauth_id or '',
'provider': provider_id})
return redirect('/profile')
print oauth_response
print '-----'
print oauth_response.get('email') or ''
# create new user from oauth information
user_id = site_user.create().execute({
'email': oauth_response.get('email') or '',
new_user_details = {
'password': 'oauth',
'profile_image': oauth_response.get('picture'),
'username': oauth_id,
'first_name': oauth_response.get('given_name') or '',
'last_name': oauth_response.get('family_name') or ''})
'last_name': oauth_response.get('family_name') or ''}
if oauth_response.get('email'):
new_user_details['email']= oauth_response.get('email')
user_id = site_user.create().execute(new_user_details)
# register oauth login creation
site_user.create_oauth_login().execute({
@ -246,12 +266,11 @@ def oauth(provider, state=None):
'username': oauth_id or '',
'provider': provider_id})
# no E-Mail so lets ask the user to set there email before allowing login
if not user_details.get('email'):
return change_email()
login_user(User(user_id))
site_user.update_last_login().execute({'id': user_id})
if not user_id:
flash('Failed to create user')
return redirect('/login')
return redirect('/profile')
@ -362,73 +381,28 @@ def reset_password_submit():
web.template.body.append(web.page.render())
return make_response(footer())
@authorize_pages.route("/profile/email", methods=['GET'])
def change_email():
web.template.create('%s - Change Email' % site_name)
header('Members Login')
web.page.create('Set your E-Mail address')
web.form.create('Set E-Mail address for account', '/profile/email')
web.form.append(name='email', label='Valid Email', placeholder='ralf@maidstone-hackspace.org.uk', value='')
#~ @authorize_pages.route("/login", methods=['GET'])
#~ def login_screen():
#~ web.template.create('Maidstone Hackspace - Login')
#~ header('Members Login')
#~ web.page.create('Member Login')
#~ web.page.section(
#~ web.login_box.create().enable_oauth('google').enable_oauth('facebook').enable_oauth('github').render()
#~ )
#~ web.template.body.append(web.page.render())
#~ return make_response(footer())
flash('An E-Mail has been sent to you please check and confirm you identity.')
sendmail().send(
from_address='no-reply@maidstone-hackspace.org.uk',
to_address='oly@leela',
subject="%s - Confirm E-Mail Address" % site_name,
body='generate link here')
web.page.section(web.form.render())
web.template.body.append(web.page.render())
return make_response(footer())
@authorize_pages.route("/login", methods=['GET'])
def login_screen():
web.template.create('Maidstone Hackspace - Login')
header('Members Login')
web.page.create('Member Login')
web.page.section(
web.login_box.create().enable_oauth('google').enable_oauth('facebook').enable_oauth('github').render()
)
@authorize_pages.route("/login/failure", methods=['GET'])
def login_Failure():
web.template.create('%s - Login' % site_name)
header('Login Failure')
web.page.create('Login Failure')
#~ web.template.body.append(web.messages.render())
web.template.body.append(web.page.render())
return make_response(footer())
@authorize_pages.route("/login", methods=['POST'])
def login_screen_submit():
"""handle the login form submit"""
# try to find user by username
user_details = site_user.get_by_username({
'email': request.form.get('username')}).get()
#not found so lets bail to the login screen
if not user_details:
flash('Failed to login with that username and password, please retry.')
return login_screen()
# no E-Mail so lets ask the user to set there email before allowing login
if not user_details.get('email'):
return change_email()
#now lets verify the users password, and bail if its wrong
pw_hash = generate_password_hash(request.form.get('password'))
if check_password_hash(pw_hash, user_details.get('password')):
flash('Failed to login with that username and password, please retry.')
return login_screen()
#login user and redirect to profile
login_user(
User(user_details.get('user_id'))
)
flash('You have successfully logged in !')
#~ session['username'] = user_details.get('username', 'anonymous')
#~ session['user_id'] = str(user_details.get('user_id'))
site_user.update_last_login().execute(user_details)
return redirect('/profile')
@authorize_pages.route("/logout")
def logout():
logout_user()

View File

@ -57,7 +57,7 @@ with web.template as setup:
setup.persistent_header('<link rel="stylesheet" id="navigationCss" href="/static/css/sprite-content-white.css" media="" type="text/css" />')
#javascript, using jquery and angular
setup.persistent_header('<script type="text/javascript" src="/static/js/jquery-2.1.4.min.js"></script>')
setup.persistent_header('<script type="text/javascript" src="/static/js/jquery-2.2.3.min.js"></script>')
setup.persistent_header('<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script>')
setup.persistent_header('<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-animate.js"></script>')
setup.persistent_header('<script type="text/javascript" src="/static/js/default.js"></script>')

View File

@ -14,6 +14,7 @@ nav_for_authenticated_user = (
)
banner_images = [
('/static/images/banners/indiegogo.png', 'https://www.indiegogo.com/projects/maidstone-hackspace/', 'Visit our campaign page', ''),
('/static/images/banners/hackspace-banner.png', '', '', ''),
('/static/images/banners/audio_board.jpg', 'Audio board', 'Audio board', ''),
('/static/images/banners/microscope.jpg', '', 'Microscope', ''),

View File

@ -12,8 +12,8 @@ query_builder.query_path = os.path.abspath('./data/sql/')
class create_basic_user(insert_data):
"""not able to actually log in but registered on the system"""
table = 'users'
required = {'email', 'first_name', 'last_name'}
columns = {'email','first_name', 'last_name'}
required = {'first_name', 'last_name'}
columns = {'first_name', 'last_name'}
def calculated_data(self):
return {'created': time.strftime('%Y-%m-%d %H:%M:%S')}
@ -24,8 +24,8 @@ class create_basic_user(insert_data):
class create(insert_data):
table = 'users'
required = {'email', 'password', 'username', 'first_name', 'last_name', 'created'}
columns = {'email', 'password', 'username', 'first_name', 'last_name', 'created'}
required = {'password', 'username', 'first_name', 'last_name', 'created'}
columns = {'password', 'username', 'first_name', 'last_name', 'created'}
columns_optional = {'profile_image'}
def calculated_data(self):
@ -41,6 +41,12 @@ class update_last_login(update_data):
required = {'id'}
columns_where = {'id'}
class update_user_email(update_data):
debug = True
query_str = "update `users` set `email`=%(email)s"
required = {'id', 'email'}
columns_where = {'id'}
class update_membership_status(update_data):
debug = True
query_str = "update `users` set `status`=%(status)s where id=%(user_id)s"
@ -127,27 +133,22 @@ class create_oauth_login(insert_data):
debug = True
table = 'user_oauth'
required = {'username', 'provider', 'user_id'}
columns = {'username', 'provider', 'user_id'}
columns = {'username', 'provider', 'user_id', 'registered'}
#~ def calculated_data(self):
#~ return {'registered': time.strftime('%Y-%m-%d %H:%M:%S')}
def set(self, data):
data['registered'] = time.strftime('%Y-%m-%d %H:%M:%S')
super(create_oauth_login, self).set(data)
def calculated_data(self):
return {'registered': time.strftime('%Y-%m-%d %H:%M:%S')}
class update_oauth_login(update_data):
table = 'user_oauth'
columns = {'username', 'provider', 'last_login'}
required = {'username', 'provider'}
query_file = 'get_user_by_oauth_username.sql'
columns_where = {'username', 'provider'}
def calculated_data(self):
return {'registered': time.strftime('%Y-%m-%d %H:%M:%S')}
def set(self, data):
data['registered'] = time.strftime('%Y-%m-%d %H:%M:%S')
super(update_oauth_login, self).set(data)
return {
'last_login': time.strftime('%Y-%m-%d %H:%M:%S')
}
class fetch_oauth_login(select_data):
required = {'username', 'provider'}

View File

@ -28,6 +28,8 @@ def examples():
#finish of the page
return footer()
def generate_rss():
pass
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Generate static pages')

View File

@ -13,17 +13,20 @@ from pages import chat
from pages import blog
from pages import members
from pages.core.login_pages import login_pages
from pages.donate import donate_pages
from pages.google_groups import google_groups_pages
from pages.equipment import equipment_pages
from pages.profile import profile_pages
from authorize import authorize_pages, login_manager
web_app = Flask(__name__, static_folder='static')
web_app.config['PROPAGATE_EXCEPTIONS'] = True
web_app.secret_key = settings.flask_secret_key
login_manager.init_app(web_app)
web_app.register_blueprint(login_pages)
web_app.register_blueprint(authorize_pages)
web_app.register_blueprint(equipment_pages)
web_app.register_blueprint(profile_pages)

View File

@ -52,10 +52,13 @@ class payment:
"description": reference}]})
payment_response = payment.create()
print 'payment create'
if payment_response:
print payment_response
for link in payment.links:
if link.method == "REDIRECT":
redirect_url = str(link.href)
print redirect_url
return str(redirect_url)
else:
print("Error while creating payment:")
@ -125,6 +128,7 @@ class payment:
}
if self.provider == 'paypal':
print 'subscribe_confirm'
payment_token = args.get('token', '')
billing_agreement_response = paypal.BillingAgreement.execute(payment_token)
amount = 0
@ -171,7 +175,6 @@ class payment:
def subscribe(self, amount, name, redirect_success, redirect_failure, interval_unit='month', interval_length='1'):
print '%s/profile/gocardless' % app_domain
if self.provider == 'gocardless':
return gocardless.client.new_subscription_url(
amount=amount,
@ -239,8 +242,12 @@ class payment:
def confirm(self, args):
confirm_details = {}
confirm_details['successfull'] = False
print '---------------------'
print args
from pprint import pprint
if self.provider == 'paypal':
print args.get('paymentId')
@ -249,7 +256,7 @@ class payment:
pprint(payment)
print pprint(payment)
print payment
confirm_details['name'] = payment['payer']['payer_info'].first_name + ' ' + payment['payer']['payer_info'].last_name
confirm_details['user'] = payment['payer']['payer_info'].email
confirm_details['status'] = payment.state
@ -257,9 +264,15 @@ class payment:
confirm_details['created'] = payment.create_time
confirm_details['reference'] = payment.id
pprint(confirm_details)
if payment.execute({"payer_id": args.get('PayerID')}): # return True or False
confirm_details['successfull'] = True
print("Payment[%s] execute successfully" % (args.get('paymentId')))
else:
print(payment.error)
return confirm_details
if self.provider == 'gocardless':
bill_id = args.get('resource_id')
gocardless.client.confirm_resource(args)
@ -272,5 +285,6 @@ class payment:
#~ confirm_details['amount_minus_fees'] = bill.amount_minus_fees
confirm_details['created'] = bill.created_at
confirm_details['reference'] = bill_id
confirm_details['successfull'] = True
return confirm_details
return None

View File

@ -31,7 +31,7 @@ with web.template as setup:
setup.persistent_header('<link rel="stylesheet" id="navigationCss" href="/static/css/sprite-content-white.css" media="" type="text/css" />')
setup.persistent_header('<script type="text/javascript" src="/static/js/jquery-2.1.4.min.js"></script>')
setup.persistent_header('<script type="text/javascript" src="/static/js/jquery-2.2.3.min.js"></script>')
setup.persistent_header('<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script>')
setup.persistent_header('<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-animate.js"></script>')
setup.persistent_header('<script type="text/javascript" src="/static/js/default.js"></script>')
@ -61,13 +61,21 @@ def header(title, description='Maidstone Hackspace is a shared space where artis
else:
web.menu.append('Login', '/login')
web.template.body.append(web.menu.render())
def footer():
# lets create the footer
web.footer_content.create().append(
web.google_groups_signup.create(' and make yourself known','maidstone-hackspace').set_id('mailing-list-signup').render())
web.template.body.append(web.footer_content.render())
web.template.footer.append(web.footer_content.render())
web.google_analytics.create('maidstone-hackspace.org.uk', 'UA-63373181-1')
web.template.body.append(web.google_analytics.render())
web.template.footer.append(web.google_analytics.render())
# this will be obsoleted
def footer():
#~ web.footer_content.create().append(
#~ web.google_groups_signup.create(' and make yourself known','maidstone-hackspace').set_id('mailing-list-signup').render())
#~ web.template.body.append(web.footer_content.render())
#~ web.google_analytics.create('maidstone-hackspace.org.uk', 'UA-63373181-1')
#~ web.template.body.append(web.google_analytics.render())
return web.render()

View File

@ -41,7 +41,7 @@ def index():
web.page.append(web.form.render())
web.template.body.append(web.page.render())
return footer()
return web.render()
@donate_pages.route("/donate/populate", methods=['GET'])
@ -103,7 +103,7 @@ def populate_by_name():
if matched_user:
badges.assign_badge().execute({'badge_id': badge_lookup.get('backer'), 'user_id': matched_user})
return footer()
return web.render()
@donate_pages.route("/donate/submit", methods=['POST'])
@ -112,8 +112,10 @@ def submit_donation():
provider='paypal',
style='payment')
# convert donation amount to 2 decimal places, paypal seems to require this else it errors
donation_amount = '{0:.2f}'.format(float(request.form.get('amount')))
url = provider.make_donation(
amount=request.form.get('amount'),
amount=donation_amount,
reference=request.form.get('reference', ''),
redirect_success='%s/donate/success' % app_domain,
redirect_failure='%s/donate/failure' % app_domain
@ -123,8 +125,7 @@ def submit_donation():
@donate_pages.route("/donate/success", methods=['GET'])
def success_donation():
# confirm the payment
def donation_successfull():
provider = payment(
provider='paypal',
@ -157,4 +158,18 @@ def success_donation():
"""Thanks your payment has been recieved.""")
web.page.section(web.paragraph.render())
web.template.body.append(web.page.render())
return footer()
return web.render()
@donate_pages.route("/donate/failure", methods=['GET'])
def donation_failed():
web.template.create('Maidstone Hackspace')
header('Maidstone Hackspace Donations')
web.page.create('Looks like something went wrong.')
web.paragraph.create(
"""Sorry looks like something went wrong while trying to take this payment.""")
web.page.section(web.paragraph.render())
web.template.body.append(web.page.render())
return web.render()

View File

@ -34,10 +34,12 @@ def index():
count_users += 1
if item.get('status') is 1:
count_members += 1
print count_members
web.page.section('Members %d' % count_members)
web.page.section('Users %d' % count_users)
web.info_box.create('Current Users')
web.info_box.append('Members %d<br />' % count_members)
web.info_box.append('Users %d<br />' % count_users)
web.page.section(web.info_box.render())
web.container.create(web.member_tiles.render()).set_classes('members')
web.page.section(web.container.render())
web.template.body.append(web.page.render())

View File

@ -11,20 +11,13 @@ from data.site_user import get_user_details, update_membership, update_membershi
from data.profile import update_description, create_description, fetch_users
from data import badges
from data import members
#~ from config.settings import gocardless_environment, gocardless_credentials
from config.settings import app_domain
from libs.payments import payment
from config.settings import *
#~ import gocardless
#~ gocardless.environment = gocardless_environment
#~ gocardless.set_details(**gocardless_credentials)
profile_pages = Blueprint('profile_pages', __name__, template_folder='templates')
@profile_pages.route("/profile", methods=['GET'])
@login_required
def index():
@ -49,8 +42,6 @@ def index():
web.columns.append(web.paragraph.render())
# membership form
#~ if user.get('status') != 1:
print user
web.columns.append(
web.member_card.create(
reference=str(user.get('user_id')).zfill(5),
@ -66,6 +57,13 @@ def index():
'/profile/details'
).set_classes('ajaxPopup').render())
web.paragraph.append(
web.link.create(
'Link a provider to your account like google, by logging in while logged into your account',
'Link login provider',
'/login'
).render())
web.columns.append(web.paragraph.render())
@ -186,8 +184,6 @@ def membership_signup(provider):
'amount': payment_details.get('amount'),
'subscription_reference': payment_details.get('reference')})
web.page.section(web.paragraph.render())
web.template.body.append(web.page.render())
return footer()
@ -205,9 +201,6 @@ def update_profiles():
return web.form.render()
@profile_pages.route("/profile/details", methods=['GET'])
@login_required
def edit_profile():
@ -221,7 +214,6 @@ def edit_profile():
web.form.append(name='skills', label='skills', placeholder='python, arduino, knitting', value=user_details.get('skills') or '')
return web.form.render()
@profile_pages.route("/profile/update", methods=['POST'])
@login_required
def update_profile():

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

4
site/static/js/jquery-2.2.3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -126,6 +126,7 @@ height:48px;width:48px; -webkit-animation:spin 2s linear infinite ;-moz-animatio
.menu li:hover {}
.page {width:980px;margin:auto;margin-top:155px;padding-bottom:48px;background-color:#0087A8;}
.page .pageSection {margin-left: 20px;}
.page .messages{color:#fff;border:10px solid #0087A8;background-color:#00232D; font-weight:bold;}
.page .messages li{padding:10px;}
@ -135,7 +136,7 @@ height:48px;width:48px; -webkit-animation:spin 2s linear infinite ;-moz-animatio
.google-groups-signup input{margin-top:20px;width:282px;}
.google-groups-signup a{color:#fff;width:282px;}
.banner-slide {position:absolute;width:700px;margin:20px;}
.banner-slide {position:absolute;width:700px;margin: 20px 20px 20px 0px;}
.banner-slide ul{position:relative;overflow:hidden;width:700px;height:300px;margin:0px;}
.banner-slide li{position:absolute;left:0px;top:0px;list-style-type:none;padding:0px;margin:0px;}
.banner-slide .button{background-color: #0087A8;border-radius:50%;opacity:0.4;}
@ -209,11 +210,11 @@ height:48px;width:48px; -webkit-animation:spin 2s linear infinite ;-moz-animatio
#login_box label {display:block;margin: 20px 0px 20px;}
#login_box input {margin: 20px 0px 0px;float:none;width:100%;}
#login_box button {margin: 20px 0px 0px;float:left;width:100%;}
#login_box .providers {margin: 20px 0px 20px;height:48px;}
#login_box .providers a {float:left;}
#login_box .providers {margin: 20px 0px 20px;height:48px;height:35px;}
#login_box .providers a {float:left;margin-right:30px;}
.members .tile{ width:220px;float:left;}
.members .stats {}
.members .tile {width:220px;float:left;}
.members .tile-img{margin:10px;width:200px;}
.members .badge{width:32px;height:32px;margin:0px;margin-top:5px;}

View File

@ -1,3 +1,4 @@
from dateutil import parser
from scaffold.core.widget import base_widget_extended
from datetime import datetime
import time
@ -7,19 +8,21 @@ class control(base_widget_extended):
contents = []
def create(self, title="Events", calendar_id=None, api_key=None):
super(control, self).create()
url = 'https://www.googleapis.com/calendar/v3/calendars/%s/events?singleEvents=true&maxResults=2&timeMin=%s&key=%s' % (
date_now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S+00:00')
date_now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S+00:00')
url = 'https://www.googleapis.com/calendar/v3/calendars/%s/events?singleEvents=True&orderBy=startTime&maxResults=2&timeMin=%s&key=%s' % (
calendar_id,
datetime.now().strftime('%Y-%m-%dT%H:%M:%S-00:00'),
api_key)
date_now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S-00:00')
response = requests.get('https://www.googleapis.com/calendar/v3/calendars/contact@maidstone-hackspace.org.uk/events?singleEvents=true&maxResults=2&timeMin=%s&key=AIzaSyA98JvRDmplA9lVLZeKwrs1f2k17resLy0' % date_now)
response = requests.get(url)
calendar_data = response.json()
self.contents = []
# loop over calendar results, and format for display
for event in calendar_data.get('items'):
str_datetime = time.strptime(event.get('start').get('dateTime'), '%Y-%m-%dT%H:%M:%SZ')
formatted_date = time.strftime('%d %b %Y %H:%M', str_datetime)
str_datetime = parser.parse(event.get('start').get('dateTime'))
formatted_date = str_datetime.strftime('%d %b %Y %H:%M')
description = event.get('description') + '<br />' if event.get('description') else ''
location = '<a target="_blank" href="https://www.google.co.uk/maps/search/%s">%s</a>' % (
event.get('location'), event.get('location')) if event.get('location') else ''

View File

@ -16,8 +16,10 @@ class control(base_widget):
htm += '<p>Please login with one of the oauth provider below, which is more secure and does not store passwords on our system.</p>'
if self.oauth_enabled:
htm += '<div class="providers">'
#~ if 'google' in self.oauth_enabled:
#~ htm += '<a title="Login with Google" href="/oauth/google/login"><img src="/static/images/oauth/google.png" /></a>&nbsp;'
if 'google' in self.oauth_enabled:
htm += '<a title="Login with Google" href="/oauth/google/login"><img src="/static/images/oauth/google.png" /></a>&nbsp;'
htm += '<a title="Login with Google" class="but row" href="/oauth/google/login">Login with Google</a>&nbsp;'
if 'facebook' in self.oauth_enabled:
htm += '<a title="Login with facebook" class="but row" href="/oauth/facebook/login">Login with Facebook</a>&nbsp;'
if 'github' in self.oauth_enabled: