Merge lp:~aelkner/schooltool/schooltool.zambia into lp:~schooltool-owners/schooltool/schooltool.zambia

Proposed by Alan Elkner
Status: Merged
Merged at revision: 59
Proposed branch: lp:~aelkner/schooltool/schooltool.zambia
Merge into: lp:~schooltool-owners/schooltool/schooltool.zambia
Diff against target: 702 lines (+612/-3)
7 files modified
src/schooltool/zambia/app/browser/app.py (+307/-1)
src/schooltool/zambia/app/browser/configure.zcml (+52/-0)
src/schooltool/zambia/app/browser/resources/zambia.css (+20/-0)
src/schooltool/zambia/app/browser/templates/subgroups_timetable.pt (+55/-0)
src/schooltool/zambia/app/browser/templates/subgroups_timetable_pdf.pt (+88/-0)
src/schooltool/zambia/app/browser/templates/teachers_timetable.pt (+2/-2)
src/schooltool/zambia/app/browser/templates/teachers_timetable_pdf.pt (+88/-0)
To merge this branch: bzr merge lp:~aelkner/schooltool/schooltool.zambia
Reviewer Review Type Date Requested Status
SchoolTool Owners Pending
Review via email: mp+34671@code.launchpad.net
To post a comment you must log in.
59. By Alan Elkner <aelkner@ubuntu>

