@@ -5,7 +5,7 @@ from pyramid.renderers import JSON, JSONP | |||
from pyramid.session import SignedCookieSessionFactory | |||
from sqlalchemy import engine_from_config | |||
from pyramid.renderers import render_to_response | |||
from .models import DBSession, get_user | |||
from .models import DBSession, get_user, get_sponsors, get_exposants | |||
from .security import EntryFactory, groupfinder | |||
from pyramid_mailer import mailer_factory_from_settings | |||
import locale | |||
@@ -17,7 +17,7 @@ def main(global_config, **settings): | |||
locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") | |||
engine = engine_from_config(settings, 'sqlalchemy.') | |||
DBSession.configure(bind=engine) | |||
# Extract secrets from configuration file | |||
# Extract secrets from configuration file if any | |||
CookiesPasswd = settings.get('secret_Cookies', 'itsthefirstseekreet') | |||
AuthTktPasswd = settings.get('secret_AuthTkt', 'itsthesecondseekreet') | |||
my_session_factory = SignedCookieSessionFactory(CookiesPasswd) | |||
@@ -34,6 +34,8 @@ def main(global_config, **settings): | |||
config.add_renderer('jsonp', JSONP(param_name='callback')) | |||
config.set_session_factory(my_session_factory) | |||
config.add_request_method(get_user, 'user', reify=True) | |||
config.add_request_method(get_sponsors, 'sponsors', reify=False) | |||
config.add_request_method(get_exposants, 'exposants', reify=False) | |||
config.add_static_view('static', 'static', cache_max_age=3600) | |||
config.add_static_view('img', 'static/img', cache_max_age=3600) | |||
config.add_static_view('css', 'static/css', cache_max_age=3600) | |||
@@ -73,7 +75,7 @@ def main(global_config, **settings): | |||
config.add_route('link_event', '/MesJM2L/{year:\d+}/{intervention:\w+}/link') | |||
config.add_route('edit_event', '/MesJM2L/{year:\d+}/{intervention:\w+}{sep:/*}{event_id:([\w-]+)?}') | |||
## Entities | |||
## Entities | |||
config.add_route('entities', '/entities') #{sep:/*}{Nature:\w+?}') | |||
config.add_route('add_entity', '/entity') | |||
config.add_route('show_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}') | |||
@@ -60,7 +60,7 @@ class StaffTasks(MyBaseForm): | |||
name = TextField(u'Nom de la tâche', [validators.Required()]) | |||
area_uid = SelectField(u'Pôle concerné', coerce=int ) | |||
closed_by = SelectField(u'Assigné à', coerce=int ) | |||
due_date = DateField(u'Date prévue', format='%Y-%m-%d') | |||
due_date = DateField(u'Date prévue', format='%d/%m/%Y') | |||
description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)], | |||
filters=[strip_filter]) | |||
@@ -243,7 +243,7 @@ class Tiers(Base): | |||
lazy='dynamic') | |||
creator_id = Column(Integer) | |||
membership = relationship('User_Tiers', backref="matching_tiers") | |||
roles = relationship('Tiers', secondary='role_tiers_link' ) | |||
roles = relationship('Role_Tiers', backref="roles_tiers") #secondary='role_tiers_link' ) | |||
@classmethod | |||
def by_id(cls, id): | |||
@@ -618,3 +618,27 @@ def get_user(request): | |||
# this should return None if the user doesn't exist | |||
# in the database | |||
return DBSession.query(User).filter(User.uid==userid).first() | |||
def get_sponsors(request, Year): | |||
if Year: | |||
return DBSession.query(Tiers)\ | |||
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\ | |||
.filter( Role_Tiers.tiers_role == 'Sponsor')\ | |||
.filter( Role_Tiers.year_uid == Year) | |||
else: | |||
return DBSession.query(Tiers)\ | |||
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\ | |||
.filter( Role_Tiers.tiers_role == 'Sponsor') | |||
def get_exposants(request, Year): | |||
if Year: | |||
return DBSession.query(Tiers)\ | |||
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\ | |||
.filter( Role_Tiers.tiers_role == 'Exposant')\ | |||
.filter( Role_Tiers.year_uid == Year) | |||
else: | |||
return DBSession.query(Tiers)\ | |||
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\ | |||
.filter( Role_Tiers.tiers_role == 'Exposant') | |||
@@ -2,6 +2,10 @@ a { | |||
cursor: pointer; | |||
} | |||
.pagecontent { | |||
padding: 0 50px; | |||
} | |||
.borderbox { | |||
border: 1px solid #e1e4e5; | |||
margin: 1px 0 24px; | |||
@@ -84,6 +88,7 @@ a { | |||
opacity: 0.5; | |||
position: absolute; | |||
text-align: center; | |||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); | |||
width: 15px; | |||
top: -20px; | |||
} | |||
@@ -96,6 +101,28 @@ a { | |||
right: 15px; | |||
} | |||
.Tcarousel-control { | |||
bottom: 0; | |||
color: #fff; | |||
font-size: 20px; | |||
left: 0; | |||
opacity: 0.5; | |||
position: absolute; | |||
text-align: center; | |||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); | |||
top: 100px;; | |||
width: 3%; | |||
} | |||
.Tcarousel-control.left { | |||
right: auto; | |||
left: 15px; | |||
} | |||
.Tcarousel-control.right { | |||
left: auto; | |||
right: 15px; | |||
} | |||
.LogistiqueTable th, .LogistiqueTable td | |||
{ | |||
text-align:center; | |||
@@ -143,6 +170,47 @@ a { | |||
text-align: right; | |||
display: inline-block; | |||
} | |||
.ShowEntities td, .ShowEntities th { | |||
border-top: none; | |||
} | |||
.ShowEntities td { | |||
padding:10px; | |||
text-align: center; | |||
} | |||
.ShowEntities th { | |||
background-color: #fafafa; | |||
background-image: linear-gradient(to bottom, #fff, #f2f2f2); | |||
background-repeat: repeat-x; | |||
border: 1px solid #d4d4d4; | |||
border-radius: 4px; | |||
} | |||
.ShowEntities { | |||
border: 1px solid #d4d4d4; | |||
} | |||
.ShowEntities td img { | |||
width: 60px; | |||
height: 60px; | |||
} | |||
.ShowEntities td:hover { | |||
background-color: #F5F5F5; | |||
} | |||
.footer { | |||
background-color: #f5f5f5; | |||
border-top: 1px solid #e5e5e5; | |||
margin-top: 70px; | |||
padding: 10px 0; | |||
text-align: center; | |||
width: auto; | |||
} | |||
.footer p { | |||
color: #777; | |||
margin-bottom: 0; | |||
} | |||
/* Fix calendar button vertical pos */ | |||
.date-input-buttons { | |||
@@ -1,6 +1,6 @@ | |||
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | |||
<%def name="Resume()"> | |||
<table width="100%" class="table table-striped table-bordered table-hover"> | |||
<table class="table table-striped table-bordered table-hover"> | |||
<CAPTION>La feuille de route de mes interventions</CAPTION> | |||
<thead style="text-align:center"> | |||
<tr> | |||
@@ -197,7 +197,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||
<div id="collapseMe" class="accordion-body collapse in"> | |||
<div class="accordion-inner"> | |||
<table width="100%" class="table table-striped table-bordered table-hover LogistiqueTable"> | |||
<table class="table table-striped table-bordered table-hover LogistiqueTable"> | |||
<thead style="text-align:center"> | |||
<tr> | |||
<th>Section</th> | |||
@@ -246,7 +246,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||
<div id="collapseAll" class="accordion-body collapse"> | |||
<div class="accordion-inner"> | |||
<table width="100%" class="table table-striped table-bordered table-hover LogistiqueTable"> | |||
<table class="table table-striped table-bordered table-hover LogistiqueTable"> | |||
<thead style="text-align:center"> | |||
<tr> | |||
<th>Section</th> | |||
@@ -1,5 +1,7 @@ | |||
<%inherit file="jm2l:templates/layout.mako"/> | |||
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | |||
<div class="span10 offset1"> | |||
<h3><a href="mailto:contact@jm2l.linux-azur.org">Sponsoriser l’événement</a></h3> | |||
<p> | |||
Si vous voulez aider l’organisation par des moyens financiers ou | |||
@@ -73,7 +75,5 @@ DicForm ={ | |||
</p> | |||
Cliquez sur ce lien pour finir votre inscription : <a href="${request.route_path('bymail', hash=link)}">Mon lien</a> | |||
% endif | |||
<br> | |||
<br> | |||
<br> | |||
<br> | |||
</div> |
@@ -1,65 +1,77 @@ | |||
<%inherit file="jm2l:templates/layout.mako"/> | |||
<h1 class="page-title">Nous rejoindre</h1> | |||
<div class="row"> | |||
<h2 class="page-title">Nous rejoindre...</h2> | |||
<div class="span10 offset1"> | |||
<p>D’où que vous veniez, tout est mis en place pour que vous | |||
puissiez vous rendre en toute simplicité sur les lieux de l’événement. | |||
<br> N'hésitez pas à utiliser la section covoiturage de votre profil. Et | |||
pas de panique ! Demain, ce sera pire... </p> | |||
</div> | |||
<div class="row-fluid"> | |||
<div class="span4 offset1"> | |||
<h4>Le staff</h4> | |||
<dl> | |||
<dt>Mail</dt> | |||
<dd>» contact at jm2l.linux-azur.org</dd> | |||
<dt>Téléphone</dt> | |||
<dd>» +33 (0) 6 52 42 31 37</dd> | |||
</dl> | |||
</div> | |||
<div class="span4 offset1"> | |||
<h4>Le lieu</h4> | |||
<address> | |||
<strong>École </strong><strong>Polytech’Nice-Sophia </strong><br> | |||
930, route des Colles (site des Templiers) <br> | |||
06903 Sophia Antipolis (Biot) | |||
</address> | |||
<p>GPS Lat.: 43°36'57.72"N - Lon.: 7°4'17.03"E</p> | |||
</div> | |||
</div> | |||
<div class="row-fluid"> | |||
<div class="span6"> | |||
<div class="tabbable" id="main_tab"> | |||
<ul class="nav nav-tabs"> | |||
<li class="active"><a href="#home" data-toggle="tab">C'est où ?</a></li> | |||
<li><a href="#Trsp" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en bus" src="/img/tr_bus_.png"></a></li> | |||
<li class="active"><a href="#Trsp" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en bus" src="/img/tr_bus_.png"></a></li> | |||
<li><a href="#Voiture" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en voiture" src="/img/tr_voiture_.png"></a></li> | |||
<li><a href="#Train" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en train" src="/img/tr_train_.png"></a></li> | |||
<li><a href="#Avion" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en avion" src="/img/tr_avion_.png"></a></li> | |||
<li><a href="#Contact" data-toggle="tab">Contact</a></li> | |||
<li><a href="#Avion" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en avion" src="/img/tr_avion_.png"></a></li> | |||
</ul> | |||
<div class="tab-content"> | |||
<div class="tab-pane fade active in" id="home"> | |||
<h2>Lieu</h2> | |||
<p><strong>École </strong><strong>Polytech’Nice-Sophia </strong><br> | |||
930, route des Colles (site des Templiers) <br> | |||
06903 Sophia Antipolis (Biot) | |||
</p> | |||
<p> GPS Lat.: 43°36'57.72"N - Lon.: 7°4'17.03"E</p> | |||
<p>D’où que vous veniez, tout est mis en place pour que vous | |||
puissiez vous rendre en toute simplicité sur les lieux de l’événement. | |||
</p> | |||
<p> | |||
<img alt="" src="http://jm2l.linux-azur.org/sites/jm2l.linux-azur.org/files/jm2l_plan_acces_polytech.png" style="height:507px; width:665px"> | |||
</p> | |||
<p> | |||
<a href="http://www.openstreetmap.org/?lat=43.61211&lon=7.07081&zoom=14&layers=M&mlat=43.61637&mlon=7.08520">Voir une carte plus grande</a> | |||
</p> | |||
</div> | |||
<div class="tab-pane fade in" id="Trsp"> | |||
<h3>Depuis Nice (durée : environ 30') :</h3> | |||
<div class="tab-pane fade active in" id="Trsp"> | |||
<h3>Bus</h3> | |||
<h4>Depuis Nice (durée : environ 30') :</h4> | |||
<ul> | |||
<li>Trajet sur la ligne Nice-Sophia Express : | |||
<a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/230.pdf">ligne 230</a> | |||
<a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/cg06-transports_lignes_230.pdf">ligne 230</a> | |||
</li> | |||
<li>Trajet sur la ligne Cagnes-Villeneuve-Biot-Sophia : | |||
<a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/231.pdf">ligne 231</a> | |||
</li> | |||
<li>Trajet sur la ligne StLaurent-Cagnes-Sophia : | |||
<a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/232.pdf">ligne 232</a> | |||
<a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/232.pdf">ligne 232</a> | |||
</li> | |||
<li>Trajet sur la ligne Vence-StPaul-Valbonne-Sophia : | |||
<a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/233.pdf">ligne 233</a> | |||
<a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/233.pdf">ligne 233</a> | |||
<ul> | |||
<li>Arrivée : descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||
</ul> | |||
</li> | |||
</ul> | |||
<h3>Depuis Cannes (durée : environ 30') :</h3> | |||
<h4>Depuis Cannes (durée : environ 30') :</h4> | |||
<ul> | |||
<li>Trajet sur la ligne Cannes - Sophia Antipolis : | |||
<a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/630.pdf">ligne 630</a> | |||
<a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/630.pdf">ligne 630</a> | |||
<ul> | |||
<li>Arrivée : descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||
</ul> | |||
</li> | |||
</ul> | |||
<h3>Depuis Antibes (durée : entre 10 et 30') :</h3> | |||
<h4>Depuis Antibes (durée : entre 10 et 30') :</h4> | |||
<ul> | |||
<li>Trajet sur la ligne Express (uniquement pour le vendredi) | |||
<a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne 100</a> | |||
@@ -120,22 +132,20 @@ | |||
</div> | |||
<div class="tab-pane fade in" id="Contact"> | |||
<h3>Staff JM2L :</h3> | |||
<ul> | |||
<li> | |||
<strong>Arnaud Delcasse +33 (0) 6 70 73 94 12</strong> | |||
</li> | |||
<li> | |||
<strong>Véronique Fritière +33 (0) 6 52 42 31 37</strong> | |||
</li> | |||
</ul> | |||
<h3>Coordinateur Polytech :</h3> | |||
<ul> | |||
<li><strong>Romain +33 (0) 7 60 57 42 68</strong></li> | |||
</ul> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<p>Pas de panique ! Demain, ce sera pire... Enjoy ;-)</p> | |||
</div> | |||
<div class="span6"> | |||
<p> | |||
<img alt="" src="http://jm2l.linux-azur.org/sites/jm2l.linux-azur.org/files/jm2l_plan_acces_polytech.png" style="height:507px; width:665px"> | |||
</p> | |||
<p> | |||
<a href="http://www.openstreetmap.org/?lat=43.61211&lon=7.07081&zoom=14&layers=M&mlat=43.61637&mlon=7.08520">Voir une carte plus grande</a> | |||
</p> | |||
</div> | |||
</div> | |||
<br> | |||
@@ -4,7 +4,9 @@ DisplayYear = request.session.get('year',2015) | |||
%> | |||
<h1 class="page-title">Dossier de presse ${DisplayYear}</h1> | |||
% if content and content.doss_presse: | |||
<div class="span10 offset1"> | |||
${content.doss_presse | n} | |||
</div> | |||
% endif | |||
%if 0 and DisplayYear==2013: | |||
<div class="region region-content"> | |||
@@ -13,13 +13,21 @@ TabDisplay = [ | |||
border: 1px solid #ccc; | |||
height: 65px; | |||
} | |||
.SvgBody { | |||
padding: 0px; | |||
background-color: transparent; | |||
} | |||
.EvtBox { | |||
font-size: 0.7em; | |||
line-height: 1.2em; | |||
padding:5px; | |||
height:100%; | |||
} | |||
.Conference { | |||
fill:#f9fde8; | |||
stroke: #a2bc13; | |||
fill: #f9fde8; | |||
} | |||
.Concert { | |||
fill:#2EE; | |||
stroke: #ccc; | |||
fill: #2EE; | |||
} | |||
.Atelier { | |||
fill: #faebeb; | |||
@@ -30,8 +38,7 @@ TabDisplay = [ | |||
stroke: #ff9912; | |||
} | |||
.Repas { | |||
fill:#2EE; | |||
stroke: #ccc; | |||
fill: #2EE; | |||
} | |||
svg { | |||
font: 10px sans-serif; | |||
@@ -45,30 +52,28 @@ rect { | |||
.axis path, | |||
.axis line { | |||
fill: none; | |||
stroke: #000; | |||
stroke: #222; | |||
} | |||
</style> | |||
<h2>Le Programme ${DisplayYear}</h2> | |||
<div class="row"> | |||
<div class="tabbable" id="main_tab"> | |||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||
% for Num, (Day, IdDay) in enumerate(Days): | |||
<li class="${['','active'][Num==0]}"><a href="#Day${Num}" id="Schedule_${Num}" data-toggle="tab">${Day}</a></li> | |||
% endfor | |||
</ul> | |||
<div class="tab-content" style="padding:0"> | |||
% for Num, (Day, IdDay) in enumerate(Days): | |||
<div class="tab-pane fade ${['','active '][Num==0]}in" id="Day${Num}"> | |||
## Container for SVG version of Programme | |||
<div id="Schedule_SVG_${IdDay}"> | |||
</div> | |||
<div class="tabbable" id="main_tab"> | |||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||
% for Num, (Day, IdDay) in enumerate(Days): | |||
<li class="${['','active'][Num==0]}"><a href="#Day${Num}" id="Schedule_${Num}" data-toggle="tab">${Day}</a></li> | |||
% endfor | |||
</ul> | |||
<div class="tab-content" style="padding:0"> | |||
% for Num, (Day, IdDay) in enumerate(Days): | |||
<div class="tab-pane fade ${['','active '][Num==0]}in" id="Day${Num}"> | |||
## Container for SVG version of Programme | |||
<div id="Schedule_SVG_${IdDay}"> | |||
</div> | |||
% endfor | |||
</div> | |||
% endfor | |||
</div> | |||
</div> | |||
</div> | |||
<div id="DivProg" style="border: 1px solid black;"></div> | |||
@@ -5,20 +5,14 @@ | |||
<script src="/js/jm2l.js"></script> | |||
<script src="/vendor/ckeditor/ckeditor.js"></script> | |||
<script src="/vendor/select2/js/select2.js"></script> | |||
<script src="//cdn.jsdelivr.net/webshim/1.15.7/polyfiller.js"></script> | |||
<script src="/vendor/datepicker/bootstrap-datepicker.js"></script> | |||
<script type="text/javascript"> | |||
webshim.setOptions('forms-ext', { | |||
replaceUI: 'auto', | |||
types: 'date', | |||
date: { | |||
startView: 2, | |||
classes: 'hide-spinbtns', | |||
} | |||
}); | |||
//start polyfilling | |||
webshim.polyfill('forms-ext'); | |||
var checkout = $('#due_date').datepicker({ | |||
format: "dd/mm/yyyy" | |||
}) | |||
.on('changeDate', function(ev) { | |||
checkout.hide(); | |||
}).data('datepicker'); | |||
</script> | |||
</%def> | |||
<%def name="cssAddOn()"> | |||
@@ -26,10 +20,12 @@ | |||
<link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui.css"> | |||
<link rel="stylesheet" href="/css/jm2l.css" /> | |||
<link rel="stylesheet" href="/vendor/select2/css/select2.css" type="text/css" media="screen" /> | |||
<link rel="stylesheet" href="/vendor/datepicker/datepicker.css" type="text/css" media="screen" /> | |||
<!-- CSS adjustments for browsers with JavaScript disabled --> | |||
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript> | |||
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> | |||
</%def> | |||
<p>Green checkmarks indicate that class is visible in your current viewport.</p> | |||
<a style="float:right;" href="${request.route_path('list_task', _anchor=area)}">Retour à la liste</a> | |||
% if 'uid' in form._fields.keys(): | |||
<h3>Editer une tâche</h3> | |||
@@ -41,7 +37,7 @@ DicForm = { | |||
'name': {'PlaceHolder':u"Nom de la tâche", "FieldStyle":"width:90%;" }, | |||
'area_uid': {"FieldStyle":"width:16em;", 'ContainerStyle':"float:left;" }, | |||
'closed_by': {"FieldStyle":"width:16em;", 'ContainerStyle':"float:left;" }, | |||
'due_date': {'PlaceHolder':u"27/11/2015", "FieldStyle":"width:8em;"}, | |||
'due_date': {'PlaceHolder':u"27/11/2015", "FieldStyle":"width:8em;"}, | |||
'description': {'PlaceHolder':u"Description", "FieldStyle":"width:95%;min-height:150px;", "ckeditor":"1" }, | |||
} | |||
%> | |||
@@ -41,8 +41,8 @@ TabJs = {'select':[], 'desc':[]} | |||
FieldStyle = DicFormat[Field.name].get("FieldStyle") | |||
Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ] | |||
%> | |||
% if Field.type == "DateField": | |||
${Field(placeholder=PlaceHolder or False, style=FieldStyle, class_=Class, type = "date")} | |||
% if Field.type == "date": | |||
${Field(placeholder=PlaceHolder or False, style=FieldStyle, class_="datepicker" )} | |||
% else: | |||
${Field(placeholder=PlaceHolder or False, style=FieldStyle, class_=Class)} | |||
% endif | |||
@@ -253,7 +253,7 @@ TabJs = {'select':[], 'desc':[]} | |||
## Wrapper pour les intervention utilisateur | |||
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | |||
<%def name="show_Interventions(ListEvent, HeadTitle=None, NotFoundTitle=None)"> \ | |||
<table width="100%" class="table table-striped table-bordered table-hover"> | |||
<table class="table table-striped table-bordered table-hover"> | |||
<tr> | |||
<th style="width:6em;text-align:center;">Date</th> | |||
% if HeadTitle: | |||
@@ -521,3 +521,52 @@ TabJs = {'select':[], 'desc':[]} | |||
${Place.description | n} | |||
% endif | |||
</%def> \ | |||
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | |||
## Wrapper pour les sponsors | |||
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | |||
<%def name="participants(Year)"> \ | |||
<table class="ShowEntities table"> | |||
<thead> | |||
<th colspan="3">Nos sponsors ${Year}</th> | |||
</thead> | |||
<tr> | |||
<% num = -1 %> | |||
% for entity in request.sponsors(Year): | |||
% for thumb in entity.ThumbLinks: | |||
<% num+=1 %> | |||
% if (num%3==0): | |||
</tr><tr> | |||
% endif | |||
<td> | |||
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}"> | |||
<img src="${thumb}" alt="${entity.name}" /> | |||
</a> | |||
</td> | |||
% endfor | |||
% endfor | |||
</tr> | |||
</table> | |||
<br /> | |||
<table class="ShowEntities table"> | |||
<thead> | |||
<th colspan="3">Nos exposants ${Year}</th> | |||
</thead> | |||
<tr> | |||
<% num = -1 %> | |||
% for entity in request.exposants(Year): | |||
% for thumb in entity.ThumbLinks: | |||
<% num+=1 %> | |||
% if (num%3==0): | |||
</tr><tr> | |||
% endif | |||
<td> | |||
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}"> | |||
<img src="${thumb}" alt="${entity.name}" /> | |||
</a> | |||
</td> | |||
% endfor | |||
% endfor | |||
</tr> | |||
</table> | |||
</%def> \ |
@@ -56,7 +56,7 @@ | |||
</div> | |||
</div> | |||
<div class="row"> | |||
<div class="row-fluid"> | |||
<div class="tabbable" id="main_tab"> | |||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||
<li class="active"><a href="#Profil" id="Map_Profil" data-toggle="tab">Mon Profil</a></li> | |||
@@ -32,10 +32,44 @@ DisplayYear = request.session.get('year', 2015) | |||
${helpers.uploader_js()} | |||
<div id="wrap"> | |||
<div id="top" style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> | |||
<div class="align-center"> | |||
<div><img src="${"/img/%s/logo.png" % DisplayYear}" height="215" alt="JM2L 2015"/></div> | |||
<div id="top"> | |||
% if DisplayYear!=2015: | |||
## style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> | |||
<div class="align-center"> | |||
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"> | |||
</div> | |||
</div> | |||
% else: | |||
<!-- Carousel | |||
================================================== --> | |||
<div id="TitleCarousel" class="carousel slide" data-ride="carousel"> | |||
<!-- Indicators --> | |||
<ol class="carousel-indicators"> | |||
<li data-target="#TitleCarousel" data-slide-to="0" class="active"></li> | |||
<li data-target="#TitleCarousel" data-slide-to="1"></li> | |||
<li data-target="#TitleCarousel" data-slide-to="2"></li> | |||
</ol> | |||
<div class="carousel-inner" role="listbox"> | |||
<div class="item active"> | |||
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"></div> | |||
</div> | |||
<div class="item"> | |||
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2013} ) no-repeat scroll center center transparent"></div> | |||
</div> | |||
<div class="item"> | |||
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2012} ) no-repeat scroll center center transparent"></div> | |||
</div> | |||
</div> | |||
<a class="left Tcarousel-control" href="#TitleCarousel" role="button" data-slide="prev"> | |||
<img src="/img/chev-left.png"> | |||
</a> | |||
<a class="right Tcarousel-control" href="#TitleCarousel" role="button" data-slide="next"> | |||
<img src="/img/chev-right.png"> | |||
</a> | |||
</div><!-- /.carousel --> | |||
% endif | |||
</div> | |||
<div id="middle"> | |||
<div class="navbar"> | |||
@@ -73,6 +107,11 @@ ${helpers.uploader_js()} | |||
<li><a href="/participer-l-evenement#inscription">Je m'inscris</a></li> | |||
<li><a href="/sign/login">Je m'identifie</a></li> | |||
% endif | |||
<li>Mode | |||
<span class="visible-phone"> ✔ Phone</span> | |||
<span class="visible-tablet"> ✔ Tablet</span> | |||
<span class="visible-desktop"> ✔ Desktop</span> | |||
</li> | |||
</ul> | |||
</div> | |||
</div> | |||
@@ -96,19 +135,38 @@ ${helpers.uploader_js()} | |||
</div> | |||
</div> | |||
<div id="bottom"> | |||
<div class="bottom"> | |||
${next.body()} | |||
</div> | |||
<div class="container-fluid"> | |||
<div class="row-fluid"> | |||
<div class="span9"> | |||
<!--Body content--> | |||
${next.body()} | |||
</div> | |||
<div class="span3"> | |||
<!--Sidebar content--> | |||
${helpers.participants(DisplayYear)} | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
## <br><br><br> | |||
## <div id="footer"> | |||
## <div class="footer">CopyFriendly ~ JM2L 2005-2015 ~ +33 (0) 6 52 42 31 37 | |||
## <br>Ni les représentant légaux de l'équipe de Linux-Azur, | |||
## ni l'équipe de coordination des JM2L ne sont résponsable des | |||
## informations publiés par les intervenants, dans le doute merci de nous contacter. | |||
## </div> | |||
<footer class="footer"> | |||
<div class="container"> | |||
<h4>JM2L 2005-2015</h4> | |||
<p> | |||
Concocté par <a href="http://www.linux-azur.org/">Linux Azur</a> ~ | |||
<a href="http://creativecommons.org/licenses/by-sa/4.0/">CopyFriendly</a> ~ | |||
</p> | |||
<p> | |||
+33 (0) 6 52 42 31 37 ~ contact at jm2l.linux-azur.org | |||
</p> | |||
<p> | |||
Conception et construction en <a href="http://git.linux-azur.org/jm2l/">DIY</a> ~ | |||
Hébergé par <a href="http://www.heberg-24.com/"> Heberg24 </a> | |||
</p> | |||
</div> | |||
</footer> | |||
<script src="/vendor/jquery.min.js"></script> | |||
<script src="/vendor/bootstrap.min.js"></script> | |||
<script src="/vendor/fileupload/js/jquery-uploader.min.js"></script> | |||
@@ -16,7 +16,7 @@ | |||
% for Num, Entity_Type in enumerate(entities.keys()): | |||
<div class="tab-pane fade ${["","active "][Num==0]} in" id="${Entity_Type}"> | |||
<table width="100%" class="table table-striped table-bordered table-hover"> | |||
<table class="table table-striped table-bordered table-hover"> | |||
<thead> | |||
<tr> | |||
<th style="width:7em;text-align:center;">Type</th> | |||
@@ -1,15 +1,36 @@ | |||
## -*- coding: utf-8 -*- | |||
<%def name="Bienvenue(request, User)"> | |||
<H4>JM2L</H4> | |||
<p> | |||
Bonjour ${User.prenom}.<br> | |||
Vous venez de valider votre inscription sur le site des JM2L.<br> | |||
Voici <a href="${request.route_url('bymail', hash=User.my_hash)}">votre lien</a> pour vous connecter.<br> | |||
Bonjour ${User.prenom},<br> | |||
<br> | |||
Vous venez de vous inscrire sur le site des JM2L et c'est une bonne idée :).<br> | |||
<br> | |||
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :<br> | |||
<a href="${request.route_url('bymail', hash=User.my_hash)}">Votre lien !</a> | |||
<br> | |||
À partir de là vous avez la possibilité de : | |||
<ul> | |||
<li>inscrire votre stand pour la journée du 28 novembre</li> | |||
<li>inscrire une conférence</li> | |||
<li>inscrire un atelier</li> | |||
<li>chercher/proposer du covoiturage</li> | |||
<li>chercher/proposer un hébergement</li> | |||
<li>vous faire rembourser vos frais</li> | |||
<li>chercher proposer du matériel (câbles, etc)</li> | |||
</ul> | |||
Toute l'équipe vous souhaite une agréable visite !<br> | |||
<p> | |||
Pour plus d'information vous pouvez vous connectez au site des JM2L : http://jm2l.linux-azur.org ou | |||
nous envoyer un mail à «contact at jm2l.linux-azur.org ». Et si vous êtes vraiment perdu vous pouvez | |||
toujours nous téléphoner au +33 6 52 42 31 37. | |||
</p> | |||
<p> | |||
Nous vous attendons avec impatience le 28 novembre à Sophia Antipolis pour fêter le libre et partager | |||
de la connaissance, de la bonne humeur et du soleil :) | |||
</p> | |||
<br> | |||
L'équipe des <b>JM2L</b> | |||
<br> | |||
</%def> \ | |||
% if action=='Welcome': | |||
${self.Bienvenue(request, User)} | |||
@@ -1,14 +1,29 @@ | |||
## -*- coding: utf-8 -*- | |||
<%def name="Bienvenue(request, User)"> | |||
Bonjour ${User.prenom}. | |||
Bonjour ${User.prenom}, | |||
Vous venez de valider votre inscription sur le site des JM2L. | |||
Vous venez de vous inscrire sur le site des JM2L et c'est une bonne idée :) | |||
Voici votre le lien pour vous connecter à votre profil: | |||
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant : | |||
${request.route_url('bymail', hash=User.my_hash)} | |||
Toute l'équipe vous souhaite une très agréable visite ! | |||
À partir de là vous avez la possibilité de : | |||
- inscrire votre stand pour la journée du 28 novembre | |||
- inscrire une conférence | |||
- inscrire un atelier | |||
- chercher/proposer du covoiturage | |||
- chercher/proposer un hébergement | |||
- vous faire rembourser vos frais | |||
- chercher proposer du matériel (câbles, etc) | |||
Pour plus d'information vous pouvez vous connectez au site des JM2L : http://jm2l.linux-azur.org ou nous envoyer un mail à « contact at jm2l.linux-azur.org ». Et si vous êtes vraiment perdu vous pouvez toujours nous téléphoner au +33 6 52 42 31 37. | |||
Nous vous attendons avec impatience le 28 novembre à Sophia Antipolis pour fêter le libre et partager de la connaissance, de la bonne humeur et du soleil :) | |||
L'équipe des JM2L | |||
</%def> \ | |||
% if action=='Welcome': | |||
${self.Bienvenue(request, User)} | |||
@@ -211,6 +211,30 @@ class MediaUpload(MediaPath): | |||
return self.thumbnailurl( os.path.basename(TargetFileName+".jpg") ) | |||
return self.ExtMimeIcon('application/pdf') | |||
def svgthumbnail(self, filename): | |||
TargetFileName = self.thumbnailpath(filename) | |||
Command = ["convert","./%s[0]" % self.mediapath(filename),"./%s_.jpg" % TargetFileName] | |||
Result = subprocess.call(Command) | |||
if Result==0: | |||
image = Image.open( TargetFileName+"_.jpg" ) | |||
pdf_indicator = Image.open( "jm2l/static/img/svg-icon.png" ) | |||
image.thumbnail((THUMBNAIL_SIZE, THUMBNAIL_SIZE), Image.ANTIALIAS) | |||
timage = Image.new('RGBA', (THUMBNAIL_SIZE, THUMBNAIL_SIZE), (255, 255, 255, 0)) | |||
# Add thumbnail | |||
timage.paste( | |||
image, | |||
((THUMBNAIL_SIZE - image.size[0]) / 2, (THUMBNAIL_SIZE - image.size[1]) / 2)) | |||
# Stamp with PDF file type | |||
timage.paste( | |||
pdf_indicator, | |||
(timage.size[0]-30, timage.size[1]-30), | |||
pdf_indicator, | |||
) | |||
timage.convert('RGB').save( TargetFileName+".jpg", 'JPEG') | |||
os.unlink(TargetFileName+"_.jpg") | |||
return self.thumbnailurl( os.path.basename(TargetFileName+".jpg") ) | |||
return self.ExtMimeIcon('image/svg+xml') | |||
def docthumbnail(self, filename): | |||
TargetFileName = self.thumbnailpath(filename) | |||
# unoconv need a libre office server to be up | |||
@@ -349,6 +373,8 @@ class MediaUpload(MediaPath): | |||
result['thumbnailUrl'] = self.createthumbnail(result['name']) | |||
elif result['type']=='application/pdf': | |||
result['thumbnailUrl'] = self.pdfthumbnail(result['name']) | |||
elif result['type']=='image/svg+xml': | |||
result['thumbnailUrl'] = self.svgthumbnail(result['name']) | |||
elif result['type'].startswith('application/vnd'): | |||
result['thumbnailUrl'] = self.docthumbnail(result['name']) | |||
else: | |||