def populate_time_to_review_pretranslations()

in pontoon/insights/migrations/0012_time_to_review_pretranslations_data.py [0:0]


def populate_time_to_review_pretranslations(apps, schema_editor):
    ActionLog = apps.get_model("actionlog", "ActionLog")

    actions = (
        ActionLog.objects.filter(
            translation__entity__resource__project__system_project=False,
            translation__entity__resource__project__visibility="public",
            translation__user__email__in=[
                "pontoon-tm@example.com",
                "pontoon-gt@example.com",
            ],
            action_type__in=["translation:approved", "translation:rejected"],
        )
        .exclude(performed_by=F("translation__user"))
        .exclude(performed_by__email="pontoon-sync@example.com")
        .values(
            "created_at",
            "action_type",
            "translation__locale",
            date=F("translation__date"),
            approved_date=F("translation__approved_date"),
            rejected_date=F("translation__rejected_date"),
        )
    )

    action_data = dict()

    # Store action data in a dict for faster matching with snapshots
    for action in actions:
        key = (action["translation__locale"], action["created_at"].date())
        data = action_data.setdefault(key, list())

        if action["action_type"] == "translation:approved" and action["approved_date"]:
            data.append(action["approved_date"] - action["date"])

        elif (
            action["action_type"] == "translation:rejected" and action["rejected_date"]
        ):
            data.append(action["rejected_date"] - action["date"])

    LocaleInsightsSnapshot = apps.get_model("insights", "LocaleInsightsSnapshot")
    snapshots = LocaleInsightsSnapshot.objects.all()
    snapshot_data = dict()

    # Store snapshots in a map with the same key format we use for action data
    for snapshot in snapshots:
        key = (snapshot.locale_id, snapshot.created_at)
        snapshot_data[key] = snapshot

    # Update snapshots
    for key, times_to_review in action_data.items():
        if key in snapshot_data and len(times_to_review) > 0:
            times_to_review = [i for i in times_to_review if i is not None]
            snapshot_data[key].time_to_review_pretranslations = sum(
                times_to_review, timedelta()
            ) / len(times_to_review)

    LocaleInsightsSnapshot.objects.bulk_update(
        snapshots, ["time_to_review_pretranslations"], batch_size=1000
    )