diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java index 1f36a3c6265f..3229be1fecb6 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java @@ -11,7 +11,6 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -105,7 +104,7 @@ public class StudyProjectGenerator { } @Nullable - protected Course getCourse(@NotNull final Project project) { + public Course getCourse(@NotNull final Project project) { final File courseFile = new File(new File(OUR_COURSES_DIR, mySelectedCourseInfo.getName()), EduNames.COURSE_META_FILE); if (courseFile.exists()) { @@ -119,20 +118,17 @@ public class StudyProjectGenerator { return readCourseFromCache(adaptiveCourseFile, true); } } - return ProgressManager.getInstance().runProcessWithProgressSynchronously(new ThrowableComputable() { - @Override - public Course compute() throws RuntimeException { - ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); - return execCancelable(() -> { + return ProgressManager.getInstance().runProcessWithProgressSynchronously(() -> { + ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); + return execCancelable(() -> { - final Course course = EduStepicConnector.getCourse(project, mySelectedCourseInfo); - if (course != null) { - flushCourse(project, course); - course.initCourse(false); - } - return course; - }); - } + final Course course = EduStepicConnector.getCourse(project, mySelectedCourseInfo); + if (course != null) { + flushCourse(project, course); + course.initCourse(false); + } + return course; + }); }, "Creating Course", true, project); } @@ -161,7 +157,9 @@ public class StudyProjectGenerator { public static void openFirstTask(@NotNull final Course course, @NotNull final Project project) { LocalFileSystem.getInstance().refresh(false); final Lesson firstLesson = StudyUtils.getFirst(course.getLessons()); + if (firstLesson == null) return; final Task firstTask = StudyUtils.getFirst(firstLesson.getTaskList()); + if (firstTask == null) return; final VirtualFile taskDir = firstTask.getTaskDir(project); if (taskDir == null) return; final Map taskFiles = firstTask.getTaskFiles(); diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java index 2b562590f0d8..2e7288b30701 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java @@ -22,6 +22,7 @@ import com.intellij.platform.DirectoryProjectGenerator; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; import com.intellij.util.BooleanFunction; +import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import com.jetbrains.edu.learning.stepic.CourseInfo; import com.jetbrains.edu.learning.stepic.EduStepicConnector; @@ -189,7 +190,7 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator imp public void createAndAddVirtualEnv(Project project, PyNewProjectSettings settings) { final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel(); - final String baseSdk = getBaseSdk(); + final String baseSdk = getBaseSdk(project); if (baseSdk != null) { final PyPackageManager packageManager = PyPackageManager.getInstance(new PyDetectedSdk(baseSdk)); @@ -215,20 +216,29 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator imp } } - private static String getBaseSdk() { + private String getBaseSdk(@NotNull final Project project) { + final Course course = myGenerator.getCourse(project); + LanguageLevel baseLevel = LanguageLevel.PYTHON30; + if (course != null) { + final String version = course.getLanguageVersion(); + if (version != null) { + baseLevel = LanguageLevel.fromPythonVersion(version); + } + } final PythonSdkFlavor flavor = PythonSdkFlavor.getApplicableFlavors(false).get(0); - String python3Sdk = null; + String baseSdk = null; final Collection baseSdks = flavor.suggestHomePaths(); for (String sdk : baseSdks) { final String versionString = flavor.getVersionString(sdk); final String prefix = flavor.getName() + " "; if (versionString != null && versionString.startsWith(prefix)) { final LanguageLevel level = LanguageLevel.fromPythonVersion(versionString.substring(prefix.length())); - if (level.isAtLeast(LanguageLevel.PYTHON30)) { - python3Sdk = sdk; + if (level.isAtLeast(baseLevel)) { + baseSdk = sdk; + break; } } } - return python3Sdk != null ? python3Sdk : baseSdks.iterator().next(); + return baseSdk != null ? baseSdk : baseSdks.iterator().next(); } }