Skip to content

Commit

Permalink
Add CLA support
Browse files Browse the repository at this point in the history
Signed-off-by: James Taylor <[email protected]>
  • Loading branch information
jt-nti committed Feb 22, 2021
1 parent a129823 commit 72389df
Show file tree
Hide file tree
Showing 14 changed files with 120 additions and 20 deletions.
3 changes: 2 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ MAX_AGE: 90
PASS_THRESHOLD: 2
BLOCK_THRESHOLD: -1
PROJECT_URL: https://openpolitics.org.uk/manifesto
PROJECT_NAME: The OpenPolitics Manifesto
PROJECT_NAME: The OpenPolitics Manifesto
CLA_URL: https://openpolitics.org.uk/manifesto/cla.html
6 changes: 3 additions & 3 deletions app/controllers/edit_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ def commit
pull_from = forked ? "#{@current_user.login}:#{new_branch}" : branch_name
@pr = open_pr(pull_from, @branch, @summary, @description)
# Check for CLA
@cla_url = "#{ENV.fetch("SITE_URL")}/cla.html"
r = Faraday.get @cla_url
@has_cla = (r.status == 200)
@cla_url = ENV.fetch("CLA_URL")
@has_cla = ENV["CLA_URL"].present?
@unsigned_cla = @has_cla && !current_user.cla_accepted?
end

private
Expand Down
4 changes: 4 additions & 0 deletions app/controllers/proposals_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ def show
# Get activity list
presenter = ProposalPresenter.new(@proposal)
@activity = presenter.activity_log
# Does the proposer still need to sign the CLA?
@cla_url = ENV.fetch("CLA_URL")
@has_cla = ENV["CLA_URL"].present?
@unsigned_cla = @is_author && @has_cla && !current_user.cla_accepted?
end

def webhook
Expand Down
18 changes: 17 additions & 1 deletion app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,18 @@ def show
end

def edit
@cla_url = ENV.fetch("CLA_URL")
@has_cla = ENV["CLA_URL"].present?
@unsigned_cla = @has_cla && !@user.cla_accepted
end

def update
@user.update!(user_params)
if params.has_key?(:cla_accepted)
accept_cla
else
@user.update!(user_params)
end

redirect_to edit_user_path(@user)
end

Expand All @@ -48,4 +56,12 @@ def authorise
def user_params
params.require(:user).permit(:email, :notify_new)
end

def accept_cla
@user.update!(cla_accepted: true)

@user.proposed.each do |pr|
UpdateProposalJob.perform_later pr.number
end
end
end
13 changes: 13 additions & 0 deletions app/models/concerns/github_pull_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ def set_time_build_status
end
end

def set_cla_build_status
status = "groupthink/cla"
if cla_required?
if cla_accepted?
set_build_status(:success, I18n.t("build_status.cla.accepted"), status)
else
set_build_status(:pending, I18n.t("build_status.cla.pending"), status)
end
else
set_build_status(:success, I18n.t("build_status.cla.none"), status)
end
end

def merge_pr!
Octokit.merge_pull_request(ENV.fetch("GITHUB_REPO"), number)
true
Expand Down
1 change: 1 addition & 0 deletions app/models/concerns/user_admin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ module UserAdmin
field :role
field :author
field :voter
field :cla_accepted
end
end
end
Expand Down
1 change: 1 addition & 0 deletions app/models/concerns/votable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def count_votes!
unless closed?
set_vote_build_status
set_time_build_status
set_cla_build_status
end
end

Expand Down
10 changes: 9 additions & 1 deletion app/models/proposal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ def too_new?
age < Rules.min_age
end

def cla_required?
ENV["CLA_URL"].present?
end

def cla_accepted?
proposer.cla_accepted
end

def update_state!
state = pr_closed? ? closed_state : open_state
update!(state: state)
Expand Down Expand Up @@ -90,7 +98,7 @@ def closed_state
def open_state
return nil if pr_closed?
return "dead" if too_old?
return "blocked" if blocked?
return "blocked" if blocked? || (cla_required? && !cla_accepted?)
if passed?
return too_new? ? "agreed" : "passed"
end
Expand Down
18 changes: 7 additions & 11 deletions app/views/edit/commit.html.erb
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
<div class="alert alert-success">
<div class="form-group alert alert-success">
<%= fa_icon 'check-circle' %>
<%= t 'help.success_title' %>
</div>

<div>
<div class="form-group">
<p>
<%= t 'help.success' %>
</p>
<% if @has_cla %>
<p>
<%= t :cla %>
</p>
<p>
<%= link_to "#{t(:view_cla)}".html_safe, @cla_url, class: 'btn btn-primary' %>
</p>
<% end %>
</div>

