diff --git a/freelus/views.py b/freelus/views.py index e6e0d1a09c03682d86656d2cd907c317af90d665..ea926dfb1bd4b5c8ea56256e3cdc74569fa59564 100644 --- a/freelus/views.py +++ b/freelus/views.py @@ -47,19 +47,24 @@ def change_lus_in_slowal_frame(request): frame_id = request.POST['frame_id'] lu_ids = json.loads(request.POST['lu_ids']) frame = Frame.objects.get(id=frame_id) - frame.lexical_units.clear() + + frame_lexical_units = set(map(lambda lu: lu.id, frame.lexical_units.all())) + frame_lexical_units_to_remove = frame_lexical_units.difference(set(map(lambda lu_id: int(lu_id), lu_ids))) entry = Entry.objects.get(pk=entry_id) - entry.lexical_units.clear() - for lu_id in lu_ids: + for lu_id in frame_lexical_units_to_remove: lu = LexicalUnit.objects.get(pk=lu_id) - lu.entry = entry - lu.save() - frame.lexical_units.add(lu) - entry.lexical_units_count = entry.lexical_units_count + 1 + entry.lexical_units.remove(lu) + frame.lexical_units.remove(lu) + entry.lexical_units_count = entry.lexical_units_count - 1 + + if len(frame.lexical_units.all()) == 0: + remove_frame_in_progress(frame, request.user) + else: + frame.save() - frame.save() entry.save() + return JsonResponse({}) return JsonResponse({}) @@ -316,15 +321,7 @@ def remove_frame_in_progress(request): frame_id = request.POST['frame_id'] frame = Frame.objects.get(id=frame_id) if frame.in_building: - - Assignment.assign(user=request.user, subject=frame) - for argument in frame.arguments.all(): - argument.argument_connections.all().delete() - # ArgumentConnection.objects.filter(argument=argument).delete() - argument.example_connections.all().delete() - argument.delete() - frame.alternation_meanings.all().delete() - frame.delete() + remove_frame_in_progress(frame, request.user) else: return JsonResponse({}) return JsonResponse({}) @@ -332,6 +329,18 @@ def remove_frame_in_progress(request): return JsonResponse({}) +@transaction.atomic +def remove_frame_in_progress(frame, user): + Assignment.assign(user=user, subject=frame) + for argument in frame.arguments.all(): + argument.argument_connections.all().delete() + # ArgumentConnection.objects.filter(argument=argument).delete() + argument.example_connections.all().delete() + argument.delete() + frame.alternation_meanings.all().delete() + frame.delete() + + @ajax_required @transaction.atomic def change_frame_status_to_building(request):