@@ -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 | ||||
@@ -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) | ||||
@@ -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)], | |||||
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') | |||||
intervenant = SelectField(u'Intervenant', coerce=int ) | |||||
class ConfCreateForm(MyBaseForm): | class ConfCreateForm(MyBaseForm): | ||||
@@ -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; | ||||
@@ -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;} | ||||
@@ -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> |
@@ -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("height", height + margin.top + margin.bottom) | |||||
//.attr("viewBox", "0 0 " + width + " " + height ) | |||||
//.attr("preserveAspectRatio", "xMidYMid"); | |||||
.attr("width", "100%") //width + margin.right + margin.left) | |||||
//.attr("height", height + margin.top + margin.bottom) | |||||
.attr("viewBox", "0 0 " + (width + margin.right + margin.left) + " " + (height + margin.top + margin.bottom) ) | |||||
.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() | ||||
@@ -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">‹</th>'+ | |||||
'<th colspan="5" class="switch"></th>'+ | |||||
'<th class="next">›</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 ); |
@@ -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; | |||||
} |
@@ -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"> | |||||
Synchronisez votre calendrier avec <a href="/2015/JM2L.ics">le fichier ical JM2L 2015</a> | |||||
</div> | |||||
<br> | |||||
<div id="timeline" style="margin-left: -50px;display:block;"></div> | |||||
<div class="clearfix"> </div> | |||||
<div style="top:500px;position: relative"> | |||||
Le 28 Novembre 2015 aura lieu la 9e édition des Journées Méditerranéennes du Logiciel Libre (JM2LL) à | |||||
Sophia-Antipolis destinées tout public (http://jm2l.linux-azur.org/). | |||||
<br> | |||||
Le thème de cette année sera « Do It Yourself » ou « Faîtes le vous-même » : | |||||
<ul> | |||||
<li>Migration vers les logiciels libres</li> | |||||
<li>Libres enfants du numérique : jeux et loisirs pour les juniors.</li> | |||||
<li>Gérer ses données personnelles</li> | |||||
<li>Do It Yourself (jeux vidéos, fablabs…)</li> | |||||
<li>Culture libre</li> | |||||
<li>Communautés du libre</li> | |||||
</ul> | |||||
Nous faisons appel aux acteurs du numérique libre pour alimenter le programme des conférences/ateliers : | |||||
si vous souhaitez échanger avec le public et partager un bon moment avec la communauté, inscrivez-vous ! | |||||
<H2 style="text-align: center;">9<sup>ème</sup> édition des JM2L</H2> | |||||
<br> | <br> | ||||
Nous vous proposons cinq formats de contribution : | |||||
<ul> | |||||
<li>Stands au sein du village associatif</li> | |||||
<li>Conférences de 20 ou 40 minutes suivies d’un é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> | |||||
</ul> | |||||
<p> | |||||
Il sera bien sûr possible de combiner plusieurs formats (par exemple, une démo ou une conférence suivie | |||||
d’un atelier). | |||||
</p> | |||||
<p> | |||||
Vous pouvez nous faire parvenir vos propositions directement via le menu participer. | |||||
</p> | |||||
<div class="row-fluid"> | |||||
<div class="span4 offset1"> | |||||
<blockquote> | |||||
Le 28 Novembre 2015 aura lieu la 9<sup>ème</sup> édition des Journées Méditerranéennes du Logiciel Libre (JM2L) à | |||||
Polytech'Nice destinée à tout public. | |||||
</blockquote> | |||||
Le thème de cette année sera « Do It Yourself » ou « Faîtes le vous-même » : | |||||
<ul class="enum"> | |||||
<li>Migration vers les logiciels libres</li> | |||||
## <li>Libres enfants du numérique : jeux et loisirs pour les juniors.</li> | |||||
## <li>Gérer ses données personnelles</li> | |||||
<li>Do It Yourself (jeux vidéos, fablabs…)</li> | |||||
<li>Culture libre</li> | |||||
## <li>Communautés du libre</li> | |||||
</ul> | |||||
</div> | |||||
<div class="span4 offset1"> | |||||
<p> | |||||
Nous faisons appel aux acteurs du numérique libre pour alimenter le programme des conférences/ateliers : | |||||
<br> | |||||
Vous pouvez nous faire parvenir vos propositions directement via le menu <a href="/participer-l-evenement">participer.</a> | |||||
<br> | |||||
Si vous souhaitez échanger avec le public et partager un bon moment avec la communauté, <a href="/participer-l-evenement#inscription">inscrivez-vous !</a> | |||||
<br> | |||||
Vous pouvez d'ores et déjà synchroniser votre calendrier avec <a href="/2015/JM2L.ics">notre fichier ical JM2L 2015</a> | |||||
</p> | |||||
</div> | |||||
</div> | |||||
## Nous vous proposons plusieurs formats de contribution : | |||||
## <ul class="enum"> | |||||
## <li>Stands au sein du village associatif</li> | |||||
## <li>Conférences de 20 à 70 minutes suivies d’un é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 | |||||
## d’un 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> |
@@ -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 | ||||
@@ -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> |
@@ -4,21 +4,21 @@ 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ée</legend> | <legend>Arrivée</legend> | ||||
<div class="form-inline"> | <div class="form-inline"> | ||||
J'arrive | J'arrive | ||||
<select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | ||||
% for place in Places: | |||||
<option value="${place.place_id}">${place.display_name}</option> | |||||
% endfor | |||||
% for place in Places: | |||||
<option value="${place.place_id}">${place.display_name}</option> | |||||
% endfor | |||||
</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="Vendredi">Vendredi</option> | |||||
<option value="Samedi">Samedi</option> | |||||
<option value="26">Jeudi</option> | |||||
<option value="27">Vendredi</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,14 +29,14 @@ fieldset:disabled { | |||||
</select> | </select> | ||||
à | à | ||||
<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): | |||||
<option value="${hour}h${minutes}" | |||||
% if str("%dh%.2d" % (hour, minutes))=='10h00': | |||||
selected="selected" | |||||
% endif | |||||
>${"%dh%.2d" % (hour, minutes)}</option> | |||||
% for minutes in range(0,60,10): | |||||
<option value="${"%d:%.2d" % (hour, minutes)}" | |||||
% if str("%dh%.2d" % (hour, minutes))=='10h00': | |||||
selected="selected" | |||||
% endif | |||||
>${"%dh%.2d" % (hour, minutes)}</option> | |||||
% endfor | % endfor | ||||
% endfor | % endfor | ||||
</select> | </select> | ||||
@@ -46,13 +46,7 @@ fieldset:disabled { | |||||
context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Day').select2({width:'resolve'});" % jsitem ) | context._kwargs['postpone_js'].append( "$('#Arrival\\\\:Day').select2({width:'resolve'});" % jsitem ) | ||||
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="Dimanche">Dimanche</option> | |||||
<option value="Lundi">Lundi</option> | |||||
<option value="28">Samedi</option> | |||||
<option value="29">Dimanche</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> |
@@ -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) 6 52 42 31 37</dd> | <dd>» +33 (0) 6 52 42 31 37</dd> | ||||
</dl> | </dl> | ||||
</div> | </div> | ||||
@@ -25,12 +39,28 @@ | |||||
930, route des Colles (site des Templiers) <br> | 930, route des Colles (site des Templiers) <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&lon=7.07081&zoom=14&layers=M&mlat=43.61637&mlon=7.08520">Voir une carte plus grande</a> | |||||
</p> | |||||
</div> | </div> | ||||
</div> | |||||
<br> | |||||
@@ -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, l’image banner2007.png est ici : <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, l’image banner2007.png est ici : <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 l’avantage de nous permettre de faire quelques statistiques.</p> | Préférez quand même la première méthode qui présente l’avantage de nous permettre de faire quelques statistiques.</p> | ||||
% endif | % endif | ||||
<br><br> | |||||
</div> | |||||
<div class="span3"> | |||||
<!--Sidebar content--> | |||||
${helpers.participants(DisplayYear)} | |||||
</div> |
@@ -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,26 +58,38 @@ rect { | |||||
fill: none; | fill: none; | ||||
stroke: #222; | stroke: #222; | ||||
} | } | ||||
</style> | </style> | ||||
<h2>Le Programme ${DisplayYear}</h2> | |||||
<div class="tabbable" id="main_tab"> | |||||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||||
% for Num, (Day, IdDay) in enumerate(Days): | |||||
<li class="${['','active'][Num==0]}"><a href="#Day${Num}" id="Schedule_${Num}" data-toggle="tab">${Day}</a></li> | |||||
% endfor | |||||
</ul> | |||||
<div class="tab-content" style="padding:0"> | |||||
% for Num, (Day, IdDay) in enumerate(Days): | |||||
<div class="tab-pane fade ${['','active '][Num==0]}in" id="Day${Num}"> | |||||
## Container for SVG version of Programme | |||||
<div id="Schedule_SVG_${IdDay}"> | |||||
</%def> | |||||
<div class="row-fluid"> | |||||
<div class="span9"> | |||||
<h2>Le Programme ${DisplayYear}</h2> | |||||
<div class="tabbable" id="main_tab"> | |||||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||||
% for Num, (Day, IdDay) in enumerate(Days): | |||||
<li class="${['','active'][Num==0]}"><a href="#Day${Num}" id="Schedule_${Num}" data-toggle="tab">${Day}</a></li> | |||||
% endfor | |||||
</ul> | |||||
<div class="tab-content" style="padding:0"> | |||||
% for Num, (Day, IdDay) in enumerate(Days): | |||||
<div class="tab-pane fade ${['','active '][Num==0]}in" id="Day${Num}"> | |||||
## Container for SVG version of Programme | |||||
<div id="Schedule_SVG_${IdDay}"> | |||||
</div> | |||||
</div> | </div> | ||||
% endfor | |||||
</div> | </div> | ||||
% endfor | |||||
</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> | |||||
<script type="text/javascript" src="/js/programme.js"></script> | |||||
</div> | |||||
</div> |
@@ -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"]') | ||||
@@ -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> |
@@ -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' } ); | |||||
</script> | |||||
</div> | |||||
</div> |
@@ -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> |
@@ -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 { | |||||
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> | |||||
<div class="row-fluid"> | |||||
<div class="span10 offset1"> | |||||
% 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. | |||||
Pour enregistrer une autre personne, deux cas peuvent se présenter: | |||||
<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. | |||||
Vous avez la possibilité d'être plusieurs pour un même évenement.<br> | |||||
Chacun des intervenants doit être inscrit sur le site. | |||||
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link" method="POST"> | |||||
${formAdd.event_uid} | |||||
<input type="hidden" id="intervenant" name="intervenant" style="width:20em;" | |||||
class="form-control select2-offscreen" tabindex="-1"> | |||||
</input> | |||||
<button type="submit" class="btn btn-primary" /> | |||||
<i class="icon-plus icon-white"></i> Ajouter cet intervenant | |||||
</button> | |||||
</form> | |||||
NB : Notez que les intervenants d'un même évenement ont tous les droits de modification. | |||||
</p> | </p> | ||||
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link" method="POST"> | |||||
${formAdd.event_uid} | |||||
<% | |||||
TabFields = [ | |||||
( formAdd._fields["prenom"], u"Prénom", "padding-right:5px;float:left;" ), | |||||
( formAdd._fields["nom"], u"Nom", "padding-right:5px;" ), | |||||
( formAdd._fields["email"], u"son.mail@fqdn.tld", "padding-right:5px;" ), | |||||
] | |||||
%> | |||||
% 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">×</button> | |||||
<h4>Erreur!</h4> | |||||
${ error } | |||||
</div> | |||||
% endfor | |||||
${Field(placeholder=PlaceHolder, style="width:16em;")} | |||||
</div> | |||||
% endfor | |||||
## Then the submit for this form | |||||
${formAdd.add} | |||||
</form> | |||||
</fieldset> | </fieldset> | ||||
<div class="clearfix"> </div> | <div class="clearfix"> </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: | |||||
% if 'uid' in form._fields: | |||||
${helpers.uploader_js()} | |||||
% endif | |||||
<script type="text/javascript"> | |||||
## Handle Popover of this form | |||||
% for field in form._fields.keys(): | |||||
$('#${field}-help').popover(); | |||||
% if form._fields[field].type=='SelectField': | |||||
$('#${field}').select2({width:'resolve'}); | |||||
% endif | |||||
%endfor | |||||
% if formAdd: | |||||
% for field in formAdd._fields.keys(): | |||||
$('#${field}-help').popover(); | |||||
%endfor | |||||
% endif | |||||
var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } ); | |||||
</script> | |||||
% else: | |||||
</div> | |||||
</div> | |||||
<%def name="jsAddOn()"> | |||||
<script src="/vendor/select2/js/select2.js"></script> | |||||
<script> | |||||
jQuery(function() { | |||||
$("#intervenant").select2( | |||||
{ | |||||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||||
minimumInputLength: 2, allowClear: true, | |||||
ajax: { | |||||
quietMillis: 250, url: "/json-users", dataType: 'json', | |||||
data: function (term, page) { | |||||
return { pageSize: 8, pageNum: page, searchTerm: term }; | |||||
}, | |||||
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 |
@@ -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: | |||||
## ${helpers.uploader_js()} | |||||
##% endif | |||||
</div> | |||||
</div> | |||||
<%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({}); | |||||
} | } | ||||
}); | }); | ||||
}); | }); | ||||
@@ -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">×</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">›</a> | <a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">›</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;"> | |||||
<img src="${link}" class="img-polaroid" style="max-height:205px;max-width:235px;" alt="Photo ${uprofil.slug}" /> | |||||
<div style="margin:auto;text-align:center;"> | |||||
<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;"> | |||||
<img src="/img/default-user.png" class="img-polaroid" alt="Photo ${uprofil.slug}" style="max-height:205px;" /> | |||||
<div style="margin:auto;text-align:center;"> | |||||
<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> \ | ||||
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||
@@ -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()} |
@@ -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 | |||||
<span class="visible-phone"> ✔ Phone</span> | |||||
<span class="visible-tablet"> ✔ Tablet</span> | |||||
<span class="visible-desktop"> ✔ Desktop</span> | |||||
</li> | |||||
## <li>Mode | |||||
## <span class="visible-phone"> ✔ Phone</span> | |||||
## <span class="visible-tablet"> ✔ Tablet</span> | |||||
## <span class="visible-desktop"> ✔ Desktop</span> | |||||
## </li> | |||||
</ul> | </ul> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<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,17 +155,20 @@ ${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"> | <div class="container-fluid"> | ||||
<div class="row-fluid"> | |||||
<div class="span9"> | |||||
<!--Body content--> | |||||
${next.body()} | |||||
</div> | |||||
<div class="span3"> | |||||
<!--Sidebar content--> | |||||
${helpers.participants(DisplayYear)} | |||||
</div> | |||||
<br> | |||||
<div class="span6 offset3"> | |||||
<div class="alert alert-${type}"> | |||||
<button type="button" class="close" data-dismiss="alert">×</button> | |||||
${message} | |||||
</div> | </div> | ||||
</div> | |||||
</div> | |||||
% endfor | |||||
<div class="container-fluid"> | |||||
<!--Body content--> | |||||
${next.body()} | |||||
</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> | ||||
@@ -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> |
@@ -3,43 +3,55 @@ | |||||
.navbar { | .navbar { | ||||
margin-bottom: 0px; | margin-bottom: 0px; | ||||
} | } | ||||
#bottom { | |||||
background-color: #f5f5f5; | |||||
} | |||||
.form-signin { | .form-signin { | ||||
max-width: 300px; | |||||
padding: 19px 29px 29px; | |||||
margin: 0 auto 20px; | |||||
background-color: #fff; | |||||
border: 1px solid #e5e5e5; | |||||
-webkit-border-radius: 5px; | |||||
-moz-border-radius: 5px; | |||||
border-radius: 5px; | |||||
-webkit-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); | |||||
max-width: 300px; | |||||
padding: 19px 29px 29px; | |||||
margin: 0 auto 20px; | |||||
background-color: #f5f5f5; | |||||
border: 1px solid #e5e5e5; | |||||
-webkit-border-radius: 5px; | |||||
-moz-border-radius: 5px; | |||||
border-radius: 5px; | |||||
-webkit-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); | |||||
} | } | ||||
.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; | |||||
height: auto; | |||||
margin-bottom: 15px; | |||||
padding: 7px 9px; | |||||
font-size: 16px; | |||||
height: auto; | |||||
width:100%; | |||||
margin-bottom: 15px; | |||||
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"> | |||||
<input type="checkbox" value="remember-me"> Remember me | |||||
</label> | |||||
<button class="btn btn-large btn-primary" type="submit">S'identifier</button> | |||||
<center><button class="btn btn-large btn-primary btn-block" type="submit">S'identifier</button></center> | |||||
<br> | |||||
<a href="/sign/forgot">Je ne me souviens plus de mon mot de passe</a> | |||||
</form> | </form> | ||||
% endif | |||||
</div> | </div> |
@@ -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> | ||||
@@ -1,35 +1,14 @@ | |||||
<%inherit file="jm2l:templates/layout.mako"/> | <%inherit file="jm2l:templates/layout.mako"/> | ||||
<style> | |||||
.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: | |||||
% if request.user and 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> |
@@ -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 : | ||||
@@ -42,28 +51,29 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')} | |||||
% if iterv.pseudo: | % if iterv.pseudo: | ||||
(${iterv.pseudo}) | (${iterv.pseudo}) | ||||
%endif | %endif | ||||
</div> | |||||
<div class="intervbox borderbox"> | |||||
% if iterv.PhotosLinks: | |||||
<div style="float:right;padding:5px;border: 1px solid #eee;background-color:white;"> | |||||
% for img_path in iterv.PhotosLinks: | |||||
<img src="${img_path}" alt="logo" /> | |||||
% endfor | |||||
</div> | |||||
% endif | |||||
% if iterv.bio: | |||||
${iterv.bio | n} | |||||
%endif | |||||
</div> | </div> | ||||
% if iterv.website: | |||||
<div class="media borderbox"> | |||||
${helpers.show_pictures(iterv)} | |||||
<div class="media-body"> | |||||
% if iterv.bio: | |||||
${iterv.bio | n} | |||||
% else: | |||||
<i>Ce profil n'a pas été complété.</i> | |||||
% endif | |||||
</div> | |||||
</div> | |||||
<div class="footborderbox"> | <div class="footborderbox"> | ||||
<a href="http://${iterv.website}">${iterv.website}</a> | |||||
% if iterv.website: | |||||
<div style="float:right;"> | |||||
<a href="http://${iterv.website}">${iterv.website}</a> | |||||
</div> | |||||
% endif | |||||
</div> | </div> | ||||
%endif | |||||
</p> | </p> | ||||
% endfor | % endfor | ||||
<div class="clearfix"> </div> | <div class="clearfix"> </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> |
@@ -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,24 +63,28 @@ ${The_entity_type.entity_subtype} | |||||
(${iterv.pseudo}) | (${iterv.pseudo}) | ||||
%endif | %endif | ||||
</div> | </div> | ||||
<div class="borderbox"> | |||||
% if iterv.PhotosLinks: | |||||
<div style="float:right;padding:5px;border: 1px solid #eee;background-color:white;"> | |||||
% for img_path in iterv.PhotosLinks: | |||||
<img src="${img_path}" alt="logo" /> | |||||
<div class="media borderbox"> | |||||
${helpers.show_pictures(iterv)} | |||||
<div class="media-body"> | |||||
<ul> | |||||
% 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 | ||||
</ul> | |||||
% if iterv.bio: | |||||
${iterv.bio | n} | |||||
% else: | |||||
<i>Ce profil n'a pas été complété.</i> | |||||
% endif | |||||
</div> | |||||
</div> | |||||
<div class="footborderbox"> | |||||
% if iterv.website: | |||||
<div style="float:right;"> | |||||
<a href="http://${iterv.website}">${iterv.website}</a> | |||||
</div> | </div> | ||||
% endif | % endif | ||||
% if iterv.bio: | |||||
${iterv.bio | n} | |||||
%endif | |||||
% if iterv.website: | |||||
<div style="float:right;"> | |||||
<a href="http://${iterv.website}">${iterv.website}</a> | |||||
</div> | |||||
%endif | |||||
</div> | |||||
</div> | |||||
</p> | </p> | ||||
% endfor | % endfor | ||||
@@ -82,3 +92,5 @@ ${The_entity_type.entity_subtype} | |||||
<br/> | <br/> | ||||
<hr/> | <hr/> | ||||
</div> | |||||
</div> |
@@ -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> |
@@ -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 ] | ||||
@@ -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':'', | |||||
"logged_in":request.authenticated_userid } | |||||
MainTab = {'accueil':'active', "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':'', | |||||
"logged_in":request.authenticated_userid, 'content':content, 'DisplayYear':year} | |||||
MainTab = {'presse':'active', "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':'', | |||||
"logged_in":request.authenticated_userid, 'form':form, 'DisplayYear':year} | |||||
MainTab = {'presse':'active', "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':'', | |||||
"logged_in":request.authenticated_userid } | |||||
MainTab = {'plan':'active', "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)\ | |||||
.filter(User.nom==form.nom.data)\ | |||||
.filter(User.prenom==form.prenom.data)\ | |||||
.first() | |||||
if Exist: | |||||
TargetUser = Exist | |||||
Exist = User.by_id(form.intervenant.data) | |||||
if not Exist: | |||||
request.session.flash(('error',u"Une erreur s'est produite lors de l'ajout de votre intervenant !")) | |||||
return HTTPFound(location=request.route_url('edit_event', sep='/', | |||||
year=str(year), intervention=intervention, event_id=str(TargetEvent.uid))) | |||||
else: | else: | ||||
# Add it to user base | |||||
TargetUser = User(nom=form.nom.data, | |||||
prenom=form.prenom.data, password=form.nom.data) | |||||
DBSession.add(TargetUser) | |||||
DBSession.flush() | |||||
TargetUser = Exist | |||||
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: | |||||
start_sel = TheYear[0].AvailableTimeSlots.index(TheEvent.start_time) | |||||
if TheEvent.start_time in TheYear.AvailableTimeSlots: | |||||
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", | |||||
permission='edit') | |||||
@view_config(route_name='edit_entity', renderer="jm2l:templates/edit_tiers.mako") | |||||
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)) | ||||