1. 09 Feb, 2016 1 commit
  2. 06 Feb, 2016 1 commit
  3. 05 Feb, 2016 1 commit
  4. 26 Jan, 2016 1 commit
  5. 22 Jan, 2016 1 commit
    • Disable audit certificates for new audit enrollments. · 96cc3895
      Two new certificate statuses are introduced, 'audit_passing' and
      'audit_notpassing'. These signal that the GeneratedCertificate is not
      to be displayed as a cert to the user, and that they either passed or
      did not. This allows us to retain existing grading logic, as well as
      maintaining correctness in analytics and reporting.
      
      Ineligible certificates are hidden by using the
      `eligible_certificates` manager on GeneratedCertificate. Some places
      in the coe (largely reporting, analytics, and management commands) use
      the default `objects` manager, since they need access to all
      certificates.
      
      ECOM-3040
      ECOM-3515
      Peter Fogg committed
  6. 20 Jan, 2016 2 commits
  7. 13 Jan, 2016 1 commit
    • Disable audit certificates for new audit enrollments. · 60860e3a
      An `eligible_for_certificate` field is added to the
      GeneratedCertificate model. This way we can retain existing grading
      logic, as well as maintaining correctness in analytics and reporting.
      
      Ineligible certificates are hidden by using the
      `eligible_certificates` manager on GeneratedCertificate. Some places
      in the coe (largely reporting, analytics, and management commands) use
      the default `objects` manager, since they need access to all
      certificates.
      
      This commit also updates the DB cache for acceptance tests.
      Peter Fogg committed
  8. 21 Dec, 2015 1 commit
  9. 17 Dec, 2015 2 commits
  10. 09 Dec, 2015 1 commit
  11. 07 Dec, 2015 1 commit
  12. 04 Dec, 2015 1 commit
  13. 02 Dec, 2015 1 commit
    • CohortMembership Transaction Fixes · 731d85f7
      An issue arose recently due to ATOMIC_REQUESTS being turned on by default. It
      turns out that CohortMemberships had been somewhat relying on the old default
      transaction handling in order to keep CohortMemberships and the underlying
      CourseUserGroup.users values in-sync.
      
      To fix this, I've made all updates to Cohortmemberships go through an
      outer_atomic(read_committed=True) block. This, is conjunction with the already
      present select_for_update(), will no longer allow 2 simultaneous requests to
      modify objects in memory without sharing them. Only one process will be
      touching a given CohortMembership at any given time, and all changes will be
      immediately comitted to the database, where the other process will see them.
      
      I've also included some changes to get_cohort(), add_user_to_cohort(), and
      remove_user_from_cohort() in order to properly make use of the new
      CohortMembership system.
      Eric Fischer committed
  14. 25 Nov, 2015 1 commit
  15. 22 Nov, 2015 1 commit
  16. 19 Nov, 2015 1 commit
  17. 13 Nov, 2015 1 commit
  18. 10 Nov, 2015 2 commits
  19. 06 Nov, 2015 1 commit
  20. 03 Nov, 2015 1 commit
  21. 30 Oct, 2015 1 commit
  22. 29 Oct, 2015 1 commit
  23. 21 Oct, 2015 1 commit
  24. 19 Oct, 2015 1 commit
  25. 07 Oct, 2015 1 commit
  26. 23 Sep, 2015 1 commit
  27. 18 Sep, 2015 2 commits
  28. 17 Aug, 2015 1 commit
  29. 13 Aug, 2015 1 commit
  30. 03 Aug, 2015 1 commit
  31. 15 Jul, 2015 1 commit
  32. 14 Jul, 2015 1 commit
  33. 13 Jul, 2015 1 commit
  34. 09 Jul, 2015 1 commit
    • Optimize grading/progress page to reduce database queries (cache max scores). · 79de77cf
      The progress page did a number of things that make performance terrible for
      courses with large numbers of problems, particularly if those problems are
      customresponse CapaModule problems that need to be executed via codejail.
      
      The grading code takes pains to not instantiate student state and execute the
      problem code. If a student has answered the question, the max score is stored
      in StudentModule. However, if the student hasn't attempted the question yet, we
      have to run the problem code just to call .max_score() on it. This is necessary
      in grade() if the student has answered other problems in the assignment (so we
      can know what to divide by). This is always necessary to know in
      progress_summary() because we list out every problem there. Code execution can
      be especially slow if the problems need to invoke codejail.
      
      To address this, we create a MaxScoresCache that will cache the max raw score
      possible for every problem. We select the cache keys so that it will
      automatically become invalidated when a new version of the course is published.
      
      The fundamental assumption here is that a problem cannot have two different
      max score values for two unscored students. A problem *can* score two students
      differently such that they have different max scores. So Carlos can have 2/3 on
      a problem, while Lyla gets 3/4. But if neither Carlos nor Lyla has ever
      interacted with the problem (i.e. they're just seeing it on their progress
      page), they must both see 0/4 -- it cannot be the case that Carlos sees 0/3 and
      Lyla sees 0/4.
      
      We used to load all student state into two separate FieldDataCache instances,
      after which we do a bunch of individual queries for scored items. Part of this
      split-up was done because of locking problems, but I think we might have gotten
      overzealous with our manual transaction hammer.
      
      In this commit, we consolidate all state access in grade() and progress()
      to use one shared FieldDataCache. We also use a filter so that we only pull
      back StudentModule state for things that might possibly affect the grade --
      items that either have scores or have children.
      
      Because some older XModules do work in their __init__() methods (like Video),
      instantiating them takes time, particularly on large courses. This commit also
      changes the code that fetches the grading_context to filter out children that
      can't possibly affect the grade.
      
      Finally, we introduce a ScoresClient that also tries to fetch score
      information all at once, instead of in separate queries. Technically, we are
      fetching this information redundantly, but that's because the state and score
      interfaces are being teased apart as we move forward. Still, this only
      amounts to one extra SQL query, and has very little impact on performance
      overall.
      
      Much thanks to @adampalay -- his hackathon work in #7168 formed the basis of
      this.
      
      https://openedx.atlassian.net/browse/CSM-17
      David Ormsbee committed
  35. 07 Jul, 2015 1 commit
  36. 02 Jul, 2015 1 commit