Resolve "Реализовать интеграционные автотесты для проверки модулей" #217
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import ru.ulstu.students.model.TaskFilterDto;
|
|||||||
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.Arrays;
|
import java.util.Arrays;
|
||||||
@ -29,12 +30,14 @@ public class TaskService {
|
|||||||
private final TaskRepository taskRepository;
|
private final TaskRepository taskRepository;
|
||||||
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, EventService eventService) {
|
||||||
this.taskRepository = taskRepository;
|
this.taskRepository = taskRepository;
|
||||||
this.deadlineService = deadlineService;
|
this.deadlineService = deadlineService;
|
||||||
this.tagService = tagService;
|
this.tagService = tagService;
|
||||||
|
this.eventService = eventService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Task> findAll() {
|
public List<Task> findAll() {
|
||||||
@ -67,6 +70,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,6 +90,7 @@ 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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,33 @@ public class EventService {
|
|||||||
eventRepository.delete(eventRepository.findAllByGrant(grant));
|
eventRepository.delete(eventRepository.findAllByGrant(grant));
|
||||||
createFromGrant(grant);
|
createFromGrant(grant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
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>
|
@ -40,4 +40,5 @@
|
|||||||
<include file="db/changelog-20190505_000000-schema.xml"/>
|
<include file="db/changelog-20190505_000000-schema.xml"/>
|
||||||
<include file="db/changelog-20190507_000000-schema.xml"/>
|
<include file="db/changelog-20190507_000000-schema.xml"/>
|
||||||
<include file="db/changelog-20190507_000001-schema.xml"/>
|
<include file="db/changelog-20190507_000001-schema.xml"/>
|
||||||
|
<include file="db/changelog-20190511_000000-schema.xml"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
@ -39,6 +39,42 @@
|
|||||||
max-width: inherit;
|
max-width: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.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;
|
||||||
padding: .2em .6em .3em;
|
padding: .2em .6em .3em;
|
||||||
|
@ -70,17 +70,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');
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user