[Scodoc-devel] [SVN] Scolar : [1302] Ajout deux champs dans informations admission: type_admission (APB, APB-PC, CEF...) et boursier (du secondaire).

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Sam 30 Nov 19:03:13 CET 2013


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20131130/f5ee8303/attachment.html>
-------------- section suivante --------------
Modified: branches/ScoDoc7/ImportScolars.py
===================================================================
--- branches/ScoDoc7/ImportScolars.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/ImportScolars.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -49,6 +49,8 @@
     'date_naissance', 'lieu_naissance',
     'bac', 'specialite', 'annee_bac',
     'math', 'physique', 'anglais', 'francais',
+    'type_admission',
+    'boursier_prec',
     'qualite', 'rapporteur', 'score', 'commentaire',
     'nomlycee', 'villelycee', 'codepostallycee', 'codelycee',
     # Adresse:
@@ -66,13 +68,24 @@
         l = l.strip()
         if l and l[0] != '#':
             fs = l.split(';')
+            fs[0] = fs[0].strip().lower().split()[0] # titre attribut: normalize, 1er mot seulement
             if len(fs) != 5:
-                raise FormatError('file %s has invalid format (expected %d fields, got %d) (%s)'
+                # Bug: invalid format file (fatal)
+                raise ScoException('file %s has invalid format (expected %d fields, got %d) (%s)'
                                   % (FORMAT_FILE,5,len(fs),l))
-            if with_codesemestre or fs[0].strip().lower() != 'codesemestre':
+            if with_codesemestre or fs[0] != 'codesemestre':
                 r.append( tuple( [x.strip() for x in fs]) )
     return r
 
+def sco_import_format_dict( with_codesemestre=True ):
+    """ Attribut: { 'type': , 'table', 'allow_nulls' , 'description' }
+    """
+    fmt = sco_import_format( with_codesemestre=with_codesemestre )
+    R = {}
+    for l in fmt:
+        R[l[0]] = { 'type' : l[1], 'table' : l[2], 'allow_nulls' : l[3], 'description' : l[4] }
+    return R
+        
 def sco_import_generate_excel_sample( format,
                                       with_codesemestre=True,
                                       only_tables=None,
@@ -168,7 +181,7 @@
         raise ScoValueError("Ficher excel vide ou invalide")
     diag, data = sco_excel.Excel_to_list(exceldata)
     if not data: # probably a bug
-        raise FormatError('scolars_import_excel_file: empty file !')
+        raise ScoException('scolars_import_excel_file: empty file !')
 
     formsemestre_to_invalidate = Set()
     
@@ -383,6 +396,7 @@
     """Importe données admission depuis fichier Excel
     """
     log('scolars_import_admission: formsemestre_id=%s'%formsemestre_id)
+    Fmt = sco_import_format_dict()
     cnx = context.GetDBConnexion()
     cursor = cnx.cursor(cursor_factory=ScoDocCursor)
     annee_courante = time.localtime()[0]
@@ -391,7 +405,7 @@
         raise ScoValueError("Ficher excel vide ou invalide")
     diag, data = sco_excel.Excel_to_list(exceldata)
     if not data: # probably a bug
-        raise FormatError('scolars_import_admission: empty file !')
+        raise ScoException('scolars_import_admission: empty file !')
     #
     titles = data[0]
     try:
@@ -399,8 +413,10 @@
     except:
         raise FormatError('scolars_import_admission: pas de colonne "etudid"')
     modifiable_fields = Set( ADMISSION_MODIFIABLE_FIELDS )
-    
+
+    nline = 0
     for line in data[1:]:        
+        nline += 1
         args = scolars.admission_list(cnx, args={'etudid':line[ietudid]})
         if not args:
             raise ScoValueError('etudiant inconnu: etudid=%s' % line[ietudid])
@@ -409,10 +425,22 @@
         for tit in titles:
             if tit in modifiable_fields:
                 val = line[i]
-                # Excel date conversion:
-                if val and strlower(tit) == 'date_naissance':
-                    if re.match('^[0-9]*\.?[0-9]*$', str(val)):
-                        val = sco_excel.xldate_as_datetime(float(val)) 
+                # Verification / conversion du type selon le format
+                if val != None and val != '':
+                    typ = Fmt[tit]['type']
+                    try:
+                        if typ == 'integer':
+                            val = int(float(val)) # accept "10.0"
+                        elif type == 'real':
+                            val = float(val)
+                        else:
+                            # Excel date conversion  (cas particulier non traité dans le format):
+                            if val and strlower(tit) == 'date_naissance':
+                                if re.match('^[0-9]*\.?[0-9]*$', str(val)):
+                                    val = sco_excel.xldate_as_datetime(float(val))
+                    except ValueError:
+                        raise FormatError('scolars_import_admission: valeur invalide, ligne %d colonne %s: "%s" (%s attendu)' % (nline, tit, val, typ), dest_url='form_students_import_infos_admissions?formsemestre_id=%s'%formsemestre_id)
+                    
                 args[tit] = val
             i += 1
         scolars.etudident_edit(cnx, args )

Modified: branches/ScoDoc7/ZScoDoc.py
===================================================================
--- branches/ScoDoc7/ZScoDoc.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/ZScoDoc.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -645,7 +645,7 @@
         log('exception caught: %s' % error_type)
         if error_type == 'ScoGenError':
             return '<p>' + str(error_value) + '</p>'
-        elif error_type == 'ScoValueError':
+        elif error_type in ('ScoValueError', 'FormatError'):
             # Not a bug, presents a gentle message to the user:
             H = [ self.standard_html_header(self),
                   """<h2>Erreur !</h2><p>%s</p>""" % error_value ]

Modified: branches/ScoDoc7/ZScolar.py
===================================================================
--- branches/ScoDoc7/ZScolar.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/ZScolar.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -1213,15 +1213,22 @@
                     etud['ilycee'] = format_lycee_from_code(etud['codelycee'])
                 else:
                     etud['ilycee'] = ''
+            rap = ''
             if etud['rapporteur'] or etud['commentaire']:
-                etud['rap'] = 'Note du rapporteur'
+                rap = 'Note du rapporteur'
                 if etud['rapporteur']:
-                    etud['rap'] += ' (%s)' % etud['rapporteur']
-                etud['rap'] += ' :'
+                    rap += ' (%s) :' % etud['rapporteur']
                 if etud['commentaire']:
-                    etud['rap'] += '<em>%s</em>' % etud['commentaire']
-            else:
-                etud['rap'] = "Pas d'informations sur les conditions d'admission."
+                    rap += '<em>%s</em>' % etud['commentaire']
+        
+            if (etud['type_admission'] and etud['type_admission'] != TYPE_ADMISSION_DEFAULT):
+                rap = ('<span class="etud_type_admission">%s</span> ' % etud['type_admission']) + rap
+
+            etud['rap'] = rap
+
+            #if etud['boursier_prec']:
+            #    pass            
+
             if etud['telephone']:
                 etud['telephonestr'] = '<b>Tél.:</b> ' + format_telephone(etud['telephone'])
             else:
@@ -1962,10 +1969,23 @@
                        'explanation' : 'note sur 20 en terminale' }),
             ('francais', { 'size' : 3, 'type' : 'float', 'title' : 'Note de français',
                        'explanation' : 'note sur 20 obtenue au bac' }),
