From d2ac0b550ac76b56ce6799580873be1ea5de2cf9 Mon Sep 17 00:00:00 2001 From: Valentina Kiryushkina Date: Fri, 19 May 2017 15:32:36 +0300 Subject: [PATCH] Add Update Course action for adaptive courses --- .../resources/META-INF/plugin.xml | 2 + .../edu/learning/EduPluginConfigurator.java | 3 +- .../jetbrains/edu/learning/StudyUtils.java | 2 +- .../StudyUpdateRecommendationAction.java | 77 +++++++++++++++++++ .../stepic/EduAdaptiveStepicConnector.java | 2 +- .../edu/learning/stepic/EduStepikUtils.java | 10 ++- 6 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 python/educational-core/src/com/jetbrains/edu/learning/actions/StudyUpdateRecommendationAction.java diff --git a/python/educational-core/resources/META-INF/plugin.xml b/python/educational-core/resources/META-INF/plugin.xml index 4ea7ae62660b..78f53d33f08b 100644 --- a/python/educational-core/resources/META-INF/plugin.xml +++ b/python/educational-core/resources/META-INF/plugin.xml @@ -84,6 +84,8 @@ text="Switch Task Description Panel"> + + diff --git a/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java b/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java index ce88e1ce27d0..d6429b5bfce3 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/EduPluginConfigurator.java @@ -119,7 +119,8 @@ public interface EduPluginConfigurator { StudyPreviousTaskAction.ACTION_ID, StudyNextTaskAction.ACTION_ID, StudyRefreshTaskFileAction.ACTION_ID, - StudyShowHintAction.ACTION_ID + StudyShowHintAction.ACTION_ID, + StudyUpdateRecommendationAction.ACTION_ID }; ActionManager actionManager = ActionManager.getInstance(); Arrays.stream(ids) diff --git a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java index 2ac65e9dd01b..5460241dcab9 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudyUtils.java @@ -447,7 +447,7 @@ public class StudyUtils { @NotNull private static String getFooterWithLink(Task task) { return - "
" + "Open on Stepik" + "
"; + "
" + "Open on Stepik" + "
"; } @NotNull diff --git a/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyUpdateRecommendationAction.java b/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyUpdateRecommendationAction.java new file mode 100644 index 000000000000..412698af36f3 --- /dev/null +++ b/python/educational-core/src/com/jetbrains/edu/learning/actions/StudyUpdateRecommendationAction.java @@ -0,0 +1,77 @@ +package com.jetbrains.edu.learning.actions; + +import com.intellij.ide.projectView.ProjectView; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.courseFormat.Course; +import com.jetbrains.edu.learning.courseFormat.Lesson; +import com.jetbrains.edu.learning.courseFormat.RemoteCourse; +import com.jetbrains.edu.learning.courseFormat.tasks.Task; +import com.jetbrains.edu.learning.navigation.StudyNavigator; +import com.jetbrains.edu.learning.stepic.EduAdaptiveStepicConnector; +import icons.EducationalCoreIcons; + +public class StudyUpdateRecommendationAction extends DumbAwareAction { + public static final String ACTION_ID = "Edu.UpdateRecommendation"; + + public StudyUpdateRecommendationAction() { + super("Update course", "Update course", EducationalCoreIcons.Stepik); + } + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + assert project != null; + + Course course = StudyTaskManager.getInstance(project).getCourse(); + assert course != null; + + Lesson adaptiveLesson = course.getLessons().get(0); + assert adaptiveLesson != null; + + int taskNumber = adaptiveLesson.getTaskList().size(); + Task lastRecommendationInCourse = adaptiveLesson.getTaskList().get(taskNumber - 1); + Task lastRecommendationOnStepik = ProgressManager.getInstance().runProcessWithProgressSynchronously( + () -> { + ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); + return StudyUtils.execCancelable(() -> EduAdaptiveStepicConnector.getNextRecommendation(project, (RemoteCourse)course)); + }, + "Updating Course", true, project); + + if (lastRecommendationOnStepik != null && lastRecommendationOnStepik.getStepId() != lastRecommendationInCourse.getStepId()) { + lastRecommendationOnStepik.initTask(adaptiveLesson, false); + EduAdaptiveStepicConnector.replaceCurrentTask(project, lastRecommendationOnStepik, adaptiveLesson); + ApplicationManager.getApplication().invokeLater(() -> { + VirtualFileManager.getInstance().refreshWithoutFileWatcher(false); + ProjectView.getInstance(project).refresh(); + StudyNavigator.navigateToTask(project, lastRecommendationOnStepik); + }); + } + } + + @Override + public void update(AnActionEvent e) { + Presentation presentation = e.getPresentation(); + + Project project = e.getProject(); + if (project == null) { + presentation.setEnabledAndVisible(false); + return; + } + + Course course = StudyTaskManager.getInstance(project).getCourse(); + if (course == null || !course.isAdaptive()) { + presentation.setEnabledAndVisible(false); + return; + } + + presentation.setEnabledAndVisible(true); + } +} diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java index a09bb0b7236b..b55d3bbeebca 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java @@ -363,7 +363,7 @@ public class EduAdaptiveStepicConnector { } } - private static void replaceCurrentTask(@NotNull Project project, @NotNull Task task, @NotNull Lesson lesson) { + public static void replaceCurrentTask(@NotNull Project project, @NotNull Task task, @NotNull Lesson lesson) { Course course = StudyTaskManager.getInstance(project).getCourse(); assert course != null; diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepikUtils.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepikUtils.java index 83190dd50cf1..00516167744e 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepikUtils.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepikUtils.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.Nullable; public class EduStepikUtils { @Nullable - public static String getLink(@Nullable Task task) { + public static String getLink(@Nullable Task task, int stepNumber) { if (task == null) { return null; } @@ -31,6 +31,12 @@ public class EduStepikUtils { return null; } - return String.format("%s/lesson/%d/step/%d", EduStepicNames.STEPIC_URL, lesson.getId(), task.getPosition()); + return String.format("%s/lesson/%d/step/%d", EduStepicNames.STEPIC_URL, lesson.getId(), stepNumber); + } + + @Nullable + public static String getAdaptiveLink(@Nullable Task task) { + String link = getLink(task, 1); + return link == null ? null : link + "?adaptive=true"; } }