|
- # -*- coding: utf8 -*-
- import io
- from pyramid.response import Response
- from pyramid.view import view_config
- from .models import DBSession, Event, Salles
- from reportlab.pdfgen import canvas
- from reportlab.pdfbase import pdfmetrics
- from reportlab.pdfbase.ttfonts import TTFont
- from reportlab.lib.units import mm
- from .upload import MediaPath
- from jm2l.const import CurrentYear
-
- # Create PDF container
- EXPIRATION_TIME = 300 # seconds
- WIDTH = 210 * mm
- HEIGHT = 297 * mm
- ICONSIZE = 10 * mm
-
-
- def JM2L_large_Logo(canvas, Offset=(0, 0)):
- OffX, OffY = Offset
-
- canvas.setFont('Logo', 110)
- canvas.setFillColorRGB(.83, 0, .33)
- canvas.drawCentredString(WIDTH / 2 - OffY, HEIGHT - 100 - OffX, "JM2L")
-
- canvas.setFont("Helvetica-Bold", 30)
- year_object = canvas.beginText()
- year_object.setFillColorRGB(1, 1, 1)
- year_object.setTextRenderMode(0)
- year_object.setTextOrigin(WIDTH / 2 - OffY - 120, HEIGHT - 36 - OffX)
- year_object.setWordSpace(48)
- year_object.textLines("2 0 1 5")
- year_object.setWordSpace(1)
- canvas.drawText(year_object)
-
-
- def one_time_step(canvas, str, hour, max_size, offset):
- max_x, max_y = max_size
- off_x, off_y = offset
- step_y = max_y / 9
- half_step = step_y / 2
- canvas.drawCentredString(off_x - 30, max_y - step_y * hour + off_y - 3, str)
- hour_place = step_y * hour + off_y
- canvas.line(off_x - 5, hour_place, off_x, hour_place)
- if hour < 9:
- canvas.line(off_x - 2, hour_place + half_step, off_x, hour_place + half_step)
-
-
- @view_config(route_name='stand_print', http_cache=(EXPIRATION_TIME, {'public': True}))
- def stand_print(request):
- # Ok let's generate a print for place schedule
-
- # Register LiberationMono font
- ttf_file = "jm2l/static/fonts/LiberationMono-Regular.ttf"
- pdfmetrics.registerFont(TTFont("Liberation", ttf_file))
- # Import font
- ttf_file_logo = "jm2l/static/fonts/PWTinselLetters.ttf"
- pdfmetrics.registerFont(TTFont("Logo", ttf_file_logo))
-
- pdf = io.BytesIO()
-
- c = canvas.Canvas(pdf, pagesize=(HEIGHT, WIDTH))
- c.translate(mm, mm)
-
- # Feed some metadata
- c.setCreator("linux-azur.org")
- c.setTitle("Affiches stand")
-
- c.saveState()
-
- year = int(request.matchdict.get('year', CurrentYear))
-
- Events = DBSession.query(Event) \
- .filter(Event.for_year == year) \
- .filter(Event.event_type == "Stand")
-
- for ev in Events:
- c.setFont('Logo', 50)
- c.setFillColorRGB(.5, .5, .5)
- c.drawString(HEIGHT - 150, 30, "JM2L")
- c.setFont('Logo', 100)
- c.setFillColorRGB(0.5, 0.5, 0.5)
- c.drawCentredString(HEIGHT / 2, WIDTH - 90, "STAND", 0)
- c.setFillColorRGB(0, 0, 0)
- c.setFont('Helvetica', 42)
- c.drawCentredString(HEIGHT / 2, WIDTH / 2, ev.name, 0)
- c.showPage()
-
- c.save()
- pdf.seek(0)
-
- return Response(app_iter=pdf, content_type='application/pdf')
-
-
- @view_config(route_name='place_print', http_cache=(EXPIRATION_TIME, {'public': True}))
- def place_print(request):
- # Ok let's generate a print for place schedule
-
- # Register LiberationMono font
- ttf_file = "jm2l/static/fonts/LiberationMono-Regular.ttf"
- pdfmetrics.registerFont(TTFont("Liberation", ttf_file))
- # Import font
- ttf_file_logo = "jm2l/static/fonts/PWTinselLetters.ttf"
- pdfmetrics.registerFont(TTFont("Logo", ttf_file_logo))
-
- pdf = io.BytesIO()
-
- c = canvas.Canvas(pdf, pagesize=(WIDTH, HEIGHT))
- c.translate(mm, mm)
-
- # Feed some metadata
- c.setCreator("linux-azur.org")
- c.setTitle("Planning Salle")
-
- c.saveState()
-
- year = int(request.matchdict.get('year', CurrentYear))
- # Initialization
- # Compute days used by all events matching the specified input year
- place_used = DBSession.query(Event.salle_uid) \
- .filter(Event.for_year == year) \
- .filter(Event.event_type != 'Stand') \
- .group_by(Event.salle_uid)
-
- for place in place_used:
- place_uid = place[0]
- place_obj = Salles.by_id(place_uid)
- # Logo on Top
- JM2L_large_Logo(c)
- max_size = (WIDTH - 110, HEIGHT - 300)
- offset = (70, 90)
- c.setFillColorRGB(.5, .5, .5)
- c.setFont('Liberation', 40)
- c.drawCentredString(WIDTH / 2, HEIGHT - 190, place_obj.name, 1)
- c.setFont('Liberation', 35)
- c.drawCentredString(WIDTH / 2, HEIGHT - 145, place_obj.place_type, 0)
- c.setFont('Helvetica', 20)
- c.drawCentredString(WIDTH / 2, 55, place_obj.phy.name, 0)
-
- # Timetable container
- c.setLineWidth(.1)
- c.setLineCap(2)
- # c.setFillColorRGB(0,0,1)
- c.rect(offset[0], offset[1], max_size[0], max_size[1], fill=0, stroke=1)
- c.setLineWidth(.5)
- # create time mark
- c.setFillColorRGB(0, 0, 0)
- c.setFont('Helvetica', 10)
- for i in range(0, 10):
- one_time_step(c, "%.2dh00" % (i + 10), i, max_size, offset)
-
- # c.setFont('Helvetica', 12)
- Events = DBSession.query(Event) \
- .filter(Event.for_year == year) \
- .filter(Event.salle_uid == place_uid) \
- .order_by(Event.start_time)
- for ev in Events:
- place_time(c, ev, max_size, offset)
- # c.rect(70, 50, WIDTH-100, HEIGHT-250, fill=0, stroke=1)
- c.showPage()
-
- c.save()
- pdf.seek(0)
-
- return Response(app_iter=pdf, content_type='application/pdf')
-
-
- def place_time(c, ev, max_size, offset):
- max_x, max_y = max_size
- off_x, off_y = offset
- minute = max_y / (9 * 60)
- start_pos_y = ((int(ev.start_time.strftime('%H')) - 10) * 60 + int(ev.start_time.strftime('%M'))) * minute
- stop_pos_y = ((int(ev.end_time.strftime('%H')) - 10) * 60 + int(ev.end_time.strftime('%M'))) * minute
-
- c.setFillColorRGB(0.98, 0.98, 0.98)
- c.rect(offset[0], max_y + off_y - start_pos_y, max_size[0], start_pos_y - stop_pos_y, fill=1, stroke=1)
- c.setFillColorRGB(0, 0, 0)
- # c.drawString(off_x+5, max_y + off_y - 15 - start_pos_y, ev.start_time.strftime('%H:%M'), 0)
- c.setFont('Helvetica', 12)
- c.drawCentredString(WIDTH / 2, max_y + off_y - 35 - start_pos_y, ev.name, 0)
- intervs = ', '.join([x.slug for x in ev.intervenants])
- c.setFont('Helvetica', 10)
- c.drawCentredString(WIDTH / 2, max_y + off_y - 55 - start_pos_y, intervs, 0)
|