WIP: fix http redirects, fix some JS urls

This commit is contained in:
Emmanuel Viennet 2021-06-21 14:40:58 +02:00
parent ede5aa680d
commit 64615036ec
9 changed files with 99 additions and 79 deletions

View File

@ -7,6 +7,8 @@ import inspect
import types import types
import logging import logging
import werkzeug
from werkzeug.exceptions import BadRequest
import flask import flask
from flask import g from flask import g
from flask import abort, current_app from flask import abort, current_app
@ -14,7 +16,6 @@ from flask import request
from flask_login import current_user from flask_login import current_user
from flask_login import login_required from flask_login import login_required
from flask import current_app from flask import current_app
from werkzeug.exceptions import BadRequest
from app.auth.models import Permission from app.auth.models import Permission
@ -80,7 +81,8 @@ class ZResponse(object):
self.headers = {} self.headers = {}
def redirect(self, url): def redirect(self, url):
return flask.redirect(url) # http 302 current_app.logger.debug("ZResponse redirect to:" + str(url))
return flask.redirect(url.decode("utf-8")) # http 302 # #sco8 unicode
def setHeader(self, header, value): def setHeader(self, header, value):
self.headers[header.lower()] = value self.headers[header.lower()] = value
@ -188,6 +190,8 @@ def scodoc7func(context):
if not top_level: if not top_level:
return value return value
else: else:
if isinstance(value, werkzeug.wrappers.response.Response):
return value # redirected
# Build response, adding collected http headers: # Build response, adding collected http headers:
headers = [] headers = []
kw = {"response": value, "status": 200} kw = {"response": value, "status": 200}

View File

@ -231,6 +231,8 @@ def sco_header(
<script language="javascript" type="text/javascript" src="/ScoDoc/static/libjs/bubble.js"></script> <script language="javascript" type="text/javascript" src="/ScoDoc/static/libjs/bubble.js"></script>
<script type="text/javascript"> <script type="text/javascript">
window.onload=function(){enableTooltips("gtrcontent")}; window.onload=function(){enableTooltips("gtrcontent")};
var SCO_URL="%(ScoURL)s";
</script>""" </script>"""
% params % params
) )

View File

