Как я могу запланировать удаление user_club?
Я пытаюсь реализовать следующую логику:
- Когда пользователь нажмет на кнопку удаления user_club, появится подсказка, позволяющая отменить этот запрос.
- Если в течение 5 секунд пользователь не предпримет никаких действий, мы продолжим удаление.
- Альтернативно, если пользователь выполнит действие отмены, я отменю запрос на удаление в базе данных.
Я пытаюсь реализовать использование PeriodicTask. Однако мне пока не удается это сделать. Пожалуйста, помогите мне решить проблему, с которой я столкнулся. Заранее благодарен.
Вот что я пытался сделать, но пока не получилось.
models.py
class UserClub(ItemBase):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='user_club')
club = models.ForeignKey(Club, on_delete=models.CASCADE)
roles = models.ManyToManyField(Role)
membership_id = models.CharField(max_length=255, blank=True, null=True)
membership_expiry_date = models.DateField(max_length=255, blank=True, null=True)
subscription = models.ForeignKey(to=Subscription, on_delete=models.SET_NULL, blank=True, null=True, related_name='user_club_subscription')
default = models.BooleanField(default=False)
reputation_point = models.PositiveIntegerField(default=0)
class Meta:
db_table = "sport_user_club"
verbose_name = 'User Club'
verbose_name_plural = 'User Club'
views.py
def destroy(self, request, *args, **kwargs):
user_club = self.get_object()
task = task_schedule_del_user_club.apply_async(args=[user_club.uuid], countdown=10)
self.response_format['data'] = {
"task_id": task.id
}
self.response_format['message'] = "Club will be deleted after 5 seconds"
return JsonResponse(data=self.response_format, status=status.HTTP_200_OK)
@swagger_auto_schema(methods=['post'], request_body=UndoDeleteClubProcessSerializer)
@action(methods=['post'], detail=False, url_path="undo-request", url_name='undo-request')
def undo_request_remove_club(self, request, *args, **kwargs):
serializer = UndoDeleteClubProcessSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer_data = serializer.validated_data
if serializer_data['is_undo_request']:
try:
task_schedule_del_user_club.AsyncResult(serializer_data['task_uuid'])
self.response_format['message'] = "Undo request successfully"
return JsonResponse(self.response_format, status=status.HTTP_200_OK)
except Exception as e:
logger.error(e)
raise BaseError(_("Cancel an unsuccessful idea or proposal. Please try again!"))
tasks.py
@app.task
def task_schedule_del_user_club(user_club_uuid):
try:
user_club = UserClub.objects.get(uuid=user_club_uuid)
user_club.delete()
except UserClub.DoesNotExist:
logger.warning(f"UserClub with id {user_club_uuid} does not exist.")
except Exception as ex:
logger.error(f"An error occurred while deleting UserClub: {ex}")