Can get, set, delete an offer. enjoy

This commit is contained in:
poka 2021-02-14 18:18:01 +01:00
parent 1015a75a26
commit 0e38e16cbd
3 changed files with 184 additions and 1 deletions

View File

@ -31,6 +31,9 @@ setProfile_cmd = subparsers.add_parser('set', help="Configurer son profile Cesiu
eraseProfile_cmd = subparsers.add_parser('erase', help="Effacer son profile Cesium+") eraseProfile_cmd = subparsers.add_parser('erase', help="Effacer son profile Cesium+")
stars_cmd = subparsers.add_parser('stars', help="Voir les étoiles d'un profile / Noter un profile (option -s NOTE)") stars_cmd = subparsers.add_parser('stars', help="Voir les étoiles d'un profile / Noter un profile (option -s NOTE)")
unstars_cmd = subparsers.add_parser('unstars', help="Supprimer un star") unstars_cmd = subparsers.add_parser('unstars', help="Supprimer un star")
getoffer_cmd = subparsers.add_parser('getoffer', help="Obtenir les informations d'une annonce gchange")
setoffer_cmd = subparsers.add_parser('setoffer', help="Créer une annonce gchange")
deleteoffer_cmd = subparsers.add_parser('deleteoffer', help="Supprimer une annonce gchange")
pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1") pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1")
history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1") history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1")
balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1") balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1")
@ -66,6 +69,17 @@ stars_cmd.add_argument('-p', '--profile', help="Profile cible")
stars_cmd.add_argument('-n', '--number', type=int, help="Nombre d'étoile") stars_cmd.add_argument('-n', '--number', type=int, help="Nombre d'étoile")
unstars_cmd.add_argument('-p', '--profile', help="Profile à dénoter") unstars_cmd.add_argument('-p', '--profile', help="Profile à dénoter")
# Offers management
getoffer_cmd.add_argument('-i', '--id', help="Annonce cible à récupérer")
setoffer_cmd.add_argument('-t', '--title', help="Titre de l'annonce à créer")
setoffer_cmd.add_argument('-d', '--description', help="Description de l'annonce à créer")
setoffer_cmd.add_argument('-c', '--category', help="Categorie de l'annonce à créer")
setoffer_cmd.add_argument('-l', '--localisation', nargs=2, help="Localisation de l'annonce à créer (lat + lon)")
setoffer_cmd.add_argument('-p', '--picture', help="Image de l'annonce à créer")
setoffer_cmd.add_argument('-ci', '--city', help="Ville de l'annonce à créer")
setoffer_cmd.add_argument('-pr', '--price', help="Prix de l'annonce à créer")
deleteoffer_cmd.add_argument('-i', '--id', help="Annonce cible à supprimer")
# GVA usage # GVA usage
pay_cmd.add_argument('-p', '--pubkey', help="Destinataire du paiement") pay_cmd.add_argument('-p', '--pubkey', help="Destinataire du paiement")
pay_cmd.add_argument('-a', '--amount', type=float, help="Montant de la transaction") pay_cmd.add_argument('-a', '--amount', type=float, help="Montant de la transaction")
@ -144,7 +158,7 @@ else:
# Construct CesiumPlus object # Construct CesiumPlus object
if cmd in ("read","send","delete","set","get","erase","stars","unstars"): if cmd in ("read","send","delete","set","get","erase","stars","unstars","getoffer","setoffer","deleteoffer"):
from lib.cesium import CesiumPlus from lib.cesium import CesiumPlus
if args.node: if args.node:
@ -197,6 +211,14 @@ if cmd in ("read","send","delete","set","get","erase","stars","unstars"):
elif cmd == "unstars": elif cmd == "unstars":
cesium.unLike(args.profile) cesium.unLike(args.profile)
# Offers
elif cmd == "getoffer":
cesium.getOffer(args.id)
elif cmd == "setoffer":
cesium.setOffer(args.title, args.description, args.city, args.localisation, args.category, args.price, args.picture)
elif cmd == "deleteoffer":
cesium.deleteOffer(args.id)
# Construct GVA object # Construct GVA object
elif cmd in ("pay","history","balance"): elif cmd in ("pay","history","balance"):
from lib.gva import GvaApi from lib.gva import GvaApi

View File

@ -3,6 +3,7 @@ from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX
from lib.messaging import ReadFromCesium, SendToCesium, DeleteFromCesium from lib.messaging import ReadFromCesium, SendToCesium, DeleteFromCesium
from lib.profiles import Profiles from lib.profiles import Profiles
from lib.likes import ReadLikes, SendLikes, UnLikes from lib.likes import ReadLikes, SendLikes, UnLikes
from lib.offers import Offers
class CesiumPlus(CesiumCommon): class CesiumPlus(CesiumCommon):
@ -91,3 +92,28 @@ class CesiumPlus(CesiumCommon):
if idLike: if idLike:
document = likes.configDoc(idLike) document = likes.configDoc(idLike)
likes.sendDocument(document, silent) likes.sendDocument(document, silent)
#################### Offer ####################
def setOffer(self, title=None, description=None, city=None, localisation=None, category=None, price=None, picture=None):
setOffer = Offers(self.dunikey, self.pod)
document = setOffer.configDocSet(title, description, city, localisation, category, price, picture)
result = setOffer.sendDocumentSet(document,'set')
print(result)
return result
def getOffer(self, id, avatar=None):
getOffer = Offers(self.dunikey, self.pod, self.noNeedDunikey)
resultJSON = getOffer.sendDocumentGet(id, 'get')
result = getOffer.parseJSON(resultJSON)
print(result)
def deleteOffer(self, id):
eraseOffer = Offers(self.dunikey, self.pod)
document = eraseOffer.configDocErase(id)
result = eraseOffer.sendDocumentSet(document,'delete', id)
print(result)

