From a61e8cfdc6f9dc5d48250cdb4f9918c35f8af2fc Mon Sep 17 00:00:00 2001 From: Liana Bakradze Date: Tue, 14 Jun 2016 18:28:03 +0300 Subject: [PATCH] Create course from course creator plugin (EDU-349) --- .../actions/CCCreateCourseArchive.java | 25 ++++---- .../course-creator-python.iml | 2 + .../resources/META-INF/plugin.xml | 7 +++ .../CreateFromArchiveProjectStep.java | 61 +++++++++++++++++++ .../PyCCCreateProjectFromArchive.java | 33 ++++++++++ .../actions/PyCharmNewProjectStep.java | 7 ++- 6 files changed, 121 insertions(+), 14 deletions(-) create mode 100644 python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/CreateFromArchiveProjectStep.java create mode 100644 python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCCreateProjectFromArchive.java diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java index cbf71f341b24..05e9e87c60f8 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCCreateCourseArchive.java @@ -68,20 +68,19 @@ public class CCCreateCourseArchive extends DumbAwareAction { if (project == null || module == null) { return; } - createCourseArchive(project, module); - } - - private void createCourseArchive(final Project project, Module module) { - final Course course = StudyTaskManager.getInstance(project).getCourse(); - if (course == null) return; CreateCourseArchiveDialog dlg = new CreateCourseArchiveDialog(project, this); dlg.show(); if (dlg.getExitCode() != DialogWrapper.OK_EXIT_CODE) { return; } - final VirtualFile baseDir = project.getBaseDir(); + createCourseArchive(project, module, myZipName, myLocationDir, true); + } - VirtualFile archiveFolder = CCUtils.generateFolder(project, module, this, myZipName); + public static void createCourseArchive(final Project project, Module module, String zipName, String locationDir, boolean showMessage) { + final Course course = StudyTaskManager.getInstance(project).getCourse(); + if (course == null) return; + final VirtualFile baseDir = project.getBaseDir(); + VirtualFile archiveFolder = CCUtils.generateFolder(project, module, null, zipName); if (archiveFolder == null) { return; } @@ -112,7 +111,7 @@ public class CCCreateCourseArchive extends DumbAwareAction { generateJson(project, archiveFolder); resetTaskFiles(savedTaskFiles); VirtualFileManager.getInstance().refreshWithoutFileWatcher(false); - packCourse(archiveFolder); + packCourse(archiveFolder, locationDir, zipName, showMessage); synchronize(project); } @@ -173,16 +172,18 @@ public class CCCreateCourseArchive extends DumbAwareAction { ProjectView.getInstance(project).refresh(); } - private void packCourse(@NotNull final VirtualFile baseDir) { + private static void packCourse(@NotNull final VirtualFile baseDir, String locationDir, String zipName, boolean showMessage) { try { - final File zipFile = new File(myLocationDir, myZipName + ".zip"); + final File zipFile = new File(locationDir, zipName + ".zip"); ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); VirtualFile[] courseFiles = baseDir.getChildren(); for (VirtualFile file : courseFiles) { ZipUtil.addFileOrDirRecursively(zos, null, new File(file.getPath()), file.getName(), null, null); } zos.close(); - Messages.showInfoMessage("Course archive was saved to " + zipFile.getPath(), "Course Archive Was Created Successfully"); + if (showMessage) { + Messages.showInfoMessage("Course archive was saved to " + zipFile.getPath(), "Course Archive Was Created Successfully"); + } } catch (IOException e1) { LOG.error(e1); diff --git a/python/educational-python/course-creator-python/course-creator-python.iml b/python/educational-python/course-creator-python/course-creator-python.iml index cf8d51281117..52b4e677d8d3 100644 --- a/python/educational-python/course-creator-python/course-creator-python.iml +++ b/python/educational-python/course-creator-python/course-creator-python.iml @@ -14,5 +14,7 @@ + + \ No newline at end of file diff --git a/python/educational-python/course-creator-python/resources/META-INF/plugin.xml b/python/educational-python/course-creator-python/resources/META-INF/plugin.xml index db71e42c97a7..e8425b2205ff 100644 --- a/python/educational-python/course-creator-python/resources/META-INF/plugin.xml +++ b/python/educational-python/course-creator-python/resources/META-INF/plugin.xml @@ -32,4 +32,11 @@ + + + + + + + \ No newline at end of file diff --git a/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/CreateFromArchiveProjectStep.java b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/CreateFromArchiveProjectStep.java new file mode 100644 index 000000000000..033b83e8afda --- /dev/null +++ b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/CreateFromArchiveProjectStep.java @@ -0,0 +1,61 @@ +package com.jetbrains.edu.coursecreator; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.platform.DirectoryProjectGenerator; +import com.jetbrains.edu.coursecreator.actions.CCCreateCourseArchive; +import com.jetbrains.edu.learning.PyStudyDirectoryProjectGenerator; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.courseFormat.Course; +import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; +import com.jetbrains.edu.learning.stepic.CourseInfo; +import com.jetbrains.python.newProject.actions.PyCharmNewProjectStep; +import org.jetbrains.annotations.NotNull; + +class CreateFromArchiveProjectStep extends PyCharmNewProjectStep { + + public CreateFromArchiveProjectStep(Project project, Module module) { + super(new MyCustomization(project, module)); + } + + protected static class MyCustomization extends PyCharmNewProjectStep.Customization { + + private final Project myProject; + private final Module myModule; + private PyStudyDirectoryProjectGenerator myGenerator = new PyStudyDirectoryProjectGenerator(); + + public MyCustomization(Project project, + Module module) { + + myProject = project; + myModule = module; + } + + @NotNull + @Override + protected DirectoryProjectGenerator[] getProjectGenerators() { + return new DirectoryProjectGenerator[] {}; + } + + + @NotNull + @Override + protected DirectoryProjectGenerator createEmptyProjectGenerator() { + Course course = StudyTaskManager.getInstance(myProject).getCourse(); + if (course != null) { + VirtualFile folder = CCUtils.getGeneratedFilesFolder(myProject, myModule); + String zipName = FileUtil.sanitizeFileName(course.getName()); + String locationDir = folder.getPath(); + CCCreateCourseArchive.createCourseArchive(myProject, myModule, zipName, locationDir, false); + String path = FileUtil.join(folder.getPath(), zipName + ".zip"); + StudyProjectGenerator generator = myGenerator.getGenerator(); + CourseInfo info = generator.addLocalCourse(path); + assert info != null; + generator.setSelectedCourse(info); + } + return myGenerator; + } + } +} diff --git a/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCCreateProjectFromArchive.java b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCCreateProjectFromArchive.java new file mode 100644 index 000000000000..752f87a2e7fb --- /dev/null +++ b/python/educational-python/course-creator-python/src/com/jetbrains/edu/coursecreator/PyCCCreateProjectFromArchive.java @@ -0,0 +1,33 @@ +package com.jetbrains.edu.coursecreator; + +import com.intellij.ide.util.projectWizard.AbstractNewProjectDialog; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; + +public class PyCCCreateProjectFromArchive extends DumbAwareAction { + @Override + public void actionPerformed(AnActionEvent e) { + final Project project = e.getData(CommonDataKeys.PROJECT); + final Module module = e.getData(LangDataKeys.MODULE); + if (project == null || module == null) { + return; + } + + AbstractNewProjectDialog dialog = new AbstractNewProjectDialog() { + @Override + protected DefaultActionGroup createRootStep() { + return new CreateFromArchiveProjectStep(project, module); + } + }; + dialog.show(); + } + + @Override + public void update(AnActionEvent e) { + Presentation presentation = e.getPresentation(); + Project project = e.getProject(); + presentation.setEnabledAndVisible(project != null && CCUtils.isCourseCreator(project)); + } +} diff --git a/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java b/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java index a248fb2eefee..cebf8c054ebe 100644 --- a/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java +++ b/python/ide/src/com/jetbrains/python/newProject/actions/PyCharmNewProjectStep.java @@ -31,7 +31,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.Comparator; import java.util.List; public class PyCharmNewProjectStep extends AbstractNewProjectStep { @@ -40,7 +39,11 @@ public class PyCharmNewProjectStep extends AbstractNewProjectStep { super(new Customization()); } - private static class Customization extends AbstractNewProjectStep.Customization { + public PyCharmNewProjectStep(@NotNull AbstractNewProjectStep.Customization customization) { + super(customization); + } + + protected static class Customization extends AbstractNewProjectStep.Customization { private final List pluginSpecificGenerators = Lists.newArrayList(); @NotNull