From df9f2237adee88051dccc74c409ae40e10ad2326 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 3 Apr 2017 13:28:01 +0300 Subject: [PATCH] EDU-900 Enable educator tools only if user confirmed that he/she is an educator --- .../resources/META-INF/plugin.xml | 6 ++- .../actions/CCPluginToggleAction.java | 17 ++++++ .../edu/coursecreator/settings/CCOptions.java | 2 + ...UpdateSettings.java => StudySettings.java} | 24 ++++++--- .../jetbrains/edu/learning/StudyUtils.java | 3 +- .../edu/learning/checker/StudyCheckTask.java | 12 +++-- .../StudyProjectGenerator.java | 8 +-- .../stepic/EduAdaptiveStepicConnector.java | 5 +- .../stepic/EduStepicAuthorizedClient.java | 10 ++-- .../learning/stepic/EduStepicConnector.java | 5 +- .../edu/learning/stepic/EduStepicUpdater.java | 7 +-- .../learning/stepic/StepicStudyOptions.java | 9 ++-- .../jetbrains/edu/learning/ui/LoginPanel.java | 4 +- .../edu/learning/ui/StudyNewProjectPanel.java | 8 ++- .../PyStudyDirectoryProjectGenerator.java | 5 +- .../educational-python/educational-python.iml | 1 + .../icons/com/jetbrains/edu/student.png | Bin 0 -> 6586 bytes .../icons/com/jetbrains/edu/teacher.png | Bin 0 -> 6353 bytes .../PyCharmEduConfigImportSettings.java | 3 +- .../python/edu/CustomizeEduStepPanel.java | 49 ++++++++++++++++++ .../edu/PyCharmEduInitialConfigurator.java | 17 ++++-- 21 files changed, 149 insertions(+), 46 deletions(-) create mode 100644 python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java rename python/educational-core/src/com/jetbrains/edu/learning/{stepic/StepicUpdateSettings.java => StudySettings.java} (64%) create mode 100644 python/educational-python/resources/icons/com/jetbrains/edu/student.png create mode 100644 python/educational-python/resources/icons/com/jetbrains/edu/teacher.png create mode 100644 python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java diff --git a/python/educational-core/resources/META-INF/plugin.xml b/python/educational-core/resources/META-INF/plugin.xml index 838d3d077cbb..d1523e23db1d 100644 --- a/python/educational-core/resources/META-INF/plugin.xml +++ b/python/educational-core/resources/META-INF/plugin.xml @@ -83,6 +83,10 @@ text="Fill Answer Placeholders"> + + + @@ -170,7 +174,7 @@ - + diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java new file mode 100644 index 000000000000..0a6202110dea --- /dev/null +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java @@ -0,0 +1,17 @@ +package com.jetbrains.edu.coursecreator.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.jetbrains.edu.learning.StudySettings; + +public class CCPluginToggleAction extends ToggleAction { + @Override + public boolean isSelected(AnActionEvent e) { + return StudySettings.getInstance().isCourseCreatorEnabled(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + StudySettings.getInstance().setCourseCreatorEnabled(state); + } +} \ No newline at end of file diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java index c61a866b0fc6..6f5e3cd7768b 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java @@ -2,6 +2,7 @@ package com.jetbrains.edu.coursecreator.settings; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.wm.IdeFocusManager; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.settings.StudyOptionsProvider; import org.jetbrains.annotations.Nullable; @@ -15,6 +16,7 @@ public class CCOptions implements StudyOptionsProvider { @Nullable @Override public JComponent createComponent() { + if (!StudySettings.getInstance().isCourseCreatorEnabled()) return null; if (CCSettings.getInstance().useHtmlAsDefaultTaskFormat()) { myHtmlRadioButton.setSelected(true); IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java b/python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java similarity index 64% rename from python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java rename to python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java index 94b2d9b6c817..60a44d7c546f 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java @@ -1,19 +1,21 @@ -package com.jetbrains.edu.learning.stepic; +package com.jetbrains.edu.learning; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.util.xmlb.XmlSerializerUtil; +import com.jetbrains.edu.learning.stepic.StepicUser; import org.jetbrains.annotations.Nullable; @State(name = "StepicUpdateSettings", storages = @Storage("other.xml")) -public class StepicUpdateSettings implements PersistentStateComponent { +public class StudySettings implements PersistentStateComponent { private StepicUser myUser; public long LAST_TIME_CHECKED = 0; private boolean myEnableTestingFromSamples = false; + private boolean isCourseCreatorEnabled = false; - public StepicUpdateSettings() { + public StudySettings() { } public long getLastTimeChecked() { @@ -26,17 +28,17 @@ public class StepicUpdateSettings implements PersistentStateComponent @@ -185,7 +187,7 @@ public class StudyCheckTask extends com.intellij.openapi.progress.Task.Backgroun if (testOutput != null) { // As tests in adaptive courses are created from // samples and stored in task, to disable it we should ignore local testing results - if (StepicUpdateSettings.getInstance().isEnableTestingFromSamples() && !testOutput.isSuccess()) { + if (StudySettings.getInstance().isEnableTestingFromSamples() && !testOutput.isSuccess()) { onTaskFailed(testOutput.getMessage()); } else { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java b/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java index 58c82ec9b24f..86297e048d58 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java @@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.util.containers.ContainerUtil; import com.jetbrains.edu.learning.StudySerializationUtils; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.core.EduNames; @@ -35,7 +36,6 @@ import com.jetbrains.edu.learning.courseFormat.tasks.Task; import com.jetbrains.edu.learning.editor.StudyEditor; import com.jetbrains.edu.learning.statistics.EduUsagesCollector; import com.jetbrains.edu.learning.stepic.EduStepicConnector; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.stepic.StepicUser; import org.apache.commons.codec.binary.Base64; import org.jetbrains.annotations.NotNull; @@ -65,7 +65,7 @@ public class StudyProjectGenerator { } public boolean isLoggedIn() { - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); return user != null; } @@ -121,7 +121,7 @@ public class StudyProjectGenerator { return getCourseFromStepic(project); } else { - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user != null) { final File adaptiveCourseFile = new File(new File(OUR_COURSES_DIR, ADAPTIVE_COURSE_PREFIX + mySelectedCourseInfo.getName() + "_" + @@ -405,7 +405,7 @@ public class StudyProjectGenerator { myCourses = getCoursesFromCache(); } if (force || myCourses.isEmpty()) { - myCourses = execCancelable(() -> EduStepicConnector.getCourses(StepicUpdateSettings.getInstance().getUser())); + myCourses = execCancelable(() -> EduStepicConnector.getCourses(StudySettings.getInstance().getUser())); flushCache(myCourses); } if (myCourses.isEmpty() || (myCourses.size() == 1 && myCourses.contains(CourseInfo.INVALID_COURSE))) { 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 db1dc541e2ce..2938f63bd0bc 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 @@ -20,6 +20,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.checker.StudyExecutor; @@ -83,7 +84,7 @@ public class EduAdaptiveStepicConnector { return null; } - StepicUser user = StepicUpdateSettings.getInstance().getUser(); + StepicUser user = StudySettings.getInstance().getUser(); if (user == null) { LOG.warn("User is null"); return null; @@ -303,7 +304,7 @@ public class EduAdaptiveStepicConnector { final Course course = StudyTaskManager.getInstance(project).getCourse(); if (course != null && editor != null && editor.getTaskFile() != null) { indicator.checkCanceled(); - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user == null) { LOG.warn("Can't get next recommendation: user is null"); ApplicationManager.getApplication().invokeLater(() -> StudyUtils.showErrorPopupOnToolbar(project, diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java index e94b9b39108b..3a2986023484 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java @@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.jetbrains.edu.learning.StudySettings; import org.apache.http.*; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; @@ -36,13 +37,12 @@ public class EduStepicAuthorizedClient { return ourClient; } - StepicUpdateSettings stepicUpdateSettings = StepicUpdateSettings.getInstance(); + StudySettings studySettings = StudySettings.getInstance(); - - if (stepicUpdateSettings.getUser() == null) { + if (studySettings.getUser() == null) { final StepicUser user = showLoginDialog(); if (user != null) { - stepicUpdateSettings.setUser(user); + studySettings.setUser(user); } else { LOG.warn("Unable to login"); @@ -50,7 +50,7 @@ public class EduStepicAuthorizedClient { } } - StepicUser stepicUser = stepicUpdateSettings.getUser(); + StepicUser stepicUser = studySettings.getUser(); assert stepicUser != null; if (!EduStepicClient.isTokenUpToDate(stepicUser.getAccessToken())) { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java index b4e2f8b4107e..1931f7a2e768 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java @@ -9,6 +9,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.CourseInfo; @@ -259,7 +260,7 @@ public class EduStepicConnector { } private static T getFromStepic(String link, final Class container) throws IOException{ - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); final boolean isAuthorized = user != null; if (isAuthorized) { return EduStepicAuthorizedClient.getFromStepic(link, container, user); @@ -355,7 +356,7 @@ public class EduStepicConnector { public static String postAttempt(int id) throws IOException { final CloseableHttpClient client = EduStepicAuthorizedClient.getHttpClient(); - if (client == null || StepicUpdateSettings.getInstance().getUser() == null) return ""; + if (client == null || StudySettings.getInstance().getUser() == null) return ""; final HttpPost attemptRequest = new HttpPost(EduStepicNames.STEPIC_API_URL + EduStepicNames.ATTEMPTS); String attemptRequestBody = new Gson().toJson(new StepicWrappers.AttemptWrapper(id)); attemptRequest.setEntity(new StringEntity(attemptRequestBody, ContentType.APPLICATION_JSON)); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java index b84efb073aa2..ed8afb093f92 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java @@ -10,6 +10,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Alarm; import com.intellij.util.text.DateFormatUtil; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.courseFormat.CourseInfo; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import org.jetbrains.annotations.NotNull; @@ -34,7 +35,7 @@ public class EduStepicUpdater { @Override public void appFrameCreated(String[] commandLineArgs, @NotNull Ref willOpenProject) { - long timeToNextCheck = StepicUpdateSettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); + long timeToNextCheck = StudySettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); if (timeToNextCheck <= 0) { myCheckRunnable.run(); } @@ -51,7 +52,7 @@ public class EduStepicUpdater { final List courses = EduStepicConnector.getCourses(null); final List cachedCourses = StudyProjectGenerator.getCoursesFromCache(); StudyProjectGenerator.flushCache(courses); - StepicUpdateSettings.getInstance().setLastTimeChecked(System.currentTimeMillis()); + StudySettings.getInstance().setLastTimeChecked(System.currentTimeMillis()); courses.removeAll(cachedCourses); if (!courses.isEmpty() && !cachedCourses.isEmpty()) { @@ -79,7 +80,7 @@ public class EduStepicUpdater { private static boolean checkNeeded() { final List courses = StudyProjectGenerator.getCoursesFromCache(); - long timeToNextCheck = StepicUpdateSettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); + long timeToNextCheck = StudySettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); return courses.isEmpty() || timeToNextCheck <= 0; } } diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java index 14ee91102936..a45c53652962 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java @@ -20,6 +20,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBCheckBox; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.settings.StudyOptionsProvider; import org.jetbrains.annotations.NotNull; @@ -79,7 +80,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { @Override public void reset() { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); myEnableTestingFromSamples.setSelected(stepikSettings.isEnableTestingFromSamples()); final StepicUser user = stepikSettings.getUser(); if (user != null) { @@ -95,7 +96,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { @Override public void apply() throws ConfigurationException { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); if (isTestingFromSamplesEnabled() != stepikSettings.isEnableTestingFromSamples()) { stepikSettings.setEnableTestingFromSamples(isTestingFromSamplesEnabled()); } @@ -131,7 +132,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { } private static void removeCredentials() { - StepicUpdateSettings.getInstance().setUser(null); + StudySettings.getInstance().setUser(null); EduStepicAuthorizedClient.invalidateClient(); } @@ -142,7 +143,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { } public boolean isModified() { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); boolean isTestOptionModified = !isTestingFromSamplesEnabled() == stepikSettings.isEnableTestingFromSamples(); final StepicUser user = stepikSettings.getUser(); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java b/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java index aa3ea057a709..f71f2df18e9a 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java @@ -3,9 +3,9 @@ package com.jetbrains.edu.learning.ui; import com.intellij.ide.BrowserUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBLabel; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.stepic.EduStepicNames; import com.jetbrains.edu.learning.stepic.LoginDialog; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.stepic.StepicUser; import javax.swing.*; @@ -49,7 +49,7 @@ public class LoginPanel { e.getComponent().setCursor(Cursor.getDefaultCursor()); } }); - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user != null) { myLoginField.setText(user.getEmail()); myPasswordField.setText(user.getPassword()); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java b/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java index 46216fcb45c7..e236b5487fa3 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java @@ -26,11 +26,15 @@ import com.intellij.ui.AncestorListenerAdapter; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.components.JBScrollPane; import com.intellij.util.ui.UIUtil; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.CourseInfo; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; -import com.jetbrains.edu.learning.stepic.*; +import com.jetbrains.edu.learning.stepic.EduAdaptiveStepicConnector; +import com.jetbrains.edu.learning.stepic.EduStepicAuthorizedClient; +import com.jetbrains.edu.learning.stepic.LoginDialog; +import com.jetbrains.edu.learning.stepic.StepicUser; import icons.EducationalCoreIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -361,7 +365,7 @@ public class StudyNewProjectPanel extends JPanel implements PanelWithAnchor { if (stepicUser != null) { stepicUser.setEmail(myLoginPanel.getLogin()); stepicUser.setPassword(myLoginPanel.getPassword()); - StepicUpdateSettings.getInstance().setUser(stepicUser); + StudySettings.getInstance().setUser(stepicUser); myGenerator.setEnrolledCoursesIds(EduAdaptiveStepicConnector.getEnrolledCoursesIds(stepicUser)); final List courses = myGenerator.getCourses(true); if (courses != null && myRefreshCourseList) { diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java index 5e079da7d852..a9d7e496138f 100644 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java @@ -24,10 +24,9 @@ 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.courseFormat.CourseInfo; +import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import com.jetbrains.edu.learning.stepic.EduStepicConnector; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.ui.StudyNewProjectPanel; import com.jetbrains.python.configuration.PyConfigurableInterpreterList; import com.jetbrains.python.newProject.PyNewProjectSettings; @@ -190,7 +189,7 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator { ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); return StudyUtils.execCancelable(() -> EduStepicConnector.enrollToCourse(course.getId(), - StepicUpdateSettings.getInstance().getUser())); + StudySettings.getInstance().getUser())); }, "Creating Course", true, ProjectManager.getInstance().getDefaultProject()); } diff --git a/python/educational-python/educational-python.iml b/python/educational-python/educational-python.iml index 92200056b482..3d354ed20918 100644 --- a/python/educational-python/educational-python.iml +++ b/python/educational-python/educational-python.iml @@ -26,5 +26,6 @@ + \ No newline at end of file diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/student.png b/python/educational-python/resources/icons/com/jetbrains/edu/student.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b75f2167a67585b9146c9cebe418bc0f1d77d8 GIT binary patch literal 6586 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 K6{{fT!T%4_P_T#q literal 0 HcmV?d00001 diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/teacher.png b/python/educational-python/resources/icons/com/jetbrains/edu/teacher.png new file mode 100644 index 0000000000000000000000000000000000000000..221e396ff5993291bb24b29fb5056ff3a7e402c5 GIT binary patch literal 6353 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 literal 0 HcmV?d00001 diff --git a/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java b/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java index 989c750681f3..f9c27f5fde05 100644 --- a/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java +++ b/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java @@ -6,7 +6,8 @@ import com.intellij.ide.plugins.PluginManagerCore; @SuppressWarnings("UnusedDeclaration") public class PyCharmEduConfigImportSettings extends ConfigImportSettings { public PyCharmEduConfigImportSettings() { - PluginManagerCore.disablePlugin("org.jetbrains.plugins.coursecreator"); + PluginManagerCore.disablePlugin("com.jetbrains.edu.coursecreator"); + PluginManagerCore.disablePlugin("com.jetbrains.edu.coursecreator.python"); } } diff --git a/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java b/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java new file mode 100644 index 000000000000..603deb9c8605 --- /dev/null +++ b/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java @@ -0,0 +1,49 @@ +package com.jetbrains.python.edu; + +import com.intellij.ide.customize.AbstractCustomizeWizardStep; +import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.openapi.util.IconLoader; +import com.jetbrains.edu.learning.StudySettings; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class CustomizeEduStepPanel extends AbstractCustomizeWizardStep { + + public CustomizeEduStepPanel() { + final JPanel studentPanel = new JPanel(new VerticalFlowLayout()); + final JButton student = new JButton(IconLoader.findIcon("/icons/com/jetbrains/edu/student.png")); + student.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudySettings.getInstance().setCourseCreatorEnabled(false); + } + }); + studentPanel.add(student); + studentPanel.add(new JLabel("Student", SwingConstants.CENTER)); + add(studentPanel); + + final JButton teacher = new JButton(IconLoader.findIcon("/icons/com/jetbrains/edu/teacher.png")); + final JPanel teacherPanel = new JPanel(new VerticalFlowLayout()); + teacherPanel.add(teacher); + teacherPanel.add(new JLabel("Teacher", SwingConstants.CENTER)); + teacher.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudySettings.getInstance().setCourseCreatorEnabled(true); + } + }); + add(teacherPanel); + } + + @Override + protected String getTitle() { + return "Are you student or teacher?"; + } + + @Override + protected String getHTMLHeader() { + return ""; + } +} diff --git a/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java b/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java index 0037d1b3048e..380da1c7bb79 100644 --- a/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java +++ b/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java @@ -25,6 +25,9 @@ import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.ide.AppLifecycleListener; import com.intellij.ide.GeneralSettings; import com.intellij.ide.SelectInTarget; +import com.intellij.ide.customize.AbstractCustomizeWizardStep; +import com.intellij.ide.customize.CustomizeIDEWizardDialog; +import com.intellij.ide.customize.CustomizeIDEWizardStepsProvider; import com.intellij.ide.projectView.impl.AbstractProjectViewPane; import com.intellij.ide.scopeView.ScopeViewPane; import com.intellij.ide.ui.UISettings; @@ -87,6 +90,7 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -194,9 +198,9 @@ public class PyCharmEduInitialConfigurator { ApplicationManager.getApplication().invokeLater(() -> { if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) { GeneralSettings.getInstance().setShowTipsOnStartup(false); - propertiesComponent.setValue(DISPLAYED_PROPERTY, "true"); - patchKeymap(); + showInitialConfigurationDialog(); + propertiesComponent.setValue(DISPLAYED_PROPERTY, "true"); } }); } @@ -396,5 +400,12 @@ public class PyCharmEduInitialConfigurator { } } } - + private static void showInitialConfigurationDialog() { + new CustomizeIDEWizardDialog(new CustomizeIDEWizardStepsProvider() { + @Override + public void initSteps(@NotNull CustomizeIDEWizardDialog dialog, @NotNull List steps) { + steps.add(new CustomizeEduStepPanel()); + } + }).show(); + } }