module StatisticsHelper def statistics_data [ { key: 'users', name: t('statistics.sections.users'), entries: user_statistics }, { key: 'exercises', name: t('statistics.sections.exercises'), entries: exercise_statistics }, { key: 'request_for_comments', name: t('statistics.sections.request_for_comments'), entries: rfc_statistics } ] end def user_statistics [ { key: 'internal_users', name: t('activerecord.models.internal_user.other'), data: InternalUser.count, url: internal_users_path }, { key: 'external_users', name: t('activerecord.models.external_user.other'), data: ExternalUser.count, url: external_users_path }, { key: 'currently_active', name: t('statistics.entries.users.currently_active'), data: ExternalUser.joins(:submissions) .where(['submissions.created_at >= ?', DateTime.now - 5.minutes]) .distinct('external_users.id').count } ] end def exercise_statistics [ { key: 'exercises', name: t('activerecord.models.exercise.other'), data: Exercise.count, url: exercises_path }, { key: 'average_submissions', name: t('statistics.entries.exercises.average_number_of_submissions'), data: (Submission.count.to_f / Exercise.count).round(2) }, { key: 'submissions_per_minute', name: t('statistics.entries.exercises.submissions_per_minute'), data: (Submission.where('created_at >= ?', DateTime.now - 1.hours).count.to_f / 60).round(2), unit: '/min' }, { key: 'execution_environments', name: t('activerecord.models.execution_environment.other'), data: ExecutionEnvironment.count, url: execution_environments_path }, { key: 'exercise_collections', name: t('activerecord.models.exercise_collection.other'), data: ExerciseCollection.count, url: exercise_collections_path } ] end def rfc_statistics [ { key: 'rfcs', name: t('activerecord.models.request_for_comment.other'), data: RequestForComment.count, url: request_for_comments_path }, { key: 'percent_solved', name: t('statistics.entries.request_for_comments.percent_solved'), data: (100.0 / RequestForComment.count * RequestForComment.where(solved: true).count).round(1), unit: '%', url: request_for_comments_path + '?q%5Bsolved_not_eq%5D=0' }, { key: 'percent_soft_solved', name: t('statistics.entries.request_for_comments.percent_soft_solved'), data: (100.0 / RequestForComment.count * RequestForComment.unsolved.where(full_score_reached: true).count).round(1), unit: '%', url: request_for_comments_path }, { key: 'percent_unsolved', name: t('statistics.entries.request_for_comments.percent_unsolved'), data: (100.0 / RequestForComment.count * RequestForComment.unsolved.count).round(1), unit: '%', url: request_for_comments_path + '?q%5Bsolved_not_eq%5D=1' }, { key: 'comments', name: t('activerecord.models.comment.other'), data: Comment.count }, { key: 'rfcs_with_comments', name: t('statistics.entries.request_for_comments.with_comments'), data: RequestForComment.joins('join "submissions" s on s.id = request_for_comments.submission_id join "files" f on f.context_id = s.id and f.context_type = \'Submission\' join "comments" c on c.file_id = f.id').group('request_for_comments.id').count.size } ] end end