diff --git a/core/src/main/java/se/su/dsv/scipro/DataInitializer.java b/core/src/main/java/se/su/dsv/scipro/DataInitializer.java index 7807205f64..4401054e99 100644 --- a/core/src/main/java/se/su/dsv/scipro/DataInitializer.java +++ b/core/src/main/java/se/su/dsv/scipro/DataInitializer.java @@ -13,6 +13,7 @@ import java.util.*; import java.util.function.Function; import se.su.dsv.scipro.checklist.ChecklistCategory; import se.su.dsv.scipro.file.FileUpload; +import se.su.dsv.scipro.match.*; import se.su.dsv.scipro.match.ApplicationPeriod; import se.su.dsv.scipro.match.Idea; import se.su.dsv.scipro.match.IdeaService; @@ -85,16 +86,19 @@ public class DataInitializer implements Lifecycle { private User stina_student; private User sid_student; private User simon_student; - private ProjectType bachelorClass; + private User sofia_student; private Set<ResearchArea> researchAreas; private Long researchAreaId = RESEARCH_AREA_ID; - private Set<Language> languages; - private ApplicationPeriod applicationPeriod; - private Keyword keyword1; + private Set<Language> languages = Set.of(Language.SWEDISH, Language.ENGLISH); + private Program program; private ResearchArea researchArea1; private ResearchArea researchArea2; + private Keyword keyword1; + private Keyword keyword2; + private ProjectType bachelorClass; private ProjectType masterClass; private ProjectType magisterClass; + private ApplicationPeriod applicationPeriod; private Project project2; @Transactional @@ -103,6 +107,7 @@ public class DataInitializer implements Lifecycle { if (profile.getCurrentProfile() == Profiles.DEV && noUsers()) { createDefaultProjectTypesIfNotDone(); createDefaultChecklistCategoriesIfNotDone(); + createProgram(); createApplicationPeriodIfNotDone(); createGradingCriterionTemplateIfNotDone(); createResearchAreasForDemo(); @@ -111,6 +116,8 @@ public class DataInitializer implements Lifecycle { createUsers(); createMatchedIdea(); createProjects(); + createTarget(); + createStudentIdea(); createRoughDraftApproval(); } if (profile.getCurrentProfile() == Profiles.DEV && noAdminUser()) { @@ -135,6 +142,15 @@ public class DataInitializer implements Lifecycle { return userService.findByUsername(ADMIN + MAIL) == null; } + private void createProgram() { + program = new Program(); + program.setCode("AppCompSci"); + program.setName("Tillämpad Datavetenskap"); + program.setExternalId(123); + program.setNameEn("Applied Computer Science"); + program = save(program); + } + private void createApplicationPeriodIfNotDone() { applicationPeriod = new ApplicationPeriod("HT 2014"); applicationPeriod.setStartDate(LocalDate.now().minusDays(APPLICATION_PERIOD_START_MINUS_DAYS)); @@ -150,12 +166,12 @@ public class DataInitializer implements Lifecycle { keyword1 = new Keyword("IT"); keyword1.addResearchArea(researchArea1); keyword1.addResearchArea(researchArea2); - save(keyword1); + keyword1 = save(keyword1); - Keyword keyword2 = new Keyword("Computers"); + keyword2 = new Keyword("Computers"); keyword2.addResearchArea(researchArea1); keyword2.addResearchArea(researchArea2); - save(keyword2); + keyword2 = save(keyword2); } private void createResearchAreasForDemo() { @@ -211,6 +227,11 @@ public class DataInitializer implements Lifecycle { // can not be used as author on any idea // can not be used as author on any project createStudent("Stig"); + + // Used to test assign supervisor to student idea + // this student has a submitted idea, which has not assigned supervisor + // don't use this student for anything else + sofia_student = createStudent("Sofia"); } private User createStudent(String firstName) { @@ -229,8 +250,11 @@ public class DataInitializer implements Lifecycle { user.setUnit(u); user.setResearchAreas(researchAreas); user.setLanguages(languages); + user.setActiveAsSupervisor(true); + createBeta(user); - return user; + + return save(user); } private User createUser(String firstName, String lastName) { @@ -304,6 +328,32 @@ public class DataInitializer implements Lifecycle { save(getMagisterTemplate()); } + private void createTarget() { + Target target = new Target(eric_employee, applicationPeriod, bachelorClass); + target.setTarget(10); + save(target); + } + + private void createStudentIdea() { + Idea idea = new Idea(); + idea.setTitle("Fundamental Math Concepts of AI"); + idea.setType(Idea.Type.STUDENT); + + TholanderBox box = new TholanderBox(); + box.setLiterature("Math AI Literature"); + box.setBackground("Math AI Background"); + box.setProblem("Math AI Problem"); + box.setMethod("Math AI Method"); + box.setInterests("Math AI Interests"); + idea.setTholanderBox(box); + + idea.setProjectType(bachelorClass); + idea.setApplicationPeriod(applicationPeriod); + + List<Keyword> keywords = List.of(keyword1, keyword2); + ideaService.saveStudentIdea(idea, sofia_student, program, new HashSet<User>(), keywords, true); + } + private GradingReportTemplate getBachelorTemplate() { GradingReportTemplate gradingReportTemplate = new GradingReportTemplate( bachelorClass, diff --git a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java index 6b4bfe4a31..facfd13013 100644 --- a/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java +++ b/daisy-integration/src/main/java/se/su/dsv/scipro/integration/daisy/workers/RejectedThesisWorker.java @@ -56,6 +56,7 @@ public class RejectedThesisWorker extends AbstractWorker { if (supervisorGradingReport.getLastModified().before(rejectedDate)) { supervisorGradingReport.setState(GradingReport.State.INITIAL); supervisorGradingReport.setSubmitted(false); + supervisorGradingReport.setDateSubmittedToExaminer(null); supervisorGradingReport.setRejectionComment(thesisRejection.getMessage()); } } diff --git a/view/src/main/java/se/su/dsv/scipro/match/AbstractAdminIdeaPanel.java b/view/src/main/java/se/su/dsv/scipro/match/AbstractAdminIdeaPanel.java index e7f1301dcf..fa794256ce 100644 --- a/view/src/main/java/se/su/dsv/scipro/match/AbstractAdminIdeaPanel.java +++ b/view/src/main/java/se/su/dsv/scipro/match/AbstractAdminIdeaPanel.java @@ -205,17 +205,34 @@ public abstract class AbstractAdminIdeaPanel extends Panel { ideaService.adminUnmatchIdea(idea, SciProSession.get().getUser()); info("Unmatched idea: " + idea.getTitle()); } else { - if ( - targetService.hasTargetsLeft( - idea.getApplicationPeriod(), - newSelection, - idea.getProjectType() - ) - ) { - ideaService.changeSupervisor(idea, newSelection, SciProSession.get().getUser()); - info("Supervisor changed"); + ideaService.changeSupervisor(idea, newSelection, SciProSession.get().getUser()); + + Target currentTarget = targetService.findOne( + idea.getApplicationPeriod(), + newSelection, + idea.getProjectType() + ); + Long countMatched = ideaService.countMatched( + idea.getApplicationPeriod(), + newSelection, + idea.getProjectType() + ); + + int targetCounter = (currentTarget == null) ? 0 : currentTarget.getTarget(); + + String msg = + "Supervisor changed: matched/target -> " + + countMatched + + " / " + + targetCounter + + " (" + + idea.getProjectType().getName() + + ")"; + + if (countMatched > targetCounter) { + warn(msg); } else { - error("The supervisor have reached current target numbers"); + info(msg); } } target.addListener(new AjaxFeedbackPanelUpdater()); diff --git a/view/src/main/webapp/css/scipro_m.css b/view/src/main/webapp/css/scipro_m.css index 5c4184a9c0..7ce4954a00 100755 --- a/view/src/main/webapp/css/scipro_m.css +++ b/view/src/main/webapp/css/scipro_m.css @@ -129,6 +129,12 @@ footer a:hover { color: #d95e00;} border-color: #EBCCD1; } +.feedbackPanelWARNING { + color: #000000; + background-color: #FFD105; + border-color: #EBCCD1; +} + .feedbackPanelINFO { color: #3C763D; background-color: #DFF0D8; diff --git a/war/src/main/resources/application.properties b/war/src/main/resources/application.properties index bb89287006..0df6b375e6 100644 --- a/war/src/main/resources/application.properties +++ b/war/src/main/resources/application.properties @@ -9,6 +9,7 @@ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.Ph # We also need to set the implicit strategy to be JPA compliant, as we rely on this naming strategy for certain # join tables (idea_Keyword vs idea_keyword) spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl +spring.jpa.show-sql=false spring.mvc.servlet.path=/api