make_post_sell/q
Russell Ballestrini 5c3cb37761 Clean up redundant formatting methods in CryptoPayment model
- Remove pointless _get_status_description() that just returned self.status
- Remove useless format_transaction_log() only used in tests
- Consolidate duplicated amount formatting logic into _format_amount() helper
- Fix XMR precision from 6 to 12 decimals for accuracy
- Strip trailing zeros from formatted amounts for cleaner output
- Simplify format_confirmation_status() by removing redundant text
- Eliminate unnecessary method delegation in __str__()
- Apply black formatting
2025-10-01 00:25:41 -04:00

236 lines
12 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

diff --git a/make_post_sell/models/crypto_payment.py b/make_post_sell/models/crypto_payment.py
index 0a25a83..b7f0ff3 100644
--- a/make_post_sell/models/crypto_payment.py
+++ b/make_post_sell/models/crypto_payment.py
@@ -533,6 +533,13 @@ class CryptoPayment(RBase, Base):
"""
return self.status in self.INITIAL_WAITING_STATUSES

+ def _format_amount(self, amount: int) -> str:
+ """Convert atomic units to display format for the coin type."""
+ if self.coin_type == "XMR":
+ return f"{amount / 1e12:.12f}".rstrip("0").rstrip(".")
+ else: # BTC, LTC, BCH, DOGE all use 8 decimals
+ return f"{amount / 1e8:.8f}".rstrip("0").rstrip(".")
+
def __str__(self) -> str:
"""
Human-readable string representation for logging and debugging.
@@ -540,45 +547,12 @@ class CryptoPayment(RBase, Base):
Returns:
str: Concise payment description for logs
"""
- return self._format_payment_summary()
-
- def __repr__(self) -> str:
- """
- Developer-oriented string representation for debugging.
-
- Returns:
- str: Detailed payment description for debugging
- """
- return (
- f"CryptoPayment(id={self.uuid_str[:8]}, "
- f"status={self.status}, "
- f"coin={self.coin_type}, "
- f"expected={self.expected_amount}, "
- f"received={self.received_amount}, "
- f"confirmations={self.current_confirmations or 0}/{self.confirmations_required}, "
- f"invoice_id={self.invoice_id.hex[:8] if self.invoice_id else None})"
- )
-
- def _format_payment_summary(self) -> str:
- """
- Format payment as a concise summary for logging.
-
- Returns:
- str: Payment summary with key details
- """
# Get amount information
- if self.coin_type == "XMR":
- expected_display = f"{self.expected_amount / 1e12:.6f}"
- received_display = f"{self.received_amount / 1e12:.6f}"
- elif self.coin_type == "DOGE":
- expected_display = f"{self.expected_amount / 1e8:.8f}"
- received_display = f"{self.received_amount / 1e8:.8f}"
- else: # BTC, LTC, BCH
- expected_display = f"{self.expected_amount / 1e8:.8f}"
- received_display = f"{self.received_amount / 1e8:.8f}"
+ expected_display = self._format_amount(self.expected_amount)
+ received_display = self._format_amount(self.received_amount)

# Build status description
- status_desc = self._get_status_description()
+ status_desc = self.status

# Format confirmations
conf_desc = f"{self.current_confirmations or 0}/{self.confirmations_required}"
@@ -601,59 +575,22 @@ class CryptoPayment(RBase, Base):
f"conf:{conf_desc} addr:{self.address[-8:]}{user_display}{shop_display}"
)

- def _get_status_description(self) -> str:
- """
- Get human-readable status description for logging.
-
- Returns:
- str: Human-readable status description
- """
- status_descriptions = {
- # Initial/waiting states
- self.STATUS_PENDING: "waiting",
- # Active processing states
- self.STATUS_RECEIVED: "received",
- self.STATUS_CONFIRMED: "confirmed",
- self.STATUS_CONFIRMED_OVERPAY: "overpaid",
- # Refund processing states
- self.STATUS_CONFIRMED_OVERPAY_REFUNDED: "overpay-refunding",
- self.STATUS_LATEPAY_REFUNDED: "late-refunding",
- self.STATUS_UNDERPAID_REFUNDED: "underpay-refunding",
- self.STATUS_OUT_OF_STOCK_REFUNDED: "oos-refunding",
- self.STATUS_DOUBLEPAY_REFUNDED: "duplicate-refunding",
- # Completed refund states
- self.STATUS_CONFIRMED_OVERPAY_REFUNDED_COMPLETE: "overpay-refunded",
- self.STATUS_LATEPAY_REFUNDED_COMPLETE: "late-refunded",
- self.STATUS_UNDERPAID_REFUNDED_COMPLETE: "underpay-refunded",
- self.STATUS_OUT_OF_STOCK_REFUNDED_COMPLETE: "oos-refunded",
- self.STATUS_DOUBLEPAY_REFUNDED_COMPLETE: "duplicate-refunded",
- # No-refund states
- self.STATUS_CONFIRMED_OVERPAY_NOT_REFUNDED: "overpay-no-refund",
- self.STATUS_LATEPAY_NOT_REFUNDED: "late-no-refund",
- self.STATUS_UNDERPAID_NOT_REFUNDED: "underpay-no-refund",
- self.STATUS_OUT_OF_STOCK_NOT_REFUNDED: "oos-no-refund",
- self.STATUS_DOUBLEPAY_NOT_REFUNDED: "duplicate-no-refund",
- # Terminal states
- self.STATUS_EXPIRED: "expired",
- self.STATUS_CANCELLED: "cancelled",
- }
-
- return status_descriptions.get(self.status, self.status)
-
- def format_transaction_log(self, context: str = "") -> str:
+ def __repr__(self) -> str:
"""
- Format payment for transaction logging with optional context.
-
- Args:
- context: Optional context (e.g., "processing", "refunding")
+ Developer-oriented string representation for debugging.

