Merge branch 'dev' of https://gitlab.com/romanov73/ng-tracker into dev
This commit is contained in:
commit
50314246f5
@ -74,12 +74,9 @@ public class ConferenceController {
|
|||||||
|
|
||||||
@PostMapping(value = "/conference", params = "save")
|
@PostMapping(value = "/conference", params = "save")
|
||||||
public String save(@Valid ConferenceDto conferenceDto, Errors errors) throws IOException {
|
public String save(@Valid ConferenceDto conferenceDto, Errors errors) throws IOException {
|
||||||
conferenceService.filterEmptyDeadlines(conferenceDto);
|
if (!conferenceService.save(conferenceDto, errors)) {
|
||||||
conferenceService.checkEmptyFieldsOfDeadline(conferenceDto, errors);
|
|
||||||
if (errors.hasErrors()) {
|
|
||||||
return CONFERENCE_PAGE;
|
return CONFERENCE_PAGE;
|
||||||
}
|
}
|
||||||
conferenceService.save(conferenceDto);
|
|
||||||
return String.format(REDIRECT_TO, CONFERENCES_PAGE);
|
return String.format(REDIRECT_TO, CONFERENCES_PAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
import org.hibernate.validator.constraints.NotEmpty;
|
import org.hibernate.validator.constraints.NotEmpty;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
import ru.ulstu.deadline.model.Deadline;
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
|
import ru.ulstu.name.NameContainer;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
|
|
||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
@ -16,7 +17,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
||||||
|
|
||||||
public class ConferenceDto {
|
public class ConferenceDto extends NameContainer {
|
||||||
|
|
||||||
private final static String BEGIN_DATE = "Начало: ";
|
private final static String BEGIN_DATE = "Начало: ";
|
||||||
private final static String END_DATE = "Конец: ";
|
private final static String END_DATE = "Конец: ";
|
||||||
|
@ -5,12 +5,13 @@ import org.springframework.data.jpa.repository.Modifying;
|
|||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
import ru.ulstu.conference.model.Conference;
|
import ru.ulstu.conference.model.Conference;
|
||||||
|
import ru.ulstu.name.BaseRepository;
|
||||||
import ru.ulstu.user.model.User;
|
import ru.ulstu.user.model.User;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface ConferenceRepository extends JpaRepository<Conference, Integer> {
|
public interface ConferenceRepository extends JpaRepository<Conference, Integer>, BaseRepository {
|
||||||
@Query("SELECT c FROM Conference c LEFT JOIN c.users u WHERE (:user IS NULL OR u.user = :user) " +
|
@Query("SELECT c FROM Conference c LEFT JOIN c.users u WHERE (:user IS NULL OR u.user = :user) " +
|
||||||
"AND (YEAR(c.beginDate) = :year OR :year IS NULL) ORDER BY begin_date DESC")
|
"AND (YEAR(c.beginDate) = :year OR :year IS NULL) ORDER BY begin_date DESC")
|
||||||
List<Conference> findByUserAndYear(@Param("user") User user, @Param("year") Integer year);
|
List<Conference> findByUserAndYear(@Param("user") User user, @Param("year") Integer year);
|
||||||
@ -24,4 +25,8 @@ public interface ConferenceRepository extends JpaRepository<Conference, Integer>
|
|||||||
@Modifying
|
@Modifying
|
||||||
@Query("UPDATE Conference c SET c.ping = (c.ping + 1) WHERE c.id = :id")
|
@Query("UPDATE Conference c SET c.ping = (c.ping + 1) WHERE c.id = :id")
|
||||||
int updatePingConference(@Param("id") Integer id);
|
int updatePingConference(@Param("id") Integer id);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Query("SELECT title FROM Conference c WHERE (c.title = :name) AND (:id IS NULL OR c.id != :id) ")
|
||||||
|
String findByNameAndNotId(@Param("name") String name, @Param("id") Integer id);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ import ru.ulstu.conference.model.ConferenceUser;
|
|||||||
import ru.ulstu.conference.repository.ConferenceRepository;
|
import ru.ulstu.conference.repository.ConferenceRepository;
|
||||||
import ru.ulstu.deadline.model.Deadline;
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
import ru.ulstu.deadline.service.DeadlineService;
|
import ru.ulstu.deadline.service.DeadlineService;
|
||||||
|
import ru.ulstu.name.BaseService;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
import ru.ulstu.paper.service.PaperService;
|
import ru.ulstu.paper.service.PaperService;
|
||||||
import ru.ulstu.ping.service.PingService;
|
import ru.ulstu.ping.service.PingService;
|
||||||
@ -31,7 +32,7 @@ import static org.springframework.util.ObjectUtils.isEmpty;
|
|||||||
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ConferenceService {
|
public class ConferenceService extends BaseService {
|
||||||
private final static int MAX_DISPLAY_SIZE = 40;
|
private final static int MAX_DISPLAY_SIZE = 40;
|
||||||
|
|
||||||
private final ConferenceRepository conferenceRepository;
|
private final ConferenceRepository conferenceRepository;
|
||||||
@ -51,6 +52,7 @@ public class ConferenceService {
|
|||||||
PingService pingService,
|
PingService pingService,
|
||||||
ConferenceNotificationService conferenceNotificationService,
|
ConferenceNotificationService conferenceNotificationService,
|
||||||
EventService eventService) {
|
EventService eventService) {
|
||||||
|
this.baseRepository = conferenceRepository;
|
||||||
this.conferenceRepository = conferenceRepository;
|
this.conferenceRepository = conferenceRepository;
|
||||||
this.conferenceUserService = conferenceUserService;
|
this.conferenceUserService = conferenceUserService;
|
||||||
this.deadlineService = deadlineService;
|
this.deadlineService = deadlineService;
|
||||||
@ -89,12 +91,26 @@ public class ConferenceService {
|
|||||||
return new ConferenceDto(conferenceRepository.findOne(id));
|
return new ConferenceDto(conferenceRepository.findOne(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save(ConferenceDto conferenceDto) throws IOException {
|
public boolean save(ConferenceDto conferenceDto, Errors errors) throws IOException {
|
||||||
|
conferenceDto.setName(conferenceDto.getTitle());
|
||||||
|
filterEmptyDeadlines(conferenceDto);
|
||||||
|
checkEmptyFieldsOfDeadline(conferenceDto, errors);
|
||||||
|
checkUniqueName(conferenceDto,
|
||||||
|
errors,
|
||||||
|
conferenceDto.getId(),
|
||||||
|
"title",
|
||||||
|
"Конференция с таким именем уже существует");
|
||||||
|
if (errors.hasErrors()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (isEmpty(conferenceDto.getId())) {
|
if (isEmpty(conferenceDto.getId())) {
|
||||||
create(conferenceDto);
|
create(conferenceDto);
|
||||||
} else {
|
} else {
|
||||||
update(conferenceDto);
|
update(conferenceDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -127,6 +143,7 @@ public class ConferenceService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public void delete(Integer conferenceId) {
|
public void delete(Integer conferenceId) {
|
||||||
if (conferenceRepository.exists(conferenceId)) {
|
if (conferenceRepository.exists(conferenceId)) {
|
||||||
|
eventService.removeConferencesEvent(conferenceRepository.findOne(conferenceId));
|
||||||
conferenceRepository.delete(conferenceId);
|
conferenceRepository.delete(conferenceId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,7 +297,6 @@ public class ConferenceService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void filterEmptyDeadlines(ConferenceDto conferenceDto) {
|
public void filterEmptyDeadlines(ConferenceDto conferenceDto) {
|
||||||
conferenceDto.setDeadlines(conferenceDto.getDeadlines().stream()
|
conferenceDto.setDeadlines(conferenceDto.getDeadlines().stream()
|
||||||
.filter(dto -> dto.getDate() != null || !org.springframework.util.StringUtils.isEmpty(dto.getDescription()))
|
.filter(dto -> dto.getDate() != null || !org.springframework.util.StringUtils.isEmpty(dto.getDescription()))
|
||||||
|
@ -54,4 +54,10 @@ public class DateUtils {
|
|||||||
cal.add(Calendar.DAY_OF_MONTH, count);
|
cal.add(Calendar.DAY_OF_MONTH, count);
|
||||||
return cal.getTime();
|
return cal.getTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Date addYears(Date date, int count) {
|
||||||
|
Calendar cal = getCalendar(date);
|
||||||
|
cal.add(Calendar.YEAR, count);
|
||||||
|
return cal.getTime();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@ import ru.ulstu.deadline.model.Deadline;
|
|||||||
import ru.ulstu.grant.model.Grant;
|
import ru.ulstu.grant.model.Grant;
|
||||||
import ru.ulstu.grant.model.GrantDto;
|
import ru.ulstu.grant.model.GrantDto;
|
||||||
import ru.ulstu.grant.service.GrantService;
|
import ru.ulstu.grant.service.GrantService;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.PaperDto;
|
||||||
import ru.ulstu.user.model.User;
|
import ru.ulstu.user.model.User;
|
||||||
import springfox.documentation.annotations.ApiIgnore;
|
import springfox.documentation.annotations.ApiIgnore;
|
||||||
|
|
||||||
@ -104,7 +104,6 @@ public class GrantController {
|
|||||||
return GRANT_PAGE;
|
return GRANT_PAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(value = "/grant", params = "createProject")
|
@PostMapping(value = "/grant", params = "createProject")
|
||||||
public String createProject(@Valid GrantDto grantDto, Errors errors) throws IOException {
|
public String createProject(@Valid GrantDto grantDto, Errors errors) throws IOException {
|
||||||
if (errors.hasErrors()) {
|
if (errors.hasErrors()) {
|
||||||
@ -131,8 +130,8 @@ public class GrantController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ModelAttribute("allPapers")
|
@ModelAttribute("allPapers")
|
||||||
public List<Paper> getAllPapers() {
|
public List<PaperDto> getAllPapers() {
|
||||||
return grantService.getAllPapers();
|
return grantService.getAllUncompletedPapers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void filterEmptyDeadlines(GrantDto grantDto) {
|
private void filterEmptyDeadlines(GrantDto grantDto) {
|
||||||
|
@ -74,7 +74,6 @@ public class Grant extends BaseEntity implements UserContainer {
|
|||||||
@Fetch(FetchMode.SUBSELECT)
|
@Fetch(FetchMode.SUBSELECT)
|
||||||
private List<FileData> files = new ArrayList<>();
|
private List<FileData> files = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
@ManyToOne(cascade = CascadeType.ALL)
|
@ManyToOne(cascade = CascadeType.ALL)
|
||||||
@JoinColumn(name = "project_id")
|
@JoinColumn(name = "project_id")
|
||||||
private Project project;
|
private Project project;
|
||||||
|
@ -6,7 +6,7 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.hibernate.validator.constraints.NotEmpty;
|
import org.hibernate.validator.constraints.NotEmpty;
|
||||||
import ru.ulstu.deadline.model.Deadline;
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
import ru.ulstu.file.model.FileDataDto;
|
import ru.ulstu.file.model.FileDataDto;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.PaperDto;
|
||||||
import ru.ulstu.project.model.ProjectDto;
|
import ru.ulstu.project.model.ProjectDto;
|
||||||
import ru.ulstu.user.model.UserDto;
|
import ru.ulstu.user.model.UserDto;
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ public class GrantDto {
|
|||||||
private boolean hasBAKPapers;
|
private boolean hasBAKPapers;
|
||||||
private boolean hasScopusPapers;
|
private boolean hasScopusPapers;
|
||||||
private List<Integer> paperIds = new ArrayList<>();
|
private List<Integer> paperIds = new ArrayList<>();
|
||||||
private List<Paper> papers = new ArrayList<>();
|
private List<PaperDto> papers = new ArrayList<>();
|
||||||
private List<Integer> removedDeadlineIds = new ArrayList<>();
|
private List<Integer> removedDeadlineIds = new ArrayList<>();
|
||||||
|
|
||||||
public GrantDto() {
|
public GrantDto() {
|
||||||
@ -54,12 +54,12 @@ public class GrantDto {
|
|||||||
@JsonProperty("project") ProjectDto project,
|
@JsonProperty("project") ProjectDto project,
|
||||||
@JsonProperty("authorIds") Set<Integer> authorIds,
|
@JsonProperty("authorIds") Set<Integer> authorIds,
|
||||||
@JsonProperty("authors") Set<UserDto> authors,
|
@JsonProperty("authors") Set<UserDto> authors,
|
||||||
@JsonProperty("leader") Integer leaderId,
|
@JsonProperty("leaderId") Integer leaderId,
|
||||||
@JsonProperty("wasLeader") boolean wasLeader,
|
@JsonProperty("wasLeader") boolean wasLeader,
|
||||||
@JsonProperty("hasAge") boolean hasAge,
|
@JsonProperty("hasAge") boolean hasAge,
|
||||||
@JsonProperty("hasDegree") boolean hasDegree,
|
@JsonProperty("hasDegree") boolean hasDegree,
|
||||||
@JsonProperty("paperIds") List<Integer> paperIds,
|
@JsonProperty("paperIds") List<Integer> paperIds,
|
||||||
@JsonProperty("papers") List<Paper> papers) {
|
@JsonProperty("papers") List<PaperDto> papers) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
@ -92,7 +92,7 @@ public class GrantDto {
|
|||||||
this.hasAge = false;
|
this.hasAge = false;
|
||||||
this.hasDegree = false;
|
this.hasDegree = false;
|
||||||
this.paperIds = convert(grant.getPapers(), paper -> paper.getId());
|
this.paperIds = convert(grant.getPapers(), paper -> paper.getId());
|
||||||
this.papers = grant.getPapers();
|
this.papers = convert(grant.getPapers(), PaperDto::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
@ -214,11 +214,11 @@ public class GrantDto {
|
|||||||
this.paperIds = paperIds;
|
this.paperIds = paperIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Paper> getPapers() {
|
public List<PaperDto> getPapers() {
|
||||||
return papers;
|
return papers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPapers(List<Paper> papers) {
|
public void setPapers(List<PaperDto> papers) {
|
||||||
this.papers = papers;
|
this.papers = papers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,73 @@
|
|||||||
|
package ru.ulstu.grant.service;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.ulstu.core.util.DateUtils;
|
||||||
|
import ru.ulstu.grant.model.Grant;
|
||||||
|
import ru.ulstu.user.model.User;
|
||||||
|
import ru.ulstu.user.service.MailService;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class GrantNotificationService {
|
||||||
|
private final static int DAYS_TO_DEADLINE_NOTIFICATION = 7;
|
||||||
|
private final static String TEMPLATE_DEADLINE = "grantDeadlineNotification";
|
||||||
|
private final static String TEMPLATE_CREATE = "grantCreateNotification";
|
||||||
|
private final static String TEMPLATE_AUTHORS_CHANGED = "grantAuthorsChangeNotification";
|
||||||
|
private final static String TEMPLATE_LEADER_CHANGED = "grantLeaderChangeNotification";
|
||||||
|
|
||||||
|
private final static String TITLE_DEADLINE = "Приближается дедлайн гранта: %s";
|
||||||
|
private final static String TITLE_CREATE = "Создан грант: %s";
|
||||||
|
private final static String TITLE_AUTHORS_CHANGED = "Изменился состав рабочей группы гранта: %s";
|
||||||
|
private final static String TITLE_LEADER_CHANGED = "Изменился руководитель гранта: %s";
|
||||||
|
|
||||||
|
private final MailService mailService;
|
||||||
|
|
||||||
|
public GrantNotificationService(MailService mailService) {
|
||||||
|
this.mailService = mailService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendDeadlineNotifications(List<Grant> grants, boolean isDeadlineBeforeWeek) {
|
||||||
|
Date now = DateUtils.addDays(new Date(), DAYS_TO_DEADLINE_NOTIFICATION);
|
||||||
|
grants.stream()
|
||||||
|
.filter(grant -> needToSendDeadlineNotification(grant, now, isDeadlineBeforeWeek))
|
||||||
|
.forEach(grant -> sendMessageDeadline(grant));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean needToSendDeadlineNotification(Grant grant, Date compareDate, boolean isDeadlineBeforeWeek) {
|
||||||
|
return (grant.getNextDeadline().isPresent())
|
||||||
|
&& (compareDate.before(grant.getNextDeadline().get().getDate()) && isDeadlineBeforeWeek
|
||||||
|
|| compareDate.after(grant.getNextDeadline().get().getDate()) && !isDeadlineBeforeWeek)
|
||||||
|
&& grant.getNextDeadline().get().getDate().after(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendMessageDeadline(Grant grant) {
|
||||||
|
Map<String, Object> variables = ImmutableMap.of("grant", grant);
|
||||||
|
sendForAllAuthors(variables, grant, TEMPLATE_DEADLINE, String.format(TITLE_DEADLINE, grant.getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendCreateNotification(Grant grant) {
|
||||||
|
Map<String, Object> variables = ImmutableMap.of("grant", grant);
|
||||||
|
sendForAllAuthors(variables, grant, TEMPLATE_CREATE, String.format(TITLE_CREATE, grant.getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendAuthorsChangeNotification(Grant grant, Set<User> oldAuthors) {
|
||||||
|
Map<String, Object> variables = ImmutableMap.of("grant", grant, "oldAuthors", oldAuthors);
|
||||||
|
sendForAllAuthors(variables, grant, TEMPLATE_AUTHORS_CHANGED, String.format(TITLE_AUTHORS_CHANGED, grant.getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendLeaderChangeNotification(Grant grant, User oldLeader) {
|
||||||
|
Map<String, Object> variables = ImmutableMap.of("grant", grant, "oldLeader", oldLeader);
|
||||||
|
sendForAllAuthors(variables, grant, TEMPLATE_LEADER_CHANGED, String.format(TITLE_LEADER_CHANGED, grant.getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendForAllAuthors(Map<String, Object> variables, Grant grant, String template, String title) {
|
||||||
|
Set<User> allAuthors = grant.getAuthors();
|
||||||
|
allAuthors.forEach(author -> mailService.sendEmailFromTemplate(variables, author, template, title));
|
||||||
|
mailService.sendEmailFromTemplate(variables, grant.getLeader(), template, title);
|
||||||
|
}
|
||||||
|
}
|
30
src/main/java/ru/ulstu/grant/service/GrantScheduler.java
Normal file
30
src/main/java/ru/ulstu/grant/service/GrantScheduler.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package ru.ulstu.grant.service;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class GrantScheduler {
|
||||||
|
private final static boolean IS_DEADLINE_NOTIFICATION_BEFORE_WEEK = true;
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(GrantScheduler.class);
|
||||||
|
|
||||||
|
private final GrantNotificationService grantNotificationService;
|
||||||
|
private final GrantService grantService;
|
||||||
|
|
||||||
|
public GrantScheduler(GrantNotificationService grantNotificationService,
|
||||||
|
GrantService grantService) {
|
||||||
|
this.grantNotificationService = grantNotificationService;
|
||||||
|
this.grantService = grantService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 8 * * MON", zone = "Europe/Samara")
|
||||||
|
public void checkDeadlineBeforeWeek() {
|
||||||
|
log.debug("GrantScheduler.checkDeadlineBeforeWeek started");
|
||||||
|
grantNotificationService.sendDeadlineNotifications(grantService.findAll(), IS_DEADLINE_NOTIFICATION_BEFORE_WEEK);
|
||||||
|
log.debug("GrantScheduler.checkDeadlineBeforeWeek finished");
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@ import ru.ulstu.grant.model.Grant;
|
|||||||
import ru.ulstu.grant.model.GrantDto;
|
import ru.ulstu.grant.model.GrantDto;
|
||||||
import ru.ulstu.grant.repository.GrantRepository;
|
import ru.ulstu.grant.repository.GrantRepository;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
|
import ru.ulstu.paper.model.PaperDto;
|
||||||
import ru.ulstu.paper.service.PaperService;
|
import ru.ulstu.paper.service.PaperService;
|
||||||
import ru.ulstu.project.model.Project;
|
import ru.ulstu.project.model.Project;
|
||||||
import ru.ulstu.project.model.ProjectDto;
|
import ru.ulstu.project.model.ProjectDto;
|
||||||
@ -23,7 +24,9 @@ import java.io.IOException;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
import static org.springframework.util.ObjectUtils.isEmpty;
|
import static org.springframework.util.ObjectUtils.isEmpty;
|
||||||
@ -32,7 +35,7 @@ import static ru.ulstu.grant.model.Grant.GrantStatus.APPLICATION;
|
|||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class GrantService {
|
public class GrantService {
|
||||||
private final static int MAX_DISPLAY_SIZE = 40;
|
private final static int MAX_DISPLAY_SIZE = 50;
|
||||||
|
|
||||||
private final GrantRepository grantRepository;
|
private final GrantRepository grantRepository;
|
||||||
private final ProjectService projectService;
|
private final ProjectService projectService;
|
||||||
@ -41,6 +44,7 @@ public class GrantService {
|
|||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
private final PaperService paperService;
|
private final PaperService paperService;
|
||||||
private final EventService eventService;
|
private final EventService eventService;
|
||||||
|
private final GrantNotificationService grantNotificationService;
|
||||||
|
|
||||||
public GrantService(GrantRepository grantRepository,
|
public GrantService(GrantRepository grantRepository,
|
||||||
FileService fileService,
|
FileService fileService,
|
||||||
@ -48,7 +52,8 @@ public class GrantService {
|
|||||||
ProjectService projectService,
|
ProjectService projectService,
|
||||||
UserService userService,
|
UserService userService,
|
||||||
PaperService paperService,
|
PaperService paperService,
|
||||||
EventService eventService) {
|
EventService eventService,
|
||||||
|
GrantNotificationService grantNotificationService) {
|
||||||
this.grantRepository = grantRepository;
|
this.grantRepository = grantRepository;
|
||||||
this.fileService = fileService;
|
this.fileService = fileService;
|
||||||
this.deadlineService = deadlineService;
|
this.deadlineService = deadlineService;
|
||||||
@ -56,6 +61,7 @@ public class GrantService {
|
|||||||
this.userService = userService;
|
this.userService = userService;
|
||||||
this.paperService = paperService;
|
this.paperService = paperService;
|
||||||
this.eventService = eventService;
|
this.eventService = eventService;
|
||||||
|
this.grantNotificationService = grantNotificationService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Grant> findAll() {
|
public List<Grant> findAll() {
|
||||||
@ -77,6 +83,7 @@ public class GrantService {
|
|||||||
Grant newGrant = copyFromDto(new Grant(), grantDto);
|
Grant newGrant = copyFromDto(new Grant(), grantDto);
|
||||||
newGrant = grantRepository.save(newGrant);
|
newGrant = grantRepository.save(newGrant);
|
||||||
eventService.createFromGrant(newGrant);
|
eventService.createFromGrant(newGrant);
|
||||||
|
grantNotificationService.sendCreateNotification(newGrant);
|
||||||
return newGrant.getId();
|
return newGrant.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,6 +120,8 @@ public class GrantService {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public Integer update(GrantDto grantDto) throws IOException {
|
public Integer update(GrantDto grantDto) throws IOException {
|
||||||
Grant grant = grantRepository.findOne(grantDto.getId());
|
Grant grant = grantRepository.findOne(grantDto.getId());
|
||||||
|
Set<User> oldAuthors = new HashSet<>(grant.getAuthors());
|
||||||
|
User oldLeader = grant.getLeader();
|
||||||
for (FileDataDto file : grantDto.getFiles().stream()
|
for (FileDataDto file : grantDto.getFiles().stream()
|
||||||
.filter(f -> f.isDeleted() && f.getId() != null)
|
.filter(f -> f.isDeleted() && f.getId() != null)
|
||||||
.collect(toList())) {
|
.collect(toList())) {
|
||||||
@ -120,6 +129,20 @@ public class GrantService {
|
|||||||
}
|
}
|
||||||
grantDto.getRemovedDeadlineIds().forEach(deadlineService::remove);
|
grantDto.getRemovedDeadlineIds().forEach(deadlineService::remove);
|
||||||
grantRepository.save(copyFromDto(grant, grantDto));
|
grantRepository.save(copyFromDto(grant, grantDto));
|
||||||
|
|
||||||
|
grant.getAuthors().forEach(author -> {
|
||||||
|
if (!oldAuthors.contains(author)) {
|
||||||
|
grantNotificationService.sendAuthorsChangeNotification(grant, oldAuthors);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
oldAuthors.forEach(oldAuthor -> {
|
||||||
|
if (!grant.getAuthors().contains(oldAuthor)) {
|
||||||
|
grantNotificationService.sendAuthorsChangeNotification(grant, oldAuthors);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (grant.getLeader() != oldLeader) {
|
||||||
|
grantNotificationService.sendLeaderChangeNotification(grant, oldLeader);
|
||||||
|
}
|
||||||
eventService.updateGrantDeadlines(grant);
|
eventService.updateGrantDeadlines(grant);
|
||||||
return grant.getId();
|
return grant.getId();
|
||||||
}
|
}
|
||||||
@ -148,6 +171,7 @@ public class GrantService {
|
|||||||
grant = grantRepository.save(grant);
|
grant = grantRepository.save(grant);
|
||||||
|
|
||||||
eventService.createFromGrant(grant);
|
eventService.createFromGrant(grant);
|
||||||
|
grantNotificationService.sendCreateNotification(grant);
|
||||||
|
|
||||||
return grant;
|
return grant;
|
||||||
}
|
}
|
||||||
@ -187,13 +211,16 @@ public class GrantService {
|
|||||||
.collect(toList());
|
.collect(toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Paper> getGrantPapers(List<Integer> paperIds) {
|
public List<PaperDto> getGrantPapers(List<Integer> paperIds) {
|
||||||
return paperService.findAllSelect(paperIds);
|
return paperService.findAllSelect(paperIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Paper> getAllPapers() {
|
public List<PaperDto> getAllUncompletedPapers() {
|
||||||
return paperService.findAll();
|
List<PaperDto> papers = paperService.findAllNotCompleted();
|
||||||
|
papers.stream()
|
||||||
|
.forEach(paper ->
|
||||||
|
paper.setTitle(StringUtils.abbreviate(paper.getTitle(), MAX_DISPLAY_SIZE)));
|
||||||
|
return papers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attachPaper(GrantDto grantDto) {
|
public void attachPaper(GrantDto grantDto) {
|
||||||
@ -218,7 +245,6 @@ public class GrantService {
|
|||||||
.filter(paper -> paper.getAuthors() != null)
|
.filter(paper -> paper.getAuthors() != null)
|
||||||
.flatMap(paper -> paper.getAuthors().stream())
|
.flatMap(paper -> paper.getAuthors().stream())
|
||||||
.collect(toList());
|
.collect(toList());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<User> getBAKAuthors() {
|
private List<User> getBAKAuthors() {
|
||||||
|
7
src/main/java/ru/ulstu/name/BaseRepository.java
Normal file
7
src/main/java/ru/ulstu/name/BaseRepository.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package ru.ulstu.name;
|
||||||
|
|
||||||
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
|
public interface BaseRepository {
|
||||||
|
String findByNameAndNotId(@Param("name") String name, @Param("id") Integer id);
|
||||||
|
}
|
16
src/main/java/ru/ulstu/name/BaseService.java
Normal file
16
src/main/java/ru/ulstu/name/BaseService.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package ru.ulstu.name;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.Errors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public abstract class BaseService {
|
||||||
|
|
||||||
|
public BaseRepository baseRepository;
|
||||||
|
|
||||||
|
public void checkUniqueName(NameContainer nameContainer, Errors errors, Integer id, String checkField, String errorMessage) {
|
||||||
|
if (nameContainer.getName().equals(baseRepository.findByNameAndNotId(nameContainer.getName(), id))) {
|
||||||
|
errors.rejectValue(checkField, "errorCode", errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
src/main/java/ru/ulstu/name/NameContainer.java
Normal file
14
src/main/java/ru/ulstu/name/NameContainer.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package ru.ulstu.name;
|
||||||
|
|
||||||
|
public abstract class NameContainer {
|
||||||
|
|
||||||
|
private String name = "";
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
@ -3,10 +3,12 @@ package ru.ulstu.paper.model;
|
|||||||
import org.hibernate.annotations.Fetch;
|
import org.hibernate.annotations.Fetch;
|
||||||
import org.hibernate.annotations.FetchMode;
|
import org.hibernate.annotations.FetchMode;
|
||||||
import org.hibernate.validator.constraints.NotBlank;
|
import org.hibernate.validator.constraints.NotBlank;
|
||||||
|
import ru.ulstu.conference.model.Conference;
|
||||||
import ru.ulstu.core.model.BaseEntity;
|
import ru.ulstu.core.model.BaseEntity;
|
||||||
import ru.ulstu.core.model.UserContainer;
|
import ru.ulstu.core.model.UserContainer;
|
||||||
import ru.ulstu.deadline.model.Deadline;
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
import ru.ulstu.file.model.FileData;
|
import ru.ulstu.file.model.FileData;
|
||||||
|
import ru.ulstu.grant.model.Grant;
|
||||||
import ru.ulstu.timeline.model.Event;
|
import ru.ulstu.timeline.model.Event;
|
||||||
import ru.ulstu.user.model.User;
|
import ru.ulstu.user.model.User;
|
||||||
|
|
||||||
@ -114,6 +116,12 @@ public class Paper extends BaseEntity implements UserContainer {
|
|||||||
@Column(name = "latex_text")
|
@Column(name = "latex_text")
|
||||||
private String latexText;
|
private String latexText;
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy = "papers")
|
||||||
|
private List<Conference> conferences;
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy = "papers")
|
||||||
|
private List<Grant> grants;
|
||||||
|
|
||||||
public PaperStatus getStatus() {
|
public PaperStatus getStatus() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -218,6 +226,22 @@ public class Paper extends BaseEntity implements UserContainer {
|
|||||||
this.latexText = latexText;
|
this.latexText = latexText;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Conference> getConferences() {
|
||||||
|
return conferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConferences(List<Conference> conferences) {
|
||||||
|
this.conferences = conferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Grant> getGrants() {
|
||||||
|
return grants;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGrants(List<Grant> grants) {
|
||||||
|
this.grants = grants;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<User> getUsers() {
|
public Set<User> getUsers() {
|
||||||
return getAuthors();
|
return getAuthors();
|
||||||
|
@ -18,4 +18,10 @@ public interface PaperRepository extends JpaRepository<Paper, Integer> {
|
|||||||
List<Paper> findAllByIdIn(List<Integer> paperIds);
|
List<Paper> findAllByIdIn(List<Integer> paperIds);
|
||||||
|
|
||||||
List<Paper> findByTypeAndStatus(Paper.PaperType type, Paper.PaperStatus status);
|
List<Paper> findByTypeAndStatus(Paper.PaperType type, Paper.PaperStatus status);
|
||||||
|
|
||||||
|
List<Paper> findByStatusNot(Paper.PaperStatus status);
|
||||||
|
|
||||||
|
List<Paper> findByConferencesIsNullAndStatusNot(Paper.PaperStatus status);
|
||||||
|
|
||||||
|
List<Paper> findByIdNotInAndConferencesIsNullAndStatusNot(List<Integer> paperIds, Paper.PaperStatus status);
|
||||||
}
|
}
|
||||||
|
@ -242,15 +242,18 @@ public class PaperService {
|
|||||||
|
|
||||||
public List<Paper> findAllNotSelect(List<Integer> paperIds) {
|
public List<Paper> findAllNotSelect(List<Integer> paperIds) {
|
||||||
if (!paperIds.isEmpty()) {
|
if (!paperIds.isEmpty()) {
|
||||||
return sortPapers(paperRepository.findByIdNotIn(paperIds));
|
return sortPapers(paperRepository.findByIdNotInAndConferencesIsNullAndStatusNot(paperIds, COMPLETED));
|
||||||
} else {
|
} else {
|
||||||
return sortPapers(paperRepository.findAll());
|
return sortPapers(paperRepository.findByConferencesIsNullAndStatusNot(COMPLETED));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Paper> findAllSelect(List<Integer> paperIds) {
|
public List<PaperDto> findAllNotCompleted() {
|
||||||
return sortPapers(paperRepository.findAllByIdIn(paperIds));
|
return convert(paperRepository.findByStatusNot(COMPLETED), PaperDto::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PaperDto> findAllSelect(List<Integer> paperIds) {
|
||||||
|
return convert(paperRepository.findAllByIdIn(paperIds), PaperDto::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<User> getPaperAuthors() {
|
public List<User> getPaperAuthors() {
|
||||||
|
49
src/main/java/ru/ulstu/students/model/Scheduler.java
Normal file
49
src/main/java/ru/ulstu/students/model/Scheduler.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package ru.ulstu.students.model;
|
||||||
|
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
import ru.ulstu.core.model.BaseEntity;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.OneToOne;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import javax.persistence.Temporal;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "scheduler")
|
||||||
|
public class Scheduler extends BaseEntity {
|
||||||
|
|
||||||
|
@OneToOne(optional = false)
|
||||||
|
@JoinColumn(name = "task_id")
|
||||||
|
private Task task;
|
||||||
|
|
||||||
|
@Temporal(value = TemporalType.TIMESTAMP)
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||||
|
private Date date;
|
||||||
|
|
||||||
|
public Scheduler() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scheduler(Task task, Date date) {
|
||||||
|
this.task = task;
|
||||||
|
this.date = date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task getTask() {
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTask(Task task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getDate() {
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDate(Date date) {
|
||||||
|
this.date = date;
|
||||||
|
}
|
||||||
|
}
|
@ -67,6 +67,7 @@ public class Task extends BaseEntity {
|
|||||||
private Date updateDate = new Date();
|
private Date updateDate = new Date();
|
||||||
|
|
||||||
@ManyToMany(fetch = FetchType.EAGER)
|
@ManyToMany(fetch = FetchType.EAGER)
|
||||||
|
@Fetch(FetchMode.SUBSELECT)
|
||||||
@JoinTable(name = "task_tags",
|
@JoinTable(name = "task_tags",
|
||||||
joinColumns = {@JoinColumn(name = "task_id")},
|
joinColumns = {@JoinColumn(name = "task_id")},
|
||||||
inverseJoinColumns = {@JoinColumn(name = "tag_id")})
|
inverseJoinColumns = {@JoinColumn(name = "tag_id")})
|
||||||
@ -127,4 +128,5 @@ public class Task extends BaseEntity {
|
|||||||
public void setTags(List<Tag> tags) {
|
public void setTags(List<Tag> tags) {
|
||||||
this.tags = tags;
|
this.tags = tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package ru.ulstu.students.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import ru.ulstu.students.model.Scheduler;
|
||||||
|
import ru.ulstu.students.model.Task;
|
||||||
|
|
||||||
|
public interface SchedulerRepository extends JpaRepository<Scheduler, Integer> {
|
||||||
|
|
||||||
|
Scheduler findOneByTask(Task task);
|
||||||
|
|
||||||
|
}
|
@ -6,6 +6,7 @@ import org.springframework.data.repository.query.Param;
|
|||||||
import ru.ulstu.students.model.Task;
|
import ru.ulstu.students.model.Task;
|
||||||
import ru.ulstu.tags.model.Tag;
|
import ru.ulstu.tags.model.Tag;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface TaskRepository extends JpaRepository<Task, Integer> {
|
public interface TaskRepository extends JpaRepository<Task, Integer> {
|
||||||
@ -15,4 +16,12 @@ public interface TaskRepository extends JpaRepository<Task, Integer> {
|
|||||||
|
|
||||||
@Query("SELECT t FROM Task t WHERE (t.status = :status OR :status IS NULL) AND (:tag IS NULL OR :tag MEMBER OF t.tags) ORDER BY create_date ASC")
|
@Query("SELECT t FROM Task t WHERE (t.status = :status OR :status IS NULL) AND (:tag IS NULL OR :tag MEMBER OF t.tags) ORDER BY create_date ASC")
|
||||||
List<Task> filterOld(@Param("status") Task.TaskStatus status, @Param("tag") Tag tag);
|
List<Task> filterOld(@Param("status") Task.TaskStatus status, @Param("tag") Tag tag);
|
||||||
|
|
||||||
|
@Query("SELECT t FROM Task t WHERE(:tag IS NULL OR :tag MEMBER OF t.tags) ORDER BY create_date DESC")
|
||||||
|
List<Task> findByTag(@Param("tag") Tag tag);
|
||||||
|
|
||||||
|
@Query("SELECT t FROM Task t WHERE (t.createDate >= :date) ORDER BY create_date DESC")
|
||||||
|
List<Task> findAllYear(@Param("date") Date date);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
116
src/main/java/ru/ulstu/students/service/SchedulerService.java
Normal file
116
src/main/java/ru/ulstu/students/service/SchedulerService.java
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
package ru.ulstu.students.service;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import ru.ulstu.students.model.Scheduler;
|
||||||
|
import ru.ulstu.students.model.Task;
|
||||||
|
import ru.ulstu.students.repository.SchedulerRepository;
|
||||||
|
import ru.ulstu.tags.model.Tag;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SchedulerService {
|
||||||
|
|
||||||
|
private final TaskService taskService;
|
||||||
|
private final SchedulerRepository schedulerRepository;
|
||||||
|
|
||||||
|
public SchedulerService(TaskService taskService, SchedulerRepository schedulerRepository) {
|
||||||
|
this.taskService = taskService;
|
||||||
|
this.schedulerRepository = schedulerRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void save(Tag tag) {
|
||||||
|
List<Task> taskList = taskService.findTasksByTag(tag);
|
||||||
|
create(taskList.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
private Scheduler create(Task task) {
|
||||||
|
Scheduler scheduler = new Scheduler(task, task.getDeadlines().get(task.getDeadlines().size() - 1).getDate());
|
||||||
|
return schedulerRepository.save(scheduler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
private void delete(Integer schedulerId) {
|
||||||
|
if (schedulerRepository.exists(schedulerId)) {
|
||||||
|
schedulerRepository.delete(schedulerId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkPlanToday() {
|
||||||
|
List<Scheduler> schedulerList = schedulerRepository.findAll();
|
||||||
|
if (!schedulerList.isEmpty()) {
|
||||||
|
doTodayPlanIfNeed(schedulerList);
|
||||||
|
schedulerList = schedulerRepository.findAll();
|
||||||
|
}
|
||||||
|
checkNewPlan(schedulerList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkNewPlan(List<Scheduler> schedulerList) {
|
||||||
|
Set<Tag> tags = taskService.checkRepeatingTags(true);
|
||||||
|
Set<Tag> newTags = null;
|
||||||
|
if (!schedulerList.isEmpty()) {
|
||||||
|
newTags = checkNewTags(tags, schedulerList);
|
||||||
|
} else {
|
||||||
|
if (!tags.isEmpty()) {
|
||||||
|
newTags = tags;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newTags != null) {
|
||||||
|
newTags.forEach(tag -> {
|
||||||
|
if (!hasNewTag(tag, schedulerList)) {
|
||||||
|
save(tag);
|
||||||
|
Task task = taskService.findTasksByTag(tag).get(0);
|
||||||
|
schedulerList.add(new Scheduler(task, task.getDeadlines().get(task.getDeadlines().size() - 1).getDate()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasNewTag(Tag tag, List<Scheduler> schedulerList) {
|
||||||
|
|
||||||
|
return schedulerList
|
||||||
|
.stream()
|
||||||
|
.anyMatch(scheduler -> scheduler.getTask().getTags().contains(tag));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Set<Tag> checkNewTags(Set<Tag> tags, List<Scheduler> schedulerList) {
|
||||||
|
Set<Tag> newTags = tags
|
||||||
|
.stream()
|
||||||
|
.filter(tag -> schedulerList
|
||||||
|
.stream()
|
||||||
|
.anyMatch(scheduler ->
|
||||||
|
!scheduler.getTask().getTags().contains(tag)))
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
if (!newTags.isEmpty()) {
|
||||||
|
return newTags;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doTodayPlanIfNeed(List<Scheduler> schedulerList) {
|
||||||
|
List<Scheduler> plan = schedulerList
|
||||||
|
.stream()
|
||||||
|
.filter(scheduler -> scheduler.getDate().before(new Date()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
doToday(plan);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doToday(List<Scheduler> plan) {
|
||||||
|
plan.forEach(scheduler -> {
|
||||||
|
taskService.createPeriodTask(scheduler);
|
||||||
|
delete(scheduler.getId());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package ru.ulstu.students.service;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class TaskGenerationService {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(TaskGenerationService.class);
|
||||||
|
private final TaskService taskService;
|
||||||
|
private final SchedulerService schedulerService;
|
||||||
|
|
||||||
|
public TaskGenerationService(TaskService taskService, SchedulerService schedulerService) {
|
||||||
|
|
||||||
|
this.taskService = taskService;
|
||||||
|
this.schedulerService = schedulerService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 0 * * ?", zone = "Europe/Samara")
|
||||||
|
public void generateTasks() {
|
||||||
|
log.debug("SchedulerService.checkPlanToday started");
|
||||||
|
schedulerService.checkPlanToday();
|
||||||
|
log.debug("SchedulerService.checkPlanToday finished");
|
||||||
|
|
||||||
|
log.debug("TaskService.generateYearTasks started");
|
||||||
|
taskService.generateYearTasks();
|
||||||
|
log.debug("TaskService.generateYearTasks finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,18 +4,29 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import ru.ulstu.core.util.DateUtils;
|
||||||
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
import ru.ulstu.deadline.service.DeadlineService;
|
import ru.ulstu.deadline.service.DeadlineService;
|
||||||
|
import ru.ulstu.students.model.Scheduler;
|
||||||
import ru.ulstu.students.model.Task;
|
import ru.ulstu.students.model.Task;
|
||||||
import ru.ulstu.students.model.TaskDto;
|
import ru.ulstu.students.model.TaskDto;
|
||||||
import ru.ulstu.students.model.TaskFilterDto;
|
import ru.ulstu.students.model.TaskFilterDto;
|
||||||
|
import ru.ulstu.students.repository.SchedulerRepository;
|
||||||
import ru.ulstu.students.repository.TaskRepository;
|
import ru.ulstu.students.repository.TaskRepository;
|
||||||
import ru.ulstu.tags.model.Tag;
|
import ru.ulstu.tags.model.Tag;
|
||||||
import ru.ulstu.tags.service.TagService;
|
import ru.ulstu.tags.service.TagService;
|
||||||
|
import ru.ulstu.timeline.service.EventService;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.springframework.util.ObjectUtils.isEmpty;
|
import static org.springframework.util.ObjectUtils.isEmpty;
|
||||||
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
import static ru.ulstu.core.util.StreamApiUtils.convert;
|
||||||
@ -27,14 +38,19 @@ public class TaskService {
|
|||||||
private final static int MAX_DISPLAY_SIZE = 40;
|
private final static int MAX_DISPLAY_SIZE = 40;
|
||||||
|
|
||||||
private final TaskRepository taskRepository;
|
private final TaskRepository taskRepository;
|
||||||
|
private final SchedulerRepository schedulerRepository;
|
||||||
private final DeadlineService deadlineService;
|
private final DeadlineService deadlineService;
|
||||||
private final TagService tagService;
|
private final TagService tagService;
|
||||||
|
private final EventService eventService;
|
||||||
|
|
||||||
|
|
||||||
public TaskService(TaskRepository taskRepository,
|
public TaskService(TaskRepository taskRepository,
|
||||||
DeadlineService deadlineService, TagService tagService) {
|
DeadlineService deadlineService, TagService tagService, SchedulerRepository schedulerRepository, EventService eventService) {
|
||||||
this.taskRepository = taskRepository;
|
this.taskRepository = taskRepository;
|
||||||
this.deadlineService = deadlineService;
|
this.deadlineService = deadlineService;
|
||||||
this.tagService = tagService;
|
this.tagService = tagService;
|
||||||
|
this.eventService = eventService;
|
||||||
|
this.schedulerRepository = schedulerRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Task> findAll() {
|
public List<Task> findAll() {
|
||||||
@ -67,6 +83,7 @@ public class TaskService {
|
|||||||
public Integer create(TaskDto taskDto) throws IOException {
|
public Integer create(TaskDto taskDto) throws IOException {
|
||||||
Task newTask = copyFromDto(new Task(), taskDto);
|
Task newTask = copyFromDto(new Task(), taskDto);
|
||||||
newTask = taskRepository.save(newTask);
|
newTask = taskRepository.save(newTask);
|
||||||
|
eventService.createFromTask(newTask);
|
||||||
return newTask.getId();
|
return newTask.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,12 +103,18 @@ public class TaskService {
|
|||||||
public Integer update(TaskDto taskDto) throws IOException {
|
public Integer update(TaskDto taskDto) throws IOException {
|
||||||
Task task = taskRepository.findOne(taskDto.getId());
|
Task task = taskRepository.findOne(taskDto.getId());
|
||||||
taskRepository.save(copyFromDto(task, taskDto));
|
taskRepository.save(copyFromDto(task, taskDto));
|
||||||
|
eventService.updateTaskDeadlines(task);
|
||||||
return task.getId();
|
return task.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void delete(Integer taskId) throws IOException {
|
public void delete(Integer taskId) throws IOException {
|
||||||
if (taskRepository.exists(taskId)) {
|
if (taskRepository.exists(taskId)) {
|
||||||
|
Task scheduleTask = taskRepository.findOne(taskId);
|
||||||
|
Scheduler sch = schedulerRepository.findOneByTask(scheduleTask);
|
||||||
|
if (sch != null) {
|
||||||
|
schedulerRepository.delete(sch.getId());
|
||||||
|
}
|
||||||
taskRepository.delete(taskId);
|
taskRepository.delete(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +128,110 @@ public class TaskService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void copyMainPart(Task newTask, Task task) {
|
||||||
|
newTask.setTitle(task.getTitle());
|
||||||
|
newTask.setTags(tagService.saveOrCreate(task.getTags()));
|
||||||
|
newTask.setCreateDate(new Date());
|
||||||
|
newTask.setStatus(Task.TaskStatus.LOADED_FROM_KIAS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task copyTaskWithNewDates(Task task) {
|
||||||
|
Task newTask = new Task();
|
||||||
|
copyMainPart(newTask, task);
|
||||||
|
Calendar cal1 = DateUtils.getCalendar(newTask.getCreateDate());
|
||||||
|
Calendar cal2 = DateUtils.getCalendar(task.getCreateDate());
|
||||||
|
Integer interval = cal1.get(Calendar.DAY_OF_YEAR) - cal2.get(Calendar.DAY_OF_YEAR);
|
||||||
|
newTask.setDeadlines(newDatesDeadlines(task.getDeadlines(), interval));
|
||||||
|
return newTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Deadline> newDatesDeadlines(List<Deadline> deadlines, Integer interval) {
|
||||||
|
return deadlines
|
||||||
|
.stream()
|
||||||
|
.map(deadline -> {
|
||||||
|
Deadline newDeadline = new Deadline();
|
||||||
|
Date newDate = DateUtils.addDays(deadline.getDate(), interval);
|
||||||
|
newDeadline.setDescription(deadline.getDescription());
|
||||||
|
newDeadline.setDate(newDate);
|
||||||
|
return deadlineService.create(newDeadline);
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task copyTaskWithNewYear(Task task) {
|
||||||
|
Task newTask = new Task();
|
||||||
|
copyMainPart(newTask, task);
|
||||||
|
newTask.setDeadlines(newYearDeadlines(task.getDeadlines()));
|
||||||
|
return newTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Deadline> newYearDeadlines(List<Deadline> deadlines) {
|
||||||
|
return deadlines
|
||||||
|
.stream()
|
||||||
|
.map(deadline -> {
|
||||||
|
Deadline newDeadline = new Deadline();
|
||||||
|
newDeadline.setDescription(deadline.getDescription());
|
||||||
|
newDeadline.setDate(DateUtils.addYears(deadline.getDate(), 1));
|
||||||
|
return deadlineService.create(newDeadline);
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean equalsDate(Task task) {
|
||||||
|
Calendar taskDate = DateUtils.getCalendar(task.getCreateDate());
|
||||||
|
Calendar nowDate = DateUtils.getCalendar(new Date());
|
||||||
|
return (taskDate.get(Calendar.DAY_OF_MONTH) == nowDate.get(Calendar.DAY_OF_MONTH) &&
|
||||||
|
taskDate.get(Calendar.MONTH) + 1 == nowDate.get(Calendar.MONTH) + 1 &&
|
||||||
|
taskDate.get(Calendar.YEAR) + 1 == nowDate.get(Calendar.YEAR));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void generateYearTasks() {
|
||||||
|
Set<Tag> tags = checkRepeatingTags(false);
|
||||||
|
List<Task> tasks = new ArrayList<>();
|
||||||
|
tags.forEach(tag -> {
|
||||||
|
Task singleTask = findTasksByTag(tag).get(0);
|
||||||
|
if (equalsDate(singleTask)) {
|
||||||
|
if (!tasks.contains(singleTask)) {
|
||||||
|
tasks.add(singleTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (tasks != null) {
|
||||||
|
tasks.forEach(task -> {
|
||||||
|
Task newTask = copyTaskWithNewYear(task);
|
||||||
|
taskRepository.save(newTask);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public Set<Tag> checkRepeatingTags(Boolean createPeriodTask) { //param: false = year task; true = period task
|
||||||
|
Map<Tag, Long> tagsCount = new TreeMap<>();
|
||||||
|
List<Tag> tags = tagService.getTags();
|
||||||
|
List<Task> tasks = taskRepository.findAllYear(DateUtils.clearTime(DateUtils.addYears(new Date(), -1)));
|
||||||
|
tags.forEach(tag ->
|
||||||
|
tagsCount.put(tag, tasks
|
||||||
|
.stream()
|
||||||
|
.filter(task -> task.getTags().contains(tag))
|
||||||
|
.count()));
|
||||||
|
if (!createPeriodTask) {
|
||||||
|
return tagsCount
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.filter(tagLongEntry -> tagLongEntry.getValue() == 1)
|
||||||
|
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
|
||||||
|
.keySet();
|
||||||
|
} else {
|
||||||
|
return tagsCount
|
||||||
|
.entrySet()
|
||||||
|
.stream()
|
||||||
|
.filter(tagLongEntry -> tagLongEntry.getValue() >= 2)
|
||||||
|
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))
|
||||||
|
.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public List<Task.TaskStatus> getTaskStatuses() {
|
public List<Task.TaskStatus> getTaskStatuses() {
|
||||||
return Arrays.asList(Task.TaskStatus.values());
|
return Arrays.asList(Task.TaskStatus.values());
|
||||||
}
|
}
|
||||||
@ -113,4 +240,13 @@ public class TaskService {
|
|||||||
return tagService.getTags();
|
return tagService.getTags();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Task> findTasksByTag(Tag tag) {
|
||||||
|
return taskRepository.findByTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void createPeriodTask(Scheduler scheduler) {
|
||||||
|
Task newTask = copyTaskWithNewDates(scheduler.getTask());
|
||||||
|
taskRepository.save(newTask);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import javax.persistence.Column;
|
|||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
import javax.validation.constraints.Size;
|
import javax.validation.constraints.Size;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "tag")
|
@Table(name = "tag")
|
||||||
@ -41,4 +42,21 @@ public class Tag extends BaseEntity {
|
|||||||
public void setTagName(String tagName) {
|
public void setTagName(String tagName) {
|
||||||
this.tagName = tagName;
|
this.tagName = tagName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Tag tag = (Tag) o;
|
||||||
|
return tagName.equals(tag.tagName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(super.hashCode(), tagName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import ru.ulstu.conference.model.Conference;
|
|||||||
import ru.ulstu.core.model.BaseEntity;
|
import ru.ulstu.core.model.BaseEntity;
|
||||||
import ru.ulstu.grant.model.Grant;
|
import ru.ulstu.grant.model.Grant;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
|
import ru.ulstu.students.model.Task;
|
||||||
import ru.ulstu.user.model.User;
|
import ru.ulstu.user.model.User;
|
||||||
|
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
@ -87,6 +88,10 @@ public class Event extends BaseEntity {
|
|||||||
@JoinColumn(name = "grant_id")
|
@JoinColumn(name = "grant_id")
|
||||||
private Grant grant;
|
private Grant grant;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "task_id")
|
||||||
|
private Task task;
|
||||||
|
|
||||||
public String getTitle() {
|
public String getTitle() {
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
@ -190,4 +195,12 @@ public class Event extends BaseEntity {
|
|||||||
public void setGrant(Grant grant) {
|
public void setGrant(Grant grant) {
|
||||||
this.grant = grant;
|
this.grant = grant;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task getTask() {
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTask(Task task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import org.hibernate.validator.constraints.NotBlank;
|
|||||||
import ru.ulstu.conference.model.ConferenceDto;
|
import ru.ulstu.conference.model.ConferenceDto;
|
||||||
import ru.ulstu.grant.model.GrantDto;
|
import ru.ulstu.grant.model.GrantDto;
|
||||||
import ru.ulstu.paper.model.PaperDto;
|
import ru.ulstu.paper.model.PaperDto;
|
||||||
|
import ru.ulstu.students.model.TaskDto;
|
||||||
import ru.ulstu.user.model.UserDto;
|
import ru.ulstu.user.model.UserDto;
|
||||||
|
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
@ -29,6 +30,7 @@ public class EventDto {
|
|||||||
private PaperDto paperDto;
|
private PaperDto paperDto;
|
||||||
private ConferenceDto conferenceDto;
|
private ConferenceDto conferenceDto;
|
||||||
private GrantDto grantDto;
|
private GrantDto grantDto;
|
||||||
|
private TaskDto taskDto;
|
||||||
|
|
||||||
@JsonCreator
|
@JsonCreator
|
||||||
public EventDto(@JsonProperty("id") Integer id,
|
public EventDto(@JsonProperty("id") Integer id,
|
||||||
@ -42,7 +44,8 @@ public class EventDto {
|
|||||||
@JsonProperty("paperDto") PaperDto paperDto,
|
@JsonProperty("paperDto") PaperDto paperDto,
|
||||||
@JsonProperty("recipients") List<UserDto> recipients,
|
@JsonProperty("recipients") List<UserDto> recipients,
|
||||||
@JsonProperty("conferenceDto") ConferenceDto conferenceDto,
|
@JsonProperty("conferenceDto") ConferenceDto conferenceDto,
|
||||||
@JsonProperty("grantDto") GrantDto grantDto) {
|
@JsonProperty("grantDto") GrantDto grantDto,
|
||||||
|
@JsonProperty("taskDto") TaskDto taskDto) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.period = period;
|
this.period = period;
|
||||||
@ -55,6 +58,7 @@ public class EventDto {
|
|||||||
this.paperDto = paperDto;
|
this.paperDto = paperDto;
|
||||||
this.conferenceDto = conferenceDto;
|
this.conferenceDto = conferenceDto;
|
||||||
this.grantDto = grantDto;
|
this.grantDto = grantDto;
|
||||||
|
this.taskDto = taskDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EventDto(Event event) {
|
public EventDto(Event event) {
|
||||||
@ -76,6 +80,9 @@ public class EventDto {
|
|||||||
if (grantDto != null) {
|
if (grantDto != null) {
|
||||||
this.grantDto = new GrantDto(event.getGrant());
|
this.grantDto = new GrantDto(event.getGrant());
|
||||||
}
|
}
|
||||||
|
if (taskDto != null) {
|
||||||
|
this.taskDto = new TaskDto(event.getTask());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
@ -137,4 +144,12 @@ public class EventDto {
|
|||||||
public void setGrantDto(GrantDto grantDto) {
|
public void setGrantDto(GrantDto grantDto) {
|
||||||
this.grantDto = grantDto;
|
this.grantDto = grantDto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TaskDto getTaskDto() {
|
||||||
|
return taskDto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTaskDto(TaskDto taskDto) {
|
||||||
|
this.taskDto = taskDto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.Query;
|
|||||||
import ru.ulstu.conference.model.Conference;
|
import ru.ulstu.conference.model.Conference;
|
||||||
import ru.ulstu.grant.model.Grant;
|
import ru.ulstu.grant.model.Grant;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
|
import ru.ulstu.students.model.Task;
|
||||||
import ru.ulstu.timeline.model.Event;
|
import ru.ulstu.timeline.model.Event;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -21,4 +22,6 @@ public interface EventRepository extends JpaRepository<Event, Integer> {
|
|||||||
List<Event> findAllByConference(Conference conference);
|
List<Event> findAllByConference(Conference conference);
|
||||||
|
|
||||||
List<Event> findAllByGrant(Grant grant);
|
List<Event> findAllByGrant(Grant grant);
|
||||||
|
|
||||||
|
List<Event> findAllByTask(Task task);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import ru.ulstu.conference.model.Conference;
|
|||||||
import ru.ulstu.deadline.model.Deadline;
|
import ru.ulstu.deadline.model.Deadline;
|
||||||
import ru.ulstu.grant.model.Grant;
|
import ru.ulstu.grant.model.Grant;
|
||||||
import ru.ulstu.paper.model.Paper;
|
import ru.ulstu.paper.model.Paper;
|
||||||
|
import ru.ulstu.students.model.Task;
|
||||||
import ru.ulstu.timeline.model.Event;
|
import ru.ulstu.timeline.model.Event;
|
||||||
import ru.ulstu.timeline.model.EventDto;
|
import ru.ulstu.timeline.model.EventDto;
|
||||||
import ru.ulstu.timeline.model.Timeline;
|
import ru.ulstu.timeline.model.Timeline;
|
||||||
@ -203,4 +204,38 @@ public class EventService {
|
|||||||
eventRepository.delete(eventRepository.findAllByGrant(grant));
|
eventRepository.delete(eventRepository.findAllByGrant(grant));
|
||||||
createFromGrant(grant);
|
createFromGrant(grant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeConferencesEvent(Conference conference) {
|
||||||
|
List<Event> eventList = eventRepository.findAllByConference(conference);
|
||||||
|
eventList.forEach(event -> eventRepository.delete(event.getId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createFromTask(Task newTask) {
|
||||||
|
List<Timeline> timelines = timelineService.findAll();
|
||||||
|
Timeline timeline = timelines.isEmpty() ? new Timeline() : timelines.get(0);
|
||||||
|
|
||||||
|
for (Deadline deadline : newTask.getDeadlines()
|
||||||
|
.stream()
|
||||||
|
.filter(d -> d.getDate().after(new Date()) || DateUtils.isSameDay(d.getDate(), new Date()))
|
||||||
|
.collect(Collectors.toList())) {
|
||||||
|
Event newEvent = new Event();
|
||||||
|
newEvent.setTitle("Дедлайн задачи");
|
||||||
|
newEvent.setStatus(Event.EventStatus.NEW);
|
||||||
|
newEvent.setExecuteDate(deadline.getDate());
|
||||||
|
newEvent.setCreateDate(new Date());
|
||||||
|
newEvent.setUpdateDate(new Date());
|
||||||
|
newEvent.setDescription("Дедлайн '" + deadline.getDescription() + "' задачи '" + newTask.getTitle() + "'");
|
||||||
|
newEvent.getRecipients().add(userService.getCurrentUser());
|
||||||
|
newEvent.setTask(newTask);
|
||||||
|
eventRepository.save(newEvent);
|
||||||
|
|
||||||
|
timeline.getEvents().add(newEvent);
|
||||||
|
timelineService.save(timeline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTaskDeadlines(Task task) {
|
||||||
|
eventRepository.delete(eventRepository.findAllByTask(task));
|
||||||
|
createFromTask(task);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
|
||||||
<changeSet author="tanya" id="20190505_000000-1">
|
<changeSet author="tanya" id="20190505_000000-1">
|
||||||
<addColumn tableName="event">
|
<addColumn tableName="event">
|
||||||
<column name="grant_id" type="integer"/>
|
<column name="grant_id" type="integer"/>
|
||||||
|
25
src/main/resources/db/changelog-20190505_000001-schema.xml
Normal file
25
src/main/resources/db/changelog-20190505_000001-schema.xml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
|
||||||
|
<changeSet author="nastya" id="20190505_000001-1">
|
||||||
|
<createTable tableName="scheduler">
|
||||||
|
<column name="id" type="integer">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="task_id" type="integer">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="date" type="timestamp">
|
||||||
|
<constraints nullable="false"/>
|
||||||
|
</column>
|
||||||
|
<column name="version" type="integer"/>
|
||||||
|
</createTable>
|
||||||
|
<addPrimaryKey columnNames="id" constraintName="pk_scheduler" tableName="scheduler"/>
|
||||||
|
<addForeignKeyConstraint baseTableName="scheduler" baseColumnNames="task_id"
|
||||||
|
constraintName="fk_scheduler_task_id" referencedTableName="task"
|
||||||
|
referencedColumnNames="id"/>
|
||||||
|
</changeSet>
|
||||||
|
|
||||||
|
</databaseChangeLog>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
<changeSet author="tanya" id="20190507_000000-1">
|
||||||
|
<dropColumn columnName="deadline_date" tableName="grants"/>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
14
src/main/resources/db/changelog-20190507_000001-schema.xml
Normal file
14
src/main/resources/db/changelog-20190507_000001-schema.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
<changeSet author="tanya" id="20190507_000001-1">
|
||||||
|
<sql>
|
||||||
|
update grants
|
||||||
|
set leader_id =
|
||||||
|
(select u.id
|
||||||
|
from users u
|
||||||
|
where u.last_name = 'Романов' AND u.first_name = 'Антон');
|
||||||
|
</sql>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
13
src/main/resources/db/changelog-20190511_000000-schema.xml
Normal file
13
src/main/resources/db/changelog-20190511_000000-schema.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||||
|
<changeSet author="nastya" id="20190511_000000-1">
|
||||||
|
<addColumn tableName="event">
|
||||||
|
<column name="task_id" type="integer"></column>
|
||||||
|
</addColumn>
|
||||||
|
<addForeignKeyConstraint baseTableName="event" baseColumnNames="task_id"
|
||||||
|
constraintName="fk_event_task_id" referencedTableName="task"
|
||||||
|
referencedColumnNames="id"/>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
@ -38,4 +38,8 @@
|
|||||||
<include file="db/changelog-20190428_000000-schema.xml"/>
|
<include file="db/changelog-20190428_000000-schema.xml"/>
|
||||||
<include file="db/changelog-20190430_000000-schema.xml"/>
|
<include file="db/changelog-20190430_000000-schema.xml"/>
|
||||||
<include file="db/changelog-20190505_000000-schema.xml"/>
|
<include file="db/changelog-20190505_000000-schema.xml"/>
|
||||||
|
<include file="db/changelog-20190505_000001-schema.xml"/>
|
||||||
|
<include file="db/changelog-20190507_000000-schema.xml"/>
|
||||||
|
<include file="db/changelog-20190507_000001-schema.xml"/>
|
||||||
|
<include file="db/changelog-20190511_000000-schema.xml"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
@ -0,0 +1,24 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Уведомление об изменении состава рабочей группы</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
<link rel="shortcut icon" th:href="@{|${baseUrl}/favicon.ico|}"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Состав рабочей группы гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||||
|
th:text="${grant.title}">Title</span></a>" сменился с
|
||||||
|
" <span th:each="author : ${oldAuthors}" th:text="${author.lastName + ' '}">oldAuthors</span>"
|
||||||
|
на " <span th:each="author : ${grant.authors}" th:text="${author.lastName + ' '}">newAuthors</span>".
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Regards,
|
||||||
|
<br/>
|
||||||
|
<em>NG-tracker.</em>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Уведомление о создании гранта</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
<link rel="shortcut icon" th:href="@{|${baseUrl}/favicon.ico|}"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Был добавлен новый грант: "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}">
|
||||||
|
<span th:text="${grant.title}">Title</span></a>".
|
||||||
|
<br/>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Руководитель гранта:
|
||||||
|
<span th:text="${grant.leader.firstName}"></span>
|
||||||
|
<span th:text="${grant.leader.lastName}">Leader</span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Regards,
|
||||||
|
<br/>
|
||||||
|
<em>NG-tracker.</em>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Уведомление о дедлайне гранта</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
<link rel="shortcut icon" th:href="@{|${baseUrl}/favicon.ico|}"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Приближается дедлайн гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||||
|
th:text="${grant.title}">Title</span></a>".
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Срок исполнения: <b><span th:text="${#dates.format(grant.nextDeadline.get().date, 'dd.MM.yyyy')}">Date</span></b>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Примечание: <b><span th:text="${grant.nextDeadline.get().description}">Description</span></b>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Regards,
|
||||||
|
<br/>
|
||||||
|
<em>NG-tracker.</em>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,24 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Уведомление об изменении руководителя гранта</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
||||||
|
<link rel="shortcut icon" th:href="@{|${baseUrl}/favicon.ico|}"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Уважаемый(ая) <span th:text="${user.firstName + ' ' + user.lastName}">Ivan Ivanov</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Руководитель гранта "<a th:href="@{|${baseUrl}/grants/grant?id=${grant.id}|}"><span
|
||||||
|
th:text="${grant.title}">Title</span></a>" сменился с
|
||||||
|
"<span th:text="${oldLeader.lastName} ">oldLeader</span>"
|
||||||
|
на "<span th:text="${grant.leader.lastName}">newLeader</span>".
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Regards,
|
||||||
|
<br/>
|
||||||
|
<em>NG-tracker.</em>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -140,6 +140,7 @@ body {
|
|||||||
|
|
||||||
.paper-name {
|
.paper-name {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.paper-name:hover {
|
.paper-name:hover {
|
||||||
@ -156,6 +157,15 @@ body {
|
|||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.paper-name span:nth-child(2) {
|
||||||
|
max-width: 326px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-menu {
|
||||||
|
max-width: 445px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
|
@ -38,6 +38,65 @@
|
|||||||
width: auto;
|
width: auto;
|
||||||
max-width: inherit;
|
max-width: inherit;
|
||||||
}
|
}
|
||||||
|
.tag-info{
|
||||||
|
font-size: 10px;
|
||||||
|
color: white;
|
||||||
|
padding: 5px 15px;
|
||||||
|
background-color: black;
|
||||||
|
display: none;
|
||||||
|
margin-left: 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
opacity: 0.8;
|
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-question-circle{
|
||||||
|
|
||||||
|
font-size: 15px;
|
||||||
|
color: #212529;
|
||||||
|
cursor:pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fa-question-circle:hover .tag-info{
|
||||||
|
display:inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.task-row{
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.task-row .col:hover{
|
||||||
|
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.task-row .col > a{
|
||||||
|
display: block;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.task-row .col:hover .remove-task{
|
||||||
|
|
||||||
|
visibility: visible;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-task{
|
||||||
|
visibility: hidden;
|
||||||
|
position: absolute;
|
||||||
|
right: -20px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-task:hover{
|
||||||
|
|
||||||
|
background-color: #ebebeb;
|
||||||
|
}
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
@ -25,4 +25,5 @@ $(document).ready(function () {
|
|||||||
$('#dataConfirmModal').modal({show:true});
|
$('#dataConfirmModal').modal({show:true});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -19,8 +19,16 @@ $(document).ready(function () {
|
|||||||
|
|
||||||
|
|
||||||
$("#input-tag").keyup(function (event) {
|
$("#input-tag").keyup(function (event) {
|
||||||
if(event.keyCode == 13 || event.keyCode == 188) {
|
if(event.keyCode == 13) {
|
||||||
var tagNumber = $("#tags .tag").length;
|
var tagNumber = $("#tags .tag").length;
|
||||||
|
if(tagNumber > 0) {
|
||||||
|
tagNumber = $("#tags .tag").last()
|
||||||
|
.children('input')
|
||||||
|
.attr("name")
|
||||||
|
.split(']')[0]
|
||||||
|
.split('[')[1];
|
||||||
|
tagNumber++;
|
||||||
|
}
|
||||||
var tagName = $.trim($(this).val());
|
var tagName = $.trim($(this).val());
|
||||||
var addTag = true;
|
var addTag = true;
|
||||||
// проверка, добавлен ли этот тег
|
// проверка, добавлен ли этот тег
|
||||||
@ -70,17 +78,17 @@ $(document).ready(function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
$("span[data-role=remove]").click(removeTag);
|
$("span[data-role=remove]").click(removeTag);
|
||||||
$(".task-row").mouseenter(function (event) {
|
// $(".task-row").mouseenter(function (event) {
|
||||||
var taskRow = $(event.target).closest(".task-row");
|
// var taskRow = $(event.target).closest(".task-row");
|
||||||
$(taskRow).css("background-color", "#f8f9fa");
|
// $(taskRow).css("background-color", "#f8f9fa");
|
||||||
$(taskRow).find(".remove-task").removeClass("d-none");
|
// $(taskRow).find(".remove-task").removeClass("d-none");
|
||||||
|
//
|
||||||
});
|
// });
|
||||||
$(".task-row").mouseleave(function (event) {
|
// $(".task-row").mouseleave(function (event) {
|
||||||
var taskRow = $(event.target).closest(".task-row");
|
// var taskRow = $(event.target).closest(".task-row");
|
||||||
$(taskRow).css("background-color", "white");
|
// $(taskRow).css("background-color", "white");
|
||||||
$(taskRow).closest(".task-row").find(".remove-task").addClass("d-none");
|
// $(taskRow).closest(".task-row").find(".remove-task").addClass("d-none");
|
||||||
});
|
// });
|
||||||
|
|
||||||
$('a[data-confirm]').click(function(ev) {
|
$('a[data-confirm]').click(function(ev) {
|
||||||
var href = $(this).attr('href');
|
var href = $(this).attr('href');
|
||||||
|
@ -30,11 +30,12 @@
|
|||||||
<label for="title">Название:</label>
|
<label for="title">Название:</label>
|
||||||
<input class="form-control" th:field="*{title}" id="title" type="text"
|
<input class="form-control" th:field="*{title}" id="title" type="text"
|
||||||
placeholder="Название конференции"/>
|
placeholder="Название конференции"/>
|
||||||
<p th:if="${#fields.hasErrors('title')}" th:errors="*{title}"
|
|
||||||
class="alert alert-danger">Incorrect title</p>
|
|
||||||
<p class="help-block text-danger"></p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<p th:if="${#fields.hasErrors('title')}" th:errors="*{title}"
|
||||||
|
class="alert alert-danger">Incorrect title</p>
|
||||||
|
<p class="help-block text-danger"></p>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="url">URL:</label>
|
<label for="url">URL:</label>
|
||||||
<input class="form-control" th:field="*{url}" id="url" type="text"
|
<input class="form-control" th:field="*{url}" id="url" type="text"
|
||||||
|
@ -184,9 +184,9 @@
|
|||||||
value="Отобразить прикрепленную статью"/>
|
value="Отобразить прикрепленную статью"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<input th:type="hidden" th:field="*{papers}"/>
|
|
||||||
<div class="form-control list-group div-selected-papers" id="selected-papers">
|
<div class="form-control list-group div-selected-papers" id="selected-papers">
|
||||||
<div th:each="paper, rowStat : *{papers}">
|
<div th:each="paper, rowStat : *{papers}">
|
||||||
|
<input type="hidden" th:field="*{papers[__${rowStat.index}__].id}"/>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<a th:href="@{'/papers/paper?id=' + *{papers[__${rowStat.index}__].id} + ''}">
|
<a th:href="@{'/papers/paper?id=' + *{papers[__${rowStat.index}__].id} + ''}">
|
||||||
<img class="icon-paper" src="/img/conference/paper.png"/>
|
<img class="icon-paper" src="/img/conference/paper.png"/>
|
||||||
@ -201,6 +201,32 @@
|
|||||||
Статус статьи
|
Статус статьи
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
|
<div class="col" th:unless="${#lists.isEmpty(paper.grants)}">
|
||||||
|
<label>Гранты: </label>
|
||||||
|
<div th:each="grant, grantRowStat : *{papers[__${rowStat.index}__].grants}"
|
||||||
|
th:remove="tag">
|
||||||
|
<div th:unless="${grant.id}==*{id}" th:remove="tag">
|
||||||
|
<li>
|
||||||
|
<a th:href="@{'/grants/grant?id=' + ${grant.id} + ''}">
|
||||||
|
<span th:text="${grant.title} "></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col" th:unless="${#lists.isEmpty(paper.conferences)}">
|
||||||
|
<label>Конференции: </label>
|
||||||
|
<div th:each="conference, conferenceRowStat : *{papers[__${rowStat.index}__].conferences}"
|
||||||
|
th:remove="tag">
|
||||||
|
<li>
|
||||||
|
<a th:href="@{'/conferences/conference?id=' + ${conference.id} + ''}">
|
||||||
|
<span th:text="${conference.title}"></span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,15 +6,15 @@
|
|||||||
<body>
|
<body>
|
||||||
<div th:fragment="taskLine (task)" class="row text-left task-row" style="background-color: white;">
|
<div th:fragment="taskLine (task)" class="row text-left task-row" style="background-color: white;">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<span th:replace="students/fragments/taskStatusFragment :: taskStatus(taskStatus=${task.status})"/>
|
|
||||||
<a th:href="@{'task?id='+${task.id}}">
|
<a th:href="@{'task?id='+${task.id}}">
|
||||||
|
<span th:replace="students/fragments/taskStatusFragment :: taskStatus(taskStatus=${task.status})"/>
|
||||||
<span class="h6" th:text="${task.title}"></span>
|
<span class="h6" th:text="${task.title}"></span>
|
||||||
<span class="text-muted" th:text="${task.tagsString}"/>
|
<span class="text-muted" th:text="${task.tagsString}"/>
|
||||||
</a>
|
<input class="id-class" type="hidden" th:value="${task.id}"/>
|
||||||
<input class="id-class" type="hidden" th:value="${task.id}"/>
|
<a class="remove-task pull-right" th:href="@{'/students/delete/'+${task.id}}"
|
||||||
<a class="remove-task pull-right d-none" th:href="@{'/students/delete/'+${task.id}}"
|
data-confirm="Удалить задачу?">
|
||||||
data-confirm="Удалить задачу?">
|
<i class="fa fa-trash" aria-hidden="true"></i>
|
||||||
<i class="fa fa-trash" aria-hidden="true"></i>
|
</a>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="tags">Теги:</label>
|
<label for="tags">Теги: <i class="fa fa-question-circle"><span class="tag-info">Для ввода тега наберите слово (или словосочетание) и нажмите Enter </span></i></label>
|
||||||
<div class="tags-container" id="tags">
|
<div class="tags-container" id="tags">
|
||||||
<div class="tag" th:each="tag, rowStat : *{tags}">
|
<div class="tag" th:each="tag, rowStat : *{tags}">
|
||||||
<input type="hidden" th:field="*{tags[__${rowStat.index}__].id}"/>
|
<input type="hidden" th:field="*{tags[__${rowStat.index}__].id}"/>
|
||||||
|
230
src/test/java/IndexConferenceTest.java
Normal file
230
src/test/java/IndexConferenceTest.java
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
import conference.ConferencePage;
|
||||||
|
import conference.ConferencesDashboardPage;
|
||||||
|
import conference.ConferencesPage;
|
||||||
|
import core.PageObject;
|
||||||
|
import core.TestTemplate;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.FixMethodOrder;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.MethodSorters;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
import ru.ulstu.NgTrackerApplication;
|
||||||
|
import ru.ulstu.configuration.ApplicationProperties;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
|
@SpringBootTest(classes = NgTrackerApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
|
||||||
|
public class IndexConferenceTest extends TestTemplate {
|
||||||
|
private final Map<PageObject, List<String>> navigationHolder = ImmutableMap.of(
|
||||||
|
new ConferencesPage(), Arrays.asList("КОНФЕРЕНЦИИ", "/conferences/conferences"),
|
||||||
|
new ConferencePage(), Arrays.asList("РЕДАКТИРОВАНИЕ КОНФЕРЕНЦИИ", "/conferences/conference?id=0"),
|
||||||
|
new ConferencesDashboardPage(), Arrays.asList("АКТУАЛЬНЫЕ КОНФЕРЕНЦИИ", "/conferences/dashboard")
|
||||||
|
);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationProperties applicationProperties;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testACreateNewConference() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 1);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(page.getKey());
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 0).getKey());
|
||||||
|
|
||||||
|
String newConferenceName = "test " + (new Date()).getTime();
|
||||||
|
conferencePage.setName(newConferenceName);
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
Assert.assertTrue(conferencesPage.checkNameInList(newConferenceName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBChangeConferenceNameAndSave() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String newConferenceName = "test " + (new Date()).getTime();
|
||||||
|
conferencePage.clearName();
|
||||||
|
conferencePage.setName(newConferenceName);
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
Assert.assertTrue(conferencesPage.checkNameInList(newConferenceName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCAddDeadlineAndSave() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer deadlineCount = conferencePage.getDeadlineCount();
|
||||||
|
|
||||||
|
String description = "test";
|
||||||
|
String date = "09.09.2019";
|
||||||
|
String dateValue = "2019-09-09";
|
||||||
|
conferencePage.clickAddDeadlineBut();
|
||||||
|
conferencePage.setDeadlineDescription(description, deadlineCount);
|
||||||
|
conferencePage.setDeadlineDate(date, deadlineCount);
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertTrue(conferencePage.checkDeadline(description, dateValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDTakePartAndSave() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer membersCount = conferencePage.getMemberCount();
|
||||||
|
|
||||||
|
conferencePage.clickTakePartBut();
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertTrue(membersCount + 1 == conferencePage.getMemberCount()
|
||||||
|
&& conferencePage.isTakePartButDisabledValueTrue());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEDeleteDeadlineAndSave() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer deadlineCount = conferencePage.getDeadlineCount();
|
||||||
|
|
||||||
|
conferencePage.clickDeleteDeadlineBut();
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertEquals(deadlineCount - 1, (int) conferencePage.getDeadlineCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFAttachArticle() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer paperCount = conferencePage.getArticlesCount();
|
||||||
|
|
||||||
|
conferencePage.showAllowToAttachArticles();
|
||||||
|
WebElement paper = conferencePage.selectArticle();
|
||||||
|
String paperName = paper.findElement(By.className("text")).getText();
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertTrue(paperCount + 1 == conferencePage.getArticlesCount()
|
||||||
|
&& conferencePage.checkArticle(paperName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGAddArticle() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer paperCount = conferencePage.getArticlesCount();
|
||||||
|
|
||||||
|
conferencePage.clickAddPaperBut();
|
||||||
|
List<WebElement> webElements = conferencePage.getArticles();
|
||||||
|
String paperName = webElements.get(webElements.size() - 1).findElements(By.tagName("input")).get(1).getAttribute("value");
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertTrue(paperCount + 1 == conferencePage.getArticlesCount()
|
||||||
|
&& conferencePage.checkArticle(paperName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testHUndockArticle() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
ConferencePage conferencePage = (ConferencePage) getContext().initPage(Iterables.get(navigationHolder.entrySet(), 1).getKey());
|
||||||
|
|
||||||
|
conferencesPage.getFirstConference();
|
||||||
|
String conferenceId = conferencePage.getId();
|
||||||
|
Integer paperCount = conferencePage.getArticlesCount();
|
||||||
|
|
||||||
|
conferencePage.clickUndockArticleBut();
|
||||||
|
conferencePage.clickSaveBut();
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + String.format("/conferences/conference?id=%s", conferenceId));
|
||||||
|
|
||||||
|
Assert.assertEquals(paperCount - 1, (int) conferencePage.getArticlesCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testISortAndFilterConferenceList() {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
|
||||||
|
conferencesPage.selectMember();
|
||||||
|
conferencesPage.selectYear();
|
||||||
|
|
||||||
|
Assert.assertEquals(1, conferencesPage.getConferencesList().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJDeleteConf() throws InterruptedException {
|
||||||
|
Map.Entry<PageObject, List<String>> page = Iterables.get(navigationHolder.entrySet(), 0);
|
||||||
|
|
||||||
|
getContext().goTo(applicationProperties.getBaseUrl() + page.getValue().get(1));
|
||||||
|
ConferencesPage conferencesPage = (ConferencesPage) getContext().initPage(page.getKey());
|
||||||
|
|
||||||
|
Integer size = conferencesPage.getConferencesList().size();
|
||||||
|
conferencesPage.deleteFirst();
|
||||||
|
Thread.sleep(3000);
|
||||||
|
conferencesPage.clickConfirm();
|
||||||
|
|
||||||
|
Assert.assertEquals(size - 1, conferencesPage.getConferencesList().size());
|
||||||
|
}
|
||||||
|
}
|
116
src/test/java/conference/ConferencePage.java
Normal file
116
src/test/java/conference/ConferencePage.java
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
package conference;
|
||||||
|
|
||||||
|
import core.PageObject;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ConferencePage extends PageObject {
|
||||||
|
|
||||||
|
public String getSubTitle() {
|
||||||
|
return driver.findElement(By.tagName("h3")).getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return driver.findElement(By.id("id")).getAttribute("value");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
driver.findElement(By.id("title")).sendKeys(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return driver.findElement(By.id("title")).getAttribute("value");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearName() {
|
||||||
|
driver.findElement(By.id("title")).clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickSaveBut() {
|
||||||
|
driver.findElement(By.id("send-message-button")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickAddDeadlineBut() {
|
||||||
|
driver.findElement(By.id("addDeadline")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WebElement> getDeadlineList() {
|
||||||
|
return driver.findElements(By.className("deadline"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getDeadlineCount() {
|
||||||
|
return driver.findElements(By.className("deadline")).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeadlineDescription(String description, Integer i) {
|
||||||
|
driver.findElement(By.id(String.format("deadlines%d.description", i))).sendKeys(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeadlineDate(String date, Integer i) {
|
||||||
|
driver.findElement(By.id(String.format("deadlines%d.date", i))).sendKeys(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickTakePartBut() {
|
||||||
|
driver.findElement(By.id("take-part")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isTakePartButDisabledValueTrue() {
|
||||||
|
return driver.findElement(By.id("take-part")).getAttribute("disabled").equals("true");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMemberCount() {
|
||||||
|
return driver.findElements(By.className("member")).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickDeleteDeadlineBut() {
|
||||||
|
driver.findElement(By.xpath("//*[@id=\"deadlines\"]/div/input[4]")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showAllowToAttachArticles() {
|
||||||
|
driver.findElement(By.cssSelector("button[data-id=\"paperIds\"]")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickAddPaperBut() {
|
||||||
|
driver.findElement(By.id("add-paper")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<WebElement> getArticles() {
|
||||||
|
return driver.findElements(By.className("paper"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getArticlesCount() {
|
||||||
|
return driver.findElements(By.className("paper")).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WebElement selectArticle() {
|
||||||
|
WebElement webElement = driver.findElement(By.xpath("//*[@id=\"conference-form\"]/div/div[2]/div[5]/div/div/div[2]/ul/li[1]/a"));
|
||||||
|
webElement.click();
|
||||||
|
return webElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickUndockArticleBut() {
|
||||||
|
driver.findElement(By.name("removePaper")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkDeadline(String description, String dateValue) {
|
||||||
|
return getDeadlineList()
|
||||||
|
.stream()
|
||||||
|
.anyMatch(webElement -> {
|
||||||
|
return webElement.findElement(By.className("deadline-text")).getAttribute("value").equals(description)
|
||||||
|
&& webElement.findElement(By.cssSelector("input[type=\"date\"]")).getAttribute("value").equals(dateValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkArticle(String paperName) {
|
||||||
|
return getArticles()
|
||||||
|
.stream()
|
||||||
|
.anyMatch(webElement -> webElement
|
||||||
|
.findElements(By.tagName("input"))
|
||||||
|
.get(1).getAttribute("value")
|
||||||
|
.equals(paperName));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
src/test/java/conference/ConferencesDashboardPage.java
Normal file
11
src/test/java/conference/ConferencesDashboardPage.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package conference;
|
||||||
|
|
||||||
|
import core.PageObject;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
|
||||||
|
public class ConferencesDashboardPage extends PageObject {
|
||||||
|
|
||||||
|
public String getSubTitle() {
|
||||||
|
return driver.findElement(By.tagName("h2")).getText();
|
||||||
|
}
|
||||||
|
}
|
47
src/test/java/conference/ConferencesPage.java
Normal file
47
src/test/java/conference/ConferencesPage.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package conference;
|
||||||
|
|
||||||
|
import core.PageObject;
|
||||||
|
import org.openqa.selenium.By;
|
||||||
|
import org.openqa.selenium.WebElement;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ConferencesPage extends PageObject {
|
||||||
|
|
||||||
|
public String getSubTitle() {
|
||||||
|
return driver.findElement(By.tagName("h3")).getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WebElement> getConferencesList() {
|
||||||
|
return driver.findElements(By.cssSelector("span.h6.float-left.m-2"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getFirstConference() {
|
||||||
|
driver.findElement(By.xpath("//*[@id=\"conferences\"]/div/div[2]/div[1]/div[1]/div/a")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectMember() {
|
||||||
|
driver.findElements(By.className("bootstrap-select")).get(0).findElement(By.className("btn")).click();
|
||||||
|
driver.findElements(By.className("bootstrap-select")).get(0).findElements(By.className("dropdown-item")).get(1).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectYear() {
|
||||||
|
driver.findElements(By.className("bootstrap-select")).get(1).findElement(By.className("btn")).click();
|
||||||
|
driver.findElements(By.className("bootstrap-select")).get(1).findElements(By.className("dropdown-item")).get(1).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteFirst() {
|
||||||
|
js.executeScript("$('input[data-confirm]').click();");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clickConfirm() {
|
||||||
|
driver.findElement(By.id("deleteConference")).click();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean checkNameInList(String newConferenceName) {
|
||||||
|
return getConferencesList()
|
||||||
|
.stream()
|
||||||
|
.anyMatch(webElement -> webElement.getText().equals(newConferenceName));
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,17 @@
|
|||||||
package core;
|
package core;
|
||||||
|
|
||||||
|
import org.openqa.selenium.JavascriptExecutor;
|
||||||
import org.openqa.selenium.WebDriver;
|
import org.openqa.selenium.WebDriver;
|
||||||
|
|
||||||
public abstract class PageObject {
|
public abstract class PageObject {
|
||||||
protected WebDriver driver;
|
protected WebDriver driver;
|
||||||
|
protected JavascriptExecutor js;
|
||||||
|
|
||||||
public abstract String getSubTitle();
|
public abstract String getSubTitle();
|
||||||
|
|
||||||
public PageObject setDriver(WebDriver driver) {
|
public PageObject setDriver(WebDriver driver) {
|
||||||
this.driver = driver;
|
this.driver = driver;
|
||||||
|
js = (JavascriptExecutor) driver;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user