diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb
index 2a0f97613..c3ac15197 100644
--- a/app/controllers/homework_attach_controller.rb
+++ b/app/controllers/homework_attach_controller.rb
@@ -1,4 +1,90 @@
class HomeworkAttachController < ApplicationController
+ ###############################
+ def index
+ @homeworks = HomeworkAttach.all
+ respond_to do |format|
+ format.html # index.html.erb
+ format.json { render json: @homeworks }
+ end
+ end
+
+ def add_users users
+ if users != nil && users.count > 0
+ users.each do |user|
+ @homework.homework_users.build(:user_id => user.id)
+ @homework.save
+ end
+ end
+ end
+
+ def create
+ if User.current.logged? && (!Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.roles&Role.where('id = ? or id = ? or id =?',5, 10, 7)).size >0)
+ user_id = params[:user_id]
+ bid_id = params[:bid_id]
+ sta = 0
+ name = params[:new_form][:name]
+ description = params[:new_form][:description]
+ options = {
+ :user_id => user_id,
+ :state => sta,
+ :name => name,
+ :description => description,
+ :bid_id => bid_id
+ }
+
+ @homework = HomeworkAttach.new(options)
+ @homework.save_attachments(params[:attachments])
+ render_attachment_warning_if_needed(@homework)
+
+ @homework.save
+ respond_to do |format|
+ if @homework.save
+ format.html { redirect_to @homework, notice: 'Post was successfully created.' }
+ format.json { render json: @homework, status: :created, location: @homework }
+ else
+ format.html { render action: "new" }
+ format.json { render json: @homework.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+ end
+
+ def new
+ @homework = HomeworkAttach.new
+ @bid = Bid.find(params[:id])
+
+ respond_to do |format|
+ format.html # new.html.erb
+ format.json { render json: @homework }
+ end
+ end
+
+ def edit
+ @homework = HomeworkAttach.find(params[:id])
+ end
+
+ def update
+ @homework = HomeworkAttach.find(params[:id])
+ respond_to do |format|
+ if @post.update_attributes(params[:homework])
+ format.html { redirect_to @homework, notice: 'Homework was successfully updated.' }
+ format.json { head :no_content }
+ else
+ format.html { render action: "edit" }
+ format.json { render json: @homework.errors, status: :unprocessable_entity }
+ end
+ end
+ end
+
+ def destroy
+ @homework = HomeworkAttach.find(params([:id]))
+ @homework.destroy
+ respond_to do |format|
+ format.html {render @homework}
+ format.json {render json: @homework}
+ end
+ end
+
#显示作业信息
def show
@homework = HomeworkAttach.find(params[:id])
@@ -24,7 +110,7 @@ class HomeworkAttachController < ApplicationController
end
#删除留言
- def destroy
+ def destroy_jour
@journal_destroyed = JournalsForMessage.delete_message(params[:object_id])
#@homework = HomeworkAttach.find(params[:id])
#@jours = @homework.journals_for_messages.order("created_on DESC")
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 9418f4749..228f57ab6 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -28,7 +28,6 @@ module ApplicationHelper
include AvatarHelper
## added by william
include PraiseTreadHelper
- # add by nyan
include CoursesHelper
extend Forwardable
@@ -1330,7 +1329,7 @@ module ApplicationHelper
def hubspot_head
tags = javascript_include_tag('hubspot/messenger.min', 'hubspot/messenger-theme-future')
- tags << stylesheet_link_tag('hubspot/messenger', 'hubspot/messenger-theme-future')
+ tags << stylesheet_link_tag('hubspot/messenger', 'hubspot/messenger-theme-future', 'hubspot/messenger-theme-flat')
unless User.current.pref.warn_on_leaving_unsaved == '0'
tags << "\n".html_safe + javascript_tag("$(window).load(function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });")
end
diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb
index 97cca617e..45ebaf247 100644
--- a/app/helpers/courses_helper.rb
+++ b/app/helpers/courses_helper.rb
@@ -136,4 +136,15 @@ module CoursesHelper
def find_by_extra_from_project extra
Course.find_by_extra(try(extra))
end
+ #判断制定用户是不是当前课程的老师
+ def is_course_teacher user,project
+ is_teacher = false
+ searchTeacherAndAssistant(project).each do |teacher|
+ if user == teacher
+ is_teacher = true
+ break
+ end
+ end
+ is_teacher
+ end
end
diff --git a/app/models/homework_user.rb b/app/models/homework_user.rb
index da7e65afb..0adef62c4 100644
--- a/app/models/homework_user.rb
+++ b/app/models/homework_user.rb
@@ -2,5 +2,5 @@ class HomeworkUser < ActiveRecord::Base
attr_accessible :homework_attach_id, :user_id
belongs_to :homework_attach
- has_one :user
+ belongs_to :user
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 1c672c5fc..20c5de89b 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -122,7 +122,8 @@ class Project < ActiveRecord::Base
after_save :update_position_under_parent, :if => Proc.new {|project| project.name_changed?}
after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
- after_save :create_board_sync #nyan
+ # 创建project之后默认创建一个board,之后的board去掉了board的概念
+ after_save :create_board_sync
before_destroy :delete_all_members
def remove_references_before_destroy
return if self.id.nil?
diff --git a/app/models/user.rb b/app/models/user.rb
index 8017ed5f8..c96e38595 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -73,7 +73,7 @@ class User < Principal
['none', :label_user_mail_option_none]
]
- has_one :homework_user
+ belongs_to :homework_user
has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)},
:after_remove => Proc.new {|user, group| group.user_removed(user)}
diff --git a/app/views/applied_project/_set_applied.js.erb b/app/views/applied_project/_set_applied.js.erb
index e77592060..7403b963b 100644
--- a/app/views/applied_project/_set_applied.js.erb
+++ b/app/views/applied_project/_set_applied.js.erb
@@ -1,4 +1,13 @@
<% selector = ".#{applied_css(@project)}" %>
$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript applied_link(@project, User.current) %>")});
-
-
+if (window.Messenger) {
+ Messenger.options = {
+ extraClasses: 'messenger-fixed messenger-on-bottom messenger-on-right',
+ theme: 'flat'
+ }
+ Messenger().post({
+ id: "label_apply_project_waiting",
+ message: "<%= l(:label_apply_project_waiting) %>",
+ showCloseButton: true,
+ });
+};
diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb
index 35c414699..c9a8af0a4 100644
--- a/app/views/bids/_homework_list.html.erb
+++ b/app/views/bids/_homework_list.html.erb
@@ -1,23 +1,27 @@
+<% is_teacher = is_course_teacher User.current,@bid.courses.first.project %>
<%= form_tag(:controller => 'bids', :action => "show_project", :method => :get) do %>
@@ -25,16 +29,25 @@
<%= image_tag(url_to_avatar(homework.user), :class => "avatar")%>
- 作业 :
- <% filename = "" %>
- <% homework.attachments.map do |attachment| %>
- <% filename = attachment.filename %>
- <% if homework.attachments.count > 1%>
- <% filename += "等#{homework.attachments.count}个文件" %>
+
+
+ 作业 :
+ <% attachments = homework.attachments.map %>
+ <% for attachment in attachments %>
+ <% if attachments.count > 1 && attachment != attachments.first %>
+
+ <% for item in 1..7 %>
+
+ <% end %>
+ <% end %>
+ <%= link_to_attachment attachment , :download => true -%>
<% end %>
- <% break %>
- <% end %>
- <%= link_to filename , homework_attach_path(homework)%>
+
+
+ <% if display_id %>
+ <%= link_to "互评>>" , homework_attach_path(homework)%>
+ <% end %>
+
@@ -48,7 +61,7 @@
<% sum = sum + star_reates.stars %>
<% end %>
<% stars_reates_count = stars_reates.count == 0 ? 1 : stars_reates.count %>
- <%= sum * 1.0 / stars_reates_count %>
+ <%= format("%.2f", sum * 1.0 / stars_reates_count) %>
<% if Time.parse(@bid.deadline.to_s) < Time.parse(homework.attachments[0].created_on.to_s) %>
@@ -58,20 +71,20 @@
- <% if display_id %>
- <%= l(:label_bidding_user_studentcode) %> : <%= homework.user.user_extensions.student_id%>
- <% end %>
+ <% if display_id %>
+ <%= l(:label_bidding_user_studentcode) %> : <%= homework.user.user_extensions.student_id%>
+ <% end %>
- <% if (User.current == homework.user) || (!Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.roles&Role.where('id = ? or id = ? or id =?',3,7, 9)).size >0) %>
-
- <% options = {:author => true, :deletable => attach_delete(homework)} %>
- <%= render :partial => 'attachments/links',
- :locals => {:attachments => homework.attachments, :options => options} %>
-
- <% end %>
+ <% if (User.current == homework.user) || (!Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.roles&Role.where('id = ? or id = ? or id =?',3,7, 9)).size >0) %>
+
+ <% options = {:author => true, :deletable => attach_delete(homework)} %>
+ <%= render :partial => 'attachments/links',
+ :locals => {:attachments => homework.attachments, :options => options} %>
+
+ <% end %>
diff --git a/app/views/bids/show_project.html.erb b/app/views/bids/show_project.html.erb
index d5676c3c8..c14d2e14c 100644
--- a/app/views/bids/show_project.html.erb
+++ b/app/views/bids/show_project.html.erb
@@ -32,18 +32,16 @@
<%= select_tag 'bid', options_for_select(select_option_helper(@option)), :name => 'bid', :class => 'grayline' %>
-
+
-
<%= link_to '创建项目', new_project_path(course: 0, project_type: 0), :target => '_blank' %>
-
- <% if @bid.reward_type == 3 %>
+ <% if @bid.reward_type == Bid::Homework %>
<%= f.text_area :bid_message, :id => "bid_message", :required => true, :rows => 4, :cols => 40, :placeholder => l(:label_bid_reason_homework), :style => "resize: none;", :class => 'noline' %>
diff --git a/app/views/homework_attach/_app_link.html.erb b/app/views/homework_attach/_app_link.html.erb
new file mode 100644
index 000000000..8adf5220e
--- /dev/null
+++ b/app/views/homework_attach/_app_link.html.erb
@@ -0,0 +1,12 @@
+
+<% for attachment in attachments %>
+ <% if attachments.count > 1 && attachment != attachments.first%>
+
+ <% end %>
+ <%= link_to_attachment attachment, :class => 'icon icon-attachment', :download => true -%>
+ <% if attachment.is_text? %>
+ <%= link_to image_tag('magnifier.png'),
+ :controller => 'attachments', :action => 'show',
+ :id => attachment, :filename => attachment.filename %>
+ <% end %>
+ <% end -%>
diff --git a/app/views/homework_attach/_journal_reply_items.html.erb b/app/views/homework_attach/_journal_reply_items.html.erb
index 85f7fa304..e9aad84ce 100644
--- a/app/views/homework_attach/_journal_reply_items.html.erb
+++ b/app/views/homework_attach/_journal_reply_items.html.erb
@@ -19,8 +19,8 @@
%>
<% end %>
<% if @user == User.current || User.current.admin? || reply.user.id == User.current.id %>
- <%= link_to(l(:label_newfeedback_delete), {:controller => 'homework_attach', :action => 'destroy', :object_id => reply, :user_id => reply.user},
- :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %>
+ <%= link_to(l(:label_newfeedback_delete), {:controller => 'homework_attach', :action => 'destroy_jour', :object_id => reply, :user_id => reply.user},
+ :remote => true, :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %>
<% end %>
diff --git a/app/views/homework_attach/_showjour.html.erb b/app/views/homework_attach/_showjour.html.erb
index dbd7f2547..939deff3b 100644
--- a/app/views/homework_attach/_showjour.html.erb
+++ b/app/views/homework_attach/_showjour.html.erb
@@ -54,8 +54,8 @@
{:focus => 'project_respond', :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea'), '#{l(:label_reply_plural)} #{journal.user.name}: '); $('##{ids} textarea') ;return false;"}
%>
<% if journal.user==User.current|| User.current.admin? %>
- <%= link_to(l(:label_bid_respond_delete), {:controller => 'homework_attach', :action => 'destroy', :object_id => journal, :user_id => journal.user},
- :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "delete", :title => l(:button_delete)) %>
+ <%= link_to(l(:label_bid_respond_delete), {:controller => 'homework_attach', :action => 'destroy_jour', :object_id => journal, :user_id => journal.user},
+ :remote => true, :confirm => l(:text_are_you_sure), :title => l(:button_delete)) %>
<% end %>
diff --git a/app/views/homework_attach/destroy.js.erb b/app/views/homework_attach/destroy_jour.js.erb
similarity index 100%
rename from app/views/homework_attach/destroy.js.erb
rename to app/views/homework_attach/destroy_jour.js.erb
diff --git a/app/views/homework_attach/edit.html.erb b/app/views/homework_attach/edit.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/homework_attach/new.html.erb b/app/views/homework_attach/new.html.erb
new file mode 100644
index 000000000..073ab21b2
--- /dev/null
+++ b/app/views/homework_attach/new.html.erb
@@ -0,0 +1,33 @@
+ <%=raw l(:label_new_homework)%>
+
+ <%= form_for('new_form', :remote => true, :method => :post,
+ :url => {:controller => 'homework_attach',
+ :action => 'create',
+ :user_id => User.current.id,
+ :bid_id => @bid
+ }) do |f|%>
+
+ 标题:
+ <%= f.text_field "name", :required => true, :size => 60, :style => "width:490px;" %>
+
+
+ 描述:
+
+ <%= f.text_area "description", :rows => 8, :class => 'wiki-edit', :style => "font-size:small;width:490px;margin-left:10px;" %>
+
+
+
+
+ <%= l(:label_attachment_plural) %>
+
+
+ <%= render :partial => 'attachments/form' %>
+
+
+
+ <%= submit_tag t(:label_new), :sta => 0, :class => "enterprise"%>
+ <%= submit_tag t(:label_memo_create), :sta => 1, :class => "enterprise"%>
+
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/homework_attach/show.html.erb b/app/views/homework_attach/show.html.erb
index 1400176c2..d7c1e8eb0 100644
--- a/app/views/homework_attach/show.html.erb
+++ b/app/views/homework_attach/show.html.erb
@@ -18,7 +18,9 @@
作业基础信息<%=@count %>
- 发布人员:<%= link_to @homework.user, user_path(@homework.user)%>
+
+ 发布人员:<%= link_to @homework.user, user_path(@homework.user)%>
+
发布时间:<%=format_time @homework.created_at %>
@@ -26,9 +28,11 @@
作业下载:
<% options = {:author => true } %>
- <%= render :partial => 'attachments/app_link', :locals => {:attachments => @homework.attachments, :options => options} %>
+ <%= render :partial => 'app_link', :locals => {:attachments => @homework.attachments, :options => options} %>
+
+
+ 所属任务:<%= link_to(@homework.bid.name, project_for_bid_path(@homework.bid))%>
- 所属任务:<%= link_to(@homework.bid.name, project_for_bid_path(@homework.bid))%>
@@ -49,7 +53,7 @@
- 作业描述:
+ 作业描述:
<% @homework.attachments.map do |attachment| %>
<% if attachment.description != nil && attachment.description != "" %>
@@ -67,16 +71,20 @@
-
作业得分:
+
+ 作业得分:
+
得分比例
<% 100.step(20,-20) do |star| %>
-
+
-
<%= @stars_status_map["star#{(star/20).to_s}".to_sym] %>
@@ -85,7 +93,11 @@
-
最终得分
+
最终得分
+
+ <%= @homework.average(:quality).try(:avg).try(:round, 2).to_s %>
+ 分
+
<%= rating_for @homework, :static => true, dimension: :quality, class: 'rateable div_inline' %>
@@ -102,6 +114,18 @@
+
+
作业评论:
评分:
@@ -121,5 +145,4 @@
<%= render :partial => 'showjour', :locals => {:jour => @jours} %>
-<%#= link_to '返回竞赛页面', show_softapplication_contest_path(@softapplication.contest) %>
diff --git a/app/views/issues/_attributes.html.erb b/app/views/issues/_attributes.html.erb
index 6aef01e1d..f4857bd22 100644
--- a/app/views/issues/_attributes.html.erb
+++ b/app/views/issues/_attributes.html.erb
@@ -2,7 +2,7 @@
<%= l(:label_change_properties) %>
-
+
<% if @issue.safe_attribute?('status_id') && @allowed_statuses.present? %>
<%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), {:required => true},
diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb
index 653b5ae5d..433e8aae6 100644
--- a/app/views/layouts/base_projects.html.erb
+++ b/app/views/layouts/base_projects.html.erb
@@ -12,6 +12,7 @@
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
<%= javascript_heads %>
<%= heads_for_theme %>
+ <%= hubspot_head %>
<%= call_hook :view_layouts_base_html_head %>
<%= yield :header_tags -%>
diff --git a/app/views/members/create.js.erb b/app/views/members/create.js.erb
index 88089f843..3607ce448 100644
--- a/app/views/members/create.js.erb
+++ b/app/views/members/create.js.erb
@@ -2,12 +2,12 @@ $('#tab-content-members').html('<%= escape_javascript(render :partial => 'projec
hideOnLoad();
<%if !@applied_members%>
-<% if @members.present? && @members.all? {|m| m.valid? } %>
- <% @members.each do |member| %>
- $("#member-<%= member.id %>").effect("highlight");
+ <% if @members.present? && @members.all? {|m| m.valid? } %>
+ <% @members.each do |member| %>
+ $("#member-<%= member.id %>").effect("highlight");
+ <% end %>
+ <% else %>
+ <% errors = @members.collect {|m| m.errors.full_messages}.flatten.uniq.join(', ') %>
+ alert('<%= raw(escape_javascript(l(:notice_failed_to_save_members, :errors => errors))) %>');
<% end %>
-<% else %>
- <% errors = @members.collect {|m| m.errors.full_messages}.flatten.uniq.join(', ') %>
- alert('<%= raw(escape_javascript(l(:notice_failed_to_save_members, :errors => errors))) %>');
<% end %>
-<%end%>
diff --git a/app/views/projects/_project.html.erb b/app/views/projects/_project.html.erb
index 541a71f51..a64038424 100644
--- a/app/views/projects/_project.html.erb
+++ b/app/views/projects/_project.html.erb
@@ -41,9 +41,10 @@
-
+
<%= content_tag('span', link_to("#{@project.homeworks.count}", homework_project_path(@project)), :class => "info") %><%= content_tag('span', l(:label_x_task, :count => @project.homeworks.count)) %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 303e50b93..d84cfb664 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1168,6 +1168,7 @@ en:
label_tags_issue_description: issue description
label_tags_all_objects: all objects
label_apply_project: Apply Project
+ label_apply_project_waiting: "Application has been submitted, please wait for administrator review."
label_unapply_project: Unsubscribe
#fq
diff --git a/config/locales/zh.yml b/config/locales/zh.yml
index 77a6a005e..b03e3bc31 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -483,7 +483,7 @@ zh:
label_project_latest: 最近的项目
label_issue: 问题
label_issue_new: 新建问题
- label_issue_plural: 缺陷 #问题 #nyan
+ label_issue_plural: 缺陷
label_issue_view_all: 查看所有问题
label_issues_by: "按 %{value} 分组显示问题"
label_issue_added: 问题已添加
@@ -583,6 +583,10 @@ zh:
label_course_done: 已结束的课程
label_homework_response: 作业咨询
label_bidding_homework: 提交作业
+ label_add_homework: 添加作业
+ label_edit_homework: 修改作业
+ label_delete_homework: 删除作业
+ label_new_homework: 创建作业
#end
label_my_page: 我的工作台
@@ -757,7 +761,7 @@ zh:
label_sort_higher: 上移
label_sort_lower: 下移
label_sort_lowest: 置底
- label_roadmap: 里程碑 #版本路线图 #nyan
+ label_roadmap: 里程碑 #版本路线图
label_roadmap_due_in: "截止日期到 %{value}"
label_roadmap_overdue: "%{value} 延期"
label_roadmap_no_issues: 该版本没有问题
@@ -965,6 +969,7 @@ zh:
button_edit_associated_wikipage: "编辑相关wiki页面: %{page_title}"
button_add: 新增
button_change: 修改
+ button_ok_and_submit: 确定并提交
button_apply: 查询
button_clear: 清除留言
@@ -1260,9 +1265,9 @@ zh:
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: 合计
label_create_time: 创建时间 #Customer added!Added by nie
- label_comment_time: 留言时间 #nyan
- label_activity_time: 发布时间 #nyan
- label_update_time: 更新时间 #nyan
+ label_comment_time: 留言时间
+ label_activity_time: 发布时间
+ label_update_time: 更新时间
label_current_contributors: 位当前贡献者
label_commit_limit: 作业提交时间已过!
label_commit_ar: 作业提交截止时间快到了!
@@ -1330,6 +1335,7 @@ zh:
label_tags_issue_description: 问题描述
label_tags_all_objects: 所有
label_apply_project: 申请加入
+ label_apply_project_waiting: 已处理申请,请等待管理员审核
label_unapply_project: 取消申请
#fq
diff --git a/config/routes.rb b/config/routes.rb
index 5db37b55c..dbbc544ac 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -29,6 +29,7 @@ RedmineApp::Application.routes.draw do
collection do
match 'addjours', via: [:get, :post]
match 'add_jour_reply', via: [:get,:post]
+ match 'destroy_jour', via: [:get,:post]
end
end
resources :open_source_projects do
@@ -568,7 +569,7 @@ RedmineApp::Application.routes.draw do
match 'calls/new_bid', :controller => 'bids', :action => 'new_bid'
match 'contest/new_contest', :controller => 'bids', :action => 'new_contest' #huang
match 'calls/:id/show_project', :controller => 'bids', :action => 'show_project', :as => 'project_for_bid'
- match 'calls/:id/show_project_homework', :controller => 'bids', :action => 'show_project_homework', :as => 'project_for_bid_homework' # by huang
+ match 'calls/:id/new_homework', :controller => 'homework_attach', :action => 'new', :as => 'new_homework_attach'
match 'calls/:id/add', :controller => 'bids', :action => 'add'
match 'calls/:id/delete', :controller => 'bids', :action => 'delete'
match 'calls/:id/add_homework', :controller => 'bids', :action => 'add_homework', via: :post
diff --git a/public/stylesheets/hubspot/messenger-theme-flat.css b/public/stylesheets/hubspot/messenger-theme-flat.css
new file mode 100644
index 000000000..df8d35aeb
--- /dev/null
+++ b/public/stylesheets/hubspot/messenger-theme-flat.css
@@ -0,0 +1,462 @@
+@-webkit-keyframes ui-spinner-rotate-right {
+ /* line 64, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+
+ /* line 65, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ -webkit-transform: rotate(180deg);
+ }
+
+ /* line 66, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ -webkit-transform: rotate(180deg);
+ }
+
+ /* line 67, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ -webkit-transform: rotate(360deg);
+ }
+
+ /* line 68, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ -webkit-transform: rotate(360deg);
+ }
+}
+
+@-webkit-keyframes ui-spinner-rotate-left {
+ /* line 72, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+
+ /* line 73, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ -webkit-transform: rotate(0deg);
+ }
+
+ /* line 74, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ -webkit-transform: rotate(180deg);
+ }
+
+ /* line 75, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ -webkit-transform: rotate(180deg);
+ }
+
+ /* line 76, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ -webkit-transform: rotate(360deg);
+ }
+}
+
+@-moz-keyframes ui-spinner-rotate-right {
+ /* line 80, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+
+ /* line 81, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ -moz-transform: rotate(180deg);
+ }
+
+ /* line 82, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ -moz-transform: rotate(180deg);
+ }
+
+ /* line 83, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ -moz-transform: rotate(360deg);
+ }
+
+ /* line 84, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ -moz-transform: rotate(360deg);
+ }
+}
+
+@-moz-keyframes ui-spinner-rotate-left {
+ /* line 88, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+
+ /* line 89, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ -moz-transform: rotate(0deg);
+ }
+
+ /* line 90, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ -moz-transform: rotate(180deg);
+ }
+
+ /* line 91, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ -moz-transform: rotate(180deg);
+ }
+
+ /* line 92, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ -moz-transform: rotate(360deg);
+ }
+}
+
+@keyframes ui-spinner-rotate-right {
+ /* line 96, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ /* line 97, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ transform: rotate(180deg);
+ }
+
+ /* line 98, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ transform: rotate(180deg);
+ }
+
+ /* line 99, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ transform: rotate(360deg);
+ }
+
+ /* line 100, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes ui-spinner-rotate-left {
+ /* line 104, ../../src/sass/messenger-spinner.scss */
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ /* line 105, ../../src/sass/messenger-spinner.scss */
+ 25% {
+ transform: rotate(0deg);
+ }
+
+ /* line 106, ../../src/sass/messenger-spinner.scss */
+ 50% {
+ transform: rotate(180deg);
+ }
+
+ /* line 107, ../../src/sass/messenger-spinner.scss */
+ 75% {
+ transform: rotate(180deg);
+ }
+
+ /* line 108, ../../src/sass/messenger-spinner.scss */
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+/* line 116, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner {
+ position: relative;
+ border-radius: 100%;
+}
+/* line 120, ../../src/sass/messenger-spinner.scss */
+ul.messenger.messenger-spinner-active .messenger-spinner .messenger-spinner {
+ display: block;
+}
+/* line 124, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side {
+ width: 50%;
+ height: 100%;
+ overflow: hidden;
+ position: absolute;
+}
+/* line 130, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
+ border-radius: 999px;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ -webkit-animation-iteration-count: infinite;
+ -moz-animation-iteration-count: infinite;
+ -ms-animation-iteration-count: infinite;
+ -o-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+ -webkit-animation-timing-function: linear;
+ -moz-animation-timing-function: linear;
+ -ms-animation-timing-function: linear;
+ -o-animation-timing-function: linear;
+ animation-timing-function: linear;
+}
+/* line 140, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side-left {
+ left: 0;
+}
+/* line 143, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side-left .messenger-spinner-fill {
+ left: 100%;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ -webkit-animation-name: ui-spinner-rotate-left;
+ -moz-animation-name: ui-spinner-rotate-left;
+ -ms-animation-name: ui-spinner-rotate-left;
+ -o-animation-name: ui-spinner-rotate-left;
+ animation-name: ui-spinner-rotate-left;
+ -webkit-transform-origin: 0 50%;
+ -moz-transform-origin: 0 50%;
+ -ms-transform-origin: 0 50%;
+ -o-transform-origin: 0 50%;
+ transform-origin: 0 50%;
+}
+/* line 152, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side-right {
+ left: 50%;
+}
+/* line 155, ../../src/sass/messenger-spinner.scss */
+.messenger-spinner .messenger-spinner-side-right .messenger-spinner-fill {
+ left: -100%;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ -webkit-animation-name: ui-spinner-rotate-right;
+ -moz-animation-name: ui-spinner-rotate-right;
+ -ms-animation-name: ui-spinner-rotate-right;
+ -o-animation-name: ui-spinner-rotate-right;
+ animation-name: ui-spinner-rotate-right;
+ -webkit-transform-origin: 100% 50%;
+ -moz-transform-origin: 100% 50%;
+ -ms-transform-origin: 100% 50%;
+ -o-transform-origin: 100% 50%;
+ transform-origin: 100% 50%;
+}
+
+/* line 15, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+ background: #404040;
+}
+/* line 20, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat.messenger-empty {
+ display: none;
+}
+/* line 23, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message {
+ -webkit-box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+ -moz-box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+ box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ -ms-border-radius: 0px;
+ -o-border-radius: 0px;
+ border-radius: 0px;
+ position: relative;
+ border: 0px;
+ margin-bottom: 0px;
+ font-size: 13px;
+ background: transparent;
+ color: #f0f0f0;
+ font-weight: 500;
+ padding: 10px 30px 13px 65px;
+}
+/* line 35, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-close {
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ color: #888888;
+ opacity: 1;
+ font-weight: bold;
+ display: block;
+ font-size: 20px;
+ line-height: 20px;
+ padding: 8px 10px 7px 7px;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+/* line 51, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-close:hover {
+ color: #bbbbbb;
+}
+/* line 54, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-close:active {
+ color: #777777;
+}
+/* line 57, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-actions {
+ float: none;
+ margin-top: 10px;
+}
+/* line 61, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-actions a {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+ text-decoration: none;
+ color: #aaaaaa;
+ background: #2e2e2e;
+ display: inline-block;
+ padding: 10px;
+ margin-right: 10px;
+ padding: 4px 11px 6px;
+ text-transform: capitalize;
+}
+/* line 72, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-actions a:hover {
+ color: #f0f0f0;
+ background: #2e2e2e;
+}
+/* line 76, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-actions a:active {
+ background: #292929;
+ color: #aaaaaa;
+}
+/* line 80, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-actions .messenger-phrase {
+ display: none;
+}
+/* line 83, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message .messenger-message-inner:before {
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ -ms-border-radius: 50%;
+ -o-border-radius: 50%;
+ border-radius: 50%;
+ position: absolute;
+ left: 17px;
+ display: block;
+ content: " ";
+ top: 50%;
+ margin-top: -8px;
+ height: 13px;
+ width: 13px;
+ z-index: 20;
+}
+/* line 95, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message.alert-success .messenger-message-inner:before {
+ background: #5fca4a;
+}
+/* line 98, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message.alert-info .messenger-message-inner:before {
+ background: #61c4b8;
+}
+/* line 103, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message.alert-error .messenger-message-inner:before {
+ background: #dd6a45;
+}
+/* line 32, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-soon .messenger-spinner {
+ width: 32px;
+ height: 32px;
+ background: transparent;
+}
+/* line 37, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-soon .messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
+ background: #dd6a45;
+ -webkit-animation-duration: 20s;
+ -moz-animation-duration: 20s;
+ -ms-animation-duration: 20s;
+ -o-animation-duration: 20s;
+ animation-duration: 20s;
+ opacity: 1;
+}
+/* line 45, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-soon .messenger-spinner:after {
+ content: "";
+ background: #292929;
+ position: absolute;
+ width: 26px;
+ height: 26px;
+ border-radius: 50%;
+ top: 3px;
+ left: 3px;
+ display: block;
+}
+/* line 32, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-later .messenger-spinner {
+ width: 32px;
+ height: 32px;
+ background: transparent;
+}
+/* line 37, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-later .messenger-spinner .messenger-spinner-side .messenger-spinner-fill {
+ background: #dd6a45;
+ -webkit-animation-duration: 600s;
+ -moz-animation-duration: 600s;
+ -ms-animation-duration: 600s;
+ -o-animation-duration: 600s;
+ animation-duration: 600s;
+ opacity: 1;
+}
+/* line 45, ../../src/sass/messenger-spinner.scss */
+ul.messenger-theme-flat .messenger-message.alert-error.messenger-retry-later .messenger-spinner:after {
+ content: "";
+ background: #292929;
+ position: absolute;
+ width: 26px;
+ height: 26px;
+ border-radius: 50%;
+ top: 3px;
+ left: 3px;
+ display: block;
+}
+/* line 114, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message-slot.messenger-last .messenger-message {
+ -webkit-border-radius: 4px 4px 0px 0px;
+ -moz-border-radius: 4px 4px 0px 0px;
+ -ms-border-radius: 4px 4px 0px 0px;
+ -o-border-radius: 4px 4px 0px 0px;
+ border-radius: 4px 4px 0px 0px;
+ -webkit-box-shadow: inset 48px 0px 0px #292929;
+ -moz-box-shadow: inset 48px 0px 0px #292929;
+ box-shadow: inset 48px 0px 0px #292929;
+}
+/* line 118, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message-slot.messenger-first .messenger-message {
+ -webkit-border-radius: 0px 0px 4px 4px;
+ -moz-border-radius: 0px 0px 4px 4px;
+ -ms-border-radius: 0px 0px 4px 4px;
+ -o-border-radius: 0px 0px 4px 4px;
+ border-radius: 0px 0px 4px 4px;
+ -webkit-box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+ -moz-box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+ box-shadow: inset 0px 1px rgba(255, 255, 255, 0.13), inset 48px 0px 0px #292929;
+}
+/* line 122, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-message-slot.messenger-first.messenger-last .messenger-message {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ -ms-border-radius: 4px;
+ -o-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 48px 0px 0px #292929;
+ -moz-box-shadow: inset 48px 0px 0px #292929;
+ box-shadow: inset 48px 0px 0px #292929;
+}
+/* line 126, ../../src/sass/messenger-theme-flat.sass */
+ul.messenger-theme-flat .messenger-spinner {
+ display: block;
+ position: absolute;
+ left: 7px;
+ top: 50%;
+ margin-top: -18px;
+ z-index: 999;
+ height: 32px;
+ width: 32px;
+ z-index: 10;
+}