diff --git a/.DS_Store b/.DS_Store index 5008ddf..5a9d098 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Description-arborescence.md b/Description-arborescence.md deleted file mode 100644 index b40e3c1..0000000 --- a/Description-arborescence.md +++ /dev/null @@ -1,42 +0,0 @@ -__Description de l'arborescence des dossiers__ : - -``` -__init__.py fichier initialisant le dossier en package -db.sqlite base de données utilisée par l'application -run.py appel de l'application pour son lancement - -app/ Package application -–– __init__.py fichier initialisant le dossier en package -–– app.py module principal de l'application (initialisation et configuration) -–– constantes.py défintion des constantes utilisées dans l'application -–– test_db.sqlite base de données utilisée par la version test de l'application -–– __pycache__/ fichiers cache python (pré-compilation pour exécution plus rapide des fichiers .py) -–– modeles/ fichiers de modélisation de la base de donnée -–––––– __init__.py fichier initialisant le dossier en package -–––––– donnees.py mise en place des classe de la BDD -–––––– utilisateurs.py classe User + fonctionnalités de création et identification -–––––– __pycache__/ fichiers cache python -–– routes/ fichiers définissant les routes d'accès aux pages de l'application -–––––– __init__.py fichier initialisant le dossier en package -–––––– api.py définition des url de l'API et du contenu JSON de réponse -–––––– routes.py définition des url et des fonctions définissant le contenu des pages associées -–––––– __pycache__/ fichiers cache python -–– static/ fichiers statiques -–––––– css/ fichiers css (bootstrap, font-awesome) -–––––– fonts/ fichiers de police de caractères -–––––– img/ fichiers images -–––––– js/ fichiers javascript (bootstrap, jquery, popper) -–– templates/ templates constituant les différentes pages de l'application -–––––– conteneur.html page de base à compléter -–––––– pages/ pages du site (accueil, connexion, recherche, etc.) -–––––– partials/ blocs à intégrer aux pages du site -––––––––––– css.html balise lien vers les fichiers bootstrap -––––––––––– metadata.html balises détaillant les métadonnées -––––––––––– recherche.html module de recherche réduit - -tests/ tests relatifs à la vérification du fonctionnement de l'application -–– __init__.py fichier initialisant le dossier en package -–– base.py duplication de la BDD et configuration de l'app à utiliser pour les tests -–– test_1.py définition d'un premier test - -``` diff --git a/README.md b/README.md index 47dcc83..a4ad55f 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# TNAHBox \ No newline at end of file +# TNAHBox + + + +La présente application, nommé TNAH BOX, a été créé par Caroline Méot, Ségolène Albouy, Lemosquet Lauryne, Marie Morillon, Victoria Le Fourner \ No newline at end of file diff --git a/Tables_BDD.sql b/Tables_BDD.sql index c73b10b..fccb5c7 100644 --- a/Tables_BDD.sql +++ b/Tables_BDD.sql @@ -10,7 +10,9 @@ person_password TEXT NULL, person_linkedIn TEXT NULL, person_cv TEXT NULL, person_git TEXT NULL, -person_is_admin INTEGER NULL +person_is_admin INTEGER NULL, +person_last_seen TEXT NULL, +person_description TEXT NULL ); CREATE TABLE IF NOT EXISTS Document ( @@ -47,4 +49,14 @@ FOREIGN KEY (hasTag_tag_id) REFERENCES Tag(tag_id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (hasTag_doc_id) REFERENCES Document(document_id) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE IF NOT EXISTS IsFav ( +faved_docu_id, +loving_user_id, +PRIMARY KEY (faved_docu_id, loving_user_id), +FOREIGN KEY (faved_docu_id) REFERENCES Document(document_id) +ON DELETE CASCADE ON UPDATE CASCADE, +FOREIGN KEY (loving_user_id) REFERENCES Person(person_id) +ON DELETE CASCADE ON UPDATE CASCADE ); \ No newline at end of file diff --git a/Values_BDD.sql b/Values_BDD.sql index 371ad8c..c2cd47f 100644 --- a/Values_BDD.sql +++ b/Values_BDD.sql @@ -4,23 +4,23 @@ person_name, person_firstname, person_is_teacher, person_promotion) -- person_login, person_password, person_linkedIn, -- person_cv, person_git, person_is_admin VALUES -("Pinche","Ariane", 1, "2013-2014"), +("Pinche","Ariane", 1, "2014"), ("Jolivet","Vincent", 1, ""), -("Clérice","Thibault", 1, "2013-2014"), -("Andrieux","Clément", 0, "2018-2019"), -("Schmied","Marie-Caroline", 0, "2018-2019"), +("Clérice","Thibault", 1, "2014"), +("Andrieux","Clément", 0, "2019"), +("Schmied","Marie-Caroline", 0, "2019"), ("","Tony", 0, ""); INSERT INTO Document( document_title, document_format, document_teaching, document_date, document_description) -- document_downloadLink VALUES -("doc1","pdf","XML TEI","2018-11-23","Présentation des TEI Guidelines"), -("doc2","jpg","SQL","2018-12-12","Tuto MySQL Workbench"), -("doc3","odt","Python","2019-03-01","Correction du devoir sur table"), -("doc4","txt","XML EAD","2019-01","Retroconvertion de l'instrument de recherche du fonds Emile Portzer"), -("doc5","img","CMS","2018","Schéma d'un CMS comme Omeka"), -("doc6","code","LaTeX","2018-11-13","Template de présentation du mémoire de M2"); +("doc1","Autre","XML TEI","2018-11-23","Présentation des TEI Guidelines"), +("doc2","Texte","SQL","2018-12-12","Tuto MySQL Workbench"), +("doc3","Code","Python","2019-03-01","Correction du devoir sur table"), +("doc4","Texte","XML EAD","2019-01","Retroconvertion de l'instrument de recherche du fonds Emile Portzer"), +("doc5","Image","CMS","2018","Schéma d'un CMS comme Omeka"), +("doc6","Code","LaTeX","2018-11-13","Template de présentation du mémoire de M2"); INSERT INTO Authorship( authorship_person_id, authorship_document_id) diff --git a/app/app.py b/app/app.py index 6beb3e3..4d9ff20 100755 --- a/app/app.py +++ b/app/app.py @@ -11,6 +11,8 @@ # on stocke le chemin vers les templates statics = os.path.join(chemin_actuel, "static") # on stocke le chemin vers les statics +uploads = os.path.join(chemin_actuel, "uploads") +# on stocke le chemin vers le dossier où stocker les fichiers uploadés db = SQLAlchemy() # on initie l'objet SQLAlchemy @@ -22,7 +24,7 @@ __name__, template_folder=templates, static_folder=statics -) + ) # on initie l'app où le nom __name__ sera précisé dans la configuration (config_app()) # et on définit les dossiers contenants les templates et les statics diff --git a/app/constantes.py b/app/constantes.py index 8b9831f..d5bdb54 100755 --- a/app/constantes.py +++ b/app/constantes.py @@ -3,7 +3,8 @@ # Déclaration de toutes les constantes à utiliser dans le projet # Convention : les constantes portent des noms en majuscule -RESULTS_PER_PAGE = 10 +RESULTS_PER_PAGE = 9 +DOSSIER_UPLOAD = "./app/static/uploads/" SECRET_KEY = "JE SUIS UN SECRET !" # variable nécessaire à la création d'applications Flask diff --git a/app/modeles/donnees.py b/app/modeles/donnees.py index ef59169..332b5d6 100644 --- a/app/modeles/donnees.py +++ b/app/modeles/donnees.py @@ -3,6 +3,7 @@ from flask_login import UserMixin import datetime from werkzeug.security import generate_password_hash, check_password_hash +from datetime import date from .. app import db @@ -10,6 +11,10 @@ db.Column('hasTag_doc_id', db.Integer, db.ForeignKey('Document.document_id'), primary_key=True), db.Column('hasTag_tag_id', db.Integer, db.ForeignKey('Tag.tag_id'), primary_key=True)) +IsFav = db.Table('IsFav', + db.Column('faved_docu_id', db.Integer, db.ForeignKey('Document.document_id'), primary_key=True), + db.Column('loving_user_id', db.Integer, db.ForeignKey('Person.person_id'), primary_key=True)) + Authorship = db.Table('Authorship', db.Column('authorship_person_id', db.Integer, db.ForeignKey('Person.person_id'), primary_key=True), db.Column('authorship_document_id', db.Integer, db.ForeignKey('Document.document_id'), primary_key=True), @@ -26,13 +31,163 @@ class Document(db.Model): document_downloadLink = db.Column(db.Text) document_tag = db.relationship("Tag", secondary=HasTag, + backref=db.backref("Document", lazy='dynamic')) + loving_users = db.relationship("Person", + secondary=IsFav, backref=db.backref("Document")) + def get_id(self): + return(self.document_id) + + + @staticmethod + def add_doc(title, description, format, date, matiere, downloadlink): + """ + Fonction qui permet d'ajouter un nouveau document dans la BDD + :param title: titre donné au document (str) + :param description: courte présentation sur le doc (str) + :param format: "image", "texte", "code" ou "autre" (str) + :param date: date du cours rentrée par utilisateur (str) + :param matiere: matière de l'enseignement (str) + :param downloadLink: lien de téléchargement du document (str) + :return: + """ + erreurs = [] + if not title: + erreurs.append("Veuillez renseigner un titre pour ce document.") + if not description: + erreurs.append("Veuillez renseigner une description pour ce document.") + if not format: + erreurs.append("Veuillez renseigner un format pour ce document.") + if not date: + erreurs.append("Veuillez renseigner une date pour ce document.") + if not matiere: + erreurs.append("Veuillez renseigner une matière pour ce document.") + if not downloadlink: + erreurs.append("Aucun lien de téléchargement pour ce document.") + + docu = Document(document_title=title, + document_description=description, + document_format=format, + document_date=date, + document_teaching=matiere, + document_downloadLink=downloadlink) + # on ajoute une nouvelle entrée dans la table document avec les champs correspondant aux paramètres du modèle + + try: + # On essaie d'ajouter le document à la BDD + db.session.add(docu) + db.session.commit() + + return docu + except Exception as erreur: + return False, [str(erreur)] + + + @staticmethod + def associate_docu_and_user(user, docu): + ''' + Fonction qui permet d'asssocier un user à un document et + de créer un nouvel enregistrement dans Authorship + :param user: auteur du document (entrée de la BDD) + :param docu: document importé par l'utilisateur (entrée de la BDD) + :return: renvoie une liste d'erreurs s'il y en a + ''' + erreurs = [] + if not user: + erreurs.append("Il n'y a pas d'utilisateur à associer") + if not docu: + erreurs.append("Il n'y a pas de document à associer") + + if user is None or docu is None: + return + + if docu not in user.created_document: + # si le document n'est pas dans la liste de document créés par cet utilisateur + user.created_document.append(docu) + + db.session.add(user) + db.session.commit() + + class Tag(db.Model): __tablename__ = "Tag" tag_id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) tag_label = db.Column(db.String, nullable=False) + def __repr__(self): + return '{}'.format(self.tag_label) + + def get_id(self): + return(self.tag_id) + + @staticmethod + def add_tag(label): + ''' + Fonction qui permet d'ajouter un tag dans la BDD + :param label: label du tag à ajoute (str) + :return: renvoie le tag nouvellement créé dans la BDD + ''' + erreurs = [] + if not label: + erreurs.append("Le tag fourni est vide") + + all_tag_labels = Tag.query.with_entities(Tag.tag_label) + all_tag_labels = [tlbl[0] for tlbl in all_tag_labels.all()] + # je récupère tous les enregistrements de tag_label dans la table Tag + + if label: + if label not in all_tag_labels: + tag = Tag(tag_label=label) + # si mon tag n'est pas déjà dans la table tag + # je crée un nouvel enregistrement + # On essaie d'ajouter et de commit ce nouvel enregistrement + db.session.add(tag) + db.session.commit() + else: # si j'ai déjà un tag déjà ainsi nommé + tag = Tag.query.filter(Tag.tag_label == label).first() + # j'assigne à tag, la valeur de l'enregistrement dont le label + # correspond bien à celui renseigné en paramètre + + try: + return tag + except Exception as erreur: + return False, [str(erreur)] + + @staticmethod + def associate_tag_and_docu(tag_id, docu_id): + ''' + Fonction qui permet d'associer un tag à un document + :param tag_id: identifiant du tag à ajouter au document (int) + :param docu_id: identifiant du document auquel ajouter le tag (int) + :return: renvoie une liste d'erreurs s'il y en a + ''' + erreurs = [] + if not tag_id: + erreurs.append("Il n'y a pas de tag à associer") + if not docu_id: + erreurs.append("Il n'y a pas de document à associer") + + tag = Tag.query.filter(Tag.tag_id == tag_id).first() + # je récupère le tag correspondant à l'id + doc = Document.query.filter(Document.document_id == docu_id).first() + # idem pour le document + + if tag is None or doc is None: + # si les identifiants ne correspondent à rien, je ne fais rien + return + + if tag not in doc.document_tag: + # si le tag n'est pas déjà dans la liste de tag contenu dans document_tag + doc.document_tag.append(tag) + # je l'ajoute à cette liste + + db.session.add(doc) + db.session.commit() + + return erreurs + + class Person(UserMixin, db.Model): __tablename__ = "Person" person_id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True) @@ -42,14 +197,73 @@ class Person(UserMixin, db.Model): person_email = db.Column(db.Text, nullable=False) person_login = db.Column(db.Text,unique=True, nullable=False) person_password = db.Column(db.Text, unique=True, nullable=False) - person_linkedIn = db.Column(db.Text,unique=True) + person_linkedIn = db.Column(db.Text, unique=True) person_cv = db.Column(db.Text) person_git = db.Column(db.Text, unique=True) person_promotion = db.Column(db.Text) person_is_admin = db.Column(db.Boolean) + person_last_seen = db.Column(db.Text, default=date) + person_description = db.Column(db.Text) created_document = db.relationship("Document", secondary=Authorship, - backref=db.backref("Person")) + backref=db.backref("Person")) #, lazy='dynamic')) + + @staticmethod + def add_docu_to_favorites(user, docu): + ''' + Fonction qui permet d'ajouter aux favoris de l'utilisateur + le document courant + :param user: auteur du document (entrée de la BDD) + :param docu: document importé par l'utilisateur (entrée de la BDD) + :return: liste d'erreurs d'il y en a + ''' + erreurs = [] + if not user: + erreurs.append("Il n'y a pas d'utilisateur à associer") + if not docu: + erreurs.append("Il n'y a pas de document à associer") + + if user is None or docu is None: + # si les paramètres renseignés ne correspondent à rien, je ne fais rien + return + + if user not in docu.loving_users: + # si le document n'est pas déjà dans la liste des documents favoris de l'utilisateur + docu.loving_users.append(user) + # je l'ajoute à cette liste + + db.session.add(docu) + db.session.commit() + + return erreurs + + def remove_docu_to_favorites(user, docu): + ''' + Fonction qui permet d'enlever aux favoris de l'utilisateur + le document courant + :param user: auteur du document (entrée de la BDD) + :param docu: document importé par l'utilisateur (entrée de la BDD) + :return: liste d'erreurs d'il y en a + ''' + erreurs = [] + if not user: + erreurs.append("Il n'y a pas d'utilisateur à dissocier") + if not docu: + erreurs.append("Il n'y a pas de document à dissocier") + + if user is None or docu is None: + # si les paramètres renseignés ne correspondent à rien, je ne fais rien + return + + if user in docu.loving_users: + # si le document est déjà dans la liste des documents favoris de l'utilisateur + docu.loving_users.remove(user) + # je le supprime de cette liste + + db.session.add(docu) + db.session.commit() + + return erreurs def __repr__(self): return ''.format(self.person_login) diff --git a/app/modeles/utilisateurs.py b/app/modeles/utilisateurs.py index e9fd93d..3e4c82c 100755 --- a/app/modeles/utilisateurs.py +++ b/app/modeles/utilisateurs.py @@ -1,6 +1,6 @@ from flask_wtf import FlaskForm -from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError -from wtforms.validators import DataRequired, Email, EqualTo +from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError, TextAreaField +from wtforms.validators import DataRequired, Email, EqualTo, Length from app.modeles.donnees import Person #Création d'un classe pour le formulaire de connexion des utilisateurs. J'utilise @@ -8,7 +8,7 @@ # correspondent aux données attendues # DataRequired = indique que le champ ne peut pas être laissé vide par l'utilisateur class LoginForm(FlaskForm): - person_login = StringField('Nom utilisateur', validators=[DataRequired()]) + person_login = StringField('Nom d\'utilisateur', validators=[DataRequired()]) person_password = PasswordField('Mot de passe', validators=[DataRequired()]) remember_me = BooleanField('Se souvenir de moi') submit = SubmitField('Connexion') @@ -16,16 +16,17 @@ class LoginForm(FlaskForm): # Même chose pour la classe Registration = founit un modèle de formulaire pour # l'enregistrement d'un nouvel utilisateur class RegistrationForm(FlaskForm): - person_firstName = StringField('Prénom*', validators=[DataRequired()]) - person_name = StringField('Nom*', validators=[DataRequired()]) - person_login = StringField('Nom d\'utilisateur*', validators=[DataRequired()]) - person_email = StringField('Email*', validators=[DataRequired(), Email()]) - person_password= PasswordField('Mot de passe*', validators=[DataRequired()]) - password2 = PasswordField('Mot de passe*', validators=[DataRequired(), EqualTo('person_password')]) + person_firstName = StringField('Prénom*', validators=[DataRequired()]) + person_name = StringField('Nom*', validators=[DataRequired()]) + person_login = StringField('Nom d\'utilisateur*', validators=[DataRequired()]) + person_email = StringField('Email*', validators=[DataRequired(), Email()]) + person_password= PasswordField('Mot de passe*', validators=[DataRequired()]) + password2 = PasswordField('Mot de passe*', validators=[DataRequired(), EqualTo('person_password')]) # password2 permet de vérifier le mot de passe pour éviter les erreurs de frappe person_git = StringField('Compte Github (URL)') person_linkedIn = StringField('Compte LinkedIn (URL)') - person_promotion = StringField('Promotion TNAH (année)') + person_promotion = StringField('Promotion TNAH (année du diplôme)') + person_is_teacher = BooleanField('Je suis enseignant·e') submit = SubmitField('S\'enregistrer') def validate_username(self, person_login): @@ -37,4 +38,17 @@ def validate_email(self, person_email): if user is not None: raise ValidationError('Adresse mail déjà enregistrée') +class EditProfileForm(FlaskForm): + #formulaire pour la modification des infos utilisateur + person_login = StringField('Nom d\'utilisateur', validators=[DataRequired()]) + person_email = StringField('Email', validators=[DataRequired(), Email()]) + person_name = StringField('Nom', validators=[DataRequired()]) + person_firstName = StringField('Prénom', validators=[DataRequired()]) + person_promotion = StringField('Promotion (année du diplôme)') + person_git = StringField('Compte GitHub (URL)') + person_linkedIn= StringField('Compte LinkedIn (URL)') + person_description = TextAreaField('Description') + person_is_admin = BooleanField('ADMIN TNAHBox') + submit = SubmitField('Enregistrer les modifications') + diff --git a/app/routes/api.py b/app/routes/api.py deleted file mode 100755 index 95294ce..0000000 --- a/app/routes/api.py +++ /dev/null @@ -1,11 +0,0 @@ -# from flask import render_template, request, url_for, jsonify -# from urllib.parse import urlencode -# -# from ..app import app -# # on importe l'application provenant du fichier app.py un niveau au dessus dans l'arborescence des dossiers -# -# # from ..constantes import CONSTANTE1, CONSTANTE2 -# # on importe des constantes du fichier constantes.py un niveau au dessus dans l'arborescence des dossiers -# -# from ..modeles.donnees import Document -# # on importe la classe Document du fichier donnees.py contenu dans le dossier modeles diff --git a/app/routes/routes.py b/app/routes/routes.py index f2f8821..e49bcfc 100755 --- a/app/routes/routes.py +++ b/app/routes/routes.py @@ -1,18 +1,21 @@ -from flask import render_template, request, flash, redirect, url_for +from flask import render_template, request, flash, redirect, url_for, send_file from sqlalchemy import and_, or_ from flask_login import current_user, login_user, logout_user, login_required from werkzeug.urls import url_parse -from app.modeles.donnees import Person -from app.modeles.utilisateurs import LoginForm, RegistrationForm - +from werkzeug import secure_filename +from app.modeles.donnees import Person, Document +from app.modeles.utilisateurs import LoginForm, RegistrationForm, EditProfileForm +from datetime import date from ..app import app, db # on importe l'application provenant du fichier app.py un niveau au dessus dans l'arborescence des dossiers -from ..constantes import RESULTS_PER_PAGE +from ..constantes import RESULTS_PER_PAGE, DOSSIER_UPLOAD # on importe des constantes du fichier constantes.py un niveau au dessus dans l'arborescence des dossiers from ..modeles.donnees import Document, Authorship, Person, Tag, HasTag + + # on importe la classe Document du fichier donnees.py contenu dans le dossier modeles @app.route('/') @@ -33,8 +36,6 @@ def accueil(): resultats=resultats) - - @app.route("/recherche") def recherche(): """ @@ -92,58 +93,125 @@ def recherche(): else: titre = "Résultat de la recherche" - # if motclef: - # query = Document.query.join(Tag).filter(or_( - # Document.document_title.like("%{}%".format(motclef)), - # Document.document_format.like("%{}%".format(motclef)), - # Document.document_date.like("%{}%".format(motclef)), - # Document.document_teaching.like("%{}%".format(motclef)), - # Document.document_description.like("%{}%".format(motclef)), - # Tag.tag_label.like("%{}%".format(motclef)) - # )) - # titre = "Résultats de la recherche « " + motclef + " »" - # else: - # titre = "Résultat de la recherche" - if matiere: query = query.filter(Document.document_teaching == matiere) titre = titre + " pour la matière " + matiere - if img: - query = query.filter(Document.document_format == img) - - titre = titre + " pour le format " + img - if txt: - query = query.filter(Document.document_format == txt) - if img or code or autre: - titre = titre + " et " + txt - else: + # # # REQUÊTAGE EN FONCTION DES CHECKBOXES + if img or txt or code or autre: + # si une case format est cochée + if img and txt and code and autre: + titre = titre + " pour tous les formats" + elif img and txt and code: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == txt, + Document.document_format == code, + )) + titre = titre + " pour les formats " + img + ", " + txt + " et " + code + elif img and txt and autre: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == txt, + Document.document_format == autre, + )) + titre = titre + " pour les formats " + img + ", " + txt + " ou " + autre + elif img and code and autre: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == code, + Document.document_format == autre, + )) + titre = titre + " pour les formats " + img + ", " + code + " ou " + autre + elif txt and code and autre: + query = query.filter(or_( + Document.document_format == txt, + Document.document_format == code, + Document.document_format == autre, + )) + titre = titre + " pour les formats " + txt + ", " + code + " ou " + autre + elif img and txt: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == txt + )) + titre = titre + " pour les formats " + img + " et " + txt + elif img and code: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == code + )) + titre = titre + " pour les formats " + img + " et " + code + elif img and autre: + query = query.filter(or_( + Document.document_format == img, + Document.document_format == autre + )) + titre = titre + " pour les formats " + img + " et " + autre + elif txt and code: + query = query.filter(or_( + Document.document_format == txt, + Document.document_format == code + )) + titre = titre + " pour les formats " + txt + " et " + code + elif txt and autre: + query = query.filter(or_( + Document.document_format == txt, + Document.document_format == autre + )) + titre = titre + " pour les formats " + txt + " et " + autre + elif code and autre: + query = query.filter(or_( + Document.document_format == code, + Document.document_format == autre + )) + titre = titre + " pour les formats " + code + " et " + autre + elif img: + query = query.filter(Document.document_format == img) + titre = titre + " pour le format " + img + elif txt: + query = query.filter(Document.document_format == txt) titre = titre + " pour le format " + txt - if code: - query = query.filter(Document.document_format == code) - if img or txt or autre: - titre = titre + " et " + code - else: + elif code: + query = query.filter(Document.document_format == code) titre = titre + " pour le format " + code - if autre: - query = query.filter(Document.document_format == autre) - if img or txt or code: - titre = titre + " et " + autre - else: + elif autre: + query = query.filter(Document.document_format == autre) titre = titre + " pour le format " + autre + else: + pass if date: - titre = titre + " à la date " + date - if len(date) == 10: - query = query.filter(Document.document_date == date) - if len(date) == 7: - query = query.filter(str(Document.document_date)[0:7] == date) - if len(date) == 4: - query = query.filter(str(Document.document_date)[0:4] == date) - + query = Document.query.filter(Document.document_date.like("%{}%".format(date))) resultats = query.order_by(Document.document_title.asc()).paginate(page=page, per_page=RESULTS_PER_PAGE) + def lenDesc(desc): + ''' + Fonction qui mesure la longueur d'une chaine de caractère et renvoie 1 si elle est supérieure à 60 caractères + :param desc: chaine de caractère à mesurer (str) + :return: 1 (si desc > 60) ou 0 (si desc < 60) + ''' + if len(desc) > 60: + lendesc = 1 + else: + lendesc = 0 + + return lendesc + + def lenTitle(title): + ''' + Fonction qui mesure la longueur d'une chaine de caractère et renvoie 1 si elle est supérieure à 20 caractères + :param title: chaine de caractère à mesurer (str) + :return: 1 (si desc > 20) ou 0 (si desc < 20) + ''' + if len(title) > 20: + lentitle = 1 + else: + lentitle = 0 + + return lentitle + return render_template( "pages/recherche.html", resultats=resultats, @@ -156,25 +224,61 @@ def recherche(): code=code, autre=autre, date=date, + lenDesc=lenDesc, + lenTitle=lenTitle ) -@app.route("/document/") + +@app.route("/document/", methods=['GET', "POST"]) def document(docu_id): """ Route permettant l'affichage d'une notice affichant les métadonnées relatives au document dont l'id est donnée en paramètre - :param docu_id: Identifiant d'un document de la base de données - + :param docu_id: Identifiant d'un document de la base de données (int) """ + # # # AJOUT D'UN NOUVEAU TAG AU DOCUMENT COURANT + tag_label = request.form.get("tag", None) + # on stocke le label du tag donné par l'utilisateur + + if tag_label: + tag = Tag.add_tag(tag_label) + # si j'ai un tag donné par l'utilisateur + # je l'ajoute à la table Tag et je le staocke dans tag OU + # je récupère l'enregistrement qui existe déjà avec ce label dans la table Tag + tag_id = tag.get_id() + # je récupère l'id de ce tag + Tag.associate_tag_and_docu(tag_id, docu_id) + # j'associe ce tag au document de la page courante + + # # # AFFICHAGE DE L'AUTEUR DU DOCUMENT requested_docu = Document.query.get(docu_id) - # stocke dans la variable requested_docu le nom du document correspondant à l'id docu_id + # je récupère le document dont l'id correspond à l'URL de la page + auteur = Person.query.filter(Person.created_document.any(Document.document_id == docu_id)).first() + # j'en récupère l'auteur + + # # # AJOUT AUX FAVORIS DE L'UTILISATEUR CONNECTÉ + unfav = request.form.get("unfav", None) + fav = request.form.get("fav", None) + + if fav: + Person.add_docu_to_favorites(current_user, requested_docu) + if unfav: + Person.remove_docu_to_favorites(current_user, requested_docu) + + return render_template("pages/document.html", + docu=requested_docu, + auteur=auteur, + current_user=current_user) - return render_template("pages/document.html", docu=requested_docu) @app.route('/login', methods=['GET', "POST"]) def login(): + """ + Formulaire de connexion + :return: template de la page de connexion (connexion.html) avec le formulaire + """ if current_user.is_authenticated: return redirect('/') form = LoginForm() @@ -190,13 +294,23 @@ def login(): return redirect(next_page) return render_template('pages/connexion.html', form=form) + @app.route('/logout') def logout(): + """ + Déconnexion + :return: redirige à la racine = page d'accueil + """ logout_user() return redirect('/') + @app.route('/register', methods=['GET', 'POST']) def register(): + """ + Engregistrer une nouvelle entrée dans la table Person de la BDD qui correspond à un utilisateur du site + :return: page html "register" avec le formulaire d'inscription + """ if current_user.is_authenticated: return redirect('/') form = RegistrationForm() @@ -207,7 +321,9 @@ def register(): person_firstName=form.person_firstName.data, person_git=form.person_git.data, person_linkedIn=form.person_linkedIn.data, - person_promotion=form.person_promotion.data) + person_promotion=form.person_promotion.data, + person_last_seen=date.today(), + person_is_teacher=form.person_is_teacher.data) user.set_password(form.person_password.data) db.session.add(user) db.session.commit() @@ -232,14 +348,194 @@ def annuaire(): page = int(page) else: page = 1 - # reprise dans les 4 dernières lignes de code du code utilisé pour la page recherche ; permet à la fonction - # paginate de fonctionner + # fonction paginate permet de paginer car l'annuaire comptera plusieurs entrées resultats = [] - resultats = Person.query.order_by(Person.person_name.asc()).paginate(page=page, per_page=RESULTS_PER_PAGE) - # idée : création d'une liste vide, résultats dans laquelle se trouvent toutes les entrées person, requêtées par query - # les résultats seront affichés par ordre alphabtique, grâce à order by et asc + resultats = Person.query.order_by(Person.person_name.asc()).all() + # création d'une liste vide, resultats dans laquelle se trouvent toutes les entrées person, requêtées par query + # les résultats seront affichés par ordre alphabtique, grâce à order by et asc return render_template( "pages/annuaire.html", - resultats=resultats) \ No newline at end of file + resultats=resultats) + + +def extension_ok(nom_fichier=""): + """ Renvoie True si le fichier possède une extension valide. """ + return '.' in nom_fichier and nom_fichier.rsplit('.', 1)[1] in ('txt', 'pdf', 'csv', 'doc', 'jpg', 'json', + 'jpeg', 'gif', 'bmp', 'png', 'word', 'xml', 'py', + 'odt') + + +@app.route('/upload', methods=['GET', 'POST']) +@login_required +def upload(): + # # # VALEURS RENSEIGNÉES PAR L'UTILISATEUR + title = request.form.get("title", None) + description = request.form.get("desc", None) + format = request.form.get("format", None) + date = request.form.get("date", None) + matiere = request.form.get("matiere", None) + + # # # IMPORT DE FICHIER + if request.method == 'POST': + f = request.files['file'] + # dans f, on stocke le fichier uploadé + if f: # on vérifie qu'un fichier a bien été envoyé + if extension_ok(f.filename): # on vérifie que son extension est valide + nom = secure_filename(f.filename) # on stocke le nom de fichier dans nom + f.save(DOSSIER_UPLOAD + nom) # et on l'enregistre dans le dossier d'upload + + downloadlink = url_for('static', filename="uploads/" + nom) + # on stocke le lien de stockage sur le serveur du fichier uploadé + docu = Document.add_doc(title, description, format, date, matiere, downloadlink) + # on ajoute le document à la BDD + Document.associate_docu_and_user(current_user, docu) + # on l'associe à l'user connecté dans la table Authorship + return redirect(url_for('upped')) + # flash(u'Fichier envoyé ! Voici son lien.'.format(lien=url_for('upped', nom=nom)), + # 'suc') + else: + flash(u'Ce fichier ne porte pas une extension autorisée !', 'error') + else: + flash(u'Vous avez oublié le fichier !', 'error') + + return render_template('pages/import.html') # , form=form) + + +@app.route("/upped") +def upped(): + """ + Route pour la page à afficher après avoir importé un nouveau document dans la BDD + + """ + + return render_template("pages/upped.html") + + +@app.route('/user/') +@login_required +def user(person_login): + """ + Génération automatique d'une page de profile pour tous LOGIN (et non toute entrées dans la BDD) enregistré sur le site + :param person_login: login enregistré dans la base de données (Person.person_login) + :return: Page de profile qui correspond, dans l'URL, au Login demandé + """ + user = Person.query.filter_by(person_login=person_login).first_or_404() # si le login demandé n'existe pas + + # # # RÉCUPÉRATION DE LA LISTE DES DOCUMENTS MIS EN FAVORIS PAR L'UTILISATEUR + all_docu = Document.query.all() + docus = [] + for docu in all_docu: + if user in docu.loving_users: + docus.append(docu) + + def lenDesc(desc): + ''' + Fonction qui mesure la longueur d'une chaine de caractère et renvoie 1 si elle est supérieure à 60 caractères + :param desc: chaine de caractère à mesurer (str) + :return: 1 (si desc > 60) ou 0 (si desc < 60) + ''' + if len(desc) > 60: + lendesc = 1 + else: + lendesc = 0 + + return lendesc + + def lenTitle(title): + ''' + Fonction qui mesure la longueur d'une chaine de caractère et renvoie 1 si elle est supérieure à 20 caractères + :param title: chaine de caractère à mesurer (str) + :return: 1 (si desc > 20) ou 0 (si desc < 20) + ''' + if len(title) > 20: + lentitle = 1 + else: + lentitle = 0 + + return lentitle + + return render_template('pages/profile.html', + user=user, + docus=docus, + lenTitle=lenTitle, + lenDesc=lenDesc) + + +# permet de générer une page profil pour chaque login enregistré (différent des entrées BDD : car tout le monde dans +# la base de données n'a pas de profil enregistré + +@app.route('/admin//edit_profile', methods=['GET', 'POST']) +@login_required +def admin(person_login): + user = Person.query.filter_by(person_login=person_login).first() + form = EditProfileForm() + if form.validate_on_submit(): + user.person_login = form.person_login.data + user.person_email = form.person_email.data + user.person_name = form.person_name.data + user.person_firstName = form.person_firstName.data + user.person_promotion = form.person_promotion.data + user.person_git = form.person_git.data + user.person_linkedIn = form.person_linkedIn.data + user.person_description = form.person_description.data + user.person_is_admin = form.person_is_admin.data + db.session.commit() + return redirect(url_for('user', person_login=person_login)) + elif request.method == 'GET': + form.person_login.data = user.person_login + form.person_email.data = user.person_email + form.person_name.data = user.person_name + form.person_firstName.data = user.person_firstName + form.person_promotion.data = user.person_promotion + form.person_git.data = user.person_git + form.person_linkedIn.data = user.person_linkedIn + form.person_description.data = user.person_description + form.person_is_admin.data = user.person_is_admin + return render_template('pages/admin.html', form=form) + + +@app.route('/edit_profile', methods=['GET', 'POST']) +@login_required +def edit_profile(): + """ + Modification des données de l'utilisateur connecté + :return: Page d'édition du profile avec les information utilisateur + un formulaire de modification des données + """ + form = EditProfileForm() + if form.validate_on_submit(): + current_user.person_login = form.person_login.data + current_user.person_email = form.person_email.data + current_user.person_name = form.person_name.data + current_user.person_firstName = form.person_firstName.data + current_user.person_promotion = form.person_promotion.data + current_user.person_git = form.person_git.data + current_user.person_linkedIn = form.person_linkedIn.data + current_user.person_description = form.person_description.data + db.session.commit() + flash('Changement(s) sauvegardé(s)') + return redirect(url_for('user', person_login=current_user.person_login)) + elif request.method == 'GET': + # Si le formulaire n'est pas soumis ni modifier, l'utilisateur verra ses données enregistrées dans la BDD + form.person_login.data = current_user.person_login + form.person_email.data = current_user.person_email + form.person_name.data = current_user.person_name + form.person_firstName.data = current_user.person_firstName + form.person_promotion.data = current_user.person_promotion + form.person_git.data = current_user.person_git + form.person_linkedIn.data = current_user.person_linkedIn + form.person_description.data = current_user.person_description + return render_template('pages/edit_profile.html', form=form) + + +@app.before_request +def before_request(): + """ + Récupérer la date et l'heure de connexion d'un utilisateur + :return: valeur date et heure UTC + """ + if current_user.is_authenticated: + today = date.today() + current_user.person_last_seen = date.today() + db.session.commit() diff --git a/app/static/img/awe.gif b/app/static/img/awe.gif new file mode 100644 index 0000000..cbcfb7d Binary files /dev/null and b/app/static/img/awe.gif differ diff --git a/app/static/img/bmo_dancing.gif b/app/static/img/bmo_dancing.gif new file mode 100644 index 0000000..739fa24 Binary files /dev/null and b/app/static/img/bmo_dancing.gif differ diff --git a/app/static/img/download.png b/app/static/img/download.png new file mode 100644 index 0000000..360e968 Binary files /dev/null and b/app/static/img/download.png differ diff --git a/app/static/img/download_picto.png b/app/static/img/download_picto.png new file mode 100644 index 0000000..4a01d95 Binary files /dev/null and b/app/static/img/download_picto.png differ diff --git a/app/static/img/download_picto_clear.png b/app/static/img/download_picto_clear.png new file mode 100644 index 0000000..970f315 Binary files /dev/null and b/app/static/img/download_picto_clear.png differ diff --git a/app/static/img/faved.png b/app/static/img/faved.png new file mode 100644 index 0000000..a0159fb Binary files /dev/null and b/app/static/img/faved.png differ diff --git a/app/static/img/favicon.png b/app/static/img/favicon.png new file mode 100644 index 0000000..bff616a Binary files /dev/null and b/app/static/img/favicon.png differ diff --git a/app/static/img/no_download_picto.png b/app/static/img/no_download_picto.png new file mode 100644 index 0000000..fe0ee05 Binary files /dev/null and b/app/static/img/no_download_picto.png differ diff --git a/app/static/img/no_preview_picto.png b/app/static/img/no_preview_picto.png new file mode 100644 index 0000000..a75a64b Binary files /dev/null and b/app/static/img/no_preview_picto.png differ diff --git a/app/static/img/not_annuaire.gif b/app/static/img/not_annuaire.gif new file mode 100644 index 0000000..0c820a7 Binary files /dev/null and b/app/static/img/not_annuaire.gif differ diff --git a/app/static/img/not_person.gif b/app/static/img/not_person.gif new file mode 100644 index 0000000..d42da0d Binary files /dev/null and b/app/static/img/not_person.gif differ diff --git a/app/static/img/preview.png b/app/static/img/preview.png new file mode 100644 index 0000000..2012865 Binary files /dev/null and b/app/static/img/preview.png differ diff --git a/app/static/img/preview_picto.png b/app/static/img/preview_picto.png new file mode 100644 index 0000000..9a48c75 Binary files /dev/null and b/app/static/img/preview_picto.png differ diff --git a/app/static/img/preview_picto_clear.png b/app/static/img/preview_picto_clear.png new file mode 100644 index 0000000..6a1475c Binary files /dev/null and b/app/static/img/preview_picto_clear.png differ diff --git a/app/static/img/unfaved.png b/app/static/img/unfaved.png new file mode 100644 index 0000000..dd51d2d Binary files /dev/null and b/app/static/img/unfaved.png differ diff --git a/app/static/uploads/2018-2019.pdf b/app/static/uploads/2018-2019.pdf new file mode 100644 index 0000000..c2bc023 Binary files /dev/null and b/app/static/uploads/2018-2019.pdf differ diff --git a/app/static/uploads/Biblio_webo.png b/app/static/uploads/Biblio_webo.png new file mode 100644 index 0000000..e4f292b Binary files /dev/null and b/app/static/uploads/Biblio_webo.png differ diff --git a/app/static/uploads/CV-2018-sans-photo.pdf b/app/static/uploads/CV-2018-sans-photo.pdf new file mode 100644 index 0000000..8d36d24 Binary files /dev/null and b/app/static/uploads/CV-2018-sans-photo.pdf differ diff --git a/app/static/uploads/CV_Caroline_Meot.pdf b/app/static/uploads/CV_Caroline_Meot.pdf new file mode 100644 index 0000000..7790a1d Binary files /dev/null and b/app/static/uploads/CV_Caroline_Meot.pdf differ diff --git a/app/static/uploads/Capture_decran_2019-03-19_a_20.01.10.png b/app/static/uploads/Capture_decran_2019-03-19_a_20.01.10.png new file mode 100644 index 0000000..25f4d03 Binary files /dev/null and b/app/static/uploads/Capture_decran_2019-03-19_a_20.01.10.png differ diff --git a/app/static/uploads/Capture_decran_2019-03-19_a_20.01.31.png b/app/static/uploads/Capture_decran_2019-03-19_a_20.01.31.png new file mode 100644 index 0000000..d45a2a1 Binary files /dev/null and b/app/static/uploads/Capture_decran_2019-03-19_a_20.01.31.png differ diff --git a/app/static/uploads/Devoir_EAD_Verdese.xml b/app/static/uploads/Devoir_EAD_Verdese.xml new file mode 100644 index 0000000..b6c58a8 --- /dev/null +++ b/app/static/uploads/Devoir_EAD_Verdese.xml @@ -0,0 +1,224 @@ + + + + + + + + CR/7866 + + + COMITÉ D'ORGANISATION DES ENTREPRISES DE SPECTACLES (COES) + F21 8127-8262 1941-1947 + A. Callu et C. Obert + + + 1997 + + + + Instrument de recherche encodé manuellement avec le logiciel Oxygen XML Editor. + + + + + COMITÉ D'ORGANISATION DES ENTREPRISES DE SPECTACLES (COES) + F21 8127-8262 + 1941-1947 + + Comité d'organisation des entreprises de spectacle + + + + +