<div>
<div class="form-group">
<%= link_to "#{fa_icon('globe')} #{t(:return)}".html_safe, @return_to, class: 'btn btn-primary' if @return_to %>
<%= link_to "#{fa_icon('code-fork')} #{t(:view)}".html_safe, proposal_path(@pr), class: 'btn btn-default' %>
<%= link_to "#{fa_icon('list')} #{t(:view_all)}".html_safe, proposals_path, class: 'btn btn-default' %>
</div>

<% if @unsigned_cla %>
<%= render partial: 'shared/cla_warning', locals: { user: current_user } %>
<% end %>
6 changes: 6 additions & 0 deletions app/views/proposals/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@
</div>
</div>

<% if @unsigned_cla %>
<div class='row'>
<%= render partial: 'shared/cla_warning', locals: { user: @proposal.proposer } %>
</div>
<% end %>

<hr/>

<div class='row'>
Expand Down
17 changes: 17 additions & 0 deletions app/views/shared/_cla_warning.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<div class="form-group alert alert-warning">
<%= fa_icon 'exclamation-circle' %>
<%= t 'cla_title' %>
</div>

<div class="form-group">
<p>
<%= t 'cla' %>
</p>
<p>
Please <%= link_to 'edit your profile', edit_user_path(user) %> and accept <a href='<%= @cla_url %>' target='_blank' rel='noopener noreferrer'>the license agreement</a> to unblock your proposal.
</p>
</div>

<div class="form-group">
<%= link_to "#{fa_icon('cog lg')} #{t(:edit_profile)}".html_safe, edit_user_path(user), class: 'btn btn-primary' %>
</div>
29 changes: 29 additions & 0 deletions app/views/users/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,32 @@
</div>
</div>
<% end %>

<% if @has_cla %>
<h2>Contributor License Agreement</h2>

<p>
<%= t :cla %>
</p>

<% if @unsigned_cla %>
<%= form_for @user, html: {class: "form-horizontal", style: 'clear: right'} do |f| %>
<%= hidden_field_tag "cla_accepted", true %>

<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<%= link_to "#{t(:view_cla)}".html_safe, @cla_url, class: 'btn btn-default', target: :_blank, rel: 'noopener noreferrer' %>
<%= f.submit class: "btn btn-primary", value: t(:sign_cla) %>
</div>
</div>
<% end %>
<% else %>
<div class="col-sm-offset-2 col-sm-10">
<%= fa_icon 'check' %>
You have signed the <a href='<%= @cla_url %>' target='_blank' rel='noopener noreferrer'>contributor license agreement</a>.
</div>
<% end %>

<span style="clear: both">&nbsp;</span>

<% end %>
11 changes: 9 additions & 2 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,12 @@ en:
return: Return to site
view: View your proposal
view_all: View all proposals
edit_profile: Edit profile
signed_out_site_intro: To contribute you need to log in with a free GitHub account. GitHub is a popular code-sharing site which hosts the site content.
signed_in_site_intro: There is no way at the moment to explore github content here. Please go to the project you want to edit on GitHub and follow a link to the editor. Thanks!
cla: This project has a CLA (Contributor License Agreement). You may need to agree to it before your change can be accepted, if you haven't already.
cla_title: Your proposal is blocked until you accept the contributor license agreement.
cla: This manifesto has a Contributor License Agreement (CLA) which you must accept before any of your proposals can be included.
sign_cla: Accept CLA
view_cla: View CLA
help:
edit: Make your changes in the editor below, then hit "Submit changes" at the bottom.
Expand Down Expand Up @@ -70,4 +73,8 @@ en:
time:
too_old: "The change has been open for more than %{max_age} days, and should be closed (age: %{age}d)."
too_new: "The change has not yet been open for %{min_age} days (age: %{age}d)."
success: "The change has been open long enough to be merged (age: %{age}d)."
success: "The change has been open long enough to be merged (age: %{age}d)."
cla:
none: No contributor license agreement required.
pending: The contributor license agreement has not been accepted.
accepted: The contributor license agreement has been accepted.
3 changes: 2 additions & 1 deletion spec/models/proposal_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

RSpec.describe Proposal, type: :model do
context "when checking overall state" do
let(:pr) { create :proposal }
let(:proposer) { create :user, cla_accepted: true }
let(:pr) { create :proposal, proposer: proposer }

context "when the upstream PR has been closed" do
before do
Expand Down

0 comments on commit 72389df

Please sign in to comment.