Browse Source

Many Changes before production load

master
tr4ck3ur des JM2L 9 years ago
parent
commit
9e4f54c41c
18 changed files with 399 additions and 123 deletions
  1. +5
    -3
      jm2l/__init__.py
  2. +1
    -1
      jm2l/forms.py
  3. +25
    -1
      jm2l/models.py
  4. +68
    -0
      jm2l/static/css/jm2l.css
  5. +1
    -1
      jm2l/templates/Interventions/Interventions.mako
  6. +2
    -2
      jm2l/templates/Logistique/Logistique.mako
  7. +4
    -4
      jm2l/templates/Participer.mako
  8. +56
    -46
      jm2l/templates/Public/Plan.mako
  9. +2
    -0
      jm2l/templates/Public/Presse.mako
  10. +27
    -22
      jm2l/templates/Public/Programme.mako
  11. +10
    -14
      jm2l/templates/Staff/tasks.mako
  12. +52
    -3
      jm2l/templates/helpers.mako
  13. +1
    -1
      jm2l/templates/jm2l.mako
  14. +71
    -13
      jm2l/templates/layout.mako
  15. +1
    -1
      jm2l/templates/list_tiers.mako
  16. +28
    -7
      jm2l/templates/mail_html.mako
  17. +19
    -4
      jm2l/templates/mail_plain.mako
  18. +26
    -0
      jm2l/upload.py

+ 5
- 3
jm2l/__init__.py View File

@@ -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-]+)?}')


+ 1
- 1
jm2l/forms.py View File

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




+ 25
- 1
jm2l/models.py View File

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


+ 68
- 0
jm2l/static/css/jm2l.css View File

@@ -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
- 1
jm2l/templates/Interventions/Interventions.mako View File

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


+ 2
- 2
jm2l/templates/Logistique/Logistique.mako View File

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


+ 4
- 4
jm2l/templates/Participer.mako View File

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

+ 56
- 46
jm2l/templates/Public/Plan.mako View File

@@ -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)&nbsp;6 52 42 31 37</dd>
</dl>
</div>
<div class="span4 offset1">
<h4>Le lieu</h4>
<address>
<strong>École&nbsp;</strong><strong>Polytech’Nice-Sophia </strong><br>
930, route des Colles (site des Templiers)&nbsp;<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&nbsp;</strong><strong>Polytech’Nice-Sophia </strong><br>
930, route des Colles (site des Templiers)&nbsp;<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&amp;lon=7.07081&amp;zoom=14&amp;layers=M&amp;mlat=43.61637&amp;mlon=7.08520">Voir une carte plus grande</a>
</p>
</div>
<div class="tab-pane fade in" id="Trsp">
<h3>Depuis Nice (durée&nbsp;: environ 30')&nbsp;:</h3>
<div class="tab-pane fade active in" id="Trsp">
<h3>Bus</h3>
<h4>Depuis Nice (durée&nbsp;: environ 30')&nbsp;:</h4>
<ul> <ul>
<li>Trajet sur la ligne Nice-Sophia Express&nbsp;:&nbsp; <li>Trajet sur la ligne Nice-Sophia Express&nbsp;:&nbsp;
<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&nbsp;:&nbsp; <li>Trajet sur la ligne Cagnes-Villeneuve-Biot-Sophia&nbsp;:&nbsp;
<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&nbsp;:&nbsp; <li>Trajet sur la ligne StLaurent-Cagnes-Sophia&nbsp;:&nbsp;
<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&nbsp;:&nbsp; <li>Trajet sur la ligne Vence-StPaul-Valbonne-Sophia&nbsp;:&nbsp;
<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&nbsp;: descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> <li>Arrivée&nbsp;: descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li>
</ul> </ul>
</li> </li>
</ul> </ul>
<h3>Depuis Cannes (durée&nbsp;: environ 30')&nbsp;:</h3>
<h4>Depuis Cannes (durée&nbsp;: environ 30')&nbsp;:</h4>
<ul> <ul>
<li>Trajet sur la ligne Cannes - Sophia Antipolis&nbsp;:&nbsp; <li>Trajet sur la ligne Cannes - Sophia Antipolis&nbsp;:&nbsp;
<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&nbsp;: descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> <li>Arrivée&nbsp;: descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li>
</ul> </ul>
</li> </li>
</ul> </ul>
<h3>Depuis Antibes (durée&nbsp;: entre 10 et 30')&nbsp;:</h3>
<h4>Depuis Antibes (durée&nbsp;: entre 10 et 30')&nbsp;:</h4>
<ul> <ul>
<li>Trajet sur la ligne Express (uniquement pour le vendredi)&nbsp; <li>Trajet sur la ligne Express (uniquement pour le vendredi)&nbsp;
<a href="http://www.envibus.fr/ligne_detail.asp?id=79&amp;id_commune=1">ligne 100</a> <a href="http://www.envibus.fr/ligne_detail.asp?id=79&amp;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&nbsp;+33 (0) 6 70 73 94 12</strong>
</li>
<li>
<strong>Véronique Fritière&nbsp;+33 (0)&nbsp;6 52 42 31 37</strong>
</li>
</ul>
<h3>Coordinateur&nbsp;Polytech :</h3>
<ul>
<li><strong>Romain&nbsp;+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&amp;lon=7.07081&amp;zoom=14&amp;layers=M&amp;mlat=43.61637&amp;mlon=7.08520">Voir une carte plus grande</a>
</p>
</div>

</div>
<br>



+ 2
- 0
jm2l/templates/Public/Presse.mako View File

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


+ 27
- 22
jm2l/templates/Public/Programme.mako View File

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




+ 10
- 14
jm2l/templates/Staff/tasks.mako View File

@@ -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" },
} }
%> %>


+ 52
- 3
jm2l/templates/helpers.mako View File

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

+ 1
- 1
jm2l/templates/jm2l.mako View File

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


+ 71
- 13
jm2l/templates/layout.mako View File

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


+ 1
- 1
jm2l/templates/list_tiers.mako View File

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


+ 28
- 7
jm2l/templates/mail_html.mako View File

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


+ 19
- 4
jm2l/templates/mail_plain.mako View File

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


+ 26
- 0
jm2l/upload.py View File

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


Loading…
Cancel
Save