Skip to content

Commit

Permalink
Ticket CV2-5389: Implementing 4 more data points
Browse files Browse the repository at this point in the history
  • Loading branch information
caiosba committed Oct 20, 2024
1 parent 504a607 commit ecfeef0
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 30 deletions.
8 changes: 6 additions & 2 deletions lib/check_data_points.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ class << self
GRANULARITY_VALUES = ['year', 'quarter', 'month', 'week', 'day']

# Number of tipline messages
def tipline_messages(team_id, start_date, end_date, granularity = nil)
def tipline_messages(team_id, start_date, end_date, granularity = nil, platform = nil, language = nil)
start_date, end_date = parse_start_end_dates(start_date, end_date)
query = TiplineMessage.where(team_id: team_id, created_at: start_date..end_date)
query = query.where(platform: platform) unless platform.blank?
query = query.where(language: language) unless language.blank?
query_based_on_granularity(query, granularity)
end

# Number of tipline requests
def tipline_requests(team_id, start_date, end_date, granularity = nil)
def tipline_requests(team_id, start_date, end_date, granularity = nil, platform = nil, language = nil)
start_date, end_date = parse_start_end_dates(start_date, end_date)
query = TiplineRequest.where(team_id: team_id, created_at: start_date..end_date)
query = query.where(platform: platform) unless platform.blank?
query = query.where(language: language) unless language.blank?
query_based_on_granularity(query, granularity)
end

Expand Down
67 changes: 42 additions & 25 deletions lib/team_statistics.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
class TeamStatistics
PERIODS = ['last_day', 'last_week', 'last_month', 'last_year']
PLATFORMS = Bot::Smooch::SUPPORTED_INTEGRATION_NAMES

def initialize(team, period, language, platform = nil)
@team = team
raise ArgumentError.new('Invalid workspace provided') unless @team.is_a?(Team)
unless @team.is_a?(Team)
raise ArgumentError.new('Invalid workspace provided')
end

@period = period
raise ArgumentError.new("Invalid period provided. Allowed values: #{PERIODS.join(', ')}") unless PERIODS.include?(@period)
@language = language
unless PERIODS.include?(@period)
raise ArgumentError.new("Invalid period provided. Allowed values: #{PERIODS.join(', ')}")
end

range = time_range.to_a
@start_date, @end_date = range.first, range.last
@start_date_str, @end_date_str = @start_date.strftime('%Y-%m-%d'), @end_date.strftime('%Y-%m-%d')

@platform = platform
if !@platform.blank? && !PLATFORMS.keys.include?(@platform)
# For `Bot::Smooch::SUPPORTED_INTEGRATION_NAMES`, the keys (e.g., 'whatsapp') are used by `TiplineRequest`,
# while the values (e.g., 'WhatsApp') are used by `TiplineMessage`
raise ArgumentError.new("Invalid platform provided. Allowed values: #{PLATFORMS.keys.join(', ')}")
end

@language = language
end

# For GraphQL
Expand Down Expand Up @@ -44,9 +61,7 @@ def number_of_fact_checks_by_rating
# FIXME: Only fact-checks for now - add explainers
def top_articles_sent
data = {}
range = time_range.to_a
start_date, end_date = range.first, range.last
clusters = CheckDataPoints.top_clusters(@team.id, start_date, end_date, 5, 'last_seen', @language)
clusters = CheckDataPoints.top_clusters(@team.id, @start_date, @end_date, 5, 'last_seen', @language)
clusters.each do |pm_id, demand|
data[ProjectMedia.find(pm_id).fact_check_title] = demand
end
Expand All @@ -69,10 +84,8 @@ def top_articles_tags
LIMIT 5
SQL

range = time_range.to_a
start_date, end_date = range.first, range.last
language = @language ? [@language] : @team.get_languages.to_a
result = ActiveRecord::Base.connection.execute(ApplicationRecord.sanitize_sql_for_assignment([sql, team_id: @team.id, start_date: start_date, end_date: end_date, language: language]))
result = ActiveRecord::Base.connection.execute(ApplicationRecord.sanitize_sql_for_assignment([sql, team_id: @team.id, start_date: @start_date, end_date: @end_date, language: language]))
data = {}
result.each do |row|
data[row['tag']] = row['tag_count'].to_i
Expand All @@ -82,32 +95,24 @@ def top_articles_tags

# For tiplines

# TODO
def number_of_messages
rand(1000)
platform = PLATFORMS[@platform]
CheckDataPoints.tipline_messages(@team.id, @start_date_str, @end_date_str, nil, platform, @language)
end

# TODO
def number_of_conversations
rand(1000)
CheckDataPoints.tipline_requests(@team.id, @start_date_str, @end_date_str, nil, @platform, @language)
end

# TODO
def number_of_messages_by_date
data = {}
time_range.each do |day|
data[day] = rand(1000)
end
data
platform = Bot::Smooch::SUPPORTED_INTEGRATION_NAMES[@platform]
data = CheckDataPoints.tipline_messages(@team.id, @start_date_str, @end_date_str, 'day', platform, @language)
number_of_tipline_data_points_by_date(data)
end

