Fix order log html format error

This commit is contained in:
Reckless_Satoshi 2024-01-30 16:22:57 +00:00
parent 4aca6b9184
commit 80b97f355b
No known key found for this signature in database
GPG Key ID: 9C4585B561315571
4 changed files with 70 additions and 9 deletions

View File

@ -133,7 +133,13 @@ class OrderAdmin(AdminChangeLinksMixin, admin.ModelAdmin):
if not obj.logs:
return format_html("<b>No logs were recorded</b>")
with_hyperlinks = objects_to_hyperlinks(obj.logs)
return format_html(f'<table style="width: 100%">{with_hyperlinks}</table>')
try:
html_logs = format_html(
f'<table style="width: 100%">{with_hyperlinks}</table>'
)
except Exception as e:
html_logs = f"An error occurred while formatting the parsed logs as HTML. Exception {e}"
return html_logs
actions = [
"cancel_public_order",

View File

@ -488,11 +488,19 @@ def objects_to_hyperlinks(logs: str) -> str:
Used to format pretty logs for the Order admin panel.
"""
objects = ["LNPayment", "Robot", "Order", "OnchainPayment", "MarketTick"]
for obj in objects:
logs = re.sub(
rf"{obj}\(([0-9a-fA-F\-A-F]+),\s*([^)]+)\)",
lambda m: f'<b><a href="/coordinator/api/{obj.lower()}/{m.group(1)}">{m.group(2)}</a></b>',
logs,
flags=re.DOTALL,
)
try:
for obj in objects:
logs = re.sub(
rf"{obj}\(([0-9a-fA-F\-A-F]+),\s*([^)]+)\)",
lambda m: f'<b><a href="/coordinator/api/{obj.lower()}/{m.group(1)}">{m.group(2)}</a></b>',
logs,
flags=re.DOTALL,
)
except re.error as e:
print("Error occurred:", e.msg)
print("Pattern:", e.pattern)
print("Position:", e.pos)
logs = f"An error occurred while parsing the logs. Exception {e}"
return logs

View File

@ -1,7 +1,7 @@
openapi: 3.0.3
info:
title: RoboSats REST API
version: 0.5.3
version: 0.5.4
x-logo:
url: https://raw.githubusercontent.com/Reckless-Satoshi/robosats/main/frontend/static/assets/images/robosats-0.1.1-banner.png
backgroundColor: '#FFFFFF'

View File

@ -7,6 +7,7 @@ from django.urls import reverse
from api.models import Currency, Order
from api.tasks import cache_market
from django.contrib.admin.sites import AdminSite
from control.models import BalanceLog
from control.tasks import compute_node_balance, do_accounting
from tests.test_api import BaseAPITestCase
@ -14,6 +15,8 @@ from tests.utils.node import add_invoice, set_up_regtest_network
from tests.utils.pgp import sign_message
from tests.utils.trade import Trade
from api.admin import OrderAdmin
def read_file(file_path):
"""
@ -44,6 +47,15 @@ class TradeTest(BaseAPITestCase):
# Take the first node balances snapshot
compute_node_balance()
def assert_order_logs(self, order_id):
order = Order.objects.get(id=order_id)
order_admin = OrderAdmin(model=Order, admin_site=AdminSite())
try:
result = order_admin._logs(order)
self.assertIsInstance(result, str)
except Exception as e:
self.fail(f"Exception occurred: {e}")
def test_login_superuser(self):
"""
Test the login functionality for the superuser.
@ -225,6 +237,7 @@ class TradeTest(BaseAPITestCase):
data["satoshis"], "Relative pricing order has non-null Satoshis"
)
self.assertIsNone(data["taker"], "New order's taker is not null")
self.assert_order_logs(data["id"])
def test_get_order_created(self):
"""
@ -270,6 +283,8 @@ class TradeTest(BaseAPITestCase):
# Cancel order to avoid leaving pending HTLCs after a successful test
trade.cancel_order()
self.assert_order_logs(data["id"])
def test_publish_order(self):
"""
Tests a trade from order creation to published (maker bond locked).
@ -298,6 +313,8 @@ class TradeTest(BaseAPITestCase):
# Cancel order to avoid leaving pending HTLCs after a successful test
trade.cancel_order()
self.assert_order_logs(data["id"])
def test_pause_unpause_order(self):
"""
Tests pausing and unpausing a public order
@ -323,6 +340,8 @@ class TradeTest(BaseAPITestCase):
# Cancel order to avoid leaving pending HTLCs after a successful test
trade.cancel_order()
self.assert_order_logs(data["id"])
def test_make_and_take_order(self):
"""
Tests a trade from order creation to taken.
@ -362,6 +381,8 @@ class TradeTest(BaseAPITestCase):
# Cancel order to avoid leaving pending HTLCs after a successful test
trade.cancel_order()
self.assert_order_logs(data["id"])
def test_make_and_lock_contract(self):
"""
Tests a trade from order creation to taker bond locked.
@ -407,6 +428,8 @@ class TradeTest(BaseAPITestCase):
# Maker cancels order to avoid leaving pending HTLCs after a successful test
trade.cancel_order()
self.assert_order_logs(data["id"])
def test_trade_to_locked_escrow(self):
"""
Tests a trade from order creation until escrow locked, before
@ -455,6 +478,8 @@ class TradeTest(BaseAPITestCase):
trade.cancel_order(trade.maker_index)
trade.cancel_order(trade.taker_index)
self.assert_order_logs(data["id"])
def test_trade_to_submitted_invoice(self):
"""
Tests a trade from order creation until escrow locked and
@ -509,6 +534,8 @@ class TradeTest(BaseAPITestCase):
trade.cancel_order(trade.maker_index)
trade.cancel_order(trade.taker_index)
self.assert_order_logs(data["id"])
def test_trade_to_confirm_fiat_received_LN(self):
"""
Tests a trade from order creation until fiat received is confirmed by seller/taker
@ -534,6 +561,8 @@ class TradeTest(BaseAPITestCase):
self.assertFalse(data["taker_locked"])
self.assertFalse(data["escrow_locked"])
self.assert_order_logs(data["id"])
def test_successful_LN(self):
"""
Tests a trade from order creation until Sats sent to buyer
@ -561,6 +590,8 @@ class TradeTest(BaseAPITestCase):
self.assertIsHash(data["maker_summary"]["preimage"])
self.assertIsHash(data["maker_summary"]["payment_hash"])
self.assert_order_logs(data["id"])
def test_successful_onchain(self):
"""
Tests a trade from order creation until Sats sent to buyer
@ -588,6 +619,8 @@ class TradeTest(BaseAPITestCase):
self.assertIsInstance(data["maker_summary"]["address"], str)
self.assertIsHash(data["maker_summary"]["txid"])
self.assert_order_logs(data["id"])
def test_cancel_public_order(self):
"""
Tests the cancellation of a public order
@ -667,6 +700,8 @@ class TradeTest(BaseAPITestCase):
)
self.assertEqual(data["expiry_reason"], Order.ExpiryReasons.NMBOND)
self.assert_order_logs(data["id"])
def test_public_order_expires(self):
"""
Tests the expiration of a public order
@ -698,6 +733,8 @@ class TradeTest(BaseAPITestCase):
)
self.assertEqual(data["expiry_reason"], Order.ExpiryReasons.NTAKEN)
self.assert_order_logs(data["id"])
def test_taken_order_expires(self):
"""
Tests the expiration of a public order
@ -731,6 +768,8 @@ class TradeTest(BaseAPITestCase):
)
self.assertEqual(data["expiry_reason"], Order.ExpiryReasons.NESINV)
self.assert_order_logs(data["id"])
def test_escrow_locked_expires(self):
"""
Tests the expiration of a public order
@ -765,6 +804,8 @@ class TradeTest(BaseAPITestCase):
)
self.assertEqual(data["expiry_reason"], Order.ExpiryReasons.NINVOI)
self.assert_order_logs(data["id"])
def test_chat(self):
"""
Tests the chatting REST functionality
@ -871,6 +912,8 @@ class TradeTest(BaseAPITestCase):
Order.Status.MLD,
)
self.assert_order_logs(data["id"])
def test_order_expires_after_only_maker_messaged(self):
"""
Tests the expiration of an order in chat where taker never messaged
@ -911,6 +954,8 @@ class TradeTest(BaseAPITestCase):
Order.Status.TLD,
)
self.assert_order_logs(data["id"])
def test_withdraw_reward_after_unilateral_cancel(self):
"""
Tests withdraw rewards as taker after maker cancels order unilaterally
@ -979,6 +1024,8 @@ class TradeTest(BaseAPITestCase):
Order.Status.DIS,
)
self.assert_order_logs(data["id"])
def test_ticks(self):
"""
Tests the historical ticks serving endpoint after creating a contract