def collect_locale_insights(start_of_today, actions, entities, sync_user): """ Collect insights for each available Locale. """ # Get data sources to retrieve insights from privileged_users = get_privileged_users() contributors = get_contributors() active_users_actions = get_active_users_actions(start_of_today) suggestions = get_suggestions() actions_dict = group_dict_by(actions, "translation__locale") entities_dict = group_dict_by(entities, "resource__translatedresources__locale") LocaleInsightsSnapshot.objects.bulk_create( [ get_locale_insights_snapshot( locale, start_of_today, privileged_users[locale.id], contributors[locale.id], active_users_actions[locale.id], suggestions[locale.id], actions_dict[locale.id], entities_dict[locale.id], sync_user, ) for locale in Locale.objects.available() ], batch_size=1000, )
def get_active_users_actions(start_of_today): """Get actions of the previous year, needed for the Active users charts.""" actions = (ActionLog.objects.filter( created_at__gte=start_of_today - relativedelta(year=1), created_at__lt=start_of_today, ).values("action_type", "created_at", "performed_by", "translation__locale").distinct()) return group_dict_by(actions, "translation__locale")
def get_privileged_users(): """Get managers and translators.""" privileged_users = (Locale.objects.available().prefetch_related( "managers_group__user_set", "translators_group__user_set").values( "pk", "managers_group__user__last_login", "managers_group__user", "translators_group__user", )) return group_dict_by(privileged_users, "pk")
def get_contributors(): """Get all contributors without system users. Note that excluding system user emails in the Translation QuerySet directly is slow. """ system_users = User.objects.filter( email__regex=r"^pontoon-(\w+)@example.com$", ).values("pk") contributors = (Translation.objects.filter(user__isnull=False).exclude( user__pk__in=system_users).values("locale", "user").distinct()) return group_dict_by(contributors, "locale")
def collect_project_insights(start_of_today, actions, entities, sync_user): """ Collect insights for each available Project. """ # Get data sources to retrieve insights from actions_dict = group_dict_by(actions, "translation__entity__resource__project") entities_dict = group_dict_by(entities, "resource__project") ProjectInsightsSnapshot.objects.bulk_create( [ get_project_insights_snapshot( project, start_of_today, actions_dict[project.id], entities_dict[project.id], sync_user, ) for project in Project.objects.available() ], batch_size=1000, )
def get_entities(start_of_today): """Get entities created on the previous day.""" entities = Entity.objects.filter( date_created__gte=start_of_today - relativedelta(days=1), date_created__lt=start_of_today, obsolete=False, resource__project__disabled=False, resource__project__system_project=False, resource__project__visibility="public", ).values("pk", "resource__translatedresources__locale") return group_dict_by(entities, "resource__translatedresources__locale")
def get_suggestions(): """Get currently unreviewed suggestions.""" suggestions = Translation.objects.filter( approved=False, fuzzy=False, rejected=False, entity__obsolete=False, entity__resource__project__disabled=False, entity__resource__project__system_project=False, entity__resource__project__visibility="public", ).values("locale", "date") return group_dict_by(suggestions, "locale")
def get_suggestions(): """Get currently unreviewed suggestions.""" suggestions = Translation.objects.filter( # Make sure TranslatedResource is still enabled for the locale locale=F("entity__resource__translatedresources__locale"), approved=False, pretranslated=False, fuzzy=False, rejected=False, entity__obsolete=False, entity__resource__project__disabled=False, entity__resource__project__system_project=False, entity__resource__project__visibility="public", ).values("locale", "date") return group_dict_by(suggestions, "locale")
def get_activity_actions(start_of_today): """Get actions of the previous day, needed for the Translation and Review activity charts.""" actions = ActionLog.objects.filter( created_at__gte=start_of_today - relativedelta(days=1), created_at__lt=start_of_today, translation__entity__resource__project__system_project=False, translation__entity__resource__project__visibility="public", ).values( "action_type", "performed_by", "translation", "translation__locale", "translation__machinery_sources", "translation__user", "translation__approved_user", "translation__date", "translation__approved_date", ) return group_dict_by(actions, "translation__locale")