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 upgrade -y && \
apt-get install -y libssl-dev libffi-dev && \ apt-get install -y libssl-dev libffi-dev && \
apt-get install -y software-properties-common python-software-properties && \ 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 && \ apt-get install -y cssmin slimit && \
add-apt-repository -y ppa:oly/ppa && \ add-apt-repository -y ppa:oly/ppa && \
apt-get update && \ 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 for paypal you can use this email and password
email = contact-buyer@maidstone-hackspace.org.uk email = contact-buyer@maidstone-hackspace.org.uk
password = mhackspace password = Mhackspace
To test the gocardless integration you can use these card details To test the gocardless integration you can use these card details
sortcode = 200000 sortcode = 200000
account number = 55779911 account number = 55779911
Run locally with uwsgi on port 9090 Run locally with uwsgi on port 9090
uwsgi --plugins python --http-socket :9090 -w wsgi uwsgi --plugins python --http-socket :9090 -w wsgi

View File

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

View File

@ -9,7 +9,7 @@ from flask import redirect, abort
from flask import make_response from flask import make_response
from flask import request from flask import request
from flask import Blueprint 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 import OAuth2Session
from requests_oauthlib.compliance_fixes import facebook_compliance_fix from requests_oauthlib.compliance_fixes import facebook_compliance_fix
@ -51,6 +51,7 @@ def todict(data):
class User(UserMixin): class User(UserMixin):
def __init__(self, user_id, active=True): def __init__(self, user_id, active=True):
print user_id print user_id
self.id = None
user_details = site_user.get_user_details({'id': user_id}).get() user_details = site_user.get_user_details({'id': user_id}).get()
self.active = False self.active = False
print 'user' print 'user'
@ -77,6 +78,7 @@ class User(UserMixin):
@login_manager.user_loader @login_manager.user_loader
def load_user(userid): def load_user(userid):
"""Flask user loader hook, internal to flask login"""
return User(userid) return User(userid)
@ -98,9 +100,9 @@ def load_token(request):
return user return user
return None return None
def auth_required(): #~ def auth_required():
if not session.get('user_id'): #~ if not session.get('user_id'):
redirect(domain + '/login', 301) #~ redirect(domain + '/login', 301)
@authorize_pages.route("/register", methods=['GET']) @authorize_pages.route("/register", methods=['GET'])
def register_form(): def register_form():
@ -145,10 +147,11 @@ def register_submit():
web.template.body.append(web.page.render()) web.template.body.append(web.page.render())
return make_response(footer()) return make_response(footer())
@authorize_pages.route("/oauth/<provider>/<state>", methods=['GET']) @authorize_pages.route("/oauth/<provider>/<start_oauth_login>/", 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>/", 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_verify = True
oauth_provider = oauth_conf.get(provider) oauth_provider = oauth_conf.get(provider)
oauth_access_type = '' oauth_access_type = ''
@ -159,8 +162,8 @@ def oauth(provider, state=None):
oauth_approval_prompt = "force" oauth_approval_prompt = "force"
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
oauth_provider.get('redirect_uri') if start_oauth_login:
if state: print oauth_provider.get('redirect_uri')
oauth_session = OAuth2Session( oauth_session = OAuth2Session(
oauth_provider.get('client_id'), oauth_provider.get('client_id'),
scope=oauth_provider.get('scope'), scope=oauth_provider.get('scope'),
@ -169,9 +172,6 @@ def oauth(provider, state=None):
if provider == 'facebook': if provider == 'facebook':
oauth_session = facebook_compliance_fix(oauth_session) 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( authorization_url, state = oauth_session.authorization_url(
oauth_provider.get('auth_uri'), oauth_provider.get('auth_uri'),
access_type=oauth_access_type, access_type=oauth_access_type,
@ -184,14 +184,18 @@ def oauth(provider, state=None):
return redirect(authorization_url) return redirect(authorization_url)
# allready authorised so lets handle the callback # allready authorised so lets handle the callback
oauth_provider.get('redirect_uri')
oauth_session = OAuth2Session( oauth_session = OAuth2Session(
oauth_provider.get('client_id'), oauth_provider.get('client_id'),
state=session['oauth_state'], state=session['oauth_state'],
redirect_uri=oauth_provider.get('redirect_uri')) redirect_uri=oauth_provider.get('redirect_uri'))
print '----------'
print oauth_provider.get('redirect_uri')
print request.url
if provider == 'facebook': if provider == 'facebook':
oauth_session = facebook_compliance_fix(oauth_session) oauth_session = facebook_compliance_fix(oauth_session)
# code error is todo with authorisation response # code error is todo with authorisation response
oauth_session.fetch_token( oauth_session.fetch_token(
@ -212,33 +216,49 @@ def oauth(provider, state=None):
oauth_user = site_user.fetch_oauth_login({ oauth_user = site_user.fetch_oauth_login({
'username': oauth_id or '', 'username': oauth_id or '',
'provider': provider_id 'provider': provider_id
}).get() }).get()
if oauth_user: if oauth_user:
user_details = site_user.get_user_details({ user_details = site_user.get_user_details({
'id': oauth_user.get('user_id') 'id': oauth_user.get('user_id')
}).get() }).get()
# we have matched a user so login and redirect # we have matched a user so login and redirect
if user_details: 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'))) 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') return redirect('/profile')
flash('Your new profile has been created, and your now logged in') 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 # create new user from oauth information
user_id = site_user.create().execute({
'email': oauth_response.get('email') or '', new_user_details = {
'password': 'oauth', 'password': 'oauth',
'profile_image': oauth_response.get('picture'), 'profile_image': oauth_response.get('picture'),
'username': oauth_id, 'username': oauth_id,
'first_name': oauth_response.get('given_name') or '', '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 # register oauth login creation
site_user.create_oauth_login().execute({ site_user.create_oauth_login().execute({
@ -246,12 +266,11 @@ def oauth(provider, state=None):
'username': oauth_id or '', 'username': oauth_id or '',
'provider': provider_id}) '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)) login_user(User(user_id))
site_user.update_last_login().execute({'id': 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') return redirect('/profile')
@ -362,73 +381,28 @@ def reset_password_submit():
web.template.body.append(web.page.render()) web.template.body.append(web.page.render())
return make_response(footer()) return make_response(footer())
@authorize_pages.route("/profile/email", methods=['GET']) #~ @authorize_pages.route("/login", methods=['GET'])
def change_email(): #~ def login_screen():
web.template.create('%s - Change Email' % site_name) #~ web.template.create('Maidstone Hackspace - Login')
header('Members Login') #~ header('Members Login')
web.page.create('Set your E-Mail address') #~ web.page.create('Member Login')
#~ web.page.section(
web.form.create('Set E-Mail address for account', '/profile/email') #~ web.login_box.create().enable_oauth('google').enable_oauth('facebook').enable_oauth('github').render()
web.form.append(name='email', label='Valid Email', placeholder='ralf@maidstone-hackspace.org.uk', value='') #~ )
#~ 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']) @authorize_pages.route("/login/failure", methods=['GET'])
def login_screen(): def login_Failure():
web.template.create('Maidstone Hackspace - Login') web.template.create('%s - Login' % site_name)
header('Members Login') header('Login Failure')
web.page.create('Member Login') web.page.create('Login Failure')
web.page.section(
web.login_box.create().enable_oauth('google').enable_oauth('facebook').enable_oauth('github').render()
)
#~ web.template.body.append(web.messages.render()) #~ web.template.body.append(web.messages.render())
web.template.body.append(web.page.render()) web.template.body.append(web.page.render())
return make_response(footer()) 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") @authorize_pages.route("/logout")
def logout(): def logout():
logout_user() 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" />') setup.persistent_header('<link rel="stylesheet" id="navigationCss" href="/static/css/sprite-content-white.css" media="" type="text/css" />')
#javascript, using jquery and angular #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.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="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>') 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 = [ 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/hackspace-banner.png', '', '', ''),
('/static/images/banners/audio_board.jpg', 'Audio board', 'Audio board', ''), ('/static/images/banners/audio_board.jpg', 'Audio board', 'Audio board', ''),
('/static/images/banners/microscope.jpg', '', 'Microscope', ''), ('/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): class create_basic_user(insert_data):
"""not able to actually log in but registered on the system""" """not able to actually log in but registered on the system"""
table = 'users' table = 'users'
required = {'email', 'first_name', 'last_name'} required = {'first_name', 'last_name'}
columns = {'email','first_name', 'last_name'} columns = {'first_name', 'last_name'}
def calculated_data(self): def calculated_data(self):
return {'created': time.strftime('%Y-%m-%d %H:%M:%S')} return {'created': time.strftime('%Y-%m-%d %H:%M:%S')}
@ -24,8 +24,8 @@ class create_basic_user(insert_data):
class create(insert_data): class create(insert_data):
table = 'users' table = 'users'
required = {'email', 'password', 'username', 'first_name', 'last_name', 'created'} required = {'password', 'username', 'first_name', 'last_name', 'created'}
columns = {'email', 'password', 'username', 'first_name', 'last_name', 'created'} columns = {'password', 'username', 'first_name', 'last_name', 'created'}
columns_optional = {'profile_image'} columns_optional = {'profile_image'}
def calculated_data(self): def calculated_data(self):
@ -41,6 +41,12 @@ class update_last_login(update_data):
required = {'id'} required = {'id'}
columns_where = {'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): class update_membership_status(update_data):
debug = True debug = True
query_str = "update `users` set `status`=%(status)s where id=%(user_id)s" 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 debug = True
table = 'user_oauth' table = 'user_oauth'
required = {'username', 'provider', 'user_id'} required = {'username', 'provider', 'user_id'}
columns = {'username', 'provider', 'user_id'} columns = {'username', 'provider', 'user_id', 'registered'}
#~ def calculated_data(self): def calculated_data(self):
#~ return {'registered': time.strftime('%Y-%m-%d %H:%M:%S')} 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)
class update_oauth_login(update_data): class update_oauth_login(update_data):
table = 'user_oauth' table = 'user_oauth'
columns = {'username', 'provider', 'last_login'}
required = {'username', 'provider'} required = {'username', 'provider'}
query_file = 'get_user_by_oauth_username.sql' query_file = 'get_user_by_oauth_username.sql'
columns_where = {'username', 'provider'} columns_where = {'username', 'provider'}
def calculated_data(self): def calculated_data(self):
return {'registered': time.strftime('%Y-%m-%d %H:%M:%S')} return {
'last_login': 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)
class fetch_oauth_login(select_data): class fetch_oauth_login(select_data):
required = {'username', 'provider'} required = {'username', 'provider'}

View File

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

View File

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

View File

@ -52,10 +52,13 @@ class payment:
"description": reference}]}) "description": reference}]})
payment_response = payment.create() payment_response = payment.create()
print 'payment create'
if payment_response: if payment_response:
print payment_response
for link in payment.links: for link in payment.links:
if link.method == "REDIRECT": if link.method == "REDIRECT":
redirect_url = str(link.href) redirect_url = str(link.href)
print redirect_url
return str(redirect_url) return str(redirect_url)
else: else:
print("Error while creating payment:") print("Error while creating payment:")
@ -125,6 +128,7 @@ class payment:
} }
if self.provider == 'paypal': if self.provider == 'paypal':
print 'subscribe_confirm'
payment_token = args.get('token', '') payment_token = args.get('token', '')
billing_agreement_response = paypal.BillingAgreement.execute(payment_token) billing_agreement_response = paypal.BillingAgreement.execute(payment_token)
amount = 0 amount = 0
@ -171,7 +175,6 @@ class payment:
def subscribe(self, amount, name, redirect_success, redirect_failure, interval_unit='month', interval_length='1'): 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': if self.provider == 'gocardless':
return gocardless.client.new_subscription_url( return gocardless.client.new_subscription_url(
amount=amount, amount=amount,
@ -239,8 +242,12 @@ class payment:
def confirm(self, args): def confirm(self, args):
confirm_details = {} confirm_details = {}
confirm_details['successfull'] = False
print '---------------------' print '---------------------'
print args print args
from pprint import pprint from pprint import pprint
if self.provider == 'paypal': if self.provider == 'paypal':
print args.get('paymentId') print args.get('paymentId')
@ -249,7 +256,7 @@ class payment:
pprint(payment) pprint(payment)
print pprint(payment) print pprint(payment)
print payment print payment
confirm_details['name'] = payment['payer']['payer_info'].first_name + ' ' + payment['payer']['payer_info'].last_name 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['user'] = payment['payer']['payer_info'].email
confirm_details['status'] = payment.state confirm_details['status'] = payment.state
@ -257,9 +264,15 @@ class payment:
confirm_details['created'] = payment.create_time confirm_details['created'] = payment.create_time
confirm_details['reference'] = payment.id confirm_details['reference'] = payment.id
pprint(confirm_details) 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 return confirm_details
if self.provider == 'gocardless': if self.provider == 'gocardless':
bill_id = args.get('resource_id') bill_id = args.get('resource_id')
gocardless.client.confirm_resource(args) gocardless.client.confirm_resource(args)
@ -272,5 +285,6 @@ class payment:
#~ confirm_details['amount_minus_fees'] = bill.amount_minus_fees #~ confirm_details['amount_minus_fees'] = bill.amount_minus_fees
confirm_details['created'] = bill.created_at confirm_details['created'] = bill.created_at
confirm_details['reference'] = bill_id confirm_details['reference'] = bill_id
confirm_details['successfull'] = True
return confirm_details return confirm_details
return None 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('<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.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="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>') 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: else:
web.menu.append('Login', '/login') web.menu.append('Login', '/login')
web.template.body.append(web.menu.render()) web.template.body.append(web.menu.render())
def footer(): # lets create the footer
web.footer_content.create().append( web.footer_content.create().append(
web.google_groups_signup.create(' and make yourself known','maidstone-hackspace').set_id('mailing-list-signup').render()) 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.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() return web.render()

View File

@ -41,7 +41,7 @@ def index():
web.page.append(web.form.render()) web.page.append(web.form.render())
web.template.body.append(web.page.render()) web.template.body.append(web.page.render())
return footer() return web.render()
@donate_pages.route("/donate/populate", methods=['GET']) @donate_pages.route("/donate/populate", methods=['GET'])
@ -103,7 +103,7 @@ def populate_by_name():
if matched_user: if matched_user:
badges.assign_badge().execute({'badge_id': badge_lookup.get('backer'), 'user_id': 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']) @donate_pages.route("/donate/submit", methods=['POST'])
@ -112,8 +112,10 @@ def submit_donation():
provider='paypal', provider='paypal',
style='payment') 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( url = provider.make_donation(
amount=request.form.get('amount'), amount=donation_amount,
reference=request.form.get('reference', ''), reference=request.form.get('reference', ''),
redirect_success='%s/donate/success' % app_domain, redirect_success='%s/donate/success' % app_domain,
redirect_failure='%s/donate/failure' % app_domain redirect_failure='%s/donate/failure' % app_domain
@ -123,8 +125,7 @@ def submit_donation():
@donate_pages.route("/donate/success", methods=['GET']) @donate_pages.route("/donate/success", methods=['GET'])
def success_donation(): def donation_successfull():
# confirm the payment
provider = payment( provider = payment(
provider='paypal', provider='paypal',
@ -157,4 +158,18 @@ def success_donation():
"""Thanks your payment has been recieved.""") """Thanks your payment has been recieved.""")
web.page.section(web.paragraph.render()) web.page.section(web.paragraph.render())
web.template.body.append(web.page.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 count_users += 1
if item.get('status') is 1: if item.get('status') is 1:
count_members += 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.container.create(web.member_tiles.render()).set_classes('members')
web.page.section(web.container.render()) web.page.section(web.container.render())
web.template.body.append(web.page.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.profile import update_description, create_description, fetch_users
from data import badges from data import badges
from data import members from data import members
#~ from config.settings import gocardless_environment, gocardless_credentials
from config.settings import app_domain from config.settings import app_domain
from libs.payments import payment from libs.payments import payment
from config.settings import * 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 = Blueprint('profile_pages', __name__, template_folder='templates')
@profile_pages.route("/profile", methods=['GET']) @profile_pages.route("/profile", methods=['GET'])
@login_required @login_required
def index(): def index():
@ -49,8 +42,6 @@ def index():
web.columns.append(web.paragraph.render()) web.columns.append(web.paragraph.render())
# membership form # membership form
#~ if user.get('status') != 1:
print user
web.columns.append( web.columns.append(
web.member_card.create( web.member_card.create(
reference=str(user.get('user_id')).zfill(5), reference=str(user.get('user_id')).zfill(5),
@ -66,6 +57,13 @@ def index():
'/profile/details' '/profile/details'
).set_classes('ajaxPopup').render()) ).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()) web.columns.append(web.paragraph.render())
@ -186,8 +184,6 @@ def membership_signup(provider):
'amount': payment_details.get('amount'), 'amount': payment_details.get('amount'),
'subscription_reference': payment_details.get('reference')}) 'subscription_reference': payment_details.get('reference')})
web.page.section(web.paragraph.render()) web.page.section(web.paragraph.render())
web.template.body.append(web.page.render()) web.template.body.append(web.page.render())
return footer() return footer()
@ -205,9 +201,6 @@ def update_profiles():
return web.form.render() return web.form.render()
@profile_pages.route("/profile/details", methods=['GET']) @profile_pages.route("/profile/details", methods=['GET'])
@login_required @login_required
def edit_profile(): 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 '') web.form.append(name='skills', label='skills', placeholder='python, arduino, knitting', value=user_details.get('skills') or '')
return web.form.render() return web.form.render()
@profile_pages.route("/profile/update", methods=['POST']) @profile_pages.route("/profile/update", methods=['POST'])
@login_required @login_required
def update_profile(): 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 {} .menu li:hover {}
.page {width:980px;margin:auto;margin-top:155px;padding-bottom:48px;background-color:#0087A8;} .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{color:#fff;border:10px solid #0087A8;background-color:#00232D; font-weight:bold;}
.page .messages li{padding:10px;} .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 input{margin-top:20px;width:282px;}
.google-groups-signup a{color:#fff;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 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 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;} .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 label {display:block;margin: 20px 0px 20px;}
#login_box input {margin: 20px 0px 0px;float:none;width:100%;} #login_box input {margin: 20px 0px 0px;float:none;width:100%;}
#login_box button {margin: 20px 0px 0px;float:left;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 {margin: 20px 0px 20px;height:48px;height:35px;}
#login_box .providers a {float:left;} #login_box .providers a {float:left;margin-right:30px;}
.members .stats {}
.members .tile{ width:220px;float:left;} .members .tile {width:220px;float:left;}
.members .tile-img{margin:10px;width:200px;} .members .tile-img{margin:10px;width:200px;}
.members .badge{width:32px;height:32px;margin:0px;margin-top:5px;} .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 scaffold.core.widget import base_widget_extended
from datetime import datetime from datetime import datetime
import time import time
@ -7,19 +8,21 @@ class control(base_widget_extended):
contents = [] contents = []
def create(self, title="Events", calendar_id=None, api_key=None): def create(self, title="Events", calendar_id=None, api_key=None):
super(control, self).create() 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, calendar_id,
datetime.now().strftime('%Y-%m-%dT%H:%M:%S-00:00'), datetime.now().strftime('%Y-%m-%dT%H:%M:%S-00:00'),
api_key) 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() calendar_data = response.json()
self.contents = [] self.contents = []
# loop over calendar results, and format for display # loop over calendar results, and format for display
for event in calendar_data.get('items'): for event in calendar_data.get('items'):
str_datetime = time.strptime(event.get('start').get('dateTime'), '%Y-%m-%dT%H:%M:%SZ') str_datetime = parser.parse(event.get('start').get('dateTime'))
formatted_date = time.strftime('%d %b %Y %H:%M', str_datetime) formatted_date = str_datetime.strftime('%d %b %Y %H:%M')
description = event.get('description') + '<br />' if event.get('description') else '' 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>' % ( 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 '' 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>' 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: if self.oauth_enabled:
htm += '<div class="providers">' 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: 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: if 'facebook' in self.oauth_enabled:
htm += '<a title="Login with facebook" class="but row" href="/oauth/facebook/login">Login with Facebook</a>&nbsp;' htm += '<a title="Login with facebook" class="but row" href="/oauth/facebook/login">Login with Facebook</a>&nbsp;'
if 'github' in self.oauth_enabled: if 'github' in self.oauth_enabled: