From f68db21dc3c2337ac068c15626687ebaeec9d8e1 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 8 Aug 2014 17:28:18 +0200 Subject: [PATCH] Generate some activation codes --- migration.sql | 1 + tekstmelding.py | 59 +++++++++++++++++++++++++++++++++++++++++-------- utils.py | 22 ++++++++++++++++++ 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 migration.sql create mode 100644 utils.py diff --git a/migration.sql b/migration.sql new file mode 100644 index 0000000..9018f5e --- /dev/null +++ b/migration.sql @@ -0,0 +1 @@ +ALTER TABLE `din_sms_sent` ADD `activation_code` VARCHAR( 10 ) NULL ; diff --git a/tekstmelding.py b/tekstmelding.py index 89f9adc..c71480e 100644 --- a/tekstmelding.py +++ b/tekstmelding.py @@ -1,12 +1,15 @@ -from flask import Flask, request, g, abort +from flask import Flask, request, g, abort, jsonify import MySQLdb import MySQLdb.cursors import datetime import config +from utils import CustomJSONEncoder, generate_activation_code + app = Flask(__name__) app.config.from_object('config') +app.json_encoder = CustomJSONEncoder def connect_db(): """Connects to our database.""" @@ -15,7 +18,8 @@ def connect_db(): user = app.config['DATABASE_USER'], passwd = app.config['DATABASE_PASS'], db = app.config['DATABASE_NAME'], - cursorclass = MySQLdb.cursors.DictCursor) + cursorclass = MySQLdb.cursors.DictCursor, + charset='utf8') return db def get_db(): @@ -31,19 +35,26 @@ def close_db(error): if hasattr(g, 'db'): g.db.close() -def query_db(query, args=(), one=False): +def query_db(query, args=(), one=False, lastrowid=False): """Queries the database. Will use an existing or new database connection, create a cursor, execute the query, fetch all rows, close the cursor then return the rows. """ + assert not (one and lastrowid) + cur = get_db().cursor() if app.config['DEBUG']: app.logger.debug("Query: %s\nArgs: %s", query, args) cur.execute(query, args) - rv = cur.fetchall() + + if lastrowid: + ret = cur.lastrowid + else: + rv = cur.fetchall() + ret = (rv[0] if rv else None) if one else rv cur.close() - return (rv[0] if rv else None) if one else rv + return ret def get_user_by_phone(number): user = query_db(""" @@ -55,12 +66,20 @@ def get_user_by_phone(number): return user def log_incoming(userid, gsm, codeword, message, operator, shortno, action, ip, simulation): - query_db(""" + return query_db(""" INSERT INTO din_sms_received (userid, gsm, codeword, message, operator, shortno, action, IP, simulation) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) - """, [userid, gsm, codeword, message, operator, shortno, action, ip, simulation]) + """, [userid, gsm, codeword, message, operator, shortno, action, ip, simulation], lastrowid=True) + +def log_sent(response_to, msgid, sender, receiver, countrycode, message, operator, codeword, billing_price, use_dlr, simulation, activation_code): + query_db(""" + INSERT INTO din_sms_sent + (response_to, msgid, sender, receiver, countrycode, message, operator, codeword, billing_price, use_dlr, simulation, activation_code) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, [response_to, msgid, sender, receiver, countrycode, message, operator, codeword, billing_price, use_dlr, simulation, activation_code]) @app.route('/') def main(): @@ -83,7 +102,7 @@ def callback(): # but can we can't receive messages from operators. Right? user = get_user_by_phone("+47%s" % gsm) - log_incoming( + id_incoming_sms = log_incoming( userid = int(user['id']) if user else None, gsm = gsm, codeword = codeword, @@ -94,7 +113,29 @@ def callback(): ip = ip, simulation = 0) - return str(user.items()) if user else 'None' + if app.config['DEBUG']: + app.logger.debug("cursor.lastrowid: %s", id_incoming_sms) + + if user: + return jsonify(user.items()) + else: + result = {'result': 'No existing member.', 'action': 'new_membership_send_code'} + activation_code = generate_activation_code() + log_sent( + response_to = id_incoming_sms, + msgid = 1337, + sender = 'dns', + receiver = gsm, + countrycode = operator[:1], + message = "Velkommen! Dette er et midlertidig medlemsbevis. Aktiver medlemskapet ditt her: https://s.neuf.no/sms?n=%s&c=%s" % (gsm, activation_code), + operator = operator, + codeword = codeword, + billing_price = 230 * 100, + use_dlr = 0, + simulation = 0, + activation_code = activation_code) + + return jsonify(result) if __name__ == '__main__': app.run() diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..7d336d7 --- /dev/null +++ b/utils.py @@ -0,0 +1,22 @@ +from datetime import date +from flask.json import JSONEncoder +import string +import random + +class CustomJSONEncoder(JSONEncoder): + def default(self, obj): + try: + if isinstance(obj, date): + return obj.isoformat() + iterable = iter(obj) + except TypeError: + pass + else: + return list(iterable) + return JSONEncoder.default(self, obj) + +def generate_activation_code(length=5): + chars = string.ascii_lowercase + string.digits + # remove easily misintepreted chars + chars = chars.translate(None,'0oil1wv') + return ''.join(random.choice(chars) for _ in range(length))