diff --git a/app/decorators.py b/app/decorators.py index 5199f85e..f7bd46d4 100644 --- a/app/decorators.py +++ b/app/decorators.py @@ -7,6 +7,8 @@ import inspect import types import logging +import werkzeug +from werkzeug.exceptions import BadRequest import flask from flask import g from flask import abort, current_app @@ -14,7 +16,6 @@ from flask import request from flask_login import current_user from flask_login import login_required from flask import current_app -from werkzeug.exceptions import BadRequest from app.auth.models import Permission @@ -80,7 +81,8 @@ class ZResponse(object): self.headers = {} 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): self.headers[header.lower()] = value @@ -188,6 +190,8 @@ def scodoc7func(context): if not top_level: return value else: + if isinstance(value, werkzeug.wrappers.response.Response): + return value # redirected # Build response, adding collected http headers: headers = [] kw = {"response": value, "status": 200} diff --git a/app/scodoc/html_sco_header.py b/app/scodoc/html_sco_header.py index a22275a3..72fb42d8 100644 --- a/app/scodoc/html_sco_header.py +++ b/app/scodoc/html_sco_header.py @@ -231,6 +231,8 @@ def sco_header( """ % params ) diff --git a/app/scodoc/sco_evaluations.py b/app/scodoc/sco_evaluations.py index 76de15f2..2383e3d6 100644 --- a/app/scodoc/sco_evaluations.py +++ b/app/scodoc/sco_evaluations.py @@ -248,6 +248,7 @@ def do_evaluation_create( evaluation_type=None, numero=None, REQUEST=None, + **kw # ceci pour absorber les arguments excedentaires de tf #sco8 ): """Create an evaluation""" if not sco_permissions_check.can_edit_evaluation( diff --git a/app/scodoc/sco_photos.py b/app/scodoc/sco_photos.py index 480f2f70..5e20a8e8 100644 --- a/app/scodoc/sco_photos.py +++ b/app/scodoc/sco_photos.py @@ -53,15 +53,17 @@ from PIL import Image as PILImage from cStringIO import StringIO import glob +from flask import request + from config import Config -import app.scodoc.sco_utils as scu -import app.scodoc.notesdb as ndb -from app.scodoc.notes_log import log -from app.scodoc.scolog import logdb +from app.scodoc import sco_etud from app.scodoc import sco_portal_apogee 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" 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. 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: return photo_url 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) if not ext_url: # fallback: Photo "unknown" - photo_url = UNKNOWN_IMAGE_URL + photo_url = scu.ScoURL() + "/" + UNKNOWN_IMAGE_URL else: # essaie de copier la photo du portail 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("Cache-Control", "max-age=3600") 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: header = header.split(";")[0] # Some proxies seem to send invalid date strings for this diff --git a/app/static/js/etud_info.js b/app/static/js/etud_info.js index 1b2a7e50..f1ab66c5 100644 --- a/app/static/js/etud_info.js +++ b/app/static/js/etud_info.js @@ -13,14 +13,14 @@ function get_etudid_from_elem(e) { } } -$().ready(function(){ +$().ready(function () { var elems = $(".etudinfo"); var q_args = get_query_args(); var args_to_pass = new Set( - [ "formsemestre_id", "group_ids","group_id", "partition_id", - "moduleimpl_id", "evaluation_id" + ["formsemestre_id", "group_ids", "group_id", "partition_id", + "moduleimpl_id", "evaluation_id" ]); var qs = ""; for (var k in q_args) { @@ -28,11 +28,11 @@ $().ready(function(){ qs += '&' + k + '=' + q_args[k]; } } - for (var i=0; i < elems.length; i++) { - $(elems[i]).qtip({ - content: { - ajax: { - url: "etud_info_html?etudid=" + get_etudid_from_elem(elems[i]) + qs, + for (var i = 0; i < elems.length; i++) { + $(elems[i]).qtip({ + content: { + ajax: { + url: SCO_URL + "/etud_info_html?etudid=" + get_etudid_from_elem(elems[i]) + qs, type: "GET" //success: function(data, status) { // this.set('content.text', data); @@ -40,14 +40,14 @@ $().ready(function(){ // console.log(status); } }, - text: "Loading...", - position: { - at: "right bottom", - my: "left top" - }, - style: { - classes: 'qtip-etud' - }, + text: "Loading...", + position: { + at: "right bottom", + my: "left top" + }, + style: { + classes: 'qtip-etud' + }, hide: { fixed: true, delay: 300 diff --git a/app/static/js/groups_view.js b/app/static/js/groups_view.js index e050e40e..54476d5f 100644 --- a/app/static/js/groups_view.js +++ b/app/static/js/groups_view.js @@ -1,11 +1,11 @@ // Affichage progressif du trombinoscope html -$().ready(function(){ +$().ready(function () { var spans = $(".unloaded_img"); - for (var i=0; i < spans.length; i++) { - var sp = spans[i]; - var etudid = sp.id; - $(sp).load('etud_photo_html?etudid='+etudid); + for (var i = 0; i < spans.length; i++) { + var sp = spans[i]; + var etudid = sp.id; + $(sp).load(SCO_URL + '/etud_photo_html?etudid=' + etudid); } }); @@ -25,7 +25,7 @@ function groups_view_url() { var selected_groups = $("#group_selector select").val(); url.param()['group_ids'] = selected_groups; // remplace par groupes selectionnes - + return url; } @@ -34,16 +34,16 @@ function select_tous() { var url = groups_view_url(); var default_group_id = $("#group_selector")[0].default_group_id.value; 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; } // L'URL pour l'état courant de la page: function get_current_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; } @@ -53,12 +53,12 @@ function submit_group_selector() { } 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']; -$().ready(function(){ +$().ready(function () { $('.nav-tabs a').on('shown.bs.tab', function (e) { CURRENT_TAB_HASH = e.target.hash.slice(1); // sans le # }); @@ -69,15 +69,15 @@ $().ready(function(){ function change_list_options() { var url = groups_view_url(); var selected_options = $("#group_list_options").val(); - var options = [ "with_paiement", "with_archives", "with_annotations", "with_codes" ]; - for (var i=0; i= 0) { + if ($.inArray(option, selected_options) >= 0) { 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; } @@ -86,45 +86,45 @@ function toggle_visible_etuds() { // $(".etud_elem").hide(); 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; - $("."+group_id).show(); + $("." + group_id).show(); qargs += "&group_ids=" + group_id; }); // Update url saisie tableur: var input_eval = $("#formnotes_evaluation_id"); if (input_eval.length > 0) { 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: - $("#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( { includeSelectAllOption: false, - nonSelectedText:'choisir...', + nonSelectedText: 'choisir...', // buttonContainer: '
', - onChange: function(element, checked){ + onChange: function (element, checked) { if (checked == true) { var default_group_id = $(".default_group")[0].value; - + if (element.hasClass("default_group")) { // click sur groupe "tous" // 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) { $("#group_ids_sel").multiselect('deselect', opt.value); } }); - + } else { // click sur un autre item // si le groupe "tous" est selectionne et que l'on coche un autre, le deselectionner 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) { default_is_selected = true; return false; @@ -133,13 +133,13 @@ $().ready(function() { if (default_is_selected) { $("#group_ids_sel").multiselect('deselect', default_group_id); } - } - } + } + } toggle_visible_etuds(); // referme le menu apres chaque choix: $("#group_selector .btn-group").removeClass('open'); - + if ($("#group_ids_sel").hasClass("submit_on_change")) { submit_group_selector(); } @@ -152,28 +152,28 @@ $().ready(function() { }); // Trombinoscope -$().ready(function(){ +$().ready(function () { var elems = $(".trombi-photo"); - for (var i=0; i < elems.length; i++) { - $(elems[i]).qtip( - { - content: { - ajax: { - url: "etud_info_html?with_photo=0&etudid=" + get_etudid_from_elem(elems[i]) - }, - text: "Loading..." - }, - position: { - at : "right", - my : "left top" - }, - style: { - classes: 'qtip-etud' - }, - // utile pour debugguer le css: - // hide: { event: 'unfocus' } - } - ); + for (var i = 0; i < elems.length; i++) { + $(elems[i]).qtip( + { + content: { + ajax: { + url: SCO_URL + "/etud_info_html?with_photo=0&etudid=" + get_etudid_from_elem(elems[i]) + }, + text: "Loading..." + }, + position: { + at: "right", + my: "left top" + }, + style: { + classes: 'qtip-etud' + }, + // utile pour debugguer le css: + // hide: { event: 'unfocus' } + } + ); } }); diff --git a/app/views/essais.py b/app/views/essais.py index fb913233..0a0bfde4 100644 --- a/app/views/essais.py +++ b/app/views/essais.py @@ -77,3 +77,11 @@ def sco_get_version(REQUEST): @permission_required(Permission.ScoView) def sco_test_view(REQUEST=None): return """Vous avez vu sco_test_view !""" + + +import flask + + +@bp.route("/essrep") +def essrep(): + return flask.Response(status=200, response="Bonjour") diff --git a/app/views/notes.py b/app/views/notes.py index 739200a7..07b990d1 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -1482,7 +1482,7 @@ sco_publish( ) -@bp.route("/evaluation_edit") +@bp.route("/evaluation_edit", methods=["GET", "POST"]) @permission_required(Permission.ScoEnsView) @scodoc7func(context) 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) @scodoc7func(context) def evaluation_create(context, moduleimpl_id, REQUEST): diff --git a/app/views/scolar.py b/app/views/scolar.py index 128cd6f5..1b0bac7b 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -184,7 +184,7 @@ def about(context, REQUEST): # -------------------------------------------------------------------- -@bp.route("/edit_preferences") +@bp.route("/edit_preferences", methods=["GET", "POST"]) @permission_required(Permission.ScoChangePreferences) @scodoc7func(context) def edit_preferences(context, REQUEST):