135
lib/offers.py Normal file
View File

@ -0,0 +1,135 @@
import sys, re, json, requests, base64
from time import time
from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX
class Offers(CesiumCommon):
# Configure JSON document SET to send
def configDocSet(self, title, description, city, localisation, category, price: float, picture):
timeSent = int(time())
# {"parent":"cat90","localizedNames":{"en":"Fruits & Vegetables","es-ES":"Frutas y Vegetales","fr-FR":"Fruits & Légumes"},"name":"Fruits & Légumes","id":"cat92"}
data = {}
if title: data['title'] = title
if description: data['description'] = description
if city: data['city'] = city
if localisation:
geoPoint = {}
geoPoint['lat'] = localisation[0]
geoPoint['lon'] = localisation[1]
data['geoPoint'] = geoPoint
if picture:
picture = open(picture, 'rb').read()
picture = base64.b64encode(picture).decode()
data['picture'] = {}
data['picture']['_content'] = picture
data['picture']['_content_type'] = "image/png"
# if category: data['category'] = category
# else:
data['category'] = {"parent":"cat90","localizedNames":{"en":"Fruits & Vegetables","es-ES":"Frutas y Vegetales","fr-FR":"Fruits & Légumes"},"name":"Fruits & Légumes","id":"cat92"}
if price: data['price'] = float(price) * 100
data['type'] = 'offer'
data['time'] = timeSent
data['creationTime'] = timeSent
data['issuer'] = self.pubkey
data['pubkey'] = self.pubkey
data['version'] = 2
data['currency'] = 'g1'
data['unit'] = None
data['fees'] = None
data['feesCurrency'] = None
data['picturesCount'] = 0
data['stock'] = 1
data['tags'] = []
document = json.dumps(data)
return self.signDoc(document)
# Configure JSON document SET to send
def configDocErase(self, id):
timeSent = int(time())
# "currency":"g1","unit":null,"fees":null,"feesCurrency":null,"picturesCount":0,"stock":0,"tags":[],"id":"AXehXeyZaml2THvBAeS5","creationTime":1613320117}
#AXehXeyZaml2THvBAeS5
offerToDeleteBrut = self.sendDocumentGet(id, 'get')
offerToDelete = json.loads(self.parseJSON(offerToDeleteBrut))
title = offerToDelete['title']
creationTime = offerToDelete['time']
issuer = offerToDelete['issuer']
pubkey = offerToDelete['pubkey']
data = {}
data['title'] = title
data['time'] = timeSent
data['creationTime'] = creationTime
data['id'] = id
data['issuer'] = issuer
data['pubkey'] = pubkey
data['version'] = 2
data['type'] = "offer"
data['currency'] = "g1"
data['unit'] = None
data['fees'] = None
data['feesCurrency'] = None
data['picturesCount'] = 0
data['stock'] = 0
data['tags'] = []
document = json.dumps(data)
return self.signDoc(document)
def sendDocumentGet(self, id, type):
headers = {
'Content-type': 'application/json',
}
# Send JSON document and get JSON result
if type == 'set':
reqQuery = '{0}/market/record'.format(self.pod)
elif type == 'get':
reqQuery = '{0}/market/record/{1}?_source=category,title,description,issuer,time,creationTime,location,address,city,price,unit,currency,thumbnail._content_type,picturesCount,type,stock,fees,feesCurrency,geoPoint,pubkey,freePrice'.format(self.pod, id)
elif type == 'erase':
reqQuery = '{0}/market/delete'.format(self.pod)
result = requests.get(reqQuery, headers=headers)
if result.status_code == 200:
# print(result.text)
return result.text
else:
sys.stderr.write("Echec de l'envoi du document...\n" + result.text + '\n')
def sendDocumentSet(self, document, type, id=None):
headers = {
'Content-type': 'application/json',
}
# Send JSON document and get JSON result
if type == 'set':
reqQuery = '{0}/market/record'.format(self.pod)
if type == 'delete':
reqQuery = '{0}/market/record/{1}/_update'.format(self.pod, id)
result = requests.post(reqQuery, headers=headers, data=document)
if result.status_code == 200:
# print(result.text)
return result.text
else:
sys.stderr.write("Echec de l'envoi du document...\n" + result.text + '\n')
def parseJSON(self, doc):
doc = json.loads(doc)['_source']
if doc:
# pubkey = { "pubkey": doc['issuer'] }
# rest = { "description": doc['description'] }
# final = {**pubkey, **rest}
return json.dumps(doc, indent=2)
else:
return 'Profile vide'