preferences, modif export

This commit is contained in:
Arthur ZHU 2022-02-22 21:52:32 +01:00
parent aff01323c7
commit 722ec09eb5
10 changed files with 141 additions and 93 deletions

View File

@ -117,13 +117,13 @@ def verif_contact_data(contact_data):
return False
# entreprise_id existant
entreprise = Entreprise.query.filter_by(id=contact_data[6]).first()
entreprise = Entreprise.query.filter_by(siret=contact_data[6]).first()
if entreprise is None:
return False
# contact possède le meme nom et prénom dans la meme entreprise
contact = EntrepriseContact.query.filter_by(
nom=contact_data[0], prenom=contact_data[1], entreprise_id=contact_data[6]
nom=contact_data[0], prenom=contact_data[1], entreprise_id=entreprise.id
).first()
if contact is not None:
return False

View File

@ -39,6 +39,7 @@ from wtforms import (
HiddenField,
SelectMultipleField,
DateField,
BooleanField,
)
from wtforms.validators import ValidationError, DataRequired, Email, Optional
from wtforms.widgets import ListWidget, CheckboxInput
@ -356,3 +357,12 @@ class ImportForm(FlaskForm):
],
)
submit = SubmitField("Importer", render_kw=SUBMIT_MARGE)
class PreferencesForm(FlaskForm):
mail_entreprise = StringField(
"Mail notifications",
validators=[Optional(), Email(message="Adresse e-mail invalide")],
)
check_siret = BooleanField("Vérification SIRET")
submit = SubmitField("Valider", render_kw=SUBMIT_MARGE)

View File

@ -27,7 +27,7 @@ class Entreprise(db.Model):
def to_dict(self):
return {
"siret": self.siret,
"nom": self.nom,
"nom_entreprise": self.nom,
"adresse": self.adresse,
"code_postal": self.codepostal,
"ville": self.ville,
@ -49,6 +49,7 @@ class EntrepriseContact(db.Model):
service = db.Column(db.Text)
def to_dict(self):
entreprise = Entreprise.query.filter_by(id=self.entreprise_id).first()
return {
"nom": self.nom,
"prenom": self.prenom,
@ -56,7 +57,7 @@ class EntrepriseContact(db.Model):
"mail": self.mail,
"poste": self.poste,
"service": self.service,
"entreprise_id": self.entreprise_id,
"entreprise_siret": entreprise.siret,
}
@ -138,3 +139,10 @@ class EntrepriseOffreDepartement(db.Model):
db.Integer, db.ForeignKey("are_entreprise_offre.id", ondelete="cascade")
)
dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade"))
class EntreprisePreferences(db.Model):
__tablename__ = "are_preferences"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
value = db.Column(db.Text)

View File

