Skip to content

Commit

Permalink
fixes #459
Browse files Browse the repository at this point in the history
  • Loading branch information
tgloeggl committed May 4, 2021
1 parent b1196f7 commit 81e5a72
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 40 deletions.
59 changes: 42 additions & 17 deletions controllers/ajax.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Opencast\Models\OCConfig;
use Opencast\Models\OCSeminarEpisodes;

class AjaxController extends OpencastController
{
Expand All @@ -11,45 +12,69 @@ public function index_action()

public function getseries_action()
{
$series = OCSeriesModel::getSeriesForUser($GLOBALS['user']->id);
$series = OCSeriesModel::getSeriesForUser($GLOBALS['user']->id, Context::getId());
$results = [];

array_walk($series, function (&$item, $key) {
$sem = Course::find($item['seminar_id']);
$item['name'] = $sem->getFullname('number-name-semester');
$item['endtime'] = $sem->getEnd_Time();
$item = array_merge($item, OCSeriesModel::getSeriesFromOpencast($item));
});
foreach ($series as $series_id => $seminar_id) {
$course = Course::find($seminar_id);

if (!$course || !$oc_items = OCSeriesModel::getSeriesFromOpencast($series_id, $seminar_id)) {
continue;
}

$item = [
'seminar_id' => $seminar_id,
'series_id' => $series_id
];

$item['name'] = $course->getFullname('number-name-semester');
$item['endtime'] = $course->getEnd_Time();
$item = array_merge($item, $oc_items);

uasort($series, function ($a, $b) {
$results[] = $item;
}

uasort($results, function ($a, $b) {
return $a['endtime'] == $b['endtime'] ? 0
: ($a['endtime'] < $b['endtime'] ? -1 : 1);
});

$this->render_json(array_values($series));
$this->render_json(array_values($results));
}

public function getepisodes_action($series_id)
{
$search_client = SearchClient::getInstance(OCConfig::getConfigIdForSeries($series_id));
//$episodes = $search_client->getEpisodes($series_id);
$course_id = OCConfig::getCourseIdForSeries($series_id);
$result = [];
$role = '';

if (OCPerm::editAllowed(Context::getId())) {
$role = 'Instructor';
} else if ($GLOBALS['perm']->have_studip_perm('autor', Context::getId())) {
$role = 'Learner';
if (!OCPerm::editAllowed($course_id)
|| !$GLOBALS['perm']->have_studip_perm('autor', $course_id))
{
// do not list episodes if user has no permissions in the connected course
$this->render_json(array_values([]));
return;
}

$episodes = $search_client->getEpisodes($series_id, Context::getId(), [$role]);
$episodes = $search_client->getEpisodes($series_id);

if (!is_array($episodes)) {
$episodes = [$episodes];
}

foreach ($episodes as $episode) {
if (key_exists('mediapackage', $episode)) {
$result[] = $episode;
$studip_episode = OCSeminarEpisodes::findOneBySQL(
'series_id = ? AND episode_id = ? AND seminar_id = ?',
[$series_id, $episode->id, $course_id]
);

if ($studip_episode && (
(Context::getId() == $course_id && $studip_episode->visible != 'invisible'))
|| $studip_episode->visible == 'free'
) {
$result[] = $episode;
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion controllers/course.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public function index_action($active_id = 'false', $upload_message = false)

$api_client = ApiEventsClient::getInstance(OCConfig::getConfigIdForSeries($series['series_id']));

$oc_series = OCSeriesModel::getSeriesFromOpencast($series);
$oc_series = OCSeriesModel::getSeriesFromOpencast($series['series_id'], $series['seminar_id']);
$this->connectedSeries[$key] = array_merge($series->toArray(), $oc_series);
$this->wip_episodes = array_merge($api_client->getEpisodes($series['series_id']), $this->wip_episodes);
$this->instances = array_merge(
Expand Down
21 changes: 17 additions & 4 deletions javascripts/embed.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion models/OCConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public static function getCourseIdForSeries($series_id)

public static function getConfigIdForSeries($series_id)
{
return OCSeminarSeries::findOneBySeminar_id($series_id)->config_id ?: 1;
return OCSeminarSeries::findOneBySeries_id($series_id)->config_id ?: 1;
}

public static function empty_config()
Expand Down
55 changes: 38 additions & 17 deletions models/OCSeriesModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,19 @@

class OCSeriesModel
{

/**
* [getSeriesFromOpencast description]
* Retrieve series for seminar from Opencast
*
* @param [type] $series [description]
* @param string $series_id the series_id
* @param string $seminar_id the seminar the series is connected to
*
* @return [type] [description]
* @return mixed the series from opencast or false
*/
public static function getSeriesFromOpencast($series)
public static function getSeriesFromOpencast($series_id, $seminar_id)
{
$sclient = SeriesClient::create($series['seminar_id']);
if ($oc_series = $sclient->getSeries($series['series_id'])) {
$sclient = SeriesClient::create($seminar_id);
if ($oc_series = $sclient->getSeries($series_id)) {
return self::transformSeriesJSON($oc_series);
}

Expand All @@ -31,32 +33,51 @@ public static function getSeminarAndSeriesData()
}

/**
* [getSeriesForUser description]
* List all series user has access to globally and in the passed context (if any)
*
* @param string $user_id user to get series for
* @param string $context_id optional, the context to include
*
* @param [type] $user_id [description]
* @return [type] [description]
* @return array an array if the type ['series_id' => 'seminar_id', ...]
*/
public static function getSeriesForUser($user_id)
public static function getSeriesForUser($user_id, $context_id = null)
{
$result = [];

if ($GLOBALS['perm']->have_perm('admin', $user_id)) {
$stmt = DBManager::get()->prepare("SELECT DISTINCT se.seminar_id, se.config_id, se.series_id
// get all free videos,
$stmt = DBManager::get()->prepare("SELECT DISTINCT se.series_id, se.seminar_id
FROM oc_seminar_series AS se
JOIN oc_seminar_episodes AS ep ON (se.series_id = ep.series_id)
WHERE ep.visible != 'invisible'");
WHERE ep.visible = 'free'");
$stmt->execute();

return $stmt->fetchAll(PDO::FETCH_ASSOC);
$result = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
} else {
$stmt = DBManager::get()->prepare("SELECT DISTINCT se.seminar_id, se.config_id, se.series_id
// get all free videos user has access to
$stmt = DBManager::get()->prepare("SELECT DISTINCT se.series_id, se.seminar_id
FROM seminar_user AS su
JOIN oc_seminar_series AS se ON (su.Seminar_id = se.seminar_id)
JOIN oc_seminar_episodes AS ep ON (se.series_id = ep.series_id)
WHERE su.user_id = ?
AND ep.visible != 'invisible'");
AND ep.visible = 'free'");
$stmt->execute([$user_id]);
$result = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
}

return $stmt->fetchAll(PDO::FETCH_ASSOC);
// get visible videos for current context
if ($context_id) {
$stmt = DBManager::get()->prepare("SELECT DISTINCT se.series_id, se.seminar_id
FROM oc_seminar_series AS se
JOIN oc_seminar_episodes AS ep ON (se.series_id = ep.series_id)
WHERE se.seminar_id = ?
AND se.visibility = 'visible'
AND ep.visible != 'invisible'");
$stmt->execute([$context_id]);

$result = array_merge($result, $stmt->fetchAll(PDO::FETCH_KEY_PAIR));
}

return $result;
}

/**
Expand Down

0 comments on commit 81e5a72

Please sign in to comment.