|
@@ -1,9 +1,9 @@ |
|
|
# -*- coding: utf8 -*- |
|
|
# -*- coding: utf8 -*- |
|
|
from pyramid.httpexceptions import HTTPNotFound |
|
|
|
|
|
|
|
|
from pyramid.httpexceptions import HTTPNotFound, HTTPForbidden |
|
|
from pyramid.response import Response |
|
|
from pyramid.response import Response |
|
|
import cStringIO as StringIO |
|
|
import cStringIO as StringIO |
|
|
from pyramid.view import view_config |
|
|
from pyramid.view import view_config |
|
|
from .models import User |
|
|
|
|
|
|
|
|
from .models import DBSession, User |
|
|
from reportlab.pdfgen import canvas |
|
|
from reportlab.pdfgen import canvas |
|
|
from reportlab.pdfbase import pdfmetrics |
|
|
from reportlab.pdfbase import pdfmetrics |
|
|
from reportlab.pdfbase.ttfonts import TTFont |
|
|
from reportlab.pdfbase.ttfonts import TTFont |
|
@@ -11,12 +11,11 @@ from reportlab.lib.units import mm |
|
|
import qrcode |
|
|
import qrcode |
|
|
import subprocess |
|
|
import subprocess |
|
|
from .upload import MediaPath |
|
|
from .upload import MediaPath |
|
|
|
|
|
|
|
|
# Create PDF container |
|
|
# Create PDF container |
|
|
EXPIRATION_TIME = 300 # seconds |
|
|
EXPIRATION_TIME = 300 # seconds |
|
|
WIDTH = 85 * mm |
|
|
WIDTH = 85 * mm |
|
|
HEIGHT = 60 * mm |
|
|
HEIGHT = 60 * mm |
|
|
ICONSIZE = 9 * mm |
|
|
|
|
|
|
|
|
ICONSIZE = 10 * mm |
|
|
|
|
|
|
|
|
def Ribbon35(DispUser, canvas): |
|
|
def Ribbon35(DispUser, canvas): |
|
|
canvas.saveState() |
|
|
canvas.saveState() |
|
@@ -102,48 +101,27 @@ def Ribbon90(DispUser, canvas): |
|
|
canvas.restoreState() |
|
|
canvas.restoreState() |
|
|
return canvas |
|
|
return canvas |
|
|
|
|
|
|
|
|
def JM2L_Logo(canvas, Position="Up"): |
|
|
|
|
|
# Import font |
|
|
|
|
|
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" |
|
|
|
|
|
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) |
|
|
|
|
|
|
|
|
def JM2L_Logo(canvas, Offset=(0,0)): |
|
|
|
|
|
OffX, OffY = Offset |
|
|
|
|
|
logoobject = canvas.beginText() |
|
|
|
|
|
logoobject.setFont('Logo', 32) |
|
|
|
|
|
logoobject.setFillColorRGB(.83,0,.33) |
|
|
|
|
|
logoobject.setTextOrigin(OffX+5, OffY+17) |
|
|
|
|
|
logoobject.textLines("JM2L") |
|
|
|
|
|
canvas.drawText(logoobject) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
yearobject = canvas.beginText() |
|
|
|
|
|
yearobject.setFont("Helvetica-Bold", 10) |
|
|
|
|
|
yearobject.setFillColorRGB(1,1,1) |
|
|
|
|
|
yearobject.setTextRenderMode(0) |
|
|
|
|
|
yearobject.setTextOrigin(OffX+12 , OffY+35) |
|
|
|
|
|
yearobject.setWordSpace(13) |
|
|
|
|
|
yearobject.textLines("2 0 1 5") |
|
|
|
|
|
canvas.drawText(yearobject) |
|
|
|
|
|
|
|
|
def Tiers_Logo(canvas, DispUser, StartPos=None): |
|
|
|
|
|
|
|
|
def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0,0)): |
|
|
Border = 0 |
|
|
Border = 0 |
|
|
|
|
|
OffX, OffY = Offset |
|
|
if StartPos is None: |
|
|
if StartPos is None: |
|
|
StartPos = ( 30 * mm, 2 ) |
|
|
StartPos = ( 30 * mm, 2 ) |
|
|
StartX, StartY = StartPos |
|
|
StartX, StartY = StartPos |
|
@@ -173,11 +151,15 @@ def Tiers_Logo(canvas, DispUser, StartPos=None): |
|
|
for tiers in Logos: |
|
|
for tiers in Logos: |
|
|
FileName = tiers.ThumbLinks.pop().split("/")[-1] |
|
|
FileName = tiers.ThumbLinks.pop().split("/")[-1] |
|
|
ImagePath = "jm2l/upload/images/tiers/%s/%s" % (tiers.slug, FileName) |
|
|
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 |
|
|
|
|
|
|
|
|
PosX = OffX+StartX + DicPos[len(Logos)][num][0] * MaxX - (ICONSIZE+Border)/2 |
|
|
|
|
|
PosY = OffY+StartY + DicPos[len(Logos)][num][1] * MaxY - (ICONSIZE+Border)/2 |
|
|
canvas.setLineWidth(.1) |
|
|
canvas.setLineWidth(.1) |
|
|
|
|
|
if len(Logos)>1: |
|
|
|
|
|
size = ICONSIZE |
|
|
|
|
|
else: |
|
|
|
|
|
size = ICONSIZE*1.5 |
|
|
canvas.drawImage(ImagePath, |
|
|
canvas.drawImage(ImagePath, |
|
|
PosX, PosY, ICONSIZE, ICONSIZE,\ |
|
|
|
|
|
|
|
|
PosX, PosY, size, size,\ |
|
|
preserveAspectRatio=True, |
|
|
preserveAspectRatio=True, |
|
|
anchor='c', |
|
|
anchor='c', |
|
|
mask='auto' |
|
|
mask='auto' |
|
@@ -199,59 +181,40 @@ def QRCode(DispUser): |
|
|
|
|
|
|
|
|
return qr.make_image() |
|
|
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() |
|
|
|
|
|
|
|
|
def one_badge(c, DispUser, Offset=(0,0)): |
|
|
# Logo on Top |
|
|
# Logo on Top |
|
|
JM2L_Logo(c, "Down") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JM2L_Logo(c, Offset) |
|
|
|
|
|
OffX, OffY = Offset |
|
|
|
|
|
|
|
|
|
|
|
c.rect(OffX-3, OffY-3, WIDTH+6, HEIGHT+6, fill=0, stroke=1) |
|
|
if DispUser.Staff: |
|
|
if DispUser.Staff: |
|
|
# Staff |
|
|
# Staff |
|
|
c.setFillColorRGB(.83,0,.33) |
|
|
c.setFillColorRGB(.83,0,.33) |
|
|
c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0) |
|
|
|
|
|
|
|
|
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFont('Liberation', 30) |
|
|
c.setFont('Liberation', 30) |
|
|
c.drawCentredString(WIDTH/2, HEIGHT-26, "STAFF") |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "STAFF") |
|
|
elif DispUser.is_Intervenant: |
|
|
elif DispUser.is_Intervenant: |
|
|
# Intervenant |
|
|
# Intervenant |
|
|
c.setFillColorRGB(.21,.67,.78) |
|
|
c.setFillColorRGB(.21,.67,.78) |
|
|
c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0) |
|
|
|
|
|
|
|
|
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFont('Liberation', 30) |
|
|
c.setFont('Liberation', 30) |
|
|
c.drawCentredString(WIDTH/2, HEIGHT-26, "Intervenant") |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Intervenant") |
|
|
|
|
|
elif DispUser.is_crew: |
|
|
|
|
|
# Benevole |
|
|
|
|
|
c.setFillColorRGB(.18,.76,.23) |
|
|
|
|
|
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0) |
|
|
|
|
|
c.setFillColorRGB(1,1,1) |
|
|
|
|
|
c.setFont('Liberation', 30) |
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Bénévole") |
|
|
else: |
|
|
else: |
|
|
# Visiteur |
|
|
# Visiteur |
|
|
c.setFillColorRGB(.8,.8,.8) |
|
|
c.setFillColorRGB(.8,.8,.8) |
|
|
c.rect(-3, HEIGHT-30, WIDTH, HEIGHT, fill=1, stroke=0) |
|
|
|
|
|
|
|
|
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFillColorRGB(1,1,1) |
|
|
c.setFont('Liberation', 30) |
|
|
c.setFont('Liberation', 30) |
|
|
c.drawCentredString(WIDTH/2, HEIGHT-26, "Visiteur") |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Visiteur") |
|
|
|
|
|
|
|
|
c.restoreState() |
|
|
c.restoreState() |
|
|
|
|
|
|
|
@@ -259,54 +222,35 @@ def badge_user(request): |
|
|
c.setStrokeColorRGB(0,0,0) |
|
|
c.setStrokeColorRGB(0,0,0) |
|
|
c.setFillColorRGB(0,0,0) |
|
|
c.setFillColorRGB(0,0,0) |
|
|
# Feed Name and SurName |
|
|
# Feed Name and SurName |
|
|
if len(DispUser.prenom) + len(DispUser.nom)>18: |
|
|
|
|
|
|
|
|
if DispUser.prenom and DispUser.nom and len(DispUser.prenom) + len(DispUser.nom)>18: |
|
|
if DispUser.pseudo: |
|
|
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 ) |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 0 * mm , "%s" % DispUser.prenom ) |
|
|
|
|
|
#c.setFont('Courier', 17) |
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 - 8 * mm , "%s" % DispUser.nom ) |
|
|
else: |
|
|
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 ) |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 4 * mm , "%s" % DispUser.prenom ) |
|
|
|
|
|
#c.setFont('Courier', 17) |
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 - 8 * mm , "%s" % DispUser.nom ) |
|
|
else: |
|
|
else: |
|
|
c.drawCentredString(WIDTH/2, HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) ) |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) ) |
|
|
|
|
|
|
|
|
if DispUser.pseudo: |
|
|
if DispUser.pseudo: |
|
|
c.setFont("Helvetica-Oblique", 18) |
|
|
c.setFont("Helvetica-Oblique", 18) |
|
|
c.drawCentredString(WIDTH/2, HEIGHT/2 + 10 * mm , "%s" % DispUser.pseudo ) |
|
|
|
|
|
|
|
|
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 10 * mm , "%s" % DispUser.pseudo ) |
|
|
|
|
|
|
|
|
# Put QR code to user profile |
|
|
# Put QR code to user profile |
|
|
c.drawInlineImage(QRCode(DispUser), \ |
|
|
c.drawInlineImage(QRCode(DispUser), \ |
|
|
WIDTH - 20 * mm - 7, 0, \ |
|
|
|
|
|
|
|
|
OffX+WIDTH - 20 * mm -5, OffY+5, \ |
|
|
20 * mm, 20 * mm, \ |
|
|
20 * mm, 20 * mm, \ |
|
|
preserveAspectRatio=True, \ |
|
|
preserveAspectRatio=True, \ |
|
|
anchor='s') |
|
|
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()) |
|
|
|
|
|
|
|
|
Tiers_Logo(c, DispUser, None, Offset) |
|
|
|
|
|
|
|
|
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): |
|
|
|
|
|
|
|
|
@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) |
|
|
user_slug = request.matchdict.get('user_slug', None) |
|
|
if user_slug is None or len(user_slug)==0: |
|
|
if user_slug is None or len(user_slug)==0: |
|
|
raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu") |
|
|
raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu") |
|
@@ -316,11 +260,16 @@ def badge_user1(request): |
|
|
raise HTTPNotFound() |
|
|
raise HTTPNotFound() |
|
|
|
|
|
|
|
|
# Ok let's generate a PDF Badge |
|
|
# Ok let's generate a PDF Badge |
|
|
|
|
|
|
|
|
|
|
|
# Register LiberationMono font |
|
|
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf" |
|
|
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf" |
|
|
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" |
|
|
|
|
|
pdfmetrics.registerFont(TTFont("Liberation", ttfFile)) |
|
|
pdfmetrics.registerFont(TTFont("Liberation", ttfFile)) |
|
|
|
|
|
# Import font |
|
|
|
|
|
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" |
|
|
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) |
|
|
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) |
|
|
|
|
|
|
|
|
pdf = StringIO.StringIO() |
|
|
pdf = StringIO.StringIO() |
|
|
|
|
|
out_img = StringIO.StringIO() |
|
|
|
|
|
|
|
|
c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) ) |
|
|
c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) ) |
|
|
c.translate(mm, mm) |
|
|
c.translate(mm, mm) |
|
@@ -330,201 +279,70 @@ def badge_user1(request): |
|
|
c.setTitle("Badge") |
|
|
c.setTitle("Badge") |
|
|
|
|
|
|
|
|
c.saveState() |
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
one_badge(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()) |
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
Command = ["convert","-density","150x150", OutPDF, OutPNG] |
|
|
|
|
|
subprocess.call(Command) |
|
|
|
|
|
|
|
|
Tiers_Logo(c, DispUser) |
|
|
|
|
|
|
|
|
|
|
|
if 1: |
|
|
|
|
|
Ribbon90(DispUser, c) |
|
|
|
|
|
|
|
|
with open( OutPNG, 'rb') as pngfile: |
|
|
|
|
|
out_img.write(pngfile.read()) |
|
|
|
|
|
|
|
|
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 ) |
|
|
|
|
|
|
|
|
out_img.seek(0) |
|
|
|
|
|
return Response(app_iter=out_img, content_type = 'image/png' ) |
|
|
else: |
|
|
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' ) |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
@view_config(route_name='all_badges') |
|
|
|
|
|
def planche_badge(request): |
|
|
|
|
|
if request.user is None: |
|
|
|
|
|
# Don't answer to users that aren't logged |
|
|
|
|
|
raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') |
|
|
|
|
|
# Query database about selected Year. |
|
|
|
|
|
Users = DBSession.query(User) |
|
|
|
|
|
# .join(User_Event)\ |
|
|
|
|
|
# .filter(User_Event.year_uid == year) |
|
|
|
|
|
|
|
|
|
|
|
# Register LiberationMono font |
|
|
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf" |
|
|
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf" |
|
|
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" |
|
|
|
|
|
pdfmetrics.registerFont(TTFont("Liberation", ttfFile)) |
|
|
pdfmetrics.registerFont(TTFont("Liberation", ttfFile)) |
|
|
|
|
|
# Import font |
|
|
|
|
|
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" |
|
|
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) |
|
|
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) |
|
|
|
|
|
|
|
|
pdf = StringIO.StringIO() |
|
|
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) |
|
|
|
|
|
|
|
|
FULLWIDTH = 210 * mm |
|
|
|
|
|
FULLHEIGHT = 297 * mm |
|
|
|
|
|
|
|
|
img = qr.make_image() |
|
|
|
|
|
# Create PDF container |
|
|
|
|
|
WIDTH = 85 * mm |
|
|
|
|
|
HEIGHT = 60 * mm |
|
|
|
|
|
ICONSIZE = 10 * mm |
|
|
|
|
|
c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) ) |
|
|
|
|
|
|
|
|
c = canvas.Canvas( pdf, pagesize=(FULLWIDTH, FULLHEIGHT) ) |
|
|
c.translate(mm, mm) |
|
|
c.translate(mm, mm) |
|
|
|
|
|
|
|
|
# Feed some metadata |
|
|
# Feed some metadata |
|
|
c.setCreator("linux-azur.org") |
|
|
c.setCreator("linux-azur.org") |
|
|
c.setTitle("Badge") |
|
|
c.setTitle("Badge") |
|
|
|
|
|
t=0 |
|
|
|
|
|
ListUser = filter(lambda x: x.is_Intervenant or x.Staff or x.is_crew, Users) |
|
|
|
|
|
for num, DispUser in enumerate(ListUser): |
|
|
|
|
|
c.saveState() |
|
|
|
|
|
Offsets = (((num-t)%2)*(WIDTH+40)+40, ((num-t)/2)*(HEIGHT+25)+40) |
|
|
|
|
|
one_badge(c, DispUser, Offsets) |
|
|
|
|
|
if num%8==7: |
|
|
|
|
|
t=num+1 |
|
|
|
|
|
c.showPage() |
|
|
|
|
|
|
|
|
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.showPage() |
|
|
c.save() |
|
|
c.save() |
|
|
pdf.seek(0) |
|
|
|
|
|
|
|
|
pdf.seek(0) |
|
|
return Response(app_iter=pdf, content_type = 'application/pdf' ) |
|
|
return Response(app_iter=pdf, content_type = 'application/pdf' ) |