diff --git a/jm2l/__init__.py b/jm2l/__init__.py
index 1e04d5d..6769e3d 100644
--- a/jm2l/__init__.py
+++ b/jm2l/__init__.py
@@ -95,6 +95,7 @@ def main(global_config, **settings):
# ICal Routes
config.add_route('progr_iCal', '/{year:\d+}/JM2L.ics')
+ config.add_route('progr_dyn_iCal', '/{year:\d+}/JM2L_dyn.ics')
# JSON Routes
config.add_route('users_json', '/json-users')
@@ -154,6 +155,7 @@ def main(global_config, **settings):
config.add_route('show_user', '/user/{user_slug:([\w-]+)?}')
config.add_route('badge_user', '/user/{user_slug:([\w-]+)?}/badge')
config.add_route('all_badges', '/badges')
+ config.add_route('place_print', '/place_print')
# HTML Routes - Logged
#config.add_route('profil', 'MesJM2L')
diff --git a/jm2l/badge.py b/jm2l/badge.py
index 7c9c06c..c4e723d 100644
--- a/jm2l/badge.py
+++ b/jm2l/badge.py
@@ -17,90 +17,6 @@ WIDTH = 85 * mm
HEIGHT = 60 * mm
ICONSIZE = 10 * 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, Offset=(0,0)):
OffX, OffY = Offset
logoobject = canvas.beginText()
diff --git a/jm2l/models.py b/jm2l/models.py
index 77b4a02..e573454 100644
--- a/jm2l/models.py
+++ b/jm2l/models.py
@@ -137,6 +137,10 @@ class User(Base):
soc_link = Column(UnicodeText)
Staff = Column(Integer, default=0)
vote_logo = Column(Integer, default=0)
+
+ wifi_user = Column(Unicode(80), nullable=True)
+ wifi_pass = Column(Unicode(80), nullable=True)
+
# relations
tiers = relationship('Tiers', secondary='user_tiers_link' )
events = relationship('Event', secondary='user_event_link' )
diff --git a/jm2l/static/img/wifi.png b/jm2l/static/img/wifi.png
new file mode 100644
index 0000000..2f0c280
Binary files /dev/null and b/jm2l/static/img/wifi.png differ
diff --git a/jm2l/templates/Profil/Profil.mako b/jm2l/templates/Profil/Profil.mako
index ec3060c..3f9e76c 100644
--- a/jm2l/templates/Profil/Profil.mako
+++ b/jm2l/templates/Profil/Profil.mako
@@ -13,7 +13,7 @@
Mon lien de connection -
Mon profil public
-
${profil_form.prenom.data} ${profil_form.nom.data}
+
${profil_form.prenom.data} ${profil_form.nom.data}
<%
DicFormA = {
'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False},
@@ -61,7 +61,22 @@ DicForm2 = {
${helpers.DisplayRespForm(profil_form, DicFormA)}
+
${helpers.show_my_pictures(uprofil)}
+
+
+
Vos identifiants wifi:
+
+ - SSID
+ - Unice-HotSpot
+ - Votre utilisateur:
+ - ${uprofil.wifi_user}
+ - Le mot de passe:
+ - ${uprofil.wifi_pass}
+
+
Plus de détails ...
+
+
diff --git a/jm2l/to_print.py b/jm2l/to_print.py
new file mode 100644
index 0000000..740080d
--- /dev/null
+++ b/jm2l/to_print.py
@@ -0,0 +1,135 @@
+# -*- coding: utf8 -*-
+from pyramid.response import Response
+import cStringIO as StringIO
+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
+
+CurrentYear = 2015
+# 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)
+ yearobject = canvas.beginText()
+ yearobject.setFillColorRGB(1,1,1)
+ yearobject.setTextRenderMode(0)
+ yearobject.setTextOrigin(WIDTH/2-OffY-120, HEIGHT-36-OffX)
+ yearobject.setWordSpace(48)
+ yearobject.textLines("2 0 1 5")
+ yearobject.setWordSpace(1)
+ canvas.drawText(yearobject)
+
+
+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='place_print', http_cache = (EXPIRATION_TIME, {'public':True}))
+def place_print(request):
+ # Ok let's generate a print for place schedule
+
+ # Register LiberationMono font
+ ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
+ pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
+ # Import font
+ ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
+ 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("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(1,1,1)
+ 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.drawCentredString(WIDTH/2, max_y + off_y - 35 - start_pos_y, ev.name, 0)
+ intervs = ','.join( [x.slug for x in ev.intervenants] )
+ c.drawString(WIDTH/2, max_y + off_y - 45 - start_pos_y, intervs, 0)
+
\ No newline at end of file
diff --git a/jm2l/views.py b/jm2l/views.py
index cb27b4f..4bfd7ee 100644
--- a/jm2l/views.py
+++ b/jm2l/views.py
@@ -73,6 +73,43 @@ def ICal_Progamme_Request(request):
request.response.content_type = "text/calendar"
return cal.to_ical()
+## =-=- Here, We handle ICal requests -=-=
+@view_config(route_name='progr_dyn_iCal', renderer="string")
+def ICal_Progamme_Dyn_Request(request):
+ year = int(request.matchdict.get('year', CurrentYear))
+ # Initialization
+ # Compute days used by all events matching the specified input year
+ Events = DBSession.query(Event)\
+ .filter(Event.for_year == year)\
+ .filter(Event.event_type != 'Stand')\
+ .order_by(Event.start_time)
+
+ cal = Calendar()
+ cal.add('prodid', '-//Programme %d//jm2l.linux-azur.org//' % year)
+ cal.add('version', '2.0')
+ today = datetime.datetime.now()
+ tz = timezone('Europe/Paris')
+ for i, ev in enumerate(Events):
+ if ev.event_type:
+ event = Evt()
+ event['uid'] = "%d/%d" % ( year, ev.uid )
+ event.add('summary', ev.name +'_night' )
+ event.add('dtstart', ev.start_time.replace(tzinfo=tz, day=today.day, month = today.month, hour=(ev.start_time.hour)%24) )
+ event.add('dtend', ev.end_time.replace(tzinfo=tz, day=today.day, month = today.month, hour=(ev.end_time.hour)%24) )
+ event.add('created', ev.last_change.replace(tzinfo=tz) )
+ if i%2:
+ event.add('description', "http://video.webmfiles.org/big-buck-bunny_trailer.webm" )
+ else:
+ event.add('description', "http://video.webmfiles.org/elephants-dream.webm" )
+ event.add('location', "http://jm2l.linux-azur.org/image/tasks/89/le-projet-de-learning-centre-sophiatech-32-638.jpg" )
+ event.add('url', "http://www.linux-azur.org/event/%s/%s" % (ev.for_year, ev.slug) )
+ event.add('salle', "%s" % (ev.Salle.name) )
+ event.add('priority', 5)
+ cal.add_component(event)
+ request.response.content_type = "text/calendar"
+ return cal.to_ical()
+
+
## =-=- Here, We handle Json requests -=-=
@view_config(route_name='users_json', renderer="json")
def JSON_User_Request(request):
@@ -213,9 +250,9 @@ def JSON_TimeLine_Request(request):
"text":"9ème Édition",
"asset":
{
- "media":"https://www.youtube.com/watch?v=DnfjrxVoLao",
- "credit":"JM2L",
- "caption":""
+ "media":"https://www.youtube.com/watch?v=91X65eEKxvU&t=6s",
+ "credit":"Polytech nice sophia",
+ "caption":"JM2L 2015"
}
}
elif year==2011: