@@ -1025,9 +1025,18 @@ def resolve_materials_for_one_meeting(meeting: Meeting): | |||
| 1025 | 1025 | ) | |
| 1026 | 1026 | ||
| 1027 | 1027 | def resolve_uploaded_material(meeting: Meeting, doc: Document): | |
| 1028 | - resolved = [] | ||
| 1028 | + resolved: list[ResolvedMaterial] = [] | ||
| 1029 | + remove = ResolvedMaterial.objects.none() | ||
| 1029 | 1030 | blob = resolve_one_material(doc, rev=None, ext=None) | |
| 1030 | - if blob is not None: | ||
| 1031 | + if blob is None: | ||
| 1032 | + # Versionless file does not exist. Remove the versionless ResolvedMaterial | ||
| 1033 | + # if it existed. This is to avoid leaving behind a stale link to a replaced | ||
| 1034 | + # version. This comes up e.g. if a ProceedingsMaterial is changed from having | ||
| 1035 | + # an uploaded file to being an external URL. | ||
| 1036 | + remove = ResolvedMaterial.objects.filter( | ||
| 1037 | + name=doc.name, meeting_number=meeting.number | ||
| 1038 | + ) | ||
| 1039 | + else: | ||
| 1031 | 1040 | resolved.append( | |
| 1032 | 1041 | ResolvedMaterial( | |
| 1033 | 1042 | name=doc.name, | |
@@ -1047,12 +1056,15 @@ def resolve_uploaded_material(meeting: Meeting, doc: Document): | |||
| 1047 | 1056 | blob=blob.name, | |
| 1048 | 1057 | ) | |
| 1049 | 1058 | ) | |
| 1059 | + # Create the new record(s) | ||
| 1050 | 1060 | ResolvedMaterial.objects.bulk_create( | |
| 1051 | 1061 | resolved, | |
| 1052 | 1062 | update_conflicts=True, | |
| 1053 | 1063 | unique_fields=["name", "meeting_number"], | |
| 1054 | 1064 | update_fields=["bucket", "blob"], | |
| 1055 | 1065 | ) | |
| 1066 | + # and remove one if necessary (will be a none() queryset if not) | ||
| 1067 | + remove.delete() | ||
| 1056 | 1068 | ||
| 1057 | 1069 | ||
| 1058 | 1070 | def store_blob_for_one_material_file(doc: Document, rev: str, filepath: Path): | |
@@ -14,7 +14,7 @@ | |||
| 14 | 14 | from ietf.meeting.models import Meeting, MeetingHost | |
| 15 | 15 | from ietf.meeting.helpers import get_meeting | |
| 16 | 16 | from ietf.name.models import ProceedingsMaterialTypeName | |
| 17 | - from ietf.meeting.utils import handle_upload_file | ||
| 17 | + from ietf.meeting.utils import handle_upload_file, resolve_uploaded_material | ||
| 18 | 18 | from ietf.utils.text import xslugify | |
| 19 | 19 | ||
| 20 | 20 | class UploadProceedingsMaterialForm(FileUploadForm): | |
@@ -150,7 +150,7 @@ def save_proceedings_material_doc(meeting, material_type, title, request, file=N | |||
| 150 | 150 | ||
| 151 | 151 | if events: | |
| 152 | 152 | doc.save_with_history(events) | |
| 153 | - | ||
| 153 | + resolve_uploaded_material(meeting, doc) | ||
| 154 | 154 | return doc | |
| 155 | 155 | ||
| 156 | 156 | ||
0 commit comments