@ -24,6 +24,7 @@ from app.entreprises.forms import (
AjoutFichierForm,
ValidationConfirmationForm,
ImportForm,
PreferencesForm,
)
from app.entreprises import bp
from app.entreprises.models import (
@ -34,6 +35,7 @@ from app.entreprises.models import (
EntrepriseEtudiant,
EntrepriseEnvoiOffre,
EntrepriseOffreDepartement,
EntreprisePreferences,
)
from app.entreprises import app_relations_entreprises as are
from app.models import Identite
@ -124,7 +126,7 @@ def fiche_entreprise(id):
les offres de l'entreprise.
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"fiche entreprise {id} inconnu"
description=f"fiche entreprise {id} inconnue"
)
offres_with_files = []
depts = are.get_depts()
@ -188,7 +190,7 @@ def fiche_entreprise_validation(id):
Permet d'afficher la fiche entreprise d'une entreprise a valider
"""
entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404(
description=f"fiche entreprise (validation) {id} inconnu"
description=f"fiche entreprise (validation) {id} inconnue"
)
contacts = entreprise.contacts
return render_template(
@ -242,7 +244,7 @@ def offres_expirees(id):
Permet d'afficher la liste des offres expirés d'une entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"fiche entreprise {id} inconnu"
description=f"fiche entreprise {id} inconnue"
)
offres_expirees_with_files = []
depts = are.get_depts()
@ -318,7 +320,7 @@ def edit_entreprise(id):
Permet de modifier une entreprise de la base avec un formulaire
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"entreprise {id} inconnu"
description=f"entreprise {id} inconnue"
)
form = EntrepriseModificationForm()
if form.validate_on_submit():
@ -387,7 +389,7 @@ def delete_entreprise(id):
Permet de supprimer une entreprise de la base avec un formulaire de confirmation
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"entreprise {id} inconnu"
description=f"entreprise {id} inconnue"
)
form = SuppressionConfirmationForm()
if form.validate_on_submit():
@ -424,7 +426,7 @@ def validate_entreprise(id):
"""
form = ValidationConfirmationForm()
entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404(
description=f"entreprise (validation) {id} inconnu"
description=f"entreprise (validation) {id} inconnue"
)
if form.validate_on_submit():
entreprise.visible = True
@ -451,7 +453,7 @@ def delete_validation_entreprise(id):
Permet de supprimer une entreprise en attente de validation avec une formulaire de validation
"""
entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404(
description=f"entreprise (validation) {id} inconnu"
description=f"entreprise (validation) {id} inconnue"
)
form = SuppressionConfirmationForm()
if form.validate_on_submit():
@ -473,7 +475,7 @@ def add_offre(id):
Permet d'ajouter une offre a une entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"entreprise {id} inconnu"
description=f"entreprise {id} inconnue"
)
form = OffreCreationForm()
if form.validate_on_submit():
@ -518,7 +520,7 @@ def edit_offre(id):
Permet de modifier une offre
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404(
description=f"offre {id} inconnu"
description=f"offre {id} inconnue"
)
offre_depts = EntrepriseOffreDepartement.query.filter_by(offre_id=offre.id).all()
form = OffreModificationForm()
@ -575,7 +577,7 @@ def delete_offre(id):
Permet de supprimer une offre
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404(
description=f"offre {id} inconnu"
description=f"offre {id} inconnue"
)
entreprise_id = offre.entreprise.id
form = SuppressionConfirmationForm()
@ -610,7 +612,7 @@ def delete_offre(id):
def delete_offre_recue(id):
offre_recue = EntrepriseEnvoiOffre.query.filter_by(
id=id, receiver_id=current_user.id
).first_or_404(description=f"offre recu {id} inconnu")
).first_or_404(description=f"offre recu {id} inconnue")
db.session.delete(offre_recue)
db.session.commit()
return redirect(url_for("entreprises.offres_recues"))
@ -623,7 +625,7 @@ def add_contact(id):
Permet d'ajouter un contact a une entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"entreprise {id} inconnu"
description=f"entreprise {id} inconnue"
)
form = ContactCreationForm(hidden_entreprise_id=entreprise.id)
if form.validate_on_submit():
@ -746,7 +748,7 @@ def add_historique(id):
Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise
"""
entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404(
description=f"entreprise {id} inconnu"
description=f"entreprise {id} inconnue"
)
form = HistoriqueCreationForm()
if form.validate_on_submit():
@ -791,7 +793,7 @@ def envoyer_offre(id):
Permet d'envoyer une offre à un utilisateur
"""
offre = EntrepriseOffre.query.filter_by(id=id).first_or_404(
description=f"offre {id} inconnu"
description=f"offre {id} inconnue"
)
form = EnvoiOffreForm()
if form.validate_on_submit():
@ -876,7 +878,7 @@ def export_entreprises():
"""
entreprises = Entreprise.query.filter_by(visible=True).all()
if entreprises:
keys = ["siret", "nom", "adresse", "ville", "code_postal", "pays"]
keys = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"]
titles = keys[:]
L = [
[entreprise.to_dict().get(k, "") for k in keys]
@ -901,13 +903,12 @@ def get_import_entreprises_file_sample():
"nom_entreprise",
"adresse",
"ville",
"codepostal",
"code_postal",
"pays",
]
titles = keys[:]
# lines = [["" for x in range(6)] for y in range(100)]
title = "ImportEntreprises"
xlsx = sco_excel.excel_simple_table_test(titles=titles, sheet_name="Entreprises")
xlsx = sco_excel.excel_simple_table(titles=titles, sheet_name="Entreprises")
filename = title
return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE)
@ -930,7 +931,7 @@ def import_entreprises():
entreprises_import = []
siret_list = []
ligne = 0
titles = ["siret", "nom", "adresse", "ville", "code_postal", "pays"]
titles = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"]
if data[1][0] != titles:
flash("Veuillez utilisez la feuille excel à remplir")
return render_template(
@ -1010,7 +1011,7 @@ def export_contacts():
"mail",
"poste",
"service",
"entreprise_id",
"entreprise_siret",
]
titles = keys[:]
L = [[contact.to_dict().get(k, "") for k in keys] for contact in contacts]
@ -1035,7 +1036,7 @@ def get_import_contacts_file_sample():
"mail",
"poste",
"service",
"entreprise_id",
"entreprise_siret",
]
titles = keys[:]
title = "ImportContacts"
@ -1069,7 +1070,7 @@ def import_contacts():
"mail",
"poste",
"service",
"entreprise_id",
"entreprise_siret",
]
if data[1][0] != titles:
flash("Veuillez utilisez la feuille excel à remplir")
@ -1169,7 +1170,7 @@ def add_offre_file(offre_id):
Permet d'ajouter un fichier à une offre
"""
offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404(
description=f"offre {offre_id} inconnu"
description=f"offre {offre_id} inconnue"
)
form = AjoutFichierForm()
if form.validate_on_submit():
@ -1201,7 +1202,7 @@ def delete_offre_file(offre_id, filedir):
Permet de supprimer un fichier d'une offre
"""
offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404(
description=f"offre {offre_id} inconnu"
description=f"offre {offre_id} inconnue"
)
form = SuppressionConfirmationForm()
if form.validate_on_submit():
@ -1223,3 +1224,45 @@ def delete_offre_file(offre_id, filedir):
title="Suppression fichier d'une offre",
form=form,
)
@bp.route("/preferences", methods=["GET", "POST"])
@permission_required(Permission.RelationsEntreprisesValidate)
def preferences():
form = PreferencesForm()
if form.validate_on_submit():
exists = EntreprisePreferences.query.filter_by(name="check_siret").first()
if not exists:
prefs = EntreprisePreferences(
name="check_siret", value=int(form.check_siret.data)
)
db.session.add(prefs)
else:
exists.value = int(form.check_siret.data)
db.session.commit()
exists = EntreprisePreferences.query.filter_by(
name="mail_notifications_entreprise"
).first()
if not exists and form.mail_entreprise.data:
prefs = EntreprisePreferences(
name="mail_notifications_entreprise",
value=form.mail_entreprise.data.strip(),
)
db.session.add(prefs)
else:
exists.value = form.mail_entreprise.data
db.session.commit()
db.session.commit()
return redirect(url_for("entreprises.index"))
elif request.method == "GET":
mail = EntreprisePreferences.query.filter_by(
name="mail_notifications_entreprise"
).first()
check_siret = EntreprisePreferences.query.filter_by(name="check_siret").first()
form.mail_entreprise.data = mail.value
form.check_siret.data = int(check_siret.value)
return render_template(
"entreprises/preferences.html",
title="Préférences",
form=form,
)

