Ver código fonte

Many Changes before production load

master
tr4ck3ur des JM2L 9 anos atrás
pai
commit
9e4f54c41c
18 arquivos alterados com 399 adições e 123 exclusões
  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 Ver arquivo

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


+ 1
- 1
jm2l/forms.py Ver arquivo

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



+ 25
- 1
jm2l/models.py Ver arquivo

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


+ 68
- 0
jm2l/static/css/jm2l.css Ver arquivo

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

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


+ 2
- 2
jm2l/templates/Logistique/Logistique.mako Ver arquivo

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


+ 4
- 4
jm2l/templates/Participer.mako Ver arquivo

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

+ 56
- 46
jm2l/templates/Public/Plan.mako Ver arquivo

@@ -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)&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">
<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&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>
<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>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>
</li>
<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>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>
<li>Arrivée&nbsp;: descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li>
</ul>
</li>
</ul>
<h3>Depuis Cannes (durée&nbsp;: environ 30')&nbsp;:</h3>
<h4>Depuis Cannes (durée&nbsp;: environ 30')&nbsp;:</h4>
<ul>
<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>
<li>Arrivée&nbsp;: descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li>
</ul>
</li>
</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>
<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>
@@ -120,22 +132,20 @@
</div>
<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>
<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 Ver arquivo

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


+ 27
- 22
jm2l/templates/Public/Programme.mako Ver arquivo

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



+ 10
- 14
jm2l/templates/Staff/tasks.mako Ver arquivo

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


+ 52
- 3
jm2l/templates/helpers.mako Ver arquivo

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

+ 1
- 1
jm2l/templates/jm2l.mako Ver arquivo

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


+ 71
- 13
jm2l/templates/layout.mako Ver arquivo

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


+ 1
- 1
jm2l/templates/list_tiers.mako Ver arquivo

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


+ 28
- 7
jm2l/templates/mail_html.mako Ver arquivo

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


+ 19
- 4
jm2l/templates/mail_plain.mako Ver arquivo

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


+ 26
- 0
jm2l/upload.py Ver arquivo

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


Carregando…
Cancelar
Salvar