@ -248,6 +248,7 @@ def do_evaluation_create(
evaluation_type=None, evaluation_type=None,
numero=None, numero=None,
REQUEST=None, REQUEST=None,
**kw # ceci pour absorber les arguments excedentaires de tf #sco8
): ):
"""Create an evaluation""" """Create an evaluation"""
if not sco_permissions_check.can_edit_evaluation( if not sco_permissions_check.can_edit_evaluation(

View File

@ -53,15 +53,17 @@ from PIL import Image as PILImage
from cStringIO import StringIO from cStringIO import StringIO
import glob import glob
from flask import request
from config import Config from config import Config
import app.scodoc.sco_utils as scu from app.scodoc import sco_etud
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app.scodoc.scolog import logdb
from app.scodoc import sco_portal_apogee from app.scodoc import sco_portal_apogee
from app.scodoc import sco_preferences from app.scodoc import sco_preferences
from app.scodoc import sco_etud from app.scodoc.notes_log import log
from app.scodoc.scolog import logdb
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
# Full paths on server's filesystem. Something like "/opt/scodoc/var/scodoc/photos" # Full paths on server's filesystem. Something like "/opt/scodoc/var/scodoc/photos"
PHOTO_DIR = os.path.join(Config.INSTANCE_HOME, "var", "scodoc", "photos") PHOTO_DIR = os.path.join(Config.INSTANCE_HOME, "var", "scodoc", "photos")
@ -89,7 +91,10 @@ def etud_photo_url(context, etud, size="small", fast=False, REQUEST=None):
"""url to the image of the student, in "small" size or "orig" size. """url to the image of the student, in "small" size or "orig" size.
If ScoDoc doesn't have an image and a portal is configured, link to it. If ScoDoc doesn't have an image and a portal is configured, link to it.
""" """
photo_url = "get_photo_image?etudid=%s&size=%s" % (etud["etudid"], size) photo_url = scu.ScoURL() + "/get_photo_image?etudid=%s&size=%s" % (
etud["etudid"],
size,
)
if fast: if fast:
return photo_url return photo_url
path = photo_pathname(context, etud, size=size) path = photo_pathname(context, etud, size=size)
@ -98,7 +103,7 @@ def etud_photo_url(context, etud, size="small", fast=False, REQUEST=None):
ext_url = photo_portal_url(context, etud) ext_url = photo_portal_url(context, etud)
if not ext_url: if not ext_url:
# fallback: Photo "unknown" # fallback: Photo "unknown"
photo_url = UNKNOWN_IMAGE_URL photo_url = scu.ScoURL() + "/" + UNKNOWN_IMAGE_URL
else: else:
# essaie de copier la photo du portail # essaie de copier la photo du portail
new_path, _ = copy_portal_photo_to_fs(context, etud, REQUEST=REQUEST) new_path, _ = copy_portal_photo_to_fs(context, etud, REQUEST=REQUEST)
@ -141,7 +146,7 @@ def _http_jpeg_file(context, filename, REQUEST=None):
RESPONSE.setHeader("Last-Modified", last_modified_str) RESPONSE.setHeader("Last-Modified", last_modified_str)
RESPONSE.setHeader("Cache-Control", "max-age=3600") RESPONSE.setHeader("Cache-Control", "max-age=3600")
RESPONSE.setHeader("Content-Length", str(file_size)) RESPONSE.setHeader("Content-Length", str(file_size))
header = REQUEST.get_header("If-Modified-Since", None) header = request.headers.get("If-Modified-Since")
if header is not None: if header is not None:
header = header.split(";")[0] header = header.split(";")[0]
# Some proxies seem to send invalid date strings for this # Some proxies seem to send invalid date strings for this

View File

@ -13,14 +13,14 @@ function get_etudid_from_elem(e) {
} }
} }
$().ready(function(){ $().ready(function () {
var elems = $(".etudinfo"); var elems = $(".etudinfo");
var q_args = get_query_args(); var q_args = get_query_args();
var args_to_pass = new Set( var args_to_pass = new Set(
[ "formsemestre_id", "group_ids","group_id", "partition_id", ["formsemestre_id", "group_ids", "group_id", "partition_id",
"moduleimpl_id", "evaluation_id" "moduleimpl_id", "evaluation_id"
]); ]);
var qs = ""; var qs = "";
for (var k in q_args) { for (var k in q_args) {
@ -28,11 +28,11 @@ $().ready(function(){
qs += '&' + k + '=' + q_args[k]; qs += '&' + k + '=' + q_args[k];
} }
} }
for (var i=0; i < elems.length; i++) { for (var i = 0; i < elems.length; i++) {
$(elems[i]).qtip({ $(elems[i]).qtip({
content: { content: {
ajax: { ajax: {
url: "etud_info_html?etudid=" + get_etudid_from_elem(elems[i]) + qs, url: SCO_URL + "/etud_info_html?etudid=" + get_etudid_from_elem(elems[i]) + qs,
type: "GET" type: "GET"
//success: function(data, status) { //success: function(data, status) {
// this.set('content.text', data); // this.set('content.text', data);
@ -40,14 +40,14 @@ $().ready(function(){
// console.log(status); // console.log(status);
} }
}, },
text: "Loading...", text: "Loading...",
position: { position: {
at: "right bottom", at: "right bottom",
my: "left top" my: "left top"
}, },
style: { style: {
classes: 'qtip-etud' classes: 'qtip-etud'
}, },
hide: { hide: {
fixed: true, fixed: true,
delay: 300 delay: 300

View File

@ -1,11 +1,11 @@
// Affichage progressif du trombinoscope html // Affichage progressif du trombinoscope html
$().ready(function(){ $().ready(function () {
var spans = $(".unloaded_img"); var spans = $(".unloaded_img");
for (var i=0; i < spans.length; i++) { for (var i = 0; i < spans.length; i++) {
var sp = spans[i]; var sp = spans[i];
var etudid = sp.id; var etudid = sp.id;
$(sp).load('etud_photo_html?etudid='+etudid); $(sp).load(SCO_URL + '/etud_photo_html?etudid=' + etudid);
} }
}); });
@ -25,7 +25,7 @@ function groups_view_url() {
var selected_groups = $("#group_selector select").val(); var selected_groups = $("#group_selector select").val();
url.param()['group_ids'] = selected_groups; // remplace par groupes selectionnes url.param()['group_ids'] = selected_groups; // remplace par groupes selectionnes
return url; return url;
} }
@ -34,16 +34,16 @@ function select_tous() {
var url = groups_view_url(); var url = groups_view_url();
var default_group_id = $("#group_selector")[0].default_group_id.value; var default_group_id = $("#group_selector")[0].default_group_id.value;
delete url.param()['group_ids']; delete url.param()['group_ids'];
url.param()['group_ids'] = [ default_group_id ]; url.param()['group_ids'] = [default_group_id];
var query_string = $.param(url.param(), traditional=true ); var query_string = $.param(url.param(), traditional = true);
window.location = url.attr('base') + url.attr('path') + '?' + query_string; window.location = url.attr('base') + url.attr('path') + '?' + query_string;
} }
// L'URL pour l'état courant de la page: // L'URL pour l'état courant de la page:
function get_current_url() { function get_current_url() {
var url = groups_view_url(); var url = groups_view_url();
var query_string = $.param(url.param(), traditional=true ); var query_string = $.param(url.param(), traditional = true);
return url.attr('base') + url.attr('path') + '?' + query_string; return url.attr('base') + url.attr('path') + '?' + query_string;
} }
@ -53,12 +53,12 @@ function submit_group_selector() {
} }
function show_current_tab() { function show_current_tab() {
$('.nav-tabs [href="#'+CURRENT_TAB_HASH+'"]').tab('show'); $('.nav-tabs [href="#' + CURRENT_TAB_HASH + '"]').tab('show');
} }
var CURRENT_TAB_HASH = $.url().param()['curtab']; var CURRENT_TAB_HASH = $.url().param()['curtab'];
$().ready(function(){ $().ready(function () {
$('.nav-tabs a').on('shown.bs.tab', function (e) { $('.nav-tabs a').on('shown.bs.tab', function (e) {
CURRENT_TAB_HASH = e.target.hash.slice(1); // sans le # CURRENT_TAB_HASH = e.target.hash.slice(1); // sans le #
}); });
@ -69,15 +69,15 @@ $().ready(function(){
function change_list_options() { function change_list_options() {
var url = groups_view_url(); var url = groups_view_url();
var selected_options = $("#group_list_options").val(); var selected_options = $("#group_list_options").val();
var options = [ "with_paiement", "with_archives", "with_annotations", "with_codes" ]; var options = ["with_paiement", "with_archives", "with_annotations", "with_codes"];
for (var i=0; i<options.length; i++) { for (var i = 0; i < options.length; i++) {
var option = options[i]; var option = options[i];
delete url.param()[option]; delete url.param()[option];
if ($.inArray( option, selected_options ) >= 0) { if ($.inArray(option, selected_options) >= 0) {
url.param()[option] = 1; url.param()[option] = 1;
} }
} }
var query_string = $.param(url.param(), traditional=true ); var query_string = $.param(url.param(), traditional = true);
window.location = url.attr('base') + url.attr('path') + '?' + query_string; window.location = url.attr('base') + url.attr('path') + '?' + query_string;
} }
@ -86,45 +86,45 @@ function toggle_visible_etuds() {
// //
$(".etud_elem").hide(); $(".etud_elem").hide();
var qargs = ""; var qargs = "";
$("#group_ids_sel option:selected").each( function(index, opt) { $("#group_ids_sel option:selected").each(function (index, opt) {
var group_id = opt.value; var group_id = opt.value;
$("."+group_id).show(); $("." + group_id).show();
qargs += "&group_ids=" + group_id; qargs += "&group_ids=" + group_id;
}); });
// Update url saisie tableur: // Update url saisie tableur:
var input_eval = $("#formnotes_evaluation_id"); var input_eval = $("#formnotes_evaluation_id");
if (input_eval.length > 0) { if (input_eval.length > 0) {
var evaluation_id = input_eval[0].value; var evaluation_id = input_eval[0].value;
$("#menu_saisie_tableur a").attr("href", "saisie_notes_tableur?evaluation_id=" + evaluation_id + qargs ); $("#menu_saisie_tableur a").attr("href", "saisie_notes_tableur?evaluation_id=" + evaluation_id + qargs);
// lien feuille excel: // lien feuille excel:
$("#lnk_feuille_saisie").attr("href", "feuille_saisie_notes?evaluation_id=" + evaluation_id + qargs ); $("#lnk_feuille_saisie").attr("href", "feuille_saisie_notes?evaluation_id=" + evaluation_id + qargs);
} }
} }
$().ready(function() { $().ready(function () {
$('#group_ids_sel').multiselect( $('#group_ids_sel').multiselect(
{ {
includeSelectAllOption: false, includeSelectAllOption: false,
nonSelectedText:'choisir...', nonSelectedText: 'choisir...',
// buttonContainer: '<div id="group_ids_sel_container"/>', // buttonContainer: '<div id="group_ids_sel_container"/>',
onChange: function(element, checked){ onChange: function (element, checked) {
if (checked == true) { if (checked == true) {
var default_group_id = $(".default_group")[0].value; var default_group_id = $(".default_group")[0].value;
if (element.hasClass("default_group")) { if (element.hasClass("default_group")) {
// click sur groupe "tous" // click sur groupe "tous"
// deselectionne les autres // deselectionne les autres
$("#group_ids_sel option:selected").each( function(index, opt) { $("#group_ids_sel option:selected").each(function (index, opt) {
if (opt.value != default_group_id) { if (opt.value != default_group_id) {
$("#group_ids_sel").multiselect('deselect', opt.value); $("#group_ids_sel").multiselect('deselect', opt.value);
} }
}); });
} else { } else {
// click sur un autre item // click sur un autre item
// si le groupe "tous" est selectionne et que l'on coche un autre, le deselectionner // si le groupe "tous" est selectionne et que l'on coche un autre, le deselectionner
var default_is_selected = false; var default_is_selected = false;
$("#group_ids_sel option:selected").each( function(index, opt) { $("#group_ids_sel option:selected").each(function (index, opt) {
if (opt.value == default_group_id) { if (opt.value == default_group_id) {
default_is_selected = true; default_is_selected = true;
return false; return false;
@ -133,13 +133,13 @@ $().ready(function() {
if (default_is_selected) { if (default_is_selected) {
$("#group_ids_sel").multiselect('deselect', default_group_id); $("#group_ids_sel").multiselect('deselect', default_group_id);
} }
} }
} }
toggle_visible_etuds(); toggle_visible_etuds();
// referme le menu apres chaque choix: // referme le menu apres chaque choix:
$("#group_selector .btn-group").removeClass('open'); $("#group_selector .btn-group").removeClass('open');
if ($("#group_ids_sel").hasClass("submit_on_change")) { if ($("#group_ids_sel").hasClass("submit_on_change")) {
submit_group_selector(); submit_group_selector();
} }
@ -152,28 +152,28 @@ $().ready(function() {
}); });
// Trombinoscope // Trombinoscope
$().ready(function(){ $().ready(function () {
var elems = $(".trombi-photo"); var elems = $(".trombi-photo");
for (var i=0; i < elems.length; i++) { for (var i = 0; i < elems.length; i++) {
$(elems[i]).qtip( $(elems[i]).qtip(
{ {
content: { content: {
ajax: { ajax: {
url: "etud_info_html?with_photo=0&etudid=" + get_etudid_from_elem(elems[i]) url: SCO_URL + "/etud_info_html?with_photo=0&etudid=" + get_etudid_from_elem(elems[i])
}, },
text: "Loading..." text: "Loading..."
}, },
position: { position: {
at : "right", at: "right",
my : "left top" my: "left top"
}, },
style: { style: {
classes: 'qtip-etud' classes: 'qtip-etud'
}, },
// utile pour debugguer le css: // utile pour debugguer le css:
// hide: { event: 'unfocus' } // hide: { event: 'unfocus' }
} }
); );
} }
}); });

View File

@ -77,3 +77,11 @@ def sco_get_version(REQUEST):
@permission_required(Permission.ScoView) @permission_required(Permission.ScoView)
def sco_test_view(REQUEST=None): def sco_test_view(REQUEST=None):
return """Vous avez vu sco_test_view !""" return """Vous avez vu sco_test_view !"""
import flask
@bp.route("/essrep")
def essrep():
return flask.Response(status=200, response="Bonjour")

View File

@ -1482,7 +1482,7 @@ sco_publish(
) )
@bp.route("/evaluation_edit") @bp.route("/evaluation_edit", methods=["GET", "POST"])
@permission_required(Permission.ScoEnsView) @permission_required(Permission.ScoEnsView)
@scodoc7func(context) @scodoc7func(context)
def evaluation_edit(context, evaluation_id, REQUEST): def evaluation_edit(context, evaluation_id, REQUEST):
@ -1492,7 +1492,7 @@ def evaluation_edit(context, evaluation_id, REQUEST):
) )
@bp.route("/evaluation_create") @bp.route("/evaluation_create", methods=["GET", "POST"])
@permission_required(Permission.ScoEnsView) @permission_required(Permission.ScoEnsView)
@scodoc7func(context) @scodoc7func(context)
def evaluation_create(context, moduleimpl_id, REQUEST): def evaluation_create(context, moduleimpl_id, REQUEST):

View File

@ -184,7 +184,7 @@ def about(context, REQUEST):
# -------------------------------------------------------------------- # --------------------------------------------------------------------
@bp.route("/edit_preferences") @bp.route("/edit_preferences", methods=["GET", "POST"])
@permission_required(Permission.ScoChangePreferences) @permission_required(Permission.ScoChangePreferences)
@scodoc7func(context) @scodoc7func(context)
def edit_preferences(context, REQUEST): def edit_preferences(context, REQUEST):