diff --git a/app/but/import_refcomp.py b/app/but/import_refcomp.py
index aa59d7c3d1..4f055147bc 100644
--- a/app/but/import_refcomp.py
+++ b/app/but/import_refcomp.py
@@ -54,8 +54,8 @@ def orebut_import_refcomp(xml_data: str, dept_id: int, orig_filename=None):
composantes = competence.find("composantes_essentielles")
for composante in composantes:
libelle = "".join(composante.itertext()).strip()
- ce = ApcComposanteEssentielle(libelle=libelle)
- c.composantes_essentielles.append(ce)
+ compo_ess = ApcComposanteEssentielle(libelle=libelle)
+ c.composantes_essentielles.append(compo_ess)
# --- NIVEAUX (années)
niveaux = competence.find("niveaux")
for niveau in niveaux:
@@ -77,17 +77,14 @@ def orebut_import_refcomp(xml_data: str, dept_id: int, orig_filename=None):
a = ApcAnneeParcours(**ApcAnneeParcours.attr_from_xml(annee.attrib))
parc.annees.append(a)
for competence in annee.findall("competence"):
- nom_court = competence.attrib["nom_court"]
- XXX
+ comp_id_orebut = competence.attrib["id"]
niveau = int(competence.attrib["niveau"])
# Retrouve la competence
- comp = ref.competences.filter_by(titre=nom).all()
- if len(comp) == 0:
- raise ScoFormatError(f"competence {nom} référencée mais on définie")
- elif len(comp) > 1:
- raise ScoFormatError(f"competence {nom} ambigüe")
+ comp = ref.competences.filter_by(id_orebut=comp_id_orebut).first()
+ if comp is None:
+ raise ScoFormatError(f"competence {comp_id_orebut} non définie")
ass = ApcParcoursNiveauCompetence(
- niveau=niveau, annee_parcours=a, competence=comp[0]
+ niveau=niveau, annee_parcours=a, competence=comp
)
db.session.add(ass)
diff --git a/app/models/but_refcomp.py b/app/models/but_refcomp.py
index 30229a965c..a6a98d1e64 100644
--- a/app/models/but_refcomp.py
+++ b/app/models/but_refcomp.py
@@ -49,6 +49,7 @@ class XMLModel:
class ApcReferentielCompetences(db.Model, XMLModel):
+ "Référentiel de compétence d'une spécialité"
id = db.Column(db.Integer, primary_key=True)
dept_id = db.Column(db.Integer, db.ForeignKey("departement.id"), index=True)
annexe = db.Column(db.Text())
@@ -103,18 +104,13 @@ class ApcReferentielCompetences(db.Model, XMLModel):
class ApcCompetence(db.Model, XMLModel):
- __table_args__ = (
- # les compétences dans Orébut sont identifiées par leur "titre"
- # unique au sein d'un référentiel:
- db.UniqueConstraint(
- "referentiel_id", "titre", name="apc_competence_referentiel_id_titre_key"
- ),
- )
+ "Compétence"
id = db.Column(db.Integer, primary_key=True)
referentiel_id = db.Column(
db.Integer, db.ForeignKey("apc_referentiel_competences.id"), nullable=False
)
- id_orebut = db.Column(db.Integer, nullable=True, index=True, unique=True)
+ # les compétences dans Orébut sont identifiées par leur id unique
+ id_orebut = db.Column(db.Text(), nullable=True, index=True, unique=True)
titre = db.Column(db.Text(), nullable=False, index=True)
titre_long = db.Column(db.Text())
couleur = db.Column(db.Text())
diff --git a/app/scodoc/sco_preferences.py b/app/scodoc/sco_preferences.py
index daadf5b217..52105ea435 100644
--- a/app/scodoc/sco_preferences.py
+++ b/app/scodoc/sco_preferences.py
@@ -279,6 +279,7 @@ class BasePreferences(object):
{
"initvalue": "Dept",
"title": "Nom abrégé du département",
+ "explanation": "acronyme: par exemple R&T, ORTF, HAL",
"size": 12,
"category": "general",
"only_global": True,
@@ -289,7 +290,7 @@ class BasePreferences(object):
{
"initvalue": "nom du département",
"title": "Nom complet du département",
- "explanation": "inutilisé par défaut",
+ "explanation": "apparaît sur la page d'accueil",
"size": 40,
"category": "general",
"only_global": True,
diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css
index 58f819c5bf..72a918a694 100644
--- a/app/static/css/scodoc.css
+++ b/app/static/css/scodoc.css
@@ -239,6 +239,17 @@ div.box-chercheetud {
margin-top: 12px;
}
+/* Page accueil général */
+span.dept_full_name {
+ font-style: italic;
+}
+span.dept_visible {
+ color: rgb(6, 158, 6);
+}
+span.dept_cache {
+ color: rgb(194, 5, 5);
+}
+
div.table_etud_in_accessible_depts {
margin-left: 3em;
margin-bottom: 2em;
diff --git a/app/templates/scodoc.html b/app/templates/scodoc.html
index 9d1a49988e..49f277610d 100644
--- a/app/templates/scodoc.html
+++ b/app/templates/scodoc.html
@@ -18,11 +18,13 @@
Département
{{dept.preferences.filter_by(name="DeptName").first().value}}
- {{ dept.preferences.filter_by( name="DeptFullName" ).first().value or "" }}
+
+ {{ dept.preferences.filter_by( name="DeptFullName" ).first().value or "" }}
+
{% if current_user.is_administrator() %}
-
- {% if dept.visible %}visible{% else %}caché aux utilisateurs{% endif %}
+ visible{% else %}class="dept_cache">caché aux utilisateurs{% endif %}
+
{% if dept.visible %}cacher{% else %}rendre visible{% endif %}
diff --git a/app/views/users.py b/app/views/users.py
index be824173f9..1d10e0f772 100644
--- a/app/views/users.py
+++ b/app/views/users.py
@@ -543,10 +543,10 @@ def create_user_form(user_name=None, edit=0, all_roles=1):
vals["active"] = vals["status"] == ""
# Département:
if auth_dept: # pas super-admin
- if vals["dept"] not in selectable_dept_acronyms:
+ if ("dept" in vals) and (vals["dept"] not in selectable_dept_acronyms):
del vals["dept"] # ne change pas de dept
- # traitement des roles: ne doit pas affecter les roles
- # que l'on en controle pas:
+ # Traitement des roles: ne doit pas affecter les rôles
+ # que l'on en contrôle pas:
for role in orig_roles_strings: # { "Ens_RT", "Secr_CJ", ... }
if role and not role in editable_roles_strings:
roles.add(role)
@@ -575,7 +575,7 @@ def create_user_form(user_name=None, edit=0, all_roles=1):
# A: envoi de welcome + procedure de reset
# B: envoi de welcome seulement (mot de passe saisie dans le formulaire)
# C: Aucun envoi (mot de passe saisi dans le formulaire)
- if vals["welcome:list"] == "1":
+ if vals["welcome"] == "1":
if vals["reset_password:list"] == "1":
mode = Mode.WELCOME_AND_CHANGE_PASSWORD
else:
diff --git a/migrations/versions/197c658cefbb_evolution_ref_orebut.py b/migrations/versions/197c658cefbb_evolution_ref_orebut.py
new file mode 100644
index 0000000000..9415158249
--- /dev/null
+++ b/migrations/versions/197c658cefbb_evolution_ref_orebut.py
@@ -0,0 +1,62 @@
+"""Evolution ref. Orebut
+
+Revision ID: 197c658cefbb
+Revises: 91be8a06d423
+Create Date: 2022-01-05 22:25:12.384647
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = "197c658cefbb"
+down_revision = "91be8a06d423"
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column("apc_competence", sa.Column("id_orebut", sa.Text(), nullable=True))
+ op.drop_constraint(
+ "apc_competence_referentiel_id_titre_key", "apc_competence", type_="unique"
+ )
+ op.create_index(
+ op.f("ix_apc_competence_id_orebut"),
+ "apc_competence",
+ ["id_orebut"],
+ unique=True,
+ )
+ op.add_column(
+ "apc_referentiel_competences", sa.Column("annexe", sa.Text(), nullable=True)
+ )
+ op.add_column(
+ "apc_referentiel_competences",
+ sa.Column("type_structure", sa.Text(), nullable=True),
+ )
+ op.add_column(
+ "apc_referentiel_competences",
+ sa.Column("type_departement", sa.Text(), nullable=True),
+ )
+ op.add_column(
+ "apc_referentiel_competences",
+ sa.Column("version_orebut", sa.Text(), nullable=True),
+ )
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_column("apc_referentiel_competences", "version_orebut")
+ op.drop_column("apc_referentiel_competences", "type_departement")
+ op.drop_column("apc_referentiel_competences", "type_structure")
+ op.drop_column("apc_referentiel_competences", "annexe")
+ op.drop_index(op.f("ix_apc_competence_id_orebut"), table_name="apc_competence")
+ op.create_unique_constraint(
+ "apc_competence_referentiel_id_titre_key",
+ "apc_competence",
+ ["referentiel_id", "titre"],
+ )
+ op.drop_column("apc_competence", "id_orebut")
+ # ### end Alembic commands ###
diff --git a/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py b/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py
deleted file mode 100644
index e47a98798a..0000000000
--- a/migrations/versions/2dfafee725ae_creation_table_relations_entreprrises.py
+++ /dev/null
@@ -1,283 +0,0 @@
-"""creation tables relations entreprises
-
-Revision ID: f3b62d64efa3
-Revises: 91be8a06d423
-Create Date: 2021-12-24 10:36:27.150085
-
-"""
-from alembic import op
-import sqlalchemy as sa
-from sqlalchemy.dialects import postgresql
-
-# revision identifiers, used by Alembic.
-revision = "f3b62d64efa3"
-down_revision = "91be8a06d423"
-branch_labels = None
-depends_on = None
-
-
-def upgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.create_table(
- "entreprise_log",
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column(
- "date",
- sa.DateTime(timezone=True),
- server_default=sa.text("now()"),
- nullable=True,
- ),
- sa.Column("authenticated_user", sa.Text(), nullable=True),
- sa.Column("object", sa.Integer(), nullable=True),
- sa.Column("text", sa.Text(), nullable=True),
- sa.PrimaryKeyConstraint("id"),
- )
-
- op.create_table(
- "entreprise_etudiant",
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column("entreprise_id", sa.Integer(), nullable=True),
- sa.Column("etudid", sa.Integer(), nullable=True),
- sa.Column("type_offre", sa.Text(), nullable=True),
- sa.Column("date_debut", sa.Date(), nullable=True),
- sa.Column("date_fin", sa.Date(), nullable=True),
- sa.Column("formation_text", sa.Text(), nullable=True),
- sa.Column("formation_scodoc", sa.Integer(), nullable=True),
- sa.ForeignKeyConstraint(
- ["entreprise_id"], ["entreprises.id"], ondelete="cascade"
- ),
- sa.PrimaryKeyConstraint("id"),
- )
-
- op.create_table(
- "entreprise_offre",
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column("entreprise_id", sa.Integer(), nullable=True),
- sa.Column(
- "date_ajout",
- sa.DateTime(timezone=True),
- server_default=sa.text("now()"),
- nullable=True,
- ),
- sa.Column("intitule", sa.Text(), nullable=True),
- sa.Column("description", sa.Text(), nullable=True),
- sa.Column("type_offre", sa.Text(), nullable=True),
- sa.Column("missions", sa.Text(), nullable=True),
- sa.Column("duree", sa.Text(), nullable=True),
- sa.ForeignKeyConstraint(
- ["entreprise_id"], ["entreprises.id"], ondelete="cascade"
- ),
- sa.PrimaryKeyConstraint("id"),
- )
-
- op.create_table(
- "entreprise_envoi_offre",
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column("sender_id", sa.Integer(), nullable=True),
- sa.Column("receiver_id", sa.Integer(), nullable=True),
- sa.Column("offre_id", sa.Integer(), nullable=True),
- sa.Column(
- "date_envoi",
- sa.DateTime(timezone=True),
- server_default=sa.text("now()"),
- nullable=True,
- ),
- sa.ForeignKeyConstraint(
- ["offre_id"],
- ["entreprise_offre.id"],
- ),
- sa.ForeignKeyConstraint(
- ["sender_id"],
- ["user.id"],
- ),
- sa.ForeignKeyConstraint(
- ["receiver_id"],
- ["user.id"],
- ),
- sa.PrimaryKeyConstraint("id"),
- )
-
- op.create_table(
- "entreprise_envoi_offre_etudiant",
- sa.Column("id", sa.Integer(), nullable=False),
- sa.Column("sender_id", sa.Integer(), nullable=True),
- sa.Column("receiver_id", sa.Integer(), nullable=True),
- sa.Column("offre_id", sa.Integer(), nullable=True),
- sa.Column(
- "date_envoi",
- sa.DateTime(timezone=True),
- server_default=sa.text("now()"),
- nullable=True,
- ),
- sa.ForeignKeyConstraint(
- ["offre_id"],
- ["entreprise_offre.id"],
- ),
- sa.ForeignKeyConstraint(
- ["sender_id"],
- ["user.id"],
- ),
- sa.ForeignKeyConstraint(
- ["receiver_id"],
- ["identite.id"],
- ),
- sa.PrimaryKeyConstraint("id"),
- )
-
- op.drop_constraint(
- "entreprise_contact_entreprise_corresp_id_fkey",
- "entreprise_contact",
- type_="foreignkey",
- )
- op.drop_table("entreprise_correspondant")
- op.add_column("entreprise_contact", sa.Column("nom", sa.Text(), nullable=True))
- op.add_column("entreprise_contact", sa.Column("prenom", sa.Text(), nullable=True))
- op.add_column(
- "entreprise_contact", sa.Column("telephone", sa.Text(), nullable=True)
- )
- op.add_column("entreprise_contact", sa.Column("mail", sa.Text(), nullable=True))
- op.add_column("entreprise_contact", sa.Column("poste", sa.Text(), nullable=True))
- op.add_column("entreprise_contact", sa.Column("service", sa.Text(), nullable=True))
- op.drop_column("entreprise_contact", "description")
- op.drop_column("entreprise_contact", "enseignant")
- op.drop_column("entreprise_contact", "date")
- op.drop_column("entreprise_contact", "type_contact")
- op.drop_column("entreprise_contact", "etudid")
- op.drop_column("entreprise_contact", "entreprise_corresp_id")
-
- op.add_column("entreprises", sa.Column("siret", sa.Text(), nullable=True))
- op.drop_index("ix_entreprises_dept_id", table_name="entreprises")
- op.drop_constraint("entreprises_dept_id_fkey", "entreprises", type_="foreignkey")
- op.drop_column("entreprises", "qualite_relation")
- op.drop_column("entreprises", "note")
- op.drop_column("entreprises", "contact_origine")
- op.drop_column("entreprises", "plus10salaries")
- op.drop_column("entreprises", "privee")
- op.drop_column("entreprises", "secteur")
- op.drop_column("entreprises", "date_creation")
- op.drop_column("entreprises", "dept_id")
- op.drop_column("entreprises", "localisation")
- # ### end Alembic commands ###
-
-
-def downgrade():
- # ### commands auto generated by Alembic - please adjust! ###
- op.add_column(
- "entreprises",
- sa.Column("localisation", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises",
- sa.Column("dept_id", sa.INTEGER(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises",
- sa.Column(
- "date_creation",
- postgresql.TIMESTAMP(timezone=True),
- server_default=sa.text("now()"),
- autoincrement=False,
- nullable=True,
- ),
- )
- op.add_column(
- "entreprises",
- sa.Column("secteur", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises",
- sa.Column("privee", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises",
- sa.Column("plus10salaries", sa.BOOLEAN(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises",
- sa.Column("contact_origine", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprises", sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True)
- )
- op.add_column(
- "entreprises",
- sa.Column("qualite_relation", sa.INTEGER(), autoincrement=False, nullable=True),
- )
- op.create_foreign_key(
- "entreprises_dept_id_fkey", "entreprises", "departement", ["dept_id"], ["id"]
- )
- op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False)
- op.drop_column("entreprises", "siret")
- op.add_column(
- "entreprise_contact",
- sa.Column(
- "entreprise_corresp_id", sa.INTEGER(), autoincrement=False, nullable=True
- ),
- )
- op.add_column(
- "entreprise_contact",
- sa.Column("etudid", sa.INTEGER(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprise_contact",
- sa.Column("type_contact", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprise_contact",
- sa.Column(
- "date",
- postgresql.TIMESTAMP(timezone=True),
- autoincrement=False,
- nullable=True,
- ),
- )
- op.add_column(
- "entreprise_contact",
- sa.Column("enseignant", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.add_column(
- "entreprise_contact",
- sa.Column("description", sa.TEXT(), autoincrement=False, nullable=True),
- )
- op.create_table(
- "entreprise_correspondant",
- sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
- sa.Column("entreprise_id", sa.INTEGER(), autoincrement=False, nullable=True),
- sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("prenom", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("civilite", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("fonction", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("phone1", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("phone2", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mobile", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mail1", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("mail2", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("fax", sa.TEXT(), autoincrement=False, nullable=True),
- sa.Column("note", sa.TEXT(), autoincrement=False, nullable=True),
- sa.ForeignKeyConstraint(
- ["entreprise_id"],
- ["entreprises.id"],
- name="entreprise_correspondant_entreprise_id_fkey",
- ),
- sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
- )
- op.create_foreign_key(
- "entreprise_contact_entreprise_corresp_id_fkey",
- "entreprise_contact",
- "entreprise_correspondant",
- ["entreprise_corresp_id"],
- ["id"],
- )
- op.drop_column("entreprise_contact", "service")
- op.drop_column("entreprise_contact", "poste")
- op.drop_column("entreprise_contact", "mail")
- op.drop_column("entreprise_contact", "telephone")
- op.drop_column("entreprise_contact", "prenom")
- op.drop_column("entreprise_contact", "nom")
-
- op.drop_table("entreprise_envoi_offre")
- op.drop_table("entreprise_envoi_offre_etudiant")
- op.drop_table("entreprise_offre")
- op.drop_table("entreprise_etudiant")
- op.drop_table("entreprise_log")
- # ### end Alembic commands ###