Description:
Merge pull request #25 from nattee/master update outdated gem
Commit status:
[Not Reviewed]
References:
merge default
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r769:6eb8c22c844a - - 13 files changed: 186 inserted, 158 deleted

@@ -0,0 +1,1
1 + grader
@@ -0,0 +1,1
1 + ruby-2.6.3
@@ -1,35 +1,35
1 1 # See http://help.github.com/ignore-files/ for more about ignoring files.
2 2 #
3 3 # If you find yourself ignoring temporary files generated by your text editor
4 4 # or operating system, you probably want to add a global ignore instead:
5 5 # git config --global core.excludesfile ~/.gitignore_global
6 6
7 7 # Ignore bundler config
8 8 /.bundle
9 9
10 10 # Ignore the default SQLite database.
11 11 /db/*.sqlite3
12 12
13 13 # Ignore all logfiles and tempfiles.
14 14 /log/*.log
15 15 /tmp
16 16
17 17 *~
18 18
19 19 /vendor/plugins/rails_upgrade
20 20
21 21 #ignore public assets???
22 22 /public/assets
23 23 /public
24 24
25 25 /data
26 26
27 27 #ignore .orig and .swp
28 28 *.orig
29 29 *.swp
30 30
31 31 #ignore rvm setting file
32 - .ruby-gemset
33 - .ruby-version
32 + #.ruby-gemset
33 + #.ruby-version
34 34
35 35 /config/secrets.yml
@@ -1,92 +1,93
1 1 source 'https://rubygems.org'
2 2
3 3 #rails
4 4 gem 'rails', '~>4.2.0'
5 5 gem 'activerecord-session_store'
6 6
7 7
8 8 # Bundle edge Rails instead:
9 9 # gem 'rails', :git => 'git://github.com/rails/rails.git'
10 10
11 11 #---------------- database ---------------------
12 12 #the database
13 13 gem 'mysql2'
14 14 #for testing
15 15 gem 'sqlite3'
16 16 #for dumping database into yaml
17 17 gem 'yaml_db'
18 18
19 19 # Gems used only for assets and not required
20 20 # in production environments by default.
21 21 gem 'sass-rails'
22 22 gem 'coffee-rails'
23 23
24 24 # See https://github.com/sstephenson/execjs#readme for more supported runtimes
25 25 # gem 'therubyracer', :platforms => :ruby
26 26
27 27 gem 'uglifier'
28 28
29 29 gem 'haml'
30 30 gem 'haml-rails'
31 31 # gem 'prototype-rails'
32 32
33 33 # To use ActiveModel has_secure_password
34 34 # gem 'bcrypt-ruby', '~> 3.0.0'
35 35
36 36 # To use Jbuilder templates for JSON
37 37 # gem 'jbuilder'
38 38
39 39 # Use unicorn as the app server
40 40 # gem 'unicorn'
41 41
42 42 # Deploy with Capistrano
43 43 # gem 'capistrano'
44 44
45 45 # To use debugger
46 46 # gem 'debugger'
47 47 #
48 48
49 49 #in-place editor
50 50 gem 'best_in_place', '~> 3.0.1'
51 51
52 52 # jquery addition
53 53 gem 'jquery-rails'
54 54 gem 'jquery-ui-rails'
55 55 gem 'jquery-timepicker-addon-rails'
56 56 gem 'jquery-tablesorter'
57 57 gem 'jquery-countdown-rails'
58 58
59 59 #syntax highlighter
60 60 gem 'rouge'
61 61
62 62 #bootstrap add-ons
63 - gem 'bootstrap-sass', '~> 3.2.0'
63 + gem 'bootstrap-sass', '~> 3.4.1'
64 + gem 'sassc-rails', '>= 2.1.0'
64 65 gem 'bootstrap-switch-rails'
65 66 gem 'bootstrap-toggle-rails'
66 67 gem 'autoprefixer-rails'
67 68 gem 'momentjs-rails'
68 69 gem 'rails_bootstrap_sortable'
69 70 gem 'bootstrap-datepicker-rails'
70 71 gem 'bootstrap3-datetimepicker-rails'
71 72 gem 'jquery-datatables-rails'
72 73
73 74 #----------- user interface -----------------
74 75 #select 2
75 76 gem 'select2-rails'
76 77 #ace editor
77 78 gem 'ace-rails-ap'
78 79 #paginator
79 80 gem 'will_paginate', '~> 3.0.7'
80 81
81 82 gem 'mail'
82 83 gem 'rdiscount'
83 84 gem 'dynamic_form'
84 85 gem 'in_place_editing'
85 86 gem 'verification', :git => 'https://github.com/sikachu/verification.git'
86 87
87 88
88 89 #---------------- testiing -----------------------
89 90 gem 'minitest-reporters'
90 91
91 92 #---------------- for console --------------------
92 93 gem 'fuzzy-string-match'
@@ -1,247 +1,267
1 1 GIT
2 2 remote: https://github.com/sikachu/verification.git
3 3 revision: ff31697b940d7b0e2ec65f08764215c96104e76d
4 4 specs:
5 5 verification (1.0.3)
6 6 actionpack (>= 3.0.0, < 5.1)
7 7 activesupport (>= 3.0.0, < 5.1)
8 8
9 9 GEM
10 10 remote: https://rubygems.org/
11 11 specs:
12 12 RubyInline (3.12.4)
13 13 ZenTest (~> 4.3)
14 - ZenTest (4.11.1)
15 - ace-rails-ap (4.1.1)
16 - actionmailer (4.2.7.1)
17 - actionpack (= 4.2.7.1)
18 - actionview (= 4.2.7.1)
19 - activejob (= 4.2.7.1)
14 + ZenTest (4.11.2)
15 + ace-rails-ap (4.2)
16 + actionmailer (4.2.11.1)
17 + actionpack (= 4.2.11.1)
18 + actionview (= 4.2.11.1)
19 + activejob (= 4.2.11.1)
20 20 mail (~> 2.5, >= 2.5.4)
21 21 rails-dom-testing (~> 1.0, >= 1.0.5)
22 - actionpack (4.2.7.1)
23 - actionview (= 4.2.7.1)
24 - activesupport (= 4.2.7.1)
22 + actionpack (4.2.11.1)
23 + actionview (= 4.2.11.1)
24 + activesupport (= 4.2.11.1)
25 25 rack (~> 1.6)
26 26 rack-test (~> 0.6.2)
27 27 rails-dom-testing (~> 1.0, >= 1.0.5)
28 28 rails-html-sanitizer (~> 1.0, >= 1.0.2)
29 - actionview (4.2.7.1)
30 - activesupport (= 4.2.7.1)
29 + actionview (4.2.11.1)
30 + activesupport (= 4.2.11.1)
31 31 builder (~> 3.1)
32 32 erubis (~> 2.7.0)
33 33 rails-dom-testing (~> 1.0, >= 1.0.5)
34 - rails-html-sanitizer (~> 1.0, >= 1.0.2)
35 - activejob (4.2.7.1)
36 - activesupport (= 4.2.7.1)
34 + rails-html-sanitizer (~> 1.0, >= 1.0.3)
35 + activejob (4.2.11.1)
36 + activesupport (= 4.2.11.1)
37 37 globalid (>= 0.3.0)
38 - activemodel (4.2.7.1)
39 - activesupport (= 4.2.7.1)
38 + activemodel (4.2.11.1)
39 + activesupport (= 4.2.11.1)
40 40 builder (~> 3.1)
41 - activerecord (4.2.7.1)
42 - activemodel (= 4.2.7.1)
43 - activesupport (= 4.2.7.1)
41 + activerecord (4.2.11.1)
42 + activemodel (= 4.2.11.1)
43 + activesupport (= 4.2.11.1)
44 44 arel (~> 6.0)
45 - activerecord-session_store (1.0.0)
46 - actionpack (>= 4.0, < 5.1)
47 - activerecord (>= 4.0, < 5.1)
45 + activerecord-session_store (1.1.3)
46 + actionpack (>= 4.0)
47 + activerecord (>= 4.0)
48 48 multi_json (~> 1.11, >= 1.11.2)
49 49 rack (>= 1.5.2, < 3)
50 - railties (>= 4.0, < 5.1)
51 - activesupport (4.2.7.1)
50 + railties (>= 4.0)
51 + activesupport (4.2.11.1)
52 52 i18n (~> 0.7)
53 - json (~> 1.7, >= 1.7.7)
54 53 minitest (~> 5.1)
55 54 thread_safe (~> 0.3, >= 0.3.4)
56 55 tzinfo (~> 1.1)
57 56 ansi (1.5.0)
58 57 arel (6.0.4)
59 - autoprefixer-rails (6.6.0)
58 + autoprefixer-rails (9.5.1.1)
60 59 execjs
61 60 best_in_place (3.0.3)
62 61 actionpack (>= 3.2)
63 62 railties (>= 3.2)
64 - bootstrap-datepicker-rails (1.7.1.1)
63 + bootstrap-datepicker-rails (1.8.0.1)
65 64 railties (>= 3.0)
66 - bootstrap-sass (3.2.0.2)
67 - sass (~> 3.2)
68 - bootstrap-switch-rails (3.3.3)
65 + bootstrap-sass (3.4.1)
66 + autoprefixer-rails (>= 5.2.1)
67 + sassc (>= 2.0.0)
68 + bootstrap-switch-rails (3.3.4)
69 69 bootstrap-toggle-rails (2.2.1.0)
70 70 bootstrap3-datetimepicker-rails (4.17.47)
71 71 momentjs-rails (>= 2.8.1)
72 - builder (3.2.2)
73 - coffee-rails (4.2.1)
72 + builder (3.2.3)
73 + coffee-rails (4.2.2)
74 74 coffee-script (>= 2.2.0)
75 - railties (>= 4.0.0, < 5.2.x)
75 + railties (>= 4.0.0)
76 76 coffee-script (2.4.1)
77 77 coffee-script-source
78 78 execjs
79 79 coffee-script-source (1.12.2)
80 - concurrent-ruby (1.0.4)
80 + concurrent-ruby (1.1.5)
81 + crass (1.0.4)
81 82 dynamic_form (1.1.4)
82 83 erubis (2.7.0)
83 84 execjs (2.7.0)
84 - fuzzy-string-match (1.0.0)
85 + ffi (1.11.1)
86 + fuzzy-string-match (1.0.1)
85 87 RubyInline (>= 3.8.6)
86 - globalid (0.3.7)
87 - activesupport (>= 4.1.0)
88 - haml (4.0.7)
88 + globalid (0.4.2)
89 + activesupport (>= 4.2.0)
90 + haml (5.1.0)
91 + temple (>= 0.8.0)
89 92 tilt
90 - haml-rails (0.9.0)
93 + haml-rails (1.0.0)
91 94 actionpack (>= 4.0.1)
92 95 activesupport (>= 4.0.1)
93 - haml (>= 4.0.6, < 5.0)
96 + haml (>= 4.0.6, < 6.0)
94 97 html2haml (>= 1.0.1)
95 98 railties (>= 4.0.1)
96 - html2haml (2.0.0)
99 + html2haml (2.2.0)
97 100 erubis (~> 2.7.0)
98 - haml (~> 4.0.0)
99 - nokogiri (~> 1.6.0)
101 + haml (>= 4.0, < 6)
102 + nokogiri (>= 1.6.0)
100 103 ruby_parser (~> 3.5)
101 - i18n (0.7.0)
104 + i18n (0.9.5)
105 + concurrent-ruby (~> 1.0)
102 106 in_place_editing (1.2.0)
103 107 jquery-countdown-rails (2.0.2)
104 108 jquery-datatables-rails (3.4.0)
105 109 actionpack (>= 3.1)
106 110 jquery-rails
107 111 railties (>= 3.1)
108 112 sass-rails
109 - jquery-rails (4.2.1)
113 + jquery-rails (4.3.3)
110 114 rails-dom-testing (>= 1, < 3)
111 115 railties (>= 4.2.0)
112 116 thor (>= 0.14, < 2.0)
113 - jquery-tablesorter (1.23.3)
117 + jquery-tablesorter (1.26.1)
114 118 railties (>= 3.2, < 6)
115 119 jquery-timepicker-addon-rails (1.4.1)
116 120 railties (>= 3.1)
117 121 jquery-ui-rails (6.0.1)
118 122 railties (>= 3.2.16)
119 - json (1.8.3)
120 - loofah (2.0.3)
123 + loofah (2.2.3)
124 + crass (~> 1.0.2)
121 125 nokogiri (>= 1.5.9)
122 - mail (2.6.4)
123 - mime-types (>= 1.16, < 4)
124 - mime-types (3.1)
125 - mime-types-data (~> 3.2015)
126 - mime-types-data (3.2016.0521)
127 - mini_portile2 (2.1.0)
128 - minitest (5.10.1)
129 - minitest-reporters (1.1.13)
126 + mail (2.7.1)
127 + mini_mime (>= 0.1.1)
128 + mini_mime (1.0.1)
129 + mini_portile2 (2.4.0)
130 + minitest (5.11.3)
131 + minitest-reporters (1.3.6)
130 132 ansi
131 133 builder
132 134 minitest (>= 5.0)
133 135 ruby-progressbar
134 - momentjs-rails (2.15.1)
136 + momentjs-rails (2.20.1)
135 137 railties (>= 3.1)
136 - multi_json (1.12.1)
137 - mysql2 (0.4.5)
138 - nokogiri (1.6.8.1)
139 - mini_portile2 (~> 2.1.0)
140 - rack (1.6.5)
138 + multi_json (1.13.1)
139 + mysql2 (0.5.2)
140 + nokogiri (1.10.3)
141 + mini_portile2 (~> 2.4.0)
142 + rack (1.6.11)
141 143 rack-test (0.6.3)
142 144 rack (>= 1.0)
143 - rails (4.2.7.1)
144 - actionmailer (= 4.2.7.1)
145 - actionpack (= 4.2.7.1)
146 - actionview (= 4.2.7.1)
147 - activejob (= 4.2.7.1)
148 - activemodel (= 4.2.7.1)
149 - activerecord (= 4.2.7.1)
150 - activesupport (= 4.2.7.1)
145 + rails (4.2.11.1)
146 + actionmailer (= 4.2.11.1)
147 + actionpack (= 4.2.11.1)
148 + actionview (= 4.2.11.1)
149 + activejob (= 4.2.11.1)
150 + activemodel (= 4.2.11.1)
151 + activerecord (= 4.2.11.1)
152 + activesupport (= 4.2.11.1)
151 153 bundler (>= 1.3.0, < 2.0)
152 - railties (= 4.2.7.1)
154 + railties (= 4.2.11.1)
153 155 sprockets-rails
154 156 rails-deprecated_sanitizer (1.0.3)
155 157 activesupport (>= 4.2.0.alpha)
156 - rails-dom-testing (1.0.8)
157 - activesupport (>= 4.2.0.beta, < 5.0)
158 + rails-dom-testing (1.0.9)
159 + activesupport (>= 4.2.0, < 5.0)
158 160 nokogiri (~> 1.6)
159 161 rails-deprecated_sanitizer (>= 1.0.1)
160 - rails-html-sanitizer (1.0.3)
161 - loofah (~> 2.0)
162 - rails_bootstrap_sortable (2.0.1)
162 + rails-html-sanitizer (1.0.4)
163 + loofah (~> 2.2, >= 2.2.2)
164 + rails_bootstrap_sortable (2.0.6)
163 165 momentjs-rails (>= 2.8.3)
164 - railties (4.2.7.1)
165 - actionpack (= 4.2.7.1)
166 - activesupport (= 4.2.7.1)
166 + railties (4.2.11.1)
167 + actionpack (= 4.2.11.1)
168 + activesupport (= 4.2.11.1)
167 169 rake (>= 0.8.7)
168 170 thor (>= 0.18.1, < 2.0)
169 - rake (12.0.0)
171 + rake (12.3.2)
172 + rb-fsevent (0.10.3)
173 + rb-inotify (0.10.0)
174 + ffi (~> 1.0)
170 175 rdiscount (2.2.0.1)
171 - rouge (2.0.7)
172 - ruby-progressbar (1.8.1)
173 - ruby_parser (3.8.3)
174 - sexp_processor (~> 4.1)
175 - sass (3.4.23)
176 - sass-rails (5.0.6)
176 + rouge (3.3.0)
177 + ruby-progressbar (1.10.0)
178 + ruby_parser (3.13.1)
179 + sexp_processor (~> 4.9)
180 + sass (3.7.4)
181 + sass-listen (~> 4.0.0)
182 + sass-listen (4.0.0)
183 + rb-fsevent (~> 0.9, >= 0.9.4)
184 + rb-inotify (~> 0.9, >= 0.9.7)
185 + sass-rails (5.0.7)
177 186 railties (>= 4.0.0, < 6)
178 187 sass (~> 3.1)
179 188 sprockets (>= 2.8, < 4.0)
180 189 sprockets-rails (>= 2.0, < 4.0)
181 190 tilt (>= 1.1, < 3)
191 + sassc (2.0.1)
192 + ffi (~> 1.9)
193 + rake
194 + sassc-rails (2.1.1)
195 + railties (>= 4.0.0)
196 + sassc (>= 2.0)
197 + sprockets (> 3.0)
198 + sprockets-rails
199 + tilt
182 200 select2-rails (4.0.3)
183 201 thor (~> 0.14)
184 - sexp_processor (4.7.0)
185 - sprockets (3.7.1)
202 + sexp_processor (4.12.0)
203 + sprockets (3.7.2)
186 204 concurrent-ruby (~> 1.0)
187 205 rack (> 1, < 3)
188 - sprockets-rails (3.2.0)
206 + sprockets-rails (3.2.1)
189 207 actionpack (>= 4.0)
190 208 activesupport (>= 4.0)
191 209 sprockets (>= 3.0.0)
192 - sqlite3 (1.3.12)
193 - thor (0.19.4)
194 - thread_safe (0.3.5)
195 - tilt (2.0.5)
196 - tzinfo (1.2.2)
210 + sqlite3 (1.4.1)
211 + temple (0.8.1)
212 + thor (0.20.3)
213 + thread_safe (0.3.6)
214 + tilt (2.0.9)
215 + tzinfo (1.2.5)
197 216 thread_safe (~> 0.1)
198 - uglifier (3.0.4)
217 + uglifier (4.1.20)
199 218 execjs (>= 0.3.0, < 3)
200 219 will_paginate (3.0.12)
201 - yaml_db (0.4.2)
202 - rails (>= 3.0, < 5.1)
220 + yaml_db (0.7.0)
221 + rails (>= 3.0)
203 222 rake (>= 0.8.7)
204 223
205 224 PLATFORMS
206 225 ruby
207 226
208 227 DEPENDENCIES
209 228 ace-rails-ap
210 229 activerecord-session_store
211 230 autoprefixer-rails
212 231 best_in_place (~> 3.0.1)
213 232 bootstrap-datepicker-rails
214 - bootstrap-sass (~> 3.2.0)
233 + bootstrap-sass (~> 3.4.1)
215 234 bootstrap-switch-rails
216 235 bootstrap-toggle-rails
217 236 bootstrap3-datetimepicker-rails
218 237 coffee-rails
219 238 dynamic_form
220 239 fuzzy-string-match
221 240 haml
222 241 haml-rails
223 242 in_place_editing
224 243 jquery-countdown-rails
225 244 jquery-datatables-rails
226 245 jquery-rails
227 246 jquery-tablesorter
228 247 jquery-timepicker-addon-rails
229 248 jquery-ui-rails
230 249 mail
231 250 minitest-reporters
232 251 momentjs-rails
233 252 mysql2
234 253 rails (~> 4.2.0)
235 254 rails_bootstrap_sortable
236 255 rdiscount
237 256 rouge
238 257 sass-rails
258 + sassc-rails (>= 2.1.0)
239 259 select2-rails
240 260 sqlite3
241 261 uglifier
242 262 verification!
243 263 will_paginate (~> 3.0.7)
244 264 yaml_db
245 265
246 266 BUNDLED WITH
247 - 1.15.4
267 + 1.17.2
@@ -1,147 +1,145
1 1 == Installation
2 2
3 3 Installing cafe-grader can be done in the following steps.
4 4
5 5 1. Set up database. We need MySQL 5 database name, username and password.
6 6 2. Install RVM. cafe-grader runs on Ruby on Rails and the best way to install it is to use RVM.
7 7 3. Install necessary package for the system
8 8 4. Install cafe-grader from github
9 9 5. Deploy cafe-grader on apache with Phusion Passenger
10 10
11 11 Very important!!! All commands should be run from a normal user.
12 12
13 13 The detail of each step are provided as follows.
14 14
15 15 === 1. Install MySQL 5
16 16
17 17 Install MySQL server for the server.
18 18
19 19 cafe@grader:~$ sudo apt install mysql-server
20 20
21 21 Next, we will connect to mysql as root and set up the database. You can choose your DATABASENAME, USERNAME and PASSWORD as you wish.
22 22
23 23 cafe@grader:~$ sudo mysql -u root
24 24
25 25 mysql> create database DATABASENAME;
26 26 Query OK, 1 row affected (0.00 sec)
27 27
28 28 mysql> grant all privileges on DATABASENAME.* to USERNAME@localhost identified by 'PASSWORD';
29 29 Query OK, 0 rows affected, 1 warning (0.00 sec)
30 30
31 31 mysql> flush privileges;
32 32 Query OK, 0 rows affected (0.00 sec)
33 33
34 34 === 2. Install RVM
35 35
36 36 Since Ubuntu has dedicated package for RVM we will use that. Just follow instruction given in https://github.com/rvm/ubuntu_rvm. For your convenience, the step are reproduced here.
37 37
38 38 First, we install necessary package for installing RVM.
39 39
40 40 cafe@grader:~$ sudo apt install software-properties-common
41 41
42 42 Second, we add the custom PPA, update the system and install RVM.
43 43
44 44 cafe@grader:~$ sudo apt-add-repository -y ppa:rael-gc/rvm
45 45 cafe@grader:~$ sudo apt-get update
46 46 cafe@grader:~$ sudo apt-get install rvm
47 47
48 48 This is very important. You have to logout and login again since RVM change a lots of system.
49 49
50 50 If you are using GUI version of Ubuntu, be sure to have Gnome Terminal (or any other terminal you are using) perform login every time. This can be done by mark the check box "Run command as a login shell" in Gnome terminal or by adding --login to bash.
51 51
52 52 === 3. Install necessary package
53 53
54 - cafe@grader:~$ sudo apt install libmysqlclient-dev default-jdk unzip nodejs php7.2-cli apache2 dirmngr gnupg apache2-dev
55 -
56 - curl build-essential
54 + cafe@grader:~$ sudo apt install libmysqlclient-dev default-jdk unzip nodejs php-cli apache2 dirmngr gnupg apache2-dev
57 55
58 56 === 4. Install cafe-grader
59 57
60 58 First, ensure that RVM is installed correctly.
61 59
62 60 cafe@grader:~$ rvm
63 61
64 62 If you get a result similar to this.
65 63
66 64 Command 'rvm' not found, but there are 21 similar ones.
67 65
68 66 It is very likely that you have not re-login or you are using bash without --login. Please do so and re-read the installation of RVM on Ubuntu https://github.com/rvm/ubuntu_rvm again.
69 67
70 68 Next, we will let the install script do the work of installing cafe-grader. Please prepare the DATABASENAME, USERNAME and PASSWORD as the script will ask for that. Make sure that you run the script from the home directory of the user.
71 69
72 70 cafe@grader:~$ wget https://github.com/cafe-grader-team/cafe-grader-judge-scripts/raw/master/installer/install.sh
73 71 cafe@grader:~$ . ./install.sh
74 72
75 73 After installation is finished, grader is ready to run in development mode via WEBrick. We will try that by the following command which will start a grader accessible via http://localhost:3000/. You can try logging in to the system and verify that it is actually work.
76 74
77 75 cafe@grader:~/cafe_grader/web$ rails s
78 76
79 77 If Everything is OK, stop the WEBrick by Ctrl-C.
80 78
81 79 We are almost done. The last step is to set up apache and Phusion so that cafe-grader is served by apache.
82 80
83 81 === 5. Deploy cafe-grader on Phusion passenger via apache
84 82
85 83 This will install a Passenger mod for apache. You can start by visiting https://www.phusionpassenger.com/library/walkthroughs/deploy/ruby/ownserver/apache/oss/install_passenger_main.html and fllow through the guide. We have reproduce the step here for Ubuntu 18.04. For other version, please select the appropriate one on the previous link.
86 84
87 85 The deploy is divided into two parts: Installing Passenger and deploying the app.
88 86
89 87 ==== 5.1. Installing Passenger as a mod for apache via PPA and enable it.
90 88
91 89 cafe@grader:~$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
92 90 cafe@grader:~$ sudo apt-get install -y apt-transport-https ca-certificates
93 91 cafe@grader:~$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
94 92 cafe@grader:~$ sudo apt-get update
95 93 cafe@grader:~$ sudo apt-get install -y libapache2-mod-passenger
96 94 cafe@grader:~$ sudo a2enmod passenger
97 95
98 96
99 97 cafe@grader:~$ sudo apache2ctl restart
100 98
101 99 Finally, we should check that passenger is installed correctly. Run the following command and fix anything as suggested by the command.
102 100
103 101 cafe@grader:~$ sudo /usr/bin/passenger-config validate-install
104 102
105 103 ==== 5.2. Deploying the app. First, we determine the exact location of our ruby that is installed via RVM.
106 104
107 105 cafe@grader:~$ passenger-config about ruby-command
108 106 passenger-config was invoked through the following Ruby interpreter:
109 107 Command: /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby
110 108 Version: ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-linux]
111 109 To use in Apache: PassengerRuby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby
112 110 To use in Nginx : passenger_ruby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby
113 111 To use with Standalone: /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby /usr/bin/passenger start
114 112
115 113 Then, take note of the path after "Command". For this guide, it is /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby
116 114
117 115 Assuming that cafe-grader is installed at /home/cafe/cafe_grader, we will edit the Apache's site config file /etc/apache2/site-enabled/000-default.conf as follow.
118 116
119 117 <VirtualHost *:80>
120 118 #ServerName www.example.com
121 119
122 120 ServerAdmin webmaster@localhost
123 121 # dont forget to change the document root
124 122 DocumentRoot /home/cafe/cafe_grader/web/public
125 123
126 124 ErrorLog ${APACHE_LOG_DIR}/error.log
127 125 CustomLog ${APACHE_LOG_DIR}/access.log combined
128 126
129 127 # add Passenger
130 128 PassengerRuby /home/cafe/.rvm/gems/ruby-2.3.7/wrappers/ruby
131 129
132 130 # our cafe-grader app
133 131 <Directory /home/cafe/cafe_grader/web/public>
134 132 Allow from all
135 133 Options -MultiViews
136 134 Require all granted
137 135 </Directory>
138 136 </VirtualHost>
139 137
140 138
141 139 Be noted that we make 3 modifications: 1) change DocumentRoot, 2) add PassengerRuby option and add 3) Directory directive
142 140 As the last step, we restart apache again and the site is ready to be used.
143 141
144 142 cafe@grader:~$ sudo apache2ctl restart
145 143
146 144 Now it is done, you can login to the grader with user 'root' and password 'ioionrails'
147 145
@@ -211,100 +211,100
211 211 flash[:alert] = "The following problems are already in the group #{group.name}: " + failed.join(', ') if failed.count > 0
212 212 elsif params.has_key? 'add_tags'
213 213 get_problems_from_params.each do |p|
214 214 p.tag_ids += params[:tag_ids]
215 215 end
216 216 end
217 217
218 218 redirect_to :action => 'manage'
219 219 end
220 220
221 221 def import
222 222 @allow_test_pair_import = allow_test_pair_import?
223 223 end
224 224
225 225 def do_import
226 226 old_problem = Problem.find_by_name(params[:name])
227 227 if !allow_test_pair_import? and params.has_key? :import_to_db
228 228 params.delete :import_to_db
229 229 end
230 230 @problem, import_log = Problem.create_from_import_form_params(params,
231 231 old_problem)
232 232
233 233 if !@problem.errors.empty?
234 234 render :action => 'import' and return
235 235 end
236 236
237 237 if old_problem!=nil
238 238 flash[:notice] = "The test data has been replaced for problem #{@problem.name}"
239 239 end
240 240 @log = import_log
241 241 end
242 242
243 243 def remove_contest
244 244 problem = Problem.find(params[:id])
245 245 contest = Contest.find(params[:contest_id])
246 246 if problem!=nil and contest!=nil
247 247 problem.contests.delete(contest)
248 248 end
249 249 redirect_to :action => 'manage'
250 250 end
251 251
252 252 ##################################
253 253 protected
254 254
255 255 def allow_test_pair_import?
256 256 if defined? ALLOW_TEST_PAIR_IMPORT
257 257 return ALLOW_TEST_PAIR_IMPORT
258 258 else
259 259 return false
260 260 end
261 261 end
262 262
263 263 def change_date_added
264 264 problems = get_problems_from_params
265 265 date = Date.parse(params[:date_added])
266 266 problems.each do |p|
267 267 p.date_added = date
268 268 p.save
269 269 end
270 270 end
271 271
272 272 def add_to_contest
273 273 problems = get_problems_from_params
274 274 contest = Contest.find(params[:contest][:id])
275 275 if contest!=nil and contest.enabled
276 276 problems.each do |p|
277 277 p.contests << contest
278 278 end
279 279 end
280 280 end
281 281
282 282 def set_available(avail)
283 283 problems = get_problems_from_params
284 284 problems.each do |p|
285 285 p.available = avail
286 286 p.save
287 287 end
288 288 end
289 289
290 290 def get_problems_from_params
291 291 problems = []
292 292 params.keys.each do |k|
293 293 if k.index('prob-')==0
294 294 name, id, order = k.split('-')
295 295 problems << Problem.find(id)
296 296 end
297 297 end
298 298 problems
299 299 end
300 300
301 301 def get_problems_stat
302 302 end
303 303
304 304 private
305 305
306 306 def problem_params
307 - params.require(:problem).permit(:name, :full_name, :full_score, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[])
307 + params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[])
308 308 end
309 309
310 310 end
@@ -1,111 +1,113
1 1 class Problem < ActiveRecord::Base
2 2
3 3 belongs_to :description
4 4 has_and_belongs_to_many :contests, :uniq => true
5 5
6 6 #has_and_belongs_to_many :groups
7 7 has_many :groups_problems, class_name: GroupProblem
8 8 has_many :groups, :through => :groups_problems
9 9
10 10 has_many :problems_tags, class_name: ProblemTag
11 11 has_many :tags, through: :problems_tags
12 12
13 13 has_many :test_pairs, :dependent => :delete_all
14 14 has_many :testcases, :dependent => :destroy
15 15
16 + has_many :submissions
17 +
16 18 validates_presence_of :name
17 19 validates_format_of :name, :with => /\A\w+\z/
18 20 validates_presence_of :full_name
19 21
20 22 scope :available, -> { where(available: true) }
21 23
22 24 DEFAULT_TIME_LIMIT = 1
23 25 DEFAULT_MEMORY_LIMIT = 32
24 26
25 27 def self.available_problems
26 28 available.order(date_added: :desc).order(:name)
27 29 #Problem.available.all(:order => "date_added DESC, name ASC")
28 30 end
29 31
30 32 def self.create_from_import_form_params(params, old_problem=nil)
31 33 org_problem = old_problem || Problem.new
32 34 import_params, problem = Problem.extract_params_and_check(params,
33 35 org_problem)
34 36
35 37 if !problem.errors.empty?
36 38 return problem, 'Error importing'
37 39 end
38 40
39 41 problem.full_score = 100
40 42 problem.date_added = Time.new
41 43 problem.test_allowed = true
42 44 problem.output_only = false
43 45 problem.available = false
44 46
45 47 if not problem.save
46 48 return problem, 'Error importing'
47 49 end
48 50
49 51 import_to_db = params.has_key? :import_to_db
50 52
51 53 importer = TestdataImporter.new(problem)
52 54
53 55 if not importer.import_from_file(import_params[:file],
54 56 import_params[:time_limit],
55 57 import_params[:memory_limit],
56 58 import_params[:checker_name],
57 59 import_to_db)
58 60 problem.errors.add(:base,'Import error.')
59 61 end
60 62
61 63 return problem, importer.log_msg
62 64 end
63 65
64 66 def self.download_file_basedir
65 67 return "#{Rails.root}/data/tasks"
66 68 end
67 69
68 70 def get_submission_stat
69 71 result = Hash.new
70 72 #total number of submission
71 73 result[:total_sub] = Submission.where(problem_id: self.id).count
72 74 result[:attempted_user] = Submission.where(problem_id: self.id).group(:user_id)
73 75 result[:pass] = Submission.where(problem_id: self.id).where("points >= ?",self.full_score).count
74 76 return result
75 77 end
76 78
77 79 def long_name
78 80 "[#{name}] #{full_name}"
79 81 end
80 82
81 83 protected
82 84
83 85 def self.to_i_or_default(st, default)
84 86 if st!=''
85 87 result = st.to_i
86 88 end
87 89 result ||= default
88 90 end
89 91
90 92 def self.to_f_or_default(st, default)
91 93 if st!=''
92 94 result = st.to_f
93 95 end
94 96 result ||= default
95 97 end
96 98
97 99 def self.extract_params_and_check(params, problem)
98 100 time_limit = Problem.to_f_or_default(params[:time_limit],
99 101 DEFAULT_TIME_LIMIT)
100 102 memory_limit = Problem.to_i_or_default(params[:memory_limit],
101 103 DEFAULT_MEMORY_LIMIT)
102 104
103 105 if time_limit<=0 or time_limit >60
104 106 problem.errors.add(:base,'Time limit out of range.')
105 107 end
106 108
107 109 if memory_limit==0 and params[:memory_limit]!='0'
108 110 problem.errors.add(:base,'Memory limit format errors.')
109 111 elsif memory_limit<=0 or memory_limit >512
110 112 problem.errors.add(:base,'Memory limit out of range.')
111 113 end
@@ -1,28 +1,30
1 1 - if submission.nil?
2 2 = "-"
3 3 - else
4 4 %strong= "Submission ID:"
5 5 = submission.id
6 6 %br
7 7 - unless submission.graded_at
8 8 %strong= t 'main.submitted_at:'
9 9 = format_full_time_ago(submission.submitted_at.localtime)
10 10 - else
11 11 %strong= t 'main.graded_at:'
12 12 = format_full_time_ago(submission.graded_at.localtime)
13 13 %br
14 14 - if GraderConfiguration['ui.show_score']
15 15 %strong=t 'main.score'
16 16 = "#{(submission.points*100/submission.problem.full_score).to_i} "
17 17 = " ["
18 18 %tt
19 19 = submission.grader_comment
20 20 = "]"
21 21 %br
22 22 %strong View:
23 23 - if GraderConfiguration.show_grading_result
24 24 = link_to '[detailed result]', :action => 'result', :id => submission.id
25 - = link_to "#{t 'main.cmp_msg'}", {:action => 'compiler_msg', :id => submission.id}, {popup: true,class: 'btn btn-xs btn-info'} if submission.graded_at
25 + - if submission.graded_at
26 + %button.btn.btn-info.btn-xs{type: 'button', data: {toggle: 'modal', target: '#compiler'}}
27 + =t 'main.cmp_msg'
26 28 = link_to "#{t 'main.src_link'}", download_submission_path(submission.id), class: 'btn btn-xs btn-info'
27 29 = link_to "#{t 'main.submissions_link'}", problem_submissions_path(problem_id), class: 'btn btn-xs btn-info'
28 30
@@ -1,149 +1,161
1 1 %h2 Live submit
2 2 %br
3 3
4 4 %textarea#text_sourcecode{style: "display:none"}~ @source
5 5 .container
6 6 .row
7 7 .col-md-12
8 8 .alert.alert-info
9 9 Write your code in the following box, choose language, and click submit button when finished
10 10 .row
11 11 .col-md-8
12 12 %div#editor{style: 'height: 500px; border-radius: 7px; font-size: 14px;'}
13 13 .col-md-4
14 14 - # submission form
15 15 = form_tag({controller: :main, :action => 'submit'}, :multipart => true, class: 'form') do
16 16
17 17 = hidden_field_tag 'editor_text', @source
18 18 = hidden_field_tag 'submission[problem_id]', @problem.id
19 19 .form-group
20 20 = label_tag "Task:"
21 21 = text_field_tag 'asdf', "#{@problem.long_name}", class: 'form-control', disabled: true
22 22 .form-group
23 23 = label_tag "Description:"
24 24 = link_to_description_if_any "[download] <span class='glyphicon glyphicon-file'></span>".html_safe, @problem
25 25
26 26 .form-group
27 27 = label_tag 'Language:'
28 28 = select_tag 'language_id', options_from_collection_for_select(Language.all, 'id', 'pretty_name', @lang_id || Language.find_by_pretty_name("Python").id || Language.first.id), class: 'form-control select', style: "width: 100px"
29 29 .form-group
30 30 .input-group
31 31 %span.input-group-btn
32 32 %span.btn.btn-default.btn-file
33 33 Browse
34 34 = file_field_tag 'load_file'
35 35 = text_field_tag '' , nil, {readonly: true, class: 'form-control'}
36 36 .form-group
37 37 = submit_tag 'Submit', class: 'btn btn-success', id: 'live_submit',
38 38 data: {confirm: "Submitting this source code for task #{@problem.long_name}?"}
39 39 - # latest submission status
40 40 .panel{class: (@submission && @submission.graded_at) ? "panel-info" : "panel-warning"}
41 41 .panel-heading
42 42 Latest Submission Status
43 43 = link_to "Refresh",get_latest_submission_status_submissions_path(@submission.user,@problem), class: "btn btn-default btn-sm", remote: true if @submission
44 44 .panel-body
45 45 %div#latest_status
46 46 - if @submission
47 47 = render :partial => 'submission_short',
48 48 :locals => {submission: @submission, problem_name: @problem.name, problem_id: @problem.id }
49 49 .row
50 50 .col-md-12
51 51 %h2 Console
52 52 %textarea#console{style: 'height: 100%; width: 100%;background-color:#000;color:#fff;font-family: consolas, monaco, "Droid Sans Mono";',rows: 20}
53 53
54 + .modal.fade#compiler{tabindex: -1,role: 'dialog'}
55 + .modal-dialog.modal-lg{role:'document'}
56 + .modal-content
57 + .modal-header
58 + %button.close{type: 'button', data: {dismissed: :modal}, aria: {label: 'close'}}
59 + %span{aria: {hidden: 'true'}, data: {dismiss: 'modal'}} &times;
60 + %h4 Compiler message
61 + .modal-body
62 + %pre#compiler_msg= @submission.compiler_message
63 + .modal-footer
64 + %button.btn.btn-default{type: 'button', data: {dismiss: 'modal'}} Close
65 +
54 66 :javascript
55 67 $(document).ready(function() {
56 68 e = ace.edit("editor")
57 69 e.setValue($("#text_sourcecode").val());
58 70 e.gotoLine(1);
59 71 $("#language_id").trigger('change');
60 72
61 73 $("#load_file").on('change',function(evt) {
62 74 var file = evt.target.files[0];
63 75 var reader = new FileReader();
64 76 reader.onload = function(theFile) {
65 77 var e = ace.edit("editor")
66 78 e.setValue(theFile.target.result);
67 79 e.gotoLine(1);
68 80 };
69 81 reader.readAsText(file)
70 82 });
71 83
72 84 //brython();
73 85 });
74 86
75 87
76 88
77 89
78 90
79 91 %script#__main__{type:'text/python3'}
80 92 :plain
81 93 import sys
82 94 import traceback
83 95
84 96 from browser import document as doc
85 97 from browser import window, alert, console
86 98
87 99 _credits = """ Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
88 100 for supporting Python development. See www.python.org for more information."""
89 101
90 102 _copyright = """Copyright (c) 2012, Pierre Quentel pierre.quentel@gmail.com
91 103 All Rights Reserved.
92 104
93 105 Copyright (c) 2001-2013 Python Software Foundation.
94 106 All Rights Reserved.
95 107
96 108 Copyright (c) 2000 BeOpen.com.
97 109 All Rights Reserved.
98 110
99 111 Copyright (c) 1995-2001 Corporation for National Research Initiatives.
100 112 All Rights Reserved.
101 113
102 114 Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
103 115 All Rights Reserved."""
104 116
105 117 _license = """Copyright (c) 2012, Pierre Quentel pierre.quentel@gmail.com
106 118 All rights reserved.
107 119
108 120 Redistribution and use in source and binary forms, with or without
109 121 modification, are permitted provided that the following conditions are met:
110 122
111 123 Redistributions of source code must retain the above copyright notice, this
112 124 list of conditions and the following disclaimer. Redistributions in binary
113 125 form must reproduce the above copyright notice, this list of conditions and
114 126 the following disclaimer in the documentation and/or other materials provided
115 127 with the distribution.
116 128 Neither the name of the <ORGANIZATION> nor the names of its contributors may
117 129 be used to endorse or promote products derived from this software without
118 130 specific prior written permission.
119 131
120 132 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
121 133 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
122 134 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
123 135 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
124 136 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
125 137 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
126 138 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
127 139 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
128 140 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
129 141 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
130 142 POSSIBILITY OF SUCH DAMAGE.
131 143 """
132 144
133 145 def credits():
134 146 print(_credits)
135 147 credits.__repr__ = lambda:_credits
136 148
137 149 def copyright():
138 150 print(_copyright)
139 151 copyright.__repr__ = lambda:_copyright
140 152
141 153 def license():
142 154 print(_license)
143 155 license.__repr__ = lambda:_license
144 156
145 157 def write(data):
146 158 doc['console'].value += str(data)
147 159
148 160
149 161 sys.stdout.write = sys.stderr.write = write
@@ -1,35 +1,36
1 1 = user_title_bar(@user)
2 2
3 3 %h1 Your account settings
4 4
5 5 -#%p
6 6 -#You can edit your alias and e-mails. Just click on the text and edit it.
7 7
8 - %table.uinfo
8 + %table.table.table-bordered{:style => "width:30%"}
9 9 %tr
10 - %th.uinfo Login
11 - %td.uinfo= @user.login
10 + %th Login
11 + %td= @user.login
12 12 %tr
13 - %th.uinfo Full name
14 - %td.uinfo= @user.full_name
13 + %th Full name
14 + %td= @user.full_name
15 15 -#%tr
16 16 -#%th.uinfo Alias
17 17 -#%td.uinfo= in_place_editor_field :user, 'alias_for_editing', {}, :rows => 1
18 18 -#%tr
19 19 -#%th.uinfo E-mail
20 20 -#%td.uinfo= in_place_editor_field :user, 'email_for_editing', {}, :rows => 1
21 21 %tr
22 - %th.uinfo Password
23 - %td.uinfo
22 + %th Password
23 + %td
24 24 = form_tag :action => 'chg_passwd', :method => 'post' do
25 25 %table
26 26 %tr
27 - %td= password_field_tag 'passwd'
27 + %td
28 + %input{:type => "password", :class => "form-control", :name => "passwd", :id => "passwd"}
28 29 %td (new)
29 30 %tr
30 - %td= password_field_tag 'passwd_verify'
31 + %td
32 + %input{:type => "password", :class => "form-control", :name => "passwd_verify", :id => "passwd_verify"}
31 33 %td (verify)
32 34 %tr
33 35 %td{:colspan => "2"}
34 - = submit_tag 'change password'
35 -
36 + %input{:type => "button", :class => "btn btn-default", :name => "commit", :value => "Change Password"}
@@ -1,321 +1,321
1 1 # encoding: UTF-8
2 2 # This file is auto-generated from the current state of the database. Instead
3 3 # of editing this file, please use the migrations feature of Active Record to
4 4 # incrementally modify your database, and then regenerate this schema definition.
5 5 #
6 6 # Note that this schema.rb definition is the authoritative source for your
7 7 # database schema. If you need to create the application database on another
8 8 # system, you should be using db:schema:load, not running all the migrations
9 9 # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10 10 # you'll amass, the slower it'll run and the greater likelihood for issues).
11 11 #
12 12 # It's strongly recommended that you check this file into your version control system.
13 13
14 14 ActiveRecord::Schema.define(version: 20180612102327) do
15 15
16 16 create_table "announcements", force: :cascade do |t|
17 17 t.string "author", limit: 255
18 18 t.text "body", limit: 65535
19 19 t.boolean "published"
20 - t.datetime "created_at", null: false
21 - t.datetime "updated_at", null: false
20 + t.datetime "created_at"
21 + t.datetime "updated_at"
22 22 t.boolean "frontpage", default: false
23 23 t.boolean "contest_only", default: false
24 24 t.string "title", limit: 255
25 25 t.string "notes", limit: 255
26 26 end
27 27
28 28 create_table "contests", force: :cascade do |t|
29 29 t.string "title", limit: 255
30 30 t.boolean "enabled"
31 - t.datetime "created_at", null: false
32 - t.datetime "updated_at", null: false
31 + t.datetime "created_at"
32 + t.datetime "updated_at"
33 33 t.string "name", limit: 255
34 34 end
35 35
36 36 create_table "contests_problems", id: false, force: :cascade do |t|
37 37 t.integer "contest_id", limit: 4
38 38 t.integer "problem_id", limit: 4
39 39 end
40 40
41 41 create_table "contests_users", id: false, force: :cascade do |t|
42 42 t.integer "contest_id", limit: 4
43 43 t.integer "user_id", limit: 4
44 44 end
45 45
46 46 create_table "countries", force: :cascade do |t|
47 47 t.string "name", limit: 255
48 - t.datetime "created_at", null: false
49 - t.datetime "updated_at", null: false
48 + t.datetime "created_at"
49 + t.datetime "updated_at"
50 50 end
51 51
52 52 create_table "descriptions", force: :cascade do |t|
53 53 t.text "body", limit: 65535
54 54 t.boolean "markdowned"
55 - t.datetime "created_at", null: false
56 - t.datetime "updated_at", null: false
55 + t.datetime "created_at"
56 + t.datetime "updated_at"
57 57 end
58 58
59 59 create_table "grader_configurations", force: :cascade do |t|
60 60 t.string "key", limit: 255
61 61 t.string "value_type", limit: 255
62 62 t.string "value", limit: 255
63 - t.datetime "created_at", null: false
64 - t.datetime "updated_at", null: false
63 + t.datetime "created_at"
64 + t.datetime "updated_at"
65 65 t.text "description", limit: 65535
66 66 end
67 67
68 68 create_table "grader_processes", force: :cascade do |t|
69 69 t.string "host", limit: 255
70 70 t.integer "pid", limit: 4
71 71 t.string "mode", limit: 255
72 72 t.boolean "active"
73 - t.datetime "created_at", null: false
74 - t.datetime "updated_at", null: false
73 + t.datetime "created_at"
74 + t.datetime "updated_at"
75 75 t.integer "task_id", limit: 4
76 76 t.string "task_type", limit: 255
77 77 t.boolean "terminated"
78 78 end
79 79
80 - add_index "grader_processes", ["host", "pid"], name: "index_grader_processes_on_ip_and_pid", using: :btree
80 + add_index "grader_processes", ["host", "pid"], name: "index_grader_processes_on_host_and_pid", using: :btree
81 81
82 82 create_table "groups", force: :cascade do |t|
83 83 t.string "name", limit: 255
84 84 t.string "description", limit: 255
85 85 end
86 86
87 87 create_table "groups_problems", id: false, force: :cascade do |t|
88 88 t.integer "problem_id", limit: 4, null: false
89 89 t.integer "group_id", limit: 4, null: false
90 90 end
91 91
92 92 add_index "groups_problems", ["group_id", "problem_id"], name: "index_groups_problems_on_group_id_and_problem_id", using: :btree
93 93
94 94 create_table "groups_users", id: false, force: :cascade do |t|
95 95 t.integer "group_id", limit: 4, null: false
96 96 t.integer "user_id", limit: 4, null: false
97 97 end
98 98
99 99 add_index "groups_users", ["user_id", "group_id"], name: "index_groups_users_on_user_id_and_group_id", using: :btree
100 100
101 101 create_table "heart_beats", force: :cascade do |t|
102 102 t.integer "user_id", limit: 4
103 103 t.string "ip_address", limit: 255
104 - t.datetime "created_at", null: false
105 - t.datetime "updated_at", null: false
104 + t.datetime "created_at"
105 + t.datetime "updated_at"
106 106 t.string "status", limit: 255
107 107 end
108 108
109 109 add_index "heart_beats", ["updated_at"], name: "index_heart_beats_on_updated_at", using: :btree
110 110
111 111 create_table "languages", force: :cascade do |t|
112 112 t.string "name", limit: 10
113 113 t.string "pretty_name", limit: 255
114 114 t.string "ext", limit: 10
115 115 t.string "common_ext", limit: 255
116 116 end
117 117
118 118 create_table "logins", force: :cascade do |t|
119 119 t.integer "user_id", limit: 4
120 120 t.string "ip_address", limit: 255
121 - t.datetime "created_at", null: false
122 - t.datetime "updated_at", null: false
121 + t.datetime "created_at"
122 + t.datetime "updated_at"
123 123 end
124 124
125 125 create_table "messages", force: :cascade do |t|
126 126 t.integer "sender_id", limit: 4
127 127 t.integer "receiver_id", limit: 4
128 128 t.integer "replying_message_id", limit: 4
129 129 t.text "body", limit: 65535
130 130 t.boolean "replied"
131 - t.datetime "created_at", null: false
132 - t.datetime "updated_at", null: false
131 + t.datetime "created_at"
132 + t.datetime "updated_at"
133 133 end
134 134
135 135 create_table "problems", force: :cascade do |t|
136 136 t.string "name", limit: 30
137 137 t.string "full_name", limit: 255
138 138 t.integer "full_score", limit: 4
139 139 t.date "date_added"
140 140 t.boolean "available"
141 141 t.string "url", limit: 255
142 142 t.integer "description_id", limit: 4
143 143 t.boolean "test_allowed"
144 144 t.boolean "output_only"
145 145 t.string "description_filename", limit: 255
146 146 t.boolean "view_testcase"
147 147 end
148 148
149 149 create_table "problems_tags", force: :cascade do |t|
150 150 t.integer "problem_id", limit: 4
151 151 t.integer "tag_id", limit: 4
152 152 end
153 153
154 154 add_index "problems_tags", ["problem_id", "tag_id"], name: "index_problems_tags_on_problem_id_and_tag_id", unique: true, using: :btree
155 155 add_index "problems_tags", ["problem_id"], name: "index_problems_tags_on_problem_id", using: :btree
156 156 add_index "problems_tags", ["tag_id"], name: "index_problems_tags_on_tag_id", using: :btree
157 157
158 158 create_table "rights", force: :cascade do |t|
159 159 t.string "name", limit: 255
160 160 t.string "controller", limit: 255
161 161 t.string "action", limit: 255
162 162 end
163 163
164 164 create_table "rights_roles", id: false, force: :cascade do |t|
165 165 t.integer "right_id", limit: 4
166 166 t.integer "role_id", limit: 4
167 167 end
168 168
169 169 add_index "rights_roles", ["role_id"], name: "index_rights_roles_on_role_id", using: :btree
170 170
171 171 create_table "roles", force: :cascade do |t|
172 172 t.string "name", limit: 255
173 173 end
174 174
175 175 create_table "roles_users", id: false, force: :cascade do |t|
176 176 t.integer "role_id", limit: 4
177 177 t.integer "user_id", limit: 4
178 178 end
179 179
180 180 add_index "roles_users", ["user_id"], name: "index_roles_users_on_user_id", using: :btree
181 181
182 182 create_table "sessions", force: :cascade do |t|
183 183 t.string "session_id", limit: 255
184 184 t.text "data", limit: 65535
185 185 t.datetime "updated_at"
186 186 end
187 187
188 188 add_index "sessions", ["session_id"], name: "index_sessions_on_session_id", using: :btree
189 189 add_index "sessions", ["updated_at"], name: "index_sessions_on_updated_at", using: :btree
190 190
191 191 create_table "sites", force: :cascade do |t|
192 192 t.string "name", limit: 255
193 193 t.boolean "started"
194 194 t.datetime "start_time"
195 - t.datetime "created_at", null: false
196 - t.datetime "updated_at", null: false
195 + t.datetime "created_at"
196 + t.datetime "updated_at"
197 197 t.integer "country_id", limit: 4
198 198 t.string "password", limit: 255
199 199 end
200 200
201 201 create_table "submission_view_logs", force: :cascade do |t|
202 202 t.integer "user_id", limit: 4
203 203 t.integer "submission_id", limit: 4
204 - t.datetime "created_at", null: false
205 - t.datetime "updated_at", null: false
204 + t.datetime "created_at"
205 + t.datetime "updated_at"
206 206 end
207 207
208 208 create_table "submissions", force: :cascade do |t|
209 209 t.integer "user_id", limit: 4
210 210 t.integer "problem_id", limit: 4
211 211 t.integer "language_id", limit: 4
212 212 t.text "source", limit: 16777215
213 213 t.binary "binary", limit: 65535
214 214 t.datetime "submitted_at"
215 215 t.datetime "compiled_at"
216 216 t.text "compiler_message", limit: 65535
217 217 t.datetime "graded_at"
218 218 t.integer "points", limit: 4
219 219 t.text "grader_comment", limit: 65535
220 220 t.integer "number", limit: 4
221 221 t.string "source_filename", limit: 255
222 222 t.float "max_runtime", limit: 24
223 223 t.integer "peak_memory", limit: 4
224 224 t.integer "effective_code_length", limit: 4
225 225 t.string "ip_address", limit: 255
226 226 end
227 227
228 228 add_index "submissions", ["user_id", "problem_id", "number"], name: "index_submissions_on_user_id_and_problem_id_and_number", unique: true, using: :btree
229 229 add_index "submissions", ["user_id", "problem_id"], name: "index_submissions_on_user_id_and_problem_id", using: :btree
230 230
231 231 create_table "tags", force: :cascade do |t|
232 232 t.string "name", limit: 255, null: false
233 233 t.text "description", limit: 65535
234 234 t.boolean "public"
235 235 t.datetime "created_at", null: false
236 236 t.datetime "updated_at", null: false
237 237 end
238 238
239 239 create_table "tasks", force: :cascade do |t|
240 240 t.integer "submission_id", limit: 4
241 241 t.datetime "created_at"
242 242 t.integer "status", limit: 4
243 243 t.datetime "updated_at"
244 244 end
245 245
246 246 add_index "tasks", ["submission_id"], name: "index_tasks_on_submission_id", using: :btree
247 247
248 248 create_table "test_pairs", force: :cascade do |t|
249 249 t.integer "problem_id", limit: 4
250 250 t.text "input", limit: 16777215
251 251 t.text "solution", limit: 16777215
252 - t.datetime "created_at", null: false
253 - t.datetime "updated_at", null: false
252 + t.datetime "created_at"
253 + t.datetime "updated_at"
254 254 end
255 255
256 256 create_table "test_requests", force: :cascade do |t|
257 257 t.integer "user_id", limit: 4
258 258 t.integer "problem_id", limit: 4
259 259 t.integer "submission_id", limit: 4
260 260 t.string "input_file_name", limit: 255
261 261 t.string "output_file_name", limit: 255
262 262 t.string "running_stat", limit: 255
263 263 t.integer "status", limit: 4
264 - t.datetime "updated_at", null: false
264 + t.datetime "updated_at"
265 265 t.datetime "submitted_at"
266 266 t.datetime "compiled_at"
267 267 t.text "compiler_message", limit: 65535
268 268 t.datetime "graded_at"
269 269 t.string "grader_comment", limit: 255
270 - t.datetime "created_at", null: false
270 + t.datetime "created_at"
271 271 t.float "running_time", limit: 24
272 272 t.string "exit_status", limit: 255
273 273 t.integer "memory_usage", limit: 4
274 274 end
275 275
276 276 add_index "test_requests", ["user_id", "problem_id"], name: "index_test_requests_on_user_id_and_problem_id", using: :btree
277 277
278 278 create_table "testcases", force: :cascade do |t|
279 279 t.integer "problem_id", limit: 4
280 280 t.integer "num", limit: 4
281 281 t.integer "group", limit: 4
282 282 t.integer "score", limit: 4
283 283 t.text "input", limit: 4294967295
284 284 t.text "sol", limit: 4294967295
285 285 t.datetime "created_at"
286 286 t.datetime "updated_at"
287 287 end
288 288
289 289 add_index "testcases", ["problem_id"], name: "index_testcases_on_problem_id", using: :btree
290 290
291 291 create_table "user_contest_stats", force: :cascade do |t|
292 292 t.integer "user_id", limit: 4
293 293 t.datetime "started_at"
294 - t.datetime "created_at", null: false
295 - t.datetime "updated_at", null: false
294 + t.datetime "created_at"
295 + t.datetime "updated_at"
296 296 t.boolean "forced_logout"
297 297 end
298 298
299 299 create_table "users", force: :cascade do |t|
300 300 t.string "login", limit: 50
301 301 t.string "full_name", limit: 255
302 302 t.string "hashed_password", limit: 255
303 303 t.string "salt", limit: 5
304 304 t.string "alias", limit: 255
305 305 t.string "email", limit: 255
306 306 t.integer "site_id", limit: 4
307 307 t.integer "country_id", limit: 4
308 308 t.boolean "activated", default: false
309 309 t.datetime "created_at"
310 310 t.datetime "updated_at"
311 + t.string "section", limit: 255
311 312 t.boolean "enabled", default: true
312 313 t.string "remark", limit: 255
313 314 t.string "last_ip", limit: 255
314 - t.string "section", limit: 255
315 315 end
316 316
317 317 add_index "users", ["login"], name: "index_users_on_login", unique: true, using: :btree
318 318
319 319 add_foreign_key "problems_tags", "problems"
320 320 add_foreign_key "problems_tags", "tags"
321 321 end
You need to be logged in to leave comments. Login now