Le Comité d'organisation des entreprises de spectacles (COES), dissous le 30 octobre 1946, voit une partie de ses archives rétrocédées par l'organisme liquidateur à la Direction générale des Arts et Lettres du ministère de l'Education nationale en 1947.

+
+ +

Ce n'est que vingt ans plus tard, en 1967, que le fonds, depuis enrichi, est versé aux Archives nationales à la Section contemporaine. Aujourd'hui, près de trente après, ces documents, soit 150 liasses originelles, font l'objet du présent inventaire rédigé par Mlle Agnès Callu et Mme Caroline Obert.

+
+ +

Le COES, à l'instar des autres comités d'organisation créés par la loi du 16 août 1940, est institué par décret, le 7 juillet 1941 1 . Dirigé par un "président responsable", René Rocher, alors directeur du théâtre national de l'Odéon, il est composé de sept membres, désignés par le Secrétaire d'Etat à l'Education nationale et à la Jeunesse, représentants les catégories professionnelles suivantes : 1 0) les théâtres de Paris, 20) les théâtres de province; 3 0) les concerts symphoniques; 40) les tournées et les théâtres démontables; 5 0) les spectacles forains, les spectacles de curiosités, les music-halls et les cirques, 60) les metteurs en scène; 70) les professions se rattachant aux théâtres (les peintres de décor, les fabricants d'accessoires et les costumiers). À la tête de ces groupes, sont respectivement nommés, par arrêté du 15 juillet 1942, Sacha Guitry, René Chauvet, Eugène Bigot, Raoul Audier, Paul Derval, Gaston Baty et Émile Bertin.

