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 ###