Skip to content

Commit 323a24e

Browse files
committed
Fix bug
1 parent 903d605 commit 323a24e

File tree

8 files changed

+64
-56
lines changed

8 files changed

+64
-56
lines changed

models/project/issue.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,6 @@ func AddIssueToColumn(ctx context.Context, issueID int64, newColumn *Column) err
4141
})
4242
}
4343

44-
func MoveIssueToAnotherColumn(ctx context.Context, issueID int64, newColumn *Column) error {
45-
_, err := db.GetEngine(ctx).Exec("UPDATE `project_issue` SET project_board_id=? WHERE issue_id=?", newColumn.ID, issueID)
46-
return err
47-
}
48-
4944
func (c *Column) moveIssuesToAnotherColumn(ctx context.Context, newColumn *Column) error {
5045
if c.ProjectID != newColumn.ProjectID {
5146
return errors.New("columns have to be in the same project")

models/project/workflows.go

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -65,34 +65,16 @@ func (we WorkflowEvent) LangKey() string {
6565
}
6666

6767
func (we WorkflowEvent) EventID() string {
68-
switch we {
69-
case WorkflowEventItemOpened:
70-
return "item_opened"
71-
case WorkflowEventItemAddedToProject:
72-
return "item_added_to_project"
73-
case WorkflowEventItemReopened:
74-
return "item_reopened"
75-
case WorkflowEventItemClosed:
76-
return "item_closed"
77-
case WorkflowEventItemColumnChanged:
78-
return "item_column_changed"
79-
case WorkflowEventCodeChangesRequested:
80-
return "code_changes_requested"
81-
case WorkflowEventCodeReviewApproved:
82-
return "code_review_approved"
83-
case WorkflowEventPullRequestMerged:
84-
return "pull_request_merged"
85-
default:
86-
return string(we)
87-
}
68+
return string(we)
8869
}
8970

9071
type WorkflowFilterType string
9172

9273
const (
93-
WorkflowFilterTypeIssueType WorkflowFilterType = "issue_type" // issue, pull_request, etc.
94-
WorkflowFilterTypeColumn WorkflowFilterType = "target_column" // target column for item_column_changed event
95-
WorkflowFilterTypeLabels WorkflowFilterType = "labels" // filter by issue/PR labels
74+
WorkflowFilterTypeIssueType WorkflowFilterType = "issue_type" // issue, pull_request, etc.
75+
WorkflowFilterTypeSourceColumn WorkflowFilterType = "source_column" // source column for item_column_changed event
76+
WorkflowFilterTypeTargetColumn WorkflowFilterType = "target_column" // target column for item_column_changed event
77+
WorkflowFilterTypeLabels WorkflowFilterType = "labels" // filter by issue/PR labels
9678
)
9779

9880
type WorkflowFilter struct {
@@ -129,7 +111,7 @@ func GetWorkflowEventCapabilities() map[WorkflowEvent]WorkflowEventCapabilities
129111
},
130112
WorkflowEventItemAddedToProject: {
131113
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels},
132-
AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels},
114+
AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels, WorkflowActionTypeIssueState},
133115
},
134116
WorkflowEventItemReopened: {
135117
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels},
@@ -140,7 +122,7 @@ func GetWorkflowEventCapabilities() map[WorkflowEvent]WorkflowEventCapabilities
140122
AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels},
141123
},
142124
WorkflowEventItemColumnChanged: {
143-
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeColumn, WorkflowFilterTypeLabels},
125+
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeSourceColumn, WorkflowFilterTypeTargetColumn, WorkflowFilterTypeLabels},
144126
AvailableActions: []WorkflowActionType{WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels, WorkflowActionTypeIssueState},
145127
},
146128
WorkflowEventCodeChangesRequested: {

routers/web/projects/workflows.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,18 @@ func getFilterSummary(ctx stdCtx.Context, filters []project_model.WorkflowFilter
4242
case "pull_request":
4343
summary.WriteString(" (Pull requests only)")
4444
}
45-
case project_model.WorkflowFilterTypeColumn:
45+
case project_model.WorkflowFilterTypeSourceColumn:
46+
columnID, _ := strconv.ParseInt(filter.Value, 10, 64)
47+
if columnID <= 0 {
48+
continue
49+
}
50+
col, err := project_model.GetColumn(ctx, columnID)
51+
if err != nil {
52+
log.Error("GetColumn: %v", err)
53+
continue
54+
}
55+
summary.WriteString(" (Source Column: " + col.Title + ")")
56+
case project_model.WorkflowFilterTypeTargetColumn:
4657
columnID, _ := strconv.ParseInt(filter.Value, 10, 64)
4758
if columnID <= 0 {
4859
continue

services/notify/notifier.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ type Notifier interface {
4343
IssueChangeLabels(ctx context.Context, doer *user_model.User, issue *issues_model.Issue,
4444
addedLabels, removedLabels []*issues_model.Label)
4545
IssueChangeProjects(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newProject *project_model.Project)
46-
IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newColumnID int64)
46+
IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldColumnID, newColumnID int64)
4747

4848
NewPullRequest(ctx context.Context, pr *issues_model.PullRequest, mentions []*user_model.User)
4949
MergePullRequest(ctx context.Context, doer *user_model.User, pr *issues_model.PullRequest)

services/notify/notify.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ func IssueChangeProjects(ctx context.Context, doer *user_model.User, issue *issu
282282
}
283283
}
284284

