diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index e72017215..c7f096e53 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -41,13 +41,13 @@ DEFAULT_CLOSE_ISSUES_VIA_COMMITS_IN_ANY_BRANCH = false ; Allow users to push local repositories to Gitea and have them automatically created for a user or an org ENABLE_PUSH_CREATE_USER = false ENABLE_PUSH_CREATE_ORG = false -; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki +; Comma separated list of globally disabled repo units. Allowed values: repo.issues, repo.ext_issues, repo.pulls, repo.wiki, repo.ext_wiki, repo.datasets DISABLED_REPO_UNITS = -; Comma separated list of default repo units. Allowed values: repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki. +; Comma separated list of default repo units. Allowed values: repo.code, repo.releases, repo.issues, repo.pulls, repo.wiki, repo.datasets. ; Note: Code and Releases can currently not be deactivated. If you specify default repo units you should still list them for future compatibility. ; External wiki and issue tracker can't be enabled by default as it requires additional settings. ; Disabled repo units will not be added to new repositories regardless if it is in the default list. -DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki +DEFAULT_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki,repo.datasets ; Prefix archive files by placing them in a directory named after the repository PREFIX_ARCHIVE_FILES = true diff --git a/custom/templates/base/footer_content.tmpl b/custom/templates/base/footer_content.tmpl deleted file mode 100644 index 2a144f821..000000000 --- a/custom/templates/base/footer_content.tmpl +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/custom/templates/base/head.tmpl b/custom/templates/base/head.tmpl deleted file mode 100644 index cad2c976d..000000000 --- a/custom/templates/base/head.tmpl +++ /dev/null @@ -1,196 +0,0 @@ - - -
- - - -{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}
-{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}
-{{.DescriptionHTML}}
{{end}} - {{if .Topics }} - - {{end}} -{{$.i18n.Tr "org.repo_updated"}} {{TimeSinceUnix .UpdatedUnix $.i18n.Lang}}
-
\ No newline at end of file
diff --git a/custom/templates/explore/repo_search.tmpl b/custom/templates/explore/repo_search.tmpl
deleted file mode 100644
index 6c973026a..000000000
--- a/custom/templates/explore/repo_search.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-Open Intelligence,Open Source,Open Community,Open Ecosystem
- -- OpenI社区旨在促进人工智能领域的开源开放协同创新,构建OpenI的技术链、创新链和生态链、推动人工智能产业健康快速发展及其在社会经济各领域的广泛应用。围绕重大产业创新,汇聚创新资源,促进众创共享,形成产业生态的目标,让"一体两翼"构想下的以技术专家为主体组成的多个工作组(标准工作组、知识产权工作组、投融资工作组、开源治理工作组等)、和以企业为主体的多个应用推进组(智能交通推进组、智能医疗推进组、智能金融推进组、智能教育推进组等)作为一个整体进行工作。以"完全开源、完全开放、完全免费、尊重创新"为准则,汇聚学术机构、商业实体、自然人或任何其他法人,共建共享开源软件、开源硬件和开源数据的超级社区;以众智、赛智、创智、有智等工作方法,努力建设成具有国际影响力的人工智能开源开放平台。 -
- 加入OpenI社区 -
- {{.Org.Description}}
{{end}} - -{user}, {repo} 和 {index} 作为用户名、仓库名和工单索引。
+settings.tracker_url_format_desc=使用占位符 {user}, {repo} 和 {index} 作为用户名、项目名和工单索引。
settings.enable_timetracker=启用时间跟踪
settings.allow_only_contributors_to_track_time=仅允许成员跟踪时间
settings.pulls_desc=启用合并请求
@@ -1428,56 +1441,56 @@ settings.pulls.allow_rebase_merge=启用变基合并提交
settings.pulls.allow_rebase_merge_commit=启用变基显式合并 (--no-ff)
settings.pulls.allow_squash_commits=启用Squash合并提交
settings.admin_settings=管理员设置
-settings.admin_enable_health_check=启用仓库健康检查 (git fsck)
+settings.admin_enable_health_check=启用项目健康检查 (git fsck)
settings.admin_enable_close_issues_via_commit_in_any_branch=通过在非默认分支中提交来关闭工单
settings.danger_zone=危险操作区
-settings.new_owner_has_same_repo=新的仓库拥有者已经存在同名仓库!
-settings.convert=转换为普通仓库
-settings.convert_desc=您可以将该镜像仓库转换为普通仓库,但此操作不可恢复。
-settings.convert_notices_1=该操作会将镜像仓库转换为普通仓库,但该操作不可恢复。
-settings.convert_confirm=转换仓库
-settings.convert_succeed=此镜像仓库已经转换为普通仓库。
-settings.transfer=转移仓库所有权
-settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。
+settings.new_owner_has_same_repo=新的项目拥有者已经存在同名项目!
+settings.convert=转换为普通项目
+settings.convert_desc=您可以将该镜像项目转换为普通项目,但此操作不可恢复。
+settings.convert_notices_1=该操作会将镜像项目转换为普通项目,但该操作不可恢复。
+settings.convert_confirm=转换项目
+settings.convert_succeed=此镜像项目已经转换为普通项目。
+settings.transfer=转移项目所有权
+settings.transfer_desc=您可以将项目转移至您拥有管理员权限的帐户或组织。
settings.transfer_notices_1=-如果将其传输给单个用户, 您将失去对存储库的访问权限。
-settings.transfer_notices_2=-如果将其转移到您 (共同) 拥有的组织,您可以继续访问该仓库。
-settings.transfer_form_title=输入仓库名称以做确认:
+settings.transfer_notices_2=-如果将其转移到您 (共同) 拥有的组织,您可以继续访问该项目。
+settings.transfer_form_title=输入项目名称以做确认:
settings.wiki_delete=删除百科数据
-settings.wiki_delete_desc=删除仓库百科数据是永久性的,无法撤消。
+settings.wiki_delete_desc=删除项目百科数据是永久性的,无法撤消。
settings.wiki_delete_notices_1=- 这将永久删除和禁用 %s 的百科。
settings.confirm_wiki_delete=删除百科数据
-settings.wiki_deletion_success=仓库百科数据删除成功!
-settings.delete=删除本仓库
-settings.delete_desc=删除仓库是永久性的, 无法撤消。
+settings.wiki_deletion_success=项目百科数据删除成功!
+settings.delete=删除本项目
+settings.delete_desc=删除项目是永久性的, 无法撤消。
settings.delete_notices_1=- 此操作 不可以 被回滚。
-settings.delete_notices_2=- 此操作将永久删除仓库 %s,包括 Git 数据、 工单、评论、百科和协作者的操作权限。
-settings.delete_notices_fork_1=- 在此仓库删除后,它的派生仓库将变成独立仓库。
-settings.deletion_success=仓库已被删除。
-settings.update_settings_success=仓库设置已更新。
+settings.delete_notices_2=- 此操作将永久删除项目 %s,包括 Git 数据、 工单、评论、百科和协作者的操作权限。
+settings.delete_notices_fork_1=- 在此项目删除后,它的派生项目将变成独立项目。
+settings.deletion_success=项目已被删除。
+settings.update_settings_success=项目设置已更新。
settings.transfer_owner=新拥有者
settings.make_transfer=开始转移
-settings.transfer_succeed=仓库已被转移。
-settings.confirm_delete=删除本仓库
+settings.transfer_succeed=项目已被转移。
+settings.confirm_delete=删除本项目
settings.add_collaborator=增加协作者
settings.add_collaborator_success=协作者添加成功!
settings.add_collaborator_inactive_user=无法添加未激活的用户作为合作者。
-settings.add_collaborator_duplicate=合作者已经被添加到本仓库。
+settings.add_collaborator_duplicate=合作者已经被添加到本项目。
settings.delete_collaborator=删除
settings.collaborator_deletion=删除协作者
-settings.collaborator_deletion_desc=删除协作者后他将无法再对此仓库的访问。继续?
+settings.collaborator_deletion_desc=删除协作者后他将无法再对此项目的访问。继续?
settings.remove_collaborator_success=协作者删除成功!
settings.search_user_placeholder=搜索用户...
-settings.org_not_allowed_to_be_collaborator=组织不允许被添加为仓库协作者!
-settings.change_team_access_not_allowed=更改仓库的团队访问权限仅限于组织所有者
-settings.team_not_in_organization=团队不在与仓库相同的组织中
+settings.org_not_allowed_to_be_collaborator=组织不允许被添加为项目协作者!
+settings.change_team_access_not_allowed=更改项目的团队访问权限仅限于组织所有者
+settings.team_not_in_organization=团队不在与项目相同的组织中
settings.teams=团队
settings.add_team=添加团队
-settings.add_team_duplicate=团队已经拥有仓库
-settings.add_team_success=团队现在可以访问仓库。
+settings.add_team_duplicate=团队已经拥有项目
+settings.add_team_success=团队现在可以访问项目。
settings.search_team=搜索团队...
-settings.change_team_permission_tip=团队权限设置于团队设置页面,不能根据仓库更改
-settings.delete_team_tip=该团队仍有仓库, 无法删除
-settings.remove_team_success=团队访问仓库的权限已被删除。
+settings.change_team_permission_tip=团队权限设置于团队设置页面,不能根据项目更改
+settings.delete_team_tip=该团队仍有项目, 无法删除
+settings.remove_team_success=团队访问项目的权限已被删除。
settings.add_webhook=添加 Web 钩子
settings.add_webhook.invalid_channel_name=Webhook 通道名称不能为空且不能仅包含一个 # 字符。
settings.hooks_desc=当Gitea事件发生时,Web钩子自动发出HTTP POST请求。在 指南 中阅读更多内容。
@@ -1511,19 +1524,19 @@ settings.event_desc=触发条件:
settings.event_push_only=推送事件
settings.event_send_everything=所有事件
settings.event_choose=自定义事件...
-settings.event_header_repository=仓库事件
+settings.event_header_repository=项目事件
settings.event_create=创建
settings.event_create_desc=创建分支或标签
settings.event_delete=刪除
settings.event_delete_desc=分支或标签已删除。
settings.event_fork=派生
-settings.event_fork_desc=仓库被派生。
+settings.event_fork_desc=项目被派生。
settings.event_release=版本发布
settings.event_release_desc=发布、更新或删除版本时。
settings.event_push=推送
-settings.event_push_desc=Git 仓库推送
-settings.event_repository=仓库
-settings.event_repository_desc=创建或删除仓库
+settings.event_push_desc=Git 项目推送
+settings.event_repository=项目
+settings.event_repository_desc=创建或删除项目
settings.event_header_issue=工单事件
settings.event_issues=工单
settings.event_issues_desc=工单已打开、已关闭、已重新打开或已编辑。
@@ -1560,21 +1573,21 @@ settings.update_hook_success=Web 钩子更新成功!
settings.delete_webhook=删除 Web 钩子
settings.recent_deliveries=最近推送记录
settings.hook_type=钩子类型
-settings.add_slack_hook_desc=将 Slack 集成到您的仓库中。
+settings.add_slack_hook_desc=将 Slack 集成到您的项目中。
settings.slack_token=令牌
settings.slack_domain=域名
settings.slack_channel=频道
-settings.add_discord_hook_desc=将 Discord 集成到您的仓库中。
-settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的仓库中。
-settings.add_telegram_hook_desc=将 Telegram 集成到您的仓库中。
-settings.add_matrix_hook_desc=将 Matrix 集成到您的仓库中。
-settings.add_msteams_hook_desc=将 Microsoft Teams 集成到您的仓库中。
-settings.add_feishu_hook_desc=将 Feishu 集成到您的仓库中。
+settings.add_discord_hook_desc=将 Discord 集成到您的项目中。
+settings.add_dingtalk_hook_desc=将 Dingtalk 集成到您的项目中。
+settings.add_telegram_hook_desc=将 Telegram 集成到您的项目中。
+settings.add_matrix_hook_desc=将 Matrix 集成到您的项目中。
+settings.add_msteams_hook_desc=将 Microsoft Teams 集成到您的项目中。
+settings.add_feishu_hook_desc=将 Feishu 集成到您的项目中。
settings.deploy_keys=管理部署密钥
settings.add_deploy_key=添加部署密钥
-settings.deploy_key_desc=部署密钥具有对仓库的只读拉取权限。
+settings.deploy_key_desc=部署密钥具有对项目的只读拉取权限。
settings.is_writable=启用写权限
-settings.is_writable_info=允许此部署密钥 推送 提交到仓库。
+settings.is_writable_info=允许此部署密钥 推送 提交到项目。
settings.no_deploy_keys=没有部署密钥。
settings.title=标题
settings.deploy_key_content=密钥文本
@@ -1609,7 +1622,7 @@ settings.protect_merge_whitelist_users=合并白名单用户:
settings.protect_merge_whitelist_teams=合并白名单团队:
settings.protect_check_status_contexts=启用状态检查
settings.protect_check_status_contexts_desc=要求状态检查通过才能合并,选择必须先通过哪些状态检查才能合并。如果启用,推送的合并请求必须先通过状态检查才能够合并到对应的分支。如果没有选择具体的状态检查上下文,则所有的状态检查都通过才能合并。
-settings.protect_check_status_contexts_list=此仓库上周进行过的状态检查
+settings.protect_check_status_contexts_list=此项目上周进行过的状态检查
settings.protect_required_approvals=所需的批准:
settings.protect_required_approvals_desc=只允许合并有足够审核人数的拉取请求。
settings.protect_approvals_whitelist_enabled=批准仅限列入白名单的用户或团队
@@ -1643,22 +1656,22 @@ settings.matrix.homeserver_url=主服务器网址
settings.matrix.room_id=房间ID
settings.matrix.access_token=访问令牌(Access Token)
settings.matrix.message_type=消息类型
-settings.archive.button=归档仓库
-settings.archive.header=归档此仓库
-settings.archive.text=归档后仓库将只有只读权限,并在仪表盘中被隐藏。你将不能再对其建立提交、创建工单或建立合并请求。
-settings.archive.success=仓库已成功归档。
-settings.archive.error=仓库在归档时出现异常。请通过日志获取详细信息。
-settings.archive.error_ismirror=请不要对镜像仓库归档,谢谢!
-settings.archive.branchsettings_unavailable=已归档仓库无法进行分支设置。
-settings.unarchive.button=撤销仓库归档
-settings.unarchive.header=撤销此仓库归档
-settings.unarchive.text=取消存档将恢复仓库接收提交,推送,新工单和合并请求。
-settings.unarchive.success=仓库已成功取消归档。
-settings.unarchive.error=仓库在撤销归档时出现异常。请通过日志获取详细信息。
-settings.update_avatar_success=仓库头像已经更新。
+settings.archive.button=归档项目
+settings.archive.header=归档此项目
+settings.archive.text=归档后项目将只有只读权限,并在仪表盘中被隐藏。你将不能再对其建立提交、创建工单或建立合并请求。
+settings.archive.success=项目已成功归档。
+settings.archive.error=项目在归档时出现异常。请通过日志获取详细信息。
+settings.archive.error_ismirror=请不要对镜像项目归档,谢谢!
+settings.archive.branchsettings_unavailable=已归档项目无法进行分支设置。
+settings.unarchive.button=撤销项目归档
+settings.unarchive.header=撤销此项目归档
+settings.unarchive.text=取消存档将恢复项目接收提交,推送,新工单和合并请求。
+settings.unarchive.success=项目已成功取消归档。
+settings.unarchive.error=项目在撤销归档时出现异常。请通过日志获取详细信息。
+settings.update_avatar_success=项目头像已经更新。
settings.lfs=LFS
-settings.lfs_filelist=存储在此仓库中的 LFS 文件
-settings.lfs_no_lfs_files=此仓库中没有 LFS 文件
+settings.lfs_filelist=存储在此项目中的 LFS 文件
+settings.lfs_no_lfs_files=此项目中没有 LFS 文件
settings.lfs_findcommits=查找提交
settings.lfs_lfs_file_no_commits=没有找到关于此 LFS 文件的提交
settings.lfs_noattribute=此路径在默认分支中没有可锁定的属性
@@ -1674,11 +1687,11 @@ settings.lfs_lock_path=要锁定的文件路径...
settings.lfs_locks_no_locks=无锁定
settings.lfs_lock_file_no_exist=锁定的文件在默认分支中不存在
settings.lfs_force_unlock=强制解锁
-settings.lfs_pointers.found=找到 %d 个块指针 - %d 个关联, %d 个未关联(%d 个从仓库丢失)
+settings.lfs_pointers.found=找到 %d 个块指针 - %d 个关联, %d 个未关联(%d 个从项目丢失)
settings.lfs_pointers.sha=Blob SHA
settings.lfs_pointers.oid=OID
-settings.lfs_pointers.inRepo=在仓库中
-settings.lfs_pointers.exists=在仓库中存在
+settings.lfs_pointers.inRepo=在项目中
+settings.lfs_pointers.exists=在项目中存在
settings.lfs_pointers.accessible=用户可访问
settings.lfs_pointers.associateAccessible=关联可访问的 %d OID
@@ -1745,7 +1758,7 @@ release.save_draft=保存草稿
release.edit_release=保存此次发布
release.delete_release=删除发布
release.deletion=删除发布
-release.deletion_desc=删除一个版本发布将从仓库中删除对应的Git标签。仓库内容和历史将保持不变,继续?
+release.deletion_desc=删除一个版本发布将从项目中删除对应的Git标签。项目内容和历史将保持不变,继续?
release.deletion_success=Release已被删除。
release.tag_name_already_exist=使用此标签名称的发布版本已经存在。
release.tag_name_invalid=标签名称无效。
@@ -1765,7 +1778,7 @@ branch.delete_branch_has_new_commits=因为合并之后有新的提交,分支
branch.create_branch=创建分支 %s
branch.create_from=从 '%s'
branch.create_success=分支 '%s' 已创建。
-branch.branch_already_exists=此仓库已存在名为 '%s' 的分支。
+branch.branch_already_exists=此项目已存在名为 '%s' 的分支。
branch.branch_name_conflict=分支 '%s' 与已存在的分支 '%s' 名称冲突。
branch.tag_collision=分支 '%s' 不能被创建因为同名的标签已经存在。
branch.deleted_by=删除人:%s
@@ -1792,7 +1805,7 @@ repo_updated=最后更新于
people=组织成员
teams=组织团队
lower_members=名成员
-lower_repositories=个仓库
+lower_repositories=个项目
create_new_team=新建团队
create_team=创建团队
org_desc=组织描述
@@ -1800,13 +1813,13 @@ team_name=团队名称
team_desc=团队描述
team_name_helper=团队名字应该简单明了。
team_desc_helper=描述团队的目的或作用。
-team_access_desc=仓库权限
+team_access_desc=项目权限
team_permission_desc=权限
-team_unit_desc=允许访问仓库单元
+team_unit_desc=允许访问项目单元
team_unit_disabled=(已禁用)
form.name_reserved=组织名称 '%s' 是被保留的。
-form.name_pattern_not_allowed=仓库名称中不允许使用 "%s"。
+form.name_pattern_not_allowed=项目名称中不允许使用 "%s"。
form.create_org_not_allowed=此账号禁止创建组织
settings=组织设置
@@ -1815,7 +1828,7 @@ settings.full_name=组织全名
settings.website=官方网站
settings.location=所在地区
settings.permission=权限
-settings.repoadminchangeteam=仓库管理员可以添加或移除团队的访问权限
+settings.repoadminchangeteam=项目管理员可以添加或移除团队的访问权限
settings.visibility=可见性
settings.visibility.public=公开
settings.visibility.limited=受限 (仅对登录用户可见)
@@ -1831,9 +1844,9 @@ settings.delete_prompt=删除操作会永久清除该组织的信息,并且 %[1]s 为 %[3]s
+create_repo=创建了项目 %s
+rename_repo=重命名项目 %[1]s 为 %[3]s
commit_repo=推送了 %[3]s 分支的代码到 %[4]s
create_issue=`创建了工单 %s#%[2]s`
close_issue=`关闭了工单 %s#%[2]s`
@@ -2373,7 +2386,7 @@ reopen_pull_request=`重新开启了合并请求 %s#%[2]s<
comment_issue=`评论了工单 %s#%[2]s`
comment_pull=`评论了合并请求 %s#%[2]s`
merge_pull_request=`合并了合并请求 %s#%[2]s`
-transfer_repo=将仓库 %s 转移至 %s
+transfer_repo=将项目 %s 转移至 %s
push_tag=推送了标签 %[2]s 到 %[3]s
delete_tag=从%[3]s 删除了标签 %[2]s
delete_branch=从 %[3]s 删除分支 %[2]s
@@ -2437,8 +2450,8 @@ error.probable_bad_signature=警告!虽然数据库中有一个此ID的密钥
error.probable_bad_default_signature=警告!虽然默认密钥拥有此ID,但它没有验证此提交!此提交是有疑问的。
[units]
-error.no_unit_allowed_repo=您没有被允许访问此仓库的任何单元。
-error.unit_not_allowed=您没有权限访问此仓库单元
+error.no_unit_allowed_repo=您没有被允许访问此项目的任何单元。
+error.unit_not_allowed=您没有权限访问此项目单元
[custom]
head.community=社区
diff --git a/routers/dataset/dataset.go b/routers/dataset/dataset.go
deleted file mode 100644
index cef5da45a..000000000
--- a/routers/dataset/dataset.go
+++ /dev/null
@@ -1,256 +0,0 @@
-package dataset
-
-import (
- "errors"
- "strings"
-
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/auth"
- "code.gitea.io/gitea/modules/base"
- "code.gitea.io/gitea/modules/context"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/routers/repo"
- "github.com/unknwon/com"
-)
-
-const (
- tplDataSet base.TplName = "datasets/index"
- tplShow base.TplName = "datasets/show"
- tplCreate base.TplName = "datasets/create"
- tplEdit base.TplName = "datasets/edit"
-)
-
-type ListOptions struct {
- PageSize int
- Page int // start from 1
-}
-
-func List(ctx *context.Context) {
- ctx.Data["PageIsDatasets"] = true
-
- var (
- datasets []*models.Dataset
- count int64
- err error
- orderBy models.SearchOrderBy
- )
-
- page := ctx.QueryInt("page")
- if page <= 0 {
- page = 1
- }
- ctx.Data["SortType"] = ctx.Query("sort")
- switch ctx.Query("sort") {
- case "newest":
- orderBy = models.SearchOrderByNewest
- case "oldest":
- orderBy = models.SearchOrderByOldest
- case "recentupdate":
- orderBy = models.SearchOrderByRecentUpdated
- case "leastupdate":
- orderBy = models.SearchOrderByLeastUpdated
- case "reversealphabetically":
- orderBy = models.SearchOrderByAlphabeticallyReverse
- case "alphabetically":
- orderBy = models.SearchOrderByAlphabetically
- case "reversesize":
- orderBy = models.SearchOrderBySizeReverse
- default:
- ctx.Data["SortType"] = "recentupdate"
- orderBy = models.SearchOrderByRecentUpdated
- }
- keyword := strings.Trim(ctx.Query("q"), " ")
- var userID int64
- if ctx.User != nil {
- userID = ctx.User.ID
- }
- opts := &models.SearchDatasetOptions{
- Keyword: keyword,
- IncludePublic: true,
- SearchOrderBy: orderBy,
- OwnerID: userID,
- ListOptions: models.ListOptions{
- Page: page,
- PageSize: setting.UI.ExplorePagingNum,
- },
- }
-
- if len(opts.SearchOrderBy) == 0 {
- opts.SearchOrderBy = models.SearchOrderByAlphabetically
- }
-
- datasets, count, err = models.SearchDataset(opts)
- if err != nil {
- ctx.ServerError("SearchDatasets", err)
- return
- }
-
- pager := context.NewPagination(int(count), opts.PageSize, page, 5)
- pager.SetDefaultParams(ctx)
- ctx.Data["Page"] = pager
-
- ctx.Data["datasets"] = datasets
- ctx.Data["datasetsCount"] = count
- ctx.HTML(200, tplDataSet)
-}
-
-func Create(ctx *context.Context) {
- ctx.HTML(200, tplCreate)
-}
-
-func CreatePost(ctx *context.Context, form auth.CreateDatasetForm) {
- ctx.Data["Title"] = ctx.Tr("new_dataset")
-
- ctxUser := ctx.User
-
- if ctx.HasError() {
- ctx.HTML(200, tplCreate)
- return
- }
-
- status := models.DatasetStatusPublic
- if form.Private {
- status = models.DatasetStatusPrivate
- }
-
- var err error
- opts := models.Dataset{
- Title: form.Title,
- Category: form.Category,
- Description: form.Description,
- License: form.License,
- Task: form.Task,
- ReleaseID: form.ReleaseID,
- UserID: ctxUser.ID,
- Status: status,
- }
-
- if err = models.CreateDataset(&opts); err != nil {
- log.Error("%v", err)
- }
-
- var attachmentUUIDs []string
- if setting.Attachment.Enabled {
- attachmentUUIDs = form.Files
- }
-
- if err = models.AddDatasetAttachments(opts.ID, attachmentUUIDs); err != nil {
- log.Error("%v", err)
- }
-
- if err == nil {
- log.Trace("Dataset created [%d]: %s/%s", opts.ID, ctxUser.Name, opts.Title)
- ctx.Redirect(setting.AppSubURL + "/datasets/" + com.ToStr(opts.ID))
- return
- }
-}
-
-func Show(ctx *context.Context) {
- ctx.Data["Title"] = ctx.Tr("dataset.show_dataset")
-
- user := ctx.User
- dataset, err := models.GetOwnerDatasetByID(ctx.ParamsInt64((":id")), user)
- if err != nil {
- ctx.NotFound("GetDataset", err)
- return
- }
-
- err = models.GeDatasetAttachments(dataset)
- if err != nil {
- ctx.ServerError("GetDatasetAttachments", err)
- return
- }
-
- isOwner := (ctx.User != nil && dataset.UserID == user.ID)
-
- ctx.Data["dataset"] = dataset
- ctx.Data["IsOwner"] = isOwner
-
- ctx.HTML(200, tplShow)
-}
-
-// EditDataset render release edit page
-func EditDataset(ctx *context.Context) {
- ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset")
- ctx.Data["PageIsEditDataset"] = true
- repo.RenderAttachmentSettings(ctx)
- rel, err := models.GetOwnerDatasetByID(ctx.ParamsInt64(":id"), ctx.User)
- if err != nil {
- ctx.NotFound("GetDataset", err)
- return
- }
- isOwner := (ctx.User != nil && rel.UserID == ctx.User.ID)
- if !isOwner {
- ctx.NotFound("403", errors.New("not owner"))
- return
- }
-
- ctx.Data["ID"] = rel.ID
- ctx.Data["title"] = rel.Title
- ctx.Data["private"] = rel.IsPrivate()
- ctx.Data["description"] = rel.Description
- ctx.Data["category"] = rel.Category
- ctx.Data["task"] = rel.Task
- ctx.Data["license"] = rel.License
-
- ctx.HTML(200, tplEdit)
-}
-
-func EditDatasetPost(ctx *context.Context, form auth.EditDatasetForm) {
- ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset")
-
- rel, err := models.GetDatasetByID(ctx.ParamsInt64(":id"))
- if err != nil {
- ctx.ServerError("GetDataset", err)
- return
- }
- isOwner := (ctx.User != nil && rel.UserID == ctx.User.ID)
- if !isOwner {
- ctx.NotFound("403", errors.New("not owner"))
- return
- }
- ctx.Data["ID"] = rel.ID
- ctx.Data["title"] = rel.Title
- ctx.Data["description"] = rel.Description
- ctx.Data["category"] = rel.Category
- ctx.Data["task"] = rel.Task
- ctx.Data["license"] = rel.License
- ctx.Data["private"] = rel.IsPrivate()
-
- if ctx.HasError() {
- ctx.HTML(200, tplCreate)
- return
- }
-
- var attachmentUUIDs []string
- if setting.Attachment.Enabled {
- attachmentUUIDs = form.Files
- }
-
- status := models.DatasetStatusPublic
- if form.Private {
- status = models.DatasetStatusPrivate
- }
-
- rel.Title = form.Title
- rel.Status = status
- rel.Description = form.Description
- rel.Category = form.Category
- rel.Task = form.Task
- rel.License = form.License
- if err = models.UpdateDataset(models.DefaultDBContext(), rel); err != nil {
- log.Error("%v", err)
- }
-
- if err = models.AddDatasetAttachments(rel.ID, attachmentUUIDs); err != nil {
- log.Error("%v", err)
- }
- log.Trace("Dataset updated: %d", rel.ID)
-
- ctx.Redirect(setting.AppSubURL + "/datasets/" + com.ToStr(rel.ID))
-}
-
-func Delete(ctx *context.Context) {
- log.Debug("[dataset] Delete...\n")
-}
diff --git a/routers/repo/attachment.go b/routers/repo/attachment.go
index 1a1e9f186..5aa6e6b20 100644
--- a/routers/repo/attachment.go
+++ b/routers/repo/attachment.go
@@ -7,6 +7,7 @@ package repo
import (
"fmt"
"net/http"
+ "strconv"
"strings"
"code.gitea.io/gitea/models"
@@ -57,9 +58,13 @@ func UploadAttachment(ctx *context.Context) {
return
}
+ datasetID, _ := strconv.ParseInt(ctx.Req.FormValue("dataset_id"), 10, 64)
+
attach, err := models.NewAttachment(&models.Attachment{
+ IsPrivate: true,
UploaderID: ctx.User.ID,
Name: header.Filename,
+ DatasetID: datasetID,
}, buf, file)
if err != nil {
ctx.Error(500, fmt.Sprintf("NewAttachment: %v", err))
@@ -72,6 +77,18 @@ func UploadAttachment(ctx *context.Context) {
})
}
+func UpdatePublicAttachment(ctx *context.Context) {
+ file := ctx.Query("file")
+ isPrivate, _ := strconv.ParseBool(ctx.Query("is_private"))
+ attach, err := models.GetAttachmentByUUID(file)
+ if err != nil {
+ ctx.Error(404, err.Error())
+ return
+ }
+ attach.IsPrivate = isPrivate
+ models.UpdateAttachment(attach)
+}
+
// DeleteAttachment response for deleting issue's attachment
func DeleteAttachment(ctx *context.Context) {
file := ctx.Query("file")
@@ -182,7 +199,7 @@ func GetAttachment(ctx *context.Context) {
}
-func increaseDownloadCount(attach *models.Attachment, dataSet *models.Dataset) error{
+func increaseDownloadCount(attach *models.Attachment, dataSet *models.Dataset) error {
if err := attach.IncreaseDownloadCount(); err != nil {
return err
}
diff --git a/routers/repo/dataset.go b/routers/repo/dataset.go
new file mode 100644
index 000000000..6db1b74b0
--- /dev/null
+++ b/routers/repo/dataset.go
@@ -0,0 +1,114 @@
+package repo
+
+import (
+ "sort"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/auth"
+ "code.gitea.io/gitea/modules/base"
+ "code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/log"
+)
+
+const (
+ tplIndex base.TplName = "repo/datasets/index"
+)
+
+// MustEnableDataset check if repository enable internal dataset
+func MustEnableDataset(ctx *context.Context) {
+ if !ctx.Repo.CanRead(models.UnitTypeDatasets) {
+ ctx.NotFound("MustEnableDataset", nil)
+ return
+ }
+}
+
+func filterPrivateAttachments(ctx *context.Context, list []*models.Attachment) []*models.Attachment {
+ if ctx.Repo.CanWrite(models.UnitTypeDatasets) {
+ return list
+ } else {
+ var publicList []*models.Attachment
+ for _, attach := range list {
+ if !attach.IsPrivate {
+ publicList = append(publicList, attach)
+ }
+ }
+ return publicList
+ }
+
+}
+
+func DatasetIndex(ctx *context.Context) {
+ MustEnableDataset(ctx)
+
+ repo := ctx.Repo.Repository
+
+ dataset, err := models.GetDatasetByRepo(repo)
+ if err != nil {
+ ctx.NotFound("GetDatasetByRepo", err)
+ return
+ }
+ err = models.GetDatasetAttachments(dataset)
+ if err != nil {
+ ctx.ServerError("GetDatasetAttachments", err)
+ return
+ }
+ attachments := filterPrivateAttachments(ctx, dataset.Attachments)
+
+ ctx.Data["SortType"] = ctx.Query("sort")
+ switch ctx.Query("sort") {
+ case "newest":
+ sort.Slice(attachments, func(i, j int) bool {
+ return attachments[i].CreatedUnix > attachments[j].CreatedUnix
+ })
+ case "oldest":
+ sort.Slice(attachments, func(i, j int) bool {
+ return attachments[i].CreatedUnix < attachments[j].CreatedUnix
+ })
+ default:
+ ctx.Data["SortType"] = "newest"
+ sort.Slice(attachments, func(i, j int) bool {
+ return attachments[i].CreatedUnix > attachments[j].CreatedUnix
+ })
+ }
+
+ ctx.Data["PageIsDataset"] = true
+ ctx.Data["Title"] = ctx.Tr("dataset.show_dataset")
+ ctx.Data["Link"] = ctx.Repo.RepoLink + "/datasets"
+ ctx.Data["dataset"] = dataset
+ ctx.Data["Attachments"] = attachments
+ ctx.Data["IsOwner"] = true
+
+ ctx.HTML(200, tplIndex)
+}
+
+func EditDatasetPost(ctx *context.Context, form auth.EditDatasetForm) {
+ ctx.Data["PageIsDataset"] = true
+
+ ctx.Data["Title"] = ctx.Tr("dataset.edit_dataset")
+
+ rel, err := models.GetDatasetByID(form.ID)
+ ctx.Data["dataset"] = rel
+
+ if err != nil {
+ ctx.ServerError("GetDataset", err)
+ return
+ }
+
+ if ctx.HasError() {
+ ctx.Data["Error"] = true
+ ctx.HTML(200, tplIndex)
+ return
+ }
+
+ rel.Title = form.Title
+ rel.Description = form.Description
+ rel.Category = form.Category
+ rel.Task = form.Task
+ rel.License = form.License
+ if err = models.UpdateDataset(models.DefaultDBContext(), rel); err != nil {
+ ctx.Data["Error"] = true
+ ctx.HTML(200, tplIndex)
+ log.Error("%v", err)
+ }
+ ctx.Redirect(ctx.Repo.RepoLink + "/datasets")
+}
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index 7a2db88c1..dd3490f12 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -210,6 +210,22 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
// This section doesn't require repo_name/RepoName to be set in the form, don't show it
// as an error on the UI for this action
ctx.Data["Err_RepoName"] = nil
+ if err := models.CreateDefaultDatasetToRepo(repo); err != nil {
+ ctx.ServerError("CreateDefaultDatasetToRepo", err)
+ return
+ }
+
+ if form.EnableDataset && !models.UnitTypeDatasets.UnitGlobalDisabled() {
+ units = append(units, models.RepoUnit{
+ RepoID: repo.ID,
+ Type: models.UnitTypeDatasets,
+ Config: &models.DatasetConfig{
+ EnableDataset: form.EnableDataset,
+ },
+ })
+ } else if !models.UnitTypeDatasets.UnitGlobalDisabled() {
+ deleteUnitTypes = append(deleteUnitTypes, models.UnitTypeDatasets)
+ }
if form.EnableWiki && form.EnableExternalWiki && !models.UnitTypeExternalWiki.UnitGlobalDisabled() {
if !validation.IsValidExternalURL(form.ExternalWikiURL) {
diff --git a/routers/routes/routes.go b/routers/routes/routes.go
index 42e83242b..ea9dd7f65 100644
--- a/routers/routes/routes.go
+++ b/routers/routes/routes.go
@@ -26,7 +26,6 @@ import (
"code.gitea.io/gitea/routers"
"code.gitea.io/gitea/routers/admin"
apiv1 "code.gitea.io/gitea/routers/api/v1"
- "code.gitea.io/gitea/routers/dataset"
"code.gitea.io/gitea/routers/dev"
"code.gitea.io/gitea/routers/events"
"code.gitea.io/gitea/routers/org"
@@ -467,7 +466,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Group("/datasets", func() {
m.Get("", admin.Datasets)
- m.Post("/delete", admin.DeleteDataset)
+ // m.Post("/delete", admin.DeleteDataset)
})
m.Group("/^:configType(hooks|system-hooks)$", func() {
@@ -521,6 +520,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Post("/delete", repo.DeleteAttachment)
m.Get("/get_pre_url", repo.GetPresignedPutObjectURL)
m.Post("/add", repo.AddAttachment)
+ m.Post("/private", repo.UpdatePublicAttachment)
}, reqSignIn)
m.Group("/:username", func() {
@@ -542,6 +542,8 @@ func RegisterRoutes(m *macaron.Macaron) {
reqRepoPullsReader := context.RequireRepoReader(models.UnitTypePullRequests)
reqRepoIssuesOrPullsWriter := context.RequireRepoWriterOr(models.UnitTypeIssues, models.UnitTypePullRequests)
reqRepoIssuesOrPullsReader := context.RequireRepoReaderOr(models.UnitTypeIssues, models.UnitTypePullRequests)
+ reqRepoDatasetReader := context.RequireRepoReader(models.UnitTypeDatasets)
+ reqRepoDatasetWriter := context.RequireRepoWriter(models.UnitTypeDatasets)
// ***** START: Organization *****
m.Group("/org", func() {
@@ -862,6 +864,11 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Get("/milestones", reqRepoIssuesOrPullsReader, repo.Milestones)
}, context.RepoRef())
+ m.Group("/datasets", func() {
+ m.Get("", reqRepoDatasetReader, repo.DatasetIndex)
+ m.Post("", reqRepoDatasetWriter, bindIgnErr(auth.EditDatasetForm{}), repo.EditDatasetPost)
+ }, context.RepoRef())
+
m.Group("/wiki", func() {
m.Get("/?:page", repo.Wiki)
m.Get("/_pages", repo.WikiPages)
@@ -1007,18 +1014,6 @@ func RegisterRoutes(m *macaron.Macaron) {
})
})
// ***** END: Repository *****
-
- // DataSet
- m.Group("/datasets", func() {
- // m.Get("", dataset.List)
- m.Get("/create", dataset.Create)
- m.Post("/create", bindIgnErr(auth.CreateDatasetForm{}), dataset.CreatePost)
- m.Post("/delete", dataset.Delete)
- m.Get("/:id", dataset.Show)
- m.Get("/edit/:id", dataset.EditDataset)
- m.Post("/edit/:id", bindIgnErr(auth.EditDatasetForm{}), dataset.EditDatasetPost)
- }, ignSignIn)
- // ***** END: DataSet*****
m.Group("/notifications", func() {
m.Get("", user.Notifications)
m.Post("/status", user.NotificationStatusPost)
diff --git a/templates/admin/dataset/list.tmpl b/templates/admin/dataset/list.tmpl
index 0aa9a2895..1044e4c28 100644
--- a/templates/admin/dataset/list.tmpl
+++ b/templates/admin/dataset/list.tmpl
@@ -14,7 +14,6 @@