Returns:
- str: Formatted transaction log entry
+ str: Detailed payment description for debugging
"""
- base_msg = str(self)
- if context:
- return f"{context.capitalize()}: {base_msg}"
- return base_msg
+ return (
+ f"CryptoPayment(id={self.uuid_str[:8]}, "
+ f"status={self.status}, "
+ f"coin={self.coin_type}, "
+ f"expected={self.expected_amount}, "
+ f"received={self.received_amount}, "
+ f"confirmations={self.current_confirmations or 0}/{self.confirmations_required}, "
+ f"invoice_id={self.invoice_id.hex[:8] if self.invoice_id else None})"
+ )

def format_amount_details(self) -> str:
"""
@@ -662,18 +599,9 @@ class CryptoPayment(RBase, Base):
Returns:
str: Detailed amount breakdown
"""
- if self.coin_type == "XMR":
- expected = f"{self.expected_amount / 1e12:.6f}"
- received = f"{self.received_amount / 1e12:.6f}"
- due = f"{self.due_amount / 1e12:.6f}" if self.due_amount > 0 else "0"
- elif self.coin_type == "DOGE":
- expected = f"{self.expected_amount / 1e8:.8f}"
- received = f"{self.received_amount / 1e8:.8f}"
- due = f"{self.due_amount / 1e8:.8f}" if self.due_amount > 0 else "0"
- else: # BTC, LTC, BCH
- expected = f"{self.expected_amount / 1e8:.8f}"
- received = f"{self.received_amount / 1e8:.8f}"
- due = f"{self.due_amount / 1e8:.8f}" if self.due_amount > 0 else "0"
+ expected = self._format_amount(self.expected_amount)
+ received = self._format_amount(self.received_amount)
+ due = self._format_amount(self.due_amount) if self.due_amount > 0 else "0"

return f"expected:{expected} received:{received} due:{due} {self.coin_type}"

@@ -684,6 +612,5 @@ class CryptoPayment(RBase, Base):
Returns:
str: Confirmation status description
"""
- status = "confirmed" if self.is_fully_confirmed else "pending"
current = self.current_confirmations or 0
- return f"{status} ({current}/{self.confirmations_required})"
+ return f"{current}/{self.confirmations_required}"
diff --git a/make_post_sell/tests/test_models.py b/make_post_sell/tests/test_models.py
index d3101f7..fb97394 100644
--- a/make_post_sell/tests/test_models.py
+++ b/make_post_sell/tests/test_models.py
@@ -1499,49 +1499,6 @@ class TestCryptoPayment(unittest.TestCase):
self.assertIn("received=0", result)
self.assertIn("confirmations=0/10", result) # Should show 0 due to our fix

