@@ -636,43 +636,70 @@ def update_docs_from_rfc_index(
636636 )
637637 rfc_published = True
638638
639- def parse_relation_list (l ):
640- res = []
641- for x in l :
642- for a in Document .objects .filter (name = x .lower (), type_id = "rfc" ):
643- if a not in res :
644- res .append (a )
645- return res
646-
647- for x in parse_relation_list (obsoletes ):
648- if not RelatedDocument .objects .filter (
649- source = doc , target = x , relationship = relationship_obsoletes
639+ def parse_relation_list (rel_list : list [str ]) -> list [Document ]:
640+ return list (
641+ Document .objects .filter (
642+ name__in = [name .strip ().lower () for name in rel_list ],
643+ type_id = "rfc"
644+ )
645+ )
646+
647+ # Create missing obsoletes relations
648+ docs_this_obsoletes = parse_relation_list (obsoletes )
649+ for obs_doc in docs_this_obsoletes :
650+ if not doc .relateddocument_set .filter (
651+ target = obs_doc , relationship = relationship_obsoletes
650652 ):
651- r = RelatedDocument . objects .create (
652- source = doc , target = x , relationship = relationship_obsoletes
653+ r = doc . relateddocument_set .create (
654+ target = obs_doc , relationship = relationship_obsoletes
653655 )
654656 rfc_changes .append (
655- "created {rel_name} relation between {src_name } and {tgt_name }" .format (
657+ "created {rel_name} relation between {src } and {tgt }" .format (
656658 rel_name = r .relationship .name .lower (),
657- src_name = prettify_std_name (r .source .name ),
658- tgt_name = prettify_std_name (r .target .name ),
659+ src = prettify_std_name (r .source .name ),
660+ tgt = prettify_std_name (r .target .name ),
659661 )
660662 )
663+ # Remove stale obsoletes relations
664+ for r in doc .relateddocument_set .filter (
665+ relationship = relationship_obsoletes
666+ ).exclude (target_id__in = [d .pk for d in docs_this_obsoletes ]):
667+ r .delete ()
668+ rfc_changes .append (
669+ "removed {rel_name} relation between {src} and {tgt}" .format (
670+ rel_name = r .relationship .name .lower (),
671+ src = prettify_std_name (r .source .name ),
672+ tgt = prettify_std_name (r .target .name ),
673+ )
674+ )
661675
662- for x in parse_relation_list (updates ):
676+ docs_this_updates = parse_relation_list (updates )
677+ for upd_doc in docs_this_updates :
663678 if not RelatedDocument .objects .filter (
664- source = doc , target = x , relationship = relationship_updates
679+ source = doc , target = upd_doc , relationship = relationship_updates
665680 ):
666- r = RelatedDocument . objects .create (
667- source = doc , target = x , relationship = relationship_updates
681+ r = doc . relateddocument_set .create (
682+ target = upd_doc , relationship = relationship_updates
668683 )
669684 rfc_changes .append (
670- "created {rel_name} relation between {src_name } and {tgt_name }" .format (
685+ "created {rel_name} relation between {src } and {tgt }" .format (
671686 rel_name = r .relationship .name .lower (),
672- src_name = prettify_std_name (r .source .name ),
673- tgt_name = prettify_std_name (r .target .name ),
687+ src = prettify_std_name (r .source .name ),
688+ tgt = prettify_std_name (r .target .name ),
674689 )
675690 )
691+ # Remove stale updates relations
692+ for r in doc .relateddocument_set .filter (
693+ relationship = relationship_updates
694+ ).exclude (target_id__in = [d .pk for d in docs_this_updates ]):
695+ r .delete ()
696+ rfc_changes .append (
697+ "removed {rel_name} relation between {src} and {tgt}" .format (
698+ rel_name = r .relationship .name .lower (),
699+ src = prettify_std_name (r .source .name ),
700+ tgt = prettify_std_name (r .target .name ),
701+ )
702+ )
676703
677704 if also :
678705 # recondition also to have proper subseries document names:
0 commit comments