Browse Source

Fix Display of program, Fix table ronde

master
tr4ck3ur des JM2L 9 years ago
parent
commit
e958bf04cb
6 changed files with 183 additions and 310 deletions
  1. +1
    -2
      jm2l/__init__.py
  2. +111
    -293
      jm2l/badge.py
  3. +7
    -1
      jm2l/models.py
  4. +45
    -7
      jm2l/static/js/programme.js
  5. +11
    -3
      jm2l/templates/Public/Programme.mako
  6. +8
    -4
      jm2l/views.py

+ 1
- 2
jm2l/__init__.py View File

@@ -153,8 +153,7 @@ def main(global_config, **settings):
config.add_route('pict_user', '/user_picture') config.add_route('pict_user', '/user_picture')
config.add_route('show_user', '/user/{user_slug:([\w-]+)?}') config.add_route('show_user', '/user/{user_slug:([\w-]+)?}')
config.add_route('badge_user', '/user/{user_slug:([\w-]+)?}/badge') config.add_route('badge_user', '/user/{user_slug:([\w-]+)?}/badge')
config.add_route('badge_user1', '/user/{user_slug:([\w-]+)?}/badge1')
config.add_route('badge_user2', '/user/{user_slug:([\w-]+)?}/badge2')
config.add_route('all_badges', '/badges')
# HTML Routes - Logged # HTML Routes - Logged
#config.add_route('profil', 'MesJM2L') #config.add_route('profil', 'MesJM2L')


+ 111
- 293
jm2l/badge.py View File

@@ -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' )

+ 7
- 1
jm2l/models.py View File

@@ -175,7 +175,13 @@ class User(Base):
return DBSession.query(Event).join(User_Event) \ return DBSession.query(Event).join(User_Event) \
.filter(User_Event.user_uid==self.uid) \ .filter(User_Event.user_uid==self.uid) \
.filter(Event.for_year==year).count() .filter(Event.for_year==year).count()

@property
def is_crew(self, year=2015):
""" This property will return if User subscribe orga task on specified year """
return DBSession.query(User,Sejour.orga_part).outerjoin(Sejour).filter(User.uid == self.uid).one()[1]
def year_events(self, EventType='All', year=2015): def year_events(self, EventType='All', year=2015):
if EventType=='All': if EventType=='All':
return filter(lambda e: e.for_year==year, self.events) return filter(lambda e: e.for_year==year, self.events)


+ 45
- 7
jm2l/static/js/programme.js View File

@@ -74,7 +74,7 @@ d3.json("le-prog-json",
.attr("viewBox", "0 0 " + (width + margin.right + margin.left) + " " + (height + margin.top + margin.bottom) ) .attr("viewBox", "0 0 " + (width + margin.right + margin.left) + " " + (height + margin.top + margin.bottom) )
.attr("preserveAspectRatio", "xMidYMid meet"); .attr("preserveAspectRatio", "xMidYMid meet");
// Add some gradient // Add some gradient
header(svg);
header(svg, Keys[k]);
// Create axis // Create axis
svg.append("g") svg.append("g")
.attr("class", "xAxis axis"); .attr("class", "xAxis axis");
@@ -90,11 +90,11 @@ d3.json("le-prog-json",
} }
}); });


