Skip to content

Commit 855f45d

Browse files
committed
fix
1 parent 4257b89 commit 855f45d

29 files changed

+387
-488
lines changed

models/organization/org_times.go

-88
This file was deleted.

models/organization/org_worktime.go

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package organization
5+
6+
import (
7+
"code.gitea.io/gitea/models/db"
8+
9+
"xorm.io/builder"
10+
)
11+
12+
type WorktimeSumByRepos struct {
13+
RepoName string
14+
SumTime int64
15+
}
16+
17+
func GetWorktimeByRepos(org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByRepos, err error) {
18+
err = db.GetEngine(db.DefaultContext).
19+
Select("repository.name AS repo_name, SUM(tracked_time.time) AS sum_time").
20+
Table("tracked_time").
21+
Join("INNER", "issue", "tracked_time.issue_id = issue.id").
22+
Join("INNER", "repository", "issue.repo_id = repository.id").
23+
Where(builder.Eq{"repository.owner_id": org.ID}).
24+
And(builder.Eq{"tracked_time.deleted": false}).
25+
And(builder.Gte{"tracked_time.created_unix": unitFrom}).
26+
And(builder.Lte{"tracked_time.created_unix": unixTo}).
27+
GroupBy("repository.id").
28+
OrderBy("repository.name").
29+
Find(&results)
30+
return results, err
31+
}
32+
33+
type WorktimeSumByMilestones struct {
34+
RepoName string
35+
MilestoneName string
36+
MilestoneID int64
37+
SumTime int64
38+
HideRepoName bool
39+
}
40+
41+
func GetWorktimeByMilestones(org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByMilestones, err error) {
42+
err = db.GetEngine(db.DefaultContext).
43+
Select("repository.name AS repo_name, milestone.name AS milestone_name, milestone.id AS milestone_id, SUM(tracked_time.time) AS sum_time").
44+
Table("tracked_time").
45+
Join("INNER", "issue", "tracked_time.issue_id = issue.id").
46+
Join("INNER", "repository", "issue.repo_id = repository.id").
47+
Join("LEFT", "milestone", "issue.milestone_id = milestone.id").
48+
Where(builder.Eq{"repository.owner_id": org.ID}).
49+
And(builder.Eq{"tracked_time.deleted": false}).
50+
And(builder.Gte{"tracked_time.created_unix": unitFrom}).
51+
And(builder.Lte{"tracked_time.created_unix": unixTo}).
52+
GroupBy("repository.id, milestone.id").
53+
OrderBy("repository.name, milestone.deadline_unix, milestone.id").
54+
Find(&results)
55+
// Show only the first RepoName, for nicer output.
56+
prevRepoName := ""
57+
for i := 0; i < len(results); i++ {
58+
res := &results[i]
59+
if prevRepoName == res.RepoName {
60+
res.HideRepoName = true
61+
}
62+
prevRepoName = res.RepoName
63+
}
64+
return results, err
65+
}
66+
67+
type WorktimeSumByMembers struct {
68+
UserName string
69+
SumTime int64
70+
}
71+
72+
func GetWorktimeByMembers(org *Organization, unitFrom, unixTo int64) (results []WorktimeSumByMembers, err error) {
73+
err = db.GetEngine(db.DefaultContext).
74+
Select("user.name AS user_name, SUM(tracked_time.time) AS sum_time").
75+
Table("tracked_time").
76+
Join("INNER", "issue", "tracked_time.issue_id = issue.id").
77+
Join("INNER", "repository", "issue.repo_id = repository.id").
78+
Join("INNER", "user", "tracked_time.user_id = user.id").
79+
Where(builder.Eq{"repository.owner_id": org.ID}).
80+
And(builder.Eq{"tracked_time.deleted": false}).
81+
And(builder.Gte{"tracked_time.created_unix": unitFrom}).
82+
And(builder.Lte{"tracked_time.created_unix": unixTo}).
83+
GroupBy("user.id").
84+
OrderBy("sum_time DESC").
85+
Find(&results)
86+
return results, err
87+
}

modules/templates/helper.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func NewFuncMap() template.FuncMap {
6969
// time / number / format
7070
"FileSize": base.FileSize,
7171
"CountFmt": countFmt,
72-
"Sec2Time": util.SecToHours,
72+
"Sec2Hour": util.SecToHours,
7373

7474
"TimeEstimateString": timeEstimateString,
7575

modules/util/sec_to_time.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,20 @@ import (
1111
// SecToHours converts an amount of seconds to a human-readable hours string.
1212
// This is stable for planning and managing timesheets.
1313
// Here it only supports hours and minutes, because a work day could contain 6 or 7 or 8 hours.
14+
// If the duration is less than 1 minute, it will be shown as seconds.
1415
func SecToHours(durationVal any) string {
15-
duration, _ := ToInt64(durationVal)
16-
hours := duration / 3600
17-
minutes := (duration / 60) % 60
16+
seconds, _ := ToInt64(durationVal)
17+
hours := seconds / 3600
18+
minutes := (seconds / 60) % 60
1819

1920
formattedTime := ""
2021
formattedTime = formatTime(hours, "hour", formattedTime)
2122
formattedTime = formatTime(minutes, "minute", formattedTime)
2223

2324
// The formatTime() function always appends a space at the end. This will be trimmed
25+
if formattedTime == "" {
26+
formattedTime = formatTime(seconds, "second", "")
27+
}
2428
return strings.TrimRight(formattedTime, " ")
2529
}
2630

modules/util/sec_to_time_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ func TestSecToHours(t *testing.T) {
2222
assert.Equal(t, "156 hours 30 minutes", SecToHours(6*day+12*hour+30*minute+18*second))
2323
assert.Equal(t, "98 hours 16 minutes", SecToHours(4*day+2*hour+16*minute+58*second))
2424
assert.Equal(t, "672 hours", SecToHours(4*7*day))
25+
assert.Equal(t, "1 second", SecToHours(1))
26+
assert.Equal(t, "2 seconds", SecToHours(2))
2527
}

options/locale/locale_en-US.ini

+11
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ webauthn_reload = Reload
5454
repository = Repository
5555
organization = Organization
5656
mirror = Mirror
57+
issue_milestone = Milestone
5758
new_repo = New Repository
5859
new_migrate = New Migration
5960
new_mirror = New Mirror
@@ -1253,6 +1254,7 @@ labels = Labels
12531254
org_labels_desc = Organization level labels that can be used with <strong>all repositories</strong> under this organization
12541255
org_labels_desc_manage = manage
12551256
1257+
milestone = Milestone
12561258
milestones = Milestones
12571259
commits = Commits
12581260
commit = Commit
@@ -2876,6 +2878,15 @@ view_as_role = View as: %s
28762878
view_as_public_hint = You are viewing the README as a public user.
28772879
view_as_member_hint = You are viewing the README as a member of this organization.
28782880
2881+
worktime = Worktime
2882+
worktime.date_range_start = Start date
2883+
worktime.date_range_end = End date
2884+
worktime.query = Query
2885+
worktime.time = Time
2886+
worktime.by_repositories = By repositories
2887+
worktime.by_milestones = By milestones
2888+
worktime.by_members = By members
2889+
28792890
[admin]
28802891
maintenance = Maintenance
28812892
dashboard = Dashboard

routers/web/org/times.go

-148
This file was deleted.

0 commit comments

Comments
 (0)