def test_query(self): storage.insert(Age("mouse", 22)) storage.insert(Person("mouse", "mickey", 23, 22.2)) storage.insert(Person("mouse", "minnie", 23, 22.2)) q = ( Query(Person, alias="p") .select(["p.age", "a.age", "p.lastname"]) .join(Age, alias="a", on="a.name = p.name") .where({"p.lastname": "mickey", "a.age": 22}) ) r = ( "SELECT p.age,a.age,p.lastname FROM tb_Person p " "JOIN tb_Age a ON a.name = p.name WHERE 1=1 AND " "p.lastname=%s AND a.age=%s LIMIT 1000", ["mickey", 22], ) self.assertEqual(r, q.query()) objects = storage.query(q) self.assertEqual(len(objects), 2) age, person = objects["Age"][0], objects["Person"][0] self.assertEqual(person.age, 23) self.assertEqual(person.lastname, "mickey") self.assertEqual(age.age, 22) q = ( Query(Person, alias="p") .select(["p.*"]) .join(Age, alias="a", on="a.name = p.name") .where({"p.lastname": "mickey", "a.age": 22}) ) r = ( "SELECT p.* FROM tb_Person p JOIN tb_Age a ON a.name = " "p.name WHERE 1=1 AND p.lastname=%s AND " "a.age=%s LIMIT 1000", ["mickey", 22], ) self.assertEqual(r, q.query()) objects = storage.query(q) self.assertEqual(len(objects), 1) person = objects["Person"][0] self.assertEqual(person.age, 23) self.assertEqual(person.lastname, "mickey")
def test_query_in(self): storage.insert(Age("mouse", 22)) storage.insert(Person("mouse", "mickey", 23, 22.2)) storage.insert(Person("mouse", "minnie", 23, 22.2)) q = Query(Person).select(["*"]).where({"lastname": ("mickey", "minnie")}, Query.IN) a = storage.query(q) self.assertEqual(len(a[Person.__name__]), 2)
def test_join(self): storage.put(Age(name="alabama")) storage.put(Person(name="alabama", lastname="felipe")) storage.put(Person(name="alabama", lastname="alabama")) query = ( Query(Person, alias="p") .select(["p.*"]) .join(Age, alias="a", on="p.name = a.name") .where({"p.name": "alabama"}) .order("p.lastname DESC") ) results = storage.query(query) self.assertEqual(1, len(results)) self.assertEqual("felipe", results["Person"][0].lastname) self.assertTrue("Person" in results) self.assertIsNotNone(results["Person"])
def test_default(self): self.assertTrue(storage.insert(Person('mouse', 'optico', 20, 21))) q = Query(Person, alias='u').select(['u.name', 'u.age']) p = storage.query(q)['Person'][0] self.assertEqual(p.weight, None) self.assertEqual(p.lastname, None)
def bunq_callback_mutation(): """ Handle bunq callbacks of type MUTATION """ try: data = request.get_json() print("[bunqcb_mutation] input: {}".format(json.dumps(data))) payment = data["NotificationUrl"]["object"]["Payment"] metaid = payment["id"] if storage.seen("seen_mutation", metaid): print("[bunqcb_mutation] duplicate transaction") return "" iban = payment["alias"]["iban"] item = { "created_at": payment["created"], "date": arrow.get(payment["created"]).format("YYYY-MM-DD"), "type": mutation_type(payment), "amount": payment["amount"]["value"], "balance": payment["balance_after_mutation"]["value"], "account": iban, "counterparty_account": counterparty_account(payment), "counterparty_name": payment["counterparty_alias"]["display_name"], "description": payment["description"], "payment_id": metaid, "meta": { "id": metaid, "timestamp": arrow.get(payment["created"]).timestamp } } print("[bunqcb_mutation] translated: {}".format(json.dumps(item))) triggerids_1 = [] triggerids_2 = [] for account in ["ANY", iban]: for trigger in storage.query("trigger_mutation", "account", "=", account): ident = trigger["identity"] if check_fields("mutation", ident, item, trigger["fields"]): triggerids_1.append(ident) storage.store("mutation_" + ident, metaid, {"value": item}) for trigger in storage.query("trigger_balance", "account", "=", account): ident = trigger["identity"] if check_fields("balance", ident, item, trigger["fields"]): if not trigger["last"]: triggerids_2.append(ident) storage.store("balance_" + ident, metaid, {"value": item}) trigger["last"] = True storage.store("trigger_balance", ident, trigger) elif trigger["last"]: trigger["last"] = False storage.store("trigger_balance", ident, trigger) print("Matched mutation triggers:", json.dumps(triggerids_1)) print("Matched balance triggers:", json.dumps(triggerids_2)) data = {"data": []} for triggerids in [triggerids_1, triggerids_2]: for triggerid in triggerids: data["data"].append({"trigger_identity": triggerid}) if data["data"]: headers = { "IFTTT-Channel-Key": util.get_ifttt_service_key(), "IFTTT-Service-Key": util.get_ifttt_service_key(), "X-Request-ID": uuid.uuid4().hex, "Content-Type": "application/json" } print("[bunqcb_mutation] to ifttt: {}".format(json.dumps(data))) res = requests.post("https://realtime.ifttt.com/v1/notifications", headers=headers, data=json.dumps(data)) print("[bunqcb_mutation] result: {} {}".format( res.status_code, res.text)) except Exception: traceback.print_exc() print("[bunqcb_mutation] ERROR during handling bunq callback") return ""
def bunq_callback_request(): """ Handle bunq callbacks of type REQUEST """ try: data = request.get_json() print("[bunqcb_request] input: {}".format(json.dumps(data))) if data["NotificationUrl"]["event_type"] != "REQUEST_RESPONSE_CREATED": print("[bunqcb_request] ignoring {} event".format( data["NotificationUrl"]["event_type"])) return "" obj = data["NotificationUrl"]["object"]["RequestResponse"] metaid = obj["id"] if storage.seen("seen_request", metaid): print("[bunqcb_request] duplicate transaction") return "" iban = obj["alias"]["iban"] item = { "created_at": obj["created"], "date": arrow.get(obj["created"]).format("YYYY-MM-DD"), "amount": obj["amount_inquired"]["value"], "account": iban, "counterparty_account": counterparty_account(obj), "counterparty_name": obj["counterparty_alias"]["display_name"], "description": obj["description"], "request_id": metaid, "meta": { "id": metaid, "timestamp": arrow.get(obj["created"]).timestamp } } print("[bunqcb_request] translated: {}".format(json.dumps(item))) triggerids = [] for account in ["ANY", iban]: for trigger in storage.query("trigger_request", "account", "=", account): ident = trigger["identity"] if check_fields("request", ident, item, trigger["fields"]): triggerids.append(ident) storage.store("request_" + ident, metaid, {"value": item}) print("[bunqcb_request] Matched triggers:", json.dumps(triggerids)) if triggerids: data = {"data": []} for triggerid in triggerids: data["data"].append({"trigger_identity": triggerid}) headers = { "IFTTT-Channel-Key": util.get_ifttt_service_key(), "IFTTT-Service-Key": util.get_ifttt_service_key(), "X-Request-ID": uuid.uuid4().hex, "Content-Type": "application/json" } print("[bunqcb_request] to ifttt: {}".format(json.dumps(data))) res = requests.post("https://realtime.ifttt.com/v1/notifications", headers=headers, data=json.dumps(data)) print("[bunqcb_request] result: {} {}".format( res.status_code, res.text)) except Exception: traceback.print_exc() print("[bunqcb_request] ERROR during handling bunq callback") return ""