Beispiel #1
0
    def generate_report():
        try:
            # left join job group for job group id
            history = pd.read_sql_table(table_name='history',
                                        con=db.engine,
                                        parse_dates=['date'])
            rate = pd.read_sql_table(table_name='rate', con=db.engine)
            df = pd.merge(history,
                          rate,
                          how='left',
                          left_on='jid',
                          right_on='jid',
                          sort=True)
            df['amountpaid'] = df['hours'].astype(float) * df['rate'].astype(
                float)
            df['payperiod'] = df['date'].apply(
                lambda x: f"1/{x.month}/{x.year} - 15/{x.month}/{x.year}"
                if x.day <= 15 else
                f"16/{x.month}/{x.year} - 30/{x.month}/{x.year}")
            df = df[['payperiod', 'eid',
                     'amountpaid']].groupby(['payperiod',
                                             'eid']).sum().reset_index()
            return df.to_json(orient="records")

        except Exception as e:
            logger.error(e)
            raise e
Beispiel #2
0
    def get(self):
        '''
        Article get
        '''
        try:
            _article_id = request.args.get('id', None, int)
            _article_title = request.args.get('title', None, str)
            _article_author = request.args.get('author', None, str)
            _article_text = request.args.get('text', None, str)
            _article_body = request.args.get('body', None, str)

            if _article_id is not None:
                result_list = db.session.query(ArticleModel.article_id,
                                               ArticleModel.article_author,
                                               ArticleModel.article_title,
                                               ArticleModel.article_text,
                                               ArticleModel.article_body). \
                    filter(ArticleModel.article_id == _article_id).first()

                if result_list is None:
                    return [], 404

                return [ArticleSchema().dump(_).data for _ in [result_list]]

            if _article_title is not None:
                result_list = db.session.query(ArticleModel.article_id,
                                               ArticleModel.article_author,
                                               ArticleModel.article_title,
                                               ArticleModel.article_text,
                                               ArticleModel.article_body). \
                    filter(ArticleModel.article_title.like('%{0}%'.format(_article_title)))
                if _article_author is not None:
                    result_list = result_list.filter(
                        ArticleModel.article_author.like(
                            '%{0}%'.format(_article_author)))
                if _article_text is not None:
                    result_list = result_list.filter(
                        ArticleModel.article_text.like(
                            '%{0}%'.format(_article_text)))
                if _article_body is not None:
                    result_list = result_list.filter(
                        ArticleModel.article_body.like(
                            '%{0}%'.format(_article_body)))
                result_list = result_list.limit(10).all()

                if result_list == []:
                    return [], 404
            else:
                return {'code': 400, 'message': ' Bad Request '}, 400

            return [ArticleSchema().dump(_).data for _ in result_list]
        except Exception as e:
            logger.error(e)
            return {'code': 500, 'message': ' Internal Server Error '}, 500
Beispiel #3
0
def verify_pw(user_sid, password):
    try:
        user = User.query.filter_by(user_sid=user_sid).first()
        if not user:
            raise Exception("No user for {}".format(user_sid))

        if check_password_hash(user.hashed_token, password):
            g.user = user
            return True

    except Exception as e:
        logger.error("Error: %s" % e)
Beispiel #4
0
    def add(session, df):
        # add job group if its new
        try:
            jgs = df['jg'].drop_duplicates()
            for name in jgs.values.tolist():
                jg = JobGroupModel.query.filter_by(name=name).first()
                if jg is None:
                    newjg = JobGroupModel(name=name)
                    session.add(newjg)

        except Exception as e:
            logger.error(e)
            raise e
Beispiel #5
0
def verify_pw(user_sid, password):
	try:
		user = User.query.filter_by(user_sid=user_sid).first()
		
		if not user:
			raise Exception("No user for {}".format(user_sid))

		if check_password_hash(user.hashed_token, password):
			g.user = user
			return True

	except Exception as e:
		logger.error("Error: %s" % e)
