From f6ec81bb35f50cadf861f3ba1e1552a091343bfe Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 20 Mar 2013 19:06:25 +0400 Subject: [PATCH 01/45] #37: update UI for "Assignee" Issues and PullRequests --- app/assets/javascripts/extra/tracker.js | 117 +++++++++++------- app/assets/stylesheets/design/custom.scss | 76 ++++++++++++ app/assets/stylesheets/design/main.scss | 2 +- app/controllers/projects/issues_controller.rb | 1 + app/views/projects/issues/_header.html.haml | 32 ++++- .../projects/issues/_manage_sidebar.html.haml | 26 ---- .../issues/_search_collaborators.html.haml | 11 +- .../pull_requests/_index_sidebar.html.haml | 15 ++- vendor/assets/stylesheets/bootstrap.css | 6 + 9 files changed, 209 insertions(+), 77 deletions(-) diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index 58c099d01..3f96f7709 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -137,30 +137,61 @@ $(document).ready(function() { return false; }); - function remAssignee(form) { - var el = form.find('.people.selected.remove_assignee'); - var id = el.attr('id'); - $('#manage_issue_users_list .add_assignee.people.selected').removeClass('select'); - el.remove(); - } - - $('.add_assignee.people.selected').live('click', function() { - var form_new = $('form.issue'); - var form_edit = $('form.edit_form.issue'); - form_new.find('#people-span').fadeOut(0); - remAssignee(form_new); - var clone = $(this).clone().removeClass('add_assignee').addClass('remove_assignee'); - form_new.find('#issue_assignee').html(clone); - $('.current_assignee').html(clone.removeClass('select')); - $(this).addClass('select'); + $('#assigned-popup .header .icon-remove-circle').live('click', function() { + $('#assigned-popup').hide(); }); - $('.remove_assignee.people.selected').live('click', function() { - var form = $('form.issue, form.edit_form issue'); - form.find('#people-span').fadeIn(0); - remAssignee(form); + $('.assigned .icon-share').live('click', function() { + $('#assigned-popup').show(); }); + // function remAssignee(form) { + // var el = form.find('.people.selected.remove_assignee'); + // var id = el.attr('id'); + // $('#manage_issue_users_list .add_assignee.people.selected').removeClass('select'); + // el.remove(); + // } + + $('#assigned-popup .people.selected').live('click', function() { + // var form_new = $('form.issue'); + // var form_edit = $('form.edit_form.issue'); + // form_new.find('#people-span').fadeOut(0); + // remAssignee(form_new); + // var clone = $(this).clone().removeClass('add_assignee').addClass('remove_assignee'); + // form_new.find('#issue_assignee').html(clone); + // $('.current_assignee').html(clone.removeClass('select')); + // $(this).addClass('select'); + + var form = $('#assigned-popup .edit_assignee'); + $.ajax({ + type: 'PUT', + url: form.attr("action"), + data: $(this).find('input').serialize(), + success: function(data){ + $('#assigned-popup').hide(); + window.location.reload(); + // $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); + // $('form#search_user, .button.update_assignee').fadeOut(0); + // $('.button.manage_assignee').fadeIn(0); + // $('#manage_issue_users_list').html(''); + }, + error: function(data){ + alert('error'); // TODO remove + } + }); + return false; + + + + + }); + + // $('.remove_assignee.people.selected').live('click', function() { + // var form = $('form.issue, form.edit_form issue'); + // form.find('#people-span').fadeIn(0); + // remAssignee(form); + // }); + function remLabel(form, id) { var el = form.find('.label.remove_label'+'#'+id); var label = $('#'+id+'.remove_label.label.selected'); @@ -251,11 +282,11 @@ $(document).ready(function() { return false; }); - $('.button.manage_assignee').live('click', function() { - $('form#search_user, .button.update_assignee').fadeIn(0); - $('.current_assignee .people').addClass('remove_assignee selected').removeClass('nopointer'); - $(this).fadeOut(0); - }); + // $('.button.manage_assignee').live('click', function() { + // $('form#search_user, .button.update_assignee').fadeIn(0); + // $('.current_assignee .people').addClass('remove_assignee selected').removeClass('nopointer'); + // $(this).fadeOut(0); + // }); $('.button.manage_labels').live('click', function() { $('.button.update_labels').fadeIn(0); @@ -264,24 +295,24 @@ $(document).ready(function() { $(this).fadeOut(0); }); - $('.button.update_assignee').live('click', function() { - var form = $('form.edit_assignee.issue'); - $.ajax({ - type: 'POST', - url: form.attr("action"), - data: form.serialize(), - success: function(data){ - $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); - $('form#search_user, .button.update_assignee').fadeOut(0); - $('.button.manage_assignee').fadeIn(0); - $('#manage_issue_users_list').html(''); - }, - error: function(data){ - alert('error'); // TODO remove - } - }); - return false; - }); + // $('.button.update_assignee').live('click', function() { + // var form = $('form.edit_assignee.issue'); + // $.ajax({ + // type: 'POST', + // url: form.attr("action"), + // data: form.serialize(), + // success: function(data){ + // $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); + // $('form#search_user, .button.update_assignee').fadeOut(0); + // $('.button.manage_assignee').fadeIn(0); + // $('#manage_issue_users_list').html(''); + // }, + // error: function(data){ + // alert('error'); // TODO remove + // } + // }); + // return false; + // }); $('.button.update_labels').live('click', function() { var form = $('form.edit_labels.issue'); diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index 0fba4a2d9..5e63bf78b 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1887,4 +1887,80 @@ table#myTable thead tr.search th form.button_to div input { text-align: center; padding: 7px 5px 3px; } +} + +article .activity .top { + + .created { + opacity: 0.8; + span { + float: none; + margin-right: 5px; + } + } + .assigned { + padding: 10px 20px; + border: 1px solid #D6D6D6; + margin: 10px -7px; + border-left: none; + border-right: none; + .icon-share { + cursor: pointer; + } + .image { + width: auto; + height: auto; + margin: -1px 10px 0 0; + } + } +} + +#assigned-popup { + position: absolute; + margin: 5px 0 0 130px; + display: none; + min-width: 230px; + border: 1px solid #b3cce0; + background: #FFF; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + .header .icon-remove-circle { + cursor: pointer; + float: right; + } + .header { + padding: 10px; + background: #dcecfa; + border-bottom: 1px solid #D6D6D6; + font-weight: bold; + .title { display: inline-block; } + } + form { + padding: 10px 15px 10px 10px; + border-bottom: 1px solid #D6D6D6; + input { + width: 100%; + max-width: 100%; + } + } + .edit_assignee { + display: none; + } + #manage_issue_users_list { + overflow-y: auto; + overflow-x: hidden; + max-height: 280px; + .people, .nothing { + margin: 0; + width: 100%; + padding: 10px 20px 10px 10px; + } + .clear { + opacity: 0.8; + } + .nothing { + color: #D6D6D6; + } + } } \ No newline at end of file diff --git a/app/assets/stylesheets/design/main.scss b/app/assets/stylesheets/design/main.scss index a50b7991f..d2742971c 100644 --- a/app/assets/stylesheets/design/main.scss +++ b/app/assets/stylesheets/design/main.scss @@ -762,7 +762,7 @@ article div.activity div.top div.text { font-size: 12px; } -article div.activity div.top div.text span.name { +article div.activity div.top span.name { font-weight: 700; } diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 03d5ca7b5..eee695f31 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -95,6 +95,7 @@ class Projects::IssuesController < Projects::BaseController users = User.joins(:groups => :projects).where(:projects => {:id => @project.id}).where("users.uname ILIKE ?", search) users2 = @project.collaborators.where("users.uname ILIKE ?", search) @users = (users + users2).uniq.sort {|x,y| x.uname <=> y.uname}.first(10) + @issue = Issue.where(:id => params[:id]).first render :partial => 'search_collaborators' end diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index afb64f810..0d0a9f1f7 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -1,13 +1,35 @@ -%h3.issue_title=@issue.title .activity .top .image =image_tag(avatar_url(@issue.user, :medium), :alt => 'avatar') if @issue.user .text - %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) if @issue.user - %br/ - %span.date=@issue.created_at.to_s(:long) - %br/ + .created + %span.date=@issue.created_at.to_s(:long) + - if @issue.user + %span.date=t("layout.by") + %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) + %h3.issue_title=@issue.title + .both + .assigned + - if @issue.assignee + .image + =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') + %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) + %span= 'is assigned' + - else + %span= "No one is assigned" + -if can?(:update, @issue) || @issue.new_record? + %span.icon-share + #assigned-popup + .header + .title= 'Assign someone to this issue' + %span.icon-remove-circle + =form_tag search_collaborators_project_issues_path(@project, :id => @issue.id), :id => 'search_user', :method => :get do + =tracker_search_field(:search_user, t('layout.issues.search_user')) + =form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f| + =hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]' + #manage_issue_users_list + =render 'projects/issues/search_collaborators' .both .fulltext.view.issue_body.formatted.cm-s-default.md_and_cm=markdown @issue.body .both diff --git a/app/views/projects/issues/_manage_sidebar.html.haml b/app/views/projects/issues/_manage_sidebar.html.haml index 9b819e38c..98144b2d2 100644 --- a/app/views/projects/issues/_manage_sidebar.html.haml +++ b/app/views/projects/issues/_manage_sidebar.html.haml @@ -9,32 +9,6 @@ - if can_manage =form_tag [@project, @issue], :id => 'update_issue_status', :method => :put do =hidden_field_tag "issue_status", @issue.closed? ? 'closed' : 'open', :name => "issue[status]" - .bordered.nopadding - %h3=t('layout.issues.assignee') - - if @issue.persisted? - -if can_manage - =form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f| - =hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]' - .current_assignee - - if @issue.assignee - #user-0.people.nopointer - .avatar=image_tag avatar_url(@issue.assignee), :alt => 'avatar' - .name=@issue.assignee.fullname - =hidden_field_tag "user-0", @issue.assignee.id, :name => 'issue[assignee_id]' - .both - - elsif @issue.assignee - .people.nopointer - .avatar=image_tag avatar_url(@issue.assignee), :alt => 'avatar' - .name=@issue.assignee.fullname - .both - =link_to(t('layout.issues.assignee_manage'), '#', :class => "button tmargin10 manage_assignee") if can_manage - - if can_manage - =form_tag search_collaborators_project_issues_path(@project), :id => 'search_user', :method => :get, :style => @issue.persisted? ? 'display:none' : '' do - =tracker_search_field(:search_user, t('layout.issues.search_user')) - #manage_issue_users_list - =render 'search_collaborators' - =link_to(t('layout.issues.done'), '#', :class => "button tmargin10 update_assignee", :style => 'display:none') if can_manage - .block %h3=t('layout.issues.labels') - if can_manage diff --git a/app/views/projects/issues/_search_collaborators.html.haml b/app/views/projects/issues/_search_collaborators.html.haml index ca5cec807..a1ed9f775 100644 --- a/app/views/projects/issues/_search_collaborators.html.haml +++ b/app/views/projects/issues/_search_collaborators.html.haml @@ -1,6 +1,15 @@ -- (@users || []).each_with_index do |user, index| +- if @issue.try(:assignee) + .people.clear.selected + %span.icon-remove-circle + = 'Clear assignee' + =hidden_field_tag "user-nil", nil, :name => 'issue[assignee_id]' + +- users = (@users || []) +- users.each_with_index do |user, index| .people.selected{:id => "user-#{index}", :class => 'add_assignee'} .avatar= image_tag(avatar_url(user), :alt => 'avatar') .name=user.fullname =hidden_field_tag "user-#{index}", user.id, :name => 'issue[assignee_id]' .both +- if users.empty? + .nothing= 'Nothing to show' \ No newline at end of file diff --git a/app/views/projects/pull_requests/_index_sidebar.html.haml b/app/views/projects/pull_requests/_index_sidebar.html.haml index 0e78b5edd..953ed5631 100644 --- a/app/views/projects/pull_requests/_index_sidebar.html.haml +++ b/app/views/projects/pull_requests/_index_sidebar.html.haml @@ -1,5 +1,18 @@ -content_for :sidebar do - =form_tag project_pull_requests_path(@project), :id => 'filter_pull_requests', :method => :get, :class => 'ajax_search_form' do + - if current_user + =form_tag project_pull_requests_path(@project), :id => 'filter_pull_requests', :method => :get do + .bordered.nopadding + %h3=t("layout.issues.accessory") + %table + %tr + %td.width18=radio_button_tag :myradio, 'all', !@is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} + %td.width135=t("layout.issues.all") + %td.width30.right=@project.issues.joins(:pull_request).count + %tr + %td=radio_button_tag :myradio, 'to_me', @is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} + %td=t("layout.issues.to_me") + %td.width30.right=@project.issues.joins(:pull_request).where(:assignee_id => current_user.id).count + =form_tag project_pull_requests_path(@project), :id => 'search_pull_requests', :method => :get, :class => 'ajax_search_form' do .bordered.bpadding20 - search = params[:search_pull_request].present? ? params[:search_pull_request] : t('layout.pull_requests.search') =tracker_search_field(:search_pull_request, search) diff --git a/vendor/assets/stylesheets/bootstrap.css b/vendor/assets/stylesheets/bootstrap.css index 3dfd442cd..27a4aa4bf 100644 --- a/vendor/assets/stylesheets/bootstrap.css +++ b/vendor/assets/stylesheets/bootstrap.css @@ -834,4 +834,10 @@ a.badge:hover { } .icon-chevron-down { background-position: -313px -119px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-remove-circle { + background-position: -168px -96px; } \ No newline at end of file From 5239be28278bedfb4ee4e42c2e93d35806863afe Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 20 Mar 2013 19:22:13 +0400 Subject: [PATCH 02/45] #37: update filter by "Accessory" for PullRequests --- app/controllers/projects/pull_requests_controller.rb | 1 + app/views/projects/pull_requests/_index_sidebar.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects/pull_requests_controller.rb b/app/controllers/projects/pull_requests_controller.rb index 6bbe19f8c..e998e36fd 100644 --- a/app/controllers/projects/pull_requests_controller.rb +++ b/app/controllers/projects/pull_requests_controller.rb @@ -90,6 +90,7 @@ class Projects::PullRequestsController < Projects::BaseController def index(status = 200) @issues_with_pull_request = @project.issues.joins(:pull_request) + @issues_with_pull_request = @issues_with_pull_request.where(:assignee_id => current_user.id) if @is_assigned_to_me = params[:filter] == 'to_me' @issues_with_pull_request = @issues_with_pull_request.search(params[:search_pull_request]) if params[:search_pull_request] !~ /#{t('layout.pull_requests.search')}/ @opened_issues, @closed_issues = @issues_with_pull_request.not_closed_or_merged.count, @issues_with_pull_request.closed_or_merged.count diff --git a/app/views/projects/pull_requests/_index_sidebar.html.haml b/app/views/projects/pull_requests/_index_sidebar.html.haml index 953ed5631..50220ff7e 100644 --- a/app/views/projects/pull_requests/_index_sidebar.html.haml +++ b/app/views/projects/pull_requests/_index_sidebar.html.haml @@ -1,6 +1,6 @@ -content_for :sidebar do - if current_user - =form_tag project_pull_requests_path(@project), :id => 'filter_pull_requests', :method => :get do + =form_tag project_pull_requests_path(@project), :id => 'filter_issues', :method => :get do .bordered.nopadding %h3=t("layout.issues.accessory") %table @@ -12,7 +12,7 @@ %td=radio_button_tag :myradio, 'to_me', @is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} %td=t("layout.issues.to_me") %td.width30.right=@project.issues.joins(:pull_request).where(:assignee_id => current_user.id).count - =form_tag project_pull_requests_path(@project), :id => 'search_pull_requests', :method => :get, :class => 'ajax_search_form' do + =form_tag project_pull_requests_path(@project), :id => 'filter_pull_requests', :method => :get, :class => 'ajax_search_form' do .bordered.bpadding20 - search = params[:search_pull_request].present? ? params[:search_pull_request] : t('layout.pull_requests.search') =tracker_search_field(:search_pull_request, search) From a9ab9ab5a6d1dfa1d8089193e7c0a5b3632ba5d2 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 20 Mar 2013 20:05:37 +0400 Subject: [PATCH 03/45] #37: update text labels --- app/views/projects/issues/_index_sidebar.html.haml | 3 +-- app/views/projects/pull_requests/_index_sidebar.html.haml | 7 +++---- config/locales/models/issue.en.yml | 3 +-- config/locales/models/issue.ru.yml | 3 +-- config/locales/models/pull_request.en.yml | 2 ++ config/locales/models/pull_request.ru.yml | 2 ++ 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/views/projects/issues/_index_sidebar.html.haml b/app/views/projects/issues/_index_sidebar.html.haml index 1b81c3ac6..51e7e8e18 100644 --- a/app/views/projects/issues/_index_sidebar.html.haml +++ b/app/views/projects/issues/_index_sidebar.html.haml @@ -1,8 +1,7 @@ -content_for :sidebar do - if current_user =form_tag project_issues_path(@project), :id => 'filter_issues', :method => :get do - .bordered.nopadding - %h3=t("layout.issues.accessory") + .bordered %table %tr %td.width18=radio_button_tag :myradio, 'all', !@is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} diff --git a/app/views/projects/pull_requests/_index_sidebar.html.haml b/app/views/projects/pull_requests/_index_sidebar.html.haml index 50220ff7e..05c051d32 100644 --- a/app/views/projects/pull_requests/_index_sidebar.html.haml +++ b/app/views/projects/pull_requests/_index_sidebar.html.haml @@ -1,16 +1,15 @@ -content_for :sidebar do - if current_user =form_tag project_pull_requests_path(@project), :id => 'filter_issues', :method => :get do - .bordered.nopadding - %h3=t("layout.issues.accessory") + .bordered %table %tr %td.width18=radio_button_tag :myradio, 'all', !@is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} - %td.width135=t("layout.issues.all") + %td.width135=t("layout.pull_requests.all") %td.width30.right=@project.issues.joins(:pull_request).count %tr %td=radio_button_tag :myradio, 'to_me', @is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'} - %td=t("layout.issues.to_me") + %td=t("layout.pull_requests.to_me") %td.width30.right=@project.issues.joins(:pull_request).where(:assignee_id => current_user.id).count =form_tag project_pull_requests_path(@project), :id => 'filter_pull_requests', :method => :get, :class => 'ajax_search_form' do .bordered.bpadding20 diff --git a/config/locales/models/issue.en.yml b/config/locales/models/issue.en.yml index 3a7ab6ed1..2887f0f9f 100644 --- a/config/locales/models/issue.en.yml +++ b/config/locales/models/issue.en.yml @@ -11,9 +11,8 @@ en: layout: issues: - accessory: Accessory issues list: List - all: All + all: All issues to_me: Assigned to me edit: Edit search: Find issue... diff --git a/config/locales/models/issue.ru.yml b/config/locales/models/issue.ru.yml index 7a5e696eb..2660ba6b1 100644 --- a/config/locales/models/issue.ru.yml +++ b/config/locales/models/issue.ru.yml @@ -11,9 +11,8 @@ ru: layout: issues: - accessory: Принадлежность заданий list: Список - all: Все + all: Все задачи to_me: Назначенные мне edit: Редактировать search: Найти задачу... diff --git a/config/locales/models/pull_request.en.yml b/config/locales/models/pull_request.en.yml index 7c0c28f8f..156bf8192 100644 --- a/config/locales/models/pull_request.en.yml +++ b/config/locales/models/pull_request.en.yml @@ -56,4 +56,6 @@ en: layout: pull_requests: search: Find pull request... + all: All requests + to_me: Assigned to me view_full_changes: View full changes diff --git a/config/locales/models/pull_request.ru.yml b/config/locales/models/pull_request.ru.yml index 91efadf28..26dd0f761 100644 --- a/config/locales/models/pull_request.ru.yml +++ b/config/locales/models/pull_request.ru.yml @@ -57,4 +57,6 @@ ru: layout: pull_requests: search: Найти пул реквест... + all: Все пул реквесты + to_me: Назначенные мне view_full_changes: Посмотреть все изменения From 4261e250e8ceeea388acefbd17247729874f27f6 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 00:36:22 +0400 Subject: [PATCH 04/45] #37: updated "assigned" for PullRequests --- app/assets/javascripts/extra/tracker.js | 17 ++++++-- app/assets/stylesheets/design/custom.scss | 41 ++++++++++++++----- .../projects/issues/_assigned_popup.html.haml | 12 ++++++ app/views/projects/issues/_form.html.haml | 13 ++++-- app/views/projects/issues/_header.html.haml | 29 +++++-------- .../issues/_search_collaborators.html.haml | 20 +++++---- app/views/projects/issues/new.html.haml | 6 +-- .../projects/pull_requests/new.html.haml | 14 +++++++ 8 files changed, 108 insertions(+), 44 deletions(-) create mode 100644 app/views/projects/issues/_assigned_popup.html.haml diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index 3f96f7709..5793e0ca6 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -141,7 +141,7 @@ $(document).ready(function() { $('#assigned-popup').hide(); }); - $('.assigned .icon-share').live('click', function() { + $('#assigned-container .icon-share').live('click', function() { $('#assigned-popup').show(); }); @@ -163,13 +163,18 @@ $(document).ready(function() { // $(this).addClass('select'); var form = $('#assigned-popup .edit_assignee'); + var item = $(this); + if (form.length == 0) { + updateAssignedUser(item); + return false; + } $.ajax({ type: 'PUT', url: form.attr("action"), data: $(this).find('input').serialize(), success: function(data){ - $('#assigned-popup').hide(); - window.location.reload(); + updateAssignedUser(item); + // window.location.reload(); // $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); // $('form#search_user, .button.update_assignee').fadeOut(0); // $('.button.manage_assignee').fadeIn(0); @@ -334,3 +339,9 @@ $(document).ready(function() { }); }); + +function updateAssignedUser(item) { + $('#assigned-popup').hide(); + var container = item.find('.container').clone(); + $('#assigned-container .user-container').empty().append(container.html()); +} diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index 5e63bf78b..c6dbf8ce9 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1898,23 +1898,40 @@ article .activity .top { margin-right: 5px; } } - .assigned { + .assigned-header { padding: 10px 20px; border: 1px solid #D6D6D6; margin: 10px -7px; border-left: none; border-right: none; - .icon-share { - cursor: pointer; - } - .image { - width: auto; - height: auto; - margin: -1px 10px 0 0; - } } } +#assigned-container { + .icon-share { + cursor: pointer; + margin-top: -2px; + } + .image { + float: left; + width: 16px; + height: 16px; + margin: -1px 5px 0 0; + img { + position: absolute; + width: 16px; + height: 16px; + } + } + .user-container { + display: inline-block; + } + span { + padding-left: 5px; + } +} + + #assigned-popup { position: absolute; margin: 5px 0 0 130px; @@ -1924,6 +1941,7 @@ article .activity .top { background: #FFF; -moz-border-radius: 5px; -webkit-border-radius: 5px; + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); border-radius: 5px; .header .icon-remove-circle { cursor: pointer; @@ -1962,5 +1980,8 @@ article .activity .top { .nothing { color: #D6D6D6; } + .container { + display: none; + } } -} \ No newline at end of file +} diff --git a/app/views/projects/issues/_assigned_popup.html.haml b/app/views/projects/issues/_assigned_popup.html.haml new file mode 100644 index 000000000..07d5f32d3 --- /dev/null +++ b/app/views/projects/issues/_assigned_popup.html.haml @@ -0,0 +1,12 @@ +#assigned-popup + .header + .title= 'Assign someone to this issue' + %span.icon-remove-circle + = form_tag search_collaborators_project_issues_path(@project, :id => @issue.id), :id => 'search_user', :method => :get do + = tracker_search_field(:search_user, t('layout.issues.search_user')) + + - unless [:new, :create].include?(action_name.to_sym) + = form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f| + = hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]' + #manage_issue_users_list + = render 'projects/issues/search_collaborators' \ No newline at end of file diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 01b6a0a1a..35909cfcc 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -1,8 +1,15 @@ =render 'title_body', :f => f, :id => 'new' .leftlist= t('activerecord.attributes.issue.assignee') + ':' -.rightlist - %span#people-span.small-text= t('layout.issues.choose_user_on_left') - #issue_assignee +#assigned-container.rightlist + .user-container + - if @issue.assignee + .image + =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') + %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) + %span= 'is assigned' + - else + %span= "No one is assigned" + %span.icon-share .both .leftlist= t('layout.issues.labels') + ':' .rightlist diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index 0d0a9f1f7..cd832b59f 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -10,26 +10,19 @@ %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) %h3.issue_title=@issue.title .both - .assigned - - if @issue.assignee - .image - =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') - %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= 'is assigned' - - else - %span= "No one is assigned" + #assigned-container.assigned-header + .user-container + - if @issue.assignee + .image + =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') + %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) + %span= 'is assigned' + - else + %span= "No one is assigned" -if can?(:update, @issue) || @issue.new_record? %span.icon-share - #assigned-popup - .header - .title= 'Assign someone to this issue' - %span.icon-remove-circle - =form_tag search_collaborators_project_issues_path(@project, :id => @issue.id), :id => 'search_user', :method => :get do - =tracker_search_field(:search_user, t('layout.issues.search_user')) - =form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f| - =hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]' - #manage_issue_users_list - =render 'projects/issues/search_collaborators' + =render 'projects/issues/assigned_popup' + .both .fulltext.view.issue_body.formatted.cm-s-default.md_and_cm=markdown @issue.body .both diff --git a/app/views/projects/issues/_search_collaborators.html.haml b/app/views/projects/issues/_search_collaborators.html.haml index a1ed9f775..f2de9f4c9 100644 --- a/app/views/projects/issues/_search_collaborators.html.haml +++ b/app/views/projects/issues/_search_collaborators.html.haml @@ -1,15 +1,21 @@ -- if @issue.try(:assignee) - .people.clear.selected - %span.icon-remove-circle - = 'Clear assignee' - =hidden_field_tag "user-nil", nil, :name => 'issue[assignee_id]' +.people.clear.selected + %span.icon-remove-circle + = 'Clear assignee' + .container + %span= "No one is assigned" + = hidden_field_tag "user-nil", nil, :name => "issue[assignee_id]" - users = (@users || []) - users.each_with_index do |user, index| .people.selected{:id => "user-#{index}", :class => 'add_assignee'} .avatar= image_tag(avatar_url(user), :alt => 'avatar') - .name=user.fullname - =hidden_field_tag "user-#{index}", user.id, :name => 'issue[assignee_id]' + .name= user.fullname + .container + .image + =image_tag(avatar_url(user, :micro), :alt => 'avatar') + %span.name= link_to(user.uname, user_path(user)) + %span= 'is assigned' + = hidden_field_tag "user-#{index}", user.id, :name => "issue[assignee_id]" .both - if users.empty? .nothing= 'Nothing to show' \ No newline at end of file diff --git a/app/views/projects/issues/new.html.haml b/app/views/projects/issues/new.html.haml index a59cc7a10..2c5519fa0 100644 --- a/app/views/projects/issues/new.html.haml +++ b/app/views/projects/issues/new.html.haml @@ -3,8 +3,8 @@ -render 'manage_sidebar' %h3.bpadding10= t("layout.issues.create_header") -= form_for :issue, :url => project_issues_path(@project), :html => { :class => 'form issue' } do |f| +=render 'projects/issues/assigned_popup' += form_for :issue, :url => project_issues_path(@project), :html => { :class => 'form issue new' } do |f| = render "form", :f => f =hidden_field_tag :preview_url, project_md_preview_path(@project) -= render "projects/comments/markdown_help" - += render "projects/comments/markdown_help" \ No newline at end of file diff --git a/app/views/projects/pull_requests/new.html.haml b/app/views/projects/pull_requests/new.html.haml index 6ad43d4de..9e29f4510 100644 --- a/app/views/projects/pull_requests/new.html.haml +++ b/app/views/projects/pull_requests/new.html.haml @@ -7,6 +7,7 @@ .tab-content.pull_diff_fix #discussion.tab-pane.active =hidden_field_tag :update_action, new_project_pull_request_path + =render 'projects/issues/assigned_popup' =form_for @pull, :url => (@pull.already? ? new_project_pull_request_path : project_pull_requests_path), :html => {:class => 'well well-large', :method => (@pull.already? ? :get : :post)} do |f| .leftlist=f.label :from_project, t("#{ar}.from_project"), :class => :label @@ -31,6 +32,19 @@ %div{:class => @pull.ready? ? 'notice' : 'alert'} =pull_status @pull .both + + .leftlist.big-list= t('activerecord.attributes.issue.assignee') + ':' + #assigned-container.rightlist + .user-container + - if @issue.assignee + .image + =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') + %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) + %span= 'is assigned' + - else + %span= "No one is assigned" + %span.icon-share + .both .leftlist.big-list .rightlist =f.submit t('.submit'), :class => 'btn btn-primary disabled', 'data-loading-text' => t('layout.processing'), :id => 'create_pull' unless @pull.already? From c3a9246d09c27b45d4440f52436106d13dba67e8 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 00:46:33 +0400 Subject: [PATCH 05/45] #37: fix for assignee User to PullRequest --- app/controllers/projects/pull_requests_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/projects/pull_requests_controller.rb b/app/controllers/projects/pull_requests_controller.rb index e998e36fd..ce8f51d27 100644 --- a/app/controllers/projects/pull_requests_controller.rb +++ b/app/controllers/projects/pull_requests_controller.rb @@ -37,6 +37,7 @@ class Projects::PullRequestsController < Projects::BaseController authorize! :read, to_project @pull = to_project.pull_requests.new pull_params + @pull.issue.assignee_id = (params[:issue] || {})[:assignee_id] @pull.issue.user, @pull.issue.project, @pull.from_project = current_user, to_project, @project @pull.from_project_owner_uname = @pull.from_project.owner.uname @pull.from_project_name = @pull.from_project.name From 3ea7cfbe328cc0c8ee94abaaa6753791a256fc07 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 00:48:24 +0400 Subject: [PATCH 06/45] #37: remove unnecessary code --- app/assets/javascripts/extra/tracker.js | 74 +++---------------------- 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index 5793e0ca6..c9051ff95 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -145,23 +145,7 @@ $(document).ready(function() { $('#assigned-popup').show(); }); - // function remAssignee(form) { - // var el = form.find('.people.selected.remove_assignee'); - // var id = el.attr('id'); - // $('#manage_issue_users_list .add_assignee.people.selected').removeClass('select'); - // el.remove(); - // } - $('#assigned-popup .people.selected').live('click', function() { - // var form_new = $('form.issue'); - // var form_edit = $('form.edit_form.issue'); - // form_new.find('#people-span').fadeOut(0); - // remAssignee(form_new); - // var clone = $(this).clone().removeClass('add_assignee').addClass('remove_assignee'); - // form_new.find('#issue_assignee').html(clone); - // $('.current_assignee').html(clone.removeClass('select')); - // $(this).addClass('select'); - var form = $('#assigned-popup .edit_assignee'); var item = $(this); if (form.length == 0) { @@ -174,38 +158,14 @@ $(document).ready(function() { data: $(this).find('input').serialize(), success: function(data){ updateAssignedUser(item); - // window.location.reload(); - // $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); - // $('form#search_user, .button.update_assignee').fadeOut(0); - // $('.button.manage_assignee').fadeIn(0); - // $('#manage_issue_users_list').html(''); }, error: function(data){ alert('error'); // TODO remove } }); return false; - - - - }); - // $('.remove_assignee.people.selected').live('click', function() { - // var form = $('form.issue, form.edit_form issue'); - // form.find('#people-span').fadeIn(0); - // remAssignee(form); - // }); - - function remLabel(form, id) { - var el = form.find('.label.remove_label'+'#'+id); - var label = $('#'+id+'.remove_label.label.selected'); - label.find('.flag').fadeIn(0); - label.find('.labeltext.selected').removeClass('selected').attr('style', ''); - label.fadeIn('slow'); - el.fadeOut('slow').remove(); - } - $('.add_label.label').live('click', function() { $(this).addClass('selected').removeClass('add_label').addClass('remove_label'); $(this).find('.labeltext').addClass('selected'); @@ -287,12 +247,6 @@ $(document).ready(function() { return false; }); - // $('.button.manage_assignee').live('click', function() { - // $('form#search_user, .button.update_assignee').fadeIn(0); - // $('.current_assignee .people').addClass('remove_assignee selected').removeClass('nopointer'); - // $(this).fadeOut(0); - // }); - $('.button.manage_labels').live('click', function() { $('.button.update_labels').fadeIn(0); $('.current_labels .label .labeltext.selected').parent().addClass('remove_label selected').removeClass('nopointer'); @@ -300,25 +254,6 @@ $(document).ready(function() { $(this).fadeOut(0); }); - // $('.button.update_assignee').live('click', function() { - // var form = $('form.edit_assignee.issue'); - // $.ajax({ - // type: 'POST', - // url: form.attr("action"), - // data: form.serialize(), - // success: function(data){ - // $('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer'); - // $('form#search_user, .button.update_assignee').fadeOut(0); - // $('.button.manage_assignee').fadeIn(0); - // $('#manage_issue_users_list').html(''); - // }, - // error: function(data){ - // alert('error'); // TODO remove - // } - // }); - // return false; - // }); - $('.button.update_labels').live('click', function() { var form = $('form.edit_labels.issue'); $.ajax({ @@ -345,3 +280,12 @@ function updateAssignedUser(item) { var container = item.find('.container').clone(); $('#assigned-container .user-container').empty().append(container.html()); } + +function remLabel(form, id) { + var el = form.find('.label.remove_label'+'#'+id); + var label = $('#'+id+'.remove_label.label.selected'); + label.find('.flag').fadeIn(0); + label.find('.labeltext.selected').removeClass('selected').attr('style', ''); + label.fadeIn('slow'); + el.fadeOut('slow').remove(); +} \ No newline at end of file From 3037520ab550cc7ce3eae24233336618fe14abb1 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 00:59:25 +0400 Subject: [PATCH 07/45] #37: update text messages --- app/views/projects/issues/_form.html.haml | 4 ++-- app/views/projects/issues/_header.html.haml | 4 ++-- app/views/projects/issues/_search_collaborators.html.haml | 8 ++++---- app/views/projects/pull_requests/new.html.haml | 4 ++-- config/locales/models/issue.en.yml | 4 ++++ config/locales/models/issue.ru.yml | 4 ++++ 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 35909cfcc..d404aa6d0 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -6,9 +6,9 @@ .image =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= 'is assigned' + %span= t('layout.issues.is_assigned') - else - %span= "No one is assigned" + %span= t('layout.issues.no_one_is_assigned') %span.icon-share .both .leftlist= t('layout.issues.labels') + ':' diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index cd832b59f..44ed7a70f 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -16,9 +16,9 @@ .image =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= 'is assigned' + %span= t('layout.issues.is_assigned') - else - %span= "No one is assigned" + %span= t('layout.issues.no_one_is_assigned') -if can?(:update, @issue) || @issue.new_record? %span.icon-share =render 'projects/issues/assigned_popup' diff --git a/app/views/projects/issues/_search_collaborators.html.haml b/app/views/projects/issues/_search_collaborators.html.haml index f2de9f4c9..cc58a6076 100644 --- a/app/views/projects/issues/_search_collaborators.html.haml +++ b/app/views/projects/issues/_search_collaborators.html.haml @@ -1,8 +1,8 @@ .people.clear.selected %span.icon-remove-circle - = 'Clear assignee' + = t('layout.issues.clear_assignee') .container - %span= "No one is assigned" + %span= t('layout.issues.no_one_is_assigned') = hidden_field_tag "user-nil", nil, :name => "issue[assignee_id]" - users = (@users || []) @@ -14,8 +14,8 @@ .image =image_tag(avatar_url(user, :micro), :alt => 'avatar') %span.name= link_to(user.uname, user_path(user)) - %span= 'is assigned' + %span= t('layout.issues.is_assigned') = hidden_field_tag "user-#{index}", user.id, :name => "issue[assignee_id]" .both - if users.empty? - .nothing= 'Nothing to show' \ No newline at end of file + .nothing= t('layout.issues.nothing_to_show') \ No newline at end of file diff --git a/app/views/projects/pull_requests/new.html.haml b/app/views/projects/pull_requests/new.html.haml index 9e29f4510..b7392c882 100644 --- a/app/views/projects/pull_requests/new.html.haml +++ b/app/views/projects/pull_requests/new.html.haml @@ -40,9 +40,9 @@ .image =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= 'is assigned' + %span= t('layout.issues.is_assigned') - else - %span= "No one is assigned" + %span= t('layout.issues.no_one_is_assigned') %span.icon-share .both .leftlist.big-list diff --git a/config/locales/models/issue.en.yml b/config/locales/models/issue.en.yml index 2887f0f9f..21e42e102 100644 --- a/config/locales/models/issue.en.yml +++ b/config/locales/models/issue.en.yml @@ -11,6 +11,10 @@ en: layout: issues: + is_assigned: is assigned + clear_assignee: Clear assignee + nothing_to_show: Nothing to show + no_one_is_assigned: No one is assigned list: List all: All issues to_me: Assigned to me diff --git a/config/locales/models/issue.ru.yml b/config/locales/models/issue.ru.yml index 2660ba6b1..f636e67da 100644 --- a/config/locales/models/issue.ru.yml +++ b/config/locales/models/issue.ru.yml @@ -11,6 +11,10 @@ ru: layout: issues: + is_assigned: назначен + clear_assignee: Убрать назначение + nothing_to_show: Никто не найден + no_one_is_assigned: Никто не назначен list: Список all: Все задачи to_me: Назначенные мне From 26c2a26680647c75e6a0472333c3cadc1c848c7d Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 14:54:47 +0400 Subject: [PATCH 08/45] #37: update styles, text message --- app/assets/javascripts/extra/tracker.js | 2 +- app/assets/stylesheets/design/custom.scss | 15 +++++---------- .../projects/issues/_assigned_popup.html.haml | 2 +- app/views/projects/issues/_form.html.haml | 2 +- app/views/projects/issues/_header.html.haml | 6 +++--- app/views/projects/pull_requests/new.html.haml | 2 +- config/locales/models/issue.en.yml | 1 + config/locales/models/issue.ru.yml | 1 + 8 files changed, 14 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index c9051ff95..d358f9b31 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -278,7 +278,7 @@ $(document).ready(function() { function updateAssignedUser(item) { $('#assigned-popup').hide(); var container = item.find('.container').clone(); - $('#assigned-container .user-container').empty().append(container.html()); + $('#assigned-container .user-container').empty().append(container.html()).append(''); } function remLabel(form, id) { diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index c6dbf8ce9..cef509faa 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1910,24 +1910,19 @@ article .activity .top { #assigned-container { .icon-share { cursor: pointer; - margin-top: -2px; } .image { float: left; - width: 16px; - height: 16px; + width: auto; + height: auto; margin: -1px 5px 0 0; img { - position: absolute; width: 16px; height: 16px; } } - .user-container { - display: inline-block; - } - span { - padding-left: 5px; + .name { + margin-left: 5px; } } @@ -1936,7 +1931,7 @@ article .activity .top { position: absolute; margin: 5px 0 0 130px; display: none; - min-width: 230px; + min-width: 240px; border: 1px solid #b3cce0; background: #FFF; -moz-border-radius: 5px; diff --git a/app/views/projects/issues/_assigned_popup.html.haml b/app/views/projects/issues/_assigned_popup.html.haml index 07d5f32d3..851d4951c 100644 --- a/app/views/projects/issues/_assigned_popup.html.haml +++ b/app/views/projects/issues/_assigned_popup.html.haml @@ -1,6 +1,6 @@ #assigned-popup .header - .title= 'Assign someone to this issue' + .title= t('layout.issues.assign_someone') %span.icon-remove-circle = form_tag search_collaborators_project_issues_path(@project, :id => @issue.id), :id => 'search_user', :method => :get do = tracker_search_field(:search_user, t('layout.issues.search_user')) diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index d404aa6d0..314a830c1 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -9,7 +9,7 @@ %span= t('layout.issues.is_assigned') - else %span= t('layout.issues.no_one_is_assigned') - %span.icon-share + %span.icon-share .both .leftlist= t('layout.issues.labels') + ':' .rightlist diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index 44ed7a70f..32ecb00a1 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -19,9 +19,9 @@ %span= t('layout.issues.is_assigned') - else %span= t('layout.issues.no_one_is_assigned') - -if can?(:update, @issue) || @issue.new_record? - %span.icon-share - =render 'projects/issues/assigned_popup' + -if can?(:update, @issue) || @issue.new_record? + %span.icon-share + =render 'projects/issues/assigned_popup' .both .fulltext.view.issue_body.formatted.cm-s-default.md_and_cm=markdown @issue.body diff --git a/app/views/projects/pull_requests/new.html.haml b/app/views/projects/pull_requests/new.html.haml index b7392c882..79a542b64 100644 --- a/app/views/projects/pull_requests/new.html.haml +++ b/app/views/projects/pull_requests/new.html.haml @@ -43,7 +43,7 @@ %span= t('layout.issues.is_assigned') - else %span= t('layout.issues.no_one_is_assigned') - %span.icon-share + %span.icon-share .both .leftlist.big-list .rightlist diff --git a/config/locales/models/issue.en.yml b/config/locales/models/issue.en.yml index 21e42e102..c06dfd908 100644 --- a/config/locales/models/issue.en.yml +++ b/config/locales/models/issue.en.yml @@ -15,6 +15,7 @@ en: clear_assignee: Clear assignee nothing_to_show: Nothing to show no_one_is_assigned: No one is assigned + assign_someone: Assign someone to this issue list: List all: All issues to_me: Assigned to me diff --git a/config/locales/models/issue.ru.yml b/config/locales/models/issue.ru.yml index f636e67da..1e1e3c190 100644 --- a/config/locales/models/issue.ru.yml +++ b/config/locales/models/issue.ru.yml @@ -15,6 +15,7 @@ ru: clear_assignee: Убрать назначение nothing_to_show: Никто не найден no_one_is_assigned: Никто не назначен + assign_someone: Назначить кого-либо на задачу list: Список all: Все задачи to_me: Назначенные мне From 9a2fc870cf6227b1c9d7b95afe83921903341279 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 15:07:08 +0400 Subject: [PATCH 09/45] #37: moved some code into the partial --- app/views/projects/issues/_form.html.haml | 10 +--------- app/views/projects/issues/_header.html.haml | 12 +----------- .../projects/issues/_search_collaborators.html.haml | 2 +- app/views/projects/issues/_user_container.html.haml | 10 ++++++++++ app/views/projects/pull_requests/new.html.haml | 10 +--------- 5 files changed, 14 insertions(+), 30 deletions(-) create mode 100644 app/views/projects/issues/_user_container.html.haml diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 314a830c1..a0948aebb 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -1,15 +1,7 @@ =render 'title_body', :f => f, :id => 'new' .leftlist= t('activerecord.attributes.issue.assignee') + ':' #assigned-container.rightlist - .user-container - - if @issue.assignee - .image - =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') - %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= t('layout.issues.is_assigned') - - else - %span= t('layout.issues.no_one_is_assigned') - %span.icon-share + =render 'user_container', :user => @issue.assignee .both .leftlist= t('layout.issues.labels') + ':' .rightlist diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index 32ecb00a1..e487fddcc 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -11,18 +11,8 @@ %h3.issue_title=@issue.title .both #assigned-container.assigned-header - .user-container - - if @issue.assignee - .image - =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') - %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= t('layout.issues.is_assigned') - - else - %span= t('layout.issues.no_one_is_assigned') - -if can?(:update, @issue) || @issue.new_record? - %span.icon-share + =render 'projects/issues/user_container', :user => @issue.assignee =render 'projects/issues/assigned_popup' - .both .fulltext.view.issue_body.formatted.cm-s-default.md_and_cm=markdown @issue.body .both diff --git a/app/views/projects/issues/_search_collaborators.html.haml b/app/views/projects/issues/_search_collaborators.html.haml index cc58a6076..0d36330cd 100644 --- a/app/views/projects/issues/_search_collaborators.html.haml +++ b/app/views/projects/issues/_search_collaborators.html.haml @@ -12,7 +12,7 @@ .name= user.fullname .container .image - =image_tag(avatar_url(user, :micro), :alt => 'avatar') + = image_tag(avatar_url(user, :micro), :alt => 'avatar') %span.name= link_to(user.uname, user_path(user)) %span= t('layout.issues.is_assigned') = hidden_field_tag "user-#{index}", user.id, :name => "issue[assignee_id]" diff --git a/app/views/projects/issues/_user_container.html.haml b/app/views/projects/issues/_user_container.html.haml new file mode 100644 index 000000000..63a37e54c --- /dev/null +++ b/app/views/projects/issues/_user_container.html.haml @@ -0,0 +1,10 @@ +.user-container + - if user + .image + =image_tag(avatar_url(user, :micro), :alt => 'avatar') + %span.name= link_to(user.uname, user_path(user)) + %span= t('layout.issues.is_assigned') + - else + %span= t('layout.issues.no_one_is_assigned') + -if can?(:update, @issue) || @issue.new_record? + %span.icon-share \ No newline at end of file diff --git a/app/views/projects/pull_requests/new.html.haml b/app/views/projects/pull_requests/new.html.haml index 79a542b64..a4d30a2d8 100644 --- a/app/views/projects/pull_requests/new.html.haml +++ b/app/views/projects/pull_requests/new.html.haml @@ -35,15 +35,7 @@ .leftlist.big-list= t('activerecord.attributes.issue.assignee') + ':' #assigned-container.rightlist - .user-container - - if @issue.assignee - .image - =image_tag(avatar_url(@issue.assignee, :micro), :alt => 'avatar') - %span.name= link_to(@issue.assign_uname, user_path(@issue.assignee)) - %span= t('layout.issues.is_assigned') - - else - %span= t('layout.issues.no_one_is_assigned') - %span.icon-share + =render 'projects/issues/user_container', :user => @pull.assignee .both .leftlist.big-list .rightlist From c43c87cf04cb7c7a87db2f688ba1b98cd311473e Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 15:09:58 +0400 Subject: [PATCH 10/45] #37: small refactoring according to Alexander's comment --- app/views/projects/issues/_header.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index e487fddcc..83adc3ef4 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -6,7 +6,7 @@ .created %span.date=@issue.created_at.to_s(:long) - if @issue.user - %span.date=t("layout.by") + %span.date=t('layout.by') %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) %h3.issue_title=@issue.title .both From 922ab778f494c86ba55dc26ae95d555fc78ff938 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Thu, 21 Mar 2013 22:14:07 +0400 Subject: [PATCH 11/45] #37: search user by keyup instead of 'press enter' --- app/assets/javascripts/extra/tracker.js | 22 ++++++------------- app/assets/stylesheets/design/custom.scss | 2 +- .../projects/issues/_assigned_popup.html.haml | 4 +++- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index d358f9b31..7acee8c69 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -115,24 +115,16 @@ $(document).ready(function() { return false; }; - $('#search_user').live('submit', function() { - var id = $(this).attr('id'); - if(id.indexOf('user') != -1) { // FIXME - var which = 'users'; - } - else if (id.indexOf('labels') != -1) { - var which = 'labels'; - } - $.ajax({ + var isSearchUser = null; + $('#search_user').on('keyup', function() { + if (isSearchUser != null) { isSearchUser.abort(); } + isSearchUser = $.ajax({ type: 'GET', - url: $(this).attr("action"), + url: $('#search_user_path').attr('path'), data: $(this).serialize(), success: function(data){ - $('#manage_issue_'+ which +'_list').html(data); - }, - error: function(data){ - alert('error') // TODO remove - } + $('#manage_issue_users_list').html(data); + } }); return false; }); diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index cef509faa..9c52d8eca 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1949,7 +1949,7 @@ article .activity .top { font-weight: bold; .title { display: inline-block; } } - form { + .search-container { padding: 10px 15px 10px 10px; border-bottom: 1px solid #D6D6D6; input { diff --git a/app/views/projects/issues/_assigned_popup.html.haml b/app/views/projects/issues/_assigned_popup.html.haml index 851d4951c..0b11772dc 100644 --- a/app/views/projects/issues/_assigned_popup.html.haml +++ b/app/views/projects/issues/_assigned_popup.html.haml @@ -2,9 +2,11 @@ .header .title= t('layout.issues.assign_someone') %span.icon-remove-circle - = form_tag search_collaborators_project_issues_path(@project, :id => @issue.id), :id => 'search_user', :method => :get do + .search-container + #search_user_path{:path => search_collaborators_project_issues_path(@project, :id => @issue.id)} = tracker_search_field(:search_user, t('layout.issues.search_user')) + - unless [:new, :create].include?(action_name.to_sym) = form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f| = hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]' From 8e2115931454eecf63f4a3e2baccd562e10d257c Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 01:20:36 +0400 Subject: [PATCH 12/45] #37: some styles changes --- app/assets/stylesheets/design/custom.scss | 19 +++++++++++-------- app/controllers/projects/base_controller.rb | 7 +++++++ app/controllers/projects/issues_controller.rb | 6 +----- .../projects/pull_requests_controller.rb | 1 + .../projects/issues/_assigned_popup.html.haml | 2 +- app/views/projects/issues/_header.html.haml | 12 ++++++------ 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index 9c52d8eca..c78e15046 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1892,12 +1892,18 @@ table#myTable thead tr.search th form.button_to div input { article .activity .top { .created { - opacity: 0.8; - span { - float: none; - margin-right: 5px; + margin-left: 50px; + span, a { + font-size: 11px; } } + .issue_title.text { + max-width: none; + } + h3.issue_title { + margin: 5px 0 0; + font-size: 18px; + } .assigned-header { padding: 10px 20px; border: 1px solid #D6D6D6; @@ -1969,12 +1975,9 @@ article .activity .top { width: 100%; padding: 10px 20px 10px 10px; } - .clear { + .clear, .nothing { opacity: 0.8; } - .nothing { - color: #D6D6D6; - } .container { display: none; } diff --git a/app/controllers/projects/base_controller.rb b/app/controllers/projects/base_controller.rb index 41bf3b8d9..d2f20e6a5 100644 --- a/app/controllers/projects/base_controller.rb +++ b/app/controllers/projects/base_controller.rb @@ -5,6 +5,13 @@ class Projects::BaseController < ApplicationController protected + def find_collaborators + search = "%#{params[:search_user]}%" + users = User.joins(:groups => :projects).where(:projects => {:id => @project.id}).where("users.uname ILIKE ?", search) + users2 = @project.collaborators.where("users.uname ILIKE ?", search) + @users = (users + users2).uniq.sort {|x,y| x.uname <=> y.uname}.first(10) + end + def find_project @project = Project.find_by_owner_and_name!(params[:owner_name], params[:project_name]) if params[:owner_name] && params[:project_name] end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index eee695f31..b4b03d4fd 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -6,6 +6,7 @@ class Projects::IssuesController < Projects::BaseController load_resource :project load_and_authorize_resource :issue, :through => :project, :find_by => :serial_id, :only => [:show, :edit, :update, :destroy, :new, :create, :index] before_filter :load_and_authorize_label, :only => NON_RESTFUL_ACTION + before_filter :find_collaborators, :only => [:new, :create, :show, :search_collaborators] layout false, :only => [:update, :search_collaborators] @@ -91,11 +92,6 @@ class Projects::IssuesController < Projects::BaseController end def search_collaborators - search = "%#{params[:search_user]}%" - users = User.joins(:groups => :projects).where(:projects => {:id => @project.id}).where("users.uname ILIKE ?", search) - users2 = @project.collaborators.where("users.uname ILIKE ?", search) - @users = (users + users2).uniq.sort {|x,y| x.uname <=> y.uname}.first(10) - @issue = Issue.where(:id => params[:id]).first render :partial => 'search_collaborators' end diff --git a/app/controllers/projects/pull_requests_controller.rb b/app/controllers/projects/pull_requests_controller.rb index ce8f51d27..5a4e7cbd9 100644 --- a/app/controllers/projects/pull_requests_controller.rb +++ b/app/controllers/projects/pull_requests_controller.rb @@ -6,6 +6,7 @@ class Projects::PullRequestsController < Projects::BaseController load_resource :issue, :through => :project, :find_by => :serial_id, :parent => false, :except => [:index, :autocomplete_to_project] load_and_authorize_resource :instance_name => :pull, :through => :issue, :singleton => true, :except => [:index, :autocomplete_to_project] + before_filter :find_collaborators, :only => [:new, :create, :show] def new to_project = find_destination_project(false) diff --git a/app/views/projects/issues/_assigned_popup.html.haml b/app/views/projects/issues/_assigned_popup.html.haml index 0b11772dc..8f31e036e 100644 --- a/app/views/projects/issues/_assigned_popup.html.haml +++ b/app/views/projects/issues/_assigned_popup.html.haml @@ -3,7 +3,7 @@ .title= t('layout.issues.assign_someone') %span.icon-remove-circle .search-container - #search_user_path{:path => search_collaborators_project_issues_path(@project, :id => @issue.id)} + #search_user_path{:path => search_collaborators_project_issues_path(@project)} = tracker_search_field(:search_user, t('layout.issues.search_user')) diff --git a/app/views/projects/issues/_header.html.haml b/app/views/projects/issues/_header.html.haml index 83adc3ef4..2f56a9a2e 100644 --- a/app/views/projects/issues/_header.html.haml +++ b/app/views/projects/issues/_header.html.haml @@ -2,12 +2,12 @@ .top .image =image_tag(avatar_url(@issue.user, :medium), :alt => 'avatar') if @issue.user - .text - .created - %span.date=@issue.created_at.to_s(:long) - - if @issue.user - %span.date=t('layout.by') - %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) + .created + %span=@issue.created_at.to_s(:long) + - if @issue.user + %span= t('layout.by') + %span.name=link_to(@issue.user.fullname, user_path(@issue.user)) + .text.issue_title %h3.issue_title=@issue.title .both #assigned-container.assigned-header From 770bb48d354230d3304a7ea84b26326e1982fd8b Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 01:31:39 +0400 Subject: [PATCH 13/45] #37: update styles for Issue title --- app/assets/stylesheets/design/custom.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index c78e15046..d6fbed8e5 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1899,6 +1899,9 @@ article .activity .top { } .issue_title.text { max-width: none; + float: none; + margin-left: 50px; + padding: 0; } h3.issue_title { margin: 5px 0 0; From 6a9e270a5cb5d0051535e1a7e06fc555a9efb7de Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 18:06:13 +0400 Subject: [PATCH 14/45] #31: add 'autostart' field to Product model --- app/models/product.rb | 23 +++- app/models/product_build_list.rb | 3 +- app/views/platforms/products/_form.html.haml | 10 +- config/locales/models/product.en.yml | 5 + config/locales/models/product.ru.yml | 5 + ...elete_to_product_and_product_build_list.rb | 6 + db/schema.rb | 118 +++++++++--------- 7 files changed, 107 insertions(+), 63 deletions(-) create mode 100644 db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb diff --git a/app/models/product.rb b/app/models/product.rb index 240646523..b7e7f8067 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -6,9 +6,21 @@ class Product < ActiveRecord::Base belongs_to :project has_many :product_build_lists, :dependent => :destroy + ONCE_A_12_HOURS = 0 + ONCE_A_DAY = 1 + ONCE_A_WEEK = 2 + + AUTOSTART_STATUSES = [ONCE_A_12_HOURS, ONCE_A_DAY, ONCE_A_WEEK] + HUMAN_AUTOSTART_STATUSES = { + ONCE_A_12_HOURS => :once_a_12_hours, + ONCE_A_DAY => :once_a_day, + ONCE_A_WEEK => :once_a_week + } + validates :name, :presence => true, :uniqueness => {:scope => :platform_id} validates :project_id, :presence => true validates :main_script, :params, :length => { :maximum => 255 } + validates :autostart, :numericality => true, :inclusion => {:in => AUTOSTART_STATUSES}, :allow_blank => true scope :recent, order("#{table_name}.name ASC") @@ -17,7 +29,8 @@ class Product < ActiveRecord::Base :project_id, :main_script, :params, - :platform_id + :platform_id, + :autostart attr_readonly :platform_id def full_clone(attrs = {}) @@ -30,4 +43,12 @@ class Product < ActiveRecord::Base end end + def human_status + self.class.human_status(status) + end + + def self.human_status(status) + I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[status]}") + end + end diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 98d0b68e6..7eff2f790 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -53,7 +53,8 @@ class ProductBuildList < ActiveRecord::Base :project_version, :commit_hash, :arch_id, - :product_id + :product_id, + :not_delete attr_readonly :product_id serialize :results, Array diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index d7a7fecaf..228d249f2 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -1,17 +1,21 @@ -.leftlist= f.label :name, t("activerecord.attributes.product.name"), :class => :label +.leftlist= f.label :name .rightlist= f.text_field :name, :class => 'text_field' .both -.leftlist= f.label :description, t("activerecord.attributes.product.description"), :class => :label +.leftlist= f.label :description .rightlist= f.text_area :description, :class => 'text_field resizable', :cols => 80 .both -.leftlist= f.label :project, t("activerecord.attributes.product.project"), :class => :label +.leftlist= f.label :project .rightlist= f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) .both = render 'def_fields', :f => f +.leftlist= f.label :autostart +.rightlist= f.select :autostart, Product::AUTOSTART_STATUSES.collect{|status| [Product.human_status(status), status]}, {:include_blank => true, :selected => @product.autostart} +.both + .button_block = submit_tag t("layout.save") %span.text_button_padding= t("layout.or") diff --git a/config/locales/models/product.en.yml b/config/locales/models/product.en.yml index df7e20768..cb7889a7e 100644 --- a/config/locales/models/product.en.yml +++ b/config/locales/models/product.en.yml @@ -11,6 +11,10 @@ en: new_header: New product edit_header: Product editing confirm_delete: Are you sure you want to delete this product? + autostart_statuses: + once_a_12_hours: Once a 12 hours + once_a_day: Once a day + once_a_week: Once a week flash: product: @@ -25,6 +29,7 @@ en: product: Product attributes: product: + autostart: Autostart name: Name description: Description platform_id: Platform diff --git a/config/locales/models/product.ru.yml b/config/locales/models/product.ru.yml index f1cbf6fc1..ed41793dc 100644 --- a/config/locales/models/product.ru.yml +++ b/config/locales/models/product.ru.yml @@ -11,6 +11,10 @@ ru: new_header: Новый продукт edit_header: Редактирование продукта confirm_delete: Вы уверены, что хотите удалить этот продукт? + autostart_statuses: + once_a_12_hours: Раз в 12 часов + once_a_day: Раз в день + once_a_week: Раз в неделю flash: product: @@ -25,6 +29,7 @@ ru: product: Продукт attributes: product: + autostart: Автостарт name: Название description: Описание platform_id: Платформа diff --git a/db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb b/db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb new file mode 100644 index 000000000..d62e9df50 --- /dev/null +++ b/db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb @@ -0,0 +1,6 @@ +class AddAutostartAndNotDeleteToProductAndProductBuildList < ActiveRecord::Migration + def change + add_column :products, :autostart, :integer, :default => nil + add_column :product_build_lists, :not_delete, :boolean, :default => false + end +end diff --git a/db/schema.rb b/db/schema.rb index 625a20902..4383777d7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,14 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130227102900) do +ActiveRecord::Schema.define(:version => 20130322132919) do create_table "activity_feeds", :force => true do |t| t.integer "user_id", :null => false t.string "kind" t.text "data" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "advisories", :force => true do |t| @@ -53,8 +53,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "arches", :force => true do |t| t.string "name", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true @@ -63,8 +63,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.integer "user_id" t.string "provider" t.string "uid" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true @@ -75,8 +75,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.integer "level" t.integer "status" t.integer "build_list_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "version" end @@ -110,8 +110,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.integer "project_id" t.integer "arch_id" t.datetime "notified_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "is_circle", :default => false t.text "additional_repos" t.string "name" @@ -149,8 +149,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "commentable_type" t.integer "user_id" t.text "body" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.decimal "commentable_id", :precision => 50, :scale => 0 t.integer "project_id" t.text "data" @@ -168,8 +168,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "controller" t.string "action" t.text "message" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "flash_notifies", :force => true do |t| @@ -183,8 +183,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "groups", :force => true do |t| t.integer "owner_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "uname" t.integer "own_projects_count", :default => 0, :null => false t.text "description" @@ -201,8 +201,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "title" t.text "body" t.string "status", :default => "open" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "user_id" t.datetime "closed_at" t.integer "closed_by" @@ -279,14 +279,14 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "description" t.string "name", :null => false t.integer "parent_platform_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "released", :default => false, :null => false t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open", :null => false t.string "platform_type", :default => "main", :null => false - t.string "distrib_type" + t.string "distrib_type", :null => false end add_index "platforms", ["name"], :name => "index_platforms_on_name", :unique => true, :case_sensitive => false @@ -295,16 +295,16 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.integer "platform_id" t.string "login" t.string "password" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "user_id" end create_table "product_build_lists", :force => true do |t| t.integer "product_id" - t.integer "status", :default => 3, :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.integer "status", :default => 2, :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "project_id" t.string "project_version" t.string "commit_hash" @@ -314,6 +314,7 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.integer "arch_id" t.integer "time_living" t.integer "user_id" + t.boolean "not_delete", :default => false end add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" @@ -321,13 +322,14 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "products", :force => true do |t| t.string "name", :null => false t.integer "platform_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.text "description" t.integer "project_id" t.string "params" t.string "main_script" t.integer "time_living" + t.integer "autostart" end create_table "project_imports", :force => true do |t| @@ -335,8 +337,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "name" t.string "version" t.datetime "file_mtime" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "platform_id" end @@ -355,27 +357,27 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "project_to_repositories", :force => true do |t| t.integer "project_id" t.integer "repository_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "project_to_repositories", ["repository_id", "project_id"], :name => "index_project_to_repositories_on_repository_id_and_project_id", :unique => true create_table "projects", :force => true do |t| t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open" t.text "description" t.string "ancestry" t.boolean "has_issues", :default => true - t.boolean "has_wiki", :default => false t.string "srpm_file_name" - t.string "srpm_content_type" t.integer "srpm_file_size" t.datetime "srpm_updated_at" + t.string "srpm_content_type" + t.boolean "has_wiki", :default => false t.string "default_branch", :default => "master" t.boolean "is_package", :default => true, :null => false t.integer "average_build_time", :default => 0, :null => false @@ -406,8 +408,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "token" t.boolean "approved", :default => false t.boolean "rejected", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "interest" t.text "more" t.string "language" @@ -421,16 +423,16 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "actor_type" t.integer "target_id" t.string "target_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "role" end create_table "repositories", :force => true do |t| t.string "description", :null => false t.integer "platform_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "name", :null => false t.boolean "publish_without_qa", :default => true end @@ -444,8 +446,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.boolean "new_comment_reply", :default => true t.boolean "new_issue", :default => true t.boolean "issue_assign", :default => true - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "new_comment_commit_owner", :default => true t.boolean "new_comment_commit_repo_owner", :default => true t.boolean "new_comment_commit_commentor", :default => true @@ -468,8 +470,8 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "subscribes", :force => true do |t| t.string "subscribeable_type" t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "status", :default => true t.integer "project_id" t.decimal "subscribeable_id", :precision => 50, :scale => 0 @@ -477,21 +479,18 @@ ActiveRecord::Schema.define(:version => 20130227102900) do create_table "users", :force => true do |t| t.string "name" - t.string "email", :default => "", :null => false - t.string "encrypted_password", :default => "", :null => false + t.string "email", :default => "", :null => false + t.string "encrypted_password", :limit => 128, :default => "", :null => false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.text "ssh_key" t.string "uname" t.string "role" - t.string "language", :default => "en" - t.integer "own_projects_count", :default => 0, :null => false - t.string "confirmation_token" - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" + t.string "language", :default => "en" + t.integer "own_projects_count", :default => 0, :null => false t.text "professional_experience" t.string "site" t.string "company" @@ -500,11 +499,14 @@ ActiveRecord::Schema.define(:version => 20130227102900) do t.string "avatar_content_type" t.integer "avatar_file_size" t.datetime "avatar_updated_at" - t.integer "failed_attempts", :default => 0 + t.integer "failed_attempts", :default => 0 t.string "unlock_token" t.datetime "locked_at" + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" t.string "authentication_token" - t.integer "build_priority", :default => 50 + t.integer "build_priority", :default => 50 end add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token" From 3865332e8a435faa0be060411fdf6c38c1d71caa Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 20:04:29 +0400 Subject: [PATCH 15/45] #31: add UI for save product_build_list --- .../product_build_lists_controller.rb | 12 +++++++++++- app/models/ability.rb | 2 +- app/models/product_build_list.rb | 3 ++- .../product_build_lists/show.html.haml | 18 ++++++++++++++++++ .../locales/models/product_build_list.en.yml | 7 ++++++- .../locales/models/product_build_list.ru.yml | 7 ++++++- config/routes.rb | 2 +- ...19_autostart_iso_build_on_regular_basis.rb} | 3 ++- db/schema.rb | 1 + 9 files changed, 48 insertions(+), 7 deletions(-) rename db/migrate/{20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb => 20130322132919_autostart_iso_build_on_regular_basis.rb} (53%) diff --git a/app/controllers/platforms/product_build_lists_controller.rb b/app/controllers/platforms/product_build_lists_controller.rb index 51ebfb1a9..3087736e7 100644 --- a/app/controllers/platforms/product_build_lists_controller.rb +++ b/app/controllers/platforms/product_build_lists_controller.rb @@ -6,7 +6,7 @@ class Platforms::ProductBuildListsController < Platforms::BaseController load_and_authorize_resource :platform, :except => :index load_and_authorize_resource :product, :through => :platform, :except => :index load_and_authorize_resource :product_build_list, :through => :product, :except => :index - load_and_authorize_resource :only => [:index, :show, :log, :cancel] + load_and_authorize_resource :only => [:index, :show, :log, :cancel, :update] def new product = @product_build_list.product @@ -23,6 +23,16 @@ class Platforms::ProductBuildListsController < Platforms::BaseController def show end + def update + if @product_build_list.update_attributes(params[:product_build_list]) + flash[:notice] = t('flash.product_build_list.updated') + else + flash[:error] = t('flash.product_build_list.update_error') + flash[:warning] = @product_build_list.errors.full_messages.join('. ') + end + redirect_to platform_product_product_build_list_path(@platform, @product, @product_build_list) + end + def cancel if @product_build_list.cancel notice = t('layout.build_lists.will_be_canceled') diff --git a/app/models/ability.rb b/app/models/ability.rb index f7d26c011..951a28fc7 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -117,7 +117,7 @@ class Ability can(:read, Product, read_relations_for('products', 'platforms')) {|product| product.platform.main?} can([:create, :update, :destroy, :clone], Product) {|product| local_admin? product.platform and product.platform.main?} - can([:create, :cancel], ProductBuildList) {|pbl| can?(:update, pbl.product)} + can([:create, :cancel, :update], ProductBuildList) {|pbl| can?(:update, pbl.product)} can(:destroy, ProductBuildList) {|pbl| can?(:destroy, pbl.product)} can [:read, :create], PrivateUser, :platform => {:owner_type => 'User', :owner_id => user.id} diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 7eff2f790..3420249e7 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -54,7 +54,8 @@ class ProductBuildList < ActiveRecord::Base :commit_hash, :arch_id, :product_id, - :not_delete + :not_delete, + :autostarted attr_readonly :product_id serialize :results, Array diff --git a/app/views/platforms/product_build_lists/show.html.haml b/app/views/platforms/product_build_lists/show.html.haml index 6af23ac72..eab087bb8 100644 --- a/app/views/platforms/product_build_lists/show.html.haml +++ b/app/views/platforms/product_build_lists/show.html.haml @@ -35,6 +35,24 @@ - if pbl.build_started? || pbl.build_canceling? = render 'shared/log', { :build_started => true, :get_log_path => log_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) } +- if pbl.build_completed? && can?(:update, pbl) + = form_for pbl, :url => platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) do |f| + .leftlist= f.label :not_delete + .rightlist + = f.select :not_delete, [false, true].collect{|status| [t("layout.#{status}_"), status]}, {:selected => pbl.not_delete} + .both + %br + = submit_tag t('layout.update') + .both + - unless pbl.not_delete + .flash_notify + .alert.alert-error + - if pbl.autostarted? + = t('layout.product_build_lists.will_be_exist_2_weeks') + - else + = t('layout.product_build_lists.will_be_exist_3_months') + .both + = render 'results', :subject => pbl :javascript diff --git a/config/locales/models/product_build_list.en.yml b/config/locales/models/product_build_list.en.yml index 35e45dd80..35a8ae2a5 100644 --- a/config/locales/models/product_build_list.en.yml +++ b/config/locales/models/product_build_list.en.yml @@ -1,6 +1,8 @@ en: layout: product_build_lists: + will_be_exist_2_weeks: Product build list will be exist in two weeks + will_be_exist_3_months: Product build list will be exist in three months logs: Logs (last 100 lines) work_env: Work environment iso_builder_folder: folder with contents of the GIT project @@ -29,6 +31,7 @@ en: activerecord: attributes: product_build_list: + not_delete: Not delete id: Id user: User product: Product @@ -52,4 +55,6 @@ en: product_build_list: no_project: Project for build should be exist delete: Product build list deleted - delete_error: Unable to delete product build list \ No newline at end of file + delete_error: Unable to delete product build list + updated: Product build list updated + update_error: Unable to update product build list \ No newline at end of file diff --git a/config/locales/models/product_build_list.ru.yml b/config/locales/models/product_build_list.ru.yml index 9741cd1b3..baecbdfb4 100644 --- a/config/locales/models/product_build_list.ru.yml +++ b/config/locales/models/product_build_list.ru.yml @@ -1,6 +1,8 @@ ru: layout: product_build_lists: + will_be_exist_2_weeks: Cборочный лист продукта будет доступен в течение двух недель + will_be_exist_3_months: Cборочный лист продукта будет доступен в течение трех месяцев logs: Логи (последнии 100 строк) work_env: Рабочее пространство iso_builder_folder: папка с содержимым GIT проекта @@ -29,6 +31,7 @@ ru: activerecord: attributes: product_build_list: + not_delete: Не удалять id: Id user: Пользователь product: Продукт @@ -52,4 +55,6 @@ ru: product_build_list: no_project: Проект для сборки должен присутствовать delete: Сборочный лист продукта удален - delete_error: Не удалось удалить cборочный лист продукта \ No newline at end of file + delete_error: Не удалось удалить cборочный лист продукта + updated: Cборочный лист продукта успешно обновлен + update_error: Не удалось обновить cборочный лист продукта \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 4d5e5c11c..e3882c1c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -162,7 +162,7 @@ Rosa::Application.routes.draw do end resources :key_pairs, :only => [:create, :index, :destroy] resources :products do - resources :product_build_lists, :only => [:create, :destroy, :new, :show] do + resources :product_build_lists, :only => [:create, :destroy, :new, :show, :update] do member { get :log put :cancel diff --git a/db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb b/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb similarity index 53% rename from db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb rename to db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb index d62e9df50..a52c4877b 100644 --- a/db/migrate/20130322132919_add_autostart_and_not_delete_to_product_and_product_build_list.rb +++ b/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb @@ -1,6 +1,7 @@ -class AddAutostartAndNotDeleteToProductAndProductBuildList < ActiveRecord::Migration +class AutostartIsoBuildOnRegularBasis < ActiveRecord::Migration def change add_column :products, :autostart, :integer, :default => nil add_column :product_build_lists, :not_delete, :boolean, :default => false + add_column :product_build_lists, :autostarted, :boolean, :default => false end end diff --git a/db/schema.rb b/db/schema.rb index 4383777d7..355e77730 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -315,6 +315,7 @@ ActiveRecord::Schema.define(:version => 20130322132919) do t.integer "time_living" t.integer "user_id" t.boolean "not_delete", :default => false + t.boolean "autostarted", :default => false end add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" From a5e122dc63fefd528aa06c01c5b3cd9854173ae2 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 20:15:37 +0400 Subject: [PATCH 16/45] #31: rename 'autostart' field to 'autostart_status' in Product model --- app/models/product.rb | 17 +++++++++++------ app/views/platforms/products/_form.html.haml | 4 ++-- config/locales/models/product.en.yml | 2 +- config/locales/models/product.ru.yml | 2 +- ...2919_autostart_iso_build_on_regular_basis.rb | 2 +- db/schema.rb | 6 +++--- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index b7e7f8067..0f5d5eca3 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -20,7 +20,8 @@ class Product < ActiveRecord::Base validates :name, :presence => true, :uniqueness => {:scope => :platform_id} validates :project_id, :presence => true validates :main_script, :params, :length => { :maximum => 255 } - validates :autostart, :numericality => true, :inclusion => {:in => AUTOSTART_STATUSES}, :allow_blank => true + validates :autostart_status, :numericality => true, + :inclusion => {:in => AUTOSTART_STATUSES}, :allow_blank => true scope :recent, order("#{table_name}.name ASC") @@ -30,7 +31,7 @@ class Product < ActiveRecord::Base :main_script, :params, :platform_id, - :autostart + :autostart_status attr_readonly :platform_id def full_clone(attrs = {}) @@ -43,12 +44,16 @@ class Product < ActiveRecord::Base end end - def human_status - self.class.human_status(status) + def human_autostart_status + self.class.human_autostart_status(autostart_status) end - def self.human_status(status) - I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[status]}") + def self.human_autostart_status(autostart_status) + I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[autostart_status]}") end + # def self.autostart_iso_builds(autostart_status) + # Product.where(:autostart_status => autostart_status) + # end + end diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index 228d249f2..e1759d958 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -12,8 +12,8 @@ = render 'def_fields', :f => f -.leftlist= f.label :autostart -.rightlist= f.select :autostart, Product::AUTOSTART_STATUSES.collect{|status| [Product.human_status(status), status]}, {:include_blank => true, :selected => @product.autostart} +.leftlist= f.label :autostart_status +.rightlist= f.select :autostart_status, Product::AUTOSTART_STATUSES.collect{|status| [Product.human_autostart_status(status), status]}, {:include_blank => true, :selected => @product.autostart_status} .both .button_block diff --git a/config/locales/models/product.en.yml b/config/locales/models/product.en.yml index cb7889a7e..df3d3f26d 100644 --- a/config/locales/models/product.en.yml +++ b/config/locales/models/product.en.yml @@ -29,7 +29,7 @@ en: product: Product attributes: product: - autostart: Autostart + autostart_status: Autostart name: Name description: Description platform_id: Platform diff --git a/config/locales/models/product.ru.yml b/config/locales/models/product.ru.yml index ed41793dc..a96929744 100644 --- a/config/locales/models/product.ru.yml +++ b/config/locales/models/product.ru.yml @@ -29,7 +29,7 @@ ru: product: Продукт attributes: product: - autostart: Автостарт + autostart_status: Автостарт name: Название description: Описание platform_id: Платформа diff --git a/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb b/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb index a52c4877b..e60b17fe5 100644 --- a/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb +++ b/db/migrate/20130322132919_autostart_iso_build_on_regular_basis.rb @@ -1,6 +1,6 @@ class AutostartIsoBuildOnRegularBasis < ActiveRecord::Migration def change - add_column :products, :autostart, :integer, :default => nil + add_column :products, :autostart_status, :integer, :default => nil add_column :product_build_lists, :not_delete, :boolean, :default => false add_column :product_build_lists, :autostarted, :boolean, :default => false end diff --git a/db/schema.rb b/db/schema.rb index 355e77730..ce331079b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -321,8 +321,8 @@ ActiveRecord::Schema.define(:version => 20130322132919) do add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" create_table "products", :force => true do |t| - t.string "name", :null => false - t.integer "platform_id", :null => false + t.string "name", :null => false + t.integer "platform_id", :null => false t.datetime "created_at" t.datetime "updated_at" t.text "description" @@ -330,7 +330,7 @@ ActiveRecord::Schema.define(:version => 20130322132919) do t.string "params" t.string "main_script" t.integer "time_living" - t.integer "autostart" + t.integer "autostart_status" end create_table "project_imports", :force => true do |t| From 8f324606097bf7d7169ee3a8052121dbb3af14b9 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 20:58:53 +0400 Subject: [PATCH 17/45] #31: update UI, add #autostart_iso_builds method into Product model --- app/models/platform.rb | 6 +++--- app/models/product.rb | 15 ++++++++++++--- .../platforms/product_build_lists/show.html.haml | 2 ++ config/locales/models/product_build_list.en.yml | 1 + config/locales/models/product_build_list.ru.yml | 1 + 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/models/platform.rb b/app/models/platform.rb index 4a1cd3608..29d4f8d2f 100644 --- a/app/models/platform.rb +++ b/app/models/platform.rb @@ -182,6 +182,9 @@ class Platform < ActiveRecord::Base end later :destroy, :queue => :clone_build + def default_host + EventLog.current_controller.request.host_with_port rescue ::Rosa::Application.config.action_mailer.default_url_options[:host] + end protected @@ -189,9 +192,6 @@ class Platform < ActiveRecord::Base system("mkdir -p -m 0777 #{build_path([name, 'repository'])}") end - def default_host - EventLog.current_controller.request.host_with_port rescue ::Rosa::Application.config.action_mailer.default_url_options[:host] - end def build_path(dir) File.join(APP_CONFIG['root_path'], 'platforms', dir) diff --git a/app/models/product.rb b/app/models/product.rb index 0f5d5eca3..8f9ca1fde 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -52,8 +52,17 @@ class Product < ActiveRecord::Base I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[autostart_status]}") end - # def self.autostart_iso_builds(autostart_status) - # Product.where(:autostart_status => autostart_status) - # end + def self.autostart_iso_builds(autostart_status) + Product.where(:autostart_status => autostart_status).each do |product| + pbl = product.product_build_lists.new(:autostarted => true) + [:params, :main_script, :time_living, :project].each do |k| + pbl.send "#{k}=", product.send(k) + end + owner = product.platform.owner + pbl.user = owner.is_a?(User) ? owner : owner.owner + pbl.base_url = "http://#{product.platform.default_host}" + pbl.save + end + end end diff --git a/app/views/platforms/product_build_lists/show.html.haml b/app/views/platforms/product_build_lists/show.html.haml index eab087bb8..4c3f3569a 100644 --- a/app/views/platforms/product_build_lists/show.html.haml +++ b/app/views/platforms/product_build_lists/show.html.haml @@ -25,6 +25,8 @@ = render 'show_field', :key => :time_living, :value => (pbl.time_living / 60) += render 'show_field', :key => :autostarted, :value => t("layout.#{pbl.autostarted}_") + = render 'show_field', :key => :notified_at, :value => l(pbl.updated_at, :format => :long) - if pbl.can_cancel? && can?(:cancel, pbl) diff --git a/config/locales/models/product_build_list.en.yml b/config/locales/models/product_build_list.en.yml index 35a8ae2a5..2a711bd90 100644 --- a/config/locales/models/product_build_list.en.yml +++ b/config/locales/models/product_build_list.en.yml @@ -31,6 +31,7 @@ en: activerecord: attributes: product_build_list: + autostarted: Autostart not_delete: Not delete id: Id user: User diff --git a/config/locales/models/product_build_list.ru.yml b/config/locales/models/product_build_list.ru.yml index baecbdfb4..00dde5ad7 100644 --- a/config/locales/models/product_build_list.ru.yml +++ b/config/locales/models/product_build_list.ru.yml @@ -31,6 +31,7 @@ ru: activerecord: attributes: product_build_list: + autostarted: Автоматически запущен not_delete: Не удалять id: Id user: Пользователь From e528127f8549555b00897db8611049e1e4e9b23e Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 21:17:40 +0400 Subject: [PATCH 18/45] #31: add autostart ISO to schedule.rb --- app/models/product.rb | 14 ++++++++++++-- config/schedule.rb | 13 +++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 8f9ca1fde..0f2c2b5bb 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -52,15 +52,25 @@ class Product < ActiveRecord::Base I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[autostart_status]}") end + class << self + HUMAN_AUTOSTART_STATUSES.each do |autostart_status, human_autostart_status| + define_method "autostart_iso_builds_#{human_autostart_status}" do + autostart_iso_builds autostart_status + end + end + end + def self.autostart_iso_builds(autostart_status) Product.where(:autostart_status => autostart_status).each do |product| - pbl = product.product_build_lists.new(:autostarted => true) + pbl = product.product_build_lists.new( + :autostarted => true, + :base_url => "http://#{product.platform.default_host}" + ) [:params, :main_script, :time_living, :project].each do |k| pbl.send "#{k}=", product.send(k) end owner = product.platform.owner pbl.user = owner.is_a?(User) ? owner : owner.owner - pbl.base_url = "http://#{product.platform.default_host}" pbl.save end end diff --git a/config/schedule.rb b/config/schedule.rb index 97cf5991f..92d28d47c 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -25,4 +25,17 @@ end every 3.minute do runner 'AbfWorker::BuildListsPublishTaskManager.new.run', :output => 'log/task_manager.log' +end + +every :day, :at => '4am' do + runner 'Product.autostart_iso_builds_once_a_12_hours', :output => 'log/autostart_iso_builds.log' + runner 'Product.autostart_iso_builds_once_a_day', :output => 'log/autostart_iso_builds.log' +end + +every :day, :at => '4pm' do + runner 'Product.autostart_iso_builds_once_a_12_hours', :output => 'log/autostart_iso_builds.log' +end + +every :sunday, :at => '4am' do + runner 'Product.autostart_iso_builds_once_a_week', :output => 'log/autostart_iso_builds.log' end \ No newline at end of file From 1fc21448ceda6e2e71651d1b4669efbedb87cb28 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 22:18:54 +0400 Subject: [PATCH 19/45] #31: add task for removing outdated ProductBuildLists --- app/models/product_build_list.rb | 5 +++++ config/schedule.rb | 12 ++++++++---- lib/tasks/.gitkeep | 0 lib/tasks/product_build_list.rake | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 4 deletions(-) delete mode 100644 lib/tasks/.gitkeep create mode 100644 lib/tasks/product_build_list.rake diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 3420249e7..833636af9 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -6,6 +6,9 @@ class ProductBuildList < ActiveRecord::Base include AbfWorker::ModelHelper delegate :url_helpers, to: 'Rails.application.routes' + LIVE_TIME = 2.week # for autostart + MAX_LIVE_TIME = 3.month # for manual start; + BUILD_COMPLETED = 0 BUILD_FAILED = 1 BUILD_PENDING = 2 @@ -65,6 +68,8 @@ class ProductBuildList < ActiveRecord::Base scope :for_user, lambda { |user| where(:user_id => user.id) } scope :scoped_to_product_name, lambda {|product_name| joins(:product).where('products.name LIKE ?', "%#{product_name}%")} scope :recent, order("#{table_name}.updated_at DESC") + scope :outdated, where(:not_delete => false). + where("(#{table_name}.created_at < ? AND #{table_name}.autostarted is TRUE) OR #{table_name}.created_at < ?", Time.now - LIVE_TIME, Time.now - MAX_LIVE_TIME) after_create :add_job_to_abf_worker_queue before_destroy :can_destroy? diff --git a/config/schedule.rb b/config/schedule.rb index 92d28d47c..318eabf95 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -7,19 +7,23 @@ # runner "Download.parse_and_remove_nginx_log" #end -every 1.day, :at => '4:00 am' do +every :day, :at => '4:10 am' do + rake "product_build_list:clear:outdated", :output => 'log/product_build_list_clear.log' +end + +every :day, :at => '4:00 am' do rake "import:sync:all", :output => 'log/sync.log' end -every 1.day, :at => '3:50 am' do +every :day, :at => '3:50 am' do rake "buildlist:clear:outdated", :output => 'log/build_list_clear.log' end -every 1.day, :at => '3:30 am' do +every :day, :at => '3:30 am' do rake "pull_requests:clear", :output => 'log/pull_requests_clear.log' end -every 1.day, :at => '3:00 am' do +every :day, :at => '3:00 am' do rake "activity_feeds:clear", :output => 'log/activity_feeds.log' end diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/tasks/product_build_list.rake b/lib/tasks/product_build_list.rake new file mode 100644 index 000000000..892f7e343 --- /dev/null +++ b/lib/tasks/product_build_list.rake @@ -0,0 +1,14 @@ + +namespace :product_build_list do + + namespace :clear do + desc 'Remove outdated ProductBuildLists' + task :outdated => :environment do + say "[#{Time.zone.now}] Removing outdated ProductBuildLists" + say "[#{Time.zone.now}] There are #{ProductBuildList.outdated.count} outdated ProductBuildLists" + ProductBuildList.outdated.destroy_all + say "[#{Time.zone.now}] Outdated BuildLists have been removed" + end + end + +end From 3f6afeacb10f7b07c91336aed153839666a89b86 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 22:31:24 +0400 Subject: [PATCH 20/45] update product_build_list Factory --- spec/factories/product_build_lists.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/factories/product_build_lists.rb b/spec/factories/product_build_lists.rb index 4c2a12e2b..978851e86 100644 --- a/spec/factories/product_build_lists.rb +++ b/spec/factories/product_build_lists.rb @@ -9,5 +9,8 @@ FactoryGirl.define do params 'ENV=i586' time_living 150 project_version 'master' + + # see: before_validation in ProductBuildList model + before(:create) { Arch.find_or_create_by_name('x86_64') } end end From 820fdcfa85774f90447c6455f8a09a76182ba322 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 22:56:32 +0400 Subject: [PATCH 21/45] #31: add #update action to ProductBuildList API, print new fields in API --- app/controllers/api/v1/product_build_lists_controller.rb | 5 +++++ app/controllers/platforms/product_build_lists_controller.rb | 2 +- app/models/product.rb | 4 ++-- app/models/product_build_list.rb | 3 +-- app/views/api/v1/product_build_lists/show.json.jbuilder | 2 +- app/views/api/v1/products/_product.json.jbuilder | 2 +- config/routes.rb | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/controllers/api/v1/product_build_lists_controller.rb b/app/controllers/api/v1/product_build_lists_controller.rb index 83c6b6fd8..ba840f6a4 100644 --- a/app/controllers/api/v1/product_build_lists_controller.rb +++ b/app/controllers/api/v1/product_build_lists_controller.rb @@ -27,6 +27,11 @@ class Api::V1::ProductBuildListsController < Api::V1::BaseController def show end + def update + params[:product_build_list] = {:not_delete => (params[:product_build_list] || {})[:not_delete]} + update_subject @product_build_list + end + def destroy destroy_subject @product_build_list end diff --git a/app/controllers/platforms/product_build_lists_controller.rb b/app/controllers/platforms/product_build_lists_controller.rb index 3087736e7..05f19331c 100644 --- a/app/controllers/platforms/product_build_lists_controller.rb +++ b/app/controllers/platforms/product_build_lists_controller.rb @@ -24,7 +24,7 @@ class Platforms::ProductBuildListsController < Platforms::BaseController end def update - if @product_build_list.update_attributes(params[:product_build_list]) + if @product_build_list.update_attributes(:not_delete => (params[:product_build_list] || {})[:not_delete]) flash[:notice] = t('flash.product_build_list.updated') else flash[:error] = t('flash.product_build_list.update_error') diff --git a/app/models/product.rb b/app/models/product.rb index 0f2c2b5bb..a2107e350 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -63,14 +63,14 @@ class Product < ActiveRecord::Base def self.autostart_iso_builds(autostart_status) Product.where(:autostart_status => autostart_status).each do |product| pbl = product.product_build_lists.new( - :autostarted => true, - :base_url => "http://#{product.platform.default_host}" + :base_url => "http://#{product.platform.default_host}" ) [:params, :main_script, :time_living, :project].each do |k| pbl.send "#{k}=", product.send(k) end owner = product.platform.owner pbl.user = owner.is_a?(User) ? owner : owner.owner + pbl.autostarted = true pbl.save end end diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 833636af9..04c104d04 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -57,8 +57,7 @@ class ProductBuildList < ActiveRecord::Base :commit_hash, :arch_id, :product_id, - :not_delete, - :autostarted + :not_delete attr_readonly :product_id serialize :results, Array diff --git a/app/views/api/v1/product_build_lists/show.json.jbuilder b/app/views/api/v1/product_build_lists/show.json.jbuilder index 04362cf4a..6ab1d8594 100644 --- a/app/views/api/v1/product_build_lists/show.json.jbuilder +++ b/app/views/api/v1/product_build_lists/show.json.jbuilder @@ -1,6 +1,6 @@ json.product_build_list do |json| json.partial! 'product_build_list', :product_build_list => @product_build_list, :json => json - json.(@product_build_list, :commit_hash, :main_script, :params) + json.(@product_build_list, :commit_hash, :main_script, :params, :not_delete, :autostarted) json.product do |json_product| json.partial! 'api/v1/products/product', diff --git a/app/views/api/v1/products/_product.json.jbuilder b/app/views/api/v1/products/_product.json.jbuilder index 9aa376470..afb3907b9 100644 --- a/app/views/api/v1/products/_product.json.jbuilder +++ b/app/views/api/v1/products/_product.json.jbuilder @@ -1,3 +1,3 @@ -json.(product, :id, :name, :description, :main_script, :params, :time_living) +json.(product, :id, :name, :description, :main_script, :params, :time_living, :autostart_status) json.url api_v1_product_path(product, :format => :json) diff --git a/config/routes.rb b/config/routes.rb index e3882c1c9..374d4f8ec 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -78,7 +78,7 @@ Rosa::Application.routes.draw do resources :products, :only => [:show, :update, :create, :destroy] do resources :product_build_lists, :only => :index end - resources :product_build_lists, :only => [:index, :show, :destroy, :create] do + resources :product_build_lists, :only => [:index, :show, :destroy, :create, :update] do put :cancel, :on => :member end #resources :ssh_keys, :only => [:index, :create, :destroy] From 72950e299c149763e65a350678472b406174286f Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 23:11:47 +0400 Subject: [PATCH 22/45] #31: some fixes for #autostart_iso_builds method --- app/models/product.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index a2107e350..f273d9041 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -65,12 +65,14 @@ class Product < ActiveRecord::Base pbl = product.product_build_lists.new( :base_url => "http://#{product.platform.default_host}" ) - [:params, :main_script, :time_living, :project].each do |k| + [:params, :main_script, :project].each do |k| pbl.send "#{k}=", product.send(k) end owner = product.platform.owner - pbl.user = owner.is_a?(User) ? owner : owner.owner - pbl.autostarted = true + pbl.user = owner.is_a?(User) ? owner : owner.owner + pbl.autostarted = true + pbl.time_living = product.time_living / 60 + pbl.project_version = product.project.default_branch pbl.save end end From 296627557efac6a625e7b7aaa86240d5d8759d9a Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Fri, 22 Mar 2013 23:14:06 +0400 Subject: [PATCH 23/45] #31: small refactoring of #autostart_iso_builds method --- app/models/product.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index f273d9041..765ca8346 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -62,15 +62,14 @@ class Product < ActiveRecord::Base def self.autostart_iso_builds(autostart_status) Product.where(:autostart_status => autostart_status).each do |product| - pbl = product.product_build_lists.new( - :base_url => "http://#{product.platform.default_host}" - ) + pbl = product.product_build_lists.new [:params, :main_script, :project].each do |k| pbl.send "#{k}=", product.send(k) end owner = product.platform.owner pbl.user = owner.is_a?(User) ? owner : owner.owner pbl.autostarted = true + pbl.base_url = "http://#{product.platform.default_host}" pbl.time_living = product.time_living / 60 pbl.project_version = product.project.default_branch pbl.save From 4d046dd99062fc7ffec34ee57d56cdd6b0ae5804 Mon Sep 17 00:00:00 2001 From: Alexander Machehin Date: Mon, 25 Mar 2013 16:34:37 +0600 Subject: [PATCH 24/45] add exitstatus to debug merging pull requests --- app/models/pull_request.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 446e839a2..47a2ff04d 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -87,7 +87,7 @@ class PullRequest < ActiveRecord::Base system("git reset --hard HEAD^") # for diff maybe FIXME if old_commit.id == to_project.repo.commits(to_ref).first.id - raise "merge result pull_request #{id}: #{res}; #{res2}" + raise "merge result pull_request #{id}: #{$?.exitstatus}; #{res2}; #{res}" end set_user_and_time who merging From 39984d254cfcac84ab509fd37c3a78f7d8d22663 Mon Sep 17 00:00:00 2001 From: "Vladmir Sharhsov(warpc)" Date: Mon, 25 Mar 2013 16:16:46 +0400 Subject: [PATCH 25/45] New favicon --- public/favicon.ico | Bin 1150 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 4ec0d298859a6e33a6cc40f7a502354b8cad5f76..f7966978df47c8be66e4f904c752bf521e6fdaa3 100644 GIT binary patch literal 1150 zcmbtT&ubGw6rP~sLBxV6c&i6d5R}k;lT;7`p2TzUAU%0dk>W|bF6i!T6I(0jAK*!> z^x#QEB;?2JCQW0lrIZqil+aTNA|gdX7{9mK32DHS8@|l!`|-W+y_ppvh2Pkiz%wrH z9Tws=b{7CPjRUFpUx*xhqmMBr6~lE84fe3omiB1+W8u;<%dSP(;3c3-hH66zA$OD z@BHFe^ju*MwyhL0u+u8?HSDc0AhY%I3fnk_bRcKoE8=|{z9!a2a}GI*y4Zt@c47|9 z1N#!NhIsJEccDkuSwq!#?m%Y*d$;*4&TS*NiCC`D09Jt?-xjj{St@#ud8T9ifqV>K zd*cP`r=Q^9c*agLN7lkRBIw_&VU|1x#Obm(F@ZClN&1B@r_P$O_WI{WJ>;20QwKiQ zq0uMLVW|?x%dDZ|IS;_czP%Ob$DV5rfcGAsA=d`SHr|Wnr%oo;ucU{1n_Q3mTzfdz z?ky*uF>GBRs`~OO<~EJ<{QdoSyEsAdL2x4!bzt0Wa8QZVDyUeWvXReM~Hpi~R-$FP)c@i8C5#L5{ tJ?=dk`{`5GKU|A#LKyQu_zO6;hPD6z literal 1150 zcmZvc&rcIU6vv0?T~3}Vg?4v#yIp9zU1&k*FC;0yN&pE-r71xP79vXcVT>0+io~c1 z@uXK{B+(d6OeFpaN@9YEe?#HwsR-_La3ytienMto~)nRwQ- ztEU+|%NSFI377ELelaj6V$~l2tkU-O_ua*{^@FsA{g}@8q9dxKtviRl!Uob8+Ta!EAg$QvH?ga$D;u=7jC-I3O|)O%LUjBohDWow zICCGdrSIq+zm4V)7dd%ttzd{992)p}!V915J%{L}2T0!ff%9UY*uq!DZ@fotY!u;; zX657PiH$^CemQGdZh)@35gRKaxwM1C!WSeLx6xjBh3x1cW+(a)Yd0au_8EwEcrMo? z6gJQ~@d&A#Hk+9Lgv9)3Bo@CRI{6%#ksRiyhLGurTeTsU&cH?9ej|$5l_!YLeL(Em z8!>K)-xsXdBQ^KV${{lK5~)lcopIBu6|wgHNl^7h_yW!FH3p#g6d1kJ)*Ym0pP{F_ z6SAg53mD*f@Z|i&p43m&UQtACgmJkJTBrpbb03kpyo^>;fh5%*$L-vy=EPDDIQ`?? zBaNIlpe_Fx10z}ZRJ-Ptai@QXr(T?%DZH+X6CdcvAYh0yD}QTF8q!wwuhYl$ZW!U< z0rjZWr<9K>?&f$+vH!h44o_ogZ{NMVvQ|u{(z`B~x9oCBWtx+ZVwGB&AG#SUpJ8nK U6k~U4Y^(l{aMn(ow8Rkm2iEifo&W#< From 1e777bf7ff95cc00d265587a454996de538a2c6b Mon Sep 17 00:00:00 2001 From: "Vladmir Sharhsov(warpc)" Date: Mon, 25 Mar 2013 16:24:13 +0400 Subject: [PATCH 26/45] Add logo for Google OAuth --- public/pics/abf-logo.png | Bin 0 -> 10081 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/pics/abf-logo.png diff --git a/public/pics/abf-logo.png b/public/pics/abf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a6357dd0014519e0be256363e04d88eadd6198f8 GIT binary patch literal 10081 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 Date: Mon, 25 Mar 2013 16:16:46 +0400 Subject: [PATCH 27/45] New favicon --- public/favicon.ico | Bin 1150 -> 1150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index 4ec0d298859a6e33a6cc40f7a502354b8cad5f76..f7966978df47c8be66e4f904c752bf521e6fdaa3 100644 GIT binary patch literal 1150 zcmbtT&ubGw6rP~sLBxV6c&i6d5R}k;lT;7`p2TzUAU%0dk>W|bF6i!T6I(0jAK*!> z^x#QEB;?2JCQW0lrIZqil+aTNA|gdX7{9mK32DHS8@|l!`|-W+y_ppvh2Pkiz%wrH z9Tws=b{7CPjRUFpUx*xhqmMBr6~lE84fe3omiB1+W8u;<%dSP(;3c3-hH66zA$OD z@BHFe^ju*MwyhL0u+u8?HSDc0AhY%I3fnk_bRcKoE8=|{z9!a2a}GI*y4Zt@c47|9 z1N#!NhIsJEccDkuSwq!#?m%Y*d$;*4&TS*NiCC`D09Jt?-xjj{St@#ud8T9ifqV>K zd*cP`r=Q^9c*agLN7lkRBIw_&VU|1x#Obm(F@ZClN&1B@r_P$O_WI{WJ>;20QwKiQ zq0uMLVW|?x%dDZ|IS;_czP%Ob$DV5rfcGAsA=d`SHr|Wnr%oo;ucU{1n_Q3mTzfdz z?ky*uF>GBRs`~OO<~EJ<{QdoSyEsAdL2x4!bzt0Wa8QZVDyUeWvXReM~Hpi~R-$FP)c@i8C5#L5{ tJ?=dk`{`5GKU|A#LKyQu_zO6;hPD6z literal 1150 zcmZvc&rcIU6vv0?T~3}Vg?4v#yIp9zU1&k*FC;0yN&pE-r71xP79vXcVT>0+io~c1 z@uXK{B+(d6OeFpaN@9YEe?#HwsR-_La3ytienMto~)nRwQ- ztEU+|%NSFI377ELelaj6V$~l2tkU-O_ua*{^@FsA{g}@8q9dxKtviRl!Uob8+Ta!EAg$QvH?ga$D;u=7jC-I3O|)O%LUjBohDWow zICCGdrSIq+zm4V)7dd%ttzd{992)p}!V915J%{L}2T0!ff%9UY*uq!DZ@fotY!u;; zX657PiH$^CemQGdZh)@35gRKaxwM1C!WSeLx6xjBh3x1cW+(a)Yd0au_8EwEcrMo? z6gJQ~@d&A#Hk+9Lgv9)3Bo@CRI{6%#ksRiyhLGurTeTsU&cH?9ej|$5l_!YLeL(Em z8!>K)-xsXdBQ^KV${{lK5~)lcopIBu6|wgHNl^7h_yW!FH3p#g6d1kJ)*Ym0pP{F_ z6SAg53mD*f@Z|i&p43m&UQtACgmJkJTBrpbb03kpyo^>;fh5%*$L-vy=EPDDIQ`?? zBaNIlpe_Fx10z}ZRJ-Ptai@QXr(T?%DZH+X6CdcvAYh0yD}QTF8q!wwuhYl$ZW!U< z0rjZWr<9K>?&f$+vH!h44o_ogZ{NMVvQ|u{(z`B~x9oCBWtx+ZVwGB&AG#SUpJ8nK U6k~U4Y^(l{aMn(ow8Rkm2iEifo&W#< From 13c349b65e4a5af03a6cd9078e0c263305c6cad7 Mon Sep 17 00:00:00 2001 From: "Vladmir Sharhsov(warpc)" Date: Mon, 25 Mar 2013 16:32:44 +0400 Subject: [PATCH 28/45] Add logo for Google Oauth --- public/pics/abf-logo.png | Bin 0 -> 8787 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/pics/abf-logo.png diff --git a/public/pics/abf-logo.png b/public/pics/abf-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc93268ca200b842c70629977a8432b879db362 GIT binary patch literal 8787 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 JPDHLkV1lvE_%{Fm literal 0 HcmV?d00001 From 9abfed078b3d0b770b89003969a0ee21b0d33b16 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Mon, 25 Mar 2013 18:12:15 +0400 Subject: [PATCH 29/45] #31: add new specs for product model --- spec/models/product_spec.rb | 40 ++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index 96598974f..b23aee44d 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -2,15 +2,7 @@ require 'spec_helper' describe Product do - before(:all) do - stub_symlink_methods - Platform.delete_all - User.delete_all - Product.delete_all - init_test_root - # Need for validate_uniqueness_of check - FactoryGirl.create(:product) - end + let!(:product) { FactoryGirl.create(:product) } it { should belong_to(:platform) } it { should have_many(:product_build_lists)} @@ -27,11 +19,31 @@ describe Product do #it { should_not allow_mass_assignment_of(:platform_id) } it { should_not allow_mass_assignment_of(:product_build_lists) } - after(:all) do - Platform.delete_all - User.delete_all - Product.delete_all - clear_test_root + + context '#autostart_iso_builds' do + + Product::HUMAN_AUTOSTART_STATUSES.each do |autostart_status, human_autostart_status| + it "new product_build_lists should not be created if no products which should be autostarted #{human_autostart_status}" do + lambda { Product.autostart_iso_builds(autostart_status) }.should_not change{ ProductBuildList.count } + end + end + + context 'by autostart_status = once_a_12_hours' do + before do + product.update_attributes(:autostart_status => Product::ONCE_A_12_HOURS) + FactoryGirl.create(:product, :autostart_status => Product::ONCE_A_DAY) + end + + it 'should be created only one product_build_list' do + lambda { Product.autostart_iso_builds(Product::ONCE_A_12_HOURS) }.should change{ ProductBuildList.count }.by(1) + end + + it 'product should has product_build_list' do + product.product_build_lists.should have(1).item + end + + end + end end From 7f1990bbb3529c05e81208561503b53210961b28 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Mon, 25 Mar 2013 18:22:19 +0400 Subject: [PATCH 30/45] #31: update specs for Product model --- spec/factories/product_build_lists.rb | 3 --- spec/factories/products.rb | 3 +++ spec/models/product_spec.rb | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/spec/factories/product_build_lists.rb b/spec/factories/product_build_lists.rb index 978851e86..4c2a12e2b 100644 --- a/spec/factories/product_build_lists.rb +++ b/spec/factories/product_build_lists.rb @@ -9,8 +9,5 @@ FactoryGirl.define do params 'ENV=i586' time_living 150 project_version 'master' - - # see: before_validation in ProductBuildList model - before(:create) { Arch.find_or_create_by_name('x86_64') } end end diff --git a/spec/factories/products.rb b/spec/factories/products.rb index bdb76aedf..9dc367097 100644 --- a/spec/factories/products.rb +++ b/spec/factories/products.rb @@ -5,5 +5,8 @@ FactoryGirl.define do association :platform, :factory => :platform association :project, :factory => :project_with_commit time_living 150 + + # see: before_validation in ProductBuildList model + before(:create) { Arch.find_or_create_by_name('x86_64') } end end diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index b23aee44d..6034ec74d 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -30,8 +30,10 @@ describe Product do context 'by autostart_status = once_a_12_hours' do before do - product.update_attributes(:autostart_status => Product::ONCE_A_12_HOURS) - FactoryGirl.create(:product, :autostart_status => Product::ONCE_A_DAY) + stub_symlink_methods + stub_redis + product.update_attributes(:autostart_status => Product::ONCE_A_12_HOURS, :main_script => 'text.sh') + FactoryGirl.create(:product, :autostart_status => Product::ONCE_A_DAY, :main_script => 'text.sh') end it 'should be created only one product_build_list' do @@ -39,6 +41,7 @@ describe Product do end it 'product should has product_build_list' do + Product.autostart_iso_builds Product::ONCE_A_12_HOURS product.product_build_lists.should have(1).item end From 9670f72ef938a9338d94065f25dde3995a634d07 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Mon, 25 Mar 2013 19:04:05 +0400 Subject: [PATCH 31/45] #31: added specs for ProductBuildList#update action --- app/controllers/api/v1/base_controller.rb | 2 +- app/models/product_build_list.rb | 2 +- .../api/v1/product_build_lists_controller.rb | 11 ++++++----- .../platforms/product_build_lists_controller_spec.rb | 12 ++++++++++++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index 98402c117..0d108ba31 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -65,7 +65,7 @@ class Api::V1::BaseController < ApplicationController def update_subject(subject) class_name = subject.class.name - if subject.update_attributes(params[class_name.downcase.to_sym] || {}) + if subject.update_attributes(params[class_name.underscore.to_sym] || {}) render_json_response subject, "#{class_name} has been updated successfully" else render_validation_error subject, "#{class_name} has not been updated" diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index dfa771f77..64425b0f1 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -38,7 +38,7 @@ class ProductBuildList < ActiveRecord::Base belongs_to :user # see: Issue #6 - before_validation lambda { self.arch_id = Arch.find_by_name('x86_64').id } + before_validation lambda { self.arch_id = Arch.find_by_name('x86_64').id }, :on => :create validates :product_id, :status, :project_id, diff --git a/spec/controllers/api/v1/product_build_lists_controller.rb b/spec/controllers/api/v1/product_build_lists_controller.rb index bc8148419..5885ef50e 100644 --- a/spec/controllers/api/v1/product_build_lists_controller.rb +++ b/spec/controllers/api/v1/product_build_lists_controller.rb @@ -64,7 +64,7 @@ shared_examples_for 'api user with admin rights' do params = {:product_id => @product_build_list.product_id, :arch_id => Arch.last.id, :commit_hash => commit_hash, :main_script => @product_build_list.main_script} @create_params = {:product_build_list =>{:time_living => 150}.merge(params)} - @update_params = {:product_build_list =>{:time_living => 250}} + @update_params = {:product_build_list =>{:time_living => 250, :not_delete => true}} end it 'should be able to perform show action' do @@ -96,14 +96,15 @@ shared_examples_for 'api user with admin rights' do lambda { put :destroy, :id => @product_build_list.id, :format => :json }.should change{ ProductBuildList.count }.by(-1) end - it "should not be able to perform update action" do - put :update, :id => @product_build_list.id, :format => :json - response.should_not be_success + it "should be able to perform update action" do + put :update, @update_params.merge(:id => @product_build_list.id), :format => :json + response.should be_success end - it "ensures that product has not been updated" do + it "ensures that only not_delete field of product build list has been updated" do put :update, @update_params.merge(:id => @product_build_list.id), :format => :json @product_build_list.reload.time_living.should == 150*60 # in seconds + @product_build_list.not_delete.should be_true end it 'ensures that return correct answer for wrong creating action' do diff --git a/spec/controllers/platforms/product_build_lists_controller_spec.rb b/spec/controllers/platforms/product_build_lists_controller_spec.rb index f7ae23a8d..081964ee8 100644 --- a/spec/controllers/platforms/product_build_lists_controller_spec.rb +++ b/spec/controllers/platforms/product_build_lists_controller_spec.rb @@ -35,6 +35,18 @@ shared_examples_for 'product build list admin' do response.should render_template(:show) end + it 'should be able to perform update action' do + put :update, valid_attributes_for_show.merge(:product_build_list => {:time_living => 100,:not_delete => true}) + response.should redirect_to(platform_product_product_build_list_path(@product.platform, @product, @pbl)) + end + + it "ensures that only not_delete field of product build list has been updated" do + put :update, valid_attributes_for_show.merge(:product_build_list => {:time_living => 100,:not_delete => true}) + time_living = @pbl.time_living + @pbl.reload.time_living.should == time_living + @pbl.not_delete.should be_true + end + it 'should be able to perform log action' do get :log, valid_attributes_for_show response.should be_success From ab93f1ae5ada93b6dec7d455e0eb21b539b97df0 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Mon, 25 Mar 2013 19:57:14 +0400 Subject: [PATCH 32/45] #37: revert ABF logo --- public/pics/abf-logo.png | Bin 10081 -> 8787 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/pics/abf-logo.png b/public/pics/abf-logo.png index a6357dd0014519e0be256363e04d88eadd6198f8..dfc93268ca200b842c70629977a8432b879db362 100644 GIT binary patch delta 6126 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 Eg2f&a_W%F@ From 177c4891e470aa7610f67314244b094f9dc1e0d0 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Tue, 26 Mar 2013 22:17:47 +0400 Subject: [PATCH 33/45] #31: disable product_build_list:clear:outdated rake task --- config/schedule.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/schedule.rb b/config/schedule.rb index 318eabf95..8a4d061ad 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -7,9 +7,10 @@ # runner "Download.parse_and_remove_nginx_log" #end -every :day, :at => '4:10 am' do - rake "product_build_list:clear:outdated", :output => 'log/product_build_list_clear.log' -end +# TODO: Uncomment when all needed product build lists will be updated. +# every :day, :at => '4:10 am' do +# rake "product_build_list:clear:outdated", :output => 'log/product_build_list_clear.log' +# end every :day, :at => '4:00 am' do rake "import:sync:all", :output => 'log/sync.log' From ca3c5d4e1c1528047455b470d82df25afac8ddc9 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 13:59:31 +0400 Subject: [PATCH 34/45] #54: add ARCH into failed_builds_list.txt --- app/models/mass_build.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/models/mass_build.rb b/app/models/mass_build.rb index 14c2a84d1..a7b933603 100644 --- a/app/models/mass_build.rb +++ b/app/models/mass_build.rb @@ -55,9 +55,15 @@ class MassBuild < ActiveRecord::Base def generate_failed_builds_list report = "" - BuildList.where(:status => BuildList::BUILD_ERROR, :mass_build_id => self.id).each do |build_list| - report << "ID: #{build_list.id}; " - report << "PROJECT_NAME: #{build_list.project.name}\n" + BuildList.where( + :status => BuildList::BUILD_ERROR, + :mass_build_id => self.id + ).includes(:project, :arch).find_in_batches(:batch_size => 100) do |build_lists| + build_lists.each do |build_list| + report << "ID: #{build_list.id}; " + report << "PROJECT_NAME: #{build_list.project.name}; " + report << "ARCH: #{build_list.arch.name}\n" + end end report end From fa794d53c769d764710263ec6aeb2bf86f342048 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 14:38:52 +0400 Subject: [PATCH 35/45] #54: some refactoring MassBuild#generate_failed_builds_list --- app/models/mass_build.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/mass_build.rb b/app/models/mass_build.rb index a7b933603..58ba4035d 100644 --- a/app/models/mass_build.rb +++ b/app/models/mass_build.rb @@ -55,14 +55,15 @@ class MassBuild < ActiveRecord::Base def generate_failed_builds_list report = "" - BuildList.where( + BuildList.select('build_lists.id, projects.name as project_name, arches.name as arch_name'). + where( :status => BuildList::BUILD_ERROR, :mass_build_id => self.id - ).includes(:project, :arch).find_in_batches(:batch_size => 100) do |build_lists| + ).joins(:project, :arch).find_in_batches(:batch_size => 100) do |build_lists| build_lists.each do |build_list| report << "ID: #{build_list.id}; " - report << "PROJECT_NAME: #{build_list.project.name}; " - report << "ARCH: #{build_list.arch.name}\n" + report << "PROJECT_NAME: #{build_list.project_name}; " + report << "ARCH: #{build_list.arch_name}\n" end end report From eeedbbc79b910c9cb68a4f99f174bc721d276772 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 15:38:19 +0400 Subject: [PATCH 36/45] #31: update notification about removing product_build_list --- .../product_build_lists/show.html.haml | 18 ++++++++++-------- .../locales/models/product_build_list.en.yml | 4 ++-- .../locales/models/product_build_list.ru.yml | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/views/platforms/product_build_lists/show.html.haml b/app/views/platforms/product_build_lists/show.html.haml index 848a2684d..02f6a3376 100644 --- a/app/views/platforms/product_build_lists/show.html.haml +++ b/app/views/platforms/product_build_lists/show.html.haml @@ -45,14 +45,16 @@ %br = submit_tag t('layout.update') .both - - unless pbl.not_delete - .flash_notify - .alert.alert-error - - if pbl.autostarted? - = t('layout.product_build_lists.will_be_exist_2_weeks') - - else - = t('layout.product_build_lists.will_be_exist_3_months') - .both +- unless pbl.not_delete + .flash_notify + .alert.alert-error + - days = pbl.autostarted? ? ProductBuildList::LIVE_TIME : ProductBuildList::MAX_LIVE_TIME + - days = (pbl.created_at.to_date - days.ago.to_date).to_i + - if days > 1 + = t('layout.product_build_lists.will_be_exist_n_days', :n => days) + - else + = t('layout.product_build_lists.will_be_removed_today') + .both = render 'results', :subject => pbl diff --git a/config/locales/models/product_build_list.en.yml b/config/locales/models/product_build_list.en.yml index 2a711bd90..dfff38f36 100644 --- a/config/locales/models/product_build_list.en.yml +++ b/config/locales/models/product_build_list.en.yml @@ -1,8 +1,8 @@ en: layout: product_build_lists: - will_be_exist_2_weeks: Product build list will be exist in two weeks - will_be_exist_3_months: Product build list will be exist in three months + will_be_exist_n_days: Product build list will be exist in %{n} days + will_be_removed_today: Product build list will be removed today logs: Logs (last 100 lines) work_env: Work environment iso_builder_folder: folder with contents of the GIT project diff --git a/config/locales/models/product_build_list.ru.yml b/config/locales/models/product_build_list.ru.yml index 00dde5ad7..ff145f323 100644 --- a/config/locales/models/product_build_list.ru.yml +++ b/config/locales/models/product_build_list.ru.yml @@ -1,8 +1,8 @@ ru: layout: product_build_lists: - will_be_exist_2_weeks: Cборочный лист продукта будет доступен в течение двух недель - will_be_exist_3_months: Cборочный лист продукта будет доступен в течение трех месяцев + will_be_exist_n_days: Cборочный лист продукта будет доступен в течение %{n} дней + will_be_removed_today: Cборочный лист продукта будет удален в течение дня logs: Логи (последнии 100 строк) work_env: Рабочее пространство iso_builder_folder: папка с содержимым GIT проекта From a100f3b3b1fd142aceb1da44b1dc268ac14595ca Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 15:44:19 +0400 Subject: [PATCH 37/45] #31: update position of alert message --- app/views/platforms/product_build_lists/show.html.haml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/platforms/product_build_lists/show.html.haml b/app/views/platforms/product_build_lists/show.html.haml index 02f6a3376..cff945996 100644 --- a/app/views/platforms/product_build_lists/show.html.haml +++ b/app/views/platforms/product_build_lists/show.html.haml @@ -32,9 +32,7 @@ = link_to t("layout.build_lists.cancel"), cancel_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl), :method => :put, :confirm => t("layout.confirm"), :class => 'button' .both - -- if pbl.build_started? || pbl.build_canceling? - = render 'shared/log', { :build_started => true, :get_log_path => log_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) } + %br - if pbl.build_completed? && can?(:update, pbl) = form_for pbl, :url => platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) do |f| @@ -56,6 +54,9 @@ = t('layout.product_build_lists.will_be_removed_today') .both +- if pbl.build_started? || pbl.build_canceling? + = render 'shared/log', { :build_started => true, :get_log_path => log_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) } + = render 'results', :subject => pbl :javascript From a171be9f53dae826851ffee38f61502a0b4ab2ae Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 16:18:24 +0400 Subject: [PATCH 38/45] #31: add project_version into product --- app/helpers/git_helper.rb | 1 + app/models/product.rb | 6 +++--- app/views/platforms/product_build_lists/new.html.haml | 2 +- app/views/platforms/products/_form.html.haml | 4 ++++ db/migrate/20130327120129_add_project_version_to_product.rb | 5 +++++ db/schema.rb | 3 ++- 6 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20130327120129_add_project_version_to_product.rb diff --git a/app/helpers/git_helper.rb b/app/helpers/git_helper.rb index c65d1ff37..a1782ecbd 100644 --- a/app/helpers/git_helper.rb +++ b/app/helpers/git_helper.rb @@ -68,6 +68,7 @@ module GitHelper end def versions_for_group_select(project) + return [] unless project [ ['Branches', project.repo.branches.map(&:name)], ['Tags', project.repo.tags.map(&:name)] ] end diff --git a/app/models/product.rb b/app/models/product.rb index 765ca8346..6b581b161 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -31,7 +31,8 @@ class Product < ActiveRecord::Base :main_script, :params, :platform_id, - :autostart_status + :autostart_status, + :project_version attr_readonly :platform_id def full_clone(attrs = {}) @@ -63,7 +64,7 @@ class Product < ActiveRecord::Base def self.autostart_iso_builds(autostart_status) Product.where(:autostart_status => autostart_status).each do |product| pbl = product.product_build_lists.new - [:params, :main_script, :project].each do |k| + [:params, :main_script, :project, :project_version].each do |k| pbl.send "#{k}=", product.send(k) end owner = product.platform.owner @@ -71,7 +72,6 @@ class Product < ActiveRecord::Base pbl.autostarted = true pbl.base_url = "http://#{product.platform.default_host}" pbl.time_living = product.time_living / 60 - pbl.project_version = product.project.default_branch pbl.save end end diff --git a/app/views/platforms/product_build_lists/new.html.haml b/app/views/platforms/product_build_lists/new.html.haml index 6f03eb78a..24743689f 100644 --- a/app/views/platforms/product_build_lists/new.html.haml +++ b/app/views/platforms/product_build_lists/new.html.haml @@ -9,7 +9,7 @@ .both .leftlist= f.label :project_version, t("activerecord.attributes.product_build_list.project_version"), :class => :label - .rightlist= f.select :project_version, versions_for_group_select(pbl.project), :selected => params[:product_build_lists].try(:fetch, :project_version) || pbl.project.default_branch + .rightlist= f.select :project_version, versions_for_group_select(pbl.project), :selected => params[:product_build_lists].try(:fetch, :project_version) || @product.project_version || pbl.project.default_branch .both = render 'platforms/products/def_fields', :f => f diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index e1759d958..ede415ad5 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -10,6 +10,10 @@ .rightlist= f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) .both +.leftlist= f.label :project_version, t("activerecord.attributes.product_build_list.project_version") +.rightlist= f.select :project_version, versions_for_group_select(@product.project), {:selected => params[:products].try(:fetch, :project_version) || @product.project_version, :include_blank => true} +.both + = render 'def_fields', :f => f .leftlist= f.label :autostart_status diff --git a/db/migrate/20130327120129_add_project_version_to_product.rb b/db/migrate/20130327120129_add_project_version_to_product.rb new file mode 100644 index 000000000..b58828f47 --- /dev/null +++ b/db/migrate/20130327120129_add_project_version_to_product.rb @@ -0,0 +1,5 @@ +class AddProjectVersionToProduct < ActiveRecord::Migration + def change + add_column :products, :project_version, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index ce331079b..62a94da91 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130322132919) do +ActiveRecord::Schema.define(:version => 20130327120129) do create_table "activity_feeds", :force => true do |t| t.integer "user_id", :null => false @@ -331,6 +331,7 @@ ActiveRecord::Schema.define(:version => 20130322132919) do t.string "main_script" t.integer "time_living" t.integer "autostart_status" + t.string "project_version" end create_table "project_imports", :force => true do |t| From 12ca85a513dbb184ff2f4c18f83a62d9e80eb781 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 16:22:31 +0400 Subject: [PATCH 39/45] #31: update notification message --- app/views/platforms/product_build_lists/show.html.haml | 2 +- config/locales/models/product_build_list.en.yml | 2 +- config/locales/models/product_build_list.ru.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/platforms/product_build_lists/show.html.haml b/app/views/platforms/product_build_lists/show.html.haml index cff945996..c27756272 100644 --- a/app/views/platforms/product_build_lists/show.html.haml +++ b/app/views/platforms/product_build_lists/show.html.haml @@ -49,7 +49,7 @@ - days = pbl.autostarted? ? ProductBuildList::LIVE_TIME : ProductBuildList::MAX_LIVE_TIME - days = (pbl.created_at.to_date - days.ago.to_date).to_i - if days > 1 - = t('layout.product_build_lists.will_be_exist_n_days', :n => days) + = t('layout.product_build_lists.will_be_removed_n_days', :n => days) - else = t('layout.product_build_lists.will_be_removed_today') .both diff --git a/config/locales/models/product_build_list.en.yml b/config/locales/models/product_build_list.en.yml index dfff38f36..e5cb0e42f 100644 --- a/config/locales/models/product_build_list.en.yml +++ b/config/locales/models/product_build_list.en.yml @@ -1,7 +1,7 @@ en: layout: product_build_lists: - will_be_exist_n_days: Product build list will be exist in %{n} days + will_be_removed_n_days: Product build list will be removed through %{n} days will_be_removed_today: Product build list will be removed today logs: Logs (last 100 lines) work_env: Work environment diff --git a/config/locales/models/product_build_list.ru.yml b/config/locales/models/product_build_list.ru.yml index ff145f323..71329702f 100644 --- a/config/locales/models/product_build_list.ru.yml +++ b/config/locales/models/product_build_list.ru.yml @@ -1,7 +1,7 @@ ru: layout: product_build_lists: - will_be_exist_n_days: Cборочный лист продукта будет доступен в течение %{n} дней + will_be_removed_n_days: Cборочный лист продукта будет удален через %{n} дней will_be_removed_today: Cборочный лист продукта будет удален в течение дня logs: Логи (последнии 100 строк) work_env: Рабочее пространство From fe836f121275215456b8a800d6207c1cc808169d Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 16:25:25 +0400 Subject: [PATCH 40/45] #31: update notification message --- config/locales/models/product_build_list.en.yml | 2 +- config/locales/models/product_build_list.ru.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/models/product_build_list.en.yml b/config/locales/models/product_build_list.en.yml index e5cb0e42f..79003c2a3 100644 --- a/config/locales/models/product_build_list.en.yml +++ b/config/locales/models/product_build_list.en.yml @@ -1,7 +1,7 @@ en: layout: product_build_lists: - will_be_removed_n_days: Product build list will be removed through %{n} days + will_be_removed_n_days: Product build list will be removed through %{n} d. will_be_removed_today: Product build list will be removed today logs: Logs (last 100 lines) work_env: Work environment diff --git a/config/locales/models/product_build_list.ru.yml b/config/locales/models/product_build_list.ru.yml index 71329702f..aac415f32 100644 --- a/config/locales/models/product_build_list.ru.yml +++ b/config/locales/models/product_build_list.ru.yml @@ -1,7 +1,7 @@ ru: layout: product_build_lists: - will_be_removed_n_days: Cборочный лист продукта будет удален через %{n} дней + will_be_removed_n_days: Cборочный лист продукта будет удален через %{n} д. will_be_removed_today: Cборочный лист продукта будет удален в течение дня logs: Логи (последнии 100 строк) work_env: Рабочее пространство From 79c178357e2d3e1447ea6c802c4b0e7207e2d5ba Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 17:36:01 +0400 Subject: [PATCH 41/45] #31: UI: update #project_version field on change project --- app/assets/javascripts/extra/product.js | 14 ++++++++++++++ app/controllers/platforms/products_controller.rb | 8 +++++++- app/views/platforms/products/_form.html.haml | 7 +++++-- config/locales/models/product.en.yml | 1 + config/locales/models/product.ru.yml | 1 + 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/extra/product.js diff --git a/app/assets/javascripts/extra/product.js b/app/assets/javascripts/extra/product.js new file mode 100644 index 000000000..d3b86bed0 --- /dev/null +++ b/app/assets/javascripts/extra/product.js @@ -0,0 +1,14 @@ +$(document).ready(function() { + + $('#product_project').bind('railsAutocomplete.select', function(event, data){ + var ppv = $("#product_project_version").empty().append(''); + $(data.item.project_versions).each(function(k, i) { + var optgroup = $(''); + $(i[1]).each(function(k, b) { + optgroup.append(''); + }); + ppv.append(optgroup); + }); + }); + +}); \ No newline at end of file diff --git a/app/controllers/platforms/products_controller.rb b/app/controllers/platforms/products_controller.rb index 744189384..85149d5ed 100644 --- a/app/controllers/platforms/products_controller.rb +++ b/app/controllers/platforms/products_controller.rb @@ -1,5 +1,6 @@ # -*- encoding : utf-8 -*- class Platforms::ProductsController < Platforms::BaseController + include GitHelper before_filter :authenticate_user! skip_before_filter :authenticate_user!, :only => [:index, :show] if APP_CONFIG['anonymous_access'] @@ -55,7 +56,12 @@ class Platforms::ProductsController < Platforms::BaseController search(params[:term]).search_order items.select! {|e| e.repo.branches.count > 0} render :json => items.map{ |p| - {:id => p.id, :label => p.name_with_owner, :value => p.name_with_owner} + { + :id => p.id, + :label => p.name_with_owner, + :value => p.name_with_owner, + :project_versions => versions_for_group_select(p) + } } end diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index ede415ad5..5b91f54ee 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -1,3 +1,5 @@ +- act = action_name.to_sym + .leftlist= f.label :name .rightlist= f.text_field :name, :class => 'text_field' .both @@ -7,10 +9,11 @@ .both .leftlist= f.label :project -.rightlist= f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) +.rightlist + = f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) .both -.leftlist= f.label :project_version, t("activerecord.attributes.product_build_list.project_version") +.leftlist= f.label :project_version .rightlist= f.select :project_version, versions_for_group_select(@product.project), {:selected => params[:products].try(:fetch, :project_version) || @product.project_version, :include_blank => true} .both diff --git a/config/locales/models/product.en.yml b/config/locales/models/product.en.yml index df3d3f26d..e54f0c6c0 100644 --- a/config/locales/models/product.en.yml +++ b/config/locales/models/product.en.yml @@ -32,6 +32,7 @@ en: autostart_status: Autostart name: Name description: Description + project_version: Version platform_id: Platform build_status: Build status created_at: Created diff --git a/config/locales/models/product.ru.yml b/config/locales/models/product.ru.yml index a96929744..03b82a5ef 100644 --- a/config/locales/models/product.ru.yml +++ b/config/locales/models/product.ru.yml @@ -32,6 +32,7 @@ ru: autostart_status: Автостарт name: Название description: Описание + project_version: Версия platform_id: Платформа build_status: Статус последней сборки created_at: Создан From 0207e25fb8f9db7f8c9c824978f174ef15bff6b6 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 17:38:34 +0400 Subject: [PATCH 42/45] #31: set not_delete to false if build not completed --- app/models/product_build_list.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 64425b0f1..ff4ec83c2 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -39,6 +39,7 @@ class ProductBuildList < ActiveRecord::Base # see: Issue #6 before_validation lambda { self.arch_id = Arch.find_by_name('x86_64').id }, :on => :create + before_validation lambda { self.not_delete = false unless build_completed? } validates :product_id, :status, :project_id, From baf7ceb8f00df80e3242daea7244a011c3fe05a6 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 18:01:54 +0400 Subject: [PATCH 43/45] #31: update specs and update before_validation for not_delete field --- app/models/product_build_list.rb | 3 ++- spec/models/product_build_list_spec.rb | 6 +++--- spec/models/product_spec.rb | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index ff4ec83c2..d3b6f5f0d 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -39,7 +39,8 @@ class ProductBuildList < ActiveRecord::Base # see: Issue #6 before_validation lambda { self.arch_id = Arch.find_by_name('x86_64').id }, :on => :create - before_validation lambda { self.not_delete = false unless build_completed? } + # field "not_delete" can be changed only if build has been completed + before_validation lambda { self.not_delete = false unless build_completed?; true } validates :product_id, :status, :project_id, diff --git a/spec/models/product_build_list_spec.rb b/spec/models/product_build_list_spec.rb index c79f25bcb..0f5967d09 100644 --- a/spec/models/product_build_list_spec.rb +++ b/spec/models/product_build_list_spec.rb @@ -2,8 +2,9 @@ require 'spec_helper' describe ProductBuildList do - before(:all) do + before do stub_symlink_methods + FactoryGirl.create(:product_build_list) end it { should belong_to(:product) } @@ -29,9 +30,8 @@ describe ProductBuildList do # see app/ability.rb # can :read, ProductBuildList#, :product => {:platform => {:visibility => 'open'}} # double nested hash don't work it 'should generate correct sql to get product build lists' do - stub_symlink_methods user = FactoryGirl.create(:user) ability = Ability.new user - ProductBuildList.accessible_by(ability).count.should == 0 + ProductBuildList.accessible_by(ability).count.should == 1 end end diff --git a/spec/models/product_spec.rb b/spec/models/product_spec.rb index 6034ec74d..da01f12b5 100644 --- a/spec/models/product_spec.rb +++ b/spec/models/product_spec.rb @@ -32,8 +32,9 @@ describe Product do before do stub_symlink_methods stub_redis - product.update_attributes(:autostart_status => Product::ONCE_A_12_HOURS, :main_script => 'text.sh') - FactoryGirl.create(:product, :autostart_status => Product::ONCE_A_DAY, :main_script => 'text.sh') + params = {:main_script => 'text.sh', :project_version => product.project.default_branch} + product.update_attributes params.merge(:autostart_status => Product::ONCE_A_12_HOURS) + FactoryGirl.create :product, params.merge(:autostart_status => Product::ONCE_A_DAY) end it 'should be created only one product_build_list' do From eef4d2756381879bf1dabef181fd13a58cf6cb1f Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 18:07:29 +0400 Subject: [PATCH 44/45] #31: revert some changes --- app/views/platforms/products/_form.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index 5b91f54ee..f5d28dfca 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -9,8 +9,7 @@ .both .leftlist= f.label :project -.rightlist - = f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) +.rightlist= f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) .both .leftlist= f.label :project_version From 8e234d278d07cf2fb0e603c98ecd14c85589e6cf Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Wed, 27 Mar 2013 18:08:14 +0400 Subject: [PATCH 45/45] #31: revert some changes --- app/views/platforms/products/_form.html.haml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index f5d28dfca..0095616ad 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -1,5 +1,3 @@ -- act = action_name.to_sym - .leftlist= f.label :name .rightlist= f.text_field :name, :class => 'text_field' .both