Many changes for templates

This commit is contained in:
2015-03-23 09:53:12 +01:00
parent 9e4f54c41c
commit 7825a33533
42 changed files with 1308 additions and 422 deletions
+1
View File
@@ -90,6 +90,7 @@ def main(global_config, **settings):
# HTML Routes - Logged # HTML Routes - Logged
#config.add_route('profil', 'MesJM2L') #config.add_route('profil', 'MesJM2L')
config.add_route('jm2l', '/MesJM2L') config.add_route('jm2l', '/MesJM2L')
config.add_route('sejour', '/MonSejour')
config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}') config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}')
# Handle exchanges # Handle exchanges
+10 -2
View File
@@ -1,4 +1,4 @@
# -*- coding: utf8 -*-
from pyramid.view import view_config from pyramid.view import view_config
from pyramid.security import remember, forget from pyramid.security import remember, forget
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
@@ -9,6 +9,10 @@ import datetime
def login(request): def login(request):
return {} return {}
@view_config(route_name='auth', match_param="action=forgot", renderer="jm2l:templates/login.mako")
def forgot(request):
return {'forgot':True}
@view_config(route_name='bymail', renderer="string") @view_config(route_name='bymail', renderer="string")
def bymail(request): def bymail(request):
myhash = request.matchdict.get('hash', "") myhash = request.matchdict.get('hash', "")
@@ -30,7 +34,7 @@ def bymail(request):
def sign_in_out(request): def sign_in_out(request):
username = request.POST.get('username') username = request.POST.get('username')
if username: if username:
user = User.by_name(username) user = User.by_slug(username)
if user and user.verify_password(request.POST.get('password')): if user and user.verify_password(request.POST.get('password')):
user.last_logged=datetime.datetime.now() user.last_logged=datetime.datetime.now()
DBSession.merge(user) DBSession.merge(user)
@@ -41,6 +45,10 @@ def sign_in_out(request):
headers = forget(request) headers = forget(request)
else: else:
headers = forget(request) headers = forget(request)
if request.matchdict.get('action')=='in':
request.session.flash(('error',u'Vous avez entré un mauvais couple identifiant/password !'))
return HTTPFound(location="/sign/login",
headers=headers)
return HTTPFound(location=request.route_url('home'), return HTTPFound(location=request.route_url('home'),
headers=headers) headers=headers)
+1 -19
View File
@@ -94,25 +94,7 @@ class AddIntervenant(MyBaseForm):
csrf = False csrf = False
event_uid = HiddenField() event_uid = HiddenField()
nom = TextField(u'Nom', [validators.Length(max=80)], intervenant = SelectField(u'Intervenant', coerce=int )
filters=[strip_filter],
description = u"Les espaces sont autorisés, la ponctuation n'est " +
u"pas autorisée à l'exception des points, traits d'union, " +
u"apostrophes et tirets bas."
)
prenom = TextField(u'Prénom', [validators.Length(max=80)],
filters=[strip_filter],
description = u"Les espaces sont autorisés, la ponctuation n'est " +
u"pas autorisée à l'exception des points, traits d'union, " +
u"apostrophes et tirets bas."
)
email = TextField(u'Email', [validators.required(),
validators.length(max=10),
validators.Email(message='Ceci ne ressemble pas à une adresse valide')],
description=u"Afin d'éviter la duplication d'information et les doublons inutile, "+
u"pensez d'abord à lui demander de confirmer le mail qu'il a utilisé lors de "+
u"son inscription sur le site.")
add = SubmitField('Ajouter des intervenants')
class ConfCreateForm(MyBaseForm): class ConfCreateForm(MyBaseForm):
+8
View File
@@ -123,6 +123,14 @@ a {
right: 15px; right: 15px;
} }
.carousel-vote {
padding: 15px 50px;
position: absolute;
right: 0;
bottom: 0;
}
.LogistiqueTable th, .LogistiqueTable td .LogistiqueTable th, .LogistiqueTable td
{ {
text-align:center; text-align:center;
+1 -1
View File
@@ -40,7 +40,7 @@ body h6{font-family:"NeutonRegular","Lucida Grande",Lucida,Verdana,sans-serif;fo
.wrapper{width:100%} .wrapper{width:100%}
#top,#top-small,#bottom{width:100%;} #top,#top-small,#bottom{width:100%;}
#top{color:#000000;height:215px;} #top{color:#000000;height:215px;}
#bottom{color:#222;background-color:#ffffff;} #bottom{color:#222;}
.top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;} .top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;}
.top{padding-top:40px;} .top{padding-top:40px;}
.top-small{padding-top:10px;} .top-small{padding-top:10px;}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 799 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

+4
View File
@@ -24,5 +24,9 @@
<stop offset="0%" stop-color="#EEE" stop-opacity="0"/> <stop offset="0%" stop-color="#EEE" stop-opacity="0"/>
<stop offset="15%" stop-color="#fff4e5" stop-opacity="1"/> <stop offset="15%" stop-color="#fff4e5" stop-opacity="1"/>
</linearGradient> </linearGradient>
<linearGradient id="BoxGradient-Concert" spreadMethod="pad" x1="100%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#EEE" stop-opacity="0"/>
<stop offset="15%" stop-color="#2EE" stop-opacity="1"/>
</linearGradient>
</defs> </defs>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

+11 -9
View File
@@ -50,7 +50,8 @@ d3.json("le-prog-json",
.attr("id", TypeArea+"-"+Keys[k]) .attr("id", TypeArea+"-"+Keys[k])
.attr("area", TypeArea) .attr("area", TypeArea)
.style("float", "left") .style("float", "left")
.style("margin-left", "5px") .style("margin-left", "20px")
.style("margin-right", "3px")
.property("checked",true); .property("checked",true);
d3.select("#Schedule_SVG_"+Keys[k]) d3.select("#Schedule_SVG_"+Keys[k])
@@ -64,10 +65,10 @@ d3.json("le-prog-json",
svg = d3.select("#Schedule_SVG_"+Keys[k]) svg = d3.select("#Schedule_SVG_"+Keys[k])
.append("svg") .append("svg")
.attr("id", "TimeTable-"+Keys[k]) .attr("id", "TimeTable-"+Keys[k])
.attr("width", width + margin.right + margin.left) .attr("width", "100%") //width + margin.right + margin.left)
.attr("height", height + margin.top + margin.bottom) //.attr("height", height + margin.top + margin.bottom)
//.attr("viewBox", "0 0 " + width + " " + height ) .attr("viewBox", "0 0 " + (width + margin.right + margin.left) + " " + (height + margin.top + margin.bottom) )
//.attr("preserveAspectRatio", "xMidYMid"); .attr("preserveAspectRatio", "xMidYMid meet");
svg.append("g") svg.append("g")
.attr("class", "xAxis axis"); .attr("class", "xAxis axis");
@@ -78,7 +79,7 @@ d3.json("le-prog-json",
var chart = svg.append("g") var chart = svg.append("g")
.attr("class", "timetable"); .attr("class", "timetable");
HandleEvents(Keys[k]) HandleEvents(Keys[k]);
displayit(json["all"][Keys[k]], Salles[Keys[k]], Keys[k]); displayit(json["all"][Keys[k]], Salles[Keys[k]], Keys[k]);
} }
}); });
@@ -99,7 +100,7 @@ function HandleEvents(Ctrl) {
ArrayChoice.push(v.attributes['area'].value) ArrayChoice.push(v.attributes['area'].value)
} }
) )
area_select = Array() area_select = Array();
selection = Tasks[Ctrl].filter(function(v) { selection = Tasks[Ctrl].filter(function(v) {
return ArrayChoice.indexOf(v.status)>=0; return ArrayChoice.indexOf(v.status)>=0;
}); });
@@ -160,9 +161,10 @@ function displayit(Set_of_Task, Set_of_Area, key) {
content.enter() content.enter()
.insert("foreignObject",":first-child") .insert("foreignObject",":first-child")
.append("xhtml:div") .append("xhtml:body")
.attr("class", "SvgBody")
.html(function(d) { .html(function(d) {
return '<div style="padding:5px;height:100%"><a href="/event/'+ d.uid + return '<div class="EvtBox '+ taskStatus[d.status] +'"><a href="/event/'+ d.uid +
'">' + d.desc + '</a></div>' '">' + d.desc + '</a></div>'
}) })
.transition() .transition()
+474
View File
@@ -0,0 +1,474 @@
/* =========================================================
* bootstrap-datepicker.js
* http://www.eyecon.ro/bootstrap-datepicker
* =========================================================
* Copyright 2012 Stefan Petre
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function( $ ) {
// Picker object
var Datepicker = function(element, options){
this.element = $(element);
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
this.picker = $(DPGlobal.template)
.appendTo('body')
.on({
click: $.proxy(this.click, this)//,
//mousedown: $.proxy(this.mousedown, this)
});
this.isInput = this.element.is('input');
this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
if (this.isInput) {
this.element.on({
focus: $.proxy(this.show, this),
//blur: $.proxy(this.hide, this),
keyup: $.proxy(this.update, this)
});
} else {
if (this.component){
this.component.on('click', $.proxy(this.show, this));
} else {
this.element.on('click', $.proxy(this.show, this));
}
}
this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0;
if (typeof this.minViewMode === 'string') {
switch (this.minViewMode) {
case 'months':
this.minViewMode = 1;
break;
case 'years':
this.minViewMode = 2;
break;
default:
this.minViewMode = 0;
break;
}
}
this.viewMode = options.viewMode||this.element.data('date-viewmode')||0;
if (typeof this.viewMode === 'string') {
switch (this.viewMode) {
case 'months':
this.viewMode = 1;
break;
case 'years':
this.viewMode = 2;
break;
default:
this.viewMode = 0;
break;
}
}
this.startViewMode = this.viewMode;
this.weekStart = options.weekStart||this.element.data('date-weekstart')||0;
this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;
this.onRender = options.onRender;
this.fillDow();
this.fillMonths();
this.update();
this.showMode();
};
Datepicker.prototype = {
constructor: Datepicker,
show: function(e) {
this.picker.show();
this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
this.place();
$(window).on('resize', $.proxy(this.place, this));
if (e ) {
e.stopPropagation();
e.preventDefault();
}
if (!this.isInput) {
}
var that = this;
$(document).on('mousedown', function(ev){
if ($(ev.target).closest('.datepicker').length == 0) {
that.hide();
}
});
this.element.trigger({
type: 'show',
date: this.date
});
},
hide: function(){
this.picker.hide();
$(window).off('resize', this.place);
this.viewMode = this.startViewMode;
this.showMode();
if (!this.isInput) {
$(document).off('mousedown', this.hide);
}
//this.set();
this.element.trigger({
type: 'hide',
date: this.date
});
},
set: function() {
var formated = DPGlobal.formatDate(this.date, this.format);
if (!this.isInput) {
if (this.component){
this.element.find('input').prop('value', formated);
}
this.element.data('date', formated);
} else {
this.element.prop('value', formated);
}
},
setValue: function(newDate) {
if (typeof newDate === 'string') {
this.date = DPGlobal.parseDate(newDate, this.format);
} else {
this.date = new Date(newDate);
}
this.set();
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
this.fill();
},
place: function(){
var offset = this.component ? this.component.offset() : this.element.offset();
this.picker.css({
top: offset.top + this.height,
left: offset.left
});
},
update: function(newDate){
this.date = DPGlobal.parseDate(
typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')),
this.format
);
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
this.fill();
},
fillDow: function(){
var dowCnt = this.weekStart;
var html = '<tr>';
while (dowCnt < this.weekStart + 7) {
html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>';
}
html += '</tr>';
this.picker.find('.datepicker-days thead').append(html);
},
fillMonths: function(){
var html = '';
var i = 0
while (i < 12) {
html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>';
}
this.picker.find('.datepicker-months td').append(html);
},
fill: function() {
var d = new Date(this.viewDate),
year = d.getFullYear(),
month = d.getMonth(),
currentDate = this.date.valueOf();
this.picker.find('.datepicker-days th:eq(1)')
.text(DPGlobal.dates.months[month]+' '+year);
var prevMonth = new Date(year, month-1, 28,0,0,0,0),
day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
prevMonth.setDate(day);
prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7);
var nextMonth = new Date(prevMonth);
nextMonth.setDate(nextMonth.getDate() + 42);
nextMonth = nextMonth.valueOf();
var html = [];
var clsName,
prevY,
prevM;
while(prevMonth.valueOf() < nextMonth) {
if (prevMonth.getDay() === this.weekStart) {
html.push('<tr>');
}
clsName = this.onRender(prevMonth);
prevY = prevMonth.getFullYear();
prevM = prevMonth.getMonth();
if ((prevM < month && prevY === year) || prevY < year) {
clsName += ' old';
} else if ((prevM > month && prevY === year) || prevY > year) {
clsName += ' new';
}
if (prevMonth.valueOf() === currentDate) {
clsName += ' active';
}
html.push('<td class="day '+clsName+'">'+prevMonth.getDate() + '</td>');
if (prevMonth.getDay() === this.weekEnd) {
html.push('</tr>');
}
prevMonth.setDate(prevMonth.getDate()+1);
}
this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
var currentYear = this.date.getFullYear();
var months = this.picker.find('.datepicker-months')
.find('th:eq(1)')
.text(year)
.end()
.find('span').removeClass('active');
if (currentYear === year) {
months.eq(this.date.getMonth()).addClass('active');
}
html = '';
year = parseInt(year/10, 10) * 10;
var yearCont = this.picker.find('.datepicker-years')
.find('th:eq(1)')
.text(year + '-' + (year + 9))
.end()
.find('td');
year -= 1;
for (var i = -1; i < 11; i++) {
html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>';
year += 1;
}
yearCont.html(html);
},
click: function(e) {
e.stopPropagation();
e.preventDefault();
var target = $(e.target).closest('span, td, th');
if (target.length === 1) {
switch(target[0].nodeName.toLowerCase()) {
case 'th':
switch(target[0].className) {
case 'switch':
this.showMode(1);
break;
case 'prev':
case 'next':
this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call(
this.viewDate,
this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +
DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1)
);
this.fill();
this.set();
break;
}
break;
case 'span':
if (target.is('.month')) {
var month = target.parent().find('span').index(target);
this.viewDate.setMonth(month);
} else {
var year = parseInt(target.text(), 10)||0;
this.viewDate.setFullYear(year);
}
if (this.viewMode !== 0) {
this.date = new Date(this.viewDate);
this.element.trigger({
type: 'changeDate',
date: this.date,
viewMode: DPGlobal.modes[this.viewMode].clsName
});
}
this.showMode(-1);
this.fill();
this.set();
break;
case 'td':
if (target.is('.day') && !target.is('.disabled')){
var day = parseInt(target.text(), 10)||1;
var month = this.viewDate.getMonth();
if (target.is('.old')) {
month -= 1;
} else if (target.is('.new')) {
month += 1;
}
var year = this.viewDate.getFullYear();
this.date = new Date(year, month, day,0,0,0,0);
this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0);
this.fill();
this.set();
this.element.trigger({
type: 'changeDate',
date: this.date,
viewMode: DPGlobal.modes[this.viewMode].clsName
});
}
break;
}
}
},
mousedown: function(e){
e.stopPropagation();
e.preventDefault();
},
showMode: function(dir) {
if (dir) {
this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
}
this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
}
};
$.fn.datepicker = function ( option, val ) {
return this.each(function () {
var $this = $(this),
data = $this.data('datepicker'),
options = typeof option === 'object' && option;
if (!data) {
$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
}
if (typeof option === 'string') data[option](val);
});
};
$.fn.datepicker.defaults = {
onRender: function(date) {
return '';
}
};
$.fn.datepicker.Constructor = Datepicker;
var DPGlobal = {
modes: [
{
clsName: 'days',
navFnc: 'Month',
navStep: 1
},
{
clsName: 'months',
navFnc: 'FullYear',
navStep: 1
},
{
clsName: 'years',
navFnc: 'FullYear',
navStep: 10
}],
dates:{
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
},
isLeapYear: function (year) {
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
},
getDaysInMonth: function (year, month) {
return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
},
parseFormat: function(format){
var separator = format.match(/[.\/\-\s].*?/),
parts = format.split(/\W+/);
if (!separator || !parts || parts.length === 0){
throw new Error("Invalid date format.");
}
return {separator: separator, parts: parts};
},
parseDate: function(date, format) {
var parts = date.split(format.separator),
date = new Date(),
val;
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
if (parts.length === format.parts.length) {
var year = date.getFullYear(), day = date.getDate(), month = date.getMonth();
for (var i=0, cnt = format.parts.length; i < cnt; i++) {
val = parseInt(parts[i], 10)||1;
switch(format.parts[i]) {
case 'dd':
case 'd':
day = val;
date.setDate(val);
break;
case 'mm':
case 'm':
month = val - 1;
date.setMonth(val - 1);
break;
case 'yy':
year = 2000 + val;
date.setFullYear(2000 + val);
break;
case 'yyyy':
year = val;
date.setFullYear(val);
break;
}
}
date = new Date(year, month, day, 0 ,0 ,0);
}
return date;
},
formatDate: function(date, format){
var val = {
d: date.getDate(),
m: date.getMonth() + 1,
yy: date.getFullYear().toString().substring(2),
yyyy: date.getFullYear()
};
val.dd = (val.d < 10 ? '0' : '') + val.d;
val.mm = (val.m < 10 ? '0' : '') + val.m;
var date = [];
for (var i=0, cnt = format.parts.length; i < cnt; i++) {
date.push(val[format.parts[i]]);
}
return date.join(format.separator);
},
headTemplate: '<thead>'+
'<tr>'+
'<th class="prev">&lsaquo;</th>'+
'<th colspan="5" class="switch"></th>'+
'<th class="next">&rsaquo;</th>'+
'</tr>'+
'</thead>',
contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
};
DPGlobal.template = '<div class="datepicker dropdown-menu">'+
'<div class="datepicker-days">'+
'<table class=" table-condensed">'+
DPGlobal.headTemplate+
'<tbody></tbody>'+
'</table>'+
'</div>'+
'<div class="datepicker-months">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-years">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
'</table>'+
'</div>'+
'</div>';
}( window.jQuery );
+182
View File
@@ -0,0 +1,182 @@
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker {
top: 0;
left: 0;
padding: 4px;
margin-top: 1px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
/*.dow {
border-top: 1px solid #ddd !important;
}*/
}
.datepicker:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
top: -7px;
left: 6px;
}
.datepicker:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
position: absolute;
top: -6px;
left: 7px;
}
.datepicker > div {
display: none;
}
.datepicker table {
width: 100%;
margin: 0;
}
.datepicker td,
.datepicker th {
text-align: center;
width: 20px;
height: 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datepicker td.day:hover {
background: #eeeeee;
cursor: pointer;
}
.datepicker td.day.disabled {
color: #eeeeee;
}
.datepicker td.old,
.datepicker td.new {
color: #999999;
}
.datepicker td.active,
.datepicker td.active:hover {
color: #ffffff;
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #0044cc;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker td.active:hover,
.datepicker td.active:hover:hover,
.datepicker td.active:focus,
.datepicker td.active:hover:focus,
.datepicker td.active:active,
.datepicker td.active:hover:active,
.datepicker td.active.active,
.datepicker td.active:hover.active,
.datepicker td.active.disabled,
.datepicker td.active:hover.disabled,
.datepicker td.active[disabled],
.datepicker td.active:hover[disabled] {
color: #ffffff;
background-color: #0044cc;
*background-color: #003bb3;
}
.datepicker td.active:active,
.datepicker td.active:hover:active,
.datepicker td.active.active,
.datepicker td.active:hover.active {
background-color: #003399 \9;
}
.datepicker td span {
display: block;
width: 47px;
height: 54px;
line-height: 54px;
float: left;
margin: 2px;
cursor: pointer;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datepicker td span:hover {
background: #eeeeee;
}
.datepicker td span.active {
color: #ffffff;
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #0044cc;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker td span.active:hover,
.datepicker td span.active:focus,
.datepicker td span.active:active,
.datepicker td span.active.active,
.datepicker td span.active.disabled,
.datepicker td span.active[disabled] {
color: #ffffff;
background-color: #0044cc;
*background-color: #003bb3;
}
.datepicker td span.active:active,
.datepicker td span.active.active {
background-color: #003399 \9;
}
.datepicker td span.old {
color: #999999;
}
.datepicker th.switch {
width: 145px;
}
.datepicker th.next,
.datepicker th.prev {
font-size: 21px;
}
.datepicker thead tr:first-child th {
cursor: pointer;
}
.datepicker thead tr:first-child th:hover {
background: #eeeeee;
}
.input-append.date .add-on i,
.input-prepend.date .add-on i {
display: block;
cursor: pointer;
width: 16px;
height: 16px;
}
+61 -34
View File
@@ -2,7 +2,7 @@
<%def name="jsAddOn()"> <%def name="jsAddOn()">
<script src="/vendor/timeline/js/timeline-src.js"></script> <script src="/vendor/timeline/js/timeline-src.js"></script>
<script> <script>
var timeline = new VMM.Timeline("timeline", '850px', '500px'); var timeline = new VMM.Timeline("timeline", '95%', '500px');
var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}}; var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}};
timeline.init(c, "/2015/timeline-json"); timeline.init(c, "/2015/timeline-json");
</script> </script>
@@ -10,42 +10,69 @@
<%def name="cssAddOn()"> <%def name="cssAddOn()">
<!-- The default timeline stylesheet --> <!-- The default timeline stylesheet -->
<link rel="stylesheet" href="/vendor/timeline/css/timeline.css" /> <link rel="stylesheet" href="/vendor/timeline/css/timeline.css" />
<style>
.enum li {
list-style-type: none;
background-image: url(/img/puce.png);
background-repeat: no-repeat;
background-position: 0 6px;
padding-left: 16px;
}
</style>
</%def> </%def>
<div class="pull-right"> <H2 style="text-align: center;">9<sup>ème</sup> édition des JM2L</H2>
Synchronisez votre calendrier avec <a href="/2015/JM2L.ics">le fichier ical JM2L 2015</a>
</div>
<br> <br>
<div id="timeline" style="margin-left: -50px;display:block;"></div> <div class="row-fluid">
<div class="clearfix">&nbsp;</div> <div class="span4 offset1">
<div style="top:500px;position: relative"> <blockquote>
Le 28 Novembre 2015 aura lieu la 9e édition des Journées Méditerranéennes du Logiciel Libre (JM2LL) à Le 28 Novembre 2015 aura lieu la 9<sup>ème</sup> édition des Journées Méditerranéennes du Logiciel Libre (JM2L) à
Sophia-Antipolis destinées tout public (http://jm2l.linux-azur.org/). Polytech'Nice destinée à tout public.
<br> </blockquote>
Le thème de cette année sera « Do It Yourself » ou « Faîtes le vous-même » : Le thème de cette année sera « Do It Yourself » ou « Faîtes le vous-même » :
<ul> <ul class="enum">
<li>Migration vers les logiciels libres</li> <li>Migration vers les logiciels libres</li>
<li>Libres enfants du numérique: jeux et loisirs pour les juniors.</li> ## <li>Libres enfants du numérique: jeux et loisirs pour les juniors.</li>
<li>Gérer ses données personnelles</li> ## <li>Gérer ses données personnelles</li>
<li>Do It Yourself (jeux vidéos, fablabs…)</li> <li>Do It Yourself (jeux vidéos, fablabs…)</li>
<li>Culture libre</li> <li>Culture libre</li>
<li>Communautés du libre</li> ## <li>Communautés du libre</li>
</ul> </ul>
Nous faisons appel aux acteurs du numérique libre pour alimenter le programme des conférences/ateliers : </div>
si vous souhaitez échanger avec le public et partager un bon moment avec la communauté, inscrivez-vous ! <div class="span4 offset1">
<br> <p>
Nous vous proposons cinq formats de contribution: Nous faisons appel aux acteurs du numérique libre pour alimenter le programme des conférences/ateliers :
<ul> <br>
<li>Stands au sein du village associatif</li> Vous pouvez nous faire parvenir vos propositions directement via le menu <a href="/participer-l-evenement">participer.</a>
<li>Conférences de 20 ou 40 minutes suivies dun échange</li> <br>
<li>Ateliers de 45 minutes ou 1h15</li> Si vous souhaitez échanger avec le public et partager un bon moment avec la communauté, <a href="/participer-l-evenement#inscription">inscrivez-vous !</a>
<li>Démos de vos matériels, logiciels ou projets libres</li> <br>
<li>Animations ouvertes</li> Vous pouvez d'ores et déjà synchroniser votre calendrier avec <a href="/2015/JM2L.ics">notre fichier ical JM2L 2015</a>
</ul> </p>
<p> </div>
Il sera bien sûr possible de combiner plusieurs formats (par exemple, une démo ou une conférence suivie </div>
dun atelier).
</p>
<p> ## Nous vous proposons plusieurs formats de contribution:
Vous pouvez nous faire parvenir vos propositions directement via le menu participer. ## <ul class="enum">
</p> ## <li>Stands au sein du village associatif</li>
## <li>Conférences de 20 à 70 minutes suivies dun échange</li>
## <li>Ateliers de 45 minutes ou 1h15</li>
## <li>Démos de vos matériels, logiciels ou projets libres</li>
## <li>Animations ouvertes</li>
## <li>Vous pouvez aussi aider l'équipe à la logistique.</li>
## </ul>
## <p>
## Il sera bien sûr possible de combiner plusieurs formats (par exemple, une démo ou une conférence suivie
## dun atelier).
## </p>
<div class="row-fluid">
<div class="span12">
<!-- TimeLine -->
<div id="timeline"></div>
</div>
</div>
<div class="row-fluid">
<div style="height:500px">
</div>
</div> </div>
+4 -1
View File
@@ -47,6 +47,8 @@
</ol> </ol>
% if not link: % if not link:
<strong>Remplissez ce formulaire :</strong> <strong>Remplissez ce formulaire :</strong>
<div class="row-fluid">
<div class="span7 offset3">
<% <%
DicForm ={ DicForm ={
'nom': {'PlaceHolder':u"Mon nom", 'ContainerStyle':'float:left;'}, 'nom': {'PlaceHolder':u"Mon nom", 'ContainerStyle':'float:left;'},
@@ -68,10 +70,11 @@ DicForm ={
</div> </div>
<button class="btn btn-large btn-primary" type="submit">C'est parti !</button> <button class="btn btn-large btn-primary" type="submit">C'est parti !</button>
</form> </form>
</div>
</div>
% else: % else:
<p> <p>
Vous venez de recevoir un mail... Vous venez de recevoir un mail...
Ici, ... le texte à définir ...
</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
+47 -10
View File
@@ -1,11 +1,6 @@
<%namespace name="Modals" file="jm2l:templates/modals.mako"/> <%namespace name="Modals" file="jm2l:templates/modals.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> <%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<%def name="profil_wrapper(uprofil, profil_form)"> <%def name="profil_wrapper(uprofil, profil_form)">
<div id="Photos">
${helpers.show_my_pictures(uprofil)}
</div>
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien</a>
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>
##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');"> ##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');">
% if uprofil!=request.user and request.user.uid==1: % if uprofil!=request.user and request.user.uid==1:
@@ -14,8 +9,42 @@
<form id="ProfilForm" action="/MesJM2L" method="POST"> <form id="ProfilForm" action="/MesJM2L" method="POST">
% endif % endif
<div class="row-fluid">
<div class="span8">
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien de connection</a> -
<a href="/user/${request.user.slug}">Mon profil publique</a><br>
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>
<% <%
DicForm = { DicFormA = {
'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False},
'prenom': {'PlaceHolder':u"Mon Prénom", 'ContainerClass':"span6", 'next':True},
'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False},
'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True},
'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False},
'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True},
'gpg_key': {'PlaceHolder':u"Ma clé gpg", 'ContainerClass':"span6", 'next':False},
'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True},
'bio': {'Ignore':True},
'tiersship': {'Ignore':True},
'id': {'Ignore':True},
'user_id': {'Ignore':True},
}
DicFormB = {
'nom': {'Ignore':True },
'prenom': {'Ignore':True },
'pseudo': {'Ignore':True },
'mail': {'Ignore':True },
'phone': {'Ignore':True },
'website': {'Ignore':True },
'gpg_key': {'Ignore':True},
'soc_link': {'Ignore':True},
'bio': {'PlaceHolder':u"Ma Bilibiographie", "ckeditor":1, 'ContainerClass':"span11", 'next':False },
'tiersship': {'Ignore':True}
}
DicForm2 = {
'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, 'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"},
'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"}, 'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"},
'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, 'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"},
@@ -27,10 +56,17 @@ DicForm = {
'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 }, 'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 },
'tiersship': {'Ignore':True} 'tiersship': {'Ignore':True}
} }
%>
${helpers.DisplayForm(profil_form, DicForm)}
<fieldset> %>
${helpers.DisplayRespForm(profil_form, DicFormA)}
</div>
<div class="span4">
${helpers.show_my_pictures(uprofil)}
</div>
</div>
${helpers.DisplayRespForm(profil_form, DicFormB)}
<fieldset>
<legend>Activité</legend> <legend>Activité</legend>
Si vous ne trouvez pas l'entité que vous souhaitez promouvoir (Association, GULL, Entreprise, Logiciel, ...). Si vous ne trouvez pas l'entité que vous souhaitez promouvoir (Association, GULL, Entreprise, Logiciel, ...).
Vous pouvez <a href="/entity"> en ajouter une. </a> Vous pouvez <a href="/entity"> en ajouter une. </a>
@@ -110,8 +146,9 @@ DicForm = {
</div> </div>
</fieldset> </fieldset>
<div class="span2 offset5">
<input class="btn btn-primary" type="submit" value="Enregistrer !" /> <input class="btn btn-primary" type="submit" value="Enregistrer !" />
</div>
</form> </form>
</%def> </%def>
+16 -23
View File
@@ -4,7 +4,7 @@ fieldset:disabled {
color:#CCC; color:#CCC;
} }
</style> </style>
##<input type="checkbox" onclick="javascript:$('.ComeToJM2L').attr( 'disabled', !this.checked );">Je viens aux JM2L 2015</input> <form id="ProfilForm" action="/MonSejour" method="POST">
<fieldset class="ComeToJM2L"> <fieldset class="ComeToJM2L">
<legend>Arriv&eacute;e</legend> <legend>Arriv&eacute;e</legend>
<div class="form-inline"> <div class="form-inline">
@@ -16,9 +16,9 @@ fieldset:disabled {
</select> </select>
le le
<select style="width:7em;" id="Arrival:Day" name="Arrival:Day" title="Jour"> <select style="width:7em;" id="Arrival:Day" name="Arrival:Day" title="Jour">
<option value="Jeudi">Jeudi</option> <option value="26">Jeudi</option>
<option value="Vendredi">Vendredi</option> <option value="27">Vendredi</option>
<option value="Samedi">Samedi</option> <option value="28">Samedi</option>
</select> </select>
, ,
<select style="width:15em;" id="Arrival:Confidence" name="Arrival:Confidence"> <select style="width:15em;" id="Arrival:Confidence" name="Arrival:Confidence">
@@ -29,10 +29,10 @@ fieldset:disabled {
</select> </select>
&agrave; &agrave;
<select style="width:6em;" id="Arrival:Hour" class="formforform-field" name="field_8" title="Le"> <select style="width:6em;" id="Arrival:Hour" class="formforform-field" name="Arrival:Hour" title="Le">
% for hour in range(24): % for hour in range(24):
% for minutes in range(0,60,10): % for minutes in range(0,60,10):
<option value="${hour}h${minutes}" <option value="${"%d:%.2d" % (hour, minutes)}"
% if str("%dh%.2d" % (hour, minutes))=='10h00': % if str("%dh%.2d" % (hour, minutes))=='10h00':
selected="selected" selected="selected"
% endif % endif
@@ -47,12 +47,6 @@ fieldset:disabled {
context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Confidence').select2({width:'resolve'});" % jsitem ) context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Confidence').select2({width:'resolve'});" % jsitem )
context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Hour').select2({width:'resolve'});" % jsitem ) context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Hour').select2({width:'resolve'});" % jsitem )
%> %>
##<script type="text/javascript">
## $("#Arrival\\:Place").select2({});
## $("#Arrival\\:Day").select2({});
## $("#Arrival\\:Confidence").select2({});
## $("#Arrival\\:Hour").select2({});
##</script>
</div> </div>
<p> <p>
<div class="control-group" style="background-color: #fafafa;padding: 10px 50px; width:60%"> <div class="control-group" style="background-color: #fafafa;padding: 10px 50px; width:60%">
@@ -97,9 +91,9 @@ fieldset:disabled {
</select> </select>
le le
<select style="width:7em;" id="Departure:Day" class="formforform-field" name="field_8" title="Le"> <select style="width:7em;" id="Departure:Day" class="formforform-field" name="field_8" title="Le">
<option value="Samedi">Samedi</option> <option value="28">Samedi</option>
<option value="Dimanche">Dimanche</option> <option value="29">Dimanche</option>
<option value="Lundi">Lundi</option> <option value="30">Lundi</option>
</select> </select>
, ,
<select style="width:14em;" id="Departure:Confidence" class="formforform-field" name="field_8" title="Le"> <select style="width:14em;" id="Departure:Confidence" class="formforform-field" name="field_8" title="Le">
@@ -127,14 +121,6 @@ fieldset:disabled {
context._kwargs['postpone_js'].append( "$('#Departure\\\\:Confidence').select2({width:'resolve'});" % jsitem ) context._kwargs['postpone_js'].append( "$('#Departure\\\\:Confidence').select2({width:'resolve'});" % jsitem )
context._kwargs['postpone_js'].append( "$('#Departure\\\\:Hour').select2({width:'resolve'});" % jsitem ) context._kwargs['postpone_js'].append( "$('#Departure\\\\:Hour').select2({width:'resolve'});" % jsitem )
%> %>
##<script type="text/javascript">
## $("#Departure\\:Place").select2({});
## $("#Departure\\:Day").select2({});
## $("#Departure\\:Confidence").select2({});
## $("#Departure\\:Hour").select2({});
##</script>
</div> </div>
<p> <p>
<div class="control-group" style="background-color: #fafafa;padding: 10px 50px; width:60%"> <div class="control-group" style="background-color: #fafafa;padding: 10px 50px; width:60%">
@@ -169,4 +155,11 @@ fieldset:disabled {
</div> </div>
</p> </p>
</fieldset> </fieldset>
<center>
<button type="submit" class="btn btn-large btn-primary" />
<i class="icon-ok icon-white"></i> Enregistrer
</button>
</center>
</form>
</%def> </%def>
+35 -14
View File
@@ -1,4 +1,16 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%def name="jsAddOn_head()">
<script src="/vendor/leaflet/js/leaflet.js"></script>
</%def>
<%def name="cssAddOn()">
<link rel="stylesheet" href="/vendor/leaflet/css/leaflet.css" />
<style>
#come_map {
height: 300px;
}
</style>
</%def>
<h2 class="page-title">Nous rejoindre...</h2> <h2 class="page-title">Nous rejoindre...</h2>
<div class="span10 offset1"> <div class="span10 offset1">
@@ -12,9 +24,11 @@
<div class="span4 offset1"> <div class="span4 offset1">
<h4>Le staff</h4> <h4>Le staff</h4>
<dl> <dl>
<dt>Mail</dt> <dt>sur IRC</dt>
<dd>» #jm2l@irc.freenode.net</dd>
<dt>par Mail</dt>
<dd>» contact at jm2l.linux-azur.org</dd> <dd>» contact at jm2l.linux-azur.org</dd>
<dt>Téléphone</dt> <dt>par Téléphone</dt>
<dd>» +33 (0)&nbsp;6 52 42 31 37</dd> <dd>» +33 (0)&nbsp;6 52 42 31 37</dd>
</dl> </dl>
</div> </div>
@@ -25,12 +39,28 @@
930, route des Colles (site des Templiers)&nbsp;<br> 930, route des Colles (site des Templiers)&nbsp;<br>
06903 Sophia Antipolis (Biot) 06903 Sophia Antipolis (Biot)
</address> </address>
<p>GPS Lat.: 43°36'57.72"N - Lon.: 7°4'17.03"E</p> <p>GPS Lat.: 43°61'56.9"N - Lon.: 7°0'71.95"E</p>
</div> </div>
</div> </div>
<div class="row-fluid"> <div class="row-fluid">
<div class="span6"> <div class="span8 offset2">
<div id="come_map"></div>
<script type="text/javascript">
var map = L.map('come_map');
// create the tile layer with correct attribution
var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var osmAttrib='Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors';
var osm = new L.TileLayer(osmUrl, {minZoom: 7, maxZoom: 18, attribution: osmAttrib});
// start the map on specified GPS Coords
map.setView(new L.LatLng(43.61562,7.0724),15);
marker = L.marker([43.615693, 7.0726221]).addTo(map);
map.addLayer(osm);
</script>
</div>
</div>
<br>
<div class="row-fluid">
<div class="span10 offset1">
<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="#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>
@@ -137,15 +167,6 @@
</div> </div>
</div> </div>
</div> </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>
</div>
<br>
+8 -1
View File
@@ -1,7 +1,9 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% <%
DisplayYear = request.session.get('year',2015) DisplayYear = request.session.get('year',2015)
%> %>
<div class="span9">
<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"> <div class="span10 offset1">
@@ -76,4 +78,9 @@ DisplayYear = request.session.get('year',2015)
<p class="spip">Et pour ce ux qui veullent tout mettre en local sur leur espace web, limage banner2007.png est ici&nbsp;: <a href="/web/20071231104349/http://jm2l.linux-azur.org/IMG/png/banner2007.png" class="spip_url spip_out">http://jm2l.linux-azur.org/IMG/png/...</a> <p class="spip">Et pour ce ux qui veullent tout mettre en local sur leur espace web, limage banner2007.png est ici&nbsp;: <a href="/web/20071231104349/http://jm2l.linux-azur.org/IMG/png/banner2007.png" class="spip_url spip_out">http://jm2l.linux-azur.org/IMG/png/...</a>
Préférez quand même la première méthode qui présente lavantage de nous permettre de faire quelques statistiques.</p> Préférez quand même la première méthode qui présente lavantage de nous permettre de faire quelques statistiques.</p>
% endif % endif
<br><br>
</div>
<div class="span3">
<!--Sidebar content-->
${helpers.participants(DisplayYear)}
</div>
+25 -9
View File
@@ -1,4 +1,5 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% <%
TabDisplay = [ TabDisplay = [
(u'Tables rondes', 'Table ronde'), (u'Tables rondes', 'Table ronde'),
@@ -7,6 +8,11 @@ TabDisplay = [
(u'Stands', 'Stand'), (u'Stands', 'Stand'),
] ]
%> %>
<%def name="jsAddOn()">
<script type="text/javascript" src="/vendor/d3js/d3.v3.min.js"></script>
<script type="text/javascript" src="/js/programme.js"></script>
</%def>
<%def name="cssAddOn()">
<style> <style>
.myblock { .myblock {
background-color:#EEE; background-color:#EEE;
@@ -31,11 +37,9 @@ TabDisplay = [
} }
.Atelier { .Atelier {
fill: #faebeb; fill: #faebeb;
stroke: #dc7070;
} }
.Table-ronde { .Table-ronde {
fill: #fff4e5; fill: #fff4e5;
stroke: #ff9912;
} }
.Repas { .Repas {
fill: #2EE; fill: #2EE;
@@ -54,11 +58,14 @@ rect {
fill: none; fill: none;
stroke: #222; stroke: #222;
} }
</style> </style>
<h2>Le Programme ${DisplayYear}</h2> </%def>
<div class="row-fluid">
<div class="span9">
<div class="tabbable" id="main_tab"> <h2>Le Programme ${DisplayYear}</h2>
<div class="tabbable" id="main_tab">
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> <ul class="nav nav-tabs" style="margin-bottom: 5px;">
% for Num, (Day, IdDay) in enumerate(Days): % 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> <li class="${['','active'][Num==0]}"><a href="#Day${Num}" id="Schedule_${Num}" data-toggle="tab">${Day}</a></li>
@@ -73,7 +80,16 @@ rect {
</div> </div>
% endfor % endfor
</div> </div>
</div>
</div>
<div class="span3">
<!--Sidebar content-->
${helpers.participants(DisplayYear)}
</div>
</div> </div>
<div class="row-fluid">
<div class="span10 offset1">
<div id="DivProg" style="border: 1px solid black;"></div> <div id="DivProg" style="border: 1px solid black;"></div>
@@ -99,7 +115,7 @@ if Counter==0:
<thead> <thead>
<tr> <tr>
<th style="width:7em;text-align:center;">Date</th> <th style="width:7em;text-align:center;">Date</th>
<th style="text-align:center;">Sujet - ${Counter} ${Title}</th> <th style="text-align:center;">${Counter} ${Title}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -154,6 +170,6 @@ if Counter==0:
% endfor % endfor
##</div> ##</div>
<br/><br/>
<script type="text/javascript" src="/vendor/d3js/d3.v3.min.js"></script> </div>
<script type="text/javascript" src="/js/programme.js"></script> </div>
+5
View File
@@ -8,6 +8,9 @@ from slugify import slugify
</a> </a>
<h3>Liste des tâches JM2L Staff</h3> <h3>Liste des tâches JM2L Staff</h3>
<div class="row-fluid">
<div class="span10 offset1">
<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;">
% for Num, Entity in enumerate(sorted(tasks.keys(), key=lambda x:x.name)): % for Num, Entity in enumerate(sorted(tasks.keys(), key=lambda x:x.name)):
@@ -84,6 +87,8 @@ from slugify import slugify
</div> </div>
</div> </div>
</div>
</div>
<%def name="jsAddOn()"> <%def name="jsAddOn()">
<script> <script>
$('a[data-toggle="tab"]') $('a[data-toggle="tab"]')
+6
View File
@@ -1,9 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<div class="row-fluid">
<div class="span10 offset1">
<h1>Add a new task</h1> <h1>Add a new task</h1>
<form action="/Staff/new" method="post"> <form action="/Staff/new" method="post">
<input type="text" maxlength="100" name="name"> <input type="text" maxlength="100" name="name">
<input type="submit" class="btn btn-primary" name="add" value="ADD" class="button"> <input type="submit" class="btn btn-primary" name="add" value="ADD" class="button">
</form> </form>
</div>
</div>
+21 -4
View File
@@ -15,6 +15,14 @@
<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>
<div class="row-fluid">
<div class="span10 offset1">
<a class="btn" href="${request.route_path('list_task', _anchor=form.name.data)}">
<i class="icon-arrow-left"></i> Retour à la liste
</a>
% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<h3>Editer un Pôle</h3> <h3>Editer un Pôle</h3>
% else: % else:
@@ -34,11 +42,20 @@ DicForm = {
<form action="/Staff/poles" method="post"> <form action="/Staff/poles" method="post">
%endif %endif
${helpers.DisplayForm(form, DicForm)} ${helpers.DisplayForm(form, DicForm)}
<input type="submit" class="btn btn-primary" />
<br>
<center>
<button type="submit" class="btn btn-large btn-primary" />
<i class="icon-ok icon-white"></i> Enregistrer
</button>
</center>
</form> </form>
% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<center>
${helpers.uploader("poles", form.uid.data, u"Attachement" )} ${helpers.uploader("poles", form.uid.data, u"Attachement" )}
</center>
%endif %endif
<script>
## var editor = CKEDITOR.replace( 'description', { autoGrow_onStartup: true, language: 'fr' } ); </div>
</script> </div>
+21 -3
View File
@@ -25,8 +25,14 @@
<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> <div class="row-fluid">
<div class="span10 offset1">
<a class="btn" href="${request.route_path('list_task', _anchor=area)}">
<i class="icon-arrow-left"></i> 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>
% else: % else:
@@ -49,8 +55,20 @@ DicForm = {
<form action="/Staff/tasks" method="post"> <form action="/Staff/tasks" method="post">
%endif %endif
${helpers.DisplayForm(form, DicForm)} ${helpers.DisplayForm(form, DicForm)}
<input type="submit" class="btn btn-primary" value="Valider" />
<br>
<center>
<button type="submit" class="btn btn-large btn-primary" />
<i class="icon-ok icon-white"></i> Enregistrer
</button>
</center>
</form> </form>
% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<center>
${helpers.uploader("tasks", form.uid.data, u"une pièce jointe" )} ${helpers.uploader("tasks", form.uid.data, u"une pièce jointe" )}
</center>
%endif %endif
</div>
</div>
+41 -98
View File
@@ -16,33 +16,10 @@
<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>
<% from datetime import datetime %> <% from datetime import datetime %>
<style>
.borderbox { <div class="row-fluid">
border: 1px solid #e1e4e5; <div class="span10 offset1">
margin: 1px 0 24px;
color: #404040;
line-height: 1.5;
margin: 0;
overflow: auto;
padding: 12px;
background: none repeat scroll 0 0 #fcfcfc;
font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
}
.titleborderbox {
background: none repeat scroll 0 0 #ffffff;
border: 1px solid #eee;
display: inline;
left: 16px;
padding: 2px 7px;
position: relative;
top: 10px;
}
.borderboxtime {
float:right;
padding:1px 15px;
border: 1px solid #eee;
}
</style>
% if 'uid' in form._fields: % if 'uid' in form._fields:
<div class="borderboxtime"> <div class="borderboxtime">
@@ -63,7 +40,7 @@
% else: % else:
% for num, iterv in enumerate(event.intervenants): % for num, iterv in enumerate(event.intervenants):
<li> <li>
<strong><a href="/MesJM2L?user=${iterv.uid}">${iterv.prenom} ${iterv.nom}</a></strong>. <strong><a href="/user/${iterv.slug}">${iterv.prenom} ${iterv.nom}</a></strong>.
% if iterv.pseudo: % if iterv.pseudo:
(${iterv.pseudo}) (${iterv.pseudo})
%endif %endif
@@ -125,56 +102,20 @@ DicForm = {
<fieldset> <fieldset>
<legend>Ajouter vos co-intervenants</legend> <legend>Ajouter vos co-intervenants</legend>
<p> <p>
Vous avez la possibilité d'être plusieurs pour un même évenement. Vous avez la possibilité d'être plusieurs pour un même évenement.<br>
Pour enregistrer une autre personne, deux cas peuvent se présenter: Chacun des intervenants doit être inscrit sur le site.
<ul>
<li>Votre partenaire n'est pas inscrit sur le site</li>
<p>
Inscrivez son email avec son accord dans le champ suivant,
Un mail lui sera envoyé pour qu'il procède à son inscription.
Un fois son inscription effectué, reportez vous au deuxième cas.
</p>
<li>Votre partenaire est inscrit sur le site</li>
<p>
Demandez lui l'email utilisé lors de son inscription sur le site des JM2L.
Complétez le champ suivant et validez.
</p>
</ul>
Notez que les intervenants d'un même évenement ont tous les droits de modification.
</p>
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link" method="POST"> <form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link" method="POST">
${formAdd.event_uid} ${formAdd.event_uid}
<% <input type="hidden" id="intervenant" name="intervenant" style="width:20em;"
TabFields = [ class="form-control select2-offscreen" tabindex="-1">
( formAdd._fields["prenom"], u"Prénom", "padding-right:5px;float:left;" ), </input>
( formAdd._fields["nom"], u"Nom", "padding-right:5px;" ), <button type="submit" class="btn btn-primary" />
( formAdd._fields["email"], u"son.mail@fqdn.tld", "padding-right:5px;" ), <i class="icon-plus icon-white"></i> Ajouter cet intervenant
] </button>
%>
% for Field, PlaceHolder, DivClass in TabFields:
<div style="padding-right:5px;${DivClass}">
<label for="${Field.label.field_id}">${Field.label.text}
% if len(Field.description):
<a id="${Field.label.field_id}-help" data-toggle="popover"
data-original-title="${Field.label.text}"
data-content="${Field.description}">
<i class="icon-me" style="background-image: url('/img/Help.png');background-position:1px 2px;"></i>
</a>
% endif
</label>
% for error in Field.errors:
<div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<h4>Erreur!</h4>
${ error }
</div>
% endfor
${Field(placeholder=PlaceHolder, style="width:16em;")}
</div>
% endfor
## Then the submit for this form
${formAdd.add}
</form> </form>
NB : Notez que les intervenants d'un même évenement ont tous les droits de modification.
</p>
</fieldset> </fieldset>
<div class="clearfix">&nbsp;</div> <div class="clearfix">&nbsp;</div>
<p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p>
@@ -186,27 +127,31 @@ TabFields = [
<br/> <br/>
<hr/> <hr/>
% if 0: </div>
% if 'uid' in form._fields: </div>
${helpers.uploader_js()}
% endif
<script type="text/javascript">
## Handle Popover of this form
% for field in form._fields.keys():
$('#${field}-help').popover(); <%def name="jsAddOn()">
% if form._fields[field].type=='SelectField': <script src="/vendor/select2/js/select2.js"></script>
$('#${field}').select2({width:'resolve'}); <script>
% endif jQuery(function() {
%endfor $("#intervenant").select2(
% if formAdd: {
% for field in formAdd._fields.keys(): placeholder: 'Entrez ici un Nom ou un Prénom',
$('#${field}-help').popover(); minimumInputLength: 2, allowClear: true,
%endfor ajax: {
% endif quietMillis: 250, url: "/json-users", dataType: 'json',
var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } ); data: function (term, page) {
</script> return { pageSize: 8, pageNum: page, searchTerm: term };
% else: },
results: function (data, page) {
var more = (page * 8) < data.Total;
return { results: data.Results, more: more };
}
}
});
});
</script>
</%def>
<% <%
for jsitem in form._fields.keys(): for jsitem in form._fields.keys():
context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem ) context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem )
@@ -216,5 +161,3 @@ if formAdd:
for jsitem in formAdd._fields.keys(): for jsitem in formAdd._fields.keys():
context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem ) context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem )
%> %>
##${helpers.uploader_js()}
% endif
+13 -14
View File
@@ -8,6 +8,11 @@
<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>
<div class="row-fluid">
<div class="span10 offset1">
<a class="pull-right" href="/categorie/entity">Editer les catégories</a> <a class="pull-right" href="/categorie/entity">Editer les catégories</a>
<br> <br>
<form action="" method="POST"> <form action="" method="POST">
@@ -30,18 +35,18 @@ DicForm = {
<fieldset> <fieldset>
<legend>Acteurs</legend> <legend>Acteurs</legend>
<div class="repeat"> <div class="repeat">
<table class="wrapper" width="100%"> <table class="wrapper table table-striped table-bordered" width="100%">
<thead> <thead>
<tr class="row"> <tr class="row">
<th style="width:5em;text-align:center;">Année</th> <th style="width:5em;text-align:center;">Année</th>
<th>Personne</th> <th style="width:22em;">Personne</th>
<th style="width:22em;">Rôle</th> <th style="width:22em;">Rôle</th>
<th style="width:5em;">Action</th> <th style="width:5em;">Action</th>
</tr> </tr>
</thead> </thead>
<tbody class="container"> <tbody class="container">
<tr class="row template" style="line-height:2.2em;"> <tr class="row template" style="line-height:2.2em;">
<td><span class="move btn btn-mini btn-info">Move</span></td> ##<td><span class="move btn btn-mini btn-info">Move</span></td>
<td> <td>
<select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid" <select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid"
id="membership-{{row-count-placeholder}}-year_uid"> id="membership-{{row-count-placeholder}}-year_uid">
@@ -65,6 +70,7 @@ DicForm = {
<option value="${opt.uid}">${opt.exch_subtype}</option> <option value="${opt.uid}">${opt.exch_subtype}</option>
% endfor % endfor
</select> </select>
<input type="text" class="form-control" name="membership-{{row-count-placeholder}}-role" />
</td> </td>
<td> <td>
<span class="remove btn btn-mini btn-danger"> <span class="remove btn btn-mini btn-danger">
@@ -74,7 +80,7 @@ DicForm = {
</tr> </tr>
% for num, dicdata in enumerate(form._fields.get("membership").data): % for num, dicdata in enumerate(form._fields.get("membership").data):
<tr class="row" style="padding:5px;line-height:2.2em;"> <tr class="row" style="padding:5px;line-height:2.2em;">
<td><span class="move btn btn-mini btn-info">Move</span></td> ##<td><span class="move btn btn-mini btn-info">Move</span></td>
<td style="text-align:center;"> <td style="text-align:center;">
<input type="hidden" class="form-control" name="membership-${num}-year_uid" <input type="hidden" class="form-control" name="membership-${num}-year_uid"
value="${dicdata.get('year_uid')}" style="width:4em;" /> value="${dicdata.get('year_uid')}" style="width:4em;" />
@@ -91,8 +97,6 @@ DicForm = {
% endif % endif
</td> </td>
<td style="text-align:center;"> <td style="text-align:center;">
<input type="hidden" class="form-control" name="membership-${num}-role"
value="${dicdata.get('role')}" />
<i>${dicdata.get('role', 'Aucun')}</i> <i>${dicdata.get('role', 'Aucun')}</i>
</td> </td>
<td> <td>
@@ -140,13 +144,9 @@ DicForm = {
<br>NB: Vous devez proposer votre entité avant de pouvoir <br>NB: Vous devez proposer votre entité avant de pouvoir
téléverser des fichiers la concernant. téléverser des fichiers la concernant.
% endif % endif
<br>
<br>
<br>
##% if 'uid' in form._fields: </div>
## ${helpers.uploader_js()} </div>
##% endif
<%def name="jsAddOn()"> <%def name="jsAddOn()">
<script src="/vendor/select2/js/select2.js"></script> <script src="/vendor/select2/js/select2.js"></script>
@@ -154,7 +154,7 @@ DicForm = {
<script src="/vendor/ckeditor/ckeditor.js"></script> <script src="/vendor/ckeditor/ckeditor.js"></script>
<script type="text/javascript"> <script type="text/javascript">
var year_data = Array(); var year_data = Array();
##var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } ); var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } );
for (var i=2005;i<2015;i++) for (var i=2005;i<2015;i++)
{ year_data[i.toString()] = i.toString(); }; { year_data[i.toString()] = i.toString(); };
@@ -190,7 +190,6 @@ jQuery(function() {
} }
}); });
$("#membership-"+ (numrow-1) +"-year_uid").select2({}); $("#membership-"+ (numrow-1) +"-year_uid").select2({});
$("#membership-"+ (numrow-1) +"-role").select2({});
} }
}); });
}); });
+76 -9
View File
@@ -1,6 +1,72 @@
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
## Afficher un form ## Afficher un form
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="DisplayRespForm(form, DicFormat)">
<%
TabJs = {'select':[], 'desc':[]}
%>
<div class="row-fluid">
% for FieldName, Field in form._fields.items():
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("Ignore"):
<% continue %>
% endif
% if Field.type in ['HiddenField', 'CSRFTokenField']:
${Field}
<% continue %>
% elif Field.type=="SelectField":
<% TabJs['select'].append(Field.label.field_id) %>
% endif
<div class="${DicFormat[Field.name].get("ContainerClass")}">
<label for="${Field.label.field_id}">${Field.label.text}
% if Field.description:
<% TabJs['desc'].append(Field.label.field_id) %>
<a id="${Field.label.field_id}-help" data-toggle="popover"
data-original-title="${Field.label.text}"
data-content="${Field.description}">
<i class="icon-me" style="background-image: url('/img/Help.png');background-position:1px 2px;"></i>
</a>
% endif
</label>
% if DicFormat.has_key(Field.name):
<%
PlaceHolder = DicFormat[Field.name].get("PlaceHolder")
Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ]
%>
% if Field.type == "date":
${Field(placeholder=PlaceHolder or False, class_="datepicker", style="width:100%" )}
% else:
${Field(placeholder=PlaceHolder or False, class_=Class, style="width:100%")}
% endif
% else:
${Field(style="width:100%")}
% endif
% for error in Field.errors:
<div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<h4>Erreur!</h4>
${ error }
</div>
% endfor
</div>
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("next")==True:
</div>
<div class="row-fluid">
% endif
% endfor
</div>
<%
for jsitem in TabJs['select']:
context._kwargs['postpone_js'].append( "$('#%s').select2({});" % jsitem )
for jsitem in TabJs['desc']:
context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem )
%>
</%def>
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
## Afficher un form
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="DisplayForm(form, DicFormat)"> <%def name="DisplayForm(form, DicFormat)">
<% <%
TabJs = {'select':[], 'desc':[]} TabJs = {'select':[], 'desc':[]}
@@ -361,14 +427,12 @@ TabJs = {'select':[], 'desc':[]}
## Wrapper pour les photos ## Wrapper pour les photos
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="show_my_pictures(uprofil)"> \ <%def name="show_my_pictures(uprofil)"> \
<div class="profile-icon" style="float:right;height:250px;width:250px;"> <div class="profile-icon">
<% photos = uprofil.PhotosLinks %> <% photos = uprofil.PhotosLinks %>
<div style="text-align: center;line-height:20px;"><b>${request.user.slug}</b></div>
<div style="text-align: center;line-height:20px;"> <div style="text-align: center;line-height:20px;">
<a data-target="#AjaxModal" Myhref="/2015/modal/Password/1" role="button" handle="modal">Changer mon mot de passe</a> <a data-target="#AjaxModal" Myhref="/2015/modal/Password/1" role="button" handle="modal">Changer mon mot de passe</a>
</div> </div>
<div style="text-align: center;line-height:20px;">
<a data-target="#AjaxModal" Myhref="/2015/modal/UserPicture/${uprofil.uid}" handle="modal">Changer ma photo</a>
</div>
<div id="MyPictureCarousel" class="carousel slide"> <div id="MyPictureCarousel" class="carousel slide">
% if len(photos)>1: % if len(photos)>1:
<!-- Carousel nav --> <!-- Carousel nav -->
@@ -376,24 +440,27 @@ TabJs = {'select':[], 'desc':[]}
<a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a> <a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a>
% endif % endif
<!-- Carousel items --> <!-- Carousel items -->
<div class="carousel-inner" style="height: 220px;"> <div class="carousel-inner">
% if len(photos): % if len(photos):
% for num, link in enumerate(photos): % for num, link in enumerate(photos):
<div class="${['','active '][num==0]}item" id="UserPic${num}"> <div class="${['','active '][num==0]}item" id="UserPic${num}">
<div style="margin:auto;"> <div style="margin:auto;text-align:center;">
<img src="${link}" class="img-polaroid" style="max-height:205px;max-width:235px;" alt="Photo ${uprofil.slug}" /> <img src="${link}" class="img-polaroid" style="max-height:310px;" alt="Photo ${uprofil.slug}" />
</div> </div>
</div> </div>
% endfor % endfor
% else: % else:
<div class="active item" id="UserPic0"> <div class="active item" id="UserPic0">
<div style="margin:auto;width:170px;"> <div style="margin:auto;text-align:center;">
<img src="/img/default-user.png" class="img-polaroid" alt="Photo ${uprofil.slug}" style="max-height:205px;" /> <img src="/img/default-user.png" style="max-height:310px;" class="img-polaroid" alt="Photo ${uprofil.slug}" />
</div> </div>
</div> </div>
% endif % endif
</div> </div>
</div> </div>
<div style="text-align: center;line-height:20px;">
<a data-target="#AjaxModal" Myhref="/2015/modal/UserPicture/${uprofil.uid}" handle="modal">Changer ma photo</a>
</div>
</div> </div>
</%def> \ </%def> \
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+2
View File
@@ -57,6 +57,7 @@
</div> </div>
<div class="row-fluid"> <div class="row-fluid">
<div class="span10 offset1">
<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>
@@ -149,5 +150,6 @@
</div> </div>
</div> </div>
</div>
</div> </div>
##${h.uploader_js()} ##${h.uploader_js()}
+44 -18
View File
@@ -21,12 +21,15 @@
<link rel="stylesheet" href="/static/ie6.css" type="text/css" media="screen" charset="utf-8" /> <link rel="stylesheet" href="/static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]--> <![endif]-->
<script src="/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script> <script src="/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script>
${self.cssAddOn()}
${self.jsAddOn_head()}
</head> </head>
<body> <body>
<% <%
context._kwargs['postpone_js']=[] context._kwargs['postpone_js']=[]
DisplayYear = request.session.get('year', 2015) DisplayYear = request.session.get('year', 2015)
%> %>
<%def name="jsAddOn_head()"></%def>
<%def name="jsAddOn()"></%def> <%def name="jsAddOn()"></%def>
<%def name="cssAddOn()"></%def> <%def name="cssAddOn()"></%def>
${helpers.uploader_js()} ${helpers.uploader_js()}
@@ -36,8 +39,10 @@ ${helpers.uploader_js()}
% if DisplayYear!=2015: % if DisplayYear!=2015:
## style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> ## style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;">
<div class="align-center"> <div class="align-center">
<a href="/">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"> <div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent">
</div> </div>
</a>
</div> </div>
% else: % else:
<!-- Carousel <!-- Carousel
@@ -51,14 +56,28 @@ ${helpers.uploader_js()}
</ol> </ol>
<div class="carousel-inner" role="listbox"> <div class="carousel-inner" role="listbox">
<div class="item active"> <div class="item active">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"></div> <a href="/">
<div style="height:215px;background: url(/img/2015/logo.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
<div class="item"> <div class="item">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2013} ) no-repeat scroll center center transparent"></div> <a href="/">
<div style="height:215px;background: url(/img/2015/logo_1.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
<div class="item"> <div class="item">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2012} ) no-repeat scroll center center transparent"></div> <a href="/">
<div style="height:215px;background: url(/img/2015/logo_2.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
</div> </div>
<a class="left Tcarousel-control" href="#TitleCarousel" role="button" data-slide="prev"> <a class="left Tcarousel-control" href="#TitleCarousel" role="button" data-slide="prev">
@@ -107,16 +126,17 @@ ${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 ## <li>Mode
<span class="visible-phone"> ✔ Phone</span> ## <span class="visible-phone"> ✔ Phone</span>
<span class="visible-tablet"> ✔ Tablet</span> ## <span class="visible-tablet"> ✔ Tablet</span>
<span class="visible-desktop"> ✔ Desktop</span> ## <span class="visible-desktop"> ✔ Desktop</span>
</li> ## </li>
</ul> </ul>
</div> </div>
</div> </div>
<ul class="nav nav-pills pull-right"> <ul class="nav nav-pills pull-right">
<li class="${accueil or ''}"><a href="/">Accueil</a></li>
<li class="${programme or ''}"><a href="/${DisplayYear}/le-programme">Programme</a></li> <li class="${programme or ''}"><a href="/${DisplayYear}/le-programme">Programme</a></li>
<li class="${presse or ''}"><a href="/${DisplayYear}/dossier-de-presse">Presse</a></li> <li class="${presse or ''}"><a href="/${DisplayYear}/dossier-de-presse">Presse</a></li>
<li class="${plan or ''}"><a href="/nous-rejoindre">Contact et Plan</a></li> <li class="${plan or ''}"><a href="/nous-rejoindre">Contact et Plan</a></li>
@@ -135,18 +155,21 @@ ${helpers.uploader_js()}
</div> </div>
</div> </div>
<div id="bottom"> <div id="bottom">
% for type, message in request.session.pop_flash():
<div class="container-fluid">
<br>
<div class="span6 offset3">
<div class="alert alert-${type}">
<button type="button" class="close" data-dismiss="alert">&times;</button>
${message}
</div>
</div>
</div>
% endfor
<div class="container-fluid"> <div class="container-fluid">
<div class="row-fluid">
<div class="span9">
<!--Body content--> <!--Body content-->
${next.body()} ${next.body()}
</div> </div>
<div class="span3">
<!--Sidebar content-->
${helpers.participants(DisplayYear)}
</div>
</div>
</div>
</div> </div>
</div> </div>
@@ -161,9 +184,12 @@ ${helpers.uploader_js()}
+33 (0) 6 52 42 31 37 ~ contact at jm2l.linux-azur.org +33 (0) 6 52 42 31 37 ~ contact at jm2l.linux-azur.org
</p> </p>
<p> <p>
Conception et construction en <a href="http://git.linux-azur.org/jm2l/">DIY</a> ~ Conception et construction en <a href="http://git.linux-azur.org/JM2L/jm2l/src/master">DIY</a> ~
Hébergé par <a href="http://www.heberg-24.com/"> Heberg24 </a> Hébergé par <a href="http://www.heberg-24.com/"> Heberg24 </a>
</p> </p>
<p>
Vous avez trouvé un bug ? <a href="http://git.linux-azur.org/JM2L/jm2l/issues">Reportez le ici</a>
</p>
</div> </div>
</footer> </footer>
+9 -3
View File
@@ -1,5 +1,8 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<div class="row-fluid">
<div class="span10 offset1">
<a class="pull-right" href="/categorie/entity">Editer les catégories</a> <a class="pull-right" href="/categorie/entity">Editer les catégories</a>
<br> <br>
<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
@@ -31,16 +34,16 @@
<img src="${img_path}" alt="logo" /> <img src="${img_path}" alt="logo" />
% endfor % endfor
</td> </td>
<td style="text-align:center;">
${entity.get_entity_type.entity_subtype}
</td>
<td style="position: relative;"> <td style="position: relative;">
${Entity_Type}, ${entity.get_entity_type.entity_subtype}<br>
<strong> <strong>
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}">${entity.name}</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}">${entity.name}</a>
</strong> </strong>
% if request.user.Staff:
<span style="float:right;"> <span style="float:right;">
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">edit</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">edit</a>
</span> </span>
% endif
</td> </td>
</tr> </tr>
% endfor % endfor
@@ -49,3 +52,6 @@
</div> </div>
% endfor % endfor
</div> </div>
</div>
</div>
+22 -10
View File
@@ -3,14 +3,11 @@
.navbar { .navbar {
margin-bottom: 0px; margin-bottom: 0px;
} }
#bottom {
background-color: #f5f5f5;
}
.form-signin { .form-signin {
max-width: 300px; max-width: 300px;
padding: 19px 29px 29px; padding: 19px 29px 29px;
margin: 0 auto 20px; margin: 0 auto 20px;
background-color: #fff; background-color: #f5f5f5;
border: 1px solid #e5e5e5; border: 1px solid #e5e5e5;
-webkit-border-radius: 5px; -webkit-border-radius: 5px;
-moz-border-radius: 5px; -moz-border-radius: 5px;
@@ -19,27 +16,42 @@
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: 0 1px 2px rgba(0,0,0,.05);
box-shadow: 0 1px 2px rgba(0,0,0,.05); box-shadow: 0 1px 2px rgba(0,0,0,.05);
} }
.form-signin .form-signin-heading, .form-signin,
.form-signin .checkbox { .form-signin .checkbox {
margin-bottom: 10px; margin-bottom: 10px;
} }
.form-signin-heading {
margin: -15px;
text-align:center;
}
.form-signin input[type="text"], .form-signin input[type="text"],
.form-signin input[type="password"] { .form-signin input[type="password"] {
font-size: 16px; font-size: 16px;
height: auto; height: auto;
width:100%;
margin-bottom: 15px; margin-bottom: 15px;
padding: 7px 9px; padding: 7px 9px;
} }
</style> </style>
<br>
<div class="container"> <div class="container">
% if forgot:
<form class="form-signin" action="/sign/forgot" method="post">
<h3 class="form-signin-heading">Mes identifiants</h3>
<hr>
<input name="mail" type="text" class="input-block-level" placeholder="Mon adresse email">
<button class="btn btn-primary btn-block" type="submit">Me renvoyer mes identifiants</button>
</form>
% else:
<form class="form-signin" action="/sign/in" method="post"> <form class="form-signin" action="/sign/in" method="post">
<h2 class="form-signin-heading">Me connecter</h2> <h3 class="form-signin-heading">Me connecter</h3>
<hr>
<input name="username" type="text" class="input-block-level" placeholder="Nom"> <input name="username" type="text" class="input-block-level" placeholder="Nom">
<input name="password" type="password" class="input-block-level" placeholder="Mot de passe"> <input name="password" type="password" class="input-block-level" placeholder="Mot de passe">
<label class="checkbox"> <center><button class="btn btn-large btn-primary btn-block" type="submit">S'identifier</button></center>
<input type="checkbox" value="remember-me"> Remember me <br>
</label> <a href="/sign/forgot">Je ne me souviens plus de mon mot de passe</a>
<button class="btn btn-large btn-primary" type="submit">S'identifier</button>
</form> </form>
% endif
</div> </div>
+1
View File
@@ -166,6 +166,7 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form id="ModalForm" action="javascript:DoPost('/2015/modal/Password/${uid}');" style='margin:0;'> <form id="ModalForm" action="javascript:DoPost('/2015/modal/Password/${uid}');" style='margin:0;'>
<div class="description">Votre identifiant est <b>${request.user.slug}</b>
<div class="description">Pour modifier le mot de passe actuel, <div class="description">Pour modifier le mot de passe actuel,
entrez un nouveau mot de passe dans chacune des deux zones de texte. entrez un nouveau mot de passe dans chacune des deux zones de texte.
</div> </div>
+9 -28
View File
@@ -1,35 +1,14 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<style> % if request.user and request.user.uid==1:
.borderbox {
border: 1px solid #e1e4e5;
margin: 1px 0 24px;
color: #404040;
line-height: 1.5;
margin: 0;
overflow: auto;
padding: 12px;
background: none repeat scroll 0 0 #fcfcfc;
font-family: "Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;
}
.titleborderbox {
background: none repeat scroll 0 0 #ffffff;
border: 1px solid #eee;
display: inline;
left: 16px;
padding: 2px 7px;
position: relative;
top: 10px;
}
.borderboxtime {
float:right;
padding:1px 15px;
border: 1px solid #eee;
}
</style>
% if request.user and DispUser.uid==request.user.uid or request.user.uid==1:
<a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a> <a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a>
% elif request.user and DispUser.uid==request.user.uid:
<a style="float:right;" href="/MesJM2L">Editer</a>
% endif % endif
<div class="row-fluid">
<div class="span10 offset1">
<h2>${DispUser.prenom} ${DispUser.nom}</h2> <h2>${DispUser.prenom} ${DispUser.nom}</h2>
<div style="display: inline-block;"> <div style="display: inline-block;">
@@ -75,3 +54,5 @@
<hr/> <hr/>
<p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p>
</div>
</div>
+22 -12
View File
@@ -1,4 +1,9 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<div class="row-fluid">
<div class="span10 offset1">
<strong>${event.event_type}</strong>: <strong>${event.event_type}</strong>:
<div class="borderboxtime"> <div class="borderboxtime">
${event.start_time.strftime('%d %b %Y').decode('utf-8')} - ${event.start_time.strftime('%d %b %Y').decode('utf-8')} -
@@ -10,7 +15,11 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
%if event.event_uid: %if event.event_uid:
<a href="http://jm2l.linux-azur.org/node/${event.event_uid}">Link</a> - <a href="http://jm2l.linux-azur.org/node/${event.event_uid}">Link</a> -
%endif %endif
% if event.for_year==2015 and (request.user.Staff or request.user in event.intervenants):
<a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a> <a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a>
% elif request.user.Staff:
<a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a>
% endif
<h3 style="line-height:30px;">${event.name}</h3> <h3 style="line-height:30px;">${event.name}</h3>
% if event.description : % if event.description :
@@ -43,27 +52,28 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
(${iterv.pseudo}) (${iterv.pseudo})
%endif %endif
</div> </div>
<div class="intervbox borderbox"> <div class="media borderbox">
% if iterv.PhotosLinks: ${helpers.show_pictures(iterv)}
<div style="float:right;padding:5px;border: 1px solid #eee;background-color:white;"> <div class="media-body">
% for img_path in iterv.PhotosLinks:
<img src="${img_path}" alt="logo" />
% endfor
</div>
% endif
% if iterv.bio: % if iterv.bio:
${iterv.bio | n} ${iterv.bio | n}
%endif % else:
<i>Ce profil n'a pas été complété.</i>
% endif
</div>
</div> </div>
% if iterv.website:
<div class="footborderbox"> <div class="footborderbox">
% if iterv.website:
<div style="float:right;">
<a href="http://${iterv.website}">${iterv.website}</a> <a href="http://${iterv.website}">${iterv.website}</a>
</div> </div>
%endif % endif
</div>
</p> </p>
% endfor % endfor
<div class="clearfix">&nbsp;</div> <div class="clearfix">&nbsp;</div>
<p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p>
<br/> <br/>
<hr/> <hr/>
</div>
</div>
+22 -10
View File
@@ -1,7 +1,11 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% The_entity_type = entity.get_entity_type %> <% The_entity_type = entity.get_entity_type %>
<div class="row-fluid">
<div class="span10 offset1">
<strong>${The_entity_type.entity_type}</strong> <strong>${The_entity_type.entity_type}</strong>
% if The_entity_type.entity_subtype!=The_entity_type.entity_type: % if The_entity_type.entity_subtype!=The_entity_type.entity_type:
${The_entity_type.entity_subtype} ${The_entity_type.entity_subtype}
@@ -12,7 +16,9 @@ ${The_entity_type.entity_subtype}
%if entity.tiers_id: %if entity.tiers_id:
<a href="http://jm2l.linux-azur.org/node/${entity.tiers_id}">Link</a> - <a href="http://jm2l.linux-azur.org/node/${entity.tiers_id}">Link</a> -
%endif %endif
% if (request.user.Staff or request.user in entity.members):
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">Editer</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">Editer</a>
% endif
<div clear='both'></div> <div clear='both'></div>
<div> <div>
<a style="float:right;" href="/entities">Liste des entités</a> <a style="float:right;" href="/entities">Liste des entités</a>
@@ -57,23 +63,27 @@ ${The_entity_type.entity_subtype}
(${iterv.pseudo}) (${iterv.pseudo})
%endif %endif
</div> </div>
<div class="borderbox"> <div class="media borderbox">
% if iterv.PhotosLinks: ${helpers.show_pictures(iterv)}
<div style="float:right;padding:5px;border: 1px solid #eee;background-color:white;"> <div class="media-body">
% for img_path in iterv.PhotosLinks: <ul>
<img src="${img_path}" alt="logo" /> % for i in filter(lambda x:x.user_uid==iterv.uid and x.tiers_uid==entity.uid, entity.membership):
<li>${i.year_uid} ${i.role}</li>
% endfor % endfor
</div> </ul>
% endif
% if iterv.bio: % if iterv.bio:
${iterv.bio | n} ${iterv.bio | n}
%endif % else:
<i>Ce profil n'a pas été complété.</i>
% endif
</div>
</div>
<div class="footborderbox">
% if iterv.website: % if iterv.website:
<div style="float:right;"> <div style="float:right;">
<a href="http://${iterv.website}">${iterv.website}</a> <a href="http://${iterv.website}">${iterv.website}</a>
</div> </div>
%endif % endif
</div> </div>
</p> </p>
% endfor % endfor
@@ -82,3 +92,5 @@ ${The_entity_type.entity_subtype}
<br/> <br/>
<hr/> <hr/>
</div>
</div>
+6
View File
@@ -1,6 +1,10 @@
<%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="row-fluid">
<div class="span10 offset1">
% if request.user and (DispUser.uid==request.user.uid or request.user.uid==1): % if request.user and (DispUser.uid==request.user.uid or request.user.uid==1):
<a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a> <a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a>
% endif % endif
@@ -43,3 +47,5 @@
% endif % endif
<p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p>
</div>
</div>
+3
View File
@@ -96,6 +96,9 @@ class MediaPath():
elif media_table=='tasks': elif media_table=='tasks':
# Use Current Year # Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ] p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
elif media_table=='poles':
# Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
elif media_table in ['RIB', 'Justif']: elif media_table in ['RIB', 'Justif']:
slug = User.by_id(linked_id).slug slug = User.by_id(linked_id).slug
p = IMAGEPATH + ['users'] + [ slug ] + [ self.media_table ] p = IMAGEPATH + ['users'] + [ slug ] + [ self.media_table ]
+44 -37
View File
@@ -195,7 +195,7 @@ def JSON_TimeLine_Request(request):
"text":"<i><span class='c1'>9ème Édition</span></i>", "text":"<i><span class='c1'>9ème Édition</span></i>",
"asset": "asset":
{ {
"media":"", "media":"https://www.youtube.com/watch?v=DnfjrxVoLao",
"credit":"JM2L", "credit":"JM2L",
"caption":"" "caption":""
} }
@@ -208,8 +208,7 @@ def JSON_TimeLine_Request(request):
## =-=- Here, We handle HTTP requests - Public Part -=-= ## =-=- Here, We handle HTTP requests - Public Part -=-=
@view_config(route_name='home', renderer="jm2l:templates/NewIndex.mako") @view_config(route_name='home', renderer="jm2l:templates/NewIndex.mako")
def index_page(request): def index_page(request):
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'', MainTab = {'accueil':'active', "logged_in":request.authenticated_userid }
"logged_in":request.authenticated_userid }
return MainTab return MainTab
@view_config(route_name='programme', renderer="jm2l:templates/Public/Programme.mako") @view_config(route_name='programme', renderer="jm2l:templates/Public/Programme.mako")
@@ -230,7 +229,7 @@ def programme(request):
RefDay = datetime.datetime.strptime(day[0],'%d-%m-%Y') RefDay = datetime.datetime.strptime(day[0],'%d-%m-%Y')
ListDay.append( ( RefDay.strftime('%A %d %b %Y'), ListDay.append( ( RefDay.strftime('%A %d %b %Y'),
RefDay.strftime('%d') ) ) RefDay.strftime('%d') ) )
MainTab = {'programme':'active','presse':'', 'plan':'', 'participer':'', 'DisplayYear':year, \ MainTab = {'programme':'active','DisplayYear':year, \
'Events':Events, 'Event':Event, 'Days':ListDay, "logged_in":request.authenticated_userid } 'Events':Events, 'Event':Event, 'Days':ListDay, "logged_in":request.authenticated_userid }
return MainTab return MainTab
@@ -238,8 +237,7 @@ def programme(request):
def static_presse(request): def static_presse(request):
year = int(request.matchdict.get('year', None)) year = int(request.matchdict.get('year', None))
content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first() content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first()
MainTab = {'programme':'','presse':'active', 'plan':'', 'participer':'', MainTab = {'presse':'active', "logged_in":request.authenticated_userid, 'content':content, 'DisplayYear':year}
"logged_in":request.authenticated_userid, 'content':content, 'DisplayYear':year}
return MainTab return MainTab
@view_config(route_name='edit_presse', renderer="jm2l:templates/Staff/EditPresse.mako") @view_config(route_name='edit_presse', renderer="jm2l:templates/Staff/EditPresse.mako")
@@ -249,15 +247,13 @@ def edit_presse(request):
form = DossPresse(request.POST, content, meta={'csrf_context': request.session}) form = DossPresse(request.POST, content, meta={'csrf_context': request.session})
if request.method == 'POST' and form.validate(): if request.method == 'POST' and form.validate():
form.populate_obj(content) form.populate_obj(content)
MainTab = {'programme':'','presse':'active', 'plan':'', 'participer':'', MainTab = {'presse':'active', "logged_in":request.authenticated_userid, 'form':form, 'DisplayYear':year}
"logged_in":request.authenticated_userid, 'form':form, 'DisplayYear':year}
return MainTab return MainTab
@view_config(route_name='plan', renderer="jm2l:templates/Public/Plan.mako") @view_config(route_name='plan', renderer="jm2l:templates/Public/Plan.mako")
def static_plan(request): def static_plan(request):
MainTab = {'programme':'','presse':'', 'plan':'active', 'participer':'', MainTab = {'plan':'active', "logged_in":request.authenticated_userid }
"logged_in":request.authenticated_userid }
return MainTab return MainTab
## =-=- Here, We handle HTTP requests - Staff Logged Part -=-= ## =-=- Here, We handle HTTP requests - Staff Logged Part -=-=
@@ -272,7 +268,6 @@ def list_view(request):
DicTask[grp] = tasks DicTask[grp] = tasks
return {'tasks': DicTask } return {'tasks': DicTask }
@view_config(route_name='handle_task', renderer='jm2l:templates/Staff/tasks.mako') @view_config(route_name='handle_task', renderer='jm2l:templates/Staff/tasks.mako')
def tasks(request): def tasks(request):
task_id = request.matchdict.get('task_id') task_id = request.matchdict.get('task_id')
@@ -319,7 +314,6 @@ def tasks(request):
return HTTPFound(location=request.route_url('list_task')+"#"+slugify(Task.area.name)) return HTTPFound(location=request.route_url('list_task')+"#"+slugify(Task.area.name))
return {'form':form, 'area':slugify(Areas[Task.area_uid-1].name)} return {'form':form, 'area':slugify(Areas[Task.area_uid-1].name)}
@view_config(route_name='handle_pole', renderer='jm2l:templates/Staff/pole.mako') @view_config(route_name='handle_pole', renderer='jm2l:templates/Staff/pole.mako')
def tasks_area(request): def tasks_area(request):
pole_id = request.matchdict.get('pole_id') pole_id = request.matchdict.get('pole_id')
@@ -337,7 +331,7 @@ def tasks_area(request):
DBSession.merge(Pole) DBSession.merge(Pole)
else: else:
DBSession.add(Pole) DBSession.add(Pole)
return HTTPFound(location=request.route_url('list_task')) return HTTPFound(location=request.route_url('list_task')+"#"+slugify(Pole.name))
return {'form':form } return {'form':form }
@view_config(route_name='action_task') @view_config(route_name='action_task')
@@ -347,10 +341,11 @@ def action_task(request):
Task = Tasks.by_id(int(task_id)) Task = Tasks.by_id(int(task_id))
if action=='close': if action=='close':
Task.closed = True Task.closed = True
request.session.flash(('info','Task was successfully closed!'))
if action=='open': if action=='open':
Task.closed = False Task.closed = False
request.session.flash(('info','Task was successfully re-opened!'))
DBSession.merge(Task) DBSession.merge(Task)
request.session.flash('Task was successfully closed!')
return HTTPFound(location=request.route_url('list_task')+"#"+slugify(Task.area.name)) return HTTPFound(location=request.route_url('list_task')+"#"+slugify(Task.area.name))
@@ -404,6 +399,15 @@ def exchange(request):
} }
return MainTab return MainTab
@view_config(route_name='sejour')
def sejour(request):
if request.user is None:
# Don't answer to users that aren't logged
return HTTPUnauthorized('You have to be logged to hope an answer.')
if request.method == 'POST':
print request.POST
return HTTPFound(location='/MesJM2L#Sejour')
@view_config(route_name='jm2l', renderer="jm2l:templates/jm2l.mako") @view_config(route_name='jm2l', renderer="jm2l:templates/jm2l.mako")
def jm2l_page(request): def jm2l_page(request):
if request.user is None: if request.user is None:
@@ -443,6 +447,7 @@ def jm2l_page(request):
profil.last_change = datetime.datetime.utcnow() profil.last_change = datetime.datetime.utcnow()
profil.slug = slugify(remove_accents('%s %s' % (profil.prenom, profil.nom)).lower().strip()) profil.slug = slugify(remove_accents('%s %s' % (profil.prenom, profil.nom)).lower().strip())
DBSession.merge(profil) DBSession.merge(profil)
request.session.flash(('info',u'Votre fiche a été mise à jour avec succès'))
MainTab = {'participer':'active', MainTab = {'participer':'active',
'Places':Place.get_list(False), 'Places':Place.get_list(False),
'DBTiers':Tiers, 'DBTiers':Tiers,
@@ -466,6 +471,8 @@ def Modal(request):
response = render_to_response('jm2l:templates/modals_js.mako', response = render_to_response('jm2l:templates/modals_js.mako',
{'modtype':modtype}, {'modtype':modtype},
request=request) request=request)
request.user.password = form.password.data
DBSession.merge(request.user)
response.content_type = 'text/javascript' response.content_type = 'text/javascript'
return response return response
if modtype=='UserPicture': if modtype=='UserPicture':
@@ -681,8 +688,6 @@ def participer(request):
message.add_bcc("spam@style-python.fr") message.add_bcc("spam@style-python.fr")
mailer.send(message) mailer.send(message)
MainTab = {'programme':'','presse':'', 'plan':'', MainTab = {'programme':'','presse':'', 'plan':'',
'participer':'active', 'form':form, "link": MyLink, 'participer':'active', 'form':form, "link": MyLink,
'logged_in':request.authenticated_userid } 'logged_in':request.authenticated_userid }
@@ -724,24 +729,19 @@ def link_event(request):
form = AddIntervenant(request.POST, meta={'csrf_context': request.session}) form = AddIntervenant(request.POST, meta={'csrf_context': request.session})
intervention = request.matchdict.get('intervention', None) intervention = request.matchdict.get('intervention', None)
TargetEvent = Event.by_id(form.event_uid.data) TargetEvent = Event.by_id(form.event_uid.data)
Exist = DBSession.query(User)\ Exist = User.by_id(form.intervenant.data)
.filter(User.nom==form.nom.data)\ if not Exist:
.filter(User.prenom==form.prenom.data)\ request.session.flash(('error',u"Une erreur s'est produite lors de l'ajout de votre intervenant !"))
.first() return HTTPFound(location=request.route_url('edit_event', sep='/',
if Exist: year=str(year), intervention=intervention, event_id=str(TargetEvent.uid)))
TargetUser = Exist
else: else:
# Add it to user base TargetUser = Exist
TargetUser = User(nom=form.nom.data,
prenom=form.prenom.data, password=form.nom.data)
DBSession.add(TargetUser)
DBSession.flush()
uev = User_Event(year_uid=year, role="Animateur", user_uid=TargetUser.uid) uev = User_Event(year_uid=year, role=u"Animateur d'un évenement JM2L", user_uid=TargetUser.uid)
TargetEvent.interventions.append( uev ) TargetEvent.interventions.append( uev )
return HTTPFound(location=request.route_url('edit_event', sep='/', return HTTPFound(location=request.route_url('edit_event', sep='/',
year=str(year), intervention=intervention, uid=str(TargetEvent.uid))) year=str(year), intervention=intervention, event_id=str(TargetEvent.uid)))
@view_config(route_name='edit_event', renderer="jm2l:templates/edit_event.mako") @view_config(route_name='edit_event', renderer="jm2l:templates/edit_event.mako")
def edit_event(request): def edit_event(request):
@@ -756,13 +756,13 @@ def edit_event(request):
raise HTTPNotFound(u"Ce type d'évenement n'est pas reconnu") raise HTTPNotFound(u"Ce type d'évenement n'est pas reconnu")
TheYear = DBSession.query(JM2L_Year)\ TheYear = DBSession.query(JM2L_Year)\
.filter(JM2L_Year.year_uid==year)\ .filter(JM2L_Year.year_uid==year)\
.all() .first()
# Check year avaibility # Check year avaibility
if not TheYear: if not TheYear:
raise HTTPNotFound(u"Cette année n'est pas pris en charge") raise HTTPNotFound(u"Cette année n'est pas pris en charge")
# Generate Timeslots for current year # Generate Timeslots for current year
TimeSlots = list(enumerate( [ x.strftime('%a %d %b %H:%M') for x in TimeSlots = list(enumerate( [ x.strftime('%a %d %b %H:%M') for x in
TheYear[0].AvailableTimeSlots ] )) TheYear.AvailableTimeSlots ] ))
if event_id: if event_id:
# We try to update an existing record # We try to update an existing record
@@ -778,8 +778,8 @@ def edit_event(request):
if request.user is None or not (request.user.Staff or request.user in TheEvent.intervenants): if request.user is None or not (request.user.Staff or request.user in TheEvent.intervenants):
return HTTPForbidden(u"Vous n'êtes pas identifié comme étant un participant à cette intervention.") return HTTPForbidden(u"Vous n'êtes pas identifié comme étant un participant à cette intervention.")
# Compute some field value from selected event # Compute some field value from selected event
if TheEvent.start_time in TheYear[0].AvailableTimeSlots: if TheEvent.start_time in TheYear.AvailableTimeSlots:
start_sel = TheYear[0].AvailableTimeSlots.index(TheEvent.start_time) start_sel = TheYear.AvailableTimeSlots.index(TheEvent.start_time)
else: else:
start_sel = len(TimeSlots) start_sel = len(TimeSlots)
TimeSlots.append( (len(TimeSlots), TheEvent.start_time.strftime('%a %d %b %H:%M'))) TimeSlots.append( (len(TimeSlots), TheEvent.start_time.strftime('%a %d %b %H:%M')))
@@ -793,6 +793,14 @@ def edit_event(request):
form.description.label.text += IntervLabel form.description.label.text += IntervLabel
# Each event can get severals members # Each event can get severals members
formAdd = AddIntervenant(event_uid=TheEvent.uid) formAdd = AddIntervenant(event_uid=TheEvent.uid)
# Build list of intervenant
# Get users from db
Users = DBSession.query(User)\
.filter(User.Staff==1)\
.order_by('nom').all()
# Put some users on form
formAdd.intervenant.choices = [(u.uid, "%s %s" % (u.nom, u.prenom))
for u in Users]
else: else:
TheEvent = Event() TheEvent = Event()
# prepare the form for creation # prepare the form for creation
@@ -845,7 +853,7 @@ def edit_event(request):
if request.method == 'POST' and form.validate(): if request.method == 'POST' and form.validate():
form.populate_obj(TheEvent) form.populate_obj(TheEvent)
TheEvent.start_time = TheYear[0].AvailableTimeSlots[form.start_sel.data] TheEvent.start_time = TheYear.AvailableTimeSlots[form.start_sel.data]
TheEvent.end_time = TheEvent.start_time + datetime.timedelta(minutes=form.duration.data) TheEvent.end_time = TheEvent.start_time + datetime.timedelta(minutes=form.duration.data)
# Ok, time to put in database # Ok, time to put in database
if not form._fields.has_key("uid"): if not form._fields.has_key("uid"):
@@ -857,6 +865,7 @@ def edit_event(request):
uev.user_uid = request.user.uid uev.user_uid = request.user.uid
TheEvent.interventions.append( uev ) TheEvent.interventions.append( uev )
DBSession.flush() DBSession.flush()
request.session.flash(('sucess','Votre intervention a été créee !'))
return HTTPFound(location=request.route_url('edit_event', sep='/', return HTTPFound(location=request.route_url('edit_event', sep='/',
year=str(year), intervention=intervention, event_id=str(TheEvent.slug))) year=str(year), intervention=intervention, event_id=str(TheEvent.slug)))
else: else:
@@ -898,8 +907,7 @@ def show_tiers(request):
return MainTab return MainTab
@view_config(route_name='add_entity', renderer="jm2l:templates/edit_tiers.mako") @view_config(route_name='add_entity', renderer="jm2l:templates/edit_tiers.mako")
@view_config(route_name='edit_entity', renderer="jm2l:templates/edit_tiers.mako", @view_config(route_name='edit_entity', renderer="jm2l:templates/edit_tiers.mako")
permission='edit')
def edit_tiers(request): def edit_tiers(request):
entity_id = request.matchdict.get('entity_id', None) entity_id = request.matchdict.get('entity_id', None)
TargetList = list() TargetList = list()
@@ -1049,7 +1057,6 @@ def show_user(request):
'DispUser':DispUser, 'logged_in':request.authenticated_userid } 'DispUser':DispUser, 'logged_in':request.authenticated_userid }
return MainTab return MainTab
#@view_config(route_name='link_user_entity') #@view_config(route_name='link_user_entity')
def link_user_entity(request): def link_user_entity(request):
uid = int(request.matchdict.get('uid', -1)) uid = int(request.matchdict.get('uid', -1))