+

Pour agir, le Comité use de décisions notifiées au commissaire du gouvernement, à l'époque Louis Hautecoeur, Secrétaire général des Beaux-Arts. Il dispose d'une structure administrative pour l'épauler dans ses tâches quotidiennes. Ainsi, cinq services fonctionnent dès septembre 1942 : le secrétariat du président responsable, celui du Secrétaire général (en l'occurrence, Edouard Reynaud), le service de la comptabilité et du contrôle de perception, celui de la statistique et du recensement, celui enfin du matériel et des matières premières. Enfin, il sait coordonner son action sur l'ensemble du territoire : en 1942, un "service de zone non occupée" est installé à Lyon et confié à Charles Gantillon, le dispositif étant complété un an plus tard par la mise en place de contrôleurs régionaux.

+ +

Ce texte est modifié le 24 mai 1942.

+
+
+ +

Lorsque les archives du Comité parviennent aux Archives nationales, elles sont déjà organisées selon six grandes rubriques, correspondant à des entités administratives existantes. Cette architecture de départ a été conservée dans le présent instrument de recherche.

+

La première partie, centrale, correspond au Secrétariat général. Un certain nombre de dossiers d'ensemble relatifs notamment à la création, au fonctionnement (comptes rendus de réunions et décisions) et à la dissolution du COES figurent en tête, suivis par des notes et de la correspondance témoignant des relations entretenues avec les ministres et secrétaires d'Etat, les comités d'organisation, les associations professionnelles et les diverses entreprises de spectacle. De plus, elle englobe deux minces dossiers se rapportant au service de répartition des matières premières (cf. supra) et au service social, organe qui semble avoir fonctionné de 1943 à 1947.

