selling selected rewards
This commit is contained in:
@@ -50,4 +50,5 @@ class ReferralRecordRewardSerializer(serializers.ModelSerializer):
|
||||
"coins",
|
||||
"unique_token",
|
||||
"value",
|
||||
"created_on",
|
||||
]
|
||||
|
||||
@@ -24,4 +24,9 @@ urlpatterns = [
|
||||
views.RedeemRewardView.as_view(),
|
||||
name="redeem_reward",
|
||||
),
|
||||
path(
|
||||
"redeem-selected-rewards/",
|
||||
views.RedeemSelectedRewardsView.as_view(),
|
||||
name="redeem_selected_rewards",
|
||||
),
|
||||
]
|
||||
|
||||
@@ -62,7 +62,9 @@ class RewardListView(APIView):
|
||||
|
||||
def get(self, request):
|
||||
# Filter rewards based on specified conditions
|
||||
current_principal = request.user # Adjust based on how user is linked to principal
|
||||
current_principal = (
|
||||
request.user
|
||||
) # Adjust based on how user is linked to principal
|
||||
|
||||
# Filter rewards based on the authenticated referrer
|
||||
rewards_query = ReferralRecordReward.objects.filter(
|
||||
@@ -126,3 +128,68 @@ class RedeemRewardView(APIView):
|
||||
message=constants.SUCCESS,
|
||||
data="Token sold successfully.",
|
||||
)
|
||||
|
||||
|
||||
class RedeemSelectedRewardsView(APIView):
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def patch(self, request):
|
||||
# Extract the number of tokens from the request data
|
||||
num_tokens_to_sell = request.data.get("num_tokens", None)
|
||||
|
||||
if num_tokens_to_sell is None:
|
||||
return ApiResponse.error(
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
message=constants.FAILURE,
|
||||
errors="Number of tokens to sell is required.",
|
||||
)
|
||||
|
||||
try:
|
||||
num_tokens_to_sell = int(num_tokens_to_sell)
|
||||
except ValueError:
|
||||
return ApiResponse.error(
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
message=constants.FAILURE,
|
||||
errors="Invalid number of tokens.",
|
||||
)
|
||||
|
||||
# Retrieve the rewards for the authenticated user
|
||||
rewards = ReferralRecordReward.objects.filter(
|
||||
referral_record__referrer_principal=request.user, sell=False
|
||||
).order_by(
|
||||
"id"
|
||||
) # FIFO method
|
||||
|
||||
if rewards.count() < num_tokens_to_sell:
|
||||
return ApiResponse.error(
|
||||
status=status.HTTP_404_NOT_FOUND,
|
||||
message=constants.FAILURE,
|
||||
errors="Not enough unsold rewards available.",
|
||||
)
|
||||
|
||||
# Select the required number of rewards
|
||||
rewards_to_sell = rewards[:num_tokens_to_sell]
|
||||
total_value = sum(reward.value for reward in rewards_to_sell)
|
||||
total_coins = sum(reward.coins for reward in rewards_to_sell)
|
||||
tokens = ",".join(str(reward.unique_token) for reward in rewards_to_sell)
|
||||
|
||||
with transaction.atomic():
|
||||
# Create a new withdrawal request
|
||||
withdrawal_request = WithdrawalRequest.objects.create(
|
||||
principal=request.user,
|
||||
coins=total_coins,
|
||||
amount=total_value,
|
||||
token=tokens,
|
||||
)
|
||||
|
||||
# Update each reward to mark it as sold
|
||||
for reward in rewards_to_sell:
|
||||
reward.sell = True
|
||||
reward.save()
|
||||
|
||||
return ApiResponse.success(
|
||||
status=status.HTTP_200_OK,
|
||||
message=constants.SUCCESS,
|
||||
data="Selected tokens sold successfully.",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user