- def test_get_status_description_all_statuses(self):
- """Test _get_status_description for all status types."""
- status_mapping = {
- CryptoPayment.STATUS_PENDING: "waiting",
- CryptoPayment.STATUS_RECEIVED: "received",
- CryptoPayment.STATUS_CONFIRMED: "confirmed",
- CryptoPayment.STATUS_CONFIRMED_OVERPAY: "overpaid",
- CryptoPayment.STATUS_EXPIRED: "expired",
- CryptoPayment.STATUS_CANCELLED: "cancelled",
- CryptoPayment.STATUS_LATEPAY_REFUNDED: "late-refunding",
- CryptoPayment.STATUS_UNDERPAID_REFUNDED: "underpay-refunding",
- CryptoPayment.STATUS_DOUBLEPAY_REFUNDED: "duplicate-refunding",
- CryptoPayment.STATUS_LATEPAY_REFUNDED_COMPLETE: "late-refunded",
- CryptoPayment.STATUS_UNDERPAID_REFUNDED_COMPLETE: "underpay-refunded",
- CryptoPayment.STATUS_DOUBLEPAY_REFUNDED_COMPLETE: "duplicate-refunded",
- CryptoPayment.STATUS_LATEPAY_NOT_REFUNDED: "late-no-refund",
- CryptoPayment.STATUS_UNDERPAID_NOT_REFUNDED: "underpay-no-refund",
- CryptoPayment.STATUS_DOUBLEPAY_NOT_REFUNDED: "duplicate-no-refund",
- }
-
- for status, expected_desc in status_mapping.items():
- self.payment.status = status
- result = self.payment._get_status_description()
- self.assertEqual(
- result, expected_desc, f"Status {status} should map to {expected_desc}"
- )
-
- def test_format_transaction_log_with_context(self):
- """Test format_transaction_log method with context."""
- self.payment.status = CryptoPayment.STATUS_RECEIVED
-
- result = self.payment.format_transaction_log("processing")
-
- self.assertIn("Processing:", result)
- self.assertIn("[received]", result)
-
- def test_format_transaction_log_without_context(self):
- """Test format_transaction_log method without context."""
- result = self.payment.format_transaction_log()
-
- # Should be same as str() when no context
- self.assertEqual(result, str(self.payment))
-
def test_format_amount_details_xmr(self):
"""Test format_amount_details for XMR."""
self.payment.received_amount = 800000000000 # 0.8 XMR
diff --git a/make_post_sell/views/crypto.py b/make_post_sell/views/crypto.py
index 87f9b4b..37e493a 100644
--- a/make_post_sell/views/crypto.py
+++ b/make_post_sell/views/crypto.py
@@ -1332,8 +1332,6 @@ def crypto_debug_wallet_scan(request):
"If transfers found = 0, wallet has no transaction history or RPC issue"
)
debug_output.append("\n=== DEBUG COMPLETE ===")
-
return Response("\n".join(debug_output), content_type="text/plain")
-
except Exception as e:
return Response(f"Debug error: {e}", content_type="text/plain", status=500)