diff --git a/app/controllers/projects/projects_controller.rb b/app/controllers/projects/projects_controller.rb index 03d14cdc3..c91e70e24 100644 --- a/app/controllers/projects/projects_controller.rb +++ b/app/controllers/projects/projects_controller.rb @@ -3,6 +3,7 @@ class Projects::ProjectsController < Projects::BaseController include ProjectsHelper before_filter :authenticate_user! load_and_authorize_resource :id_param => :project_name # to force member actions load + before_filter :who_owns, :only => [:new, :create, :mass_import, :run_mass_import] def index @projects = Project.accessible_by(current_ability, :membered) @@ -24,7 +25,26 @@ class Projects::ProjectsController < Projects::BaseController def new @project = Project.new - @who_owns = :me + end + + def mass_import + @project = Project.new(:mass_import => true) + end + + def run_mass_import + @project = Project.new params[:project] + @project.owner = choose_owner + authorize! :write, @project.owner if @project.owner.class == Group + @project.valid? + @project.errors.messages.slice! :url + if @project.errors.messages.blank? # We need only url validation + @project.mass_import + flash[:notice] = t('flash.project.mass_import_added_to_queue') + redirect_to projects_path + else + flash[:warning] = @project.errors.full_messages.join('. ') + render :mass_import + end end def edit @@ -33,7 +53,6 @@ class Projects::ProjectsController < Projects::BaseController def create @project = Project.new params[:project] @project.owner = choose_owner - @who_owns = (@project.owner_type == 'User' ? :me : :group) authorize! :write, @project.owner if @project.owner.class == Group if @project.save @@ -115,6 +134,10 @@ class Projects::ProjectsController < Projects::BaseController protected + def who_owns + @who_owns = (@project.try(:owner_type) == 'User' ? :me : :group) + end + def prepare_list(projects, groups, owners) res = {} diff --git a/app/models/project.rb b/app/models/project.rb index b7dbd8e53..38e01e228 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -29,8 +29,10 @@ class Project < ActiveRecord::Base validates :name, :uniqueness => {:scope => [:owner_id, :owner_type], :case_sensitive => false}, :presence => true, - :format => {:with => /\A#{NAME_REGEXP}\z/, :message => I18n.t("activerecord.errors.project.uname")} + :format => {:with => /\A#{NAME_REGEXP}\z/, + :message => I18n.t("activerecord.errors.project.uname")} validates :maintainer_id, :presence => true, :unless => :new_record? + validates :url, :presence => true, :format => {:with => /\Ahttps?:\/\/[\S]+\z/}, :if => :mass_import validates :visibility, :presence => true, :inclusion => {:in => VISIBILITIES} validate { errors.add(:base, :can_have_less_or_equal, :count => MAX_OWN_PROJECTS) if owner.projects.size >= MAX_OWN_PROJECTS } validate :check_default_branch @@ -43,7 +45,9 @@ class Project < ActiveRecord::Base errors.delete :project_to_repositories end - attr_accessible :name, :description, :visibility, :srpm, :is_package, :default_branch, :has_issues, :has_wiki, :maintainer_id, :publish_i686_into_x86_64 + attr_accessible :name, :description, :visibility, :srpm, :is_package, :default_branch, + :has_issues, :has_wiki, :maintainer_id, :publish_i686_into_x86_64, + :url, :srpms_list, :mass_import attr_readonly :owner_id, :owner_type scope :recent, order("lower(#{table_name}.name) ASC") @@ -82,6 +86,8 @@ class Project < ActiveRecord::Base has_ancestry :orphan_strategy => :rootify #:adopt not available yet + attr_accessor :url, :srpms_list, :mass_import + include Modules::Models::Owner include Modules::Models::Git include Modules::Models::Wiki @@ -96,6 +102,16 @@ class Project < ActiveRecord::Base def find_by_owner_and_name!(owner_name, project_name) find_by_owner_and_name(owner_name, project_name) or raise ActiveRecord::RecordNotFound end + + def self.run_mass_import(url, srpms_list, visibility, owner) + + + + end + end + + def mass_import + Project.perform_later :clone_build, :run_mass_import, url, srpms_list, visibility, owner end def name_with_owner diff --git a/app/views/projects/projects/_filters.html.haml b/app/views/projects/projects/_filters.html.haml index 12577ac68..bf4da5021 100644 --- a/app/views/projects/projects/_filters.html.haml +++ b/app/views/projects/projects/_filters.html.haml @@ -6,6 +6,9 @@ - if can?(:create, Project) .bordered.bpadding20 = link_to t('layout.projects.new'), new_project_path, :class => 'button' + .both + %br + = link_to t('layout.projects.mass_import'), mass_import_projects_path, :class => 'button' .bordered.bpadding20 %h3=t('layout.relations.filters') - options_for_filters(@all_projects, @groups, @owners).each do |options| diff --git a/app/views/projects/projects/_form.html.haml b/app/views/projects/projects/_form.html.haml index c009d642f..04b3f4cb9 100644 --- a/app/views/projects/projects/_form.html.haml +++ b/app/views/projects/projects/_form.html.haml @@ -7,22 +7,10 @@ .rightlist= f.text_area :description, :class => 'text_field', :cols => 80 .both - if [:new, :create].include? act - .leftlist= f.label :owner - .rightlist - = label_tag t("activerecord.attributes.project.who_owns.me") - - if Group.can_own_project(current_user).count > 0 - = radio_button_tag :who_owns, 'me', @who_owns == :me #{}.merge( (@who_owns == :me) ? {:checked => 'checked'} : {} ) - = label_tag t("activerecord.attributes.project.who_owns.group") - = radio_button_tag :who_owns, 'group', @who_owns == :group #{}.merge( (@who_owns == :group) ? {:checked => 'checked'} : {} ) - -# TODO: Make our own select_box helper with new design, blackjack and bitches! - = select_tag :owner_id, options_from_collection_for_select( Group.can_own_project(current_user), :id, :name ) - - else - = hidden_field_tag :who_owns, :me - .both + = render 'owner', :f => f .leftlist= f.label :visibility .rightlist - =# f.select :visibility, Project::VISIBILITIES - Project::VISIBILITIES.each do |visibility| = f.radio_button :visibility, visibility, :class => 'niceRadio' - if visibility == 'open' diff --git a/app/views/projects/projects/_owner.html.haml b/app/views/projects/projects/_owner.html.haml new file mode 100644 index 000000000..3d1d19653 --- /dev/null +++ b/app/views/projects/projects/_owner.html.haml @@ -0,0 +1,12 @@ +.leftlist= f.label :owner +.rightlist + = label_tag t("activerecord.attributes.project.who_owns.me") + - if Group.can_own_project(current_user).count > 0 + = radio_button_tag :who_owns, 'me', @who_owns == :me #{}.merge( (@who_owns == :me) ? {:checked => 'checked'} : {} ) + = label_tag t("activerecord.attributes.project.who_owns.group") + = radio_button_tag :who_owns, 'group', @who_owns == :group #{}.merge( (@who_owns == :group) ? {:checked => 'checked'} : {} ) + -# TODO: Make our own select_box helper with new design, blackjack and bitches! + = select_tag :owner_id, options_from_collection_for_select( Group.can_own_project(current_user), :id, :name ) + - else + = hidden_field_tag :who_owns, :me +.both \ No newline at end of file diff --git a/app/views/projects/projects/mass_import.html.haml b/app/views/projects/projects/mass_import.html.haml new file mode 100644 index 000000000..d2cb71eef --- /dev/null +++ b/app/views/projects/projects/mass_import.html.haml @@ -0,0 +1,24 @@ +%h3.bpadding10= title t("layout.projects.mass_import") += form_for @project, :url => run_mass_import_projects_path, :html => { :class => :form } do |f| + = f.hidden_field :mass_import + .leftlist= f.label :url + .rightlist= f.text_field :url + .both + .leftlist= f.label :srpms_list + .rightlist= f.text_area :srpms_list + .both + = render 'owner', :f => f + + .leftlist= f.label :visibility + .rightlist + - Project::VISIBILITIES.each do |visibility| + = f.radio_button :visibility, visibility, :class => 'niceRadio' + - if visibility == 'open' + = image_tag("unlock.png") + - else + = image_tag("lock.png") + = t("activerecord.attributes.project.visibilities.#{visibility}") + .both + .hr + .button_block + = f.submit t('layout.add'), :data => {'disable-with' => t('layout.saving')} \ No newline at end of file diff --git a/config/locales/models/project.en.yml b/config/locales/models/project.en.yml index d616729d1..f3d167d41 100644 --- a/config/locales/models/project.en.yml +++ b/config/locales/models/project.en.yml @@ -1,6 +1,7 @@ en: layout: projects: + mass_import: Mass import branches: Branches delete_branch: Delete branch restore_branch: Restore branch @@ -89,6 +90,8 @@ en: project: Project attributes: project: + url: URL + srpms_list: SRPMs list name: Name description: Descripton owner: Owner diff --git a/config/locales/models/project.ru.yml b/config/locales/models/project.ru.yml index 5360e237c..a6bfcc257 100644 --- a/config/locales/models/project.ru.yml +++ b/config/locales/models/project.ru.yml @@ -1,6 +1,7 @@ ru: layout: projects: + mass_import: Массовый импорт branches: Ветки delete_branch: Удалить ветку restore_branch: Восстановить ветку @@ -89,6 +90,8 @@ ru: project: Проект attributes: project: + url: URL + srpms_list: Список SRPMs name: Название description: Описание owner: Владелец diff --git a/config/routes.rb b/config/routes.rb index d8e93236f..4379aad25 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -284,7 +284,12 @@ Rosa::Application.routes.draw do end end - resources :projects, :only => [:index, :new, :create] + resources :projects, :only => [:index, :new, :create] do + collection do + post :run_mass_import + get :mass_import + end + end scope ':owner_name/:project_name', :constraints => {:project_name => Project::NAME_REGEXP} do # project scope :as => 'project' do resources :wiki do