Fix problems with posting results after project reload Fix course serialization:...
authorValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Mon, 6 Jun 2016 15:54:05 +0000 (18:54 +0300)
committerValentina Kiryushkina <valentina.kiryushkina@jetbrains.com>
Wed, 8 Jun 2016 09:22:30 +0000 (12:22 +0300)
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Course.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Lesson.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Task.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/TaskFile.java
python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java
python/educational-core/student/src/com/jetbrains/edu/learning/stepic/CourseInfo.java
python/educational-core/student/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java
python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java

index 6132952a8274868c1110bde29f180a0275a5ca68..53d7a78b3034cf7b65c152cc81a99c99b241974f 100644 (file)
@@ -14,29 +14,20 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class Course {
-  @Expose
-  private List<Lesson> lessons = new ArrayList<Lesson>();
-
+  @Expose private List<Lesson> lessons = new ArrayList<Lesson>();
+  @Expose private List<StepicUser> authors = new ArrayList<StepicUser>();
   @Expose private String description;
   @Expose private String name;
-  private String myCourseDirectory = "";
-  @Expose private List<StepicUser> authors = new ArrayList<StepicUser>();
-  private boolean myUpToDate;
-
-  @Expose @SerializedName("language")
-  private String myLanguage = "Python";
+  @Expose private String myCourseDirectory = "";
+  @Expose private int id;
+  @Expose private boolean myUpToDate;
+  @Expose private boolean isAdaptive;
+  @Expose @SerializedName("language") private String myLanguage = "Python";
 
-  //this field is used to distinguish ordinary and CheckIO projects
+  //this field is used to distinguish ordinary and CheckIO projects,
   //"PyCharm" is used here for historical reasons
-  private String courseType = EduNames.PYCHARM;
-
-  //this field is used to distinguish study and course creator modes
-  private String courseMode = EduNames.STUDY;
-  
-  @Expose private boolean isAdaptive;
-  
-  @Expose
-  private int id;
+  @Expose private String courseType = EduNames.PYCHARM;
+  @Expose private String courseMode = EduNames.STUDY; //this field is used to distinguish study and course creator modes
 
   /**
    * Initializes state of course
index 5b2f6acf9f225c032fac5b25dee36d369a7e6db1..4110dd621c28d800c6d0fb8079deeaea0aceba08 100644 (file)
@@ -11,25 +11,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class Lesson implements StudyItem {
-  public int id;
-  @Transient
-  public List<Integer> steps;
-  @Transient
-  public List<String> tags;
-  @Transient
-  Boolean is_public;
-  @Expose
-  @SerializedName("title")
-  private String name;
-  @Expose
-  @SerializedName("task_list")
-  public List<Task> taskList = new ArrayList<Task>();
-
-  @Transient
-  private Course myCourse = null;
-
-  // index is visible to user number of lesson from 1 to lesson number
-  private int myIndex = -1;
+  @Expose public int id;
+  @Expose private int myIndex = -1; // index is visible to user number of lesson from 1 to lesson number
+  @Expose @Transient public List<Integer> steps;
+  @Expose @SerializedName("title") private String name;
+  @Expose @SerializedName("task_list") public List<Task> taskList = new ArrayList<Task>();
+  @Transient public List<String> tags;
+  @Transient private Course myCourse = null;
 
   public void initLesson(final Course course, boolean isRestarted) {
     setCourse(course);
index 3491f386dc6593cb5fe6ae8d146a3e2aaedd6bc7..bc76b2d4100dad3ef7faf6191895d9e26dc9ed81 100644 (file)
@@ -19,22 +19,13 @@ import java.util.Map;
  * Implementation of task which contains task files, tests, input file for tests
  */
 public class Task implements StudyItem {
-  @Expose
-  private String name;
-
-  // index is visible to user number of task from 1 to task number
-  private int myIndex;
-  private StudyStatus myStatus = StudyStatus.Uninitialized;
-
-  private int myStepicId;
-
-  @Expose
-  @SerializedName("task_files")
-  public Map<String, TaskFile> taskFiles = new HashMap<String, TaskFile>();
-
-  private String text;
-  private Map<String, String> testsText = new HashMap<String, String>();
-
+  @Expose private String name;
+  @Expose private String text;
+  @Expose private int myStepicId;
+  @Expose private int myIndex; // index is visible to user number of task from 1 to task number
+  @Expose @SerializedName("task_files") public Map<String, TaskFile> taskFiles = new HashMap<String, TaskFile>();
+  @Expose private Map<String, String> testsText = new HashMap<String, String>();
+  @Expose private StudyStatus myStatus = StudyStatus.Uninitialized;
   @Transient private Lesson myLesson;
 
   public Task() {}
index 33e00d574325d7b1c0a1f415a956845b65e9a09b..65ef81d5e6b53b8902692c8cf1d256d5dc2ecb6c 100644 (file)
@@ -18,19 +18,14 @@ import java.util.List;
  */
 
 public class TaskFile {
-  @SerializedName("placeholders")
-  @Expose
-  private List<AnswerPlaceholder> myAnswerPlaceholders = new ArrayList<AnswerPlaceholder>();
-  private int myIndex = -1;
-
-  @Expose
-  public String name;
-  @Expose
-  public String text;
+  @Expose public String name;
+  @Expose public String text;
+  @Expose private int myIndex = -1;
+  @Expose private boolean myUserCreated = false;
+  @Expose private boolean myTrackChanges = true;
+  @Expose private boolean myHighlightErrors = false;
+  @Expose @SerializedName("placeholders") private List<AnswerPlaceholder> myAnswerPlaceholders = new ArrayList<AnswerPlaceholder>();
   @Transient private Task myTask;
-  private boolean myUserCreated = false;
-  private boolean myTrackChanges = true;
-  private boolean myHighlightErrors = false;
 
   public void initTaskFile(final Task task, boolean isRestarted) {
     setTask(task);
index fa5d05fdc5589dc82497b2361c080bf4b18f5ee5..5f10c102062ca25fc73cc49b307d4619730184bf 100644 (file)
@@ -262,7 +262,7 @@ public class StudyProjectGenerator {
   }
 
   public static void flushCourseJson(@NotNull final Course course, @NotNull final File courseDirectory) {
-    final Gson gson = new GsonBuilder().setPrettyPrinting().create();
+    final Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create();
     final String json = gson.toJson(course);
     final File courseJson = new File(courseDirectory, EduNames.COURSE_META_FILE);
     final FileOutputStream fileOutputStream;
index eff3c6f3684eb516f3916ef0375173fa71829e36..c8c0c90aaf0480ad80e835330be523892a816934 100644 (file)
@@ -3,6 +3,7 @@ package com.jetbrains.edu.learning.stepic;
 import com.google.gson.annotations.SerializedName;
 import com.intellij.openapi.util.text.StringUtil;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -12,25 +13,19 @@ import java.util.List;
  * and when project is being created
  */
 public class CourseInfo {
-  @SerializedName("title")
-  private String myName;
-  
-  @SerializedName("summary")
-  private String myDescription;
-  
-  @SerializedName("course_format")
-  //course type in format "pycharm <language>"
-  private String myType = "pycharm Python";
-
-  private boolean isAdaptive;
-  
+  public static CourseInfo INVALID_COURSE = new CourseInfo();
+
+  @SerializedName("title") private String myName;
   int id;
-  boolean is_public;
-  public List<Integer> sections;
+  boolean isAdaptive;
+  boolean isPublic;
+  List<Integer> sections;
   List<Integer> instructors = new ArrayList<Integer>();
-  List<StepicUser> myAuthors = new ArrayList<>();
 
-  public static CourseInfo INVALID_COURSE = new CourseInfo();
+  List<StepicUser> myAuthors = new ArrayList<>();
+  @SerializedName("summary") private String myDescription;
+  @SerializedName("course_format") private String myType = "pycharm Python"; //course type in format "pycharm <language>"
+  @Nullable private String username;
 
   public String getName() {
     return myName;
@@ -51,7 +46,7 @@ public class CourseInfo {
 
   @Override
   public String toString() {
-    return myName;
+    return getName();
   }
 
   @Override
@@ -60,17 +55,26 @@ public class CourseInfo {
     if (o == null || getClass() != o.getClass()) return false;
     CourseInfo that = (CourseInfo)o;
     if (that.getName() == null || that.getDescription() == null) return false;
-    return that.getName().equals(myName)
+    return that.getName().equals(getName())
            && that.getDescription().equals(myDescription);
   }
 
   @Override
   public int hashCode() {
-    int result = myName != null ? myName.hashCode() : 0;
+    int result = getName() != null ? getName().hashCode() : 0;
     result = 31 * result + (myDescription != null ? myDescription.hashCode() : 0);
     return result;
   }
 
+  @Nullable
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(@Nullable String username) {
+    this.username = username;
+  }
+
   public static class Author {
     int id;
     String first_name = "";
@@ -127,4 +131,12 @@ public class CourseInfo {
   public void setAdaptive(boolean adaptive) {
     isAdaptive = adaptive;
   }
+
+  public boolean isPublic() {
+    return isPublic;
+  }
+
+  public void setPublic(boolean aPublic) {
+    isPublic = aPublic;
+  }
 }
index 7928a3aaf1bb9d23203ab426b3755f8e5b353660..a1a4a62c813b040ad833984ebf1da388d4e5d404 100644 (file)
@@ -134,7 +134,7 @@ public class EduAdaptiveStepicConnector {
       LOG.warn("Got unexpected numbers of units: " + unitContainer.units.size());
       return;
     }
-    
+
     final URIBuilder builder = new URIBuilder(ASSIGNMENT_URL);
     for (Integer step : unitContainer.units.get(0).assignments) {
       builder.addParameter("ids[]", String.valueOf(step));
@@ -182,7 +182,7 @@ public class EduAdaptiveStepicConnector {
     final Course course = StudyTaskManager.getInstance(project).getCourse();
     if (course != null && editor != null && editor.getTaskFile() != null) {
       final StepicUser user = StudyTaskManager.getInstance(project).getUser();
-      
+
       final boolean recommendationReaction =
         user != null && postRecommendationReaction(project, String.valueOf(editor.getTaskFile().getTask().getLesson().id),
                                                    String.valueOf(user.id), reaction);
@@ -198,7 +198,7 @@ public class EduAdaptiveStepicConnector {
             unsolvedTask.setText(task.getText());
             unsolvedTask.getTestsText().clear();
             final Map<String, String> testsText = task.getTestsText();
-            for (String testName: testsText.keySet()) {
+            for (String testName : testsText.keySet()) {
               unsolvedTask.addTestsTexts(testName, testsText.get(testName));
             }
             final Map<String, TaskFile> taskFiles = task.getTaskFiles();
@@ -220,7 +220,7 @@ public class EduAdaptiveStepicConnector {
             final File lessonDirectory = new File(course.getCourseDirectory(), EduNames.LESSON + String.valueOf(adaptive.getIndex()));
             final File taskDirectory = new File(lessonDirectory, EduNames.TASK + String.valueOf(adaptive.getTaskList().size()));
             StudyProjectGenerator.flushTask(task, taskDirectory);
-            flushAdaptiveCourse(course, adaptive, unsolvedTask);
+            StudyProjectGenerator.flushCourseJson(course, new File(course.getCourseDirectory()));
             final VirtualFile lessonDir = project.getBaseDir().findChild(EduNames.LESSON + String.valueOf(adaptive.getIndex()));
 
             if (lessonDir != null) {
@@ -249,9 +249,9 @@ public class EduAdaptiveStepicConnector {
 
             final File lessonDirectory = new File(course.getCourseDirectory(), EduNames.LESSON + String.valueOf(adaptive.getIndex()));
             StudyProjectGenerator.flushLesson(lessonDirectory, adaptive);
-            flushAdaptiveCourse(course, adaptive, unsolvedTask);
+            StudyProjectGenerator.flushCourseJson(course, new File(course.getCourseDirectory()));
             adaptive.initLesson(course, true);
-            ApplicationManager.getApplication().invokeLater(()->new StudyNextStudyTaskAction().navigateTask(project));
+            ApplicationManager.getApplication().invokeLater(() -> new StudyNextStudyTaskAction().navigateTask(project));
           }
         }
         ApplicationManager.getApplication().invokeLater(() -> {
@@ -265,17 +265,6 @@ public class EduAdaptiveStepicConnector {
     }
   }
 
-  private static void flushAdaptiveCourse(Course course, Lesson adaptive, Task unsolvedTask) {
-    unsolvedTask.setLesson(null);
-    final TaskFile file = unsolvedTask.getTaskFile(DEFAULT_TASKFILE_NAME);
-    if (file != null) {
-      file.setTask(null);
-    }
-    adaptive.setCourse(null);
-    StudyProjectGenerator.flushCourseJson(course, new File(course.getCourseDirectory()));
-    course.initCourse(true);
-  }
-
   private static void createTestFiles(Course course, Task task, Task unsolvedTask, VirtualFile lessonDir) {
     ApplicationManager.getApplication().invokeLater(() -> ApplicationManager.getApplication().runWriteAction(() -> {
       try {
@@ -406,7 +395,7 @@ public class EduAdaptiveStepicConnector {
             return Pair.create(isSolved, wrapper.submissions[0].hint);
           }
           else {
-            LOG.warn("Got a submission wrapper with incorrect submissions numer: " + wrapper.submissions.length);
+            LOG.warn("Got a submission wrapper with incorrect submissions number: " + wrapper.submissions.length);
           }
         }
         else {
@@ -516,7 +505,7 @@ public class EduAdaptiveStepicConnector {
 
   private static void createTestFileFromSamples(@NotNull final Task task,
                                                 @NotNull final List<List<String>> samples) {
-    
+
     String testText = "from test_helper import check_samples\n\n" +
                       "if __name__ == '__main__':\n" +
                       "    check_samples(samples=" + new GsonBuilder().create().toJson(samples) + ")";
index 6159d56c00f37ad72c89a917f35b17e701e70564..dfc38c7506e95d9957da1c483672058c9597972f 100644 (file)
@@ -212,6 +212,12 @@ public class StudyNewProjectPanel {
       if (!courseInfo.isAdaptive()) {
         myCoursesComboBox.addItem(courseInfo);
       }
+      else {
+        final boolean isLoggedIn = myGenerator.myUser != null;
+        if (courseInfo.isPublic() || isLoggedIn) {
+          myCoursesComboBox.addItem(courseInfo);
+        }
+      }
     }
     myGenerator.setSelectedCourse(StudyUtils.getFirst(courses));