| """ |
| Module pour la construction des contrats à partir des templates. |
| """ |
| from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle |
| from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY |
| from reportlab.platypus import Paragraph, Spacer |
|
|
| from contract_templates import ContractTemplates |
| from utils import ensure_default_supports, sanitize_text |
|
|
|
|
| class ContractBuilder: |
| """ |
| Classe responsable de la construction des contrats complets à partir des templates. |
| """ |
| |
| @staticmethod |
| def get_styles(): |
| """ |
| Retourne les styles pour le document PDF. |
| Version corrigée pour éviter les conflits de styles. |
| |
| Returns: |
| dict: Dictionnaire des styles |
| """ |
| styles = getSampleStyleSheet() |
| |
| |
| |
| |
| |
| styles.add(ParagraphStyle(name='ContractTitle', |
| fontName='VeraBd', |
| fontSize=14, |
| alignment=TA_CENTER, |
| spaceAfter=12)) |
| |
| |
| styles.add(ParagraphStyle(name='ContractSubtitle', |
| fontName='VeraBd', |
| fontSize=12, |
| spaceAfter=10, |
| alignment=TA_CENTER)) |
| |
| |
| styles.add(ParagraphStyle(name='ContractText', |
| fontName='Vera', |
| fontSize=10, |
| alignment=TA_JUSTIFY, |
| spaceAfter=6)) |
| |
| |
| styles.add(ParagraphStyle(name='ContractArticle', |
| fontName='VeraBd', |
| fontSize=11, |
| spaceAfter=8)) |
| |
| |
| styles.add(ParagraphStyle(name='ContractSubArticle', |
| fontName='VeraBd', |
| fontSize=10, |
| spaceAfter=6)) |
| |
| return styles |
| |
| @staticmethod |
| def build_contract_elements(contract_type, is_free, author_type, author_info, |
| work_description, image_description, supports, |
| additional_rights, remuneration, is_exclusive): |
| """ |
| Construit tous les éléments du contrat. |
| |
| Args: |
| contract_type (list): Liste des types de contrats sélectionnés |
| is_free (bool): True si la cession est gratuite, False sinon |
| author_type (str): Type d'auteur ("Personne physique" ou "Personne morale") |
| author_info (dict): Informations sur l'auteur |
| work_description (str): Description de l'œuvre |
| image_description (str): Description de l'image |
| supports (list): Liste des supports sélectionnés |
| additional_rights (list): Liste des droits supplémentaires sélectionnés |
| remuneration (str): Modalités de rémunération |
| is_exclusive (bool): True si la cession est exclusive, False sinon |
| |
| Returns: |
| list: Liste des éléments du contrat pour ReportLab |
| """ |
| |
| styles = ContractBuilder.get_styles() |
| |
| |
| elements = [] |
| |
| |
| title = ContractTemplates.get_title(contract_type) |
| elements.append(Paragraph(title, styles['ContractTitle'])) |
| elements.append(Spacer(1, 15)) |
| |
| |
| preamble_text = ContractTemplates.get_preamble_text(contract_type, author_type, author_info) |
| paragraphs = preamble_text.split('\n\n') |
| for i, paragraph in enumerate(paragraphs): |
| if paragraph.strip(): |
| |
| if paragraph.isupper() and len(paragraph) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubtitle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| |
| |
| if paragraph.isupper() and len(paragraph) < 50: |
| elements.append(Spacer(1, 10)) |
| else: |
| elements.append(Spacer(1, 6)) |
| |
| |
| object_clause = ContractTemplates.get_object_clause( |
| contract_type, |
| sanitize_text(work_description), |
| sanitize_text(image_description) |
| ) |
| |
| |
| paragraphs = object_clause.split('\n\n') |
| for i, paragraph in enumerate(paragraphs): |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip().startswith("1.") and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| |
| |
| article_num = 2 |
| |
| |
| if "Auteur (droits d'auteur)" in contract_type: |
| rights_clause = ContractTemplates.get_author_rights_clause(is_free, is_exclusive, additional_rights) |
| paragraphs = rights_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip().startswith("2.") and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| if "Image (droit à l'image)" in contract_type: |
| image_rights_article_num = article_num if "Auteur (droits d'auteur)" not in contract_type else article_num |
| image_clause = ContractTemplates.get_image_rights_clause(is_free, is_exclusive) |
| |
| if image_rights_article_num != 3: |
| image_clause = image_clause.replace("ARTICLE 3", f"ARTICLE {image_rights_article_num}") |
| |
| image_clause = image_clause.replace("3.1", f"{image_rights_article_num}.1") |
| image_clause = image_clause.replace("3.2", f"{image_rights_article_num}.2") |
| image_clause = image_clause.replace("3.3", f"{image_rights_article_num}.3") |
| image_clause = image_clause.replace("3.4", f"{image_rights_article_num}.4") |
| |
| paragraphs = image_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| duration_clause = ContractTemplates.get_duration_territory_clause(article_num) |
| paragraphs = duration_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| final_supports = ensure_default_supports(supports) |
| supports_clause = ContractTemplates.get_supports_clause(article_num, final_supports) |
| paragraphs = supports_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| remuneration_clause = ContractTemplates.get_remuneration_clause(article_num, is_free, sanitize_text(remuneration)) |
| paragraphs = remuneration_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| warranties_clause = ContractTemplates.get_warranties_clause(article_num, contract_type) |
| paragraphs = warranties_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| termination_clause = ContractTemplates.get_termination_clause(article_num) |
| paragraphs = termination_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| other_clauses = ContractTemplates.get_other_clauses(article_num, contract_type) |
| paragraphs = other_clauses.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| article_num += 1 |
| |
| |
| law_clause = ContractTemplates.get_applicable_law_clause(article_num) |
| paragraphs = law_clause.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| |
| if paragraph.startswith("ARTICLE"): |
| elements.append(Paragraph(paragraph, styles['ContractArticle'])) |
| |
| elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50: |
| elements.append(Paragraph(paragraph, styles['ContractSubArticle'])) |
| else: |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 6)) |
| |
| |
| elements.append(Spacer(1, 30)) |
| signatures = ContractTemplates.get_signatures_template(contract_type) |
| paragraphs = signatures.split('\n\n') |
| for paragraph in paragraphs: |
| if paragraph.strip(): |
| elements.append(Paragraph(paragraph, styles['ContractText'])) |
| elements.append(Spacer(1, 8)) |
| |
| return elements |