Le repo des sources pour le site web des JM2L
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

184 行
6.2 KiB

  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. CurrentYear = 2015
  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)