function header(svg) {
function header(svg, day) {
defs = svg.append("svg:defs"); defs = svg.append("svg:defs");
conf = defs.append("svg:linearGradient") conf = defs.append("svg:linearGradient")
.attr("id", "BoxGradient-Conference")
.attr("id", "BoxGradient-Conference-"+day)
.attr("x1", "100%") .attr("x1", "100%")
.attr("y1", "0%") .attr("y1", "0%")
.attr("x2", "50%") .attr("x2", "50%")
@@ -112,7 +112,7 @@ function header(svg) {
.attr("stop-opacity", .5); .attr("stop-opacity", .5);
atlier = defs.append("svg:linearGradient") atlier = defs.append("svg:linearGradient")
.attr("id", "BoxGradient-Atelier")
.attr("id", "BoxGradient-Atelier-"+day)
.attr("x1", "100%") .attr("x1", "100%")
.attr("y1", "0%") .attr("y1", "0%")
.attr("x2", "50%") .attr("x2", "50%")
@@ -129,9 +129,47 @@ function header(svg) {
.attr("stop-color", "#FF856E") .attr("stop-color", "#FF856E")
.attr("stop-opacity", .5); .attr("stop-opacity", .5);


tabler = defs.append("svg:linearGradient")
.attr("id", "BoxGradient-Table-ronde-"+day)
.attr("x1", "100%")
.attr("y1", "0%")
.attr("x2", "50%")
.attr("y2", "100%")
.attr("spreadMethod", "pad");

tabler.append("svg:stop")
.attr("offset", "0%")
.attr("stop-color", "#EEE")
.attr("stop-opacity", 0);
tabler.append("svg:stop")
.attr("offset", "15%")
.attr("stop-color", "#B59EFF")
.attr("stop-opacity", .5);

undef = defs.append("svg:linearGradient")
.attr("id", "BoxGradient-undefined-"+day)
.attr("x1", "100%")
.attr("y1", "0%")
.attr("x2", "50%")
.attr("y2", "100%")
.attr("spreadMethod", "pad");

undef.append("svg:stop")
.attr("offset", "0%")
.attr("stop-color", "#EEE")
.attr("stop-opacity", 0);
undef.append("svg:stop")
.attr("offset", "15%")
.attr("stop-color", "#359E35")
.attr("stop-opacity", .5);


// append filter element // append filter element
var filter = defs.append( 'filter' ) var filter = defs.append( 'filter' )
.attr( 'id', 'dropshadow' ); /// !!! important - define id to reference it later
.attr( 'id', 'dropshadow-'+day ); /// !!! important - define id to reference it later
// append gaussian blur to filter // append gaussian blur to filter
filter.append( 'feGaussianBlur' ) filter.append( 'feGaussianBlur' )
@@ -245,9 +283,9 @@ function displayit(Set_of_Task, Set_of_Area, key) {
.insert("rect") .insert("rect")
.attr("rx", 5) .attr("rx", 5)
.attr("ry", 5) .attr("ry", 5)
.attr("filter", "url(#dropshadow)")
.attr("filter", "url(#dropshadow-" + key + ")")
.style("fill", function(d){ .style("fill", function(d){
return "url(#BoxGradient-"+ taskStatus[d.status] +")";
return "url(#BoxGradient-"+ taskStatus[d.status] + "-" + key + ")";
}) })
.attr("class", function(d){ .attr("class", function(d){
if(taskStatus[d.status] == null) if(taskStatus[d.status] == null)


+ 11
- 3
jm2l/templates/Public/Programme.mako View File

@@ -21,13 +21,14 @@ TabDisplay = [
} }
.SvgBody { .SvgBody {
padding: 0px; padding: 0px;
background-color: transparent;
/* background-color: transparent; */
} }
.EvtBox { .EvtBox {
font-size: 0.7em; font-size: 0.7em;
line-height: 1.2em; line-height: 1.2em;
padding:5px; padding:5px;
height:100%; height:100%;
max-width: 100%;
} }
.EvtBox a { .EvtBox a {
color: #666; color: #666;
@@ -37,8 +38,15 @@ svg {
shape-rendering: crispEdges; shape-rendering: crispEdges;
} }


rect {
stroke-width: 0px;
rect{fill:red;
stroke:none;
shape-rendering:crispEdges;
}

svg {
margin: 1.5em auto;
max-width: 100%;
display: block;
} }


.axis path, .axis path,


+ 8
- 4
jm2l/views.py View File

@@ -1340,6 +1340,8 @@ def edit_event(request):
IntervLabel = intervention.replace('_',' ').lower() IntervLabel = intervention.replace('_',' ').lower()
if intervention=='Conference': if intervention=='Conference':
IntervLabel = u'conférence' IntervLabel = u'conférence'
elif intervention=='Table_ronde':
IntervLabel = u'Table ronde'
# Check intervention # Check intervention
if not intervention in ['Stand', 'Table_ronde', 'Atelier', 'Conference', 'Concert']: if not intervention in ['Stand', 'Table_ronde', 'Atelier', 'Conference', 'Concert']:
raise HTTPNotFound(u"Ce type d'évenement n'est pas reconnu") raise HTTPNotFound(u"Ce type d'évenement n'est pas reconnu")
@@ -1467,11 +1469,13 @@ def edit_event(request):
TheEvent.end_time = TheEvent.start_time + datetime.timedelta(minutes=form.duration.data) TheEvent.end_time = TheEvent.start_time + datetime.timedelta(minutes=form.duration.data)
# Ok, time to put in database # Ok, time to put in database
if not form._fields.has_key("uid"): if not form._fields.has_key("uid"):
TheEvent.slug = slugify(TheEvent.name)
TheEvent.slug = unicode(slugify(TheEvent.name))
if intervention==u"Table_ronde":
TheEvent.event_type = "Table ronde"
DBSession.add(TheEvent) DBSession.add(TheEvent)
# Append creator by default # Append creator by default
if request.user.uid!=1: if request.user.uid!=1:
uev = User_Event(year_uid=TheYear.year_uid, role="Animateur")
uev = User_Event(year_uid=TheYear.year_uid, role=u"Animateur")
uev.user_uid = request.user.uid uev.user_uid = request.user.uid
TheEvent.interventions.append( uev ) TheEvent.interventions.append( uev )
DBSession.flush() DBSession.flush()
@@ -1482,13 +1486,13 @@ def edit_event(request):
if slugify(TheEvent.name)!=TheEvent.slug: if slugify(TheEvent.name)!=TheEvent.slug:
# We should move some file as slug have been changed # We should move some file as slug have been changed
# First we ensure there is no related event that already exist with that slug # First we ensure there is no related event that already exist with that slug
CheckEvent = Event.by_slug( slugify(TheEvent.name), year)
CheckEvent = Event.by_slug( unicode(slugify(TheEvent.name)), year)
if CheckEvent: if CheckEvent:
request.session.flash(('warning',u'Choisissez un autre titre pour votre évenement, il est en conflit avec un autre.')) request.session.flash(('warning',u'Choisissez un autre titre pour votre évenement, il est en conflit avec un autre.'))
return {'event':TheEvent, 'form':form, 'formAdd':formAdd, 'formAddT':formAddT, 'Salles':Salles } return {'event':TheEvent, 'form':form, 'formAdd':formAdd, 'formAddT':formAddT, 'Salles':Salles }
else: else:
SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [ str(year) ] + [ TheEvent.slug ]) ) SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [ str(year) ] + [ TheEvent.slug ]) )
TheEvent.slug=slugify(TheEvent.name)
TheEvent.slug=unicode(slugify(TheEvent.name))
DSTPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [ str(year) ] + [ TheEvent.slug ]) ) DSTPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [ str(year) ] + [ TheEvent.slug ]) )
if not path.isdir(path.dirname(DSTPath)): if not path.isdir(path.dirname(DSTPath)):
makedirs(path.dirname(DSTPath)) makedirs(path.dirname(DSTPath))


Loading…
Cancel
Save