Beispiel #6
0
def init_values():
    from model.Rate import RateModel
    from model import db
    a_rate = RateModel(rate=20, jid=1)
    b_rate = RateModel(rate=30, jid=2)
    session = db.session()
    try:
        session.add(a_rate)
        session.add(b_rate)
        session.commit()
    except Exception as e:
        logger.error(e)
        session.rollback()
    finally:
        db.session.remove()
Beispiel #7
0
    def upload(session, file):
        try:
            df, fname = FileService.parse_file(file)
            if not FileService.check_fname(fname=fname):
                raise ValueError("File already uploaded.")
            else:
                logger.info(f"Adding file={fname}")
                file = FilesModel(name=fname)
                session.add(file)
                fid = FilesModel.query.filter_by(name=fname).first().id
                JobGroupService.add(df=df)
                HistoryService.add(df=df, fid=fid)

        except Exception as e:
            logger.error(e)
            raise e
 def _wrapper(*args, **kwargs):
     try:
         token = request.environ.get('HTTP_TOKEN')
         if token is None:
             raise TokenNotFoundException
         if redis_store.exists(f'token:{token}') == 1:
             login_user_info = redis_store.hgetall(f'token:{token}')
             if login_user_info is None:
                 raise TokenNotFoundException
             setattr(request, 'login_user_info', login_user_info)
             return func(*args, **kwargs)
         else:
             raise TokenNotFoundException
     except Exception as e:
         logger.error(e)
         raise e
Beispiel #9
0
def authorize():
    logger.info("Inside authorize")
    headers = {'Content-Type': 'text/html'}
    resp = {}
    if not request.args:
        resp["error"] = "Missing request parameters."
        return make_response(
            render_template("error.html", error='Missing request parameters.'),
            200, headers)

    client = get_client(request.args)
    redirect_uri = get_redirect_uri(request.args, client)
    if not client:
        # Check for known client
        logger.error('Unknown client %s', request.args['client_id'])
        resp["error"] = "Unknown client."
        return make_response(
            render_template("error.html", error='Unknown client.'), 400,
            headers)
    elif not redirect_uri:
        logger.error("Mismatched redirect URI, expected %s got %s",
                     client["redirect_uris"], request.args["redirect_uri"])
        resp["error"] = "Invalid redirect URI."
        return resp
    else:
        # Check for the scopes
        req_scope = None
        client_scope = client["scope"].split(" ")
        if request.args['scope']:
            req_scope = request.args['scope'].split(' ')

        same = [item for item in req_scope if item in client_scope]
        if len(same) == 0:
            # client asked for a scope it could not have
            resp["error"] = "invalid_scope"
            return make_response(
                render_template("error.html", error='Invalid Scope'), 400,
                headers)

        reqid = generate_auth_code()
        REQUESTS[reqid] = request.query_string

        return make_response(
            render_template("authorize.html",
                            reqid=reqid,
                            scope=req_scope,
                            client=client), 200, headers)
Beispiel #10
0
    def patch(self):
        _login_user_info = getattr(request, 'login_user_info')
        _passwd = request.json.get('passWord')

        try:
            if len(_passwd) < 6:
                raise AccountPasswdShortException

            db.session.query(DIDUserModel). \
                filter(DIDUserModel.id == _login_user_info.get('id')). \
                update({DIDUserModel._password: _passwd})
            db.session.commit()

            return {'code': 200, 'message': '修改成功'}
        except Exception as e:
            db.session.rollback()
            logger.error(e)
            raise e
