Description:
tags / problems
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r879:60919c3675f4 - - 13 files changed: 89 inserted, 106 deleted

@@ -194,6 +194,8
194 194 net-protocol
195 195 timeout
196 196 nio4r (2.5.8)
197 + nokogiri (1.13.8-x86_64-darwin)
198 + racc (~> 1.4)
197 199 nokogiri (1.13.8-x86_64-linux)
198 200 racc (~> 1.4)
199 201 popper_js (2.11.6)
@@ -267,6 +269,7
267 269 actionpack (>= 5.2)
268 270 activesupport (>= 5.2)
269 271 sprockets (>= 3.0.0)
272 + sqlite3 (1.5.0-x86_64-darwin)
270 273 sqlite3 (1.5.0-x86_64-linux)
271 274 strscan (3.0.4)
272 275 temple (0.8.2)
@@ -293,6 +296,7
293 296 zeitwerk (2.6.0)
294 297
295 298 PLATFORMS
299 + x86_64-darwin-20
296 300 x86_64-linux
297 301
298 302 DEPENDENCIES
@@ -15,9 +15,8
15 15 WHITELIST_IP_CONF_KEY = 'right.whitelist_ip'
16 16
17 17 #report and redirect for unauthorized activities
18 - def unauthorized_redirect(notice = 'You are not authorized to view the page you requested')
19 - flash[:notice] = notice
20 - redirect_to login_main_path
18 + def unauthorized_redirect(msg = 'You are not authorized to view the page you requested')
19 + redirect_to login_main_path, alert: msg
21 20 end
22 21
23 22 # Returns the current logged-in user (if any).
@@ -46,30 +45,18
46 45 return true
47 46 end
48 47
49 - #admin always count as every roles
50 - def role_authorization(roles)
48 + def authorization_by_roles(allowed_roles)
51 49 return false unless check_valid_login
52 - user = User.find(session[:user_id])
53 - return true if user.admin?
50 + return true if @current_user.admin?
54 51 roles.each do |r|
55 - return true if user.has_role?(r)
52 + return true if @current_user.has_role?(r)
56 53 end
57 54 unauthorized_redirect
58 55 end
59 56
60 - def authorization_by_roles(allowed_roles)
61 - return false unless check_valid_login
62 - unless @current_user.roles.detect { |role| allowed_roles.member?(role.name) }
63 - unauthorized_redirect
64 - return false
65 - end
66 - end
67 -
68 57 def testcase_authorization
69 58 #admin always has privileged
70 - if @current_user.admin?
71 - return true
72 - end
59 + return true if @current_user.admin?
73 60
74 61 unauthorized_redirect unless GraderConfiguration["right.view_testcase"]
75 62 end
@@ -1,7 +1,7
1 1 class LoginController < ApplicationController
2 2
3 3 @@authenticators = []
4 -
4 +
5 5 def index
6 6 # show login screen
7 7 reset_session
@@ -11,14 +11,12
11 11 def login
12 12 user = get_authenticated_user(params[:login], params[:password])
13 13 unless user
14 - flash[:notice] = 'Wrong password'
15 - redirect_to :controller => 'main', :action => 'login'
14 + redirect_to login_main_path, alert: 'Wrong password'
16 15 return
17 16 end
18 17
19 18 if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) and !user.admin?
20 - flash[:notice] = 'You must accept the agreement before logging in'
21 - redirect_to :controller => 'main', :action => 'login'
19 + redirect_to login_main_path, alert: 'You must accept the agreement before logging in'
22 20 return
23 21 end
24 22
@@ -60,14 +58,14
60 58 site = nil
61 59 end
62 60 if site==nil
63 - flash[:notice] = 'Wrong site'
61 + flash[:alert] = 'Wrong site'
64 62 redirect_to :controller => 'main', :action => 'login' and return
65 63 end
66 64 if (site.password) and (site.password == params[:login][:password])
67 65 session[:site_id] = site.id
68 66 redirect_to :controller => 'site', :action => 'index'
69 67 else
70 - flash[:notice] = 'Wrong site password'
68 + flash[:alert] = 'Wrong site password'
71 69 redirect_to :controller => 'site', :action => 'login'
72 70 end
73 71 end
@@ -18,9 +18,8
18 18 #reset login, clear session
19 19 #front page
20 20 def login
21 - saved_notice = flash[:notice]
22 - reset_session
23 - flash.now[:notice] = saved_notice
21 + #saved_notice = flash[:notice]
22 + #flash[:notice] = saved_notice
24 23 @remote_ip = request.remote_ip
25 24
26 25 # EXPERIMENT:
@@ -2,7 +2,7
2 2 before_action :set_submission, only: [:show,:download,:compiler_msg,:rejudge,:set_tag, :edit]
3 3 before_action :check_valid_login
4 4 before_action :submission_authorization, only: [:show, :download, :edit]
5 - before_action only: [:rejudge, :set_tag] do role_authorization([:ta]) end
5 + before_action only: [:rejudge, :set_tag] do authorization_by_roles([:ta]) end
6 6
7 7 # GET /submissions
8 8 # GET /submissions.json
@@ -25,7 +25,7
25 25 @tag = Tag.new(tag_params)
26 26
27 27 if @tag.save
28 - redirect_to @tag, notice: 'Tag was successfully created.'
28 + redirect_to tags_path, notice: 'Tag was successfully created.'
29 29 else
30 30 render :new
31 31 end
@@ -16,7 +16,7
16 16 %td= group.description
17 17 %td= toggle_button(group.enabled?, toggle_group_path(group), "group-enabled-#{group.id}", block: ' ')
18 18 %td
19 - = link_to 'Edit members and problems', group, class: 'btn btn-secondary btn-sm'
19 + = link_to 'Edit members and problems', group, class: 'btn btn-info btn-sm'
20 20 = link_to 'Destroy', group, :method => :delete, :data => { :confirm => 'Are you sure?' }, class: 'btn btn-danger btn-sm'
21 21
22 22 %br
@@ -82,7 +82,7
82 82 %a.nav-link{href: profile_users_path}
83 83 %span.mi.mi-bs.md-18 settings
84 84 %li.nav-item
85 - %a.nav-link{href: login_main_path}
85 + %a.nav-link{href: logout_main_path}
86 86 %span.mi.mi-bs.md-18 exit_to_app
87 87 = @current_user.full_name
88 88 :javascript
@@ -7,9 +7,8
7 7 .card-subtitle=t 'login.message'
8 8
9 9 - if flash[:notice]
10 - %hr/
11 - %b= flash[:notice]
12 - %hr/
10 + .alert.alert-danger
11 + = flash[:notice]
13 12
14 13 .card
15 14 .card-body{ style: "background: #eeeeff;"}
@@ -1,22 +1,7
1 - = form_for @tag do |f|
2 - - if @tag.errors.any?
3 - #error_explanation
4 - %h2= "#{pluralize(@tag.errors.count, "error")} prohibited this tag from being saved:"
5 - %ul
6 - - @tag.errors.full_messages.each do |msg|
7 - %li= msg
8 -
1 + = simple_form_for @tag do |f|
9 2 .row
10 3 .col-md-6
11 - .form-group.field
12 - = f.label :name
13 - = f.text_field :name, class: 'form-control'
14 - .form-group.field
15 - = f.label :description
16 - = f.text_area :description, class: 'form-control'
17 - .form-group.field
18 - = f.label :public
19 - = f.text_field :public, class: 'form-control'
20 - .actions
21 - = f.submit 'Save', class: 'btn btn-primary'
22 - .col-md-6
4 + = f.input :name
5 + = f.input :description
6 + = f.input :public
7 + = f.submit 'Save', class: 'btn btn-primary'
@@ -18,9 +18,9
18 18 %td= tag.name
19 19 %td= tag.description
20 20 %td= tag.public
21 - %td= link_to 'Show', tag
22 - %td= link_to 'Edit', edit_tag_path(tag)
23 - %td= link_to 'Destroy', tag, :method => :delete, :data => { :confirm => 'Are you sure?' }
21 + %td= link_to 'Show', tag, class: 'btn btn-info'
22 + %td= link_to 'Edit', edit_tag_path(tag), class: 'btn btn-info'
23 + %td= button_to 'Destroy', tag, :method => :delete, :data => { :confirm => 'Are you sure?' }, class: 'btn btn-danger'
24 24
25 25 %br
26 26
@@ -76,8 +76,8
76 76 %td= toggle_button(user.enabled?, toggle_enable_user_path(user),"toggle_enable_user_#{user.id}")
77 77 %td= user.last_ip
78 78 %td= link_to 'Clear IP', {:action => 'clear_last_ip', :id => user, :page=>params[:page]}, :confirm => 'This will reset last logging in ip of the user, are you sure?', class: 'btn btn-secondary btn-sm btn-block'
79 - %td= link_to 'Show', {:action => 'show', :id => user}, class: 'btn btn-secondary btn-sm btn-block'
80 - %td= link_to 'Edit', {:action => 'edit', :id => user}, class: 'btn btn-secondary btn-sm btn-block'
79 + %td= link_to 'Show', {:action => 'show', :id => user}, class: 'btn btn-info btn-sm btn-block'
80 + %td= link_to 'Edit', {:action => 'edit', :id => user}, class: 'btn btn-info btn-sm btn-block'
81 81 %td= link_to 'Destroy', {action: :destroy, id: user}, data: {confirm: 'Are you sure?'}, method: :delete, class: 'btn btn-danger btn-sm btn-block'
82 82 %br/
83 83 = link_to '+ New user', { :action => 'new' }, { class: 'btn btn-success '}
@@ -11,7 +11,7
11 11 # It's strongly recommended that you check this file into your version control system.
12 12
13 13 ActiveRecord::Schema[7.0].define(version: 2022_09_27_074644) do
14 - create_table "active_storage_attachments", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
14 + create_table "active_storage_attachments", charset: "latin1", force: :cascade do |t|
15 15 t.string "name", null: false
16 16 t.string "record_type", null: false
17 17 t.bigint "record_id", null: false
@@ -21,7 +21,7
21 21 t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
22 22 end
23 23
24 - create_table "active_storage_blobs", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
24 + create_table "active_storage_blobs", charset: "latin1", force: :cascade do |t|
25 25 t.string "key", null: false
26 26 t.string "filename", null: false
27 27 t.string "content_type"
@@ -33,15 +33,15
33 33 t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
34 34 end
35 35
36 - create_table "active_storage_variant_records", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
36 + create_table "active_storage_variant_records", charset: "latin1", force: :cascade do |t|
37 37 t.bigint "blob_id", null: false
38 38 t.string "variation_digest", null: false
39 39 t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
40 40 end
41 41
42 - create_table "announcements", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
42 + create_table "announcements", id: :integer, charset: "utf8", force: :cascade do |t|
43 43 t.string "author"
44 - t.text "body"
44 + t.text "body", size: :medium
45 45 t.boolean "published"
46 46 t.datetime "created_at", precision: nil, null: false
47 47 t.datetime "updated_at", precision: nil, null: false
@@ -52,7 +52,7
52 52 t.boolean "on_nav_bar", default: false
53 53 end
54 54
55 - create_table "contests", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
55 + create_table "contests", id: :integer, charset: "utf8", force: :cascade do |t|
56 56 t.string "title"
57 57 t.boolean "enabled"
58 58 t.datetime "created_at", precision: nil, null: false
@@ -60,39 +60,39
60 60 t.string "name"
61 61 end
62 62
63 - create_table "contests_problems", id: false, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
63 + create_table "contests_problems", id: false, charset: "utf8", force: :cascade do |t|
64 64 t.integer "contest_id"
65 65 t.integer "problem_id"
66 66 end
67 67
68 - create_table "contests_users", id: false, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
68 + create_table "contests_users", id: false, charset: "utf8", force: :cascade do |t|
69 69 t.integer "contest_id"
70 70 t.integer "user_id"
71 71 end
72 72
73 - create_table "countries", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
73 + create_table "countries", id: :integer, charset: "utf8", force: :cascade do |t|
74 74 t.string "name"
75 75 t.datetime "created_at", precision: nil, null: false
76 76 t.datetime "updated_at", precision: nil, null: false
77 77 end
78 78
79 - create_table "descriptions", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
80 - t.text "body"
79 + create_table "descriptions", id: :integer, charset: "utf8", force: :cascade do |t|
80 + t.text "body", size: :medium
81 81 t.boolean "markdowned"
82 82 t.datetime "created_at", precision: nil, null: false
83 83 t.datetime "updated_at", precision: nil, null: false
84 84 end
85 85
86 - create_table "grader_configurations", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
86 + create_table "grader_configurations", id: :integer, charset: "utf8", force: :cascade do |t|
87 87 t.string "key"
88 88 t.string "value_type"
89 89 t.string "value"
90 90 t.datetime "created_at", precision: nil, null: false
91 91 t.datetime "updated_at", precision: nil, null: false
92 - t.text "description"
92 + t.text "description", size: :medium
93 93 end
94 94
95 - create_table "grader_processes", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
95 + create_table "grader_processes", id: :integer, charset: "utf8", force: :cascade do |t|
96 96 t.string "host"
97 97 t.integer "pid"
98 98 t.string "mode"
@@ -123,7 +123,7
123 123 t.index ["user_id", "group_id"], name: "index_groups_users_on_user_id_and_group_id"
124 124 end
125 125
126 - create_table "heart_beats", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
126 + create_table "heart_beats", id: :integer, charset: "latin1", force: :cascade do |t|
127 127 t.integer "user_id"
128 128 t.string "ip_address"
129 129 t.datetime "created_at", precision: nil, null: false
@@ -132,14 +132,14
132 132 t.index ["updated_at"], name: "index_heart_beats_on_updated_at"
133 133 end
134 134
135 - create_table "languages", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
135 + create_table "languages", id: :integer, charset: "utf8", force: :cascade do |t|
136 136 t.string "name", limit: 10
137 137 t.string "pretty_name"
138 138 t.string "ext", limit: 10
139 139 t.string "common_ext"
140 140 end
141 141
142 - create_table "logins", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
142 + create_table "logins", id: :integer, charset: "latin1", force: :cascade do |t|
143 143 t.integer "user_id"
144 144 t.string "ip_address"
145 145 t.datetime "created_at", precision: nil, null: false
@@ -147,18 +147,18
147 147 t.index ["user_id"], name: "index_logins_on_user_id"
148 148 end
149 149
150 - create_table "messages", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
150 + create_table "messages", id: :integer, charset: "utf8", force: :cascade do |t|
151 151 t.integer "sender_id"
152 152 t.integer "receiver_id"
153 153 t.integer "replying_message_id"
154 - t.text "body"
154 + t.text "body", size: :medium
155 155 t.boolean "replied"
156 156 t.datetime "created_at", precision: nil, null: false
157 157 t.datetime "updated_at", precision: nil, null: false
158 158 end
159 159
160 - create_table "problems", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
161 - t.string "name", limit: 30
160 + create_table "problems", id: :bigint, default: nil, charset: "utf8", force: :cascade do |t|
161 + t.string "name", limit: 100
162 162 t.string "full_name"
163 163 t.integer "full_score"
164 164 t.date "date_added"
@@ -174,45 +174,45
174 174 t.boolean "markdown"
175 175 end
176 176
177 - create_table "problems_tags", id: :integer, charset: "latin1", force: :cascade do |t|
178 - t.integer "problem_id"
177 + create_table "problems_tags", id: :bigint, default: nil, charset: "latin1", force: :cascade do |t|
178 + t.bigint "problem_id"
179 179 t.integer "tag_id"
180 180 t.index ["problem_id", "tag_id"], name: "index_problems_tags_on_problem_id_and_tag_id", unique: true
181 181 t.index ["problem_id"], name: "index_problems_tags_on_problem_id"
182 182 t.index ["tag_id"], name: "index_problems_tags_on_tag_id"
183 183 end
184 184
185 - create_table "rights", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
185 + create_table "rights", id: :integer, charset: "utf8", force: :cascade do |t|
186 186 t.string "name"
187 187 t.string "controller"
188 188 t.string "action"
189 189 end
190 190
191 - create_table "rights_roles", id: false, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
191 + create_table "rights_roles", id: false, charset: "utf8", force: :cascade do |t|
192 192 t.integer "right_id"
193 193 t.integer "role_id"
194 194 t.index ["role_id"], name: "index_rights_roles_on_role_id"
195 195 end
196 196
197 - create_table "roles", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
197 + create_table "roles", id: :integer, charset: "utf8", force: :cascade do |t|
198 198 t.string "name"
199 199 end
200 200
201 - create_table "roles_users", id: false, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
201 + create_table "roles_users", id: false, charset: "utf8", force: :cascade do |t|
202 202 t.integer "role_id"
203 203 t.integer "user_id"
204 204 t.index ["user_id"], name: "index_roles_users_on_user_id"
205 205 end
206 206
207 - create_table "sessions", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
207 + create_table "sessions", id: :integer, charset: "utf8", force: :cascade do |t|
208 208 t.string "session_id"
209 - t.text "data"
209 + t.text "data", size: :medium
210 210 t.datetime "updated_at", precision: nil
211 211 t.index ["session_id"], name: "index_sessions_on_session_id"
212 212 t.index ["updated_at"], name: "index_sessions_on_updated_at"
213 213 end
214 214
215 - create_table "sites", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
215 + create_table "sites", id: :integer, charset: "utf8", force: :cascade do |t|
216 216 t.string "name"
217 217 t.boolean "started"
218 218 t.datetime "start_time", precision: nil
@@ -222,14 +222,23
222 222 t.string "password"
223 223 end
224 224
225 - create_table "submission_view_logs", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
225 + create_table "solutions", charset: "latin1", force: :cascade do |t|
226 + t.string "solution"
227 + t.bigint "problem_id"
228 + t.bigint "submission_id"
229 + t.integer "type"
230 + t.index ["problem_id"], name: "index_solutions_on_problem_id"
231 + t.index ["submission_id"], name: "index_solutions_on_submission_id"
232 + end
233 +
234 + create_table "submission_view_logs", id: :integer, charset: "latin1", force: :cascade do |t|
226 235 t.integer "user_id"
227 236 t.integer "submission_id"
228 237 t.datetime "created_at", precision: nil, null: false
229 238 t.datetime "updated_at", precision: nil, null: false
230 239 end
231 240
232 - create_table "submissions", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
241 + create_table "submissions", id: :bigint, default: nil, charset: "utf8", force: :cascade do |t|
233 242 t.integer "user_id"
234 243 t.integer "problem_id"
235 244 t.integer "language_id"
@@ -237,10 +246,10
237 246 t.binary "binary"
238 247 t.datetime "submitted_at", precision: nil
239 248 t.datetime "compiled_at", precision: nil
240 - t.text "compiler_message"
249 + t.text "compiler_message", size: :medium
241 250 t.datetime "graded_at", precision: nil
242 251 t.integer "points"
243 - t.text "grader_comment"
252 + t.text "grader_comment", size: :medium
244 253 t.integer "number"
245 254 t.string "source_filename"
246 255 t.float "max_runtime"
@@ -261,7 +270,7
261 270 t.datetime "updated_at", precision: nil, null: false
262 271 end
263 272
264 - create_table "tasks", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
273 + create_table "tasks", id: :integer, charset: "utf8", force: :cascade do |t|
265 274 t.integer "submission_id"
266 275 t.datetime "created_at", precision: nil
267 276 t.integer "status"
@@ -270,15 +279,15
270 279 t.index ["submission_id"], name: "index_tasks_on_submission_id"
271 280 end
272 281
273 - create_table "test_pairs", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
282 + create_table "test_pairs", id: :integer, charset: "utf8", force: :cascade do |t|
274 283 t.integer "problem_id"
275 - t.text "input", size: :medium
276 - t.text "solution", size: :medium
284 + t.text "input", size: :long
285 + t.text "solution", size: :long
277 286 t.datetime "created_at", precision: nil, null: false
278 287 t.datetime "updated_at", precision: nil, null: false
279 288 end
280 289
281 - create_table "test_requests", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
290 + create_table "test_requests", id: :integer, charset: "utf8", force: :cascade do |t|
282 291 t.integer "user_id"
283 292 t.integer "problem_id"
284 293 t.integer "submission_id"
@@ -289,7 +298,7
289 298 t.datetime "updated_at", precision: nil, null: false
290 299 t.datetime "submitted_at", precision: nil
291 300 t.datetime "compiled_at", precision: nil
292 - t.text "compiler_message"
301 + t.text "compiler_message", size: :medium
293 302 t.datetime "graded_at", precision: nil
294 303 t.string "grader_comment"
295 304 t.datetime "created_at", precision: nil, null: false
@@ -306,12 +315,12
306 315 t.integer "score"
307 316 t.text "input", size: :long
308 317 t.text "sol", size: :long
309 - t.datetime "created_at", precision: nil
310 - t.datetime "updated_at", precision: nil
318 + t.datetime "created_at", precision: nil, null: false
319 + t.datetime "updated_at", precision: nil, null: false
311 320 t.index ["problem_id"], name: "index_testcases_on_problem_id"
312 321 end
313 322
314 - create_table "user_contest_stats", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
323 + create_table "user_contest_stats", id: :integer, charset: "utf8", force: :cascade do |t|
315 324 t.integer "user_id"
316 325 t.datetime "started_at", precision: nil
317 326 t.datetime "created_at", precision: nil, null: false
@@ -319,7 +328,7
319 328 t.boolean "forced_logout"
320 329 end
321 330
322 - create_table "users", id: :integer, charset: "utf8mb3", collation: "utf8mb3_unicode_ci", force: :cascade do |t|
331 + create_table "users", id: :integer, charset: "utf8", force: :cascade do |t|
323 332 t.string "login", limit: 50
324 333 t.string "full_name"
325 334 t.string "hashed_password"
@@ -331,10 +340,10
331 340 t.boolean "activated", default: false
332 341 t.datetime "created_at", precision: nil
333 342 t.datetime "updated_at", precision: nil
343 + t.string "section"
334 344 t.boolean "enabled", default: true
335 345 t.string "remark"
336 346 t.string "last_ip"
337 - t.string "section"
338 347 t.integer "default_language"
339 348 t.index ["login"], name: "index_users_on_login", unique: true
340 349 end
@@ -343,4 +352,6
343 352 add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
344 353 add_foreign_key "problems_tags", "problems"
345 354 add_foreign_key "problems_tags", "tags"
355 + add_foreign_key "solutions", "problems"
356 + add_foreign_key "solutions", "submissions"
346 357 end
You need to be logged in to leave comments. Login now