| @@ -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: | |||