master plan implemenattion
This commit is contained in:
@@ -833,11 +833,16 @@ class CreditPackageViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
|
||||
|
||||
class AccountPaymentMethodViewSet(AccountModelViewSet):
|
||||
"""ViewSet for account payment methods"""
|
||||
"""ViewSet for account payment methods - Full CRUD support"""
|
||||
queryset = AccountPaymentMethod.objects.all()
|
||||
permission_classes = [IsAuthenticatedAndActive, HasTenantAccess]
|
||||
pagination_class = CustomPageNumberPagination
|
||||
|
||||
def get_serializer_class(self):
|
||||
"""Return serializer class"""
|
||||
from igny8_core.modules.billing.serializers import AccountPaymentMethodSerializer
|
||||
return AccountPaymentMethodSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
"""Filter payment methods by account"""
|
||||
queryset = super().get_queryset()
|
||||
@@ -845,6 +850,15 @@ class AccountPaymentMethodViewSet(AccountModelViewSet):
|
||||
queryset = queryset.filter(account=self.request.account)
|
||||
return queryset.order_by('-is_default', 'type')
|
||||
|
||||
def get_serializer_context(self):
|
||||
"""Add account to serializer context"""
|
||||
context = super().get_serializer_context()
|
||||
account = getattr(self.request, 'account', None)
|
||||
if not account and hasattr(self.request, 'user') and self.request.user:
|
||||
account = getattr(self.request.user, 'account', None)
|
||||
context['account'] = account
|
||||
return context
|
||||
|
||||
def list(self, request):
|
||||
"""List payment methods for current account"""
|
||||
queryset = self.get_queryset()
|
||||
@@ -854,18 +868,108 @@ class AccountPaymentMethodViewSet(AccountModelViewSet):
|
||||
results = []
|
||||
for method in (page if page is not None else []):
|
||||
results.append({
|
||||
'id': str(method.id),
|
||||
'id': method.id,
|
||||
'type': method.type,
|
||||
'display_name': method.display_name,
|
||||
'is_default': method.is_default,
|
||||
'is_enabled': method.is_enabled if hasattr(method, 'is_enabled') else True,
|
||||
'is_enabled': method.is_enabled,
|
||||
'is_verified': method.is_verified,
|
||||
'instructions': method.instructions,
|
||||
'metadata': method.metadata,
|
||||
'created_at': method.created_at.isoformat() if method.created_at else None,
|
||||
'updated_at': method.updated_at.isoformat() if method.updated_at else None,
|
||||
})
|
||||
|
||||
return paginated_response(
|
||||
{'count': paginator.page.paginator.count, 'next': paginator.get_next_link(), 'previous': paginator.get_previous_link(), 'results': results},
|
||||
request=request
|
||||
)
|
||||
|
||||
def create(self, request, *args, **kwargs):
|
||||
"""Create a new payment method"""
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
try:
|
||||
serializer.is_valid(raise_exception=True)
|
||||
instance = serializer.save()
|
||||
return success_response(
|
||||
data={
|
||||
'id': instance.id,
|
||||
'type': instance.type,
|
||||
'display_name': instance.display_name,
|
||||
'is_default': instance.is_default,
|
||||
'is_enabled': instance.is_enabled,
|
||||
'is_verified': instance.is_verified,
|
||||
'instructions': instance.instructions,
|
||||
},
|
||||
message='Payment method created successfully',
|
||||
request=request,
|
||||
status_code=status.HTTP_201_CREATED
|
||||
)
|
||||
except Exception as e:
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
|
||||
def update(self, request, *args, **kwargs):
|
||||
"""Update a payment method"""
|
||||
partial = kwargs.pop('partial', False)
|
||||
instance = self.get_object()
|
||||
serializer = self.get_serializer(instance, data=request.data, partial=partial)
|
||||
try:
|
||||
serializer.is_valid(raise_exception=True)
|
||||
instance = serializer.save()
|
||||
return success_response(
|
||||
data={
|
||||
'id': instance.id,
|
||||
'type': instance.type,
|
||||
'display_name': instance.display_name,
|
||||
'is_default': instance.is_default,
|
||||
'is_enabled': instance.is_enabled,
|
||||
'is_verified': instance.is_verified,
|
||||
'instructions': instance.instructions,
|
||||
},
|
||||
message='Payment method updated successfully',
|
||||
request=request
|
||||
)
|
||||
except Exception as e:
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
|
||||
def destroy(self, request, *args, **kwargs):
|
||||
"""Delete a payment method"""
|
||||
try:
|
||||
instance = self.get_object()
|
||||
|
||||
# Don't allow deleting the only default payment method
|
||||
if instance.is_default:
|
||||
other_methods = AccountPaymentMethod.objects.filter(
|
||||
account=instance.account
|
||||
).exclude(pk=instance.pk).count()
|
||||
if other_methods == 0:
|
||||
return error_response(
|
||||
error='Cannot delete the only payment method',
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
|
||||
instance.delete()
|
||||
return success_response(
|
||||
data=None,
|
||||
message='Payment method deleted successfully',
|
||||
request=request,
|
||||
status_code=status.HTTP_204_NO_CONTENT
|
||||
)
|
||||
except Exception as e:
|
||||
return error_response(
|
||||
error=str(e),
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
request=request
|
||||
)
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user