285-
func IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newColumnID int64) {
285+
func IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldColumnID, newColumnID int64) {
286286
for _, notifier := range notifiers {
287-
notifier.IssueChangeProjectColumn(ctx, doer, issue, newColumnID)
287+
notifier.IssueChangeProjectColumn(ctx, doer, issue, oldColumnID, newColumnID)
288288
}
289289
}
290290

services/notify/null.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (*NullNotifier) IssueChangeLabels(ctx context.Context, doer *user_model.Use
147147
func (*NullNotifier) IssueChangeProjects(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newProject *project_model.Project) {
148148
}
149149

150-
func (*NullNotifier) IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newColumnID int64) {
150+
func (*NullNotifier) IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldColumnID, newColumnID int64) {
151151
}
152152

153153
// CreateRepository places a place holder function

services/projects/issue.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func MoveIssuesOnProjectColumn(ctx context.Context, doer *user_model.User, colum
3636
if err != nil {
3737
return err
3838
}
39+
oldColumnIDsMap := make(map[int64]int64, len(issues))
3940

4041
if err := db.WithTx(ctx, func(ctx context.Context) error {
4142
if _, err := issues.LoadRepositories(ctx); err != nil {
@@ -62,6 +63,7 @@ func MoveIssuesOnProjectColumn(ctx context.Context, doer *user_model.User, colum
6263
if err != nil {
6364
return err
6465
}
66+
oldColumnIDsMap[issueID] = projectColumnID
6567

6668
if projectColumnID != column.ID {
6769
// add timeline to issue
@@ -90,7 +92,7 @@ func MoveIssuesOnProjectColumn(ctx context.Context, doer *user_model.User, colum
9092
}
9193

9294
for _, issue := range issues {
93-
notify.IssueChangeProjectColumn(ctx, doer, issue, column.ID)
95+
notify.IssueChangeProjectColumn(ctx, doer, issue, oldColumnIDsMap[issue.ID], column.ID)
9496
}
9597

9698
return nil
@@ -216,13 +218,17 @@ func LoadIssueNumbersForProject(ctx context.Context, project *project_model.Proj
216218
return nil
217219
}
218220

219-
func MoveIssueToAnotherColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, column *project_model.Column) error {
221+
func MoveIssueToAnotherColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newColumn *project_model.Column) error {
222+
oldColumnID, err := issue.ProjectColumnID(ctx)
223+
if err != nil {
224+
return err
225+
}
220226
if err := db.WithTx(ctx, func(ctx context.Context) error {
221-
if err := project_model.MoveIssueToAnotherColumn(ctx, issue.ID, column); err != nil {
227+
if _, err := db.GetEngine(ctx).Exec("UPDATE `project_issue` SET project_board_id=? WHERE issue_id=?", newColumn.ID, issue.ID); err != nil {
222228
return err
223229
}
224230

225-
if err := column.LoadProject(ctx); err != nil {
231+
if err := newColumn.LoadProject(ctx); err != nil {
226232
return err
227233
}
228234

@@ -232,10 +238,10 @@ func MoveIssueToAnotherColumn(ctx context.Context, doer *user_model.User, issue
232238
Doer: doer,
233239
Repo: issue.Repo,
234240
Issue: issue,
235-
ProjectID: column.ProjectID,
236-
ProjectTitle: column.Project.Title,
237-
ProjectColumnID: column.ID,
238-
ProjectColumnTitle: column.Title,
241+
ProjectID: newColumn.ProjectID,
242+
ProjectTitle: newColumn.Project.Title,
243+
ProjectColumnID: newColumn.ID,
244+
ProjectColumnTitle: newColumn.Title,
239245
}); err != nil {
240246
return err
241247
}
@@ -244,6 +250,6 @@ func MoveIssueToAnotherColumn(ctx context.Context, doer *user_model.User, issue
244250
return err
245251
}
246252

247-
notify.IssueChangeProjectColumn(ctx, doer, issue, column.ID)
253+
notify.IssueChangeProjectColumn(ctx, doer, issue, oldColumnID, newColumn.ID)
248254
return nil
249255
}

services/projects/workflow_notifier.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (m *workflowNotifier) NewIssue(ctx context.Context, issue *issues_model.Iss
5555
// Find workflows for the ItemOpened event
5656
for _, workflow := range workflows {
5757
if workflow.WorkflowEvent == project_model.WorkflowEventItemOpened {
58-
fireIssueWorkflow(ctx, workflow, issue, 0)
58+
fireIssueWorkflow(ctx, workflow, issue, 0, 0)
5959
}
6060
}
6161
}
@@ -92,7 +92,7 @@ func (m *workflowNotifier) IssueChangeStatus(ctx context.Context, doer *user_mod
9292
// Find workflows for the specific event
9393
for _, workflow := range workflows {
9494
if workflow.WorkflowEvent == workflowEvent {
95-
fireIssueWorkflow(ctx, workflow, issue, 0)
95+
fireIssueWorkflow(ctx, workflow, issue, 0, 0)
9696
}
9797
}
9898
}
@@ -124,12 +124,12 @@ func (*workflowNotifier) IssueChangeProjects(ctx context.Context, doer *user_mod
124124
// Find workflows for the ItemOpened event
125125
for _, workflow := range workflows {
126126
if workflow.WorkflowEvent == project_model.WorkflowEventItemAddedToProject {
127-
fireIssueWorkflow(ctx, workflow, issue, 0)
127+
fireIssueWorkflow(ctx, workflow, issue, 0, 0)
128128
}
129129
}
130130
}
131131

132-
func (*workflowNotifier) IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, newColumnID int64) {
132+
func (*workflowNotifier) IssueChangeProjectColumn(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, oldColumnID, newColumnID int64) {
133133
if err := issue.LoadRepo(ctx); err != nil {
134134
log.Error("IssueChangeStatus: LoadRepo: %v", err)
135135
return
@@ -158,7 +158,7 @@ func (*workflowNotifier) IssueChangeProjectColumn(ctx context.Context, doer *use
158158
// Find workflows for the ItemColumnChanged event
159159
for _, workflow := range workflows {
160160
if workflow.WorkflowEvent == project_model.WorkflowEventItemColumnChanged {
161-
fireIssueWorkflow(ctx, workflow, issue, newColumnID)
161+
fireIssueWorkflow(ctx, workflow, issue, oldColumnID, newColumnID)
162162
}
163163
}
164164
}
@@ -192,7 +192,7 @@ func (*workflowNotifier) MergePullRequest(ctx context.Context, doer *user_model.
192192
// Find workflows for the PullRequestMerged event
193193
for _, workflow := range workflows {
194194
if workflow.WorkflowEvent == project_model.WorkflowEventPullRequestMerged {
195-
fireIssueWorkflow(ctx, workflow, issue, 0)
195+
fireIssueWorkflow(ctx, workflow, issue, 0, 0)
196196
}
197197
}
198198
}
@@ -231,12 +231,12 @@ func (*workflowNotifier) PullRequestReview(ctx context.Context, pr *issues_model
231231
for _, workflow := range workflows {
232232
if (workflow.WorkflowEvent == project_model.WorkflowEventCodeChangesRequested && review.Type == issues_model.ReviewTypeReject) ||
233233
(workflow.WorkflowEvent == project_model.WorkflowEventCodeReviewApproved && review.Type == issues_model.ReviewTypeApprove) {
234-
fireIssueWorkflow(ctx, workflow, issue, 0)
234+
fireIssueWorkflow(ctx, workflow, issue, 0, 0)
235235
}
236236
}
237237
}
238238

239-
func fireIssueWorkflow(ctx context.Context, workflow *project_model.Workflow, issue *issues_model.Issue, columnID int64) {
239+
func fireIssueWorkflow(ctx context.Context, workflow *project_model.Workflow, issue *issues_model.Issue, sourceColumnID, targetColumnID int64) {
240240
if !workflow.Enabled {
241241
return
242242
}
@@ -247,15 +247,15 @@ func fireIssueWorkflow(ctx context.Context, workflow *project_model.Workflow, is
247247
return
248248
}
249249

250-
if !matchWorkflowsFilters(workflow, issue, columnID) {
250+
if !matchWorkflowsFilters(workflow, issue, sourceColumnID, targetColumnID) {
251251
return
252252
}
253253

254254
executeWorkflowActions(ctx, workflow, issue)
255255
}
256256

257257
// matchWorkflowsFilters checks if the issue matches all filters of the workflow
258-
func matchWorkflowsFilters(workflow *project_model.Workflow, issue *issues_model.Issue, columnID int64) bool {
258+
func matchWorkflowsFilters(workflow *project_model.Workflow, issue *issues_model.Issue, sourceColumnID, targetColumnID int64) bool {
259259
for _, filter := range workflow.WorkflowFilters {
260260
switch filter.Type {
261261
case project_model.WorkflowFilterTypeIssueType:
@@ -270,7 +270,7 @@ func matchWorkflowsFilters(workflow *project_model.Workflow, issue *issues_model
270270
if filter.Value == "pull_request" && !issue.IsPull {
271271
return false
272272
}
273-
case project_model.WorkflowFilterTypeColumn:
273+
case project_model.WorkflowFilterTypeTargetColumn:
274274
// If filter value is empty, match all columns
275275
if filter.Value == "" {
276276
continue
@@ -281,7 +281,21 @@ func matchWorkflowsFilters(workflow *project_model.Workflow, issue *issues_model
281281
return false
282282
}
283283
// For column changed event, check against the new column ID
284-
if columnID > 0 && columnID != filterColumnID {
284+
if targetColumnID > 0 && targetColumnID != filterColumnID {
285+
return false
286+
}
287+
case project_model.WorkflowFilterTypeSourceColumn:
288+
// If filter value is empty, match all columns
289+
if filter.Value == "" {
290+
continue
291+
}
292+
filterColumnID, _ := strconv.ParseInt(filter.Value, 10, 64)
293+
if filterColumnID == 0 {
294+
log.Error("Invalid column ID: %s", filter.Value)
295+
return false
296+
}
297+
// For column changed event, check against the new column ID
298+
if sourceColumnID > 0 && sourceColumnID != filterColumnID {
285299
return false
286300
}
287301
case project_model.WorkflowFilterTypeLabels:

0 commit comments

Comments
 (0)