1. 28 Aug, 2015 1 commit
  2. 26 Aug, 2015 1 commit
  3. 24 Aug, 2015 1 commit
  4. 21 Aug, 2015 1 commit
  5. 19 Aug, 2015 3 commits
  6. 17 Aug, 2015 2 commits
  7. 15 Aug, 2015 1 commit
  8. 14 Aug, 2015 1 commit
  9. 13 Aug, 2015 1 commit
  10. 11 Aug, 2015 1 commit
    • Make new masquerading code compatible to existing session data. · 55ace6ba
      The new masquerading code introduced in PR #8775 adds a new attribute to
      CourseMasquerade objects stored in the user's session.  When users who have
      active masquerading configuration access instances with the new code, and
      AttributeError occurs when trying to access the attribute user_name.
      
      This fix ensures that CourseMasquerade objects receive all required attributes
      when they are unpickled from the session.
      Sven Marnach committed
  11. 10 Aug, 2015 1 commit
  12. 07 Aug, 2015 1 commit
  13. 03 Aug, 2015 1 commit
  14. 01 Aug, 2015 2 commits
  15. 31 Jul, 2015 1 commit
  16. 28 Jul, 2015 1 commit
  17. 27 Jul, 2015 1 commit
  18. 24 Jul, 2015 2 commits
  19. 21 Jul, 2015 3 commits
  20. 20 Jul, 2015 3 commits
  21. 17 Jul, 2015 1 commit
  22. 16 Jul, 2015 1 commit
  23. 14 Jul, 2015 1 commit
  24. 13 Jul, 2015 2 commits
  25. 09 Jul, 2015 3 commits
    • 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
    • Update copy for On Demand Cert Download · c964b5cb
      ECOM-1651
      Tasawer committed
    • Fix failed test_course_about_in_cart · 2b29ad20
      This test failed since d240785b on devstack.
      The self.request_factory.get() just return a request object, which is
      being passed to views.course_about() directly without being processed by
      edxmako.middleware. The REQUEST_CONTEXT.request in
      https://github.com/edx/edx-platform/blob/d240785b17bdcaeb11e4ef24ee4a3697da26c9b4/common/djangoapps/edxmako/middleware.py#L39
      is None, instead of request object, which contains the LANGUAGE_CODE and
      other stuff used by the view.
      
      Also cleaned up the use of MakoMiddleware. Using the method in
      edxmako.tests module.
      Pan Luo committed
  26. 08 Jul, 2015 1 commit
  27. 06 Jul, 2015 1 commit
    • Default "Course About" image · 84f7aef9
      Templates that display the image now check if courses specifies an image, if they don't the default image is displayed
      
      Path set in both common.py and aws.py to allow for easy overriding in one place.
      
      Addresses SOL-926
      
      Some code provided by Davorin Sego
      Giulio Gratta committed
  28. 03 Jul, 2015 1 commit