merge master
This commit is contained in:
30
.snyk
Normal file
30
.snyk
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
|
||||||
|
version: v1.13.5
|
||||||
|
ignore: {}
|
||||||
|
# patches apply the minimum changes required to fix a vulnerability
|
||||||
|
patch:
|
||||||
|
SNYK-JS-LODASH-450202:
|
||||||
|
- '@rails/webpacker > node-sass > gaze > globule > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- webpack-merge > lodash:
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > optimize-css-assets-webpack-plugin > last-call-webpack-plugin > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-transform-block-scoping > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > node-sass > sass-graph > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-proposal-unicode-property-regex > @babel/helper-regex > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/core > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-transform-modules-commonjs > @babel/helper-module-transforms > @babel/types > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-transform-modules-commonjs > @babel/helper-module-transforms > @babel/helper-split-export-declaration > @babel/types > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-proposal-async-generator-functions > @babel/helper-remap-async-to-generator > @babel/helper-wrap-function > @babel/traverse > @babel/generator > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-transform-exponentiation-operator > @babel/helper-builder-binary-assignment-operator-visitor > @babel/helper-explode-assignable-expression > @babel/traverse > @babel/helper-function-name > @babel/types > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
||||||
|
- '@rails/webpacker > @babel/preset-env > @babel/plugin-transform-async-to-generator > @babel/helper-remap-async-to-generator > @babel/helper-wrap-function > @babel/traverse > @babel/helper-function-name > @babel/template > @babel/types > lodash':
|
||||||
|
patched: '2019-07-04T06:33:26.979Z'
|
13
.travis.yml
13
.travis.yml
@ -2,10 +2,11 @@ sudo: required
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
- docker
|
- docker
|
||||||
|
- xvfb
|
||||||
|
|
||||||
language: ruby
|
language: ruby
|
||||||
rvm:
|
rvm:
|
||||||
- 2.6.2
|
- 2.6.3
|
||||||
cache:
|
cache:
|
||||||
bundler: true
|
bundler: true
|
||||||
yarn: true
|
yarn: true
|
||||||
@ -15,13 +16,13 @@ env:
|
|||||||
- secure: "DkOGGPCrRgV08KGgav3Bl+keZQqb11TINQRVQS2aeMaYR5GW7Rt9zEcZzhUE0JdKVVOvm4Cclft7BO4OyMd6Cq9XnZkOOHY+Yn8Qv923761SKrRgkGUkO8eeVKMawAA8lS53XGrMZWCP2xaLsLQYq8xzinnE3GqstoZJaHLnqVs="
|
- secure: "DkOGGPCrRgV08KGgav3Bl+keZQqb11TINQRVQS2aeMaYR5GW7Rt9zEcZzhUE0JdKVVOvm4Cclft7BO4OyMd6Cq9XnZkOOHY+Yn8Qv923761SKrRgkGUkO8eeVKMawAA8lS53XGrMZWCP2xaLsLQYq8xzinnE3GqstoZJaHLnqVs="
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
postgresql: "9.6"
|
postgresql: "10"
|
||||||
firefox: "62.0.3"
|
firefox: "latest-esr"
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- export DISPLAY=:99.0
|
- sudo sed -i '/ExecStart=\/usr\/bin\/dockerd -H fd:\/\//c\ExecStart=\/usr\/bin\/dockerd' /lib/systemd/system/docker.service
|
||||||
- sh -e /etc/init.d/xvfb start
|
- sudo systemctl daemon-reload
|
||||||
- echo 'DOCKER_OPTS="-H tcp://127.0.0.1:2376 -H unix:///var/run/docker.sock --iptables=false"' | sudo tee /etc/default/docker > /dev/null
|
- "echo '{\"hosts\": [\"tcp://127.0.0.1:2376\", \"unix:///var/run/docker.sock\"], \"iptables\": false}' | sudo tee /etc/docker/daemon.json > /dev/null"
|
||||||
- sudo service docker restart
|
- sudo service docker restart
|
||||||
- sleep 5
|
- sleep 5
|
||||||
- docker pull openhpi/co_execenv_python
|
- docker pull openhpi/co_execenv_python
|
||||||
|
1
Gemfile
1
Gemfile
@ -64,6 +64,7 @@ end
|
|||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'rails-controller-testing'
|
gem 'rails-controller-testing'
|
||||||
|
gem 'autotest' # required by autotest-rails
|
||||||
gem 'autotest-rails'
|
gem 'autotest-rails'
|
||||||
gem 'capybara'
|
gem 'capybara'
|
||||||
gem 'selenium-webdriver'
|
gem 'selenium-webdriver'
|
||||||
|
259
Gemfile.lock
259
Gemfile.lock
@ -21,7 +21,7 @@ GIT
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
ZenTest (4.11.2)
|
ZenTest (4.12.0)
|
||||||
actioncable (5.2.3)
|
actioncable (5.2.3)
|
||||||
actionpack (= 5.2.3)
|
actionpack (= 5.2.3)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
@ -63,37 +63,39 @@ GEM
|
|||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
addressable (2.6.0)
|
addressable (2.7.0)
|
||||||
public_suffix (>= 2.0.2, < 4.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
airbrussh (1.3.1)
|
airbrussh (1.4.0)
|
||||||
sshkit (>= 1.6.1, != 1.7.0)
|
sshkit (>= 1.6.1, != 1.7.0)
|
||||||
amq-protocol (2.3.0)
|
amq-protocol (2.3.0)
|
||||||
arel (9.0.0)
|
arel (9.0.0)
|
||||||
ast (2.4.0)
|
ast (2.4.0)
|
||||||
|
autotest (5.0.0)
|
||||||
|
minitest-autotest (~> 1.0)
|
||||||
autotest-rails (4.2.1)
|
autotest-rails (4.2.1)
|
||||||
ZenTest (~> 4.5)
|
ZenTest (~> 4.5)
|
||||||
bcrypt (3.1.12)
|
bcrypt (3.1.13)
|
||||||
better_errors (2.5.1)
|
better_errors (2.5.1)
|
||||||
coderay (>= 1.0.0)
|
coderay (>= 1.0.0)
|
||||||
erubi (>= 1.0.0)
|
erubi (>= 1.0.0)
|
||||||
rack (>= 0.9.0)
|
rack (>= 0.9.0)
|
||||||
bindex (0.7.0)
|
bindex (0.8.1)
|
||||||
binding_of_caller (0.8.0)
|
binding_of_caller (0.8.0)
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
bootsnap (1.4.4)
|
bootsnap (1.4.5)
|
||||||
msgpack (~> 1.0)
|
msgpack (~> 1.0)
|
||||||
bootstrap-will_paginate (1.0.0)
|
bootstrap-will_paginate (1.0.0)
|
||||||
will_paginate
|
will_paginate
|
||||||
builder (3.2.3)
|
builder (3.2.3)
|
||||||
bunny (2.14.2)
|
bunny (2.14.3)
|
||||||
amq-protocol (~> 2.3, >= 2.3.0)
|
amq-protocol (~> 2.3, >= 2.3.0)
|
||||||
byebug (11.0.1)
|
byebug (11.0.1)
|
||||||
capistrano (3.11.0)
|
capistrano (3.11.2)
|
||||||
airbrussh (>= 1.0.0)
|
airbrussh (>= 1.0.0)
|
||||||
i18n
|
i18n
|
||||||
rake (>= 10.0.0)
|
rake (>= 10.0.0)
|
||||||
sshkit (>= 1.9.0)
|
sshkit (>= 1.9.0)
|
||||||
capistrano-bundler (1.5.0)
|
capistrano-bundler (1.6.0)
|
||||||
capistrano (~> 3.1)
|
capistrano (~> 3.1)
|
||||||
capistrano-rails (1.4.0)
|
capistrano-rails (1.4.0)
|
||||||
capistrano (~> 3.1)
|
capistrano (~> 3.1)
|
||||||
@ -103,81 +105,86 @@ GEM
|
|||||||
sshkit (~> 1.2)
|
sshkit (~> 1.2)
|
||||||
capistrano-upload-config (0.8.2)
|
capistrano-upload-config (0.8.2)
|
||||||
capistrano (>= 3.0)
|
capistrano (>= 3.0)
|
||||||
capistrano3-puma (3.1.1)
|
capistrano3-puma (4.0.0)
|
||||||
capistrano (~> 3.7)
|
capistrano (~> 3.7)
|
||||||
capistrano-bundler
|
capistrano-bundler
|
||||||
puma (~> 3.4)
|
puma (~> 4.0)
|
||||||
capybara (3.20.2)
|
capybara (3.29.0)
|
||||||
addressable
|
addressable
|
||||||
mini_mime (>= 0.1.3)
|
mini_mime (>= 0.1.3)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
rack (>= 1.6.0)
|
rack (>= 1.6.0)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
regexp_parser (~> 1.2)
|
regexp_parser (~> 1.5)
|
||||||
xpath (~> 3.2)
|
xpath (~> 3.2)
|
||||||
carrierwave (1.3.1)
|
carrierwave (2.0.2)
|
||||||
activemodel (>= 4.0.0)
|
activemodel (>= 5.0.0)
|
||||||
activesupport (>= 4.0.0)
|
activesupport (>= 5.0.0)
|
||||||
mime-types (>= 1.16)
|
addressable (~> 2.6)
|
||||||
childprocess (1.0.1)
|
image_processing (~> 1.1)
|
||||||
rake (< 13.0)
|
mimemagic (>= 0.3.0)
|
||||||
|
mini_mime (>= 0.1.3)
|
||||||
|
childprocess (3.0.0)
|
||||||
chronic (0.10.2)
|
chronic (0.10.2)
|
||||||
coderay (1.1.2)
|
coderay (1.1.2)
|
||||||
concurrent-ruby (1.1.5)
|
concurrent-ruby (1.1.5)
|
||||||
crass (1.0.4)
|
crass (1.0.5)
|
||||||
database_cleaner (1.7.0)
|
database_cleaner (1.7.0)
|
||||||
debug_inspector (0.0.3)
|
debug_inspector (0.0.3)
|
||||||
diff-lcs (1.3)
|
diff-lcs (1.3)
|
||||||
docile (1.3.1)
|
docile (1.3.2)
|
||||||
docker-api (1.34.2)
|
docker-api (1.34.2)
|
||||||
excon (>= 0.47.0)
|
excon (>= 0.47.0)
|
||||||
multi_json
|
multi_json
|
||||||
domain_name (0.5.20180417)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
erubi (1.8.0)
|
erubi (1.9.0)
|
||||||
eventmachine (1.0.9.1)
|
eventmachine (1.0.9.1)
|
||||||
excon (0.64.0)
|
excon (0.69.1)
|
||||||
execjs (2.7.0)
|
execjs (2.7.0)
|
||||||
factory_bot (5.0.2)
|
factory_bot (5.1.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
factory_bot_rails (5.0.2)
|
factory_bot_rails (5.1.1)
|
||||||
factory_bot (~> 5.0.2)
|
factory_bot (~> 5.1.0)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
faraday (0.15.4)
|
faraday (0.17.1)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
faye-websocket (0.10.7)
|
faye-websocket (0.10.9)
|
||||||
eventmachine (>= 0.12.0)
|
eventmachine (>= 0.12.0)
|
||||||
websocket-driver (>= 0.5.1)
|
websocket-driver (>= 0.5.1)
|
||||||
ffi (1.10.0)
|
ffi (1.11.3)
|
||||||
forgery (0.7.0)
|
forgery (0.7.0)
|
||||||
globalid (0.4.2)
|
globalid (0.4.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
headless (2.3.1)
|
headless (2.3.1)
|
||||||
highline (2.0.2)
|
highline (2.0.3)
|
||||||
|
http-accept (1.7.0)
|
||||||
http-cookie (1.0.3)
|
http-cookie (1.0.3)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
i18n (1.6.0)
|
i18n (1.7.0)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
i18n-js (3.2.2)
|
i18n-js (3.5.0)
|
||||||
i18n (>= 0.6.6)
|
i18n (>= 0.6.6)
|
||||||
|
image_processing (1.9.3)
|
||||||
|
mini_magick (>= 4.9.5, < 5)
|
||||||
|
ruby-vips (>= 2.0.13, < 3)
|
||||||
ims-lti (1.2.2)
|
ims-lti (1.2.2)
|
||||||
builder
|
builder
|
||||||
oauth (>= 0.4.5, < 0.6)
|
oauth (>= 0.4.5, < 0.6)
|
||||||
jaro_winkler (1.5.2)
|
jaro_winkler (1.5.4)
|
||||||
jbuilder (2.9.1)
|
jbuilder (2.9.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
jquery-rails (4.3.3)
|
jquery-rails (4.3.5)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
railties (>= 4.2.0)
|
railties (>= 4.2.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
json (2.2.0)
|
json (2.2.0)
|
||||||
jwt (2.1.0)
|
jwt (2.2.1)
|
||||||
kramdown (2.1.0)
|
kramdown (2.1.0)
|
||||||
listen (3.1.5)
|
listen (3.2.0)
|
||||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||||
rb-inotify (~> 0.9, >= 0.9.7)
|
rb-inotify (~> 0.9, >= 0.9.10)
|
||||||
ruby_dep (~> 1.2)
|
loofah (2.4.0)
|
||||||
loofah (2.2.3)
|
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.7.1)
|
mail (2.7.1)
|
||||||
@ -185,43 +192,52 @@ GEM
|
|||||||
marcel (0.3.3)
|
marcel (0.3.3)
|
||||||
mimemagic (~> 0.3.2)
|
mimemagic (~> 0.3.2)
|
||||||
method_source (0.9.2)
|
method_source (0.9.2)
|
||||||
mime-types (3.2.2)
|
mime-types (3.3)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2019.0331)
|
mime-types-data (3.2019.1009)
|
||||||
mimemagic (0.3.3)
|
mimemagic (0.3.3)
|
||||||
mini_mime (1.0.1)
|
mini_magick (4.9.5)
|
||||||
|
mini_mime (1.0.2)
|
||||||
mini_portile2 (2.4.0)
|
mini_portile2 (2.4.0)
|
||||||
minitest (5.11.3)
|
minitest (5.13.0)
|
||||||
mnemosyne-ruby (1.6.2)
|
minitest-autotest (1.1.1)
|
||||||
|
minitest-server (~> 1.0)
|
||||||
|
path_expander (~> 1.0)
|
||||||
|
minitest-server (1.0.5)
|
||||||
|
minitest (~> 5.0)
|
||||||
|
mnemosyne-ruby (1.8.0)
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
bunny
|
bunny
|
||||||
msgpack (1.2.10)
|
msgpack (1.3.1)
|
||||||
multi_json (1.13.1)
|
multi_json (1.14.1)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
multipart-post (2.1.0)
|
multipart-post (2.1.1)
|
||||||
net-scp (2.0.0)
|
net-scp (2.0.0)
|
||||||
net-ssh (>= 2.6.5, < 6.0.0)
|
net-ssh (>= 2.6.5, < 6.0.0)
|
||||||
net-ssh (5.2.0)
|
net-ssh (5.2.0)
|
||||||
netrc (0.11.0)
|
netrc (0.11.0)
|
||||||
newrelic_rpm (6.3.0.355)
|
newrelic_rpm (6.7.0.359)
|
||||||
nio4r (2.3.1)
|
nio4r (2.5.2)
|
||||||
nokogiri (1.10.3)
|
nokogiri (1.10.5)
|
||||||
mini_portile2 (~> 2.4.0)
|
mini_portile2 (~> 2.4.0)
|
||||||
nyan-cat-formatter (0.12.0)
|
nyan-cat-formatter (0.12.0)
|
||||||
rspec (>= 2.99, >= 2.14.2, < 4)
|
rspec (>= 2.99, >= 2.14.2, < 4)
|
||||||
oauth (0.5.4)
|
oauth (0.5.4)
|
||||||
oauth2 (1.4.1)
|
oauth2 (1.4.2)
|
||||||
faraday (>= 0.8, < 0.16.0)
|
faraday (>= 0.8, < 2.0)
|
||||||
jwt (>= 1.0, < 3.0)
|
jwt (>= 1.0, < 3.0)
|
||||||
multi_json (~> 1.3)
|
multi_json (~> 1.3)
|
||||||
multi_xml (~> 0.5)
|
multi_xml (~> 0.5)
|
||||||
rack (>= 1.2, < 3)
|
rack (>= 1.2, < 3)
|
||||||
pagedown-bootstrap-rails (2.1.4)
|
pagedown-bootstrap-rails (2.1.4)
|
||||||
railties (> 3.1)
|
railties (> 3.1)
|
||||||
parallel (1.17.0)
|
parallel (1.19.1)
|
||||||
parser (2.6.3.0)
|
parser (2.6.5.0)
|
||||||
ast (~> 2.4.0)
|
ast (~> 2.4.0)
|
||||||
|
path_expander (1.1.0)
|
||||||
pg (1.1.4)
|
pg (1.1.4)
|
||||||
|
polyamorous (2.3.0)
|
||||||
|
activerecord (>= 5.0)
|
||||||
pry (0.12.2)
|
pry (0.12.2)
|
||||||
coderay (~> 1.1.0)
|
coderay (~> 1.1.0)
|
||||||
method_source (~> 0.9.0)
|
method_source (~> 0.9.0)
|
||||||
@ -230,12 +246,13 @@ GEM
|
|||||||
pry (~> 0.10)
|
pry (~> 0.10)
|
||||||
pry-rails (0.3.9)
|
pry-rails (0.3.9)
|
||||||
pry (>= 0.10.4)
|
pry (>= 0.10.4)
|
||||||
public_suffix (3.0.3)
|
public_suffix (4.0.1)
|
||||||
puma (3.12.1)
|
puma (4.3.0)
|
||||||
pundit (2.0.1)
|
nio4r (~> 2.0)
|
||||||
|
pundit (2.1.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
rack (2.0.7)
|
rack (2.0.7)
|
||||||
rack-mini-profiler (1.0.2)
|
rack-mini-profiler (1.1.3)
|
||||||
rack (>= 1.2.0)
|
rack (>= 1.2.0)
|
||||||
rack-proxy (0.6.5)
|
rack-proxy (0.6.5)
|
||||||
rack
|
rack
|
||||||
@ -261,12 +278,12 @@ GEM
|
|||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.0.4)
|
rails-html-sanitizer (1.3.0)
|
||||||
loofah (~> 2.2, >= 2.2.2)
|
loofah (~> 2.3)
|
||||||
rails-i18n (5.1.3)
|
rails-i18n (5.1.3)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 5.0, < 6)
|
railties (>= 5.0, < 6)
|
||||||
rails-timeago (2.17.1)
|
rails-timeago (2.18.0)
|
||||||
actionpack (>= 3.1)
|
actionpack (>= 3.1)
|
||||||
activesupport (>= 3.1)
|
activesupport (>= 3.1)
|
||||||
railties (5.2.3)
|
railties (5.2.3)
|
||||||
@ -276,73 +293,75 @@ GEM
|
|||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
thor (>= 0.19.0, < 2.0)
|
thor (>= 0.19.0, < 2.0)
|
||||||
rainbow (3.0.0)
|
rainbow (3.0.0)
|
||||||
rake (12.3.2)
|
rake (13.0.1)
|
||||||
ransack (2.1.1)
|
ransack (2.3.0)
|
||||||
actionpack (>= 5.0)
|
actionpack (>= 5.0)
|
||||||
activerecord (>= 5.0)
|
activerecord (>= 5.0)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
i18n
|
i18n
|
||||||
|
polyamorous (= 2.3.0)
|
||||||
rb-fsevent (0.10.3)
|
rb-fsevent (0.10.3)
|
||||||
rb-inotify (0.10.0)
|
rb-inotify (0.10.0)
|
||||||
ffi (~> 1.0)
|
ffi (~> 1.0)
|
||||||
regexp_parser (1.5.0)
|
regexp_parser (1.6.0)
|
||||||
rest-client (2.0.2)
|
rest-client (2.1.0)
|
||||||
|
http-accept (>= 1.7.0, < 2.0)
|
||||||
http-cookie (>= 1.0.2, < 2.0)
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
mime-types (>= 1.16, < 4.0)
|
mime-types (>= 1.16, < 4.0)
|
||||||
netrc (~> 0.8)
|
netrc (~> 0.8)
|
||||||
rspec (3.8.0)
|
rspec (3.9.0)
|
||||||
rspec-core (~> 3.8.0)
|
rspec-core (~> 3.9.0)
|
||||||
rspec-expectations (~> 3.8.0)
|
rspec-expectations (~> 3.9.0)
|
||||||
rspec-mocks (~> 3.8.0)
|
rspec-mocks (~> 3.9.0)
|
||||||
rspec-autotest (1.0.2)
|
rspec-autotest (1.0.2)
|
||||||
rspec-core (>= 2.99.0.beta1, < 4.0.0)
|
rspec-core (>= 2.99.0.beta1, < 4.0.0)
|
||||||
rspec-core (3.8.0)
|
rspec-core (3.9.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-expectations (3.8.3)
|
rspec-expectations (3.9.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-mocks (3.8.0)
|
rspec-mocks (3.9.0)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-rails (3.8.2)
|
rspec-rails (3.9.0)
|
||||||
actionpack (>= 3.0)
|
actionpack (>= 3.0)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
railties (>= 3.0)
|
railties (>= 3.0)
|
||||||
rspec-core (~> 3.8.0)
|
rspec-core (~> 3.9.0)
|
||||||
rspec-expectations (~> 3.8.0)
|
rspec-expectations (~> 3.9.0)
|
||||||
rspec-mocks (~> 3.8.0)
|
rspec-mocks (~> 3.9.0)
|
||||||
rspec-support (~> 3.8.0)
|
rspec-support (~> 3.9.0)
|
||||||
rspec-support (3.8.0)
|
rspec-support (3.9.0)
|
||||||
rubocop (0.69.0)
|
rubocop (0.77.0)
|
||||||
jaro_winkler (~> 1.5.1)
|
jaro_winkler (~> 1.5.1)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 2.6)
|
parser (>= 2.6)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 1.7)
|
unicode-display_width (>= 1.4.0, < 1.7)
|
||||||
rubocop-rspec (1.33.0)
|
rubocop-rspec (1.37.0)
|
||||||
rubocop (>= 0.60.0)
|
rubocop (>= 0.68.1)
|
||||||
ruby-progressbar (1.10.0)
|
ruby-progressbar (1.10.1)
|
||||||
ruby_dep (1.5.0)
|
ruby-vips (2.0.16)
|
||||||
|
ffi (~> 1.9)
|
||||||
rubytree (1.0.0)
|
rubytree (1.0.0)
|
||||||
json (~> 2.1)
|
json (~> 2.1)
|
||||||
structured_warnings (~> 0.3)
|
structured_warnings (~> 0.3)
|
||||||
rubyzip (1.2.2)
|
rubyzip (2.0.0)
|
||||||
sass (3.7.4)
|
sass-rails (6.0.0)
|
||||||
sass-listen (~> 4.0.0)
|
sassc-rails (~> 2.1, >= 2.1.1)
|
||||||
sass-listen (4.0.0)
|
sassc (2.2.1)
|
||||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
ffi (~> 1.9)
|
||||||
rb-inotify (~> 0.9, >= 0.9.7)
|
sassc-rails (2.1.2)
|
||||||
sass-rails (5.0.7)
|
railties (>= 4.0.0)
|
||||||
railties (>= 4.0.0, < 6)
|
sassc (>= 2.0)
|
||||||
sass (~> 3.1)
|
sprockets (> 3.0)
|
||||||
sprockets (>= 2.8, < 4.0)
|
sprockets-rails
|
||||||
sprockets-rails (>= 2.0, < 4.0)
|
tilt
|
||||||
tilt (>= 1.1, < 3)
|
selenium-webdriver (3.142.6)
|
||||||
selenium-webdriver (3.142.3)
|
childprocess (>= 0.5, < 4.0)
|
||||||
childprocess (>= 0.5, < 2.0)
|
rubyzip (>= 1.2.2)
|
||||||
rubyzip (~> 1.2, >= 1.2.2)
|
simplecov (0.17.1)
|
||||||
simplecov (0.16.1)
|
|
||||||
docile (~> 1.1)
|
docile (~> 1.1)
|
||||||
json (>= 1.8, < 3)
|
json (>= 1.8, < 3)
|
||||||
simplecov-html (~> 0.10.0)
|
simplecov-html (~> 0.10.0)
|
||||||
@ -354,33 +373,32 @@ GEM
|
|||||||
actionpack (>= 3.1)
|
actionpack (>= 3.1)
|
||||||
railties (>= 3.1)
|
railties (>= 3.1)
|
||||||
slim (>= 3.0, < 5.0)
|
slim (>= 3.0, < 5.0)
|
||||||
sorcery (0.13.0)
|
sorcery (0.14.0)
|
||||||
bcrypt (~> 3.1)
|
bcrypt (~> 3.1)
|
||||||
oauth (~> 0.4, >= 0.4.4)
|
oauth (~> 0.4, >= 0.4.4)
|
||||||
oauth2 (~> 1.0, >= 0.8.0)
|
oauth2 (~> 1.0, >= 0.8.0)
|
||||||
spring (2.0.2)
|
spring (2.1.0)
|
||||||
activesupport (>= 4.2)
|
sprockets (4.0.0)
|
||||||
sprockets (3.7.2)
|
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
rack (> 1, < 3)
|
rack (> 1, < 3)
|
||||||
sprockets-rails (3.2.1)
|
sprockets-rails (3.2.1)
|
||||||
actionpack (>= 4.0)
|
actionpack (>= 4.0)
|
||||||
activesupport (>= 4.0)
|
activesupport (>= 4.0)
|
||||||
sprockets (>= 3.0.0)
|
sprockets (>= 3.0.0)
|
||||||
sshkit (1.18.2)
|
sshkit (1.20.0)
|
||||||
net-scp (>= 1.1.2)
|
net-scp (>= 1.1.2)
|
||||||
net-ssh (>= 2.8.0)
|
net-ssh (>= 2.8.0)
|
||||||
structured_warnings (0.3.0)
|
structured_warnings (0.4.0)
|
||||||
temple (0.8.1)
|
temple (0.8.2)
|
||||||
thor (0.20.3)
|
thor (0.20.3)
|
||||||
thread_safe (0.3.6)
|
thread_safe (0.3.6)
|
||||||
tilt (2.0.9)
|
tilt (2.0.10)
|
||||||
turbolinks (5.2.0)
|
turbolinks (5.2.1)
|
||||||
turbolinks-source (~> 5.2)
|
turbolinks-source (~> 5.2)
|
||||||
turbolinks-source (5.2.0)
|
turbolinks-source (5.2.0)
|
||||||
tzinfo (1.2.5)
|
tzinfo (1.2.5)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
uglifier (4.1.20)
|
uglifier (4.2.0)
|
||||||
execjs (>= 0.3.0, < 3)
|
execjs (>= 0.3.0, < 3)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
@ -391,17 +409,17 @@ GEM
|
|||||||
activemodel (>= 5.0)
|
activemodel (>= 5.0)
|
||||||
bindex (>= 0.4.0)
|
bindex (>= 0.4.0)
|
||||||
railties (>= 5.0)
|
railties (>= 5.0)
|
||||||
webpacker (4.0.2)
|
webpacker (4.2.0)
|
||||||
activesupport (>= 4.2)
|
activesupport (>= 4.2)
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 4.2)
|
railties (>= 4.2)
|
||||||
websocket (1.2.8)
|
websocket (1.2.8)
|
||||||
websocket-driver (0.7.0)
|
websocket-driver (0.7.1)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.3)
|
websocket-extensions (0.1.4)
|
||||||
whenever (0.11.0)
|
whenever (1.0.0)
|
||||||
chronic (>= 0.6.3)
|
chronic (>= 0.6.3)
|
||||||
will_paginate (3.1.7)
|
will_paginate (3.2.1)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
|
|
||||||
@ -409,6 +427,7 @@ PLATFORMS
|
|||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
autotest
|
||||||
autotest-rails
|
autotest-rails
|
||||||
bcrypt
|
bcrypt
|
||||||
better_errors
|
better_errors
|
||||||
|
@ -25,6 +25,7 @@ In order to execute code submissions using Docker, source code files are written
|
|||||||
- create *config/sendmail.yml*
|
- create *config/sendmail.yml*
|
||||||
- create *config/smtp.yml*
|
- create *config/smtp.yml*
|
||||||
- use boot2docker or vagrant if there is no native support for docker on your OS
|
- use boot2docker or vagrant if there is no native support for docker on your OS
|
||||||
|
- if you want to use the app without docker (and hence without code execution) comment the validation `validate :working_docker_image?` in `models/execution_environments.rb` otherwise the seed will fail (because of missing docker connection)
|
||||||
- create seed data by executing `rake db:seed`
|
- create seed data by executing `rake db:seed`
|
||||||
- if you already created a configuration for your local installation and want to use vagrant, too, be sure to log into the vagrant instance via ssh and add your database user manually to the database. Afterwards, create, migrate and seed.
|
- if you already created a configuration for your local installation and want to use vagrant, too, be sure to log into the vagrant instance via ssh and add your database user manually to the database. Afterwards, create, migrate and seed.
|
||||||
|
|
||||||
|
3
app/assets/config/manifest.js
Normal file
3
app/assets/config/manifest.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
//= link_tree ../images
|
||||||
|
//= link_directory ../javascripts .js
|
||||||
|
//= link_directory ../stylesheets .css
|
@ -252,7 +252,11 @@ configureEditors: function () {
|
|||||||
this.editors.push(editor);
|
this.editors.push(editor);
|
||||||
this.editor_for_file.set($(element).parent().data('filename'), editor);
|
this.editor_for_file.set($(element).parent().data('filename'), editor);
|
||||||
var session = editor.getSession();
|
var session = editor.getSession();
|
||||||
session.setMode($(element).data('mode'));
|
var mode = $(element).data('mode')
|
||||||
|
session.setMode(mode);
|
||||||
|
if (mode === 'ace/mode/python') {
|
||||||
|
editor.setTheme('ace/theme/tomorrow')
|
||||||
|
}
|
||||||
session.setTabSize($(element).data('indent-size'));
|
session.setTabSize($(element).data('indent-size'));
|
||||||
session.setUseSoftTabs(true);
|
session.setUseSoftTabs(true);
|
||||||
session.setUseWrapMode(true);
|
session.setUseWrapMode(true);
|
||||||
|
@ -7,7 +7,7 @@ class ExercisesController < ApplicationController
|
|||||||
|
|
||||||
before_action :handle_file_uploads, only: [:create, :update]
|
before_action :handle_file_uploads, only: [:create, :update]
|
||||||
before_action :set_execution_environments, only: [:create, :edit, :new, :update]
|
before_action :set_execution_environments, only: [:create, :edit, :new, :update]
|
||||||
before_action :set_exercise_and_authorize, only: MEMBER_ACTIONS + [:clone, :implement, :working_times, :intervention, :search, :run, :statistics, :submit, :reload, :feedback, :study_group_dashboard, :export_external_check, :export_external_confirm]
|
before_action :set_exercise_and_authorize, only: MEMBER_ACTIONS + [:clone, :implement, :working_times, :intervention, :search, :run, :statistics, :submit, :reload, :feedback, :requests_for_comments, :study_group_dashboard, :export_external_check, :export_external_confirm]
|
||||||
before_action :set_external_user_and_authorize, only: [:statistics]
|
before_action :set_external_user_and_authorize, only: [:statistics]
|
||||||
before_action :set_file_types, only: [:create, :edit, :new, :update]
|
before_action :set_file_types, only: [:create, :edit, :new, :update]
|
||||||
before_action :set_course_token, only: [:implement]
|
before_action :set_course_token, only: [:implement]
|
||||||
@ -104,6 +104,21 @@ class ExercisesController < ApplicationController
|
|||||||
def feedback
|
def feedback
|
||||||
authorize!
|
authorize!
|
||||||
@feedbacks = @exercise.user_exercise_feedbacks.paginate(page: params[:page])
|
@feedbacks = @exercise.user_exercise_feedbacks.paginate(page: params[:page])
|
||||||
|
@submissions = @feedbacks.map do |feedback|
|
||||||
|
feedback.exercise.final_submission(feedback.user)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def requests_for_comments
|
||||||
|
authorize!
|
||||||
|
@search = RequestForComment
|
||||||
|
.with_last_activity
|
||||||
|
.where(exercise: @exercise)
|
||||||
|
.ransack(params[:q])
|
||||||
|
@request_for_comments = @search.result
|
||||||
|
.order('last_comment DESC')
|
||||||
|
.paginate(page: params[:page])
|
||||||
|
render 'request_for_comments/index'
|
||||||
end
|
end
|
||||||
|
|
||||||
def export_external_check
|
def export_external_check
|
||||||
@ -377,6 +392,7 @@ class ExercisesController < ApplicationController
|
|||||||
|
|
||||||
def statistics
|
def statistics
|
||||||
if(@external_user)
|
if(@external_user)
|
||||||
|
authorize(@external_user, :statistics?)
|
||||||
@submissions = Submission.where("user_id = ? AND exercise_id = ?", @external_user.id, @exercise.id).order("created_at")
|
@submissions = Submission.where("user_id = ? AND exercise_id = ?", @external_user.id, @exercise.id).order("created_at")
|
||||||
interventions = UserExerciseIntervention.where("user_id = ? AND exercise_id = ?", @external_user.id, @exercise.id)
|
interventions = UserExerciseIntervention.where("user_id = ? AND exercise_id = ?", @external_user.id, @exercise.id)
|
||||||
@all_events = (@submissions + interventions).sort_by { |a| a.created_at }
|
@all_events = (@submissions + interventions).sort_by { |a| a.created_at }
|
||||||
|
@ -20,8 +20,8 @@ class SessionsController < ApplicationController
|
|||||||
def create_through_lti
|
def create_through_lti
|
||||||
store_lti_session_data(consumer: @consumer, parameters: params)
|
store_lti_session_data(consumer: @consumer, parameters: params)
|
||||||
store_nonce(params[:oauth_nonce])
|
store_nonce(params[:oauth_nonce])
|
||||||
if params[:redirect_target]
|
if params[:custom_redirect_target]
|
||||||
redirect_to(params[:redirect_target])
|
redirect_to(params[:custom_redirect_target])
|
||||||
else
|
else
|
||||||
redirect_to(implement_exercise_path(@exercise),
|
redirect_to(implement_exercise_path(@exercise),
|
||||||
notice: t("sessions.create_through_lti.session_#{lti_outcome_service?(@exercise.id, @current_user.id , @consumer.id) ? 'with' : 'without'}_outcome",
|
notice: t("sessions.create_through_lti.session_#{lti_outcome_service?(@exercise.id, @current_user.id , @consumer.id) ? 'with' : 'without'}_outcome",
|
||||||
|
@ -494,12 +494,17 @@ class Exercise < ApplicationRecord
|
|||||||
|
|
||||||
def maximum_score(user = nil)
|
def maximum_score(user = nil)
|
||||||
if user
|
if user
|
||||||
|
# FIXME: where(user: user) will not work here!
|
||||||
submissions.where(user: user).where("cause IN ('submit','assess')").where("score IS NOT NULL").order("score DESC").first.score || 0 rescue 0
|
submissions.where(user: user).where("cause IN ('submit','assess')").where("score IS NOT NULL").order("score DESC").first.score || 0 rescue 0
|
||||||
else
|
else
|
||||||
files.teacher_defined_tests.sum(:weight)
|
files.teacher_defined_tests.sum(:weight)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def final_submission(user)
|
||||||
|
submissions.final.where(user_id: user.id, user_type: user.class.name).order(created_at: :desc).first
|
||||||
|
end
|
||||||
|
|
||||||
def has_user_solved(user)
|
def has_user_solved(user)
|
||||||
maximum_score(user).to_i == maximum_score.to_i
|
maximum_score(user).to_i == maximum_score.to_i
|
||||||
end
|
end
|
||||||
|
@ -3,11 +3,11 @@ class ExercisePolicy < AdminOrAuthorPolicy
|
|||||||
admin?
|
admin?
|
||||||
end
|
end
|
||||||
|
|
||||||
[:show?, :study_group_dashboard?].each do |action|
|
[:show?, :study_group_dashboard?, :feedback?, :requests_for_comments?, :statistics?].each do |action|
|
||||||
define_method(action) { admin? || teacher? }
|
define_method(action) { admin? || teacher? }
|
||||||
end
|
end
|
||||||
|
|
||||||
[:clone?, :destroy?, :edit?, :statistics?, :update?, :feedback?, :export_external_check?, :export_external_confirm?].each do |action|
|
[:clone?, :destroy?, :edit?, :update?, :export_external_check?, :export_external_confirm?].each do |action|
|
||||||
define_method(action) { admin? || author? }
|
define_method(action) { admin? || author? }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -4,12 +4,17 @@ h1 = link_to_if(policy(@exercise).show?, @exercise, exercise_path(@exercise))
|
|||||||
.header = t('activerecord.attributes.exercise.description')
|
.header = t('activerecord.attributes.exercise.description')
|
||||||
.value = render_markdown(@exercise.description)
|
.value = render_markdown(@exercise.description)
|
||||||
|
|
||||||
.header = t('activerecord.models.user_exercise_feedback.other')
|
span.header.col-sm-3.pl-0 = "#{t('activerecord.attributes.exercise.maximum_score')}"
|
||||||
|
span.col-sm-9 = @exercise.maximum_score
|
||||||
|
|
||||||
|
.header.mt-3 = t('activerecord.models.user_exercise_feedback.other')
|
||||||
- if @feedbacks.nil? or @feedbacks.size == 0
|
- if @feedbacks.nil? or @feedbacks.size == 0
|
||||||
.no-feedback = t('user_exercise_feedback.no_feedback')
|
.no-feedback = t('user_exercise_feedback.no_feedback')
|
||||||
|
|
||||||
ul.list-unstyled
|
ul.list-unstyled
|
||||||
- @feedbacks.each do |feedback|
|
- comment_presets = UserExerciseFeedbacksController.new.comment_presets
|
||||||
|
- time_presets = UserExerciseFeedbacksController.new.time_presets
|
||||||
|
- @feedbacks.each_with_index do |feedback, index|
|
||||||
li.card.mt-2
|
li.card.mt-2
|
||||||
.card-header role="tab" id="heading"
|
.card-header role="tab" id="heading"
|
||||||
div.clearfix.feedback-header
|
div.clearfix.feedback-header
|
||||||
@ -20,8 +25,11 @@ h1 = link_to_if(policy(@exercise).show?, @exercise, exercise_path(@exercise))
|
|||||||
.card-collapse role="tabpanel"
|
.card-collapse role="tabpanel"
|
||||||
.card-body.feedback
|
.card-body.feedback
|
||||||
.text = feedback.feedback_text
|
.text = feedback.feedback_text
|
||||||
.difficulty = "#{t('user_exercise_feedback.difficulty')} #{feedback.difficulty}" if feedback.difficulty
|
.difficulty = "#{t('user_exercise_feedback.difficulty')} #{comment_presets[feedback.difficulty].join(' - ')}" if feedback.difficulty
|
||||||
.worktime = "#{t('user_exercise_feedback.working_time')} #{feedback.user_estimated_worktime}" if feedback.user_estimated_worktime
|
.worktime = "#{t('user_exercise_feedback.working_time')} #{time_presets[feedback.user_estimated_worktime].join(' - ')}" if feedback.user_estimated_worktime
|
||||||
|
.card-footer
|
||||||
|
span.points = "#{t('exercises.statistics.score')}: #{@submissions[index].score}"
|
||||||
|
span.working_time.pull-right = "#{t('exercises.statistics.worktime')}: #{@exercise.average_working_time_for(feedback.user.id) or 0}"
|
||||||
|
|
||||||
= render('shared/pagination', collection: @feedbacks)
|
= render('shared/pagination', collection: @feedbacks)
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ h1 = Exercise.model_name.human(count: 2)
|
|||||||
ul.dropdown-menu.float-right role="menu"
|
ul.dropdown-menu.float-right role="menu"
|
||||||
li = link_to(t('shared.show'), exercise, 'data-turbolinks' => "false", class: 'dropdown-item') if policy(exercise).show?
|
li = link_to(t('shared.show'), exercise, 'data-turbolinks' => "false", class: 'dropdown-item') if policy(exercise).show?
|
||||||
li = link_to(t('activerecord.models.user_exercise_feedback.other'), feedback_exercise_path(exercise), class: 'dropdown-item') if policy(exercise).feedback?
|
li = link_to(t('activerecord.models.user_exercise_feedback.other'), feedback_exercise_path(exercise), class: 'dropdown-item') if policy(exercise).feedback?
|
||||||
|
li = link_to(t('activerecord.models.request_for_comment.other'), requests_for_comments_exercise_path(exercise), class: 'dropdown-item') if policy(exercise).requests_for_comments?
|
||||||
li = link_to(t('shared.destroy'), exercise, data: {confirm: t('shared.confirm_destroy')}, method: :delete, class: 'dropdown-item') if policy(exercise).destroy?
|
li = link_to(t('shared.destroy'), exercise, data: {confirm: t('shared.confirm_destroy')}, method: :delete, class: 'dropdown-item') if policy(exercise).destroy?
|
||||||
li = link_to(t('.clone'), clone_exercise_path(exercise), data: {confirm: t('shared.confirm_destroy')}, method: :post, class: 'dropdown-item') if policy(exercise).clone?
|
li = link_to(t('.clone'), clone_exercise_path(exercise), data: {confirm: t('shared.confirm_destroy')}, method: :post, class: 'dropdown-item') if policy(exercise).clone?
|
||||||
li = link_to(t('exercises.export_codeharbor.label'), '', class: 'dropdown-item export-start', data: {'exercise-id' => exercise.id}) if policy(exercise).export_external_confirm?
|
li = link_to(t('exercises.export_codeharbor.label'), '', class: 'dropdown-item export-start', data: {'exercise-id' => exercise.id}) if policy(exercise).export_external_confirm?
|
||||||
|
@ -38,18 +38,19 @@ h1 = @exercise
|
|||||||
hr
|
hr
|
||||||
div#chart_2
|
div#chart_2
|
||||||
hr
|
hr
|
||||||
.table-responsive
|
- if current_user.admin?
|
||||||
table.table.table-striped.sortable
|
.table-responsive
|
||||||
thead
|
table.table.table-striped.sortable
|
||||||
tr
|
thead
|
||||||
- ['.user', '.score', '.runs', '.worktime'].each do |title|
|
|
||||||
th.header = t(title)
|
|
||||||
tbody
|
|
||||||
- @exercise.send(symbol).distinct().each do |user|
|
|
||||||
- if user_statistics[user.id] then us = user_statistics[user.id] else us = {"maximum_score" => nil, "runs" => nil}
|
|
||||||
- label = "#{user.displayname}"
|
|
||||||
tr
|
tr
|
||||||
td = link_to_if symbol==:external_users && policy(user).statistics?, label, {controller: "exercises", action: "statistics", external_user_id: user.id, id: @exercise.id}
|
- ['.user', '.score', '.runs', '.worktime'].each do |title|
|
||||||
td = us['maximum_score'] or 0
|
th.header = t(title)
|
||||||
td = us['runs']
|
tbody
|
||||||
td = @exercise.average_working_time_for(user.id) or 0
|
- @exercise.send(symbol).distinct().each do |user|
|
||||||
|
- if user_statistics[user.id] then us = user_statistics[user.id] else us = {"maximum_score" => nil, "runs" => nil}
|
||||||
|
- label = "#{user.displayname}"
|
||||||
|
tr
|
||||||
|
td = link_to_if symbol==:external_users && policy(user).statistics?, label, {controller: "exercises", action: "statistics", external_user_id: user.id, id: @exercise.id}
|
||||||
|
td = us['maximum_score'] or 0
|
||||||
|
td = us['runs']
|
||||||
|
td = @exercise.average_working_time_for(user.id) or 0
|
||||||
|
@ -353,6 +353,7 @@ de:
|
|||||||
implement: Implementieren
|
implement: Implementieren
|
||||||
test_files: Test-Dateien
|
test_files: Test-Dateien
|
||||||
feedback: Feedback
|
feedback: Feedback
|
||||||
|
requests_for_comments: Kommentaranfragen
|
||||||
study_group_dashboard: Live Dashboard
|
study_group_dashboard: Live Dashboard
|
||||||
statistics:
|
statistics:
|
||||||
average_score: Durchschnittliche Punktzahl
|
average_score: Durchschnittliche Punktzahl
|
||||||
|
@ -398,6 +398,7 @@ en:
|
|||||||
implement: Implement
|
implement: Implement
|
||||||
test_files: Test Files
|
test_files: Test Files
|
||||||
feedback: Feedback
|
feedback: Feedback
|
||||||
|
requests_for_comments: Requests for Comments
|
||||||
study_group_dashboard: Live Dashboard
|
study_group_dashboard: Live Dashboard
|
||||||
show:
|
show:
|
||||||
is_unpublished: Exercise is unpublished
|
is_unpublished: Exercise is unpublished
|
||||||
|
@ -82,6 +82,7 @@ Rails.application.routes.draw do
|
|||||||
post :search
|
post :search
|
||||||
get :statistics
|
get :statistics
|
||||||
get :feedback
|
get :feedback
|
||||||
|
get :requests_for_comments
|
||||||
get :reload
|
get :reload
|
||||||
post :submit
|
post :submit
|
||||||
get 'study_group_dashboard/:study_group_id', to: 'exercises#study_group_dashboard'
|
get 'study_group_dashboard/:study_group_id', to: 'exercises#study_group_dashboard'
|
||||||
|
@ -18,7 +18,7 @@ end
|
|||||||
|
|
||||||
# delete all present records
|
# delete all present records
|
||||||
Rails.application.eager_load!
|
Rails.application.eager_load!
|
||||||
(ApplicationRecord.descendants - [ActiveRecord::SchemaMigration]).each(&:delete_all)
|
(ApplicationRecord.descendants - [ActiveRecord::SchemaMigration, User]).each(&:delete_all)
|
||||||
|
|
||||||
# delete file uploads
|
# delete file uploads
|
||||||
FileUtils.rm_rf(Rails.root.join('public', 'uploads'))
|
FileUtils.rm_rf(Rails.root.join('public', 'uploads'))
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"jstree": "^3.3.8",
|
"jstree": "^3.3.8",
|
||||||
"opensans-webkit": "^1.0.1",
|
"opensans-webkit": "^1.0.1",
|
||||||
"popper.js": "^1.15.0",
|
"popper.js": "^1.15.0",
|
||||||
|
"snyk": "^1.189.0",
|
||||||
"underscore": "^1.9.1",
|
"underscore": "^1.9.1",
|
||||||
"vis": "^4.21.0",
|
"vis": "^4.21.0",
|
||||||
"webpack-merge": "^4.1.4"
|
"webpack-merge": "^4.1.4"
|
||||||
@ -22,6 +23,9 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"webpack": "./bin/webpack",
|
"webpack": "./bin/webpack",
|
||||||
"webpack-dev-server": "./bin/webpack-dev-server"
|
"webpack-dev-server": "./bin/webpack-dev-server",
|
||||||
}
|
"snyk-protect": "snyk protect",
|
||||||
|
"prepublish": "npm run snyk-protect"
|
||||||
|
},
|
||||||
|
"snyk": true
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
######## VERSION INFORMATION ########
|
######## VERSION INFORMATION ########
|
||||||
|
|
||||||
postgres_version=10
|
postgres_version=10
|
||||||
ruby_version=2.6.2
|
ruby_version=2.6.3
|
||||||
rails_version=5.2.3
|
rails_version=5.2.3
|
||||||
geckodriver_version=0.24.0
|
geckodriver_version=0.26.0
|
||||||
|
|
||||||
########## INSTALL SCRIPT ###########
|
########## INSTALL SCRIPT ###########
|
||||||
|
|
||||||
|
18
spec/db/seeds_spec.rb
Normal file
18
spec/db/seeds_spec.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe 'seeds' do
|
||||||
|
subject(:seed) { Rake::Task['db:seed'].invoke }
|
||||||
|
|
||||||
|
before do
|
||||||
|
CodeOcean::Application.load_tasks
|
||||||
|
allow(Rails).to receive(:env) { 'development'.inquiry }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'execute db:seed' do
|
||||||
|
it 'collects the test results' do
|
||||||
|
expect { seed }.not_to raise_error(StandardError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -1,6 +1,7 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe 'Authentication' do
|
describe 'Authentication' do
|
||||||
|
before { skip 'feature specs fail randomly as of Nov 2019 on Travis' }
|
||||||
let(:user) { FactoryBot.create(:admin) }
|
let(:user) { FactoryBot.create(:admin) }
|
||||||
let(:password) { FactoryBot.attributes_for(:admin)[:password] }
|
let(:password) { FactoryBot.attributes_for(:admin)[:password] }
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe 'Authorization' do
|
describe 'Authorization' do
|
||||||
|
before { skip 'feature specs fail randomly as of Nov 2019 on Travis' }
|
||||||
context 'as an admin' do
|
context 'as an admin' do
|
||||||
let(:user) { FactoryBot.create(:admin) }
|
let(:user) { FactoryBot.create(:admin) }
|
||||||
before(:each) { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) }
|
before(:each) { allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user) }
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
describe 'Editor', js: true do
|
describe 'Editor', js: true do
|
||||||
|
before { skip 'feature specs fail randomly as of Nov 2019 on Travis' }
|
||||||
let(:exercise) { FactoryBot.create(:audio_video, description: Forgery(:lorem_ipsum).sentence) }
|
let(:exercise) { FactoryBot.create(:audio_video, description: Forgery(:lorem_ipsum).sentence) }
|
||||||
let(:user) { FactoryBot.create(:teacher) }
|
let(:user) { FactoryBot.create(:teacher) }
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ let(:exercise) { FactoryBot.build(:dummy) }
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
[:create?, :index?, :new?].each do |action|
|
[:create?, :index?, :new?, :statistics?, :feedback?, :requests_for_comments?].each do |action|
|
||||||
permissions(action) do
|
permissions(action) do
|
||||||
it 'grants access to admins' do
|
it 'grants access to admins' do
|
||||||
expect(subject).to permit(FactoryBot.build(:admin), exercise)
|
expect(subject).to permit(FactoryBot.build(:admin), exercise)
|
||||||
@ -30,7 +30,7 @@ let(:exercise) { FactoryBot.build(:dummy) }
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
[:clone?, :destroy?, :edit?, :statistics?, :update?].each do |action|
|
[:clone?, :destroy?, :edit?, :update?].each do |action|
|
||||||
permissions(action) do
|
permissions(action) do
|
||||||
it 'grants access to admins' do
|
it 'grants access to admins' do
|
||||||
expect(subject).to permit(FactoryBot.build(:admin), exercise)
|
expect(subject).to permit(FactoryBot.build(:admin), exercise)
|
||||||
|
Reference in New Issue
Block a user