Flask JSON Serializer
This commit is contained in:
19
classes.py
19
classes.py
@@ -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
45
serv.py
@@ -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)
|
||||||
|
|||||||
@@ -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 => {
|
||||||
|
|||||||
Reference in New Issue
Block a user