View File

@ -428,52 +428,6 @@ def excel_simple_table(
return ws.generate()
def excel_simple_table_test(
titles=None, lines=None, sheet_name=b"feuille", titles_styles=None, comments=None
):
"""Export simple type 'CSV': 1ere ligne en gras, le reste tel quel"""
ws = ScoExcelSheet(sheet_name)
if titles is None:
titles = []
if lines is None:
lines = [[]]
if titles_styles is None:
style = excel_make_style(bold=True)
titles_styles = [style] * len(titles)
if comments is None:
comments = [None] * len(titles)
# ligne de titres
ws.append_row(
[
ws.make_cell(it, style, comment)
for (it, style, comment) in zip(titles, titles_styles, comments)
]
)
default_style = excel_make_style()
text_style = excel_make_style(number_format=FORMAT_GENERAL)
int_style = excel_make_style()
float_style = excel_make_style(number_format=FORMAT_NUMBER_00)
for line in lines:
cells = []
for it in line:
cell_style = default_style
if type(it) == float:
cell_style = float_style
elif type(it) == int:
cell_style = int_style
else:
cell_style = text_style
cells.append(ws.make_cell(it, cell_style))
ws.append_row(cells)
# sheet = ws.wb.active
# for cell in sheet["A2":"A100"]:
# cell.number_format = FORMAT_GENERAL
return ws.generate()
def excel_feuille_saisie(e, titreannee, description, lines):
"""Genere feuille excel pour saisie des notes.
E: evaluation (dict)

View File

@ -28,7 +28,7 @@
<tr><td>mail</td><td>text</td><td>mail du contact</td></tr>
<tr><td>poste</td><td>text</td><td>poste du contact</td></tr>
<tr><td>service</td><td>text</td><td>service dans lequel travaille le contact</td></tr>
<tr><td>entreprise_id</td><td>integer</td><td>l'id de l'entreprise</td></tr>
<tr><td>entreprise_siret</td><td>integer</td><td>SIRET de l'entreprise</td></tr>
</table>
{% endif %}

View File

@ -23,7 +23,7 @@
<table class="table">
<thead><tr><td><b>Attribut</b></td><td><b>Type</b></td><td><b>Description</b></td></tr></thead>
<tr><td>siret</td><td>text</td><td>siret de l'entreprise</td></tr>
<tr><td>nom</td><td>text</td><td>nom de l'entreprise</td></tr>
<tr><td>nom_entreprise</td><td>text</td><td>nom de l'entreprise</td></tr>
<tr><td>adresse</td><td>text</td><td>adresse de l'entreprise</td></tr>
<tr><td>ville</td><td>text</td><td>ville de l'entreprise</td></tr>
<tr><td>code_postal</td><td>text</td><td>code postal de l'entreprise</td></tr>

View File

@ -6,6 +6,7 @@
<li><a href="{{ url_for('entreprises.offres_recues') }}">Offres reçues</a></li>
{% if current_user.has_permission(current_user.Permission.RelationsEntreprisesValidate, None) %}
<li><a href="{{ url_for('entreprises.validation') }}">Entreprises à valider</a></li>
<li><a href="{{ url_for('entreprises.preferences') }}">Préférences</a></li>
{% endif %}
</ul>
</nav>

View File

@ -0,0 +1,15 @@
{# -*- mode: jinja-html -*- #}
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block app_content %}
{% include 'entreprises/nav.html' %}
<h1>Préférences module gestion entreprises</h1>
<br>
<div class="row">
<div class="col-md-4">
{{ wtf.quick_form(form, novalidate=True) }}
</div>
</div>
{% endblock %}

View File

@ -1,8 +1,8 @@
"""tables module gestion relations entreprises
Revision ID: 593451ab68b3
Revises: c95d5a3bf0de
Create Date: 2022-02-04 17:06:02.519231
Revision ID: 717a8dfe2915
Revises: b9aadc10227f
Create Date: 2022-02-22 20:18:57.171246
"""
from alembic import op
@ -10,8 +10,8 @@ import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = "593451ab68b3"
down_revision = "c95d5a3bf0de"
revision = "717a8dfe2915"
down_revision = "b9aadc10227f"
branch_labels = None
depends_on = None
@ -44,6 +44,13 @@ def upgrade():
sa.Column("visible", sa.Boolean(), nullable=True),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"are_preferences",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("name", sa.Text(), nullable=True),
sa.Column("value", sa.Text(), nullable=True),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"are_entreprise_contact",
sa.Column("id", sa.Integer(), nullable=False),
@ -148,14 +155,31 @@ def upgrade():
op.drop_table("entreprise_correspondant")
op.drop_index("ix_entreprises_dept_id", table_name="entreprises")
op.drop_table("entreprises")
op.drop_index("ix_apc_competence_id_orebut", table_name="apc_competence")
op.create_index(
op.f("ix_apc_competence_id_orebut"),
"apc_competence",
["id_orebut"],
unique=False,
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f("ix_apc_competence_id_orebut"), table_name="apc_competence")
op.create_index(
"ix_apc_competence_id_orebut", "apc_competence", ["id_orebut"], unique=False
)
op.create_table(
"entreprises",
sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False),
sa.Column(
"id",
sa.INTEGER(),
server_default=sa.text("nextval('entreprises_id_seq'::regclass)"),
autoincrement=True,
nullable=False,
),
sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True),
sa.Column("adresse", sa.TEXT(), autoincrement=False, nullable=True),
sa.Column("ville", sa.TEXT(), autoincrement=False, nullable=True),
@ -180,18 +204,12 @@ def downgrade():
["dept_id"], ["departement.id"], name="entreprises_dept_id_fkey"
),
sa.PrimaryKeyConstraint("id", name="entreprises_pkey"),
postgresql_ignore_search_path=False,
)
op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False)
op.create_table(
"entreprise_correspondant",
sa.Column(
"id",
sa.INTEGER(),
server_default=sa.text(
"nextval('entreprise_correspondant_id_seq'::regclass)"
),
autoincrement=True,
nullable=False,
),
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),
@ -210,7 +228,6 @@ def downgrade():
name="entreprise_correspondant_entreprise_id_fkey",
),
sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"),
postgresql_ignore_search_path=False,
)
op.create_table(
"entreprise_contact",
@ -241,13 +258,13 @@ def downgrade():
),
sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"),
)
op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False)
op.drop_table("are_entreprise_offre_departement")
op.drop_table("are_entreprise_envoi_offre_etudiant")
op.drop_table("are_entreprise_envoi_offre")
op.drop_table("are_entreprise_offre")
op.drop_table("are_entreprise_etudiant")
op.drop_table("are_entreprise_contact")
op.drop_table("are_preferences")
op.drop_table("are_entreprises")
op.drop_table("are_entreprise_log")
# ### end Alembic commands ###