Beispiel #11
0
    def get(self):
        '''
        Question get
        '''
        try:
            _question_id = request.args.get('id', None, int)
            _question_title = request.args.get('title', None, str)
            _question_text = request.args.get('text', None, str)

            if _question_id is not None:
                result_list = db.session.query(QuestionModel.question_id,
                                               QuestionModel.question_title,
                                               QuestionModel.question_text,
                                               QuestionModel.question_body). \
                    filter(QuestionModel.question_id == _question_id).first()

                if result_list is None:
                    return [], 404

                return [QuestionSchema().dump(_).data for _ in [result_list]]

            if _question_title is not None:
                result_list = db.session.query(QuestionModel.question_id,
                                               QuestionModel.question_title,
                                               QuestionModel.question_text,
                                               QuestionModel.question_body). \
                    filter(QuestionModel.question_title.like('%{0}%'.format(_question_title)))
                if _question_text is not None:
                    result_list = result_list.filter(
                        QuestionModel.question_text.like(
                            '%{0}%'.format(_question_text)))
                result_list = result_list.limit(10).all()

                if result_list == []:
                    return [], 404
            else:
                return {'code': 400, 'message': ' Bad Request '}, 400

            return [QuestionSchema().dump(_).data for _ in result_list]
        except Exception as e:
            logger.error(e)
            return {'code': 500, 'message': ' Internal Server Error '}, 500
    def post(self):
        _passwd = request.json.get('passWord')
        _phone = request.json.get('phoneNumber')

        try:
            if None in (_passwd, _phone):
                raise RequestParameterException

            user_query = db.session.query(DIDUserModel.id,
                                          DIDUserModel.uname,
                                          DIDUserModel.passwd,
                                          DIDUserModel.phone,
                                          DIDUserModel.email). \
                filter(DIDUserModel.phone == _phone).first()
            if user_query is None:
                raise AccountNotFoundException

            if check_password_hash(user_query.passwd, _passwd) is False:
                raise AccountPasswdErrorException

            token = uuid1().hex
            login_user_info = {
                'token': token,
                'id': user_query.id,
                'uname': user_query.uname,
                'phone': user_query.phone,
                'email': user_query.email
            }
            redis_store.hmset(f'token:{token}', login_user_info)
            redis_store.expire(f'token:{token}', 60 * 10)  # 10 minute

            return {
                'code': 200,
                'message': '登陆成功',
                'resp_data': login_user_info
            }
        except Exception as e:
            logger.error(e)
            db.session.rollback()
            raise e
    def add(session, df, fid):
        try:
            # left join job group for job group id
            jg = pd.read_sql_table(table_name='jobgroup', con=db.engine)
            df = pd.merge(df,
                          jg,
                          how='left',
                          left_on='jg',
                          right_on='name',
                          sort=True)

            for idx, row in df.iterrows():
                history = HistoryModel(date=datetime.datetime.strptime(
                    row['date'], '%d/%m/%Y'),
                                       hours=row['hours'],
                                       eid=row['eid'],
                                       jid=row['id'],
                                       fid=fid)
                session.add(history)
        except Exception as e:
            logger.error(e)
            raise e
Beispiel #14
0
    def delete(self):
        _login_user_info = getattr(request, 'login_user_info')
        _passwd = request.json.get('passWord')

        try:
            user_query = db.session.query(DIDUserModel.id,
                                          DIDUserModel.passwd,
                                          DIDUserModel.status). \
                filter(DIDUserModel.status != 0,
                       DIDUserModel.id == _login_user_info.get('id'))

            if check_password_hash(user_query.first().passwd, _passwd) is False:
                raise AccountPasswdErrorException

            user_query.update({DIDUserModel.status: 0})
            db.session.commit()

            return {'code': 200, 'message': '删除成功'}
        except Exception as e:
            db.session.rollback()
            logger.error(e)
            raise e
