Skip to content

Commit

Permalink
CV2-4985: export dashboard as CSV
Browse files Browse the repository at this point in the history
  • Loading branch information
melsawy committed Jan 23, 2025
1 parent 0454728 commit 6cbb317
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 1 deletion.
60 changes: 60 additions & 0 deletions app/models/team.rb
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,66 @@ def get_shorten_outgoing_urls
self.settings.to_h.with_indifferent_access[:shorten_outgoing_urls] || self.tipline_newsletters.where(content_type: 'rss', enabled: true).exists?
end

def get_dashboard_exported_data(filters)
ts = TeamStatistics.new(self, filters[:period], filters[:language], filters[:platform])
header = [
'Conversations',
'Messages',
'Conversations(Positive)', 'Conversations(Negative)', 'Conversations(No Response)',
'Avg. Response Time',
'Users(Total)',
'Users(Unique)',
'Users(Returning)',
'Subscribers',
'Subscribers(New)',
'Newsletters(Sent)',
'Newsletters(Delivered)',
'Media Received(Text)','Media Received(Link)','Media Received(Audio)','Media Received(Image)','Media Received(Video)',
'Articles Sent',
'Matched Results(Fact-Checks)', 'Matched Results(Explainers)',
]
# Append Top tags/requested header based on result count
{ top_media_tags: 'Top tag', top_requested_media_clusters: 'Top Requested' }.each do |method, prefix|
column_headers = []
ts.send(method).each_with_index do |_v, i|
column_headers << "#{prefix}(#{i+1})"
end
header << column_headers
end
data = []
data << header.flatten
header_methods = {
number_of_conversations: 'to_i',
number_of_messages: 'to_i',
number_of_search_results_by_feedback_type: 'values',
average_response_time: 'to_i',
number_of_total_users: 'to_i',
number_of_unique_users: 'to_i',
number_of_returning_users: 'to_i',
number_of_subscribers: 'to_i',
number_of_new_subscribers: 'to_i',
number_of_newsletters_sent: 'to_i',
number_of_newsletters_delivered: 'to_i',
number_of_media_received_by_media_type: 'values',
number_of_articles_sent: 'to_i',
number_of_matched_results_by_article_type: 'values',
top_media_tags: 'collect',
top_requested_media_clusters: 'collect'
}
raw = []
header_methods.each do |method, type|
output = ts.send(method) if ts.respond_to?(method)
if type == 'collect'
output = output.collect{|item| "#{item[:label]}(#{item[:value]})"}
else
output = output.send(type)
end
raw << output
end
data << raw.flatten
data
end

# private
#
# Please add private methods to app/models/concerns/team_private.rb
Expand Down
6 changes: 5 additions & 1 deletion lib/list_export.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
class ListExport
TYPES = [:media, :feed, :fact_check, :explainer]
TYPES = [:media, :feed, :fact_check, :explainer, :dashboard]

def initialize(type, query, team_id)
@type = type
Expand All @@ -21,6 +21,8 @@ def number_of_rows
@team.filtered_fact_checks(@parsed_query).count
when :explainer
@team.filtered_explainers(@parsed_query).count
when :dashboard
1
end
end

Expand Down Expand Up @@ -62,6 +64,8 @@ def export_data
FactCheck.get_exported_data(@parsed_query, @team)
when :explainer
Explainer.get_exported_data(@parsed_query, @team)
when :dashboard
@team.get_dashboard_exported_data(@parsed_query)
end
end
end
11 changes: 11 additions & 0 deletions test/lib/list_export_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,15 @@ def teardown
assert_equal 2, csv_content.size
assert_equal 2, export.number_of_rows
end

test "should export dashboard CSV" do
t = create_team
export = ListExport.new(:dashboard, { period: "past_week", platform: "whatsapp", language: "en" }.to_json, t.id)
csv_url = export.generate_csv_and_send_email(create_user)
response = Net::HTTP.get_response(URI(csv_url))
assert_equal 200, response.code.to_i
csv_content = CSV.parse(response.body, headers: true)
assert_equal 1, csv_content.size
assert_equal 1, export.number_of_rows
end
end

0 comments on commit 6cbb317

Please sign in to comment.