| @@ -1,7 +1,7 @@ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-courses-index-page').length > 0) { | |||
| let searchContainer = $(".course-list-form"); | |||
| let searchForm = $("form.search-form",searchContainer); | |||
| var searchContainer = $(".course-list-form"); | |||
| var searchForm = $("form.search-form",searchContainer); | |||
| searchContainer.on('change', '.course-homepage-show', function(){ | |||
| searchForm.find('input[type="submit"]').trigger('click'); | |||
| @@ -0,0 +1,76 @@ | |||
| /* | |||
| * @Description: Do not edit | |||
| * @Date: 2021-08-31 11:16:45 | |||
| * @LastEditors: viletyy | |||
| * @Author: viletyy | |||
| * @LastEditTime: 2021-08-31 14:19:46 | |||
| * @FilePath: /forgeplus/app/assets/javascripts/admins/reversed_keywords/index.js | |||
| */ | |||
| $(document).on('turbolinks:load', function(){ | |||
| var showSuccessNotify = function() { | |||
| $.notify({ | |||
| message: '操作成功' | |||
| },{ | |||
| type: 'success' | |||
| }); | |||
| } | |||
| // close user | |||
| $('.reversed-keyword-list-container').on('click', '.close-action', function(){ | |||
| var $closeAction = $(this); | |||
| var $uncloseAction = $closeAction.siblings('.unclose-action'); | |||
| var keywordID = $closeAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认关闭限制吗?', | |||
| ok: function(){ | |||
| $.ajax({ | |||
| url: '/admins/reversed_keywords/' + keywordID, | |||
| method: 'PUT', | |||
| dataType: 'json', | |||
| data: { | |||
| reversed_keyword: { | |||
| closed: true | |||
| } | |||
| }, | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| $closeAction.hide(); | |||
| $uncloseAction.show(); | |||
| $(".reversed-keyword-item-"+keywordID).children('td').eq(3).text("") | |||
| } | |||
| }); | |||
| } | |||
| }); | |||
| }); | |||
| // unclose user | |||
| $('.reversed-keyword-list-container').on('click', '.unclose-action', function(){ | |||
| var $uncloseAction = $(this); | |||
| var $closeAction = $uncloseAction.siblings('.close-action'); | |||
| var keywordID = $uncloseAction.data('id'); | |||
| customConfirm({ | |||
| content: '确认开启限制吗?', | |||
| ok: function () { | |||
| $.ajax({ | |||
| url: '/admins/reversed_keywords/' + keywordID, | |||
| method: 'PUT', | |||
| dataType: 'json', | |||
| data: { | |||
| reversed_keyword: { | |||
| closed: false | |||
| } | |||
| }, | |||
| success: function() { | |||
| showSuccessNotify(); | |||
| $closeAction.show(); | |||
| $uncloseAction.hide(); | |||
| $(".reversed-keyword-item-"+keywordID).children('td').eq(3).text("√") | |||
| } | |||
| }); | |||
| } | |||
| }) | |||
| }); | |||
| }) | |||
| @@ -1,7 +1,15 @@ | |||
| /* | |||
| * @Description: Do not edit | |||
| * @Date: 2021-07-16 11:58:16 | |||
| * @LastEditors: viletyy | |||
| * @Author: viletyy | |||
| * @LastEditTime: 2021-08-31 14:48:59 | |||
| * @FilePath: /forgeplus/app/assets/javascripts/admins/shixun_settings/index.js | |||
| */ | |||
| $(document).on('turbolinks:load', function() { | |||
| if ($('body.admins-shixun-settings-index-page').length > 0) { | |||
| let searchContainer = $(".shixun-settings-list-form"); | |||
| let searchForm = $("form.search-form",searchContainer); | |||
| var searchContainer = $(".shixun-settings-list-form"); | |||
| var searchForm = $("form.search-form",searchContainer); | |||
| searchContainer.on('change', '.shixun-settings-select', function(){ | |||
| searchForm.find('input[type="submit"]').trigger('click'); | |||
| @@ -23,6 +23,7 @@ class AccountsController < ApplicationController | |||
| # 其他平台同步注册的用户 | |||
| def remote_register | |||
| username = params[:username]&.gsub(/\s+/, "") | |||
| tip_exception("无法使用以下关键词:#{username},请重新命名") if ReversedKeyword.is_reversed(username).present? | |||
| email = params[:email]&.gsub(/\s+/, "") | |||
| password = params[:password] | |||
| platform = (params[:platform] || 'forge')&.gsub(/\s+/, "") | |||
| @@ -0,0 +1,84 @@ | |||
| class Admins::ReversedKeywordsController < Admins::BaseController | |||
| before_action :get_keyword, only: [:edit,:update, :destroy] | |||
| # before_action :validate_identifer, only: [:create, :update] | |||
| def index | |||
| sort_by = ReversedKeyword.column_names.include?(params[:sort_by]) ? params[:sort_by] : 'created_at' | |||
| sort_direction = %w(desc asc).include?(params[:sort_direction]) ? params[:sort_direction] : 'desc' | |||
| q = ReversedKeyword.ransack(identifier_cont: params[:search]) | |||
| keywords = q.result(distinct: true).order("#{sort_by} #{sort_direction}") | |||
| @keywords = paginate(keywords) | |||
| end | |||
| def new | |||
| @keyword = ReversedKeyword.new | |||
| end | |||
| def edit | |||
| end | |||
| def create | |||
| @keyword = ReversedKeyword.new(keyword_params) | |||
| if @keyword.save | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:success] = '系统保留关键词创建成功' | |||
| else | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = @keyword.errors.full_messages.join(",") | |||
| end | |||
| end | |||
| def update | |||
| respond_to do |format| | |||
| if @keyword.update_attributes(keyword_params) | |||
| format.html do | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:success] = '系统保留关键词更新成功' | |||
| end | |||
| format.js {render_ok} | |||
| else | |||
| format.html do | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = @keyword.errors.full_messages.join(",") | |||
| end | |||
| format.js {render_js_error} | |||
| end | |||
| end | |||
| end | |||
| def destroy | |||
| if @keyword.destroy | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:success] = "系统保留关键词删除成功" | |||
| else | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = "系统保留关键词删除失败" | |||
| end | |||
| end | |||
| private | |||
| def keyword_params | |||
| params.require(:reversed_keyword).permit! | |||
| end | |||
| def get_keyword | |||
| @keyword = ReversedKeyword.find_by(id: params[:id]) | |||
| unless @keyword.present? | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = "系统保留关键词不存在" | |||
| end | |||
| end | |||
| def validate_identifer | |||
| identifer = keyword_params[:identifier].to_s.downcase | |||
| if identifer.blank? | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = '系统保留关键词标识不能为空' | |||
| elsif ProjectLanguage.exists?(name: identifer) | |||
| redirect_to admins_reversed_keywords_path | |||
| flash[:danger] = '系统保留关键词已存在' | |||
| end | |||
| end | |||
| end | |||
| @@ -246,6 +246,14 @@ class ApplicationController < ActionController::Base | |||
| tip_exception(401, "请登录后再操作") unless User.current.logged? | |||
| end | |||
| def require_profile_completed | |||
| tip_exception(411, "请完善资料后再操作") unless User.current.profile_completed | |||
| end | |||
| def require_user_profile_completed(user) | |||
| tip_exception(412, "请用户完善资料后再操作") unless user.profile_completed | |||
| end | |||
| # 异常提醒 | |||
| def tip_exception(status = -1, message) | |||
| raise Educoder::TipException.new(status, message) | |||
| @@ -1,5 +1,6 @@ | |||
| class ForksController < ApplicationController | |||
| before_action :require_login | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :load_project | |||
| before_action :authenticate_project!, :authenticate_user! | |||
| @@ -1,7 +1,9 @@ | |||
| class IssuesController < ApplicationController | |||
| before_action :require_login, except: [:index, :show, :index_chosen] | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :load_project | |||
| before_action :set_user | |||
| before_action :check_menu_authorize, except: [:index_chosen] | |||
| before_action :check_issue_permission | |||
| before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy] | |||
| before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue] | |||
| @@ -13,7 +15,6 @@ class IssuesController < ApplicationController | |||
| include TagChosenHelper | |||
| def index | |||
| return render_not_found unless @project.has_menu_permission("issues") | |||
| @user_admin_or_member = current_user.present? && current_user.logged? && (current_user.admin || @project.member?(current_user)) | |||
| issues = @project.issues.issue_issue.issue_index_includes | |||
| issues = issues.where(is_private: false) unless @user_admin_or_member | |||
| @@ -499,4 +500,8 @@ class IssuesController < ApplicationController | |||
| return normal_status(-1, "您的token值不足") if JSON.parse(response.body)["balance"].to_i < params[:token].to_i | |||
| end | |||
| end | |||
| def check_menu_authorize | |||
| return render_not_found unless @project.has_menu_permission("issues") | |||
| end | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| class JournalsController < ApplicationController | |||
| before_action :require_login, except: [:index, :get_children_journals] | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :set_issue | |||
| before_action :check_issue_permission | |||
| before_action :set_journal, only: [:destroy, :edit, :update] | |||
| @@ -2,6 +2,7 @@ class MembersController < ApplicationController | |||
| before_action :require_login | |||
| before_action :load_project | |||
| before_action :find_user_with_id, only: %i[create remove change_role] | |||
| before_action :check_user_profile_completed, only: [:create] | |||
| before_action :operate!, except: %i[index] | |||
| before_action :check_member_exists!, only: %i[create] | |||
| before_action :check_member_not_exists!, only: %i[remove change_role] | |||
| @@ -70,4 +71,8 @@ class MembersController < ApplicationController | |||
| def check_member_not_exists! | |||
| return render_error("user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists? | |||
| end | |||
| def check_user_profile_completed | |||
| require_user_profile_completed(@user) | |||
| end | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| class Organizations::OrganizationsController < Organizations::BaseController | |||
| before_action :require_login, except: [:index, :show, :recommend] | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :convert_image!, only: [:create, :update] | |||
| before_action :load_organization, only: [:show, :update, :destroy] | |||
| before_action :check_user_can_edit_org, only: [:update, :destroy] | |||
| @@ -25,6 +26,7 @@ class Organizations::OrganizationsController < Organizations::BaseController | |||
| def create | |||
| ActiveRecord::Base.transaction do | |||
| tip_exception("无法使用以下关键词:#{organization_params[:name]},请重新命名") if ReversedKeyword.is_reversed(organization_params[:name]).present? | |||
| Organizations::CreateForm.new(organization_params).validate! | |||
| @organization = Organizations::CreateService.call(current_user, organization_params) | |||
| Util.write_file(@image, avatar_path(@organization)) if params[:image].present? | |||
| @@ -1,6 +1,7 @@ | |||
| class Organizations::TeamUsersController < Organizations::BaseController | |||
| before_action :load_organization, :load_team | |||
| before_action :load_operate_user, only: [:create, :destroy] | |||
| before_action :check_user_profile_completed, only: [:create] | |||
| before_action :load_team_user, only: [:destroy] | |||
| before_action :check_user_can_edit_org, only: [:create, :destroy] | |||
| @@ -83,4 +84,8 @@ class Organizations::TeamUsersController < Organizations::BaseController | |||
| tip_exception("组织团队成员不存在") if @team_user.nil? | |||
| end | |||
| def check_user_profile_completed | |||
| require_user_profile_completed(@operate_user) | |||
| end | |||
| end | |||
| @@ -1,5 +1,5 @@ | |||
| class OwnersController < ApplicationController | |||
| before_action :require_login | |||
| before_action :require_login, only: [:index] | |||
| def index | |||
| @owners = [] | |||
| @@ -9,4 +9,53 @@ class OwnersController < ApplicationController | |||
| teams: {can_create_org_project: true}) | |||
| .distinct | |||
| end | |||
| end | |||
| def show | |||
| @owner = Owner.find_by(login: params[:id]) || Owner.find_by(id: params[:id]) | |||
| return render_not_found unless @owner.present? | |||
| # 组织 | |||
| if @owner.is_a?(Organization) | |||
| return render_forbidden("没有查看组织的权限") if org_limited_condition || org_privacy_condition | |||
| @can_create_project = @owner.can_create_project?(current_user.id) | |||
| @is_admin = current_user.admin? || @owner.is_owner?(current_user.id) | |||
| @is_member = @owner.is_member?(current_user.id) | |||
| # 用户 | |||
| else | |||
| #待办事项,现在未做 | |||
| if User.current.admin? || User.current.login == @owner.login | |||
| @waiting_applied_messages = @owner.applied_messages.waiting | |||
| @common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @owner.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @owner.id}, teams: {authorize: %w(admin owner)} )).common | |||
| @common_applied_projects = AppliedProject.where(project_id: @owner.full_admin_projects).common | |||
| @undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size + @common_applied_projects.size | |||
| else | |||
| @waiting_applied_messages = AppliedMessage.none | |||
| @common_applied_transfer_projects = AppliedTransferProject.none | |||
| @common_applied_projects = AppliedProject.none | |||
| @undo_events = 0 | |||
| end | |||
| #用户的组织数量 | |||
| # @user_composes_count = @user.composes.size | |||
| @user_composes_count = 0 | |||
| user_organizations = User.current.logged? ? @owner.organizations.with_visibility(%w(common limited)) + @owner.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @owner.organizations.with_visibility("common") | |||
| @user_org_count = user_organizations.size | |||
| normal_projects = Project.members_projects(@owner.id).to_sql | |||
| org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @owner.id}).to_sql | |||
| projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct | |||
| user_projects = User.current.logged? && (User.current.admin? || User.current.login == @owner.login) ? projects : projects.visible | |||
| @projects_common_count = user_projects.common.size | |||
| @projects_mirrior_count = user_projects.mirror.size | |||
| @projects_sync_mirrior_count = user_projects.sync_mirror.size | |||
| puts @owner.as_json | |||
| end | |||
| end | |||
| private | |||
| def org_limited_condition | |||
| @owner.organization_extension.limited? && !current_user.logged? | |||
| end | |||
| def org_privacy_condition | |||
| return false if current_user.admin? | |||
| @owner.organization_extension.privacy? && @owner.organization_users.where(user_id: current_user.id).blank? | |||
| end | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| class PraiseTreadController < ApplicationController | |||
| before_action :require_login, except: %i[index] | |||
| before_action :require_profile_completed, only: [:like] | |||
| before_action :find_project_with_id | |||
| def index | |||
| @@ -1,5 +1,6 @@ | |||
| class Projects::AppliedTransferProjectsController < Projects::BaseController | |||
| before_action :check_auth | |||
| before_action :check_user_profile_completed, only: [:create] | |||
| def organizations | |||
| @organizations = Organization.includes(:organization_extension).joins(team_users: :team).where(team_users: {user_id: current_user.id}, teams: {authorize: %w(admin owner)}) | |||
| @@ -23,4 +24,10 @@ class Projects::AppliedTransferProjectsController < Projects::BaseController | |||
| def check_auth | |||
| return render_forbidden unless current_user.admin? ||@project.owner?(current_user) | |||
| end | |||
| def check_user_profile_completed | |||
| @owner = Owner.find_by(login: params[:owner_name]) | |||
| return if @owner.is_a?(Organization) | |||
| require_user_profile_completed(@owner) | |||
| end | |||
| end | |||
| @@ -1,4 +1,5 @@ | |||
| class Projects::ProjectAppliesController < Projects::BaseController | |||
| before_action :require_profile_completed, only: [:create] | |||
| def create | |||
| project = Projects::ApplyJoinService.call(current_user, create_params) | |||
| render_ok(project_id: project.id) | |||
| @@ -5,6 +5,7 @@ class ProjectsController < ApplicationController | |||
| include Acceleratorable | |||
| before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list] | |||
| before_action :require_profile_completed, only: [:create, :migrate] | |||
| before_action :load_repository, except: %i[index group_type_list migrate create recommend] | |||
| before_action :authorizate_user_can_edit_project!, only: %i[update] | |||
| before_action :project_public?, only: %i[fork_users praise_users watch_users] | |||
| @@ -21,9 +22,7 @@ class ProjectsController < ApplicationController | |||
| menu.append(menu_hash_by_name("versions")) if @project.has_menu_permission("versions") | |||
| menu.append(menu_hash_by_name("resources")) if @project.has_menu_permission("resources") | |||
| menu.append(menu_hash_by_name("activity")) | |||
| # menu.append(menu_hash_by_name("gantt")) | |||
| # menu.append(menu_hash_by_name("sonar")) | |||
| menu.append(menu_hash_by_name("setting")) if current_user.admin? || @project.manager?(current_user) | |||
| menu.append(menu_hash_by_name("settings")) if current_user.admin? || @project.manager?(current_user) | |||
| render json: menu | |||
| end | |||
| @@ -47,6 +46,7 @@ class ProjectsController < ApplicationController | |||
| def create | |||
| ActiveRecord::Base.transaction do | |||
| tip_exception("无法使用以下关键词:#{project_params[:repository_name]},请重新命名") if ReversedKeyword.is_reversed(project_params[:repository_name]).present? | |||
| Projects::CreateForm.new(project_params).validate! | |||
| @project = Projects::CreateService.new(current_user, project_params).call | |||
| @@ -64,6 +64,7 @@ class ProjectsController < ApplicationController | |||
| end | |||
| def migrate | |||
| tip_exception("无法使用以下关键词:#{mirror_params[:repository_name]},请重新命名") if ReversedKeyword.is_reversed(mirror_params[:repository_name]).present? | |||
| Projects::MigrateForm.new(mirror_params).validate! | |||
| @project = | |||
| @@ -1,6 +1,8 @@ | |||
| class PullRequestsController < ApplicationController | |||
| before_action :require_login, except: [:index, :show, :files, :commits] | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :load_repository | |||
| before_action :check_menu_authorize | |||
| before_action :find_pull_request, except: [:index, :new, :create, :check_can_merge,:get_branches,:create_merge_infos, :files, :commits] | |||
| before_action :load_pull_request, only: [:files, :commits] | |||
| include TagChosenHelper | |||
| @@ -8,7 +10,6 @@ class PullRequestsController < ApplicationController | |||
| def index | |||
| return render_not_found unless @project.has_menu_permission("pulls") | |||
| # @issues = Gitea::PullRequest::ListService.new(@user,@repository.try(:identifier)).call #通过gitea获取 | |||
| issues = @project.issues.issue_pull_request.issue_index_includes.includes(pull_request: :user) | |||
| issues = issues.where(is_private: false) unless current_user.present? && (current_user.admin? || @project.member?(current_user)) | |||
| @@ -260,4 +261,8 @@ class PullRequestsController < ApplicationController | |||
| status_id: 1, | |||
| } | |||
| end | |||
| def check_menu_authorize | |||
| return render_not_found unless @project.has_menu_permission("pulls") | |||
| end | |||
| end | |||
| @@ -4,6 +4,7 @@ class RepositoriesController < ApplicationController | |||
| include Repository::LanguagesPercentagable | |||
| before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] | |||
| before_action :require_profile_completed, only: [:create_file] | |||
| before_action :load_repository | |||
| before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive] | |||
| before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror] | |||
| @@ -74,7 +74,7 @@ class UsersController < ApplicationController | |||
| end | |||
| def update | |||
| return render_not_found unless @user = User.find_by_id(params[:id]) || User.find_by(login: params[:id]) | |||
| return render_not_found unless @user = User.find_by(login: params[:id]) || User.find_by_id(params[:id]) | |||
| return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id) | |||
| Util.write_file(@image, avatar_path(@user)) if user_params[:image].present? | |||
| @user.attributes = user_params.except(:image) | |||
| @@ -7,7 +7,7 @@ class VersionReleasesController < ApplicationController | |||
| def index | |||
| version_releases = Gitea::Versions::ListService.new(@user.gitea_token, @user.try(:login), @repository.try(:identifier)).call | |||
| @version_releases = version_releases | |||
| @user_permission = current_user.present? && (current_user == @user || current_user.admin?) | |||
| @user_permission = current_user.present? && (@repository.project.all_developers.include?(current_user) || current_user.admin?) | |||
| @forge_releases = @repository.version_releases.select(:id,:version_gid, :created_at).includes(:attachments) | |||
| end | |||
| @@ -1,11 +1,12 @@ | |||
| class VersionsController < ApplicationController | |||
| before_action :require_login, except: [:index, :show] | |||
| before_action :require_profile_completed, only: [:create] | |||
| before_action :load_repository | |||
| before_action :check_menu_authorize | |||
| before_action :check_issue_permission, except: [:show, :index] | |||
| before_action :set_version, only: [:edit, :update, :destroy, :show,:update_status] | |||
| def index | |||
| return render_not_found unless @project.has_menu_permission("versions") | |||
| @user_admin_or_member = current_user.present? && (current_user.admin || @project.member?(current_user)) | |||
| status = params[:status] | |||
| versions = @project.versions.version_includes | |||
| @@ -182,4 +183,8 @@ class VersionsController < ApplicationController | |||
| %w(desc asc).include?(params[:order_type]) ? params[:order_type] : 'desc' | |||
| end | |||
| def check_menu_authorize | |||
| return render_not_found unless @project.has_menu_permission("versions") | |||
| end | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| class WatchersController < ApplicationController | |||
| before_action :require_login, except: %i[index] | |||
| before_action :require_profile_completed, only: [:follow] | |||
| # before_action :find_project_with_id | |||
| before_action :get_target | |||
| @@ -15,6 +15,8 @@ class Projects::CreateForm < BaseForm | |||
| validate do | |||
| check_project_category(project_category_id) | |||
| check_project_language(project_language_id) | |||
| check_project_name(user_id, name) unless name.blank? | |||
| check_repository_name(user_id, repository_name) unless repository_name.blank? | |||
| end | |||
| def check_license | |||
| @@ -434,6 +434,10 @@ module ApplicationHelper | |||
| User.find_by_login login | |||
| end | |||
| def find_user_by_gitea_uid(gitea_uid) | |||
| User.find_by(gitea_uid: gitea_uid) | |||
| end | |||
| def render_base64_decoded(str) | |||
| return nil if str.blank? | |||
| Base64.decode64 str | |||
| @@ -26,8 +26,9 @@ module RepositoriesHelper | |||
| end | |||
| def render_commit_author(author_json) | |||
| return nil if author_json.blank? | |||
| find_user_by_login author_json['name'] | |||
| return nil if author_json.blank? || author_json["id"].blank? | |||
| # find_user_by_login author_json['name'] | |||
| find_user_by_gitea_uid author_json['id'] | |||
| end | |||
| def readme_render_decode64_content(str, path) | |||
| @@ -0,0 +1,26 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: reversed_keywords | |||
| # | |||
| # id :integer not null, primary key | |||
| # identifier :string(255) | |||
| # description :text(65535) | |||
| # closed :boolean default("0") | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| class ReversedKeyword < ApplicationRecord | |||
| scope :is_reversed, -> (identifier){where(identifier: identifier.downcase, closed: false) if identifier.present?} | |||
| validates :identifier, presence: true, uniqueness: true | |||
| before_validation :set_identifier | |||
| private | |||
| def set_identifier | |||
| self.identifier = self.identifier.downcase | |||
| end | |||
| end | |||
| @@ -186,7 +186,7 @@ class User < Owner | |||
| :show_email, :show_location, :show_department, | |||
| :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true | |||
| before_save :update_hashed_password, :set_lastname | |||
| before_save :update_hashed_password, :set_lastname, :set_profile_completed | |||
| after_create do | |||
| SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie? | |||
| end | |||
| @@ -783,6 +783,10 @@ class User < Owner | |||
| def set_lastname | |||
| self.lastname = self.nickname if changes[:nickname].present? | |||
| end | |||
| def set_profile_completed | |||
| self.profile_completed = self.nickname.present? && self.gender.present? && self.mail.present? && self.custom_department.present? | |||
| end | |||
| end | |||
| @@ -24,6 +24,7 @@ class Projects::ApplyTransferService < ApplicationService | |||
| raise Error, '仓库标识不正确' if @project.identifier != params[:identifier] | |||
| raise Error, '该仓库正在迁移' if @project.is_transfering | |||
| raise Error, '新拥有者不存在' unless @owner.present? | |||
| raise Error, '新拥有者资料不完善' unless @owner.profile_completed | |||
| raise Error, '新拥有者已经存在同名仓库!' if Project.where(user_id: @owner.id, identifier: params[:identifier]).present? | |||
| raise Error, '未拥有转移权限' unless is_permit_owner | |||
| end | |||
| @@ -0,0 +1,32 @@ | |||
| <div class="modal fade reversed-keyword-change-modal" tabindex="-1" role="dialog" aria-hidden="true"> | |||
| <div class="modal-dialog modal-dialog-centered" role="document"> | |||
| <div class="modal-content"> | |||
| <div class="modal-header"> | |||
| <h5 class="modal-title"><%= type == "create" ? "新增" : "编辑" %></h5> | |||
| <button type="button" class="close" data-dismiss="modal" aria-label="Close"> | |||
| <span aria-hidden="true">×</span> | |||
| </button> | |||
| </div> | |||
| <%= form_for @keyword, url: {controller: "reversed_keywords", action: "#{type}"} do |p| %> | |||
| <div class="modal-body"> | |||
| <div class="form-group"> | |||
| <label> | |||
| 系统保留关键词标识 <span class="ml10 color-orange mr20">*</span> | |||
| </label> | |||
| <%= p.text_field :identifier,class: "form-control input-lg",required: true%> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label> | |||
| 系统保留关键词描述 | |||
| </label> | |||
| <%= p.text_area :description,class: "form-control",placeholder: ""%> | |||
| </div> | |||
| </div> | |||
| <div class="modal-footer"> | |||
| <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> | |||
| <%= p.submit "确认", class: "btn btn-primary submit-btn" %> | |||
| </div> | |||
| <% end %> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| @@ -0,0 +1,37 @@ | |||
| <table class="table table-hover text-center subject-list-table"> | |||
| <thead class="thead-light"> | |||
| <tr> | |||
| <th width="5%">序号</th> | |||
| <th width="30%"><%= sort_tag('标识', name: 'identifier', path: admins_reversed_keywords_path) %></th> | |||
| <th width="20%">描述</th> | |||
| <th width="20%"><%= sort_tag('限制是否开启', name: 'closed', path: admins_reversed_keywords_path) %></th> | |||
| <th width="20%"><%= sort_tag('创建时间', name: 'created_at', path: admins_reversed_keywords_path) %></th> | |||
| <th width="25%">操作</th> | |||
| </tr> | |||
| </thead> | |||
| <tbody> | |||
| <% if keywords.present? %> | |||
| <% keywords.each_with_index do |keyword, index| %> | |||
| <tr class="reversed-keyword-item-<%= keyword.id %>"> | |||
| <td><%= list_index_no((params[:page] || 1).to_i, index) %></td> | |||
| <td> | |||
| <%= link_to(keyword.identifier, "javascript:void(0)") %> | |||
| </td> | |||
| <td><%= keyword.description %></td> | |||
| <td class="keyword_closed"><%= !keyword.closed ? '√' : '' %></td> | |||
| <td><%= keyword.created_at&.strftime('%Y-%m-%d %H:%M') %></td> | |||
| <td class="action-container"> | |||
| <%= javascript_void_link '开启限制', class: 'action unclose-action', data: { id: keyword.id }, style: keyword.closed? ? '' : 'display: none;' %> | |||
| <%= javascript_void_link '关闭限制', class: 'action close-action', data: { id: keyword.id }, style: keyword.closed? ? 'display: none;' : '' %> | |||
| <%= link_to "编辑", edit_admins_reversed_keyword_path(keyword), remote: true, class: "action" %> | |||
| <%= link_to "删除", admins_reversed_keyword_path(keyword), method: :delete, data:{confirm: "确认删除的吗?"}, class: "action" %> | |||
| </td> | |||
| </tr> | |||
| <% end %> | |||
| <% else %> | |||
| <%= render 'admins/shared/no_data_for_table' %> | |||
| <% end %> | |||
| </tbody> | |||
| </table> | |||
| <%= render partial: 'admins/shared/paginate', locals: { objects: keywords } %> | |||
| @@ -0,0 +1,2 @@ | |||
| $("#reversed-keyword-modals").html("<%= j render(partial: 'admins/reversed_keywords/form_modal', locals: {type: 'update'}) %>") | |||
| $(".reversed-keyword-change-modal").modal('show'); | |||
| @@ -0,0 +1,18 @@ | |||
| <% define_admin_breadcrumbs do %> | |||
| <% add_admin_breadcrumb('系统保留关键词') %> | |||
| <% end %> | |||
| <div class="box search-form-container project-list-form"> | |||
| <%= form_tag(admins_reversed_keywords_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %> | |||
| <%= text_field_tag(:search, params[:search], class: 'form-control col-12 col-md-2 mr-3', placeholder: '标识检索') %> | |||
| <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> | |||
| <input type="reset" class="btn btn-secondary clear-btn" value="清空"/> | |||
| <% end %> | |||
| <%= link_to "新增", new_admins_reversed_keyword_path, remote: true, class: "btn btn-primary pull-right", "data-disabled-with":"...新增" %> | |||
| </div> | |||
| <div class="box admin-list-container reversed-keyword-list-container"> | |||
| <%= render partial: 'admins/reversed_keywords/list', locals: { keywords: @keywords } %> | |||
| </div> | |||
| <div id="reversed-keyword-modals"> | |||
| </div> | |||
| @@ -0,0 +1 @@ | |||
| $('.reversed-keyword-list-container').html("<%= j( render partial: 'admins/reversed_keywords/list', locals: { keywords: @keywords } ) %>"); | |||
| @@ -0,0 +1,2 @@ | |||
| $("#reversed-keyword-modals").html("<%= j render(partial: 'admins/reversed_keywords/form_modal', locals: {type: 'create'}) %>") | |||
| $(".reversed-keyword-change-modal").modal('show'); | |||
| @@ -26,6 +26,7 @@ | |||
| <li><%= sidebar_item(admins_project_categories_path, '分类列表', icon: 'sitemap', controller: 'admins-project_categories') %></li> | |||
| <li><%= sidebar_item(admins_project_licenses_path, '开源许可证', icon: 'file-text-o', controller: 'admins-project_licenses') %></li> | |||
| <li><%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %></li> | |||
| <li><%= sidebar_item(admins_reversed_keywords_path, '系统保留关键词', icon: 'key', controller: 'admins-reversed_keywords') %></li> | |||
| <% end %> | |||
| </li> | |||
| @@ -0,0 +1,24 @@ | |||
| json.type @owner.type | |||
| if @owner.is_a?(Organization) | |||
| json.partial! "organizations/organizations/detail", organization: @owner | |||
| json.can_create_project @can_create_project | |||
| json.is_admin @is_admin | |||
| json.is_member @is_member | |||
| else | |||
| json.partial! 'users/user', locals: { user: @owner } | |||
| json.undo_messages @waiting_applied_messages.size | |||
| json.undo_transfer_projects @common_applied_transfer_projects.size | |||
| json.undo_join_projects @common_applied_projects.size | |||
| json.undo_events @undo_events | |||
| json.user_composes_count @user_composes_count | |||
| json.user_org_count @user_org_count | |||
| json.common_projects_count @projects_common_count | |||
| json.mirror_projects_count @projects_mirrior_count | |||
| json.sync_mirror_projects_count @projects_sync_mirrior_count | |||
| json.created_time format_time(@owner.created_on) | |||
| json.email @owner.show_email ? @owner.mail : nil | |||
| json.province @owner.show_location ? @owner.province : nil | |||
| json.city @owner.show_location ? @owner.city : nil | |||
| json.custom_department @owner.show_department ? @owner.custom_department : nil | |||
| json.description @owner.description | |||
| end | |||
| @@ -26,9 +26,9 @@ if @project.forge? | |||
| end | |||
| json.author do | |||
| json.partial! 'commit_author', user: render_commit_author(commit['commit']['author']), name: commit['commit']['author']['name'] | |||
| json.partial! 'commit_author', user: render_commit_author(commit['author']), name: commit['commit']['author']['name'] | |||
| end | |||
| json.committer do | |||
| json.partial! 'commit_author', user: render_commit_author(commit['commit']['committer']), name: commit['commit']['committer']['name'] | |||
| json.partial! 'commit_author', user: render_commit_author(commit['committer']), name: commit['commit']['committer']['name'] | |||
| end | |||
| end | |||
| @@ -9,9 +9,7 @@ else | |||
| forge_user = | |||
| if commiter.present? | |||
| User.simple_select.find_by(mail: commiter['email']) | |||
| else | |||
| User.simple_select.find_by(mail: commit['commit']['committer']['email']) | |||
| User.simple_select.find_by(gitea_uid: commiter['id']) | |||
| end | |||
| json.sha commit['sha'] | |||
| @@ -1,20 +1,20 @@ | |||
| json.user_id user.id | |||
| json.name user.full_name | |||
| json.username @user.full_name | |||
| json.real_name @user.real_name | |||
| json.username user.full_name | |||
| json.real_name user.real_name | |||
| json.grade user.grade | |||
| json.gender @user.gender | |||
| json.login @user.login | |||
| json.user_id @user.id | |||
| json.image_url url_to_avatar(@user) | |||
| json.admin @user.admin? | |||
| json.user_identity @user.identity | |||
| json.is_watch current_user&.watched?(@user) | |||
| json.watched_count @user.fan_count #粉丝 | |||
| json.watching_count @user.follow_count #关注数 | |||
| json.created_time format_time(@user.created_on) | |||
| json.email @user.show_email ? @user.mail : nil | |||
| json.province @user.show_location ? @user.province : nil | |||
| json.city @user.show_location ? @user.city : nil | |||
| json.custom_department @user.show_department ? @user.custom_department : nil | |||
| json.description @user.description | |||
| json.gender user.gender | |||
| json.login user.login | |||
| json.user_id user.id | |||
| json.image_url url_to_avatar(user) | |||
| json.admin user.admin? | |||
| json.user_identity user.identity | |||
| json.is_watch current_user&.watched?(user) | |||
| json.watched_count user.fan_count #粉丝 | |||
| json.watching_count user.follow_count #关注数 | |||
| json.created_time format_time(user.created_on) | |||
| json.email user.show_email ? user.mail : nil | |||
| json.province user.show_location ? user.province : nil | |||
| json.city user.show_location ? user.city : nil | |||
| json.custom_department user.show_department ? user.custom_department : nil | |||
| json.description user.description | |||
| @@ -4,5 +4,6 @@ json.array! users do |user| | |||
| json.login user.login | |||
| json.user_id user.id | |||
| json.image_url url_to_avatar(user) | |||
| json.profile_completed user.profile_completed | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| json.username @user.full_name | |||
| json.real_name @user.real_name | |||
| json.nickname @user.nickname | |||
| json.gender @user.gender | |||
| json.login @user.login | |||
| json.user_id @user.id | |||
| @@ -107,7 +107,7 @@ Rails.application.routes.draw do | |||
| put 'commons/unhidden', to: 'commons#unhidden' | |||
| delete 'commons/delete', to: 'commons#delete' | |||
| resources :owners, only: [:index] | |||
| resources :owners, only: [:index, :show] | |||
| scope module: :organizations do | |||
| resources :organizations, except: [:edit, :new] do | |||
| @@ -657,6 +657,7 @@ Rails.application.routes.draw do | |||
| resources :project_categories | |||
| resources :project_licenses | |||
| resources :project_ignores | |||
| resources :reversed_keywords | |||
| resources :major_informations, only: [:index] | |||
| resources :ec_templates, only: [:index, :destroy] do | |||
| collection do | |||
| @@ -1,95 +0,0 @@ | |||
| BEGIN; | |||
| INSERT INTO `roles` (`id`, `name`, `position`, `assignable`, `builtin`, `permissions`, `issues_visibility`) VALUES | |||
| (1, 'Non member', 1, 1, 1, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (2, 'Anonymous', 2, 1, 2, '---\n- :memos_attachments_download\n- :view_course_files\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (3, 'Manager', 3, 1, 0, '---\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :is_manager\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :quote_project\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :add_code_review\n- :edit_code_review\n- :delete_code_review\n- :assign_code_review\n- :code_review_setting\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'all'), | |||
| (4, 'Developer', 5, 1, 0, '---\n- :add_project\n- :manage_versions\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n', 'all'), | |||
| (5, 'Reporter', 4, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_code_review\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :edit_issues\n- :add_issue_notes\n- :edit_own_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'all'), | |||
| (7, 'TeachingAsistant', 6, 1, 0, '---\n- :add_project\n- :edit_project\n- :manage_members\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :manage_news\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n', 'default'), | |||
| (9, 'Teacher', 7, 1, 0, '---\n- :upload_attachments\n- :memos_attachments_download\n- :add_project\n- :edit_project\n- :close_project\n- :select_project_modules\n- :manage_members\n- :manage_versions\n- :add_subprojects\n- :projects_attachments_download\n- :as_teacher\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :add_documents\n- :edit_documents\n- :delete_documents\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :manage_categories\n- :view_issues\n- :add_issues\n- :edit_issues\n- :manage_issue_relations\n- :manage_subtasks\n- :set_issues_private\n- :set_own_issues_private\n- :add_issue_notes\n- :edit_own_issue_notes\n- :view_private_notes\n- :set_notes_private\n- :move_issues\n- :delete_issues\n- :manage_public_queries\n- :save_queries\n- :view_issue_watchers\n- :add_issue_watchers\n- :delete_issue_watchers\n- :manage_news\n- :comment_news\n- :manage_repository\n- :browse_repository\n- :view_changesets\n- :commit_access\n- :manage_related_issues\n- :log_time\n- :view_time_entries\n- :edit_time_entries\n- :edit_own_time_entries\n- :manage_project_activities\n- :manage_wiki\n- :rename_wiki_pages\n- :delete_wiki_pages\n- :view_wiki_pages\n- :export_wiki_pages\n- :view_wiki_edits\n- :edit_wiki_pages\n- :delete_wiki_pages_attachments\n- :protect_wiki_pages\n', 'default'), | |||
| (10, 'Student', 9, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :as_student\n- :add_course\n- :edit_course\n- :close_course\n- :select_course_modules\n- :view_course_journals_for_messages\n- :course_attachments_download\n- :view_course_files\n- :view_homework_attaches\n- :paret_in_homework\n- :manage_boards\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :add_issues\n- :add_issue_notes\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (11, 'orgManager', 8, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (12, 'orgMember', 10, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :add_messages\n- :delete_own_messages\n- :view_calendar\n- :view_documents\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :comment_news\n- :browse_repository\n- :view_changesets\n- :view_time_entries\n- :view_wiki_pages\n- :view_wiki_edits\n', 'default'), | |||
| (13, 'ContestManager', 11, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_messages\n- :delete_own_messages\n- :view_calendar\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (14, 'Judge', 12, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :manage_contestnotifications\n- :notificationcomment_contestnotifications\n- :manage_boards\n- :add_messages\n- :edit_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'), | |||
| (15, 'Contestant', 13, 1, 0, '---\n- :add_project\n- :projects_attachments_download\n- :add_course\n- :course_attachments_download\n- :view_course_files\n- :select_contest_modules\n- :quote_project\n- :contest_attachments_download\n- :notificationcomment_contestnotifications\n- :add_messages\n- :edit_own_messages\n- :delete_own_messages\n- :view_calendar\n- :manage_files\n- :view_files\n- :view_gantt\n- :view_issues\n- :save_queries\n- :browse_repository\n- :view_changesets\n', 'default'); | |||
| COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `ci_languages` (`id`, `name`, `content`, `usage_amount`, `created_at`, `updated_at`, `cover_id`) VALUES | |||
| (1, 'C', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (2, 'C++', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdjYwogIGNvbW1hbmRzOgogIC0gLi9jb25maWd1cmUKICAtIG1h\na2UKICAtIG1ha2UgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (3, 'Docker', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuL2RvY2tlci5zb2NrCiAgICBjb21t\nYW5kczoKICAgIC0gZG9ja2VyIHBzIC1hCgp2b2x1bWVzOgotIG5hbWU6IGRv\nY2tlcnNvY2sKICBob3N0OgogICAgcGF0aDogL3Zhci9ydW4vZG9ja2VyLnNv\nY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:35:20', 351688), | |||
| (4, 'Java', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (5, 'R', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHItYmFzZQogIGNvbW1hbmRzOgogIC0gUiAtZSAnaW5zdGFsbC5w\nYWNrYWdlcyhjKCdwYWNrYWdlMScsJ3BhY2thZ2UyJykpJwogIC0gUiBDTUQg\nYnVpbGQgLg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (6, 'Ruby', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1YnkKICBjb21tYW5kczoKICAtIGJ1bmRsZSBpbnN0YWxsIC0t\nam9icz0zIC0tcmV0cnk9MwogIC0gcmFrZQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (7, 'PHP', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBpbnN0YWxs\nCiAgaW1hZ2U6IGNvbXBvc2VyCiAgY29tbWFuZHM6CiAgLSBjb21wb3NlciBp\nbnN0YWxsCgotIG5hbWU6IHRlc3QKICBpbWFnZTogcGhwOjcKICBjb21tYW5k\nczoKICAtIHZlbmRvci9iaW4vcGhwdW5pdCAtLWNvbmZpZ3VyYXRpb24gY29u\nZmlnLnhtbA==\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:37:04', 351690), | |||
| (8, 'Python', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHB5dGhvbgogIGNvbW1hbmRzOgogIC0gcGlwIGluc3RhbGwgLXIg\ncmVxdWlyZW1lbnRzLnR4dAogIC0gcHl0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:40:00', 351693), | |||
| (9, 'MySQL', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG15c3FsCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQogIC0gbXlz\ncWwgLXUgcm9vdCAtaCBkYXRhYmFzZSAtLWV4ZWN1dGU9J1NFTEVDVCBWRVJT\nSU9OKCk7JwoKc2VydmljZXM6Ci0gbmFtZTogZGF0YWJhc2UKICBpbWFnZTog\nbXlzcWwKICBlbnZpcm9ubWVudDoKICAgIE1ZU1FMX0FMTE9XX0VNUFRZX1BB\nU1NXT1JEOiAneWVzJwogICAgTVlTUUxfREFUQUJBU0U6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (10, 'MongoDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiBwaW5nCiAg\naW1hZ2U6IG1vbmdvOjQKICBjb21tYW5kczoKICAtIHNsZWVwIDUKICAtIG1v\nbmdvIC0taG9zdCBtb25nbyAtLWV2YWwgJ2RiLnZlcnNpb24oKScKCnNlcnZp\nY2VzOgotIG5hbWU6IG1vbmdvCiAgaW1hZ2U6IG1vbmdvOjQKICBjb21tYW5k\nOiBbIC0tc21hbGxmaWxlcyBd\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (11, 'Clojure', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNsb2p1cmUKICBjb21tYW5kczoKICAtIGxlaW4gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (12, 'CouchDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNvdWNoZGI6Mi4yCiAgY29tbWFuZHM6CiAgLSBzbGVlcCAxNQog\nIC0gY3VybCBodHRwOi8vZGF0YWJhc2U6NTk4NAoKc2VydmljZXM6Ci0gbmFt\nZTogZGF0YWJhc2UKICBpbWFnZTogY291Y2hkYjoyLjI=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (13, 'Crystal', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGNyeXN0YWxsYW5nL2NyeXN0YWwKICBjb21tYW5kczoKICAtIHNo\nYXJkcyBpbnN0YWxsCiAgLSBjcnlzdGFsIHNwZWMuMg==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (14, 'D', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRsYW5ndWFnZS9kbWQKICBjb21tYW5kczoKICAtIGR1YiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (15, 'Dart', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvb2dsZS9kYXJ0CiAgY29tbWFuZHM6CiAgLSBwdWIgZ2V0CiAg\nLSBwdWIgcnVuIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (16, 'Docker (dind)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgdm9sdW1lczoKICAtIG5hbWU6IGRvY2tl\ncnNvY2sKICAgIHBhdGg6IC92YXIvcnVuCiAgICBjb21tYW5kczoKICAgIC0g\nc2xlZXAgNSAjIGdpdmUgZG9ja2VyIGVub3VnaCB0aW1lIHRvIHN0YXJ0CiAg\nICAtIGRvY2tlciBwcyAtYQoKc2VydmljZXM6Ci0gbmFtZTogZG9ja2VyCiAg\naW1hZ2U6IGRvY2tlcjpkaW5kCiAgcHJpdmlsZWdlZDogdHJ1ZQogIHZvbHVt\nZXM6CiAgLSBuYW1lOiBkb2NrZXJzb2NrCiAgICBwYXRoOiAvdmFyL3J1bgoK\ndm9sdW1lczoKLSBuYW1lOiBkb2NrZXJzb2NrCiAgdGVtcDoge30=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (17, 'Elasticsearch', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGFscGluZTozLjgKICBjb21tYW5kczoKICAtIGFwayBhZGQgY3Vy\nbAogIC0gc2xlZXAgNDUKICAtIGN1cmwgaHR0cDovL2RhdGFiYXNlOjkyMDAK\nCnNlcnZpY2VzOgotIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IGVsYXN0aWNz\nZWFyY2g6NS1hbHBpbmU=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (18, 'Elixir', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVsaXhpcjoxLjUKICBjb21tYW5kczoKICAtIG1peCBsb2NhbC5y\nZWJhciAtLWZvcmNlCiAgLSBtaXggbG9jYWwuaGV4IC0tZm9yY2UKICAtIG1p\neCBkZXBzLmdldAogIC0gbWl4IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (19, 'Erlang', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGVybGFuZzoyMQogIGNvbW1hbmRzOgogIC0gcmViYXIgZ2V0LWRl\ncHMKICAtIHJlYmFyIGNvbXBpbGUKICAtIHJlYmFyIHNraXBfZGVwcz10cnVl\nIGV1bml0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (20, '20.Go (with Gopath)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0Cgp3b3Jrc3BhY2U6CiAgYmFzZTogL2dv\nCiAgcGF0aDogc3JjL2hlbGxvLXdvcmxkCgpzdGVwczoKLSBuYW1lOiB0ZXN0\nCiAgaW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gZ2V0CiAgLSBn\nbyB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (21, '21.Go (with Modules)', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdvbGFuZwogIGNvbW1hbmRzOgogIC0gZ28gdGVzdAogIC0gZ28g\nYnVpbGQ=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (22, 'Gradle', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZTpqZGsxMAogIGNvbW1hbmRzOgogIC0gZ3JhZGxlIGFz\nc2VtYmxlCiAgLSBncmFkbGUgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-11-26 01:36:17', 351689), | |||
| (23, 'Groovy', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGdyYWRsZToyLjUtamRrOAogIGNvbW1hbmRzOgogIC0gLi9ncmFk\nbGV3IGFzc2VtYmxlCiAgLSAuL2dyYWRsZXcgY2hlY2s=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (24, 'Haskell', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhhc2tlbGwKICBjb21tYW5kczoKICAtIGNhYmFsIGluc3RhbGwg\nLS1vbmx5LWRlcGVuZGVuY2llcyAtLWVuYWJsZS10ZXN0cwogIC0gY2FiYWwg\nY29uZmlndXJlIC0tZW5hYmxlLXRlc3RzCiAgLSBjYWJhbCBidWlsZAogIC0g\nY2FiYWwgdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (25, 'Haxe', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IGhheGUKICBjb21tYW5kczoKICAtIGhheGVsaWIgaW5zdGFsbCBi\ndWlsZC5oeG1sCiAgLSBoYXhlIGJ1aWxkLmh4bWw=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (26, 'MariaDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hcmlhZGIKICBjb21tYW5kczoKICAtIHNsZWVwIDE1CiAgLSBt\neXNxbCAtdSByb290IC1oIGRhdGFiYXNlIC0tZXhlY3V0ZT0nU0VMRUNUIFZF\nUlNJT04oKTsnCgpzZXJ2aWNlczoKLSBuYW1lOiBkYXRhYmFzZQogIGltYWdl\nOiBtYXJpYWRiCiAgZW52aXJvbm1lbnQ6CiAgICBNWVNRTF9BTExPV19FTVBU\nWV9QQVNTV09SRDogJ3llcycKICAgIE1ZU1FMX0RBVEFCQVNFOiB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (27, 'Maven', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG1hdmVuOjMtamRrLTEwCiAgY29tbWFuZHM6CiAgLSBtdm4gaW5z\ndGFsbCAtRHNraXBUZXN0cz10cnVlIC1EbWF2ZW4uamF2YWRvYy5za2lwPXRy\ndWUgLUIgLVYKICAtIG12biB0ZXN0IC1C\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (28, 'Memcached', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHVidW50dQogIGNvbW1hbmRzOgogIC0gYXB0LWdldCB1cGRhdGUg\nLXFxCiAgLSBhcHQtZ2V0IGluc3RhbGwgLXkgLXFxIHRlbG5ldCA+IC9kZXYv\nbnVsbAogIC0gKHNsZWVwIDE7IGVjaG8gJ3N0YXRzJzsgc2xlZXAgMjsgZWNo\nbyAncXVpdCc7KSB8IHRlbG5ldCBjYWNoZSAxMTIxMSB8fCB0cnVlCgpzZXJ2\naWNlczoKLSBuYW1lOiBjYWNoZQogIGltYWdlOiBtZW1jYWNoZWQ6YWxwaW5l\nCiAgY29tbWFuZDogWyAtdnYgXQ==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (29, 'Nats', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1Ynk6MgogIGNvbW1hbmRzOgogIC0gZ2VtIGluc3RhbGwgbmF0\ncwogIC0gbmF0cy1wdWIgLXMgdGNwOi8vbmF0czo0MjIyIGdyZWV0aW5nICdo\nZWxsbycKICAtIG5hdHMtcHViIC1zIHRjcDovL25hdHM6NDIyMiBncmVldGlu\nZyAnd29ybGQnCgpzZXJ2aWNlczoKLSBuYW1lOiBuYXRzCiAgaW1hZ2U6IG5h\ndHM6MS4zLjA=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (30, 'Node', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGUKICBjb21tYW5kczoKICAtIG5wbSBpbnN0YWxsCiAgLSBu\ncG0gdGVzdA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (31, 'Perl', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBlcmwKICBjb21tYW5kczoKICAtIGNwYW5tIC0tcXVpZXQgLS1p\nbnN0YWxsZGVwcyAtLW5vdGVzdCAuCiAgLSBwZXJsIEJ1aWxkLlBMCiAgLSAu\nL0J1aWxkIHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (32, 'Postgres', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAgY29tbWFuZHM6CiAgLSBwc3Fs\nIC1VIHBvc3RncmVzIC1kIHRlc3QgLWggZGF0YWJhc2UKCnNlcnZpY2VzOgot\nIG5hbWU6IGRhdGFiYXNlCiAgaW1hZ2U6IHBvc3RncmVzOjktYWxwaW5lCiAg\nZW52aXJvbm1lbnQ6CiAgICBQT1NUR1JFU19VU0VSOiBwb3N0Z3JlcwogICAg\nUE9TVEdSRVNfREI6IHRlc3Q=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (33, 'Redis', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJlZGlzCiAgY29tbWFuZHM6CiAgLSBzbGVlcCA1CiAgLSByZWRp\ncy1jbGkgLWggcmVkaXMgcGluZwogIC0gcmVkaXMtY2xpIC1oIHJlZGlzIHNl\ndCBGT08gYmFyCiAgLSByZWRpcy1jbGkgLWggcmVkaXMgZ2V0IEZPTwoKc2Vy\ndmljZXM6Ci0gbmFtZTogcmVkaXMKICBpbWFnZTogcmVkaXM=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (34, 'RethinkDB', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IG5vZGU6OQogIGNvbW1hbmRzOgogIC0gbnBtIGluc3RhbGwgLXMg\nLWcgcmVjbGkKICAtIHJlY2xpIC1oIGRhdGFiYXNlIC1qICdyLmRiKCdyZXRo\naW5rZGInKS50YWJsZSgnc3RhdHMnKScKCnNlcnZpY2VzOgotIG5hbWU6IGRh\ndGFiYXNlCiAgaW1hZ2U6IHJldGhpbmtkYjoyCiAgY29tbWFuZDogWyByZXRo\naW5rZGIsIC0tYmluZCwgYWxsIF0=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (35, 'Rust', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHJ1c3Q6MS4zMAogIGNvbW1hbmRzOgogIC0gY2FyZ28gYnVpbGQg\nLS12ZXJib3NlIC0tYWxsCiAgLSBjYXJnbyB0ZXN0IC0tdmVyYm9zZSAtLWFs\nbA==\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (36, 'Swift', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHN3aWZ0OjQKICBjb21tYW5kczoKICAtIHN3aWZ0IGJ1aWxkCiAg\nLSBzd2lmdCB0ZXN0\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL), | |||
| (37, 'Vault', 'CmtpbmQ6IHBpcGVsaW5lCm5hbWU6IGRlZmF1bHQKCnBsYXRmb3JtOgogIG9z\nOiBsaW51eAogIGFyY2g6IGFybTY0CgpzdGVwczoKLSBuYW1lOiB0ZXN0CiAg\naW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAgICBW\nQVVMVF9BRERSOiBodHRwOi8vdmF1bHQ6ODIwMAogICAgVkFVTFRfVE9LRU46\nIGR1bW15CiBjb21tYW5kczoKIC0gc2xlZXAgNQogLSB2YXVsdCBrdiBwdXQg\nc2VjcmV0L215LXNlY3JldCBteS12YWx1ZT1zM2NyM3QKIC0gdmF1bHQga3Yg\nZ2V0IHNlY3JldC9teS1zZWNyZXQKCnNlcnZpY2VzOgotIG5hbWU6IHZhdWx0\nCiAgaW1hZ2U6IHZhdWx0OjEuMC4wLWJldGEyCiAgZW52aXJvbm1lbnQ6CiAg\nICBWQVVMVF9ERVZfUk9PVF9UT0tFTl9JRDogZHVtbXk=\n', 0, '2020-10-21 10:14:22', '2020-10-21 10:14:22', NULL); | |||
| COMMIT; | |||
| BEGIN; | |||
| INSERT INTO `ci_templates` (`id`, `template_name`, `stage_type`, `category`, `content`, `created_at`, `updated_at`, `parent_category`, `login`) VALUES | |||
| (2, 'linux/amd64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: amd64', '2021-01-12 02:44:23', '2021-02-02 10:51:36', '初始化', 'admin'), | |||
| (3, 'linux/arm64', 'init', '初始化', 'kind: pipeline\r\ntype: docker\r\nname: {name}\r\nplatform:\r\n os: linux\r\n arch: arm64', '2021-01-12 02:45:17', '2021-02-02 10:51:47', '初始化', 'admin'), | |||
| (4, 'maven', 'build', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn install -DskipTests=true', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '编译构建', 'admin'), | |||
| (5, 'maven单元测试', 'customize', 'Java', '- name: maven\r\n image: maven:3-jdk-10\r\n commands:\r\n - mvn test', '2021-01-12 02:53:29', '2021-01-12 02:53:29', '单元测试', 'admin'), | |||
| (6, 'golang单元测试', 'customize', 'Golang', '- name: golang单元测试\r\n image: golang\r\n commands:\r\n - go test', '2021-01-12 03:03:35', '2021-01-12 03:03:35', '单元测试', 'admin'), | |||
| (8, 'gradle', 'build', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle build -x test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '编译构建', 'admin'), | |||
| (9, 'gradle单元测试', 'customize', 'Java', '- name: gradle\r\n image: gradle:jdk10\r\n commands:\r\n - gradle test', '2021-01-12 03:05:33', '2021-01-12 03:05:33', '单元测试', 'admin'), | |||
| (10, '远程主机部署', 'deploy', '部署', '# 需要将软件包与部署脚本提前上传到远程主机(见文件上传模板)\r\n# host、username、password可在参数管理中配置\r\n- name: 远程主机部署\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - chmod +x /home/deploy.sh\r\n - ./home/deploy.sh', '2021-01-12 03:32:46', '2021-03-05 06:22:02', '部署', 'admin'), | |||
| (11, '远程命令', 'customize', '其他', '# host、username、password可在参数管理中配置\r\n- name: 远程命令\r\n image: appleboy/drone-ssh\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n script:\r\n - echo ''hello world!''', '2021-01-12 03:40:38', '2021-03-05 06:19:44', '其他', 'admin'), | |||
| (12, '上传文件', 'customize', '其他', '# 本模板示例为上传软件包和部署脚本到home目录\r\n# host、username、password可在参数管理中配置\r\n- name: 上传文件\r\n image: appleboy/drone-scp\r\n settings:\r\n host: \r\n from_secret: ip\r\n username: \r\n from_secret: name\r\n password: \r\n from_secret: pwd\r\n port: 22\r\n target: /home\r\n source: \r\n - target/*.jar\r\n - deploy.sh', '2021-01-12 03:40:55', '2021-03-05 06:22:22', '其他', 'admin'), | |||
| (17, 'make-c', 'build', 'C', '- name: 编译\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:19:38', '2021-02-02 10:52:15', '编译构建', 'admin'), | |||
| (19, 'make-c++', 'build', 'C++', '- name: 编译构建\r\n image: gcc\r\n commands:\r\n - ./configure\r\n - make', '2021-01-15 01:21:05', '2021-01-15 01:21:05', '编译构建', 'admin'), | |||
| (20, 'python', 'build', 'Python', '- name: 编译构建\r\n image: python\r\n commands:\r\n - pip install -r requirements.txt', '2021-01-15 01:22:36', '2021-01-15 01:22:36', '编译构建', 'admin'), | |||
| (21, 'Docker', 'build', 'Docker', '# 构建Docker镜像并推送到仓库\r\n# 定义镜像Hub路径以及账号密码\r\n- name: Docker镜像构建\r\n image: plugins/docker\r\n settings:\r\n username: username\r\n password: pwd\r\n repo: repoUrl\r\n tags: latest', '2021-01-15 01:23:16', '2021-02-03 03:40:49', '编译构建', 'admin'), | |||
| (22, '空白模板', 'customize', 'customize', '', '2021-01-15 02:53:02', '2021-01-15 02:53:02', '其他', 'admin'), | |||
| (25, 'Go (with Gopath)', 'build', 'Go', '- name: golang\r\n image: golang\r\n commands:\r\n - go get\r\n - go test', '2021-02-03 00:57:32', '2021-02-03 03:36:15', '编译构建', 'admin'), | |||
| (26, 'PHP', 'build', 'PHP', '- name: install\r\n image: composer\r\n commands:\r\n - composer install', '2021-02-03 00:59:15', '2021-02-03 00:59:15', '编译构建', 'admin'), | |||
| (27, 'Ruby', 'build', 'Ruby', '- name: ruby\r\n image: ruby\r\n commands:\r\n - bundle install --jobs=3 --retry=3\r\n - rake', '2021-02-03 00:59:52', '2021-02-03 00:59:52', '编译构建', 'admin'), | |||
| (29, 'Go (with Modules)', 'build', 'Go', '- name: test\r\n image: golang\r\n commands:\r\n - go test\r\n - go build', '2021-02-03 03:35:45', '2021-02-03 03:35:45', '编译构建', 'admin'), | |||
| (30, 'Node', 'build', 'Node', '- name: Node编译\r\n image: node\r\n commands:\r\n - npm install\r\n - npm test', '2021-02-03 03:37:31', '2021-02-03 03:37:31', '编译构建', 'admin'), | |||
| (31, 'Perl ', 'build', 'Perl', '- name: perl\r\n image: perl\r\n commands:\r\n - cpanm --quiet --installdeps --notest .\r\n - perl Build.PL\r\n - ./Build test', '2021-02-03 03:38:06', '2021-02-03 03:38:06', '编译构建', 'admin'), | |||
| (32, 'Rust ', 'build', 'Rust', '- name: rust\r\n image: rust:1.30\r\n commands:\r\n - cargo build --verbose --all\r\n - cargo test --verbose --all', '2021-02-03 03:38:37', '2021-02-03 03:38:37', '编译构建', 'admin'), | |||
| (33, 'test', 'init', '初始化', 'qqqq', '2021-02-04 09:02:42', '2021-02-04 09:02:42', '初始化', 'admin'); | |||
| COMMIT; | |||
| @@ -0,0 +1,11 @@ | |||
| class CreateReversedKeywords < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :reversed_keywords do |t| | |||
| t.string :identifier, comment: '保留关键字' | |||
| t.text :description, comment: '描述' | |||
| t.boolean :closed, default: false, comment: '是否关闭' | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -18,22 +18,4 @@ namespace :sync_table_structure do | |||
| puts "init success" | |||
| end | |||
| task data: :environment do | |||
| puts "init table data......." | |||
| database_config = Rails.configuration.database_configuration | |||
| database = database_config[Rails.env]["database"] | |||
| database_username = database_config[Rails.env]["username"] | |||
| database_password = database_config[Rails.env]["password"] | |||
| database_host = database_config[Rails.env]["host"] | |||
| database_port = database_config[Rails.env]["port"] || 3306 | |||
| puts "bash: mysql -u#{database_username} -p#{database_password} -P#{database_port} -h#{database_host} #{database}" | |||
| system "mysql -u#{database_username} -p#{database_password} -P#{database_port} -h#{database_host} #{database} < #{Rails.root}/db/init_data.sql" | |||
| puts "init success" | |||
| end | |||
| end | |||
| @@ -0,0 +1 @@ | |||
| html{margin:0px;padding:0px;font-size:14px;font-family:"微软雅黑","宋体"}body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0}.IndexContent{height:100vh;width:100%;position:relative;background-image:url("/images/oauth/backImg.png");background-repeat:no-repeat;background-size:cover;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.indexLogo{width:80px;margin-bottom:35px}.indexPanel{width:580px;min-height:400px;background-color:#fff;box-shadow:0px 2px 10px 5px rgba(0,0,0,0.05);border-radius:5px;box-sizing:border-box}.indexTitle{height:75px;line-height:75px;font-size:18px;color:#333;text-align:center;border-bottom:1px solid #eee}.indexInfo{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:start;align-items:flex-start}.indexInfos{padding:40px 60px}.indexInfo>span{color:#333;font-size:16px;margin-top:5px}.indexInfo input{width:100%;height:40px;border-radius:2px;border:1px solid #eee;margin-top:5px;padding:0px 0px 0px 8px;outline:none}.indexInfo .checkInfo{height:15px;color:red}.indexBtn{text-align:center;margin-top:20px}.indexSubmit{width:50%;height:32px;line-height:32px;background-color:#1890FF;border:none;color:#fff;border-radius:2px;cursor:pointer;outline:none} | |||
| @@ -0,0 +1,5 @@ | |||
| require 'rails_helper' | |||
| RSpec.describe ReversedKeyword, type: :model do | |||
| pending "add some examples to (or delete) #{__FILE__}" | |||
| end | |||