Beispiel #15
0
    def get(self):
        '''
        Photo get
        '''
        try:
            _photo_id = request.args.get('id', None, int)
            _photo_text = request.args.get('text', None, str)

            if _photo_id is not None:
                result_list = db.session.query(PhotoModel.photo_id,
                                               PhotoModel.photo_url,
                                               PhotoModel.photo_date,
                                               PhotoModel.photo_text,
                                               PhotoModel.wufazhuce_url). \
                    filter(PhotoModel.photo_id == _photo_id).first()

                if result_list is None:
                    return [], 404

                return [PhotoSchema().dump(_).data for _ in [result_list]]

            if _photo_text is not None:
                result_list = db.session.query(PhotoModel.photo_id,
                                               PhotoModel.photo_url,
                                               PhotoModel.photo_date,
                                               PhotoModel.photo_text,
                                               PhotoModel.wufazhuce_url). \
                    filter(PhotoModel.photo_text.like('%{0}%'.format(_photo_text))). \
                    limit(10).all()
                if result_list == []:
                    return [], 404
            else:
                return {'code': 400, 'message': ' Bad Request '}, 400

            return [PhotoSchema().dump(_).data for _ in result_list]
        except Exception as e:
            logger.error(e)
            return {'code': 500, 'message': ' Internal Server Error '}, 500
Beispiel #16
0
    def post(self):
        _username = request.json.get('userName')
        _passwd = request.json.get('passWord')
        _phone = request.json.get('phoneNumber')
        _email = request.json.get('userEmail')
        _group_id = request.json.get('groupId')

        try:
            if None in (_username, _passwd, _phone, _email, _group_id):
                raise RequestParameterException

            user_query = db.session.query(DIDUserModel.id,
                                          DIDUserModel.phone,
                                          DIDUserModel.email). \
                filter(or_(DIDUserModel.phone == _phone,
                           DIDUserModel.email == _email)).first()
            if user_query is not None:
                if user_query.phone == _phone:
                    raise AccountRepeatException
                elif user_query.email == _email:
                    raise AccountRepeatException

            _user_data = DIDUserModel(
                uname=_username,
                _password=_passwd,
                phone=_phone,
                email=_email,
                group_id=_group_id)
            db.session.add(_user_data)
            db.session.commit()

            resp_data = DIDUserSchema().dump(_user_data).data

            return {'code': 200, 'resp_data': resp_data, 'message': '添加成功'}
        except Exception as e:
            db.session.rollback()
            logger.error(e)
            raise e
Beispiel #17
0
    def get(self):
        _login_user_info = getattr(request, 'login_user_info')

        try:
            user_query = db.session.query(DIDUserModel.id,
                                          DIDUserModel.passwd,
                                          DIDUserModel.phone,
                                          DIDUserModel.email,
                                          DIDUserModel.photo,
                                          DIDUserModel.group_id,
                                          DIDUserModel.status,
                                          DIDUserModel.ctime,
                                          DIDUserModel.mtime). \
                filter(DIDUserModel.status != 0,
                       DIDUserModel.id == _login_user_info.get('id')).first()

            resp_data = DIDUserSchema().dump(user_query).data

            return {'code': 200, 'resp_data': resp_data}
        except Exception as e:
            db.session.rollback()
            logger.error(e)
            raise e
