mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Merge branch 'liana/python-version'
# Conflicts: # python/ide/src/com/jetbrains/python/newProject/actions/PythonGenerateProjectCallback.java
This commit is contained in:
@@ -54,7 +54,7 @@
|
||||
<add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewFile"/>
|
||||
</action>
|
||||
|
||||
<action id="ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo"/>
|
||||
<action id="ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.PyCCChangeCourseInfo"/>
|
||||
|
||||
<group id="CCProjectViewGroup" popup="true" text="Course Creator">
|
||||
<action id="AddTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCAddAsTaskFile" text="Make Visible to Student"/>
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -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);
|
||||
|
||||
|
||||
+21
-7
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.jetbrains.edu.coursecreator.ui.CCNewProjectPanel">
|
||||
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="20" y="20" width="666" height="488"/>
|
||||
@@ -15,18 +15,18 @@
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Name:"/>
|
||||
<text value="Title:"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="7e88" class="javax.swing.JTextField" binding="myName">
|
||||
<constraints>
|
||||
<grid row="0" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
|
||||
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
<component id="ec56c" class="javax.swing.JLabel">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false">
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="80" height="-1"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
@@ -46,20 +46,34 @@
|
||||
</component>
|
||||
<component id="41fe6" class="javax.swing.JTextField" binding="myAuthorField">
|
||||
<constraints>
|
||||
<grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
|
||||
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
<component id="389a7" class="javax.swing.JTextArea" binding="myDescription">
|
||||
<constraints>
|
||||
<grid row="2" column="1" row-span="1" col-span="2" vsize-policy="6" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="-1" height="50"/>
|
||||
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="3" indent="0" use-parent-layout="false">
|
||||
<preferred-size width="-1" height="150"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties>
|
||||
<lineWrap value="true"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="aa51f" class="javax.swing.JLabel" binding="myLanguageLevelLabel">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text value="Label"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="cfe00" class="com.intellij.openapi.ui.ComboBox" binding="myLanguageLevelCombobox">
|
||||
<constraints>
|
||||
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
</form>
|
||||
|
||||
+22
@@ -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<String> 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<String> getLanguageLevelCombobox() {
|
||||
return myLanguageLevelCombobox;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getLanguageVersion() {
|
||||
if (!myLanguageLevelCombobox.isVisible() || myLanguageLevelCombobox.getItemCount() == 0) {
|
||||
return null;
|
||||
}
|
||||
return (String)myLanguageLevelCombobox.getSelectedItem();
|
||||
}
|
||||
}
|
||||
|
||||
+20
-1
@@ -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<StepicUser> authors) {
|
||||
this.authors = authors;
|
||||
}
|
||||
|
||||
+3
-1
@@ -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<String, TaskFile> taskFiles = firstTask.getTaskFiles();
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
+47
@@ -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<String> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+11
-10
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+65
@@ -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<String> 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();
|
||||
}
|
||||
}
|
||||
|
||||
+2
@@ -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
|
||||
|
||||
+1
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+6
-51
@@ -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<ProjectSe
|
||||
}
|
||||
}
|
||||
final Project newProject = generateProject(settingsStep);
|
||||
if (sdk == null) {
|
||||
createAndAddVirtualEnv(settingsStep);
|
||||
if (generator instanceof PythonProjectGenerator && sdk == null) {
|
||||
final PyNewProjectSettings settings = (PyNewProjectSettings)((PythonProjectGenerator)generator).getProjectSettings();
|
||||
((PythonProjectGenerator)generator).createAndAddVirtualEnv(newProject, settings);
|
||||
sdk = settings.getSdk();
|
||||
}
|
||||
sdk = settingsStep.getSdk();
|
||||
|
||||
if (newProject != null && generator instanceof PythonProjectGenerator) {
|
||||
SdkConfigurationUtil.setDirectoryProjectSdk(newProject, sdk);
|
||||
@@ -102,9 +99,10 @@ public class PythonGenerateProjectCallback implements NullableConsumer<ProjectSe
|
||||
private static void installRequirements(@NotNull Project project) {
|
||||
final Module module = ModuleManager.getInstance(project).getModules()[0];
|
||||
final Sdk sdk = PythonSdkType.findPythonSdk(module);
|
||||
if (sdk == null) return;
|
||||
final PyPackageManager manager = PyPackageManager.getInstance(sdk);
|
||||
List<PyRequirement> 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<ProjectSe
|
||||
}
|
||||
}
|
||||
|
||||
private static void createAndAddVirtualEnv(final ProjectSpecificSettingsStep settingsStep) {
|
||||
final Project project = ProjectManager.getInstance().getDefaultProject();
|
||||
final ProjectSdksModel model = PyConfigurableInterpreterList.getInstance(project).getModel();
|
||||
final List<PythonSdkFlavor> flavors = PythonSdkFlavor.getApplicableFlavors(false);
|
||||
String baseSdk = null;
|
||||
for (PythonSdkFlavor flavor : flavors) {
|
||||
final Collection<String> 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();
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user