diff --git a/.circleci/Dockerfile b/.circleci/Dockerfile index e1ad0bc52d350..737e21d0f5aa1 100644 --- a/.circleci/Dockerfile +++ b/.circleci/Dockerfile @@ -46,15 +46,15 @@ RUN apt-get update && \ python python-dev # install ruby -RUN wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz && \ - tar -xzvf ruby-2.5.0.tar.gz && \ - rm ruby-2.5.0.tar.gz && \ - cd ruby-2.5.0 && \ +RUN wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz && \ + tar -xzvf ruby-2.2.3.tar.gz && \ + rm ruby-2.2.3.tar.gz && \ + cd ruby-2.2.3 && \ ./configure && \ make -j"$(nproc)" && \ make install && \ cd .. && \ - rm -r ruby-2.5.0 + rm -r ruby-2.2.3 # install bundler RUN gem install bundler && \ diff --git a/.circleci/config.yml b/.circleci/config.yml index 29f2f5c3bdb61..6cb6b9bbe7362 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,7 +10,7 @@ jobs: build: parallelism: 2 docker: - - image: wjordan/code-dot-org:ruby-2.5 + - image: wjordan/code-dot-org:trusty environment: RAILS_ENV: test RACK_ENV: test diff --git a/Gemfile.lock b/Gemfile.lock index 37f1004f40992..b601efba850be 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -326,7 +326,7 @@ GEM redis (~> 3.2) faraday (0.9.2) multipart-post (>= 1.2, < 3) - ffi (1.9.21) + ffi (1.9.23) firebase (0.2.6) httpclient json diff --git a/apps/src/code-studio/pd/permission.js b/apps/src/code-studio/pd/permission.js index e3ad73062131b..4c8ca4c4bf71e 100644 --- a/apps/src/code-studio/pd/permission.js +++ b/apps/src/code-studio/pd/permission.js @@ -14,6 +14,8 @@ export default class Permission { this.isWorkshopAdmin = this.hasPermission('workshop_admin'); this.isFacilitator = this.hasPermission('facilitator'); + // CSF Facilitators can create workshops, other facilitators cannot + this.isCsfFacilitator = this.hasPermission('csf_facilitator'); this.isOrganizer = this.hasPermission('workshop_organizer'); this.isPartner = this.hasPermission('partner'); } diff --git a/apps/src/code-studio/pd/workshop_dashboard/components/workshop_form.jsx b/apps/src/code-studio/pd/workshop_dashboard/components/workshop_form.jsx index 9716e01a89d94..da50d2eb5e346 100644 --- a/apps/src/code-studio/pd/workshop_dashboard/components/workshop_form.jsx +++ b/apps/src/code-studio/pd/workshop_dashboard/components/workshop_form.jsx @@ -33,6 +33,7 @@ import { DATE_FORMAT, DATETIME_FORMAT } from '../workshopConstants'; +import Permission from '../../permission'; const styles = { readOnlyInput: { @@ -80,6 +81,7 @@ export default class WorkshopForm extends React.Component { constructor(props) { super(props); this.state = this.computeInitialState(props); + this.permission = new Permission(); } computeInitialState(props) { @@ -121,9 +123,10 @@ export default class WorkshopForm extends React.Component { ); initialState.sessions = this.prepareSessionsForForm(props.workshop.sessions); this.loadAvailableFacilitators(props.workshop.course); - this.loadRegionalPartners(); } + this.loadRegionalPartners(); + return initialState; } @@ -367,7 +370,8 @@ export default class WorkshopForm extends React.Component { onChange={this.handleFieldChange} style={this.getInputStyle()} value={this.state.regional_partner_id || ''} - disabled={this.props.readOnly} + // Facilitators (who are not organizers, partners, nor admins) cannot edit this field + disabled={this.props.readOnly || (!this.permission.isWorkshopAdmin && !this.permission.isOrganizer && !this.permission.isPartner)} > { diff --git a/apps/src/code-studio/pd/workshop_dashboard/workshop_index.jsx b/apps/src/code-studio/pd/workshop_dashboard/workshop_index.jsx index 987afabc9f69b..5857d7ed7ff9c 100644 --- a/apps/src/code-studio/pd/workshop_dashboard/workshop_index.jsx +++ b/apps/src/code-studio/pd/workshop_dashboard/workshop_index.jsx @@ -65,12 +65,14 @@ export default class WorkshopIndex extends React.Component { render() { const showOrganizer = this.permission.isWorkshopAdmin; + const canDelete = this.permission.isWorkshopAdmin || this.permission.isOrganizer; + const canCreate = (this.permission.isWorkshopAdmin || this.permission.isOrganizer || this.permission.isCsfFacilitator); return (

Your Workshops

- {(this.permission.isWorkshopAdmin || this.permission.isOrganizer) && + {canCreate && (