def update_sources()

in client/securedrop_client/gui/widgets.py [0:0]


    def update_sources(self, sources: list[Source]) -> list[str]:
        """
        Update the list with the passed in list of sources.
        """
        sources_to_update = []
        sources_to_add = {}
        for source in sources:
            try:
                if source.uuid in self.source_items:
                    sources_to_update.append(source.uuid)
                else:
                    sources_to_add[source.uuid] = source
            except sqlalchemy.exc.InvalidRequestError as e:
                logger.debug(e)
                continue

        # Delete widgets for sources not in the supplied sourcelist
        deleted_uuids = []
        sources_to_delete = [
            self.source_items[uuid] for uuid in self.source_items if uuid not in sources_to_update
        ]
        for source_item in sources_to_delete:
            if source_item.isSelected():
                self.setCurrentItem(None)

            source_widget = self.itemWidget(source_item)
            self.takeItem(self.row(source_item))
            assert isinstance(source_widget, SourceWidget)
            if source_widget.source_uuid in self.source_items:
                del self.source_items[source_widget.source_uuid]

            deleted_uuids.append(source_widget.source_uuid)
            source_widget.deleteLater()

        # Update the remaining widgets
        for i in range(self.count()):
            source_widget = self.itemWidget(self.item(i))

            if not source_widget:
                continue

            assert isinstance(source_widget, SourceWidget)
            source_widget.reload()

        # Add widgets for new sources
        for uuid in sources_to_add:
            source_widget = SourceWidget(
                self.controller, sources_to_add[uuid], self.source_selected, self.adjust_preview
            )
            source_item = SourceListWidgetItem(self)
            source_item.setSizeHint(source_widget.sizeHint())
            self.insertItem(0, source_item)
            self.setItemWidget(source_item, source_widget)
            self.source_items[uuid] = source_item
            self.adjust_preview.emit(self.width() - self.INITIAL_UPDATE_SCROLLBAR_WIDTH)

        # Re-sort SourceList to make sure the most recently-updated sources appear at the top
        self.sortItems(Qt.DescendingOrder)

        # Return uuids of source widgets that were deleted so we can later delete the corresponding
        # conversation widgets
        return deleted_uuids