This URL Shortener: http://s-o.link, is built using the web2py framework. I built this web software to easily send tiny links for easy sharing over SMS, for various mobile apps that I build. In particular this mobile app: www.missedmybus.ca.
db.py
import os
import uuid
from datetime import datetime
from pytz import timezone
import pytz
utc = pytz.utc
fmt = '%Y-%m-%d %H:%M:%S'
now = datetime.now(timezone('America/Vancouver'))
current_time = now.strftime(fmt)
db = DAL('sqlite://seishin.sqlite')
response.generic_patterns = ['*'] if request.is_local else []
from gluon.tools import Auth, Service, PluginManager
try:
import json
except ImportError:
from gluon.contrib import simplejson as json
from gluon.contrib.login_methods.oauth20_account import OAuthAccount
class GoogleAccount(OAuthAccount):
"OAuth 2.0 for Google"
def __init__(self):
with open(os.path.join(request.folder, 'private/google_auth.json'), 'rb') as f:
gai = Storage(json.load(f)['web'])
OAuthAccount.__init__(self, None, gai.client_id, gai.client_secret,
gai.auth_uri, gai.token_uri,
scope='https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email',
approval_prompt='auto', state="auth_provider=google")
def get_user(self):
token = self.accessToken()
if not token:
return None
uinfo_url = 'https://www.googleapis.com/oauth2/v2/userinfo?access_token=%s' % urllib2.quote(token, safe='')
uinfo = None
try:
uinfo_stream = urllib2.urlopen(uinfo_url)
except:
session.token = None
return
data = uinfo_stream.read()
uinfo = json.loads(data)
#username = uinfo['email']
return dict(first_name = uinfo['given_name'],
last_name = uinfo['family_name'],
username = uinfo['email'],
email = uinfo['email'])
auth.settings.actions_disabled=['change_password','request_reset_password']
auth.define_tables(username=True, signature=False)
GoogleForm = GoogleAccount()
auth.settings.login_form = GoogleForm
### Other Standard Web2py Stuff ###
from gluon.contrib.sms_utils import SMSCODES, sms_email
mykeys = ['%s' % (k) for k,v in SMSCODES.iteritems()]
db.define_table('seishin',
Field('url', label='URL', comment='Website address to shorten', requires=IS_URL()),
Field('uuid', label='UUID', length=64, default=str(uuid.uuid4())[:4]),
Field('views', 'integer', default=0, readable=False, writable=False),
Field('time_clicked', default=current_time, writable=False, readable=False))
db.define_table('sendToSMS',
Field('userinfo', db.auth_user, default=auth.user_id, writable=False, readable=False),
Field('phone_number', label="To: 1 (111) 111-1111", required=True),
Field('phone_network', label="Phone Network:", requires=IS_IN_SET(mykeys, zero = 'Please Choose One' )),
Field('subject', label="Subject:", comment='Max 50 characters', requires=IS_LENGTH(maxsize=50, minsize=3), length=120),
Field('message', label="Message:", comment='Max 255 characters', requires=IS_LENGTH(maxsize=255, minsize=5)),
Field('time_pushed', default=current_time, writable=False, readable=False))
default.py
import random
import string
import uuid
import re
def count_sms(form):
msg_append = DOMAIN+"/index/"+request.args(0)
check = db(db.seishin.uuid == str(request.args(0))).select(db.seishin.ALL).first()
userinfo = db(db.auth_user.id == auth.user).select(db.auth_user.ALL).first()
if check:
number = str(form.vars.phone_number).rstrip()
network = str(form.vars.phone_network).rstrip()
topic = str(form.vars.subject).rstrip()
mmessage = str(form.vars.message).rstrip()
msg_len = len(mmessage)
mmessage = mmessage + "\n\n" + msg_append
reply = userinfo.email
email = sms_email(number, network)
mail.send(to=email, subject=topic, message=mmessage, reply_to=str(reply))
else:
session.flash = 'I dunno wht happered, I was on my way to gert a pack of smokes... . and here I am...'
return redirect(DOMAIN)
@auth.requires_login()
def sendToSMS():
if not request.args(0):
session.flash = 'I dunno wht happered, I was on my way to gert a pack of smokes... . and here I am...'
return redirect(DOMAIN)
public_key = ''
private_key = ''
ninjaTimeCheck = db(db.sendToSMS.userinfo == auth.user_id).select(db.sendToSMS.ALL).first()
if ninjaTimeCheck:
start = ninjaTimeCheck.time_pushed
start = datetime.strptime(str(start), fmt)
end = datetime.strptime(str(current_time), fmt)
diff = end - start
totalSeconds = diff.total_seconds()
totalSeconds = int(totalSeconds)
if totalSeconds <= 3600:
session.flash = 'Stumble, stumble, roll, crawl, stagger, stagger - Please wait 60 minutes to send again.'
return redirect(DOMAIN)
form = SQLFORM(db.sendToSMS, formstyle='bootstrap')
form[0].insert(4, DIV(Recaptcha(request, public_key, private_key, use_ssl=True, options="theme : 'clean'")))
if form.accepts(request.vars, session, onvalidation=count_sms):
userinfo = db(db.auth_user.id == auth.user).select(db.auth_user.ALL).first()
number = str(form.vars.phone_number).rstrip()
network = str(form.vars.phone_network).rstrip()
topic = str(form.vars.subject).rstrip()
reply = userinfo.email
session.flash = '%s %s %s %s - sent' % (number, network, topic, reply)
return redirect(DOMAIN)
elif form.errors.has_key('captcha'):
response.flash='WHY IS captcha so annoying? - Captcha had a heart attack, please try again'
return dict(form=form)
elif form.errors:
response.flash = 'Keyboard fail! Let\'s try that again'
return dict(form=form)
else:
return dict(form=form)
def validate_url(form):
uuidN = str(form.vars.uuid)
uuidN = uuidN.replace(" ", "")
if ("://" in uuidN):
uuidN = uuidN.replace("://", "")
uuidN = IS_SLUG()(uuidN)[0]
url = form.vars.url
url = url.lower()
website = DOMAIN
if (website in url):
form.errors.url = T("Invalid: %s in url" % DOMAIN)
form.vars.uuid = uuidN
check = db(db.seishin.uuid == uuidN).select(db.seishin.ALL).first()
if check:
rand = random.choice(string.letters)
N = uuid.uuid4()
uuidN = uuidN + str(N)[:2]
form.vars.uuid = str(rand) + "_" + uuidN
def index():
uid = request.args(0)
if not uid:
form = SQLFORM(db.seishin, formstyle='bootstrap')
websites = session.websites or []
if form.accepts(request.vars, session, onvalidation=validate_url):
session.flash = 'and in the shortest moment a great lengthening occurred'
websites.append(dict(url = form.vars.uuid))
session.websites = websites
return dict(form=form, websites=websites)
elif form.errors:
response.flash = 'Keyboard fail! Let\'s try that again'
return dict(form=form, websites=websites)
if session.flash == None or session.flash == "":
response.flash = 'I see your website address is as big as mine. *wink *wink'
return dict(form=form, websites=websites)
else:
post = db(db.seishin.uuid == str(uid)).select(db.seishin.ALL).first() or redirect(DOMAIN)
if post:
post.update_record(views=post.views+1)
start = post.time_clicked
start = datetime.strptime(str(start), fmt)
end = datetime.strptime(str(current_time), fmt)
diff = end - start
totalSeconds = diff.total_seconds()
totalSeconds = int(totalSeconds)
if totalSeconds <= 2:
post.update_record(time_clicked=current_time)
#session.flash = 'end: %s - start: %s = totalSeconds: %s' % (end, start, totalSeconds)
session.flash = 'Clicking to fast leads to heart failure'
return redirect(DOMAIN)
post.update_record(time_clicked=current_time)
#session.flash = 'end: %s - start: %s = totalSeconds: %s' % (end, start, totalSeconds)
return redirect(post.url)