Update contract_builder.py
Browse files- contract_builder.py +145 -29
contract_builder.py
CHANGED
@@ -31,7 +31,8 @@ class ContractBuilder:
|
|
31 |
styles.add(ParagraphStyle(name='Sous-titre',
|
32 |
fontName='Helvetica-Bold',
|
33 |
fontSize=12,
|
34 |
-
spaceAfter=10
|
|
|
35 |
styles.add(ParagraphStyle(name='Normal',
|
36 |
fontName='Helvetica',
|
37 |
fontSize=10,
|
@@ -41,6 +42,10 @@ class ContractBuilder:
|
|
41 |
fontName='Helvetica-Bold',
|
42 |
fontSize=11,
|
43 |
spaceAfter=8))
|
|
|
|
|
|
|
|
|
44 |
return styles
|
45 |
|
46 |
@staticmethod
|
@@ -74,14 +79,24 @@ class ContractBuilder:
|
|
74 |
# 1. Titre du contrat
|
75 |
title = ContractTemplates.get_title(contract_type)
|
76 |
elements.append(Paragraph(title, styles['Titre']))
|
77 |
-
elements.append(Spacer(1,
|
78 |
|
79 |
# 2. Préambule
|
80 |
preamble_text = ContractTemplates.get_preamble_text(contract_type, author_type, author_info)
|
81 |
-
|
|
|
82 |
if paragraph.strip():
|
83 |
-
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
|
86 |
# 3. Article 1 - Objet
|
87 |
object_clause = ContractTemplates.get_object_clause(
|
@@ -89,8 +104,20 @@ class ContractBuilder:
|
|
89 |
sanitize_text(work_description),
|
90 |
sanitize_text(image_description)
|
91 |
)
|
92 |
-
|
93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
|
95 |
# Compteur d'articles
|
96 |
article_num = 2
|
@@ -98,9 +125,17 @@ class ContractBuilder:
|
|
98 |
# 4. Article 2 - Droits cédés (pour contrat droits d'auteur)
|
99 |
if "Auteur (droits d'auteur)" in contract_type:
|
100 |
rights_clause = ContractTemplates.get_author_rights_clause(is_free, is_exclusive, additional_rights)
|
101 |
-
|
|
|
102 |
if paragraph.strip():
|
103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
elements.append(Spacer(1, 6))
|
105 |
article_num += 1
|
106 |
|
@@ -108,67 +143,148 @@ class ContractBuilder:
|
|
108 |
if "Image (droit à l'image)" in contract_type:
|
109 |
image_rights_article_num = article_num if "Auteur (droits d'auteur)" not in contract_type else article_num
|
110 |
image_clause = ContractTemplates.get_image_rights_clause(is_free, is_exclusive)
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
if paragraph.strip():
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
elements.append(Spacer(1, 6))
|
116 |
article_num += 1
|
117 |
|
118 |
# 6. Article - Durée et territoire
|
119 |
duration_clause = ContractTemplates.get_duration_territory_clause(article_num)
|
120 |
-
|
|
|
121 |
if paragraph.strip():
|
122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
elements.append(Spacer(1, 6))
|
124 |
article_num += 1
|
125 |
|
126 |
# 7. Article - Supports d'exploitation
|
127 |
final_supports = ensure_default_supports(supports)
|
128 |
supports_clause = ContractTemplates.get_supports_clause(article_num, final_supports)
|
129 |
-
|
|
|
130 |
if paragraph.strip():
|
131 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
132 |
elements.append(Spacer(1, 6))
|
133 |
article_num += 1
|
134 |
|
135 |
# 8. Article - Rémunération
|
136 |
remuneration_clause = ContractTemplates.get_remuneration_clause(article_num, is_free, sanitize_text(remuneration))
|
137 |
-
|
|
|
138 |
if paragraph.strip():
|
139 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
elements.append(Spacer(1, 6))
|
141 |
article_num += 1
|
142 |
|
143 |
# 9. Article - Garanties
|
144 |
warranties_clause = ContractTemplates.get_warranties_clause(article_num, contract_type)
|
145 |
-
|
|
|
146 |
if paragraph.strip():
|
147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
elements.append(Spacer(1, 6))
|
149 |
article_num += 1
|
150 |
|
151 |
# 10. Article - Résiliation
|
152 |
termination_clause = ContractTemplates.get_termination_clause(article_num)
|
153 |
-
|
|
|
154 |
if paragraph.strip():
|
155 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
elements.append(Spacer(1, 6))
|
157 |
article_num += 1
|
158 |
|
159 |
-
# 11. Article -
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
160 |
law_clause = ContractTemplates.get_applicable_law_clause(article_num)
|
161 |
-
|
|
|
162 |
if paragraph.strip():
|
163 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
elements.append(Spacer(1, 6))
|
165 |
|
166 |
-
#
|
167 |
-
elements.append(Spacer(1,
|
168 |
signatures = ContractTemplates.get_signatures_template(contract_type)
|
169 |
-
|
|
|
170 |
if paragraph.strip():
|
171 |
elements.append(Paragraph(paragraph, styles['Normal']))
|
172 |
elements.append(Spacer(1, 8))
|
173 |
|
174 |
-
return elements
|
|
|
31 |
styles.add(ParagraphStyle(name='Sous-titre',
|
32 |
fontName='Helvetica-Bold',
|
33 |
fontSize=12,
|
34 |
+
spaceAfter=10,
|
35 |
+
alignment=TA_CENTER))
|
36 |
styles.add(ParagraphStyle(name='Normal',
|
37 |
fontName='Helvetica',
|
38 |
fontSize=10,
|
|
|
42 |
fontName='Helvetica-Bold',
|
43 |
fontSize=11,
|
44 |
spaceAfter=8))
|
45 |
+
styles.add(ParagraphStyle(name='Sous-article',
|
46 |
+
fontName='Helvetica-Bold',
|
47 |
+
fontSize=10,
|
48 |
+
spaceAfter=6))
|
49 |
return styles
|
50 |
|
51 |
@staticmethod
|
|
|
79 |
# 1. Titre du contrat
|
80 |
title = ContractTemplates.get_title(contract_type)
|
81 |
elements.append(Paragraph(title, styles['Titre']))
|
82 |
+
elements.append(Spacer(1, 15))
|
83 |
|
84 |
# 2. Préambule
|
85 |
preamble_text = ContractTemplates.get_preamble_text(contract_type, author_type, author_info)
|
86 |
+
paragraphs = preamble_text.split('\n\n')
|
87 |
+
for i, paragraph in enumerate(paragraphs):
|
88 |
if paragraph.strip():
|
89 |
+
# Si c'est un titre comme "PRÉAMBULE" ou "ENTRE LES SOUSSIGNÉS"
|
90 |
+
if paragraph.isupper() and len(paragraph) < 50:
|
91 |
+
elements.append(Paragraph(paragraph, styles['Sous-titre']))
|
92 |
+
else:
|
93 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
94 |
+
|
95 |
+
# Ajouter un espace plus grand après les titres
|
96 |
+
if paragraph.isupper() and len(paragraph) < 50:
|
97 |
+
elements.append(Spacer(1, 10))
|
98 |
+
else:
|
99 |
+
elements.append(Spacer(1, 6))
|
100 |
|
101 |
# 3. Article 1 - Objet
|
102 |
object_clause = ContractTemplates.get_object_clause(
|
|
|
104 |
sanitize_text(work_description),
|
105 |
sanitize_text(image_description)
|
106 |
)
|
107 |
+
|
108 |
+
# Traitement de l'article objet
|
109 |
+
paragraphs = object_clause.split('\n\n')
|
110 |
+
for i, paragraph in enumerate(paragraphs):
|
111 |
+
if paragraph.strip():
|
112 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
113 |
+
if paragraph.startswith("ARTICLE"):
|
114 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
115 |
+
# Si c'est un sous-titre (comme "1.1 Œuvre concernée")
|
116 |
+
elif paragraph.strip().startswith("1.") and len(paragraph.split("\n")[0]) < 50:
|
117 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
118 |
+
else:
|
119 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
120 |
+
elements.append(Spacer(1, 6))
|
121 |
|
122 |
# Compteur d'articles
|
123 |
article_num = 2
|
|
|
125 |
# 4. Article 2 - Droits cédés (pour contrat droits d'auteur)
|
126 |
if "Auteur (droits d'auteur)" in contract_type:
|
127 |
rights_clause = ContractTemplates.get_author_rights_clause(is_free, is_exclusive, additional_rights)
|
128 |
+
paragraphs = rights_clause.split('\n\n')
|
129 |
+
for paragraph in paragraphs:
|
130 |
if paragraph.strip():
|
131 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
132 |
+
if paragraph.startswith("ARTICLE"):
|
133 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
134 |
+
# Si c'est un sous-titre (comme "2.1 Nature de la cession")
|
135 |
+
elif paragraph.strip().startswith("2.") and len(paragraph.split("\n")[0]) < 50:
|
136 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
137 |
+
else:
|
138 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
139 |
elements.append(Spacer(1, 6))
|
140 |
article_num += 1
|
141 |
|
|
|
143 |
if "Image (droit à l'image)" in contract_type:
|
144 |
image_rights_article_num = article_num if "Auteur (droits d'auteur)" not in contract_type else article_num
|
145 |
image_clause = ContractTemplates.get_image_rights_clause(is_free, is_exclusive)
|
146 |
+
# Remplacer le numéro d'article si nécessaire
|
147 |
+
if image_rights_article_num != 3:
|
148 |
+
image_clause = image_clause.replace("ARTICLE 3", f"ARTICLE {image_rights_article_num}")
|
149 |
+
# Aussi remplacer les sous-titres 3.x par le bon numéro
|
150 |
+
image_clause = image_clause.replace("3.1", f"{image_rights_article_num}.1")
|
151 |
+
image_clause = image_clause.replace("3.2", f"{image_rights_article_num}.2")
|
152 |
+
image_clause = image_clause.replace("3.3", f"{image_rights_article_num}.3")
|
153 |
+
image_clause = image_clause.replace("3.4", f"{image_rights_article_num}.4")
|
154 |
+
|
155 |
+
paragraphs = image_clause.split('\n\n')
|
156 |
+
for paragraph in paragraphs:
|
157 |
if paragraph.strip():
|
158 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
159 |
+
if paragraph.startswith("ARTICLE"):
|
160 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
161 |
+
# Si c'est un sous-titre (comme "3.1 Objet de l'autorisation")
|
162 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
163 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
164 |
+
else:
|
165 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
166 |
elements.append(Spacer(1, 6))
|
167 |
article_num += 1
|
168 |
|
169 |
# 6. Article - Durée et territoire
|
170 |
duration_clause = ContractTemplates.get_duration_territory_clause(article_num)
|
171 |
+
paragraphs = duration_clause.split('\n\n')
|
172 |
+
for paragraph in paragraphs:
|
173 |
if paragraph.strip():
|
174 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
175 |
+
if paragraph.startswith("ARTICLE"):
|
176 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
177 |
+
# Si c'est un sous-titre (comme "4.1 Durée")
|
178 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
179 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
180 |
+
else:
|
181 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
182 |
elements.append(Spacer(1, 6))
|
183 |
article_num += 1
|
184 |
|
185 |
# 7. Article - Supports d'exploitation
|
186 |
final_supports = ensure_default_supports(supports)
|
187 |
supports_clause = ContractTemplates.get_supports_clause(article_num, final_supports)
|
188 |
+
paragraphs = supports_clause.split('\n\n')
|
189 |
+
for paragraph in paragraphs:
|
190 |
if paragraph.strip():
|
191 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
192 |
+
if paragraph.startswith("ARTICLE"):
|
193 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
194 |
+
# Si c'est un sous-titre (comme "5.1 Supports autorisés")
|
195 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
196 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
197 |
+
else:
|
198 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
199 |
elements.append(Spacer(1, 6))
|
200 |
article_num += 1
|
201 |
|
202 |
# 8. Article - Rémunération
|
203 |
remuneration_clause = ContractTemplates.get_remuneration_clause(article_num, is_free, sanitize_text(remuneration))
|
204 |
+
paragraphs = remuneration_clause.split('\n\n')
|
205 |
+
for paragraph in paragraphs:
|
206 |
if paragraph.strip():
|
207 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
208 |
+
if paragraph.startswith("ARTICLE"):
|
209 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
210 |
+
# Si c'est un sous-titre (comme "6.1 Cession à titre gratuit")
|
211 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
212 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
213 |
+
else:
|
214 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
215 |
elements.append(Spacer(1, 6))
|
216 |
article_num += 1
|
217 |
|
218 |
# 9. Article - Garanties
|
219 |
warranties_clause = ContractTemplates.get_warranties_clause(article_num, contract_type)
|
220 |
+
paragraphs = warranties_clause.split('\n\n')
|
221 |
+
for paragraph in paragraphs:
|
222 |
if paragraph.strip():
|
223 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
224 |
+
if paragraph.startswith("ARTICLE"):
|
225 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
226 |
+
# Si c'est un sous-titre (comme "7.1 Garanties de l'Auteur")
|
227 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
228 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
229 |
+
else:
|
230 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
231 |
elements.append(Spacer(1, 6))
|
232 |
article_num += 1
|
233 |
|
234 |
# 10. Article - Résiliation
|
235 |
termination_clause = ContractTemplates.get_termination_clause(article_num)
|
236 |
+
paragraphs = termination_clause.split('\n\n')
|
237 |
+
for paragraph in paragraphs:
|
238 |
if paragraph.strip():
|
239 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
240 |
+
if paragraph.startswith("ARTICLE"):
|
241 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
242 |
+
# Si c'est un sous-titre (comme "8.1 Résiliation pour inexécution")
|
243 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
244 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
245 |
+
else:
|
246 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
247 |
elements.append(Spacer(1, 6))
|
248 |
article_num += 1
|
249 |
|
250 |
+
# 11. Article - Dispositions diverses
|
251 |
+
other_clauses = ContractTemplates.get_other_clauses(article_num, contract_type)
|
252 |
+
paragraphs = other_clauses.split('\n\n')
|
253 |
+
for paragraph in paragraphs:
|
254 |
+
if paragraph.strip():
|
255 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
256 |
+
if paragraph.startswith("ARTICLE"):
|
257 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
258 |
+
# Si c'est un sous-titre (comme "9.1 Clause de non-dénigrement")
|
259 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
260 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
261 |
+
else:
|
262 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
263 |
+
elements.append(Spacer(1, 6))
|
264 |
+
article_num += 1
|
265 |
+
|
266 |
+
# 12. Article - Loi applicable
|
267 |
law_clause = ContractTemplates.get_applicable_law_clause(article_num)
|
268 |
+
paragraphs = law_clause.split('\n\n')
|
269 |
+
for paragraph in paragraphs:
|
270 |
if paragraph.strip():
|
271 |
+
# Si c'est un titre d'article (commence par "ARTICLE")
|
272 |
+
if paragraph.startswith("ARTICLE"):
|
273 |
+
elements.append(Paragraph(paragraph, styles['Article']))
|
274 |
+
# Si c'est un sous-titre (comme "10.1 Loi applicable")
|
275 |
+
elif paragraph.strip()[0].isdigit() and "." in paragraph.strip()[:3] and len(paragraph.split("\n")[0]) < 50:
|
276 |
+
elements.append(Paragraph(paragraph, styles['Sous-article']))
|
277 |
+
else:
|
278 |
+
elements.append(Paragraph(paragraph, styles['Normal']))
|
279 |
elements.append(Spacer(1, 6))
|
280 |
|
281 |
+
# 13. Signatures
|
282 |
+
elements.append(Spacer(1, 30))
|
283 |
signatures = ContractTemplates.get_signatures_template(contract_type)
|
284 |
+
paragraphs = signatures.split('\n\n')
|
285 |
+
for paragraph in paragraphs:
|
286 |
if paragraph.strip():
|
287 |
elements.append(Paragraph(paragraph, styles['Normal']))
|
288 |
elements.append(Spacer(1, 8))
|
289 |
|
290 |
+
return elements
|