Flask JSON Serializer

This commit is contained in:
2023-09-14 00:30:02 +02:00
parent 8d7040a874
commit 6733a857ac
3 changed files with 61 additions and 32 deletions

View File

@@ -1,6 +1,16 @@
from sqlite3 import Connection from sqlite3 import Connection
import json
from flask.json.provider import DefaultJSONProvider
class Payement:
class CustomJSONProvider(DefaultJSONProvider):
@staticmethod
def default(obj) -> dict :
if isinstance(obj,Payment):
return obj.to_json()
return DefaultJSONProvider.default(obj)
class Payment(json.JSONEncoder):
id : int id : int
amount: float amount: float
name : str name : str
@@ -28,6 +38,13 @@ class Payement:
return return
def __repr__(self) -> str: def __repr__(self) -> str:
return '{} - {}€- {}'.format(self.name,self.amount/100,self.message) return '{} - {}€- {}'.format(self.name,self.amount/100,self.message)
def to_json(self) -> dict:
return {
"name":self.name,
"amount": self.amount/100,
"message": self.message
}
class Client: class Client:
def __init__(self,sock) -> None: def __init__(self,sock) -> None:

45
serv.py
View File

@@ -1,22 +1,22 @@
#!/bin/env python3 #!/bin/env python3
import os import os
import sqlite3 import sqlite3
from flask import Flask, make_response, render_template,request,jsonify,g from flask import Flask, make_response, render_template,request,g,jsonify
from flask_sock import Sock from flask_sock import Sock
from classes import Payement, Client from classes import Payment, Client, CustomJSONProvider
clients_list = [] clients_list = []
payements_list : list[Payement] = [] payments_list : list[Payment] = []
app = Flask(__name__, instance_relative_config=True) app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping( app.config.from_mapping(
DATABASE=os.path.join(app.instance_path,'db.sqlite') DATABASE=os.path.join(app.instance_path,'db.sqlite')
) )
app.json = CustomJSONProvider(app)
sock = Sock(app) sock = Sock(app)
@@ -32,6 +32,13 @@ def close(exception):
if db is not None: if db is not None:
db.close() db.close()
def notify_client_payment(msg):
for c in clients_list:
try:
c.send_event(app.json.dumps(msg))
except:
clients_list.remove(c)
@app.route('/') @app.route('/')
def index(): def index():
return render_template('index.html') return render_template('index.html')
@@ -49,24 +56,16 @@ def show():
@app.route('/test') @app.route('/test')
def test(): def test():
p = Payement(1,5000,'TEST','TEST') p = Payment(1,5000,'TEST','TEST')
for c in clients_list: notify_client_payment(p)
try: return jsonify(p), 200
c.send_event(repr(p))
except:
clients_list.remove(c)
return make_response('Test',200)
@app.route('/last') @app.route('/last')
def last(): def last():
print(len(clients_list)) print(len(clients_list))
if(len(payements_list) > 0): if(len(payments_list) > 0):
p = payements_list[0] p = payments_list[0]
for c in clients_list: notify_client_payment(p)
try:
c.send_event(repr(p))
except:
clients_list.remove(c)
return make_response('last',200) return make_response('last',200)
@sock.route('/notify') @sock.route('/notify')
@@ -82,17 +81,13 @@ def notifications():
if request.json is not None: if request.json is not None:
print(request.json) print(request.json)
if request.json['eventType'] == 'Order': if request.json['eventType'] == 'Order':
p = Payement(request.json['data']['id'], p = Payment(request.json['data']['id'],
request.json['data']['amount']['total'], request.json['data']['amount']['total'],
request.json['data']['items'][0]['customFields'][0]['answer'], request.json['data']['items'][0]['customFields'][0]['answer'],
request.json['data']['payer']['firstName']) request.json['data']['payer']['firstName'])
p.save(get_db()); p.save(get_db());
payements_list.append(p) payments_list.append(p)
for c in clients_list: notify_client_payment(p)
try:
c.send_event(repr(p))
except:
clients_list.remove(c)
return make_response('OK',200) return make_response('OK',200)
return make_response('Not Handled',400) return make_response('Not Handled',400)

View File

@@ -1,19 +1,36 @@
<html> <html>
<head> <head>
<title>Hello Asso</title> <title>Hello Asso</title>
<style>
.notif {
margin: 10px;
padding: 5px;
border-radius: 5px;
border: 2px solid #1100ff;
}
</style>
</head> </head>
<body> <body>
<div id="p">TEST</div> <div id="msg"></div>
<div id="msg"><div>
<script> <script>
const websocket = new WebSocket('ws://'+ location.host + '/notify'); function addNode(msg){
websocket.addEventListener('message', ev => { let notifs = document.getElementsByClassName("notif");
console.log(ev.data); if(notifs.length > 5)
{
notifs.slice(0,notifs.length-5).forEach(e => e.remove());
}
console.log(msg);
let ndiv = document.createElement('div'); let ndiv = document.createElement('div');
let data = document.createTextNode(ev.data); ndiv.className='notif';
let data = document.createTextNode(msg);
ndiv.appendChild(data); ndiv.appendChild(data);
message = document.getElementById('msg'); message = document.getElementById('msg');
document.body.insertBefore(ndiv,message); document.body.insertBefore(ndiv,message);
}
const websocket = new WebSocket('ws://'+ location.host + '/notify');
websocket.addEventListener('message', ev => {
addNode(ev.data);
}); });
websocket.addEventListener('error', ev => { websocket.addEventListener('error', ev => {