<%= @homework.name %>
截止时间:<%= @homework.end_time %>
diff --git a/db/schema.rb b/db/schema.rb
index db0b57ae8..4a718824a 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1,1681 +1,1688 @@
-# 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 => 20150907064547) 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
- t.integer "activity_container_id"
- t.string "activity_container_type", :default => ""
- t.datetime "created_at"
- 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 "activity_notifies", :force => true do |t|
- t.integer "activity_container_id"
- t.string "activity_container_type"
- t.integer "activity_id"
- t.string "activity_type"
- t.integer "notify_to"
- t.datetime "created_on"
- t.integer "is_read"
- end
-
- add_index "activity_notifies", ["activity_container_id", "activity_container_type"], :name => "index_an_activity_container_id"
- add_index "activity_notifies", ["created_on"], :name => "index_an_created_on"
- add_index "activity_notifies", ["notify_to"], :name => "index_an_notify_to"
-
- create_table "api_keys", :force => true do |t|
- t.string "access_token"
- t.datetime "expires_at"
- t.integer "user_id"
- t.boolean "active", :default => true
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token"
- add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id"
-
- create_table "applied_projects", :force => true do |t|
- t.integer "project_id", :null => false
- t.integer "user_id", :null => false
- end
-
- 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
- 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"
- t.integer "attachtype", :default => 1
- t.integer "is_public", :default => 1
- t.integer "copy_from"
- t.integer "quotes"
- 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 "attachmentstypes", :force => true do |t|
- t.integer "typeId", :null => false
- t.string "typeName", :limit => 50
- end
-
- 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.text "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"
- t.integer "is_evaluation"
- t.integer "proportion", :default => 60
- t.integer "comment_status", :default => 0
- t.integer "evaluation_num", :default => 3
- t.integer "open_anonymous_evaluation", :default => 1
- 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"
- t.integer "course_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 "bug_to_osps", :force => true do |t|
- t.integer "osp_id"
- t.integer "relative_memo_id"
- t.string "description"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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 "code_review_assignments", :force => true do |t|
- t.integer "issue_id"
- t.integer "change_id"
- t.integer "attachment_id"
- t.string "file_path"
- t.string "rev"
- t.string "rev_to"
- t.string "action_type"
- t.integer "changeset_id"
- end
-
- create_table "code_review_project_settings", :force => true do |t|
- t.integer "project_id"
- t.integer "tracker_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "updated_by"
- t.boolean "hide_code_review_tab", :default => false
- t.integer "auto_relation", :default => 1
- t.integer "assignment_tracker_id"
- t.text "auto_assign"
- t.integer "lock_version", :default => 0, :null => false
- t.boolean "tracker_in_review_dialog", :default => false
- end
-
- create_table "code_review_user_settings", :force => true do |t|
- t.integer "user_id", :default => 0, :null => false
- t.integer "mail_notification", :default => 0, :null => false
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- create_table "code_reviews", :force => true do |t|
- t.integer "project_id"
- t.integer "change_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "line"
- t.integer "updated_by_id"
- t.integer "lock_version", :default => 0, :null => false
- t.integer "status_changed_from"
- t.integer "status_changed_to"
- t.integer "issue_id"
- t.string "action_type"
- t.string "file_path"
- t.string "rev"
- t.string "rev_to"
- t.integer "attachment_id"
- t.integer "file_count", :default => 0, :null => false
- t.boolean "diff_all"
- end
-
- 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 "contest_notifications", :force => true do |t|
- t.text "title"
- t.text "content"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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 "contestnotifications", :force => true do |t|
- t.integer "contest_id"
- t.string "title"
- t.string "summary"
- t.text "description"
- t.integer "author_id"
- t.integer "notificationcomments_count"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "contests", :force => true do |t|
- t.string "name"
- t.string "budget", :default => ""
- 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 "course_activities", :force => true do |t|
- t.integer "user_id"
- t.integer "course_id"
- t.integer "course_act_id"
- t.string "course_act_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "course_attachments", :force => true do |t|
- t.string "filename"
- t.string "disk_filename"
- t.integer "filesize"
- t.string "content_type"
- t.string "digest"
- t.integer "downloads"
- t.string "author_id"
- t.string "integer"
- t.string "description"
- t.string "disk_directory"
- t.integer "attachtype"
- t.integer "is_public"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "container_id", :default => 0
- end
-
- create_table "course_groups", :force => true do |t|
- t.string "name"
- t.integer "course_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "course_infos", :force => true do |t|
- t.integer "course_id"
- t.integer "user_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "course_messages", :force => true do |t|
- t.integer "user_id"
- t.integer "course_id"
- t.integer "course_message_id"
- t.string "course_message_type"
- t.integer "viewed"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "content"
- t.integer "status"
- end
-
- create_table "course_statuses", :force => true do |t|
- t.integer "changesets_count"
- t.integer "watchers_count"
- t.integer "course_id"
- t.float "grade", :default => 0.0
- t.integer "course_ac_para", :default => 0
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :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"
- t.text "description"
- t.integer "status", :default => 1
- t.integer "attachmenttype", :default => 2
- t.integer "lft"
- t.integer "rgt"
- t.integer "is_public", :limit => 1, :default => 1
- t.integer "inherit_members", :limit => 1, :default => 1
- t.integer "open_student", :default => 0
- 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 "delayed_jobs", :force => true do |t|
- t.integer "priority", :default => 0, :null => false
- t.integer "attempts", :default => 0, :null => false
- t.text "handler", :null => false
- t.text "last_error"
- t.datetime "run_at"
- t.datetime "locked_at"
- t.datetime "failed_at"
- t.string "locked_by"
- t.string "queue"
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
-
- 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"
- t.integer "user_id", :default => 0
- t.integer "is_public", :default => 1
- 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 "dts", :force => true do |t|
- t.string "IPLineCode"
- t.string "Description"
- t.string "Num"
- t.string "Variable"
- t.string "TraceInfo"
- t.string "Method"
- t.string "File"
- t.string "IPLine"
- t.string "Review"
- t.string "Category"
- t.string "Defect"
- t.string "PreConditions"
- t.string "StartLine"
- t.integer "project_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "enabled_modules", :force => true do |t|
- t.integer "project_id"
- t.string "name", :null => false
- t.integer "course_id"
- 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 "first_pages", :force => true do |t|
- t.string "web_title"
- t.string "title"
- t.text "description"
- t.string "page_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "sort_type"
- t.integer "image_width", :default => 107
- t.integer "image_height", :default => 63
- t.integer "show_course", :default => 1
- t.integer "show_contest", :default => 1
- end
-
- create_table "forge_activities", :force => true do |t|
- t.integer "user_id"
- t.integer "project_id"
- t.integer "forge_act_id"
- t.string "forge_act_type"
- t.integer "org_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "forge_activities", ["forge_act_id"], :name => "index_forge_activities_on_forge_act_id"
-
- create_table "forge_messages", :force => true do |t|
- t.integer "user_id"
- t.integer "project_id"
- t.integer "forge_message_id"
- t.string "forge_message_type"
- t.integer "viewed"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "forums", :force => true do |t|
- t.string "name", :null => false
- t.text "description"
- 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
- t.integer "sticky"
- t.integer "locked"
- 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"
- t.string "name"
- t.text "description"
- t.integer "state"
- t.integer "project_id", :default => 0
- t.float "score", :default => 0.0
- t.integer "is_teacher_score", :default => 0
- end
-
- add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id"
-
- create_table "homework_commons", :force => true do |t|
- t.string "name"
- t.integer "user_id"
- t.text "description"
- t.date "publish_time"
- t.date "end_time"
- t.integer "homework_type", :default => 1
- t.string "late_penalty"
- t.integer "course_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "homework_detail_manuals", :force => true do |t|
- t.float "ta_proportion"
- t.integer "comment_status"
- t.date "evaluation_start"
- t.date "evaluation_end"
- t.integer "evaluation_num"
- t.integer "absence_penalty", :default => 1
- t.integer "homework_common_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "homework_detail_programings", :force => true do |t|
- t.string "language"
- t.text "standard_code", :limit => 2147483647
- t.integer "homework_common_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.float "ta_proportion", :default => 0.1
- t.integer "question_id"
- end
-
- create_table "homework_evaluations", :force => true do |t|
- t.string "user_id"
- t.string "homework_attach_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "homework_for_courses", :force => true do |t|
- t.integer "course_id"
- t.integer "bid_id"
- end
-
- add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id"
- add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id"
-
- create_table "homework_tests", :force => true do |t|
- t.text "input"
- t.text "output"
- t.integer "homework_common_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "result"
- t.text "error_msg"
- end
-
- create_table "homework_users", :force => true do |t|
- t.string "homework_attach_id"
- t.string "user_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "invite_lists", :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 "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"
- t.integer "project_issues_index"
- 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"
- t.integer "is_comprehensive_evaluation"
- end
-
- create_table "kindeditor_assets", :force => true do |t|
- t.string "asset"
- t.integer "file_size"
- t.string "file_type"
- t.integer "owner_id"
- t.string "asset_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "owner_type", :default => 0
- 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
- t.datetime "created_on"
- t.boolean "mail_notification", :default => false, :null => false
- t.integer "course_id", :default => -1
- t.integer "course_group_id", :default => 0
- end
-
- add_index "members", ["project_id"], :name => "index_members_on_project_id"
- add_index "members", ["user_id", "project_id", "course_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 "memo_messages", :force => true do |t|
- t.integer "user_id"
- t.integer "forum_id"
- t.integer "memo_id"
- t.string "memo_type"
- t.integer "viewed"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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 "message_alls", :force => true do |t|
- t.integer "user_id"
- t.integer "message_id"
- t.string "message_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- 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
- t.integer "course_id"
- t.datetime "updated_on"
- 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 "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 "notificationcomments", :force => true do |t|
- t.string "notificationcommented_type"
- t.integer "notificationcommented_id"
- t.integer "author_id"
- t.text "notificationcomments"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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 "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 "option_numbers", :force => true do |t|
- t.integer "user_id"
- t.integer "memo"
- t.integer "messages_for_issues"
- t.integer "issues_status"
- t.integer "replay_for_message"
- t.integer "replay_for_memo"
- t.integer "follow"
- t.integer "tread"
- t.integer "praise_by_one"
- t.integer "praise_by_two"
- t.integer "praise_by_three"
- t.integer "tread_by_one"
- t.integer "tread_by_two"
- t.integer "tread_by_three"
- t.integer "changeset"
- t.integer "document"
- t.integer "attachment"
- t.integer "issue_done_ratio"
- t.integer "post_issue"
- t.integer "score_type"
- t.integer "total_score"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "project_id"
- end
-
- create_table "organizations", :force => true do |t|
- t.string "name"
- t.string "logo_link"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "phone_app_versions", :force => true do |t|
- t.string "version"
- t.text "description"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "poll_answers", :force => true do |t|
- t.integer "poll_question_id"
- t.text "answer_text"
- t.integer "answer_position"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "poll_questions", :force => true do |t|
- t.string "question_title"
- t.integer "question_type"
- t.integer "is_necessary"
- t.integer "poll_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "question_number"
- end
-
- create_table "poll_users", :force => true do |t|
- t.integer "user_id"
- t.integer "poll_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "poll_votes", :force => true do |t|
- t.integer "user_id"
- t.integer "poll_question_id"
- t.integer "poll_answer_id"
- t.text "vote_text"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "polls", :force => true do |t|
- t.string "polls_name"
- t.string "polls_type"
- t.integer "polls_group_id"
- t.integer "polls_status"
- t.integer "user_id"
- t.datetime "published_at"
- t.datetime "closed_at"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.text "polls_description"
- t.integer "show_result", :default => 1
- 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_scores", :force => true do |t|
- t.string "project_id"
- t.integer "score"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "issue_num", :default => 0
- t.integer "issue_journal_num", :default => 0
- t.integer "news_num", :default => 0
- t.integer "documents_num", :default => 0
- t.integer "changeset_num", :default => 0
- t.integer "board_message_num", :default => 0
- 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 "projecting_softapplictions", :force => true do |t|
- t.integer "user_id"
- t.integer "softapplication_id"
- t.integer "project_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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
- t.integer "attachmenttype", :default => 1
- t.integer "user_id"
- t.integer "dts_test", :default => 0
- t.string "enterprise_name"
- t.integer "organization_id"
- t.integer "project_new_type"
- 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 "relative_memo_to_open_source_projects", :force => true do |t|
- t.integer "osp_id"
- t.integer "relative_memo_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "relative_memos", :force => true do |t|
- t.integer "osp_id"
- t.integer "parent_id"
- t.string "subject", :null => false
- t.text "content", :limit => 16777215, :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
- t.string "url"
- t.string "username"
- t.string "userhomeurl"
- t.date "date_collected"
- t.string "topic_resource"
- end
-
- 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
- t.boolean "hidden", :default => false
- end
-
- add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id"
-
- create_table "rich_rich_files", :force => true do |t|
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "rich_file_file_name"
- t.string "rich_file_content_type"
- t.integer "rich_file_file_size"
- t.datetime "rich_file_updated_at"
- t.string "owner_type"
- t.integer "owner_id"
- t.text "uri_cache"
- t.string "simplified_type", :default => "file"
- end
-
- 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
- t.string "logo_link"
- 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
- t.integer "is_teacher_score", :default => 0
- 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.text "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"
- t.string "deposit_project_url"
- t.string "deposit_project"
- t.integer "project_id"
- end
-
- create_table "student_work_tests", :force => true do |t|
- t.integer "student_work_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "status", :default => 9
- t.text "results"
- t.text "src"
- end
-
- create_table "student_works", :force => true do |t|
- t.string "name"
- t.text "description", :limit => 2147483647
- t.integer "homework_common_id"
- t.integer "user_id"
- t.float "final_score"
- t.float "teacher_score"
- t.float "student_score"
- t.float "teaching_asistant_score"
- t.integer "project_id", :default => 0
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "late_penalty", :default => 0
- t.integer "absence_penalty", :default => 0
- t.integer "system_score"
- end
-
- create_table "student_works_evaluation_distributions", :force => true do |t|
- t.integer "student_work_id"
- t.integer "user_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "student_works_scores", :force => true do |t|
- t.integer "student_work_id"
- t.integer "user_id"
- t.integer "score"
- t.text "comment"
- t.integer "reviewer_role"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- 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
-
- add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id"
- add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id"
-
- 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"
- add_index "taggings", ["taggable_type"], :name => "index_taggings_on_taggable_type"
-
- 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_activities", :force => true do |t|
- t.string "act_type"
- t.integer "act_id"
- t.string "container_type"
- t.integer "container_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "user_id"
- 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"
- t.string "description", :default => ""
- end
-
- create_table "user_feedback_messages", :force => true do |t|
- t.integer "user_id"
- t.integer "journals_for_message_id"
- t.string "journals_for_message_type"
- t.integer "viewed"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- 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_levels", :force => true do |t|
- t.integer "user_id"
- t.integer "level"
- end
-
- 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_score_details", :force => true do |t|
- t.integer "current_user_id"
- t.integer "target_user_id"
- t.string "score_type"
- t.string "score_action"
- t.integer "user_id"
- t.integer "old_score"
- t.integer "new_score"
- t.integer "current_user_level"
- t.integer "target_user_level"
- t.integer "score_changeable_obj_id"
- t.string "score_changeable_obj_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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 "visitors", :force => true do |t|
- t.integer "user_id"
- t.integer "master_id"
- t.datetime "updated_on"
- t.datetime "created_on"
- end
-
- add_index "visitors", ["master_id"], :name => "index_visitors_master_id"
- add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on"
- add_index "visitors", ["user_id"], :name => "index_visitors_user_id"
-
- 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 "web_footer_companies", :force => true do |t|
- t.string "name"
- t.string "logo_size"
- t.string "url"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "web_footer_oranizers", :force => true do |t|
- t.string "name"
- t.text "description"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- 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"
-
- create_table "works_categories", :force => true do |t|
- t.string "category"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "zip_packs", :force => true do |t|
- t.integer "user_id"
- t.integer "homework_id"
- t.string "file_digest"
- t.string "file_path"
- t.integer "pack_times", :default => 1
- t.integer "pack_size", :default => 0
- t.text "file_digests"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
-end
+# 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 => 20150907064547) 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
+ t.integer "activity_container_id"
+ t.string "activity_container_type", :default => ""
+ t.datetime "created_at"
+ 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 "activity_notifies", :force => true do |t|
+ t.integer "activity_container_id"
+ t.string "activity_container_type"
+ t.integer "activity_id"
+ t.string "activity_type"
+ t.integer "notify_to"
+ t.datetime "created_on"
+ t.integer "is_read"
+ end
+
+ add_index "activity_notifies", ["activity_container_id", "activity_container_type"], :name => "index_an_activity_container_id"
+ add_index "activity_notifies", ["created_on"], :name => "index_an_created_on"
+ add_index "activity_notifies", ["notify_to"], :name => "index_an_notify_to"
+
+ create_table "api_keys", :force => true do |t|
+ t.string "access_token"
+ t.datetime "expires_at"
+ t.integer "user_id"
+ t.boolean "active", :default => true
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token"
+ add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id"
+
+ create_table "applied_projects", :force => true do |t|
+ t.integer "project_id", :null => false
+ t.integer "user_id", :null => false
+ end
+
+ 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
+ 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"
+ t.integer "attachtype", :default => 1
+ t.integer "is_public", :default => 1
+ t.integer "copy_from"
+ t.integer "quotes"
+ 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 "attachmentstypes", :force => true do |t|
+ t.integer "typeId", :null => false
+ t.string "typeName", :limit => 50
+ end
+
+ 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.text "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"
+ t.integer "is_evaluation"
+ t.integer "proportion", :default => 60
+ t.integer "comment_status", :default => 0
+ t.integer "evaluation_num", :default => 3
+ t.integer "open_anonymous_evaluation", :default => 1
+ 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"
+ t.integer "course_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 "bug_to_osps", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "relative_memo_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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 "code_review_assignments", :force => true do |t|
+ t.integer "issue_id"
+ t.integer "change_id"
+ t.integer "attachment_id"
+ t.string "file_path"
+ t.string "rev"
+ t.string "rev_to"
+ t.string "action_type"
+ t.integer "changeset_id"
+ end
+
+ create_table "code_review_project_settings", :force => true do |t|
+ t.integer "project_id"
+ t.integer "tracker_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "updated_by"
+ t.boolean "hide_code_review_tab", :default => false
+ t.integer "auto_relation", :default => 1
+ t.integer "assignment_tracker_id"
+ t.text "auto_assign"
+ t.integer "lock_version", :default => 0, :null => false
+ t.boolean "tracker_in_review_dialog", :default => false
+ end
+
+ create_table "code_review_user_settings", :force => true do |t|
+ t.integer "user_id", :default => 0, :null => false
+ t.integer "mail_notification", :default => 0, :null => false
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ create_table "code_reviews", :force => true do |t|
+ t.integer "project_id"
+ t.integer "change_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "line"
+ t.integer "updated_by_id"
+ t.integer "lock_version", :default => 0, :null => false
+ t.integer "status_changed_from"
+ t.integer "status_changed_to"
+ t.integer "issue_id"
+ t.string "action_type"
+ t.string "file_path"
+ t.string "rev"
+ t.string "rev_to"
+ t.integer "attachment_id"
+ t.integer "file_count", :default => 0, :null => false
+ t.boolean "diff_all"
+ end
+
+ 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 "contest_notifications", :force => true do |t|
+ t.text "title"
+ t.text "content"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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 "contestnotifications", :force => true do |t|
+ t.integer "contest_id"
+ t.string "title"
+ t.string "summary"
+ t.text "description"
+ t.integer "author_id"
+ t.integer "notificationcomments_count"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "contests", :force => true do |t|
+ t.string "name"
+ t.string "budget", :default => ""
+ 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 "course_activities", :force => true do |t|
+ t.integer "user_id"
+ t.integer "course_id"
+ t.integer "course_act_id"
+ t.string "course_act_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_attachments", :force => true do |t|
+ t.string "filename"
+ t.string "disk_filename"
+ t.integer "filesize"
+ t.string "content_type"
+ t.string "digest"
+ t.integer "downloads"
+ t.string "author_id"
+ t.string "integer"
+ t.string "description"
+ t.string "disk_directory"
+ t.integer "attachtype"
+ t.integer "is_public"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "container_id", :default => 0
+ end
+
+ create_table "course_groups", :force => true do |t|
+ t.string "name"
+ t.integer "course_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_infos", :force => true do |t|
+ t.integer "course_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "course_id"
+ t.integer "course_message_id"
+ t.string "course_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "content"
+ t.integer "status"
+ end
+
+ create_table "course_statuses", :force => true do |t|
+ t.integer "changesets_count"
+ t.integer "watchers_count"
+ t.integer "course_id"
+ t.float "grade", :default => 0.0
+ t.integer "course_ac_para", :default => 0
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :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"
+ t.text "description"
+ t.integer "status", :default => 1
+ t.integer "attachmenttype", :default => 2
+ t.integer "lft"
+ t.integer "rgt"
+ t.integer "is_public", :limit => 1, :default => 1
+ t.integer "inherit_members", :limit => 1, :default => 1
+ t.integer "open_student", :default => 0
+ 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 "delayed_jobs", :force => true do |t|
+ t.integer "priority", :default => 0, :null => false
+ t.integer "attempts", :default => 0, :null => false
+ t.text "handler", :null => false
+ t.text "last_error"
+ t.datetime "run_at"
+ t.datetime "locked_at"
+ t.datetime "failed_at"
+ t.string "locked_by"
+ t.string "queue"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
+
+ create_table "discuss_demos", :force => true do |t|
+ t.string "title"
+ t.text "body"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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"
+ t.integer "user_id", :default => 0
+ t.integer "is_public", :default => 1
+ 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 "dts", :force => true do |t|
+ t.string "IPLineCode"
+ t.string "Description"
+ t.string "Num"
+ t.string "Variable"
+ t.string "TraceInfo"
+ t.string "Method"
+ t.string "File"
+ t.string "IPLine"
+ t.string "Review"
+ t.string "Category"
+ t.string "Defect"
+ t.string "PreConditions"
+ t.string "StartLine"
+ t.integer "project_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "enabled_modules", :force => true do |t|
+ t.integer "project_id"
+ t.string "name", :null => false
+ t.integer "course_id"
+ 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 "first_pages", :force => true do |t|
+ t.string "web_title"
+ t.string "title"
+ t.text "description"
+ t.string "page_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "sort_type"
+ t.integer "image_width", :default => 107
+ t.integer "image_height", :default => 63
+ t.integer "show_course", :default => 1
+ t.integer "show_contest", :default => 1
+ end
+
+ create_table "forge_activities", :force => true do |t|
+ t.integer "user_id"
+ t.integer "project_id"
+ t.integer "forge_act_id"
+ t.string "forge_act_type"
+ t.integer "org_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "forge_activities", ["forge_act_id"], :name => "index_forge_activities_on_forge_act_id"
+
+ create_table "forge_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "project_id"
+ t.integer "forge_message_id"
+ t.string "forge_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "forums", :force => true do |t|
+ t.string "name", :null => false
+ t.text "description"
+ 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
+ t.integer "sticky"
+ t.integer "locked"
+ 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"
+ t.string "name"
+ t.text "description"
+ t.integer "state"
+ t.integer "project_id", :default => 0
+ t.float "score", :default => 0.0
+ t.integer "is_teacher_score", :default => 0
+ end
+
+ add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id"
+
+ create_table "homework_commons", :force => true do |t|
+ t.string "name"
+ t.integer "user_id"
+ t.text "description"
+ t.date "publish_time"
+ t.date "end_time"
+ t.integer "homework_type", :default => 1
+ t.string "late_penalty"
+ t.integer "course_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "homework_detail_manuals", :force => true do |t|
+ t.float "ta_proportion"
+ t.integer "comment_status"
+ t.date "evaluation_start"
+ t.date "evaluation_end"
+ t.integer "evaluation_num"
+ t.integer "absence_penalty", :default => 1
+ t.integer "homework_common_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "homework_detail_programings", :force => true do |t|
+ t.string "language"
+ t.text "standard_code", :limit => 2147483647
+ t.integer "homework_common_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.float "ta_proportion", :default => 0.1
+ t.integer "question_id"
+ end
+
+ create_table "homework_evaluations", :force => true do |t|
+ t.string "user_id"
+ t.string "homework_attach_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "homework_for_courses", :force => true do |t|
+ t.integer "course_id"
+ t.integer "bid_id"
+ end
+
+ add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id"
+ add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id"
+
+ create_table "homework_tests", :force => true do |t|
+ t.text "input"
+ t.text "output"
+ t.integer "homework_common_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "result"
+ t.text "error_msg"
+ end
+
+ create_table "homework_users", :force => true do |t|
+ t.string "homework_attach_id"
+ t.string "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "invite_lists", :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 "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"
+ t.integer "project_issues_index"
+ 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"
+ t.integer "is_comprehensive_evaluation"
+ end
+
+ create_table "kindeditor_assets", :force => true do |t|
+ t.string "asset"
+ t.integer "file_size"
+ t.string "file_type"
+ t.integer "owner_id"
+ t.string "asset_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "owner_type", :default => 0
+ 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
+ t.datetime "created_on"
+ t.boolean "mail_notification", :default => false, :null => false
+ t.integer "course_id", :default => -1
+ t.integer "course_group_id", :default => 0
+ end
+
+ add_index "members", ["project_id"], :name => "index_members_on_project_id"
+ add_index "members", ["user_id", "project_id", "course_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 "memo_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "forum_id"
+ t.integer "memo_id"
+ t.string "memo_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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 "message_alls", :force => true do |t|
+ t.integer "user_id"
+ t.integer "message_id"
+ t.string "message_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ 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
+ t.integer "course_id"
+ 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 "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 "notificationcomments", :force => true do |t|
+ t.string "notificationcommented_type"
+ t.integer "notificationcommented_id"
+ t.integer "author_id"
+ t.text "notificationcomments"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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 "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 "option_numbers", :force => true do |t|
+ t.integer "user_id"
+ t.integer "memo"
+ t.integer "messages_for_issues"
+ t.integer "issues_status"
+ t.integer "replay_for_message"
+ t.integer "replay_for_memo"
+ t.integer "follow"
+ t.integer "tread"
+ t.integer "praise_by_one"
+ t.integer "praise_by_two"
+ t.integer "praise_by_three"
+ t.integer "tread_by_one"
+ t.integer "tread_by_two"
+ t.integer "tread_by_three"
+ t.integer "changeset"
+ t.integer "document"
+ t.integer "attachment"
+ t.integer "issue_done_ratio"
+ t.integer "post_issue"
+ t.integer "score_type"
+ t.integer "total_score"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "project_id"
+ end
+
+ create_table "organizations", :force => true do |t|
+ t.string "name"
+ t.string "logo_link"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "phone_app_versions", :force => true do |t|
+ t.string "version"
+ t.text "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_answers", :force => true do |t|
+ t.integer "poll_question_id"
+ t.text "answer_text"
+ t.integer "answer_position"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_questions", :force => true do |t|
+ t.string "question_title"
+ t.integer "question_type"
+ t.integer "is_necessary"
+ t.integer "poll_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "question_number"
+ end
+
+ create_table "poll_users", :force => true do |t|
+ t.integer "user_id"
+ t.integer "poll_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_votes", :force => true do |t|
+ t.integer "user_id"
+ t.integer "poll_question_id"
+ t.integer "poll_answer_id"
+ t.text "vote_text"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "polls", :force => true do |t|
+ t.string "polls_name"
+ t.string "polls_type"
+ t.integer "polls_group_id"
+ t.integer "polls_status"
+ t.integer "user_id"
+ t.datetime "published_at"
+ t.datetime "closed_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "polls_description"
+ t.integer "show_result", :default => 1
+ 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_scores", :force => true do |t|
+ t.string "project_id"
+ t.integer "score"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "issue_num", :default => 0
+ t.integer "issue_journal_num", :default => 0
+ t.integer "news_num", :default => 0
+ t.integer "documents_num", :default => 0
+ t.integer "changeset_num", :default => 0
+ t.integer "board_message_num", :default => 0
+ 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 "projecting_softapplictions", :force => true do |t|
+ t.integer "user_id"
+ t.integer "softapplication_id"
+ t.integer "project_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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
+ t.integer "attachmenttype", :default => 1
+ t.integer "user_id"
+ t.integer "dts_test", :default => 0
+ t.string "enterprise_name"
+ t.integer "organization_id"
+ t.integer "project_new_type"
+ 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 "relative_memo_to_open_source_projects", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "relative_memo_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "relative_memos", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "parent_id"
+ t.string "subject", :null => false
+ t.text "content", :limit => 16777215, :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
+ t.string "url"
+ t.string "username"
+ t.string "userhomeurl"
+ t.date "date_collected"
+ t.string "topic_resource"
+ end
+
+ 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
+ t.boolean "hidden", :default => false
+ end
+
+ add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id"
+
+ create_table "rich_rich_files", :force => true do |t|
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "rich_file_file_name"
+ t.string "rich_file_content_type"
+ t.integer "rich_file_file_size"
+ t.datetime "rich_file_updated_at"
+ t.string "owner_type"
+ t.integer "owner_id"
+ t.text "uri_cache"
+ t.string "simplified_type", :default => "file"
+ end
+
+ 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
+ t.string "logo_link"
+ 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
+ t.integer "is_teacher_score", :default => 0
+ 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.text "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"
+ t.string "deposit_project_url"
+ t.string "deposit_project"
+ t.integer "project_id"
+ end
+
+ create_table "student_work_tests", :force => true do |t|
+ t.integer "student_work_id"
+ t.integer "status"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "results"
+ t.text "src"
+ end
+
+ create_table "student_works", :force => true do |t|
+ t.string "name"
+ t.text "description", :limit => 2147483647
+ t.integer "homework_common_id"
+ t.integer "user_id"
+ t.float "final_score"
+ t.float "teacher_score"
+ t.float "student_score"
+ t.float "teaching_asistant_score"
+ t.integer "project_id", :default => 0
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "late_penalty", :default => 0
+ t.integer "absence_penalty", :default => 0
+ t.integer "system_score"
+ end
+
+ create_table "student_works_evaluation_distributions", :force => true do |t|
+ t.integer "student_work_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "student_works_scores", :force => true do |t|
+ t.integer "student_work_id"
+ t.integer "user_id"
+ t.integer "score"
+ t.text "comment"
+ t.integer "reviewer_role"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ 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
+
+ add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id"
+ add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id"
+
+ 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"
+ add_index "taggings", ["taggable_type"], :name => "index_taggings_on_taggable_type"
+
+ 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_activities", :force => true do |t|
+ t.string "act_type"
+ t.integer "act_id"
+ t.string "container_type"
+ t.integer "container_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "user_id"
+ 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"
+ t.string "description", :default => ""
+ end
+
+ create_table "user_feedback_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "journals_for_message_id"
+ t.string "journals_for_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ 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_levels", :force => true do |t|
+ t.integer "user_id"
+ t.integer "level"
+ end
+
+ 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_score_details", :force => true do |t|
+ t.integer "current_user_id"
+ t.integer "target_user_id"
+ t.string "score_type"
+ t.string "score_action"
+ t.integer "user_id"
+ t.integer "old_score"
+ t.integer "new_score"
+ t.integer "current_user_level"
+ t.integer "target_user_level"
+ t.integer "score_changeable_obj_id"
+ t.string "score_changeable_obj_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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
+ t.integer "gid"
+ 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 "visitors", :force => true do |t|
+ t.integer "user_id"
+ t.integer "master_id"
+ t.datetime "updated_on"
+ t.datetime "created_on"
+ end
+
+ add_index "visitors", ["master_id"], :name => "index_visitors_master_id"
+ add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on"
+ add_index "visitors", ["user_id"], :name => "index_visitors_user_id"
+
+ 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 "web_footer_companies", :force => true do |t|
+ t.string "name"
+ t.string "logo_size"
+ t.string "url"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "web_footer_oranizers", :force => true do |t|
+ t.string "name"
+ t.text "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ 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"
+
+ create_table "works_categories", :force => true do |t|
+ t.string "category"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "zip_packs", :force => true do |t|
+ t.integer "user_id"
+ t.integer "homework_id"
+ t.string "file_digest"
+ t.string "file_path"
+ t.integer "pack_times", :default => 1
+ t.integer "pack_size", :default => 0
+ t.text "file_digests"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+end
diff --git a/public/images/homepage_icon.png b/public/images/homepage_icon.png
index d39624a2e24f10323817e45686e5090365e7f4d7..127f12e926bffaf04424e48ff87b71e68f7407a6 100644
GIT binary patch
delta 8620
zcma)icT`hb(|$svNR?hhkRrVa2%#$-=>h`MqCz0_B1%9wL_}#KMJWM7Z_<@XV2_;o}FQfB)cR|+722j2n164
zVu$XPKsGHPpkbtY#X4kSB_}MK^?S?76ikxiMNC
O&@#=G2TYK}&6YHwH$ft&)yM<8Xj~?`HEjV6&;1
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 -#^&as
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
V^rsskKPZ5o;T03Ta$U!${|83Qkb?jK
diff --git a/public/javascripts/homework.js b/public/javascripts/homework.js
index a7743a52c..bebb8a973 100644
--- a/public/javascripts/homework.js
+++ b/public/javascripts/homework.js
@@ -132,16 +132,65 @@ $(function(){
})
- $('a.DropBtn').on('click', function(){
- $(".advanced_option").toggle();
+ $('a.ProBtn').on('click', function(){
+ $("#BluePopupBox").dialog({
+ modal: true,
+ dialogClass: 'BluePopupBox',
+ minWidth: 753
+ });
+ $(".ui-dialog-titlebar").hide();
+
+ $("a.CloseBtn").on('click', function(){
+ $("#BluePopupBox" ).dialog("close");
+ });
+
+ $("#BluePopupBox a.BlueCirBtn").on('click', function(){
+ var test_numbers = 0;
+ var valid = true;
+ var input = null;
+ var output = null;
+ var input_groups = [];
+ $.each($('#BluePopupBox textarea.InputBox'), function(i, val){
+ if ($(val).val().length<=0) {
+ $(val)[0].focus();
+ valid =false;
+ return false;
+ }
+ if (test_numbers %2==0) {
+ input = $(val).val();
+ } else {
+ output = $(val).val();
+ input_groups.push({input: input, output: output});
+ }
+ test_numbers += 1;
+ });
+
+ var language = $('select.language_type').val() == 1 ? 'C语言' : 'C++语言';
+
+ if (valid) {
+ $("input[name=homework_type]").val(2);
+ $('span.program_detail_info').text('('+language+','+test_numbers/2+'组测试)');
+ //保存js值
+ var data = {
+ language_type: $('select.language_type').val(),
+ input_groups: input_groups
+ };
+ //构建到form中
+ $('.program-input').remove();
+ var html=bt('t:program-input-list',data);
+ $("input[name=homework_type]").after(html);
+ $("#BluePopupBox" ).dialog( "close" );
+ };
+
+ });
});
- $(".HomeWork").on('click', 'a.icon_add', function(){
+ $("#BluePopupBox").on('click', 'a.icon_add', function(){
var html = bt('t:test-answer-list', null);
$(this).parent('.mt10').after(html);
});
- $(".HomeWork").on('click', 'a.icon_remove', function(){
+ $("#BluePopupBox").on('click', 'a.icon_remove', function(){
$(this).parent('.mt10').remove();
});
});
\ No newline at end of file
diff --git a/public/stylesheets/new_user.css b/public/stylesheets/new_user.css
index f8000f674..ea3371c28 100644
--- a/public/stylesheets/new_user.css
+++ b/public/stylesheets/new_user.css
@@ -864,16 +864,36 @@ a:hover.BlueCirBtnMini{ background:#269ac9; color:#fff;}
a.DropBtn{background: url(../images/homepage_icon2.png) -125px -339px no-repeat; width:85px; height:20px; display:block; color:#888888; font-size:14px;}
a:hover.DropBtn{background: url(../images/homepage_icon2.png) -125px -370px no-repeat;}
.DropLine{border-top:1px solid #d9d9d9; float:left; width:623px; height:10px; margin-top:10px;}
+/*20150820课程作业 LB*/
+.HomeWork {width:708px; background-color:#ffffff; padding:20px; border:1px solid #dddddd;}
+.RightBanner {font-size:16px; width:733px; color:#4b4b4b; padding:10px 0 0 15px; margin-bottom:10px; background:#fff; border:1px solid #dddddd;height:34px;}
+select.InputBox,input.InputBox,textarea.InputBox{ border:1px solid #d9d9d9; color:#888888; height:28px; line-height:28px; padding-left:5px; font-size:14px;}
+a.BlueCirBtn{ display:block;width:75px; height:28px; background-color:#fff; line-height:28px; vertical-align:middle; text-align:center; border:1px solid #3598db; color:#3598db; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;}
+a:hover.BlueCirBtn{ background:#3598db; color:#fff;}
+.W440{ width:440px;}
+.W120{ width:110px;}
+.W700{ width:700px;}
+a.AnnexBtn{ background: url(../images/homepage_icon.png) 0px -343px no-repeat; width:70px; height:20px; display:block; padding-left:20px; color:#888888;}
+a:hover.AnnexBtn{background: url(../images/homepage_icon.png) -90px -343px no-repeat; color:#3598db;}
+a.FilesBtn{ background: url(../images/homepage_icon.png) 0px -373px no-repeat; width:70px; height:20px; display:block; padding-left:20px; color:#888888;}
+a:hover.FilesBtn{background: url(../images/homepage_icon.png) -89px -372px no-repeat; color:#3598db;}
+a.BlueCirBtnMini{ display:block;width:40px; height:22px; background-color:#ffffff; line-height:24px; vertical-align:middle; text-align:center; border:1px solid #3598db; color:#3598db; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;}
+a:hover.BlueCirBtnMini{ background:#3598db; color:#fff;}
+a.ProBtn{background: url(../images/homepage_icon.png) -86px -396px no-repeat; width:35px; height:20px; display:block; padding-left:20px; color:#888888;}
+a:hover.ProBtn{background: url(../images/homepage_icon.png) -86px -426px no-repeat; color:#3598db;}
+
+a.DropBtn{background: url(../images/homepage_icon.png) -125px -339px no-repeat; width:85px; height:20px; display:block; color:#888888; font-size:14px;}
+a:hover.DropBtn{background: url(../images/homepage_icon.png) -125px -370px no-repeat;}
+.DropLine{border-top:1px solid #d9d9d9; float:left; width:623px; height:10px; margin-top:10px;}
/*20150820编程作业 LB*/
-.W320{ width:320px; max-width: 320px; min-width: 320px;}
-.icon_add{ background:url(images/icons.png) 0px -310px no-repeat; width:16px; height:27px; display:block;float:left; margin-right:5px;}
-a:hover.icon_add{background:url(images/icons.png) -20px -310px no-repeat;}
-.icon_remove{background:url(images/icons.png) 0px -338px no-repeat; width:16px; height:27px; display:block;float:left;}
-a:hover.icon_remove{background:url(images/icons.png) -20px -338px no-repeat;}
+.W320{ width:320px;}
+.icon_add{ background:url(../images/course/icons.png) 0px -310px no-repeat; width:16px; height:27px; display:block;float:left; margin-right:5px;}
+a:hover.icon_add{background:url(../images/course/icons.png) -20px -310px no-repeat;}
+.icon_remove{background:url(../images/course/icons.png) 0px -338px no-repeat; width:16px; height:27px; display:block;float:left;}
+a:hover.icon_remove{background:url(../images/course/icons.png) -20px -338px no-repeat;}
/*20150820提交作业 LB*/
.HomeWorkBox{ background:#f6f6f6; padding:10px; margin:10px 0;}
.c_grey{ color:#888888;}
-.c_dark_grey{color:#a9a9a9 !important;}
.HomeWorkP{ width:690px; font-size:14px;}
.H150{ height:150px;}
.ProResult{width:748px; background-color:#fff; border:1px solid #dddddd;border-bottom:none; }
@@ -883,17 +903,43 @@ a:hover.icon_remove{background:url(images/icons.png) -20px -338px no-repeat;}
.W200{ width:200px;}
.ProResultTable{ color:#888888;}
.T_C{ text-align:center;}
-.SearchIcon{background:url(../images/homepage_icon2.png) 676px -393px no-repeat; }
-.SearchIcon:hover{background:url(../images/homepage_icon2.png) 676px -419px no-repeat; }
-a.link_file{ background:url(../images/pic_file.png) 0 2px no-repeat; padding-left:20px; }
-a:hover.link_file{ background:url(../images/pic_file.png) 0 -25px no-repeat; color:#3ca5c6;}
-a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%;width: 1px;display: inline-block;padding-left: 16px;}
+.SearchIcon{background:url(../images/homepage_icon.png) 676px -393px no-repeat; }
+.SearchIcon:hover{background:url(../images/homepage_icon.png) 676px -419px no-repeat; }
+a.link_file{ background:url(../images/course/pic_file.png) 0 2px no-repeat; padding-left:20px; }
+a:hover.link_file{ background:url(../images/course/pic_file.png) 0 -25px no-repeat; color:#3ca5c6;}
a.FilesName{ max-width:540px;overflow:hidden; white-space:nowrap; text-overflow:ellipsis; display:block;}
a.FilesName02{ max-width:665px;overflow:hidden; white-space:nowrap; text-overflow:ellipsis; display:block;}
.ProResultUl span { display:block; float:left;}
.ProResultUl li{ line-height:35px; border-bottom:1px solid #dddddd; }
.DateBorder{border:1px solid #d9d9d9; border-left:none; padding:7px 6px 6px 6px;}
+a.UsersEditBtn{ display:block; width:55px; height:20px; border:1px solid #6d6d6d; color:#fff; background:#888888 url(../images/homepage_icon.png) -11px -35px no-repeat; padding-left:25px; line-height:1.9;-moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px;}
+a:hover.UsersEditBtn{ color:#484848; background:#888888 url(../images/homepage_icon.png) -11px -74px no-repeat;}
+a.UsersAttBtn{ display:block; width:55px; height:20px; border:1px solid #d3d3d3; color:#888888; background:#f2f3f3 url(../images/homepage_icon.png) -9px -6px no-repeat; padding-left:25px; line-height:1.9;-moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px;}
+a:hover.UsersAttBtn{border:1px solid #888888; }
+a.UsersApBtn{ display:block; width:55px; height:20px; border:1px solid #d3d3d3; color:#888888; background:#f2f3f3 url(../images/homepage_icon.png) -177px -6px no-repeat; padding-left:25px; line-height:1.9;-moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px;}
+a:hover.UsersApBtn{border:1px solid #888888; }
+/*20150906编程作业设置弹框 LB*/
+.C_lgrey{ color:#a5a5a5;}
+.C_Blue{ color:#3598db;}
+a.C_Blue{ color:#3598db;}
+a:hover.C_Blue{ color:#297fb8;}
+.BluePopupBox{ border:3px solid #3598db; padding:20px; background:#fff; width:707px;}
+/*.BluePopupBox:hover{ border:3px solid #297fb8; }*/
+a.CloseBtn{background:url(../images/CloseBtn.png) 0px 0px no-repeat; width:13px; height:13px; display:block; float:right;}
+a:hover.CloseBtn{background:url(../images/CloseBtn.png) 0px -24px no-repeat; }
+.BluePopuph2{ font-size:16px; font-weight:bold; color:#3598db; }
+.ProBoxResult{width:706px; background-color:#fff; border:1px solid #dddddd;border-bottom:none; max-height:300px; overflow:auto; }
+.W108{ width:108px;}
+.HomeWorkCon{ width:706px;}
+/*20150906导入作业弹框 LB*/
+.ImportBox{ width:708px; max-height:300px;overflow:auto;}
+.ImportBox li{ margin-bottom:10px;}
+.WorkTitle{ max-width:660px; font-size:14px; font-weight:bold; color:#484848;}
+.W520{ width:680px;}
+.ImportSearchIcon{background:url(../images/homepage_icon.png) 656px -393px no-repeat; }
+.ImportSearchIcon:hover{background:url(../images/homepage_icon.png) 656px -419px no-repeat; }
+
/*日历选择图*/
img.ui-datepicker-trigger {
display:block;
From be29bcc8bdceb89f355e0c8617ea60491a7acc37 Mon Sep 17 00:00:00 2001
From: guange <8863824@gmail.com>
Date: Mon, 7 Sep 2015 23:47:14 +0800
Subject: [PATCH 7/9] =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E7=AD=94=E9=A2=98?=
=?UTF-8?q?=E8=AE=B0=E5=85=A5=E6=95=B0=E6=8D=AE=E5=BA=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/student_work_controller.rb | 28 ++++---------------
app/controllers/users_controller.rb | 2 +-
app/models/homework_common.rb | 2 +-
app/models/student_work.rb | 2 +-
...0907152238_add_is_test_to_student_works.rb | 5 ++++
db/schema.rb | 7 +++--
6 files changed, 18 insertions(+), 28 deletions(-)
create mode 100644 db/migrate/20150907152238_add_is_test_to_student_works.rb
diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb
index 9f8d25c7e..17c98e3b1 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -14,8 +14,8 @@ class StudentWorkController < ApplicationController
def program_test
is_test = params[:is_test] == 'true'
resultObj = {status: 0, results: [], error_msg: '', time: Time.now.strftime('%Y-%m-%d %T')}
- unless is_test
- student_work = find_or_save_student_work
+
+ student_work = find_or_save_student_work(is_test)
unless student_work
resultObj[:status] = 100
@@ -43,24 +43,7 @@ class StudentWorkController < ApplicationController
end
end
- else
- if @homework.homework_type == 2 && @homework.homework_detail_programing
- result = test_realtime(student_work, params[:src])
- logger.debug result
- resultObj[:status] = result["status"]
- resultObj[:results] = result["results"]
- resultObj[:error_msg] = result["error_msg"]
- results = result["results"]
- if result["status"].to_i == -2 #编译错误
- results = [result["error_msg"]]
- end
-
- resultObj[:status] = result["status"].to_i
- resultObj[:time] = Time.now.strftime('%Y-%m-%d %T')
- resultObj[:index] = 0
- end
-
- end
+
render :json => resultObj
@@ -640,13 +623,14 @@ class StudentWorkController < ApplicationController
xls_report.string
end
- def find_or_save_student_work
+ def find_or_save_student_work(is_test)
student_work = @homework.student_works.where(user_id: User.current.id).first
if student_work.nil?
@homework.student_works.build(
name: params[:title],
description: params[:src],
- user_id: User.current.id
+ user_id: User.current.id,
+ is_test: is_test
)
unless @homework.save
else
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index d7cf29387..c6735c551 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -401,7 +401,7 @@ class UsersController < ApplicationController
homework_detail_programing = HomeworkDetailPrograming.new
homework.homework_detail_programing = homework_detail_programing
homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6
- homework_detail_programing.language = params[:program][:language].to_i
+ homework_detail_programing.language = params[:language_type].to_i
inputs = params[:program][:input]
if Array === inputs
diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb
index 1c066495f..b51de6c2c 100644
--- a/app/models/homework_common.rb
+++ b/app/models/homework_common.rb
@@ -10,7 +10,7 @@ class HomeworkCommon < ActiveRecord::Base
has_one :homework_detail_manual, :dependent => :destroy
has_one :homework_detail_programing, :dependent => :destroy
has_many :homework_tests, :dependent => :destroy
- has_many :student_works, :dependent => :destroy
+ has_many :student_works, :dependent => :destroy, :conditions => "is_test=0"
has_many :student_works_evaluation_distributions, :through => :student_works #一个作业的分配的匿评列表
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy #用户活动
# 课程动态
diff --git a/app/models/student_work.rb b/app/models/student_work.rb
index 6e39c954a..d7287dcc4 100644
--- a/app/models/student_work.rb
+++ b/app/models/student_work.rb
@@ -1,6 +1,6 @@
#学生提交作品表
class StudentWork < ActiveRecord::Base
- attr_accessible :name, :description, :homework_common_id, :user_id, :final_score, :teacher_score, :student_score, :teaching_asistant_score, :project_id
+ attr_accessible :name, :description, :homework_common_id, :user_id, :final_score, :teacher_score, :student_score, :teaching_asistant_score, :project_id, :is_test
belongs_to :homework_common
belongs_to :user
diff --git a/db/migrate/20150907152238_add_is_test_to_student_works.rb b/db/migrate/20150907152238_add_is_test_to_student_works.rb
new file mode 100644
index 000000000..b58da7c16
--- /dev/null
+++ b/db/migrate/20150907152238_add_is_test_to_student_works.rb
@@ -0,0 +1,5 @@
+class AddIsTestToStudentWorks < ActiveRecord::Migration
+ def change
+ add_column :student_works, :is_test, :boolean, default: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 4a718824a..0d6e87acf 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 => 20150907064547) do
+ActiveRecord::Schema.define(:version => 20150907152238) do
create_table "activities", :force => true do |t|
t.integer "act_id", :null => false
@@ -1313,11 +1313,12 @@ ActiveRecord::Schema.define(:version => 20150907064547) do
t.float "student_score"
t.float "teaching_asistant_score"
t.integer "project_id", :default => 0
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
t.integer "late_penalty", :default => 0
t.integer "absence_penalty", :default => 0
t.integer "system_score"
+ t.boolean "is_test", :default => false
end
create_table "student_works_evaluation_distributions", :force => true do |t|
From a29d004fdc02cfdcb2bf15a3c4d217f4745d4579 Mon Sep 17 00:00:00 2001
From: sw <939547590@qq.com>
Date: Tue, 8 Sep 2015 08:45:29 +0800
Subject: [PATCH 8/9] =?UTF-8?q?=E6=B2=A1=E6=9C=89=E5=8A=A0=E5=85=A5?=
=?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=9A=84=E7=94=A8=E6=88=B7=E8=BF=9B=E5=85=A5?=
=?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=88=97=E8=A1=A8=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/users_controller.rb | 2 +-
db/schema.rb | 104 +++++-----------------------
2 files changed, 18 insertions(+), 88 deletions(-)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 859f19f19..656b61f5f 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -298,7 +298,7 @@ class UsersController < ApplicationController
def user_homeworks
if User.current == @user
@page = params[:page] ? params[:page].to_i + 1 : 0
- user_course_ids = "(" + @user.courses.visible.map{|course| course.id}.join(",") + ")"
+ user_course_ids = @user.courses.empty? ? "(-1)" :"(" + @user.courses.visible.map{|course| course.id}.join(",") + ")"
@homework_commons = HomeworkCommon.where("course_id in #{user_course_ids}").order("created_at desc").limit(10).offset(@page * 10)
respond_to do |format|
format.js
diff --git a/db/schema.rb b/db/schema.rb
index ec38d5c1d..48c5bcea5 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 => 20150906083453) do
+ActiveRecord::Schema.define(:version => 20150906091723) do
create_table "activities", :force => true do |t|
t.integer "act_id", :null => false
@@ -211,58 +211,6 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true
- create_table "code_review_assignments", :force => true do |t|
- t.integer "issue_id"
- t.integer "change_id"
- t.integer "attachment_id"
- t.string "file_path"
- t.string "rev"
- t.string "rev_to"
- t.string "action_type"
- t.integer "changeset_id"
- end
-
- create_table "code_review_project_settings", :force => true do |t|
- t.integer "project_id"
- t.integer "tracker_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "updated_by"
- t.boolean "hide_code_review_tab", :default => false
- t.integer "auto_relation", :default => 1
- t.integer "assignment_tracker_id"
- t.text "auto_assign"
- t.integer "lock_version", :default => 0, :null => false
- t.boolean "tracker_in_review_dialog", :default => false
- end
-
- create_table "code_review_user_settings", :force => true do |t|
- t.integer "user_id", :default => 0, :null => false
- t.integer "mail_notification", :default => 0, :null => false
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- create_table "code_reviews", :force => true do |t|
- t.integer "project_id"
- t.integer "change_id"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.integer "line"
- t.integer "updated_by_id"
- t.integer "lock_version", :default => 0, :null => false
- t.integer "status_changed_from"
- t.integer "status_changed_to"
- t.integer "issue_id"
- t.string "action_type"
- t.string "file_path"
- t.string "rev"
- t.string "rev_to"
- t.integer "attachment_id"
- t.integer "file_count", :default => 0, :null => false
- t.boolean "diff_all"
- end
-
create_table "comments", :force => true do |t|
t.string "commented_type", :limit => 30, :default => "", :null => false
t.integer "commented_id", :default => 0, :null => false
@@ -476,13 +424,6 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
- create_table "discuss_demos", :force => true do |t|
- t.string "title"
- t.text "body"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
create_table "documents", :force => true do |t|
t.integer "project_id", :default => 0, :null => false
t.integer "category_id", :default => 0, :null => false
@@ -1169,18 +1110,18 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
create_table "relative_memos", :force => true do |t|
t.integer "osp_id"
t.integer "parent_id"
- t.string "subject", :null => false
- t.text "content", :limit => 16777215, :null => false
+ t.string "subject", :null => false
+ t.text "content", :null => false
t.integer "author_id"
- t.integer "replies_count", :default => 0
+ 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
+ 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
t.string "url"
t.string "username"
t.string "userhomeurl"
@@ -1205,19 +1146,6 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id"
- create_table "rich_rich_files", :force => true do |t|
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "rich_file_file_name"
- t.string "rich_file_content_type"
- t.integer "rich_file_file_size"
- t.datetime "rich_file_updated_at"
- t.string "owner_type"
- t.integer "owner_id"
- t.text "uri_cache"
- t.string "simplified_type", :default => "file"
- end
-
create_table "roles", :force => true do |t|
t.string "name", :limit => 30, :default => "", :null => false
t.integer "position", :default => 1
@@ -1269,11 +1197,10 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
t.string "url"
t.string "title"
t.integer "share_type"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ 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|
@@ -1434,8 +1361,8 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
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 "technical_title"
t.string "student_id"
t.string "teacher_realname"
t.string "student_realname"
@@ -1503,6 +1430,9 @@ ActiveRecord::Schema.define(:version => 20150906083453) do
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|
From de822daf44c863e717c609b975eff9344821ee78 Mon Sep 17 00:00:00 2001
From: lizanle <491823689@qq.com>
Date: Tue, 8 Sep 2015 11:18:02 +0800
Subject: [PATCH 9/9] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E5=8A=A8=E6=80=81?=
=?UTF-8?q?=E7=BC=96=E8=BE=91=E6=A1=86=E9=AB=98=E5=BA=A6=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E5=8F=98=E9=AB=98=E7=BC=A9=E7=9F=AD=20=E5=85=B6=E4=BB=96?=
=?UTF-8?q?=E7=BC=96=E8=BE=91=E6=A1=86=E8=87=AA=E5=8A=A8=E9=95=BF=E9=AB=98?=
=?UTF-8?q?=E7=BC=A9=E7=9F=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/users/_user_activities.html.erb | 1 -
.../lib/rails_kindeditor/helper.rb | 3 ++-
public/javascripts/init_KindEditor.js | 21 +++++++++++++++++--
3 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/app/views/users/_user_activities.html.erb b/app/views/users/_user_activities.html.erb
index 4ff98b1b7..f071cbeb4 100644
--- a/app/views/users/_user_activities.html.erb
+++ b/app/views/users/_user_activities.html.erb
@@ -9,7 +9,6 @@
span.ke-icon-emoticons:hover{background-position:-79px -671px;width:50px;height:26px;}
div.ke-toolbar .ke-outline{border:none;}
.ke-inline-block{display: none;}
- .ke-container{height: 30px !important;}
<% user_activities.each do |user_activity|
if user_activities %>
diff --git a/lib/rails_kindeditor/lib/rails_kindeditor/helper.rb b/lib/rails_kindeditor/lib/rails_kindeditor/helper.rb
index d5f91ebf8..c9908d80f 100644
--- a/lib/rails_kindeditor/lib/rails_kindeditor/helper.rb
+++ b/lib/rails_kindeditor/lib/rails_kindeditor/helper.rb
@@ -17,7 +17,8 @@ module RailsKindeditor
output_buffer = ActiveSupport::SafeBuffer.new
output_buffer << build_text_area_tag(name, method, self, options, input_html)
output_buffer << javascript_tag(js_replace(input_html['id'],options.merge(window_onload: 'true',
- afterCreate: 'eval(function(){enablePasteImg(self);})')))
+ :autoHeightMode=>true,
+ afterCreate: 'eval(function(){enablePasteImg(self);this.loadPlugin("autoheight")})')))
end
def kindeditor_upload_json_path(*args)
diff --git a/public/javascripts/init_KindEditor.js b/public/javascripts/init_KindEditor.js
index fc02146bb..f2b7915ad 100644
--- a/public/javascripts/init_KindEditor.js
+++ b/public/javascripts/init_KindEditor.js
@@ -1,14 +1,31 @@
function init_editor(params){
+ var minHeight;
var editor = params.kindutil.create(params.textarea, {
- resizeType : 1,minWidth:"1px",width:"100%",height:"80px",
- items:['emoticons'],
+ resizeType : 1,minWidth:"1px",width:"100%",height:"30px",minHeight:"30px",
+ items:['emoticons'],
afterChange:function(){//按键事件
nh_check_field({content:this,contentmsg:params.contentmsg,textarea:params.textarea});
+ var edit = this.edit;
+ var body = edit.doc.body;
+ edit.iframe.height(minHeight);
+ this.resize(null, Math.max((params.kindutil.IE ? body.scrollHeight : body.offsetHeight) + 30, minHeight));
},
afterCreate:function(){
var toolbar = $("div[class='ke-toolbar']",params.div_form);
$(".ke-outline>.ke-toolbar-icon",toolbar).append('表情');
params.toolbar_container.append(toolbar);
+ //init
+ var edit = this.edit;
+ var body = edit.doc.body;
+ edit.iframe[0].scroll = 'no';
+ body.style.overflowY = 'hidden';
+ //reset height
+ var edit = this.edit;
+ var body = edit.doc.body;
+ minHeight = params.kindutil.removeUnit(this.height);
+ edit.iframe.height(minHeight);
+ this.resize(null, Math.max((params.kindutil.IE ? body.scrollHeight : body.offsetHeight)+ 30 , minHeight));
+
}
}).loadPlugin('paste');
return editor;