maidstone-hackspace/website/pages/profile.py

243 lines
9.2 KiB
Python

from flask import Blueprint
from flask import request
from flask import redirect
from flask.ext.login import current_user, login_required
from website.constants import badge_lookup
from pages.core.authorize import oauth_lookup_name
from pages import web
from pages import header, footer
from data.site_user import get_user_details, get_registered_oauth_providers, update_membership, update_membership_status, get_user_bio, create_membership
from data.profile import update_description, create_description, fetch_users
from data import badges
from data import members
from config.settings import app_domain
from libs.payments import payment
from config.settings import *
profile_pages = Blueprint('profile_pages', __name__, template_folder='templates')
@profile_pages.route("/profile", methods=['GET'])
@login_required
def index():
web.template.create('Maidstone Hackspace - User profile')
header('User Profile', url='/profile')
user = get_user_details({'id': current_user.get_id()}).get()
user_oauth_providers = [provider for provider in get_registered_oauth_providers({'user_id': current_user.get_id()})]
name = '%s %s' % (
user.get('first_name', '').capitalize(),
user.get('last_name', '').capitalize())
web.page.create('%s - Profile' % name)
web.paragraph.create(
web.images.create(user.get('profile_image', '/static/images/hackspace.png'), name).add_attributes('width', '200').render()
)
web.paragraph.add(name)
web.paragraph.add('%s' % (user.get('email', '') if user.get('email', '') else ''))
web.paragraph.add('Last Login %s' % (user.get('last_login', '')))
web.paragraph.add('Member since %s' % (user.get('created', '')))
web.paragraph.add('Description %s' % (user.get('description', '')))
web.paragraph.add('Skills %s' % (user.get('skills', '')))
web.div.create(web.paragraph.render())
web.paragraph.create(
web.link.create(
'Edit Description',
'Edit Description',
'/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.table.create('', ('Login providers', 'Last login'))
for provider in user_oauth_providers:
web.table.append((
str(oauth_lookup_name.get(int(provider.get('provider')))),
provider.get('last_login') if provider.get('last_login') else 'Unknown'))
web.paragraph.append(
web.table.render())
web.page.section(
web.div.append(
web.paragraph.render()
).set_classes('col s6').render()
)
# membership form
web.page.append(
web.div.create(
web.member_card.create(
reference=str(user.get('user_id')).zfill(5),
name=name,
active=user.get('status')==1
).render()
).set_classes('col s6').render()
)
web.template.body.append(web.page.render())
web.template.body.append(web.popup.create('').render())
web.template.body.append('<script type="type/javascript">document.cookie = "status=1";</script>')
return footer()
@profile_pages.route("/profile/setup", methods=['GET'])
@login_required
def setup():
"""utility url, insert new data and refresh user details"""
web.template.body.append('Adding badge Types')
for badge_id, badge_name in badge_lookup.items():
badges.create_badge().execute({'id': badge_id, 'name': badge_name})
user_lookup = {}
for member in fetch_users():
user_lookup[member.get('email')] = member.get('user_id')
provider = payment(provider='paypal', style='payment')
for item in provider.fetch_subscriptions():
print(item)
merchant = gocardless.client.merchant()
#https://jsfiddle.net/api/post/library/pure/
for paying_member in merchant.subscriptions():
print(dir(paying_member))
print(paying_member.user())
print(paying_member.amount)
user=paying_member.user()
print(user.email)
user_id = user_lookup.get(user.email)
print(user_id)
update_membership_status().execute({'user_id': user_id, 'status': '1'})
create_membership().execute({'user_id': user_id, 'status': '1', 'join_date': paying_member.created_at, 'amount': paying_member.amount, 'subscription_id': paying_member.id})
return footer()
@profile_pages.route("/profile/membership", methods=['POST'])
@login_required
def pay_membership():
user = get_user_details({'id': current_user.get_id()}).get()
user_code = str(user.get('user_id')).zfill(5)
selected_provider = request.form.get('provider', 'gocardless')
provider = payment(provider=selected_provider, style='payment')
success_url = '%s/profile/membership/%s/success' % (app_domain, selected_provider)
failure_url = '%s/profile/membership/%s/failure' % (app_domain, selected_provider)
url = provider.subscribe(
amount=request.form.get('amount'),
name="Membership your membership id is MH%s" % user_code,
redirect_success=success_url,
redirect_failure=failure_url
)
return redirect(url)
@profile_pages.route("/profile/membership/failure", methods=['GET'])
@profile_pages.route("/profile/membership/cancel", methods=['GET'])
@login_required
def cancel_membership():
user = get_user_details({'id': current_user.get_id()}).get()
user_code = str(user.get('user_id')).zfill(5)
subscription = members.fetch_member_subscription({'user_id': current_user.get_id()}).get()
print(subscription.get('provider_id'))
print(subscription.get('subscription_reference'))
provider = payment(provider='paypal', style='payment')
provider.lookup_provider_by_id(1)
url = provider.unsubscribe(reference=subscription.get('subscription_reference'))
members.update_membership_status().execute({'user_id':current_user.get_id(), 'status': '0'})
return redirect('/profile')
@profile_pages.route("/profile/membership/<provider>/success", methods=['GET'])
@profile_pages.route("/profile/membership/<provider>/success/", methods=['GET'])
@login_required
def membership_signup(provider):
web.template.create('Maidstone Hackspace')
header('Maidstone Hackspace Member registration')
provider = payment(provider=provider, style='payment')
payment_details = provider.subscribe_confirm(request.args)
try:
web.page.create('Thanks for becoming a member.')
web.paragraph.create(
"""Your membership request has been recieved and will be active shortly.""")
except:
# TODO log what actually has gone wrong
web.page.create('Something went wrong')
web.paragraph.create(
"""We could not confirm the payment something may have gone terribly wrong.""")
if payment_details is None:
return redirect('/profile/membership/failure')
update_membership_status().execute({'user_id': current_user.get_id(), 'status': '1'})
#update_membership().execute({'user_id': str(current_user.get_id()), 'status': '1', 'join_date': details.get('start_date'), 'amount': details.get('amount'), 'subscription_reference': details.get('reference')})
#update_membership_status().execute({'user_id': user_id, 'status': '1'})
create_membership().execute({
'user_id': current_user.get_id(),
'status': '1',
'join_date': payment_details.get('start_date'),
'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()
@profile_pages.route("/profiles/generate", methods=['GET'])
@login_required
def update_profiles():
"""this is used to sync up older accounts"""
for user in get_users():
print(user)
for payment in get_users():
print(user)
return web.form.render()
@profile_pages.route("/profile/details", methods=['GET'])
@login_required
def edit_profile():
user_details = get_user_details({'id': current_user.get_id()}).get() or {}
if not user_details:
print('create')
create_description().execute({'user_id': current_user.get_id()})
web.form.create('Update your details', '/profile/update')
web.form.append(name='description', label='Description', placeholder='This is me i am great', value=user_details.get('description') or '')
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():
""" handle form submit to update description and skills"""
data = {
'user_id': current_user.get_id(),
'skills': request.form.get('skills'),
'description': request.form.get('description')}
user_details = get_user_details({'id': current_user.get_id()}).get() or {}
if user_details.get('user_detail_id', None) is None:
create_description().execute(data)
else:
update_description().execute(data)
return redirect('/profile')