[Scodoc-devel] [SVN] Scolar : [1240] - Estimation du cout en HeqTD d'une formation ( cout theorique PPN d'un semestre).

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Jeu 13 Juin 12:23:05 CEST 2013


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20130613/2aec0785/attachment.html>
-------------- section suivante --------------
Modified: trunk/ZNotes.py
===================================================================
--- trunk/ZNotes.py	2013-06-12 13:33:29 UTC (rev 1239)
+++ trunk/ZNotes.py	2013-06-13 10:23:04 UTC (rev 1240)
@@ -78,6 +78,7 @@
 import sco_lycee
 import sco_poursuite_dut
 import sco_debouche
+import sco_cost_formation
 import sco_formsemestre_validation, sco_parcours_dut, sco_codes_parcours
 import sco_pvjury, sco_pvpdf, sco_prepajury
 import sco_inscr_passage, sco_synchro_etuds
@@ -2708,6 +2709,9 @@
     security.declareProtected(ScoView, "report_debouche_date")
     report_debouche_date = sco_debouche.report_debouche_date
     
+    security.declareProtected(ScoView, "formsemestre_estim_cost")
+    formsemestre_estim_cost = sco_cost_formation.formsemestre_estim_cost
+    
     # --------------------------------------------------------------------
     # DEBUG
     security.declareProtected(ScoView,'check_sem_integrity')

Modified: trunk/gen_tables.py
===================================================================
--- trunk/gen_tables.py	2013-06-12 13:33:29 UTC (rev 1239)
+++ trunk/gen_tables.py	2013-06-13 10:23:04 UTC (rev 1240)
@@ -101,6 +101,7 @@
                  filename='table', # filename, without extension
 
                  xls_sheet_name='feuille',
+                 xls_before_table=[], # liste de cellules a placer avant la table
                  pdf_title='', # au dessus du tableau en pdf
                  pdf_table_style=None,
                  pdf_col_widths=None,
@@ -143,6 +144,7 @@
         self.html_col_width = html_col_width
         # XLS parameters
         self.xls_sheet_name = xls_sheet_name
+        self.xls_before_table = xls_before_table
         # PDF parameters
         self.pdf_table_style = pdf_table_style
         self.pdf_col_widths = pdf_col_widths
@@ -365,20 +367,22 @@
         
     def excel(self):
         "Simple Excel representation of the table"
-        lines = [ [ x for x in line ] for line in self.get_data_list()]
+        L = sco_excel.ScoExcelSheet( sheet_name=self.xls_sheet_name)
+        style_bold = sco_excel.Excel_MakeStyle(bold=True)
+        
+        L.cells += self.xls_before_table
+        L.set_style( style_bold, li=len(L.cells))
+        L.append(self.get_titles_list())
+        L.cells +=  [ [ x for x in line ] for line in self.get_data_list()]
         if self.caption:
-            lines.append( [] ) # empty line  
-            lines.append( [self.caption] )
-        
+            L.append( [] ) # empty line  
+            L.append( [self.caption] )
         if self.origin:
-            lines.append( [] ) # empty line        
-            lines.append( [self.origin] )
-        #log('lines=%s'%lines)
-        return sco_excel.Excel_SimpleTable(
-            titles=self.get_titles_list(),
-            lines=lines,
-            SheetName=self.xls_sheet_name)            
+            L.append( [] ) # empty line        
+            L.append( [self.origin] )
 
