Allow platform admins and internal users to switch their current study group

This commit is contained in:
Sebastian Serth
2022-09-20 00:12:46 +02:00
committed by Sebastian Serth
parent 2e3480a068
commit ac3dc8d30f
12 changed files with 94 additions and 21 deletions

View File

@ -529,7 +529,7 @@ var CodeOceanEditor = {
ul.append(li);
const sub_ul = document.createElement("ul");
sub_ul.setAttribute('class', 'error_messages_list');
sub_ul.setAttribute('class', 'inline_list');
for (let check_run of linter_results) {
const sub_li = document.createElement("li");
@ -559,9 +559,9 @@ var CodeOceanEditor = {
// one or more errors?
if (errorMessagesToShow.length > 1) {
ul.setAttribute('class', 'error_messages_list');
ul.setAttribute('class', 'inline_list');
} else {
ul.setAttribute('class', 'single_error_message');
ul.setAttribute('class', 'single_entry_inline_list');
}
targetNode.append(ul);
}

View File

@ -139,3 +139,15 @@ span.caret {
.table-row-clickable {
cursor: pointer;
}
.inline_list {
list-style-type: disc;
padding-inline-start: 1.25rem;
white-space: pre-wrap;
}
.single_entry_inline_list {
list-style-type: none;
padding-inline-start: 0;
white-space: pre-wrap;
}

View File

@ -161,18 +161,6 @@
margin-left: auto;
}
.error_messages_list {
list-style-type: disc;
padding-inline-start: 1.25rem;
white-space: pre-wrap;
}
.single_error_message {
list-style-type: none;
padding-inline-start: 0;
white-space: pre-wrap;
}
.enforce-top-margin {
margin-top: 5px !important;
}

View File

@ -13,6 +13,8 @@ class SessionsController < ApplicationController
def create
if login(params[:email], params[:password], params[:remember_me])
# We set the user's default study group to the "internal" group (no external id) for the given consumer.
session[:study_group_id] = current_user.study_groups.find_by(external_id: nil)&.id
redirect_back_or_to(:root, notice: t('.success'))
else
flash.now[:danger] = t('.failure')

View File

@ -3,7 +3,7 @@
class StudyGroupsController < ApplicationController
include CommonBehavior
before_action :set_group, only: MEMBER_ACTIONS
before_action :set_group, only: MEMBER_ACTIONS + %w[set_as_current]
def index
@search = policy_scope(StudyGroup).ransack(params[:q])
@ -37,6 +37,12 @@ class StudyGroupsController < ApplicationController
end
private :study_group_params
def set_as_current
session[:study_group_id] = @study_group.id
current_user.store_current_study_group_id(@study_group.id)
redirect_back(fallback_location: root_path, notice: t('study_groups.set_as_current.success'))
end
def set_group
@study_group = StudyGroup.find(params[:id])
authorize!

View File

@ -37,4 +37,8 @@ class InternalUser < User
def displayname
name
end
def current_study_group_id
study_groups.find_by(external_id: nil)&.id
end
end

View File

@ -5,8 +5,8 @@ class StudyGroupPolicy < AdminOnlyPolicy
admin? || teacher?
end
%i[show? edit? update? stream_la?].each do |action|
define_method(action) { admin? || (@user.teacher? && @record.present? && @user.study_groups.exists?(@record.id)) }
%i[show? edit? update? stream_la? set_as_current?].each do |action|
define_method(action) { admin? || teacher_in_study_group? }
end
def destroy?

View File

@ -7,7 +7,29 @@ h1 = @user.displayname
= @user.external_id
= row(label: 'external_user.consumer', value: link_to_if(policy(@user.consumer).show?, @user.consumer, @user.consumer))
= row(label: 'external_user.platform_admin', value: @user.platform_admin?)
= row(label: 'external_users.form.study_groups', value: @user.study_groups.map{|sg| "#{sg.name}"}.sort.join(", "))
= row(label: 'users.show.study_groups') do
- visible_memberships = @user.study_group_memberships.select { |study_group_membership| policy(study_group_membership.study_group).show? }
- if visible_memberships.any?
ul.mb-0 class="#{visible_memberships.one? ? 'single_entry_inline_list' : 'inline_list'}"
- visible_memberships = visible_memberships.sort_by{ |study_group_membership| study_group_membership.study_group.name}
- visible_memberships.each do |study_group_membership|
li
=> link_to(study_group_membership.study_group.name, study_group_membership.study_group)
| (
= t("activerecord.attributes.study_group_membership.role_type.#{study_group_membership.role}")
// Only platform admins are allowed to take a shorthand and switch their study group.
- if @user == current_user && current_user.admin? && study_group_membership.role_teacher?
| ,
- if study_group_membership.study_group_id == current_user.current_study_group_id
span.text-success =< t('users.show.current_study_group')
- else
=< link_to(t('users.show.set_as_current_study_group'), set_as_current_study_group_path(study_group_membership.study_group), method: :post, class: 'text-muted')
- elsif @user == current_user && study_group_membership.role_teacher? && study_group_membership.study_group_id == current_user.current_study_group_id
| ,
span.text-success =< t('users.show.current_study_group')
| )
- else
= t('users.show.no_groups')
h4.mt-4 = link_to(t('.exercise_statistics'), statistics_external_user_path(@user)) if policy(@user).statistics?

View File

@ -7,6 +7,25 @@ h1
= row(label: 'internal_user.consumer', value: @user.consumer ? link_to_if(policy(@user.consumer).show?, @user.consumer, @user.consumer) : nil)
= row(label: 'internal_user.platform_admin', value: @user.platform_admin?)
= row(label: 'internal_user.activated', value: @user.activated?)
= row(label: 'internal_users.form.study_groups', value: @user.study_groups.map{|sg| "#{sg.name}"}.sort.join(", "))
= row(label: 'users.show.study_groups') do
- visible_memberships = @user.study_group_memberships.select { |study_group_membership| policy(study_group_membership.study_group).show? }
- if visible_memberships.any?
ul.mb-0 class="#{visible_memberships.one? ? 'single_entry_inline_list' : 'inline_list'}"
- visible_memberships = visible_memberships.sort_by{ |study_group_membership| study_group_membership.study_group.name}
- visible_memberships.each do |study_group_membership|
li
=> link_to(study_group_membership.study_group.name, study_group_membership.study_group)
| (
= t("activerecord.attributes.study_group_membership.role_type.#{study_group_membership.role}")
// All internal users (except learners) are allowed to switch their study group here.
- if @user == current_user && study_group_membership.role_teacher?
| ,
- if study_group_membership.study_group_id == current_user.current_study_group_id
span.text-success =< t('users.show.current_study_group')
- else
=< link_to(t('users.show.set_as_current_study_group'), set_as_current_study_group_path(study_group_membership.study_group), method: :post, class: 'text-muted')
| )
- else
= t('users.show.no_groups')
= row(label: 'codeharbor_link.profile_label', value: @user.codeharbor_link.nil? ? link_to(t('codeharbor_link.new'), new_codeharbor_link_path, class: 'btn btn-secondary') : link_to(t('codeharbor_link.edit'), edit_codeharbor_link_path(@user.codeharbor_link), class: 'btn btn-secondary'))

View File

@ -891,8 +891,16 @@ de:
history: Punkteverlauf
percentage: Prozentzahl
siblings: Dazugehörige Abgaben
study_groups:
set_as_current:
success: Die Lerngruppe wurde erfolgreich gewechselt.
users:
platform_admin: Plattform Administrator
show:
current_study_group: Aktuelle Lerngruppe
set_as_current_study_group: Als aktuelle Lerngruppe setzen
study_groups: Lerngruppen
no_groups: Diese Person ist keiner Lerngruppe zugeordnet oder Sie sind nicht berechtigt, die Lerngruppen einzusehen.
will_paginate:
next_label: 'Nächste Seite &#8594;'
page_gap: '&hellip;'

View File

@ -891,8 +891,16 @@ en:
history: Score History
percentage: Percentage
siblings: Associated Submissions
study_groups:
set_as_current:
success: The study group has been switched successfully.
users:
platform_admin: Platform Admin
show:
current_study_group: Current Study Group
set_as_current_study_group: Set as Current Study Group
study_groups: Study Groups
no_groups: This user is either not part of any group or you do not have the necessary permissions to view them.
will_paginate:
next_label: 'Next Page &#8594;'
page_gap: '&hellip;'

View File

@ -160,7 +160,11 @@ Rails.application.routes.draw do
end
end
resources :study_groups, only: %i[index show edit destroy update]
resources :study_groups, only: %i[index show edit destroy update] do
member do
post :set_as_current
end
end
resources :events, only: [:create]