События в fullcalendar иногда дублируются в моей базе данных при переносе на другую дату/время
Я использую fullcalendar 6.1.14 в django 4.2.11. У меня есть функция, определенная для обновления даты доставки товара, где номер документа товара совпадает с id события, а год - это год, с которого он изменяется. У меня даже есть проверка, чтобы она не добавляла уже существующие комбинации NumDoc + Year. Но иногда, казалось бы, случайно, он дублирует событие в базе данных, когда я перетаскиваю его на новую дату, и я понятия не имею, как это решить. В качестве менеджера базы данных я использую Microsoft MySQL Server Management.
Функция для перемещения событий в файле views.py
@csrf_exempt
def update_delivery_date(request):
if request.method == 'POST':
event_id = request.POST.get('id')
new_start_date = request.POST.get('new_start_date')
year = request.POST.get('year')
# Check if the user has the allowed groups
if not (request.user.groups.filter(name__in=['Expedicao', 'Dir Logistica', 'Logistica']).exists() or request.user.is_superuser):
return JsonResponse({'success': False, 'error': 'User does not have permission to move events'}, status=403)
try:
with transaction.atomic():
# Find the specific event by DocNum and Year
event = EncomendasCalendar.objects.select_for_update().get(NumDoc=event_id, Ano=year)
# Check if there is already another event with the same DocNum and Year
if EncomendasCalendar.objects.filter(NumDoc=event_id, Ano=year).exclude(NumDoc=event_id).exists():
print("Duplicate")
return JsonResponse({'success': False, 'error': 'An event with the same DocNum and Year already exists'}, status=400)
# Check if the new date is the same as the current one
if event.DataEntrega == new_start_date:
print("same")
return JsonResponse({'success': False, 'error': 'The delivery date is already the same as the informed date.'}, status=400)
# Update the DeliveryDate with the new date
event.DataEntrega = new_start_date
event.UpdatedBy = request.user
# Save the updated event in the database
event.save()
except EncomendasCalendar.DoesNotExist:
return JsonResponse({'success': False, 'error': 'Event not found'}, status=404)
except Exception as e:
print('Error updating the delivery date:', e)
return JsonResponse({'success': False, 'error': 'Error updating the delivery date'})
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False, 'error': 'Method not allowed'}, status=405)
Функция в js-файле, куда перемещаются календарь и события (calendar.js)
eventDrop: function (info) {
// Get the ID of the moved event
var eventId = info.event.id;
var eventYear = info.event.extendedProps.year;
// Get the new start date of the moved event
var newStartDate = info.event.start.toISOString().replace('T', ' ');
newStartDate = newStartDate.replace('Z', '');
// Update the delivery date on the server using AJAX
var csrftoken = Cookies.get('csrftoken');
$.ajax({
type: 'POST',
url: 'update_delivery_date/',
data: {
id: eventId,
new_start_date: newStartDate,
year: eventYear
},
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
},
success: function(response) {
// Successful update
},
error: function(xhr, status, error) {
if (xhr.status === 403) {
// Display a custom error message if the user does not have permission
alert('Error: You do not have permission to move this event.');
info.revert();
} else {
// In case of an error
console.error('Error updating the delivery date:', error);
}
}
});
}
Дизайн таблицы, в которую вставляются, обновляются и т.д. энкоменды
Я перепробовал много вещей, которые уже не помню, но последней попыткой была проверка в коде views.py, которая должна была не добавлять событие, если numdoc + year уже существовало, но это не сработало.