+        return L.gen_workbook() 
+    
     def text(self):
         "raw text representation of the table"
         return '\n'.join( [ self.text_fields_separator.join([ x for x in line ])

Added: trunk/sco_cost_formation.py
===================================================================
--- trunk/sco_cost_formation.py	                        (rev 0)
+++ trunk/sco_cost_formation.py	2013-06-13 10:23:04 UTC (rev 1240)
@@ -0,0 +1,157 @@
+# -*- mode: python -*-
+# -*- coding: iso8859-15 -*-
+
+##############################################################################
+#
+# Gestion scolarite IUT
+#
+# Copyright (c) 2001 - 20113 Emmanuel Viennet.  All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+#   Emmanuel Viennet      emmanuel.viennet at viennet.net
+#
+##############################################################################
+
+"""Rapports estimation co\xFBt de formation bas\xE9 sur le programme p\xE9dagogique
+   et les nombres de groupes.
+
+   (co\xFBt th\xE9orique en heures \xE9quivalent TD)
+"""
+from notesdb import *
+from sco_utils import *
+from notes_log import log
+from gen_tables import GenTable
+import sco_excel, sco_pdf
+from sco_pdf import SU
+import sco_formsemestre_status
+   
+    
+def formsemestre_table_estim_cost(context, formsemestre_id,
+                                  n_group_td=1, n_group_tp=1,
+                                  coef_tp=1, coef_cours=1.5,
+                                  REQUEST=None):
+    """
+    Rapports estimation co\xFBt de formation bas\xE9 sur le programme p\xE9dagogique
+    et les nombres de groupes.
+    Co\xFBt th\xE9orique en heures \xE9quivalent TD.
+    Attention: ne prend en compte que les modules utilis\xE9s dans ce semestre.
+    Attention: prend en compte _tous_ les modules utilis\xE9s dans ce semestre, ce qui
+    peut conduire \xE0 une sur-estimation du co\xFBt s'il y a des modules optionnels
+    (dans ce cas, retoucher le tableau excel export\xE9).
+    """
+    sem = context.get_formsemestre(formsemestre_id)
+    sco_formsemestre_status.fill_formsemestre(context, sem, REQUEST=REQUEST)
+    Mlist = context.do_moduleimpl_withmodule_list( args={ 'formsemestre_id' : formsemestre_id } )
+    T = []
+    for M in Mlist:
+        Mod = M['module']
+        T.append( {
+            'code' : Mod['code'],
+            'titre' :Mod['titre'],
+            'heures_cours' : Mod['heures_cours'],
+            'heures_td' : Mod['heures_td'] * n_group_td,
+            'heures_tp' : Mod['heures_tp'] * n_group_tp,
+            } )
+    
+    # calcul des heures:
+    for t in T:
+        t['HeqTD'] = t['heures_td'] + coef_cours*t['heures_cours'] + coef_tp*t['heures_tp']
+    sum_cours = sum( [ t['heures_cours'] for t in T ] )
+    sum_td = sum( [ t['heures_td'] for t in T ] )
+    sum_tp = sum( [ t['heures_tp'] for t in T ] )
+    sum_heqtd = sum_td + coef_cours*sum_cours + coef_tp*sum_tp
+    assert sum([ t['HeqTD'] for t in T ]) == sum_heqtd
+
+    T.append( {
+        'code' : 'TOTAL SEMESTRE',
+        'heures_cours' : sum_cours,
+        'heures_td' : sum_td,
+        'heures_tp' : sum_tp,
+        'HeqTD' : sum_heqtd
+        })
+    
+    titles = {
+        'code' : 'Code',
+        'titre' : 'Titre',
+        'heures_cours' : 'Cours',
+        'heures_td' : 'TD',
+        'heures_tp' : 'TP',
+        'HeqTD' : 'HeqTD'
+        }
+    
+    tab = GenTable( titles=titles,
+                    columns_ids=('code', 'titre', 'heures_cours', 'heures_td', 'heures_tp', 'HeqTD'),
+                    rows=T,
+                    html_sortable=True,
+                    preferences=context.get_preferences(formsemestre_id),
+                    html_class='gt_table table_leftalign table_listegroupe',
+                    xls_before_table = [
+                        [ '%(titre)s %(num_sem)s %(modalitestr)s' % sem ],
+                        [ 'Formation %(titre)s version %(version)s' % sem['formation'] ],
+                        [],
+                        [ '', 'TD', 'TP' ],
+                        [ 'Nombre de groupes', n_group_td, n_group_tp ],
+                        [],
+                        []
+                        ],
+                    html_caption = """<div class="help">
+                    Estimation du co\xFBt de formation bas\xE9 sur le programme p\xE9dagogique
+    et les nombres de groupes.<br/>
+    Co\xFBt th\xE9orique en heures \xE9quivalent TD.<br/>
+    Attention: ne prend en compte que les modules utilis\xE9s dans ce semestre.<br/>
+    Attention: prend en compte <em>tous les modules</em> utilis\xE9s dans ce semestre, ce qui
+    peut conduire \xE0 une sur-estimation du co\xFBt s'il y a des modules optionnels
+    (dans ce cas, retoucher le tableau excel export\xE9).
+    </div>
+                    """,
+                    origin = 'G\xE9n\xE9r\xE9 par %s le ' % VERSION.SCONAME + timedate_human_repr() + '',
+                    filename='EstimCout-S%s' % sem['semestre_id']
+        )
+    return tab
+
+
+def formsemestre_estim_cost(context, formsemestre_id,
+                            n_group_td=1, n_group_tp=1,
+                            coef_tp=1, coef_cours=1.5,
+                            format='html',
+                            REQUEST=None):
+    """Page (formulaire) estimation co\xFBts"""
+
+    n_group_td = int(n_group_td)
+    n_group_tp = int(n_group_tp)
+    coef_tp = float(coef_tp)
+    coef_cours = float(coef_cours)
+    
+    tab = formsemestre_table_estim_cost(
+        context, formsemestre_id, n_group_td=n_group_td, n_group_tp=n_group_tp,
+        coef_tp=coef_tp, coef_cours=coef_cours,
+        REQUEST=REQUEST)
+    h = ("""
+    <form name="f" method="get" action="%s">
+    <input type="hidden" name="formsemestre_id" value="%s"></input>
+    Nombre de groupes de TD: <input type="text" name="n_group_td" value="%s" onchange="document.f.submit()"/><br/>
+    Nombre de groupes de TP: <input type="text" name="n_group_tp" value="%s" onchange="document.f.submit()"/>
+     Coefficient heures TP: <input type="text" name="coef_tp" value="%s" onchange="document.f.submit()"/>
+    <br/>
+    </form>
+    """
+        % (REQUEST.URL0, formsemestre_id, n_group_td, n_group_tp, coef_tp)    
+        )
+    tab.html_before_table = h
+    tab.base_url = '%s?formsemestre_id=%s&n_group_td=%s&n_group_tp=%s&coef_tp=%s' % (
+        REQUEST.URL0, formsemestre_id, n_group_td, n_group_tp, coef_tp)
+    
+    return tab.make_page(context, format=format, REQUEST=REQUEST)

Modified: trunk/sco_formsemestre_status.py
===================================================================
--- trunk/sco_formsemestre_status.py	2013-06-12 13:33:29 UTC (rev 1239)
+++ trunk/sco_formsemestre_status.py	2013-06-13 10:23:04 UTC (rev 1240)
@@ -99,6 +99,10 @@
           'url' : 'report_debouche_date',
           'enabled' : True,
           },
+         { 'title' : "Estimation du co\xFBt de la formation",
+          'url' : 'formsemestre_estim_cost?formsemestre_id=' + formsemestre_id,
+          'enabled' : True,
+          },         
         ]
 
 