+

La seconde, dénommée "service général du classement", est une juxtaposition de correspondances classées par thèmes, organismes ou selon l'ordre alphabétique et chronologique, couvrant l'ensemble de la période.

+

La troisième se compose de petits dossiers thématiques examinés par le service juridique, les plus nourris traitant des amateurs et sociétés d'amateurs.

+

La quatrième, fort dense, est consacrée au "service des tournées" et propose essentiellement, après des documents d'intérêt général (notes, circulaires ou correspondance), des itinéraires et le relevé exhaustif des avis favorables et défavorables émis par le COES.

+

La cinquième, celle du recensement des entreprises, est inévitable pour disposer d'un bilan à jour des entreprises sédentaires, non sédentaires et de celles se rattachant aux spectacles, soit au total 1558 établissements en juillet 1944, selon Serge Added.

+

La sixième, rassemblant les archives du "service de la licence", déborde très largement sur la période postérieure puisqu'elle présente l'intégralité des licences accordées de 1945 à 1960.

+

A mentionner enfin, l'existence d'un fichier des entreprises de spectacles très utile pour toute identification de détail.

+

Il est assez aisé de constater les carences d'un tel fonds d'archives. En effet, hormis les services du classement, des tournées, du recensement et de la licence qui constituent des sections homogènes et, autant qu'elles puissent l'être, "complètes", les autres domaines d'action du COES ne sont malheureusement évoqués que de façon fugace. Aussi, la cruelle gestion de la pénurie n'est-elle perceptible qu'au travers d'un unique dossier (cf F21 8131, dossiers 1-2); la question des billets corporatifs, pourtant d'actualité, n'est qu'entr'aperçue au fil de listes et notes sommaires (cf. F218199, dossier 5). Quant au service de la carte professionnelle d'artistes ou bien encore celui de la comptabilité et du contrôle de perception, ils sont tout bonnement inexistants. En outre, les incidences du système sont peut-être davantage perceptibles à Paris, les correspondances échangées avec les contrôleurs régionaux, trop souvent lacunaires et par définition ponctuelles, n'offrant qu'un tableau infidèle et flou des résonances provinciales. Enfin, un repérage global des dossiers thématiques, nombreux et diffus, s'avère instructif pour l'étude de questions parfois périphériques, et jugées à tort marginales, telles celles des cours de danse, des bals ou bien encore des cirques. Pourtant, l'exploitation positive d'un tel fonds est claire : au delà d'une approche institutionnelle des mécanismes d'une structure de pouvoir, elle sait mettre à jour les fonctionnalités des grands théâtres parisiens tout comme celles d'établissements de moindre envergure.

