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 &&
(