6 Commits

Author SHA1 Message Date
Desktop
1531f41226 Revert "Fix authentication: Ensure correct user/account is loaded"
This reverts commit a267fc0715.
2025-11-17 01:35:34 +05:00
Desktop
37a64fa1ef Revert "Fix authentication: Use token's account_id as authoritative source"
This reverts commit 46b5b5f1b2.
2025-11-17 01:35:30 +05:00
Desktop
c4daeb1870 Revert "Fix authentication: Follow unified API model - token account_id is authoritative"
This reverts commit 8171014a7e.
2025-11-17 01:35:26 +05:00
Desktop
79aab68acd Revert "Fix credit system: Add developer/system account bypass for credit checks"
This reverts commit 066b81dd2a.
2025-11-17 01:35:23 +05:00
Desktop
11a5a66c8b Revert "Revert to main branch account handling logic"
This reverts commit 219dae83c6.
2025-11-17 01:35:19 +05:00
Desktop
ab292de06c Revert "branch 1st"
This reverts commit 8a9dd44c50.
2025-11-17 01:35:13 +05:00
3 changed files with 43 additions and 71 deletions

View File

@@ -193,7 +193,6 @@ class AIEngine:
self.tracker.update("PREP", 25, prep_message, meta=self.step_tracker.get_meta())
# Phase 2.5: CREDIT CHECK - Check credits before AI call (25%)
# Bypass for system accounts and developers (handled in CreditService)
if self.account:
try:
from igny8_core.modules.billing.services import CreditService
@@ -205,9 +204,8 @@ class AIEngine:
# Calculate estimated cost
estimated_amount = self._get_estimated_amount(function_name, data, payload)
# Check credits BEFORE AI call (CreditService handles developer/system account bypass)
# Note: user=None for Celery tasks, but CreditService checks account.is_system_account() and developer users
CreditService.check_credits(self.account, operation_type, estimated_amount, user=None)
# Check credits BEFORE AI call
CreditService.check_credits(self.account, operation_type, estimated_amount)
logger.info(f"[AIEngine] Credit check passed: {operation_type}, estimated amount: {estimated_amount}")
except InsufficientCreditsError as e:

View File

@@ -49,7 +49,7 @@ class CreditService:
return base_cost
@staticmethod
def check_credits(account, operation_type, amount=None, user=None):
def check_credits(account, operation_type, amount=None):
"""
Check if account has sufficient credits for an operation.
@@ -57,35 +57,10 @@ class CreditService:
account: Account instance
operation_type: Type of operation
amount: Optional amount (word count, image count, etc.)
user: Optional user instance (for developer/admin bypass)
Raises:
InsufficientCreditsError: If account doesn't have enough credits
"""
# Bypass credit check for:
# 1. System accounts (aws-admin, default-account, default)
# 2. Developer/admin users (if user provided)
if account and account.is_system_account():
return True
if user:
try:
if hasattr(user, 'is_admin_or_developer') and user.is_admin_or_developer():
return True
if hasattr(user, 'is_system_account_user') and user.is_system_account_user():
return True
except (AttributeError, Exception):
pass
# Check if account has any developer users (fallback for Celery tasks without user context)
if account:
try:
from igny8_core.auth.models import User
if User.objects.filter(account=account, role='developer').exists():
return True
except (AttributeError, Exception):
pass
required = CreditService.get_credit_cost(operation_type, amount)
if account.credits < required:
raise InsufficientCreditsError(
@@ -94,40 +69,17 @@ class CreditService:
return True
@staticmethod
def check_credits_legacy(account, required_credits, user=None):
def check_credits_legacy(account, required_credits):
"""
Legacy method: Check if account has enough credits (for backward compatibility).
Args:
account: Account instance
required_credits: Number of credits required
user: Optional user instance (for developer/admin bypass)
Raises:
InsufficientCreditsError: If account doesn't have enough credits
"""
# Bypass credit check for system accounts and developers
if account and account.is_system_account():
return
if user:
try:
if hasattr(user, 'is_admin_or_developer') and user.is_admin_or_developer():
return
if hasattr(user, 'is_system_account_user') and user.is_system_account_user():
return
except (AttributeError, Exception):
pass
# Check if account has any developer users (fallback for Celery tasks)
if account:
try:
from igny8_core.auth.models import User
if User.objects.filter(account=account, role='developer').exists():
return
except (AttributeError, Exception):
pass
if account.credits < required_credits:
raise InsufficientCreditsError(
f"Insufficient credits. Required: {required_credits}, Available: {account.credits}"

View File

@@ -309,29 +309,51 @@ class ModuleEnableSettingsViewSet(AccountModelViewSet):
def get_queryset(self):
"""Get module enable settings for current account"""
# Don't filter here - list() and retrieve() handle get_or_create
# This prevents empty queryset from causing 404 errors
return ModuleEnableSettings.objects.all()
# Return queryset filtered by account - but list() will handle get_or_create
queryset = super().get_queryset()
# Filter by account if available
account = getattr(self.request, 'account', None)
if not account:
user = getattr(self.request, 'user', None)
if user:
account = getattr(user, 'account', None)
if account:
queryset = queryset.filter(account=account)
return queryset
def list(self, request, *args, **kwargs):
"""Get or create module enable settings for current account"""
account = getattr(request, 'account', None)
if not account:
user = getattr(request, 'user', None)
if user and hasattr(user, 'account'):
account = getattr(user, 'account', None)
if not account:
try:
account = getattr(request, 'account', None)
if not account:
user = getattr(request, 'user', None)
if user and hasattr(user, 'account'):
account = user.account
if not account:
return error_response(
error='Account not found',
status_code=status.HTTP_400_BAD_REQUEST,
request=request
)
# Get or create settings for account (one per account)
try:
settings = ModuleEnableSettings.objects.get(account=account)
except ModuleEnableSettings.DoesNotExist:
# Create default settings for account
settings = ModuleEnableSettings.objects.create(account=account)
serializer = self.get_serializer(settings)
return success_response(data=serializer.data, request=request)
except Exception as e:
import traceback
error_trace = traceback.format_exc()
return error_response(
error='Account not found',
status_code=status.HTTP_400_BAD_REQUEST,
error=f'Failed to load module enable settings: {str(e)}',
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
request=request
)
# Get or create settings for account (one per account)
settings, created = ModuleEnableSettings.objects.get_or_create(account=account)
serializer = self.get_serializer(settings)
return success_response(data=serializer.data, request=request)
def retrieve(self, request, pk=None, *args, **kwargs):
"""Get module enable settings for current account"""