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)