Beispiel #18
0
    def sim_btc_create_transaction(self, from_addr, dest_info):
        txout = self.sim_btc_get_trx_out(from_addr)
        if len(txout) == 0 :
            return ""
        sum = 0.0
        vin_need = []
        fee = self.config["fee"]
        amount = 0.0
        vouts = {}
        for addr, num in dest_info.items():
            amount = round(amount + num,8)
            vouts[addr]=round(num,8)

        txout = sorted(txout, key=lambda d: float(d["amount"]), reverse=True)
        #{"amount":tx["value"],"txid":tx["txid"],"vout":tx["vout"],"scriptPubKey":tx["scriptPubKey"]}
        all_need_amount = round(amount+fee,8)
        bak_index = -1
        use_idx = []
        if len(txout)>50:
            for i in range(len(txout)):
                if float(txout[i].get("amount")) >= all_need_amount:
                    bak_index=i
                elif float(txout[i].get("amount")) < all_need_amount and bak_index!=-1:
                    sum = round(sum + float(txout[bak_index].get("amount")), 8)
                    vin_need.append(txout[bak_index])
                    use_idx.append(bak_index)
                    break
                elif float(txout[i].get("amount")) < all_need_amount and bak_index==-1:
                    break

        if bak_index == -1:
            for i in range(len(txout)):
                if sum >= round(amount + fee, 8):
                    break
                sum = round(sum + float(txout[i].get("amount")), 8)
                vin_need.append(txout[i])
                use_idx.append(i)
        if len(txout)>50 and len(vin_need)<10:
            for i in range(10 - len(vin_need)):
                cur_idx = len(txout)-i-1
                if cur_idx not in use_idx:
                    sum = round(sum + float(txout[cur_idx].get("amount")), 8)
                    vin_need.append(txout[cur_idx])
                    use_idx.append(cur_idx)

        if sum < round(amount+fee,8):
            return ""
        vins = []
        script = []
        for need in vin_need :
            pubkey=need.get('scriptPubKey')
            script.append(pubkey)
            vin = {'txid': need.get('txid'), 'vout': int(need.get('vout')), 'scriptPubKey': pubkey}
            vins.append(vin)
        #set a fee
        resp = ""
        trx_size = len(vin_need) * self.config["vin_size"] + (len(vouts)+1) * self.config["vout_size"]
        cal_fee = math.ceil(trx_size/1000.0) * self.config["per_fee"]
        cal_fee = round(cal_fee,8)
        if cal_fee>fee:
            logger.error("cal fee large than max fee!")
            return ""
        if round(sum-amount,8) == cal_fee:
            resp = self.http_request("createrawtransaction", [vins, vouts])
        else:
            if vouts.has_key(from_addr):
                vouts[from_addr] = round(sum - amount - cal_fee + vouts[from_addr],8)
            else:
                if round(sum - amount - cal_fee,8) >0.00000546:
                    vouts[from_addr] = round(sum - amount - cal_fee,8)
            resp = self.http_request("createrawtransaction", [vins, vouts])
        if resp["result"] != None:
            trx_hex = resp['result']
            trx = self.sim_btc_decode_hex_transaction(trx_hex)
            return {"trx":trx,"hex":trx_hex,"scriptPubKey":script}
        return ""
    def sim_btc_create_transaction(self, from_addr, dest_info, is_fast):
        txout = self.sim_btc_get_trx_out(from_addr)
        if len(txout) == 0:
            return ""
        sum = 0.0
        vin_need = []
        fee = self.config["fee"]
        amount = 0.0
        vouts = {}
        for addr, num in dest_info.items():
            amount = round(amount + num, 8)

            vouts[addr] = round(num, 8)

        txout = sorted(txout, key=lambda d: float(d["amount"]), reverse=True)
        #{"amount":tx["value"],"txid":tx["txid"],"vout":tx["vout"],"scriptPubKey":tx["scriptPubKey"]}
        all_need_amount = round(amount + fee, 8)
        bak_index = -1
        use_idx = []
        if self.name.upper() != "DOGE":
            if len(txout) > 8:
                for i in range(len(txout)):
                    if float(txout[i].get("amount")) >= all_need_amount:
                        bak_index = i
                    elif float(txout[i].get(
                            "amount")) < all_need_amount and bak_index != -1:
                        sum = round(
                            sum + float(txout[bak_index].get("amount")), 8)
                        vin_need.append(txout[bak_index])
                        use_idx.append(bak_index)
                        break
                    elif float(txout[i].get(
                            "amount")) < all_need_amount and bak_index == -1:
                        break
        bak_sum = 0
        if bak_index == -1:
            for i in range(len(txout)):
                if sum >= round(amount + fee, 8):
                    break
                if self.name.upper() == "DOGE" and i == 0:
                    bak_sum = round(float(txout[i].get("amount")), 8)
                else:
                    sum = round(sum + float(txout[i].get("amount")), 8)
                vin_need.append(txout[i])
                use_idx.append(i)

        sum = round(sum + bak_sum, 8)
        if len(txout) > 8 and len(vin_need) < 5:
            for i in range(5 - len(vin_need)):
                cur_idx = len(txout) - i - 1
                if cur_idx not in use_idx:
                    sum = round(sum + float(txout[cur_idx].get("amount")), 8)
                    vin_need.append(txout[cur_idx])
                    use_idx.append(cur_idx)

        if sum < round(amount + fee, 8):
            return ""

        vins = []
        script = []
        vins_map = {}
        for need in vin_need:
            pubkey = need.get('scriptPubKey')
            script.append(pubkey)
            vin = {
                'txid': need.get('txid'),
                'vout': int(need.get('vout')),
                'scriptPubKey': pubkey,
                "sequence": 0xfffffff0
            }
            vins.append(vin)
            if self.name.upper() == "BCH":
                vins_map[need.get('txid') +
                         str(need.get('vout'))] = need.get("amount")
        #set a fee
        resp = ""
        trx_size = len(vin_need) * self.config["vin_size"] + (
            len(vouts) + 1) * self.config["vout_size"]
        if is_fast:
            cal_fee = fee
        else:
            cal_fee = math.ceil(trx_size / 1000.0) * self.config["per_fee"]
        if self.name.upper() == "DOGE" and sum > 6000:
            cal_fee = 0.001

        cal_fee = round(cal_fee, 8)
        if cal_fee > fee:
            logger.error("cal fee large than max fee!")
            return ""
        if round(sum - amount, 8) == cal_fee:
            resp = self.http_request("createrawtransaction", [vins, vouts])
        else:
            if vouts.has_key(from_addr):
                vouts[from_addr] = round(
                    sum - amount - cal_fee + vouts[from_addr], 8)
            else:
                if round(sum - amount - cal_fee, 8) > 0.00000546:
                    vouts[from_addr] = round(sum - amount - cal_fee, 8)
            resp = self.http_request("createrawtransaction", [vins, vouts])
        if resp["result"] != None:
            trx_hex = resp['result']
            trx = self.sim_btc_decode_hex_transaction(trx_hex)
            if self.name.upper() == "BCH":
                index = 0
                for one_vin in trx["vin"]:
                    tmp_amount = vins_map[one_vin["txid"] +
                                          str(one_vin["vout"])]
                    trx["vin"][index]["amount"] = self.floatToInt(
                        round(float(tmp_amount), 8) * 100000000)
                    index += 1
            return {"trx": trx, "hex": trx_hex, "scriptPubKey": script}
        return ""
