diff --git a/python/educational-core/course-creator/resources/META-INF/plugin.xml b/python/educational-core/course-creator/resources/META-INF/plugin.xml index 6fcf9ff9d11f..ec7c574763fc 100644 --- a/python/educational-core/course-creator/resources/META-INF/plugin.xml +++ b/python/educational-core/course-creator/resources/META-INF/plugin.xml @@ -54,7 +54,7 @@ - + diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java index 2d68478b6845..331366280c17 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/CCUtils.java @@ -44,7 +44,7 @@ public class CCUtils { @Nullable public static CCLanguageManager getStudyLanguageManager(@NotNull final Course course) { - Language language = Language.findLanguageByID(course.getLanguage()); + Language language = Language.findLanguageByID(course.getLanguageID()); return language == null ? null : CCLanguageManager.INSTANCE.forLanguage(language); } diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java index 9b0839dacaa6..4552161cdb91 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCChangeCourseInfo.java @@ -19,7 +19,6 @@ import javax.swing.*; import java.awt.*; public class CCChangeCourseInfo extends DumbAwareAction { - private static final String ACTION_TEXT = "Change Course Information"; public CCChangeCourseInfo() { @@ -61,15 +60,21 @@ public class CCChangeCourseInfo extends DumbAwareAction { CCNewProjectPanel panel = new CCNewProjectPanel(course.getName(), Course.getAuthorsString(course.getAuthors()), course.getDescription()); + setupLanguageLevels(course, panel); DialogBuilder builder = createChangeInfoDialog(project, panel); if (builder.showAndGet()) { course.setAuthors(panel.getAuthors()); course.setName(panel.getName()); course.setDescription(panel.getDescription()); + setVersion(course, panel); ProjectView.getInstance(project).refresh(); } } + protected void setVersion(Course course, CCNewProjectPanel panel) {} + + protected void setupLanguageLevels(Course course, CCNewProjectPanel panel) {} + private static DialogBuilder createChangeInfoDialog(Project project, @NotNull CCNewProjectPanel panel) { DialogBuilder builder = new DialogBuilder(project); diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.form b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.form index d4c33c0524d1..a38d52649a60 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.form +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.form @@ -1,6 +1,6 @@
- + @@ -15,18 +15,18 @@ - + - + - + @@ -46,20 +46,34 @@ - + - - + + + + + + + + + + + + + + + +
diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java index b3b141d6cb8c..7b4830c9cb43 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/ui/CCNewProjectPanel.java @@ -1,10 +1,12 @@ package com.jetbrains.edu.coursecreator.ui; import com.intellij.facet.ui.FacetValidatorsManager; +import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.JBColor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -14,10 +16,14 @@ public class CCNewProjectPanel { private JTextArea myDescription; private JTextField myName; private JTextField myAuthorField; + private JLabel myLanguageLevelLabel; + private ComboBox myLanguageLevelCombobox; private FacetValidatorsManager myValidationManager; public CCNewProjectPanel() { + myLanguageLevelLabel.setVisible(false); + myLanguageLevelCombobox.setVisible(false); final String userName = System.getProperty("user.name"); if (userName != null) { myAuthorField.setText(userName); @@ -81,4 +87,20 @@ public class CCNewProjectPanel { public JTextField getNameField() { return myName; } + + public JLabel getLanguageLevelLabel() { + return myLanguageLevelLabel; + } + + public ComboBox getLanguageLevelCombobox() { + return myLanguageLevelCombobox; + } + + @Nullable + public String getLanguageVersion() { + if (!myLanguageLevelCombobox.isVisible() || myLanguageLevelCombobox.getItemCount() == 0) { + return null; + } + return (String)myLanguageLevelCombobox.getSelectedItem(); + } } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Course.java b/python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Course.java index fa4f47594757..98e3eeca0f1b 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Course.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/courseFormat/Course.java @@ -10,6 +10,7 @@ import com.jetbrains.edu.learning.core.EduUtils; import com.jetbrains.edu.learning.stepic.StepicUser; import org.jdom.Element; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -122,9 +123,14 @@ public class Course { } public Language getLanguageById() { - return Language.findLanguageByID(myLanguage); + return Language.findLanguageByID(getLanguageID()); } + /** + * This method should be used by serialized only + * Use {@link #getLanguageID()} and {@link #getLanguageVersion()} methods instead + */ + @Deprecated public String getLanguage() { return myLanguage; } @@ -133,6 +139,19 @@ public class Course { myLanguage = language; } + public String getLanguageID() { + return myLanguage.split(" ")[0]; + } + + @Nullable + public String getLanguageVersion() { + String[] split = myLanguage.split(" "); + if (split.length <= 1) { + return null; + } + return split[1]; + } + public void setAuthors(List authors) { this.authors = authors; } 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 a6c085afb290..7723b4353e26 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 @@ -104,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()) { @@ -157,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-core/student/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java index fce2da4a59db..f9b3b14a1849 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java @@ -104,7 +104,7 @@ public class StudyNewProjectPanel extends JPanel implements PanelWithAnchor { myDescriptionPane.setEditable(true); myDescriptionPane.setEnabled(true); myAuthorLabel.setEnabled(true); - myDescriptionPane.setPreferredSize(new Dimension(150, 100)); + myDescriptionPane.setPreferredSize(new Dimension(150, 150)); myDescriptionPane.setFont(coursesCombo.getFont()); myInfoPanel.add(myAuthorLabel); myInfoPanel.add(myDescriptionPane); diff --git a/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCChangeCourseInfo.java b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCChangeCourseInfo.java new file mode 100644 index 000000000000..5845edc0ffc2 --- /dev/null +++ b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCChangeCourseInfo.java @@ -0,0 +1,47 @@ +package com.jetbrains.edu.coursecreator; + +import com.intellij.openapi.ui.ComboBox; +import com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo; +import com.jetbrains.edu.coursecreator.ui.CCNewProjectPanel; +import com.jetbrains.edu.learning.courseFormat.Course; +import com.jetbrains.python.PythonLanguage; + +import javax.swing.*; + +import static com.jetbrains.edu.learning.PyStudyLanguageManager.PYTHON_2; +import static com.jetbrains.edu.learning.PyStudyLanguageManager.PYTHON_3; + +public class PyCCChangeCourseInfo extends CCChangeCourseInfo { + public static final String ALL_VERSIONS = "All versions"; + + public PyCCChangeCourseInfo() { + super(); + } + + protected void setVersion(Course course, CCNewProjectPanel panel) { + String version = panel.getLanguageVersion(); + String language = PythonLanguage.getInstance().getID(); + if (version != null && !ALL_VERSIONS.equals(version)) { + language += " " + version; + } + course.setLanguage(language); + } + + protected void setupLanguageLevels(Course course, CCNewProjectPanel panel) { + JLabel languageLevelLabel = panel.getLanguageLevelLabel(); + languageLevelLabel.setText("Python:"); + languageLevelLabel.setVisible(true); + ComboBox languageLevelCombobox = panel.getLanguageLevelCombobox(); + languageLevelCombobox.addItem(ALL_VERSIONS); + languageLevelCombobox.addItem(PYTHON_3); + languageLevelCombobox.addItem(PYTHON_2); + languageLevelCombobox.setVisible(true); + final String version = course.getLanguageVersion(); + if (version != null) { + languageLevelCombobox.setSelectedItem(version); + } + else { + languageLevelCombobox.setSelectedItem(ALL_VERSIONS); + } + } +} diff --git a/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java index b0b612df6f2e..29b7c31b6493 100644 --- a/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java +++ b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCProjectGenerator.java @@ -56,14 +56,11 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire @Override public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, @Nullable Object settings, @NotNull Module module) { - generateProject(project, baseDir, mySettingsPanel.getName(), - mySettingsPanel.getAuthors(), mySettingsPanel.getDescription()); + generateProject(project, baseDir, mySettingsPanel); } - public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, - @NotNull final String name, @NotNull final String[] authors, - @NotNull final String description) { - final Course course = getCourse(project, name, authors, description); + public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, CCNewProjectPanel settingsPanel) { + final Course course = getCourse(project, settingsPanel); EduUsagesCollector.projectTypeCreated(CCUtils.COURSE_MODE); final PsiDirectory projectDir = PsiManager.getInstance(project).findDirectory(baseDir); @@ -94,12 +91,15 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire } @NotNull - private static Course getCourse(@NotNull Project project, @NotNull String name, @NotNull String[] authors, @NotNull String description) { + private static Course getCourse(@NotNull Project project, @NotNull CCNewProjectPanel settingsPanel) { final Course course = new Course(); + String name = settingsPanel.getName(); course.setName(name); - course.setAuthors(authors); - course.setDescription(description); - course.setLanguage(PythonLanguage.getInstance().getID()); + course.setAuthors(settingsPanel.getAuthors()); + course.setDescription(settingsPanel.getDescription()); + + String language = PythonLanguage.getInstance().getID(); + course.setLanguage(language); course.setCourseMode(CCUtils.COURSE_MODE); File coursesDir = new File(PathManager.getConfigPath(), "courses"); @@ -136,4 +136,5 @@ public class PyCCProjectGenerator extends PythonProjectGenerator implements Dire }); return mySettingsPanel.getMainPanel(); } + } 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 1e63ad532000..2da13df60a45 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 @@ -1,5 +1,6 @@ package com.jetbrains.edu.learning; +import com.intellij.execution.ExecutionException; import com.intellij.facet.ui.FacetEditorValidator; import com.intellij.facet.ui.FacetValidatorsManager; import com.intellij.facet.ui.ValidationResult; @@ -9,22 +10,31 @@ import com.intellij.ide.fileTemplates.FileTemplateUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; +import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.vfs.VirtualFile; 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; import com.jetbrains.edu.learning.ui.StudyNewProjectPanel; import com.jetbrains.python.configuration.PyConfigurableInterpreterList; +import com.jetbrains.python.newProject.PyNewProjectSettings; import com.jetbrains.python.newProject.PythonProjectGenerator; +import com.jetbrains.python.packaging.PyPackageManager; +import com.jetbrains.python.psi.LanguageLevel; +import com.jetbrains.python.sdk.AbstractCreateVirtualEnvDialog; +import com.jetbrains.python.sdk.PyDetectedSdk; +import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; import icons.InteractiveLearningPythonIcons; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -34,6 +44,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.Collection; import java.util.List; @@ -176,4 +187,58 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator imp return true; }; } + + public void createAndAddVirtualEnv(Project project, PyNewProjectSettings settings) { + final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel(); + final String baseSdk = getBaseSdk(project); + + if (baseSdk != null) { + final PyPackageManager packageManager = PyPackageManager.getInstance(new PyDetectedSdk(baseSdk)); + try { + final String path = packageManager.createVirtualEnv(project.getBasePath() + "/.idea/VirtualEnvironment", false); + AbstractCreateVirtualEnvDialog.setupVirtualEnvSdk(path, true, new AbstractCreateVirtualEnvDialog.VirtualEnvCallback() { + @Override + public void virtualEnvCreated(Sdk createdSdk, boolean associateWithProject) { + settings.setSdk(createdSdk); + model.addSdk(createdSdk); + try { + model.apply(); + } + catch (ConfigurationException exception) { + LOG.error("Error adding created virtual env " + exception.getMessage()); + } + } + }); + } + catch (ExecutionException e) { + LOG.warn("Failed to create virtual env " + e.getMessage()); + } + } + } + + 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 (PyStudyLanguageManager.PYTHON_2.equals(version)) { + baseLevel = LanguageLevel.PYTHON27; + } + } + final PythonSdkFlavor flavor = PythonSdkFlavor.getApplicableFlavors(false).get(0); + 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(baseLevel)) { + baseSdk = sdk; + break; + } + } + } + return baseSdk != null ? baseSdk : baseSdks.iterator().next(); + } } diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyLanguageManager.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyLanguageManager.java index 5cb6c220d3fc..5eb4b81436e2 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyLanguageManager.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyLanguageManager.java @@ -4,6 +4,8 @@ import com.jetbrains.edu.learning.core.EduNames; import org.jetbrains.annotations.NotNull; public class PyStudyLanguageManager implements StudyLanguageManager { + public static final String PYTHON_3 = "3.x"; + public static final String PYTHON_2 = "2.x"; @NotNull @Override diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyPluginConfigurator.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyPluginConfigurator.java index 5a163337ecfa..76890be13420 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyPluginConfigurator.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyPluginConfigurator.java @@ -34,6 +34,6 @@ public class PyStudyPluginConfigurator extends StudyBasePluginConfigurator { StudyTaskManager taskManager = StudyTaskManager.getInstance(project); if (taskManager == null) return false; Course course = taskManager.getCourse(); - return course != null && "Python".equals(course.getLanguage()) && "PyCharm".equals(course.getCourseType()); + return course != null && "Python".equals(course.getLanguageID()) && "PyCharm".equals(course.getCourseType()); } } diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java b/python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java index b7ee703ddb21..245ec1905768 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java @@ -15,7 +15,6 @@ */ package com.jetbrains.python.newProject.actions; -import com.intellij.execution.ExecutionException; import com.intellij.ide.util.projectWizard.AbstractNewProjectStep; import com.intellij.ide.util.projectWizard.ProjectSettingsStepBase; import com.intellij.ide.util.projectWizard.WebProjectTemplate; @@ -28,7 +27,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; -import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl; import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.ui.Messages; @@ -46,11 +44,9 @@ import com.jetbrains.python.packaging.PyPackageManager; import com.jetbrains.python.packaging.PyPackageManagerUI; import com.jetbrains.python.packaging.PyRequirement; import com.jetbrains.python.sdk.*; -import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; import java.util.Collections; import java.util.List; @@ -79,10 +75,11 @@ public class PythonGenerateProjectCallback implements NullableConsumer requirements = manager.getRequirements(module); - if (requirements != null && sdk != null) { + if (requirements != null) { final PyPackageManagerUI ui = new PyPackageManagerUI(project, sdk, null); ui.install(requirements, Collections.emptyList()); } @@ -137,49 +135,6 @@ public class PythonGenerateProjectCallback implements NullableConsumer flavors = PythonSdkFlavor.getApplicableFlavors(false); - String baseSdk = null; - for (PythonSdkFlavor flavor : flavors) { - final Collection baseSdks = flavor.suggestHomePaths(); - if (!baseSdks.isEmpty()) { - baseSdk = baseSdks.iterator().next(); - } - } - if (baseSdk != null) { - final PyPackageManager packageManager = PyPackageManager.getInstance(new PyDetectedSdk(baseSdk)); - try { - final String path = packageManager.createVirtualEnv(settingsStep.getProjectLocation() + "/.idea/VirtualEnvironment", false); - AbstractCreateVirtualEnvDialog.setupVirtualEnvSdk(path, true, new AbstractCreateVirtualEnvDialog.VirtualEnvCallback() { - @Override - public void virtualEnvCreated(Sdk createdSdk, boolean associateWithProject) { - settingsStep.setSdk(createdSdk); - model.addSdk(createdSdk); - try { - model.apply(); - } - catch (ConfigurationException exception) { - LOG.error("Error adding created virtual env " + exception.getMessage()); - } - if (associateWithProject) { - SdkAdditionalData additionalData = createdSdk.getSdkAdditionalData(); - if (additionalData == null) { - additionalData = new PythonSdkAdditionalData(PythonSdkFlavor.getFlavor(createdSdk.getHomePath())); - ((ProjectJdkImpl)createdSdk).setSdkAdditionalData(additionalData); - } - ((PythonSdkAdditionalData)additionalData).associateWithNewProject(); - } - } - }); - } - catch (ExecutionException e) { - LOG.warn("Failed to create virtual env " + e.getMessage()); - } - } - } - @Nullable private static Project generateProject(@NotNull final ProjectSettingsStepBase settings) { final DirectoryProjectGenerator generator = settings.getProjectGenerator(); diff --git a/python/openapi/src/com/jetbrains/python/newProject/PythonProjectGenerator.java b/python/openapi/src/com/jetbrains/python/newProject/PythonProjectGenerator.java index ba2723ad8c32..275fd33234bc 100644 --- a/python/openapi/src/com/jetbrains/python/newProject/PythonProjectGenerator.java +++ b/python/openapi/src/com/jetbrains/python/newProject/PythonProjectGenerator.java @@ -17,6 +17,7 @@ package com.jetbrains.python.newProject; import com.intellij.facet.ui.ValidationResult; import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.util.BooleanFunction; import com.intellij.util.containers.ContainerUtil; @@ -83,4 +84,6 @@ public abstract class PythonProjectGenerator { public MouseListener getErrorLabelMouseListener() { return myErrorLabelMouseListener; } + + public void createAndAddVirtualEnv(Project project, PyNewProjectSettings settings) {} } diff --git a/python/src/com/jetbrains/python/sdk/PythonSdkType.java b/python/src/com/jetbrains/python/sdk/PythonSdkType.java index f4e78a80c7c8..ea124318a5ae 100644 --- a/python/src/com/jetbrains/python/sdk/PythonSdkType.java +++ b/python/src/com/jetbrains/python/sdk/PythonSdkType.java @@ -424,7 +424,7 @@ public final class PythonSdkType extends SdkType { return suggestSdkNameFromVersion(sdkHome, name); } - public static String suggestSdkNameFromVersion(String sdkHome, String version) { + private static String suggestSdkNameFromVersion(String sdkHome, String version) { sdkHome = FileUtil.toSystemDependentName(sdkHome); final String shortHomeName = FileUtil.getLocationRelativeToUserHome(sdkHome); if (version != null) {