Le repo des sources pour le site web des JM2L
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

to_print.py 6.2 KiB

vor 9 Jahren
vor 9 Jahren
vor 9 Jahren
vor 9 Jahren
vor 9 Jahren
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. # -*- coding: utf8 -*-
  2. from pyramid.response import Response
  3. import cStringIO as StringIO
  4. from pyramid.view import view_config
  5. from .models import DBSession, Event, Salles
  6. from reportlab.pdfgen import canvas
  7. from reportlab.pdfbase import pdfmetrics
  8. from reportlab.pdfbase.ttfonts import TTFont
  9. from reportlab.lib.units import mm
  10. from .upload import MediaPath
  11. from jm2l.const import CurrentYear
  12. # Create PDF container
  13. EXPIRATION_TIME = 300 # seconds
  14. WIDTH = 210 * mm
  15. HEIGHT = 297 * mm
  16. ICONSIZE = 10 * mm
  17. def JM2L_large_Logo(canvas, Offset=(0,0)):
  18. OffX, OffY = Offset
  19. canvas.setFont('Logo', 110)
  20. canvas.setFillColorRGB(.83,0,.33)
  21. canvas.drawCentredString(WIDTH/2-OffY, HEIGHT-100-OffX, "JM2L")
  22. canvas.setFont("Helvetica-Bold", 30)
  23. yearobject = canvas.beginText()
  24. yearobject.setFillColorRGB(1,1,1)
  25. yearobject.setTextRenderMode(0)
  26. yearobject.setTextOrigin(WIDTH/2-OffY-120, HEIGHT-36-OffX)
  27. yearobject.setWordSpace(48)
  28. yearobject.textLines("2 0 1 5")
  29. yearobject.setWordSpace(1)
  30. canvas.drawText(yearobject)
  31. def one_time_step(canvas, str, hour, max_size, offset):
  32. max_x, max_y = max_size
  33. off_x, off_y = offset
  34. step_y = max_y/9
  35. half_step = step_y/2
  36. canvas.drawCentredString(off_x-30, max_y-step_y*hour+off_y-3, str)
  37. hour_place = step_y*hour+off_y
  38. canvas.line(off_x-5, hour_place, off_x, hour_place)
  39. if hour<9:
  40. canvas.line(off_x-2, hour_place+half_step, off_x, hour_place+half_step)
  41. @view_config(route_name='stand_print', http_cache = (EXPIRATION_TIME, {'public':True}))
  42. def stand_print(request):
  43. # Ok let's generate a print for place schedule
  44. # Register LiberationMono font
  45. ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
  46. pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
  47. # Import font
  48. ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
  49. pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
  50. pdf = StringIO.StringIO()
  51. c = canvas.Canvas( pdf, pagesize=(HEIGHT, WIDTH) )
  52. c.translate(mm, mm)
  53. # Feed some metadata
  54. c.setCreator("linux-azur.org")
  55. c.setTitle("Affiches stand")
  56. c.saveState()
  57. year = int(request.matchdict.get('year', CurrentYear))
  58. Events = DBSession.query(Event)\
  59. .filter(Event.for_year == year)\
  60. .filter(Event.event_type == "Stand")
  61. for ev in Events:
  62. c.setFont('Logo', 50)
  63. c.setFillColorRGB(.5,.5,.5)
  64. c.drawString(HEIGHT-150, 30, "JM2L")
  65. c.setFont('Logo', 100)
  66. c.setFillColorRGB(0.5,0.5,0.5)
  67. c.drawCentredString(HEIGHT/2, WIDTH-90, "STAND", 0)
  68. c.setFillColorRGB(0,0,0)
  69. c.setFont('Helvetica', 42)
  70. c.drawCentredString(HEIGHT/2, WIDTH/2, ev.name, 0)
  71. c.showPage()
  72. c.save()
  73. pdf.seek(0)
  74. return Response(app_iter=pdf, content_type = 'application/pdf' )
  75. @view_config(route_name='place_print', http_cache = (EXPIRATION_TIME, {'public':True}))
  76. def place_print(request):
  77. # Ok let's generate a print for place schedule
  78. # Register LiberationMono font
  79. ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
  80. pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
  81. # Import font
  82. ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
  83. pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
  84. pdf = StringIO.StringIO()
  85. c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) )
  86. c.translate(mm, mm)
  87. # Feed some metadata
  88. c.setCreator("linux-azur.org")
  89. c.setTitle("Planning Salle")
  90. c.saveState()
  91. year = int(request.matchdict.get('year', CurrentYear))
  92. # Initialization
  93. # Compute days used by all events matching the specified input year
  94. place_used = DBSession.query(Event.salle_uid)\
  95. .filter(Event.for_year == year)\
  96. .filter(Event.event_type != 'Stand')\
  97. .group_by(Event.salle_uid)
  98. for place in place_used:
  99. place_uid = place[0]
  100. place_obj = Salles.by_id(place_uid)
  101. # Logo on Top
  102. JM2L_large_Logo(c)
  103. max_size = (WIDTH-110, HEIGHT-300)
  104. offset = (70, 90)
  105. c.setFillColorRGB(.5,.5,.5)
  106. c.setFont('Liberation', 40)
  107. c.drawCentredString(WIDTH/2, HEIGHT-190, place_obj.name, 1)
  108. c.setFont('Liberation', 35)
  109. c.drawCentredString(WIDTH/2, HEIGHT-145, place_obj.place_type, 0 )
  110. c.setFont('Helvetica', 20)
  111. c.drawCentredString(WIDTH/2, 55, place_obj.phy.name, 0)
  112. # Timetable container
  113. c.setLineWidth(.1)
  114. c.setLineCap(2)
  115. #c.setFillColorRGB(0,0,1)
  116. c.rect(offset[0], offset[1], max_size[0], max_size[1], fill=0, stroke=1)
  117. c.setLineWidth(.5)
  118. # create time mark
  119. c.setFillColorRGB(0,0,0)
  120. c.setFont('Helvetica', 10)
  121. for i in range(0,10):
  122. one_time_step(c, "%.2dh00" % (i+10), i, max_size, offset)
  123. #c.setFont('Helvetica', 12)
  124. Events = DBSession.query(Event)\
  125. .filter(Event.for_year == year)\
  126. .filter(Event.salle_uid == place_uid)\
  127. .order_by(Event.start_time)
  128. for ev in Events:
  129. place_time(c, ev, max_size, offset)
  130. #c.rect(70, 50, WIDTH-100, HEIGHT-250, fill=0, stroke=1)
  131. c.showPage()
  132. c.save()
  133. pdf.seek(0)
  134. return Response(app_iter=pdf, content_type = 'application/pdf' )
  135. def place_time(c, ev, max_size, offset):
  136. max_x, max_y = max_size
  137. off_x, off_y = offset
  138. minute = max_y/(9*60)
  139. start_pos_y = ((int( ev.start_time.strftime('%H') )-10)*60 + int( ev.start_time.strftime('%M') )) * minute
  140. stop_pos_y = ((int( ev.end_time.strftime('%H') )-10)*60 + int( ev.end_time.strftime('%M') )) * minute
  141. c.setFillColorRGB(0.98,0.98,0.98)
  142. c.rect(offset[0], max_y + off_y - start_pos_y, max_size[0], start_pos_y-stop_pos_y, fill=1, stroke=1)
  143. c.setFillColorRGB(0,0,0)
  144. #c.drawString(off_x+5, max_y + off_y - 15 - start_pos_y, ev.start_time.strftime('%H:%M'), 0)
  145. c.setFont('Helvetica', 12)
  146. c.drawCentredString(WIDTH/2, max_y + off_y - 35 - start_pos_y, ev.name, 0)
  147. intervs = ', '.join( [x.slug for x in ev.intervenants] )
  148. c.setFont('Helvetica', 10)
  149. c.drawCentredString(WIDTH/2, max_y + off_y - 55 - start_pos_y, intervs, 0)