build_draft_stats, total_original_post_notes_by_qtr_and_year, other minor improvements

This commit is contained in:
2026-04-04 02:02:24 -04:00
parent d4e6df7721
commit a2d49785be
4 changed files with 102 additions and 28 deletions

View File

@@ -33,7 +33,11 @@ class StatsModel:
total_original_post_notes: int = field(init=False)
# Total notes for original posts within each month and year.
total_original_post_notes_by_month_and_year: Dict[str, int] = field(
total_original_post_notes_by_month_and_year: Dict[str, Any] = field(
init=False)
# Total notes for original posts within each quarter and year.
total_original_post_notes_by_qtr_and_year: Dict[str, Any] = field(
init=False)
# Tags ranked from most popular to least popular by notes.
@@ -44,6 +48,7 @@ class StatsModel:
self.total_original_posts = self.calculate_total_original_posts()
self.total_original_post_notes = self.calculate_total_original_post_notes()
self.total_original_post_notes_by_month_and_year = self.calculate_total_original_post_notes_by_month_and_year()
self.total_original_post_notes_by_qtr_and_year = self.calculate_total_original_post_notes_by_qtr_and_year()
self.most_popular_tags = self.determine_most_popular_tags('note_count')
def calculate_total_posts(self) -> int:
@@ -58,7 +63,7 @@ class StatsModel:
total += self.original_post_map[post_key]['note_count']
return total
def calculate_total_original_post_notes_by_month_and_year(self) -> Dict[str, int]:
def calculate_total_original_post_notes_by_month_and_year(self) -> Dict[str, Any]:
# https://docs.python.org/3/library/collections.html#defaultdict-objects
date_map: Dict[str, Any] = {}
date_map = defaultdict(lambda: {'note_count': 0,
@@ -113,3 +118,30 @@ class StatsModel:
# https://stackoverflow.com/a/73050
return sorted(list(tag_dict.values()), key=itemgetter(sort_key),
reverse=True)
def calculate_total_original_post_notes_by_qtr_and_year(self) -> Dict[str, Any]:
total_original_post_notes_by_month_and_year: Dict[str, int] = self.total_original_post_notes_by_month_and_year
if not total_original_post_notes_by_month_and_year:
total_original_post_notes_by_month_and_year = self.calculate_total_original_post_notes_by_month_and_year()
self.total_original_post_notes_by_month_and_year = total_original_post_notes_by_month_and_year.copy()
quarter_map: Dict[str, Any] = {}
quarter_map = defaultdict(lambda: {'note_count': 0,
'post_count': 0},
quarter_map)
for key in total_original_post_notes_by_month_and_year:
month_ent = total_original_post_notes_by_month_and_year[key]
month_year: datetime = datetime.strptime(key, '%Y-%m')
qtr = (month_year.month + 2) // 3
new_key = f"{month_year.year}q{qtr}"
quarter_map[new_key]['note_count'] += month_ent['note_count']
quarter_map[new_key]['post_count'] += month_ent['post_count']
# Results postprocessing.
for quarter in quarter_map:
sts = quarter_map[quarter]
post_count = sts['post_count']
note_count = sts['note_count']
sts['notes_to_posts_ratio'] = note_count / post_count
return quarter_map