Le repo des sources pour le site web des JM2L
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 

135 linhas
4.7 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='place_print', http_cache = (EXPIRATION_TIME, {'public':True}))
  42. def place_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=(WIDTH, HEIGHT) )
  52. c.translate(mm, mm)
  53. # Feed some metadata
  54. c.setCreator("linux-azur.org")
  55. c.setTitle("Planning Salle")
  56. c.saveState()
  57. year = int(request.matchdict.get('year', CurrentYear))
  58. # Initialization
  59. # Compute days used by all events matching the specified input year
  60. place_used = DBSession.query(Event.salle_uid)\
  61. .filter(Event.for_year == year)\
  62. .filter(Event.event_type != 'Stand')\
  63. .group_by(Event.salle_uid)
  64. for place in place_used:
  65. place_uid = place[0]
  66. place_obj = Salles.by_id(place_uid)
  67. # Logo on Top
  68. JM2L_large_Logo(c)
  69. max_size = (WIDTH-110, HEIGHT-300)
  70. offset = (70, 90)
  71. c.setFillColorRGB(.5,.5,.5)
  72. c.setFont('Liberation', 40)
  73. c.drawCentredString(WIDTH/2, HEIGHT-190, place_obj.name, 1)
  74. c.setFont('Liberation', 35)
  75. c.drawCentredString(WIDTH/2, HEIGHT-145, place_obj.place_type, 0 )
  76. c.setFont('Helvetica', 20)
  77. c.drawCentredString(WIDTH/2, 55, place_obj.phy.name, 0)
  78. # Timetable container
  79. c.setLineWidth(.1)
  80. c.setLineCap(2)
  81. #c.setFillColorRGB(0,0,1)
  82. c.rect(offset[0], offset[1], max_size[0], max_size[1], fill=0, stroke=1)
  83. c.setLineWidth(.5)
  84. # create time mark
  85. c.setFillColorRGB(0,0,0)
  86. c.setFont('Helvetica', 10)
  87. for i in range(0,10):
  88. one_time_step(c, "%.2dh00" % (i+10), i, max_size, offset)
  89. c.setFont('Helvetica', 12)
  90. Events = DBSession.query(Event)\
  91. .filter(Event.for_year == year)\
  92. .filter(Event.salle_uid == place_uid)\
  93. .order_by(Event.start_time)
  94. for ev in Events:
  95. place_time(c, ev, max_size, offset)
  96. #c.rect(70, 50, WIDTH-100, HEIGHT-250, fill=0, stroke=1)
  97. c.showPage()
  98. c.save()
  99. pdf.seek(0)
  100. return Response(app_iter=pdf, content_type = 'application/pdf' )
  101. def place_time(c, ev, max_size, offset):
  102. max_x, max_y = max_size
  103. off_x, off_y = offset
  104. minute = max_y/(9*60)
  105. start_pos_y = ((int( ev.start_time.strftime('%H') )-10)*60 + int( ev.start_time.strftime('%M') )) * minute
  106. stop_pos_y = ((int( ev.end_time.strftime('%H') )-10)*60 + int( ev.end_time.strftime('%M') )) * minute
  107. c.setFillColorRGB(1,1,1)
  108. c.rect(offset[0], max_y + off_y - start_pos_y, max_size[0], start_pos_y-stop_pos_y, fill=1, stroke=1)
  109. c.setFillColorRGB(0,0,0)
  110. #c.drawString(off_x+5, max_y + off_y - 15 - start_pos_y, ev.start_time.strftime('%H:%M'), 0)
  111. c.drawCentredString(WIDTH/2, max_y + off_y - 35 - start_pos_y, ev.name, 0)
  112. intervs = ','.join( [x.slug for x in ev.intervenants] )
  113. c.drawString(WIDTH/2, max_y + off_y - 45 - start_pos_y, intervs, 0)