Something went wrong on our end
Select Git revision
course.html
-
Nils Beyer authoredNils Beyer authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
course.html 13.81 KiB
{% from 'macros.html' import lecture_list_item %}
{% from 'macros.html' import moderator_editor %}
{% from 'macros.html' import moderator_delete %}
{% from 'macros.html' import moderator_checkbox %}
{% from 'macros.html' import preview %}
{% from 'macros.html' import moderator_permissioneditor %}
{% extends "base.html" %}
{% block title %}- {{course.title}}{% endblock %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading">
<span class="panel-title">
{{ moderator_editor(['courses',course.id,'title'], course.title)}}
{% if ismod() %}
<i>(<a href={{ url_for('course', id=course.id) }}>{{course.id}}</a>)</i>
{% endif %}
</span>
<ul class="pull-right list-inline">
<li>{{ moderator_delete(['courses',course.id,'deleted']) }}</li>
<li>{{ moderator_permissioneditor('course',course.id,course.perm, global_permissions) }}</li>
</ul>
</div>
<div class="row panel-body">
<div class="col-xs-12">
<table class="table-top-aligned table-condensed">
<tbody>
{% if ismod() %}
<tr><td>Semester:</td><td>{{ moderator_editor(['courses',course.id,'semester'], course.semester) }}</td></tr>
{% else %}
<tr><td>Semester:</td><td>{{ course.semester|semester(long=True) }}</td></tr>
{% endif %}
<tr><td>Veranstalter:</td><td>{{ moderator_editor(['courses',course.id,'organizer'], course.organizer) }}</td></tr>
<tr><td>Bemerkungen:</td><td>{{ moderator_editor(['courses',course.id,'description'], course.description) }}</td></tr>
</tbody>
</table>
</div>
{% if ismod() %}
<div class="col-xs-12" style="margin-top: 20px">
<table class="table-condensed table-top-aligned">
<tbody>
<tr><td>Sichtbar:</td><td>{{ moderator_checkbox(['courses',course.id,'visible'], course.visible) }}</td></tr>
<tr><td>Gelistet:</td><td>{{ moderator_checkbox(['courses',course.id,'listed'], course.listed) }}</td></tr>
<tr><td>Nicht im Drehplan:</td><td>{{ moderator_checkbox(['courses',course.id,'external'], course.external) }}</td></tr>
<tr><td>Videos downloadbar:</td><td>{{ moderator_checkbox(['courses',course.id,'downloadable'], course.downloadable) }}</td></tr>
<tr><td>Videos automatisch verschieben:</td><td>{{ moderator_checkbox(['courses',course.id,'autopublish'], course.autopublish) }}</td></tr>
<tr><td>Videos automatisch sichtbar:</td><td>{{ moderator_checkbox(['courses',course.id,'autovisible'], course.autovisible) }}</td></tr>
<tr><td>Kapitel auf Kursseite:</td><td>{{ moderator_checkbox(['courses',course.id,'coursechapters'], course.coursechapters) }}</td></tr>
<tr><td>Short:</td><td>{{ moderator_editor(['courses',course.id,'short'], course.short) }}</td></tr>
<tr><td>Handle:</td><td>{{ moderator_editor(['courses',course.id,'handle'], course.handle) }}</td></tr>
<tr><td>Thema:</td><td>{{ moderator_editor(['courses',course.id,'subject'], course.subject) }}</td></tr>
<tr><td>Zuständig:</td><td>
<select id="responsible-select" multiple="multiple">
{% for user in responsible %}
<option value="{{ user.id }}"{% if user.responsible %} selected="selected"{% endif %}>{{ user.realname }}</option>
{% endfor %}
</select>
</td></tr>
<tr><td>Interne Bemerkungen:</td><td>{{ moderator_editor(['courses',course.id,'internal'], course.internal) }}</td></tr>
<tr><td>Login-Informationen:</td><td>{{ moderator_editor(['courses',course.id,'login_info'], course.login_info) }}</td></tr>
</tbody>
</table>
</div>
{% endif %}
</div>
</div>
{% if ismod() %}
<div class="panel panel-default">
<div class="panel-heading">
<a data-toggle="collapse" href="#statspanel" class="plotlyresize"><h1 class="panel-title">Statistiken</h1></a>
</div>
<div class="row panel-body collapse out panel-collapse" id="statspanel">
<div class="col-md-6 col-xs-12">
<p class="text-center">Zuschauer pro Tag</p>
<div id="plot_stats_viewsperday" class="plot-view" data-url="{{url_for('stats_viewsperday', req="course", param=course.id)}}"></div>
</div>
<div class="col-md-6 col-xs-12">
<p class="text-center">Zuschauer pro Termin</p>
<div id="plot_stats_generic" class="plot-view" data-type="bar" data-url="{{url_for('stats_generic', req="lecture_views", param=course.id)}}"></div>
</div>
</div>
</div>
{% endif %}
<div class="panel panel-default">
<div class="panel-heading">
<h1 class="panel-title">Videos
{% if ismod() %}
<a class="btn btn-default" style="margin-right: 5px;" href="{{ url_for('create', table='lectures', time=datetime.now(), title='Noch kein Titel', visible='0', course_id=course.id, ref=url_for('course', id=course.id)) }}">Neuer Termin</a>
<a class="btn btn-default" style="margin-right: 5px;" href="{{url_for('list_import_sources', id=course['id'])}}">Import</a>
{% endif %}
<ul class="list-inline pull-right">
<li>
<a class="fa fa-rss-square" aria-hidden="true" href="{{url_for('rss_feed', handle=course.handle)}}" style="text-decoration: none"></a>
</li>
{% if ismod() %}
<li>
<a class="fa fa-calendar" aria-hidden="true" href="{{url_for('ical_course', course=course.handle)}}" style="text-decoration: none"></a>
</li>
{% endif %}
</h1>
</div>
<ul class="list-group lectureslist">
{% for l in lectures %}
{{ lecture_list_item(l,videos|selectattr('lecture_id','equalto',l.id)|list,global_permissions,chapters=chapters|selectattr('lecture_id','equalto',l.id))}}
{% endfor %}
</ul>
</div>
{% if ismod() %}
<div class="modal fade" id="editperm" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Zugriffsrechte</h4>
</div>
<div class="modal-body">
<div class="row" style="padding-left: 10px; padding-right: 10px;" data-id="-1" data-type="-1" id="editpermdiv">
<span>Es existieren folgende Zugriffsrechte:</span>
<select onchange="moderator.permissioneditor.selectpermission(this)" size="6" class="col-xs-12" id="permissionlist">
</select>
<select class="col-xs-12 authtype" onchange="moderator.permissioneditor.typechange(this)">
<option value="public">Öffentlich</option>
<option selected value="password">Passwort</option>
<option value="rwth">RWTH intern</option>
<option value="fsmpi">FSMPI intern</option>
<option value="moodle">Moodle Lernraum</option>
<option value="none">Kein Zugriff</option>
</select>
<input class="col-xs-12 passwordinput authuser" type="text" placeholder="Benutzername">
<input class="col-xs-10 passwordinput authpassword" type="text" placeholder="Passwort">
<button class="col-xs-2 passwordinput authpgen" type="button" onclick="$('.authpassword',this.parentNode).val(moderator.permissioneditor.randompw());"><span class="fa fa-refresh" aria-hidden="true"></span></button>
<input class="col-xs-12 authl2p" type="text" placeholder="Lernraum" style="display: none;">
<input class="col-xs-12 authmoodle" type="text" placeholder="Lernraum" style="display: none;">
<button class="col-xs-4" onclick="moderator.permissioneditor.addbtnclick(this)">Add</button>
<button class="col-xs-4" onclick="moderator.permissioneditor.updatebtnclick(this)">Update</button>
<button class="col-xs-4" onclick="moderator.permissioneditor.delbtnclick(this)">Delete</button>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="editstream" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Livestream einrichten</h4>
</div>
<div class="modal-body">
<form id="editstream-form">
<div class="row" style="padding-left: 10px; padding-right: 10px;" data-id="-1" data-type="-1">
{% for snum in [1,2] %}
<div class="col-xs-6">
<label>Quelle {{ snum }}</label>
<select name="source{{ snum }}" class="form-control source-select">
<option value="">Nichts</option>
{% for source in live_sources %}
<option value="{{ source.id }}">{{ source.name }}</option>
{% endfor %}
</select>
<img src="{{ url_for('static', filename='smptebars.jpg') }}" style="width: 100%; margin-bottom: 0.5em; margin-top: 0.5em"/>
<div class="checkbox"><label><input name="source{{ snum }}_deinterlace" type="checkbox">Video deinterlacen</label></div>
<label>Lautstärke</label>
<div class="row">
<div class="col-xs-6">
<input type="range" name="source{{ snum }}_leftvolume" value="100">
</div>
<div class="col-xs-6">
<input type="range" name="source{{ snum }}_rightvolume" value="100">
</div>
</div>
<select name="source{{ snum }}_audiomode" class="form-control" style="margin-top: 0.5em">
<option value="mono" selected>Mono-Mix</option>
<option value="stereo">Stereo</option>
<option value="unchanged">Audio unverändert</option>
<option value="off">Kein Audio</option>
</select>
</div>
{% endfor %}
<div class="col-xs-12" style="margin-top: 1em">
<label>Video</label>
<select name="videomode" class="form-control">
<option value="1" selected>Nur Quelle 1</option>
<option value="2">Nur Quelle 2</option>
<option value="lecture4:3">Quelle 1 (4:3) links, Ausschnitt von 2 rechts</option>
<option value="lecture16:9">Quelle 1 (16:9) links, Ausschnitt von 2 rechts</option>
<option value="sidebyside">Side-by-Side (Quelle 1 links, 2 rechts)</option>
</select>
<div class="checkbox"><label><input name="video_showlogo" type="checkbox" checked>Video AG-Logo einblenden</label></div>
</div>
<div class="col-xs-12" style="margin-top: 1em">
<label>Weitere Einstellungen</label>
<div style="margin-top: -1em;">
<div class="checkbox"><label><input name="audio_normalize" type="checkbox">Lautstärke normalisieren</label></div>
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<form class="form-inline" method="post" action="{{ url_for('control_stream') }}">
<input type="hidden" id="editstream-lectureid" name="lecture_id" value="">
<input type="hidden" id="editstream-action" name="action" value="">
<button type="submit" id="editstream-start" class="btn btn-danger">Speichern und starten</button>
<button type="button" id="editstream-submit" class="btn btn-primary">Speichern</button>
</form>
</div>
</div>
</div>
</div>
<script>
function editstream_update() {
$('#editstream .source-select').each(function () {
if ($(this).val())
$(this).siblings('img').prop('src', '{{ config.VIDEOPREFIX }}/thumbnail/s_'+$(this).val()+'.jpg');
else
$(this).siblings('img').prop('src', {{ url_for('static', filename='smptebars.jpg')|tojson }});
});
};
function editstream_dump() {
var res = {};
$("#editstream input:checkbox[name!='']").each(function () {
res[$(this).attr('name')] = $(this).prop('checked');
});
$("#editstream select[name!='']").each(function () {
res[$(this).attr('name')] = $(this).val();
});
$("#editstream input[type='range'][name!='']").each(function () {
res[$(this).attr('name')] = $(this).val();
});
return res;
};
function editstream_load(obj) {
$("#editstream input:checkbox[name!='']").each(function () {
if ($(this).attr('name') in obj)
$(this).prop('checked', obj[$(this).attr('name')]);
});
$("#editstream select[name!='']").each(function () {
if ($(this).attr('name') in obj)
$(this).val(obj[$(this).attr('name')]);
});
$("#editstream input[type='range'][name!='']").each(function () {
if ($(this).attr('name') in obj)
$(this).val(obj[$(this).attr('name')]);
});
};
$('#editstream .source-select').on('change', editstream_update);
$('#editstream-submit').on('click', function () {
moderator.api.set($('#editstream').data('currentpath'), JSON.stringify(editstream_dump()), true);
$('#editstream').modal('hide');
});
$('#editstream-start').on('click', function () {
moderator.api.set($('#editstream').data('currentpath'), JSON.stringify(editstream_dump()), true);
return true;
});
$('#editstream').on('show.bs.modal', function (event) {
var button = $(event.relatedTarget);
$('#editstream').data('currentpath', button.data('path'));
if (button.data('active')) {
$('#editstream-action').val('stop');
$('#editstream-start').text('Stream stoppen');
} else {
$('#editstream-action').val('start');
$('#editstream-start').text('Speichern und starten');
}
$('#editstream-lectureid').val(button.data('lectureid'));
$("#editstream-form")[0].reset();
if (button.data('value'))
editstream_load(button.data('value'));
editstream_update();
});
$('#responsible-select').multiselect({enableCaseInsensitiveFiltering: true,
maxHeight: 200, numberDisplayed: 5, nonSelectedText: 'Niemand',
nSelectedText: 'ausgewählt', allSelectedText: false,
onChange: function(option, checked, select) {
moderator.api.set_map('responsible', {{ course.id }}, option.val(), checked);
}})
$.ajax({
method: "GET",
url: "{{url_for('stats_generic', req="lecture_views", param=course.id)}}",
dataType: "json",
error: function() {
var counter = $(".viewcounter");
for (var i=0; i<counter.length; i++) {
$(counter[i]).text("0");
}
},
success: function (traces) {
var dates={};
var t = traces[0];
if (!t.x) {
return;
}
for (var i=0; i<t.x.length; i++) {
dates[t.x[i]] = t.y[i];
}
var counter = $(".viewcounter");
for (var i=0; i<counter.length; i++) {
$(counter[i]).text(dates[$(counter[i]).data("lecturedate")]);
}
var counter = $(".viewcounter");
for (var i=0; i<counter.length; i++) {
if ($(counter[i]).text() == "loading...") {
$(counter[i]).text("0");
}
}
}
});
</script>
{% endif %}
{% endblock %}