diff --git a/facebook_graph_service.py b/facebook_graph_service.py index f42e77a..a559b19 100644 --- a/facebook_graph_service.py +++ b/facebook_graph_service.py @@ -128,20 +128,25 @@ class FacebookGraphService: since = int((datetime.now() - timedelta(days=days)).timestamp()) until = int(datetime.now().timestamp()) + # Meta deprecated impressions/views metrics on 2026-06-30. + # Migrated to *_media_view family. Old keys kept temporarily for + # transition (Meta serves both until cutoff). all_metrics = [ 'page_views_total', 'page_post_engagements', 'page_actions_post_reactions_total', - 'page_posts_impressions', - 'page_video_views', + 'page_media_view', + 'page_total_media_view_unique', 'page_daily_follows', 'page_daily_unfollows', - # These may be deprecated or require additional permissions: - 'page_impressions', - 'page_engaged_users', 'page_fans', 'page_fan_adds', 'page_fan_removes', + # Deprecated 2026-06-30 — keep until migration verified end-to-end: + 'page_posts_impressions', + 'page_video_views', + 'page_impressions', + 'page_engaged_users', ] result = {} @@ -444,7 +449,12 @@ class FacebookGraphService: Returns: Dict with impressions, reach, engaged_users, clicks or None """ - metrics = 'post_impressions,post_impressions_unique,post_engaged_users,post_clicks' + # post_impressions/post_impressions_unique deprecated 2026-06-30. + # Replaced by post_media_view / post_total_media_view_unique. + # Both old and new requested during transition window. + metrics = ('post_media_view,post_total_media_view_unique,' + 'post_impressions,post_impressions_unique,' + 'post_engaged_users,post_clicks') result = self._get(f'{post_id}/insights', {'metric': metrics}) if not result: return None @@ -454,11 +464,10 @@ class FacebookGraphService: name = metric.get('name', '') values = metric.get('values', []) if values: - # Lifetime metrics have a single value value = values[0].get('value', 0) - if name == 'post_impressions': + if name in ('post_media_view', 'post_impressions'): insights['impressions'] = value - elif name == 'post_impressions_unique': + elif name in ('post_total_media_view_unique', 'post_impressions_unique'): insights['reach'] = value elif name == 'post_engaged_users': insights['engaged_users'] = value @@ -659,10 +668,14 @@ def sync_facebook_to_social_media(db, company_id: int) -> dict: if post_stats.get('recent_posts'): extra['recent_posts'] = post_stats['recent_posts'] # Insights - for key in ('page_impressions', 'page_engaged_users', 'page_views_total', - 'page_post_engagements', 'page_fan_adds', 'page_fan_removes', - 'page_actions_post_reactions_total', 'page_posts_impressions', - 'page_video_views', 'page_daily_follows', 'page_daily_unfollows'): + for key in ('page_media_view', 'page_total_media_view_unique', + 'page_views_total', 'page_post_engagements', + 'page_fan_adds', 'page_fan_removes', + 'page_actions_post_reactions_total', + 'page_daily_follows', 'page_daily_unfollows', + # Deprecated 2026-06-30, kept for backward compat: + 'page_impressions', 'page_engaged_users', + 'page_posts_impressions', 'page_video_views'): if insights.get(key): extra[f'insights_{key}'] = insights[key] csm.content_types = extra diff --git a/templates/admin/social_audit_detail.html b/templates/admin/social_audit_detail.html index 0e96a29..55c5d7e 100644 --- a/templates/admin/social_audit_detail.html +++ b/templates/admin/social_audit_detail.html @@ -799,17 +799,20 @@ {% endif %} - - {% set has_insights = ct.get('insights_page_impressions') or ct.get('insights_page_views_total') or ct.get('insights_page_post_engagements') or ct.get('insights_page_posts_impressions') or ct.get('insights_page_daily_follows') %} + {# Meta deprecated impressions metrics on 2026-06-30. New: page_media_view, page_total_media_view_unique. Fallback to old keys for historical data. #} + {% set page_views_metric = ct.get('insights_page_total_media_view_unique') or ct.get('insights_page_impressions') %} + {% set page_video_metric = ct.get('insights_page_media_view') or ct.get('insights_page_video_views') %} + {% set page_reach_metric = ct.get('insights_page_posts_impressions') %} + {% set has_insights = page_views_metric or ct.get('insights_page_views_total') or ct.get('insights_page_post_engagements') or page_reach_metric or ct.get('insights_page_daily_follows') %} {% if has_insights %}