Source code for swh.web.mailmap.management.commands.sync_masking_mailmaps

# Copyright (C) 2022-2024  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information

from __future__ import annotations

from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import F
from django.utils import timezone

from swh.storage.proxies.masking.db import MaskingAdmin
from swh.web.mailmap.models import UserMailmap


[docs] class Command(BaseCommand): help = "Synchronize the mailmaps with the masking proxy"
[docs] def add_arguments(self, parser): parser.add_argument("proxy_dbconn", type=str) parser.add_argument( "--perform", action="store_true", help="Perform actions (instead of the default dry-run)", ) parser.add_argument( "--force", action="store_true", help=( "Perform actions even if no new update has been " "recorded since last processing" ), )
[docs] def handle(self, *args, **options): # only refresh mailmaps if something changed since last processing date verified_mailmaps = UserMailmap.objects.filter(from_email_verified=True) # if there is nothing new since last mailmap processing date, do nothing if ( not options["force"] and not verified_mailmaps.filter( mailmap_last_processing_date__lt=F("last_update_date") ) and not verified_mailmaps.filter( display_name_activated=True, mailmap_last_processing_date=None ) ): self.stdout.write("No mailmap to update") return # Always refresh display names for person entries with known emails mailmaps = verified_mailmaps.filter(display_name_activated=True) # Only used for logging purpose (and tracking last_processing_update field) to_disable = verified_mailmaps.filter( display_name_activated=False, mailmap_last_processing_date__lt=F("last_update_date"), ) process_start = timezone.now() with transaction.atomic(): self.stdout.write( "%d mailmaps to disable, %d mailmaps to set/refresh%s" % ( to_disable.count(), mailmaps.count(), (" (dry run)" if not options["perform"] else ""), ) ) if options["perform"]: masking_db = MaskingAdmin.connect(options["proxy_dbconn"]) dsp = [ ( mailmap.from_email.encode("utf-8"), mailmap.full_display_name.encode("utf-8"), ) for mailmap in mailmaps ] masking_db.set_display_names( dsp, clear=True, ) updated = to_disable.update( mailmap_last_processing_date=process_start ) + mailmaps.update(mailmap_last_processing_date=process_start) else: updated = to_disable.count() + mailmaps.count() self.stdout.write( self.style.SUCCESS( f"Synced {updated} mailmaps to the masking proxy database" ) )