|
- # -*- coding: utf8 -*-
- from pyramid.httpexceptions import HTTPNotFound
- from pyramid.response import Response
- import cStringIO as StringIO
- from pyramid.view import view_config
- from .models import User
- from reportlab.pdfgen import canvas
- from reportlab.pdfbase import pdfmetrics
- from reportlab.pdfbase.ttfonts import TTFont
- from reportlab.lib.units import mm
- import qrcode
- import subprocess
- from .upload import MediaPath
-
- # Create PDF container
- EXPIRATION_TIME = 300 # seconds
- WIDTH = 85 * mm
- HEIGHT = 60 * mm
- ICONSIZE = 9 * mm
-
- def Ribbon35(DispUser, canvas):
- canvas.saveState()
- canvas.rotate(35)
- offset_u=0
- if DispUser.Staff:
- # Staff
- canvas.setFillColorRGB(1,.2,.2)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 20)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+5, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- canvas.setFillColorRGB(.3,.3,1)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 15)
- canvas.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+10, "Intervenant")
- else:
- # Visiteur
- canvas.setFillColorRGB(.8,.8,.8)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(0,0,0)
- canvas.setFont('Liberation', 12)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+7, "Visiteur")
- canvas.restoreState()
- return canvas
-
- def Ribbon45(DispUser, canvas):
- canvas.saveState()
- canvas.rotate(45)
- offset_u=0
- if DispUser.Staff:
- # Staff
- canvas.setFillColorRGB(1,.2,.2)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 20)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+5, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- canvas.setFillColorRGB(.3,.3,1)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 15)
- canvas.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+10, "Intervenant")
- else:
- # Visiteur
- canvas.setFillColorRGB(.8,.8,.8)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(0,0,0)
- canvas.setFont('Liberation', 12)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+7, "Visiteur")
- canvas.restoreState()
- return canvas
-
- def Ribbon90(DispUser, canvas):
- canvas.saveState()
- canvas.rotate(90)
- offset_u=0
- if DispUser.Staff:
- # Staff
- canvas.setFillColorRGB(1,.2,.2)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 20)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+5, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- canvas.setFillColorRGB(.3,.3,1)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(1,1,1)
- canvas.setFont('Liberation', 15)
- canvas.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+10, "Intervenant")
- else:
- # Visiteur
- canvas.setFillColorRGB(.8,.8,.8)
- canvas.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- canvas.setFillColorRGB(0,0,0)
- canvas.setFont('Liberation', 12)
- canvas.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+7, "Visiteur")
- canvas.restoreState()
- return canvas
-
- def JM2L_Logo(canvas, Position="Up"):
- # Import font
- ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
- pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
-
- if Position=="Up":
- logoobject = canvas.beginText()
- logoobject.setFont('Logo', 52)
- logoobject.setFillColorRGB(.83,0,.33)
- logoobject.setTextOrigin(55, HEIGHT-50)
- logoobject.textLines("JM2L")
- canvas.drawText(logoobject)
-
- yearobject = canvas.beginText()
- yearobject.setFont("Helvetica-Bold", 15)
- yearobject.setFillColorRGB(1,1,1)
- yearobject.setTextOrigin(67, HEIGHT-20)
- yearobject.setWordSpace(21)
- yearobject.textLines("2 0 1 5")
- canvas.drawText(yearobject)
- elif Position=="Down":
- logoobject = canvas.beginText()
- logoobject.setFont('Logo', 32)
- logoobject.setFillColorRGB(.83,0,.33)
- logoobject.setTextOrigin(2, 17)
- logoobject.textLines("JM2L")
- canvas.drawText(logoobject)
-
- yearobject = canvas.beginText()
- yearobject.setFont("Helvetica-Bold", 10)
- yearobject.setFillColorRGB(1,1,1)
- #yearobject.setLineWidth(.1)
- #yearobject.setStrokeColorRGB(.5,.5,.5)
- yearobject.setTextRenderMode(0)
- #yearobject.setStrokeOverprint(.2)
- yearobject.setTextOrigin(9 , 35)
- yearobject.setWordSpace(13)
- yearobject.textLines("2 0 1 5")
- canvas.drawText(yearobject)
-
- def Tiers_Logo(canvas, DispUser, StartPos=None):
- Border = 0
- if StartPos is None:
- StartPos = ( 30 * mm, 2 )
- StartX, StartY = StartPos
- MaxX, MaxY = 34*mm, 18*mm
- num = 0
- canvas.setStrokeColorRGB(0.5,0.5,0.5)
- Logos = filter(lambda x:x.ThumbLinks, DispUser.tiers)[:3]
- # Should We compute a better positionning for logos ?
- DicPos = {}
- DicPos[1] = { 0:(1./2, 1./2) }
- DicPos[2] = { 0:(1./3, 1./2), 1:(2./3, 1./2) }
- DicPos[3] = { 0:(1./2, 1./4), 1:(1./3, 3./4), 2:(2./3, 3./4) }
- DicPos[4] = { 0:(1./3, 1./4), 1:(2./3, 1./4), 2:(1./3, 3./4),
- 3:(2./3, 3./4) }
- DicPos[5] = { 0:(1./3, 1./4), 1:(2./3, 1./4), 2:(1./6, 3./4),
- 3:(3./6, 3./4), 4:(5./6, 3./4) }
- DicPos[6] = { 0:(1./6, 1./4), 1:(3./6, 1./4), 2:(5./6, 1./4),
- 3:(1./6, 3./4), 4:(3./6, 3./4), 5:(5./6, 3./4) }
- DicPos[7] = { 0:(1./6, 1./4), 1:(3./6, 1./4), 2:(5./6, 1./4),
- 3:(1./8, 3./4), 4:(3./8, 3./4), 5:(5./8, 3./4),
- 6:(7./8, 3./4) }
- DicPos[8] = { 0:(1./8, 1./4), 1:(3./8, 1./4), 2:(5./8, 1./4),
- 3:(7./8, 1./4), 4:(1./8, 3./4), 5:(3./8, 3./4),
- 6:(5./8, 3./4), 7:(7./8, 3./4) }
- # draw overall border
- # canvas.roundRect(StartX, StartY, MaxX, MaxY, radius=2, stroke=True)
- for tiers in Logos:
- FileName = tiers.ThumbLinks.pop().split("/")[-1]
- ImagePath = "jm2l/upload/images/tiers/%s/%s" % (tiers.slug, FileName)
- PosX = StartX + DicPos[len(Logos)][num][0] * MaxX - (ICONSIZE+Border)/2
- PosY = StartY + DicPos[len(Logos)][num][1] * MaxY - (ICONSIZE+Border)/2
- canvas.setLineWidth(.1)
- canvas.drawImage(ImagePath,
- PosX, PosY, ICONSIZE, ICONSIZE,\
- preserveAspectRatio=True,
- anchor='c',
- mask='auto'
- )
- # draw icon border
- # canvas.roundRect(PosX, PosY, ICONSIZE, ICONSIZE, radius=2, stroke=True)
- num+=1
-
- def QRCode(DispUser):
- qr = qrcode.QRCode(
- version=1,
- error_correction=qrcode.constants.ERROR_CORRECT_L,
- box_size=10,
- border=2,
- )
- # Data of QR code
- qr.add_data('http://jm2l.linux-azur.org/user/%s' % DispUser.slug)
- qr.make(fit=True)
-
- return qr.make_image()
-
-
- @view_config(route_name='badge_user', http_cache = (EXPIRATION_TIME, {'public':True}))
- def badge_user(request):
- isoutpng = request.params.get('png')
- user_slug = request.matchdict.get('user_slug', None)
- if user_slug is None or len(user_slug)==0:
- raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu")
- # Query database
- DispUser = User.by_slug(user_slug)
- if DispUser is None:
- raise HTTPNotFound()
-
- # Ok let's generate a PDF Badge
-
- # Register LiberationMono font
- ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
- pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
-
- pdf = StringIO.StringIO()
- out_img = StringIO.StringIO()
-
- c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) )
- c.translate(mm, mm)
-
- # Feed some metadata
- c.setCreator("linux-azur.org")
- c.setTitle("Badge")
-
- c.saveState()
- # Logo on Top
- JM2L_Logo(c, "Down")
-
- if DispUser.Staff:
- # Staff
- c.setFillColorRGB(.83,0,.33)
- c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 30)
- c.drawCentredString(WIDTH/2, HEIGHT-26, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- c.setFillColorRGB(.21,.67,.78)
- c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 30)
- c.drawCentredString(WIDTH/2, HEIGHT-26, "Intervenant")
- else:
- # Visiteur
- c.setFillColorRGB(.8,.8,.8)
- c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 30)
- c.drawCentredString(WIDTH/2, HEIGHT-26, "Visiteur")
-
- c.restoreState()
-
- c.setFont('Liberation', 18)
- c.setStrokeColorRGB(0,0,0)
- c.setFillColorRGB(0,0,0)
- # Feed Name and SurName
- if len(DispUser.prenom) + len(DispUser.nom)>18:
- if DispUser.pseudo:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 0 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 8 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 4 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 8 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) )
-
- if DispUser.pseudo:
- c.setFont("Helvetica-Oblique", 18)
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 10 * mm , "%s" % DispUser.pseudo )
-
- # Put QR code to user profile
- c.drawInlineImage(QRCode(DispUser), \
- WIDTH - 20 * mm - 7, 0, \
- 20 * mm, 20 * mm, \
- preserveAspectRatio=True, \
- anchor='s')
-
- Tiers_Logo(c, DispUser)
-
- c.showPage()
- c.save()
- pdf.seek(0)
- if isoutpng:
- OutPDF = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.pdf')
- OutPNG = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.png')
- # Let's generate a png file for website
- with open( OutPDF ,'wb') as pdff:
- pdff.write(pdf.read())
-
- Command = ["convert","-density","150x150", OutPDF, OutPNG]
- subprocess.call(Command)
-
- with open( OutPNG, 'rb') as pngfile:
- out_img.write(pngfile.read())
-
- out_img.seek(0)
- return Response(app_iter=out_img, content_type = 'image/png' )
- else:
- return Response(app_iter=pdf, content_type = 'application/pdf' )
-
- @view_config(route_name='badge_user1')
- def badge_user1(request):
- user_slug = request.matchdict.get('user_slug', None)
- if user_slug is None or len(user_slug)==0:
- raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu")
- # Query database
- DispUser = User.by_slug(user_slug)
- if DispUser is None:
- raise HTTPNotFound()
-
- # Ok let's generate a PDF Badge
- ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
- ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
- pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
- pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
- pdf = StringIO.StringIO()
-
- c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) )
- c.translate(mm, mm)
-
- # Feed some metadata
- c.setCreator("linux-azur.org")
- c.setTitle("Badge")
-
- c.saveState()
-
- logoobject = c.beginText()
- logoobject.setFont('Logo', 52)
- logoobject.setFillColorRGB(.83,0,.33)
- logoobject.setTextOrigin(55, HEIGHT-50)
- logoobject.textLines("JM2L")
- c.drawText(logoobject)
-
-
- yearobject = c.beginText()
- yearobject.setFont("Helvetica-Bold", 15)
- yearobject.setFillColorRGB(1,1,1)
- yearobject.setTextOrigin(67, HEIGHT-20)
- yearobject.setWordSpace(21)
- yearobject.textLines("2 0 1 5")
- c.drawText(yearobject)
-
- Tiers_Logo(c, DispUser)
-
- if 1:
- Ribbon90(DispUser, c)
-
- if 0:
- c.rotate(90)
- offset_u=111
- if DispUser.Staff:
- # Staff
- c.setFillColorRGB(1,.2,.2)
- c.rect(-5, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 30)
- c.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+5, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- c.setFillColorRGB(.3,.3,1)
- c.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 15)
- c.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+10, "Intervenant")
- else:
- # Visiteur
- c.setFillColorRGB(.8,.8,.8)
- c.rect(-5, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(0,0,0)
- c.setFont('Liberation', 19)
- c.drawCentredString(WIDTH/2, HEIGHT/2-offset_u+7, "Visiteur")
- c.restoreState()
-
- c.setFont('Courier', 18)
- c.setStrokeColorRGB(0,0,0)
- c.setFillColorRGB(0,0,0)
- # Feed Name and SurName
- if len(DispUser.prenom) + len(DispUser.nom)>18:
- if DispUser.pseudo:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 4 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 2 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 2 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 6 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) )
- #c.drawCentredString(WIDTH/2, HEIGHT - 22 * mm, )
- if DispUser.pseudo:
- #c.setFont('Liberation', 14)
- c.setFont("Helvetica-Oblique", 14)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 8 * mm , "\"%s\"" % DispUser.pseudo )
- #c.restoreState()
-
- # Put QR code to user profile
- c.drawInlineImage(QRCode(DispUser), \
- WIDTH - 20 * mm - 7, 0, \
- 20 * mm, 20 * mm, \
- preserveAspectRatio=True, \
- anchor='s')
-
- c.showPage()
- c.save()
- pdf.seek(0)
- return Response(app_iter=pdf, content_type = 'application/pdf' )
-
-
- @view_config(route_name='badge_user2')
- def badge_user2(request):
- user_slug = request.matchdict.get('user_slug', None)
- if user_slug is None or len(user_slug)==0:
- raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu")
- # Query database
- DispUser = User.by_slug(user_slug)
- if DispUser is None:
- raise HTTPNotFound()
-
- # Ok let's generate a PDF Badge
- ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
- ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
- pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
- pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
- pdf = StringIO.StringIO()
-
- qr = qrcode.QRCode(
- version=1,
- error_correction=qrcode.constants.ERROR_CORRECT_L,
- box_size=10,
- border=2,
- )
- # Data of QR code
- qr.add_data('http://jm2l.linux-azur.org/user/%s' % DispUser.slug)
- qr.make(fit=True)
-
- img = qr.make_image()
- # Create PDF container
- WIDTH = 85 * mm
- HEIGHT = 60 * mm
- ICONSIZE = 10 * mm
- c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) )
- c.translate(mm, mm)
-
- # Feed some metadata
- c.setCreator("linux-azur.org")
- c.setTitle("Badge")
-
- c.saveState()
-
- logoobject = c.beginText()
- logoobject.setFont('Logo', 52)
- logoobject.setFillColorRGB(.83,0,.33)
- logoobject.setTextOrigin(55, HEIGHT-50)
- logoobject.textLines("JM2L")
- c.drawText(logoobject)
-
-
- yearobject = c.beginText()
- yearobject.setFont("Helvetica-Bold", 15)
- yearobject.setFillColorRGB(1,1,1)
- yearobject.setTextOrigin(67, HEIGHT-20)
- yearobject.setWordSpace(21)
- yearobject.textLines("2 0 1 5")
- c.drawText(yearobject)
-
- if 1:
- c.rotate(-35)
- c.translate(-100, -70)
- offset_u=0
- if DispUser.Staff:
- # Staff
- c.setFillColorRGB(1,.2,.2)
- c.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 20)
- c.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+5, "STAFF")
- elif DispUser.is_Intervenant:
- # Intervenant
- c.setFillColorRGB(.21,.3,1)
- c.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(1,1,1)
- c.setFont('Liberation', 15)
- c.drawCentredString(WIDTH/2-15, HEIGHT/2-offset_u+10, "Intervenant")
- else:
- # Visiteur
- c.setFillColorRGB(.8,.8,.8)
- c.rect(0, HEIGHT/2-offset_u, WIDTH, 10*mm, fill=1)
- c.setFillColorRGB(0,0,0)
- c.setFont('Liberation', 12)
- c.drawCentredString(WIDTH/2-10, HEIGHT/2-offset_u+7, "Visiteur")
-
- c.restoreState()
-
- c.setFont('Courier', 18)
- c.setStrokeColorRGB(0,0,0)
- c.setFillColorRGB(0,0,0)
- # Feed Name and SurName
- if len(DispUser.prenom) + len(DispUser.nom)>18:
- if DispUser.pseudo:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 4 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 2 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 2 * mm , "%s" % DispUser.prenom )
- c.setFont('Courier', 17)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 6 * mm , "%s" % DispUser.nom )
- else:
- c.drawCentredString(WIDTH/2, HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) )
- #c.drawCentredString(WIDTH/2, HEIGHT - 22 * mm, )
- if DispUser.pseudo:
- #c.setFont('Liberation', 14)
- c.setFont("Helvetica-Oblique", 14)
- c.drawCentredString(WIDTH/2, HEIGHT/2 - 8 * mm , "\"%s\"" % DispUser.pseudo )
- #c.restoreState()
- # Put Tiers logos
- Tiers_Logo(c, DispUser)
- # Put QR code to user profile
- c.drawInlineImage(img, WIDTH - 20 * mm - 7, 0, 20 * mm, 20 * mm, preserveAspectRatio=True, anchor='s')
-
- c.showPage()
- c.save()
- pdf.seek(0)
- return Response(app_iter=pdf, content_type = 'application/pdf' )
|