| @@ -5,7 +5,7 @@ from pyramid.renderers import JSON, JSONP | |||||
| from pyramid.session import SignedCookieSessionFactory | from pyramid.session import SignedCookieSessionFactory | ||||
| from sqlalchemy import engine_from_config | from sqlalchemy import engine_from_config | ||||
| from pyramid.renderers import render_to_response | 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 .security import EntryFactory, groupfinder | ||||
| from pyramid_mailer import mailer_factory_from_settings | from pyramid_mailer import mailer_factory_from_settings | ||||
| import locale | import locale | ||||
| @@ -17,7 +17,7 @@ def main(global_config, **settings): | |||||
| locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") | locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") | ||||
| engine = engine_from_config(settings, 'sqlalchemy.') | engine = engine_from_config(settings, 'sqlalchemy.') | ||||
| DBSession.configure(bind=engine) | DBSession.configure(bind=engine) | ||||
| # Extract secrets from configuration file | |||||
| # Extract secrets from configuration file if any | |||||
| CookiesPasswd = settings.get('secret_Cookies', 'itsthefirstseekreet') | CookiesPasswd = settings.get('secret_Cookies', 'itsthefirstseekreet') | ||||
| AuthTktPasswd = settings.get('secret_AuthTkt', 'itsthesecondseekreet') | AuthTktPasswd = settings.get('secret_AuthTkt', 'itsthesecondseekreet') | ||||
| my_session_factory = SignedCookieSessionFactory(CookiesPasswd) | my_session_factory = SignedCookieSessionFactory(CookiesPasswd) | ||||
| @@ -34,6 +34,8 @@ def main(global_config, **settings): | |||||
| config.add_renderer('jsonp', JSONP(param_name='callback')) | config.add_renderer('jsonp', JSONP(param_name='callback')) | ||||
| config.set_session_factory(my_session_factory) | config.set_session_factory(my_session_factory) | ||||
| config.add_request_method(get_user, 'user', reify=True) | 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('static', 'static', cache_max_age=3600) | ||||
| config.add_static_view('img', 'static/img', 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) | 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('link_event', '/MesJM2L/{year:\d+}/{intervention:\w+}/link') | ||||
| config.add_route('edit_event', '/MesJM2L/{year:\d+}/{intervention:\w+}{sep:/*}{event_id:([\w-]+)?}') | 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('entities', '/entities') #{sep:/*}{Nature:\w+?}') | ||||
| config.add_route('add_entity', '/entity') | config.add_route('add_entity', '/entity') | ||||
| config.add_route('show_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}') | 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()]) | name = TextField(u'Nom de la tâche', [validators.Required()]) | ||||
| area_uid = SelectField(u'Pôle concerné', coerce=int ) | area_uid = SelectField(u'Pôle concerné', coerce=int ) | ||||
| closed_by = SelectField(u'Assigné à', 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)], | description = TextAreaField('Description', [validators.optional(), validators.Length(max=1000000)], | ||||
| filters=[strip_filter]) | filters=[strip_filter]) | ||||
| @@ -243,7 +243,7 @@ class Tiers(Base): | |||||
| lazy='dynamic') | lazy='dynamic') | ||||
| creator_id = Column(Integer) | creator_id = Column(Integer) | ||||
| membership = relationship('User_Tiers', backref="matching_tiers") | 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 | @classmethod | ||||
| def by_id(cls, id): | def by_id(cls, id): | ||||
| @@ -618,3 +618,27 @@ def get_user(request): | |||||
| # this should return None if the user doesn't exist | # this should return None if the user doesn't exist | ||||
| # in the database | # in the database | ||||
| return DBSession.query(User).filter(User.uid==userid).first() | 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; | cursor: pointer; | ||||
| } | } | ||||
| .pagecontent { | |||||
| padding: 0 50px; | |||||
| } | |||||
| .borderbox { | .borderbox { | ||||
| border: 1px solid #e1e4e5; | border: 1px solid #e1e4e5; | ||||
| margin: 1px 0 24px; | margin: 1px 0 24px; | ||||
| @@ -84,6 +88,7 @@ a { | |||||
| opacity: 0.5; | opacity: 0.5; | ||||
| position: absolute; | position: absolute; | ||||
| text-align: center; | text-align: center; | ||||
| text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); | |||||
| width: 15px; | width: 15px; | ||||
| top: -20px; | top: -20px; | ||||
| } | } | ||||
| @@ -96,6 +101,28 @@ a { | |||||
| right: 15px; | 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 | .LogistiqueTable th, .LogistiqueTable td | ||||
| { | { | ||||
| text-align:center; | text-align:center; | ||||
| @@ -143,6 +170,47 @@ a { | |||||
| text-align: right; | text-align: right; | ||||
| display: inline-block; | 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 */ | /* Fix calendar button vertical pos */ | ||||
| .date-input-buttons { | .date-input-buttons { | ||||
| @@ -1,6 +1,6 @@ | |||||
| <%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | <%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | ||||
| <%def name="Resume()"> | <%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> | <CAPTION>La feuille de route de mes interventions</CAPTION> | ||||
| <thead style="text-align:center"> | <thead style="text-align:center"> | ||||
| <tr> | <tr> | ||||
| @@ -197,7 +197,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||||
| <div id="collapseMe" class="accordion-body collapse in"> | <div id="collapseMe" class="accordion-body collapse in"> | ||||
| <div class="accordion-inner"> | <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"> | <thead style="text-align:center"> | ||||
| <tr> | <tr> | ||||
| <th>Section</th> | <th>Section</th> | ||||
| @@ -246,7 +246,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||||
| <div id="collapseAll" class="accordion-body collapse"> | <div id="collapseAll" class="accordion-body collapse"> | ||||
| <div class="accordion-inner"> | <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"> | <thead style="text-align:center"> | ||||
| <tr> | <tr> | ||||
| <th>Section</th> | <th>Section</th> | ||||
| @@ -1,5 +1,7 @@ | |||||
| <%inherit file="jm2l:templates/layout.mako"/> | <%inherit file="jm2l:templates/layout.mako"/> | ||||
| <%namespace name="helpers" file="jm2l:templates/helpers.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> | <h3><a href="mailto:contact@jm2l.linux-azur.org">Sponsoriser l’événement</a></h3> | ||||
| <p> | <p> | ||||
| Si vous voulez aider l’organisation par des moyens financiers ou | Si vous voulez aider l’organisation par des moyens financiers ou | ||||
| @@ -73,7 +75,5 @@ DicForm ={ | |||||
| </p> | </p> | ||||
| Cliquez sur ce lien pour finir votre inscription : <a href="${request.route_path('bymail', hash=link)}">Mon lien</a> | Cliquez sur ce lien pour finir votre inscription : <a href="${request.route_path('bymail', hash=link)}">Mon lien</a> | ||||
| % endif | % endif | ||||
| <br> | |||||
| <br> | |||||
| <br> | |||||
| <br> | |||||
| </div> | |||||
| @@ -1,65 +1,77 @@ | |||||
| <%inherit file="jm2l:templates/layout.mako"/> | <%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"> | <div class="tabbable" id="main_tab"> | ||||
| <ul class="nav nav-tabs"> | <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="#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="#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> | </ul> | ||||
| <div class="tab-content"> | <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> | <ul> | ||||
| <li>Trajet sur la ligne Nice-Sophia Express : | <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> | ||||
| <li>Trajet sur la ligne Cagnes-Villeneuve-Biot-Sophia : | <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> | <a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/231.pdf">ligne 231</a> | ||||
| </li> | </li> | ||||
| <li>Trajet sur la ligne StLaurent-Cagnes-Sophia : | <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> | ||||
| <li>Trajet sur la ligne Vence-StPaul-Valbonne-Sophia : | <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> | <ul> | ||||
| <li>Arrivée : descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | <li>Arrivée : descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | ||||
| </ul> | </ul> | ||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| <h3>Depuis Cannes (durée : environ 30') :</h3> | |||||
| <h4>Depuis Cannes (durée : environ 30') :</h4> | |||||
| <ul> | <ul> | ||||
| <li>Trajet sur la ligne Cannes - Sophia Antipolis : | <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> | <ul> | ||||
| <li>Arrivée : descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | <li>Arrivée : descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | ||||
| </ul> | </ul> | ||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| <h3>Depuis Antibes (durée : entre 10 et 30') :</h3> | |||||
| <h4>Depuis Antibes (durée : entre 10 et 30') :</h4> | |||||
| <ul> | <ul> | ||||
| <li>Trajet sur la ligne Express (uniquement pour le vendredi) | <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> | <a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne 100</a> | ||||
| @@ -120,22 +132,20 @@ | |||||
| </div> | </div> | ||||
| <div class="tab-pane fade in" id="Contact"> | <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> | ||||
| </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> | <h1 class="page-title">Dossier de presse ${DisplayYear}</h1> | ||||
| % if content and content.doss_presse: | % if content and content.doss_presse: | ||||
| <div class="span10 offset1"> | |||||
| ${content.doss_presse | n} | ${content.doss_presse | n} | ||||
| </div> | |||||
| % endif | % endif | ||||
| %if 0 and DisplayYear==2013: | %if 0 and DisplayYear==2013: | ||||
| <div class="region region-content"> | <div class="region region-content"> | ||||
| @@ -13,13 +13,21 @@ TabDisplay = [ | |||||
| border: 1px solid #ccc; | border: 1px solid #ccc; | ||||
| height: 65px; | height: 65px; | ||||
| } | } | ||||
| .SvgBody { | |||||
| padding: 0px; | |||||
| background-color: transparent; | |||||
| } | |||||
| .EvtBox { | |||||
| font-size: 0.7em; | |||||
| line-height: 1.2em; | |||||
| padding:5px; | |||||
| height:100%; | |||||
| } | |||||
| .Conference { | .Conference { | ||||
| fill:#f9fde8; | |||||
| stroke: #a2bc13; | |||||
| fill: #f9fde8; | |||||
| } | } | ||||
| .Concert { | .Concert { | ||||
| fill:#2EE; | |||||
| stroke: #ccc; | |||||
| fill: #2EE; | |||||
| } | } | ||||
| .Atelier { | .Atelier { | ||||
| fill: #faebeb; | fill: #faebeb; | ||||
| @@ -30,8 +38,7 @@ TabDisplay = [ | |||||
| stroke: #ff9912; | stroke: #ff9912; | ||||
| } | } | ||||
| .Repas { | .Repas { | ||||
| fill:#2EE; | |||||
| stroke: #ccc; | |||||
| fill: #2EE; | |||||
| } | } | ||||
| svg { | svg { | ||||
| font: 10px sans-serif; | font: 10px sans-serif; | ||||
| @@ -45,30 +52,28 @@ rect { | |||||
| .axis path, | .axis path, | ||||
| .axis line { | .axis line { | ||||
| fill: none; | fill: none; | ||||
| stroke: #000; | |||||
| stroke: #222; | |||||
| } | } | ||||
| </style> | </style> | ||||
| <h2>Le Programme ${DisplayYear}</h2> | <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> | </div> | ||||
| % endfor | |||||
| </div> | </div> | ||||
| % endfor | |||||
| </div> | </div> | ||||
| </div> | |||||
| </div> | |||||
| <div id="DivProg" style="border: 1px solid black;"></div> | <div id="DivProg" style="border: 1px solid black;"></div> | ||||
| @@ -5,20 +5,14 @@ | |||||
| <script src="/js/jm2l.js"></script> | <script src="/js/jm2l.js"></script> | ||||
| <script src="/vendor/ckeditor/ckeditor.js"></script> | <script src="/vendor/ckeditor/ckeditor.js"></script> | ||||
| <script src="/vendor/select2/js/select2.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"> | <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> | </script> | ||||
| </%def> | </%def> | ||||
| <%def name="cssAddOn()"> | <%def name="cssAddOn()"> | ||||
| @@ -26,10 +20,12 @@ | |||||
| <link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui.css"> | <link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui.css"> | ||||
| <link rel="stylesheet" href="/css/jm2l.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/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 --> | <!-- 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-noscript.css"></noscript> | ||||
| <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> | <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> | ||||
| </%def> | </%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> | <a style="float:right;" href="${request.route_path('list_task', _anchor=area)}">Retour à la liste</a> | ||||
| % if 'uid' in form._fields.keys(): | % if 'uid' in form._fields.keys(): | ||||
| <h3>Editer une tâche</h3> | <h3>Editer une tâche</h3> | ||||
| @@ -41,7 +37,7 @@ DicForm = { | |||||
| 'name': {'PlaceHolder':u"Nom de la tâche", "FieldStyle":"width:90%;" }, | 'name': {'PlaceHolder':u"Nom de la tâche", "FieldStyle":"width:90%;" }, | ||||
| 'area_uid': {"FieldStyle":"width:16em;", 'ContainerStyle':"float:left;" }, | 'area_uid': {"FieldStyle":"width:16em;", 'ContainerStyle':"float:left;" }, | ||||
| 'closed_by': {"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" }, | '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") | FieldStyle = DicFormat[Field.name].get("FieldStyle") | ||||
| Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ] | 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: | % else: | ||||
| ${Field(placeholder=PlaceHolder or False, style=FieldStyle, class_=Class)} | ${Field(placeholder=PlaceHolder or False, style=FieldStyle, class_=Class)} | ||||
| % endif | % endif | ||||
| @@ -253,7 +253,7 @@ TabJs = {'select':[], 'desc':[]} | |||||
| ## Wrapper pour les intervention utilisateur | ## Wrapper pour les intervention utilisateur | ||||
| ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||
| <%def name="show_Interventions(ListEvent, HeadTitle=None, NotFoundTitle=None)"> \ | <%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> | <tr> | ||||
| <th style="width:6em;text-align:center;">Date</th> | <th style="width:6em;text-align:center;">Date</th> | ||||
| % if HeadTitle: | % if HeadTitle: | ||||
| @@ -521,3 +521,52 @@ TabJs = {'select':[], 'desc':[]} | |||||
| ${Place.description | n} | ${Place.description | n} | ||||
| % endif | % endif | ||||
| </%def> \ | </%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> | </div> | ||||
| <div class="row"> | |||||
| <div class="row-fluid"> | |||||
| <div class="tabbable" id="main_tab"> | <div class="tabbable" id="main_tab"> | ||||
| <ul class="nav nav-tabs" style="margin-bottom: 5px;"> | <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> | <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()} | ${helpers.uploader_js()} | ||||
| <div id="wrap"> | <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> | </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> | ||||
| <div id="middle"> | <div id="middle"> | ||||
| <div class="navbar"> | <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="/participer-l-evenement#inscription">Je m'inscris</a></li> | ||||
| <li><a href="/sign/login">Je m'identifie</a></li> | <li><a href="/sign/login">Je m'identifie</a></li> | ||||
| % endif | % endif | ||||
| <li>Mode | |||||
| <span class="visible-phone"> ✔ Phone</span> | |||||
| <span class="visible-tablet"> ✔ Tablet</span> | |||||
| <span class="visible-desktop"> ✔ Desktop</span> | |||||
| </li> | |||||
| </ul> | </ul> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -96,19 +135,38 @@ ${helpers.uploader_js()} | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div id="bottom"> | <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> | ||||
| </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/jquery.min.js"></script> | ||||
| <script src="/vendor/bootstrap.min.js"></script> | <script src="/vendor/bootstrap.min.js"></script> | ||||
| <script src="/vendor/fileupload/js/jquery-uploader.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()): | % for Num, Entity_Type in enumerate(entities.keys()): | ||||
| <div class="tab-pane fade ${["","active "][Num==0]} in" id="${Entity_Type}"> | <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> | <thead> | ||||
| <tr> | <tr> | ||||
| <th style="width:7em;text-align:center;">Type</th> | <th style="width:7em;text-align:center;">Type</th> | ||||
| @@ -1,15 +1,36 @@ | |||||
| ## -*- coding: utf-8 -*- | ## -*- coding: utf-8 -*- | ||||
| <%def name="Bienvenue(request, User)"> | <%def name="Bienvenue(request, User)"> | ||||
| <H4>JM2L</H4> | <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> | </p> | ||||
| <br> | |||||
| L'équipe des <b>JM2L</b> | |||||
| <br> | |||||
| </%def> \ | </%def> \ | ||||
| % if action=='Welcome': | % if action=='Welcome': | ||||
| ${self.Bienvenue(request, User)} | ${self.Bienvenue(request, User)} | ||||
| @@ -1,14 +1,29 @@ | |||||
| ## -*- coding: utf-8 -*- | ## -*- coding: utf-8 -*- | ||||
| <%def name="Bienvenue(request, User)"> | <%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)} | ${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> \ | </%def> \ | ||||
| % if action=='Welcome': | % if action=='Welcome': | ||||
| ${self.Bienvenue(request, User)} | ${self.Bienvenue(request, User)} | ||||
| @@ -211,6 +211,30 @@ class MediaUpload(MediaPath): | |||||
| return self.thumbnailurl( os.path.basename(TargetFileName+".jpg") ) | return self.thumbnailurl( os.path.basename(TargetFileName+".jpg") ) | ||||
| return self.ExtMimeIcon('application/pdf') | 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): | def docthumbnail(self, filename): | ||||
| TargetFileName = self.thumbnailpath(filename) | TargetFileName = self.thumbnailpath(filename) | ||||
| # unoconv need a libre office server to be up | # unoconv need a libre office server to be up | ||||
| @@ -349,6 +373,8 @@ class MediaUpload(MediaPath): | |||||
| result['thumbnailUrl'] = self.createthumbnail(result['name']) | result['thumbnailUrl'] = self.createthumbnail(result['name']) | ||||
| elif result['type']=='application/pdf': | elif result['type']=='application/pdf': | ||||
| result['thumbnailUrl'] = self.pdfthumbnail(result['name']) | result['thumbnailUrl'] = self.pdfthumbnail(result['name']) | ||||
| elif result['type']=='image/svg+xml': | |||||
| result['thumbnailUrl'] = self.svgthumbnail(result['name']) | |||||
| elif result['type'].startswith('application/vnd'): | elif result['type'].startswith('application/vnd'): | ||||
| result['thumbnailUrl'] = self.docthumbnail(result['name']) | result['thumbnailUrl'] = self.docthumbnail(result['name']) | ||||
| else: | else: | ||||