Beispiel #20
0
    def omni_create_transaction(self, from_addr, dest_info):
        txout = self.omni_get_trx_out(from_addr)
        omni_balance = self.omni_get_balance(from_addr)
        if len(txout) == 0:
            return ""

        sum = 0.0
        vin_need = []
        fee = self.config["fee"]
        amount = 0.0
        vouts = {}
        for addr, num in dest_info.items():
            amount = round(amount + num, 8)
            vouts[addr] = round(0.00000546, 8)

        if len(vouts) != 1:
            logger.error("dest info is invaild %v", dest_info)
            return ""
        if float(omni_balance < amount):
            logger.error("omni balance is insufficient")
            return ""
        txout = sorted(txout, key=lambda d: float(d["amount"]), reverse=True)
        # {"amount":tx["value"],"txid":tx["txid"],"vout":tx["vout"],"scriptPubKey":tx["scriptPubKey"]}
        all_need_amount = round(fee, 8)
        bak_index = -1

        for i in range(len(txout)):
            if sum >= round(fee, 8):
                break
            sum = round(sum + float(txout[i].get("amount")), 8)
            vin_need.append(txout[i])
        has_546 = False
        for i in range(len(txout)):
            if round(float(txout[i].get("amount")), 8) == 0.00000546:
                vin_need.append(txout[i])
                has_546 = True
                break

        if sum < round(fee, 8):
            return ""
        vins = []
        script = []
        for need in vin_need:
            pubkey = need.get('scriptPubKey')
            script.append(pubkey)
            vin = {
                'txid': need.get('txid'),
                'vout': int(need.get('vout')),
                'scriptPubKey': pubkey
            }
            vins.append(vin)
        # set a fee
        resp = ""
        trx_size = len(vin_need) * self.config["vin_size"] + (
            len(vouts) + 1) * self.config["vout_size"] + 40
        cal_fee = math.ceil(trx_size / 1000.0) * self.config["per_fee"]
        cal_fee = round(cal_fee, 8)
        if cal_fee > fee:
            logger.error("cal fee large than max fee!")
            return ""
        #add usdt payload vout
        omni_payload = "%04x%04x%08x%016x" % (0, 0, self.config["property_id"],
                                              int(amount * math.pow(10, 8)))

        if not has_546:
            cal_fee += 0.00000546
        if round(fee, 8) == cal_fee:
            resp = self.http_request("createrawtransaction", [vins, vouts])

        else:
            if vouts.has_key(from_addr):

                vouts[from_addr] = round(sum - cal_fee + vouts[from_addr], 8)
            else:
                if round(fee - cal_fee, 8) > 0.00000546:
                    vouts[from_addr] = round(sum - cal_fee, 8)
            resp = self.http_request("createrawtransaction", [vins, vouts])
        if resp["result"] != None:
            trx_hex = resp['result']
            #use payload rebuild raw trx
            omni_rawtrx_res = self.http_request("omni_createrawtx_opreturn",
                                                [trx_hex, omni_payload])
            if omni_rawtrx_res["result"] != None:
                trx_hex = omni_rawtrx_res['result']
                trx = self.omni_decode_hex_transaction(trx_hex)
                return {"trx": trx, "hex": trx_hex, "scriptPubKey": script}

        return ""
