Le repo des sources pour le site web des JM2L
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

187 lines
6.3 KiB

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