cosmetic changes to timetable pdfs

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/schooltool/zambia/app/browser/app.py'
--- src/schooltool/zambia/app/browser/app.py 2010-08-08 18:28:59 +0000
+++ src/schooltool/zambia/app/browser/app.py 2010-09-26 22:01:04 +0000
@@ -19,14 +19,19 @@
19"""19"""
20SchoolTool Zambia application views.20SchoolTool Zambia application views.
21"""21"""
22from reportlab.lib import pagesizes
2223
24from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
23from zope.publisher.browser import BrowserView25from zope.publisher.browser import BrowserView
24from zope.security.proxy import removeSecurityProxy26from zope.security.proxy import removeSecurityProxy
25from zope.traversing.browser.absoluteurl import absoluteURL27from zope.traversing.browser.absoluteurl import absoluteURL
2628
29from schooltool.app.browser.report import ReportPDFView
27from schooltool.app.interfaces import ISchoolToolApplication30from schooltool.app.interfaces import ISchoolToolApplication
28from schooltool.course.interfaces import IInstructor31from schooltool.course.interfaces import IInstructor, ISectionContainer
32from schooltool.group.interfaces import IGroupContainer
29from schooltool.schoolyear.interfaces import ISchoolYearContainer33from schooltool.schoolyear.interfaces import ISchoolYearContainer
34from schooltool.schoolyear.interfaces import ISchoolYear
30from schooltool.skin.skin import NavigationViewlet35from schooltool.skin.skin import NavigationViewlet
31from schooltool.term.interfaces import ITerm36from schooltool.term.interfaces import ITerm
32from schooltool.timetable.interfaces import ITimetables37from schooltool.timetable.interfaces import ITimetables
@@ -38,6 +43,10 @@
38ERROR_INVALID_MODEL = _('Timetable model must be WeeklyTimetableModel.')43ERROR_INVALID_MODEL = _('Timetable model must be WeeklyTimetableModel.')
39ERROR_TIMETABLE_MISMATCH = _('Timetables must be consistent for the term.')44ERROR_TIMETABLE_MISMATCH = _('Timetables must be consistent for the term.')
4045
46TEACHER_HEADING = _('Teacher')
47TOTAL_HEADING = _('Total')
48SUBGROUP_HEADING = _('Sub-\ngroup')
49
4150
42class ManageYearlyViewlet(NavigationViewlet):51class ManageYearlyViewlet(NavigationViewlet):
43 @property52 @property
@@ -193,3 +202,300 @@
193 results.append(result)202 results.append(result)
194 return results203 return results
195204
205
206class SubgroupsTimetableView(BrowserView):
207 """A view for the term's subgroup-based timetable"""
208
209 def __init__(self, context, request):
210 super(SubgroupsTimetableView, self).__init__(context, request)
211 self.term = removeSecurityProxy(self.context)
212 self.schoolyear = ISchoolYear(self.term)
213 self.groups = IGroupContainer(self.schoolyear)
214
215 def error(self, error_message):
216 self.error_message = error_message
217
218 def update(self):
219 self.error_message = ''
220 self.data = {
221 'days': [],
222 'rows': [],
223 }
224
225 subgroup_sections = {}
226 for section in ISectionContainer(self.context).values():
227 title = section.title.upper()
228 subgroup_sections.setdefault(title, []).append(section)
229
230 for subgroup_title, sections in sorted(subgroup_sections.items()):
231 subgroup_dict = {}
232
233 teacher = ''
234 if subgroup_title in self.groups:
235 leaders = [l for l in self.groups[subgroup_title].leaders]
236 if leaders:
237 teacher = leaders[0].title
238
239 for section in sections:
240 titles = [course.title.lower()
241 for course in section.courses]
242 course_title = ', '.join(titles)
243
244 timetables = ITimetables(section).timetables
245 if len(timetables.keys()) != 1:
246 return self.error(ERROR_TOO_COMPLEX)
247 timetable = timetables[timetables.keys()[0]]
248 if timetable.model.factory_id != 'WeeklyTimetableModel':
249 return self.error(ERROR_INVALID_MODEL)
250
251 days = [[day_id, timetable[day_id].periods]
252 for day_id in timetable.day_ids]
253 if not self.data['days']:
254 self.data['days'] = days
255 elif days != self.data['days']:
256 return self.error(ERROR_TIMETABLE_MISMATCH)
257
258 for day_id, periods in days:
259 subgroup_day = subgroup_dict.setdefault(day_id, {})
260 for period in periods:
261 if timetable[day_id].activities[period]:
262 cell = subgroup_day.setdefault(period, {})
263 cell[course_title] = 0
264
265 if subgroup_dict:
266 row = {
267 'name': subgroup_title,
268 'teacher': teacher,
269 'days': subgroup_dict,
270 }
271 self.data['rows'].append(row)
272
273 used_days = {}
274 for row in self.data['rows']:
275 for day_id in row['days']:
276 used_day = used_days.setdefault(day_id, set())
277 for period in row['days'][day_id]:
278 used_day.add(period)
279
280 adjusted_days = []
281 for day_id, periods in days:
282 if day_id not in used_days:
283 continue
284 adjusted_periods = []
285 for period in periods:
286 if period in used_days[day_id]:
287 adjusted_periods.append(period)
288 if adjusted_periods:
289 adjusted_days.append([day_id, adjusted_periods])
290 self.data['days'] = adjusted_days
291
292 def days(self):
293 dayNames = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
294 results = []
295 for day_id, day_periods in self.data['days']:
296 periods = []
297 for period_index, value in enumerate(day_periods):
298 if period_index == 0:
299 cell = ' heading_left'
300 else:
301 cell = ' heading'
302 cls = 'odd border_top period' + cell
303 period = {
304 'class': cls,
305 'value': unicode(value)[:3],
306 }
307 periods.append(period)
308 result = {
309 'text': dayNames[day_id],
310 'span': len(periods),
311 'periods': periods,
312 }
313 results.append(result)
314 return results
315
316 def rows(self):
317 results = []
318 for index, row in enumerate(self.data['rows']):
319 if index % 2 == 0:
320 even_odd = ' even'
321 else:
322 even_odd = ' odd'
323 days = []
324 for day_id, day_periods in self.data['days']:
325 if day_id not in row['days']:
326 continue
327 periods = []
328 for period_index, period in enumerate(day_periods):
329 if period_index == 0:
330 cell = ' sg_cell_left'
331 else:
332 cell = ' sg_cell'
333
334 value = ''
335 if day_id in row['days']:
336 values = row['days'][day_id].get(period, {})
337 value = '\n'.join([unicode(value)[:4]
338 for value in sorted(values)])
339
340 cls = 'period' + even_odd + cell
341
342 period_cell = {
343 'class': cls,
344 'value': value,
345 }
346 periods.append(period_cell)
347 days.append(periods)
348
349 result = {
350 'name': row['name'],
351 'teacher': row['teacher'],
352 'days': days,
353 'class': 'cell' + even_odd,
354 'class_left': 'cell_left' + even_odd,
355 }
356 results.append(result)
357 return results
358
359
360class TeachersTimetablePDFView(ReportPDFView, TeachersTimetableView):
361 """A view for the term's teacher-based timetable pdf"""
362
363 template=ViewPageTemplateFile('templates/teachers_timetable_pdf.pt')
364 pageSize = pagesizes.landscape(ReportPDFView.pageSize)
365 rotation = 90
366 name_width = '2.5cm'
367 period_width = 0.55
368 empty_width = 0.03
369 total_width = ',1cm'
370
371 def __call__(self):
372 self.term = removeSecurityProxy(self.context)
373 self.update()
374 return super(TeachersTimetablePDFView, self).__call__()
375
376 def heading_widths1(self):
377 results = self.name_width
378 for day in self.days():
379 day_width = self.empty_width + day['span'] * self.period_width
380 results += ',%fcm' % day_width
381 results += ',%fcm' % self.empty_width
382 results += self.total_width
383 return results
384
385 def heading_widths2(self):
386 results = self.name_width
387 for day in self.days():
388 results += ',%fcm' % self.empty_width
389 for period in day['periods']:
390 results += ',%fcm' % self.period_width
391 results += ',%fcm' % self.empty_width
392 results += self.total_width
393 return results
394
395 def headings1(self):
396 results = ['']
397 for day in self.days():
398 results.append(day['text'])
399 results.extend(['', ''])
400 return results
401
402 def headings2(self):
403 results = [TEACHER_HEADING]
404 for day in self.days():
405 results.append('')
406 for period in day['periods']:
407 results.append(period['value'])
408 results.extend(['', TOTAL_HEADING])
409 return results
410
411 def row_heights(self):
412 result = 1
413 rows = self.rows()
414 for row in rows:
415 for day in row['days']:
416 for period in day:
417 size = len(period['value'].split('\n'))
418 if size > result:
419 result = size
420 if result == 1:
421 height = 0.65
422 else:
423 height = 0.28 * result
424 return ','.join(['%fcm' % height] * len(rows))
425
426 def pdf_rows(self):
427 results = []
428 for row in self.rows():
429 result_row = [row['name']]
430 for day in row['days']:
431 result_row.append('')
432 for period in day:
433 value = period['value']
434 result_row.append(value)
435 result_row.extend(['', row['total']])
436 results.append(result_row)
437 return results
438
439
440class SubgroupsTimetablePDFView(ReportPDFView, SubgroupsTimetableView):
441 """A view for the term's subgroup-based timetable pdf"""
442
443 template=ViewPageTemplateFile('templates/subgroups_timetable_pdf.pt')
444 pageSize = pagesizes.landscape(ReportPDFView.pageSize)
445 rotation = 90
446 name_width = '1.2cm'
447 teacher_width = ',1.7cm'
448 period_width = 0.56
449 empty_width = 0.03
450
451 def __call__(self):
452 self.term = removeSecurityProxy(self.context)
453 self.schoolyear = ISchoolYear(self.term)
454 self.groups = IGroupContainer(self.schoolyear)
455 self.update()
456 return super(SubgroupsTimetablePDFView, self).__call__()
457
458 def heading_widths1(self):
459 results = self.name_width + self.teacher_width
460 for day in self.days():
461 day_width = self.empty_width + day['span'] * self.period_width
462 results += ',%fcm' % day_width
463 return results
464
465 def heading_widths2(self):
466 results = self.name_width + self.teacher_width
467 for day in self.days():
468 results += ',%fcm' % self.empty_width
469 for period in day['periods']:
470 results += ',%fcm' % self.period_width
471 return results
472
473 def headings1(self):
474 results = ['', '']
475 for day in self.days():
476 results.append(day['text'])
477 return results
478
479 def headings2(self):
480 results = [SUBGROUP_HEADING, TEACHER_HEADING]
481 for day in self.days():
482 results.append('')
483 for period in day['periods']:
484 results.append(period['value'])
485 return results
486
487 def row_heights(self):
488 return ','.join(['0.65cm'] * len(self.rows()))
489
490 def pdf_rows(self):
491 results = []
492 for row in self.rows():
493 result_row = [row['name'], row['teacher']]
494 for day in row['days']:
495 result_row.append('')
496 for period in day:
497 value = period['value']
498 result_row.append(value)
499 results.append(result_row)
500 return results
501
196502
=== modified file 'src/schooltool/zambia/app/browser/configure.zcml'
--- src/schooltool/zambia/app/browser/configure.zcml 2010-08-08 18:28:59 +0000
+++ src/schooltool/zambia/app/browser/configure.zcml 2010-09-26 22:01:04 +0000
@@ -52,6 +52,36 @@
52 title="Teachers Timetable"52 title="Teachers Timetable"
53 order="50"53 order="50"
54 />54 />
55 <navigationViewlet
56 name="subgroups_timetable.html"
57 for="schooltool.term.interfaces.ITerm"
58 manager="schooltool.skin.IActionMenuManager"
59 template="templates/actionsViewlet.pt"
60 permission="schooltool.edit"
61 link="subgroups_timetable.html"
62 title="Subgroups Timetable"
63 order="60"
64 />
65 <navigationViewlet
66 name="teachers_timetable.pdf"
67 for="schooltool.term.interfaces.ITerm"
68 manager="schooltool.skin.IActionMenuManager"
69 template="templates/actionsViewlet.pt"
70 permission="schooltool.edit"
71 link="teachers_timetable.pdf"
72 title="Teachers PDF"
73 order="50"
74 />
75 <navigationViewlet
76 name="subgroups_timetable.pdf"
77 for="schooltool.term.interfaces.ITerm"
78 manager="schooltool.skin.IActionMenuManager"
79 template="templates/actionsViewlet.pt"
80 permission="schooltool.edit"
81 link="subgroups_timetable.pdf"
82 title="Subgroups PDF"
83 order="60"
84 />
55 </configure>85 </configure>
5686
57 <page87 <page
@@ -70,5 +100,27 @@
70 permission="schooltool.edit"100 permission="schooltool.edit"
71 layer="schooltool.zambia.app.skin.ISchoolToolZambiaLayer"101 layer="schooltool.zambia.app.skin.ISchoolToolZambiaLayer"
72 />102 />
103 <page
104 name="subgroups_timetable.html"
105 for="schooltool.term.interfaces.ITerm"
106 class="schooltool.zambia.app.browser.app.SubgroupsTimetableView"
107 template="templates/subgroups_timetable.pt"
108 permission="schooltool.edit"
109 layer="schooltool.zambia.app.skin.ISchoolToolZambiaLayer"
110 />
111 <page
112 name="teachers_timetable.pdf"
113 for="schooltool.term.interfaces.ITerm"
114 class="schooltool.zambia.app.browser.app.TeachersTimetablePDFView"
115 permission="schooltool.edit"
116 layer="schooltool.zambia.app.skin.ISchoolToolZambiaLayer"
117 />
118 <page
119 name="subgroups_timetable.pdf"
120 for="schooltool.term.interfaces.ITerm"
121 class="schooltool.zambia.app.browser.app.SubgroupsTimetablePDFView"
122 permission="schooltool.edit"
123 layer="schooltool.zambia.app.skin.ISchoolToolZambiaLayer"
124 />
73125
74</configure>126</configure>
75127
=== modified file 'src/schooltool/zambia/app/browser/resources/zambia.css'
--- src/schooltool/zambia/app/browser/resources/zambia.css 2010-08-08 18:28:59 +0000
+++ src/schooltool/zambia/app/browser/resources/zambia.css 2010-09-26 22:01:04 +0000
@@ -51,6 +51,26 @@
51 text-align: center;51 text-align: center;
52}52}
5353
54.sg_cell {
55 height: 3.5em;
56 padding: .2em;
57 margin: 0em;
58 border-left: thin solid gray;
59 border-right: thin solid gray;
60 color: black;
61 text-align: center;
62}
63
64.sg_cell_left {
65 height: 3.5em;
66 padding: .2em;
67 margin: 0em;
68 border-left: 3px solid gray;
69 border-right: thin solid gray;
70 color: black;
71 text-align: center;
72}
73
54.border_top {74.border_top {
55 border-top: thin solid gray;75 border-top: thin solid gray;
56}76}
5777
=== added file 'src/schooltool/zambia/app/browser/templates/subgroups_timetable.pt'
--- src/schooltool/zambia/app/browser/templates/subgroups_timetable.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/zambia/app/browser/templates/subgroups_timetable.pt 2010-09-26 22:01:04 +0000
@@ -0,0 +1,55 @@
1<tal:tag condition="view/update" />
2<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool.gradebook">
3<head>
4 <title metal:fill-slot="title" i18n:translate="">Subgroups Timetable</title>
5</head>
6<body>
7
8<h1 metal:fill-slot="content-header"
9 i18n:translate="">Subgroups Timetable</h1>
10
11<metal:block metal:fill-slot="body">
12
13 <h1 tal:condition="view/error_message"
14 tal:content="view/error_message" />
15
16 <table tal:condition="not: view/error_message" class="teachers_timetable">
17 <tr>
18 <th class="heading odd"></th>
19 <th class="heading odd"></th>
20 <th tal:repeat="day view/days" class="heading_left odd"
21 tal:content="day/text"
22 tal:attributes="colspan day/span" />
23 </tr>
24
25 <tr>
26 <th class="heading odd" i18n:translate="">Subgroup</th>
27 <th class="heading odd" i18n:translate="">Teacher</th>
28 <tal:block repeat="day view/days">
29 <th tal:repeat="period day/periods"
30 tal:attributes="class period/class"
31 tal:content="period/value" />
32 </tal:block>
33 </tr>
34
35 <tal:block repeat="row view/rows">
36 <tr>
37 <td tal:attributes="class row/class">
38 <span tal:content="row/name" />
39 </td>
40 <td tal:attributes="class row/class">
41 <span tal:content="row/teacher" />
42 </td>
43 <tal:block repeat="day row/days">
44 <td tal:repeat="period day"
45 tal:attributes="class period/class"
46 tal:content="period/value" />
47 </tal:block>
48 </tr>
49 </tal:block>
50
51 </table>
52
53</metal:block>
54</body>
55</html>
056
=== added file 'src/schooltool/zambia/app/browser/templates/subgroups_timetable_pdf.pt'
--- src/schooltool/zambia/app/browser/templates/subgroups_timetable_pdf.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/zambia/app/browser/templates/subgroups_timetable_pdf.pt 2010-09-26 22:01:04 +0000
@@ -0,0 +1,88 @@
1<?xml version="1.0" standalone="no" ?>
2<!DOCTYPE document SYSTEM "rml_1_0.dtd" [
3 <!ENTITY pound "&#xA3;">
4 <!ENTITY nbsp "&#160;">
5]>
6
7<document
8 xmlns:tal="http://xml.zope.org/namespaces/tal"
9 xmlns:metal="http://xml.zope.org/namespaces/metal"
10 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
11 metal:use-macro="context/@@rml_macros/report"
12 i18n:domain="schooltool.zambia">
13
14<metal:block fill-slot="page_templates">
15 <tal:block content="structure view/use_template/default" />
16</metal:block>
17
18<stylesheet>
19 <metal:block fill-slot="extra_initialize">
20 </metal:block>
21 <metal:block fill-slot="stylesheet">
22
23 <paraStyle
24 name="heading"
25 fontName="Arial_Bold"
26 fontSize="9"
27 alignment="center"
28 leading="12"/>
29
30 <paraStyle
31 name="cell"
32 fontName="Arial_Normal"
33 fontSize="6"
34 alignment="center"
35 leading="7"/>
36
37 <blockTableStyle id="headings_table">
38 <blockValign value="middle" start="0,0" stop="0,-1"/>
39 </blockTableStyle>
40
41 <blockTableStyle id="grid">
42 <lineStyle kind="OUTLINE"
43 colorName="black" thickness="0.25"
44 start="0,0" stop="-1,-1" />
45 <lineStyle kind="INNERGRID"
46 colorName="black" thickness="0.25"
47 start="0,0" stop="-1,-1" />
48 <blockValign value="middle" start="0,0" stop="0,-1"/>
49 </blockTableStyle>
50 </metal:block>
51</stylesheet>
52
53<story metal:fill-slot="story">
54
55 <blockTable style="headings_table"
56 tal:attributes="colWidths view/heading_widths1"
57 alignment="left">
58 <tr>
59 <td tal:repeat="heading view/headings1">
60 <para style="heading" tal:content="heading" />
61 </td>
62 </tr>
63 </blockTable>
64
65 <blockTable style="grid"
66 tal:attributes="colWidths view/heading_widths2"
67 alignment="left">
68 <tr>
69 <td tal:repeat="heading view/headings2" vAlign="middle">
70 <para style="heading" tal:content="heading" />
71 </td>
72 </tr>
73 </blockTable>
74
75 <blockTable style="grid"
76 tal:attributes="colWidths view/heading_widths2;
77 rowHeights view/row_heights"
78 alignment="left">
79 <tr tal:repeat="row view/pdf_rows">
80 <td tal:repeat="cell row" vAlign="middle">
81 <para style="cell" tal:content="cell" />
82 </td>
83 </tr>
84 </blockTable>
85
86</story>
87
88</document>
089
=== modified file 'src/schooltool/zambia/app/browser/templates/teachers_timetable.pt'
--- src/schooltool/zambia/app/browser/templates/teachers_timetable.pt 2010-08-08 18:28:59 +0000
+++ src/schooltool/zambia/app/browser/templates/teachers_timetable.pt 2010-09-26 22:01:04 +0000
@@ -23,13 +23,13 @@
23 </tr>23 </tr>
2424
25 <tr>25 <tr>
26 <th class="heading odd">Teacher</th>26 <th class="heading odd" i18n:translate="">Teacher</th>
27 <tal:block repeat="day view/days">27 <tal:block repeat="day view/days">
28 <th tal:repeat="period day/periods"28 <th tal:repeat="period day/periods"
29 tal:attributes="class period/class"29 tal:attributes="class period/class"
30 tal:content="period/value" />30 tal:content="period/value" />
31 </tal:block>31 </tal:block>
32 <th class="heading_left odd">Periods</th>32 <th class="heading_left odd" i18n:translate="">Periods</th>
33 </tr>33 </tr>
3434
35 <tal:block repeat="row view/rows">35 <tal:block repeat="row view/rows">
3636
=== added file 'src/schooltool/zambia/app/browser/templates/teachers_timetable_pdf.pt'
--- src/schooltool/zambia/app/browser/templates/teachers_timetable_pdf.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/zambia/app/browser/templates/teachers_timetable_pdf.pt 2010-09-26 22:01:04 +0000
@@ -0,0 +1,88 @@
1<?xml version="1.0" standalone="no" ?>
2<!DOCTYPE document SYSTEM "rml_1_0.dtd" [
3 <!ENTITY pound "&#xA3;">
4 <!ENTITY nbsp "&#160;">
5]>
6
7<document
8 xmlns:tal="http://xml.zope.org/namespaces/tal"
9 xmlns:metal="http://xml.zope.org/namespaces/metal"
10 xmlns:i18n="http://xml.zope.org/namespaces/i18n"
11 metal:use-macro="context/@@rml_macros/report"
12 i18n:domain="schooltool.zambia">
13
14<metal:block fill-slot="page_templates">
15 <tal:block content="structure view/use_template/default" />
16</metal:block>
17
18<stylesheet>
19 <metal:block fill-slot="extra_initialize">
20 </metal:block>
21 <metal:block fill-slot="stylesheet">
22
23 <paraStyle
24 name="heading"
25 fontName="Arial_Bold"
26 fontSize="9"
27 alignment="center"
28 leading="12"/>
29
30 <paraStyle
31 name="cell"
32 fontName="Arial_Normal"
33 fontSize="6"
34 alignment="center"
35 leading="7"/>
36
37 <blockTableStyle id="headings_table">
38 <blockValign value="top" start="0,0" stop="0,-1"/>
39 </blockTableStyle>
40
41 <blockTableStyle id="grid">
42 <lineStyle kind="OUTLINE"
43 colorName="black" thickness="0.25"
44 start="0,0" stop="-1,-1" />
45 <lineStyle kind="INNERGRID"
46 colorName="black" thickness="0.25"
47 start="0,0" stop="-1,-1" />
48 <blockValign value="top" start="0,0" stop="0,-1"/>
49 </blockTableStyle>
50 </metal:block>
51</stylesheet>
52
53<story metal:fill-slot="story">
54
55 <blockTable style="headings_table"
56 tal:attributes="colWidths view/heading_widths1"
57 alignment="left">
58 <tr>
59 <td tal:repeat="heading view/headings1">
60 <para style="heading" tal:content="heading" />
61 </td>
62 </tr>
63 </blockTable>
64
65 <blockTable style="grid"
66 tal:attributes="colWidths view/heading_widths2"
67 alignment="left">
68 <tr>
69 <td tal:repeat="heading view/headings2">
70 <para style="heading" tal:content="heading" />
71 </td>
72 </tr>
73 </blockTable>
74
75 <blockTable style="grid"
76 tal:attributes="colWidths view/heading_widths2;
77 rowHeights view/row_heights"
78 alignment="left">
79 <tr tal:repeat="row view/pdf_rows">
80 <td tal:repeat="cell row" vAlign="middle">
81 <para style="cell" tal:content="cell" />
82 </td>
83 </tr>
84 </blockTable>
85
86</story>
87
88</document>

Subscribers

People subscribed via source and target branches