Beispiel #21
0
def approve():
    logger.info("==> approve()")
    headers = {'Content-Type': 'text/html'}
    params = {}

    if not request.form:
        logger.error("Missing post parameters. Bad request.")
        return make_response(
            render_template(
                'error.html',
                error='Missing post form parameters. Bad request.'), 400,
            headers)
        # return "Bad Request", 400
    else:
        query = REQUESTS.pop(request.form['reqid'], None)
        query = query.decode('UTF-8')
        print("The query: ", query)
        if not query:
            logger.error("Did not get a query string.")
            return make_response(
                render_template('error.html', error='Bad Request'), 400,
                headers)
        else:
            params = parse.parse_qs(query)
            print(params)
        if request.form["approve"]:
            logger.debug("Approving a token request.")
            if params["response_type"][0] == 'code':
                code = generate_auth_code()
                # Not sure whwer the user comes from.
                # user = request.form['user']

                scope = params['scope'][0]
                req_scope = scope.split(' ')

                client = get_client_from_query(params)
                print(client)
                client_scope = client['scope']

                same = [item for item in req_scope if item in client_scope]
                if len(same) == 0:
                    # Client asked for a scope it could not have.
                    return make_response(
                        render_template('error.html', error='Invalid Scope'),
                        400, headers)

                # Save for later. A dictionary of stuff
                CODES[code] = {
                    'authorizationRequest': query,
                    'scope': scope,
                    'client_id': client['client_id']
                }

                # Build the redirect url
                redirect_uri = params['redirect_uri'][0]
                if redirect_uri not in client['redirect_uris']:
                    return make_response(
                        render_template('error.html',
                                        error='Invalid redirect URI.'), 400,
                        headers)

                state = params['state'][0]
                payload = {'code': code, 'state': state}

                the_location = ''.join(
                    (redirect_uri, '?', parse.urlencode(payload)))
                print(the_location)
                return redirect(the_location, code=302)

    return "Got here", 200