# TODO
def number_of_conversations_by_date
data = {}
time_range.each do |day|
data[day] = rand(1000)
end
data
data = CheckDataPoints.tipline_requests(@team.id, @start_date_str, @end_date_str, 'day', @platform, @language)
number_of_tipline_data_points_by_date(data)
end

# TODO
Expand Down Expand Up @@ -235,4 +240,16 @@ def number_of_articles_saved_by_date(timestamp_field) # timestamp_field = :creat

number_of_articles
end

def number_of_tipline_data_points_by_date(results)
data = {}
# Pre-fill with zeros
time_range.to_a.each do |day|
data[day.strftime("%Y-%m-%d")] = 0
end
results.each do |day, count|
data[day.strftime("%Y-%m-%d")] = count
end
data
end
end
56 changes: 53 additions & 3 deletions test/lib/team_statistics_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ def teardown
end
end

test "should provide a valid platform" do
assert_raises ArgumentError do
TeamStatistics.new(Class.new, 'last_month', 'en', 'icq')
end

assert_nothing_raised do
TeamStatistics.new(@team, 'last_month', 'en', 'whatsapp')
end
end

test "should return articles statistics" do
team = create_team
exp = nil
Expand Down Expand Up @@ -72,17 +82,57 @@ def teardown

pm1 = create_project_media team: @team, disable_es_callbacks: false
create_fact_check title: 'Bar', report_status: 'published', rating: 'verified', language: 'en', claim_description: create_claim_description(project_media: pm1), disable_es_callbacks: false
create_tipline_request team: @team.id, associated: pm1
create_tipline_request team_id: @team.id, associated: pm1

pm2 = create_project_media team: @team, disable_es_callbacks: false
create_fact_check title: 'Foo', report_status: 'published', rating: 'verified', language: 'en', claim_description: create_claim_description(project_media: pm2), disable_es_callbacks: false
create_tipline_request team: @team.id, associated: pm2
create_tipline_request team: @team.id, associated: pm2
create_tipline_request team_id: @team.id, associated: pm2
create_tipline_request team_id: @team.id, associated: pm2

sleep 2

object = TeamStatistics.new(@team, 'last_week', 'en')
expected = { 'Foo' => 2, 'Bar' => 1 }
assert_equal expected, object.top_articles_sent
end

test "should return tipline statistics" do
team = create_team
pm1 = create_project_media team: @team
pm2 = create_project_media team: team

travel_to Time.parse('2024-01-01') do
2.times { create_tipline_message team_id: @team.id, language: 'en', platform: 'WhatsApp' }
create_tipline_message team_id: @team.id, language: 'en', platform: 'Telegram'
create_tipline_message team_id: @team.id, language: 'pt', platform: 'WhatsApp'
create_tipline_message team_id: team.id, language: 'en', platform: 'WhatsApp'

create_tipline_request team_id: @team.id, associated: pm1, language: 'en', platform: 'whatsapp'
create_tipline_request team_id: team.id, associated: pm2, language: 'en', platform: 'whatsapp'
create_tipline_request team_id: @team.id, associated: pm1, language: 'pt', platform: 'whatsapp'
create_tipline_request team_id: @team.id, associated: pm1, language: 'en', platform: 'telegram'
end

travel_to Time.parse('2024-01-03') do
3.times { create_tipline_message team_id: @team.id, language: 'en', platform: 'WhatsApp' }
create_tipline_message team_id: @team.id, language: 'en', platform: 'Telegram'
create_tipline_message team_id: @team.id, language: 'pt', platform: 'WhatsApp'
create_tipline_message team_id: team.id, language: 'en', platform: 'WhatsApp'

2.times { create_tipline_request team_id: @team.id, associated: pm1, language: 'en', platform: 'whatsapp' }
create_tipline_request team_id: team.id, associated: pm2, language: 'en', platform: 'whatsapp'
create_tipline_request team_id: @team.id, associated: pm1, language: 'pt', platform: 'whatsapp'
create_tipline_request team_id: @team.id, associated: pm1, language: 'en', platform: 'telegram'
end

travel_to Time.parse('2024-01-08') do
object = TeamStatistics.new(@team, 'last_week', 'en', 'whatsapp')
assert_equal 5, object.number_of_messages
assert_equal({ '2024-01-01' => 2, '2024-01-02' => 0, '2024-01-03' => 3, '2024-01-04' => 0, '2024-01-05' => 0, '2024-01-06' => 0, '2024-01-07' => 0, '2024-01-08' => 0 },
object.number_of_messages_by_date)
assert_equal 3, object.number_of_conversations
assert_equal({ '2024-01-01' => 1, '2024-01-02' => 0, '2024-01-03' => 2, '2024-01-04' => 0, '2024-01-05' => 0, '2024-01-06' => 0, '2024-01-07' => 0, '2024-01-08' => 0 },
object.number_of_conversations_by_date)
end
end
end

0 comments on commit ecfeef0

Please sign in to comment.