@@ -411,6 +411,120 @@ def get_stats(self):
411411 "slack" : slack_stats ,
412412 }
413413
414+ def generate_context (
415+ self , report_configuration : ReportConfiguration , stats_results : dict
416+ ):
417+ committee_members = report_configuration .financial_committee_members .all ()
418+
419+ # NOTE TO FUTURE DEVS: remember to account for the fact that a report
420+ # configuration may not match with a real version in frequent cases where
421+ # reports are generated before the release version has been created.
422+ (report_before_release , prior_version , version ) = determine_versions (
423+ report_configuration .version
424+ )
425+
426+ # Unpack stats_results in the same order as tasks were defined in the workflow
427+ (
428+ (mailinglist_contributor_release_count , mailinglist_contributor_new_count ),
429+ (mailinglist_post_stats , total_mailinglist_count ),
430+ (commit_contributors_release_count , commit_contributors_new_count ),
431+ mailinglist_new_subscribers_stats ,
432+ (
433+ mailinglist_words ,
434+ mailinglist_wordcloud_base64 ,
435+ mailinglist_wordcloud_top_words ,
436+ ),
437+ (search_wordcloud_base64 , search_wordcloud_top_words , search_stats ),
438+ global_contributors_new_count ,
439+ ) = stats_results
440+
441+ # Compute the synchronous stats that don't require async tasks
442+ commit_count , version_commit_count = get_commit_counts (version )
443+ top_libraries_for_version = get_top_libraries_for_version (version )
444+ top_libraries_by_name = get_libraries_by_name (version )
445+ library_order = self ._get_library_order (top_libraries_by_name )
446+ # TODO: we may in future need to find a way to show the removed libraries, for
447+ # now it's not needed. In that case the distinction between running this on a
448+ # ReportConfiguration with a real 'version' entry vs one that instead uses 'master'
449+ # will need to be considered
450+ libraries = get_libraries (library_order )
451+ new_libraries = libraries .exclude (
452+ library_version__version__release_date__lte = prior_version .release_date
453+ ).prefetch_related ("authors" )
454+ top_contributors = get_top_contributors_for_version (version )
455+ mailinglist_counts = get_mailinglist_counts (version )
456+ lines_added , lines_removed = lines_changes_count (version )
457+ opened_issues_count , closed_issues_count = get_issues_counts (
458+ prior_version , version
459+ )
460+ # TODO: connected to above todo, add removed_libraries.count()
461+ removed_library_count = 0
462+
463+ library_data = get_library_data (library_order , prior_version .pk , version .pk )
464+ slack_stats = get_slack_stats (prior_version , version )
465+
466+ library_index_library_data = get_libraries_for_index (library_data , version )
467+ batched_library_data = conditional_batched (
468+ library_data ,
469+ 2 ,
470+ lambda x : x .get ("top_contributors_release" ).count ()
471+ <= RELEASE_REPORT_AUTHORS_PER_PAGE_THRESHOLD ,
472+ )
473+ git_graph_data = get_git_graph_data (prior_version , version )
474+ download = get_download_links (version )
475+
476+ return {
477+ "committee_members" : committee_members ,
478+ "lines_added" : lines_added ,
479+ "lines_removed" : lines_removed ,
480+ "version" : version ,
481+ "report_configuration" : report_configuration ,
482+ "prior_version" : prior_version ,
483+ "opened_issues_count" : opened_issues_count ,
484+ "closed_issues_count" : closed_issues_count ,
485+ "mailinglist_wordcloud_base64" : mailinglist_wordcloud_base64 ,
486+ "mailinglist_wordcloud_frequencies" : mailinglist_wordcloud_top_words ,
487+ "mailinglist_counts" : mailinglist_counts ,
488+ "mailinglist_total" : total_mailinglist_count or 0 ,
489+ "mailinglist_contributor_release_count" : mailinglist_contributor_release_count , # noqa: E501
490+ "mailinglist_contributor_new_count" : mailinglist_contributor_new_count ,
491+ "mailinglist_post_stats" : mailinglist_post_stats ,
492+ "mailinglist_new_subscribers_stats" : mailinglist_new_subscribers_stats ,
493+ "mailinglist_charts_start_year" : prior_version .release_date .year ,
494+ "search_wordcloud_base64" : search_wordcloud_base64 ,
495+ "search_wordcloud_frequencies" : search_wordcloud_top_words ,
496+ "search_stats" : search_stats ,
497+ "commit_contributors_release_count" : commit_contributors_release_count ,
498+ "commit_contributors_new_count" : commit_contributors_new_count ,
499+ "global_contributors_new_count" : global_contributors_new_count ,
500+ "commit_count" : commit_count ,
501+ "version_commit_count" : version_commit_count ,
502+ "top_contributors_release_overall" : top_contributors ,
503+ "library_data" : library_data ,
504+ "new_libraries" : new_libraries ,
505+ "batched_library_data" : batched_library_data ,
506+ "top_libraries_for_version" : top_libraries_for_version ,
507+ "library_count" : libraries .count (),
508+ "library_index_libraries" : library_index_library_data ,
509+ "added_library_count" : new_libraries .count (),
510+ "removed_library_count" : removed_library_count ,
511+ "downloads" : download ,
512+ "contribution_box_graph" : git_graph_data ,
513+ "slack_channels" : get_slack_channels (),
514+ "slack" : slack_stats ,
515+ }
516+
517+ def render_with_stats (self , stats_results , base_uri = None ):
518+ """Render HTML with pre-computed stats results"""
519+ context = self .generate_context (
520+ self .cleaned_data ["report_configuration" ], stats_results
521+ )
522+ if base_uri :
523+ context ["base_uri" ] = base_uri
524+ html = render_to_string (self .html_template_name , context )
525+ self .cache_set (html )
526+ return html
527+
414528
415529class CommitAuthorEmailForm (Form ):
416530 """
0 commit comments