-            ('rang', { 'size' : 1, 'type' : 'int', 'title' : 'Position IUT Villetaneuse',
-                       'explanation' : 'rang de notre département dans les voeux du candidat' }),
+
+            ('type_admission', {
+                    'input_type' : 'menu',
+                    'title' : "Voie d'admission", 
+                    'allowed_values' : TYPES_ADMISSION}
+                    ),
+            ('boursier_prec', {
+                    'input_type' : 'boolcheckbox', 'labels' : ['non','oui'],
+                    'title' : 'Boursier ?',
+                    'explanation' : 'dans le cycle précédent (lycée)'
+                    }
+                    ),
+            
+            ('rang', { 'size' : 1, 'type' : 'int', 'title' : 'Position établissement',
+                       'explanation' : 'rang de notre établissement dans les voeux du candidat (inconnu avec APB)' }),
             ('qualite', { 'size' : 3, 'type' : 'float', 'title' : 'Qualité',
-                       'explanation' : 'Note de qualité attribuée au dossier' }),
+                       'explanation' : "Note de qualité attribuée au dossier (par le jury d'adm.)" }),
 
             ('decision', { 'input_type' : 'menu',
                            'title' : 'Décision', 

Modified: branches/ScoDoc7/config/postupgrade-db.py
===================================================================
--- branches/ScoDoc7/config/postupgrade-db.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/config/postupgrade-db.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -372,6 +372,14 @@
     check_field(cnx, 'identite', 'nom_usuel',
                 ['alter table identite add column nom_usuel text DEFAULT NULL',
                  ])
+    # add type_admission
+    check_field(cnx, 'admissions', 'type_admission',
+                ['alter table admissions add column type_admission text DEFAULT NULL',
+                 ])
+    check_field(cnx, 'admissions', 'boursier_prec',
+                ['alter table admissions add column boursier_prec integer default NULL',
+                 ])
+    
     # Add here actions to performs after upgrades:
     
     cnx.commit()

Modified: branches/ScoDoc7/misc/createtables.sql
===================================================================
--- branches/ScoDoc7/misc/createtables.sql	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/misc/createtables.sql	2013-11-30 18:03:13 UTC (rev 1302)
@@ -97,7 +97,9 @@
     villelycee text,
     codepostallycee text,
     codelycee text,
-    debouche text -- situation APRES etre passe par chez nous (texte libre)
+    debouche text, -- situation APRES etre passe par chez nous (texte libre)
+    type_admission text, -- 'APB', 'APC-PC', 'CEF', '?' (autre)
+    boursier_prec integer default NULL, -- etait boursier dans le cycle precedent (lycee) ?
 ) WITH OIDS;
 
 CREATE TABLE absences (

Modified: branches/ScoDoc7/misc/format_import_etudiants.txt
===================================================================
--- branches/ScoDoc7/misc/format_import_etudiants.txt	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/misc/format_import_etudiants.txt	2013-11-30 18:03:13 UTC (rev 1302)
@@ -26,6 +26,8 @@
 physique;     real;     admissions; 1;  note de physique en terminale
 anglais;      real;     admissions; 1;  note de anglais en terminale
 francais;     real;     admissions; 1;  note de francais au bac
+type_admission; text; admissions; 1; voie d'admission (APB, APB-PC, CEF, ...) 
+boursier_prec; integer; admissions; 1; 0/1  etait boursier dans le cycle precedent (lycee) ?
 qualite;      real;     admissions; 1;  note de qualite du dossier
 rapporteur;   text;     admissions; 1;  identite du rapporteur (enseignant IUT)
 decision;     text;     admissions; 1;  decision (admis, attente, ...)

Modified: branches/ScoDoc7/sco_exceptions.py
===================================================================
--- branches/ScoDoc7/sco_exceptions.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_exceptions.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -44,7 +44,7 @@
 class AccessDenied(ScoException):
     pass
 
-class FormatError(ScoException):
+class InvalidNoteValue(ScoException):
     pass
 
 # Exception qui stoque dest_url, utilisee dans Zope standard_error_message
@@ -55,6 +55,9 @@
         if REQUEST and dest_url:
             REQUEST.set('dest_url', dest_url)
 
+class FormatError(ScoValueError):
+    pass
+
 class ScoLockedFormError(ScoException):
     def __init__(self, msg='', REQUEST=None):
         msg = 'Cette formation est verrouillée (car il y a un semestre verrouillé qui s\'y réfère). ' + str(msg)

Modified: branches/ScoDoc7/sco_import_users.py
===================================================================
--- branches/ScoDoc7/sco_import_users.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_import_users.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -67,7 +67,7 @@
         raise ScoValueError("Ficher excel vide ou invalide")
     diag, data = sco_excel.Excel_to_list(exceldata)
     if not data: # probably a bug
-        raise FormatError('import_excel_file: empty file !')
+        raise ScoException('import_excel_file: empty file !')
     # 1-  --- check title line
     fs = [ strlower(stripquotes(s)) for s in data[0] ]
     log("excel: fs='%s'\ndata=%s" % (str(fs), str(data)))

Modified: branches/ScoDoc7/sco_report.py
===================================================================
--- branches/ScoDoc7/sco_report.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_report.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -218,7 +218,8 @@
         else:
             # clés présentées à l'utilisateur:
             keys = ['annee_bac', 'annee_naissance', 'bac', 'specialite', 'bac-specialite',
-                    'codedecision', 'etat', 'sexe', 'qualite', 'villelycee', 'statut' ]
+                    'codedecision', 'etat', 'sexe', 'qualite', 'villelycee', 'statut',
+                    'type_admission', 'boursier_prec' ]
         keys.sort()
         F = [ """<form name="f" method="get" action="%s"><p>
               Colonnes: <select name="result" onchange="document.f.submit()">""" % REQUEST.URL0]

Modified: branches/ScoDoc7/sco_saisie_notes.py
===================================================================
--- branches/ScoDoc7/sco_saisie_notes.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_saisie_notes.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -478,7 +478,7 @@
     diag, lines = sco_excel.Excel_to_list( data )
     try:
         if not lines:
-            raise FormatError()
+            raise InvalidNoteValue()
         # -- search eval code
         n = len(lines)
         i = 0
@@ -486,19 +486,19 @@
         while i < n:
             if not lines[i]:
                 diag.append('Erreur: format invalide (ligne vide ?)')
-                raise FormatError()
+                raise InvalidNoteValue()
             f0 = lines[i][0].strip()
             if f0 and f0[0] == '!':
                 break
             i = i + 1
         if i == n:
             diag.append('Erreur: format invalide ! (pas de ligne evaluation_id)')
-            raise FormatError()
+            raise InvalidNoteValue()
 
         eval_id = lines[i][0].strip()[1:]
         if eval_id != evaluation_id:
             diag.append("Erreur: fichier invalide: le code d\'évaluation de correspond pas ! ('%s' != '%s')"%(eval_id,evaluation_id))
-            raise FormatError()
+            raise InvalidNoteValue()
         # --- get notes -> list (etudid, value)
         # ignore toutes les lignes ne commençant pas par !
         notes = []
@@ -518,7 +518,7 @@
                 ni += 1
         except:
             diag.append('Erreur: feuille invalide ! (erreur ligne %d)<br/>"%s"' % (ni, str(lines[ni])))
-            raise FormatError()
+            raise InvalidNoteValue()
         # -- check values
         L, invalids, withoutnotes, absents, tosuppress = _check_notes(notes,E)
         if len(invalids):
@@ -527,7 +527,7 @@
                 etudsnames = [ context.getEtudInfo(etudid=etudid,filled=True)[0]['nomprenom'] 
                                for etudid in invalids ]
                 diag.append('Notes invalides pour: ' + ', '.join(etudsnames) )
-            raise FormatError()
+            raise InvalidNoteValue()
         else:
             nb_changed, nb_suppress, existing_decisions = _notes_add(context, authuser, evaluation_id, L, comment )
             # news
@@ -547,7 +547,7 @@
             # msg += '<p>' + str(notes) # debug
             return 1, msg
 
-    except FormatError:
+    except InvalidNoteValue:
         if diag:
             msg = '<ul class="tf-msg"><li class="tf_msg">' + '</li><li class="tf_msg">'.join(diag) + '</li></ul>'
         else:

Modified: branches/ScoDoc7/sco_trombino.py
===================================================================
--- branches/ScoDoc7/sco_trombino.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_trombino.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -116,7 +116,7 @@
         else:
             ng = 'Tous les étudiants'
     else:
-        ng = "Aucun étudiant inscrit dans ce semestre !"
+        ng = "Aucun étudiant inscrit dans ce groupe !"
     H = [ '<table style="padding-top: 10px; padding-bottom: 10px;"><tr><td><span style="font-style: bold; font-size: 150%%; padding-right: 20px;">%s</span></td>' % (ng) ]
     if members:
         H.append( '<td>' + makeMenu( 'Photos', menuTrombi ) + '</td>' )

Modified: branches/ScoDoc7/sco_utils.py
===================================================================
--- branches/ScoDoc7/sco_utils.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/sco_utils.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -267,6 +267,12 @@
     kv_dict={ 'FI':10, 'FAP' : 20, 'FC' : 30 }, defaultvalue = 100 )
 
 
