|
|
|
@@ -2,10 +2,12 @@ package repo |
|
|
|
|
|
|
|
import ( |
|
|
|
"net/http" |
|
|
|
"net/url" |
|
|
|
|
|
|
|
"code.gitea.io/gitea/models" |
|
|
|
"code.gitea.io/gitea/modules/context" |
|
|
|
"code.gitea.io/gitea/modules/log" |
|
|
|
"github.com/360EntSecGroup-Skylar/excelize/v2" |
|
|
|
) |
|
|
|
|
|
|
|
type CloudbrainsPeriodData struct { |
|
|
|
@@ -81,3 +83,75 @@ func GetAllCloudbrainsPeriodStatistics(ctx *context.Context) { |
|
|
|
ctx.JSON(http.StatusOK, cloudbrainsPeriodData) |
|
|
|
|
|
|
|
} |
|
|
|
func ServeCloudbrainPeriodStatisticsFile(ctx *context.Context) { |
|
|
|
|
|
|
|
recordBeginTime, err := getRecordBeginTime() |
|
|
|
if err != nil { |
|
|
|
log.Error("Can not get record begin time", err) |
|
|
|
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.record_begintime_get_err")) |
|
|
|
return |
|
|
|
} |
|
|
|
beginTime, endTime, err := getTimePeroid(ctx, recordBeginTime) |
|
|
|
if err != nil { |
|
|
|
log.Error("Parameter is wrong", err) |
|
|
|
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.parameter_is_wrong")) |
|
|
|
return |
|
|
|
} |
|
|
|
q := ctx.QueryTrim("q") |
|
|
|
page := ctx.QueryInt("page") |
|
|
|
if page <= 0 { |
|
|
|
page = 1 |
|
|
|
} |
|
|
|
pageSize := 1000 |
|
|
|
orderBy := getOrderBy(ctx) |
|
|
|
|
|
|
|
_, latestDate, err := models.GetRepoStatLastUpdatedTime() |
|
|
|
if err != nil { |
|
|
|
log.Error("Can not query the last updated time.", err) |
|
|
|
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.last_update_time_error")) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
countSql := generateCountSql(beginTime, endTime, latestDate, q) |
|
|
|
total, err := models.CountRepoStatByRawSql(countSql) |
|
|
|
if err != nil { |
|
|
|
log.Error("Can not query total count.", err) |
|
|
|
ctx.Error(http.StatusBadRequest, ctx.Tr("repo.total_count_get_error")) |
|
|
|
return |
|
|
|
} |
|
|
|
var projectAnalysis = ctx.Tr("repo.repo_stat_inspect") |
|
|
|
fileName := getFileName(ctx, beginTime, endTime, projectAnalysis) |
|
|
|
|
|
|
|
totalPage := getTotalPage(total, pageSize) |
|
|
|
|
|
|
|
f := excelize.NewFile() |
|
|
|
|
|
|
|
index := f.NewSheet(projectAnalysis) |
|
|
|
f.DeleteSheet("Sheet1") |
|
|
|
|
|
|
|
for k, v := range allProjectsPeroidHeader(ctx) { |
|
|
|
f.SetCellValue(projectAnalysis, k, v) |
|
|
|
} |
|
|
|
|
|
|
|
var row = 2 |
|
|
|
for i := 0; i <= totalPage; i++ { |
|
|
|
|
|
|
|
pageRecords := models.GetRepoStatisticByRawSql(generateSqlByType(ctx, beginTime, endTime, latestDate, q, orderBy, i+1, pageSize)) |
|
|
|
for _, record := range pageRecords { |
|
|
|
|
|
|
|
for k, v := range allProjectsPeroidValues(row, record, ctx) { |
|
|
|
f.SetCellValue(projectAnalysis, k, v) |
|
|
|
} |
|
|
|
row++ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
f.SetActiveSheet(index) |
|
|
|
|
|
|
|
ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+url.QueryEscape(fileName)) |
|
|
|
ctx.Resp.Header().Set("Content-Type", "application/octet-stream") |
|
|
|
|
|
|
|
f.WriteTo(ctx.Resp) |
|
|
|
|
|
|
|
} |