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
- "";
+ "";
}
@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";
}
}