+# Admissions des étudiants
+# Différents types de voies d'admission:
+# (stocké en texte libre dans la base, mais saisie par menus pour harmoniser)
+TYPE_ADMISSION_DEFAULT='Inconnue'
+TYPES_ADMISSION=(TYPE_ADMISSION_DEFAULT, 'APB', 'APB-PC', 'CEF', 'Direct')
+
 """ Simple python utilities
 """
 

Modified: branches/ScoDoc7/scolars.py
===================================================================
--- branches/ScoDoc7/scolars.py	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/scolars.py	2013-11-30 18:03:13 UTC (rev 1302)
@@ -401,12 +401,17 @@
       'decision', 'score', 'commentaire',
       'nomlycee', 'villelycee', 'codepostallycee', 'codelycee',
       'debouche',
+      'type_admission',
+      'boursier_prec'
       ),
     input_formators = { 'annee' : pivot_year,
                         'bac' : force_uppercase,
                         'specialite' : force_uppercase,
                         'annee_bac' : pivot_year,
                         },
+    output_formators = {
+        'type_admission' : lambda x: x or TYPE_ADMISSION_DEFAULT,
+        },
     convert_null_outputs_to_empty=True )
 
 admission_create = _admissionEditor.create

Modified: branches/ScoDoc7/static/css/scodoc.css
===================================================================
--- branches/ScoDoc7/static/css/scodoc.css	2013-11-30 09:20:14 UTC (rev 1301)
+++ branches/ScoDoc7/static/css/scodoc.css	2013-11-30 18:03:13 UTC (rev 1302)
@@ -403,6 +403,11 @@
    font-weight: bold;
 }
 
+span.etud_type_admission {
+   color: rgb(0,0,128);
+   font-style: normal;
+}
+
 td.fichetitre2 {
    font-weight: bold;
    vertical-align: top;


Plus d'informations sur la liste de diffusion Scodoc-devel