+

A. Callu Février 1997.

+
+ +

Mme Caroline Obert a classé et inventorié les archives du Secrétariat général et du courrier (F21 8127-8197).

+

Mlle Agnès Callu, celles du service juridigue, des tournées, du recensement et de la licence (F 21 8198-8262

+
+ + Serge Added, "Le succès du théâtre dans Paris occupé", dans Politiques et pratiques culturelles dans la France de Vichy, Cahiers de I'IHTP, nos, juin 1988, p. 207-229. + Id., "La vie littéraire, intellectuelle et artistique en France", dans Bulletin de I'IHTP, n035, mars 1989, p. 37-58. + Id., Le théâtre dans les années Vichy, 1940-1944, Paris, 1992. + Louis Hautecoeur, Les Beaux-Arts en France, Paris, 1948 René Rocher, "Les théâtres sous l'Occupation", dans La vie de la France sous l'Occupation (1940-1944), Institut Hoover, 1957, t.ll, p. 965-972. + Henry Rousso, "Les comités d'organisation, aspects structurels et économiques", mémoire de maîtrise, Paris, 1976. + Voir aussi l'Officiel du spectacle, mensuel, organe du COES ( à partir de septembre 1942) 1 + + + + + Secrétariat général F21 8127-8150 + + F21 8127-8130. Création, fonctionnement et dissolution du COES + F21 8131. Service de répartition des matières premières et service social + F21 8132-8145. Relations extérieures du COES + + F21 8132 : avec les ministères et les secrétariats généraux + F21 8133: avec le secrétariat général des Beaux-arts + F21 8134: avec divers organismes + F21 8135-8138 : avec les théâtres de Paris + F21 8139-8140 : avec les music-halls, les casinos et les cirques + F21 8141 : avec les cabarets + F21 8142: avec les marionnettistes, les sociétés de concerts, les théâtres et spectacles de province + F21 8143-8144 : avec les comités d'organisation et les associations professionnelles + F21 8145 : avec les contrôleurs régionaux + + + + F21 8146-8150. Dossiers thématiques + + + + Service du courrier F21 8151-8197 + + F21 8151-8154. Enregistrement du courrier "arrivée" + F21 8155-8163. Courrier "départ" classé numériquement + F21 8164-8169. Courrier "départ" classé dans l'ordre alphabétique des destinataires + F21 8170-8181. Courrier "départ" classé thématiquement + F21 8182-8185. Correspondance relative aux contrôleurs régionaux + F21 8186-8197. Correspondance relative aux différents groupes + + + + Service juridique F21 8198-8200 + Service des tournées F21 8201-8222 + Service du recensement et des statistiques F218223-8244 + Service de la licence F I 8245-8261 + Fichier des entreprises de spectacles F21 8262 + + + + + France. Comité d'organisation des entreprises de spectacles (1941-1946) + Rocher, René (1890-1970) + Hautecoeur, Louis (1884-1973) + + + + + + Secrétariat général + F21 8127-8150 + + + + Création, fonctionnement et dissolution du COES. + F21 8127-8130 + + + + F21 8127 + + + + Dossier 1 + Création et constitution du COES + 1941-1943 + + +

Désignation des contrôleurs régionaux, des conseillers techniques, du contrôleur financier : textes législatifs et réglementaires, organigramme, plan de documentation.

+
+
+ + + Dossier 2 + Dissolution et liquidation du COES + 1944-1946 + + +

Administration provisoire, 1944 1946, comité consultatif paritaire, novembre 1944-octobre 1946, projet de décret instituant un office du spectacle, janvier-juillet 1945 notes, rapports et correspondances.

+
+
+ + + Dossier 3 + Épuration + Août 1944-juillet 1947 + + +

Comité national d'épuration des professions d'artistes dramatiques, lyriques et de musiciens exécutants : listes des artistes sanctionnés, 1945. Comité national d'épuration des gens de lettres, auteurs et compositeurs . listes des artistes sanctionnés, 1945. Commission centrale de l'épuration de la Radiodiffusion française : listes des artistes sanctionnés, août 1945. Comission nationale interprofessionnelle d'épuration correspondance, 1945-1945. Notifications des sanctions : correspondance, novembre 1944-mai 1945. Divers . listes de personnes sanctionnées, correspondance, lettre manuscrite d'Alfred Cortot, 1944-1946.

+
+
+
+
+
+ + + + + Service du courrier + F21 8151-8197 + + + + + Service juridique + F21 8198-8200 + + + + + Service des tournées + F21 8201-8222 + + + + + Service du recensement et des statistiques + F218223-8244 + + + + + Service de la licence + F I 8245-8261 + + + +
+
+
\ No newline at end of file diff --git a/app/static/uploads/Encodage_George_Sand_Caroline_Meot.xml b/app/static/uploads/Encodage_George_Sand_Caroline_Meot.xml new file mode 100644 index 0000000..00d1815 --- /dev/null +++ b/app/static/uploads/Encodage_George_Sand_Caroline_Meot.xml @@ -0,0 +1,956 @@ + + + + + + + + + + + + Correspondance III de George Sand: lettres 264 à 270. + + + Encodage réalisé dans le cadre d'une évaluation du Master 2 TNAH + + Caroline + Méot + + + + + + Ecole Nationale des Chartes + 2019 + + + + + + Correspondance : 1812-1876. III. 1848-1853 + GeorgeSand + + + Quatrième édition + + + Calmann Lévy + 1883-1884 + 3 rue Auber, Paris + BnF + + Domaine public + + + + Correspondance : 1812-1876. III. 1848-1853 / George Sand + Tome 3 + Lettres CCLXIV à CCLXX à + 270 + Pages 1 à 15 + + + Monographie imprimée + + + + + + + + + George Sand + Nohant + 18 février 1848 + + + Maurice Sand + Paris + + + + + + George Sand + Nohant + 23 février 1848 + + + Maurice Sand + Paris + + + + + + George Sand + Nohant + 24 février 1848 + + + Maurice Sand + Paris + + + + + + George Sand + Paris + lundi soir 6 mars 1848 + + + M. Girerd + Nevers + + + + + + George Sand + Nohant + 9 mars 1848 + + + M. Charles Poncy + Toulon + + + + + + George Sand + Paris + 14 mars 1848 + + + Charles Duvernet + La Chatre + + + + + + George Sand + Paris + 18 mars 1848 + + + Maurice Sand + Nohant + + + + + + + + + + Nohant-Vic + Centre Val-de-Loire + + Nohant-Vic est la ville où se trouvait le domaine de George + Sand. + + + + + + Paris + Ile-de-France + + + + + + + Bayonne + Nouvelle-Aquitaine + + + + + + + La Châtre + Centre Val-de-Loire + + + + + + + Toulon + Provence-Alples-Côte d'Azur + + + + + + + Centre-Val-de-Loire + + Province historique de la France de l'ancien Régime, correspondant + aujourd'hui au Cher et à l'Indre. + + + + + + + Châteauroux + Centre Val-de-Loire + + + + + + + + Paris + 6ème + Odéon + Rue de Condé + + + + + + + Nevers + Bourgogne + + + + + France + + + + + Italie + + + + + + Sicile + + + + + + + Naples + Campagnie + + + + + Fleury-les-AubraisCentre + Val-de-Loire + + + + Pinson + + Paris + 6ème + Saint Germain-des-près + rue des Fossés + + Restaurateur à Paris au XIXème siècle + + + + + + + La Corrèze + + + + + + + + + + + + + + Amantine + Aurore + Lucile + Dupin, Baronne + DudevantGeorge + SandBlaise + Bonnin + 1er juillet 1804 + 8 juin 1876 + Ecrivaine + + + + Jean-François-Maurice-Arnauld, + baron DudevantMaurice + SandBouli + 30 juin 1823 + 4 septembre 1889 + Ecrivain, peintre + + + + Solange + Clésinger-Sand + 13 septembre 1828 + 17 mars 1899 + Ecrivaine + + + + Jeanne-Gabrielle + Clésinger + 18 février 1848 + 1848 + Morte en bas-âge. + + + + Maurice + Dupin de Francueil + + 9 janvier 1778 + 17 septembre 1808 + + + + + + + + + Victor + Borie + 11 septembre 1818 + 6 juillet 1880 + Journaliste + + + + Charles + Duverenet + 1807 + 1875 + Ecrivain + + + + Elisa + Concierge de Maurice Sand. + + + + Pauline + Viardot + 18 juillet 1821 + 18 mai 1910 + Cantatrice. + + + + Louis-Charles + Poncy + 2 avril 1821 + 1891 + Maçon et homme de lettres français. + + + + Frédéric + Girerd + 23 août 1801 + 28 août 1859 + Homme politique français. + + + + Désirée + Servante de Solange Clésinger-Sand. + + + + + Louis-Eugène + Lambert + 24 septembre 1825 + 17 mai 1900 + Peintre + + + + Rémy Isidore + Joseph, comte + Exelmans + 13 novembre 1775 + Maréchal de France + + + + Les Vallet de + Villeneuve + + + + Michel + Bakounine + 18 mai 1814 + 1er juillet 1876 + Ecrivain + + + + Jean-Louis + Lambert + Notaire de la famille Dudevant + + + + François + Rollinat + 13 juin 1806 + 13 août 1867 + Homme politique français. + + + + + + + + Adolphe + Thiers + 15 avril 1797 + 3 septembre 1877 + Homme politique français + + + + François + Pierre + Guillaume + Guizot + 4 octobre 1787 + 12 septembre 1874 + Homme politique français + + + + + Hyacinthe + Camille + Odilon + Barrot + 19 juillet 1791 + 6 août 1873 + Homme politique français. + + + + Michel + Goudchaux + 18 mars 1797 + 27 décembre 1862 + Ministre de la seconde République. + + + + Ferdinand_II_des_deux_Siciles + 12 janvier 1810 + 22 mai 1859 + Roi des Deux-Siciles de 1830 à 1859. + + + + + + + + + George Sand est la mère de Maurice Sand + + + + George Sand est la mère de Solange Clésinger-Sand + + + + George Sand est la fille de Maurice Dupin + + + + Jeanne-Gabrielle Clésinger est la fille de + SolangeClésinger-Sand. + + + + + + La famille Vallet de Villeneuve compte notamment René Vallet + deVilleneuve, cousin et tuteur de George Sand + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + CCLXIV A MAURICE SAND, A PARIS + + + Nohant, 18 février + 1848 + Mon cher garçon, +

Je suis bien contente d'avoir de tes nouvelles. Je ne suis pas bien gaie loin de + toi, quoique je me batte les flancs pour l'être. Mais, enfin, il faut bien que + tu remues un peu et que tu prennes l’air du bureau, + que tu respires l'air pur et embaumé de Paris, et que tu ailles adorer les décrets divins du jury de + peinture. Apprête-toi à tout ce qu'il y a de pis, afin de n'avoir pas la + souffrance et le dépit des autres années.

+

Il me faut tout de suite les états de service de + mon père : je t'avais dit que + c'était une des choses les plus pressées, ainsi que de te renseigner auprès de + ton oncle. Mais tu te plonges dans les délices du carnaval, et tu oublies tes + commissions. Amuse-toi, c'est fort bien, « nous n'en doutons pas », comme on dit + à Dun-le-Carrik ; mais il faut faire marcher de front + les affaires et les plaisirs, ni plus ni moins qu'un petit Buonaparte. Songe que, si je suis en retard, et que je paye mille + francs d'amende par quinzaine, ça ne sera pas du tout drôle. Or j'arrive dans + très peu de jours à l'époque de la vie de mon + père où je ne sais plus rien. Les + Villeneuve n'en savent rien non plus. J'ai écrit au général Exelmans; mais il est à + Bayonne, et Dieu sait quand il me + répondra, Dieu sait de quoi il se souviendra. Mon oncle doit savoir les + campagnes que mon père a faites depuis + 1804 jusqu'à 1808. Demande + surtout tes états de service ; avec cela, on est sûr + des principaux faits. Vite, vite et vite!

+

Rien de changé ici, en dehors de ton absence, qui fait un grand + changement. Borie est encloué comme un canon, c'est-à-dire qu'il a un clou je ne sais pas où, mais je présume que c'est dans + un vilain endroit. Il est sens dessus dessous à l'idée qu'on va faire une révolution dans Paris. Mais je n'y vois pas de prétexte raisonnable dans + l'affaire des banquets. C'est une intrigue entre ministres qui tombent et + ministres qui veulent monter. Si l'on fait du bruit autour de leur table, il + n'en résultera que des horions, des assassinats commis par les mouchards sur des + badauds inoffensifs, et je ne crois pas que le peuple prenne parti pour la + querelle de M. Thiers contre + M. Guizot. Thiers vaut mieux à coup sûr; mais il ne + donnera pas plus de pain aux pauvres que les autres. Ainsi je t'engage à ne pas + aller flâner par là; car on peut y être écharpé sans profit pour la bonne cause. + S'il fallait que tu te sacrifiasses pour la patrie, + je ne t'arrêterais pas, tu le sais; mais se faire assommer pour Odilon Barrot et, compagnie, ce serait trop + bête. Ecris-moi ce que tu auras vu de loin et ne te + fourre pas dans la bagarre, si bagarre il y a, ce que je ne crois pourtant + pas.

+

Tu ne savais donc pas que Bakounine + avait été banni par notre honnête gouvernement. J'ai + reçu une lettre de lui il y a un mois environ, et je crois te l'avoir lue; mais + tu ne t'en souviens pas. Je lui ai répondu, avouant que nous étions gouvernés + par de la canaille, et que nous avions grand tort de nous laisser faire. Au + reste, l'Italie est sens dessus dessous. La + Sicile se déclare indépendante, ou peu + s'en faut. Naples est en révolution et le + roi cède. Ces + nouvelles sont certaines à présent. Seulement tout ce qu'ils y gagneront, c'est + de passer du gouvernement despotique au gouvernement constitutionnel, de la + brutalité à la corruption, de la terreur à l'infamie, et, quand ils en seront + là, ils feront comme nous, ils y resteront longtemps. Non, je ne crois pas non + plus à la chimère de Borie.

+

Nous sommes une génération de fainéants et le Dieu nouveau s'appelle Circulus. Tachons, dans notre coin, de ne pas devenir + ignobles, afin que, si, sur mes vieux jours, ou sur les tiens, il y a un + changement à tout cela, nous puissions en jouir sans rougir de notre passé.

+ Bonsoir, mon Bouli. +
+ +
+ CCLXV AU MÊME + Nohant, 23 février 1848. Mon + enfant, +

Nous sommes bien inquiets ici, comme tu peux croire. Nous savons seulement ce + soir que la journée de mardi a été agitée et que celle d'aujourd'hui a dû l'être + encore davantage. Il faut que tu reviennes tout de suite; non pas que je me + livre à de puériles frayeurs, ni que je veuille te les faire partager, quand + même je les éprouverais.

+

Tu sais bien que je ne te donnerais pas un conseil de couardise. Mais ta place + est ici, s'il y a des troubles sérieux. Une révolution à Paris aurait son contrecoup immédiat dans les provinces, et + surtout ici, où les nouvelles arrivent en quelques heures. Tu as donc des + devoirs à remplir dans ton domicile et ton absence ne serait pas excusable. Je + ne te parle pas de moi : je ne crois à aucun danger personnel et ne suis + d'ailleurs pas du tout disposée à m'en préoccuper. Mais, si j'avais à agir et à + me prononcer pour quoi que ce soit, tu es mon représentant naturel. Viens donc + tout de suite, à moins que tu ne voies la tranquillité absolument rétablie. + Laisse à Lambert le soin de nos affaires à + Paris. Tu y retourneras d'ailleurs dans + quelques jours, quand nous aurons vu l'état des choses.

+ + Bonsoir, mon enfant; je + t'attends. J'espère un mot de toi demain matin. Si la poste n’arrive pas, + c'est que l'affaire aura été sérieuse. Mais tu n'as là, je le répète, aucun + devoir à remplir, et, ici, tu peux en avoir auxquels il ne faut pas manquer. + Je t’embrasse mille fois. Ta + mère. + +
+ +
+ CCLXVI AU MÊME + + + Nohant, 24 février 1848. + Mon enfant, +

Ta lettre de mardi, reçue ce matin jeudi, m'a fait grand bien. Dieu veuille que + j'en reçoive encore une demain matin; car on nous a annoncé la journée de + mercredi comme devant être grave, et mes inquiétudes ne sont calmées que pour + renaître. Je vois que tu cours et que tu flânes, je m'y attendais bien; mais, au + moins, puisses-tu être prudent et adroit pour échapper aux chocs de ce grand + ébranlement. Si tout est fini, reste à Paris + pour achever tes affaires. Mais, si l’agitation continue, conforme-toi à ma + lettre d’hier.

+

Rollinat est ici, jusqu’à dimanche, + et nous parlons sans cesse de Paris et de + toi. Borie se lève à huit heures du + matin et court à la Châtre pour me + rapporter tes lettres.

+ Bonjour au petit Lambert ; + qu’il soit prudent pour lui pour toi. Bonsoir, mon cher enfant. Je suis inquiète + et je t’aime. Je voudrais être à demain. Ta + mère. +
+ +
+ CCLXVII A M. GIRERD, A + NEVERS + Paris, lundi soir, 6 mars 1848. + Mon ami, +

Tout va bien. Les chagrins personnels disparaissent quand la vie publique nous + appelle et nous absorbe. La République est la meilleure des familles, le peuple + est le meilleur des amis. Il ne faut pas songer à autre chose.

+

La République est sauvée à Paris; il s'agit + de la sauver en province, où sa cause n'est pas gagnée. Ce n'est pas moi qui ai + fait faire ta nomination ; mais c'est moi qui l'ai confirmée; car le ministre m'a rendue en quelque sorte + responsable de la conduite de mes amis, et il m'a donné plein pouvoir pour tes + encourager, les stimuler, et les rassurer contre toute intrigue de la part de + leurs ennemis, contre toute faiblesse de la part du gouvernement. Agis donc avec + vigueur, mon cher frère. Dans une situation comme celle où nous sommes, il ne + faut pas seulement du dévouement et de la loyauté, il faut du fanatisme au + besoin. Il faut s'élever au-dessus de soi-même, abjurer toute faiblesse, briser + ses propres affections si elles contrarient la marche d'un pouvoir élu par le + peuple et réellement, foncièrement révolutionnaire. + Ne t'apitoie pas sur le sort de Michel: Michel est + riche, il est ce qu'il a souhaité, ce qu'il a choisi d'être. Il nous a trahis, + abandonnés, dans les mauvais jours. A présent, son orgueil, son esprit de + domination se réveillent. Il faudra qu'il donne à la République des gages + certains de son dévouement s'il veut qu'elle lui donne sa confiance. La + députation est un honneur qu'il peut briguer et que son talent lui assure + peut-être. C'est là qu'il montrera ce qu'il est, ce qu'il pense aujourd'hui. Il + le montrera à la nation entière. Les nations sont généreuses et pardonnent à + ceux qui reviennent de leurs erreurs.

+

Quant au devoir d'un gouvernement provisoire, il consiste à choisir des hommes + sûrs pour lancer l'élection dans une voie + républicaine et sincère. Que l'amitié fasse donc silence, et n'influence pas + imprudemment l'opinion en faveur d'un homme qui est assez fort pour se relever + lui-même si son cœur est pur et sa volonté droite.

+

Je ne saurais trop te recommander de ne pas hésiter à balayer tout ce qui a + l'esprit bourgeois. Plus tard, la nation, maîtresse de sa marche, usera + d'indulgence si elle le juge à propos, et elle fera bien si elle prouve sa force + par la douceur. Mais, aujourd'hui, si elle songe à ses amis plus qu'à son + devoir, elle est perdue, et les hommes employés par elle à son début auront + commis un parricide.

+

Tu vois, mon ami, que je ne saurais transiger avec la logique. Fais comme moi. Si + Michel et bien d'autres + déserteurs que je connais avaient besoin de ma vie, je la leur donnerais + volontiers, mais ma conscience, point. Michel a abandonné la démocratie, en haine + de la démagogie. Or il n'y a plus de démagogie. Le peuple a prouvé qu'il était plus beau, plus grand, + plus pur que tous les riches et les savants de ce monde. Le calomnier la veille + pour le flatter le lendemain m'inspire peu de confiance, et j'estimerais encore + mieux Michel s'il protestait + aujourd'hui contre la République. Je dirais qu'il s'est trompé, qu'il se trompe, + mais qu'il est de bonne foi.

+

Peut-être croit-il désormais travailler pour une république aristocratique où le + droit des pauvres sera refoulé et méconnu. S'il agit ainsi, il brisera + l'alliance qui s'est cimentée d'une manière sublime, sur les barricades, entre + le riche et le pauvre. Il perdra la République et la livrera aux intrigants ; et + le peuple, qui sent sa force, ne les supportera plus. Le peuple tombera dans des + excès condamnables si on le trahit; la société sera livrée à une épouvantable + anarchie, et ces riches qui auront détruit le pacte sacré deviendront pauvres à + leur tour dans des convulsions sociales où tout succombera.

+

Ils seront punis par où ils auront péché; mais il sera trop tard pour se + repentir. Michel ne connaît pas et + n'a jamais connu le peuple; que ne le voit-il aujourd'hui! Il jugerait sa force + et respecterait sa vertu.

+ Courage, volonté, persévérance à toute épreuve. Je suis à toi pour + la vie. + GEORGE. Je serai demain + soir 7 mars à Nohant pour une huitaine de jours; après quoi, je reviendrai + probablement ici pour m'y consacrer entièrement aux nouveaux devoirs que la + situation nous crée. +
+ +
+ CCLXVIII A M. CHARLES PONCY, A + TOULON + + Nohant, 9 mars 1848. +

Vive la République ! Quel rêve, quel enthousiasme, et, en même temps, quelle + tenue, quel ordre à Paris! J'en arrive, j'y + ai couru, j'ai vu s'ouvrir les dernières barricades sous mes pieds. J'ai vu le + peuple grand, sublime, naïf, généreux, le peuple français, réuni au cœur de la + France, au cœur du monde; le plus + admirable peuple de l'univers! J’ai passé bien des nuits sans dormir, bien des + jours sans m'asseoir. On est fou, on est ivre, on est heureux de s'être endormi + dans la fange et de se réveiller dans les cieux. Que tout ce qui vous entoure + ait courage et confiance!

+

La République est conquise, elle est assurée, nous y périrons tous plutôt que de + la lâcher. Le gouvernement est composé d'hommes excellents pour la plupart, tous + un peu incomplets et insuffisants à une tache qui demanderait le génie de + Napoléon et le cœur de Jésus. Mais la réunion de tous ces hommes qui ont de + l'âme ou du talent, ou de la volonté, suffit à la situation. Ils veulent le + bien, ils le cherchent, ils l'essayent. Ils sont dominés sincèrement par un + principe supérieur à la capacité individuelle de chacun, la volonté de tous, le + droit du peuple. Le peuple de Paris est si + bon, si indulgent, si confiant dans sa cause et si + fort, qu'il aide lui-même son gouvernement.

+

La durée d'une telle disposition serait l'idéal social. Il faut l'encourager. + D'un bout de la France à l'autre, il faut + que chacun aide la République et la sauve de ses ennemis. Le désir, le principe, + le vœu fervent des membres du gouvernement provisoire est qu'on envoie à + l'Assemblée nationale des hommes qui représentent le peuple et dont plusieurs, + le plus possible, sortent de son sein.

+

Ainsi, mon ami, vos amis doivent y songer et tourner tes yeux sur vous pour la + députation. Je suis bien fâchée de ne pas connaître les gens influents de notre + opinion dans votre ville. Je les + supplierais de vous choisir et je vous commanderais, au nom de mon amitié + maternelle, d'accepter sans hésiter. Voyez : faites + agir ; il ne suffit pas de laisser agir. + Il n'est plus question de vanité ni d'ambition comme on l'entendait naguère. II + faut que chacun fasse la manœuvre du navire et donne tout son temps, tout son + cœur, toute son intelligence, toute sa vertu à la République. Les poètes peuvent + être, comme Lamartine, de grands citoyens. Les ouvriers ont à nous dire leurs + besoins, leurs inspirations. Écrivez-moi vite qu’on y pense et que vous le + voulez. Si j'avais là des amis, je le leur ferais bien comprendre.

+

Je repars pour Paris dans quelques jours + probablement, pour faire soit un journal, soit autre chose. Je choisirai le + meilleur instrument possible pour accompagner ma chanson. J'ai le cœur plein et + la tête en feu.

+

Tous mes maux physiques, toutes mes douleurs personnelles sont oubliées. Je vis, + je suis forte, je suis active, je n'ai plus que vingt ans. Je suis revenue ici + aider mes amis, dans la mesure de mes forces, à révolutionner le Berry, qui est bien engourdi. Maurice s'occupe de révolutionner la commune. + Chacun fait ce qu'il peut. Ma fille, + pendant ce temps-là, est accouchée heureusement d'une fille. Borie sera probablement député par la Corrèze. En attendant, il m'aidera à organiser + mon journal.

+

Allons, j'espère que nous nous retrouverons tous à Paris, pleins de vie et d'action, prêts à mourir sur les + barricades si la République succombe. Mais non! la République vivra; son temps + est venu. C'est à vous, hommes du peuple, à la défendre jusqu'au dernier + soupir.

+ J'embrasse Désirée, j'embrasse + Solange, je vous bénis et je + vous aime. + Ecrivez-moi ici. On me renverra votre lettre à Paris, si j'y suis. Montrez ma lettre à vos amis. Cette + fois, je vous y autorise et je vous le demande. +
+ +
+ CCLXIX A M. CHARLES + DUVERNET, A LA + CHATRE + + + Paris, 14 mars + 1848. +

+ Borie fait comme toi. On t'a annoncé un + charivari et tu l'as bravé. Tu lui annonces une aubade d'un autre genre et cela + lui donne d'autant plus d'envie d'aller la chercher. Mais je ne suis pas de son + avis, je le retiendrai s'il m'est possible.

+

Braver des criailleries n'est rien du tout, pas plus pour un homme, je pense, que + pour une femme. Mais je trouve que, pour le moment, il n'y a rien à faire, parce + que le peuple est mis hors de cause à la + Châtre, que le club devient une question de personnes, et qu'on + ne pourrait prendre le parti du principe sans avoir l'air d'agir pour des noms + propres.

+ Bonsoir, mon ami; courage quand même! la République n'est pas perdue + parce que la Châtre n'en veut pas. + A toi. + GEORGE. + +
+ +
+ CCLXX A MAURICE SAND, A + NOHANT + Paris, 18 mars 1848. + Cher enfant, +

J'ai fait un très bon voyage; mais je n'ai trouvé chez toi ni Élisa ni clefs. On a couru chez trois serruriers + pour faire ouvrir la porte: pas de serruriers! Ils étaient tous aux clubs. De + guerre lasse, j'ai été coucher dans un hôtel garni. Ce matin, je suis chez + Pinson, d'où je t'écris. Elisa et les clefs sont retrouvées. J'irai ce soir + loger chez toi, en attendant que je m'installe un peu mieux s'il y a lieu. Mais + je ne veux pas encore louer pour un mois, avant de savoir si je pourrai faire + quelque chose ici. Je vais aller voir Pauline. Je viens-de faire, en déjeunant, le récit de la fête de + Nohant pour la Réforme. Borie en a fait un + en déjeunant à Châteauroux, pour le + journal de Fleury. Tu les recevras l'un et + l'autre et tu feras bien de les lire dimanche, à haute et intelligible voix, à + tes gardes nationaux. Ça les flattera. Tu développeras ces articles par des + conversations dans les groupes. Tu feras sentir la nécessité de l'impôt pour ce + moment de crise. Tu diras que nous sommes très contents d'en payer ta plus + grosse part et que ce n'est pas acheter trop cher les bienfaits de l'avenir. + Voilà ton thème, que tu traduiras en berrichon.

+

Écris-moi, car je me trouve bien seule ici. Adresse-moi tes lettres rue de Condé. Je t'écrirai plus au long + quand j'aurai vu un peu de monde et entamé quelque projet.

+

Tu as dû recevoir la nomination de ton adjoint. Nous allons nous occuper de + l'affaire des noyers. Ne t'ennuie pas trop. Travaille à prêcher, à + républicaniser nos bons paroissiens. Nous ne manquons pas de vin cette année, tu + peux faire rafraîchir ta garde nationale armée, modérément, dans la cuisine, et, + là, pendant une heure, tu peux causer avec eux et les éclairer beaucoup. Je + t'enverrai du Blaise + Bonnin + Lettres d'un paysan de la vallée Noire, écrite sous la + dictée de Blaise Bonnin., qui te servira de thème. + Seulement, mets de l'ordre maintenant dans ces réunions, et, s'il le faut, forme + une espèce de club, d'où seront exclus les flâneurs et les buveurs inutiles, les + enfants et les femmes, qui ne songent qu'à crier et à danser. Pour le moment, + c'est tout ce qu'on peut faire.

+ Je te rebigeVerbe utilisé par George Sand dans sa correpondance qui signifie + faire une bise de plus. et je + t'aime. +
+ +
+
diff --git a/app/static/uploads/Linux_10_10_18.pdf b/app/static/uploads/Linux_10_10_18.pdf new file mode 100644 index 0000000..5652d55 Binary files /dev/null and b/app/static/uploads/Linux_10_10_18.pdf differ diff --git a/app/static/uploads/StructureetevolutionduWebSemantique.jpg b/app/static/uploads/StructureetevolutionduWebSemantique.jpg new file mode 100644 index 0000000..39d5b87 Binary files /dev/null and b/app/static/uploads/StructureetevolutionduWebSemantique.jpg differ diff --git a/app/static/uploads/seance1.pdf b/app/static/uploads/seance1.pdf new file mode 100644 index 0000000..461060e Binary files /dev/null and b/app/static/uploads/seance1.pdf differ diff --git a/app/static/uploads/slides.pdf b/app/static/uploads/slides.pdf new file mode 100644 index 0000000..26bf81f Binary files /dev/null and b/app/static/uploads/slides.pdf differ diff --git a/app/templates/conteneur.html b/app/templates/conteneur.html index 45700a6..b3bdc3d 100755 --- a/app/templates/conteneur.html +++ b/app/templates/conteneur.html @@ -26,25 +26,31 @@ -
+
diff --git a/app/templates/pages/admin.html b/app/templates/pages/admin.html new file mode 100644 index 0000000..948ffd9 --- /dev/null +++ b/app/templates/pages/admin.html @@ -0,0 +1,88 @@ +{% extends "conteneur.html" %} + +{% block titre %}| Modifier mon profil{%endblock%} + +{% block corps %} +{% if current_user.person_is_admin == True %} + +
+ {{ form.hidden_tag() }} +
+
+
+

Informations utilisateur

+
+
+
+
+
+ {{ form.person_is_admin }} {{ form.person_is_admin.label }} +
+ +
+
+
+
+ {{ form.person_firstName.label }}
+ {{ form.person_firstName(size=35) }} +
+
+ {{ form.person_name.label }}
+ {{ form.person_name(size=35) }}
+
+
+ +
+

+ {{ form.person_login.label }}
+ {{ form.person_login(size=35) }}
+ {% for error in form.person_login.errors %} + [{{ error }}] + {% endfor %} +
+

+ {{ form.person_email.label }}
+ {{ form.person_email(size=35) }}
+ {% for error in form.person_email.errors %} + [{{ error }}] + {% endfor %} +
+
+
+
+
+
+
+
+
+

Informations pour l'annuaire

+
+
+
+

+ {{ form.person_promotion.label }}
+ {{ form.person_promotion(size=4) }}
+

+ +

+ {{ form.person_git.label }}
+ {{ form.person_git(size=50) }}
+

+ +

+ {{ form.person_linkedIn.label }}
+ {{ form.person_linkedIn(size=50) }}
+

+ +

+ {{ form.person_description.label }}
+ {{ form.person_description(cols=70, rows=5) }}
+

+

{{ form.submit() }}

+
+ +
+{% else %} +

PAGE ADMINISTRATEUR

+{% endif %} +{% endblock %} \ No newline at end of file diff --git a/app/templates/pages/annuaire.html b/app/templates/pages/annuaire.html index b81b850..d333d51 100644 --- a/app/templates/pages/annuaire.html +++ b/app/templates/pages/annuaire.html @@ -4,102 +4,90 @@ {% block corps %} - - + + -
+
+ {% if current_user.is_anonymous %} +
-
-
-

Annuaire du master TNAH de l'école nationale des chartes

-

Ecrire un petit texte pour présenter les sympathiques étudiants du master et les informations qui seront disponibles à propos d'eux sur cette page : noms et prénoms, promotion, CV, linkedIn, Git, et s'ils ont été professeurs ou non

-

Il y a {{resultats.total}} personnes inscrites sur l'annuaire TNAH :

- - + +

Vous devez être connecté·e pour accéder à l'annuaire.


- - -
-
- -
-
- -
-{% for found_person in resultats.items %} -
-
- - {% if found_person.person_is_teacher %} - - {% else %} - - {% endif %} - - - - {{found_person.person_firstName}} {{found_person.person_name}} - - - - -
- - -
-
- {% if found_person.person_git %} - gitHub - {% else %} - - {% endif %} - {% if found_person.person_linkedIn %} - LinkedIn - {% else %} - - {% endif %} - + Inscription + Connexion + +
+ {% else %} +
+
+

Annuaire du master TNAH de l'École nationale des chartes

+

Retrouvez les informations de contact des étudiant·e·s du Master TNAH inscrit·e·s sur TNAHBox.

+

Il y a {{resultats|length}} personnes inscrites sur l'annuaire TNAH :

+ + + +
+
+ +
+
+ +
+ {% for found_person in resultats %} +
+
+ + {% if found_person.person_is_teacher %} + + {% else %} + + {% endif %} + + + + {{found_person.person_firstName}} {{found_person.person_name}} + + + + +
+
+
+ {% if found_person.person_git %} + GitHub + {% else %} + + {% endif %} + {% if found_person.person_linkedIn %} + LinkedIn + {% else %} + + {% endif %} + +
+ + {% if found_person.person_promotion %} + ({{found_person.person_promotion}}) + {% endif %} + + +
+
+
+
+ {% endfor %} + +
- ({{found_person.person_promotion}}) - -
-
-
- {% endfor %} - - - - - - -
- - -
-
- -
- - +
+ {% include "partials/retour_accueil.html" %} + {% endblock %} diff --git a/app/templates/pages/connexion.html b/app/templates/pages/connexion.html index 8bf12ce..e39488c 100755 --- a/app/templates/pages/connexion.html +++ b/app/templates/pages/connexion.html @@ -3,25 +3,46 @@ {% block titre %}| Connexion{%endblock%} {% block corps %} -

Connexion

+ + +
{{ form.hidden_tag() }} -

- {{ form.person_login.label }}
- {{ form.person_login(size=32) }}
- {% for error in form.person_login.errors %} - [{{ error }}] - {% endfor %} -

-

- {{ form.person_password.label }}
- {{ form.person_password(size=32) }}
- {% for error in form.person_password.errors %} - [{{ error }}] - {% endfor %} -

+
+
+

Connexion


+
+
+
+ {{ form.person_login.label }}
+ {{ form.person_login(size=42) }}
+ {% for error in form.person_login.errors %} + [{{ error }}] + {% endfor %} +
+
+
+
+
+ {{ form.person_password.label }}
+ {{ form.person_password(size=42) }}
+ {% for error in form.person_password.errors %} + [{{ error }}] + {% endfor %} + +
+ + + + + +
+

{{ form.remember_me() }} {{ form.remember_me.label }}

{{ form.submit() }}

-

S'enregistrer

- +

+ Pas encore enregistré(e) ? Inscrivez-vous ! +

+ + {% endblock %} \ No newline at end of file diff --git a/app/templates/pages/document.html b/app/templates/pages/document.html index c0dc3cc..6c05b61 100755 --- a/app/templates/pages/document.html +++ b/app/templates/pages/document.html @@ -5,16 +5,138 @@ {% endblock %} {% block corps %} - {% if docu %} -

{{docu.document_title}}

-
-
Matière
{{docu.document_teaching}}
-
Description
{{docu.document_description}}
-
Format
{{docu.document_format}}
-
Date
{{docu.document_date}}
-
+ {% if current_user.is_anonymous %} +
+
+
+
+

Merci de vous connecter pour accéder au contenu des documents.

+ Inscription + Connexion +
+
+
+ +
+
+
+ +
+
+
+
{% else %} -

La base de données est en cours de constitution

+

Galerie de document

+ {% if docu %} + +
+
+ {% if docu.document_format == "Image" %} + fichier en format image + {% elif docu.document_format == "Texte" %} + fichier en format texte + {% elif docu.document_format == "Code" %} + fichier de code + {% elif docu.document_format == "Autre" %} + fichier dans un format divers + {% else %} + fichier dans un format divers + {% endif %} +
+
+
+

{{docu.document_title}}

+
+ {% if current_user in docu.loving_users %} +
+ +
+ {% else %} +
+ +
+ {% endif %} + +
+
+
+
+
Matière
{{docu.document_teaching}}
+
Description
+ {% if docu.document_description %} +
{{docu.document_description}}
+ {% else %} +
Il n'y a pas de description renseignée pour ce document dans la base.
+ {% endif %} +
Type
{{docu.document_format}}
+
+
+ {% if docu.document_downloadLink %} + + Icone de téléchargement + +
+ + Icone de prévisualisation + + {% else %} + + Icone d'absence de téléchargement + +
+ + Icone d'absence de prévisualisation + + {% endif %} +
+
+
+
Date
+ {% if docu.document_date %} +
{{docu.document_date}}
+ {% else %} +
Il n'y a pas de date renseignée pour ce document dans la base.
+ {% endif %} +
Auteur
+ {% if auteur.person_name %} +
{{auteur.person_firstName}} {{auteur.person_name}}
+ {% else %} +
Il n'y a pas d'auteur renseigné pour ce document dans la base.
+ {% endif %} +
Tag
+
+ {% for tag in docu.document_tag %} + {{tag}} + {% endfor %} +
+
+
+ + + + +
+
+
+
+
+
+ + {% else %} +

Aucun document ne correspond à l'identifiant renseigné.

+ {% endif %} {% endif %} -

Retour à l'accueil

-{% endblock %} \ No newline at end of file + + {% include "partials/retour_accueil.html" %} +{% endblock %} + diff --git a/app/templates/pages/edit_profile.html b/app/templates/pages/edit_profile.html new file mode 100644 index 0000000..dd638e3 --- /dev/null +++ b/app/templates/pages/edit_profile.html @@ -0,0 +1,77 @@ +{% extends "conteneur.html" %} + +{% block titre %}| Modifier mon profil{%endblock%} + +{% block corps %} +
+ {{ form.hidden_tag() }} +
+
+
+

Informations utilisateur

+
+
+
+ +
+
+ {{ form.person_firstName.label }}
+ {{ form.person_firstName(size=35) }} +
+
+ {{ form.person_name.label }}
+ {{ form.person_name(size=35) }}
+
+
+ +
+

+ {{ form.person_login.label }}
+ {{ form.person_login(size=35) }}
+ {% for error in form.person_login.errors %} + [{{ error }}] + {% endfor %} +
+

+ {{ form.person_email.label }}
+ {{ form.person_email(size=35) }}
+ {% for error in form.person_email.errors %} + [{{ error }}] + {% endfor %} +
+
+
+
+
+
+
+
+
+

Informations pour l'annuaire

+
+
+
+

+ {{ form.person_promotion.label }}
+ {{ form.person_promotion(size=4) }}
+

+ +

+ {{ form.person_git.label }}
+ {{ form.person_git(size=50) }}
+

+ +

+ {{ form.person_linkedIn.label }}
+ {{ form.person_linkedIn(size=50) }}
+

+ +

+ {{ form.person_description.label }}
+ {{ form.person_description(cols=70, rows=5) }}
+

+

{{ form.submit() }}

+
+ +
+{% endblock %} \ No newline at end of file diff --git a/app/templates/pages/import.html b/app/templates/pages/import.html new file mode 100755 index 0000000..bf92e8a --- /dev/null +++ b/app/templates/pages/import.html @@ -0,0 +1,129 @@ +{% extends 'conteneur.html' %} + +{% block title %}{{titre}}{% endblock %} + + + +{% block corps %} +
+

Choisissez un fichier à importer dans TNAH BOX :

+ + +
+ + +
+
+ + +
+

Extensions autorisées :

+

.txt, .pdf, .csv, .doc, .jpg, .json, + .jpeg, .gif, .bmp, .png, .word, .xml, .py, .odt

+
+
+ +
+ + +
+ +
+ + {# #} + +
+ +
+ + +
+ +
+ + +
+ +
+
+ +

AAAA-MM-JJ

+
+ + +
+
+ + +
+ +
+
+ +{##} + +
+ + +{% endblock %} + + \ No newline at end of file diff --git a/app/templates/pages/inscription.html b/app/templates/pages/inscription.html index 1c60042..ca9d126 100755 --- a/app/templates/pages/inscription.html +++ b/app/templates/pages/inscription.html @@ -3,59 +3,72 @@ {% block titre %}| S'enregistrer{%endblock%} {% block corps %} -

S'enregistrer

{{ form.hidden_tag() }} -

- {{ form.person_firstName.label }}
- {{ form.person_firstName(size=32) }} -

-

- {{ form.person_name.label }}
- {{ form.person_name(size=32) }}
+

+
+
+

Inscription

+
+
+
-

-

- {{ form.person_login.label }}
- {{ form.person_login(size=32) }}
- {% for error in form.person_login.errors %} - [{{ error }}] - {% endfor %} -

-

- {{ form.person_email.label }}
- {{ form.person_email(size=64) }}
- {% for error in form.person_email.errors %} - [{{ error }}] - {% endfor %} -

-

- {{ form.person_password.label }}
- {{ form.person_password(size=32) }}
- {% for error in form.person_password.errors %} - [{{ error }}] - {% endfor %} -

-

- {{ form.password2.label }}
- {{ form.password2(size=32) }}
- {% for error in form.password2.errors %} - [{{ error }}] - {% endfor %} -

-

- {{ form.person_git.label }}
- {{ form.person_git(size=100) }}
-

-

- {{ form.person_linkedIn.label }}
- {{ form.person_linkedIn(size=100) }}
-

-

- {{ form.person_promotion.label }}
- {{ form.person_promotion(size=100) }}
-

-

{{ form.submit() }}

-

* champs obligatoires

+
+
+ {{ form.person_firstName.label }}
+ {{ form.person_firstName(size=35) }} +
+
+ {{ form.person_name.label }}
+ {{ form.person_name(size=35) }}
+
+
+ +
+

+ {{ form.person_login.label }}
+ {{ form.person_login(size=35) }}
+ {% for error in form.person_login.errors %} + [{{ error }}] + {% endfor %} +
+

+ {{ form.person_email.label }}
+ {{ form.person_email(size=35) }}
+ {% for error in form.person_email.errors %} + [{{ error }}] + {% endfor %} +
+
+ +
+

+ {{ form.person_password.label }}
+ {{ form.person_password(size=35) }}
+ {% for error in form.person_password.errors %} + [{{ error }}] + {% endfor %} +
+

+ {{ form.password2.label }}
+ {{ form.password2(size=35) }}
+ {% for error in form.password2.errors %} + [{{ error }}] + {% endfor %} +
+
+
+
+
+ {{form.person_is_teacher}} {{ form.person_is_teacher.label }} +
+
+
+

+ {{ form.submit() }} +
+
+

* champs obligatoires

+
{% endblock %} \ No newline at end of file diff --git a/app/templates/pages/person.html b/app/templates/pages/person.html index 721dfdd..09a28ef 100644 --- a/app/templates/pages/person.html +++ b/app/templates/pages/person.html @@ -1,82 +1,119 @@ {% extends "conteneur.html" %} {% block titre %} - {%if person %}| Personne : {{person.person_name}} {% endif %} + {%if person %}| Personne : {{person.person_name}} {% endif %} {% endblock %} - {% block corps %} - - - -
-
- -
-

{{person.person_firstName}} {{person.person_name}}

- -

promotion : {{person.person_promotion}}

- {% if person.person_cv %} -

{{person.person_cv}}

- {% else %} -

Le CV de {{person.person_firstName}} {{person.person_name}} n'a pas été rempli.

- {% endif %} -
-
- - -
-
-

Elsewhere

-
    -
  1. GitHub : - {% if person.person_git %} - {{(person.person_git).replace("https://github.com/","")|safe}} - + + + {% if current_user.is_anonymous %} +
    + +

    Vous devez être connecté·e pour accéder à cette page.


    + Inscription + Connexion + +
    + + {% else %} + +
    + +
    +

    {{person.person_firstName}} {{person.person_name}}

    + + {% if person.person_promotion %} +
    Promotion :
    +
    {{person.person_promotion}}
    + + {% endif %} + + {% if person_description %} +
    Description :
    + {{person_description}} {% else %} - Aucun compte GitHub n'a été renseigné. + Aucune description n'a été renseignée. {% endif %} -
  2. -
  3. linkedIn : - {% if person.person_linkedIn %} - {{person.person_firstName}} {{person.person_name}} - {% else %} - Aucun compte LinkedIn n'a été renseigné. + + + {% if person.person_login %} + +
    Profil :
    +
    {{person.person_login}}
    + {% endif %} -
  4. -
  5. adresse mail : {{person.person_email}}
  6. -
-
-
-
+
+
+
+
+
+

Contact

+
    +
  1. GitHub : + {% if person.person_git %} + {{(person.person_git).replace("https://github.com/","")|safe}} + + {% else %} + Aucun compte GitHub n'a été renseigné. + {% endif %} +
  2. +
  3. LinkedIn : + {% if person.person_linkedIn %} + {{person.person_firstName}} {{person.person_name}} + {% else %} + Aucun compte LinkedIn n'a été renseigné. + {% endif %} +
  4. +
  5. Adresse email : + {% if person.person_email %} + {{person.person_email}} + {% else %} + Aucune adresse mail n'a été renseignée.
    Essayez : {{person.person_firstName}}.{{person.person_name}}@chartes.psl.eu
    + {% endif %} +
  6. + +
+
+ +
+
+
CV :
+ {% if person.person_cv %} +
CV de {{person.person_firstName}} {{person.person_name}}
+ + {% else %} +
Le CV de {{person.person_firstName}} {{person.person_name}} n'est pas disponible.
+ {% endif %} +
+ +
+
Documents ajoutés :
+ {% if person.created_document %} +

{{person.person_firstName}} {{person.person_name}} a ajouté {{person.created_document|length}} document(s) dans TNAHBox :

+ + {% for document in person.created_document %} +
{{document.document_title}}
+ {% endfor %} + + {% else %} +
{{person.person_firstName}} {{person.person_name}} n'a ajouté aucun document à TNAHBox.
+ {% endif %} +
+
+ {% endif %} -