@@ -341,12 +345,32 @@
     except:
         log("can't find formsemestre_id %s" % formsemestre_id)
         return ''
+    
     sem['notes'] = notes.absolute_url()
+    fill_formsemestre(context, sem, REQUEST=REQUEST)
+
+    H = [ 
+        """<div class="formsemestre_page_title">""", 
+        
+        """<div class="infos">
+<span class="semtitle"><a class="stdlink" href="%(notes)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(titre)s</a><a title="%(etape_apo_str)s">%(num_sem)s</a>%(modalitestr)s</span><span class="dates"><a title="du %(date_debut)s au %(date_fin)s ">%(mois_debut)s - %(mois_fin)s</a></span><span class="resp"><a title="%(nomcomplet)s">%(resp)s</a></span><span class="nbinscrits"><a class="discretelink" href="%(notes)s/formsemestre_lists?formsemestre_id=%(formsemestre_id)s">%(nbinscrits)d inscrits</a></span><span class="lock">%(locklink)s</span></div>""" % sem,
+
+        formsemestre_status_menubar(notes, sem, REQUEST),
+
+        """</div>"""
+          ]
+    return '\n'.join(H)
+
+def fill_formsemestre(context, sem, REQUEST=None):
+    """Add some useful fields to help display formsemestres
+    """
+    formsemestre_id = sem['formsemestre_id']
     if sem['etat'] != '1':
         sem['locklink'] = """<a href="%s/formsemestre_change_lock?formsemestre_id=%s">%s</a>""" % (sem['notes'], sem['formsemestre_id'], context.icons.lock_img.tag(border='0',title='Semestre verrouill\xE9'))
     else:
         sem['locklink'] = ''
-    F = notes.formation_list( args={ 'formation_id' : sem['formation_id'] } )[0]
+    F = context.Notes.formation_list( args={ 'formation_id' : sem['formation_id'] } )[0]
+    sem['formation'] = F
     parcours = sco_codes_parcours.get_parcours_from_code(F['type_parcours'])
     if sem['semestre_id'] != -1:
         sem['num_sem'] = ', %s %s' % (parcours.SESSION_NAME, sem['semestre_id'])
@@ -366,23 +390,14 @@
             sem['etape_apo_str'] += ' (+%s)' % sem['etape_apo4']
     else:
         sem['etape_apo_str'] = 'Pas de code \xE9tape'
-    inscrits = notes.do_formsemestre_inscription_list( args={ 'formsemestre_id' : formsemestre_id } )
+    
+    inscrits = context.Notes.do_formsemestre_inscription_list( args={ 'formsemestre_id' : formsemestre_id } )
     sem['nbinscrits'] = len(inscrits)
     u = context.Users.user_info(sem['responsable_id'],REQUEST)
     sem['resp'] = u['prenomnom']
     sem['nomcomplet'] = u['nomcomplet']
-    H = [ 
-        """<div class="formsemestre_page_title">""", 
-        
-        """<div class="infos">
-<span class="semtitle"><a class="stdlink" href="%(notes)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(titre)s</a><a title="%(etape_apo_str)s">%(num_sem)s</a>%(modalitestr)s</span><span class="dates"><a title="du %(date_debut)s au %(date_fin)s ">%(mois_debut)s - %(mois_fin)s</a></span><span class="resp"><a title="%(nomcomplet)s">%(resp)s</a></span><span class="nbinscrits"><a class="discretelink" href="%(notes)s/formsemestre_lists?formsemestre_id=%(formsemestre_id)s">%(nbinscrits)d inscrits</a></span><span class="lock">%(locklink)s</span></div>""" % sem,
 
-        formsemestre_status_menubar(notes, sem, REQUEST),
 
-        """</div>"""
-          ]
-    return '\n'.join(H)
-
 # Description du semestre sous forme de table exportable
 def formsemestre_description_table(context, formsemestre_id, REQUEST=None, with_evals=False):
     """Description du semestre sous forme de table exportable


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