• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / backend / 415c28e8ee8b88e6acc822aca1500269b5f844ad

06 Aug 2025 03:59PM UTC coverage: 91.52% (-0.9%) from 92.467%
415c28e8ee8b88e6acc822aca1500269b5f844ad

push

github

web-flow
Leaderboard (#1238)

* added 'enable_leaderboard' columns in courses table

* Leaderboard create course config, leaderboard page routing, leaderboard sql query for all users in course

* added 'top_leaderboard_display' columns in courses table

* added 'all_user_total_xp' function for leaderboard display

* add top leaderboard display options to course settings (select how many to display in leaderboard)

* added contest scores fetching and contest score calculation

* Refactor query execution in assessments module for improved readability

* added functions to fetch contest scoring and voting

* changes to default values

* updated tests

* Fixed xp fetching for all users

* Add top contest leaderboard display configuration and update related tests.
Updated leaderboard fetching and exporting for assessment workspace leaderboard.
Added Leaderboard Dropdown contests fetching.

* Added automatic XP assignment for winning contest entries

* Implement XP assignment for winning contest entries based on contest voting XML and added dispatch endpoint for XP customisation

* Add default value for XP values and improve XP assignment logic for contest entries

* No tiebreak for contest scoring

* Refactor contest scoring endpoints for authentication errors

* Enhance leaderboard update logic and improve error handling for voting questions

* Refactor XP assignment logic for voting questions and set default XP values.
Refactor Score calculation logic to reset to 0 before calculating.

* Temporary Assessment Workspace leaderboard fix for testing

* Fixed tests for assessments (default XP to award for contests)

* Refactor contest fetching logic to filter by voting question contest numbers

* Refactor leaderboard query logic to use RANK() and improve code readability.
Uncommented leaderboard portions after finalising testing

* temporary fix for STePS

* Add ranking to assessment workspace leaderboard queries and update view helpers to include rank

* Post-STePS f... (continued)

117 of 156 new or added lines in 5 files covered. (75.0%)

7 existing lines in 2 files now uncovered.

3216 of 3514 relevant lines covered (91.52%)

7703.7 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

54.55
/lib/cadet_web/admin_views/admin_assessments_view.ex
1
defmodule CadetWeb.AdminAssessmentsView do
2
  use CadetWeb, :view
3
  use Timex
4
  import CadetWeb.AssessmentsHelpers
5

6
  def render("index.json", %{assessments: assessments}) do
7
    render_many(assessments, CadetWeb.AdminAssessmentsView, "overview.json", as: :assessment)
2✔
8
  end
9

10
  def render("overview.json", %{assessment: assessment}) do
11
    transform_map_for_view(assessment, %{
10✔
12
      id: :id,
13
      courseId: :course_id,
14
      title: :title,
15
      shortSummary: :summary_short,
16
      openAt: &format_datetime(&1.open_at),
10✔
17
      closeAt: &format_datetime(&1.close_at),
10✔
18
      type: & &1.config.type,
10✔
19
      isManuallyGraded: & &1.config.is_manually_graded,
10✔
20
      story: :story,
21
      number: :number,
22
      reading: :reading,
23
      status: &(&1.user_status || "not_attempted"),
10✔
24
      maxXp: :max_xp,
25
      xp: &(&1.xp || 0),
10✔
26
      coverImage: :cover_picture,
27
      private: &password_protected?(&1.password),
10✔
28
      isPublished: :is_published,
29
      questionCount: :question_count,
30
      gradedCount: &(&1.graded_count || 0),
10✔
31
      earlySubmissionXp: & &1.config.early_submission_xp,
10✔
32
      maxTeamSize: :max_team_size,
33
      hasVotingFeatures: :has_voting_features,
34
      hasTokenCounter: :has_token_counter,
35
      isVotingPublished: :is_voting_published
36
    })
37
  end
38

39
  def render("show.json", %{assessment: assessment}) do
40
    transform_map_for_view(
×
41
      assessment,
42
      %{
43
        id: :id,
44
        courseId: :course_id,
45
        title: :title,
46
        type: & &1.config.type,
×
47
        story: :story,
48
        number: :number,
49
        reading: :reading,
50
        longSummary: :summary_long,
51
        hasTokenCounter: :has_token_counter,
52
        missionPDF: &Cadet.Assessments.Upload.url({&1.mission_pdf, &1}),
×
53
        questions:
54
          &Enum.map(&1.questions, fn question ->
×
55
            map =
×
56
              build_question_with_answer_and_solution_if_ungraded(%{
57
                question: question
58
              })
59

60
            map
×
61
          end)
62
      }
63
    )
64
  end
65

66
  def render("leaderboard.json", %{leaderboard: leaderboard}) do
UNCOV
67
    render_many(leaderboard, CadetWeb.AdminAssessmentsView, "contestEntry.json",
×
68
      as: :contestEntry
69
    )
70
  end
71

72
  def render("contestEntry.json", %{contestEntry: contestEntry}) do
UNCOV
73
    transform_map_for_view(
×
74
      contestEntry,
75
      %{
76
        student_name: :student_name,
UNCOV
77
        answer: & &1.answer["code"],
×
78
        final_score: "final_score"
79
      }
80
    )
81
  end
82

83
  defp password_protected?(nil), do: false
10✔
84

85
  defp password_protected?(_), do: true
×
86
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc