2082 Ignore programs that do not have a type

This commit is contained in:
Andreas Svanberg 2021-09-09 10:46:47 +02:00
parent eafa7a1e93
commit 9afe1e3e4b
8 changed files with 48 additions and 36 deletions
core/src/main/java/se/su/dsv/scipro/daisyExternal
daisy-integration/src
main/java/se/su/dsv/scipro/integration/daisy/workers
test/java/se/su/dsv/scipro
view/src
main/java/se/su/dsv/scipro/user
test/java/se/su/dsv/scipro/user

@ -1,12 +1,15 @@
package se.su.dsv.scipro.daisyExternal;
import se.su.dsv.scipro.io.dto.Person;
import se.su.dsv.scipro.io.dto.Program;
import se.su.dsv.scipro.io.dto.Thesis;
import se.su.dsv.scipro.system.User;
import java.util.Map;
public interface ImporterTransactions {
User importPerson(Person person);
User importStudent(Person person);
User importSupervisor(Person person);
User importPerson(Person person, final Map<Integer, Program> programCache);
User importStudent(Person person, final Map<Integer, Program> programCache);
User importSupervisor(Person person, final Map<Integer, Program> programCache);
void importProject(Thesis thesis);
}

@ -59,9 +59,9 @@ public class ExternalImporterDaisyImpl implements ExternalImporter {
User user;
if (client.getSupervisors(DSV).contains(person)){
user = importerTransactions.importSupervisor(person);
user = importerTransactions.importSupervisor(person, new HashMap<>());
} else {
user = importerTransactions.importStudent(person);
user = importerTransactions.importStudent(person, new HashMap<>());
}
importProjects(person);

@ -52,15 +52,15 @@ public class ImporterTransactionsImpl implements ImporterTransactions {
}
@Override
public User importPerson(Person person) {
public User importPerson(Person person, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
LOGGER.info("Importing person: {} {} ({})", person.getFirstName(), person.getLastName(), person.getId());
User user = updatePersonData(person.getId(), person);
importUsernames(person, user);
importAuthorLevel(user);
importAuthorLevel(user, programCache);
return user;
}
private void importAuthorLevel(final User user) {
private void importAuthorLevel(final User user, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
final var semesterPrograms = client
.getProgramAdmissionsForStudent(user.getIdentifier())
.stream()
@ -72,9 +72,10 @@ public class ImporterTransactionsImpl implements ImporterTransactions {
.map(cr -> new Pair<>(cr.getSemester(), cr.getProgramId()));
final DegreeLevel latestLevel = Stream
.concat(semesterPrograms, registrationSemesters)
.map(pair -> new Pair<>(pair.getHead(), getProgram(pair.getTail(), programCache)))
.filter(pair -> pair.getTail().getType() != null)
.max(Comparator.comparing(Pair::getHead))
.map(Pair::getTail)
.map(client::getProgram)
.map(se.su.dsv.scipro.io.dto.Program::getType)
.map(this::toDegreeLevel)
.orElse(DegreeLevel.NONE);
@ -86,6 +87,10 @@ public class ImporterTransactionsImpl implements ImporterTransactions {
}
}
private se.su.dsv.scipro.io.dto.Program getProgram(Integer programId, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
return programCache.computeIfAbsent(programId, client::getProgram);
}
private DegreeLevel toDegreeLevel(ProgramType programType) {
switch (programType) {
case BACHELOR:
@ -101,34 +106,34 @@ public class ImporterTransactionsImpl implements ImporterTransactions {
@Override
@Transactional
public User importStudent(Person person) {
User user = importPerson(person);
importProgramsAndMakeStudent(person, user);
public User importStudent(Person person, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
User user = importPerson(person, programCache);
importProgramsAndMakeStudent(person, user, programCache);
return user;
}
@Transactional
@Override
public User importSupervisor(Person person) {
User user = importPerson(person);
public User importSupervisor(Person person, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
User user = importPerson(person, programCache);
importResearchAreasAndMakeSupervisor(person, user);
return user;
}
private void importProgramsAndMakeStudent(Person person, User user) {
private void importProgramsAndMakeStudent(Person person, User user, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
Response response = client.getStudent(person.getId());
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
se.su.dsv.scipro.io.dto.Student student = response.readEntity(se.su.dsv.scipro.io.dto.Student.class);
for (StudentProgramAdmission admission : client.getProgramAdmissionsForStudent(student.getPerson().getId())) {
Program program = importProgram(admission.getProgram().getId());
Program program = importProgram(admission.getProgram().getId(), programCache);
user.addProgram(program);
}
userService.save(user);
}
}
private Program importProgram(Integer id) {
se.su.dsv.scipro.io.dto.Program program = client.getProgram(id);
private Program importProgram(Integer id, final Map<Integer, se.su.dsv.scipro.io.dto.Program> programCache) {
se.su.dsv.scipro.io.dto.Program program = getProgram(id, programCache);
return programService.updateExternalProgram(program.getId(), program.getName(), program.getNameEn(), program.getCode());
}

@ -19,9 +19,7 @@ import se.su.dsv.scipro.workerthreads.AbstractWorker;
import javax.inject.Inject;
import java.time.Year;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -57,11 +55,12 @@ public class UserImportWorker extends AbstractWorker {
long startDate = System.currentTimeMillis();
LOGGER.info("Starting execution for scheduled remote user import of all remote supervisors");
importUserDetails();
importSupervisors();
final Map<Integer, Program> programCache = new HashMap<>();
importUserDetails(programCache);
importSupervisors(programCache);
importSupervisorUnits();
importSupervisorActiveStatus();
importPotentialNewStudents();
importPotentialNewStudents(programCache);
long endDate = System.currentTimeMillis();
long executionTimeSecs = (endDate - startDate) / 1000;
@ -71,7 +70,7 @@ public class UserImportWorker extends AbstractWorker {
executionTimeSecs % 60);
}
private void importUserDetails() {
private void importUserDetails(final Map<Integer, Program> programCache) {
for (final User user : userService.findAll()) {
if (user.getIdentifier() != null) {
final var span = tracer.buildSpan("Importing user")
@ -83,7 +82,7 @@ public class UserImportWorker extends AbstractWorker {
if (idPerson.isPresent()) {
Person person = idPerson.get();
if (person.getEmail() != null) {
importerTransactions.importPerson(person);
importerTransactions.importPerson(person, programCache);
}
else {
LOGGER.info("Skipping user because of no e-mail in Daisy: {}", person);
@ -102,7 +101,7 @@ public class UserImportWorker extends AbstractWorker {
else {
user.setIdentifier(usernamePerson.get().getId());
userService.save(user);
importerTransactions.importPerson(usernamePerson.get());
importerTransactions.importPerson(usernamePerson.get(), programCache);
}
break;
}
@ -125,12 +124,12 @@ public class UserImportWorker extends AbstractWorker {
externalImporter.importSupervisorActiveStatus();
}
private void importSupervisors() {
private void importSupervisors(final Map<Integer, Program> programCache) {
List<Person> supervisors = daisyAPI.getSupervisors(DSV);
for (Person supervisor : supervisors) {
try {
if (supervisor.getEmail() != null) {
importerTransactions.importSupervisor(supervisor);
importerTransactions.importSupervisor(supervisor, programCache);
}
else {
LOGGER.info("Skipping supervisor because of no e-mail in Daisy: {}", supervisor);
@ -164,8 +163,9 @@ public class UserImportWorker extends AbstractWorker {
importerTransactions.importProject(project);
}
private void importPotentialNewStudents() {
private void importPotentialNewStudents(final Map<Integer, Program> programCache) {
final List<Program> programs = daisyAPI.getPrograms(DSV);
programs.forEach(program -> programCache.put(program.getId(), program));
for (Program program : programs) {
for (Semester admissionSemester : getAdmissionSemestersToImport()) {
LOGGER.info("Checking for newly admitted students on {} ({})", program.getCode(), admissionSemester);
@ -178,7 +178,7 @@ public class UserImportWorker extends AbstractWorker {
.peek(person -> LOGGER.info("Found potential new student: {} {} ({}) - checking email...", person.getFirstName(), person.getLastName(), person.getId()))
.filter(person -> person.getEmail() != null)
.peek(person -> LOGGER.info("Email set - importing"))
.forEach(importerTransactions::importStudent);
.forEach(person1 -> importerTransactions.importStudent(person1, programCache));
}
}
}

@ -97,7 +97,7 @@ public class UserImportWorkerTest {
worker.doWork();
verify(importerTransactions).importPerson(person);
verify(importerTransactions).importPerson(person, new HashMap<>());
}
@Test
@ -108,7 +108,7 @@ public class UserImportWorkerTest {
worker.doWork();
verify(importerTransactions, never()).importPerson(person);
verify(importerTransactions, never()).importPerson(person, new HashMap<>());
}
@Test

@ -15,6 +15,8 @@ import se.su.dsv.scipro.system.*;
import javax.ws.rs.core.Response;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
@ -60,7 +62,7 @@ public class ImporterTransactionsImplTest {
public void updates_person_data() {
Person person = createPerson();
importerTransactions.importPerson(person);
importerTransactions.importPerson(person, new HashMap<>());
ArgumentCaptor<User> captor = ArgumentCaptor.forClass(User.class);
verify(userService).save(captor.capture());

@ -17,6 +17,7 @@ import se.su.dsv.scipro.system.UserService;
import javax.inject.Inject;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
public class AdminImportUserPage extends AbstractAdminUsersPage {
@ -77,7 +78,7 @@ public class AdminImportUserPage extends AbstractAdminUsersPage {
@Override
public void onClick() {
importerTransactions.importStudent(getModelObject());
importerTransactions.importStudent(getModelObject(), new HashMap<>());
getPage().success(getString("person.imported", getModel()));
}
});

@ -6,6 +6,7 @@ import se.su.dsv.scipro.SciProTest;
import se.su.dsv.scipro.io.dto.Person;
import java.util.Collections;
import java.util.HashMap;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ -99,6 +100,6 @@ public class AdminImportUserPageTest extends SciProTest {
tester.clickLink(path("importCandidates", "0", "import"));
verify(importerTransactions).importStudent(person);
verify(importerTransactions).importStudent(person, new HashMap<>());
}
}