From 3d02cb7ce0147357d30b204052bbf1d5a2f5e2cd Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 10:56:18 +0800 Subject: [PATCH 01/48] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=83=A8=E5=88=86=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/softapplication.rb | 3 +-- app/views/layouts/base_newcontest.html.erb | 2 +- app/views/softapplications/show.html.erb | 5 +---- app/views/welcome/contest.html.erb | 5 +++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 603279fbd..71caf059c 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,8 +1,7 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers acts_as_attachable - seems_rateable :allow_update => true, :dimensions => :quality - seems_rateable_rater + has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index c0e23bf21..9813905ca 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -10,7 +10,7 @@ <%= favicon %> <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> - <%= seems_rateable_stylesheet %> + <%= javascript_heads %> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index fcd746776..5ddd752d3 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -34,10 +34,7 @@ 开发人员:<%= @softapplication.application_developers %> - - rate: <%=rating_for @softapplication, :dimension => :qulity %> - - + diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index f3d7f092e..38afd6091 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -154,8 +154,9 @@
- <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %>) - <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %>) + + 发布时间:<%=format_time contest.created_on %>
From 83f039a01415352d14ec9d2e7a359094faeee10c Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 11:22:33 +0800 Subject: [PATCH 02/48] modify pku.png --- public/images/footer_logo/buaa_scse.jpg | Bin 31121 -> 0 bytes public/images/footer_logo/inforbus.jpg | Bin 3066 -> 0 bytes public/images/footer_logo/iscas.jpg | Bin 2602 -> 0 bytes public/images/footer_logo/nudt.jpg | Bin 3333 -> 0 bytes public/images/footer_logo/pdl.jpg | Bin 3333 -> 0 bytes public/images/footer_logo/peking_eecs.jpg | Bin 22936 -> 0 bytes public/images/footer_logo/peking_eecs.png | Bin 5215 -> 5229 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/footer_logo/buaa_scse.jpg delete mode 100644 public/images/footer_logo/inforbus.jpg delete mode 100644 public/images/footer_logo/iscas.jpg delete mode 100644 public/images/footer_logo/nudt.jpg delete mode 100644 public/images/footer_logo/pdl.jpg delete mode 100644 public/images/footer_logo/peking_eecs.jpg diff --git a/public/images/footer_logo/buaa_scse.jpg b/public/images/footer_logo/buaa_scse.jpg deleted file mode 100644 index 68ebbc1d3fb03ecac6b9cced609560a870bf9203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31121 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 diff --git a/public/images/footer_logo/inforbus.jpg b/public/images/footer_logo/inforbus.jpg deleted file mode 100644 index f3249be16837447eb4c68c3bc60fd8e9e6180272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3066 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 RJ6x@U98`FckHXVO{{izZ$A|y` diff --git a/public/images/footer_logo/iscas.jpg b/public/images/footer_logo/iscas.jpg deleted file mode 100644 index a26ccad3822973ccff743ab9511e7e0b6511067e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 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 nqnM$wg_ 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 nqnM$Ab~;y-g{j*cSl0DHfC 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 diff --git a/public/images/footer_logo/peking_eecs.png b/public/images/footer_logo/peking_eecs.png index 13638d5f0c41059e978a0a536cf18fcb400d97a4..6c7164f08c1e8b990a4fdb319b0752e8a26c57c8 100644 GIT binary patch delta 5129 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 From 8775eab3dd5ead1f7c97884d77579334dc2ddaff Mon Sep 17 00:00:00 2001 From: yanxd Date: Sat, 19 Apr 2014 12:47:59 +0800 Subject: [PATCH 03/48] iscas modify --- public/images/footer_logo/iscas.png | Bin 5361 -> 4857 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/footer_logo/iscas.png b/public/images/footer_logo/iscas.png index f81fda8ceaaa5419f689907c454c4a19e35f66b6..f3cbac371f21ab19c19a48b88384279c390cef76 100644 GIT binary patch delta 4770 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 delta 5278 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 From 43064c4bc24726776cd645a519fc9c2b0c0ec58b Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 13:10:25 +0800 Subject: [PATCH 04/48] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E9=A6=96=E9=A1=B5=E4=B8=AD=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E7=AB=9E=E8=B5=9B=EF=BC=9A=E6=97=A2=E6=9C=89=E6=97=A7?= =?UTF-8?q?=E7=9A=84=E7=AB=9E=E8=B5=9B=E5=8F=88=E6=9C=89=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E7=AB=9E=E8=B5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/welcome_helper.rb | 17 ++++++++++++++++- app/views/welcome/contest.html.erb | 7 +++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/helpers/welcome_helper.rb b/app/helpers/welcome_helper.rb index 10e8a4471..9970ee9c6 100644 --- a/app/helpers/welcome_helper.rb +++ b/app/helpers/welcome_helper.rb @@ -98,7 +98,14 @@ module WelcomeHelper end def find_all_hot_contest limit=10 - Contest.reorder("created_on DESC").all.take limit + # Contest.reorder("created_on DESC").all.take limit + mix_bid = [] + mix_bid += Contest.reorder("created_on DESC").take(limit).to_a + mix_bid += Bid.visible.where('reward_type = ?', 2).reorder('bids.created_on desc').take(limit).to_a + mix_bid.sort do |older, newer| + newer.created_on - older.created_on + end + mix_bid.take limit end def find_all_hot_softapplication limit=10 @@ -224,6 +231,10 @@ module WelcomeHelper def sort_contest_by_hot sort_bid_by_hot_rails 2 end +#new added by linchun + def sort_contest_by_time + sort_bid_by_time 2 + end #取得所有活动 def find_all_activities limit=6 @@ -278,6 +289,10 @@ module WelcomeHelper Bid.visible.where('reward_type = ?', reward_type).reorder('bids.commit desc').limit(limit) end + def sort_bid_by_time reward_type, limit = 10 + Bid.visible.where('reward_type = ?', reward_type).reorder('bids.created_on desc').limit(limit) + end + def find_all_event_type event case event.event_type when 'news' diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 38afd6091..27ab04e1a 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -138,7 +138,7 @@ <%= link_to "更多>>", {:controller => 'contests', :action => 'index', :host => Setting.contest_domain}, :target => "_blank" %>

- <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[5]) %> + <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[8]) %>
  • @@ -146,7 +146,7 @@
    - <%= link_to(contest.name, show_contest_contest_path(contest.id), :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %> + <%= link_to(contest.name, contest.event_url, :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %>
    @@ -154,8 +154,7 @@

    - + 发布时间:<%=format_time contest.created_on %>
    From edb5dac785ac944c082fb5d3fe845e61f26785ef Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Sat, 19 Apr 2014 14:19:21 +0800 Subject: [PATCH 05/48] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A1=B5=E9=9D=A2=E4=B8=AD=E7=9A=84=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/contests/_contest_list.html.erb | 21 +++++++++++---------- app/views/contests/index.html.erb | 2 +- app/views/welcome/contest.html.erb | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/views/contests/_contest_list.html.erb b/app/views/contests/_contest_list.html.erb index 4fb2865c8..fb3ddd115 100644 --- a/app/views/contests/_contest_list.html.erb +++ b/app/views/contests/_contest_list.html.erb @@ -6,7 +6,7 @@ - + - @@ -29,13 +29,14 @@ +
    +
    <%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>:  <%= link_to(contest.name, show_contest_contest_path(contest), :class => 'bid_path') %><%= link_to(contest.author, user_path(contest.author), :class => 'bid_user') %>:  <%= link_to(contest.name, show_contest_contest_path(contest), :class => 'bid_path', :target => "_blank") %>
    @@ -18,8 +18,8 @@
    <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest)) %>) - <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest)) %>) + <%= l(:label_contest_project, :count => contest.contesting_projects.count) %>(<%= link_to(contest.contesting_projects.count, show_project_contest_path(contest), :target => "_blank") %>) + <%= l(:label_contest_softapplication, :count => contest.contesting_softapplications.count) %>(<%= link_to(contest.contesting_softapplications.count, show_softapplication_contest_path(contest), :target => "_blank") %>)
    -
    - - - - -
    <%= contest.description%>
    -
    + + + +
    +
  • + diff --git a/app/views/contests/index.html.erb b/app/views/contests/index.html.erb index 3a7bde1e5..670ba27cf 100644 --- a/app/views/contests/index.html.erb +++ b/app/views/contests/index.html.erb @@ -7,7 +7,7 @@ <% if User.current.logged? %> <% unless User.current.user_extensions.identity == 1 %> - <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add') %> + <%= link_to(l(:label_newtype_contest), {:controller => 'contests', :action => 'new_contest'}, :class => 'icon icon-add', :target => "_blank") %> <% end %> <% end %> diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 27ab04e1a..8c0addb8d 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -138,7 +138,7 @@ <%= link_to "更多>>", {:controller => 'contests', :action => 'index', :host => Setting.contest_domain}, :target => "_blank" %>
    - <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[8]) %> + <% find_all_hot_contest.map do |contest| break if(contest == find_all_hot_contest[6]) %>
  • From 9034dd09e711955a34b0f8b4b8bf062bdf3e38cb Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 08:39:49 +0800 Subject: [PATCH 06/48] =?UTF-8?q?=E5=BC=80=E5=90=AF=E9=87=8D=E5=90=AF?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=9C=A8=E8=AF=BE=E7=A8=8B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_set_course_time.html.erb | 5 +++-- app/views/projects/finishcourse.js.erb | 2 +- app/views/users/_course_form.html.erb | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/views/courses/_set_course_time.html.erb b/app/views/courses/_set_course_time.html.erb index ab9fa6f28..d13d256c1 100644 --- a/app/views/courses/_set_course_time.html.erb +++ b/app/views/courses/_set_course_time.html.erb @@ -1,8 +1,9 @@ <% - id = "finish_course_tag" + id = "finish_course_#{project.id}" + display = (project.course_extra.teacher.id == User.current.id ) %> -<% if course_endTime_timeout?(project) #如果课程已结束%> +<% if display && course_endTime_timeout?(project) #如果课程已结束%> <%= link_to '重启课程', restartcourse_project_path(project), :remote => true, :method => :post, :id => id, :confirm => ('确定要重启课程?') %> <% else %> <%= link_to '关闭课程', finishcourse_project_path(project), :remote => true, :method => :post, :id => id, :confirm => ('确定要关闭课程?') %> diff --git a/app/views/projects/finishcourse.js.erb b/app/views/projects/finishcourse.js.erb index 04f6617db..35ecac370 100644 --- a/app/views/projects/finishcourse.js.erb +++ b/app/views/projects/finishcourse.js.erb @@ -2,7 +2,7 @@ <% if Rails.env.development? %> console.debug('课程修改成功:结束时间改为<%=Course.find_by_extra(@project.identifier).try(:endup_time)%>'); <% end %> - $('#finish_course_tag').replaceWith("<%= j(render partial: 'courses/set_course_time', :locals => {:project => @project} )%>") + $('#finish_course_<%=@project.id%>').replaceWith("<%= j(render partial: 'courses/set_course_time', :locals => {:project => @project} )%>") <% else %> alert('设置失败,请在论坛提交问题,等待管理员处理。'); <% end %> diff --git a/app/views/users/_course_form.html.erb b/app/views/users/_course_form.html.erb index 810787850..a2ef0dd83 100644 --- a/app/views/users/_course_form.html.erb +++ b/app/views/users/_course_form.html.erb @@ -8,9 +8,11 @@ -
    <%= link_to_project(membership.project) %> + + <%= link_to_project(membership.project) %> + <%=render :partial => 'courses/set_course_time', :locals => {:project => membership.project} %> <% if User.current == @user %> <% (membership.roles).each do |role| %> <% unless (role == Role.find(9) || role == Role.find(3)) %> From 9a580655ab34a8fd04ba4027f43356a530c865f6 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 21 Apr 2014 09:22:46 +0800 Subject: [PATCH 07/48] =?UTF-8?q?=E5=9C=A8project=E7=9A=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=8A=A8=E6=80=81=E7=9A=84=E6=9C=80=E5=90=8E=E4=B8=80?= =?UTF-8?q?=E9=A1=B5=E6=98=BE=E7=A4=BA=E9=A1=B9=E7=9B=AE=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/projects/show.html.erb | 57 ++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb index 3ca41d072..eb66efc73 100644 --- a/app/views/projects/show.html.erb +++ b/app/views/projects/show.html.erb @@ -1,4 +1,4 @@ - +<% if @events_by_day.size >0 %>

    @@ -40,26 +40,31 @@

    + <% end %>
  • + + + <% if format_date(day) == format_date(@date_to - @days) %> +
    + + + + + +
    <%= image_tag(url_to_avatar(@user), :class => "avatar") %> + + + + + +
    <%= link_to (h @user.try(:name)), user_path(@user) if @user %> <%= l(:label_user_create_project) %> <%= link_to @project.name %> !
    <%= l :label_update_time %>: <%= format_time(@project.created_on) %> +
    +
    + <% end %> <% end -%> - -
    - - - - - -
    <%= image_tag(url_to_avatar(@user), :class => "avatar") %> - - - - - -
    <%= link_to (h @user.try(:name)), user_path(@user) if @user %> <%= l(:label_user_create_project) %> <%= link_to @project.name %> !
    <%= l :label_update_time %>: <%= format_time(@project.created_on) %> -
    -
    +
    - +<% else %> +
    + + + + + +
    <%= image_tag(url_to_avatar(@user), :class => "avatar") %> + + + + + +
    <%= link_to (h @user.try(:name)), user_path(@user) if @user %> <%= l(:label_user_create_project) %> <%= link_to @project.name %> !
    <%= l :label_update_time %>: <%= format_time(@project.created_on) %> +
    +
    +<% end %> From dd09c36a8fbd579c5943efc2bd0bb8e9d6e138f9 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 21 Apr 2014 09:32:55 +0800 Subject: [PATCH 08/48] Added the message of creating the project in the project's activities --- db/schema.rb | 242 --------------------------------------------------- 1 file changed, 242 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index b4a9ba972..bfbb7a26e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -23,15 +23,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - create_table "apply_project_masters", :force => true do |t| - t.integer "user_id" - t.string "apply_type" - t.integer "apply_id" - t.integer "status" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "attachments", :force => true do |t| t.integer "container_id" t.string "container_type", :limit => 30 @@ -71,20 +62,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - create_table "bak_mentioned", :primary_key => "Id", :force => true do |t| - t.string "this_real_name", :limit => 1000 - t.integer "is_mentioned_in" - t.string "context", :limit => 2000 - end - - add_index "bak_mentioned", ["this_real_name", "is_mentioned_in"], :name => "name_mention", :length => {"this_real_name"=>900, "is_mentioned_in"=>nil} - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name" - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_2" - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_3", :length => {"this_real_name"=>900} - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_4" - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_5" - add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_6" - create_table "biding_projects", :force => true do |t| t.integer "project_id" t.integer "bid_id" @@ -124,11 +101,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" add_index "boards", ["project_id"], :name => "boards_project_id" - create_table "categories", :primary_key => "Id", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "proj_categories" - end - create_table "changes", :force => true do |t| t.integer "changeset_id", :null => false t.string "action", :limit => 1, :default => "", :null => false @@ -293,14 +265,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "documents", ["created_on"], :name => "index_documents_on_created_on" add_index "documents", ["project_id"], :name => "documents_project_id" - create_table "eco_projects", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.integer "eco_proj_id" - t.datetime "date_collected" - end - - add_index "eco_projects", ["proj_id"], :name => "proj_id" - create_table "enabled_modules", :force => true do |t| t.integer "project_id" t.string "name", :null => false @@ -322,137 +286,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - create_table "events", :primary_key => "event_id", :force => true do |t| - t.string "job_name" - t.datetime "event_time" - t.string "event_type", :limit => 20 - end - - create_table "fm_article", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "article_title", :limit => 16777215 - t.text "article_link", :limit => 16777215 - t.text "article_time", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_article", ["proj_id"], :name => "proj_id" - - create_table "fm_bugtracker_link", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_bugtracker_link", ["proj_id"], :name => "proj_id" - - create_table "fm_datametric_link", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_datametric_link", ["proj_id"], :name => "proj_id" - - create_table "fm_dependency_link", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_dependency_link", ["proj_id"], :name => "proj_id" - - create_table "fm_download_link", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "download_link", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_download_link", ["proj_id"], :name => "proj_id" - - create_table "fm_heartbeat", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.float "popularity_score", :limit => 12 - t.float "vitality_score", :limit => 12 - t.integer "subscription" - t.integer "voting_score" - t.integer "voting_count" - t.datetime "date_collected" - end - - add_index "fm_heartbeat", ["proj_id"], :name => "proj_id" - - create_table "fm_license", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_license", ["proj_id"], :name => "proj_id" - - create_table "fm_mailinglist_link", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_mailinglist_link", ["proj_id"], :name => "proj_id" - - create_table "fm_operating_system", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_operating_system", ["proj_id"], :name => "proj_id" - - create_table "fm_programming_language", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_programming_language", ["proj_id"], :name => "proj_id" - - create_table "fm_project_spotlight", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.text "project_name", :limit => 16777215 - t.text "project_spotlight_link", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_project_spotlight", ["proj_id"], :name => "proj_id" - - create_table "fm_release", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.text "release_version", :limit => 16777215 - t.text "release_time", :limit => 16777215 - t.text "release_tag", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_release", ["proj_id"], :name => "proj_id" - - create_table "fm_submit", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "submitter", :limit => 16777215 - t.text "submitter_link", :limit => 16777215 - t.text "submit_time", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_submit", ["proj_id"], :name => "proj_id" - - create_table "fm_summary", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.text "description", :limit => 16777215 - t.datetime "date_collected" - end - - add_index "fm_summary", ["proj_id"], :name => "proj_id" - create_table "forums", :force => true do |t| t.string "name", :null => false t.string "description", :default => "" @@ -685,22 +518,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "news", ["created_on"], :name => "index_news_on_created_on" add_index "news", ["project_id"], :name => "news_project_id" - create_table "no_uses", :force => true do |t| - t.integer "user_id", :null => false - t.string "no_use_type" - t.integer "no_use_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "ohloh_tagged", :force => true do |t| - t.integer "proj_id", :default => 0, :null => false - t.string "description", :limit => 100, :null => false - t.datetime "date_collected" - end - - add_index "ohloh_tagged", ["proj_id"], :name => "proj_id" - create_table "open_id_authentication_associations", :force => true do |t| t.integer "issued" t.integer "lifetime" @@ -716,19 +533,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do t.string "salt", :null => false end - create_table "open_source_projects", :force => true do |t| - t.string "name" - t.text "description" - t.integer "commit_count", :default => 0 - t.integer "code_line", :default => 0 - t.integer "users_count", :default => 0 - t.date "last_commit_time" - t.string "url" - t.date "date_collected" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - create_table "praise_tread_caches", :force => true do |t| t.integer "object_id", :null => false t.string "object_type" @@ -808,23 +612,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "queries", ["project_id"], :name => "index_queries_on_project_id" add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - create_table "relative_memos", :force => true do |t| - t.integer "osp_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id" - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.boolean "is_quote", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count_crawl", :default => 0 - t.integer "viewed_count_local", :default => 0 - end - create_table "repositories", :force => true do |t| t.integer "project_id", :default => 0, :null => false t.string "url", :default => "", :null => false @@ -977,22 +764,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" add_index "tokens", ["value"], :name => "tokens_value", :unique => true - create_table "tprojects", :force => true do |t| - t.string "name", :limit => 1000, :default => "0" - t.text "description", :limit => 16777215 - t.string "commit_count", :limit => 100, :default => "0" - t.string "code_line", :limit => 100 - t.string "last_commit_time", :limit => 100 - t.string "url", :limit => 1000 - t.datetime "date_collected" - t.string "created_at", :limit => 100 - t.string "updated_at", :limit => 100 - t.integer "proj_id", :null => false - t.string "user_count", :limit => 100 - end - - add_index "tprojects", ["proj_id"], :name => "proj_id" - create_table "trackers", :force => true do |t| t.string "name", :limit => 30, :default => "", :null => false t.boolean "is_in_chlog", :default => false, :null => false @@ -1042,19 +813,6 @@ ActiveRecord::Schema.define(:version => 20140417091429) do add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - create_table "user_scores", :force => true do |t| - t.integer "user_id", :null => false - t.integer "collaboration" - t.integer "influence" - t.integer "skill" - t.integer "active" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "level" - t.integer "file" - t.integer "issue" - end - create_table "user_statuses", :force => true do |t| t.integer "changesets_count" t.integer "watchers_count" From 36cd91401f7b05baaf556db627cfa271b1f3dae1 Mon Sep 17 00:00:00 2001 From: baiyu Date: Mon, 21 Apr 2014 11:13:45 +0800 Subject: [PATCH 09/48] user score --- app/helpers/user_score_helper.rb | 108 ++ app/models/user.rb | 2 + app/models/user_scores.rb | 36 + .../20140410021724_create_user_score.rb | 13 + ...0413022725_add_filed_to_user_preference.rb | 7 + db/schema.rb | 250 ++++- db/schema.rb.BASE.rb | 887 ++++++++++++++++ db/schema.rb.LOCAL.rb | 895 ++++++++++++++++ db/schema.rb.REMOTE.rb | 958 ++++++++++++++++++ test/fixtures/join_in_contests.yml | 9 + test/unit/join_in_contest_test.rb | 7 + 11 files changed, 3167 insertions(+), 5 deletions(-) create mode 100644 app/helpers/user_score_helper.rb create mode 100644 app/models/user_scores.rb create mode 100644 db/migrate/20140410021724_create_user_score.rb create mode 100644 db/migrate/20140413022725_add_filed_to_user_preference.rb create mode 100644 db/schema.rb.BASE.rb create mode 100644 db/schema.rb.LOCAL.rb create mode 100644 db/schema.rb.REMOTE.rb create mode 100644 test/fixtures/join_in_contests.yml create mode 100644 test/unit/join_in_contest_test.rb diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb new file mode 100644 index 000000000..ff4a5adbd --- /dev/null +++ b/app/helpers/user_score_helper.rb @@ -0,0 +1,108 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module UserScoreHelper + def calculate_collaboration_count(user) + issue_c = 0 + issues = Issue.where('author_id = ?', user.id) + issues.each do |issue| + issue_c = issue_c + issue.journals.where("user_id <> ?", user.id).count + end + issue_c = issue_c + Journal.where("user_id = ?", user.id) + + return issue_c + end + + def calculate_influence_count(user) + watcher_count = watcher_users(User.current.id).count + end + + def calculate_skill_count(user) + 0 + end + + def calculate_level(user) + 1 + end + + def calculate_activity_count(user) + # commit_count = user.changesets.count + # issue_details_count = 0 + # issues = Issue.where('assigned_to_id = ?', user.id) + # issues.each do |issue| + # change_count = issue.journals.where("prop_key = ?", "done_ratio").count + # issue_details_count = change_count + issue_details_count + # end + # file_count = user.file_commit.count + # issue_count = Issue.where('author_id = ?', user.id).count + f = user.user_score.file + i = user.user_score.issue + f_max = UserScore.find_max_file + f_min = UserScore.find_min_file + i_max = UserScore.find_max_issue + i_min = UserScore.find_min_issue + score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min)) + end + + def calculate_file(user) + file_count = user.file_commit.count + issue_count = Issue.where('author_id = ?', user.id).count + return (file_count + issue_count) + end + + def calculate_issue(user) + commit_count = user.changesets.count + + issue_details_count = 0 + issues = Issue.where('assigned_to_id = ?', user.id) + + issues.each do |issue| + change_count = issue.journals.where("prop_key = ?", "done_ratio").count + issue_details_count = change_count + issue_details_count + end + + return (commit_count + issue_details_count) + + end + + def calculate_user_score(user) + collaboration = calculate_collaboration_count(user) + influence = calculate_influence_count(user) + skill = calculate_skill_count(user) + activity = calculate_activity_count(user) + file = calculate_file(user) + issue = calculate_issue(user) + level = calculate_level(user) + user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, + :activity => activity, :file => file, :issue => issue, :level => level) + end + + def update_user_score(user) + collaboration = calculate_collaboration_count(user) + influence = calculate_influence_count(user) + skill = calculate_skill_count(user) + activity = calculate_activity_count(user) + file = calculate_file(user) + issue = calculate_issue(user) + level = calculate_level(user) + user.user_score.update_attributes(:collaboration => collaboration, :influence => influence, :skill => skill, + :activity => activity, :file => file, :issue => issue, :level => level) + end + +end diff --git a/app/models/user.rb b/app/models/user.rb index 674e774d0..5d8413009 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -90,6 +90,7 @@ class User < Principal has_many :students_for_courses has_many :courses, :through => :students_for_courses, :source => :project has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy + has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_tpye = 'Project' or container_type = 'Version'" #### # added by bai has_many :join_in_contests, :dependent => :destroy @@ -98,6 +99,7 @@ class User < Principal has_many :wiki_contents, :foreign_key => 'author_id' has_many :journals has_many :messages, :foreign_key => 'author_id' + has_one :user_socre, :dependent => :destroy # end ######added by nie diff --git a/app/models/user_scores.rb b/app/models/user_scores.rb new file mode 100644 index 000000000..c939a20ff --- /dev/null +++ b/app/models/user_scores.rb @@ -0,0 +1,36 @@ +# Redmine - project management software +# Copyright (C) 2006-2013 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class UserScore < ActiveRecord::Base + belongs_to :user + + def self.find_max_file + self.maximum(:file) + end + + def self.find_min_file + self.minimum(:file) + end + + def self.find_max_issue + self.maximum(:issue) + end + + def self.find_min_issue + self.minimum(:file) + end +end diff --git a/db/migrate/20140410021724_create_user_score.rb b/db/migrate/20140410021724_create_user_score.rb new file mode 100644 index 000000000..0c1d0e2e4 --- /dev/null +++ b/db/migrate/20140410021724_create_user_score.rb @@ -0,0 +1,13 @@ +class CreateUserScore < ActiveRecord::Migration + def change + create_table :user_scores do |t| + t.integer :user_id, :null => false + t.integer :collaboration + t.integer :influence + t.integer :skill + t.integer :active + + t.timestamps + end + end +end diff --git a/db/migrate/20140413022725_add_filed_to_user_preference.rb b/db/migrate/20140413022725_add_filed_to_user_preference.rb new file mode 100644 index 000000000..5e8d41ae6 --- /dev/null +++ b/db/migrate/20140413022725_add_filed_to_user_preference.rb @@ -0,0 +1,7 @@ +class AddFiledToUserPreference < ActiveRecord::Migration + def change + add_column :user_scores, :level, :integer + add_column :user_scores, :file, :integer + add_column :user_scores, :issue, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 9584fa817..a7e2244d2 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 => 20140320022724) do +ActiveRecord::Schema.define(:version => 20140413022725) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -23,6 +23,15 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" add_index "activities", ["user_id"], :name => "index_activities_on_user_id" + create_table "apply_project_masters", :force => true do |t| + t.integer "user_id" + t.string "apply_type" + t.integer "apply_id" + t.integer "status" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "attachments", :force => true do |t| t.integer "container_id" t.string "container_type", :limit => 30 @@ -62,6 +71,20 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" + create_table "bak_mentioned", :primary_key => "Id", :force => true do |t| + t.string "this_real_name", :limit => 1000 + t.integer "is_mentioned_in" + t.string "context", :limit => 2000 + end + + add_index "bak_mentioned", ["this_real_name", "is_mentioned_in"], :name => "name_mention", :length => {"this_real_name"=>900, "is_mentioned_in"=>nil} + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name" + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_2" + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_3", :length => {"this_real_name"=>900} + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_4" + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_5" + add_index "bak_mentioned", ["this_real_name"], :name => "this_real_name_6" + create_table "biding_projects", :force => true do |t| t.integer "project_id" t.integer "bid_id" @@ -101,6 +124,11 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" add_index "boards", ["project_id"], :name => "boards_project_id" + create_table "categories", :primary_key => "Id", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "proj_categories" + end + create_table "changes", :force => true do |t| t.integer "changeset_id", :null => false t.string "action", :limit => 1, :default => "", :null => false @@ -233,6 +261,14 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "documents", ["created_on"], :name => "index_documents_on_created_on" add_index "documents", ["project_id"], :name => "documents_project_id" + create_table "eco_projects", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.integer "eco_proj_id" + t.datetime "date_collected" + end + + add_index "eco_projects", ["proj_id"], :name => "proj_id" + create_table "enabled_modules", :force => true do |t| t.integer "project_id" t.string "name", :null => false @@ -254,6 +290,137 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" + create_table "events", :primary_key => "event_id", :force => true do |t| + t.string "job_name" + t.datetime "event_time" + t.string "event_type", :limit => 20 + end + + create_table "fm_article", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "article_title", :limit => 16777215 + t.text "article_link", :limit => 16777215 + t.text "article_time", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_article", ["proj_id"], :name => "proj_id" + + create_table "fm_bugtracker_link", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_bugtracker_link", ["proj_id"], :name => "proj_id" + + create_table "fm_datametric_link", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_datametric_link", ["proj_id"], :name => "proj_id" + + create_table "fm_dependency_link", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_dependency_link", ["proj_id"], :name => "proj_id" + + create_table "fm_download_link", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "download_link", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_download_link", ["proj_id"], :name => "proj_id" + + create_table "fm_heartbeat", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.float "popularity_score", :limit => 12 + t.float "vitality_score", :limit => 12 + t.integer "subscription" + t.integer "voting_score" + t.integer "voting_count" + t.datetime "date_collected" + end + + add_index "fm_heartbeat", ["proj_id"], :name => "proj_id" + + create_table "fm_license", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_license", ["proj_id"], :name => "proj_id" + + create_table "fm_mailinglist_link", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_mailinglist_link", ["proj_id"], :name => "proj_id" + + create_table "fm_operating_system", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_operating_system", ["proj_id"], :name => "proj_id" + + create_table "fm_programming_language", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_programming_language", ["proj_id"], :name => "proj_id" + + create_table "fm_project_spotlight", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.text "project_name", :limit => 16777215 + t.text "project_spotlight_link", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_project_spotlight", ["proj_id"], :name => "proj_id" + + create_table "fm_release", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.text "release_version", :limit => 16777215 + t.text "release_time", :limit => 16777215 + t.text "release_tag", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_release", ["proj_id"], :name => "proj_id" + + create_table "fm_submit", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "submitter", :limit => 16777215 + t.text "submitter_link", :limit => 16777215 + t.text "submit_time", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_submit", ["proj_id"], :name => "proj_id" + + create_table "fm_summary", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.text "description", :limit => 16777215 + t.datetime "date_collected" + end + + add_index "fm_summary", ["proj_id"], :name => "proj_id" + create_table "forums", :force => true do |t| t.string "name", :null => false t.string "description", :default => "" @@ -479,6 +646,22 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "news", ["created_on"], :name => "index_news_on_created_on" add_index "news", ["project_id"], :name => "news_project_id" + create_table "no_uses", :force => true do |t| + t.integer "user_id", :null => false + t.string "no_use_type" + t.integer "no_use_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "ohloh_tagged", :force => true do |t| + t.integer "proj_id", :default => 0, :null => false + t.string "description", :limit => 100, :null => false + t.datetime "date_collected" + end + + add_index "ohloh_tagged", ["proj_id"], :name => "proj_id" + create_table "open_id_authentication_associations", :force => true do |t| t.integer "issued" t.integer "lifetime" @@ -494,6 +677,19 @@ ActiveRecord::Schema.define(:version => 20140320022724) do t.string "salt", :null => false end + create_table "open_source_projects", :force => true do |t| + t.string "name" + t.text "description" + t.integer "commit_count", :default => 0 + t.integer "code_line", :default => 0 + t.integer "users_count", :default => 0 + t.date "last_commit_time" + t.string "url" + t.date "date_collected" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "praise_tread_caches", :force => true do |t| t.integer "object_id", :null => false t.string "object_type" @@ -573,6 +769,23 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "queries", ["project_id"], :name => "index_queries_on_project_id" add_index "queries", ["user_id"], :name => "index_queries_on_user_id" + create_table "relative_memos", :force => true do |t| + t.integer "osp_id", :null => false + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :null => false + t.integer "author_id" + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.boolean "is_quote", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count_crawl", :default => 0 + t.integer "viewed_count_local", :default => 0 + end + create_table "repositories", :force => true do |t| t.integer "project_id", :default => 0, :null => false t.string "url", :default => "", :null => false @@ -599,10 +812,8 @@ ActiveRecord::Schema.define(:version => 20140320022724) do end create_table "schools", :force => true do |t| - t.string "name" - t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.string "name" + t.string "province" end create_table "seems_rateable_cached_ratings", :force => true do |t| @@ -710,6 +921,22 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" add_index "tokens", ["value"], :name => "tokens_value", :unique => true + create_table "tprojects", :force => true do |t| + t.string "name", :limit => 1000, :default => "0" + t.text "description", :limit => 16777215 + t.string "commit_count", :limit => 100, :default => "0" + t.string "code_line", :limit => 100 + t.string "last_commit_time", :limit => 100 + t.string "url", :limit => 1000 + t.datetime "date_collected" + t.string "created_at", :limit => 100 + t.string "updated_at", :limit => 100 + t.integer "proj_id", :null => false + t.string "user_count", :limit => 100 + end + + add_index "tprojects", ["proj_id"], :name => "proj_id" + create_table "trackers", :force => true do |t| t.string "name", :limit => 30, :default => "", :null => false t.boolean "is_in_chlog", :default => false, :null => false @@ -758,6 +985,19 @@ ActiveRecord::Schema.define(:version => 20140320022724) do add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + create_table "user_scores", :force => true do |t| + t.integer "user_id", :null => false + t.integer "collaboration" + t.integer "influence" + t.integer "skill" + t.integer "active" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "level" + t.integer "file" + t.integer "issue" + end + create_table "user_statuses", :force => true do |t| t.integer "changesets_count" t.integer "watchers_count" diff --git a/db/schema.rb.BASE.rb b/db/schema.rb.BASE.rb new file mode 100644 index 000000000..2bda4fcc1 --- /dev/null +++ b/db/schema.rb.BASE.rb @@ -0,0 +1,887 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20131224021723) do + + create_table "activities", :force => true do |t| + t.integer "act_id", :null => false + t.string "act_type", :null => false + t.integer "user_id", :null => false + end + + add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" + add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" + add_index "activities", ["user_id"], :name => "index_activities_on_user_id" + + create_table "attachments", :force => true do |t| + t.integer "container_id" + t.string "container_type", :limit => 30 + t.string "filename", :default => "", :null => false + t.string "disk_filename", :default => "", :null => false + t.integer "filesize", :default => 0, :null => false + t.string "content_type", :default => "" + t.string "digest", :limit => 40, :default => "", :null => false + t.integer "downloads", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.string "description" + t.string "disk_directory" + end + + add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" + add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" + add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" + + create_table "auth_sources", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 60, :default => "", :null => false + t.string "host", :limit => 60 + t.integer "port" + t.string "account" + t.string "account_password", :default => "" + t.string "base_dn" + t.string "attr_login", :limit => 30 + t.string "attr_firstname", :limit => 30 + t.string "attr_lastname", :limit => 30 + t.string "attr_mail", :limit => 30 + t.boolean "onthefly_register", :default => false, :null => false + t.boolean "tls", :default => false, :null => false + t.string "filter" + t.integer "timeout" + end + + add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" + + create_table "biding_projects", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "bids", :force => true do |t| + t.string "name" + t.string "budget", :null => false + t.integer "author_id" + t.date "deadline" + t.string "description" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.integer "commit" + t.integer "reward_type" + t.integer "homework_type" + t.integer "parent_id" + t.string "password" + end + + create_table "boards", :force => true do |t| + t.integer "project_id", :null => false + t.string "name", :default => "", :null => false + t.string "description" + t.integer "position", :default => 1 + t.integer "topics_count", :default => 0, :null => false + t.integer "messages_count", :default => 0, :null => false + t.integer "last_message_id" + t.integer "parent_id" + end + + add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" + add_index "boards", ["project_id"], :name => "boards_project_id" + + create_table "changes", :force => true do |t| + t.integer "changeset_id", :null => false + t.string "action", :limit => 1, :default => "", :null => false + t.text "path", :null => false + t.text "from_path" + t.string "from_revision" + t.string "revision" + t.string "branch" + end + + add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" + + create_table "changeset_parents", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "parent_id", :null => false + end + + add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" + add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" + + create_table "changesets", :force => true do |t| + t.integer "repository_id", :null => false + t.string "revision", :null => false + t.string "committer" + t.datetime "committed_on", :null => false + t.text "comments" + t.date "commit_date" + t.string "scmid" + t.integer "user_id" + end + + add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" + add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true + add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" + add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" + add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" + + create_table "changesets_issues", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "issue_id", :null => false + end + + add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true + + create_table "comments", :force => true do |t| + t.string "commented_type", :limit => 30, :default => "", :null => false + t.integer "commented_id", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.text "comments" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "comments", ["author_id"], :name => "index_comments_on_author_id" + add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" + + create_table "courses", :force => true do |t| + t.integer "tea_id" + t.string "name" + t.integer "state" + t.string "code" + t.integer "time" + t.string "extra" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "location" + t.string "term" + t.string "string" + t.string "password" + t.string "setup_time" + t.string "endup_time" + t.string "class_period" + end + + create_table "custom_fields", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.string "field_format", :limit => 30, :default => "", :null => false + t.text "possible_values" + t.string "regexp", :default => "" + t.integer "min_length", :default => 0, :null => false + t.integer "max_length", :default => 0, :null => false + t.boolean "is_required", :default => false, :null => false + t.boolean "is_for_all", :default => false, :null => false + t.boolean "is_filter", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "searchable", :default => false + t.text "default_value" + t.boolean "editable", :default => true + t.boolean "visible", :default => true, :null => false + t.boolean "multiple", :default => false + end + + add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + end + + add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true + + create_table "custom_fields_trackers", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true + + create_table "custom_values", :force => true do |t| + t.string "customized_type", :limit => 30, :default => "", :null => false + t.integer "customized_id", :default => 0, :null => false + t.integer "custom_field_id", :default => 0, :null => false + t.text "value" + end + + add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" + add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" + + create_table "documents", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "category_id", :default => 0, :null => false + t.string "title", :limit => 60, :default => "", :null => false + t.text "description" + t.datetime "created_on" + end + + add_index "documents", ["category_id"], :name => "index_documents_on_category_id" + add_index "documents", ["created_on"], :name => "index_documents_on_created_on" + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "enabled_modules", :force => true do |t| + t.integer "project_id" + t.string "name", :null => false + end + + add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" + + create_table "enumerations", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "is_default", :default => false, :null => false + t.string "type" + t.boolean "active", :default => true, :null => false + t.integer "project_id" + t.integer "parent_id" + t.string "position_name", :limit => 30 + end + + add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" + add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" + + create_table "forums", :force => true do |t| + t.string "name", :null => false + t.string "description", :default => "" + t.integer "topic_count", :default => 0 + t.integer "memo_count", :default => 0 + t.integer "last_memo_id", :default => 0 + t.integer "creator_id", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "groups_users", :id => false, :force => true do |t| + t.integer "group_id", :null => false + t.integer "user_id", :null => false + end + + add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true + + create_table "homework_attaches", :force => true do |t| + t.integer "bid_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "homework_for_courses", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + end + + create_table "issue_categories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.integer "assigned_to_id" + end + + add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_relations", :force => true do |t| + t.integer "issue_from_id", :null => false + t.integer "issue_to_id", :null => false + t.string "relation_type", :default => "", :null => false + t.integer "delay" + end + + add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true + add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" + add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" + + create_table "issue_statuses", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_closed", :default => false, :null => false + t.boolean "is_default", :default => false, :null => false + t.integer "position", :default => 1 + t.integer "default_done_ratio" + end + + add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" + add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" + add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" + + create_table "issues", :force => true do |t| + t.integer "tracker_id", :null => false + t.integer "project_id", :null => false + t.string "subject", :default => "", :null => false + t.text "description" + t.date "due_date" + t.integer "category_id" + t.integer "status_id", :null => false + t.integer "assigned_to_id" + t.integer "priority_id", :null => false + t.integer "fixed_version_id" + t.integer "author_id", :null => false + t.integer "lock_version", :default => 0, :null => false + t.datetime "created_on" + t.datetime "updated_on" + t.date "start_date" + t.integer "done_ratio", :default => 0, :null => false + t.float "estimated_hours" + t.integer "parent_id" + t.integer "root_id" + t.integer "lft" + t.integer "rgt" + t.boolean "is_private", :default => false, :null => false + t.datetime "closed_on" + end + + add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" + add_index "issues", ["author_id"], :name => "index_issues_on_author_id" + add_index "issues", ["category_id"], :name => "index_issues_on_category_id" + add_index "issues", ["created_on"], :name => "index_issues_on_created_on" + add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" + add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" + add_index "issues", ["project_id"], :name => "issues_project_id" + add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" + add_index "issues", ["status_id"], :name => "index_issues_on_status_id" + add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" + + create_table "join_in_contests", :force => true do |t| + t.integer "user_id" + t.integer "bid_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "journal_details", :force => true do |t| + t.integer "journal_id", :default => 0, :null => false + t.string "property", :limit => 30, :default => "", :null => false + t.string "prop_key", :limit => 30, :default => "", :null => false + t.text "old_value" + t.text "value" + end + + add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + + create_table "journal_replies", :id => false, :force => true do |t| + t.integer "journal_id" + t.integer "user_id" + t.integer "reply_id" + end + + add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" + add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" + add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" + + create_table "journals", :force => true do |t| + t.integer "journalized_id", :default => 0, :null => false + t.string "journalized_type", :limit => 30, :default => "", :null => false + t.integer "user_id", :default => 0, :null => false + t.text "notes" + t.datetime "created_on", :null => false + t.boolean "private_notes", :default => false, :null => false + end + + add_index "journals", ["created_on"], :name => "index_journals_on_created_on" + add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" + add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" + add_index "journals", ["user_id"], :name => "index_journals_on_user_id" + + create_table "journals_for_messages", :force => true do |t| + t.integer "jour_id" + t.string "jour_type" + t.integer "user_id" + t.text "notes" + t.integer "status" + t.integer "reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.string "m_parent_id" + t.boolean "is_readed" + t.integer "m_reply_count" + t.integer "m_reply_id" + end + + create_table "member_roles", :force => true do |t| + t.integer "member_id", :null => false + t.integer "role_id", :null => false + t.integer "inherited_from" + end + + add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" + add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" + + create_table "members", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + t.datetime "created_on" + t.boolean "mail_notification", :default => false, :null => false + end + + add_index "members", ["project_id"], :name => "index_members_on_project_id" + add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true + add_index "members", ["user_id"], :name => "index_members_on_user_id" + + create_table "memos", :force => true do |t| + t.integer "forum_id", :null => false + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :null => false + t.integer "author_id", :null => false + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count", :default => 0 + end + + create_table "messages", :force => true do |t| + t.integer "board_id", :null => false + t.integer "parent_id" + t.string "subject", :default => "", :null => false + t.text "content" + t.integer "author_id" + t.integer "replies_count", :default => 0, :null => false + t.integer "last_reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + end + + add_index "messages", ["author_id"], :name => "index_messages_on_author_id" + add_index "messages", ["board_id"], :name => "messages_board_id" + add_index "messages", ["created_on"], :name => "index_messages_on_created_on" + add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" + add_index "messages", ["parent_id"], :name => "messages_parent_id" + + create_table "news", :force => true do |t| + t.integer "project_id" + t.string "title", :limit => 60, :default => "", :null => false + t.string "summary", :default => "" + t.text "description" + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.integer "comments_count", :default => 0, :null => false + end + + add_index "news", ["author_id"], :name => "index_news_on_author_id" + add_index "news", ["created_on"], :name => "index_news_on_created_on" + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "open_id_authentication_associations", :force => true do |t| + t.integer "issued" + t.integer "lifetime" + t.string "handle" + t.string "assoc_type" + t.binary "server_url" + t.binary "secret" + end + + create_table "open_id_authentication_nonces", :force => true do |t| + t.integer "timestamp", :null => false + t.string "server_url" + t.string "salt", :null => false + end + + create_table "praise_tread_caches", :force => true do |t| + t.integer "object_id", :null => false + t.string "object_type" + t.integer "praise_num" + t.integer "tread_num" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "praise_treads", :force => true do |t| + t.integer "user_id", :null => false + t.integer "praise_tread_object_id" + t.string "praise_tread_object_type" + t.integer "praise_or_tread" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_infos", :force => true do |t| + t.integer "project_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "project_id" + t.integer "project_type" + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 + end + + add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" + + create_table "projects", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "description" + t.string "homepage", :default => "" + t.boolean "is_public", :default => true, :null => false + t.integer "parent_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "identifier" + t.integer "status", :default => 1, :null => false + t.integer "lft" + t.integer "rgt" + t.boolean "inherit_members", :default => false, :null => false + t.integer "project_type" + t.boolean "hidden_repo", :default => false, :null => false + end + + add_index "projects", ["lft"], :name => "index_projects_on_lft" + add_index "projects", ["rgt"], :name => "index_projects_on_rgt" + + create_table "projects_trackers", :id => false, :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true + add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + + create_table "queries", :force => true do |t| + t.integer "project_id" + t.string "name", :default => "", :null => false + t.text "filters" + t.integer "user_id", :default => 0, :null => false + t.boolean "is_public", :default => false, :null => false + t.text "column_names" + t.text "sort_criteria" + t.string "group_by" + t.string "type" + end + + add_index "queries", ["project_id"], :name => "index_queries_on_project_id" + add_index "queries", ["user_id"], :name => "index_queries_on_user_id" + + create_table "repositories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "url", :default => "", :null => false + t.string "login", :limit => 60, :default => "" + t.string "password", :default => "" + t.string "root_url", :default => "" + t.string "type" + t.string "path_encoding", :limit => 64 + t.string "log_encoding", :limit => 64 + t.text "extra_info" + t.string "identifier" + t.boolean "is_default", :default => false + end + + add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" + + create_table "roles", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "assignable", :default => true + t.integer "builtin", :default => 0, :null => false + t.text "permissions" + t.string "issues_visibility", :limit => 30, :default => "default", :null => false + end + + create_table "seems_rateable_cached_ratings", :force => true do |t| + t.integer "cacheable_id", :limit => 8 + t.string "cacheable_type" + t.float "avg", :null => false + t.integer "cnt", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_rates", :force => true do |t| + t.integer "rater_id", :limit => 8 + t.integer "rateable_id" + t.string "rateable_type" + t.float "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "settings", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "value" + t.datetime "updated_on" + end + + add_index "settings", ["name"], :name => "index_settings_on_name" + + create_table "shares", :force => true do |t| + t.date "created_on" + t.string "url" + t.string "title" + t.integer "share_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "project_id" + t.integer "user_id" + t.string "description" + end + + create_table "students_for_courses", :force => true do |t| + t.integer "student_id" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "taggings", :force => true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", :limit => 128 + t.datetime "created_at" + end + + add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" + add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" + + create_table "tags", :force => true do |t| + t.string "name" + end + + create_table "teachers", :force => true do |t| + t.string "tea_name" + t.string "location" + t.integer "couurse_time" + t.integer "course_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "extra" + end + + create_table "time_entries", :force => true do |t| + t.integer "project_id", :null => false + t.integer "user_id", :null => false + t.integer "issue_id" + t.float "hours", :null => false + t.string "comments" + t.integer "activity_id", :null => false + t.date "spent_on", :null => false + t.integer "tyear", :null => false + t.integer "tmonth", :null => false + t.integer "tweek", :null => false + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" + add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" + add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" + add_index "time_entries", ["project_id"], :name => "time_entries_project_id" + add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" + + create_table "tokens", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.string "action", :limit => 30, :default => "", :null => false + t.string "value", :limit => 40, :default => "", :null => false + t.datetime "created_on", :null => false + end + + add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" + add_index "tokens", ["value"], :name => "tokens_value", :unique => true + + create_table "trackers", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_in_chlog", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "is_in_roadmap", :default => true, :null => false + t.integer "fields_bits", :default => 0 + end + + create_table "user_extensions", :force => true do |t| + t.integer "user_id", :null => false + t.date "birthday" + t.string "brief_introduction" + t.integer "gender" + t.string "location" + t.string "occupation" + t.integer "work_experience" + t.integer "zip_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "technical_title" + t.integer "identity" + t.string "student_id" + t.string "teacher_realname" + t.string "student_realname" + t.string "location_city" + end + + create_table "user_grades", :force => true do |t| + t.integer "user_id", :null => false + t.integer "project_id", :null => false + t.float "grade", :default => 0.0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" + add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" + add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" + + create_table "user_preferences", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.text "others" + t.boolean "hide_mail", :default => false + t.string "time_zone" + end + + add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + + create_table "user_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "grade", :default => 0.0 + end + + add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" + add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" + add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" + + create_table "users", :force => true do |t| + t.string "login", :default => "", :null => false + t.string "hashed_password", :limit => 40, :default => "", :null => false + t.string "firstname", :limit => 30, :default => "", :null => false + t.string "lastname", :default => "", :null => false + t.string "mail", :limit => 60, :default => "", :null => false + t.boolean "admin", :default => false, :null => false + t.integer "status", :default => 1, :null => false + t.datetime "last_login_on" + t.string "language", :limit => 5, :default => "" + t.integer "auth_source_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "type" + t.string "identity_url" + t.string "mail_notification", :default => "", :null => false + t.string "salt", :limit => 64 + end + + add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" + add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" + add_index "users", ["type"], :name => "index_users_on_type" + + create_table "versions", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :default => "", :null => false + t.string "description", :default => "" + t.date "effective_date" + t.datetime "created_on" + t.datetime "updated_on" + t.string "wiki_page_title" + t.string "status", :default => "open" + t.string "sharing", :default => "none", :null => false + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + add_index "versions", ["sharing"], :name => "index_versions_on_sharing" + + create_table "watchers", :force => true do |t| + t.string "watchable_type", :default => "", :null => false + t.integer "watchable_id", :default => 0, :null => false + t.integer "user_id" + end + + add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" + add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" + add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" + + create_table "wiki_content_versions", :force => true do |t| + t.integer "wiki_content_id", :null => false + t.integer "page_id", :null => false + t.integer "author_id" + t.binary "data", :limit => 2147483647 + t.string "compression", :limit => 6, :default => "" + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" + add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" + + create_table "wiki_contents", :force => true do |t| + t.integer "page_id", :null => false + t.integer "author_id" + t.text "text", :limit => 2147483647 + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" + add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" + + create_table "wiki_pages", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title", :null => false + t.datetime "created_on", :null => false + t.boolean "protected", :default => false, :null => false + t.integer "parent_id" + end + + add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" + add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" + add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" + + create_table "wiki_redirects", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title" + t.string "redirects_to" + t.datetime "created_on", :null => false + end + + add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" + add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" + + create_table "wikis", :force => true do |t| + t.integer "project_id", :null => false + t.string "start_page", :null => false + t.integer "status", :default => 1, :null => false + end + + add_index "wikis", ["project_id"], :name => "wikis_project_id" + + create_table "workflows", :force => true do |t| + t.integer "tracker_id", :default => 0, :null => false + t.integer "old_status_id", :default => 0, :null => false + t.integer "new_status_id", :default => 0, :null => false + t.integer "role_id", :default => 0, :null => false + t.boolean "assignee", :default => false, :null => false + t.boolean "author", :default => false, :null => false + t.string "type", :limit => 30 + t.string "field_name", :limit => 30 + t.string "rule", :limit => 30 + end + + add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" + add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" + add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" + add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" + +end diff --git a/db/schema.rb.LOCAL.rb b/db/schema.rb.LOCAL.rb new file mode 100644 index 000000000..9584fa817 --- /dev/null +++ b/db/schema.rb.LOCAL.rb @@ -0,0 +1,895 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140320022724) do + + create_table "activities", :force => true do |t| + t.integer "act_id", :null => false + t.string "act_type", :null => false + t.integer "user_id", :null => false + end + + add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" + add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" + add_index "activities", ["user_id"], :name => "index_activities_on_user_id" + + create_table "attachments", :force => true do |t| + t.integer "container_id" + t.string "container_type", :limit => 30 + t.string "filename", :default => "", :null => false + t.string "disk_filename", :default => "", :null => false + t.integer "filesize", :default => 0, :null => false + t.string "content_type", :default => "" + t.string "digest", :limit => 40, :default => "", :null => false + t.integer "downloads", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.string "description" + t.string "disk_directory" + end + + add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" + add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" + add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" + + create_table "auth_sources", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 60, :default => "", :null => false + t.string "host", :limit => 60 + t.integer "port" + t.string "account" + t.string "account_password", :default => "" + t.string "base_dn" + t.string "attr_login", :limit => 30 + t.string "attr_firstname", :limit => 30 + t.string "attr_lastname", :limit => 30 + t.string "attr_mail", :limit => 30 + t.boolean "onthefly_register", :default => false, :null => false + t.boolean "tls", :default => false, :null => false + t.string "filter" + t.integer "timeout" + end + + add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" + + create_table "biding_projects", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "bids", :force => true do |t| + t.string "name" + t.string "budget", :null => false + t.integer "author_id" + t.date "deadline" + t.string "description" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.integer "commit" + t.integer "reward_type" + t.integer "homework_type" + t.integer "parent_id" + t.string "password" + end + + create_table "boards", :force => true do |t| + t.integer "project_id", :null => false + t.string "name", :default => "", :null => false + t.string "description" + t.integer "position", :default => 1 + t.integer "topics_count", :default => 0, :null => false + t.integer "messages_count", :default => 0, :null => false + t.integer "last_message_id" + t.integer "parent_id" + end + + add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" + add_index "boards", ["project_id"], :name => "boards_project_id" + + create_table "changes", :force => true do |t| + t.integer "changeset_id", :null => false + t.string "action", :limit => 1, :default => "", :null => false + t.text "path", :null => false + t.text "from_path" + t.string "from_revision" + t.string "revision" + t.string "branch" + end + + add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" + + create_table "changeset_parents", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "parent_id", :null => false + end + + add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" + add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" + + create_table "changesets", :force => true do |t| + t.integer "repository_id", :null => false + t.string "revision", :null => false + t.string "committer" + t.datetime "committed_on", :null => false + t.text "comments" + t.date "commit_date" + t.string "scmid" + t.integer "user_id" + end + + add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" + add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true + add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" + add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" + add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" + + create_table "changesets_issues", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "issue_id", :null => false + end + + add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true + + create_table "comments", :force => true do |t| + t.string "commented_type", :limit => 30, :default => "", :null => false + t.integer "commented_id", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.text "comments" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "comments", ["author_id"], :name => "index_comments_on_author_id" + add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" + + create_table "courses", :force => true do |t| + t.integer "tea_id" + t.string "name" + t.integer "state" + t.string "code" + t.integer "time" + t.string "extra" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "location" + t.string "term" + t.string "string" + t.string "password" + t.string "setup_time" + t.string "endup_time" + t.string "class_period" + t.integer "school_id" + end + + create_table "custom_fields", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.string "field_format", :limit => 30, :default => "", :null => false + t.text "possible_values" + t.string "regexp", :default => "" + t.integer "min_length", :default => 0, :null => false + t.integer "max_length", :default => 0, :null => false + t.boolean "is_required", :default => false, :null => false + t.boolean "is_for_all", :default => false, :null => false + t.boolean "is_filter", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "searchable", :default => false + t.text "default_value" + t.boolean "editable", :default => true + t.boolean "visible", :default => true, :null => false + t.boolean "multiple", :default => false + end + + add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + end + + add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true + + create_table "custom_fields_trackers", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true + + create_table "custom_values", :force => true do |t| + t.string "customized_type", :limit => 30, :default => "", :null => false + t.integer "customized_id", :default => 0, :null => false + t.integer "custom_field_id", :default => 0, :null => false + t.text "value" + end + + add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" + add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" + + create_table "documents", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "category_id", :default => 0, :null => false + t.string "title", :limit => 60, :default => "", :null => false + t.text "description" + t.datetime "created_on" + end + + add_index "documents", ["category_id"], :name => "index_documents_on_category_id" + add_index "documents", ["created_on"], :name => "index_documents_on_created_on" + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "enabled_modules", :force => true do |t| + t.integer "project_id" + t.string "name", :null => false + end + + add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" + + create_table "enumerations", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "is_default", :default => false, :null => false + t.string "type" + t.boolean "active", :default => true, :null => false + t.integer "project_id" + t.integer "parent_id" + t.string "position_name", :limit => 30 + end + + add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" + add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" + + create_table "forums", :force => true do |t| + t.string "name", :null => false + t.string "description", :default => "" + t.integer "topic_count", :default => 0 + t.integer "memo_count", :default => 0 + t.integer "last_memo_id", :default => 0 + t.integer "creator_id", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "groups_users", :id => false, :force => true do |t| + t.integer "group_id", :null => false + t.integer "user_id", :null => false + end + + add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true + + create_table "homework_attaches", :force => true do |t| + t.integer "bid_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "homework_for_courses", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + end + + create_table "issue_categories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.integer "assigned_to_id" + end + + add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_relations", :force => true do |t| + t.integer "issue_from_id", :null => false + t.integer "issue_to_id", :null => false + t.string "relation_type", :default => "", :null => false + t.integer "delay" + end + + add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true + add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" + add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" + + create_table "issue_statuses", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_closed", :default => false, :null => false + t.boolean "is_default", :default => false, :null => false + t.integer "position", :default => 1 + t.integer "default_done_ratio" + end + + add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" + add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" + add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" + + create_table "issues", :force => true do |t| + t.integer "tracker_id", :null => false + t.integer "project_id", :null => false + t.string "subject", :default => "", :null => false + t.text "description" + t.date "due_date" + t.integer "category_id" + t.integer "status_id", :null => false + t.integer "assigned_to_id" + t.integer "priority_id", :null => false + t.integer "fixed_version_id" + t.integer "author_id", :null => false + t.integer "lock_version", :default => 0, :null => false + t.datetime "created_on" + t.datetime "updated_on" + t.date "start_date" + t.integer "done_ratio", :default => 0, :null => false + t.float "estimated_hours" + t.integer "parent_id" + t.integer "root_id" + t.integer "lft" + t.integer "rgt" + t.boolean "is_private", :default => false, :null => false + t.datetime "closed_on" + end + + add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" + add_index "issues", ["author_id"], :name => "index_issues_on_author_id" + add_index "issues", ["category_id"], :name => "index_issues_on_category_id" + add_index "issues", ["created_on"], :name => "index_issues_on_created_on" + add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" + add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" + add_index "issues", ["project_id"], :name => "issues_project_id" + add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" + add_index "issues", ["status_id"], :name => "index_issues_on_status_id" + add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" + + create_table "join_in_contests", :force => true do |t| + t.integer "user_id" + t.integer "bid_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "journal_details", :force => true do |t| + t.integer "journal_id", :default => 0, :null => false + t.string "property", :limit => 30, :default => "", :null => false + t.string "prop_key", :limit => 30, :default => "", :null => false + t.text "old_value" + t.text "value" + end + + add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + + create_table "journal_replies", :id => false, :force => true do |t| + t.integer "journal_id" + t.integer "user_id" + t.integer "reply_id" + end + + add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" + add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" + add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" + + create_table "journals", :force => true do |t| + t.integer "journalized_id", :default => 0, :null => false + t.string "journalized_type", :limit => 30, :default => "", :null => false + t.integer "user_id", :default => 0, :null => false + t.text "notes" + t.datetime "created_on", :null => false + t.boolean "private_notes", :default => false, :null => false + end + + add_index "journals", ["created_on"], :name => "index_journals_on_created_on" + add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" + add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" + add_index "journals", ["user_id"], :name => "index_journals_on_user_id" + + create_table "journals_for_messages", :force => true do |t| + t.integer "jour_id" + t.string "jour_type" + t.integer "user_id" + t.text "notes" + t.integer "status" + t.integer "reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.string "m_parent_id" + t.boolean "is_readed" + t.integer "m_reply_count" + t.integer "m_reply_id" + end + + create_table "member_roles", :force => true do |t| + t.integer "member_id", :null => false + t.integer "role_id", :null => false + t.integer "inherited_from" + end + + add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" + add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" + + create_table "members", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + t.datetime "created_on" + t.boolean "mail_notification", :default => false, :null => false + end + + add_index "members", ["project_id"], :name => "index_members_on_project_id" + add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true + add_index "members", ["user_id"], :name => "index_members_on_user_id" + + create_table "memos", :force => true do |t| + t.integer "forum_id", :null => false + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :null => false + t.integer "author_id", :null => false + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count", :default => 0 + end + + create_table "messages", :force => true do |t| + t.integer "board_id", :null => false + t.integer "parent_id" + t.string "subject", :default => "", :null => false + t.text "content" + t.integer "author_id" + t.integer "replies_count", :default => 0, :null => false + t.integer "last_reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + end + + add_index "messages", ["author_id"], :name => "index_messages_on_author_id" + add_index "messages", ["board_id"], :name => "messages_board_id" + add_index "messages", ["created_on"], :name => "index_messages_on_created_on" + add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" + add_index "messages", ["parent_id"], :name => "messages_parent_id" + + create_table "news", :force => true do |t| + t.integer "project_id" + t.string "title", :limit => 60, :default => "", :null => false + t.string "summary", :default => "" + t.text "description" + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.integer "comments_count", :default => 0, :null => false + end + + add_index "news", ["author_id"], :name => "index_news_on_author_id" + add_index "news", ["created_on"], :name => "index_news_on_created_on" + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "open_id_authentication_associations", :force => true do |t| + t.integer "issued" + t.integer "lifetime" + t.string "handle" + t.string "assoc_type" + t.binary "server_url" + t.binary "secret" + end + + create_table "open_id_authentication_nonces", :force => true do |t| + t.integer "timestamp", :null => false + t.string "server_url" + t.string "salt", :null => false + end + + create_table "praise_tread_caches", :force => true do |t| + t.integer "object_id", :null => false + t.string "object_type" + t.integer "praise_num" + t.integer "tread_num" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "praise_treads", :force => true do |t| + t.integer "user_id", :null => false + t.integer "praise_tread_object_id" + t.string "praise_tread_object_type" + t.integer "praise_or_tread" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_infos", :force => true do |t| + t.integer "project_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "project_id" + t.integer "project_type" + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 + end + + add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" + + create_table "projects", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "description" + t.string "homepage", :default => "" + t.boolean "is_public", :default => true, :null => false + t.integer "parent_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "identifier" + t.integer "status", :default => 1, :null => false + t.integer "lft" + t.integer "rgt" + t.boolean "inherit_members", :default => false, :null => false + t.integer "project_type" + t.boolean "hidden_repo", :default => false, :null => false + end + + add_index "projects", ["lft"], :name => "index_projects_on_lft" + add_index "projects", ["rgt"], :name => "index_projects_on_rgt" + + create_table "projects_trackers", :id => false, :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true + add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + + create_table "queries", :force => true do |t| + t.integer "project_id" + t.string "name", :default => "", :null => false + t.text "filters" + t.integer "user_id", :default => 0, :null => false + t.boolean "is_public", :default => false, :null => false + t.text "column_names" + t.text "sort_criteria" + t.string "group_by" + t.string "type" + end + + add_index "queries", ["project_id"], :name => "index_queries_on_project_id" + add_index "queries", ["user_id"], :name => "index_queries_on_user_id" + + create_table "repositories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "url", :default => "", :null => false + t.string "login", :limit => 60, :default => "" + t.string "password", :default => "" + t.string "root_url", :default => "" + t.string "type" + t.string "path_encoding", :limit => 64 + t.string "log_encoding", :limit => 64 + t.text "extra_info" + t.string "identifier" + t.boolean "is_default", :default => false + end + + add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" + + create_table "roles", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "assignable", :default => true + t.integer "builtin", :default => 0, :null => false + t.text "permissions" + t.string "issues_visibility", :limit => 30, :default => "default", :null => false + end + + create_table "schools", :force => true do |t| + t.string "name" + t.string "province" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_cached_ratings", :force => true do |t| + t.integer "cacheable_id", :limit => 8 + t.string "cacheable_type" + t.float "avg", :null => false + t.integer "cnt", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_rates", :force => true do |t| + t.integer "rater_id", :limit => 8 + t.integer "rateable_id" + t.string "rateable_type" + t.float "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "settings", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "value" + t.datetime "updated_on" + end + + add_index "settings", ["name"], :name => "index_settings_on_name" + + create_table "shares", :force => true do |t| + t.date "created_on" + t.string "url" + t.string "title" + t.integer "share_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "project_id" + t.integer "user_id" + t.string "description" + end + + create_table "students_for_courses", :force => true do |t| + t.integer "student_id" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "taggings", :force => true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", :limit => 128 + t.datetime "created_at" + end + + add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" + add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" + + create_table "tags", :force => true do |t| + t.string "name" + end + + create_table "teachers", :force => true do |t| + t.string "tea_name" + t.string "location" + t.integer "couurse_time" + t.integer "course_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "extra" + end + + create_table "time_entries", :force => true do |t| + t.integer "project_id", :null => false + t.integer "user_id", :null => false + t.integer "issue_id" + t.float "hours", :null => false + t.string "comments" + t.integer "activity_id", :null => false + t.date "spent_on", :null => false + t.integer "tyear", :null => false + t.integer "tmonth", :null => false + t.integer "tweek", :null => false + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" + add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" + add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" + add_index "time_entries", ["project_id"], :name => "time_entries_project_id" + add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" + + create_table "tokens", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.string "action", :limit => 30, :default => "", :null => false + t.string "value", :limit => 40, :default => "", :null => false + t.datetime "created_on", :null => false + end + + add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" + add_index "tokens", ["value"], :name => "tokens_value", :unique => true + + create_table "trackers", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_in_chlog", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "is_in_roadmap", :default => true, :null => false + t.integer "fields_bits", :default => 0 + end + + create_table "user_extensions", :force => true do |t| + t.integer "user_id", :null => false + t.date "birthday" + t.string "brief_introduction" + t.integer "gender" + t.string "location" + t.string "occupation" + t.integer "work_experience" + t.integer "zip_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "technical_title" + t.integer "identity" + t.string "student_id" + t.string "teacher_realname" + t.string "student_realname" + t.string "location_city" + end + + create_table "user_grades", :force => true do |t| + t.integer "user_id", :null => false + t.integer "project_id", :null => false + t.float "grade", :default => 0.0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" + add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" + add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" + + create_table "user_preferences", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.text "others" + t.boolean "hide_mail", :default => false + t.string "time_zone" + end + + add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + + create_table "user_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "grade", :default => 0.0 + end + + add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" + add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" + add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" + + create_table "users", :force => true do |t| + t.string "login", :default => "", :null => false + t.string "hashed_password", :limit => 40, :default => "", :null => false + t.string "firstname", :limit => 30, :default => "", :null => false + t.string "lastname", :default => "", :null => false + t.string "mail", :limit => 60, :default => "", :null => false + t.boolean "admin", :default => false, :null => false + t.integer "status", :default => 1, :null => false + t.datetime "last_login_on" + t.string "language", :limit => 5, :default => "" + t.integer "auth_source_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "type" + t.string "identity_url" + t.string "mail_notification", :default => "", :null => false + t.string "salt", :limit => 64 + end + + add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" + add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" + add_index "users", ["type"], :name => "index_users_on_type" + + create_table "versions", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :default => "", :null => false + t.string "description", :default => "" + t.date "effective_date" + t.datetime "created_on" + t.datetime "updated_on" + t.string "wiki_page_title" + t.string "status", :default => "open" + t.string "sharing", :default => "none", :null => false + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + add_index "versions", ["sharing"], :name => "index_versions_on_sharing" + + create_table "watchers", :force => true do |t| + t.string "watchable_type", :default => "", :null => false + t.integer "watchable_id", :default => 0, :null => false + t.integer "user_id" + end + + add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" + add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" + add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" + + create_table "wiki_content_versions", :force => true do |t| + t.integer "wiki_content_id", :null => false + t.integer "page_id", :null => false + t.integer "author_id" + t.binary "data", :limit => 2147483647 + t.string "compression", :limit => 6, :default => "" + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" + add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" + + create_table "wiki_contents", :force => true do |t| + t.integer "page_id", :null => false + t.integer "author_id" + t.text "text", :limit => 2147483647 + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" + add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" + + create_table "wiki_pages", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title", :null => false + t.datetime "created_on", :null => false + t.boolean "protected", :default => false, :null => false + t.integer "parent_id" + end + + add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" + add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" + add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" + + create_table "wiki_redirects", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title" + t.string "redirects_to" + t.datetime "created_on", :null => false + end + + add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" + add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" + + create_table "wikis", :force => true do |t| + t.integer "project_id", :null => false + t.string "start_page", :null => false + t.integer "status", :default => 1, :null => false + end + + add_index "wikis", ["project_id"], :name => "wikis_project_id" + + create_table "workflows", :force => true do |t| + t.integer "tracker_id", :default => 0, :null => false + t.integer "old_status_id", :default => 0, :null => false + t.integer "new_status_id", :default => 0, :null => false + t.integer "role_id", :default => 0, :null => false + t.boolean "assignee", :default => false, :null => false + t.boolean "author", :default => false, :null => false + t.string "type", :limit => 30 + t.string "field_name", :limit => 30 + t.string "rule", :limit => 30 + end + + add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" + add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" + add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" + add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" + +end diff --git a/db/schema.rb.REMOTE.rb b/db/schema.rb.REMOTE.rb new file mode 100644 index 000000000..e0e258932 --- /dev/null +++ b/db/schema.rb.REMOTE.rb @@ -0,0 +1,958 @@ +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140411005214) do + + create_table "activities", :force => true do |t| + t.integer "act_id", :null => false + t.string "act_type", :null => false + t.integer "user_id", :null => false + end + + add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" + add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" + add_index "activities", ["user_id"], :name => "index_activities_on_user_id" + + create_table "attachments", :force => true do |t| + t.integer "container_id" + t.string "container_type", :limit => 30 + t.string "filename", :default => "", :null => false + t.string "disk_filename", :default => "", :null => false + t.integer "filesize", :default => 0, :null => false + t.string "content_type", :default => "" + t.string "digest", :limit => 40, :default => "", :null => false + t.integer "downloads", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.string "description" + t.string "disk_directory" + end + + add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" + add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" + add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" + + create_table "auth_sources", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 60, :default => "", :null => false + t.string "host", :limit => 60 + t.integer "port" + t.string "account" + t.string "account_password", :default => "" + t.string "base_dn" + t.string "attr_login", :limit => 30 + t.string "attr_firstname", :limit => 30 + t.string "attr_lastname", :limit => 30 + t.string "attr_mail", :limit => 30 + t.boolean "onthefly_register", :default => false, :null => false + t.boolean "tls", :default => false, :null => false + t.string "filter" + t.integer "timeout" + end + + add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" + + create_table "biding_projects", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "bids", :force => true do |t| + t.string "name" + t.string "budget", :null => false + t.integer "author_id" + t.date "deadline" + t.string "description" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.integer "commit" + t.integer "reward_type" + t.integer "homework_type" + t.integer "parent_id" + t.string "password" + end + + create_table "boards", :force => true do |t| + t.integer "project_id", :null => false + t.string "name", :default => "", :null => false + t.string "description" + t.integer "position", :default => 1 + t.integer "topics_count", :default => 0, :null => false + t.integer "messages_count", :default => 0, :null => false + t.integer "last_message_id" + t.integer "parent_id" + end + + add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" + add_index "boards", ["project_id"], :name => "boards_project_id" + + create_table "changes", :force => true do |t| + t.integer "changeset_id", :null => false + t.string "action", :limit => 1, :default => "", :null => false + t.text "path", :null => false + t.text "from_path" + t.string "from_revision" + t.string "revision" + t.string "branch" + end + + add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" + + create_table "changeset_parents", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "parent_id", :null => false + end + + add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" + add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" + + create_table "changesets", :force => true do |t| + t.integer "repository_id", :null => false + t.string "revision", :null => false + t.string "committer" + t.datetime "committed_on", :null => false + t.text "comments" + t.date "commit_date" + t.string "scmid" + t.integer "user_id" + end + + add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" + add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true + add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" + add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" + add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" + + create_table "changesets_issues", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "issue_id", :null => false + end + + add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true + + create_table "comments", :force => true do |t| + t.string "commented_type", :limit => 30, :default => "", :null => false + t.integer "commented_id", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.text "comments" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "comments", ["author_id"], :name => "index_comments_on_author_id" + add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" + + create_table "contesting_projects", :force => true do |t| + t.integer "project_id" + t.string "contest_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "contesting_softapplications", :force => true do |t| + t.integer "softapplication_id" + t.integer "contest_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "contests", :force => true do |t| + t.string "name" + t.integer "budget" + t.integer "author_id" + t.date "deadline" + t.string "description" + t.integer "commit" + t.string "password" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + create_table "courses", :force => true do |t| + t.integer "tea_id" + t.string "name" + t.integer "state" + t.string "code" + t.integer "time" + t.string "extra" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "location" + t.string "term" + t.string "string" + t.string "password" + t.string "setup_time" + t.string "endup_time" + t.string "class_period" + t.integer "school_id" + end + + create_table "custom_fields", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.string "field_format", :limit => 30, :default => "", :null => false + t.text "possible_values" + t.string "regexp", :default => "" + t.integer "min_length", :default => 0, :null => false + t.integer "max_length", :default => 0, :null => false + t.boolean "is_required", :default => false, :null => false + t.boolean "is_for_all", :default => false, :null => false + t.boolean "is_filter", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "searchable", :default => false + t.text "default_value" + t.boolean "editable", :default => true + t.boolean "visible", :default => true, :null => false + t.boolean "multiple", :default => false + end + + add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + end + + add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true + + create_table "custom_fields_trackers", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true + + create_table "custom_values", :force => true do |t| + t.string "customized_type", :limit => 30, :default => "", :null => false + t.integer "customized_id", :default => 0, :null => false + t.integer "custom_field_id", :default => 0, :null => false + t.text "value" + end + + add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" + add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" + + create_table "documents", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "category_id", :default => 0, :null => false + t.string "title", :limit => 60, :default => "", :null => false + t.text "description" + t.datetime "created_on" + end + + add_index "documents", ["category_id"], :name => "index_documents_on_category_id" + add_index "documents", ["created_on"], :name => "index_documents_on_created_on" + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "enabled_modules", :force => true do |t| + t.integer "project_id" + t.string "name", :null => false + end + + add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" + + create_table "enumerations", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "is_default", :default => false, :null => false + t.string "type" + t.boolean "active", :default => true, :null => false + t.integer "project_id" + t.integer "parent_id" + t.string "position_name", :limit => 30 + end + + add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" + add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" + + create_table "forums", :force => true do |t| + t.string "name", :null => false + t.string "description", :default => "" + t.integer "topic_count", :default => 0 + t.integer "memo_count", :default => 0 + t.integer "last_memo_id", :default => 0 + t.integer "creator_id", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "groups_users", :id => false, :force => true do |t| + t.integer "group_id", :null => false + t.integer "user_id", :null => false + end + + add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true + + create_table "homework_attaches", :force => true do |t| + t.integer "bid_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "homework_for_courses", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + end + + create_table "issue_categories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.integer "assigned_to_id" + end + + add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_relations", :force => true do |t| + t.integer "issue_from_id", :null => false + t.integer "issue_to_id", :null => false + t.string "relation_type", :default => "", :null => false + t.integer "delay" + end + + add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true + add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" + add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" + + create_table "issue_statuses", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_closed", :default => false, :null => false + t.boolean "is_default", :default => false, :null => false + t.integer "position", :default => 1 + t.integer "default_done_ratio" + end + + add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" + add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" + add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" + + create_table "issues", :force => true do |t| + t.integer "tracker_id", :null => false + t.integer "project_id", :null => false + t.string "subject", :default => "", :null => false + t.text "description" + t.date "due_date" + t.integer "category_id" + t.integer "status_id", :null => false + t.integer "assigned_to_id" + t.integer "priority_id", :null => false + t.integer "fixed_version_id" + t.integer "author_id", :null => false + t.integer "lock_version", :default => 0, :null => false + t.datetime "created_on" + t.datetime "updated_on" + t.date "start_date" + t.integer "done_ratio", :default => 0, :null => false + t.float "estimated_hours" + t.integer "parent_id" + t.integer "root_id" + t.integer "lft" + t.integer "rgt" + t.boolean "is_private", :default => false, :null => false + t.datetime "closed_on" + end + + add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" + add_index "issues", ["author_id"], :name => "index_issues_on_author_id" + add_index "issues", ["category_id"], :name => "index_issues_on_category_id" + add_index "issues", ["created_on"], :name => "index_issues_on_created_on" + add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" + add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" + add_index "issues", ["project_id"], :name => "issues_project_id" + add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" + add_index "issues", ["status_id"], :name => "index_issues_on_status_id" + add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" + + create_table "join_in_competitions", :force => true do |t| + t.integer "user_id" + t.integer "competition_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "join_in_contests", :force => true do |t| + t.integer "user_id" + t.integer "bid_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "journal_details", :force => true do |t| + t.integer "journal_id", :default => 0, :null => false + t.string "property", :limit => 30, :default => "", :null => false + t.string "prop_key", :limit => 30, :default => "", :null => false + t.text "old_value" + t.text "value" + end + + add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + + create_table "journal_replies", :id => false, :force => true do |t| + t.integer "journal_id" + t.integer "user_id" + t.integer "reply_id" + end + + add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" + add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" + add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" + + create_table "journals", :force => true do |t| + t.integer "journalized_id", :default => 0, :null => false + t.string "journalized_type", :limit => 30, :default => "", :null => false + t.integer "user_id", :default => 0, :null => false + t.text "notes" + t.datetime "created_on", :null => false + t.boolean "private_notes", :default => false, :null => false + end + + add_index "journals", ["created_on"], :name => "index_journals_on_created_on" + add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" + add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" + add_index "journals", ["user_id"], :name => "index_journals_on_user_id" + + create_table "journals_for_messages", :force => true do |t| + t.integer "jour_id" + t.string "jour_type" + t.integer "user_id" + t.text "notes" + t.integer "status" + t.integer "reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.string "m_parent_id" + t.boolean "is_readed" + t.integer "m_reply_count" + t.integer "m_reply_id" + end + + create_table "member_roles", :force => true do |t| + t.integer "member_id", :null => false + t.integer "role_id", :null => false + t.integer "inherited_from" + end + + add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" + add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" + + create_table "members", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + t.datetime "created_on" + t.boolean "mail_notification", :default => false, :null => false + end + + add_index "members", ["project_id"], :name => "index_members_on_project_id" + add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true + add_index "members", ["user_id"], :name => "index_members_on_user_id" + + create_table "memos", :force => true do |t| + t.integer "forum_id", :null => false + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :null => false + t.integer "author_id", :null => false + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count", :default => 0 + end + + create_table "messages", :force => true do |t| + t.integer "board_id", :null => false + t.integer "parent_id" + t.string "subject", :default => "", :null => false + t.text "content" + t.integer "author_id" + t.integer "replies_count", :default => 0, :null => false + t.integer "last_reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + end + + add_index "messages", ["author_id"], :name => "index_messages_on_author_id" + add_index "messages", ["board_id"], :name => "messages_board_id" + add_index "messages", ["created_on"], :name => "index_messages_on_created_on" + add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" + add_index "messages", ["parent_id"], :name => "messages_parent_id" + + create_table "news", :force => true do |t| + t.integer "project_id" + t.string "title", :limit => 60, :default => "", :null => false + t.string "summary", :default => "" + t.text "description" + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.integer "comments_count", :default => 0, :null => false + end + + add_index "news", ["author_id"], :name => "index_news_on_author_id" + add_index "news", ["created_on"], :name => "index_news_on_created_on" + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "open_id_authentication_associations", :force => true do |t| + t.integer "issued" + t.integer "lifetime" + t.string "handle" + t.string "assoc_type" + t.binary "server_url" + t.binary "secret" + end + + create_table "open_id_authentication_nonces", :force => true do |t| + t.integer "timestamp", :null => false + t.string "server_url" + t.string "salt", :null => false + end + + create_table "praise_tread_caches", :force => true do |t| + t.integer "object_id", :null => false + t.string "object_type" + t.integer "praise_num" + t.integer "tread_num" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "praise_treads", :force => true do |t| + t.integer "user_id", :null => false + t.integer "praise_tread_object_id" + t.string "praise_tread_object_type" + t.integer "praise_or_tread" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_infos", :force => true do |t| + t.integer "project_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "project_id" + t.integer "project_type" + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 + end + + add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" + + create_table "projects", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "description" + t.string "homepage", :default => "" + t.boolean "is_public", :default => true, :null => false + t.integer "parent_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "identifier" + t.integer "status", :default => 1, :null => false + t.integer "lft" + t.integer "rgt" + t.boolean "inherit_members", :default => false, :null => false + t.integer "project_type" + t.boolean "hidden_repo", :default => false, :null => false + end + + add_index "projects", ["lft"], :name => "index_projects_on_lft" + add_index "projects", ["rgt"], :name => "index_projects_on_rgt" + + create_table "projects_trackers", :id => false, :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true + add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + + create_table "queries", :force => true do |t| + t.integer "project_id" + t.string "name", :default => "", :null => false + t.text "filters" + t.integer "user_id", :default => 0, :null => false + t.boolean "is_public", :default => false, :null => false + t.text "column_names" + t.text "sort_criteria" + t.string "group_by" + t.string "type" + end + + add_index "queries", ["project_id"], :name => "index_queries_on_project_id" + add_index "queries", ["user_id"], :name => "index_queries_on_user_id" + + create_table "repositories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "url", :default => "", :null => false + t.string "login", :limit => 60, :default => "" + t.string "password", :default => "" + t.string "root_url", :default => "" + t.string "type" + t.string "path_encoding", :limit => 64 + t.string "log_encoding", :limit => 64 + t.text "extra_info" + t.string "identifier" + t.boolean "is_default", :default => false + end + + add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" + + create_table "roles", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "assignable", :default => true + t.integer "builtin", :default => 0, :null => false + t.text "permissions" + t.string "issues_visibility", :limit => 30, :default => "default", :null => false + end + + create_table "schools", :force => true do |t| + t.string "name" + t.string "province" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_cached_ratings", :force => true do |t| + t.integer "cacheable_id", :limit => 8 + t.string "cacheable_type" + t.float "avg", :null => false + t.integer "cnt", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_rates", :force => true do |t| + t.integer "rater_id", :limit => 8 + t.integer "rateable_id" + t.string "rateable_type" + t.float "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "settings", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "value" + t.datetime "updated_on" + end + + add_index "settings", ["name"], :name => "index_settings_on_name" + + create_table "shares", :force => true do |t| + t.date "created_on" + t.string "url" + t.string "title" + t.integer "share_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "project_id" + t.integer "user_id" + t.string "description" + end + + create_table "softapplications", :force => true do |t| + t.string "name" + t.string "description" + t.integer "app_type_id" + t.string "app_type_name" + t.string "android_min_version_available" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "contest_id" + t.integer "softapplication_id" + t.integer "is_public" + end + + create_table "students_for_courses", :force => true do |t| + t.integer "student_id" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "taggings", :force => true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", :limit => 128 + t.datetime "created_at" + end + + add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" + add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" + + create_table "tags", :force => true do |t| + t.string "name" + end + + create_table "teachers", :force => true do |t| + t.string "tea_name" + t.string "location" + t.integer "couurse_time" + t.integer "course_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "extra" + end + + create_table "time_entries", :force => true do |t| + t.integer "project_id", :null => false + t.integer "user_id", :null => false + t.integer "issue_id" + t.float "hours", :null => false + t.string "comments" + t.integer "activity_id", :null => false + t.date "spent_on", :null => false + t.integer "tyear", :null => false + t.integer "tmonth", :null => false + t.integer "tweek", :null => false + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" + add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" + add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" + add_index "time_entries", ["project_id"], :name => "time_entries_project_id" + add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" + + create_table "tokens", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.string "action", :limit => 30, :default => "", :null => false + t.string "value", :limit => 40, :default => "", :null => false + t.datetime "created_on", :null => false + end + + add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" + add_index "tokens", ["value"], :name => "tokens_value", :unique => true + + create_table "trackers", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_in_chlog", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "is_in_roadmap", :default => true, :null => false + t.integer "fields_bits", :default => 0 + end + + create_table "user_extensions", :force => true do |t| + t.integer "user_id", :null => false + t.date "birthday" + t.string "brief_introduction" + t.integer "gender" + t.string "location" + t.string "occupation" + t.integer "work_experience" + t.integer "zip_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "technical_title" + t.integer "identity" + t.string "student_id" + t.string "teacher_realname" + t.string "student_realname" + t.string "location_city" + end + + create_table "user_grades", :force => true do |t| + t.integer "user_id", :null => false + t.integer "project_id", :null => false + t.float "grade", :default => 0.0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" + add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" + add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" + + create_table "user_preferences", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.text "others" + t.boolean "hide_mail", :default => false + t.string "time_zone" + end + + add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + + create_table "user_scores", :force => true do |t| + t.integer "user_id", :null => false + t.integer "collaboration" + t.integer "influence" + t.integer "skill" + t.integer "active" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "user_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "grade", :default => 0.0 + end + + add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" + add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" + add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" + + create_table "users", :force => true do |t| + t.string "login", :default => "", :null => false + t.string "hashed_password", :limit => 40, :default => "", :null => false + t.string "firstname", :limit => 30, :default => "", :null => false + t.string "lastname", :default => "", :null => false + t.string "mail", :limit => 60, :default => "", :null => false + t.boolean "admin", :default => false, :null => false + t.integer "status", :default => 1, :null => false + t.datetime "last_login_on" + t.string "language", :limit => 5, :default => "" + t.integer "auth_source_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "type" + t.string "identity_url" + t.string "mail_notification", :default => "", :null => false + t.string "salt", :limit => 64 + end + + add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" + add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" + add_index "users", ["type"], :name => "index_users_on_type" + + create_table "versions", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :default => "", :null => false + t.string "description", :default => "" + t.date "effective_date" + t.datetime "created_on" + t.datetime "updated_on" + t.string "wiki_page_title" + t.string "status", :default => "open" + t.string "sharing", :default => "none", :null => false + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + add_index "versions", ["sharing"], :name => "index_versions_on_sharing" + + create_table "watchers", :force => true do |t| + t.string "watchable_type", :default => "", :null => false + t.integer "watchable_id", :default => 0, :null => false + t.integer "user_id" + end + + add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" + add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" + add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" + + create_table "wiki_content_versions", :force => true do |t| + t.integer "wiki_content_id", :null => false + t.integer "page_id", :null => false + t.integer "author_id" + t.binary "data", :limit => 2147483647 + t.string "compression", :limit => 6, :default => "" + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" + add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" + + create_table "wiki_contents", :force => true do |t| + t.integer "page_id", :null => false + t.integer "author_id" + t.text "text", :limit => 2147483647 + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" + add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" + + create_table "wiki_pages", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title", :null => false + t.datetime "created_on", :null => false + t.boolean "protected", :default => false, :null => false + t.integer "parent_id" + end + + add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" + add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" + add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" + + create_table "wiki_redirects", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title" + t.string "redirects_to" + t.datetime "created_on", :null => false + end + + add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" + add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" + + create_table "wikis", :force => true do |t| + t.integer "project_id", :null => false + t.string "start_page", :null => false + t.integer "status", :default => 1, :null => false + end + + add_index "wikis", ["project_id"], :name => "wikis_project_id" + + create_table "workflows", :force => true do |t| + t.integer "tracker_id", :default => 0, :null => false + t.integer "old_status_id", :default => 0, :null => false + t.integer "new_status_id", :default => 0, :null => false + t.integer "role_id", :default => 0, :null => false + t.boolean "assignee", :default => false, :null => false + t.boolean "author", :default => false, :null => false + t.string "type", :limit => 30 + t.string "field_name", :limit => 30 + t.string "rule", :limit => 30 + end + + add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" + add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" + add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" + add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" + +end diff --git a/test/fixtures/join_in_contests.yml b/test/fixtures/join_in_contests.yml new file mode 100644 index 000000000..3e5279b38 --- /dev/null +++ b/test/fixtures/join_in_contests.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + user_id: 1 + bid_id: 1 + +two: + user_id: 1 + bid_id: 1 diff --git a/test/unit/join_in_contest_test.rb b/test/unit/join_in_contest_test.rb new file mode 100644 index 000000000..3d27c1a90 --- /dev/null +++ b/test/unit/join_in_contest_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class JoinInContestTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 0a5de653d099276b44d241ae3bd622472ec1a551 Mon Sep 17 00:00:00 2001 From: xianbo Date: Mon, 21 Apr 2014 14:07:54 +0800 Subject: [PATCH 10/48] fix db migrate --- db/schema.rb | 950 ---------------------------------------- db/schema.rb.BASE.rb | 887 -------------------------------------- db/schema.rb.LOCAL.rb | 895 -------------------------------------- db/schema.rb.REMOTE.rb | 958 ----------------------------------------- 4 files changed, 3690 deletions(-) delete mode 100644 db/schema.rb delete mode 100644 db/schema.rb.BASE.rb delete mode 100644 db/schema.rb.LOCAL.rb delete mode 100644 db/schema.rb.REMOTE.rb diff --git a/db/schema.rb b/db/schema.rb deleted file mode 100644 index bfbb7a26e..000000000 --- a/db/schema.rb +++ /dev/null @@ -1,950 +0,0 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140417091429) do - - create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false - end - - add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" - add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" - add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - - create_table "attachments", :force => true do |t| - t.integer "container_id" - t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - end - - add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" - add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" - add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" - - create_table "auth_sources", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 60, :default => "", :null => false - t.string "host", :limit => 60 - t.integer "port" - t.string "account" - t.string "account_password", :default => "" - t.string "base_dn" - t.string "attr_login", :limit => 30 - t.string "attr_firstname", :limit => 30 - t.string "attr_lastname", :limit => 30 - t.string "attr_mail", :limit => 30 - t.boolean "onthefly_register", :default => false, :null => false - t.boolean "tls", :default => false, :null => false - t.string "filter" - t.integer "timeout" - end - - add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - - create_table "biding_projects", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "bids", :force => true do |t| - t.string "name" - t.string "budget", :null => false - t.integer "author_id" - t.date "deadline" - t.string "description" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.integer "commit" - t.integer "reward_type" - t.integer "homework_type" - t.integer "parent_id" - t.string "password" - end - - create_table "boards", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :default => "", :null => false - t.string "description" - t.integer "position", :default => 1 - t.integer "topics_count", :default => 0, :null => false - t.integer "messages_count", :default => 0, :null => false - t.integer "last_message_id" - t.integer "parent_id" - end - - add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" - add_index "boards", ["project_id"], :name => "boards_project_id" - - create_table "changes", :force => true do |t| - t.integer "changeset_id", :null => false - t.string "action", :limit => 1, :default => "", :null => false - t.text "path", :null => false - t.text "from_path" - t.string "from_revision" - t.string "revision" - t.string "branch" - end - - add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" - - create_table "changeset_parents", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "parent_id", :null => false - end - - add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" - add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" - - create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false - t.string "committer" - t.datetime "committed_on", :null => false - t.text "comments" - t.date "commit_date" - t.string "scmid" - t.integer "user_id" - end - - add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" - add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true - add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" - add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" - add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" - - create_table "changesets_issues", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "issue_id", :null => false - end - - add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true - - create_table "comments", :force => true do |t| - t.string "commented_type", :limit => 30, :default => "", :null => false - t.integer "commented_id", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.text "comments" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "comments", ["author_id"], :name => "index_comments_on_author_id" - add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" - - create_table "contesting_projects", :force => true do |t| - t.integer "project_id" - t.string "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contesting_softapplications", :force => true do |t| - t.integer "softapplication_id" - t.integer "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contests", :force => true do |t| - t.string "name" - t.integer "budget" - t.integer "author_id" - t.date "deadline" - t.string "description" - t.integer "commit" - t.string "password" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - create_table "courses", :force => true do |t| - t.integer "tea_id" - t.string "name" - t.integer "state" - t.string "code" - t.integer "time" - t.string "extra" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "location" - t.string "term" - t.string "string" - t.string "password" - t.string "setup_time" - t.string "endup_time" - t.string "class_period" - t.integer "school_id" - end - - create_table "custom_fields", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.string "field_format", :limit => 30, :default => "", :null => false - t.text "possible_values" - t.string "regexp", :default => "" - t.integer "min_length", :default => 0, :null => false - t.integer "max_length", :default => 0, :null => false - t.boolean "is_required", :default => false, :null => false - t.boolean "is_for_all", :default => false, :null => false - t.boolean "is_filter", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "searchable", :default => false - t.text "default_value" - t.boolean "editable", :default => true - t.boolean "visible", :default => true, :null => false - t.boolean "multiple", :default => false - end - - add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - end - - add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true - - create_table "custom_fields_trackers", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true - - create_table "custom_values", :force => true do |t| - t.string "customized_type", :limit => 30, :default => "", :null => false - t.integer "customized_id", :default => 0, :null => false - t.integer "custom_field_id", :default => 0, :null => false - t.text "value" - end - - add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" - add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" - - create_table "documents", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "category_id", :default => 0, :null => false - t.string "title", :limit => 60, :default => "", :null => false - t.text "description" - t.datetime "created_on" - end - - add_index "documents", ["category_id"], :name => "index_documents_on_category_id" - add_index "documents", ["created_on"], :name => "index_documents_on_created_on" - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "enabled_modules", :force => true do |t| - t.integer "project_id" - t.string "name", :null => false - end - - add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" - - create_table "enumerations", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "is_default", :default => false, :null => false - t.string "type" - t.boolean "active", :default => true, :null => false - t.integer "project_id" - t.integer "parent_id" - t.string "position_name", :limit => 30 - end - - add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" - add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - - create_table "forums", :force => true do |t| - t.string "name", :null => false - t.string "description", :default => "" - t.integer "topic_count", :default => 0 - t.integer "memo_count", :default => 0 - t.integer "last_memo_id", :default => 0 - t.integer "creator_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "groups_users", :id => false, :force => true do |t| - t.integer "group_id", :null => false - t.integer "user_id", :null => false - end - - add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true - - create_table "homework_attaches", :force => true do |t| - t.integer "bid_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "homework_for_courses", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - end - - create_table "issue_categories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.integer "assigned_to_id" - end - - add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :default => "", :null => false - t.integer "delay" - end - - add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true - add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" - add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" - - create_table "issue_statuses", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_closed", :default => false, :null => false - t.boolean "is_default", :default => false, :null => false - t.integer "position", :default => 1 - t.integer "default_done_ratio" - end - - add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" - add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" - add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" - - create_table "issues", :force => true do |t| - t.integer "tracker_id", :null => false - t.integer "project_id", :null => false - t.string "subject", :default => "", :null => false - t.text "description" - t.date "due_date" - t.integer "category_id" - t.integer "status_id", :null => false - t.integer "assigned_to_id" - t.integer "priority_id", :null => false - t.integer "fixed_version_id" - t.integer "author_id", :null => false - t.integer "lock_version", :default => 0, :null => false - t.datetime "created_on" - t.datetime "updated_on" - t.date "start_date" - t.integer "done_ratio", :default => 0, :null => false - t.float "estimated_hours" - t.integer "parent_id" - t.integer "root_id" - t.integer "lft" - t.integer "rgt" - t.boolean "is_private", :default => false, :null => false - t.datetime "closed_on" - end - - add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" - add_index "issues", ["author_id"], :name => "index_issues_on_author_id" - add_index "issues", ["category_id"], :name => "index_issues_on_category_id" - add_index "issues", ["created_on"], :name => "index_issues_on_created_on" - add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" - add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" - add_index "issues", ["project_id"], :name => "issues_project_id" - add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" - add_index "issues", ["status_id"], :name => "index_issues_on_status_id" - add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" - - create_table "join_in_competitions", :force => true do |t| - t.integer "user_id" - t.integer "competition_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "join_in_contests", :force => true do |t| - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "journal_details", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - - create_table "journal_replies", :id => false, :force => true do |t| - t.integer "journal_id" - t.integer "user_id" - t.integer "reply_id" - end - - add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" - add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" - add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" - - create_table "journals", :force => true do |t| - t.integer "journalized_id", :default => 0, :null => false - t.string "journalized_type", :limit => 30, :default => "", :null => false - t.integer "user_id", :default => 0, :null => false - t.text "notes" - t.datetime "created_on", :null => false - t.boolean "private_notes", :default => false, :null => false - end - - add_index "journals", ["created_on"], :name => "index_journals_on_created_on" - add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" - add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" - add_index "journals", ["user_id"], :name => "index_journals_on_user_id" - - create_table "journals_for_messages", :force => true do |t| - t.integer "jour_id" - t.string "jour_type" - t.integer "user_id" - t.text "notes" - t.integer "status" - t.integer "reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.string "m_parent_id" - t.boolean "is_readed" - t.integer "m_reply_count" - t.integer "m_reply_id" - end - - create_table "member_roles", :force => true do |t| - t.integer "member_id", :null => false - t.integer "role_id", :null => false - t.integer "inherited_from" - end - - add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" - add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" - - create_table "members", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - t.datetime "created_on" - t.boolean "mail_notification", :default => false, :null => false - end - - add_index "members", ["project_id"], :name => "index_members_on_project_id" - add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true - add_index "members", ["user_id"], :name => "index_members_on_user_id" - - create_table "memos", :force => true do |t| - t.integer "forum_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id", :null => false - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count", :default => 0 - end - - create_table "messages", :force => true do |t| - t.integer "board_id", :null => false - t.integer "parent_id" - t.string "subject", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "replies_count", :default => 0, :null => false - t.integer "last_reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - end - - add_index "messages", ["author_id"], :name => "index_messages_on_author_id" - add_index "messages", ["board_id"], :name => "messages_board_id" - add_index "messages", ["created_on"], :name => "index_messages_on_created_on" - add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" - add_index "messages", ["parent_id"], :name => "messages_parent_id" - - create_table "news", :force => true do |t| - t.integer "project_id" - t.string "title", :limit => 60, :default => "", :null => false - t.string "summary", :default => "" - t.text "description" - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.integer "comments_count", :default => 0, :null => false - end - - add_index "news", ["author_id"], :name => "index_news_on_author_id" - add_index "news", ["created_on"], :name => "index_news_on_created_on" - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "open_id_authentication_associations", :force => true do |t| - t.integer "issued" - t.integer "lifetime" - t.string "handle" - t.string "assoc_type" - t.binary "server_url" - t.binary "secret" - end - - create_table "open_id_authentication_nonces", :force => true do |t| - t.integer "timestamp", :null => false - t.string "server_url" - t.string "salt", :null => false - end - - create_table "praise_tread_caches", :force => true do |t| - t.integer "object_id", :null => false - t.string "object_type" - t.integer "praise_num" - t.integer "tread_num" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "praise_treads", :force => true do |t| - t.integer "user_id", :null => false - t.integer "praise_tread_object_id" - t.string "praise_tread_object_type" - t.integer "praise_or_tread" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_infos", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "project_id" - t.integer "project_type" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - end - - add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - - create_table "projects", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.string "homepage", :default => "" - t.boolean "is_public", :default => true, :null => false - t.integer "parent_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "identifier" - t.integer "status", :default => 1, :null => false - t.integer "lft" - t.integer "rgt" - t.boolean "inherit_members", :default => false, :null => false - t.integer "project_type" - t.boolean "hidden_repo", :default => false, :null => false - end - - add_index "projects", ["lft"], :name => "index_projects_on_lft" - add_index "projects", ["rgt"], :name => "index_projects_on_rgt" - - create_table "projects_trackers", :id => false, :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true - add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - - create_table "queries", :force => true do |t| - t.integer "project_id" - t.string "name", :default => "", :null => false - t.text "filters" - t.integer "user_id", :default => 0, :null => false - t.boolean "is_public", :default => false, :null => false - t.text "column_names" - t.text "sort_criteria" - t.string "group_by" - t.string "type" - end - - add_index "queries", ["project_id"], :name => "index_queries_on_project_id" - add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - - create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" - t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 - t.text "extra_info" - t.string "identifier" - t.boolean "is_default", :default => false - end - - add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" - - create_table "roles", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "assignable", :default => true - t.integer "builtin", :default => 0, :null => false - t.text "permissions" - t.string "issues_visibility", :limit => 30, :default => "default", :null => false - end - - create_table "schools", :force => true do |t| - t.string "name" - t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_cached_ratings", :force => true do |t| - t.integer "cacheable_id", :limit => 8 - t.string "cacheable_type" - t.float "avg", :null => false - t.integer "cnt", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_rates", :force => true do |t| - t.integer "rater_id", :limit => 8 - t.integer "rateable_id" - t.string "rateable_type" - t.float "stars", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "settings", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "value" - t.datetime "updated_on" - end - - add_index "settings", ["name"], :name => "index_settings_on_name" - - create_table "shares", :force => true do |t| - t.date "created_on" - t.string "url" - t.string "title" - t.integer "share_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - t.integer "user_id" - t.string "description" - end - - create_table "softapplications", :force => true do |t| - t.string "name" - t.string "description" - t.integer "app_type_id" - t.string "app_type_name" - t.string "android_min_version_available" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "contest_id" - t.integer "softapplication_id" - t.integer "is_public" - t.string "application_developers" - end - - create_table "students_for_courses", :force => true do |t| - t.integer "student_id" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "taggings", :force => true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", :limit => 128 - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" - - create_table "tags", :force => true do |t| - t.string "name" - end - - create_table "teachers", :force => true do |t| - t.string "tea_name" - t.string "location" - t.integer "couurse_time" - t.integer "course_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "extra" - end - - create_table "time_entries", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.integer "issue_id" - t.float "hours", :null => false - t.string "comments" - t.integer "activity_id", :null => false - t.date "spent_on", :null => false - t.integer "tyear", :null => false - t.integer "tmonth", :null => false - t.integer "tweek", :null => false - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" - add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" - add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" - add_index "time_entries", ["project_id"], :name => "time_entries_project_id" - add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" - - create_table "tokens", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40, :default => "", :null => false - t.datetime "created_on", :null => false - end - - add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" - add_index "tokens", ["value"], :name => "tokens_value", :unique => true - - create_table "trackers", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_in_chlog", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "is_in_roadmap", :default => true, :null => false - t.integer "fields_bits", :default => 0 - end - - create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false - t.date "birthday" - t.string "brief_introduction" - t.integer "gender" - t.string "location" - t.string "occupation" - t.integer "work_experience" - t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "technical_title" - t.integer "identity" - t.string "student_id" - t.string "teacher_realname" - t.string "student_realname" - t.string "location_city" - t.integer "school_id" - end - - create_table "user_grades", :force => true do |t| - t.integer "user_id", :null => false - t.integer "project_id", :null => false - t.float "grade", :default => 0.0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" - add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" - add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" - - create_table "user_preferences", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.text "others" - t.boolean "hide_mail", :default => false - t.string "time_zone" - end - - add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - - create_table "user_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "grade", :default => 0.0 - end - - add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" - add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" - add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - - create_table "users", :force => true do |t| - t.string "login", :default => "", :null => false - t.string "hashed_password", :limit => 40, :default => "", :null => false - t.string "firstname", :limit => 30, :default => "", :null => false - t.string "lastname", :default => "", :null => false - t.string "mail", :limit => 60, :default => "", :null => false - t.boolean "admin", :default => false, :null => false - t.integer "status", :default => 1, :null => false - t.datetime "last_login_on" - t.string "language", :limit => 5, :default => "" - t.integer "auth_source_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "type" - t.string "identity_url" - t.string "mail_notification", :default => "", :null => false - t.string "salt", :limit => 64 - end - - add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" - add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" - add_index "users", ["type"], :name => "index_users_on_type" - - create_table "versions", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :default => "", :null => false - t.string "description", :default => "" - t.date "effective_date" - t.datetime "created_on" - t.datetime "updated_on" - t.string "wiki_page_title" - t.string "status", :default => "open" - t.string "sharing", :default => "none", :null => false - end - - add_index "versions", ["project_id"], :name => "versions_project_id" - add_index "versions", ["sharing"], :name => "index_versions_on_sharing" - - create_table "watchers", :force => true do |t| - t.string "watchable_type", :default => "", :null => false - t.integer "watchable_id", :default => 0, :null => false - t.integer "user_id" - end - - add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" - add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" - add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" - - create_table "wiki_content_versions", :force => true do |t| - t.integer "wiki_content_id", :null => false - t.integer "page_id", :null => false - t.integer "author_id" - t.binary "data", :limit => 2147483647 - t.string "compression", :limit => 6, :default => "" - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" - add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" - - create_table "wiki_contents", :force => true do |t| - t.integer "page_id", :null => false - t.integer "author_id" - t.text "text", :limit => 2147483647 - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" - add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" - - create_table "wiki_pages", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title", :null => false - t.datetime "created_on", :null => false - t.boolean "protected", :default => false, :null => false - t.integer "parent_id" - end - - add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" - add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" - add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" - - create_table "wiki_redirects", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title" - t.string "redirects_to" - t.datetime "created_on", :null => false - end - - add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" - add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" - - create_table "wikis", :force => true do |t| - t.integer "project_id", :null => false - t.string "start_page", :null => false - t.integer "status", :default => 1, :null => false - end - - add_index "wikis", ["project_id"], :name => "wikis_project_id" - - create_table "workflows", :force => true do |t| - t.integer "tracker_id", :default => 0, :null => false - t.integer "old_status_id", :default => 0, :null => false - t.integer "new_status_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - t.boolean "assignee", :default => false, :null => false - t.boolean "author", :default => false, :null => false - t.string "type", :limit => 30 - t.string "field_name", :limit => 30 - t.string "rule", :limit => 30 - end - - add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" - add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" - add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" - add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" - -end diff --git a/db/schema.rb.BASE.rb b/db/schema.rb.BASE.rb deleted file mode 100644 index 2bda4fcc1..000000000 --- a/db/schema.rb.BASE.rb +++ /dev/null @@ -1,887 +0,0 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20131224021723) do - - create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false - end - - add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" - add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" - add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - - create_table "attachments", :force => true do |t| - t.integer "container_id" - t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - end - - add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" - add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" - add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" - - create_table "auth_sources", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 60, :default => "", :null => false - t.string "host", :limit => 60 - t.integer "port" - t.string "account" - t.string "account_password", :default => "" - t.string "base_dn" - t.string "attr_login", :limit => 30 - t.string "attr_firstname", :limit => 30 - t.string "attr_lastname", :limit => 30 - t.string "attr_mail", :limit => 30 - t.boolean "onthefly_register", :default => false, :null => false - t.boolean "tls", :default => false, :null => false - t.string "filter" - t.integer "timeout" - end - - add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - - create_table "biding_projects", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "bids", :force => true do |t| - t.string "name" - t.string "budget", :null => false - t.integer "author_id" - t.date "deadline" - t.string "description" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.integer "commit" - t.integer "reward_type" - t.integer "homework_type" - t.integer "parent_id" - t.string "password" - end - - create_table "boards", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :default => "", :null => false - t.string "description" - t.integer "position", :default => 1 - t.integer "topics_count", :default => 0, :null => false - t.integer "messages_count", :default => 0, :null => false - t.integer "last_message_id" - t.integer "parent_id" - end - - add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" - add_index "boards", ["project_id"], :name => "boards_project_id" - - create_table "changes", :force => true do |t| - t.integer "changeset_id", :null => false - t.string "action", :limit => 1, :default => "", :null => false - t.text "path", :null => false - t.text "from_path" - t.string "from_revision" - t.string "revision" - t.string "branch" - end - - add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" - - create_table "changeset_parents", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "parent_id", :null => false - end - - add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" - add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" - - create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false - t.string "committer" - t.datetime "committed_on", :null => false - t.text "comments" - t.date "commit_date" - t.string "scmid" - t.integer "user_id" - end - - add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" - add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true - add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" - add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" - add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" - - create_table "changesets_issues", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "issue_id", :null => false - end - - add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true - - create_table "comments", :force => true do |t| - t.string "commented_type", :limit => 30, :default => "", :null => false - t.integer "commented_id", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.text "comments" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "comments", ["author_id"], :name => "index_comments_on_author_id" - add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" - - create_table "courses", :force => true do |t| - t.integer "tea_id" - t.string "name" - t.integer "state" - t.string "code" - t.integer "time" - t.string "extra" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "location" - t.string "term" - t.string "string" - t.string "password" - t.string "setup_time" - t.string "endup_time" - t.string "class_period" - end - - create_table "custom_fields", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.string "field_format", :limit => 30, :default => "", :null => false - t.text "possible_values" - t.string "regexp", :default => "" - t.integer "min_length", :default => 0, :null => false - t.integer "max_length", :default => 0, :null => false - t.boolean "is_required", :default => false, :null => false - t.boolean "is_for_all", :default => false, :null => false - t.boolean "is_filter", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "searchable", :default => false - t.text "default_value" - t.boolean "editable", :default => true - t.boolean "visible", :default => true, :null => false - t.boolean "multiple", :default => false - end - - add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - end - - add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true - - create_table "custom_fields_trackers", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true - - create_table "custom_values", :force => true do |t| - t.string "customized_type", :limit => 30, :default => "", :null => false - t.integer "customized_id", :default => 0, :null => false - t.integer "custom_field_id", :default => 0, :null => false - t.text "value" - end - - add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" - add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" - - create_table "documents", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "category_id", :default => 0, :null => false - t.string "title", :limit => 60, :default => "", :null => false - t.text "description" - t.datetime "created_on" - end - - add_index "documents", ["category_id"], :name => "index_documents_on_category_id" - add_index "documents", ["created_on"], :name => "index_documents_on_created_on" - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "enabled_modules", :force => true do |t| - t.integer "project_id" - t.string "name", :null => false - end - - add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" - - create_table "enumerations", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "is_default", :default => false, :null => false - t.string "type" - t.boolean "active", :default => true, :null => false - t.integer "project_id" - t.integer "parent_id" - t.string "position_name", :limit => 30 - end - - add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" - add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - - create_table "forums", :force => true do |t| - t.string "name", :null => false - t.string "description", :default => "" - t.integer "topic_count", :default => 0 - t.integer "memo_count", :default => 0 - t.integer "last_memo_id", :default => 0 - t.integer "creator_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "groups_users", :id => false, :force => true do |t| - t.integer "group_id", :null => false - t.integer "user_id", :null => false - end - - add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true - - create_table "homework_attaches", :force => true do |t| - t.integer "bid_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "homework_for_courses", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - end - - create_table "issue_categories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.integer "assigned_to_id" - end - - add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :default => "", :null => false - t.integer "delay" - end - - add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true - add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" - add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" - - create_table "issue_statuses", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_closed", :default => false, :null => false - t.boolean "is_default", :default => false, :null => false - t.integer "position", :default => 1 - t.integer "default_done_ratio" - end - - add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" - add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" - add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" - - create_table "issues", :force => true do |t| - t.integer "tracker_id", :null => false - t.integer "project_id", :null => false - t.string "subject", :default => "", :null => false - t.text "description" - t.date "due_date" - t.integer "category_id" - t.integer "status_id", :null => false - t.integer "assigned_to_id" - t.integer "priority_id", :null => false - t.integer "fixed_version_id" - t.integer "author_id", :null => false - t.integer "lock_version", :default => 0, :null => false - t.datetime "created_on" - t.datetime "updated_on" - t.date "start_date" - t.integer "done_ratio", :default => 0, :null => false - t.float "estimated_hours" - t.integer "parent_id" - t.integer "root_id" - t.integer "lft" - t.integer "rgt" - t.boolean "is_private", :default => false, :null => false - t.datetime "closed_on" - end - - add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" - add_index "issues", ["author_id"], :name => "index_issues_on_author_id" - add_index "issues", ["category_id"], :name => "index_issues_on_category_id" - add_index "issues", ["created_on"], :name => "index_issues_on_created_on" - add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" - add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" - add_index "issues", ["project_id"], :name => "issues_project_id" - add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" - add_index "issues", ["status_id"], :name => "index_issues_on_status_id" - add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" - - create_table "join_in_contests", :force => true do |t| - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "journal_details", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - - create_table "journal_replies", :id => false, :force => true do |t| - t.integer "journal_id" - t.integer "user_id" - t.integer "reply_id" - end - - add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" - add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" - add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" - - create_table "journals", :force => true do |t| - t.integer "journalized_id", :default => 0, :null => false - t.string "journalized_type", :limit => 30, :default => "", :null => false - t.integer "user_id", :default => 0, :null => false - t.text "notes" - t.datetime "created_on", :null => false - t.boolean "private_notes", :default => false, :null => false - end - - add_index "journals", ["created_on"], :name => "index_journals_on_created_on" - add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" - add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" - add_index "journals", ["user_id"], :name => "index_journals_on_user_id" - - create_table "journals_for_messages", :force => true do |t| - t.integer "jour_id" - t.string "jour_type" - t.integer "user_id" - t.text "notes" - t.integer "status" - t.integer "reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.string "m_parent_id" - t.boolean "is_readed" - t.integer "m_reply_count" - t.integer "m_reply_id" - end - - create_table "member_roles", :force => true do |t| - t.integer "member_id", :null => false - t.integer "role_id", :null => false - t.integer "inherited_from" - end - - add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" - add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" - - create_table "members", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - t.datetime "created_on" - t.boolean "mail_notification", :default => false, :null => false - end - - add_index "members", ["project_id"], :name => "index_members_on_project_id" - add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true - add_index "members", ["user_id"], :name => "index_members_on_user_id" - - create_table "memos", :force => true do |t| - t.integer "forum_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id", :null => false - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count", :default => 0 - end - - create_table "messages", :force => true do |t| - t.integer "board_id", :null => false - t.integer "parent_id" - t.string "subject", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "replies_count", :default => 0, :null => false - t.integer "last_reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - end - - add_index "messages", ["author_id"], :name => "index_messages_on_author_id" - add_index "messages", ["board_id"], :name => "messages_board_id" - add_index "messages", ["created_on"], :name => "index_messages_on_created_on" - add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" - add_index "messages", ["parent_id"], :name => "messages_parent_id" - - create_table "news", :force => true do |t| - t.integer "project_id" - t.string "title", :limit => 60, :default => "", :null => false - t.string "summary", :default => "" - t.text "description" - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.integer "comments_count", :default => 0, :null => false - end - - add_index "news", ["author_id"], :name => "index_news_on_author_id" - add_index "news", ["created_on"], :name => "index_news_on_created_on" - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "open_id_authentication_associations", :force => true do |t| - t.integer "issued" - t.integer "lifetime" - t.string "handle" - t.string "assoc_type" - t.binary "server_url" - t.binary "secret" - end - - create_table "open_id_authentication_nonces", :force => true do |t| - t.integer "timestamp", :null => false - t.string "server_url" - t.string "salt", :null => false - end - - create_table "praise_tread_caches", :force => true do |t| - t.integer "object_id", :null => false - t.string "object_type" - t.integer "praise_num" - t.integer "tread_num" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "praise_treads", :force => true do |t| - t.integer "user_id", :null => false - t.integer "praise_tread_object_id" - t.string "praise_tread_object_type" - t.integer "praise_or_tread" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_infos", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "project_id" - t.integer "project_type" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - end - - add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - - create_table "projects", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.string "homepage", :default => "" - t.boolean "is_public", :default => true, :null => false - t.integer "parent_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "identifier" - t.integer "status", :default => 1, :null => false - t.integer "lft" - t.integer "rgt" - t.boolean "inherit_members", :default => false, :null => false - t.integer "project_type" - t.boolean "hidden_repo", :default => false, :null => false - end - - add_index "projects", ["lft"], :name => "index_projects_on_lft" - add_index "projects", ["rgt"], :name => "index_projects_on_rgt" - - create_table "projects_trackers", :id => false, :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true - add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - - create_table "queries", :force => true do |t| - t.integer "project_id" - t.string "name", :default => "", :null => false - t.text "filters" - t.integer "user_id", :default => 0, :null => false - t.boolean "is_public", :default => false, :null => false - t.text "column_names" - t.text "sort_criteria" - t.string "group_by" - t.string "type" - end - - add_index "queries", ["project_id"], :name => "index_queries_on_project_id" - add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - - create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" - t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 - t.text "extra_info" - t.string "identifier" - t.boolean "is_default", :default => false - end - - add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" - - create_table "roles", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "assignable", :default => true - t.integer "builtin", :default => 0, :null => false - t.text "permissions" - t.string "issues_visibility", :limit => 30, :default => "default", :null => false - end - - create_table "seems_rateable_cached_ratings", :force => true do |t| - t.integer "cacheable_id", :limit => 8 - t.string "cacheable_type" - t.float "avg", :null => false - t.integer "cnt", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_rates", :force => true do |t| - t.integer "rater_id", :limit => 8 - t.integer "rateable_id" - t.string "rateable_type" - t.float "stars", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "settings", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "value" - t.datetime "updated_on" - end - - add_index "settings", ["name"], :name => "index_settings_on_name" - - create_table "shares", :force => true do |t| - t.date "created_on" - t.string "url" - t.string "title" - t.integer "share_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - t.integer "user_id" - t.string "description" - end - - create_table "students_for_courses", :force => true do |t| - t.integer "student_id" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "taggings", :force => true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", :limit => 128 - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" - - create_table "tags", :force => true do |t| - t.string "name" - end - - create_table "teachers", :force => true do |t| - t.string "tea_name" - t.string "location" - t.integer "couurse_time" - t.integer "course_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "extra" - end - - create_table "time_entries", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.integer "issue_id" - t.float "hours", :null => false - t.string "comments" - t.integer "activity_id", :null => false - t.date "spent_on", :null => false - t.integer "tyear", :null => false - t.integer "tmonth", :null => false - t.integer "tweek", :null => false - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" - add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" - add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" - add_index "time_entries", ["project_id"], :name => "time_entries_project_id" - add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" - - create_table "tokens", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40, :default => "", :null => false - t.datetime "created_on", :null => false - end - - add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" - add_index "tokens", ["value"], :name => "tokens_value", :unique => true - - create_table "trackers", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_in_chlog", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "is_in_roadmap", :default => true, :null => false - t.integer "fields_bits", :default => 0 - end - - create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false - t.date "birthday" - t.string "brief_introduction" - t.integer "gender" - t.string "location" - t.string "occupation" - t.integer "work_experience" - t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "technical_title" - t.integer "identity" - t.string "student_id" - t.string "teacher_realname" - t.string "student_realname" - t.string "location_city" - end - - create_table "user_grades", :force => true do |t| - t.integer "user_id", :null => false - t.integer "project_id", :null => false - t.float "grade", :default => 0.0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" - add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" - add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" - - create_table "user_preferences", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.text "others" - t.boolean "hide_mail", :default => false - t.string "time_zone" - end - - add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - - create_table "user_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "grade", :default => 0.0 - end - - add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" - add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" - add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - - create_table "users", :force => true do |t| - t.string "login", :default => "", :null => false - t.string "hashed_password", :limit => 40, :default => "", :null => false - t.string "firstname", :limit => 30, :default => "", :null => false - t.string "lastname", :default => "", :null => false - t.string "mail", :limit => 60, :default => "", :null => false - t.boolean "admin", :default => false, :null => false - t.integer "status", :default => 1, :null => false - t.datetime "last_login_on" - t.string "language", :limit => 5, :default => "" - t.integer "auth_source_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "type" - t.string "identity_url" - t.string "mail_notification", :default => "", :null => false - t.string "salt", :limit => 64 - end - - add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" - add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" - add_index "users", ["type"], :name => "index_users_on_type" - - create_table "versions", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :default => "", :null => false - t.string "description", :default => "" - t.date "effective_date" - t.datetime "created_on" - t.datetime "updated_on" - t.string "wiki_page_title" - t.string "status", :default => "open" - t.string "sharing", :default => "none", :null => false - end - - add_index "versions", ["project_id"], :name => "versions_project_id" - add_index "versions", ["sharing"], :name => "index_versions_on_sharing" - - create_table "watchers", :force => true do |t| - t.string "watchable_type", :default => "", :null => false - t.integer "watchable_id", :default => 0, :null => false - t.integer "user_id" - end - - add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" - add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" - add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" - - create_table "wiki_content_versions", :force => true do |t| - t.integer "wiki_content_id", :null => false - t.integer "page_id", :null => false - t.integer "author_id" - t.binary "data", :limit => 2147483647 - t.string "compression", :limit => 6, :default => "" - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" - add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" - - create_table "wiki_contents", :force => true do |t| - t.integer "page_id", :null => false - t.integer "author_id" - t.text "text", :limit => 2147483647 - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" - add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" - - create_table "wiki_pages", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title", :null => false - t.datetime "created_on", :null => false - t.boolean "protected", :default => false, :null => false - t.integer "parent_id" - end - - add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" - add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" - add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" - - create_table "wiki_redirects", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title" - t.string "redirects_to" - t.datetime "created_on", :null => false - end - - add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" - add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" - - create_table "wikis", :force => true do |t| - t.integer "project_id", :null => false - t.string "start_page", :null => false - t.integer "status", :default => 1, :null => false - end - - add_index "wikis", ["project_id"], :name => "wikis_project_id" - - create_table "workflows", :force => true do |t| - t.integer "tracker_id", :default => 0, :null => false - t.integer "old_status_id", :default => 0, :null => false - t.integer "new_status_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - t.boolean "assignee", :default => false, :null => false - t.boolean "author", :default => false, :null => false - t.string "type", :limit => 30 - t.string "field_name", :limit => 30 - t.string "rule", :limit => 30 - end - - add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" - add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" - add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" - add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" - -end diff --git a/db/schema.rb.LOCAL.rb b/db/schema.rb.LOCAL.rb deleted file mode 100644 index 9584fa817..000000000 --- a/db/schema.rb.LOCAL.rb +++ /dev/null @@ -1,895 +0,0 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140320022724) do - - create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false - end - - add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" - add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" - add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - - create_table "attachments", :force => true do |t| - t.integer "container_id" - t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - end - - add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" - add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" - add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" - - create_table "auth_sources", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 60, :default => "", :null => false - t.string "host", :limit => 60 - t.integer "port" - t.string "account" - t.string "account_password", :default => "" - t.string "base_dn" - t.string "attr_login", :limit => 30 - t.string "attr_firstname", :limit => 30 - t.string "attr_lastname", :limit => 30 - t.string "attr_mail", :limit => 30 - t.boolean "onthefly_register", :default => false, :null => false - t.boolean "tls", :default => false, :null => false - t.string "filter" - t.integer "timeout" - end - - add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - - create_table "biding_projects", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "bids", :force => true do |t| - t.string "name" - t.string "budget", :null => false - t.integer "author_id" - t.date "deadline" - t.string "description" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.integer "commit" - t.integer "reward_type" - t.integer "homework_type" - t.integer "parent_id" - t.string "password" - end - - create_table "boards", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :default => "", :null => false - t.string "description" - t.integer "position", :default => 1 - t.integer "topics_count", :default => 0, :null => false - t.integer "messages_count", :default => 0, :null => false - t.integer "last_message_id" - t.integer "parent_id" - end - - add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" - add_index "boards", ["project_id"], :name => "boards_project_id" - - create_table "changes", :force => true do |t| - t.integer "changeset_id", :null => false - t.string "action", :limit => 1, :default => "", :null => false - t.text "path", :null => false - t.text "from_path" - t.string "from_revision" - t.string "revision" - t.string "branch" - end - - add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" - - create_table "changeset_parents", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "parent_id", :null => false - end - - add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" - add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" - - create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false - t.string "committer" - t.datetime "committed_on", :null => false - t.text "comments" - t.date "commit_date" - t.string "scmid" - t.integer "user_id" - end - - add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" - add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true - add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" - add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" - add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" - - create_table "changesets_issues", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "issue_id", :null => false - end - - add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true - - create_table "comments", :force => true do |t| - t.string "commented_type", :limit => 30, :default => "", :null => false - t.integer "commented_id", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.text "comments" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "comments", ["author_id"], :name => "index_comments_on_author_id" - add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" - - create_table "courses", :force => true do |t| - t.integer "tea_id" - t.string "name" - t.integer "state" - t.string "code" - t.integer "time" - t.string "extra" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "location" - t.string "term" - t.string "string" - t.string "password" - t.string "setup_time" - t.string "endup_time" - t.string "class_period" - t.integer "school_id" - end - - create_table "custom_fields", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.string "field_format", :limit => 30, :default => "", :null => false - t.text "possible_values" - t.string "regexp", :default => "" - t.integer "min_length", :default => 0, :null => false - t.integer "max_length", :default => 0, :null => false - t.boolean "is_required", :default => false, :null => false - t.boolean "is_for_all", :default => false, :null => false - t.boolean "is_filter", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "searchable", :default => false - t.text "default_value" - t.boolean "editable", :default => true - t.boolean "visible", :default => true, :null => false - t.boolean "multiple", :default => false - end - - add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - end - - add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true - - create_table "custom_fields_trackers", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true - - create_table "custom_values", :force => true do |t| - t.string "customized_type", :limit => 30, :default => "", :null => false - t.integer "customized_id", :default => 0, :null => false - t.integer "custom_field_id", :default => 0, :null => false - t.text "value" - end - - add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" - add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" - - create_table "documents", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "category_id", :default => 0, :null => false - t.string "title", :limit => 60, :default => "", :null => false - t.text "description" - t.datetime "created_on" - end - - add_index "documents", ["category_id"], :name => "index_documents_on_category_id" - add_index "documents", ["created_on"], :name => "index_documents_on_created_on" - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "enabled_modules", :force => true do |t| - t.integer "project_id" - t.string "name", :null => false - end - - add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" - - create_table "enumerations", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "is_default", :default => false, :null => false - t.string "type" - t.boolean "active", :default => true, :null => false - t.integer "project_id" - t.integer "parent_id" - t.string "position_name", :limit => 30 - end - - add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" - add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - - create_table "forums", :force => true do |t| - t.string "name", :null => false - t.string "description", :default => "" - t.integer "topic_count", :default => 0 - t.integer "memo_count", :default => 0 - t.integer "last_memo_id", :default => 0 - t.integer "creator_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "groups_users", :id => false, :force => true do |t| - t.integer "group_id", :null => false - t.integer "user_id", :null => false - end - - add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true - - create_table "homework_attaches", :force => true do |t| - t.integer "bid_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "homework_for_courses", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - end - - create_table "issue_categories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.integer "assigned_to_id" - end - - add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :default => "", :null => false - t.integer "delay" - end - - add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true - add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" - add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" - - create_table "issue_statuses", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_closed", :default => false, :null => false - t.boolean "is_default", :default => false, :null => false - t.integer "position", :default => 1 - t.integer "default_done_ratio" - end - - add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" - add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" - add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" - - create_table "issues", :force => true do |t| - t.integer "tracker_id", :null => false - t.integer "project_id", :null => false - t.string "subject", :default => "", :null => false - t.text "description" - t.date "due_date" - t.integer "category_id" - t.integer "status_id", :null => false - t.integer "assigned_to_id" - t.integer "priority_id", :null => false - t.integer "fixed_version_id" - t.integer "author_id", :null => false - t.integer "lock_version", :default => 0, :null => false - t.datetime "created_on" - t.datetime "updated_on" - t.date "start_date" - t.integer "done_ratio", :default => 0, :null => false - t.float "estimated_hours" - t.integer "parent_id" - t.integer "root_id" - t.integer "lft" - t.integer "rgt" - t.boolean "is_private", :default => false, :null => false - t.datetime "closed_on" - end - - add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" - add_index "issues", ["author_id"], :name => "index_issues_on_author_id" - add_index "issues", ["category_id"], :name => "index_issues_on_category_id" - add_index "issues", ["created_on"], :name => "index_issues_on_created_on" - add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" - add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" - add_index "issues", ["project_id"], :name => "issues_project_id" - add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" - add_index "issues", ["status_id"], :name => "index_issues_on_status_id" - add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" - - create_table "join_in_contests", :force => true do |t| - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "journal_details", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - - create_table "journal_replies", :id => false, :force => true do |t| - t.integer "journal_id" - t.integer "user_id" - t.integer "reply_id" - end - - add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" - add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" - add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" - - create_table "journals", :force => true do |t| - t.integer "journalized_id", :default => 0, :null => false - t.string "journalized_type", :limit => 30, :default => "", :null => false - t.integer "user_id", :default => 0, :null => false - t.text "notes" - t.datetime "created_on", :null => false - t.boolean "private_notes", :default => false, :null => false - end - - add_index "journals", ["created_on"], :name => "index_journals_on_created_on" - add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" - add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" - add_index "journals", ["user_id"], :name => "index_journals_on_user_id" - - create_table "journals_for_messages", :force => true do |t| - t.integer "jour_id" - t.string "jour_type" - t.integer "user_id" - t.text "notes" - t.integer "status" - t.integer "reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.string "m_parent_id" - t.boolean "is_readed" - t.integer "m_reply_count" - t.integer "m_reply_id" - end - - create_table "member_roles", :force => true do |t| - t.integer "member_id", :null => false - t.integer "role_id", :null => false - t.integer "inherited_from" - end - - add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" - add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" - - create_table "members", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - t.datetime "created_on" - t.boolean "mail_notification", :default => false, :null => false - end - - add_index "members", ["project_id"], :name => "index_members_on_project_id" - add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true - add_index "members", ["user_id"], :name => "index_members_on_user_id" - - create_table "memos", :force => true do |t| - t.integer "forum_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id", :null => false - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count", :default => 0 - end - - create_table "messages", :force => true do |t| - t.integer "board_id", :null => false - t.integer "parent_id" - t.string "subject", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "replies_count", :default => 0, :null => false - t.integer "last_reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - end - - add_index "messages", ["author_id"], :name => "index_messages_on_author_id" - add_index "messages", ["board_id"], :name => "messages_board_id" - add_index "messages", ["created_on"], :name => "index_messages_on_created_on" - add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" - add_index "messages", ["parent_id"], :name => "messages_parent_id" - - create_table "news", :force => true do |t| - t.integer "project_id" - t.string "title", :limit => 60, :default => "", :null => false - t.string "summary", :default => "" - t.text "description" - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.integer "comments_count", :default => 0, :null => false - end - - add_index "news", ["author_id"], :name => "index_news_on_author_id" - add_index "news", ["created_on"], :name => "index_news_on_created_on" - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "open_id_authentication_associations", :force => true do |t| - t.integer "issued" - t.integer "lifetime" - t.string "handle" - t.string "assoc_type" - t.binary "server_url" - t.binary "secret" - end - - create_table "open_id_authentication_nonces", :force => true do |t| - t.integer "timestamp", :null => false - t.string "server_url" - t.string "salt", :null => false - end - - create_table "praise_tread_caches", :force => true do |t| - t.integer "object_id", :null => false - t.string "object_type" - t.integer "praise_num" - t.integer "tread_num" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "praise_treads", :force => true do |t| - t.integer "user_id", :null => false - t.integer "praise_tread_object_id" - t.string "praise_tread_object_type" - t.integer "praise_or_tread" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_infos", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "project_id" - t.integer "project_type" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - end - - add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - - create_table "projects", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.string "homepage", :default => "" - t.boolean "is_public", :default => true, :null => false - t.integer "parent_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "identifier" - t.integer "status", :default => 1, :null => false - t.integer "lft" - t.integer "rgt" - t.boolean "inherit_members", :default => false, :null => false - t.integer "project_type" - t.boolean "hidden_repo", :default => false, :null => false - end - - add_index "projects", ["lft"], :name => "index_projects_on_lft" - add_index "projects", ["rgt"], :name => "index_projects_on_rgt" - - create_table "projects_trackers", :id => false, :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true - add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - - create_table "queries", :force => true do |t| - t.integer "project_id" - t.string "name", :default => "", :null => false - t.text "filters" - t.integer "user_id", :default => 0, :null => false - t.boolean "is_public", :default => false, :null => false - t.text "column_names" - t.text "sort_criteria" - t.string "group_by" - t.string "type" - end - - add_index "queries", ["project_id"], :name => "index_queries_on_project_id" - add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - - create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" - t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 - t.text "extra_info" - t.string "identifier" - t.boolean "is_default", :default => false - end - - add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" - - create_table "roles", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "assignable", :default => true - t.integer "builtin", :default => 0, :null => false - t.text "permissions" - t.string "issues_visibility", :limit => 30, :default => "default", :null => false - end - - create_table "schools", :force => true do |t| - t.string "name" - t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_cached_ratings", :force => true do |t| - t.integer "cacheable_id", :limit => 8 - t.string "cacheable_type" - t.float "avg", :null => false - t.integer "cnt", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_rates", :force => true do |t| - t.integer "rater_id", :limit => 8 - t.integer "rateable_id" - t.string "rateable_type" - t.float "stars", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "settings", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "value" - t.datetime "updated_on" - end - - add_index "settings", ["name"], :name => "index_settings_on_name" - - create_table "shares", :force => true do |t| - t.date "created_on" - t.string "url" - t.string "title" - t.integer "share_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - t.integer "user_id" - t.string "description" - end - - create_table "students_for_courses", :force => true do |t| - t.integer "student_id" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "taggings", :force => true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", :limit => 128 - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" - - create_table "tags", :force => true do |t| - t.string "name" - end - - create_table "teachers", :force => true do |t| - t.string "tea_name" - t.string "location" - t.integer "couurse_time" - t.integer "course_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "extra" - end - - create_table "time_entries", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.integer "issue_id" - t.float "hours", :null => false - t.string "comments" - t.integer "activity_id", :null => false - t.date "spent_on", :null => false - t.integer "tyear", :null => false - t.integer "tmonth", :null => false - t.integer "tweek", :null => false - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" - add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" - add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" - add_index "time_entries", ["project_id"], :name => "time_entries_project_id" - add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" - - create_table "tokens", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40, :default => "", :null => false - t.datetime "created_on", :null => false - end - - add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" - add_index "tokens", ["value"], :name => "tokens_value", :unique => true - - create_table "trackers", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_in_chlog", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "is_in_roadmap", :default => true, :null => false - t.integer "fields_bits", :default => 0 - end - - create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false - t.date "birthday" - t.string "brief_introduction" - t.integer "gender" - t.string "location" - t.string "occupation" - t.integer "work_experience" - t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "technical_title" - t.integer "identity" - t.string "student_id" - t.string "teacher_realname" - t.string "student_realname" - t.string "location_city" - end - - create_table "user_grades", :force => true do |t| - t.integer "user_id", :null => false - t.integer "project_id", :null => false - t.float "grade", :default => 0.0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" - add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" - add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" - - create_table "user_preferences", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.text "others" - t.boolean "hide_mail", :default => false - t.string "time_zone" - end - - add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - - create_table "user_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "grade", :default => 0.0 - end - - add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" - add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" - add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - - create_table "users", :force => true do |t| - t.string "login", :default => "", :null => false - t.string "hashed_password", :limit => 40, :default => "", :null => false - t.string "firstname", :limit => 30, :default => "", :null => false - t.string "lastname", :default => "", :null => false - t.string "mail", :limit => 60, :default => "", :null => false - t.boolean "admin", :default => false, :null => false - t.integer "status", :default => 1, :null => false - t.datetime "last_login_on" - t.string "language", :limit => 5, :default => "" - t.integer "auth_source_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "type" - t.string "identity_url" - t.string "mail_notification", :default => "", :null => false - t.string "salt", :limit => 64 - end - - add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" - add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" - add_index "users", ["type"], :name => "index_users_on_type" - - create_table "versions", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :default => "", :null => false - t.string "description", :default => "" - t.date "effective_date" - t.datetime "created_on" - t.datetime "updated_on" - t.string "wiki_page_title" - t.string "status", :default => "open" - t.string "sharing", :default => "none", :null => false - end - - add_index "versions", ["project_id"], :name => "versions_project_id" - add_index "versions", ["sharing"], :name => "index_versions_on_sharing" - - create_table "watchers", :force => true do |t| - t.string "watchable_type", :default => "", :null => false - t.integer "watchable_id", :default => 0, :null => false - t.integer "user_id" - end - - add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" - add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" - add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" - - create_table "wiki_content_versions", :force => true do |t| - t.integer "wiki_content_id", :null => false - t.integer "page_id", :null => false - t.integer "author_id" - t.binary "data", :limit => 2147483647 - t.string "compression", :limit => 6, :default => "" - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" - add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" - - create_table "wiki_contents", :force => true do |t| - t.integer "page_id", :null => false - t.integer "author_id" - t.text "text", :limit => 2147483647 - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" - add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" - - create_table "wiki_pages", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title", :null => false - t.datetime "created_on", :null => false - t.boolean "protected", :default => false, :null => false - t.integer "parent_id" - end - - add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" - add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" - add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" - - create_table "wiki_redirects", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title" - t.string "redirects_to" - t.datetime "created_on", :null => false - end - - add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" - add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" - - create_table "wikis", :force => true do |t| - t.integer "project_id", :null => false - t.string "start_page", :null => false - t.integer "status", :default => 1, :null => false - end - - add_index "wikis", ["project_id"], :name => "wikis_project_id" - - create_table "workflows", :force => true do |t| - t.integer "tracker_id", :default => 0, :null => false - t.integer "old_status_id", :default => 0, :null => false - t.integer "new_status_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - t.boolean "assignee", :default => false, :null => false - t.boolean "author", :default => false, :null => false - t.string "type", :limit => 30 - t.string "field_name", :limit => 30 - t.string "rule", :limit => 30 - end - - add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" - add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" - add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" - add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" - -end diff --git a/db/schema.rb.REMOTE.rb b/db/schema.rb.REMOTE.rb deleted file mode 100644 index e0e258932..000000000 --- a/db/schema.rb.REMOTE.rb +++ /dev/null @@ -1,958 +0,0 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140411005214) do - - create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false - end - - add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" - add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" - add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - - create_table "attachments", :force => true do |t| - t.integer "container_id" - t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - end - - add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" - add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" - add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" - - create_table "auth_sources", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 60, :default => "", :null => false - t.string "host", :limit => 60 - t.integer "port" - t.string "account" - t.string "account_password", :default => "" - t.string "base_dn" - t.string "attr_login", :limit => 30 - t.string "attr_firstname", :limit => 30 - t.string "attr_lastname", :limit => 30 - t.string "attr_mail", :limit => 30 - t.boolean "onthefly_register", :default => false, :null => false - t.boolean "tls", :default => false, :null => false - t.string "filter" - t.integer "timeout" - end - - add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - - create_table "biding_projects", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "bids", :force => true do |t| - t.string "name" - t.string "budget", :null => false - t.integer "author_id" - t.date "deadline" - t.string "description" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.integer "commit" - t.integer "reward_type" - t.integer "homework_type" - t.integer "parent_id" - t.string "password" - end - - create_table "boards", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :default => "", :null => false - t.string "description" - t.integer "position", :default => 1 - t.integer "topics_count", :default => 0, :null => false - t.integer "messages_count", :default => 0, :null => false - t.integer "last_message_id" - t.integer "parent_id" - end - - add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" - add_index "boards", ["project_id"], :name => "boards_project_id" - - create_table "changes", :force => true do |t| - t.integer "changeset_id", :null => false - t.string "action", :limit => 1, :default => "", :null => false - t.text "path", :null => false - t.text "from_path" - t.string "from_revision" - t.string "revision" - t.string "branch" - end - - add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" - - create_table "changeset_parents", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "parent_id", :null => false - end - - add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" - add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" - - create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false - t.string "committer" - t.datetime "committed_on", :null => false - t.text "comments" - t.date "commit_date" - t.string "scmid" - t.integer "user_id" - end - - add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" - add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true - add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" - add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" - add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" - - create_table "changesets_issues", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "issue_id", :null => false - end - - add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true - - create_table "comments", :force => true do |t| - t.string "commented_type", :limit => 30, :default => "", :null => false - t.integer "commented_id", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.text "comments" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "comments", ["author_id"], :name => "index_comments_on_author_id" - add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" - - create_table "contesting_projects", :force => true do |t| - t.integer "project_id" - t.string "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contesting_softapplications", :force => true do |t| - t.integer "softapplication_id" - t.integer "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contests", :force => true do |t| - t.string "name" - t.integer "budget" - t.integer "author_id" - t.date "deadline" - t.string "description" - t.integer "commit" - t.string "password" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - create_table "courses", :force => true do |t| - t.integer "tea_id" - t.string "name" - t.integer "state" - t.string "code" - t.integer "time" - t.string "extra" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "location" - t.string "term" - t.string "string" - t.string "password" - t.string "setup_time" - t.string "endup_time" - t.string "class_period" - t.integer "school_id" - end - - create_table "custom_fields", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.string "field_format", :limit => 30, :default => "", :null => false - t.text "possible_values" - t.string "regexp", :default => "" - t.integer "min_length", :default => 0, :null => false - t.integer "max_length", :default => 0, :null => false - t.boolean "is_required", :default => false, :null => false - t.boolean "is_for_all", :default => false, :null => false - t.boolean "is_filter", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "searchable", :default => false - t.text "default_value" - t.boolean "editable", :default => true - t.boolean "visible", :default => true, :null => false - t.boolean "multiple", :default => false - end - - add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - end - - add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true - - create_table "custom_fields_trackers", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true - - create_table "custom_values", :force => true do |t| - t.string "customized_type", :limit => 30, :default => "", :null => false - t.integer "customized_id", :default => 0, :null => false - t.integer "custom_field_id", :default => 0, :null => false - t.text "value" - end - - add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" - add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" - - create_table "documents", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "category_id", :default => 0, :null => false - t.string "title", :limit => 60, :default => "", :null => false - t.text "description" - t.datetime "created_on" - end - - add_index "documents", ["category_id"], :name => "index_documents_on_category_id" - add_index "documents", ["created_on"], :name => "index_documents_on_created_on" - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "enabled_modules", :force => true do |t| - t.integer "project_id" - t.string "name", :null => false - end - - add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" - - create_table "enumerations", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "is_default", :default => false, :null => false - t.string "type" - t.boolean "active", :default => true, :null => false - t.integer "project_id" - t.integer "parent_id" - t.string "position_name", :limit => 30 - end - - add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" - add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - - create_table "forums", :force => true do |t| - t.string "name", :null => false - t.string "description", :default => "" - t.integer "topic_count", :default => 0 - t.integer "memo_count", :default => 0 - t.integer "last_memo_id", :default => 0 - t.integer "creator_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "groups_users", :id => false, :force => true do |t| - t.integer "group_id", :null => false - t.integer "user_id", :null => false - end - - add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true - - create_table "homework_attaches", :force => true do |t| - t.integer "bid_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "homework_for_courses", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - end - - create_table "issue_categories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.integer "assigned_to_id" - end - - add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :default => "", :null => false - t.integer "delay" - end - - add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true - add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" - add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" - - create_table "issue_statuses", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_closed", :default => false, :null => false - t.boolean "is_default", :default => false, :null => false - t.integer "position", :default => 1 - t.integer "default_done_ratio" - end - - add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" - add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" - add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" - - create_table "issues", :force => true do |t| - t.integer "tracker_id", :null => false - t.integer "project_id", :null => false - t.string "subject", :default => "", :null => false - t.text "description" - t.date "due_date" - t.integer "category_id" - t.integer "status_id", :null => false - t.integer "assigned_to_id" - t.integer "priority_id", :null => false - t.integer "fixed_version_id" - t.integer "author_id", :null => false - t.integer "lock_version", :default => 0, :null => false - t.datetime "created_on" - t.datetime "updated_on" - t.date "start_date" - t.integer "done_ratio", :default => 0, :null => false - t.float "estimated_hours" - t.integer "parent_id" - t.integer "root_id" - t.integer "lft" - t.integer "rgt" - t.boolean "is_private", :default => false, :null => false - t.datetime "closed_on" - end - - add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" - add_index "issues", ["author_id"], :name => "index_issues_on_author_id" - add_index "issues", ["category_id"], :name => "index_issues_on_category_id" - add_index "issues", ["created_on"], :name => "index_issues_on_created_on" - add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" - add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" - add_index "issues", ["project_id"], :name => "issues_project_id" - add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" - add_index "issues", ["status_id"], :name => "index_issues_on_status_id" - add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" - - create_table "join_in_competitions", :force => true do |t| - t.integer "user_id" - t.integer "competition_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "join_in_contests", :force => true do |t| - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "journal_details", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - - create_table "journal_replies", :id => false, :force => true do |t| - t.integer "journal_id" - t.integer "user_id" - t.integer "reply_id" - end - - add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" - add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" - add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" - - create_table "journals", :force => true do |t| - t.integer "journalized_id", :default => 0, :null => false - t.string "journalized_type", :limit => 30, :default => "", :null => false - t.integer "user_id", :default => 0, :null => false - t.text "notes" - t.datetime "created_on", :null => false - t.boolean "private_notes", :default => false, :null => false - end - - add_index "journals", ["created_on"], :name => "index_journals_on_created_on" - add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" - add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" - add_index "journals", ["user_id"], :name => "index_journals_on_user_id" - - create_table "journals_for_messages", :force => true do |t| - t.integer "jour_id" - t.string "jour_type" - t.integer "user_id" - t.text "notes" - t.integer "status" - t.integer "reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.string "m_parent_id" - t.boolean "is_readed" - t.integer "m_reply_count" - t.integer "m_reply_id" - end - - create_table "member_roles", :force => true do |t| - t.integer "member_id", :null => false - t.integer "role_id", :null => false - t.integer "inherited_from" - end - - add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" - add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" - - create_table "members", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - t.datetime "created_on" - t.boolean "mail_notification", :default => false, :null => false - end - - add_index "members", ["project_id"], :name => "index_members_on_project_id" - add_index "members", ["user_id", "project_id"], :name => "index_members_on_user_id_and_project_id", :unique => true - add_index "members", ["user_id"], :name => "index_members_on_user_id" - - create_table "memos", :force => true do |t| - t.integer "forum_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id", :null => false - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count", :default => 0 - end - - create_table "messages", :force => true do |t| - t.integer "board_id", :null => false - t.integer "parent_id" - t.string "subject", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "replies_count", :default => 0, :null => false - t.integer "last_reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - end - - add_index "messages", ["author_id"], :name => "index_messages_on_author_id" - add_index "messages", ["board_id"], :name => "messages_board_id" - add_index "messages", ["created_on"], :name => "index_messages_on_created_on" - add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" - add_index "messages", ["parent_id"], :name => "messages_parent_id" - - create_table "news", :force => true do |t| - t.integer "project_id" - t.string "title", :limit => 60, :default => "", :null => false - t.string "summary", :default => "" - t.text "description" - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.integer "comments_count", :default => 0, :null => false - end - - add_index "news", ["author_id"], :name => "index_news_on_author_id" - add_index "news", ["created_on"], :name => "index_news_on_created_on" - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "open_id_authentication_associations", :force => true do |t| - t.integer "issued" - t.integer "lifetime" - t.string "handle" - t.string "assoc_type" - t.binary "server_url" - t.binary "secret" - end - - create_table "open_id_authentication_nonces", :force => true do |t| - t.integer "timestamp", :null => false - t.string "server_url" - t.string "salt", :null => false - end - - create_table "praise_tread_caches", :force => true do |t| - t.integer "object_id", :null => false - t.string "object_type" - t.integer "praise_num" - t.integer "tread_num" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "praise_treads", :force => true do |t| - t.integer "user_id", :null => false - t.integer "praise_tread_object_id" - t.string "praise_tread_object_type" - t.integer "praise_or_tread" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_infos", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "project_id" - t.integer "project_type" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - end - - add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - - create_table "projects", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.string "homepage", :default => "" - t.boolean "is_public", :default => true, :null => false - t.integer "parent_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "identifier" - t.integer "status", :default => 1, :null => false - t.integer "lft" - t.integer "rgt" - t.boolean "inherit_members", :default => false, :null => false - t.integer "project_type" - t.boolean "hidden_repo", :default => false, :null => false - end - - add_index "projects", ["lft"], :name => "index_projects_on_lft" - add_index "projects", ["rgt"], :name => "index_projects_on_rgt" - - create_table "projects_trackers", :id => false, :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true - add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - - create_table "queries", :force => true do |t| - t.integer "project_id" - t.string "name", :default => "", :null => false - t.text "filters" - t.integer "user_id", :default => 0, :null => false - t.boolean "is_public", :default => false, :null => false - t.text "column_names" - t.text "sort_criteria" - t.string "group_by" - t.string "type" - end - - add_index "queries", ["project_id"], :name => "index_queries_on_project_id" - add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - - create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" - t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 - t.text "extra_info" - t.string "identifier" - t.boolean "is_default", :default => false - end - - add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" - - create_table "roles", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "assignable", :default => true - t.integer "builtin", :default => 0, :null => false - t.text "permissions" - t.string "issues_visibility", :limit => 30, :default => "default", :null => false - end - - create_table "schools", :force => true do |t| - t.string "name" - t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_cached_ratings", :force => true do |t| - t.integer "cacheable_id", :limit => 8 - t.string "cacheable_type" - t.float "avg", :null => false - t.integer "cnt", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_rates", :force => true do |t| - t.integer "rater_id", :limit => 8 - t.integer "rateable_id" - t.string "rateable_type" - t.float "stars", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "settings", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "value" - t.datetime "updated_on" - end - - add_index "settings", ["name"], :name => "index_settings_on_name" - - create_table "shares", :force => true do |t| - t.date "created_on" - t.string "url" - t.string "title" - t.integer "share_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - t.integer "user_id" - t.string "description" - end - - create_table "softapplications", :force => true do |t| - t.string "name" - t.string "description" - t.integer "app_type_id" - t.string "app_type_name" - t.string "android_min_version_available" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "contest_id" - t.integer "softapplication_id" - t.integer "is_public" - end - - create_table "students_for_courses", :force => true do |t| - t.integer "student_id" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "taggings", :force => true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", :limit => 128 - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" - - create_table "tags", :force => true do |t| - t.string "name" - end - - create_table "teachers", :force => true do |t| - t.string "tea_name" - t.string "location" - t.integer "couurse_time" - t.integer "course_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "extra" - end - - create_table "time_entries", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.integer "issue_id" - t.float "hours", :null => false - t.string "comments" - t.integer "activity_id", :null => false - t.date "spent_on", :null => false - t.integer "tyear", :null => false - t.integer "tmonth", :null => false - t.integer "tweek", :null => false - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" - add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" - add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" - add_index "time_entries", ["project_id"], :name => "time_entries_project_id" - add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" - - create_table "tokens", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40, :default => "", :null => false - t.datetime "created_on", :null => false - end - - add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" - add_index "tokens", ["value"], :name => "tokens_value", :unique => true - - create_table "trackers", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_in_chlog", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "is_in_roadmap", :default => true, :null => false - t.integer "fields_bits", :default => 0 - end - - create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false - t.date "birthday" - t.string "brief_introduction" - t.integer "gender" - t.string "location" - t.string "occupation" - t.integer "work_experience" - t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "technical_title" - t.integer "identity" - t.string "student_id" - t.string "teacher_realname" - t.string "student_realname" - t.string "location_city" - end - - create_table "user_grades", :force => true do |t| - t.integer "user_id", :null => false - t.integer "project_id", :null => false - t.float "grade", :default => 0.0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" - add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" - add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" - - create_table "user_preferences", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.text "others" - t.boolean "hide_mail", :default => false - t.string "time_zone" - end - - add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - - create_table "user_scores", :force => true do |t| - t.integer "user_id", :null => false - t.integer "collaboration" - t.integer "influence" - t.integer "skill" - t.integer "active" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "user_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "grade", :default => 0.0 - end - - add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" - add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" - add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - - create_table "users", :force => true do |t| - t.string "login", :default => "", :null => false - t.string "hashed_password", :limit => 40, :default => "", :null => false - t.string "firstname", :limit => 30, :default => "", :null => false - t.string "lastname", :default => "", :null => false - t.string "mail", :limit => 60, :default => "", :null => false - t.boolean "admin", :default => false, :null => false - t.integer "status", :default => 1, :null => false - t.datetime "last_login_on" - t.string "language", :limit => 5, :default => "" - t.integer "auth_source_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "type" - t.string "identity_url" - t.string "mail_notification", :default => "", :null => false - t.string "salt", :limit => 64 - end - - add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" - add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" - add_index "users", ["type"], :name => "index_users_on_type" - - create_table "versions", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :default => "", :null => false - t.string "description", :default => "" - t.date "effective_date" - t.datetime "created_on" - t.datetime "updated_on" - t.string "wiki_page_title" - t.string "status", :default => "open" - t.string "sharing", :default => "none", :null => false - end - - add_index "versions", ["project_id"], :name => "versions_project_id" - add_index "versions", ["sharing"], :name => "index_versions_on_sharing" - - create_table "watchers", :force => true do |t| - t.string "watchable_type", :default => "", :null => false - t.integer "watchable_id", :default => 0, :null => false - t.integer "user_id" - end - - add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" - add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" - add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" - - create_table "wiki_content_versions", :force => true do |t| - t.integer "wiki_content_id", :null => false - t.integer "page_id", :null => false - t.integer "author_id" - t.binary "data", :limit => 2147483647 - t.string "compression", :limit => 6, :default => "" - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" - add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" - - create_table "wiki_contents", :force => true do |t| - t.integer "page_id", :null => false - t.integer "author_id" - t.text "text", :limit => 2147483647 - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" - add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" - - create_table "wiki_pages", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title", :null => false - t.datetime "created_on", :null => false - t.boolean "protected", :default => false, :null => false - t.integer "parent_id" - end - - add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" - add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" - add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" - - create_table "wiki_redirects", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title" - t.string "redirects_to" - t.datetime "created_on", :null => false - end - - add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" - add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" - - create_table "wikis", :force => true do |t| - t.integer "project_id", :null => false - t.string "start_page", :null => false - t.integer "status", :default => 1, :null => false - end - - add_index "wikis", ["project_id"], :name => "wikis_project_id" - - create_table "workflows", :force => true do |t| - t.integer "tracker_id", :default => 0, :null => false - t.integer "old_status_id", :default => 0, :null => false - t.integer "new_status_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - t.boolean "assignee", :default => false, :null => false - t.boolean "author", :default => false, :null => false - t.string "type", :limit => 30 - t.string "field_name", :limit => 30 - t.string "rule", :limit => 30 - end - - add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" - add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" - add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" - add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" - -end From 1aae4291a53ed54d1e5ad97cd2eacfeef1a7aa2f Mon Sep 17 00:00:00 2001 From: xianbo Date: Mon, 21 Apr 2014 14:15:57 +0800 Subject: [PATCH 11/48] fix gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cf96fa998..1d084c5cc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,4 @@ /public/images/avatars/* /Gemfile /Gemfile.lock -/db/schema.da +/db/schema.rb From b4209b7cc5fa145501f891c11c9552bbf98b5af9 Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 15:41:51 +0800 Subject: [PATCH 12/48] jrating --- Gemfile | 1 + Gemfile.lock | 6 ++- app/controllers/ratings_controller.rb | 15 ++++++ app/models/softapplication.rb | 2 + app/views/layouts/base.html.erb | 1 + app/views/softapplications/show.html.erb | 6 ++- config/routes.rb | 24 ++++----- ...0421044829_create_seems_rateable_rates.rb} | 0 ...0_create_seems_rateable_cached_ratings.rb} | 0 db/schema.rb | 2 +- .../seems_rateable/ratings_controller.rb | 17 ------ .../images/seems_rateable/bg_jRatingInfos.png | Bin 0 -> 572 bytes public/images/seems_rateable/small.png | Bin 0 -> 427 bytes public/images/seems_rateable/stars.png | Bin 0 -> 1018 bytes .../javascripts/seems_rateable/jRating.js | 8 +-- .../javascripts/seems_rateable/rateable.js | 4 +- public/stylesheets/nyan.css | 50 ++++++++++++++++++ 17 files changed, 98 insertions(+), 38 deletions(-) create mode 100644 app/controllers/ratings_controller.rb rename db/migrate/{20130806083151_create_seems_rateable_rates.rb => 20140421044829_create_seems_rateable_rates.rb} (100%) rename db/migrate/{20130806083152_create_seems_rateable_cached_ratings.rb => 20140421044830_create_seems_rateable_cached_ratings.rb} (100%) delete mode 100644 lib/plugins/seems_rateable-master/app/controllers/seems_rateable/ratings_controller.rb create mode 100644 public/images/seems_rateable/bg_jRatingInfos.png create mode 100644 public/images/seems_rateable/small.png create mode 100644 public/images/seems_rateable/stars.png rename app/assets/javascripts/rateable/jRating.js.erb => public/javascripts/seems_rateable/jRating.js (94%) rename app/assets/javascripts/rateable/rateable.js.erb => public/javascripts/seems_rateable/rateable.js (93%) diff --git a/Gemfile b/Gemfile index 63dd32df4..b20c8653a 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ unless RUBY_PLATFORM =~ /w32/ gem 'rubyzip' gem 'zip-zip' end +gem 'seems_rateable' gem "rails", "3.2.13" gem "jquery-rails", "~> 2.0.2" gem "i18n", "~> 0.6.0" diff --git a/Gemfile.lock b/Gemfile.lock index d60847b17..40caae261 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,10 +75,13 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) - rake (10.0.4) + rake (10.1.0) rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) + seems_rateable (1.0.13) + jquery-rails + rails sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -109,3 +112,4 @@ DEPENDENCIES rails (= 3.2.13) rdoc (>= 2.4.2) ruby-openid (~> 2.1.4) + seems_rateable diff --git a/app/controllers/ratings_controller.rb b/app/controllers/ratings_controller.rb new file mode 100644 index 000000000..5ae478af8 --- /dev/null +++ b/app/controllers/ratings_controller.rb @@ -0,0 +1,15 @@ +require_dependency "seems_rateable/application_controller" + +class RatingsController < ::ApplicationController + def create + raise NoCurrentUserInstanceError unless current_user + + obj = params[:kls].classify.constantize.find(params[:idBox]) + begin + obj.rate(params[:rate].to_i, current_user.id, params[:dimension]) + render :json => true + rescue Errors::AlreadyRatedError + render :json => {:error => true} + end + end +end diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 71caf059c..205ede48b 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -1,6 +1,8 @@ class Softapplication < ActiveRecord::Base attr_accessible :android_min_version_available, :app_type_id, :app_type_name, :description, :name, :user_id, :contest_id, :application_developers acts_as_attachable + seems_rateable :allow_update => true, :dimensions => :quality + has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index fe42d00e8..17109b256 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -10,6 +10,7 @@ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> <%= javascript_heads %> +<%= javascript_include_tag 'seems_rateable/jRating', 'seems_rateable/rateable'%> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index 047ecf8dc..76483c7c0 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -36,6 +36,10 @@ 开发人员:<%= @softapplication.application_developers %> + + 平均评分: <%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %> + + @@ -64,7 +68,7 @@
    软件评论:
    -
    +
    评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
    diff --git a/config/routes.rb b/config/routes.rb index 17e09f5a8..54d9124f0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,6 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do + resources :ratings, :only => :create namespace :zipdown do match 'assort' end @@ -506,18 +507,6 @@ RedmineApp::Application.routes.draw do match 'upload_avatar', :to => 'avatar#upload', :via => :post # Endof Tao's code get 'robots.txt', :to => 'welcome#robots' - - Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir| - file = File.join(plugin_dir, "config/routes.rb") - if File.exists?(file) - begin - instance_eval File.read(file) - rescue Exception => e - puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}." - exit 1 - end - end - end ##############测试留言功能 fq post 'words/new', :to => 'words#new' @@ -607,5 +596,16 @@ RedmineApp::Application.routes.draw do match 'words/add_brief_introdution', :controller => 'words', :action => 'add_brief_introdution' + Dir.glob File.expand_path("plugins/*", Rails.root) do |plugin_dir| + file = File.join(plugin_dir, "config/routes.rb") + if File.exists?(file) + begin + instance_eval File.read(file) + rescue Exception => e + puts "An error occurred while loading the routes definition of #{File.basename(plugin_dir)} plugin (#{file}): #{e.message}." + exit 1 + end + end + end get ':controller(/:action(/:id))' end diff --git a/db/migrate/20130806083151_create_seems_rateable_rates.rb b/db/migrate/20140421044829_create_seems_rateable_rates.rb similarity index 100% rename from db/migrate/20130806083151_create_seems_rateable_rates.rb rename to db/migrate/20140421044829_create_seems_rateable_rates.rb diff --git a/db/migrate/20130806083152_create_seems_rateable_cached_ratings.rb b/db/migrate/20140421044830_create_seems_rateable_cached_ratings.rb similarity index 100% rename from db/migrate/20130806083152_create_seems_rateable_cached_ratings.rb rename to db/migrate/20140421044830_create_seems_rateable_cached_ratings.rb diff --git a/db/schema.rb b/db/schema.rb index bfbb7a26e..3918413f3 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 => 20140417091429) do +ActiveRecord::Schema.define(:version => 20140421044830) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false diff --git a/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/ratings_controller.rb b/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/ratings_controller.rb deleted file mode 100644 index afc47d5ef..000000000 --- a/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/ratings_controller.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_dependency "seems_rateable/application_controller" - -module SeemsRateable - class RatingsController < ::ApplicationController - def create - raise NoCurrentUserInstanceError unless current_user - - obj = params[:kls].classify.constantize.find(params[:idBox]) - begin - obj.rate(params[:rate].to_i, current_user.id, params[:dimension]) - render :json => true - rescue Errors::AlreadyRatedError - render :json => {:error => true} - end - end - end -end diff --git a/public/images/seems_rateable/bg_jRatingInfos.png b/public/images/seems_rateable/bg_jRatingInfos.png new file mode 100644 index 0000000000000000000000000000000000000000..af5bf556e15c884bc24c0ab00537123d373bbcc9 GIT binary patch literal 572 zcmV-C0>k}@P)V!IyWhyxINQN4+b0cZ8;>G@@1HMkvg zce~v)5k0ukBUEc;t(9r%=82o%)PBEzW#-ZNee4$xhXYkr1yWbm>2#vS&w{4YX-{kY zXpG6T{!M=~yc-r}S<>ulM(g#O+#+aQSy`4*r_-UjuKlR$YO5%tV)MJ9`S;v|Zf-Ar7!Jz)q)Zz>W|5 z?AaV(GpIy^O`fmfplXJ)qtX_Gc%MO5w~LuWhY{7 zFKL94MxvG#zCLGj$k_~K#}l@7J{{5sA^N3BBe0P~Hgf5WV1taSZ0i$=l1So}jp!Fo z+4juWM?XR%D!Q_L^h1j^(FRHK@_+z41#ChZNuEYHbp7DjNjw`5H7Ooy@WMBpXE*0Y zIA<46n83R| zHOo0aU28g3NBL_ap8eurclA-hC)PLWUpbaRcbdp3*ocB+SQLkB+eWNX45a&|L zu&Sy#RGvCc7gK8W5i+F^S+rcLv1N5mEXz8!ZTo=Lb(JMact4pO?rDw2V8Ve6ytM1` zF2*=0isT`V<2y(=!p%U?uP;RU$ocL$A;bZ$%4@Bal;yh+VmKO&Z$US!i0iuhj9J$Z z7mP6iL=7pWswnc_U@*LCP1xTsm=H?Afe;N`fMmlQ3|cb4c1!;WbuB|HM>?Bi4 zQQNc?)dFe-Ef-bQX@N~}3lhHoY1iCvv!Ag`?hpcQxR?;)el&EOMn_dx$D(xoP}4Mt z+kDtfZO8U8kK3jj+e9O6M>>i9`kd#y@AEw8B>@IAz-TlY-wA?{&@}BcX28J?vdDGa zt#bLvubZ3YUnr%`Hwhl>?CktFKK?eNC{m|ZtNrxGz>klu)p~vJZ$;5E+3aw-RQjig zN-D1n4msR%x%9)t#JK2rj7TYwa=B5uwYBwa`1!TKbzQ&BF#et_D@n*s7>2OvbVh5n z4%Q9BSh@(D^xfilUcJ}rRc+he?{>S}&1Q4kvbvS2sdp5P6Xd?9Se7u3V;QAV+19kw zXfm11$+Db_Mx#S;(=gBTnRD>{{r&GD*b2|Hrteb|3oKPlu*swxjlx+5`U}$K_<2bgf>$Td-%3sNunVG3`T0p~}%gc9e&CY%x zh@z~7{Icwc9AY>DF5sU#6VVT?kJ$?ar!-(Vj-iIpY(IMRL@X3OzA1|0_bUMEm zi+8?RSeTatK}us&5}+~;;V|(?*i!?Y4pivj*8~-YX}0wT5B>9$VHC07)VQ#sI%;fa&9zVg{!%jz>&2j22y9zUu?{tLK4VvZAW0AI;BS z`C?x8NhA_;16?9qZ8Roo^E@X!vmQCGp#K~W*jBXd<1TDy4g~HvPDc6TbJmG}Z{X9~224yb7FuF<@Dij@uUc9GNnH5O^KKXdgU%x^1Bvf<7Zhqp=JQ zR6-lZ<1&vuHE{m!h2Td=<{?@uDstP^YQ4U@Tj_y-(R@B%K!(o4hiktH0@*+VlW+?! z$+Cn!M|wJ)zBuznqrPWZjpo|gV|Qd^;&MJea}^su1kYUP^=vk~h=z8*R4Ntk-Mhb$ zN=aSU<*Q?3WB(71=4Ey|CiOfaKQ}iwuW9NCL{m_96;_O%2tcW$C`xX6dOCf0IJ~*K ox_XyoyAI+m1Q(vi`&WPg02xTa4XYF-ng9R*07*qoM6N<$g5Sm5VgLXD literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/rateable/jRating.js.erb b/public/javascripts/seems_rateable/jRating.js similarity index 94% rename from app/assets/javascripts/rateable/jRating.js.erb rename to public/javascripts/seems_rateable/jRating.js index 4f43a4f97..85612d066 100644 --- a/app/assets/javascripts/rateable/jRating.js.erb +++ b/public/javascripts/seems_rateable/jRating.js @@ -12,13 +12,13 @@ $.fn.jRating = function(op) { var defaults = { /** String vars **/ - bigStarsPath : '<%= image_path "seems_rateable/stars.png" %>', // path of the icon stars.png - smallStarsPath : '<%= image_path "seems_rateable/small.png" %>', // path of the icon small.png - path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>', + bigStarsPath : '/images/seems_rateable/stars.png', // path of the icon stars.png + smallStarsPath : '/images/seems_rateable/small.png', // path of the icon small.png + path : '/ratings', type : 'big', // can be set to 'small' or 'big' /** Boolean vars **/ - step:false, // if true, mouseover binded star by star, + step: true, // if true, mouseover binded star by star, isDisabled:false, showRateInfo: false, canRateAgain : false, diff --git a/app/assets/javascripts/rateable/rateable.js.erb b/public/javascripts/seems_rateable/rateable.js similarity index 93% rename from app/assets/javascripts/rateable/rateable.js.erb rename to public/javascripts/seems_rateable/rateable.js index da6cc3097..e926601d2 100644 --- a/app/assets/javascripts/rateable/rateable.js.erb +++ b/public/javascripts/seems_rateable/rateable.js @@ -11,7 +11,7 @@ $(document).ready(function(){ //showRateInfo:false, //Rate info panel, set true to display //rateInfosX : 45, //In pixel - Absolute left position of the information box during mousemove. //rateInfosY : 5, //In pixel - Absolute top position of the information box during mousemove. - path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>', + path : '/ratings', onSuccess : function(element, rate){ //something like -> //alert('success'); @@ -21,5 +21,5 @@ $(document).ready(function(){ $('You have already rated!').insertAfter(element) } }); - + }); diff --git a/public/stylesheets/nyan.css b/public/stylesheets/nyan.css index 0d4265535..867f76241 100644 --- a/public/stylesheets/nyan.css +++ b/public/stylesheets/nyan.css @@ -5,6 +5,9 @@ -moz-box-sizing: border-box; -box-sizing: border-box; } +.div_inline{ + display: inline-block; +} /*文字不换行*/ .text_nowrap{ word-break:keep-all; @@ -65,7 +68,54 @@ * { font-family: Helvetica, Tahoma, Arial, "Microsoft YaHei", "微软雅黑", SimSun, "宋体", STXihei, "华文细黑", Heiti, "黑体", sans-serif; } +/* 模态窗口 +*******************************************************************************/ +/** jRating CSS **/ +/**Div containing the color of the stars */ + + +.jRatingAverage { + background-color:#f62929; + position:relative; + top:0; + left:0; + z-index:2; + height:100%; +} +.jRatingColor { + background-color:#FFD400; /* bgcolor of the stars*/ + position:relative; + top:0; + left:0; + z-index:2; + height:100%; +} + +/** Div containing the stars **/ +.jStar { + position:relative; + left:0; + z-index:3; +} + +/** P containing the rate informations **/ +p.jRatingInfos { + position: absolute; + z-index:9999; + background: transparent url('bg_jRatingInfos.png') no-repeat; + color: #CACACA; + display: none; + width: 91px; + height: 29px; + font-size:16px; + text-align:center; + padding-top:5px; +} +p.jRatingInfos span.maxRate { + color:#c9c9c9; + font-size:14px; +} /* 模态窗口 *******************************************************************************/ From daf7e8d200f6d678cb309d26fda0d803ec91d341 Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 16:03:55 +0800 Subject: [PATCH 13/48] user added rater --- app/models/user.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/user.rb b/app/models/user.rb index b1991b061..1809c3a98 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -127,6 +127,7 @@ class User < Principal scope :by_join_date, order("created_on DESC") ############################# added by liuping 关注 acts_as_watchable + seems_rateable_rater has_one :user_extensions,:dependent => :destroy ## end From 6bfcf094d9d692a11e1e65e927a0dd6d061778f9 Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 16:21:39 +0800 Subject: [PATCH 14/48] f**k --- db/migrate/20140421081735_create_tmps.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 db/migrate/20140421081735_create_tmps.rb diff --git a/db/migrate/20140421081735_create_tmps.rb b/db/migrate/20140421081735_create_tmps.rb new file mode 100644 index 000000000..713ed5672 --- /dev/null +++ b/db/migrate/20140421081735_create_tmps.rb @@ -0,0 +1,12 @@ +class CreateTmps < ActiveRecord::Migration + def up + create_table :tmp do |t| + t.string :name + t.string :part_number + end + end + + def down + drop_table :tmp + end +end From 4c3955bca0f588b1dc0bcd9e7b0915a86bd3831f Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 16:53:13 +0800 Subject: [PATCH 15/48] revert create tmp This reverts commit 6bfcf094d9d692a11e1e65e927a0dd6d061778f9. --- db/migrate/20140421081735_create_tmps.rb | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 db/migrate/20140421081735_create_tmps.rb diff --git a/db/migrate/20140421081735_create_tmps.rb b/db/migrate/20140421081735_create_tmps.rb deleted file mode 100644 index 713ed5672..000000000 --- a/db/migrate/20140421081735_create_tmps.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateTmps < ActiveRecord::Migration - def up - create_table :tmp do |t| - t.string :name - t.string :part_number - end - end - - def down - drop_table :tmp - end -end From 87fdecdabdc57324ad34440167d0f5c410ef0a1e Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 21 Apr 2014 18:13:57 +0800 Subject: [PATCH 16/48] =?UTF-8?q?=E5=88=9B=E6=96=B0=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .metadata/.lock | 0 .metadata/.log | 211 ++++++++++++++++++ .../.plugins/com.aptana.core.io/connections.9 | 2 + .../com.aptana.index.core/2874248206.index | Bin 0 -> 3389348 bytes .../com.aptana.index.core/2924452064.index | Bin 0 -> 1301519 bytes .../com.aptana.index.core/3084350319.index | Bin 0 -> 20 bytes .../com.aptana.index.core/3380472453.index | Bin 0 -> 20 bytes .../com.aptana.index.core/3406049957.index | Bin 0 -> 678 bytes .../com.aptana.index.core/4010369919.index | Bin 0 -> 1760675 bytes .../com.aptana.index.core/645869811.index | Bin 0 -> 163259 bytes .../com.aptana.projects/dialog_settings.xml | 5 + .../1184073882/4/argumenterror.rb | 11 + .../1184073882/4/constants.rb | 13 ++ .../1184073882/4/globals.rb | 24 ++ .../com.aptana.ruby.ui/dialog_settings.xml | 6 + .../defaultConnection.9 | 7 + .../.plugins/com.aptana.syncing.core/sites.9 | 2 + .../com.aptana.webserver.core/webservers.8 | 6 + .../.projects/demo/.location | Bin 0 -> 71 bytes .../.root/.indexes/history.version | 1 + .../.root/.indexes/properties.index | Bin 0 -> 104 bytes .../.root/.indexes/properties.version | 1 + .../org.eclipse.core.resources/.root/2.tree | Bin 0 -> 4837 bytes .../.safetable/com.aptana.core.io.9 | 3 + .../.safetable/com.aptana.syncing.core.9 | 4 + .../.safetable/com.aptana.webserver.core.8 | 3 + .../.safetable/org.eclipse.core.resources | Bin 0 -> 866 bytes .../.settings/com.aptana.editor.common.prefs | 15 ++ .../.settings/com.aptana.explorer.prefs | 2 + .../.settings/com.aptana.js.core.prefs | 2 + .../.settings/com.aptana.portal.ui.prefs | 2 + .../.settings/com.aptana.rcp.prefs | 3 + .../.settings/com.aptana.ruby.core.prefs | 2 + .../.settings/com.aptana.theme.prefs | 8 + .../.settings/com.aptana.ui.prefs | 3 + .../org.eclipse.core.resources.prefs | 4 + .../.settings/org.eclipse.debug.ui.prefs | 7 + .../.settings/org.eclipse.search.prefs | 2 + .../.settings/org.eclipse.ui.browser.prefs | 2 + .../.settings/org.eclipse.ui.editors.prefs | 40 ++++ .../.settings/org.eclipse.ui.ide.prefs | 7 + .../.settings/org.eclipse.ui.texteditor.prefs | 9 + .../.settings/org.eclipse.ui.workbench.prefs | 21 ++ .../Firefox - Internal Server.launch | 20 ++ ...Internet Explorer - Internal Server.launch | 20 ++ .../launchConfigurationHistory.xml | 25 +++ .../org.eclipse.ui.ide/dialog_settings.xml | 14 ++ .../dialog_settings.xml | 10 + .../org.eclipse.ui.workbench/workbench.xml | 202 +++++++++++++++++ .../org.eclipse.ui.workbench/workingsets.xml | 4 + .metadata/version.ini | 1 + app/controllers/contests_controller.rb | 14 ++ app/views/layouts/base_newcontest.html.erb | 14 +- app/views/projects/files_tags.html.erb | 26 +++ config/locales/zh.yml | 3 + 55 files changed, 779 insertions(+), 2 deletions(-) create mode 100644 .metadata/.lock create mode 100644 .metadata/.log create mode 100644 .metadata/.plugins/com.aptana.core.io/connections.9 create mode 100644 .metadata/.plugins/com.aptana.index.core/2874248206.index create mode 100644 .metadata/.plugins/com.aptana.index.core/2924452064.index create mode 100644 .metadata/.plugins/com.aptana.index.core/3084350319.index create mode 100644 .metadata/.plugins/com.aptana.index.core/3380472453.index create mode 100644 .metadata/.plugins/com.aptana.index.core/3406049957.index create mode 100644 .metadata/.plugins/com.aptana.index.core/4010369919.index create mode 100644 .metadata/.plugins/com.aptana.index.core/645869811.index create mode 100644 .metadata/.plugins/com.aptana.projects/dialog_settings.xml create mode 100644 .metadata/.plugins/com.aptana.ruby.core/1184073882/4/argumenterror.rb create mode 100644 .metadata/.plugins/com.aptana.ruby.core/1184073882/4/constants.rb create mode 100644 .metadata/.plugins/com.aptana.ruby.core/1184073882/4/globals.rb create mode 100644 .metadata/.plugins/com.aptana.ruby.ui/dialog_settings.xml create mode 100644 .metadata/.plugins/com.aptana.syncing.core/defaultConnection.9 create mode 100644 .metadata/.plugins/com.aptana.syncing.core/sites.9 create mode 100644 .metadata/.plugins/com.aptana.webserver.core/webservers.8 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/demo/.location create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/history.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.version create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.root/2.tree create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.9 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.9 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.8 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.editor.common.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.explorer.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.js.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.portal.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.rcp.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.ruby.core.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.theme.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/com.aptana.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.search.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.browser.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.editors.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.ide.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.texteditor.prefs create mode 100644 .metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/Firefox - Internal Server.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.core/.launches/Internet Explorer - Internal Server.launch create mode 100644 .metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/workbench.xml create mode 100644 .metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 .metadata/version.ini create mode 100644 app/views/projects/files_tags.html.erb diff --git a/.metadata/.lock b/.metadata/.lock new file mode 100644 index 000000000..e69de29bb diff --git a/.metadata/.log b/.metadata/.log new file mode 100644 index 000000000..0cb16378c --- /dev/null +++ b/.metadata/.log @@ -0,0 +1,211 @@ +!SESSION 2014-03-11 16:33:06.446 ----------------------------------------------- +eclipse.buildId=3.4.0.201304151603 +java.version=1.6.0_24 +java.vendor=Sun Microsystems Inc. +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.equinox.p2.transport.ecf 2 0 2014-03-11 16:33:20.829 +!MESSAGE Connection to http://download.aptana.com/studio3-rcp/plugin/update/p2.index failed on download.aptana.com. Retry attempt 0 started +!STACK 0 +java.net.UnknownHostException: download.aptana.com + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.provider.filetransfer.events.socket.SocketEventCreateUtil.createSocket(SocketEventCreateUtil.java:43) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:81) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:73) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:65) + at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) + at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) + at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) + at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1142) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransfer.openStreams(HttpClientRetrieveFileTransfer.java:710) + at org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer.sendRetrieveRequest(AbstractRetrieveFileTransfer.java:889) + at org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer.sendRetrieveRequest(AbstractRetrieveFileTransfer.java:576) + at org.eclipse.ecf.provider.filetransfer.retrieve.MultiProtocolRetrieveAdapter.sendRetrieveRequest(MultiProtocolRetrieveAdapter.java:106) + at org.eclipse.equinox.internal.p2.transport.ecf.FileReader.sendRetrieveRequest(FileReader.java:349) + at org.eclipse.equinox.internal.p2.transport.ecf.FileReader.readInto(FileReader.java:295) + at org.eclipse.equinox.internal.p2.transport.ecf.RepositoryTransport.download(RepositoryTransport.java:87) + at org.eclipse.equinox.internal.p2.transport.ecf.RepositoryTransport.download(RepositoryTransport.java:137) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadIndexFile(AbstractRepositoryManager.java:721) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:640) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.getAvailableRepositories(UpdateChecker.java:150) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.checkForUpdates(UpdateChecker.java:128) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:72) + +!ENTRY org.eclipse.equinox.p2.transport.ecf 4 1006 2014-03-11 16:33:21.110 +!MESSAGE Unknown Host: http://download.aptana.com/studio3-rcp/plugin/update/content.xml +!STACK 0 +java.net.UnknownHostException: download.aptana.com + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.provider.filetransfer.events.socket.SocketEventCreateUtil.createSocket(SocketEventCreateUtil.java:43) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:81) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:73) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:65) + at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) + at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) + at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) + at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientFileSystemBrowser.runRequest(HttpClientFileSystemBrowser.java:227) + at org.eclipse.ecf.provider.filetransfer.browse.AbstractFileSystemBrowser$DirectoryJob.run(AbstractFileSystemBrowser.java:69) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +!SESSION 2014-03-11 16:46:11.935 ----------------------------------------------- +eclipse.buildId=3.4.0.201304151603 +java.version=1.6.0_24 +java.vendor=Sun Microsystems Inc. +BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=zh_CN +Command-line arguments: -os win32 -ws win32 -arch x86 + +!ENTRY org.eclipse.equinox.p2.transport.ecf 2 0 2014-03-11 16:46:21.061 +!MESSAGE Connection to http://download.aptana.com/studio3-rcp/plugin/update/p2.index failed on download.aptana.com. Retry attempt 0 started +!STACK 0 +java.net.UnknownHostException: download.aptana.com + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.provider.filetransfer.events.socket.SocketEventCreateUtil.createSocket(SocketEventCreateUtil.java:43) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:81) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:73) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:65) + at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) + at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) + at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) + at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransfer.performConnect(HttpClientRetrieveFileTransfer.java:1142) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientRetrieveFileTransfer.openStreams(HttpClientRetrieveFileTransfer.java:710) + at org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer.sendRetrieveRequest(AbstractRetrieveFileTransfer.java:889) + at org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer.sendRetrieveRequest(AbstractRetrieveFileTransfer.java:576) + at org.eclipse.ecf.provider.filetransfer.retrieve.MultiProtocolRetrieveAdapter.sendRetrieveRequest(MultiProtocolRetrieveAdapter.java:106) + at org.eclipse.equinox.internal.p2.transport.ecf.FileReader.sendRetrieveRequest(FileReader.java:349) + at org.eclipse.equinox.internal.p2.transport.ecf.FileReader.readInto(FileReader.java:295) + at org.eclipse.equinox.internal.p2.transport.ecf.RepositoryTransport.download(RepositoryTransport.java:87) + at org.eclipse.equinox.internal.p2.transport.ecf.RepositoryTransport.download(RepositoryTransport.java:137) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadIndexFile(AbstractRepositoryManager.java:721) + at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:640) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:96) + at org.eclipse.equinox.internal.p2.metadata.repository.MetadataRepositoryManager.loadRepository(MetadataRepositoryManager.java:92) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.getAvailableRepositories(UpdateChecker.java:150) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker.checkForUpdates(UpdateChecker.java:128) + at org.eclipse.equinox.internal.p2.updatechecker.UpdateChecker$UpdateCheckThread.run(UpdateChecker.java:72) + +!ENTRY org.eclipse.equinox.p2.transport.ecf 4 1006 2014-03-11 16:46:21.311 +!MESSAGE Unknown Host: http://download.aptana.com/studio3-rcp/plugin/update/content.xml +!STACK 0 +java.net.UnknownHostException: download.aptana.com + at java.net.PlainSocketImpl.connect(Unknown Source) + at java.net.SocksSocketImpl.connect(Unknown Source) + at java.net.Socket.connect(Unknown Source) + at org.eclipse.ecf.provider.filetransfer.events.socket.SocketEventCreateUtil.createSocket(SocketEventCreateUtil.java:43) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:81) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:73) + at org.eclipse.ecf.internal.provider.filetransfer.httpclient.ECFHttpClientProtocolSocketFactory.createSocket(ECFHttpClientProtocolSocketFactory.java:65) + at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) + at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) + at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) + at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) + at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346) + at org.eclipse.ecf.provider.filetransfer.httpclient.HttpClientFileSystemBrowser.runRequest(HttpClientFileSystemBrowser.java:227) + at org.eclipse.ecf.provider.filetransfer.browse.AbstractFileSystemBrowser$DirectoryJob.run(AbstractFileSystemBrowser.java:69) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) + +!ENTRY org.eclipse.core.resources 4 1 2014-03-11 16:49:31.442 +!MESSAGE Problems occurred while refreshing local changes +!SUBENTRY 1 org.eclipse.core.resources 4 1 2014-03-11 16:49:31.442 +!MESSAGE Problems occurred while refreshing local changes +!STACK 1 +org.eclipse.core.internal.resources.ResourceException: Errors occurred while refreshing resources with the local file system. + at org.eclipse.core.internal.localstore.FileSystemResourceManager.refreshResource(FileSystemResourceManager.java:923) + at org.eclipse.core.internal.localstore.FileSystemResourceManager.refresh(FileSystemResourceManager.java:904) + at org.eclipse.core.internal.resources.Resource.refreshLocal(Resource.java:1663) + at org.eclipse.core.internal.refresh.RefreshJob.runInWorkspace(RefreshJob.java:167) + at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:38) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) +Contains: The project description file (.project) for 'trustie2' is missing. This file contains important information about the project. The project will not function properly until this file is restored. +!SUBENTRY 2 org.eclipse.core.resources 4 271 2014-03-11 16:49:31.442 +!MESSAGE Errors occurred while refreshing resources with the local file system. +!SUBENTRY 3 org.eclipse.core.resources 4 567 2014-03-11 16:49:31.442 +!MESSAGE The project description file (.project) for 'trustie2' is missing. This file contains important information about the project. The project will not function properly until this file is restored. + +!ENTRY com.aptana.ruby.core 4 0 2014-03-11 17:05:47.412 +!MESSAGE (eval):1: Use RbConfig instead of obsolete and deprecated Config. +(eval):1: warning: variable $= is no longer effective +(eval):1: warning: variable $KCODE is no longer effective +(eval):1: warning: variable $KCODE is no longer effective +D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:180:in `eval': Permission denied - E:\code\trustie\trustie2\.metadata\.plugins\com.aptana.ruby.core\1184073882\4 (Errno::EACCES) + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:180:in `eval' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:180:in `block (3 levels) in
    ' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:179:in `each' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:179:in `block (2 levels) in
    ' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:178:in `open' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:178:in `block in
    ' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:152:in `each' + from D:/Users/nudt/AppData/Local/Aptana Studio 3/configuration/org.eclipse.osgi/bundles/93/1/.cp/ruby/core_stubber.rb:152:in `
    ' + + +!ENTRY com.aptana.ruby.core 4 0 2014-03-11 17:05:50.704 +!MESSAGE (Build 3.4.0.201304151603) [ERROR] Not supported yet. +!STACK 0 +java.lang.UnsupportedOperationException: Not supported yet. + at org.jrubyparser.ast.LambdaNode.accept(LambdaNode.java:58) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitHashNode(InOrderVisitor.java:414) + at org.jrubyparser.ast.HashNode.accept(HashNode.java:57) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitCallNode(InOrderVisitor.java:193) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitCallNode(SourceElementVisitor.java:230) + at org.jrubyparser.ast.CallNode.accept(CallNode.java:70) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitLocalAsgnNode(InOrderVisitor.java:456) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitLocalAsgnNode(SourceElementVisitor.java:839) + at org.jrubyparser.ast.LocalAsgnNode.accept(LocalAsgnNode.java:62) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitIfNode(InOrderVisitor.java:438) + at org.jrubyparser.ast.IfNode.accept(IfNode.java:65) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitNewlineNode(InOrderVisitor.java:525) + at org.jrubyparser.ast.NewlineNode.accept(NewlineNode.java:67) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitDefnNode(InOrderVisitor.java:299) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitDefnNode(SourceElementVisitor.java:346) + at org.jrubyparser.ast.DefnNode.accept(DefnNode.java:51) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitNewlineNode(InOrderVisitor.java:525) + at org.jrubyparser.ast.NewlineNode.accept(NewlineNode.java:67) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitClassNode(InOrderVisitor.java:213) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitClassNode(SourceElementVisitor.java:260) + at org.jrubyparser.ast.ClassNode.accept(ClassNode.java:68) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitNewlineNode(InOrderVisitor.java:525) + at org.jrubyparser.ast.NewlineNode.accept(NewlineNode.java:67) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitModuleNode(InOrderVisitor.java:517) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitModuleNode(SourceElementVisitor.java:824) + at org.jrubyparser.ast.ModuleNode.accept(ModuleNode.java:66) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.core.ast.InOrderVisitor.visitNewlineNode(InOrderVisitor.java:525) + at org.jrubyparser.ast.NewlineNode.accept(NewlineNode.java:67) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:37) + at com.aptana.ruby.core.ast.InOrderVisitor.visitRootNode(InOrderVisitor.java:668) + at com.aptana.ruby.core.ast.SourceElementVisitor.visitRootNode(SourceElementVisitor.java:848) + at org.jrubyparser.ast.RootNode.accept(RootNode.java:84) + at com.aptana.ruby.core.ast.AbstractVisitor.acceptNode(AbstractVisitor.java:53) + at com.aptana.ruby.internal.core.index.RubyFileIndexingParticipant.indexAST(RubyFileIndexingParticipant.java:73) + at com.aptana.ruby.internal.core.index.RubyFileIndexingParticipant.indexSource(RubyFileIndexingParticipant.java:61) + at com.aptana.ruby.internal.core.index.RubyFileIndexingParticipant.index(RubyFileIndexingParticipant.java:37) + at com.aptana.index.core.IndexRequestJob.indexFileStores(IndexRequestJob.java:205) + at com.aptana.index.core.IndexContainerJob.run(IndexContainerJob.java:114) + at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54) diff --git a/.metadata/.plugins/com.aptana.core.io/connections.9 b/.metadata/.plugins/com.aptana.core.io/connections.9 new file mode 100644 index 000000000..4371c4759 --- /dev/null +++ b/.metadata/.plugins/com.aptana.core.io/connections.9 @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.metadata/.plugins/com.aptana.index.core/2874248206.index b/.metadata/.plugins/com.aptana.index.core/2874248206.index new file mode 100644 index 0000000000000000000000000000000000000000..2200403a8cb34b3cb2552ea2c6015600714a0300 GIT binary patch literal 3389348 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�dmC3!7Rtdy4=XS!e+BwJCSZvjEN zo;t;Zy+(Zo1)Iu7Q*&cmYezG0@U0pF7t5Cq4wlGh)>yPv_?ZL}w8FFZ7|%XF<0E*%C-mGni+$ z;o9heoW+ACC%17_%LzgPv%hv?d3nxZn$Spa{N~qPG@vpLR{wH-g3+uLsySZ-orKTf zfs3sRIvB0Q)&%xYd8M^OH=5G$pj}!=K-+K-BP)Q8R>-e}ug&-W%fE=5V*fJ5kyY_( zfq$uL6W1W|BYB^j6Q3t@`vN0uzL@w@g-rFG#CH>So8ZrViTjcLe-PpShl%h>lRzzk za=Y-!Wovm;__pT<@nHrSux&VHs_KvN7;G7D3gVUNVOJ?km#b=Ssxz(rDkdHR4UA=lkD^8kRKheB?<5IAm*iPFe0Ro?Xdsl0Py~q?EhZo8CK2UQ8L(;9j7lL4bdq zsQPf)hBgy85kWA;-3q^03aeM^?*Y0#d2D&*osVs`vtFVDu9Brk+O%P$pQ0w&8txV> znDkc@6(|Si%F^X=a88nqqT`Tl6 zuE3|B`6sNi4701-^I;x!&jsF}m?cn+GV63SSr4UG^t7rA(IfvYTKFkq71=`N=(vF2 zsc@%kr_7@XW{UEfFZZ%yXoTSKsNS{j-N~v4gjq|_ym=`lg`ok^a(NJ2$1itz`7U1Y zim}1c32lxy;Jn<4-AyI(4hm1*Va^)KUPasF`IM@N``IRLt#Kv&svbomOK6h(f&v%2 zHe8e_5HCK*#Z%qD9vWEe!^E2BB|Cc-0?!AvndydyU~~Hw=B`k@X2`Y=>*a25Pwjt& zj>8ONWhmfT1j6NI7_e34l^_8Q)M@SL>}hRT%6K_U5m9@o#O@}TyPL3a{g`t}!R1f4 zn|i9kh35x(PhFfd9@`WZT0onD%k z8}KvqnLn2LwHI5`vS@Lcg>j0PTG-Rm6#`Pfpzy~OzCl2IhUkJSKnB31QfUbTQXN8L zSGdYP20Zg}WqRZ<85EZ$x1I`Eb5+A^t1F;S= zSZ-`+T*!0Y!YIu)jo$7XR$NW6QxXcO6Vq$^q?h1rG_=jJfEgji+u5&xy5r6YWiPc_ zd38NkKevJfKYs#`q+2;mwZ)t_F!o3TvSu=_NaL?A&s`B7_As5t4qI)ErvQcGQO#%V z+IuOl=Q|P9psuW0>!p{pHuWsDdKcfJ!hkz$=f9SaA6mj4$$Yo^s+x7|jwyRb2Z)?p zSX1~ic6Lb2Dn3a^=LVGG*~xn{dt~=0-Z?GD9wIem7PWDsBH5eJ@c$pL_^-4E4iH7v zb~Ea=G4?$^fUEd`SJN;y*0-T~1lCo*Y{*-bwp7(o4b^R5-|zDYn;I>Q3bNCdPI?UvQmBAPY0!>8|c(!`7Q+0iuv`W}rx_$^yk5b3_?$6#cd7HqGu#RMMDY zm;HV21OSs!Kt|#_s#{#lyU3uY*j_C_GUj16`s+u9*n~w%Q_2N#MPFr1>ei#ZTwn;M zkO=(3v&B6z%PX-kTwGYxrsyHqhfk`JW4$JMJh;}ijJkLNaB)|#t&3RjdBXfrczGB= zM$594xeTAI0?yZ1h)$(kYpQ>Ia-D{zL9p!f?3El^c_sGGd6j?GDBLXfbOI{DmXqd8RABpvg?|9|LL&fe!{7n}M5YPgjrc(^DnGAgF3AVzZm(ww z$u9I#@5#)OH*2;6KVyBcuUnt+5)cOUgm_^48!MxGaG-+kBW(L6FQ*7a*=cFz;4;XW zx-7aWzU)m0?j2^e>gOdTBRqF|c$Rs+(_bAdqQY-zD-CE4Y~?%s!XEX%J)T2ebi7>} z^`e)Xvk59^lTItSu=&Ks&Ni1@LRxzb+8SW#nh6XZ8Fazzsy1b#;bwb%t~U+ftBLxW zCYF*85SEB#^42|GrUUv&cWXnN64nb>d3kv(BmmA*_U83S4A4fqS?H^H-lY0Ugoh9N|H@lhGD4W_H(=( zTetz9SZJ{HdqygziT@~HDvW?F53Q=Nx{>Z3DJkzO)qGRPy!Bu7Fz*c1FP-+~eSzZT&rR!+B8GH4)Mb&Xf${TR zx+V@o&qE59m(mp>ZT;U%8Pa-^JLo39lKCRHr@x!~HA~VexO1^()!{$p*gq6&Sg0qS zFOO-<8(yJOkop%(;?Lfjd#=_Z7BtDwWwN>S18znlK&3x>FZ5pczjYje>?G{<&rA|-7LwWJ< zL|SFSs0r4Hdv@D>GSVN((Vg;#IB&h@Z@l7$vf_a5V4)#-(jE zpkF>h9JYanKGYwSM|k#MBD*h<9I(O=fu_7?+_^|lu*eea!}J(XM!}=xE=uGFcBjH( z!XyW$^olnV#9qb0ft`pqi!8ug3cG7iz}SUV!vK^k=v=$}Z5?X|MBW=YFrvw_^CE{v z4o8XHsgNIs`c0@nu4ye@){l0Pb)#KQ7upSx8)26Hkf|*9Pb!Q@-$U2fDNOtPEVDj; zOXn9oUvzD02Fp|QQB9|VYCpQC4voJ*ei+?SeTiP{c)FQMD^De_)>IWbhu)KFq!;Mp zbo)HUnmdqHcLj4%)RXeFU?PeXLkFr`YxZN#Ni{towb?njy8tfR>4mtU&`T%5(@e72 zjUIp!jQ`W%`HvRwg46%Nv;s41uBiP5ad)t8>^W=U#IDHC6*#5=-NeO4m?uBKkI!5Y zL8c+dMhwP_bvE`iSjLVT`TgEB@ooY#TKmwrQR#GCu;BeDWH)y&Xl@YUz$HPzawXQ% zvs{P@FzXql4OvZ~Vyn7UmDFEYTW3gO_Q4Taku5#WOn{XG_$-%_#{Ip0$d z?_KWAa%9_v5iZg^O7nWvy{!mV^}{}O4l zs`9T20yzjQN4V|UTx^X^gKQ;s3oNNMWl)dRWkE-Q|2x_%;Qadg#?}l@{EIP3wGY81 z(l*q40z+B)-*zlH@%8zZUv-^-7`M_o=Lp>KmSdEf3D70HmNSnc#C;=T)w{|jHVGKf zk(s!-Z#L;AC{rD|%u$nQM0pD1c8-3N{&o6Kv_9?OWfzDEwRq_4#^E8`kKil#E%Ql! z>ipDa_}BQDE;eB!EYoUUq-Cm>q1aPKt>;{2P>_rfh4_BXMiF1kIN7T-YM7z0anJyb z5?;?3*Ykm99l3tMXe|OC_Wu8o0h~cF02Kz8AD?g3S&kQ%(2<07B;P`=3!h725!o{Q zLPz@x`F^!Kag2A$-m|Wh)-gKKg5}m?@~NM-v(!X97izAL;%nl6^L7n5M$ox>+W@@b zbWukznlFZKH&&})$RiAZoL;{U0u1pOM7h2-Wl&PMKgpk>iMzH=;-nIb9N$|j* zJ)0BOI?`KoQT(fk{TTGMPwG$%$`!mBH&RIhl^CX!yCwgGmv%Kx$NDCBo(9y=$aO)9 zYHe#P6R<2Mfqv`zV%PQ?_{0g;G9_lr`wFKyfc2MV#?EdOgpTr$B{$H-$-U_1{h}3s z=ElBms`IXEbO69=1m!Qyhx`^=?Y}mK_Gjr0eQ)9*w9PvJDjh_5ZvaL{f5tSvV@%DOiDh)~{a!tL*0DE(DcS1Jn^Wn{J2p`H=t0{foFdhamWR55 zqNwm{n%KkErFINmUx%Y++JH*wX*LUvDPXu>K_mtabLVk8`aC-R=;&j^ypMNxI{*J* z{+94pMD{^prcqdC?z7q)<1{wCa=#aueW17siP&q2&FOz+GMoSjRDP!5_Gs^0Rlmhe z{Wqh-PNQ=6_h4xGzOiF*8P;0MKtm@Rqej`+7|rGC!w}#Q1(ht~ZwOeR1 zRD0pMG#BnmQ{l3j`)DOJ;b+8rY1d;&n#N}f%A+hu;5Y{2y^Lgh`H%wjCWf+iP|Z7% zp&Dn>V*O1` zX18oUcU^w({IN9o%{R&2mV9Tvix$5!SG54i*9#DI{UL5_kK$sU&yie@@W2dB?)Ow( zU@hl!8TmfJRULra?U>S<{iu!FrX8C`>wUSxw)kS$%C8|2_ZO(-FVc3q9`W*fY#`a5 z?1woB)o57V$8fY)AuWTmrKz%&X3E=Wmb{mS$ayqE-cFO_w|HuI^4vavSg@S!Wi;>o ziXmX9GAQmg+T*7Ee`t&Y7ON*rU$e5$O4CGO(}*F#VTbyLT_7fCWyfOd0wLNE#+@oN zfR7P&LWAY{FC;pDeeRQ_Zi@jIV-{_$Jp6S+$Lw^OY;yAi%KbM*1 z?0+^#^l&%zH-C0L$EZZBC#>xonOM8JTRnAr9yfhFY2u-SM@Tmcm3UC-jgk@IwvULs zzh3lrfF8?Ms^=ib^$#!C07I;0aB!dk-|bj~k6k`wUseHq#HEq)YCltm3o#hRiU>}S zYEnIoT_vM`aS<76$_t~5Fa+O9Wi%KtzY%fcy}jCorY2+jfwQ)CHVESASy<9l+l$m| z(^^8FYJMz1<=v1`wc+-1g&K>{yFp@$q<`a-d=$5@M#7+mjecbZHJ+a51|`s z{ym+GpuC*a+>Pg5S&5h?yNP^bX~NVhk##LN$?6x?_2t#7-v#{Q9Y?6XR$55?GoT=D zdYR}*yl7BP$`h`yEB>{_{@Sh+hQlY@(tjrgpBRILS000FGUaw65PZoVzsXxYMbDvX z7^VBA=+fVVMKbSU3AHiGlklM+(D~EK!6EuQWz6o@vBZs ziqttis65k;_D64Fg^y5nAYV~5gzc=czw=)k-=s5)0;DzMZ2q`ctB6MgK#J}qTGD7d zvGurRo)-u6ZCs>P;M;86nyyYfSu3qi-LS@SX1@ZGp`56|#X&N}UmI308&w~Iy%+9> zHjubu$61kt(v@zOU!+BerI++Z{KqW3#}!i0=3$J%y#-9-ZLoYtf?k-QPJ@^PcvHvd zs?ilgWAv}M&JUg5;H!Lv3siPpPHg-kFHXb;u*kP&G6HKGgGIZs#P4GmQ48`AN5`6} z^W8yI{B7+2p$u@?LRwr-UzvNjcseZ#ZtYm4z|f;Vc<&0+|Atbj7shrk#fjdMP{CF{ z&=P+6EkLKP=0-q@$JR9VPDg3v0KbuWTb)eVI@w?5_XqizNF;NZ1=YkX)t<-* z>LBCH!u$oO!T~s;Q_$m3mUSC>)<0wKiya(0BsK@9Bo&NPaZAkUi#>^JIy~NPj`I{# zqv+Qx7z*@jDA8Y-xQ#;RPZCcsmqfEs&km_pxQW|wrH?|Td;?_%Ka~Z6I24!h5nS8# zror%g=AgdH{L?MwJQm^D%H}%0CJh0n6X0-y?E9I9;AWQI%KQPv8Sg^rUy;ULxw~nR zc{ulI{#=yWTglqgKdw&iX9}j2MU$^zj1*(VL@`-R71PB`u^O%NY%y2N7YoH=aawVD zv9>s?xGOHwsbd{cJd%#@V~WQW>x&J=`NhU!6N=?6#RbKM#n$5S#YM%oVtes~Vs~)~ zRF*5Tw4^fY;2I24MA`Th3$0K4hlLhJ@$Cq-**;AGOX0r4NeA(WdAm(9hJi^Z-*S{^ zEcgp}Dv|_Iowv;493&RyvxWv#wxj6=zSi7w|Ge@_gWu@wSZy2IEEgcs7;H?aC8Z{Px6qp;G~)2)HoLxSpgm+oz$O?hZQ79kh#H0~HiS11xvYIH3y; z9dAZev!Hnq18}of+txatbU183sH@%z5s#8VJRHET%Q~9UexDbKSP#tLCO&<*foy zuTkE_u`}M{)Q)JQ6%iHJh3;&&_+*dl`j$FE1hAL$h(qOs7& zA{!3oL$OhXf$UlBsPrxXPr*c;5U3n7rJ%6V$p>>BX9axe=;JIu*yPP)YnKg8?KX6l zwtD{PinZe{s{6bChM>4t+etmLwMp>?eupYs*hjdlC8`%@U8;I@_J5VG(qf{7wVISQ zo6B3;y4Dic^H2c3Aop=^58(xREW#XJS$MKYV~-D$@sKx@^%BHDL>JAxDA%Rs@<_%& zdYJ}_nKviXf8E2@P<{T(W@%4^ZLlmI$J`!n*r16i9F0?p$C&cL7gVfJP#&o zdzsly&GUN~l)IZc8+pJ{8?~Fw%2p~ z)3#dTb)xi4cf%rT9j1Gr17jcOU>UFSii;MD4$v_;L6v<~c#24NIQy5}iQ3Nq9c-lv z`zkygowcGr2m;izinwgn%Tl@(EI?Zl{g4V7!oE{5iGH{|o3?|$gP4!jQJ;XG$^TRL z01p2NdTsU2+0Ef)#LYm-1l1Rc~6(@(b~-LgcyFKmPN`9Iw{U zCtfLFD}>#DrI+LYoN$<7T*pq>_JkLq&cLns)^7w9UqLw?eOC|EXdF;DJbzA_=xh|v zOSAkMZiavD=T-N1v^Ih;(;>8=Sx-gPio8G}tv)_D3PwmLY1C-dKG5JV@$VyzI?ARk zwnu(wdQ;MxI#wA&{J&A)2FxX){2p}hS}J<`qR(?S6}?L!U;Z-vC@hlSppx@+CXv}C zvuEJ%j6Y^G+@E4f%Z~h_nUL&vfjFtxBL8?(FxGyy*HZ?;Tr5~}; zNG=pIr?*+-f2nL``EJ@xFiM;-BrFzW##EMv;I$IyS0|?RH05gb)~&STWG_Bj7_zM& zGG?F=Y6>)0!j^T#5!CiQY$KNHm0*D`64g07>AA&1sI@H<68yulrk>to39xm{4HEPLoiwjF4PS}O@{0Y=s zyfCYZxNU+4ST1|>BVK+=*k_!4mc*`Jw3Xj;E77nv#u^&uXY{*Gu*4~d%@RR^riZ1p zcb1zPma09JYH5cg8MZx-*B^tz49X4(%S8q|cKqX?q`p>|63X5;akvY)<`ef}3AA*g zn`2Sh13Q!=1p196cs1Q87Wj%o#*nZC2ln(=f7 z#h9{Hwsn^M#W+6!_qK+$S?NrXt@5k(^Izbh+KUUzeCnq63W_paTV*$I&f=r(_johk zW>QEUr&yH?vLKywNVYZiaMOf$HHJzAtnw1CWSlLzUS2=4XN$Q?ZFe zmivXX1AkjQL zJhaBaKGjFVbJ*(sI@kW1K@=eD=H!g=s!nao{IA%2?}LxEb__gj6Dm`!B_poSFF|PD zaw}~tSeKr+r}r^dft{$@`w_Yh{}ZWCJdxXGf?<~wB=7Yg%YoWECyK%S{jh&7gJgeC z3ZgA4Y7iUO+`X*}LkyBCNjQSejxTxsTo)H0OSJ%Ubwx}jb$RMjT0-d6oK+qiV@R4_ z`s(Boj}xbm&ayK8OcQXYZX3f^S!1;SQ5NhI_L+_`%GZY5J!`}4USd=XyI#)4>u&OwpUp1Qeloy>?*@p*^U=jp2 z+PMY-E>Mj6_tP{69+NuGt8VFAH8nGeWUqr(eKEU+XQ-7K@f%||<$i>W8ev7*dJWC{ zW-lXGI*0IGtidIC7IA~PoR`1hCE7QX6zT)FeMx+*u=NqS3J$7c1|V%N+*AumS}h;l z@}?3;(yXvj#?qB3I9eh#)-eIg+HwWfu^FfMj}k|DHE&-GQ6Zsbx8C7*wp#3W@9;-k zANI#;Qwf<&f$nCM!9G=|RDBSr@Hab~g2v1E3=u0r{XLE^MR^SzHO--VXfrQ1m3~9G^jO_EiG){lNZIhv{T%tw+4| zir6n>k0aUoOzd?d81%$X1pGSP20V|@b>)g}-(isQuj0S6p~%n1HwGm)H-LB%(Ab5b ziJu9IZ+FlUV7&mzl$GD=5l}5LJoj`&Qb&NyE=%6TXxb-|uTX~jFsZ_g41Rqq^_SF} zBn!tO>v;*{{r9Dxp%jN?X7yn;(-E|+$z}ry%Y7Ix`d&s(UPnwLS;yCa!4@MUuhD>~ zAs#siUCp-st|rC5z{^{~BLJpC zc8-miT3`DSFWJ#amkE4hTYt%hfxb0tIqkT6p$-fp9sy6DW^t$zJ84aw75%PYjetI& z+_uj)rAa=3U^(O_DE(`<`s2C#ycteJObO=NezgaY<8nG2&@GD8iEc4|H+s9k^;kP5 z{EKt099&JE$wDC=N3!@{Hqglm{IJEs^z4Ww6_BH2k<(H)<=(JbVZ7(0;J$bBclA$( zP%{4iP7D&GG`b9%&ec-oaks`J+Hsg7M+}t|8TmI7G0C=`(vqF}LQfl7xp=MD>tW!6vtb#g+Yus!n zQXX878lp9V@W;5=I|3whiz%F# z$<|XbBKiGem}83>U8;`}yafja-XjhauPK^-Oa=S=Hm(ZNBve(s9DaDGOG74-t+@6)~)=6 zL%q*m4hZo@Y}*5ozeb*+uCX@&|03Y}ClckvSYln`BD$1rOFRrz|JTGb$;(nlA)MTv z>Y#3XlB%zen=}-Yy+2I@D)R`9URL|b+J{*L>U1chPty&PL0V_Ja?u}fZv2b32+8U2 zVI;B!J3~W%3l*nQ(Adj1+CkHvBNmBkLC$a{zbrXiwWp;-5T&B*a&_HXJOf&`79{iK zn@L_+BnWHJ*?^0)7nKV_XxGKr$r~aBOR7)?j?kw|qiFFn6?O-gtwonc;ua(fv}&UP zsC>MG)3g)*S(e;k^d6ElN923?^Q3GQu?>59I%4XkOxinQ=T*>1O*dQvg8|c@Z*-0f zqOQbZ>8=QF+LDMYDd`amehK2RS=rK6d&_LQ!xwV=bn)bD`M|dE4)tr#sy$m!biiKa%L=1E=zqljD2;SVG=o(+S(y#reX4h4U@bD9 zL3Vjb^yd)3M^+3Es!e3lvgAa=mg+^jjJY)Zww&iBjvrk)GVXeds71~53PNsFg(ULm zAH~kO22RB0@RWS&zD$W6zHjvx$|AjHuzyH@TN27ul!QktGH-krJNT- z6y<39NUW?@`lAPvfQC`*rF^o}HO{kZoWYyGPav?Xh^~pfsT7oL&&!C5x;N(o93o1r z@M}tB06$u8;d^NC5?-Dz=H&o8z&f;p|G|3}iGXvfo~!yh6}*G|6A+`zM|Owr^FHcy z*At{X8cUi^JlbFc9#6As)EN6bmA2a{Q$7f1_q#PeV0QQ@bGrYE>U1+&AD7_Xqg1@& zRJ>+P(Jt)=;1C! zkm$gPchE_WPC={K%q5-{a$we$Jf&6`M+WLLgrMTN3G&@k3$LEyR%tP(&BhK7hIqIU zbd9m5n1-b;h%Jn@qChe#x_==y@-HoEFO%9#Z97YtrybGPBeA0sTOswpHH9q`=r{VX zz%B>TY>+G;57pXDfI?V^GW)c3<~s2JBq#jDF)Xus9#%P^M|1Ef(@S2`JP%sV zT$b&+=1I%T%V>IF@{lEE}{LO5dmt+6T7b&;XPpgi5utO=a?HKfG zT*bGt%(ncIkE~Ye5JkSV?PsiAoTOY~H(L#FjWOTyHBobE$St`_47nWfZEMfcP$($^ z`SdHv+q|0Y-i{8vehC9RFY{*lG(xvfRKc($cu*Pbn#H(uOt~IFq#-h2z;-3=DVHtJ zLB2Z#_`u=yP1R(*=(16#>cJ3!AA5=J<^6{qcIaVTXb-Pi`l9OS(6^yRjCoPvWc(}U z{h5&GqyB}`7HH}1Xmscx(Pp%MV2vp$RyWt|lZ_EFN@2MiO4;xTc2GeMpkzIDKej*7 zOiBc+u0ROvMK3KB9@AvXB^ahcAorv^%{5B%%j)c@c=iiuwfiN~D_cRi7U16}K)O=o z6PADKbP*!p4K9e}M{({`gAjgP_zN8LVhMs0`h*L5JFJTiQlFU;zX{{TQlm%2fb^+` zZxJd8nVr|KAAK=?GOd@Y!%$o2>`Kt^(vF|RMKnWoChw7lZcr#S(XIN8u7~Eg1_0rA z(e%bxXY_?}C0qCQ4qQskxDpVd4*DK;dZ2DOTm;J~p-Kq*KQjHEI%lqrtm7x=;KHq= zV5(K5o4{|TSp8O#Xjnf|(=3|?t)guBNK0_ct=BRVU}wny2-Mq2nisnlKlTIX$%u!V zX(y+8$m2-_%FmWV_+~H@V0>36K4lGn-$lDmDn`on)~wvXxC2Mb2wH$L?NGwVBoR(= zX;UV>#+xbnoYXN}8rs_COM7*)BmQ2@12GJ3aV&0(kZUI*WKr*-(-7pMa-mJN0%>=n zUFiX5^^Mo{)wKaiSio6_I^(bsasmw!ass7;f*_Yi+3xuZ8oBvh{1RwcufG_6?+F3_ ztu1+4az*kCkg4%NDk>C;B3-H7=~wMuH33ASjwH6N z>4S}(@Cg?c$vTPBLcNJJ?A)oe0hfFRS;9Pw z?^lEWo@@V|ZmeWJwj5@NeQ6>yQ+g!F4e>C1@}2)~Ns9eFS8vK7QXFM9JM`V^C;CE z5rriy#S^4_h=mL;1JrBLw&dBuSsv3UG;7}38QzDH-nkwE{Cz0U(>UUGny1rP>-4lQ0n_HPH3vdBEBK;4XZxc2q2&$s@BC~ri-`kTnoYLB z9#X6``D5Y;x2AymRv6^Ci>I+Hhl5!}nGi`Uo~7j?6L zzS7U`M!Kl0{rhyk{IK|=qQ<&BQv5SL?FuXy@1o$MxGn5z*QggTMB)Qkny^o37cj)3~p=3FEx|a*MbPDQ& z3RzgHPbi&pL?z$)%xXjMg3Y-TR&l3l+2AAP)%4vD4^q6)k|A)0PqBc=vQ%2q+1+HT zK$5xDT`Sj2-FChgYvJ|wup_@!Q98oP?WA;6)6h%m9=6fzSUmWLSfUdXWs{--g`3p# z3(>sS_on0@iuL%#FBEqes}NXCS-2~^??giL>#^aRzm3qc?HX<~>`UMLDITF-Ni6o^ z)C@-2F3T)O7Cq?m?OfxGz>4BMeC^fp5JgH|Jpe^_UqRYQvjLQ z%XA0h5$v@`1{hBNEe@f~B^vosW`!LjQy+8*vw8VtD_;=6k+WIoHVNHkZ@bCcn(^!= zJp1)Bq5pT^no&<8qNN&xpeMaZc?Zt zL^Zc%ofrW1WQp0(R+d0^1wkHb%t(GSc~{D3HDLC))lsdcP|-E8HZX;jZH6TS=eu{@ z=}pJ!cP=61Z9s08&{qjxiAxBL1LF=R`hyNNee9oHJ3?5RY=Y@gCSsoQ)k1sUur3vz zY-w?D(k=IeVUV&$ZV_CnnRy&e-^kItN{!vE_*>OmF(a@14S5^9G}5@O1I|5KGefGW zyP;)gIjLNb*o9J7xY?{C(Lf`QOY@W8K}alpJb{3Ne0eY(-tO+d13Q6fS6_2jfz+=| z2g0zjopD0xGY60k2NJhfjU4=98afia-clOnFO7c<4)XrgxIa%`@zvx#$)Bb^=vb(Q zd0tU0o^^_ULTa1>$$pXy=Wti448Zz1$4eVq*j|SoaZo3nF;#O|aHN|XVTEHF;jNFb zA|U3Qd>FEY3hH54>COs^3ds8`QTISeVlLbUynYFB+Y8gF)Yq5TN>CS)Eh>SKU-)P7 zJ>Cr9-MYSEHP>#aGhO=$D#t9}Z6C!-jt4q~25UKU3A{C3GN)X0ZM zRvBlB=Ero<9*v3SvES|GJEeZJ^QKHZxOZYmTYP5rr0gj)AB<+lv*%?mA`$yp_7}7u{5AXc?3U~f z60)XT3#|wz=T6U!<<258L;Zuo!xSvvZzn$A^k>lbRZZdO0V3zUO|ofdU=FsKW-m${ z0Mo;L_yTmQUBO3p9muQ3UFyvz)1o8MH36#gq3Ag{^N&Tp5xv79Jkjq*e;B<#`XJgG z3AgKc?l1oq;HSS5a!^$mmAu7vh+6fltqnS?bR@ltjL-fR?_L{NyTtVk8$nne!Q7&a zNJ!`%x){y(W)%+fVklS{88Vi8GWT@u`P_?;OQ4%ewGAhXV%wy0$t1_k+L9}Wcg09e zRq#97bn`M-x)le_X>t4hH~jBb(}%9sNh4hK5b#zo(7@YT_;6c zl6&X%c2VJD6<3CA#bU>XG$L%a<0@fLd0?TV}CXHD}A|&YF)9g8;q{3VhRoA|v<_{YVFiAX) zae+Tb-N%LfiY29x#D^BM#H;CICdSkdpQlgaq7tn=5qMin zI|7(=+ihN&w$LsJRBS_iHM?K-0M9qg>U4B-nDa)rMYl(Hpk$Kf63)QOu63&~`IY{hME z`JCssD%Fa5%agxKK9+nO9c%$``lxUa6IG8X%qMW6`s=nbKlvy=*C?(c$LNGcajh2V z0QYKPy*{NV@ICA*q%}n3^#Poq*__Q#s{9`c8LlG;y!dM}Iw!g)|I_?qu%$B$bp@?- zYFbl(S^WD0UTit3C-wHNqa3S~UmolwXjg2;n_L19>*45px{jq|{a!d%mopUm&iGx4 zxv-=jNIZ=!K}T{;@ER{i#^phpZ4e_sWnotKJv80i%EZ3ga$lw8?|!tU-@qP@F$~B? z$#AA<;CEj2vM1WRK@Fmz9ducDXG7VTw?kWpfH%q)Zlqr{)K_4S0Ay22A2ZgsenaO@ zCm$<}-l^59h9%LXo=)pG!*(v=SrO)|TF>ty*$-y_ksIRv*=fM<)_fy1PzTXO{7;}a zb`@C${7OjX2*wN9gpO{$x$H)&xj&DJgq#j0wZEUgtyfiKkv;k<{BLhW_oYj@4V zFw&D0V9b_do~ILHy)6L1x_%z*Y;G_SXuW%3LoZ74o=Q~~#2tO!)^1Kf)QjHsixtE;n{su*|m zgjmaQV6PCTCzRB>+r5aO`$KoMAs zQ}QRB<(q%>^6f(-YsZP3jLErk*H_$igy_k6E1BD(#vRHd9Fhq_^~+_f2Iw&iylXIt zvSUh2r$4UKt**kbY$azWV!W^u;iRE zb+TZ5biU^=214BO3vaIq;VKxmWzwch^H?gpUczoXuvd8VVEKjIi@BF_FXvv#{Zqntxz}@>>HB&!w40_rdu?@^kWY z^YikD=HH(`EPr_Zi2RZHqw+^1x-pbLgMl2wgcBpkZ`_stZvJl5+GLr~nll8IN^=)> z;GugZa1^sy1al+Z%)U$0_&V;Q2L9svAM?-mrdLYexTjFxf#2`K{7#E8^-YrthHk^k zEB6hYfz(0}i%f&7H903x#RZ|%uhNmwY7;qhDTpMhOde2z83}}8=Q}f4>vTM!!Fz_X zH9s+txP*Xn1A~I#nO%y&pL{r6GiuCp`9i#Uzv}&KqBXIaXKS8QXo0fakk~?jIKGY% zUlIQ^LkJ0W#h{#WL;Nw}{mpy9d&S%2?Wl^P;aVM3`N9n3LPmc4&_5M@v`hR?;9KJG zd2;CY>;k8!F1jxS`}e|ZIwG9SR(kcWU+!N|jFkxx@n54;kULt8r!jZUSnKwc)BOvh6N(q#w4-5W&ivDH2d- zY-qr;OaV5L;XSl&MOPW+r9u#uectuuFl+;~x zjC;jFHH9FoICh#7B7X=W$|?oENlegRXIaiv#u9j5V)ppNfNM86idDw=QZyb8hlg}D z8V(887@}c>SI25paN^3ucPuVGk2qK{@ExQle+WB@A(h|H+W4_)E$oei)%}@gSRdh<@yj!ywF{YDjT*(;Vj7F3^m;D>C%u?3wX}NOl z-h8@nFy!hF*M3~|bP5PV0|DMiV)78+CuPFnl2N)b`OkZPw_?Tw;KP4KzZv~Okf-L1 z3kUrpkVdeqxB7%$kb_CZ;vLYN6+tq$InZ_yu~3CU-Y{gM&QQZYiGld<=!x_poE-fW zod^&%pk&Fh`I-Z(xzvgrSd0~-9^KfIs6kU6r>qtJ@;90PLl0o3S%P0jg4~|QEFf<_ zh-ao}-o>bh4`faQozGK+G<`?9QG-MW@@>8mvb9x0#`eU*KAr`LBFcuv1~?v2Q)fF03>KvZoihobc52rae-*DNN*S|Hfi6?fLX^o*|2gv>uZ4p2NZm^2 z7}lK}NI#!iSGP}HAf7u|Ct%Z^d%SLRtd4%eI)z`VmQDGao)~P0Kf~7RoSeeAORxjW z9kTx>D^y+tXGz~S?xJ9X048bdfk3UZffuks#}_(lXehknSzK zzsbr;MSXn}T$sv(;6kqTj-V)fy0^?5q%eFHn9Wxx=n`hq<{n56B(K#LAB0AP#@u9gk~CIjGNr(|L^n->HFPI4f%Ap4%|A=%S$bE~q$W+EoC>mV0=5SMouF7GiM-k-C7 zF{AN(_QmWgWNs3oD42}hlH7@AMEaO+v?4cTf)p3!t|H`<+{_;NV+wPTwreZ2Ygd?M zn_e1RJ;X!*cY*~mtYzaut)KW~iMGV~-mEZxLf^W(SrXyQ*^x=LBr4yUKi>0u97(S+ z{RI#{N>{Xw!vJ71GE-2EZ*VtgAW_V6-tJp35wOBnFsev-gvMczX0+t3IU6mdvseK4 zdDB9UU0{f%)yzftk#9xrC70C#rHk0sXtvq9H}Kzqxp<`sQ6twV6VRizsLu0h#ABbD zkHu-(fNn0|*WJttHKXdIWO0?C1#62|1nqmL$By=jFoy!T0h1@@8K4mzX|dU)8$w9^ z!gYn;5$ugo`QYZ16vSBo$00d)1Iq2=C@@AM zK1e9Z!36bV%&6J=Ajk(``Cx9$2Gq6*cDOqqcP$sEf(wer@+a;pXdn-I3{-fR|} z!V#`l6>^6>&!mUY^-(mS3qf9tEq8-&EOXzqkDSVK)nnrkl%GOnB%p%6;T3dsOsrJx zGgOMr;TxQPa=yo&!dJjsm~|c`$IAaCS-#^ApaVuJx1Km>au!2cB$UqOO??|2jxWr7 z^0Py98&+2ge`%lCjm6seC3g>H7p?@zBB9!aOcJiB=2D1F>c z@#9_4ZLYoa!RX)=pq@Is&A59+&4BPYs;&c?nP%arbD-_(47~fc}|G( zu&-W{c3Gzt562D4ad-uj(blt(&>?b~H0B$2Eca@raJP=6+Zy&(N@HK7(NyA}C^b+t zUS6IzcNv3t$NPtd%10QDg3(L6hW#wOyX6ewBH9cGfmyIq-J^)Y@wa#dgg>ZAgShMM zOPHP?%<;`wOdQZkB1pk~f=vdKfioZoTV6}0d;RJ(}()R1$uCTt=EK?X}^i0gI5fsOFL z2_z`0PhFL%`Vj*C;h{bmn@Dyr`@3AH5fvxRjZ0?D-c$}Sxj1P?HYA;&XM!oD!?BUr zn%G!u1I?lzjh#z3wrir*jfxUrbsB0kY%}C2U1||R!Mch7%T2f~bOav-8{D-11lu=K zY3AcN`k9}~-bP!;?A#@yGxjX#?(FTFLMV?_IyB--vS_ooLn_sEhhz!Uz&OS#cP}Ui z;gSIMVZkn#qK-0ub2|^Tj+I*O-_UPdwjE`!KzKZ~d_#9r2evAZvxeCKI7I9ww~>u> zM}`p^bs5491Y`HOETQmZ;V)huKFOe|V&OwHqM2Vr)9;54a&7uE7<9@?p)}Nt)OFBZ z`=Fg&VE*}kA-z7H{WY{#`Q$v**F{j#Cd>~L%HzD4=>0F*1%ntNQ-{~e*}`dTd3hb6 zN9j(hnNbGk@7Rnn6T9MzG5>_ZCs>RR6&{hyS6GeWd-PDI4R;L#uXp)J#l~Yds_R2l zg-YnLobgzzVa#8g{UogUKN48H#l@##&zA@##<}!!^Dm$+lkUNgyLG24^gixg=9dLbE+0}vP+mT4V*W_tYrdTcVR3!QXjk-;xPr+! z$T=lI^p>!L5@6saL`q`xf}V3W4rM~mhx2;j8}8UB@#5$X%WT!Q_a0zdU94cpGI*T z2SnbNUr@=$Dl`bkVvMSQ!552+7)EF<(hh2HC({Ie6nP}JBOZ;%;_=jPGU-5%L=)s4 z8+ihZSZ9UPp<&R|!yZV-ymkh{0<^3p*MYQ4lb*P*raab*8;dLunMXoAknCC2O=ZZ2 zZvNAYS(%Tu*@54r-p+iF{g`I>As!JE@dBWM z6{6}o2I*99_b^*&c5NF>T~oed{mUg?aKSH7yERM6KhwND#FBU^ozhk>9Bv4324W%u zG}!M(hB}Pe#&YgrpfW6F+$egh&_2fEd<6GCW^=N(er0l=W)L4)N)b+r1x2Q;8;&jv zgSIz5PSWHWT!SQN9IVkyQxqr~#^zRv=++_uQqbHH$j85OCDjCtIbGD()bz+m@Fcw0ZfT;P? z(-7=PE}C|B=37*hJf#DK)}8ByGs-fX-Db!~;{zZCe?)UMF8i!Gmam>pg;Ra%l35$x zV1okqba(Fq3oudSf=;JE=*@T?PvCuZHrut19ayK!s5=X0aNP)c2BxH-0wPal7}Ap5 z@0bX#QJI$LtW>j?AwQz8)N1MMi;r^Z)zmoyL4&ZQs~M_Zaz0$EcPOw{8aRSZJ(gDo zeIXW~kd)|^O^ODYKeCR5fAb2}iEO=oy}x>5{VcC5Hg zgPT)yC8&BTx75o{Hp@2>Q1?NHx%`fZ6Ml$AcM@JA$=PK^8pEF;s9sP$?J$?ONE~LI|VL zAR*9U-&8!!!eg1)Psh9oI}vI07EF)%7lVb&z4Da=UEl{rUq$loiS#qMYbaST^pv1= zErI~5S(BulP7LL|scfma(?n2-;sD1)X2%Y&LX*ik|EKPV|JWO`g06_SPxPmn2FqRBxaO}6oywv>8Ce>d9 z<&6~8H;oh%7{zSIsALnl!DwVr>I%pxl(spYjTPSb7yGN_Bj|1RB$guj_XvZ`FV0>< ztC5$hVp#e5+y-xYr737~gIT&{+viMaJMO>7iB#du)RV(YX?ISkqnY zhLaZ-q14s9M6;$Ho{lYHWH__{C*+_ziNu~rU6Z=rYGp<)oAhyvZRD^v+QvT*xlJ_eC6b(4_fMt*5XQ}pte`ed zG_-k5rR~o~Jwdo|17_^k*d4>1%&vy`MY2~iZG&TWtJVmW>uzbBd&JzioGWAkp`Jw> z2AxUXK^5jYwu6&`G^u~D&e9HtYp%l}jgB2`DWN&?cpG4r6)66-sgXx8LFB#d^PpJ0 z^V?b>B@@yp?`dB)x?V%h9Bik&XX>X@9s$TDqjt)R-`>sBF^UbOV=2fix7|v^EU~>r z?l=hpk%O4hbphy4eEcd4fZ)Y4@|C22+yMPO>=)S6T1&}GsaPLCE3xPRLCjR?;0ewo z)l&SINg&bUzyct=DAHU6k*f71rz%G!sKoo~Cr4?cZY63M|HJ`_COq7zbXrMUcOTd| z%Fp?*PvD?A@2f*eR}oS_Lq%Owe0<-SETn_}W?# zYO=>7rk4=@0i47~so1ITdiO;L_>#=K3kL+~_A(+>y7chOWU(37fNkf}(PNQV(#vBa zS}N+FsDM&%zD5sWvRI}QMiv)V6>b3@MzfVsyc(*g+$DmSej?Y!_xmBVILS*Mnzgfc zw^NAPNG(C5j$4~}7(as*rBrB;moy**KtY39EGu?Q3-Vl7u(KLJ$HH{g%pV)2KVcH# zQ$zBV#u#{%XfZmc?n7$AD3T;8Q{lRHud4I!^MB+2&i}ptr2kj{8UI-t)L-;p@?Z8} z@&Dof(|^t1=)d8=>2LAh^0)fi{OvwX&lC;}PoP66)H1W^sm2PSuk+jKCwwqb9Q{@+T+J8V7*yWBIxQUd3JfO4>6P^E`Rb|CxPT!&+vHLL$j7n0~v{nhGuHj^pC4NNw1M#EcN5_we9~(a| zULS9W&yP38n@|C2i7!ABw>5q|RrQW|XS^$ZLcBX(iuc5ON`P`JYNk z)1u};1qH%8wDnE`^WfKC@TP@I3a;rRtjDHYwJxa4X`b0d)W=3dlA3sabM@84t%(P{bThzCi>X^%JO>&vg=ZOo zmhisFk=!&5IV){wo!)0qXGrLFFx7liTlH}gU&#(WA6uBX272q=i3gZ~QJXqY+@178 z@NGh&^gX(UCgelM8%72i2G)r~GSD;Fzj9Qdz}h zpa{L#U-5Jsf91`cPks*gRR`*~-$dOwiQf3~4U&8tt0TW!jz!#WylyJwe-Qh7fJHMO z+NeY-q#fO3veKKFOQGSyU|b<0q6>=nk)ph`Fnwkd09#iA3*H1h&GjyX2KaPDAnyOe z5()37STh&8q)ns2f-$W$H%UXmc?f0L@kjdS@Y_AOaF+8&pm$jc=g4VO1lg!U_km0; zY@Uy+qi(57i&bN~Ayo%zSTZvoftsfJ9N*vpJ?&+I4uNCYz9lIE@T-XT4{uWyBA+@X zOx(a@y!D(6RHZ1-7sc19^h$7|46S@&7NN77sYSPi7*ZM|fzCD;fi4CS)oPt=GIR@8 zwAM|+dsND}QfE&dnL1QPQwKSXLL`1HOV;;?g^!pAW;bmvM(EAd+fYHRYQb)jmVL&AWIanSW;yL|=4YvmV zru^H+=UAyhPp07pI-KD{GYxk!SrB|{7ll88FxIKKiQcUhw z-qQ`q(;1xIZpVV?ZH3h4e5K!5w=JSsO3Dd`8%3pQ#c@_=sICz#iI0z_y`GeQYvC^wLy)pWt`!gtb} znwL%rZJ=D;#9BFV4itrlf(TdD0p5(p(KQ=7r57-G$u>-cuvbcnp?;##k_IDJW|6DAnY3}{tl)|Q;wv=cI$LP%eBi) zlx!|b@^&5`(>=mf9jR`t*()0%mI^D+Y~x9MKZ5+1&J&fPaFdV^JI5S|GKWJ=O zopY(2=fAvZF0v|>+SrGIf`DD?r7$)>ggqEo2Je|EH8DE)*UGg26bP#oc6nmwVwmf&s4(CdRjw1BQMIedjP2hfG~g%Wg_-a3*dASJ%}n>a;P#}fyA44 z#rxKj10DZn#Q3aP1OsH3abomS2nq~f`Ap3xbx`UM>?A$TW8_d3-YAadTxQ0)qGH&_ z6V?=&!X(x@NsNx@HRsXibWeb7wCxeE*ksxSAOJi*O-it+4N=V|PNER`op|^u@?Qvf zPNvaUagIl9=7f{PV)GEW`bYAK%q+a5gSDLK_LdsVvm&-JO>txI{DyZ#R%)w&S=0S1 zFv7G6PP(#rT;qqQ{F~LwzmuXB2u5_lyygRSu$b3LHB)yPTNxXo4hQfQI8J-rDI@F?ATJl?^QeUJH)3eUqrDuBdFTLDw9)JMulNEmbZV zBOmk&xL}jVv>kLP$Q~M8vxQS2;>Dh&!xd{066yv|1PQd&z=mRqx zR~cAqaKLd-G@pU{R-ZOuT(A>4U!20tG0g4Obnb_U1+Z5DVgTV36xUKz;5RVuYZkJ# zoaj`8_3`~nC_~7_q7lu8Cj#%RhV~#peHv~nB-5OhLu-?XAvz1lZgw+K9J60iKYD}4 z?3aNMU~7cNA=qu3HESE6Yw{MNt;mK&)79_;&xFHCO|BEgk_BdVP}|!BYv?L~I%L&J zk;e%6+il{23*}w_tPPMkj7-McEnG>o{txvxtfhM$)9u=e`9ce&6KE4%EqgtO^ivr#=c@B={jFDH zEWV-sQ0d@J%DvR!Nepl~79>``rzTnRJOEf&adFi)r-Q&gLY%{mj}!Zk-E$*fRTzm6 zb^5CifEWSC>4=>PwT#Wq)sp6zHsWN~#Y!U;$te!e6X_WpZ9{!S7cKrYwX}a5_GO_l zlC>bxS9TS@%^v`lbnQds#rSX{2_=4!%t&=x&3h{EeJc@52KO&b@Ld0K8im=x;ncXG3TlQVqy6j%reXZ{mSJ>RhZ(^#kX*Tb) zqEa4Xt|>9%dE!RfHTGi8G1xwGqINMz5W{01}Db4CbYvYsOT!6 z(9~ICxhhws%Mb?xf_E8_M3FJ)uAiMI`lwrCw6IYk(o=!L=I-tYw492cD6Tzv&oja(j<+^ zt3&GQw3hDX=ANcfperVS$}@TCi(Vn{9CRat6Kq&y6D#f{O%`c{;GkPemFKy62g-v) z5pc0&$+-4)Fgcr>Aaz4U)bUKT6A12A!Uo4(bFz)5+PLla-Yl84#+8Hpt6G}^8j0K9 zf?C6*;NO19mS>PTOm7C6-Y`j8H?YZWJD*<5+HnNFU?xT+P_n5rTSJVXfeYEjV3~N&|!^unG+W;C1dmNm@aUyw(f`kk}h5 zkgqd&74;mPBj1H%<$oe|F)Zq<6}yv4j7$iKRbU^0ygFihJpKX<%V2n_ljF0yRa`#8Q<=CQ^xXB9o|2)FiTrTq2(+B#Mb? ziQ2@B#4d@MiCKwV6T2mLPwbJ{Gx4rOU1IOVK8TeQPZ~erNq3Q2puSzC@{Kj~2$kP* ze>v3tb7n}L8XY4g*gyz85h^e3cn;_sNire=p(cuJ16;R0-&!V zO!vc7oIZg4QXdFLr9_W!Slocq`W~KM`8&Cr4wn5y&d;6Au8@f_FKS^y;?1Cp9Gg81 zrIF}TTAux92||g};r@Oas2Zb9sVhjp#m>^E5m~~n?--Pvw|UiS*$>Jkt}tROXTTva za%VN@3Y+>ZS5(orD5?w#)GJNw3z z9h1W|B|P-I&fuZ)$Gg2fy&nPk%&3}KwGY(YXP65tP4P~D6X;r$KCxnCI=x~&k;fPg z&=zfv{*A%z=~!N)kAoJBk=S*y&&TeF{f_Y`&&A#}230d?@oEScPsN|1IfDkv?>z`AYJ&x$7$L4 zBt44P(V=)(`n&X?J(m7;`u8?IGfj||ryFg*%psXMnR$#pWnM$($V@|Kex{Kzs6BLj zotQa=UMBU$tjw&+tcKFNJbPyLLL%bpvcH3V@GR3r4Y+ zIC&S;URe9_TI69hlG`ms=4)5ilgi*!>zD{aOPAK z!JB$ZZz?knk=O2C$uPI|N(qeq@FexXrO>n8vQ;f`8sqDS#YP;!T#rvk7YQG*eHMXR zFG#w1ICtF2F}wMkICdN~~?x zJ`v25meadlQ1Wf_&^xv({O2Fqs>&X@G7ezYi2vMtBJho+27+${fti%3j6vukvF_qv8=uDiFVfxwx~{Tp|K2%!pE)^0+E508fMtdPEi(#D(zFdtlaQ0NWejPWwxOBG zP+CS&L}gMG903(n98gg}96&{RL78Omb->|ucohYqj0HN-|L?k=z0XNN|KGR1Z!H(g zo}9CXXSknxxbEu$fBXSZ$J_IZ@~BHTkZk7Dv%SA~fAe1UUiaScws>2;ZQh$zRctfY z4@DLVPo<@5NmZNVJgPRLQuJQf$v+yq4u0}a$F7H?{KnYlVmHNZj(s8arPwX8FQbU_ zHBxwAk9{Nd&DghKG`c-@N9@kncVc(Nz8m{q?EA4F#O{vW6Z;X>_xr?d9(y46^Voy2 zhhh)M9*zAX_E_xk*b}iQW5103D)t+znf*TYhuEK~nLSO_?4Pk`V$V`LQ|0W1a_#I@ z(LGPCop}j}R~NN)Ge=*6TDzTeo4TZJl0^UD6dri{xOZFpG<@4XgauiTlt zx2AG`eygrt<&cRTl)T@PV|}<KI~d@8_jgC_8} z*N~)~st3VWSlAb_fx%syB1f3!_Wv+r7VhB+dMf6VbCY4vN_6xrb>hy(DHVgD_;YiKtC00enZ=IA0-%Hd05&=IWU9_yZZ{FwCI+SxrtYeNpw@TzT z(6;w{Zc~1BehsrJOh6dPn|sYyd}KA&dIL(N8d1Zp-U6>V7EcvYV|Kv&HuFE3S2NqQ z)!7=3n7wF-U7P)K_QmR^>i1PYTC-P8U(Gkk(ju|z*y=lBCT_2AuHwY{i$}C}GqI1v z|13%0llfB7&Sxyua8h*|1K2$0do7a*b~k=$Wz za5y4+W2jj8YskV{s@Y&M;gmb*TiiO2xIbCO6as)upU9M1#toj|*aZd>!}pF3fE28^ zFg0vLGqtNT+9NXrhfyib@_Hn;Os*P<0xXsVQ^qvk1moDRP)X}wUJ*t+6G6maYVRzc$FrZllsqPa#REfQrAKO{DV4}BHXHvI9C`< z$WFmzYi!K46-$n=b9pEEbPyQU2DX6`Bm^!Ls!Gx9Yh2P>GlJ+1_pbr;6&}3_cmzkt z;ruW8o71piD)A^jR$Qhih~eQ#7e zo};ng^)K@3ra{z|9%qEuGFy)1XmPOo2;ps8D%aB7wXlb^MB)_rT8+K7CKT99JC^p~ zShtnbR4XOu9qY*dw=^w|DC<6{)R>Jtzp7=7kF7qg+Oh8LR5J^zS;xEkdd(X(TSDet z8du0hLV-tTDT|LFF6shkC0PytZ&qYI9H6@Cl(K7upaO#{#zaB1spVU;C8E$(xHv51 zk_Pj%d-j0besIY=CE4-(YdR63--A%qh3hpZmHYi2R6B*l;m=Z4>6_RwU&z(vcEXk@ z^%S+ZLTEk<;@@)NCPU;FKS|IK_W|1A zw$uDJDQQG0r&un`&s|5p|9#jlN9e0KvP9&)J41n$9D;*lHRvrn8q(H|Bp;cTx(2A_-w>wsz4hhmIwBuzNkO`t0Y{`tG_!SL^$yhPW!rUv1SaF1wP zAL+CD`XIFj3$n0PDu}+^L{!|hi>Qq3d!_9 z&kPu1jVoR8%XI8`>tlQhy1hgQPRqbmyTXBMY^&!&8cyeOv-qjz2+RSpibCfb()=S{ zQ$Zs113k*t)(uNqi7T*|Uaw~$ zoPdvJ0amZ)Nh*PgW86U3L~XxDhUf=}1xE!9-V8eY!W~jB3+u;L8=$*{5WfMAV~f}$ zxF9rw5)tK1&BXjw4kmOW)T1hdB6utumtj1VhjcB7&yMdymhd{VeKjyCuHabVNGW8g zQ`7jNa=H<^TcAd5)*(uw^sS6Jwu2yS_Sx3;S@sGx{gIb;&Y_;$8_WDvv`&i}8c&fL z`kOPn)RM*pR##&fp7nOYMRRO6QJ~Uki&yvEv5XRLm}D-){Vmu5rgJ`KJq38xh!9+C zs*b;?=HkOBvczBNB~D`MEJKz`q+x5FnW#(b4qxkjiT%CoY)N}dQl}ByxaAIPv)o>3 z{%}x~3!9W&Xa??B6kR%2wQuU9grBUd(3`e?b81`Y6Ag+7*j~wOtFbGSE}V1?8kSh! z_BBRWsdoZb)l%3qo1XJ_j|9NOTz5mC0|mH6sj;lRwDxz{&-SHD+4Hud@B$PaD2Hzm ztlisjO>O2xrV{|$Gmo#%sM_DsT;e7kkE%aia~?Tl(o%!8!tlLJuqOCO@U`HV=?&?PH3t?K z7hkVEjG=68Z)|Mt<)2Ca3}+zow-(2W-yocw6m33#iOf2jClC%TXr?S|ey9EvBBH2S8T(Us zD)X1XyTd=dcuw)_pbMt)Xd*rv7MBb&iOzV?+$XZKtw{!(jFni_UH_bg5H3goQ9X-( zn78#(f?UMJy@xks6At3aG0Q|9l!bYQSkN1Mk=^Y2pjf0iY%w6l5{|r57EJK2TvqX7 zcra~55GUkxV}fg7kNVGqHz^o2G>tZviF=dBqCe>vOO`gEXi|cUlO-ZlVF=>T6B!J! zdU=I8%<2p#nE_!r*jIVcrVaLtm^u45P|#EsRQ1qpJ9|kZ+jrqz)eu-jScH%g9l&sK zMh`bjwZ>ZPw+2k$DndaW^apa#TPH{Vpv?Lv$Ru>|uOD!kL8!$=+8TO2haI8kgy!Lf z%11|rA3WspV8KLbT7kb#teMKv0mvZUCQCbkFgY98_j@2GKA2x=pA- z;~5nLs>8O7(p%dy@bz1UJBhwf9IW{JF6yxqNsV`@cSrCV$Anl3tywI+XXeT5fyJXe zp97Pd1msXgBN~Twc#~o)5F6HD$**>?Dce=+GFYr%?1kNqp<<`FpE&b$@`LB!Sp|#zB)=c982-FnIi)Flam@Q8>TCY>%XT?`q)jlie;qW+2{30rc z;-?z^xQ*lI408NgMj@8GHu+uBSs{A=hT2!;MOrUd5VQp!P0xZ;G7H!nOt8q)O5DoN zUQoTF1`%7wMaNc712x38;cwNkR+z}1^}mKLwuk|K>ffIzrjDzn8Ay2Us6hQaajRLt z(y3&#l@>^R(z*1nJLh_rJcQjFPXZ3aOYVX5dykmT0pH9Gl z%HO=qBU!Ln4!;uK$M7rVKG}#%9ZzwMa$BUjIKW-^8h4C@=E}S~nMNSI>q-IvaE}DF zM6sIIiqll_24SX^Ys_=r49EstD2Pfqk!*4ozr}>D1hF^B692!P773co2~60gZC=8G zUl=dt56zDBMos&w6?q^jg_DjlfdXL>ZrFu*>* z#^uAye4GWew^X&*Q zg`KrCmyZIkJGU(NU>|JM&DsiaeeiM8oW!l(7Q?eu-Vv# zX-E+4lx-;!d((%Y%c>|xeYMo zgj7U8p{ij}>bQixG}z5Is`)9bBmx!NO?3e654EYX7B|H@QCYkySRH&7*24vH7Gd(` z)N!dtDP6Bc=^3gZ^qfT!bYcFM;_<~(&|REGN&48@_PWp1-B9=0y3f_!g7(K99I30v zCJliJg$faMr#&qmcbTxu5n|V<7x3mqRPF+SUl{!B4E~wP!r95%aew-k1e=25VXS>pSP-?dJ6Xp1k=8W)XcxSI2 z@o%nY2kn1&OS41nEtT+>_kAAm@l)Iyt`5%1@g8YDI{tsiu#9X`DV6Oxn!B84Luupi zL@)W~*XNLN#X1mcaTu|Qg{Td?6Xcus=_R7Bj%v++pF7m}>hmXKSwI!2&enq@k6rME zqcPS-nP>Qtrl^}FY-pqTlSBl0O0d_&u$FD*rWyPd8=f#PrD53yE)MD{oCQ42a^{&; z226h;2L}d?U#=l79|~ebVK7e|gf!>d!R2)=Jp8Dh#`dLCcIn;JH-|w%3P7)J5eR2Fq1B>bH19bk5^t~eOO`yZmbcfXBV^fE+0@Uzdy)3#5>Yk=(T%idiQ%jud1(F zR5emH4r*vF2=Jq!?wRi|g9+pM(qb)}HhQgx4 z;^H9?qN?o}I3l?Pvkl@Ah?%Ao`lCF{B(`|d51E>^EdDX79_zx+vsmWMY=+`3DQp(h za*yufvK^VST4J`DW*QtjEQ~i-805;UUj{lFe4fCcv2$I2-A0q~24>XR92UQM9bKuwWtTz3t0wnFZs)T^x;Sl+nMVTwO}EG=hxk z58MU;E^%UNO-^aTIV7CNCni^}G(ZOqEnnrFX5tr>c=a8W5@_BhUh7_}`=V4S5N27fC$7_3_J81VuyoZGLzau@h>6V@)(YB@39|SgfSvS`;P&9Z z!m{gf_WS>xK^C6$DPmS!;_bv-zfe%1pm`QZo&u=n_|Imgbi zlhgmK|79<}U~*_kk+0y0dl#-KTwS=P@X^A@3fC5{E0A|7V{mnW;wOs#?Y+Y#F|Aht zXJdL94O96oXv&3>Q?7Sp*co>A-UjAe%D}gtg4sx@^VAknlP|P- zdx%nZKy9>xh^&>8{KX>7+41lRy` z#QCtzJ2k&=qUR@4+q;knxI4H9a@%{Isvjqx0^6{qh9}?p2i$mT4CRtLSKR;z=d{FC zr2FH*dLK{zIr)0}1au-MGxulrs6MG?e;ED$h}y_=Xp8J9RB@26D{UNt?s=|NE;Y7> z6B7MLJNSB;uu3FVm! zJ@2TluFhA_uHLu$sOk?_UswIl>VMT#)%Z0tYes4&YaXh3wC1lhf2-MyM%vlAyQmZ$ zLY3(I97#tINh~TZD=x=zeSh(`;*V;(YnOR@$dkk;ikN`MCr2%!kPZatX0spF^GVOr z(PtT8w#^BIZWDu+Cg+V4*_*RpsJ^KB;+ivSdZ>BH`yF%XFJ|M-yS!Xj&!NPnU|l0h z2Kf+g#`KYH8v!3``KG!C%E|C5C;=)7vazxw@9pm$L923(xge*2lP!}|nGH2vI>gLd zLHil2^r}ehyichZhs?U=vu=R;v%&Z6r48b4$q@5BjQ-v)joN8rm@h>|ay!{(yypEp zl#(R0kwvT@+wb=Bt}PlnUKYk0Ro%js%qg{u_c6%AyW>dxfnZ8xG86?W*wC7jC&}=w zBC@A+?%q_mX~CujG?amXf&c?y4+yox9#H^$X#(@Ly`*Xl(i7X$Kf|)~)q>vrFN^8jTp)?f86$ff_ZvtTfMcjsr|`#HFPerb4%Pu9DVM4N0h&Z+d2VX#9C#L^r12MSp{%{^sJMR z(&xojY7Zs>yP%;1XUG;ip9Zv}4_CbxAvSkei!$x@$@yz1IVrU4pETSXZ3^-eT+j!= zmA+A_wf8vHBCY4HrViHu%hwWqxBoQ~R?p-PDZI|bN5u_o+jd5SnyVN)r^h_o`Qqw%NlH(2CwlE8y z030(8b?=R;#rVszgCRvGpZf8t_zmexusCwe^+CFn?oN;JMHfb`fuF=oq(xDg z`5Sxb=?`HvX~^cT0QmSMRC6_u&20quND%0{r=oJV-TJGjX-J~2$J9jFE@$C%%L$#- zzK?>4?DWi%PuIP2OS5bn2xl)hbi6@4&;5g|SY6M5J6w7ebJ^1K&mB>d>a7Hso&o%jV`4RdpHUQE{>ES~lZX}49CQy4DtRXQnw1)q2(vC0)29V=bUb_MV zLaUK+>0>*|mRtILxyKukK;exPNson)POzG#fgur)$~tZdm@o1cKr7D`yD) z=h*^9L9e}^xP-Jv6G?75A4ee!(NNBqRkx<@oVp9~9H^tvIi^!-S8LwBl!osQuu47w zeo2knTXI_&z^Z(8J_mt;nzqLv37=%`T$;ZOLW97Omu;du)Kf!u|+d@GarapvC4Pw=gNmialNPrIOG@)S#h zxYGLDz?K-!+XpZG8&E@GpIxbYAwm!Q-u2lfAeyumci@C%BUvON1Ss9z+TjxI%zhptlEAo%)H9`Vi0x zo;5;L*M|l9rJmokoO5o=?^v(&-MUU>dV~_LqQs*cDSGlbg!16y?!zf0XBO`&xwRDY zJJP>m?e>oKv5dF=H&o&Hh--QW{{sg>GCUEu?u_KhWM6Vsa&2-Td3JJR^1S5v$%~Wk zNnTQDEHo7s6q*YQO6E37?bE~O{M*}I1EQI| zh-c7@w`jz={<_40RnoH?HTQ01FyMc1cgv{I#^%Kh%Uasi7Q7vDB4usZReBfyrzipZ ztRmoB8P^2VGyBr=5M_h_d~Vvq%Zaa? zz}Fp~@=2laXb#cBmK<^24?IdNac*K$NVm8EkN_i}#p=89iTJr*dO<^J z@lr`85pmau5ws+~T7O4_@K$M!Yft_gUgcy-xGohWw!g0|_Esv36}SbW{UmVbo8R(k z6?pM|ouyNK`N_m{UJ}9Tr8o#&>n1GS`gKkOVaqp>4WNp4c_NbmB`zz~Au)W6jENE{W_ zSf^z!z~+fZxerVa9WlZwV{WmwANBT{66@+5B#}jh49FWTDEOk5%fiZ4C^%ig1Sy#s zP~97QHbC_;GTN(xW3--AEb?}}gW1Qd=y!19yIZ@p^~zurP5@qIIqkDLvA6u5aA#1pij#wsNwI-0mj!>B>llW=kzQlhe?oT|DJU;oZ@?ESECi;!U= z58I+@hu$%;EDiY>7{E!Z+S1v;aBun;7JJ=7ac1HW2OW%vTet3+_y^t2xstJ5Oj|A- zI%U}_jUn=e)kJAi7$}EE+zdDd${fr%7B06mc4PTCE561tD=dk!!Mq|pqPzbG>!%dA z^uU<(YBU2i33e3?1oYMZVPsJwW~(z!Li}~53hk7 zp8v|G#!R0hCD$V4!^os}(87OWW>w}2x{&U7Su{|WfEt~Ic%--(bV4J}C93Hv`vLI8 zqv+~w`lLGX6STdFFq*;=v#hZyt!acrLT)`r*5K$;MP#@I?&P0;rD zLI2HwX#fpa&j1SPBG8ah$C~JqT>SkO*vU0Q*E`x|tsY{+z^$^q(_-Lj`*n zCKEnN(0P2D^$_0^f8Kh0sdF+~Utxdi)Z-0U9cbGrf=#(#j?NZaIHHFd79f7jG>CJQmsNwdfDuFWw zwDisQvXiLgA&`#f{4wcd@Xe65n2Sr-amC|iTXry#U$ zn%&t-Ka(}+Y$#QAHebzMNU>wDC@Y8o4wmh^yEDJ?En09)JJmvmEufEXfUWwquokrdS% zvI|Cs%y}G+0m6P7|tgxZE(A3VH;(Mkf2# zx~z4%vv<>;-pq(?Cz9xHXCA8{@^~cJKz~~G~=~4hMoB~BR*aq~L-bw=*b)Vp+H)#BHS_Z06(#O-&rt84F>QA_fmu0jN3W&vo}5uH2~3Lm76}w zSa;U$o0lQnW<0SN;Sx(1-Wk^hW9$(TQMlp@^CoI5q%x>%KSCGpN%ZjUU$ZTjaZEJ4 z@n7&$95&ooIKUf80f&oIO{x+0kUs*4fe%$XHh6DvKNO0B{}U&!ku8q^hkoq5*afi< z;oT{a9CY%|`i=1y&n&aND%|JXcQj*I)chgnD_Q^Np#%>iW!u(Dgw?PjM6t7Fci@s% zGNpnZZ9WiB#X(uPh40-HJC-U}(OGQA)+MY&Nq-Dm%Bq*Pl;VS3`gv8DpP{z&`ft`Bb=ag(3P7;@nCHfP81m51%0@V(?AMTA5i z5}It<<1GR0gNw35N}X|P{Lx!NvObysG_aUDas?ycQfYpZpm+#1lilm;P#Kv9AI#2I zp)=xWI+b%mmx!%UqKqsI8Y1eTQ}2U55BoO5yXlE{itPrzaC^c_9iBQebyVsY&~&9# zcWPDkKqRG?Wmgp6s6D)Puy&~Sr?vNa`2~^tL^+F>)-?-@Eh|KG8HiD$Y(vxXqW3Ea zG=T>hp@w&Sh0|-P)%NjjszdLlB9EGt2`n$69oKr*&0xPL!cVwW3|;6wxT*l>KvV`? z1Q5&o8TfMA6}5YM)uL&f_xLVgVta-dXee!I!Q^OUlYnTSIXgO6g*cu{{ytg@Y?gSl zb*^q_O0!AwxHJ3@L&9jz^0%y0mzt(;*oXA-uUug31c zH|Zx@h2Ve=E7yg@X6y6nLa8;KMr!jYqu<4ZOyP;LQ?dm|7NJhvlKdXLlOV!4s+FDH z2HLpPyINh3q(;MdVf!X^KC}?w>L=#l<=Y!gyCRBu?eQ-G$&#ty+!*xD&_G12t9&Kl z{i3S2>J;AKJF#DbsFHW3E_YRCoQ@&R&ZkK{O@c!nFjE=CN`eI=XfY#_A|y*YEz`Q| zlne&0LyxP#kXDf7AUl?ZNHi~mS+oj9+&>d}@IMyEi{GTd4MNf`r|H0!h4X}`JnsJo zYuf*3&NLuE@|b%|Dn!{{(vU)o45e`BJQyNdpPJ_&ZLxm%Si&@ULW~5)MDQksw<16Q zBd-ZjFEVnQ-;Ea|6cY{Sef?|MP4Zk`NOF`3k%byHwvdK4vU!3yP9YK?$|Zi}uiU&E z;vf+Oy-i}n%h4xKKSqV?ciRcjZkCRW`h8V=WqQw%A>`ELT0XUvYv`Rsto$5$sZ5+@ zBmxSMHXyTQcFjpu`b~?(*|sk*#En(2BQ}u5@4QC9o>b6#rFxzPPFQV)51D>)7bMYiHN) zTf1NF0kwzJ9#(reqKw_hC*TE?v*u<1%y7YByd$k0jh31XxLW&osP8j!;obD`^uP+fT-zAi3><&pR(5TY>y z5p9g0AHM*#<@cbrtjeH#03N^6xkVDAXQYyV$D(h1JXPM)){An^5r&cYSM*?KHv9?@FrU-!|dZh6%SR zI!8?3kH~*GIjq(u(5L3nhVl&+9=@nM0>SsBW6G8_N+O5!1(QSiQ}NFTB4yY(v>ej> zOwNLF$yDlId^=(sO{1p+ecH-i>fZ>!=OZZn6pt!(W9qYzX26s4rZ8rs11GJ-V`bF7exW^l~= zo5`{c>vYo+`>|j&ptT0}P*GHH{c7M2y+8scfjRtl?wQ=Pz#EpJX1NmYW?Tv{4l%7$ z)i}7gWm?QMrM10=-SR`h;Tcwg*1Lda7mFQ^jD{`@iE_|zTk6@NFw1XRgXV!%NuwJ6vn&N(K+2QR1GFa&LsA)x&Cnjk@GrRePMXYZ6 zrd2_qmSc-k;6b7-;&&G|aPbWQM_YPa7a8f!PGxL=uSwGvAqxrJXuYksi+2O07`rVP zSS0}_x(0fO>!)qO6WL|+T&^6xbREt_Ns@UbDAfQEH*@(s5znw1s)a4&xum7ZrnJD< z&;L39ul#24!7a2wi~5VWqg`P_0uG(=-0vCiPKKP*z|NSR=^ne&zmHtg$w4oEaLJiP8T~30m=X2XNAmSYL}HAe#8J zMMN_h1vHK^F$$86NmU*$;K@uy=Sjct-s!EYy2*bALtcs9Foc}6KDLvuxXC?80(bv8 zXAdK4lXCWC?-d#mb#8qYi?ildDHn|?z;=@_>S){CyDiCZzovwpe7(ja7P&KfG)*1(uJ|YWMM;L zW8u8Q`GpG#7Zxt|W{3Hj<0xSD_tg(Wx-ky;gv2;7L-dS6q)Y;d+a?OSD1mF6J65PccR{smLL1}qQ8v}k12P_F?<)2)Y1vyfh&`5C5-Y&*ME!^$zCEY`4++dC$yOZK@ zt)Y?L$~HuCA96!Nc%Zmw6o+9uWxisF0y2@la!BH*d~qL|hNLl{Y6e3riXYjOY8Y0g z7YQgJtIM6#7+8c&$9aLoNNnJvJiQ`REXJF>-C*zF=-S?j&8Vi-PT9+-PMG&iyL&Ux zSB06~vVR;=ss?BmNm4-WEYDO;W5_#-t;J`H&lNYv6FYnF7D(=euKhQhaI}B;&BfO)4&L8i+8%qhZ8!cay z^?NFijPq5)H|TW~mu~(AHmOaG!}jV^fMR7kt*M%%CvVuo4+nkcDPkn>59aMix?)FP z>j0|(L&+#p?z$~qZxz2iO}_HHp0(EXl07tgWccs7x`_QdZjerf8fCjO)~BKZ_AO?2 z2<5!Nev*$G$+*`igO_?deFH8Jtj&FEZ3JCklF)z%LPTs9au;6TiX51UN-lPJ0iass z4J>D*9(WHDe`^Ra7JmaJTP#dS!J)W}U<3z7CW;EYd5XOId@nfisH2bJ)kmN=GW&)p zqQjI5Z2f*1-u>!(CytYpDmw%uDnAbil{z?`*bj9aPFB~^9>;!YI4C%L6#fMmxa5_N zNZF-*lt1`kH77>{9kT8+donYm<6iaRis7x?xjDM_;ZT0?G(ZUDVGqRa?Wa>d^ z96^2R_{`Ew7j#ZNpfyG_mt@`#X5&-Tr#_eYcIJDTA33F$Ty-v=|Gr3jo$w0WuQV$F z6=cSHSCumgJPx&Hb^ofj8hn+ZUN%3B+cbo`Y|SS;X5f9@yIoW770gfS;pD0$Pp(n( zGEij5KM2A2y6=^!wjB`46&R3|B4eSgoj_$t5B$>BTcvRsMVXEKGG|Pu3xWcIppCT; z);`9O0#h)xQzJdn+-{jgvW+tx#<)mPkg%JJ^l?<#*6LWU6sX%)Gyz!J!4iMI7Fdjg zZi%<-qjyxRF6({Ay9<5Py9+~wVZ@2&7LO_(U8E;gNgpMArr>1Liz4MHCihV zFYNK1g9DK{cYXm{xmYHFfs zgl+yq%xm-zLid#G5qJ&`WVfKb%e=I_b^j0rso~d-KN^4nFbl+tn}3HEmD95;r|x5g zCyR0EyC88*^Q{1T+|sc!y|5eh)wNhSsS@5*y&Sw6JdKQ4fn(@IZ^*mFySu8f>YCVr zvF5}(6NivUx-tF7^oxZdFAyG$Z=PyRb5{TL_YGdcJw*Rg>br^4U|y(jl02UNQ2L7W zmFcU}SEoOm{z&?o^vBZIrmstXB7HsD3cpMLRqLO%e~57PT+%7>l;X(qKIT6|?&002#rF@{ zE?4jyQyrZ264c)->{Pa_L26DiN{ZI>0(7Sq7+-uxdnM5k@hL{T zK+n_UCkCf@#+>*DHCEv{pC7ZdIt@6vGqCi0=TXma4eNl~VhtWz?_h_|Pba_C*Wt`v58(Rl--s-7qSK=l}D z#*qGkuLM=c$F9uHqBbP|Lx|rN*EeHBVa%y`09M{r7{6E_$B&60=f#bi-)_>K0y0Ok zg%0fXka}}glBW15Cps~@9Qz#{s`A=Mx#6_ltilUOb!Q#8Y3VJsr*<>o|OUQSw$GiI6q?g$ZMXK2>t3L-W8eZAcqN7hWzM`bILMjLDLYL=Lh zYT-P;pZhQrGZ#vxkW}B;Bm&F|Mry&jReC3VFUc;1N!ewZ2%(}ZQyrNb@jOdT&1ioN z4{D?LSaPwV9P^}!Y*iCw)neA&7F=#tK;!c?<1@6eR7h%xf=f#bC*j1iH5`eA2xnbF zjfnw;+`S-duOniqVZ(~>hyDkbYXo=FT)x}UdPB=TM)yDJZJ$(FZldoT@wV^Gd)p^w zU+l`Yt%gREkrFa2gu=$bKduA+cz)e`#9>Lb+t3s-y2MdXV`d>zV+m@r_|z}1F5JuF zlo&hy{DiQItP{xwPYydW2>wAxu8w&9(SBCFpl0t}KyUEWLZM4Gs1fTG?#!YmOW&A6)A{-fx zoz8zc^Rib6_bONypg`u=zjC9OYwbPHkY{-BCi1$YMZ(w)LK+||ex`)D$;yeMo9vTC z8|i-)_U6r$AQ&;Me<*TkF_$Xn>gdHlJS}4e%A}`J$^TbA$8Shi0&3S#g}LPH((yGd zt3WeNhAsPQoz9l}#>a7V!emly;WLFB3!g9CRJghDg~AsLUn+dL@U_A>3g0SxyKsBq zj>4UV?-agUxtF%_=V(mAAvb;7LjH-u(n4FIz0grOxzJfC6}k%Dg=K~1g%yQU3a1rl z9xQ|D+ooVP)$3^XUdW0ofz*X9S}b3^K-G1z`q)X{OmgL6BN`O41a)239f8v}YyQ}% znk;(^xJdfa!G7)SUEiKpuvMihyCOz<&53pQDbZT9Ressgs&$0n^X zmWVC)56AJ^g|TX;--> zw|m-GFDG|a*)p}!Auj%c2(t;fp7I+*ipzpxn~@2x#@zJH?XiRgXBna0D-X%r7kB~u ziY;NyZtik|R`T1<$kFc9tGVUme2=!CMcqOCSoC8W-m7dH-B3 znfgNFZxbLDyFc0yk3n!^=G;KaXr3@fP!Z+%4f;UDMP8d z$F4{{1vH-EW}0)FtUb|7XmiQ`eDis47u8mD>b6jam(BoQmE*JKB5`ky_Y<_RJ`mfV zdB)}9vuFzPuIHoEd?*K-^=b1Qsk?yOfGQ3~?a7V-+M;WZkxy+Q3nbbzjuL?n%p5qE zgNNDiQ_o+%U@3q5zE@|vadgD-zC`UddaXchA6myF$|NO&xt#RnUP$_LoQ6UOU*_)T zvDx5`R+D4c1Y}nc9IBQ+6Y1Umd!%F5F}6j!aHfASQQkF))9A&#IJqUcHFaR>5I}hk zrGAzAS9W)x13#nM@j>?4N`q6UqbzAu1q4$q%9{flnJ4 zTfEZ9O;vWy5;owc1(#Loz>YoU;?<0u)hb+ZEx+n4j)>E}B3T0Rb;ESp^w)=N@7o5U z#UeWy5xKs#pAi@>DGiOe|AXXHR9>0>A-qou`==;d)X3}`xJn5{yXih);tnuk3zw$t z9jsWmgk>iH7CwjGXE{@G6?5vseFm5=HEY3ObYPRP@65CB2hDH?afi4wxmGK5f1hiA zM~p}SO+_J?K|M-nn;je{T-Te|dnxS0bU$R4v8;x{iSocmJDCfa)4P4HzLE1bj2si=2*}VM^YwuNfuxv?BE6w@n+2OP%+Si>F>4vNQNxNQF z3s?;;>zX4yWiobU&=Fjl`BgTa|9C;Q6Nga=K}6B82lGd*dKNc<(02#(gC^2#EChFA z0~fY2=1BXnP##jrR=_m}+dfPJVKg`=7=tKoBA5)$4Vj)UFs`SIgZDrMduebPZOgZX zoKJTK-+}k(yTSK@AB5abKQ{KKp9c2@4+K989t@s{zmSlNAlHWcfq6l}LFtR z+i0MVK@rNLZp?EqxcjrLdnZXg$V@-4wvKYMSGg-W6f^5uho{Pk_7^h64W%U|&4vEvag+=pL!my`-g8sz55ODse1t zp83`*ij+G;?ibW!-?}iKcb7F zYRDqYCOWCI?OVN6$Xt#Eeq%1?h$D8cY2NZg6|h#V1POY^!7SV6lG$h0e^mapv*(I& z7y}6Bq6QvD2%HnVD;uPP=a#qAUHo@4YBOB@ONqm2Ri^5>HHDg&hzM5>gd>mhr<6O- z@Fv75tqa~#LQ)_J^hCvv_mY?^wVL&2W}<=fb7#X(CN+#u=)tf{BquGI&z#`rDV*n= zrS*Sq{RQ>BNUfK1WLQ%8fK9ye(m^LP#(>@E?M>NJ<<8?t+?0?^?ne9ij8F>k9B+(- z>PA#lF7z()ZibBbMySw#K=SjC{-6B61iJ)(NqsW)snn-QxZa%lO6u#WZvY7UHj2J? zq`s57EA`#f_fmJmKK-NAeX09X52qeUJ(_wv^+f7PJeOamev^7C_2<-IQh!bTZ|WaP z*rEgcuhes?=h2vbA@ySFB{YFwK^1s&>b2DCsW(zvQd?07-ky3hwIl7NtKePnQ45X( z^-ZQz>9lnsRb$6;>3q77E|UD6k)D~Z6FW=#9qHZE^(2GeNji9+^u9eK54* zhmsyXJUur(j}E3IMTC_;hEAq;rQe-CA$?+ce!4NeAiXfXD7`q{l0GTDB;8t^Lp|eN z05Tg8wX#jjIPQ}EI3UmW8!^jg0C;WM<@$->*u)nmLtWS_5P}ghjv-T-SmeILE{IfEu(0D0{ec@tgleFPh7+MTGlN zKMfL~t!g=1dpS6!TI<%KK4T}b0S%*8$jGK!_|vnPz8{) z7?}@R{5anK0j7XVFhAeZ%X_=Ad-sE<`EYoekHW&Y!PVS>jXw*UeuarYeA>I&`=a+{ z%FwrY-}Y{o{Z4PhzMbGDiO-kz4l^b@{HeUx)KuDlK8KsOuZ%%AP%!fbO|ns>hM7<% zMf|ARa8y7e35IRIhcCw*X^lw$7w?CvuB^I>1HT`ZiNi}I-b9oPSJ1VznO=-MSyIQ!h%n9QRi4^ zZgpvF}~vd*$=(Lsj-SRZmrI2UE})>>M17FTXH;JZYyUDz7W>YOY1$ z{xOKCs?oS#45H=;I$^;WP+dJWb6u{6s_6RMzw&($;zCL>f@n3Vplx?*-72+6b*u<3 zAl&FQi@6*H~;Vc)BZpFfBMh(&-(xJpYxyhH~BC4FZwU}FZ-|fulk$)*ZkN0H~cOBR)3qn z-G9^H5ikQmEbxOMhzE%v8Ki=AkO2W(O$Tr;$Ona>2%qGPU}jJk>=evm1a=GF5$qo9 z5$qY%2YUs32k#7K2m1v3f=qzTS2|ogZ!F#uA7eF8SQBVZ=t6y(smq+_WgS^(NAJK` z#Vtv8jWK=ZT*higYVT*PoHCzX>}Ry%0)Yw%kkrmSAhJJ$N(N5%-|*i$itX!34BYdz>6K4~&hqi&xud zt7M|N+<9kDZV|NAB3yFxm7jAH%hZMX;j(0AKf)cd<%@7czm;_dO;>GgMK#Y{LrO0K zor%GX=k((rj(;-#8Jq)*fFcJ@yF=+fbe*?+p)lIyOOZ5ou{>4=n251<7I<~{h7hXj_=U#!lNQ^2jjM8(1i zM5Usc)B`b_Xk>QmN|vc*1w069f6(vE82AQ_G1@ejWTu=&emP?$U?o~h<}L6wVch-d zc{RnFmpMAZFp1Bq39j$M$GJ4|b$0fXiC5U$`>?l{c(a-#`Lekoj%ulJ3d{&+B3HE1 zOmJH8Sz0QoWYLYu<@WQMQAye8eZu>#_hQvMXy#v9_4TTIt2W234NeVi#E_g!k!M0M zQGrB5AjgMkg!@?Phv|>gNwkMs*obMwiwCG^U_OPb&BD09d+Z>xtHMt5YA7?LmI97- zRsGF>sFD~AV z!jdxXVQEoA#i@BNrzT}^0p-R1g*E_1Wk5Hg!=y(CJ4_9o@5b_<&3_RpM;aa!PhszN z1+3i>W{=2|Mc~fe*f8UCWJSIV)HOxC3W2D@d^Io{T`>9CL+3VoRwju`@%LK3;~)HY=(Ki%z+H`oKT^BZe||1vm-M{Wsc4qV+;w$8%M$kpxo!9Uf!5#$}GqH`4aUasIpbrv8AgULX1QIZtGFLhl_vu{TxUGRb33W6SU@BVHW(%+Sh8^1L<$93JY*5)3B%&D zG<@QF=P>Lycu5*XkbR;h!4E7{Mi zY8smxdoc5qltSCo?SnZy-m7VDBjyufgbr~^pog+C)!$JG$TC~ARqiV8D3_{WymNB3 zBe00y8~;iCVY{cPs@Ui zp1D1T+3Miu338T~=boTGyO;`XYWCU@09=wyg4;AjaKj9=XBZQY>$4BCv#6Ka=EyKNa3K52edjn7d(YEM(Rx9(&BDsbA$w4fR zEt_`XhwzoSzyzlc&l^uAQpwc5=tFh!Tam)cyRelThZX0;{`Hw%GZ)ML7;Lw1aDa-W zhAH=S{!E}3)NCuSbh5T~{r)GsyZ*2P>fsof99+e04E4KI13guf!x{`D)ecuwy}E1u zuZwC8<}hpqr=3m<$f2^U2?Baos=#I&2x5}B#i%Ukud#QG+`_&czcv1KB&K=?Ripq0 zA$Pjd)l?#ur=TIMiqY+PledfGi|J|SEbeTfE6}QS;tyjQPw=v)$?k$vJ&nb#Qf|X$ zYbS#&Dfc(<_oVkh!pbX6ujlgwmNa~r(r?dd7PWrwAL2JLzyivI0RdM*Tq;8evHx7j z49S(CHLIo6qa<--iS-VAC)YNj%5hYVWw`{APfZoqUL6eg6;wdWl;+0C#sK}DI$oo( zQiPKSGTUK$J4yNzBLLSUmHe1oDgc#^KlRm_!W+o~A*@0UhKB;Vqega~8!)mn5jH<7 zay2|&cWbM2Nje;iAOS(owYk5*EpSTyy}0{hu-d_%pmFG-7;lxfFsVZ-}dJEkU^1<`p#r%hXcTLqi+T0({JOSbJ zvzbl#Zx^pFK3IGW;kkAmUoyem-S_5X_sIW^%T)BD`8Xg&wG5Yc9A3sSXX2JwQ>*wK zrmeKOthCQ57SysM@6SIV>|R4R0@M_`MW{H2F6;;t2`0^5uCJLe_lzlcN6k3I`y@+9 zp9kazZDrcZjxS_YlFoVcc<#1Z-Pc&wH-Cv_DDj094BOS;L#i!jny`u{8oKy{9@tWq z@!4b@v>cQ1*2Ljz4MA&UbFKhaL1&bwWDu!^7w3l<9?2_Vg_H%LD|S~WDaXMkrYTeJ zjOZkIl1EW10?JqBbc02K#T3;p7??l9tYSR~Q^h;dQjvi6$EuKNjP_;F%s+uBVGV|R z0-E`>5VmGpc=EkzrXNd;Cnge;iS@MAZ%Ax}YyW&gp${j%LdsX+&_5E-B%V$DEAd?7 zd7ABCNW7SMDe*FC;ACdUNJ9P6rH3V|z(MwR_c5A$P?u{o3G+ z;Pb#6KA&ionj@5APar?>_jEOw?YZJhfFktK_%Vw#FT7Iw=VR93~}jA9+s4|_uXus4i3rr_PO%wU^YO2MNPfj3g{{kBQ_ z+!H)N++&Zc1XU0_(jP9qulQpIq@@%p5BDes5`qTaJUVLe>U5HYc1FTGOF@Z+^AdId z&qEtKgm{_wm$Rl^Kb|}*d9JZjoTlqI-exmky1Dl#6h7IiohV&x#6cRuEACrobHrbL z1bgTu@REz#Atp01s02yjFOU@8Eq_t|T9)h}d!Wg630}g9(%#|B4L^>_oIn~V)-8RqoA}))Pk`o*3jMOsh3q zai!|q85ow!=p1<5G(3y>Mbhz9FZ=Sv2$_{aTOZX?NM|_mC2%L!9*g<>tAX}V9>lUo zeQRt)9LQU7SJW8^DVN^U-1y|wzNUAC76@{68g#8;NEdM(Mi_&Ks0D=1A~{5iMLB+E z9Ro%UdyyCb{h0xvZFL3^UnSTmyGx`<7H$J0Gr$|c48Y`|$)=|Pq|k^76hv@9X|f>V z9E6i|Y(#As(d@?KW$kYq@!jRi1pFKEx2>8vzvU5Rj9+^Ep zds6n~Y-hHV?aB6o+)RcPE8J_3po`Y^<<`7@X1RTRHOP!l(!%~3Yhu5t+{XUZ;0ab% zr6Z+|YAz@#Ks8|#KNb8e|T{X7~=!%QF9bM zwer5)qi@Zeg^wM=YqedkK}#eoc88P|CH%feyqyW)#_A&sqGBMM)Be5KRC8&_5!I0_ zAII#&_$q5B49bx-)=DP~yB3PL6a)x%TJU&LDmm9o?Q8WV^X+yF@#=w(2$#Q4gO(eF*Bb^28wb=#7{KG$r2?2)u45&Fi*;p?m%G2Gw%e)VeMH!^?!EqWpfrRZ}^wPAz_C&do z7+KUY#)NetNWXq*1Vfli7I5g%0$`b@s9PsmlCoq@2Q=GcL4EWGAIav+tDxU+ zX8S3Uh*jNC^;ujf%SwP9ma91o@tD#15_9IdNW--?EnmJILH3Rw{Q~667nx~PFe&L! zytx|7s^Vm{68MhqpKZx>Gyzr+EtE`nt!D{L5-)re0>e_Ny{W}05T>!W=I3KP2S$hk z0HnEVUxL~d5*pDV5e71P3J#v@y)08q>Iz#85D3~n+vt<$cM8?I6TR;{7eY3vq1G>mbPfMY_?|#&oI#54WYHn#n!xUs5 zQx8J6-rKp!@+Go23Qb6qhUqt!|0<3f?l9Ot*PKxTXC^tcr6{JS7PCt>HuhT%mgDsa zZ+B&494k9{y>YAm|B$J(OE^0`5N3F@f}rm7!f9jL=%d_efFl7smsGJNWogKU{z3jtlKCM zkB_&Cc!$-rCp*WGfP6*sKpp!7RUct>vIiZwr_Os{)$A(an}_`~lov>TMsOe6jDMT{ zV+B2F`iC_pXsC&A99abnVDp{cP9>&;>#c!-*)YJ|hM zL3=Ayc;pAj>{-BRD~D|8;2L)JpSE+gg3Ut^}y}h#jA}J$VppOfdL_dj#la zNM{cHfDjLD{cGSa4Rb2McWP8wUvDc17n>00FB~9!B$0Yt`jP1e)}SNUMaOQlv0k3J z4BadmYjk7uu%0VC&-7{iC|cBJ1UV}QT3J_CP)396oN|5<^H%0}U^&Sw!kp$5`H<7C zV-P~jmeMnFl?=!6+Q(R%stl|efL)kgh#u=Vv14Ck*q)De7MDFjkz{b9-11;S&>UYH zZ;N*lSuP{CJSBcAEk37Hr#ds<8($e;74MI)j<1QYjSs}nHZH`WX>5oS@yYnP2&-<4 zpBEP^;)U^xj2ZEg_KCC?qlgq|;ck@0z7f|LY(_tWXwW6-mIh}FPpIEr=W#c5>1&Oo8c zwK&go$5bk{KmE8<13PC`@OgXr3HTOs2~2yti7b(L$=qIq5ER#N*oASp%C~#_v=A0> zo|Yp5{vX_6a}LFST{SXxsB^|SUnj_9tdjn=WZOv?XYfy_B{D*{tPEsaCS>Etuz6uD zz57W^3=D(%A20zk97gG4@Q3>#uEl|<91tZ@xzT0B-!|ji4pFsLZ8M+TlKQb!Ycso0 zGruTvOKzuWy;(ID1Ogd}dMgsvOL3ufN!+U#(IAbRAMmQ7S)W%iBF{gC0aUN87!(`N z1~LW-m}UHco}yDs!hwVOX;7gHN|Avmp_Z!ratT!XmzCL<4;1CsdDw`LllYr3q_@ZT zwiq}l(!q8r-!jpIkpu&#j*D;$;v$Hcy4tl7G|(gAfFGe#QXT4-ENmb*$vwpCJzRA@ ztlrs%@xFlp0uxf@S|P=!YYD(vuKhZmoer8ZsR+jT&Fy3YvCDO$OhEY9QZKGWtzF_& zZ$9PC{x zM`1g;HhnwGY1P2EIjo%ZYz-_b_uFwaR6#C)*xerm`BI&k5dtud1$H60g}@bpRGgF9 z5W*sE1Pmb%gdh(99f}I`o4cSjSlFZ&Q&IuT*eN>;oQ)6t{M4!pgENtPrIEj&dM1meaz*g!MDT z8}iX|G4c{Qnz;M5mEbU1+`P|bJXjrQJxv5RTQ2oxPVve#O-ofMx4T_Ro6DG&Y2<7| zs;|>pcw)(0leA)mT+vL~wiDPuAv|}SjNK}H5yJkgT!E3{D8&(|E}_bU&LA~=!ZRUq zAl;|n7pe<0Y2BySG`y|`IMy5MW8beF>{a9O=NK7`D2|UtA{PHz0gk{`Bj!Q_oqQ>% z#i+6~NgYb#lsohsPSijGS*GZ@&(fjlI2(NkbFQnI^vH@R?fGw-to`PbO88R`$#mmT z4O)FzH?{H+8RQ5C7y)IU`IJ{JJ7d*FoDb~&KfSEu^qklT@{Av6y}wuGs_O9e4+6)1 zWYvixL#aAbhK<+e3p2bs^~V1GesBEo#L~pcl5EMmGxNd1?Be?3M~c@JZ!bPld{pYt zD%i4DZiNB5t)rWx9U{?8MfMas^*F=?eZvzZBM=l-=aGZYRKm#0XU=<5XeqU$G5|Dw zQ1M|e0dtN^vIV*8^E2{SJsuP@86fx3lVCNF8>N2wg;WyHG%v=q9o{q>+nk#xre_3%I#zzP(Q?jzR z9;`dho9zMwlWh{5&oYNb7zrCRjPnY)7%|3NQr&h@J$LL%B!|B0X3mm0f&W{e(0{M{ z8Y4u~RJqhLNo}fh%))tdOY`Qkus@}Sgw=2anpy&3;2N-+++h1dwpmW2{8<@1j}`wv zl)ZU;Ty^!weRF5IcV;qco0gr*j*8M!5Rj!wnzm`vq+}@tl#nKA8^}h|($)n5K@kvF zZ~+tnMMYFVf4HD1vbmtBh`1uIKT&pQp-}p~Kj(Yz%oO-NujlzgUvx5am+x}E=X}oR ze9pH>?qXc%aG`{BMjYRa#ON2UZ;_<9u zl7nfR2Aj?W06oKXr_^Pc>SAtB5(|-VmO*~}Vdq$>ae-7%)(ww>Z7}fkY)8h~5f;I~ zBF3V`d9B;#=>jyi+{w&Y=ky4mV1XG2h>Pb_Ph_rbJj&>bvyHI$f+&lQ6Lj*(q*6W> zkGXU$Zb#>0%Cl(N)XK57B@e&Q;xF8mNKhtGx}bDn>60W=P^umSuaWkR-cQWo;+LWN zvVW;u1cKtzcEa>iVNp+cU+{k9-ABrK|AyC-w1V~z0s3M(Vtmd2TjI#Xio`(TZ?LLI zlb>O5p9AGOCUsouaV-7?uot$&PdJ5O^V;Cc1eWNJf)vB-CSXE; zFZVjH*kR(@l!+_bV(JK2wCT%{hnVQ=R;-iodUH+1XYsu@Y*3ybPYQWEZKjxc%x52h``ayC zuh%NHMm<&9Zt~vQup4;oh5qhTZ7ifVqn8?tKf`yPnR<>2gx{ne43-7UgHALReovL< z!BnpvYIUmDSi6DKt>M7AP%;%Sjz8Hp7x(vAD69r1-hsUDOhr{7=D+L7~ zpj_aK^lLDI=xz(iExVNIlSej}5*~iw2V=qcCV30YB9J{+#@==moPvQh1Fo$+jeEpy zQW+O(iTPZ`EUbe!+dnlj&qA?uw^hn>$?Ls6(Bp2Qa%M4Qizj%4Xo6^Qsfy;4-WA^G zysvsUdEcZK_;&BN4ZRIlaS9ybznN0y<^Gu}_QL8ep}gtsiAlBGqU8Bk z=|97Cdqc2PFhH)Z1&l27?84KTN=AS4?iF}z=P9wi;iX?v;i zj4{N8Kal+d1r|4Ff0(@!q1B&eAI$z6xInUDly2vCrTOJsa;N4_;~YAukfrv2Jy~^a z<^S5&9W36gjzPtL6rU+RTYR~+51oUKMQ-9dlv~}6w#gyog`84TE}iaX`qH-9%8l;{jG`M1XdZw^}2Kw*p^FMwk)W8qsITzbDAfeg`?66(rw<$lQTg!gmK~m>l?|xW-1&)6Cy{Y>5_PiiQdpD z5fN(k`MORcGG9Ym7lE_A^eN&_*Ll0PX@7MPW2;J;_*c&vBVGa9M_>mNr0iD|0{V(c=Z2^TUO zjc1aim<%`-7bM5gh*4!D1z?4q@v%v=gtatv!JAo==QoTX8j$Vlv6~Y^>N?&Ju~~@l zJ%kP$29-&}4si=tK!c{+rwYF)mWpk~3+XD^cA|9nHA~q$;Yel{5^0*)C2sqFFqT$& zzc;EEXL=WSA2nn0Da^^0-qqeUkk-G3L)qq+sg`^j`pW;7Rt1{j@6Nn8b8S{lz1~8{ z*c&zX793(D9!ovJ`d_n#HZ88~Sbp6Nd}L$@nx!h~z{`Ih^$}W8i1MU|L!S9EZ+1*0 zqApG1J5fr%$DTfyon-KwqCQ*dCXl#@bQDR}Xw1Et-a))eqjS7$xiRd}5MUrNYVwi- zD*ICobRiBv5V zh*na!?Qw$?3I}Jcz>Dr((%scZ>#(*}t!*o0e|m_-zvSgXF9@6KwFG5Y2FA?~MLEdo zkSsinrA9kO&cyZVQGuu)yOOK4dVz@9U_W}cs7{E!r$(FPqrkh}znBx?6qPrXe#RnQ z(!Qv-e<@W6;#=q{;qf7zrfN!kJRPr-H*ukuwxRD~?I*oNr|}?;hhB0izFZHUTpxnb z2c*wPf7ePp53^1nzYKmA{5p6b_-*j};13)me+vE_JRJNbcqI5+@Q>i1!M}q44gMWG z8ax&}9y}2|89W_46V6BXM2aRmvO}1=OQA?VjAyqy$HKd4BS-VX$a}+cW3C*k*>9m8 z13i<;i$yI!GUJHj<+n5Oh!x0#A}~>{EDgtKI9t_DRw7fZPt{}bmZ_T35;w7;22&7X zhu(xQC?(NaTrx}8t91U94xUC-*Kk`_-{Us}t8$|3jMS^-SEX9O^%e8<1RQEbu10$Z z8-Q5~9ADi<>@GQp<%|RxqS_4h+XI+NTvpt4lezWPwGKO{4Cf?@%1%;LbCw)Reh~@K zxU4r)9M)gFw|S?tMXU^2*ae4RUXCT3nynQru=Gt3-U;m@)~_9|e3!PX0h~+Kkn=EK z_Zm-JH{c?r<}nmww|xlYWPE6af;LfLbUT-yRvcX`tfjOAS-5difNI6x(!eH7xy*FS z#6#+6TXm$p$3*fLQf4(C{Gy4eRo(5(oe?l%i2nd41W#{s1Wd)C6d?-Qe+K(U23Wde%1dL^6`_f+$$Pn99GG;L{}6X`;K z;o`!tiw(v0;$|l`jJ9l(C?MCyUZZXPM}%J6fWYdG!KfPOSNEZN1z~=U zCL<)r+A~?_ZTtt@v&kjIUtI4GoZ$FtW5bJMZXr{~issLgdMbKr6P?d={L1xq{{5}JIiPU)r}~{W3`3U zF|m@l{T3DoE)A(hi>Y{wSi3JT^KX?*=#MEb$`nqcgX|{@4-}p*7K=;i8vB028%sTK zT>Z|Q=|Dki4JmdrQJ#WGWLf4cMC5d2n6PUUH@s&_^Sr~4=&{`7t9wTkRb*m+YmIZ^ z@AVoNkJ7+#v`VM*6S>457$>aI_{fl^CQ-PeSSeoQWfo6N4B58k!!#8PAEwwRP36Mb zSg!~wiQm*E4fbAv4(B0JrhiTp?YdG%H5fdaC3TipaAdevrc{wSChSx2fhU$Yg0-)- zr#uuX|98@8wxhXEt(zbOl|?V5T6NWy#ipNP; zHg(g&tBtm5odTsnTH+eiL?qyB1zC)CJ@24yjbe@;y_}bS6%zvq@>rLiVh2a{OQzRS z9QXfrSYdVH4J8QRQS172c zW@5s*+2>603-w5pWn3P~o1h#gMZ`DFL_ODl&!^^y=A}zR5GfT5j?2aRH~2UC-_!v} zdIL`|cC9VQPs290v?F<|3VbJ(N9`mryW=#kyn^LGVADxl=M)xs2fzH&@*~~>ZBZ|Q zD0EB@QdFX}Pr9MqK-wk>D9tn_9rBqT#(S@bbQZJf|l^Xs6k zuk0vm8&y?VtF3CXt>iStB*S9{tTGAaa+tl%!1Np+j$rmAF6{n5 z6c>^AB`RrV*SXdKmZElvJAAY;GuPqOO%xB|=BSg7i#B}p-*R3BHk%4^`bC$+C}I*c z9Hzm86tByPkyG7C87-^u1MA4bu%mAe|F2{+S`D%>2s`z8HOuA@6*NQEoeVF6s8Ly+b zK<&^-A`iPBx$cIqpHt%-Guvl-<(9s7N=`bfXS~g?^;y_m@$=Y9fb%ucLXV+~2(WOa z`JoyCP1AQ6JMtoD5vgnlq7lBg?HXKcSWh*YR}wH-P;e*c!m`CCzN=fNo$iAKMqk8kNdoG5{9_-wAfMOBYQ(5 zyy7jR@&Wcb@9?>_g2N4?`}?|yjVusiIXK`txEbvqv+)LC3(58O%bzKuB4*uo=9&}Y z+U*Eg;3qw?sXb zqG47UnZE@SSTkxg*l^AZ-L|ZHJgj!dgCK9kUcB9`zJ>vwuHV3z`pAo&buelUk?r{ zZWlyh_%8PI5klXAPL?tCcu~xt{16xdHtvHm!h=HV>L-5NI906rP*=ps`(Em9#*>4n zpHu*_jmtwy6N~BSP$4s$y{>WjP9K|tYRx>#F8N*;+%RYvud#c0a&+@6`%s0}sCLnE znW$I@UBZV}4~rMR{YDenw>Ttb9l64)#*+q4-$~})s9UoaN?)5ebGpiMk3*{Gyl^oh z$LsNsu_uR-aIkI3F)+OIl>y|YN7eg^{HGfON=Eb1UKE1p(k&);B^eryQsE>z9ehE+ z@LwFHRNqdntO$}Xxe!i1EtB?RFW&)AjyM@d76VJf(2NzTW?9-@av=lJh8zaHOn7h% z%!zF@_ZyUfNhj`4uguIUTnZ9_h^CU9%%3gvq{c^&RN1Z4t$ku?fm%^6LI+7@Vfaem zt&=uv;bP*#%}qCYsa1Md{*W}`QDjGz{BSLaS~jd-ul`9-F6BX4JA-Gq<{o?kQ$}4& z;zM2cwmGr-&sUu#J5hNuy>TNS?9}bN;qYn&(=2DPJ9UXQae1l zv0+TUFhO?^ zmOUOF61`kEl&tm6u{7^!mku~R(k)QW2ys3m+_4A$_I*kRMAV)*C1r!Hg6%AVinUHb zQaD-&VPK#9Hu?pHog<@`Fy`B@GyJlJv}7L; z<)HD{#%3cO?4I9Sw1fQiLPL3T`F{YlrZ6#5<&g6rcbY?6PlD3pjacE;XvDx1X1l@E zGd1m@$objD%Qg%p|CG5d^ZCpdGB;$tk@;rke=@gbzLoiQ<~y11W^T*ek-0N-SLW`_ zk4vjdL#1It7P4EDRUH!Ul6iFnke%QI;tJ{rVjJv+BQD|^LC7aCkjC%vO&h6EnE?dW zg;coUTIW>#r}OkC4i~EXZtYB~)}cxWTi+#byj&)EJqCi^jm_pCY)5Aisw70bk zl~^$fVq9Sbx|YPzmOl~qN-fozs)$>uZ3mrAy_?po=^rIIBg&v1py|YTVgeC@^UFUd z!wae&pRI%Tyk?h^@{RSJ#eWw6gF%2vKuj2cb~@sJ$E9UHb zK=ywY`x+^AI|_s3GdpG2vkH1+orx!DOlh<=Q0g0RD7 z--Pb$MuZOcY1mhpyoSyGTP-2GJ^6-YOR5=Fy_4x#c@m9JZ%O}V#(anV(e4=*G5HWJ#cr zRZD>8XFo-`1QPeIj*d0C2kEsTr&3Xc9M%D#V{z~F@X|RXWV20s!ggul?839fQLJiL zXLC<$JIFFj?@aZy!u*_w(~K`QV%x5KT$yZ0#G}=dHQm_sRqn~Wi6}X-24tMEVQ8cd@6~TYQJ92jtiUI+A*cC=J_G zSAtp;iLssgf8yKbl5&DiJCOq=Bx1kpTRbe#r{ny&5~0eem3}V;gJ=UQVf*RQ)22tF zsA|rbCJLX1QUjB=b&`yx`DsFzUkpg|x~6yS>c2o2yVpoaRiZxNM3^F#>QOWs7Gv9V z4cfmG-I;x)OvQMuaUAnv;q`^13X=$HUs<@Z@Q=d3kk_73+_(6);;D#iBS52!{pbdx zzo(Sh$Q(tyJBv9t--*pl{1Kq@(FQJUo;qwtRU{0L^~<(XlaOAq7_Wo>rsAWZ)fU&b z^v`2Y-3d>1!|G;5Vf-8&dqNb~Al(+G-XinW%=d`ks$}ih?Xm@QYItv^`4!ilZ`a-V zUPstxkeoS0#qN%PEkubPN5G3@G)0CZlk1}iM4uN*f+)iPQAjKS$TbOF)*w$?Tv54W+ zWMWear#hu6JL@0OfvAgh|DW7(f#@ zy&~ypCwfFv=4q~Dm*dI{65-)g77=HM9TUwj-Ct&73XWYxPid)xgW+ZITUEhe=Qto` z=meGeup2LZRk?Da)L2$4aWbM8H{j! zlj_2nmchZDqncm=)@8lxVQ+;z(Fb;j+Xt1NuD)*dr4o3g;J&Yim+j^$SidGhQrDCm zKg6&THDPohjqG`%u(a^~;(XTuJE|zs$LY58()4mP1yz#efFldHU!iYTaPh|R~GxUKji!EmEIZo|K0)VE1{t$Rfm4uo9jxZ-2FF+!Dcx2Cg-hkmR@?JJUvd8JHMTyk(+-mlAfr5qLBmOs6FU4e zxi99vo4dX7y^WVQemXyxKP&$Zrlk#9TdQMv>Kc4caa;*j*6WBjn~5uyqcsX3x{&Gp zCev%2Qt^jO{!(-gF;H}J4QfDmLq$P)0h&ygQ7ocS*18d=ybLXH#sa*2GEcG=%n2r1 z>vYFThv4E_?9(_>$zgvRzoP0%s3V)60`&{dgmdM!3K1AM$j0T0p?ZJp4* zO@HIi!pU$?-ezRLH9%lv5CY!|5T=aF$DsvYSNJ)d2Jbg|;O~LP{t89#g~B$=#$-7= zb}uf3v$DttgDZf{PJ%ReCcqh)n&Np-2S2Xfm9$K!Ekc~FuNQe@&rNP7uCVS7uT=S~ z^pJ}fg?5Lc4YkL4qr6?Mq0E6a9GLGdfV6em&M{ubw4MoexwDWBDBs6z{`v zKgr9%tzXE;6KiFqpKK?tA0c~htkt05yvo}v{gu-y1C`a4LFNhTs+@wJw()3O=WX1> zrJeXFp!dTnQ5}{14e#@EE?sHFb$h>cc6LRo!!Y+3vuUij)J7M@RbWpi)?yqZV#A2H zuNV$IiRW7hRub2&YtT}W8vQYeyS#i)s0a%TvDOMZQYbayB!uO97Zlor%aX(? zqA#dh7($c8T{x2P6NHJ@$BZt?87`m?azB+{48i>nt_L>PcUKj~zfrTxLY)`|65{oI zT6TQX+a*5tUukpkY*s@A074pLeD(dN&ox~`G=MD~w5*W7M`A%~PcKC%WE7EP!>%~l zv&y>>y~A8+@1%Pra4-)9(!OAPy4r_rxbV9oeZs(VDQ=F}fQ61bmXPNZ;2@(d$B%)! zfq{y!BG!o_fC#8G4nnqNWG!AbMG=ZnWhhf zKJ-S;E^|!m+=%m{9E6hZ+6E}=*RMN~kFXzS zIUAM9UDJ3l)hF-H2h^XuJ^ydI^(1h!xb`02-r5s5kW|8nv))f1`GGTRFstDdH27BK zAA}}5$mQN(fj47mcVEj%bt%H7f*?q?rv!U*9KQTctK;k@D>^k^gKDa5!$|nS7SJcC z1!x5LrAv!*kMITmgL6Y^@O3N$I|+QAkDHGUKJa zS)5Vxy<<6*rfGtMMsb{XUDDRYSYQb%5s*srxb>Ukm)x;QV3o|zG$iWv4m#g4z)p88 zPmGdTL@J4`^ADD2%W5n&!j;YxrI9^6AXeBBIeKI*ut5as+S*-Rc(B+ZYfZRsj!s;= zfWAenqi8kyP{NceJM4)0E>{L8a|#XAXt%xaIVk>^DFWA>yQ|EtsV?zmgX`uP#n`bt z>U(3YV=Eke)L}=?ckHN)^2^l|qHsB~u@}%jfgAGFDFIv;fasZ{l&Fxyh)H&=#c)oVs}`aZGq|_@UyD zAt&z|ANM_!%-QN7x{nCc#&sM6v%s-;2^9vic~0_9FDY^^ z<8%%KhrM*cDyxo67UI%o7=d5p^@e096zp_Z?376#6DxV*WueGx~N zZk!u$?8v{K2@*)PHg1Q!KDd~U12jQ_S;o=-O;*>SkRR~nh+FARq@D(&uz0;H{8^vz zN9iVG+VoM6JZX>1Hsy0JeUY3gK5C9jlrhi?BIgneZl*Ki-LK zQk7#=;3P=aIYU1R-fH14N<^`iLYLs`UHrBFI)B7J-5>SG{BeH*mg<@Qlt1mS_s>GF z>1_W!{yF}+{(1g;{qz0zA-a%uXraXpbw1OWdoZE~W?nw?JXYox!7YbZZ;&Vf_nMJ> z0@$NeD9e5qb}8&y*sZX8VUNQ8g#!x*7v5Mnr0}M~p@q5L>=sbh@wF>)z$d0~>(3%U z9je#VFY8QM6)Eb*hs!12j8k6|K{IfTlkHm7=@-w;Ro5v*&SVt4RlHjTjId}sgOR<-*NQ=mUXDJdsJ_(=J za1C=fOgSKOoCdsWAx0ucubdml_0ZfH0awj+UwE0EoMcso@%JFiffsW8>?=(RvOTXP z+M~^+cUD9a@z?$IZ-Xvk6=`z_LK+|39JBc!|2dL{H7%ujXQ3>$o~l*0&H&9~qSmbP z2u4i1M8)iwGCL^rW|0vC$6?U%ZZzTv>EM@tO=*dNw2?2xAN#_QwLfGq;mifN4evZw-2&ru-S*^Ma7sYM>t zaB#!14P!)O=LMgpFfZ%8sufhC@m-w}eVh^Bp^|@t+!&Qj+aXtJJQBr#V;YZZT+rB> zpOv4@k+(;Ful(!s&*xttiT`rJDdUQ=BxCJvnPgY~oHd!Y;UUlt z!#MWtQ@Q;d{9$%iy{O#5&im#?=b<{Q`odS2w}o^SzQXzmSFDrpMI3ta+%+PJJ5o>O z_V)I2T5MBC&lyKjwWfZ0G-_>YCM2448c6CO&0uIh!XnY8WuVosXi*nj?GvkYTM^W; z4@oxM49e&h_LHz~7kJv!4>MK1AF&vucD*bI-5oT`R>?Mw<8Y_t5Vd%ctSJA!|9g3Wy>UM z0#LcT?FQEoS9`&V!q!2-wzvatE>A%#ouxWxEZ#06{*GaGkYr~#KLicJsS%j;Ut&{L zKxxD9PZE`Rc|>~lIQrk6F16$4D(*MS=a*g{_6>3p*&S&yZ-ENpbybO6n(z z8!4+lxA^|zB^1_wnAEB^>?E!hBX5-vI2yVK4;NR5nA9;Z1joLkTi`t>HzE8^nk0*> zfie*jQP9wwk?}dN=v*acs#{T~p@JKg-||fdQk@3#e$HtuhO=4gdKSVD!W$x2%?NU% z_aZo2cPgn6Oi$SZUK6V*+2j#Qv_UelqgATcvAhn>d&Fzx5t&fjyFyPZ1xUU9qFD6w zOE5WMOQWAoCmI*4iI0zT)CT*{7>No-GKBgq{oN>RvW4DYIY)&UoQ%X(kmF2X6}_B@ z8j4d<|L8FA_2_uA8_^A;^V-h&)pb1m-Xd`J0E zYNSW`{DqwwDF8fu-UlufOc)j3BTOkN0evrC+O#-FugHeUbz zI`C|Y>LyJy!lV%(TaIbEpXDGdByuyW2-6wvmnkb6=gC5JVA_Iu0nz%4Zm^5m=uR0G z#=8M|kos?M18%Dd$T$vgt9-D$sVx7tc4Jq{1XxI;H2~cxlElTh)k~QMGf$H&{-yXI zno>SNW{+@FR5Q#@=*?6C)bP|I=7yAHBq|<_D`{kN_1vMV4=qXuZg(mQE)+;s(W6Ry z0%FSV8`cc?BH9U^8w0py!XVRHmraAM`+!499>P|i-cPb2y zf56%JMDdfw>x*A3-dMb;d>-03x0mm#BrCHk$Ebyt&OX8PKHWpHJXIKUWqa##T2V<= ziAkJEfP129s5;tdn9|&;@@Xb~$IbPlHRKFpWx>XE1jm-aprDqr5~lshJR9K}{rES^Bi@(AD4BPITmeUPL-nO!O;T%)JtxyieBD(XV)*l^}tl!wz{ z%Wnhk#u>Al)-;VZOznfE4va#Vy2p+Wfo3oRJCMG_?DNPq?{x>0-aD~k z{ghTC&;CJIKo&t#X1r$O{jU5q_U#g73Hf z3@_20p-jG49U9gv!^`o*phkGlBlQzDOcsdAEi8c9tUi@4fYwVSvWeZj^e_^zbN1md zr?-|m{7LYVbmeor5-qb?x(paXg61jK+^K?73FwIM4nwSqxc{Oc#UJV(={tjCyo0MA zhrCKmjkUwWofw#7Sm+#<&z#dxN|R4^MkEx}# zdIOqPI%~H+WwCKY37}F?O9U-GpfE*^yvNVIrmBfiBb#>g?M@~IYzwhS8j#jlG*E`a z;@U&L3Cl12B?Nfczxb=VwFScvo79$_mcx@=i7ca`PK4gm$_{^P8ps!jgA1U z8f_|OdROoq$wXgNt59&t(6M1-&%94m2h%#Rxi>At=tAxTT`2yFyR=H5<4@*k4D3fZ zmM{e)Z7B(|G9lB5GY+n^skh;9*>C zS5z9SJdGZ~Y%$2GBAxi{*mwGqmCutsaY4aizQL~9L>`P_XY@qCGz*BgLIiJNQuT}S z=gWV^QcbTLS%VvA4!E|%8VS0kXc73%^fNPNHVpv^V1=s*vlpI^U2e3QGxCR zI!7EhdbUct9rt0#C2F}~w$i`}n8y6hsvN~RcwA*cr4v3G{hc@9bi8t2W+N5)xs*S z!*21_|_msE?GHbGPZiigoi)XnH9TH-C;%EQ>+hvqA1 zl_+$$xQ=9PM=k$n999+&MWtqd%5_MEqd@Z{F*Zo&duhb+Nr)kto1T|GEZiJkn%SCt z8}o8H;I*yVYa&>|KnMi@_XY6i(>^#w110miIKhx9R*QY4*t#cD^+w zzHceBdsO1VlSMeWgq~3lvivt*`+CaSUP;8B}6Pl%jD+puTb@lh~q|2LQ(E7vVfETwk*8&FQ`t|YNf6AbN1R zT^tp2-KYaI0!QT-3L9>re)0RM+fzTVR_J%8?n?b6-3fC=TBG-7zKm?o zaoM5lwYfhwwm06IKQMoJAyZz_bY|03)4RPwbgtXtX>)*OxIx0b29!4YO z+QFeIPI}M73;*9@zZXP>g1SgUA6h`FUkB8S>(^;bW*iRwKBM&8(jQBI0$qN%^q0~j zrN7ej=HG~&K300N^i=8T(hH?+rI$)CGbv1|7`Xf#s zX50jQhvq^Xt05~j-*$#Wda2Si^l-)i3Md?LEpT6^PpGQaI;20xtfZYkz&DfOHH8o3 zw4LoWwMF&zJ)oe~%4%H*yM}U5lTHoWaqN)w20Fc$pR;JVt6z3(XZhm82bsRR$N0IdN0V$U3MIYMnPtk^v55LNq(iM1mp!8qPERjSXgC&*hZEsscxE^iPKWEm4dGeg#!9|Y zth7}YH$B+&J7bT7_{r;yjt{fVxG^T>pUIq%d3)xx%s^&!W-v398P2RlZ!I|nL(BM z5+s?wp8DU^e^Xo2OVK)eDf3R0OPX>A<_xdD|RgALr#@g{t)^F2;Yn{1SD{?rA@{O>v8^XWbvvg?{6} zX45ma-Ihp<0m0mEN63iaf&0v>Uq3;Lg2-BYpxCg8kj*)Rbf(4%hRQFBZQjh+($K;D z0O~6wM-P#LE(Ij^N(-`RqVGrW>>?fCToqHdj0y}8(`!Z%*||FAp+nc}P{SEkqrwd# zQM}>yuQB!z3((sU#pL-na|DBA_KzArklAJp?qZUgLjc2^)#7W$p*$;tjwTABwea{? z55FeVP+~-)WIR3@IN%#xXnR#>fkPr}YgemRu_O=`&@!nN$KC#r)<(IiY4+og;_h~>Maa`jcs}hmczHZsnKDno5F(SEsRc02gVOR8{E#b zP7iWNJ!_OUM#aPBgQ|fD1Clj5`|#ANF{bwA^XU6CF!t&){tVLkuhLwnJ0ZQzR3|2f z72lk`f-FFCB~aRg*ba}^Ri~%Hds~zXdE!n4oKO&BoMWduK^_I6XD{2fu)Vjg|M6^T zDRy_TFK(_p-vBT^Obj^Zw;26qCCn!jeM> zXi+Rpe#>-fW@pg5`0Z@Z4atr0SKghxgr3EpLp}Z5$?w8m`C;;YHfk|fKJU|*AnGz~&;DI8W+)Wvq(?>TtOX7qszO_}n z%z-Idte!R8-o=HwfhwbRR}AA0faD%kTn@TefG-rhvaQNjEyysYBk+`&+*OUQ7ub*w z4QO~&l)HsaXSykOrTz7g#y3ODJG^m|eJhvGL(iK5J#SV1(fniiC!py)#~hlA96JPh zfAf-4hDDpvN}Yt-a%~^&iEd*QCz%_iOfoX<^$5cr4eQ1ARs=V~$+JE1QcK{b*RIjn zu5+bUC6&f*eHhD?F1F!Rg~GxmF3<3&fuW8E0!^cIQ~jg!!W<TEzF`UG@6EA1*qmuolqTR&8k4OwFgk~1 zz53#^z)n?}ujbYc=Y~Hf+LX1l>@fCAH7DFU=`9Oy${d(Ei226ePqWh%F}=JQP6!c) zTGQc_hEauvgKJb_AAe$_V>KJO7Q~$}C^{$DR6pm9p=w8xS$_7R-0M|3H#9gfH95R~ zo~Eq)R0Y|`l~mXeD8hI-3)TP|9Vf2#MZ2SYvEXV#;(B|I7ete5wRtg|S#Gr?z2o^C z8-dV+B3uruk+@0bwlB~D3E*7^Jexw#Vzv*FaR$c0OW1u{di}r1x+ztBw0?@l{6(;} zV~TZMn^+QT1dIAk!#=)>;|IVkBiriwWI$FNr>+sRj^1n%x+7R2+0THdT4BH;y?jfC zT0p=e;cods);E1JBI+CbQr$uRMoSU|G@?qv_vQ~IGZZxI3GAKn$wL3HXf8u z=2Q89=KtkY2G&w*LSd`POF7Z0JlTaQY2ggFPlHLvBcyCL}i3qF;ZRR9>+8wZH~RUO-$0Uks&-p zD0j+SI0-jHjKqqa>tIRGhUW}l>)hb0C?Uu5ml&D%BLg9_(-;oSqNWePuIv+ zU>_RxhU-d;BP~h%6(mhm2tVM;M(hkMu^R*zZN|;kuCt;*%aP6CY*rDC2(OW|#&gPt zaflq3Z})C*s5I=|a5R|gxPKYR^Pl+t@gMWIB--g4GMQ}SXgn|Z`Q+Wi^NX#;>PfU! zU7MOnxyGq#nEIa7IjOI3WOb%b3a$u~VJh4sJRp1~vq$FdSuZ<`ru#o>1owFM`No#~ zoPuANjavKPivK9>R$7co`_IeA(m~{c^0no!(|7AzgQHrA@K z5kdVlkQ^|Z^Q*l4imJ{@k5q(q9Q}$0gct@=avXFtAVf_d5^1rFbsY;h7!BSFPJpjr z`P1!Z!QJaXGst!Pi)*=KH%c`I5qFdkMb*2!u*#9Et=h1@?;6xmdVfV<#R!S^WH+FZz&7prWGK8tM#Ur@J+A-o?TEb4KhI5~Et zd{|6Vlud_3*ndQo2*ZG+jvZrz|5<{R_V; zv>{yH3i$)_lcsl7C9ZBw5O})5CfO_Kl10A#L62H$SO_aT7V+SO;8im@a|{nu;RjQUT_ZL#Ms5s|KU^Ucm{!#u=nFfcgF0I@fF|Vu} zu=TX0CRU;cHQgZR{pMQ-CO311fjF2r)B+Nh3NMqL%X25 z(2Fk=U-C-O-*#eKvW3=DK_|KkhosXde(j>tSzv`R+J@5w2T5QW%K=j0!2<0MIRwG; zcMOlu0nu4ICraG_+Q(@An_R*MmL07LX}yQ*Fbqt>6}Ej1$C@JxM->hO{s@(#)#jS@ zz2r>d!qOJ~gB)~5rp5eyn`I7s8e1=Cib@!_woXgSR$HP|%dL}Ib5ZLh-TU^QDH;7JzBN;h$xXS2;kyD~zk-LRm`fuv#>i7MWL0YV%>hLG}Cl51IYVE#db?pEb6iNF0%+jCpBT6{3*cmAEbVg z`bFyZXkbNE8bCY{ z>T!hIIQ&H2qN6k&`;Z?ugkqbI;P7hZHR87<0jE~M1E#|3k$Koj_=A$+(kTG zN90XXweoK2RDOuNpp(ZnA60Rp!SW2^%h2BygRmV?0hAACycgXAj>}(*bipMOQr}`m zND%$16=b}CQPm*4t-q_U*P4lLoxq2*NYCjx;7fmqJoChmD)f`y4Gr_dFJ<=C>Yd=! zd-g_hqXHl!?)A`=iW7Kzn$mTNMahqRn9=8Z8R4k?i#oc1CKzrw4fFa3597~i8hIU> zJ1lp2?u^_RCJS5;uDiyq3>>+FMtqkfKTZ?A`%_P*8^X6pX&C;V`s!>g9gY35O54eS zktw%?pPLO1svxUok4bEjg|RMDW`lHsgFj?!lWfL8)0u$b#Q&nWAgnw z{l~riu~#+P_Ovl;6cnR5Z+2{A9M%I_;Fs1Q9zV5oX!W4QX3WcXiQKEe^pg!^%TqKD>jcWS*G?i&F|Bz4KX04Yl!`glcQGz86 zS2tYix6n@MVH?C%Kt~$JE5UagQ*-1MK!-a{bhvQO@RymnsIh+(5#CSI80kR*wgV^@ zxH$Xg?8DhdvRka}Q6X1?>bk$l@*YL|=-ymkl`eN$ZVVUt3&p!|qkmldRq@xwhl;;v zlKxxD(Uz}N+O@QoH9#7n>Cu17kC&gNq1b+v11fKvke~l_f-H^z^kT zPtt#4doKw43U<0VxlqZ`6pfqu^bpnPWbnPU4JWgvgx+v~@X21}1l~`}t9-8X|D{Z% zcn^-nW##J-7XKB};!VvpcTv7ZRfQy<>B;nF`ZAv`99uY!=B76lZZ6zXJg|6B@nEtd zXO2eR91oCzJpD!g8^nM=^8f1pum3bO>dcDvs=1=~acYHVR*cZY4DN<;*w0A8J75R{ z^`JM?NfDYHR@WLAWy%K9w@%9Wa}JvOrb7>A;|^k!48!5JX$oSRDTLWO{}OYlIkSq4 zD5by>JW)0tVq!IkuBPJbT37DQ6=pPy1(#8Xb2XZIUn05u?cfI}=iL+BTi#WwWmP$l zsAqtCES~BkUSa9NmR6&Bwh&FQYG}jGh2>?~@m;*Jd~z8lzgc(_zMy-R=!jark{^J| zVni?qmV@!SRaYA3=Gu5$4~Z1u zm$zGqWNy#gUS0vtKgKfdRl?XL0PjYm-KREVFMU%7_NMh>S=+!KO%8S!s*ARfhb;hD zaYho=L_iwNO)EWC`%Raj62uQ0lOVy-72>ZM^DXy5W486{A`v?XJZYpQczFGpv;SFc<-!LZ^SJ!8UT=iO1|&XS z->5vnp^bCN70f4FAbndXj1blXatq2D6!Jwf2NiM$yI?6qYP=me5SK%EGXE5LglF^5 zNe5S^0*_ZN**q)~Riiz|K6uL!I9DA!JF%Q;&(%10>gJ^1OasSY*| zmB)whMO!CQFzf@mrIVP#25diyw^9L>jpvz3x<_9ouU-R?{DJ~& zMh_ip2kWSMoRVEbb_fl{^S62=JR}v$>Ed8!d%zMSZo?jNkU$=zo-vByM1iUwuxOHXBZInD!s)xCbz%};bDf6Q98>T*)wtSH?z*UONu=KOE8}cSt;<7) zGHu*#HBUXs6uLGQ-{Dlcptg|*K^8yG`@-4X3 zXN?SRI`CCXV5MJ+eek-G}W{t>_($Ve+D;Z^|YiZoEs|$XxGlJnj%|&7gUlsj^K!R z$lEKf>l|J_vepq0S1R8U)y%U^?)Hi+0F^Cm4C7+(47;}FR@8>exyYJPQy*x8GSq+K zl6HbJxeYbbTI8G@o7+D&PhZ7(KZEufgA;K$$7+4BMtw25G!9*_G*x@_15<`02TbIt z84oy{IGGS}=t`_e?&4Ke@EjD`Y^XQ&2xZ4`o59lN|Dq*8@d5i@A~sAGZJ%Z?l4zX* zIdtUk)4F1=EwX|qcxh!Mdu0()s_n1piVUyrj$l*%l!%y-E+5d08)j_HxWXds8jR>g zTq^^TN}9GsjuH%CQp> z?CkZl8U0RSR;jr>U{q6JW;U0(7BU(P>2JIg;jB|hlV*YsBFz~)XIL5>>it91rrLIEhJ!9>A4_rN$#Zdo{i>nH-FNuPTdKZ|8ZlBA&lZ29zhPrk%nb3 zxj7KF*A$eLI;ggZBy z`lFM)vkH@ICH2@+|`!lw?<_s9- zJpy9VTLnHhBek&(s5#E0YlJEzl^;M%lG6ps%$fAq2W$VVrC@gvQWJoD)vUlFk(C46Yk>FhWsPV9TIsXhqgvIKesdif@b#yf^WE@}q z1-7+5;o%Ss=rI@8o~6z}^-Ybm8D)r3%6X+e8jCt1K6jSs{`6FMQ~6jxmI$x{#f8hm z_s<30!P%gp!^Aj;&AN#p?8WvEA~TB8%LWt}tB8AaE^hz1Nwvn@6_m05t^Cwx4rFc= zCf}d@DGosk2mc)WSf4l1afhQLa~p|5n;Q=3%!&|@_~LySE9!*wC9Xk%1Fa@Erk`M? zTGGvW7ex9TCNaE=irl1(Sd)8>eKRzl!??=Emc$H7b4H`2B6$w_-<-h)e5n^FSPj#8 z*%xb_Ngcwa>G8|-4`;mtFdLCT&qZbA6UFDrc+J8BkCCcW*|v(Nt=F^2g4Bn-Q$ehL1?f6;@fK_$fV_Hd5j(3=T&&x7|$zTQU0B`dpA+LK2hBb zk@-T%Vk+%taGAI*q=*+$bj)#BFKkmQzFW>xGeE&CN7%M$cu)lcdb=vw)soep)*(_hLt+awQFX^Ci3PoRIBhcM99p1 z$D4thJGEJbwE#eLM$+NV9}_5$zEC`q^$@uge3pmv){?j*`474y6*CWJe-HHXa_+G5 zGT;%=H=|PcWGEj699Rc&?iGeQLv$`vJ&5y!9| zFTFbb2izYP*wp4uJ7Umzlq{2aDd`Kv%VECeNgZ#%1-0ga#BwmKjXX}GB`S{E(t~dm zjh8L`=(O`2CW0$*(H)}A1$Rx{pZHJmfbce&qt2ia$?=@Cm!iLVOX2U<_WodWRcUlz z`dK+JnfJYEcjKBMAhIl;5S8#oEYQhh^NJ@WB3TqgB>m6%zxV&_|3%I=f&~*BNz1bJ zclDaIfOSM{Si6oTE6NN{$|J>jQ#8C_F+e4^En&xcDC65PqD{2@8s>>!qWzQWF(veB z*rgBRs8|+56nY?orQwT_)}2qaVijM(-N*RYz^@E%vx!&s8^oQG;3yh6biTRvpz`$p zGmOZJ|79!^2peoIPVhSt8o=4S*p6%Dg$He-EDD(T>nP z%RuT`Pb8J{P!J{`!?x2lH9>W3C4QFkj*9n4`9i8)FD~C%zN>r>ei_4WZNGMIec2eP z2h@(D8OHBd+fQ^zBOwI6xpxOrPqe#Zh3N4jDrcjC`4MkJU$c5sRJBks&Ljdl96;^Uoqk1%QmYuebZ(w-V$gr9jPD+fNtEc_`_{L(Aj3 zQ=Vf6nDU0n&f#IciJ^<-oMOUAlkIy4hFRffM2Vr;iE7ta*C!KR6hR3t@J(8l_b+T=wT2@7nM>M3G&bNU``hnf=|mh$jdAv%><7I) zNYBIqA`yOS@*%N~V8j|-Fs8=u#B|D?Vtl*VU=$fl#o4@A0nydlNL7N>`NY4xS;nAt zT4N}2#Rv^Y=`T3)h9=0&2=EltZW&>c%Q6-tR2FU;bGiSkQR|?B#3VBW(#0@c@&5ue zi6kv=t63vabw}zxs!=(YrWey~+K%o-W>eW0fs_2e=W+1Q86r%l8r7eD`GJ5 zq9XA)<^1?Ikcb`{T()zUM(c)fh3ka?v(9xw=!IQ}6szT=^eBz40dh_m{{c&rGDKT` z>m_A6^aVAVNiAmKnbw9;#0W9}VxV_h_42oDduJ?gOGi-PZEqRJ-AL%PBT zQf71e`^}9Z>Q=(+1aB8wd>IM98@x15GCL{`ppo{ZdogC6BGhCXl8F4*5$ZjtY8A#C z3?iv=8m+^ID@s3u5W(6Nla437pb|qq~_Ek^8k`@y@fXwzgPTKk~tfBa+WurXL`efnptAqdOn=^IAI;*^XVn4zg=pimf>L*l}J$!POSCpNd7+(oM7{!e=!AO&wGF1&S zQ@NcFzDG$#bvkN47miI0@4~olJR}7 zmvuAhJkyu2xG`9QBjaS& z-pWY>ch6xg(H^E0WM-{NkEI3RNJ!%8iKD3!9UFLuvm!~dPRi&$0tYI+zmnUd@%a3n`5mtPdg+(thH|1@D3{B7A=CQBrW=UvHyb+CW7rB$RhwuiD$c87 zsG@X@9Sggo<-2)u9eqhgcoFk3wULNL>>Q0z@=Vu87(9qk5a1%YpOY|2m7<~CQcbS6 z|8%XlfQ4AAgpHq7uQq_!i@S~7V^a&Gci>JPY>WxC|#@XU#Zw#=0oI($>p z2{^gAO1-la-P_Xz568|?j(?7b_q7k^D(Sx#D-O|=PnEEi`hhMQ-wTJFW~xRn#CFaA zcI<3NNr5z5)GLTl`MsA1_BVFX&fJ`tQ3~F&+h|8bGI%fjzzh32DV)J+=3efUoYA~+ zp_K^lTt5%drRvzo^H%^N3&tiIMy|}2ANF;UpIH{wB$}Tm=+4gE(P0^^xktHbCf%)k zWtom)bgQOk7Bn&A{zW@M-bB~C6Avc;te*_gWLq}jh55MHlnOm8E9G)CPD#m9&eo%tUr_|3ZnOlcy%XKIDctxJ zyh^nrAR0Ce2rig5cuLR|uv85=f!9V8iNLqYfU~FoXfma^G-#TIoE>Rs3k12 zAvS-c@}q(Aev!FGf~dfh`loaVIO2HrBlS;v_O!#6`1hHaBMV2+PVQ)^GRH@W(9=kT z4i<*+T2BW?n?!g09Ll>cH0jHW3zq<_eYo%u540f%Fe;mrY%CJX(?&f<;70g0InpZa|*&~Ym4I)nw@20o100+zKdk+d*C*l zTf6}2&5Mc`oBZa-XrYu}uoif3vR?Lm8M5zSjo>->C)K*tN<`AEY9Fl3`PKTa>WVsX29L~^h!h4=-c0X{nB^~1cjrV;O@flYgO-9{14`DPBWp+2%$QnC1Ux?nBWWkCOB0z?CNU44 zlkA<6PiObeo*$(-Q~Rkzh<9;i%t23A#H@MYOB!c~qe{n2U&)Fp-U#2Kzo+>`Yu;%g zfGWmG4YoMlXSU$=Y=h`f(;fZb4Eq#A*V6ep2?b}(k!>rj_6Rrzb zt75)<9R1u+0R~@DZN>FFR%ERi*Nc|i4@nj_77N7^0&Nvrb&FYZU4Sk?@P*dK!668O<1=DppPWn4Ss$5rP$BA-AZhW26dh(! zP3!JANJfL>3NU0E*8<$Q%t%xbF3I>&%I=97ro14k4b}Z!A?R{6C>i6<-oE9!P~#!+ zaUP>wg>2?J7!K|Xr|FiugU(`DhDOj>-@rBm)E$|W>tf3_eP;UK2;@YC^4N7GY089e z4tiNw&oNX1zEzKMzhwEM@(0Uzmw)V~B)e-2Ia0sps<%bxU~5{J=$)_>05;&1hz_h0b0`7in}`P==MeW-J(f29xsNxEuZl!=$( zUeqGok!#ZE?p;*)6$F|k#Z9Tjs0kRIy)kiRSV`>A#rWEQOZ(_l;7ZYqGg@x%~;&FoT@2| zKA4QC^XTodK}q?$8r*2{KZo|;vXxwmRrU>*EfG5LZk;gbgQldldV)UC{Cpo8qMW35 z#PHoEe+dj%jb0tU%xXAG-3z-~g{pNsIV08wH3^6dN7*0cC*#A$x8}+wzp3OtLymG~ z9-mSiDQ6zAF`Ko=Nea~BnjMqgZYuE{Q3y^my78VR&GQaFqK74nb7VvPw!;0zMPRZ~ zr&7xmyA-R22_hoO^-h$;+;O5DU|?>xKSDL|1df=`xY&i9N>0TX82!+!*@|&B$_q&* z-gr)0MLhk>=fgu$@_%F#!J-IbL`M32v$xl4X>ZAmgPhHG^iZb1g+>tMA&bX+NRE4I zrA7tkQ4CDCg2UPUvbwPjAqm6Hz(>M3onH+36r%{X%O|OZt1Kl&LJC;K!5sP`!O*>Y zux@yiG&Ub3{P!l_nfWx>Ftjqjt|-gUKTpuDlwd61kimHzW_pHdz(L81k2tD_hsPsj z9<7Z9Yl%aKmEUGqPhpv>axN-yc7PdlFp?r-NC?N&BUE>YbE-v$dEq7<*CY7ljHS39 zFS8s-E-2;zHCuxQJlVx+vv^gx>q?FDp%^~PPmPKZ4Mj3HGvX3~ zx(&bI*ZZ8c$hjkNSNcckJJWZi?@r&7zBm1o^v}}wrGHMt_qPVe1jh!)1;+;qf|g)m z&=xET7KaaIA1>ZpJ{WuZ!OBl6f9I{W4&ap${Y4B>T0?UmW=oSErjC=>ki9$mbmP+e zL4_>YwOAu$5!qO_W}iafQCVN}(P2g3<7L~7;y_-O!QG0amugt!>PK=#kBGFhocN|* zeWT)dBd~kcK<-!d7lq!y-I-?S6+IBkYEzm4lZ=}oQt2L8xA*=Q4Qy1Z+t`93{y@jcX^3x#FwvF$76LX z5Hl#gh?*b2tMF9eX__COE)@mo$aFg=%W60K8EMcHJ98^vnE_K8JYeAji*Q_iqAMO0 zCJ<6&BmNs({`tAD_?8<6eQOqOLr+KKsIXb1UJ`oFNM^ILWc~U{73?rQA_zM3BQyLa zVo-Ux_4&%k;XKNlLjPxOGktCu14^8Wp+Hfe=Jy zJlcSI%!4GqG6zb&71k&um_yt*XCsLKE0`Cy9I;DY8pUK03P)z1H}OsI%UbZskfMvbR97>KTz{(plA4I~^%B}0P=SIoOhbtec{HyZ6 zUUrFCIJMNbT*wVLEkv1+$k-W}9wr7g{1iuC^GO=-m=P5@q>L=@WMwVXfdme4(D{Ks zQ{!FZnjDSBcT|U+a$b^&R=7HJOz&$_8|eHc2x;fH+|_09=kRQ5H=xDCKuw%6f{}U= zW#E{lWDSmMj*=71N1`e5uKmR>cX6`dfe{deA(gE*v`w zLQ_3S_;r|`N^eMiBz;->(ez_MCdhjQGL#Pfj+b8|_3_lFQdcpUYbX0v%gMk{+Yoe< zHg@F%aSNop6+?8eU-dtX>$#L!P4-MqOsqi>lVpMIJeK8Eln%uwI4Fq#%6L=y)=J8n zOhhSI=8=p$6I3q~`g!3FLJnSj4ub~8OmG4thc7L^xQ<>N?B^PS^R^dJopqXbdP7^o zl?|V5_?^GEe=t<%UjGycz4@0U-U0!(7qRj)6W>n00jz6Y@|fh?l2<36PK8u!9Z225 zajDkS-D-XlJOh7p6WW>Qgy)6t4bKlR2;UcefZk)5gdYk&99|ZFBfK^IR`~7kHcK4I z+s|bRkZv|*F3UWU*~T^rFx7?Z9B2S@vqw^eFq9p|bWdk5$bK+;dG;#A5$?9iuYZtY zQhS5_8{Y^UUR?MkjY}Js<+J$PV!t1dKPZ22{=cZ^z;`c%g=`^*D*ge5LyBLa589rk zeM-lajxF6*dX}gnC?8BELl630??XcUj!IY4rMPOVVQ!N4hi)km5S+8)F%HK4o>$|F zCL&eAOi$d`krDO1MczH2fy-TQv-spo^(gD7)tUQl!c;K4b7V?J@EtHQC0pjfZda$n`?GD8;O6D_cALI0E|!Cz$jg^fHy#Eqa}{U62;FJ zuP%O-Kak3Wo-w4}uiCH)y3tf1AylA9VYfF6@s4~-UgXmh>636~UrdqYWBcnDQCAtY znH_ZJc}*wtjua}Hw405exp$)W#Gq+dRUH}wYQM2{HPuuXc!+5@ z-(A~mmYVS?oKY@FEExTLPhxW`801+(8qK4*ODQSEBvjfQ;mx28@92ghSyCvWW`k;6 z*xBm&8RIW)@*-JR%#7ZOY54qW{n|#!BG!Ak2`)Z46d}{^`?LJH|F@Vaf+zRj%6&PwH~f$*EiTM0?O%GjyrQzY zXVom{XdMod01S*Zq*n;k zyli+hTJtrEojhSNxM*EeTT$O)?ky)>Up178`;dCc^JksZIVE#T(Os;P4y|Fll(?j> zQvTv@cSxIN4})fkS-WZUFqovs^otGq@&H#9seZB~{NXW_3iafa1IXUPZXQ^fan(dG-g_fH(mp~MHAEj65yg-Dv+mBe|(I^i`Y}#ng|q3cC>j68-fBR zJ)*m9YkQpDk%%zrrX=QgA#}q}Jn+J&BUA0mRT(qPA(XX7s+GdnsH-!-a(#yZkIO8{ zc%DUU=lXNc$kMf)s9)BsBgHjH_Og-EsQ)$X5ssOML?6q#<^@!cAT0D+6;G7AaY~(? z0rz;o)D-2~BiGVTxOeh<$seHyT+#w%Vpx=p2ninOgR;E-_XbpKXw}n+yM7XxsZ3+( zOXZ>5OT~``nJqOS(owl)bDfJonb5;}x^Ycoi=fQZrb_***Gi8BTRLDK|6yR6Ixa3i zW#+ckr=Wj@Od9c#GN`}A;fDl}j@*vFId?G5=45p&4y?u7lk_N)8}OMQJ7DdvXBrvp zM!`QQW$;Lo#wNXnQWd|;*)yGk*u_6$$K9Bmz|MLZ^o&uNXV~?A;$OqQ_nZ$az^okM zDro#S6M^!)uEw6T03H4_{ImQA{D*ig=JCi?yAu;5s1b`da94lmdnM{_KLOsCK98}| z>5=)Vm0$w1y_tp9cJ@QWaD>U+TLRvE7-X4rz0_<+RUN})MIav8TCl~_!jdSi>HFse zoowx>%4+N_^=i2h_7jL!zyx0UH~-&$F!BHE2ci@6O(rg2&hj?sdm8zT6hagDwpOrF z&n4sT)Tx%cD)%|@m*hvGk(5h#c^RQ)sg;2d)2*eZd;_wRZb|<+b2PvYz0u7z$1-$z zyajqV-Caq=euAeTr&Al=9#d_5$SPvo(Px zbf_mHKXV>+9&_+!02mOWp**vMJKMclw2<^!m88a?>zA!hHYnL6v=3zXKq<1gC1;YfJQQ?W!RE*BOJ&AL>!wlV)|m zXp&(D$RBXQAy#TUi}~X1baSzT(|+`T5zhT@e#3HuoxagJ&zVEH>Yel)EO|~+Cm5-1 zE}}`Sm)gWqHTFA~WlpM^SEhfNzA?Qr{e1cbb&8SN<$LLWP`_N2{zMJ`zG5kqs->S9 zmDwp%O?`5TI>|_-==jV`txvXRI@AjAR2EFBN?wq;D03O=6)&J(@h%b5QGV3-{9gYS zMggdm04!^dwH$T;ec{HG9BsBKb*;tPg5tD58Cj#GhCuo8Z0qy94(Mg;ef4G};D>}fm%Xu|5IEII)!k=vRW@AC#Kq{~ZSz(R)NOzxwF zn)IB9+b8cX_D*VCs?{oM6iS~kSKy)^FHM|=Z?@G+k^)48apx*Yn zymtsK5Rxg7(l$R@$iQQq%j`x#^|yE9@4XZSby4-l#b97ysSVKfG19p?nU&%ag3)g+pMi)iE; zprPxyC9!>iB!~EyN&Dht_caNW{Rik_002hdb*bJn=yglW?pU+nay($*hE4T`AikhROw6vGc!*i zj`>~xPP%O%*)9lLsg9!YY%>YisY9UAD6tCUpkcC12#1E~9-5(x=9PSGrw&8$$**re zZH1ur#Xb>k&=fu$QN<873>uqU0Sy%}q&PIx5mL6&Mye}XBb~6!cQNNF!iy1y5g#%E zbd7WYWB+}kn6ReGd)EwrmE_Mv+-9@l8spX!>o)st^iw8BX)i6iguh|a)sn#g19SoI zMf}YPgfOxd1J{sY&QjP=Dq^C@AMA~}`$wcLw{~WWS(?PhC=HiayuJ%YTMpI^W8%l? z?+nN#MdIlT12`36Q3CCH$aC?Ae-|5peJSqTGUo4jaB_WI(|8oHH zWUE!BE5C8byND~B(x&$=U{uPVnb^h%2`8ipqtN=T?h2vCtHC^j5RkuPlUk3igXHok z0CDt`v))a)JGf)qoe)(S=kDT`yL)&(=NQylU-G!*eM}X|u!Qf@ohGGI?M_46gC7w9 zt-G>N8e$q@RDG%; z)tG8xN|F4ER}d?~R^;OfZ51M7$F@XyiGz@Zth*eBeLEr0LPpuLnHnvE|+1Zb@t-A{M>0f1als^{?PzNgN|G7XL~UwdlsZBb+LUSwzU< zgp9-|vXNh!eb!3Wvsg?cE$PyLR#a*v*^rt!V-RX^Yp*zln|fX|G-a>?4r^N_;|)zwJJaNQ z5tL(6gEh==V_r+WoAb$zFa!9fz6~jYK)_Wupp4Mz6>f=>2)13~D5NU;@4ese9n0}KZYm0m5dI2w;&<0#{BDj^V;el#lYx8hoSyLGp9 zuX}>~%V;c>^bhhU`3L)l_(%BP@+bQr`XBlK@mKjDBfIurgxA)nSkPzw=LiO^_rLJJ z^uO{q;^!8FUbIWDJhy9Zx7_YXv+a@FGq;z@3GJKP4@sf@a|h%mpp+cPE13fI zZI9AD)3J2i%820tIasLT%|PZuB`G!17H0Y&$=Cv)r(kM7m&o))eDj#LSrabX!*^ya;n!-LpQ}>h^MnA zy}=$=q)H6K03e-^Y)Lz?m^MvI2*`>CM|raF|3Uyj?^Jw){T5|A{9hLW7_eBG&2ssX zn&^I+2mMJ1f3nDgkQq<%QBGT=0hxF9+15`6PL-afM->k>EE(VE*OP5m*USox!q)F9 zqK%^EZ&-9wAC$Q+P^$SfM7rGE>ACZAFXrCjz|2xfJXw+fDMnIeMERvgl!Tc##N6f$zeZR z%l7?jiG0P8bEU0*cZ2(-`<1)V-Q;d@x4PS+uwleYDE=p|VY$v5C+#4{7M94EGKLLf zqrZC{?U?;tENsLKU+>|op(f=e&Q=;3Bl-hR(R9xDgivBtJbo3d- zXa5rYYxHl?m59(jAAKSEa`ctxtI^k@uSegAz8QTh`uFI&AYY+tw&CftOL?02%o<9} zo17fz_{rk44P}ppw(05%xCs-fnO*Z*wAY#29P96fvhFoy_m$mW_WQC2${s9xsO;gg zN6H>8d#vmaWsjFVQTE5OC(Hg+_Eg!Q%bqTKrfg-|b7d&$(Q_)^J9H1~Rs)fT1og`j zhLr4;z2Mv?!EgoTO2tzN8EoV_i23L_Vg>6X;%DrVsPR~6L~)ytK@;RJxRqB5L7Pj4a={9`5F3T21ad2N`-%Ff^qrN zw3-&4(tirjow`1OZOM$b&Xc9xC;2vB*_~BdolZ zZlA@K+Nas4lgXWFpKX8J{*HZ)eXf0;{ayQf`vR^3cugR`fqW5CyM|+d+^0M#mG~?P zQj0?1PP47PRu;$cXhy9#mU}R7m~t(K9 z_;kUN72uj5)v_;YM?g6KO;Q{q&y-2Tu5>SiXi*1ZJzPo@Em@X8vfZ+(+etsU6bV_) zy{7Yk<+ErkyBoI5s)e$eT4M+*%Xfy2O-~ruy)J4D{qM0jEm+(;&+tYWCO?LeTu_<_ zTlqb=$L+&v;coXH>=vZm8#n4O8Sj)FW)*4Jcw`y7#lOqUU#v@#Rwju3!t$P6hkx6lg?tE3Th!K$>Qo}6#%XgjlDHSn}-L`V&ZuYX7$t5`SQt9D_UmC@G(^D#($X4u83SFP$LyR~&+uA;n)dpW}F8WDTmk z$vIAD6>ObdZ}RLGjYDD;Xp$4v@{fNr?{PrjrBUoK6ufn>A~wQ8vbaml&^wvQ{7ct4 zeK}?P0f-;e6JXn6gb$P}WXl*yf+zV^eJ~h?*9wSWsIO?YQ*Ug3SMATT9%Sd-rYn-N z*;lihzV0##>Hlw$S9(Q^CLLO8W@m)PHU#K`r#%1%}?%wn7zgZ|*D2F+n| zv~vhqRVj@SEDaFFLEVc_USw)h9Or52dJnyH)rq?5_!gQPSia<)r+P~2OQ}`~gDyy# zrB8wvy=D?o2NXnM;}`%ERhhYnj2Y(_WAXFlo-h*z7SweH^?YIJm@P|A6{o9QwDBj( zEhOuccR_wCMBVbCyD1vy4#doo<4Tf9wzRf`Q4^5Id4-zUiZq0D_b6SpMX&tlB}1hx zD89~as6-$Sn{q*AQJ)t5Pln!}))?K;q~I2)kaR%pfPgFNV(e_PVv7(XI~&4|Jo~%Q zuMgH~dAnIF4T8F_b*MGRnrHpNdeM5B_dPnYt3A_h&%Bu3$I2bIef&P1338V;nm5j6 zBUT}}b74Tr9qSnPjl-q{wn1TB?kKQ|j;b{hAH=M?+|2~eiRg~eanW6@9NN$Dt_NT_ z!l=+3g-HHX!W+D8rR6}KI}CNbOh~rs{MOYkxsTc67%<4@QJ~hbqE%1RM}z20V1dJ2 z)Qys8AjHZ*E>s?E>&KRFmiSs+R)iX?xaGzV0?C^EHfmcBSr5zTG03Ijt#;&y4i(t)3xvBk9 zN2k68cc03eF*TJ_DBFq0DeF@r^^Mg2fk@4GtdK3h@V0R)vCi3gM-Ls7YKGc`#4P*jIaOat@Qhn@3yW@#Za`i;oGpWvV9pXAR) z3%uQ*=Xdz?{RMz8DnuWw@n(II7oxpE;?7w=qncdQ&?dIdBVtyHo9LlAv<+{{3|Kj% zVIjJvln$hsyM;aLBbgmCp1z|jS{Acr9p*%N*AWtG%DiEv{D^0}?s@i^frae{5l)7T zp*5K2v@WV?q?N9g3a`k6$c153x-&j7M6T+H8x||%E8%{KN-@&$0m!5(kw}N96hwrg zQPWHu%Z`&W*6JbM$0Pba4-|bPn0Y^&wsy8_7MuXe_yIl9@6zMuQvZiBDD@fTeorST z(rz3)2BXZGKG3qwZ(43EQ6AUR>Fh}}NHc5ROy>k=E-PQB)9sw%EOHh@)gDBR=laAA ztS^hH<_)mQtYA`|?SC7cpzmp`(htzj`ytJOKSo01V*e6IV3#7_ez|{z|1;DgV#@)BZF5vnu}n zH-9CBvKNqmf60H@f5m^*f6ag0f5U&%f6M>7|F-{*|E~WY^6>xgbpwF7g9xd*O{rd? z5#7iT2rgk5TuS%to3JQ0(Pb+_X0z$tJ_io5`sErnEJNXog_0jg;8aIAtNSzb2wJ%M zk+?B1dBg|KAH z39KlDOV`5iGPp#f`BuARl9zZEDq7frPQta?A$>$Q0*jhfJO0G_?nD6kJ zi`&d%Oj7P-01+B=;mE{15SlB6;sL-F^kjJoTmC@QuTnAr-zJF0sRWGV7U{vOSjyRk z3ymc5EeblLe0~))K+dp=I$uToeWq0wb zt+WEd%oZtv$^kxI#rx9qPBB;B*KSrkTy(fU4}Fo_geaD|Gei7ndj13>=BB7&iV8Sl z9?Ikf)h&cECg`wwBj4Bd%7GQ6K{Q86K*poq2WO$~fshtzKZ9N4%h6Rduzm?ULWO?` zr0=t0Vo#;|32PEoDZb7v0TWTe)U7wM#th9nh2re+6eO!vs_O231{}js?vi2^3W6)x z7P>ni0aCT&)}qc5k)>6C@JvWGlN`|i2)1(zJhM_0RT)S??)d=L6{)1w^+?%RMn$eG z_pp_oP2Upcn?{Gzpk*eNrVAIRA!Q!wB$AQj0JS`gpNgl93;iTKcdDWk1`NU)VSse2}8~w zh!-l@-WS+zKrRqU30KQ~t|O}C=@Pw5!wVmL`Y%a!q#jb})lKLMdZn(RzO15U#le>;)}BZw}aFQ?&Fv z7_i97lS5e*W9awKg?S(K8(-@Wd$nvnT8=(Ps;cI?0F$o$jwOsK<_e;o-8NtLcVLNo?RR+w=f06UQU54N?MTb99&U_vV(|r108xT zTAJh;xxhR>iSHg4v!`|e6oSF)rEW<5s^qMavrFfewt?q`+%Tos(G_M~YBl!LMsA(H zY(V8!qOoaaMYE_|GZ_8}Es-T)d+tpJsSWDWNH+?FyGG{K)kJy_5V@ohD}nFucdU0K z9g$1z6XTaB*7?o3%W~4$E&bo&vU)FDj~Klna8k5*lqFBI_F}ay4;V*?h6a#j`Cexo zgR{Vd0}k4&T*^M8rnm+X5I~J~ZJc)Ezl>iOzn;?wauPt&n^)rbW{@DEv#NH6pBrcXbw#D7XF+HJ&Al}ofy1rDAf{4i>NmO3(@F)o?NOh$tgM0|lP)pDfx#X)aMRJHZ_C>a@JU#PZBbK`Gj zuFm{QRMezGAIzcZm2_Ynq1k4 zC178oGn=JyBe{h`5rh^WvMkA;ZK5Qh#Mohi`>6XbiyX;4KGa?Ow-i*gAGw!*~_ zn4eF-4>`FO(VB0QjL{l3)XBE84Ot7RK}nE|L=4yWJOP<32#BzALQot(ACbs5AkB&# zHGDbI$sKI=a;M27lD}j;G4TXaAJ7HXIbQvlC=Wn_lZcPw|DBeQUeN_My!jvuHmUy`@{w4LTJakvG!+MoFY8a}wH7cW0e!Np__4nBrovKk3(bBwcs- zkCQ5GfXs3r9i~^5U0HUMa3Yor%8XfxRWrR^k}VTey+%M*&1PT6OK#?-U4*yJbbp7# zro%eOiZk*J5q`!;OeS=f+W$fLaqBeLgsxJN~g!-%X~YwJ=~r%5`xCc4!t z@kV>)-oD=Lu{|**8;mVeGqT@eNA@(d!X4vpCiWyUy*6<};%#&#Pf3l##o}n*GDPlM_;17|_o=G@;E)Vt&|1NUT2WepXga3H0okuE|j0V60mO}|{*RYpN zQjA8ki2YTBQCA?;=jA$cy}2uM59OZ9eaegunl*T!W2~pWbG;vWKZe-(6YruF}AF!s;*_499Yr-VcouW{-fxQGCTOZ`S8Plu)Py3DUkGK;P5JR!r%6>Fuq$Oo(| zNI~U0ar6`o{yJ927GhFkuE{dFwVhhA?AwHF5~H&seyEWsS3iM!UNwvGy{VpcRiSCJ zwp~e@HT1*>L(7haJ-%(H{GT1He-@hx5mDP{NLxlu4rK}HW9sPcZaa*o6=LwaM3sW} z&On&6MTH{ zK=xF2)k$9p4ss5pPDn$|5+Im#W30rRazpts0SarVOx)oV_J$><5MUJP2%GYZd9G|< zt3(`)WM>gqPmUS}zP_={sZoV;bi4(BgM<{P1FW(Q`AiPJAJrli02v+)B${myIvW9@I*byV(e zaaN&eFfH1{lJ$mnymtqxa2Fwb{WH80e}~ld!?CC0jq$VNKaO7#{|oA5j%pTU#404Q zJMila$nQT&KA3#OXnmzer*};6m7ZWCfy_&CQ+Ix{}5%1QOXlO5JA?XQpdm-u1Hm< zYGDjdgDX5UH7hkIbwcW-)XAxNsfDRi6sG5>;bfx2k5dT_y=XuM|K#ZOxgU#(6U$0b zv(V0Jxe4Byf9rs>El`mdB2A49fWt|6g(+C6-KDN~ruQ9hz4sM`A5E%+sstcnwD#=m zf3mBBQxrOG#svW>pc%npZ}|ZSQn~2t?LTlHT`UsD;JIEjtP0`Zj+3GLGPMQ4HXK1C zJ79oxLU2Fi3-KdjU6wMI#IK6$-QD5_NT?;@2471S03e)Fl{P7A$X{%^!x}kE0E-N% zcOalnT!0MaGFd1G%Yzme5X|?8Y=(NI%+8^?{x?ulU9gzm0XZB^k0sTn8CqsZ;da0= za1}M`UP}1Q1U)nyyjD7TcuAuCvzJrrus_VMXs+gysJl;eTC6R$H1nY4HsQ)Dzlto4 zoFm$DR=P;!(^ykKzV0x*Feu+gXKc7EpML(d{z$eXJD}02<-C67r{baB$eWtDV)K;`O@>M zW?S1TP*mf5+HcG(3 zuCtO~q?}OsN!yXAP8rJr;k^tQGJh`<1RZ{Tng44iQ#h!|s zmF91892Al(M_*;-Lg=ufuRG|n;Etyl3CF`GPUMU`cux$I(s~9lt-m0rwK8_ZFfpwP z$*&zUA9iOc0e8<4qnP zq0!qSv_@)bE2NRIs-kMDWc)gC$Q>}*g(osAPZU9lMo2zlST4^9=hI(tM1~T%jD9dC zc^0b__~Ah^D)r5+I*#3zS0Z^R7;q6slIdO&WKzKcU46Tiq??LqykeTR>#t|%=b0`z z8;O91LfY-zJ-^cys!*sG4jMU)baat3!JUKDLU>M(w!Gn0sQVkviUDhxKVs%O2UdeT zeB$kMG4H)Pa*e&0+V=j)?RIZ-R}&Lg#qWqe7GIzF8G+6($pU|aAzWoX;S5v(#6d@% zz=)A$13`X8#3IqF?S7DX!b(>gV3}zmSSiTGbZ*V`GijVlUtrIIfK?rU{_r zctwinCC3Wut8N47JA>`Zu*4=9cu^2V7ZpXzz_~CT`L^><=Mxd{h`pIO9fQc(m_t6A z{RWKwd6pbX@{e<^h-4sMCw+qpyi>d$uMZ*1es91Vq~m=lo^s2*72avy>G%Mii%If5yT!ZJyAAo)JH5NS zyD2{W-h04%(0j;x*n7l#%=?4)g7=#Dw)c+rp7(F>BkwZHr;@siAzVD40*jGO=tdCqaE|bZm#%nAq6Zj$s@ZvSpd7Knn(jzsGK0b z0a~nvUX$Bq;FFGJ6vPAf zGSNv4oa#%kx5qP%8!l7VxN)T$#5azc-q8r%Qr)Q~xiJzK&3U=&ZF6|`vTo-y3)}iV z+5@_t!#<=aql>t1brj~bWX2LQ!pQIU_D@&DL&aZMu3amQ#IUs4NQyzs$}P$fInD}gR&Xan?(dnsF#H;o^?cUZIfK^(9$G{(ohDBMXDMo5{Dekbgdw!63hoO z$ZKAk_!o9xV=TCt`|QIU|8 z!zRV}Gs3cB<1XE=o+xWgZPzmPVy;<@YjxF_0u{;ehsi?_QQu{lcE$RiKRwL zx;|+KVX~G1TSN}}K41ei1XYG21ZC&kO%kt0Ng~?FgSZ~oZnN8w86!Lig0*f2ytGrY zcFU2SSVyco_H8VZBx`LJJ}tOypfJp%{4wDRX|^cq1brnC*);s(wT_|wi^n7YsVZ3t zB~56_itBB9PLOYYD>_pFsxKFW7aS(G5!#t1pC)7piA1UDk%`N>^J-vU9D^vF77&a4 zno1abP#U4>5z(6GB09frEo~l}G>t-(t-WJ_qwuz*U!7gf$Q-bZ36ra8aIuoPxRT+B z^T_)4CG$Gl;jQ5cIy3-AYk2f_ZgK99*0>qMx#zaawQ58_T^d{gOjDOLd02b9@n;4SggHIB_8OVYj!oBH3{ z_XL^oq=_&dx66#tFajPA5)v5vo$_5J|})c{KWW4@wxG~_{n0Z9q)*D#=GM4;|t@9 z;!EO#@uB$AATt+!PSE?id*sQ;7Q2z~{fEvyFw&%0QyD!WIyc%2{P-JE%kSmo@h&Nd z;vrSHS9<^Sgv@V|sQVn_SYKW^?{`?0CYM{9Tb?^JcUJB@xpR1*=jFba`&;h0+{?LF zaH)5587n~tb53qI zAVa3LEj{1QL>>2AR_Tl$)-~8d%8?*1d|i|zTBip=Cbx(^2@9@hnG8^&Hjb9y&wE9V z()l7*cCx?FnlDR$8>IgTL96D3JX7^i7&D_sEj+q9Lv^AcYBfOG|M|56?ZDZFSOy0J zZaW4bNx9)>N-BDbw*9*Ot~DxTqU(Frxi48V*WgJZ9JRHx(O08sW4iW;l|z>y#XW$V zq;%W5XhtIrlxzkf1*gxtkiEyLk1!tVWJ{b4yxfZZ+cSi{bM2E^&_y}2)BcgrSloKI zLC81J-H{=PdJS0f^u^ALogaHK_Im8^v46+bkU$(2KL&rx25^=ZX4{F(ssZ#PjZ);3 z@n_>7$Nw8&8($ya6yF@*mWY7Cc!^jd4id9F=3~dA6nQlqzqzTC#lk(kGmNSm;ZyB| z{@P`kD~xRos*i!@qyIKdqU6yHvY$@0PKLtz2=vk&fWRlAf_b;?+f~RX%(X9Yjv?n> z9zgC-CyreO%yCer3Xl67hBoqcT2C z1jXJew;C0Pef)3uhcgm|-buo)OnUa1N^+X{{FAx(75XqtvZ_FHSf&{KI(i;OCu!YQ zt1Kiz|8L#AY#K#NLpiLgoPj^D_C^rA(rsh<74nwCa=A)(7$F={cr%2U6$3pjE0Eo$ zY=< zgx56ksgoW^|0i>@wNsE0YugWSfa18JCIPF(>^xliznc<7Kw%FuoQ)c=oJ=XBIAgI6 zNKz&F;Bh=!Qu%(_EXG?c_D<2C>jw7C#G%Re8G1*km4r0WpQlPUh|8;Kgf!4^RMi`i znioqFX`b&F1ssIu9ReLWAwG3`T00xTMd^S64KR4jd}uN<%_RdRrXkl-Hbsf`3-;UJ zrp_wav*hTKIi(JjlEX?rDBXg(Mt^@h#}vUN3`j5sc4EEBrkYP6c+8_cv$LhinU!rNK)an3%}fDTpn*E=B^JRAQjrL#4O z-KgE{MeGys?2-Cp1rb~$kVIos(Inf}Ffq-x-rb92aUS0CXp%XNrRdzU^UA&pv6*xR zIW(zIa?hW>W+k+*k4x6|+^UXkv|=?PmZ89f3omMZ?%~`c44eRiXsM|pFmFSalk|6! z-WTcemd6wXEBN9P7$TRck2Ovd$!gv&eBy%ET1s}I!fx*HTu!HQmJJo`h4<0K;uPCN3x9SHp16n#4Wl)u#fos~9ySCU@_lW{+5l(mahZtY5aad&3JQPwfC z30N~2FZ0wxaS8RtQ>}h$fU4tip4u7K4c0x8%E%mhU-uu0J{%*@O`MnbUgAfIOA|lG zJ@R*nw-al5(~IDWh(wj#C2;7@sd4PxD%$`$%tQvXf#tP8hr$TP_yk-P5isV+zlgkz zc<}|X&k^OiG5rb4e@Esrk@iL3jnFb^eWmJC&8Q%}%$f%sj5bqnaMG>mr!&W(A;7$s zM!v7jGBIANV`*AWD@$Oc$JM&jpZARH6FC!Sd%$U}c?4y7Q566c&QCQQDPkxoOqzJe zB<9_%iZd}~+f-?eYrBu_c1ERE+L`gm$;*0|%xgy?54eVA@0fJd)m6yu<;30OM~L=i z3-od_O=F7t3hi_O@tWMgI16ffE6ez~vMMYoq~6&Y5YuX*V&{{Ajb8vbHqv7tB_RRt zLO#>uypMkPdcua1+s?~@r2`&V0Fm)sMs1;bmBl5tPX9^^gG+3gPCy=&#I>QTAD9zF zFOR1oPZv07D5sDYeg)m_w4soo`-%5;Z~PQ)0@Uz}NbSAkGAmJ=^;>rI&NS(JliQd&PSdA1SaUW)4 zJVO1UxPRwlMh=IwAhaBrl*TnD|ag{M-F?;7q70+v+{ zkyU85=sG|<`dC$^Mlx7Eg0Tq)qg6PM=IXG1Ef;I^2G`Lz66{%(Giqz$Z5oCt7b{H! zQdKr~^IzRx7y@JfUmaQaC;0;ZEKwSq4A5R-(ZYiRg%sgLjf5COw}JzKIT?3w$5}*x z`iQ>%B|}6@3W$qNyksMsDOnvhnnTwL!s(W#V<|2Crh2&3sC`PsFMd4sb*Ig zmHE7^y4u;&#e?dA(3!N}l4GB0r%Y1RB*;Vuh^FC`(tvUEEp&?@S9_T?7T9L-;uYnF zOBwv5h*BvaScnU?$%4m=nkiU;nP!5t=tE%dtzfNZS67kq!rmLDa@i-bod@&eD3~W> zVV=NxS7-&so(K+rVQuNQ;^a`W?n~U}L>?ueKb9#wxvPI(z*y#IoA$6qVfn7`i|jL) z$LF)tFW$4<7QiEUZkh@v*rLNIfCwHYl+>FjV93?jM>E^+_1=l?AOAD!1PJdSP2!v( zNn4gI=q708mH$(AO7;nHr{qHE6lj!YNqSp&7Uv7)qO+?>dF*oBZ;V$sq0JjDcKio{fQ;ZOIDPeSsE*iqphDUJ-&2S=}D#kDP4uO{%3&D za`bhNvX&ZnO_x4Q<=UmSi1WDaGIzQAko&N%YSL;i=vRmKjip8~hbMsc@pM;E1?(MK zu&`)Gi-_Bj-u}LY-5tS~!Q0yUdtNL-{^CF^kkdp9Rrat1*rYpTKn*vd2Uu?aFBSry z5lXXan>u^?R2*syvxe2Vl#xh5a!5p0j?CCF|KF^SdHmvQhc4}@Vtu)--fUMr6dVQEl* z;%WJ$QzG|H==O>oav(eLVQLR6S5c50EW#VrnGCb}KtD#}qdbht(dZeAYot|I)xwkc z8#G$b;&4OR^pTYb+`bNKJ4mxi&X-Z`u^*5$T`qcKuthyQ9YteoIZ4uYgJ%T4o1KW$ zX%Z0Wk6kTVX1eQ0_GSiKaa$r#&jGS6U^c%B}EP3cZ3Ur3V*%pdQLqtX?4u ztL0|$E@3HQt5>4ZywWh#)Ti}>+=ASr!#-8At$ym0okF|^n*}6=G$l+;h?A}a7ChBg zvB#NaU5p6MZIL9H_89PuU1^~m4;N-4ZM3bClOkP_(<9%fV0mq16WaYd*n1%7SQ7%R z_6+-YTtMd1T>As5Oxc&(pE`%bnEAQ$n)9)<1uu|k?nfXy7161%X9}hak4K+SS)6B3 z{BMC#GgCP=ePBL60gJm4*z>no$v+T#Qptbx55lauHvZfAEfh)r5`T`A^3C|CpgkMF zc+!bXV#mbJiMFath+h|eMVkY=?)E9|eSy~GvCl`MW36VGFzte#O6QEW`$YM!Preu5keYX>3 z+w5=gxBA<17ThE|=j7a6H0L3~7SAPe$y_Q|k}J)nbD3N==jU>{5xJ4MvfL;*tvlq# z&K;8bX7143VMwtZkvlSXRPN~9F^IBF&Q;_pb5*(OTurVvHzhYUSC>0BH!WA6 zYsfX`nsU=~$K{%tp7}J1Ny!B|sWPE6QF9W_B(h)J&rFR_!?_s!Da?DODr?soQ(HHr$CZF{@=esku1mRrGWk z-;J)k$R((P80T_967zDU#^EVd#XA80S`5EPF5gJ5vc_onFZ2VDZ-T^d1VKy4L@5$L zbD%Mw7CDC$USv!c_acGO9ya1Z?#}9F-Jtp-x+Chj4k;Z`x;`&KBI~lO`tp^#(7iQ! ziKSphKGCADm}RG5w`k{L=Sk&Zj4lu*OdYFNZR$0&7J-}GEZ#-1Gji{J1d6>ZT&oc; z4+>ud@}_WStHtF=(Q07}HT6~C66ww4nu=wlF44{=2;A zy%#CA?-QFEJC=Nwrxlugsj-uq)UzTV&h{t_p+Kxee5^?#h%-c;apR5HdC-8;RwULG z_QjQpMfz!FrkWH`2A#sZU@3f05dRq0jFfj1qF0A^V_Makmc9I zyw`!Y!Q-k#sBKZu=3uK1T2xvMXK^xH$u_&*QTUNC~OU z2cB$Hcybv%cBQhe^!5ai0DrcFayG8;3@@X=%D6?j6q$f8QD95#9^A#m{9TM}Y>~pV zDIbJMt$eGp$H^Ayu9a%L$=DJyhQl#_9MttEtT)-qu8!Omc_Q*T1ogv^I(|hAOWkj} zlifF_vnLHjPY0_PE1zS%26m(4L|&Rvzt+3ABBv= z33R)|t%iO+av16+IVGtzx97N{80CN^uDC4YbtJ;O!M&s9dDdc}35vr*|+9XxQJhE39$6 zS%EIJ+=la3IKFF48w-DILxuXp+EH!YAyrOo0;gcOH6g)(OG1W%e2`hU#P%PCF_TBp|BehX0#B(`F0NHx7wJ16tcUFm= zX8ch&V`tI!auY971yT*#DQ^H1Lt&Mu!<8Uj3}gc;sNyN0etpdp&;y~S>l15{=cwN$ zLb8&HiciTs4jhLGO9!AC5K8`QdGRhm^C`JU`3cf;l*B72SLu}5`W9}9l|zGry*-t^ zB-VH-AY#Z+BiSO%(noVXxaE+QYwVo?KHpN$YyMxK%5*hph~T`(cY}t}$Fub;wnZv< zgW~TjFGQ}}x*na?_!JCTDrbxN^j1uB!eC|4Y}hv7-bef?0|}5pOHMqcFJ40pQulmQ z+Ufkv?C3$EfY6`j#z=p8Og;CISiEPEBwu_$L0w+hpKMMWUkDtSuYczl3m?SP`3 zRO(ZeX@5ZcwqyoIEF@RTwvs1d9q+uCsI=U`aPnBI+N!Z?VewoGUGygSAGg|f+rP8# zw|{RxU_V5={Xd;{=RN0r=ReU&(bcgpV_(Hf<7sRg{CE!T=*ak}_~`f!$|2pA!mki2 zmc$1#|H%9+^I_)W%<9aV%-XD#jb!btn~i3@Y%CkkCbG$FX*QkBX8mj~J0e?_9hEK5 z?kcqk3@{P@lhK3_1kVEatPQl7T4bA!NJbk(WcFNkTd^RLlEN!Q#EYt%bO9+pl#PYWSBhv%;*re6dH4;9GlqOCC1WtcIn`iOjlF`C z@=}RROA%mFS-Y^M(Y8vdsCX2xD(VaSX1Z2L%w3%gkey83%Z~KMu7d2sWaJB3ne4Kc z$`~aol_1N1!X6*}4D{%o_|?gelbO{(X(($0sE| z6lP%ZZ{S1ECtpauh!W__$yXICdL#K}@~!0G)qwH6$QGAo=g)hslqU|4FXm z9G}phusXRWxi#eR7`G3ZcXB7h**!Uay`+M2mXZ4D8=(s zsw7paa7{Lq0~#7h^gk*!I<*5nJ3CPb+9g#^BDY&=_tf~*9;rQ3d!_bH?UULU$sbYl zIRH(c3A9B_N*#<~(l-I;4@(^mKz}5S5=U#R#AKQ!DpOT7Ow`aa@jpWAsp<4~Hm6!r ztwCe@tki66r#O*@in*yankw39tLR8|rn*w|QwwOY=uVv?`a#)q{Pj6X(?!8NuXZci z9Oi8sPK$Zjvzn`0WGgMC9tI=Et&Zl0wjMmVWlSh6`y9vuev3!`3dq~P*2%|y) z)H9-I16v8g-63`?0np8bY`ej7rH081KF;zfmmLS^;XH(KZ>0tBO>4FFDXo7s+81+! zZBat2q~WiDy#E=e-kIf`M23GB7a+O2h`xKru$oFBhd)LXW#q_ypMX74~5>1l!mR9QmVje23gaDD#_iiUJgnl=QMUP64Gv2M^g zXRCar2S=r*p6eCGZn$z1m4%s%4UM7#qC>!im1E0uvS#=@SW$kYCXF+#AHp7d9i6AW zoC65jk5Hl6xe$_8I3Llpb~MS(G0~Hw-}O$AN>c32*s8b}-!pzBB&u`c=VQ2gXZ%qB zwHM+q$2UWnibIy#BXPZ2=)NUusP?b{b=mc5nLF0s6@Y7iD$-Br!F|Mkjuvp-rI;qi=Q|LYCV#WW*7L%P z=Mb`AHPeG)(AMwK1kuvecGzKu94>%xQ@~1wyOb6jQ{Jwji|~Aevvx{ZuVJlOIhKTi zkwv(kdLSzoE8PZy4Y0g!w{t?P#Y|XiW4=?|rV_j6F$SFBJ4&>mn7PD4KnRKXy}jjo zgYfUeKar|Lhjfv=M4@7uNiDC2U0%E(11^f~yp0AnW*6vC%g~RzGif{@q(k}_w4VRo zeU9N1_|O;%p>F!}%g~4>)Lp0aKEtpeC;;6X+h6h=waw8<5}hnXSmwf3q+kECAH$sm1dFEUJ=BS4H=U9sptQyx9ARqeV|F zaVrurk0e(n*XyplGt0|&k>=WjDAz!C3M1sD?917IWk1TUW~6Lk0d{;>7vU_+a2d_; zD7E`L`aAjK{9SbX?Cl?hLfJA#(Qo{Fq#jBBW?D&y=WpgSoxYyrZ&|?*+A1-2$P*S; zKWruHyXFsWkG}bY;H+YjIu;kM-If(1)4cf!qCqmOL8B5Zvyk?cw~^72PFevXwBJ#X z7U5TZZQzg0*dc8lRAtv)X2nEmdx`jjK)i>z(227X1R;*=Mka%C{~?Y7V(pAZvz-W9 ziG6x}N<~dez$~+6mNF)nbT5z%3*t2hCqq*rilRO4drjv4rcRKIOVnr7Lmx8mO36+>B@B_DZneBfB=klIej2y%8MdSf>+O z5=6K4@z{>y2?g6UMlBNB94o8wYBrVnEtA$A^yf zt;E@ha~LIPsN!oxL&hwvt3lNmn#WM(S{Q2oCElc|LKmKH1$(?g2^1@9x3RUpL96Yi z1|D=S$XV&cT5XL$yiDL~3W3$ZVYHsDGHiEXKw=tGpgrdyj>u(jHqwPmotRR$cTL5q zMj4_AL)MH@M#-3mxmm#kr!nxq{Uhw-z7| z)!_+h`Wqjy;B{XgC(3o2=sEwnyzt}>Qm;D-;{)O#-UWgU9 zyEjd~^`=WCLH?hK%g|iZ-PeX=P|qUn6baX~HYg3?wIZMi(-gW|NsYod^(gX+82FbF zGJZ-Z%ff}7Y4Qx%E=!EDZlWp7ga)i>zqS%Wz0+`l2OZ|?X~7UgOuxPxVF-O`ly=V% zIw-gmtM+bIOcKqu#uojnv(oD_ivf2-r}2Cj6Nck~+ovLy+905LY6eL@r4i56hGy;r zxp626^ShOnCwF^`6%#^9vrvt#@$Pi=DQBUPdXl? z;JgV)m*XRQDDkoq=(sgoVT( z?@4B;{GfWezZp|&p)jf2NzvJ0<$`FlfCSwzhsY)CB%}a9@~#B{^XS*C7Y^^RUl-=` z_TLmH^Y-5q*0$}xDJ*W-q85~AMq0N=YSb)bv3qB9Kl)m_K=t48K2bTmNIaf=5;!ZJ z+KCD)=`(NiPrPqKp5#%XG{NTqx#v(;_YIQs5~Bs|B$#S_f&PN#Ku!Hj_pX4|kst>W z7C{f)J7+aqxmwSn#;jII`B>3U_=V{mm_4s9~5NcT%@ zyM*yqsEE*x9~V_c(?hrk58Uy~SDbd5EKzpypycJ~m`P+2iWI`M&d2~}m1!R=C)HCr z*J+H(f={6Qsd!E4%cQY^%B*Ui^#~P9z9iAU#M)7$8t6+D3R_+Z4YHTe$M}(xz7T7} z6(n)UcMyS6I$27k1?yKDg;l2tI)eW0r1T3JYF32_t)H5ySwbp9o}z|K3?x88^*RR& z=~PJHu$uUokdI4Q7DC<-+9XTWHz0qvx9k+`|8n)QOJgXXkYf+11fW0}=o|!WGdUnX ziYqpoPGvz?Yg92kFqg)b?KbAB3Z3@?$3av4TGv0}9S_mgP+& z0?-TD*Se3=?rnrl$2g*YoFjZ1&nT&J?up)&R}6bQ{$k>*A&}<#sZnT4R{H_z~bNC&v4@9~wuN@HF*(#Aejv*e9;fpgtpT zdYLk#Vu~V&tbnwO%YJMl_C%e^w3^GmGhb#l%V2;@A&F{U{iujqU#ar3vhE|T#|pc3 zJyAs1)Nfw<>e;Xk11@nOg~h>RYJ@Pyy(W58;+N=UrGmsVpHarg3mh6K1SK{kPh^S| zNYxx+N9z-7Ef}#C@gni`;i{S2r@W~v)3=FwF3^#f3i@!R(9s1%I#u;~<6drkjSAZOo>6oF<7WfrX{5+QVp_R7dbZ4fGu-Vqy^TUC{WFboEVuK zX^V8i!0V3mM0z6wks;K3mO=bEJ#q$t%tHGVdlA+a%k33dZHcwk_i1hUG0IdIqfPaT z*j2G>FtPYu>>d=V9t~_P7ACqArz94E#ov~AIk7f9DSdEYUU5_UH^#UkvvXz~tTs$5 zvS($l$ljE_pI~ZnH%~>zN@Pjw%GkBB>tcVv8RB-y(ZO*kKx-pWUR;FdP6-jD1!G&y z7+jnr?obyA=_U}zA4;hl&y%iV%1AGyV$xgO0DdCNLA}PtG6a&j5$nm-A zr?|{}HR6=)mt(B-vAqkSOrV6VMiOiSe`7`K0lt<#V}62P7zquw#)}6G(;La~q}0=k zxtHPl4^}lh@{>Q!0>=3N@dZ=7%CW{^MA z8BN>6*O+Z#Z3o;YYIZQ!LV5PT2=#kT4R`PxhBSklZE^^LF}J~R`~tpgflbRJic(p< z%zo1TuS0JZb)+sytyL1rNj+9_W$9_wH+y=^MN4PMkUq-cf~o>NbSM;uX;3+Qd5n9hoHKjTFx z$=w}j)yX3+h>!=`i|!N@75L>M=t#jrC3?5BxzEtct!%jU4Uhr>DvR>!LwMgJc5BwU z%_0a7_M!Yg9Z4b@dLT&+)0=CiPp_%gbvqS=PSPFC+AWen zoST|`_q=Y};a7xeX`u^OX)QrUBSEp2bBORhW=_E1BxE9(;fmZ~E&(I6^U`6{E#ALt z4q*Z2@%OLL;BfyYK!ZW53661UV%yBRm@`fko0 z;f{36+)?gmn(E8lJ;2r4pd+3yCgACp2r9Oy6?h#1#gN3!`74HDSQ)h<6k?EajwOYrmL#Z6ZGZcaQK>MvO-6f8I)u;4 zfDn9#&Xah}tWX~a=akYK5HlswNyf&dmsl@Zuh0VUn)SN%21Wk2thcRqBJGiRxZX5P zqX4Z9{m8A%ln3FqyEpQ(S)FBn)<^T(%zZR}EeEOYrp1}Wo;rpSsQK0ba-q`|yac&7 znFSi{Qo)^u%FViei1sG4g)L^)c$PcKY>Q=Xv~xD!H@Ep1ej-aPgayPE8U7to3zoVm zwO}+0g&RDuunUH(RHDgDStm{<@#9L_GL;@DEt1>ru}a3Xd-u0tHf1`GoIqGwh=V$l z%-%_+`HmFR0@H6PR|iOYWld9yBJJ?&6`K+Cmn&Ljxl`(!D&@{&KaV|}j!SeBSrRJ8QJClT6I|#50+d!@?vZuY(O7OHv zAap^;DK@3hr{EqMw7T?^zsRI-LyUouD?>97fh2$eEf;FF{M4)_lLu+b4otY={{*aA z9D5ixCt17e;O~=(Q*I1q>( zF`;e`Sk~>t=1$$+lsu%7lqXb*pAi1+^9h2&M(440ol*-GGCsphVl*(G4yLdqRapI$ zm|i-uY7|op00=K1%p}yw=zQ@qa{rR}N#dH!>k3#93Ijpl0IiQ?1dAypziJ653UyeX zRhojBTHhH447Zh49p$A8IG=%zvQbffP{HLtprTCMq{s@eM@*7IAQV+=v@t~q$1UO{ zb@gn_>>_xJg+Eu!P=79KR1xK~tSI-}JF-vEPc?^3PW0!`;~~Fnf9y<%{lafTCQGUch*5Z+;F#e!8WxvaiwhsE0C$4!pQJz+RC4fw9b#-63--e zPkvund9NkkgFPp_w@IlbC2Gu*`7_>wW4QyCC8NS0fiBwpS6OtVX387gTo(R=QM%2h z;Q~uuLhKJ^!Ueo2@zWW{&saItHhNPvgQlBjz`MNF+6j(r(6v|y8G`IdhD-%RMpk_+ zj@uag6lr*G8M!3N3c(7-?^c&vB!$H;y4<5vvM-IMjG$mqu3!YA5Dk+#4L5*s$uyL# zzrY1Zs0I$FkumHT<7UxZs~~9HFqtfi%a(x}wD{@xq(wrd_TgW$5eGNZCTtU~iw|K{ z=2wImtHDtu@zW)BxBo=22K7SGNwyM?hm?00a-(xIA3#vSF}$&i#vCfapJ5YaLT$nS(!jU2X+h$5bYZd z#kosB_1K-u2L@@$=Z{RH5Us8^hC=9i#h2@HF`rtVPA#Od@M3SDFZQUSHX?tN?a0oT zm)|Ihq^ql~>Td9~JBB2o;hjFsjT(Iy`3opXD|yN6+DlcYhAl%rR=JM!aH%@^T)9-z zYH7gwu-K1&eC=RgKrxoE#a7jODH9LFeyLoAvS4lMc+1lDA=k5LDY-gv-A3xwGT^j- zPRsO+Y=)dyJ9HXNu0X}NNJp-Abn#-lxNSb95iB0~Uh$4tqFjl92P*bb`&W-Wm~c3WEpNk z4oB!|-05lrT|fbQ#2aCON`A^cOV12zRWprJ#d+kU$&+QV70lcOj=HedR#ep}&RJ8X zZT)S5!%f>1*k6ruIM(>fBw;mEkItk3$=~)lJArZ-_|;C)U*iq2HoBfxks7bon~FTx zhS*oJjqup^iXVh5SZn-G0V_BQBe*QJPv-BL_cI%;QN^UtVI9Wzvd{?oY8v8EwhV#J(2|f(;PtQkN?_J1x&#;gZvY^OaV;xdqXF`5X$6EpQCH87B+$n; z(MAR4SSYv(1EOysz7SYr>7*Xe!-MKbQzQLl8X`$~M~G8vcf{GKH<(RKri-j(KpCks z!G!lrtb)R15VC z3+;IJ1KJxP+^TjkyvTNwHNpnxOEnS@;)cINiQ?XCPu@Jr4cC|uuVTzaJ_RbNN95>W8B)8&8H-t!druWTG zvyuWBm$$%I5pCunwbeC z?htcRs9Cejq?u`K)%tFb0Np1&L0A?fgz603E9%--oa{briN{Zlh;S4z#aN0o;`KA$ z+QZrtzn^_@GvCkphP6Ku028c(5ILL#?f($#n|PcbW*uQ2iC)*yfyP_EHE0c?(e-`n z$JRygqkeAv(z@2VPSm<^_kPTJ99q+#tY@viS}U#REWFXJe_H=iL4lG;DGQ+#Mf^xE zG6G&z8LsJ42Kgq1kfUfS_!i}lDUqoZKAN@cF*7nNassjgb0a5H@VFpyapb2s4c%zh zO5&UVZ(15+oq$6-E5_`Qhr-s2eT@HL<bFfF?F^NIe~AL@*342X7ihQ?RSr2FeLghQA&b-Bt=c1-{+pL7*POekK~kQP z_ovv=;>`z`(tTREuCJ2pvuobaf;Q%l>Bh6+D$fujv{|CfZH!Ab(q>aSf}aQcYAr!9 zug-+Y2yzZ?QptdmxAhZ zT1@>aBMOlxWKJcH5!pK6Z|IX#Fa?y0#S&{rBpyq_GpO1IEsXN;BBY_LGK~K){zV!a zaZL<7<)a|_+Wb4qo5?lmu(1)G|B;of=I~)_=$7XgA;Pg?m)<;zXQ@m)s#7a?`n=H( z=wFsHhe#s?F9hli)L2vWu>DVR;~}#IJWPE9z(zXW?8MI!VunHFJIFpO*9>*$8)W{{ z(kj8Mh5@u2OJ%1xMxTsCH~SR>n2!V<&?D*Yy&Y)Da8)0u}MC+=`AZ=T`{{wG=-YlX4ce9)0gysExO_zi;3_hE8g}H zGY6DP-i~W>50K{Nw+i>?L{Er2+GSAs@zmTpzc~XJWwHzH0#cQl+a}AXR{^{FM zyVLD*Z%&^@6V|2aYvBM!A-j#vET#eLoXo|(qfgrCq45VvHiTu?Y1WyMAJEZtaA@2+ zV{raq`9({50SMKF@hy+YWqmv+@>8;!v^LBR2-qiYU0+p++0INe2pL6q+0+-Ab}Oxs`Fg1VIdw^%QMpLSuaC(6xCHoPU#*rB44~X!K0@gUrPiK-gF|ph{D7r>G$vnj%8*t zHP1HLrZS`mm5CGdeq#(3Vq@*{MH{CY3igZ!g^=_#W%*)+ARsbQSZK_kmZSvMY~G|8 zc2~drb-nH#-m%I5FusbMHMtYxH5YZHYyP6B&e2Nkl zkw#zlawXgRKkU6_v=ryoF4|VrQdKQg)ezj>JrLa8EkJMy?(PH#?v~&oxI=I!IKc@a z1Pku&mix^4R`*&fJA0o!?!DujamM)meBamv7K_zY@B7ThW~7+}+(pwi|E$pYBS&4t zTnv8}u_7_UGrntHQqu@8Fz(^^NCaTov(QkC5s!WfF=;-7IRjqG+_MQSHN#ne*X4Sg zKg^#Ee^hAjr>{xUb$$O>AK)W9KSjcNFY@XZ!oxm6mBS}|IH8za@}C93AgnI|V~ zJk+)av60VJhf{LKv$>H8i%=qzbHP*1M-8@PfM4a4qy}g(a1#XVWU5L%w-aO!hUcG??sU#N^0@*ElQEGuY7(jFR zU^R})Bd>1Yvjx4{x+TsldVp;^LUhhYzD7HK6bAW!@V^Qq2y_TcLhpI8id3Ef?2jTa zd_yqDQ71G1;dY+$Hg{Pxphhf8H1OA~!a0NTHR!jNF6WnfzMyUCy3~u;6B=YJlsG1$?3Fxb%Rj2|gb~|>*VOOzr2bl9{9>e4^$mXs^ z<{vJtaqw9b;x=1x!vTSzQ;=Up`jFUVTepC=K`#mvwA%P)BXchv z-m`Fv&{98_Ny6ZO-x;~Vf%S0+GzSV0SYK59CLk6I9zR-wK`9Be6UVXL@CQY10sOo_ z{s7}=nc|JAmY}8JOflmhaslhUMQEuJ-a9M;$M5`r`VX48S|gT@iAyIwp=QV8eC~=v zlfN-xMa4YRs~i2;`PamTR}Y0l5p zG`vuxrQlD+a!3a%wCD{_(yJ>nA+b%S^i zD5OCu&y%|N36NSSGKKWGSePNYj|lWJ72yKdMb$}OkQ0brh2qZRzd^yzJMv@TFD4eY z`b&0i-@Z2_P6R6Ph4{aW2{-~+@racUSZR!3(G>f?T^J-+W~mRqOA<33Cb@5^rYDx4 zIi{w^ftsFV{D%DNZlTI3!U5cB+Ob!590^hGXAnT^-n2En5{YbUUC&*wBsaDecqP9SltPj&8Imc5 zrFc?&=`$&Tlu$|}C6NJbZ5MHp6LLm*#hv{?ZEAyQ+O&yp`0 zG8IT}RU?ArZrVHYKe{HT84O!#80X_Q$)7ztevBWw!{fsi-BML?QX$$6KD1Hs8lWbz z;3FxW89+;M!H!WA-YNZ#LD*S71M;>z4u!9Ev8E7J9%MqO|E6PhvKwpLqb z^D*Pafla)x4Q(NUi&orS^sCV~07hj7EtYEE8hjxHQtAwYRKxf%27iGzgyj&w-({=m zNFjacorEI`U#@18R&l=6bo^jSitV{iY7+iz(i4Ik?vJ>~k1Q(m@b!XN%Q4Kh)VA4n z8MTgw9EUxNJS#lMsD+2tkQ(tYj#?%>958IT!Uup$1wRXJP8Fsu(I$j<2$$v)$XLZN zJ${XEnr%oil{$#PV4`8;rx5T7Euq&30W1;#%Td20 z^OMI99%E-vwD{|s;Et9$Qs86h))6;WBQnOeTenVN z5<$(xh%NMeSZ%gMrN&GGN$rJg5n?_c*D(cj3^-M{$_F|#8E&YnzH;a_;e zrr?e(hk2ti1W7y?#5!QXJ0ibuEa8Bn&%xpJITNAhogfSs>TncU$O-)3d1@efi6;^A zD})G=cZfyVF87d|_JK`tc9YPGrTTdxi{3$S^aXx`0;wk);&p z&&P3iPCHh{8`1-1;q+2Eq_3scHa|znquxCHV6xiOD#d9bUo0T#DUI2^EB+krz2%tU zs$k7FeF=ILZ2me>UwT_b(L6=aGdmT}>}fQMbiw8tyqW~+@h6;WPIPoX!}$U?LF-Nk z_23-dKoV8!E)^{r@7-X8QVCQ?!<{G{*DR1y8)&&w4L(oN1<<8g#~zK^f$6}Pc{?8m z96fPVs~KH=<$x3AJa6x_nmME2CqA>fs6dE_llbOjN~O`Lq_@Pj79(1G1#BO~F+R3o zOI`%-SxD6~4E$xH!lHS{X5!;=s%5k^e&`_>_K2Uvw}=Wfu0bz-e)h%RLaJcsoZ#UnyN!xLmR$I~ZhT|%@3B3g+@DA$QztyhXcit1>Wjy#Yd1Fof?=T%9YG1(!d3oZ~lraw_AYwCgyo4T0Dls zdppWM2IVPJ{L?`#5gUDq>bU*C`>(-|i-?c^J@4z|5$#$%|s#kzHDUmD$D;#$Om-V5bo7#Ya1M41JA6$#1EmZ-ew9Ug+K zq8a_o_z{2+E{&^#ew1PK9;CGoMDM{ARCW&`0f%}IPW!#j|C$#3@Vb7q!{3l&Z+kX+4GXIMsl>QwmWA{J)rM z8kJun(jcBpk7JDYH;M+rxPB&34vM{5MRd*sySE}mBqA?59sL}G93ye7v|!Fy%+I8K zV-Uo}C1x4y0n$j}CQ6A2FTTzwfnd|Q2n>y2V05F6G*4PUD`OQ%JeznAeuH-t&?%M+ z#Kq0r=+_30qbo5oOEuyGg63MJF9jAR9+7?tsEUR#Ao{pI zSiliLRy?vej)+ouwa@k$&fL}*+(184`m<3k5c{BfxN6j=WXN+kR!l{35P4FAbRV`SIan6T&YxGiNB4QJbJc#?@=e{B0B;A**}@5N`r*O zZ&Vzk-N$hQl~F6gO`8#Gp0}Ver7Rv+d@r!)vvCBldIfNWwaKgn9ZYxyKefk)7pHNW z@@ygzR-DvT{tF!Fy{BB7Ap7X23V(pu(1+=@i)eg&onGu=ffkJKDV}`TDq&aN z7RP_5t%{PLw07p>Yg!v^N?Eb^xCDk-xs&M;gHYL`sY5L36yqc-K0=s}ulMn@_|GL(CpifQdqxrf8t)jvk z^cC&Ff(e4u7yQY1p%I~xq0uO@8;cavcp$|&q4}YOp?#tKp@X4Ap~Imgp`)SGp^Kp_ zp=%^2SpF~ml%-+PXj|GE-I*$+%eZ%PjK^epNzSh?EEerr;QxS2&&tn8BJ7+Yi5n*| z{Kd4>nh%eN?ioaJEF5fWEs*Pj z9Tw9;rOdajgZbn#>?c&E_!b%5
    diff --git a/app/views/projects/files_tags.html.erb b/app/views/projects/files_tags.html.erb new file mode 100644 index 000000000..f451a59f5 --- /dev/null +++ b/app/views/projects/files_tags.html.erb @@ -0,0 +1,26 @@ + + + + +<% content_for :content do %> +
    +

    <%= l(:label_tags_search_result) %>

    +
    + <%= l(:label_tags_numbers) %> + <%= l(:label_issue_plural) %>(<%= @issues_tags_num %>) | + <%= l(:label_project_plural) %>(<%= @projects_tags_num %>) | + <%= l(:label_user_plural) %>(<%= @users_tags_num %>) | + <%= l(:label_tags_call)%>(<%= @bids_tags_num %>) | + <%= l(:field_filename)%>(<%= @attachments_tags_num %>) +
    +
    + <%# 求工厂模式重构 %> + <%= render :partial => "tag_search_results",:locals => {:issues_results => @issues_results, + :projects_results => @projects_results,:users_results => @users_results , + :bids_results=>@bids_results,:forums_results => @forums_results, :attachments_results => @attachments_results, :show_flag => @obj_flag}%> +
    + +
    + +<% end %> \ No newline at end of file diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 5cc7b7d8d..4bcb23731 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -170,6 +170,7 @@ zh: notice_locking_conflict: 数据已被另一位用户更新 notice_not_authorized: 对不起,您无权访问此页面。 notice_not_contest_setting_authorized: 对不起,您无权配置此竞赛。 + notice_not_contest_delete_authorized: 对不起,您无权删除此竞赛。 notice_not_authorized_archived_project: 要访问的项目已经归档。 notice_email_sent: "邮件已发送至 %{value}" notice_email_error: "发送邮件时发生错误 (%{value})" @@ -1344,6 +1345,7 @@ zh: label_new_call: 发布需求 label_newtype_contest: 发布竞赛 + label_user_information: "与我相关" label_bid_succeed: "需求发布成功" label_wrong_budget: 错误的金额格式 @@ -1824,6 +1826,7 @@ zh: label_system_platform: 系统平台 label_nextstep: 下一步 label_participate: 参赛者 + label_setting: 配置 label_contest_project: 参赛项目 label_contest_softapplication: 参赛应用 label_contest_response: 用户反馈 From 94a7bacdd29f711c699e860f8d0793e993421e83 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Mon, 21 Apr 2014 19:36:05 +0800 Subject: [PATCH 17/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=EF=BC=9A=E5=BD=93?= =?UTF-8?q?=E6=97=A0=E5=BA=94=E7=94=A8=E6=97=B6=EF=BC=8C=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=9A=82=E6=97=A0=E5=BA=94=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softapplications_controller.rb | 55 ++++++++++--------- app/helpers/application_helper.rb | 9 +++ app/views/welcome/contest.html.erb | 53 ++++++++++-------- 3 files changed, 66 insertions(+), 51 deletions(-) diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 9ac62f928..9f14aa118 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -17,18 +17,18 @@ class SoftapplicationsController < ApplicationController @jours = @softapplication.journals_for_messages.order('created_on DESC') @image_results = [] @softapplication.attachments.each do |f| - f.image? ? @image_results << f : @image_results + f.image? ? @image_results << f : @image_results end - @app_items = [] + @app_items = [] @softapplication.attachments.each do |f| - f.pack? ? @app_items << f : @app_items + f.pack? ? @app_items << f : @app_items end @limit = 10 @feedback_count = @jours.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] @offset ||= @feedback_pages.offset @jour = @jours[@offset, @limit] - @state = false + @state = false respond_to do |format| format.html # show.html.erb format.json { render json: @softapplication } @@ -83,11 +83,10 @@ class SoftapplicationsController < ApplicationController end end end - - + def add_attach @softapplication = Softapplication.find(params[:id]) - @softapplication.save_attachments(params[:attachments]) + @softapplication.save_attachments(params[:attachments]) end # DELETE /softapplications/1 @@ -101,15 +100,16 @@ class SoftapplicationsController < ApplicationController format.json { head :no_content } end end + #应用评价涉及到的方法 def new_message @jour = JournalsForMessage.find(params[:journal_id]) if params[:journal_id] if @jour - user = @jour.user - text = @jour.notes + user = @jour.user + text = @jour.notes else - user = @softapplication.user - text = @softapplication.description + user = @softapplication.user + text = @softapplication.description end text = text.to_s.strip.gsub(%r{
    ((.|\s)*?)
    }m, '[...]') @content = "> #{ll(User.current.language, :text_user_wrote, user)}\n> " @@ -117,25 +117,24 @@ class SoftapplicationsController < ApplicationController @id = user.id rescue ActiveRecord::RecordNotFound render_404 - end - #新建评价 - def create_message - - if params[:softapplication_message][:message].size>0 - if params[:reference_content] - message = params[:softapplication_message][:message] + "\n" + params[:reference_content] - else - message = params[:softapplication_message][:message] - end - refer_user_id = params[:softapplication_message][:reference_user_id].to_i - @softapplication = Softapplication.find(params[:id]) - @softapplication.add_jour(User.current, message, refer_user_id) - end - + + #新建评价 + def create_message + + if params[:reference_content] + message = params[:softapplication_message][:message] + "\n" + params[:reference_content] + else + message = params[:softapplication_message][:message] + end + refer_user_id = params[:softapplication_message][:reference_user_id].to_i + @softapplication = Softapplication.find(params[:id]) + @softapplication.add_jour(User.current, message, refer_user_id) + + @user = @softapplication.user @jours = @softapplication.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC') - + @limit = 10 @feedback_count = @jours.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] @@ -167,6 +166,7 @@ class SoftapplicationsController < ApplicationController format.js end end + # def more @jour = @softapplication.journals_for_messages @@ -179,6 +179,7 @@ class SoftapplicationsController < ApplicationController #format.api { render_api_ok } end end + # def back @jour = @softapplication.journals_for_messages diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1d639726f..ad90f8942 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1608,4 +1608,13 @@ module ApplicationHelper User.current end + # def hadcommittedforcontest(curu) + # message = JournalsForMessage.find_by_sql("select * from journals_for_messages where jour_type = 'Softapplication' ") + # message.each do |createmessage| + # if createmessage.user_id == curu + # return true + # end + # end + # end + end diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index 8c0addb8d..b91e05cc7 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -196,32 +196,37 @@

    最新参赛应用

    - +
    -
    - <% find_all_hot_softapplication.map do |softapplication| break if(softapplication == find_all_hot_softapplication[5]) %> + <% if Softapplication.count > 0%> +
    + <% find_all_hot_softapplication.map do |softapplication| break if(softapplication == find_all_hot_softapplication[5]) %> + +
  • +
    + <%= image_tag('/images/009.gif')%> +
    + +
    + <%= link_to(softapplication.name, softapplication_path(softapplication.id), :class => "d-g-blue d-p-project-name", :title => "#{softapplication.name}", :target => "_blank") %> +
    + +
    + ><%=softapplication.description.truncate(50, omission: '...')%> +

    + +
    + 发布时间:<%=format_time softapplication.created_at %> +
    + +
  • + <% end; reset_cycle %> + +
    + <% else %> +

    <%= l(:label_no_bid_project) %>

    -
  • -
    - <%= image_tag('/images/009.gif')%> -
    - -
    - <%= link_to(softapplication.name, softapplication_path(softapplication.id), :class => "d-g-blue d-p-project-name", :title => "#{softapplication.name}", :target => "_blank") %> -
    - -
    - ><%=softapplication.description.truncate(50, omission: '...')%> -

    - -
    - 发布时间:<%=format_time softapplication.created_at %> -
    - -
  • - <% end; reset_cycle %> - -
    + <% end %>
    From 8a429ec669b03a8ecafa597b31f694394b759f9a Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Mon, 21 Apr 2014 19:37:23 +0800 Subject: [PATCH 18/48] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/welcome/contest.html.erb | 2 +- config/locales/zh.yml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index b91e05cc7..f283bd759 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -224,7 +224,7 @@ <% else %> -

    <%= l(:label_no_bid_project) %>

    +

    <%= l(:label_no_ftapplication) %>

    <% end %> diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 4bcb23731..079ad450d 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1854,6 +1854,7 @@ zh: label_tags_contest_description: 竞赛描述 label_release_add_contest_succeed: 该应用发布并添加成功. label_add_contest_succeed_fail: 添加失败,该应用已参赛. + label_no_ftapplication: 暂无应用 - + \ No newline at end of file From 2b679b1ef9164913f949c66fae6e27772410fea3 Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 20:00:50 +0800 Subject: [PATCH 19/48] =?UTF-8?q?=E7=9C=8B=E5=9B=BE=E4=B8=8D=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/attachments_controller.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 6edd2a8c8..66b9a282d 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -21,7 +21,7 @@ class AttachmentsController < ApplicationController before_filter :delete_authorize, :only => :destroy before_filter :authorize_global, :only => :upload - before_filter :require_login, only: [:download] + before_filter :login_without_softapplication, only: [:download] accept_api_auth :show, :download, :upload @@ -207,4 +207,9 @@ private end content_type.to_s end + + def login_without_softapplication + referer = request.headers["Referer"] + require_login unless referer =~ /softapplication/ + end end From 66c4d870a42a5fe28ab8c0e2c9adc2805924d8f4 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Mon, 21 Apr 2014 20:07:30 +0800 Subject: [PATCH 20/48] =?UTF-8?q?=E8=AF=84=E5=88=86=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile.lock | 2 +- app/views/softapplications/show.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 40caae261..42cb62272 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,7 +75,7 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) - rake (10.1.0) + rake (10.0.4) rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index 76483c7c0..c0234831a 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -68,7 +68,7 @@
    软件评论:
    -
    评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
    +
    评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
    From e5a5a337b286321faf2c78b3571bf3adff7adcb7 Mon Sep 17 00:00:00 2001 From: yanxd Date: Mon, 21 Apr 2014 20:05:26 +0800 Subject: [PATCH 21/48] format code --- app/controllers/attachments_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 66b9a282d..20ae191ab 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -209,7 +209,7 @@ private end def login_without_softapplication - referer = request.headers["Referer"] + referer = request.headers['Referer'] require_login unless referer =~ /softapplication/ - end + end end From 4de9f959acb8ed5e6e906b798404ec462f13418d Mon Sep 17 00:00:00 2001 From: xianbo Date: Mon, 21 Apr 2014 20:13:40 +0800 Subject: [PATCH 22/48] clean repository --- .gitignore | 1 + Gemfile.lock | 115 --------------------------------------------------- 2 files changed, 1 insertion(+), 115 deletions(-) delete mode 100644 Gemfile.lock diff --git a/.gitignore b/.gitignore index 1d084c5cc..2524dd184 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /Gemfile /Gemfile.lock /db/schema.rb +/Gemfile.lock \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 42cb62272..000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,115 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - actionmailer (3.2.13) - actionpack (= 3.2.13) - mail (~> 2.5.3) - actionpack (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) - builder (~> 3.0.0) - erubis (~> 2.7.0) - journey (~> 1.0.4) - rack (~> 1.4.5) - rack-cache (~> 1.2) - rack-test (~> 0.6.1) - sprockets (~> 2.2.1) - activemodel (3.2.13) - activesupport (= 3.2.13) - builder (~> 3.0.0) - activerecord (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) - arel (~> 3.0.2) - tzinfo (~> 0.3.29) - activeresource (3.2.13) - activemodel (= 3.2.13) - activesupport (= 3.2.13) - activesupport (3.2.13) - i18n (= 0.6.1) - multi_json (~> 1.0) - acts-as-taggable-on (2.4.1) - rails (>= 3, < 5) - arel (3.0.2) - builder (3.0.0) - coderay (1.0.9) - erubis (2.7.0) - fastercsv (1.5.0) - hike (1.2.3) - i18n (0.6.1) - journey (1.0.4) - jquery-rails (2.0.3) - railties (>= 3.1.0, < 5.0) - thor (~> 0.14) - json (1.8.0) - mail (2.5.4) - mime-types (~> 1.16) - treetop (~> 1.4.8) - mime-types (1.23) - multi_json (1.7.6) - mysql2 (0.3.11-x86-mingw32) - net-ldap (0.3.1) - polyglot (0.3.3) - rack (1.4.5) - rack-cache (1.2) - rack (>= 0.4) - rack-openid (1.3.1) - rack (>= 1.1.0) - ruby-openid (>= 2.1.8) - rack-ssl (1.3.3) - rack - rack-test (0.6.2) - rack (>= 1.0) - rails (3.2.13) - actionmailer (= 3.2.13) - actionpack (= 3.2.13) - activerecord (= 3.2.13) - activeresource (= 3.2.13) - activesupport (= 3.2.13) - bundler (~> 1.0) - railties (= 3.2.13) - railties (3.2.13) - actionpack (= 3.2.13) - activesupport (= 3.2.13) - rack-ssl (~> 1.3.2) - rake (>= 0.8.7) - rdoc (~> 3.4) - thor (>= 0.14.6, < 2.0) - rake (10.0.4) - rdoc (3.12.2) - json (~> 1.4) - ruby-openid (2.1.8) - seems_rateable (1.0.13) - jquery-rails - rails - sprockets (2.2.2) - hike (~> 1.2) - multi_json (~> 1.0) - rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - thor (0.18.1) - tilt (1.4.1) - treetop (1.4.14) - polyglot - polyglot (>= 0.3.1) - tzinfo (0.3.37) - -PLATFORMS - x86-mingw32 - -DEPENDENCIES - activerecord-jdbc-adapter (= 1.2.5) - activerecord-jdbcmysql-adapter - acts-as-taggable-on - builder (= 3.0.0) - coderay (~> 1.0.6) - fastercsv (~> 1.5.0) - i18n (~> 0.6.0) - jquery-rails (~> 2.0.2) - mysql2 (~> 0.3.11) - net-ldap (~> 0.3.1) - rack-openid - rails (= 3.2.13) - rdoc (>= 2.4.2) - ruby-openid (~> 2.1.4) - seems_rateable From 7758e9bbf11fde265df0f1b0198e7cc2a5eddb02 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Mon, 21 Apr 2014 21:03:18 +0800 Subject: [PATCH 23/48] df --- app/views/softapplications/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index 76483c7c0..c0234831a 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -68,7 +68,7 @@
    软件评论:
    -
    评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
    +
    评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
    From 3ba524668f0f9424867dde5158c8c54490ba2d48 Mon Sep 17 00:00:00 2001 From: Wen Date: Mon, 21 Apr 2014 22:34:51 +0800 Subject: [PATCH 24/48] =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AF=84=E5=88=86?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E6=88=90=E7=89=88=E6=9C=AC=3D=20=3D=20?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=B8=80=E4=B8=8B=E4=BB=A5=E9=98=B2=E4=B8=A2?= =?UTF-8?q?=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/user_score_helper.rb | 116 ++++++++++++++++++++++++++++++- app/views/test/index.html.erb | 11 ++- db/schema.rb | 26 ++++++- 3 files changed, 148 insertions(+), 5 deletions(-) diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb index ff4a5adbd..4dc4d4c6e 100644 --- a/app/helpers/user_score_helper.rb +++ b/app/helpers/user_score_helper.rb @@ -34,11 +34,123 @@ module UserScoreHelper end def calculate_skill_count(user) - 0 + + praise_count = 0 + tread_count = 0 + issues = Issue.where('author_id = ?', user.id) + issues.each do |i| + ptcs = PraiseTreadCache.where('object_id = ?', i.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + bids = Bid.where('author_id = ?', user.id) + bids.each do |b| + ptcs = PraiseTreadCache.where('object_id = ?', b.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + contests = Contest.where('author_id = ?', user.id) + contests.each do |c| + ptcs = PraiseTreadCache.where('object_id = ?', c.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + + level = calculate_level(user) + + skill_score = 0 + + if level == 0 + skill_score = praise_count - 0.5 * tread_count + elseif level == 1 + skill_score = 2 * praise_count - 1.5 * tread_count + elseif level == 2 + skill_socre = 3 * praise_count - 2.5 * tread_count + elseif level == 3 + skill_socre = 4 * praise_count - 3.5 * tread_count + elseif level == 4 + skill_socre = 5 * praise_count - 4.5 * tread_count + end + +# case level +# when 0 skill_score = praise_count - 0.5 * tread_count +# when 1 skill_score = 2 * praise_count - 1.5 * tread_count +# when 2 skill_socre = 3 * praise_count - 2.5 * tread_count +# when 3 skill_socre = 4 * praise_count - 3.5 * tread_count +# when 4 skill_socre = 5 * praise_count - 4.5 * tread_count +# end + + + + tread_user_count = PraiseTread.where('praise_or_tread = ?, user_id = ?', 0, user.id).count + + skill_score = skill_score - 0.5 * tread_user_count + + return skill_score + + + end def calculate_level(user) - 1 + commit_count = user.changesets.count + max_praise_num = 0 + + + issues = Issue.where('author_id = ?', user.id) + issues.each do |i| + ptcs = PraiseTreadCache.where('object_id = ?', i.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + bids = Bid.where('author_id = ?', user.id) + bids.each do |b| + ptcs = PraiseTreadCache.where('object_id = ?', b.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + contests = Contest.where('author_id = ?', user.id) + contests.each do |c| + ptcs = PraiseTreadCache.where('object_id = ?', c.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + + best_answer_num = 0 + + level = 0 + + if max_praise_num > 4 + level = 1 + elseif commit_count > 0 and commit_count < 101 + level = 1 + elseif commit_count > 100 + level = 2 + end + + return level + end def calculate_activity_count(user) diff --git a/app/views/test/index.html.erb b/app/views/test/index.html.erb index 31cfdb9eb..93225f513 100644 --- a/app/views/test/index.html.erb +++ b/app/views/test/index.html.erb @@ -1,6 +1,13 @@

    test

    -<%= debug request %> +<% PraiseTreadCache.where('object_id = 47').each do |p| %> + + <%if p.praise_num < 0 or p.praise_num == 2%> + <%= p.praise_num %> + <%end%> + + +<% end %>
    -<%= request.host().class %> +
    \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index 3918413f3..c82407286 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 => 20140421044830) do +ActiveRecord::Schema.define(:version => 20140421091020) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -754,6 +754,11 @@ ActiveRecord::Schema.define(:version => 20140421044830) do add_index "time_entries", ["project_id"], :name => "time_entries_project_id" add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" + create_table "tmp", :force => true do |t| + t.string "name" + t.string "part_number" + end + create_table "tokens", :force => true do |t| t.integer "user_id", :default => 0, :null => false t.string "action", :limit => 30, :default => "", :null => false @@ -813,6 +818,19 @@ ActiveRecord::Schema.define(:version => 20140421044830) do add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + create_table "user_scores", :force => true do |t| + t.integer "user_id", :null => false + t.integer "collaboration" + t.integer "influence" + t.integer "skill" + t.integer "active" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "level" + t.integer "file" + t.integer "issue" + end + create_table "user_statuses", :force => true do |t| t.integer "changesets_count" t.integer "watchers_count" @@ -947,4 +965,10 @@ ActiveRecord::Schema.define(:version => 20140421044830) do add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" + create_table "yans", :force => true do |t| + t.string "name" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + end From cc5b55ec9c2eba00d8535c627aa8bd5983726baf Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Tue, 22 Apr 2014 08:49:08 +0800 Subject: [PATCH 25/48] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=B8=AD=E7=AE=80=E4=BB=8B=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E8=BE=B9=E8=B7=9D=E4=BB=A5=E5=8F=8A=E7=AE=80?= =?UTF-8?q?=E4=BB=8B=E9=99=90=E5=AE=9A=E5=AD=97=E6=95=B0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/softapplications/show.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index c0234831a..a5c3fb596 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -10,7 +10,7 @@

    <%= notice %>

    -
    +
    @@ -48,9 +48,9 @@
    -
    +
    应用简介:
    -
    <%= @softapplication.description %>
    +
    <%= @softapplication.description.truncate(150, omission: '...') %>
    From 0791c35df1f30bd2703ace3d32899a7e7bda016f Mon Sep 17 00:00:00 2001 From: yanxd Date: Tue, 22 Apr 2014 08:56:26 +0800 Subject: [PATCH 26/48] =?UTF-8?q?=E8=B5=9E=E8=B8=A9=E5=85=B3=E8=81=94?= =?UTF-8?q?=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/bid.rb | 1 + app/models/contest.rb | 1 + app/models/issue.rb | 3 ++- app/models/praise_tread.rb | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/models/bid.rb b/app/models/bid.rb index fd389c15f..e58e640a0 100644 --- a/app/models/bid.rb +++ b/app/models/bid.rb @@ -29,6 +29,7 @@ class Bid < ActiveRecord::Base has_many :courses, :through => :homework_for_courses, :source => :project has_many :homeworks, :class_name => 'HomeworkAttach', :dependent => :destroy has_many :join_in_contests, :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy # has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}" diff --git a/app/models/contest.rb b/app/models/contest.rb index edc252574..c3eea7e74 100644 --- a/app/models/contest.rb +++ b/app/models/contest.rb @@ -12,6 +12,7 @@ class Contest < ActiveRecord::Base has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy has_many :join_in_competitions, foreign_key: 'competition_id', :dependent => :destroy has_many :join_in_contests, class_name: 'JoinInCompetition', foreign_key: 'competition_id', :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy diff --git a/app/models/issue.rb b/app/models/issue.rb index 43bc6537d..b69ac246c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -45,7 +45,8 @@ class Issue < ActiveRecord::Base # added by fq has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy - # end + # end + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy acts_as_nested_set :scope => 'root_id', :dependent => :destroy diff --git a/app/models/praise_tread.rb b/app/models/praise_tread.rb index 901a31660..c27e1fc9f 100644 --- a/app/models/praise_tread.rb +++ b/app/models/praise_tread.rb @@ -1,4 +1,6 @@ class PraiseTread < ActiveRecord::Base attr_accessible :user_id,:praise_tread_object_id,:praise_tread_object_type,:praise_or_tread + belongs_to :user + belongs_to :praise_tread_object, polymorphic: true end From ded3da6670bde0d1ef19586bf5f89f82659b9576 Mon Sep 17 00:00:00 2001 From: Wen Date: Tue, 22 Apr 2014 09:54:56 +0800 Subject: [PATCH 27/48] =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AF=84=E5=88=86?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E4=B8=8A=E5=AE=8C=E6=88=90=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/user_score_helper.rb | 38 +++++++++++++++++++++++++++++--- app/views/test/index.html.erb | 16 +++++++++----- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb index 4dc4d4c6e..4c9a126f7 100644 --- a/app/helpers/user_score_helper.rb +++ b/app/helpers/user_score_helper.rb @@ -24,7 +24,28 @@ module UserScoreHelper issues.each do |issue| issue_c = issue_c + issue.journals.where("user_id <> ?", user.id).count end - issue_c = issue_c + Journal.where("user_id = ?", user.id) + issue_c = issue_c + Journal.where("user_id = ?", user.id).count + ############################ + memos = Memo.where('author_id = ? AND parent_id IS NOT NULL', user.id) + + memos.each do |m| + if Memo.find(m.parent_id).author.id != user.id + issue_c = issue_c + 1 + else + issue_c = issue_c - 1 + end + end + + + pmemos = Memo.where('author_id = ? AND parent_id IS NULL', user.id) + pmemos.each do |pm| + issue_c = issue_c + pm.replies_count + end + ############################ + + issue_c = issue_c + JournalsForMessage.where('user_id = ? AND reply_id IS NOT NULL AND reply_id <> ?', user.id, user.id).count + JournalsForMessage.where('reply_id = ? AND user_id <> ?', user.id, user.id).count + + return issue_c end @@ -91,7 +112,7 @@ module UserScoreHelper - tread_user_count = PraiseTread.where('praise_or_tread = ?, user_id = ?', 0, user.id).count + tread_user_count = PraiseTread.where('praise_or_tread = ? AND user_id = ?', 0, user.id).count skill_score = skill_score - 0.5 * tread_user_count @@ -139,13 +160,24 @@ module UserScoreHelper best_answer_num = 0 + isManager = 0 + members = Member.where('user_id = ?', user.id) + members.each do |m| + roles = m.member_roles + roles.each do |r| + if r.role_id == 3 + isManager = 1 + end + end + end + level = 0 if max_praise_num > 4 level = 1 elseif commit_count > 0 and commit_count < 101 level = 1 - elseif commit_count > 100 + elseif commit_count > 100 or isManager == 1 level = 2 end diff --git a/app/views/test/index.html.erb b/app/views/test/index.html.erb index 93225f513..43101bb4f 100644 --- a/app/views/test/index.html.erb +++ b/app/views/test/index.html.erb @@ -1,12 +1,16 @@

    test

    -<% PraiseTreadCache.where('object_id = 47').each do |p| %> + +<% memos=Memo.where('author_id = 5 AND parent_id IS NOT NULL') %> +<% memos.each do |m|%> + - <%if p.praise_num < 0 or p.praise_num == 2%> - <%= p.praise_num %> - <%end%> - - + <% if Memo.find(m.parent_id).author_id != 5 %> + <%=m.subject%> + <% end %> +> + <% end %> +

    From bc068eb12b5016e24f8de398c9a60f2e37cceac1 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Tue, 22 Apr 2014 10:59:50 +0800 Subject: [PATCH 28/48] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E8=B5=9B?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E7=9A=84=E5=88=A0=E9=99=A4=E5=92=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=8A=9F=E8=83=BD=E4=BB=A5=E5=8F=8A=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=9B=B8=E5=BA=94=E7=9A=84=E5=88=A0=E9=99=A4=E5=92=8C=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile.lock | 2 +- .../softapplications_controller.rb | 30 ++++++++- app/models/attachment.rb | 2 +- app/models/softapplication.rb | 11 +++- .../contests/_list_softapplications.html.erb | 1 + app/views/layouts/_base_footer.html.erb | 63 ++++++++++++------- app/views/softapplications/index.html.erb | 2 +- 7 files changed, 79 insertions(+), 32 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 40caae261..42cb62272 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -75,7 +75,7 @@ GEM rake (>= 0.8.7) rdoc (~> 3.4) thor (>= 0.14.6, < 2.0) - rake (10.1.0) + rake (10.0.4) rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 9f14aa118..9163f5473 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -1,4 +1,8 @@ class SoftapplicationsController < ApplicationController + before_filter :find_softapplication, only: [:edit, :update, :destroy] + before_filter :editable, only: [:edit, :update] + before_filter :destroyable, only: :destroy + # GET /softapplications # GET /softapplications.json def index @@ -71,7 +75,7 @@ class SoftapplicationsController < ApplicationController # PUT /softapplications/1 # PUT /softapplications/1.json def update - @softapplication = Softapplication.find(params[:id]) + # @softapplication = Softapplication.find(params[:id]) respond_to do |format| if @softapplication.update_attributes(params[:softapplication]) @@ -92,11 +96,11 @@ class SoftapplicationsController < ApplicationController # DELETE /softapplications/1 # DELETE /softapplications/1.json def destroy - @softapplication = Softapplication.find(params[:id]) + # @softapplication = Softapplication.find(params[:id]) @softapplication.destroy respond_to do |format| - format.html { redirect_to softapplications_url } + format.html { redirect_to :back } format.json { head :no_content } end end @@ -192,4 +196,24 @@ class SoftapplicationsController < ApplicationController #format.api { render_api_ok } end end + + private + def find_softapplication + @softapplication = Softapplication.find_by_id(params[:id]) + end + + def editable + unless @softapplication.editable_by? User.current + render_403 + return false + end + end + + def destroyable + unless @softapplication.destroyable_by? User.current + render_403 + return false + end + end + end diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 919760ee3..3ce64d695 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -181,7 +181,7 @@ class Attachment < ActiveRecord::Base end def pack? - !!(self.filename =~ /\.(zip|rar|tar|gz)$/i) + !!(self.filename =~ /\.(zip|rar|tar|gz|exe)$/i) end def thumbnailable? diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 205ede48b..6782b2436 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -7,7 +7,7 @@ class Softapplication < ActiveRecord::Base has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user - belongs_to :contest + has_many :contests, :through => :contesting_softapplications def add_jour(user, notes, reference_user_id = 0, options = {}) if options.count == 0 @@ -21,6 +21,13 @@ class Softapplication < ActiveRecord::Base def set_commit(commit) self.update_attribute(:commit, commit) end - + + def editable_by? usr + usr.admin? || self.user == usr + end + + def destroyable_by? usr + self.user == usr || usr.admin? + end end diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb index 29c985b7e..5646f5d12 100644 --- a/app/views/contests/_list_softapplications.html.erb +++ b/app/views/contests/_list_softapplications.html.erb @@ -8,6 +8,7 @@ <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication)) %> + <%= link_to '删除', c_softapplication.softapplication, method: :delete, data: { confirm: '您确定要删除吗?' } %>
    diff --git a/app/views/layouts/_base_footer.html.erb b/app/views/layouts/_base_footer.html.erb index bba5b2166..a941a7d1f 100644 --- a/app/views/layouts/_base_footer.html.erb +++ b/app/views/layouts/_base_footer.html.erb @@ -1,28 +1,43 @@
    +
    + <%= debug(params) if Rails.env.development? %> + +
    diff --git a/app/views/softapplications/index.html.erb b/app/views/softapplications/index.html.erb index be9245876..16a206508 100644 --- a/app/views/softapplications/index.html.erb +++ b/app/views/softapplications/index.html.erb @@ -1,4 +1,4 @@ -

    Listing softapplications

    +

    参赛应用

    From 00e62ec8f7fa5ab479bcf620957b527b1229d8a7 Mon Sep 17 00:00:00 2001 From: Wen Date: Tue, 22 Apr 2014 14:53:25 +0800 Subject: [PATCH 29/48] =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AF=84=E5=88=86?= =?UTF-8?q?=E7=90=86=E8=AE=BA=E4=B8=8A=E5=AE=8C=E6=88=90=E7=89=88.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/test_controller.rb | 2 + app/controllers/user_score_controller.rb | 6 +++ app/helpers/user_score_helper.rb | 53 +++++++++++++------ app/models/user.rb | 4 +- app/views/test/index.html.erb | 25 ++++++--- test/functional/user_score_controller_test.rb | 7 +++ 6 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 app/controllers/user_score_controller.rb create mode 100644 test/functional/user_score_controller_test.rb diff --git a/app/controllers/test_controller.rb b/app/controllers/test_controller.rb index cb28f4e66..0623dbee2 100644 --- a/app/controllers/test_controller.rb +++ b/app/controllers/test_controller.rb @@ -1,4 +1,6 @@ class TestController < ApplicationController + + helper :UserScore def zip homeworks_attach_path = [] diff --git a/app/controllers/user_score_controller.rb b/app/controllers/user_score_controller.rb new file mode 100644 index 000000000..875229e89 --- /dev/null +++ b/app/controllers/user_score_controller.rb @@ -0,0 +1,6 @@ +class UserScoreController < ApplicationController + helper :UserScoreHelper + + + +end diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb index 4c9a126f7..5b455a01b 100644 --- a/app/helpers/user_score_helper.rb +++ b/app/helpers/user_score_helper.rb @@ -51,7 +51,7 @@ module UserScoreHelper end def calculate_influence_count(user) - watcher_count = watcher_users(User.current.id).count + watcher_count = Watcher.where("watchable_type = 'principal' AND watchable_id = ?", user.id).count end def calculate_skill_count(user) @@ -92,13 +92,17 @@ module UserScoreHelper if level == 0 skill_score = praise_count - 0.5 * tread_count - elseif level == 1 + end + if level == 1 skill_score = 2 * praise_count - 1.5 * tread_count - elseif level == 2 + end + if level == 2 skill_socre = 3 * praise_count - 2.5 * tread_count - elseif level == 3 + end + if level == 3 skill_socre = 4 * praise_count - 3.5 * tread_count - elseif level == 4 + end + if level == 4 skill_socre = 5 * praise_count - 4.5 * tread_count end @@ -175,9 +179,11 @@ module UserScoreHelper if max_praise_num > 4 level = 1 - elseif commit_count > 0 and commit_count < 101 + end + if commit_count > 0 and commit_count < 101 level = 1 - elseif commit_count > 100 or isManager == 1 + end + if commit_count > 100 or isManager == 1 level = 2 end @@ -195,13 +201,13 @@ module UserScoreHelper # end # file_count = user.file_commit.count # issue_count = Issue.where('author_id = ?', user.id).count - f = user.user_score.file - i = user.user_score.issue - f_max = UserScore.find_max_file - f_min = UserScore.find_min_file - i_max = UserScore.find_max_issue - i_min = UserScore.find_min_issue - score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min)) + #f = user.user_score.file + #i = user.user_score.issue + #f_max = UserScore.find_max_file + #f_min = UserScore.find_min_file + #i_max = UserScore.find_max_issue + #i_min = UserScore.find_min_issue + #score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min)) end def calculate_file(user) @@ -216,8 +222,14 @@ module UserScoreHelper issue_details_count = 0 issues = Issue.where('assigned_to_id = ?', user.id) + change_count = 0 issues.each do |issue| - change_count = issue.journals.where("prop_key = ?", "done_ratio").count + js = issue.journals + js.each do |j| + change_count = change_count + j.details.where("prop_key = ?", "done_ratio").count + end + + issue_details_count = change_count + issue_details_count end @@ -233,7 +245,9 @@ module UserScoreHelper file = calculate_file(user) issue = calculate_issue(user) level = calculate_level(user) - user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, + #user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, + # :activity => activity, :file => file, :issue => issue, :level => level) + UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, :activity => activity, :file => file, :issue => issue, :level => level) end @@ -241,12 +255,17 @@ module UserScoreHelper collaboration = calculate_collaboration_count(user) influence = calculate_influence_count(user) skill = calculate_skill_count(user) - activity = calculate_activity_count(user) file = calculate_file(user) issue = calculate_issue(user) + + ##activity = calculate_activity_count(user) + level = calculate_level(user) user.user_score.update_attributes(:collaboration => collaboration, :influence => influence, :skill => skill, :activity => activity, :file => file, :issue => issue, :level => level) end + + + end diff --git a/app/models/user.rb b/app/models/user.rb index 1809c3a98..20624888a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -96,7 +96,7 @@ class User < Principal has_many :students_for_courses has_many :courses, :through => :students_for_courses, :source => :project has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy - has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_tpye = 'Project' or container_type = 'Version'" + has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_type = 'Project' or container_type = 'Version'" #### # added by bai has_many :join_in_contests, :dependent => :destroy @@ -105,7 +105,7 @@ class User < Principal has_many :wiki_contents, :foreign_key => 'author_id' has_many :journals has_many :messages, :foreign_key => 'author_id' - has_one :user_socre, :dependent => :destroy + has_one :user_score, :dependent => :destroy # end ######added by nie diff --git a/app/views/test/index.html.erb b/app/views/test/index.html.erb index 43101bb4f..5b435085a 100644 --- a/app/views/test/index.html.erb +++ b/app/views/test/index.html.erb @@ -1,15 +1,26 @@

    test

    -<% memos=Memo.where('author_id = 5 AND parent_id IS NOT NULL') %> -<% memos.each do |m|%> + +<% users = User.all%> +
    + + + +<% users.each do |user| %> + + - <% if Memo.find(m.parent_id).author_id != 5 %> - - <% end %> -> - + + + + + + + + <% end %> +
    nameCISfilecountissuecountlevel
    <%=m.subject%>
    <%= user.lastname %><%= user.firstname %><%= calculate_collaboration_count(user) %><%= calculate_influence_count(user) %><%= calculate_skill_count(user) %><%= calculate_file(user) %><%= calculate_issue(user) %><%= calculate_level(user) %>

    diff --git a/test/functional/user_score_controller_test.rb b/test/functional/user_score_controller_test.rb new file mode 100644 index 000000000..bf56a2076 --- /dev/null +++ b/test/functional/user_score_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class UserScoreControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end From 3dbe7c5896bb519e645001f480cdd912ca2eb356 Mon Sep 17 00:00:00 2001 From: Wen Date: Tue, 22 Apr 2014 15:25:50 +0800 Subject: [PATCH 30/48] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E6=A0=A1ID=E8=87=AA=E5=8A=A8=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=E5=BC=80=E8=AF=BE=E6=95=99=E5=B8=88=E7=9A=84=E5=AD=A6=E6=A0=A1?= =?UTF-8?q?ID=20=E5=8E=BB=E6=8E=89=E8=AF=BE=E7=A8=8B=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=B8=8A=E7=9A=84=E5=AD=A6=E6=A0=A1=E9=80=89?= =?UTF-8?q?=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 3 ++- app/views/projects/_course_form.html.erb | 6 ------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3f771bf77..98f6316ad 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -392,7 +392,8 @@ class ProjectsController < ApplicationController # added by bai @course.term = params[:term] @course.time = params[:time] - @course.school_id = params[:occupation] + #@course.school_id = params[:occupation] + @course.school_id = User.current.user_extensions.school_id @course.setup_time = params[:setup_time] @course.endup_time = params[:endup_time] @course.class_period = params[:class_period] diff --git a/app/views/projects/_course_form.html.erb b/app/views/projects/_course_form.html.erb index 944157a9b..017c4e6ee 100644 --- a/app/views/projects/_course_form.html.erb +++ b/app/views/projects/_course_form.html.erb @@ -284,13 +284,7 @@ - -

    - <%=l(:label_new_course_school)%>*    - <%= select_tag "province", options_from_collection_for_select(School.find_by_sql("select distinct province from schools"), :province, :province), :onclick => "get_options(this.value)" %> - <%= select_tag "occupation" %> -

    From 05c0d2a5ac576c3fc84997eca557985f824cda30 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Tue, 22 Apr 2014 19:27:31 +0800 Subject: [PATCH 31/48] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E9=A6=96=E9=A1=B5=E4=B8=AD=E7=AB=9E=E8=B5=9B?= =?UTF-8?q?=E5=92=8C=E5=BA=94=E7=94=A8=E7=9A=84=E5=9B=BE=E6=A0=87=E5=B9=B6?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=B8=E5=BA=94=E7=9A=84=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softapplications_controller.rb | 2 +- .../contests/_list_softapplications.html.erb | 1 - app/views/softapplications/_form.html.erb | 97 +++++++++--------- app/views/softapplications/edit.html.erb | 10 +- app/views/softapplications/new.html.erb | 73 +------------ app/views/softapplications/show.html.erb | 4 + app/views/welcome/contest.html.erb | 16 +-- config/locales/zh.yml | 1 + public/images/app1.png | Bin 0 -> 4441 bytes public/images/contest1.png | Bin 0 -> 4794 bytes 10 files changed, 72 insertions(+), 132 deletions(-) create mode 100644 public/images/app1.png create mode 100644 public/images/contest1.png diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 9163f5473..5153a01d4 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -100,7 +100,7 @@ class SoftapplicationsController < ApplicationController @softapplication.destroy respond_to do |format| - format.html { redirect_to :back } + format.html { redirect_to home_path } format.json { head :no_content } end end diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb index 5646f5d12..29c985b7e 100644 --- a/app/views/contests/_list_softapplications.html.erb +++ b/app/views/contests/_list_softapplications.html.erb @@ -8,7 +8,6 @@ <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication)) %> - <%= link_to '删除', c_softapplication.softapplication, method: :delete, data: { confirm: '您确定要删除吗?' } %>
    diff --git a/app/views/softapplications/_form.html.erb b/app/views/softapplications/_form.html.erb index 5a046801f..f45125ea2 100644 --- a/app/views/softapplications/_form.html.erb +++ b/app/views/softapplications/_form.html.erb @@ -1,64 +1,69 @@ -<%= form_for(@softapplication) do |f| %> +<%= form_for(softapplication) do |f| %> - <% if @softapplication.errors.any? %> + <% if softapplication.errors.any? %>
    -

    <%= pluralize(@softapplication.errors.count, "error") %> prohibited this softapplication from being saved:

    +

    <%= pluralize(softapplication.errors.count, "error") %> prohibited this softapplication from being saved:

      - <% @softapplication.errors.full_messages.each do |msg| %> + <% softapplication.errors.full_messages.each do |msg| %>
    • <%= msg %>
    • <% end %>
    <% end %> - - - <%= l(:label_softapplication_name) %> - * : - <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %> - <%= l(:label_softapplication_name_condition)%> -

    +
    + + + <%= l(:label_softapplication_name) %> + * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %> + <%= l(:label_softapplication_name_condition)%> + +
    +
    + + + <%= l(:label_softapplication_version_available) %> + * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %> - - <%= l(:label_softapplication_version_available) %> - * : - <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %> + +
    +
    + + + <%= l(:label_softapplication_type) %> -

    + * : <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> - - <%= l(:label_softapplication_type) %> - * : - <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> + +
    +
    + + + <%= l(:label_softapplication_description) %> + * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %> -

    + +
    +
    + + <%= l(:label_softapplication_developers) %> + * : <%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %> - - <%= l(:label_softapplication_description) %> - * : - <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %> - -

    - - -
    -
    - <%=l(:label_upload_softapplication_packets)%> :
    -

    - <%= render :partial => 'attachments/form' %> -

    -
    -
    - -
    -
    - <%=l(:label_upload_softapplication_photo)%> :(<%=l(:label_upload_softapplication_photo_condition)%>)
    -

    - <%= render :partial => 'attachments/form' %> -

    -
    -
    + +
    +
    +
    + 上传应用软件包和应用截图 + <%= render_flash_messages %> +

    + <%= render :partial => 'attachments/form' %> +

    +

    (<%=l(:label_upload_softapplication_photo_condition)%>)

    + +
    +

    +
    <%= submit_tag l(:button_create), :onclick => "return true" %>
    <% end %> diff --git a/app/views/softapplications/edit.html.erb b/app/views/softapplications/edit.html.erb index f93e091d2..c9e0c6f66 100644 --- a/app/views/softapplications/edit.html.erb +++ b/app/views/softapplications/edit.html.erb @@ -1,6 +1,8 @@ -

    Editing softapplication

    +

    <%= l(:label_edit_softapplication)%>

    + +<%= render partial: 'form', locals:{softapplication: @softapplication} %> + + -<%= render 'form' %> -<%= link_to 'Show', @softapplication %> | -<%= link_to 'Back', softapplications_path %> diff --git a/app/views/softapplications/new.html.erb b/app/views/softapplications/new.html.erb index d5ff2c9c2..1112fcfa4 100644 --- a/app/views/softapplications/new.html.erb +++ b/app/views/softapplications/new.html.erb @@ -1,76 +1,5 @@

    <%= l(:label_release_softapplication)%>

    - +<%= render partial: 'form', locals:{softapplication: @softapplication} %> -
    - <%= form_for Softapplication.new, :url => {:controller => 'softapplications', :action => 'create'}, :update => "bidding_project_list", :complete => '$("#put-bid-form").hide();', :html => {:multipart => true, :id => 'add_homework_form'} do |f| %> -
    - - - <%= l(:label_softapplication_name) %> - * : <%= f.text_field :name, :required => true, :size => 60, :style => "width:400px;" %> - <%= l(:label_softapplication_name_condition)%> - -
    -
    - - <%= l(:label_softapplication_version_available) %> - * : <%= f.text_field :android_min_version_available, :required => true, :size => 60, :style => "width:400px;" %> - - -
    -
    - - - <%= l(:label_softapplication_type) %> - - * : <%= f.text_field :app_type_name, :required => true, :size => 60, :style => "width:400px;" %> - - -
    -
    - - - <%= l(:label_softapplication_description) %> - * : <%= f.text_field :description, :required => true, :size => 60, :style => "width:400px;" %> - - -
    -
    - - - <%= l(:label_softapplication_developers) %> - * : <%= f.text_field :application_developers, :required => true, :size => 60, :style => "width:400px;" %> - - -
    -
    -
    - 上传应用软件包和应用截图 - <%= render_flash_messages %> -

    - <%= render :partial => 'attachments/form' %> -

    -

    (<%=l(:label_upload_softapplication_photo_condition)%>)

    - -
    -

    -
    <%= submit_tag l(:button_create), :onclick => "return true" %>
    - -
    - - <% end %> -
    \ No newline at end of file diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index a5c3fb596..d5681c4ea 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -18,6 +18,10 @@ + diff --git a/app/views/welcome/contest.html.erb b/app/views/welcome/contest.html.erb index f283bd759..6ef2b4796 100644 --- a/app/views/welcome/contest.html.erb +++ b/app/views/welcome/contest.html.erb @@ -142,18 +142,18 @@
  • - <%= image_tag('/images/039.gif')%> + <%= image_tag('/images/contest1.png')%>
    -
    +
    <%= link_to(contest.name, contest.event_url, :class => "d-g-blue d-p-project-name", :title => "#{contest.name}", :target => "_blank") %>
    -
    +
    ><%=contest.description.truncate(50, omission: '...')%>

    -
    +
    发布时间:<%=format_time contest.created_on %>
    @@ -204,18 +204,18 @@
  • - <%= image_tag('/images/009.gif')%> + <%= image_tag('/images/app1.png')%>
    -
    +
    <%= link_to(softapplication.name, softapplication_path(softapplication.id), :class => "d-g-blue d-p-project-name", :title => "#{softapplication.name}", :target => "_blank") %>
    -
    +
    ><%=softapplication.description.truncate(50, omission: '...')%>

    -
    +
    发布时间:<%=format_time softapplication.created_at %>
    diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 079ad450d..c32c62c05 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1855,6 +1855,7 @@ zh: label_release_add_contest_succeed: 该应用发布并添加成功. label_add_contest_succeed_fail: 添加失败,该应用已参赛. label_no_ftapplication: 暂无应用 + label_edit_softapplication: 修改应用 \ No newline at end of file diff --git a/public/images/app1.png b/public/images/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..3342781acd7be2b0a01a8b359d4a74d0ba775404 GIT binary patch literal 4441 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 pcFNM^UH~-@J+h%%912{q0Y`G(d}Hg Date: Tue, 22 Apr 2014 20:23:15 +0800 Subject: [PATCH 32/48] =?UTF-8?q?=E5=BA=94=E7=94=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=80=E5=B1=9E=E7=AB=9E=E8=B5=9B=E5=8F=8A?= =?UTF-8?q?=E7=9B=B8=E5=BA=94=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/softapplications/show.html.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index d5681c4ea..51195dfcf 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -25,7 +25,8 @@
  • - + <% contest = @softapplication.contests.first %> + @@ -42,7 +43,7 @@ - + From 60bc3bb1b2da1d6d80dde15e9691f307926cf4c8 Mon Sep 17 00:00:00 2001 From: yanxd Date: Wed, 23 Apr 2014 08:46:40 +0800 Subject: [PATCH 33/48] seem_rateable to lib, using Engine setting routes --- Gemfile | 2 +- app/controllers/ratings_controller.rb | 15 --- config/routes.rb | 3 +- lib/plugins/seems_rateable-master/.gitignore | 21 ---- lib/plugins/seems_rateable-master/Rakefile | 32 ----- .../seems_rateable/application_controller.rb | 4 - .../seems_rateable/application_helper.rb | 4 - .../helpers/seems_rateable/ratings_helper.rb | 4 - .../app/models/seems_rateable/rate.rb | 6 - .../seems_rateable/application.html.erb | 14 --- .../install/install_generator.rb | 39 ------ .../templates/cached_ratings_migration.rb | 17 --- .../lib/seems_rateable/engine.rb | 17 --- .../lib/seems_rateable/errors.rb | 21 ---- .../lib/seems_rateable/helpers.rb | 27 ----- .../lib/seems_rateable/model.rb | 111 ------------------ .../lib/tasks/seems_rateable_tasks.rake | 4 - .../Gemfile | 0 .../MIT-LICENSE | 0 .../README.md | 12 +- lib/seems_rateable/Rakefile | 17 +++ .../images/seems_rateable/bg_jRatingInfos.png | Bin .../assets/images/seems_rateable/small.png | Bin .../assets/images/seems_rateable/stars.png | Bin .../javascripts/seems_rateable/application.js | 0 .../seems_rateable/application.css | 54 ++++----- .../seems_rateable/application_controller.rb | 7 ++ .../seems_rateable/ratings_controller.rb | 13 ++ .../models/seems_rateable/cached_rating.rb | 2 +- .../app/models/seems_rateable/rate.rb | 6 + .../bin/rails | 0 .../config/routes.rb | 0 .../install/install_generator.rb | 42 +++++++ .../templates/cached_ratings_migration.rb | 17 +++ .../install/templates/initializer.rb | 0 .../install/templates/jRating.js.erb | 6 +- .../install/templates/rateable.js.erb | 4 +- .../install/templates/rates_migration.rb | 2 +- .../lib/seems_rateable.rb | 4 +- .../lib/seems_rateable/engine.rb | 16 +++ .../lib/seems_rateable/errors.rb | 21 ++++ .../lib/seems_rateable/helpers.rb | 27 +++++ .../lib/seems_rateable/model.rb | 91 ++++++++++++++ .../lib/seems_rateable/routes.rb | 0 .../lib/seems_rateable/version.rb | 2 +- .../seems_rateable.gemspec | 0 public/images/footer_logo/inforbus.png | Bin 6154 -> 56477 bytes public/images/footer_logo/iscas.png | Bin 4857 -> 53769 bytes public/javascripts/seems_rateable/jRating.js | 2 +- public/javascripts/seems_rateable/rateable.js | 2 +- 50 files changed, 306 insertions(+), 382 deletions(-) delete mode 100644 app/controllers/ratings_controller.rb delete mode 100644 lib/plugins/seems_rateable-master/.gitignore delete mode 100644 lib/plugins/seems_rateable-master/Rakefile delete mode 100644 lib/plugins/seems_rateable-master/app/controllers/seems_rateable/application_controller.rb delete mode 100644 lib/plugins/seems_rateable-master/app/helpers/seems_rateable/application_helper.rb delete mode 100644 lib/plugins/seems_rateable-master/app/helpers/seems_rateable/ratings_helper.rb delete mode 100644 lib/plugins/seems_rateable-master/app/models/seems_rateable/rate.rb delete mode 100644 lib/plugins/seems_rateable-master/app/views/layouts/seems_rateable/application.html.erb delete mode 100644 lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/install_generator.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/seems_rateable/engine.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/seems_rateable/errors.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/seems_rateable/helpers.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/seems_rateable/model.rb delete mode 100644 lib/plugins/seems_rateable-master/lib/tasks/seems_rateable_tasks.rake rename lib/{plugins/seems_rateable-master => seems_rateable}/Gemfile (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/MIT-LICENSE (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/README.md (95%) create mode 100644 lib/seems_rateable/Rakefile rename lib/{plugins/seems_rateable-master => seems_rateable}/app/assets/images/seems_rateable/bg_jRatingInfos.png (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/app/assets/images/seems_rateable/small.png (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/app/assets/images/seems_rateable/stars.png (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/app/assets/javascripts/seems_rateable/application.js (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/app/assets/stylesheets/seems_rateable/application.css (60%) create mode 100644 lib/seems_rateable/app/controllers/seems_rateable/application_controller.rb create mode 100644 lib/seems_rateable/app/controllers/seems_rateable/ratings_controller.rb rename lib/{plugins/seems_rateable-master => seems_rateable}/app/models/seems_rateable/cached_rating.rb (60%) create mode 100644 lib/seems_rateable/app/models/seems_rateable/rate.rb rename lib/{plugins/seems_rateable-master => seems_rateable}/bin/rails (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/config/routes.rb (100%) create mode 100644 lib/seems_rateable/lib/generators/seems_rateable/install/install_generator.rb create mode 100644 lib/seems_rateable/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/generators/seems_rateable/install/templates/initializer.rb (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/generators/seems_rateable/install/templates/jRating.js.erb (95%) rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/generators/seems_rateable/install/templates/rateable.js.erb (93%) rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/generators/seems_rateable/install/templates/rates_migration.rb (98%) rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/seems_rateable.rb (85%) create mode 100644 lib/seems_rateable/lib/seems_rateable/engine.rb create mode 100644 lib/seems_rateable/lib/seems_rateable/errors.rb create mode 100644 lib/seems_rateable/lib/seems_rateable/helpers.rb create mode 100644 lib/seems_rateable/lib/seems_rateable/model.rb rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/seems_rateable/routes.rb (100%) rename lib/{plugins/seems_rateable-master => seems_rateable}/lib/seems_rateable/version.rb (54%) rename lib/{plugins/seems_rateable-master => seems_rateable}/seems_rateable.gemspec (100%) diff --git a/Gemfile b/Gemfile index b20c8653a..0ea40e013 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ unless RUBY_PLATFORM =~ /w32/ gem 'rubyzip' gem 'zip-zip' end -gem 'seems_rateable' +gem 'seems_rateable', path: 'lib/seems_rateable' gem "rails", "3.2.13" gem "jquery-rails", "~> 2.0.2" gem "i18n", "~> 0.6.0" diff --git a/app/controllers/ratings_controller.rb b/app/controllers/ratings_controller.rb deleted file mode 100644 index 5ae478af8..000000000 --- a/app/controllers/ratings_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_dependency "seems_rateable/application_controller" - -class RatingsController < ::ApplicationController - def create - raise NoCurrentUserInstanceError unless current_user - - obj = params[:kls].classify.constantize.find(params[:idBox]) - begin - obj.rate(params[:rate].to_i, current_user.id, params[:dimension]) - render :json => true - rescue Errors::AlreadyRatedError - render :json => {:error => true} - end - end -end diff --git a/config/routes.rb b/config/routes.rb index 54d9124f0..bf6f3ceee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,7 +16,8 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. RedmineApp::Application.routes.draw do - resources :ratings, :only => :create + mount SeemsRateable::Engine => '/rateable', :as => :rateable + namespace :zipdown do match 'assort' end diff --git a/lib/plugins/seems_rateable-master/.gitignore b/lib/plugins/seems_rateable-master/.gitignore deleted file mode 100644 index f372f8d4f..000000000 --- a/lib/plugins/seems_rateable-master/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -*.gem -*.rbc -.bundle -.config -.yardoc -Gemfile.lock -InstalledFiles -_yardoc -coverage -doc/ -lib/bundler/man -pkg -rdoc -spec/reports -test/tmp -test/version_tmp -tmp -.project -.rvmrc -spec -test diff --git a/lib/plugins/seems_rateable-master/Rakefile b/lib/plugins/seems_rateable-master/Rakefile deleted file mode 100644 index c2ef03737..000000000 --- a/lib/plugins/seems_rateable-master/Rakefile +++ /dev/null @@ -1,32 +0,0 @@ -begin - require 'bundler/setup' -rescue LoadError - puts 'You must `gem install bundler` and `bundle install` to run rake tasks' -end - -require 'rdoc/task' - -RDoc::Task.new(:rdoc) do |rdoc| - rdoc.rdoc_dir = 'rdoc' - rdoc.title = 'SeemsRateable' - rdoc.options << '--line-numbers' - rdoc.rdoc_files.include('README.rdoc') - rdoc.rdoc_files.include('lib/**/*.rb') -end - -APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__) -load 'rails/tasks/engine.rake' -Bundler::GemHelper.install_tasks - -APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__) -load 'rails/tasks/engine.rake' - -Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f } -require 'rspec/core' -require 'rspec/core/rake_task' - -task :default => :spec - - - - diff --git a/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/application_controller.rb b/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/application_controller.rb deleted file mode 100644 index cd94242dd..000000000 --- a/lib/plugins/seems_rateable-master/app/controllers/seems_rateable/application_controller.rb +++ /dev/null @@ -1,4 +0,0 @@ -module SeemsRateable - class ApplicationController < ActionController::Base - end -end diff --git a/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/application_helper.rb b/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/application_helper.rb deleted file mode 100644 index 596eeb4c9..000000000 --- a/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/application_helper.rb +++ /dev/null @@ -1,4 +0,0 @@ -module SeemsRateable - module ApplicationHelper - end -end diff --git a/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/ratings_helper.rb b/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/ratings_helper.rb deleted file mode 100644 index 91c7411c4..000000000 --- a/lib/plugins/seems_rateable-master/app/helpers/seems_rateable/ratings_helper.rb +++ /dev/null @@ -1,4 +0,0 @@ -module SeemsRateable - module RatingsHelper - end -end diff --git a/lib/plugins/seems_rateable-master/app/models/seems_rateable/rate.rb b/lib/plugins/seems_rateable-master/app/models/seems_rateable/rate.rb deleted file mode 100644 index f9db806a3..000000000 --- a/lib/plugins/seems_rateable-master/app/models/seems_rateable/rate.rb +++ /dev/null @@ -1,6 +0,0 @@ -module SeemsRateable - class Rate < ActiveRecord::Base - belongs_to :rater, :class_name => SeemsRateable::Engine.config.owner_class - belongs_to :rateable, :polymorphic => true - end -end diff --git a/lib/plugins/seems_rateable-master/app/views/layouts/seems_rateable/application.html.erb b/lib/plugins/seems_rateable-master/app/views/layouts/seems_rateable/application.html.erb deleted file mode 100644 index 3c63ba433..000000000 --- a/lib/plugins/seems_rateable-master/app/views/layouts/seems_rateable/application.html.erb +++ /dev/null @@ -1,14 +0,0 @@ - - - - SeemsRateable - <%= stylesheet_link_tag "seems_rateable/application", media: "all" %> - <%= javascript_include_tag "seems_rateable/application" %> - <%= csrf_meta_tags %> - - - -<%= yield %> - - - diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/install_generator.rb b/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/install_generator.rb deleted file mode 100644 index 9a3aac0a5..000000000 --- a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/install_generator.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'rails/generators/migration' -require 'fileutils' - -module SeemsRateable - module Generators - class InstallGenerator < ::Rails::Generators::Base - include Rails::Generators::Migration - source_root File.expand_path('../templates', __FILE__) - - def self.next_migration_number(path) - unless @prev_migration_nr - @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i - else - @prev_migration_nr += 1 - end - @prev_migration_nr.to_s - end - - desc "generating migration files" - def copy_migrations - migration_template "rates_migration.rb", "db/migrate/create_seems_rateable_rates.rb" - migration_template "cached_ratings_migration.rb", "db/migrate/create_seems_rateable_cached_ratings.rb" - end - - desc "generating initializer" - def copy_initializer - template "initializer.rb", "config/initializers/seems_rateable.rb" - end - - desc "generating javascript files" - def copy_javascript_asset - Dir.mkdir "app/assets/javascripts/rateable" unless File.directory?("app/assets/javascripts/rateable") - copy_file "rateable.js.erb", "app/assets/javascripts/rateable/rateable.js.erb" unless File.exists?("app/assets/javascripts/rateable/rateable.js.erb") - copy_file "jRating.js.erb", "app/assets/javascripts/rateable/jRating.js.erb" unless File.exists?("app/assets/javascripts/rateable/jRating.js.erb") - end - - end - end -end diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb b/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb deleted file mode 100644 index 1b91bdadc..000000000 --- a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb +++ /dev/null @@ -1,17 +0,0 @@ -class CreateSeemsRateableCachedRatings < ActiveRecord::Migration - def self.up - create_table :seems_rateable_cached_ratings do |t| - t.belongs_to :cacheable, :polymorphic => true - t.float :avg, :null => false - t.integer :cnt, :null => false - t.string :dimension - t.integer :cacheable_id, :limit => 8 - t.string :cacheable_type - t.timestamps - end - end - - def self.down - drop_table :cached_ratings - end -end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/engine.rb b/lib/plugins/seems_rateable-master/lib/seems_rateable/engine.rb deleted file mode 100644 index 185d6f9d9..000000000 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable/engine.rb +++ /dev/null @@ -1,17 +0,0 @@ -module SeemsRateable - class Engine < ::Rails::Engine - isolate_namespace SeemsRateable - - config.generators do |g| - g.test_framework :rspec, :fixture => false - g.fixture_replacement :factory_girl, :dir => 'spec/factories' - end - - initializer :seems_rateable do - ActiveRecord::Base.send :include, SeemsRateable::Model - ActionView::Base.send :include, SeemsRateable::Helpers - ActionDispatch::Routing::Mapper.send :include, SeemsRateable::Routes - end - - end -end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/errors.rb b/lib/plugins/seems_rateable-master/lib/seems_rateable/errors.rb deleted file mode 100644 index 8a83059ba..000000000 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable/errors.rb +++ /dev/null @@ -1,21 +0,0 @@ -module SeemsRateable - module Errors - class InvalidRateableObjectError < StandardError - def to_s - "Stated object is not rateable. Add 'seems_rateable' to your object's class model." - end - end - - class NoCurrentUserInstanceError < StandardError - def to_s - "User instance current_user is not available." - end - end - - class AlreadyRatedError < StandardError - def to_s - "User has already rated an object." - end - end - end -end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/helpers.rb b/lib/plugins/seems_rateable-master/lib/seems_rateable/helpers.rb deleted file mode 100644 index 399f06fd8..000000000 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable/helpers.rb +++ /dev/null @@ -1,27 +0,0 @@ -module SeemsRateable - module Helpers - def rating_for(obj, opts={}) - raise Errors::InvalidRateableObjectError unless obj.class.respond_to?(:rateable?) - - options = { - :dimension => nil, - :static => false, - :class => 'rateable', - :id => nil - }.update(opts) - - content_tag :div, "", "data-average" => obj.average(options[:dimension]) ? obj.average(options[:dimension]).avg : 0, :id => options[:id], - :class => "#{options[:class]}#{jdisabled?(options[:static])}", - "data-id" => obj.id, "data-kls" => obj.class.name, "data-dimension" => options[:dimension] - end - - def seems_rateable_stylesheet - stylesheet_link_tag "seems_rateable/application", media: "all", "data-turbolinks-track" => true - end - - private - def jdisabled?(option) - " jDisabled" if option || !current_user - end - end -end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/model.rb b/lib/plugins/seems_rateable-master/lib/seems_rateable/model.rb deleted file mode 100644 index fa1b7af11..000000000 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable/model.rb +++ /dev/null @@ -1,111 +0,0 @@ -require 'active_support/concern' -module SeemsRateable - module Model - extend ActiveSupport::Concern - - def rate(stars, user_id, dimension=nil) - if !has_rated?(user_id, dimension) - self.rates.create do |r| - r.stars = stars - r.rater_id = user_id - end - update_overall_average_rating(stars, dimension) - elsif has_rated?(user_id, dimension) && can_update? - update_users_rating(stars, user_id, dimension) - else - raise Errors::AlreadyRatedError - end - end - - def update_overall_average_rating(stars, dimension=nil) - if average(dimension).nil? - CachedRating.create do |r| - r.avg = stars - r.dimension = dimension - r.cacheable_id = self.id - r.cacheable_type = self.class.name - r.cnt = 1 - end - else - r = average(dimension) - r.avg = (r.avg * r.cnt + stars) / (r.cnt+1) - r.cnt += 1 - r.save! - end - end - - def update_users_rating(stars, user_id, dimension=nil) - obj = rates(dimension).where(:rater_id => user_id).first - current_record = average(dimension) - current_record.avg = (current_record.avg*current_record.cnt - obj.stars + stars) / (current_record.cnt) - current_record.save! - obj.stars = stars - obj.save! - end - - - def average(dimension=nil) - if dimension.nil? - self.send "rate_average_without_dimension" - else - self.send "#{dimension}_average" - end - end - - def rates(dimension=nil) - if dimension.nil? - self.send "rates_without_dimension" - else - self.send "#{dimension}_rates" - end - end - - def raters(dimension=nil) - if dimension.nil? - self.send "raters_without_dimension" - else - self.send "#{dimension}_raters" - end - end - - def has_rated?(user_id, dimension=nil) - record = self.rates(dimension).where(:rater_id => user_id) - record.empty? ? false : true - end - - def can_update? - self.class.can_update? - end - - module ClassMethods - def seems_rateable(opts={}) - #has_many :rates_without_dimension, -> { where(dimension: nil) }, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy - has_many :rates_without_dimension, :conditions => { dimension: nil }, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy - has_many :raters_without_dimension, :through => :rates_without_dimension, :source => :rater - has_one :rate_average_without_dimension, :conditions => { dimension: nil }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy - - @permission = opts[:allow_update] ? true : false - - def self.can_update? - @permission - end - - def self.rateable? - true - end - - if opts[:dimensions].is_a?(Array) - opts[:dimensions].each do |dimension| - has_many :"#{dimension}_rates", :conditions => { dimension: dimension.to_s }, :dependent => :destroy, :class_name => SeemsRateable::Rate, :as => :rateable - has_many :"#{dimension}_raters", :through => :"#{dimension}_rates", :source => :rater - has_one :"#{dimension}_average", :conditions => { dimension: dimension.to_s }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy - end - end - end - - def seems_rateable_rater - has_many :ratings_given, :class_name => SeemsRateable::Rate, :foreign_key => :rater_id - end - end - end -end diff --git a/lib/plugins/seems_rateable-master/lib/tasks/seems_rateable_tasks.rake b/lib/plugins/seems_rateable-master/lib/tasks/seems_rateable_tasks.rake deleted file mode 100644 index 98c5403ac..000000000 --- a/lib/plugins/seems_rateable-master/lib/tasks/seems_rateable_tasks.rake +++ /dev/null @@ -1,4 +0,0 @@ -# desc "Explaining what the task does" -# task :seems_rateable do -# # Task goes here -# end diff --git a/lib/plugins/seems_rateable-master/Gemfile b/lib/seems_rateable/Gemfile similarity index 100% rename from lib/plugins/seems_rateable-master/Gemfile rename to lib/seems_rateable/Gemfile diff --git a/lib/plugins/seems_rateable-master/MIT-LICENSE b/lib/seems_rateable/MIT-LICENSE similarity index 100% rename from lib/plugins/seems_rateable-master/MIT-LICENSE rename to lib/seems_rateable/MIT-LICENSE diff --git a/lib/plugins/seems_rateable-master/README.md b/lib/seems_rateable/README.md similarity index 95% rename from lib/plugins/seems_rateable-master/README.md rename to lib/seems_rateable/README.md index 3e78d0250..aacc7407b 100644 --- a/lib/plugins/seems_rateable-master/README.md +++ b/lib/seems_rateable/README.md @@ -45,7 +45,7 @@ Don't forget to run $ rake db:migrate -To prepare model add seems_rateable to your rateable model file. You can also pass a hash of options to +To prepare model add seems_rateable to your rateable model file. You can also pass a hash of options to customize the functionality
      @@ -76,7 +76,7 @@ And to object's raters e.g @object.raters(:quantity) To track user's given ratings add seems_rateable_rater to your rater model. -If your rater class is not "User"(e.g "Client" or "Customer") change configuration in initializer generated by this engine. +If your rater class is not "User"(e.g "Client" or "Customer") change configuration in initializer generated by this engine. Now you can access user's ratings by @user.ratings_given ### Usage @@ -84,13 +84,13 @@ Now you can access user's ratings by @user.ratings_given To display star rating use helper method rating_for in your view #index.html.erb - + rating_for @post - + rating_for @post, :dimension => :quality, :class => 'post', :id => 'list' - + rating_for @post, :static => true - + You can specify these options :
      • :dimensionThe dimension of the object
      • diff --git a/lib/seems_rateable/Rakefile b/lib/seems_rateable/Rakefile new file mode 100644 index 000000000..cc267251e --- /dev/null +++ b/lib/seems_rateable/Rakefile @@ -0,0 +1,17 @@ +begin + require 'bundler/setup' +rescue LoadError + puts 'You must `gem install bundler` and `bundle install` to run rake tasks' +end + +require 'rdoc/task' + +RDoc::Task.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'SeemsRateable' + rdoc.options << '--line-numbers' + rdoc.rdoc_files.include('README.md') + rdoc.rdoc_files.include('lib/**/*.rb') +end + +Bundler::GemHelper.install_tasks diff --git a/lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/bg_jRatingInfos.png b/lib/seems_rateable/app/assets/images/seems_rateable/bg_jRatingInfos.png similarity index 100% rename from lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/bg_jRatingInfos.png rename to lib/seems_rateable/app/assets/images/seems_rateable/bg_jRatingInfos.png diff --git a/lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/small.png b/lib/seems_rateable/app/assets/images/seems_rateable/small.png similarity index 100% rename from lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/small.png rename to lib/seems_rateable/app/assets/images/seems_rateable/small.png diff --git a/lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/stars.png b/lib/seems_rateable/app/assets/images/seems_rateable/stars.png similarity index 100% rename from lib/plugins/seems_rateable-master/app/assets/images/seems_rateable/stars.png rename to lib/seems_rateable/app/assets/images/seems_rateable/stars.png diff --git a/lib/plugins/seems_rateable-master/app/assets/javascripts/seems_rateable/application.js b/lib/seems_rateable/app/assets/javascripts/seems_rateable/application.js similarity index 100% rename from lib/plugins/seems_rateable-master/app/assets/javascripts/seems_rateable/application.js rename to lib/seems_rateable/app/assets/javascripts/seems_rateable/application.js diff --git a/lib/plugins/seems_rateable-master/app/assets/stylesheets/seems_rateable/application.css b/lib/seems_rateable/app/assets/stylesheets/seems_rateable/application.css similarity index 60% rename from lib/plugins/seems_rateable-master/app/assets/stylesheets/seems_rateable/application.css rename to lib/seems_rateable/app/assets/stylesheets/seems_rateable/application.css index 64099e546..aeb6475f3 100644 --- a/lib/plugins/seems_rateable-master/app/assets/stylesheets/seems_rateable/application.css +++ b/lib/seems_rateable/app/assets/stylesheets/seems_rateable/application.css @@ -20,43 +20,43 @@ .jRatingAverage { - background-color:#f62929; - position:relative; - top:0; - left:0; - z-index:2; - height:100%; + background-color:#f62929; + position:relative; + top:0; + left:0; + z-index:2; + height:100%; } .jRatingColor { - background-color:#FFD400; /* bgcolor of the stars*/ - position:relative; - top:0; - left:0; - z-index:2; - height:100%; + background-color:#FFD400; /* bgcolor of the stars*/ + position:relative; + top:0; + left:0; + z-index:2; + height:100%; } /** Div containing the stars **/ .jStar { - position:relative; - left:0; - z-index:3; + position:relative; + left:0; + z-index:3; } /** P containing the rate informations **/ p.jRatingInfos { - position: absolute; - z-index:9999; - background: transparent url('bg_jRatingInfos.png') no-repeat; - color: #CACACA; - display: none; - width: 91px; - height: 29px; - font-size:16px; - text-align:center; - padding-top:5px; + position: absolute; + z-index:9999; + background: transparent url('bg_jRatingInfos.png') no-repeat; + color: #CACACA; + display: none; + width: 91px; + height: 29px; + font-size:16px; + text-align:center; + padding-top:5px; } p.jRatingInfos span.maxRate { - color:#c9c9c9; - font-size:14px; + color:#c9c9c9; + font-size:14px; } diff --git a/lib/seems_rateable/app/controllers/seems_rateable/application_controller.rb b/lib/seems_rateable/app/controllers/seems_rateable/application_controller.rb new file mode 100644 index 000000000..7f0af9fc5 --- /dev/null +++ b/lib/seems_rateable/app/controllers/seems_rateable/application_controller.rb @@ -0,0 +1,7 @@ +module SeemsRateable + class ApplicationController < ::ApplicationController + rescue_from SeemsRateable::Errors::AlreadyRatedError do |exception| + render :json => {:error => true} + end + end +end diff --git a/lib/seems_rateable/app/controllers/seems_rateable/ratings_controller.rb b/lib/seems_rateable/app/controllers/seems_rateable/ratings_controller.rb new file mode 100644 index 000000000..f96dfdc84 --- /dev/null +++ b/lib/seems_rateable/app/controllers/seems_rateable/ratings_controller.rb @@ -0,0 +1,13 @@ +require_dependency "seems_rateable/application_controller" + +module SeemsRateable + class RatingsController < ApplicationController + def create + raise NoCurrentUserInstanceError unless current_user + obj = params[:kls].classify.constantize.find(params[:idBox]) + obj.rate(params[:rate].to_i, current_user.id, params[:dimension]) + + render :json => true + end + end +end diff --git a/lib/plugins/seems_rateable-master/app/models/seems_rateable/cached_rating.rb b/lib/seems_rateable/app/models/seems_rateable/cached_rating.rb similarity index 60% rename from lib/plugins/seems_rateable-master/app/models/seems_rateable/cached_rating.rb rename to lib/seems_rateable/app/models/seems_rateable/cached_rating.rb index fa56e7d44..c48ff0734 100644 --- a/lib/plugins/seems_rateable-master/app/models/seems_rateable/cached_rating.rb +++ b/lib/seems_rateable/app/models/seems_rateable/cached_rating.rb @@ -1,5 +1,5 @@ module SeemsRateable class CachedRating < ActiveRecord::Base - belongs_to :cacheable, :polymorphic => true + belongs_to :cacheable, :polymorphic => true end end diff --git a/lib/seems_rateable/app/models/seems_rateable/rate.rb b/lib/seems_rateable/app/models/seems_rateable/rate.rb new file mode 100644 index 000000000..8259ca1e7 --- /dev/null +++ b/lib/seems_rateable/app/models/seems_rateable/rate.rb @@ -0,0 +1,6 @@ +module SeemsRateable + class Rate < ActiveRecord::Base + belongs_to :rater, :class_name => SeemsRateable::Engine.config.owner_class + belongs_to :rateable, :polymorphic => true + end +end diff --git a/lib/plugins/seems_rateable-master/bin/rails b/lib/seems_rateable/bin/rails similarity index 100% rename from lib/plugins/seems_rateable-master/bin/rails rename to lib/seems_rateable/bin/rails diff --git a/lib/plugins/seems_rateable-master/config/routes.rb b/lib/seems_rateable/config/routes.rb similarity index 100% rename from lib/plugins/seems_rateable-master/config/routes.rb rename to lib/seems_rateable/config/routes.rb diff --git a/lib/seems_rateable/lib/generators/seems_rateable/install/install_generator.rb b/lib/seems_rateable/lib/generators/seems_rateable/install/install_generator.rb new file mode 100644 index 000000000..613bdac72 --- /dev/null +++ b/lib/seems_rateable/lib/generators/seems_rateable/install/install_generator.rb @@ -0,0 +1,42 @@ +require 'rails/generators/migration' +require 'fileutils' + +module SeemsRateable + module Generators + class InstallGenerator < ::Rails::Generators::Base + include Rails::Generators::Migration + source_root File.expand_path('../templates', __FILE__) + + def self.next_migration_number(path) + unless @prev_migration_nr + @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i + else + @prev_migration_nr += 1 + end + @prev_migration_nr.to_s + end + + def routegen + route("seems_rateable") + end + + desc "generating migration files" + def copy_migrations + migration_template "rates_migration.rb", "db/migrate/create_seems_rateable_rates.rb" + migration_template "cached_ratings_migration.rb", "db/migrate/create_seems_rateable_cached_ratings.rb" + end + + desc "generating initializer" + def copy_initializer + template "initializer.rb", "config/initializers/seems_rateable.rb" + end + + desc "generating javascript files" + def copy_javascript_asset + Dir.mkdir "app/assets/javascripts/rateable" unless File.directory?("app/assets/javascripts/rateable") + copy_file "rateable.js.erb", "app/assets/javascripts/rateable/rateable.js.erb" unless File.exists?("app/assets/javascripts/rateable/rateable.js.erb") + copy_file "jRating.js.erb", "app/assets/javascripts/rateable/jRating.js.erb" unless File.exists?("app/assets/javascripts/rateable/jRating.js.erb") + end + end + end +end diff --git a/lib/seems_rateable/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb new file mode 100644 index 000000000..e3e7ab2ee --- /dev/null +++ b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/cached_ratings_migration.rb @@ -0,0 +1,17 @@ +class CreateSeemsRateableCachedRatings < ActiveRecord::Migration + def self.up + create_table :seems_rateable_cached_ratings do |t| + t.belongs_to :cacheable, :polymorphic => true + t.float :avg, :null => false + t.integer :cnt, :null => false + t.string :dimension + t.integer :cacheable_id, :limit => 8 + t.string :cacheable_type + t.timestamps + end + end + + def self.down + drop_table :cached_ratings + end +end diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/initializer.rb b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/initializer.rb similarity index 100% rename from lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/initializer.rb rename to lib/seems_rateable/lib/generators/seems_rateable/install/templates/initializer.rb diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/jRating.js.erb b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/jRating.js.erb similarity index 95% rename from lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/jRating.js.erb rename to lib/seems_rateable/lib/generators/seems_rateable/install/templates/jRating.js.erb index 4f43a4f97..b5b778889 100644 --- a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/jRating.js.erb +++ b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/jRating.js.erb @@ -12,9 +12,9 @@ $.fn.jRating = function(op) { var defaults = { /** String vars **/ - bigStarsPath : '<%= image_path "seems_rateable/stars.png" %>', // path of the icon stars.png - smallStarsPath : '<%= image_path "seems_rateable/small.png" %>', // path of the icon small.png - path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>', + bigStarsPath : 'images/seems_rateable/stars.png', // path of the icon stars.png + smallStarsPath : 'images/seems_rateable/small.png', // path of the icon small.png + path : '/ratings', type : 'big', // can be set to 'small' or 'big' /** Boolean vars **/ diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rateable.js.erb b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/rateable.js.erb similarity index 93% rename from lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rateable.js.erb rename to lib/seems_rateable/lib/generators/seems_rateable/install/templates/rateable.js.erb index da6cc3097..e926601d2 100644 --- a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rateable.js.erb +++ b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/rateable.js.erb @@ -11,7 +11,7 @@ $(document).ready(function(){ //showRateInfo:false, //Rate info panel, set true to display //rateInfosX : 45, //In pixel - Absolute left position of the information box during mousemove. //rateInfosY : 5, //In pixel - Absolute top position of the information box during mousemove. - path : '<%= SeemsRateable::Engine.routes.url_helpers.ratings_path %>', + path : '/ratings', onSuccess : function(element, rate){ //something like -> //alert('success'); @@ -21,5 +21,5 @@ $(document).ready(function(){ $('You have already rated!').insertAfter(element) } }); - + }); diff --git a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rates_migration.rb b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/rates_migration.rb similarity index 98% rename from lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rates_migration.rb rename to lib/seems_rateable/lib/generators/seems_rateable/install/templates/rates_migration.rb index 40303f11c..21990b0ad 100644 --- a/lib/plugins/seems_rateable-master/lib/generators/seems_rateable/install/templates/rates_migration.rb +++ b/lib/seems_rateable/lib/generators/seems_rateable/install/templates/rates_migration.rb @@ -15,4 +15,4 @@ class CreateSeemsRateableRates < ActiveRecord::Migration def self.down drop_table :rates end -end +end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable.rb b/lib/seems_rateable/lib/seems_rateable.rb similarity index 85% rename from lib/plugins/seems_rateable-master/lib/seems_rateable.rb rename to lib/seems_rateable/lib/seems_rateable.rb index 5f84a8b8c..2939d773f 100644 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable.rb +++ b/lib/seems_rateable/lib/seems_rateable.rb @@ -1,8 +1,10 @@ begin - require 'rails' + require 'rails' rescue LoadError end +require "jquery-rails" + require "seems_rateable/engine" require "seems_rateable/errors" require "seems_rateable/helpers" diff --git a/lib/seems_rateable/lib/seems_rateable/engine.rb b/lib/seems_rateable/lib/seems_rateable/engine.rb new file mode 100644 index 000000000..f32ccb929 --- /dev/null +++ b/lib/seems_rateable/lib/seems_rateable/engine.rb @@ -0,0 +1,16 @@ +module SeemsRateable + class Engine < ::Rails::Engine + isolate_namespace SeemsRateable + + config.generators do |g| + g.test_framework :rspec, :fixture => false + g.fixture_replacement :factory_girl, :dir => 'spec/factories' + end + + initializer :seems_rateable do + ActiveRecord::Base.send :include, SeemsRateable::Model + ActionView::Base.send :include, SeemsRateable::Helpers + ActionDispatch::Routing::Mapper.send :include, SeemsRateable::Routes + end + end +end diff --git a/lib/seems_rateable/lib/seems_rateable/errors.rb b/lib/seems_rateable/lib/seems_rateable/errors.rb new file mode 100644 index 000000000..9fcb0c380 --- /dev/null +++ b/lib/seems_rateable/lib/seems_rateable/errors.rb @@ -0,0 +1,21 @@ +module SeemsRateable + module Errors + class InvalidRateableObjectError < StandardError + def to_s + "Stated object is not rateable. Add 'seems_rateable' to your object's class model." + end + end + + class NoCurrentUserInstanceError < StandardError + def to_s + "User instance current_user is not available." + end + end + + class AlreadyRatedError < StandardError + def to_s + "User has already rated an object." + end + end + end +end diff --git a/lib/seems_rateable/lib/seems_rateable/helpers.rb b/lib/seems_rateable/lib/seems_rateable/helpers.rb new file mode 100644 index 000000000..3d79adf79 --- /dev/null +++ b/lib/seems_rateable/lib/seems_rateable/helpers.rb @@ -0,0 +1,27 @@ +module SeemsRateable + module Helpers + def rating_for(obj, opts={}) + raise Errors::InvalidRateableObjectError unless obj.class.respond_to?(:rateable?) + + options = { + :dimension => nil, + :static => false, + :class => 'rateable', + :id => nil + }.update(opts) + + content_tag :div, "", "data-average" => obj.average(options[:dimension]) ? obj.average(options[:dimension]).avg : 0, :id => options[:id], + :class => "#{options[:class]}#{jdisabled?(options[:static])}", + "data-id" => obj.id, "data-kls" => obj.class.name, "data-dimension" => options[:dimension] + end + + def seems_rateable_stylesheet + stylesheet_link_tag "seems_rateable/application", media: "all", "data-turbolinks-track" => true + end + + private + def jdisabled?(option) + " jDisabled" if option || !current_user + end + end +end diff --git a/lib/seems_rateable/lib/seems_rateable/model.rb b/lib/seems_rateable/lib/seems_rateable/model.rb new file mode 100644 index 000000000..b4ebbb196 --- /dev/null +++ b/lib/seems_rateable/lib/seems_rateable/model.rb @@ -0,0 +1,91 @@ +require 'active_support/concern' + +module SeemsRateable + module Model + extend ActiveSupport::Concern + + def rate(stars, user_id, dimension=nil) + if !has_rated?(user_id, dimension) + self.rates.create do |r| + r.stars = stars + r.rater_id = user_id + r.dimension = dimension + end + update_overall_average_rating(stars, dimension) + elsif has_rated?(user_id, dimension) && can_update? + update_users_rating(stars, user_id, dimension) + else + raise Errors::AlreadyRatedError + end + end + + def update_overall_average_rating(stars, dimension=nil) + r = average(dimension) + if r.nil? + self.rate_averages.create do |r| + r.avg = stars + r.dimension = dimension + r.cnt = 1 + end + else + r.avg = (r.avg * r.cnt + stars) / (r.cnt+1) + r.cnt += 1 + r.save! + r + end + end + + def update_users_rating(stars, user_id, dimension=nil) + obj = rates(dimension).where(:rater_id => user_id).first + current_record = average(dimension) + current_record.avg = (current_record.avg*current_record.cnt - obj.stars + stars) / (current_record.cnt) + current_record.save! + obj.stars = stars + obj.save! + end + + + def average(dimension=nil) + rate_averages.where(dimension: dimension).first + end + + def rates(dimension=nil) + rates_all.where(dimension: dimension) + end + + def raters(dimension=nil) + raters_all.where('seems_rateable_rates.dimension = ?', dimension) + end + + def has_rated?(user_id, dimension=nil) + record = self.rates(dimension).where(:rater_id => user_id) + record.empty? ? false : true + end + + def can_update? + self.class.can_update? + end + + module ClassMethods + def seems_rateable(opts={}) + has_many :rates_all, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy + has_many :raters_all, :through => :rates_all, :class_name => SeemsRateable::Engine.config.owner_class, :source => :rater + has_many :rate_averages, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy + + self.class_variable_set(:@@permission, opts[:allow_update] ? true : false) + + def self.can_update? + self.class_variable_get(:@@permission) + end + + def self.rateable? + true + end + end + + def seems_rateable_rater + has_many :ratings_given, :class_name => SeemsRateable::Rate, :foreign_key => :rater_id + end + end + end +end diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/routes.rb b/lib/seems_rateable/lib/seems_rateable/routes.rb similarity index 100% rename from lib/plugins/seems_rateable-master/lib/seems_rateable/routes.rb rename to lib/seems_rateable/lib/seems_rateable/routes.rb diff --git a/lib/plugins/seems_rateable-master/lib/seems_rateable/version.rb b/lib/seems_rateable/lib/seems_rateable/version.rb similarity index 54% rename from lib/plugins/seems_rateable-master/lib/seems_rateable/version.rb rename to lib/seems_rateable/lib/seems_rateable/version.rb index 180e47824..8a635c656 100644 --- a/lib/plugins/seems_rateable-master/lib/seems_rateable/version.rb +++ b/lib/seems_rateable/lib/seems_rateable/version.rb @@ -1,3 +1,3 @@ module SeemsRateable - VERSION = "1.0.9" + VERSION = "1.0.13" end diff --git a/lib/plugins/seems_rateable-master/seems_rateable.gemspec b/lib/seems_rateable/seems_rateable.gemspec similarity index 100% rename from lib/plugins/seems_rateable-master/seems_rateable.gemspec rename to lib/seems_rateable/seems_rateable.gemspec diff --git a/public/images/footer_logo/inforbus.png b/public/images/footer_logo/inforbus.png index ba1ce65f95b9342a859c2d2dfce9521fc09f90c2..f756b12d287cfbacbfe3996c69482f65c545d2fd 100644 GIT binary patch literal 56477 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 delta 6069 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 diff --git a/public/images/footer_logo/iscas.png b/public/images/footer_logo/iscas.png index f3cbac371f21ab19c19a48b88384279c390cef76..9e1be99e34231be477bc240d3372bad45fad6c6e 100644 GIT binary patch literal 53769 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 delta 4762 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 diff --git a/public/javascripts/seems_rateable/jRating.js b/public/javascripts/seems_rateable/jRating.js index 85612d066..9c4fedeb0 100644 --- a/public/javascripts/seems_rateable/jRating.js +++ b/public/javascripts/seems_rateable/jRating.js @@ -14,7 +14,7 @@ /** String vars **/ bigStarsPath : '/images/seems_rateable/stars.png', // path of the icon stars.png smallStarsPath : '/images/seems_rateable/small.png', // path of the icon small.png - path : '/ratings', + path : '/rateable/ratings', type : 'big', // can be set to 'small' or 'big' /** Boolean vars **/ diff --git a/public/javascripts/seems_rateable/rateable.js b/public/javascripts/seems_rateable/rateable.js index e926601d2..25377f3f0 100644 --- a/public/javascripts/seems_rateable/rateable.js +++ b/public/javascripts/seems_rateable/rateable.js @@ -11,7 +11,7 @@ $(document).ready(function(){ //showRateInfo:false, //Rate info panel, set true to display //rateInfosX : 45, //In pixel - Absolute left position of the information box during mousemove. //rateInfosY : 5, //In pixel - Absolute top position of the information box during mousemove. - path : '/ratings', + path : '/rateable/ratings', onSuccess : function(element, rate){ //something like -> //alert('success'); From b318166c15df004e4675c70c02a4257e77a4f673 Mon Sep 17 00:00:00 2001 From: wanglinchun Date: Wed, 23 Apr 2014 09:18:43 +0800 Subject: [PATCH 34/48] =?UTF-8?q?=E7=BB=99=E5=8F=82=E4=B8=8E=E7=AB=9E?= =?UTF-8?q?=E8=B5=9B=E7=9A=84=E5=BA=94=E7=94=A8=E9=A1=B5=E9=9D=A2=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AF=BC=E8=88=AA=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._base_softapplication_top_content.html.erb | 20 ++++++++++++ app/views/layouts/base_contest.html.erb | 30 ++++++++--------- app/views/layouts/base_newcontest.html.erb | 32 +++++++++---------- app/views/softapplications/show.html.erb | 1 + 4 files changed, 52 insertions(+), 31 deletions(-) create mode 100644 app/views/layouts/_base_softapplication_top_content.html.erb diff --git a/app/views/layouts/_base_softapplication_top_content.html.erb b/app/views/layouts/_base_softapplication_top_content.html.erb new file mode 100644 index 000000000..064e84cf0 --- /dev/null +++ b/app/views/layouts/_base_softapplication_top_content.html.erb @@ -0,0 +1,20 @@ +
        +
    <%= @softapplication.name %> + <%= link_to '删除', softapplication_path(@softapplication), method: :delete, data: { confirm: '您确定要删除吗?' } if @softapplication.destroyable_by? User.current %>  + <%= link_to '编辑', edit_softapplication_path(@softapplication), method: :get if @softapplication.destroyable_by? User.current %> +
    所属类别:<%= @softapplication.app_type_name %>
    所属类别:<%= @softapplication.app_type_name %>发布时间:<%=format_time @softapplication.created_at %>所属竞赛:<%= contest ? link_to(contest.name, show_contest_contest_path(contest)) : '尚未加入竞赛'%>
    发布人员:<%= @softapplication.user.name %>
    平均评分: <%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %>发布时间:<%=format_time @softapplication.created_at %>
    + + + + + + + + + + +
    创新竞赛社区<%= l(:label_user_location) %> :
    <%=link_to request.host()+"/contests", :controller=>'contests', :action=>'index' %><%=link_to l(:field_homepage), home_path %> > + <%=link_to l(:label_contest_innovate), :controller=>'contests', :action=>'index' %> > + + <% contest = @softapplication.contests.first %><%= contest ? link_to(contest.name, show_contest_contest_path(contest)) : '尚未加入竞赛'%> + + +
    +
    \ No newline at end of file diff --git a/app/views/layouts/base_contest.html.erb b/app/views/layouts/base_contest.html.erb index b4ba3dd4b..2bda701fe 100644 --- a/app/views/layouts/base_contest.html.erb +++ b/app/views/layouts/base_contest.html.erb @@ -26,23 +26,23 @@
    - - - + + + - - + +
    创新竞赛社区<%= l(:label_user_location) %> : - - 创新竞赛社区<%= l(:label_user_location) %> : + +
    <%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %><%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> > - <%= link_to @bid.name, bid_path %><%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %><%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> > + <%= link_to @bid.name, bid_path %>
    diff --git a/app/views/layouts/base_newcontest.html.erb b/app/views/layouts/base_newcontest.html.erb index ba78cefea..147df5245 100644 --- a/app/views/layouts/base_newcontest.html.erb +++ b/app/views/layouts/base_newcontest.html.erb @@ -27,24 +27,24 @@
    - - - + + + - - + +
    创新竞赛社区<%= l(:label_user_location) %> : - - 创新竞赛社区<%= l(:label_user_location) %> : + +
    <%=link_to request.host()+"/contests", :controller=>'contests', :action=>'index' %><%=link_to l(:field_homepage), home_path %> > - <%=link_to l(:label_contest_innovate), :controller=>'contests', :action=>'index' %> > - <%= link_to @contest.name, show_contest_contest_path %> - <%=link_to request.host()+"/contests", :controller=>'contests', :action=>'index' %><%=link_to l(:field_homepage), home_path %> > + <%=link_to l(:label_contest_innovate), :controller=>'contests', :action=>'index' %> > + <%= link_to @contest.name, show_contest_contest_path %> +
    diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb index 51195dfcf..b39ab6c61 100644 --- a/app/views/softapplications/show.html.erb +++ b/app/views/softapplications/show.html.erb @@ -1,3 +1,4 @@ +<%=render :partial => 'layouts/base_softapplication_top_content'%>