Browse Source

Many changes for templates

master
tr4ck3ur des JM2L 9 years ago
parent
commit
7825a33533
42 changed files with 1308 additions and 422 deletions
  1. +1
    -0
      jm2l/__init__.py
  2. +10
    -2
      jm2l/auth.py
  3. +1
    -19
      jm2l/forms.py
  4. +8
    -0
      jm2l/static/css/jm2l.css
  5. +1
    -1
      jm2l/static/css/pylons.css
  6. BIN
      jm2l/static/favicon.ico
  7. BIN
      jm2l/static/img/2015/logo_1.png
  8. BIN
      jm2l/static/img/2015/logo_2.png
  9. BIN
      jm2l/static/img/chev-left.png
  10. BIN
      jm2l/static/img/chev-right.png
  11. BIN
      jm2l/static/img/chevrons.png
  12. BIN
      jm2l/static/img/puce.png
  13. +4
    -0
      jm2l/static/img/shadow.svg
  14. BIN
      jm2l/static/img/svg-icon.png
  15. +11
    -9
      jm2l/static/js/programme.js
  16. +474
    -0
      jm2l/static/vendor/datepicker/bootstrap-datepicker.js
  17. +182
    -0
      jm2l/static/vendor/datepicker/datepicker.css
  18. +64
    -37
      jm2l/templates/NewIndex.mako
  19. +4
    -1
      jm2l/templates/Participer.mako
  20. +47
    -10
      jm2l/templates/Profil/Profil.mako
  21. +25
    -32
      jm2l/templates/Profil/Sejour.mako
  22. +35
    -14
      jm2l/templates/Public/Plan.mako
  23. +8
    -1
      jm2l/templates/Public/Presse.mako
  24. +37
    -21
      jm2l/templates/Public/Programme.mako
  25. +5
    -0
      jm2l/templates/Staff/list.mako
  26. +7
    -1
      jm2l/templates/Staff/new.mako
  27. +21
    -4
      jm2l/templates/Staff/pole.mako
  28. +21
    -3
      jm2l/templates/Staff/tasks.mako
  29. +43
    -100
      jm2l/templates/edit_event.mako
  30. +13
    -14
      jm2l/templates/edit_tiers.mako
  31. +76
    -9
      jm2l/templates/helpers.mako
  32. +2
    -0
      jm2l/templates/jm2l.mako
  33. +46
    -20
      jm2l/templates/layout.mako
  34. +9
    -3
      jm2l/templates/list_tiers.mako
  35. +37
    -25
      jm2l/templates/login.mako
  36. +1
    -0
      jm2l/templates/modals.mako
  37. +9
    -28
      jm2l/templates/show_user.mako
  38. +26
    -16
      jm2l/templates/view_event.mako
  39. +27
    -15
      jm2l/templates/view_tiers.mako
  40. +6
    -0
      jm2l/templates/view_user.mako
  41. +3
    -0
      jm2l/upload.py
  42. +44
    -37
      jm2l/views.py

+ 1
- 0
jm2l/__init__.py View File

@@ -90,6 +90,7 @@ def main(global_config, **settings):
# HTML Routes - Logged # HTML Routes - Logged
#config.add_route('profil', 'MesJM2L') #config.add_route('profil', 'MesJM2L')
config.add_route('jm2l', '/MesJM2L') config.add_route('jm2l', '/MesJM2L')
config.add_route('sejour', '/MonSejour')
config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}') config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}')
# Handle exchanges # Handle exchanges


+ 10
- 2
jm2l/auth.py View File

@@ -1,4 +1,4 @@
# -*- coding: utf8 -*-
from pyramid.view import view_config from pyramid.view import view_config
from pyramid.security import remember, forget from pyramid.security import remember, forget
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
@@ -9,6 +9,10 @@ import datetime
def login(request): def login(request):
return {} return {}


@view_config(route_name='auth', match_param="action=forgot", renderer="jm2l:templates/login.mako")
def forgot(request):
return {'forgot':True}

@view_config(route_name='bymail', renderer="string") @view_config(route_name='bymail', renderer="string")
def bymail(request): def bymail(request):
myhash = request.matchdict.get('hash', "") myhash = request.matchdict.get('hash', "")
@@ -30,7 +34,7 @@ def bymail(request):
def sign_in_out(request): def sign_in_out(request):
username = request.POST.get('username') username = request.POST.get('username')
if username: if username:
user = User.by_name(username)
user = User.by_slug(username)
if user and user.verify_password(request.POST.get('password')): if user and user.verify_password(request.POST.get('password')):
user.last_logged=datetime.datetime.now() user.last_logged=datetime.datetime.now()
DBSession.merge(user) DBSession.merge(user)
@@ -41,6 +45,10 @@ def sign_in_out(request):
headers = forget(request) headers = forget(request)
else: else:
headers = forget(request) headers = forget(request)
if request.matchdict.get('action')=='in':
request.session.flash(('error',u'Vous avez entré un mauvais couple identifiant/password !'))
return HTTPFound(location="/sign/login",
headers=headers)
return HTTPFound(location=request.route_url('home'), return HTTPFound(location=request.route_url('home'),
headers=headers) headers=headers)




+ 1
- 19
jm2l/forms.py View File

@@ -94,25 +94,7 @@ class AddIntervenant(MyBaseForm):
csrf = False csrf = False
event_uid = HiddenField() event_uid = HiddenField()
nom = TextField(u'Nom', [validators.Length(max=80)],
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):




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

@@ -123,6 +123,14 @@ a {
right: 15px; right: 15px;
} }



.carousel-vote {
padding: 15px 50px;
position: absolute;
right: 0;
bottom: 0;
}

.LogistiqueTable th, .LogistiqueTable td .LogistiqueTable th, .LogistiqueTable td
{ {
text-align:center; text-align:center;


+ 1
- 1
jm2l/static/css/pylons.css View File

@@ -40,7 +40,7 @@ body h6{font-family:"NeutonRegular","Lucida Grande",Lucida,Verdana,sans-serif;fo
.wrapper{width:100%} .wrapper{width:100%}
#top,#top-small,#bottom{width:100%;} #top,#top-small,#bottom{width:100%;}
#top{color:#000000;height:215px;} #top{color:#000000;height:215px;}
#bottom{color:#222;background-color:#ffffff;}
#bottom{color:#222;}
.top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;} .top,.top-small,.middle,.bottom{width:750px;margin-right:auto;margin-left:auto;}
.top{padding-top:40px;} .top{padding-top:40px;}
.top-small{padding-top:10px;} .top-small{padding-top:10px;}


BIN
jm2l/static/favicon.ico View File

Before After

BIN
jm2l/static/img/2015/logo_1.png View File

Before After
Width: 1234  |  Height: 239  |  Size: 331 KiB

BIN
jm2l/static/img/2015/logo_2.png View File

Before After
Width: 1234  |  Height: 187  |  Size: 312 KiB

BIN
jm2l/static/img/chev-left.png View File

Before After
Width: 28  |  Height: 42  |  Size: 799 B

BIN
jm2l/static/img/chev-right.png View File

Before After
Width: 28  |  Height: 42  |  Size: 790 B

BIN
jm2l/static/img/chevrons.png View File

Before After
Width: 69  |  Height: 50  |  Size: 1.4 KiB

BIN
jm2l/static/img/puce.png View File

Before After
Width: 10  |  Height: 10  |  Size: 514 B

+ 4
- 0
jm2l/static/img/shadow.svg View File

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

BIN
jm2l/static/img/svg-icon.png View File

Before After
Width: 27  |  Height: 27  |  Size: 1.5 KiB

+ 11
- 9
jm2l/static/js/programme.js View File

@@ -50,7 +50,8 @@ d3.json("le-prog-json",
.attr("id", TypeArea+"-"+Keys[k]) .attr("id", TypeArea+"-"+Keys[k])
.attr("area", TypeArea) .attr("area", TypeArea)
.style("float", "left") .style("float", "left")
.style("margin-left", "5px")
.style("margin-left", "20px")
.style("margin-right", "3px")
.property("checked",true); .property("checked",true);
d3.select("#Schedule_SVG_"+Keys[k]) d3.select("#Schedule_SVG_"+Keys[k])
@@ -64,10 +65,10 @@ d3.json("le-prog-json",
svg = d3.select("#Schedule_SVG_"+Keys[k]) svg = d3.select("#Schedule_SVG_"+Keys[k])
.append("svg") .append("svg")
.attr("id", "TimeTable-"+Keys[k]) .attr("id", "TimeTable-"+Keys[k])
.attr("width", width + margin.right + margin.left)
.attr("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()


+ 474
- 0
jm2l/static/vendor/datepicker/bootstrap-datepicker.js View File

@@ -0,0 +1,474 @@
/* =========================================================
* bootstrap-datepicker.js
* http://www.eyecon.ro/bootstrap-datepicker
* =========================================================
* Copyright 2012 Stefan Petre
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function( $ ) {
// Picker object
var Datepicker = function(element, options){
this.element = $(element);
this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');
this.picker = $(DPGlobal.template)
.appendTo('body')
.on({
click: $.proxy(this.click, this)//,
//mousedown: $.proxy(this.mousedown, this)
});
this.isInput = this.element.is('input');
this.component = this.element.is('.date') ? this.element.find('.add-on') : false;
if (this.isInput) {
this.element.on({
focus: $.proxy(this.show, this),
//blur: $.proxy(this.hide, this),
keyup: $.proxy(this.update, this)
});
} else {
if (this.component){
this.component.on('click', $.proxy(this.show, this));
} else {
this.element.on('click', $.proxy(this.show, this));
}
}
this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0;
if (typeof this.minViewMode === 'string') {
switch (this.minViewMode) {
case 'months':
this.minViewMode = 1;
break;
case 'years':
this.minViewMode = 2;
break;
default:
this.minViewMode = 0;
break;
}
}
this.viewMode = options.viewMode||this.element.data('date-viewmode')||0;
if (typeof this.viewMode === 'string') {
switch (this.viewMode) {
case 'months':
this.viewMode = 1;
break;
case 'years':
this.viewMode = 2;
break;
default:
this.viewMode = 0;
break;
}
}
this.startViewMode = this.viewMode;
this.weekStart = options.weekStart||this.element.data('date-weekstart')||0;
this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;
this.onRender = options.onRender;
this.fillDow();
this.fillMonths();
this.update();
this.showMode();
};
Datepicker.prototype = {
constructor: Datepicker,
show: function(e) {
this.picker.show();
this.height = this.component ? this.component.outerHeight() : this.element.outerHeight();
this.place();
$(window).on('resize', $.proxy(this.place, this));
if (e ) {
e.stopPropagation();
e.preventDefault();
}
if (!this.isInput) {
}
var that = this;
$(document).on('mousedown', function(ev){
if ($(ev.target).closest('.datepicker').length == 0) {
that.hide();
}
});
this.element.trigger({
type: 'show',
date: this.date
});
},
hide: function(){
this.picker.hide();
$(window).off('resize', this.place);
this.viewMode = this.startViewMode;
this.showMode();
if (!this.isInput) {
$(document).off('mousedown', this.hide);
}
//this.set();
this.element.trigger({
type: 'hide',
date: this.date
});
},
set: function() {
var formated = DPGlobal.formatDate(this.date, this.format);
if (!this.isInput) {
if (this.component){
this.element.find('input').prop('value', formated);
}
this.element.data('date', formated);
} else {
this.element.prop('value', formated);
}
},
setValue: function(newDate) {
if (typeof newDate === 'string') {
this.date = DPGlobal.parseDate(newDate, this.format);
} else {
this.date = new Date(newDate);
}
this.set();
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
this.fill();
},
place: function(){
var offset = this.component ? this.component.offset() : this.element.offset();
this.picker.css({
top: offset.top + this.height,
left: offset.left
});
},
update: function(newDate){
this.date = DPGlobal.parseDate(
typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')),
this.format
);
this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);
this.fill();
},
fillDow: function(){
var dowCnt = this.weekStart;
var html = '<tr>';
while (dowCnt < this.weekStart + 7) {
html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>';
}
html += '</tr>';
this.picker.find('.datepicker-days thead').append(html);
},
fillMonths: function(){
var html = '';
var i = 0
while (i < 12) {
html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>';
}
this.picker.find('.datepicker-months td').append(html);
},
fill: function() {
var d = new Date(this.viewDate),
year = d.getFullYear(),
month = d.getMonth(),
currentDate = this.date.valueOf();
this.picker.find('.datepicker-days th:eq(1)')
.text(DPGlobal.dates.months[month]+' '+year);
var prevMonth = new Date(year, month-1, 28,0,0,0,0),
day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());
prevMonth.setDate(day);
prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7);
var nextMonth = new Date(prevMonth);
nextMonth.setDate(nextMonth.getDate() + 42);
nextMonth = nextMonth.valueOf();
var html = [];
var clsName,
prevY,
prevM;
while(prevMonth.valueOf() < nextMonth) {
if (prevMonth.getDay() === this.weekStart) {
html.push('<tr>');
}
clsName = this.onRender(prevMonth);
prevY = prevMonth.getFullYear();
prevM = prevMonth.getMonth();
if ((prevM < month && prevY === year) || prevY < year) {
clsName += ' old';
} else if ((prevM > month && prevY === year) || prevY > year) {
clsName += ' new';
}
if (prevMonth.valueOf() === currentDate) {
clsName += ' active';
}
html.push('<td class="day '+clsName+'">'+prevMonth.getDate() + '</td>');
if (prevMonth.getDay() === this.weekEnd) {
html.push('</tr>');
}
prevMonth.setDate(prevMonth.getDate()+1);
}
this.picker.find('.datepicker-days tbody').empty().append(html.join(''));
var currentYear = this.date.getFullYear();
var months = this.picker.find('.datepicker-months')
.find('th:eq(1)')
.text(year)
.end()
.find('span').removeClass('active');
if (currentYear === year) {
months.eq(this.date.getMonth()).addClass('active');
}
html = '';
year = parseInt(year/10, 10) * 10;
var yearCont = this.picker.find('.datepicker-years')
.find('th:eq(1)')
.text(year + '-' + (year + 9))
.end()
.find('td');
year -= 1;
for (var i = -1; i < 11; i++) {
html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>';
year += 1;
}
yearCont.html(html);
},
click: function(e) {
e.stopPropagation();
e.preventDefault();
var target = $(e.target).closest('span, td, th');
if (target.length === 1) {
switch(target[0].nodeName.toLowerCase()) {
case 'th':
switch(target[0].className) {
case 'switch':
this.showMode(1);
break;
case 'prev':
case 'next':
this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call(
this.viewDate,
this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) +
DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1)
);
this.fill();
this.set();
break;
}
break;
case 'span':
if (target.is('.month')) {
var month = target.parent().find('span').index(target);
this.viewDate.setMonth(month);
} else {
var year = parseInt(target.text(), 10)||0;
this.viewDate.setFullYear(year);
}
if (this.viewMode !== 0) {
this.date = new Date(this.viewDate);
this.element.trigger({
type: 'changeDate',
date: this.date,
viewMode: DPGlobal.modes[this.viewMode].clsName
});
}
this.showMode(-1);
this.fill();
this.set();
break;
case 'td':
if (target.is('.day') && !target.is('.disabled')){
var day = parseInt(target.text(), 10)||1;
var month = this.viewDate.getMonth();
if (target.is('.old')) {
month -= 1;
} else if (target.is('.new')) {
month += 1;
}
var year = this.viewDate.getFullYear();
this.date = new Date(year, month, day,0,0,0,0);
this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0);
this.fill();
this.set();
this.element.trigger({
type: 'changeDate',
date: this.date,
viewMode: DPGlobal.modes[this.viewMode].clsName
});
}
break;
}
}
},
mousedown: function(e){
e.stopPropagation();
e.preventDefault();
},
showMode: function(dir) {
if (dir) {
this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));
}
this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();
}
};
$.fn.datepicker = function ( option, val ) {
return this.each(function () {
var $this = $(this),
data = $this.data('datepicker'),
options = typeof option === 'object' && option;
if (!data) {
$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));
}
if (typeof option === 'string') data[option](val);
});
};

$.fn.datepicker.defaults = {
onRender: function(date) {
return '';
}
};
$.fn.datepicker.Constructor = Datepicker;
var DPGlobal = {
modes: [
{
clsName: 'days',
navFnc: 'Month',
navStep: 1
},
{
clsName: 'months',
navFnc: 'FullYear',
navStep: 1
},
{
clsName: 'years',
navFnc: 'FullYear',
navStep: 10
}],
dates:{
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
},
isLeapYear: function (year) {
return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))
},
getDaysInMonth: function (year, month) {
return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]
},
parseFormat: function(format){
var separator = format.match(/[.\/\-\s].*?/),
parts = format.split(/\W+/);
if (!separator || !parts || parts.length === 0){
throw new Error("Invalid date format.");
}
return {separator: separator, parts: parts};
},
parseDate: function(date, format) {
var parts = date.split(format.separator),
date = new Date(),
val;
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
if (parts.length === format.parts.length) {
var year = date.getFullYear(), day = date.getDate(), month = date.getMonth();
for (var i=0, cnt = format.parts.length; i < cnt; i++) {
val = parseInt(parts[i], 10)||1;
switch(format.parts[i]) {
case 'dd':
case 'd':
day = val;
date.setDate(val);
break;
case 'mm':
case 'm':
month = val - 1;
date.setMonth(val - 1);
break;
case 'yy':
year = 2000 + val;
date.setFullYear(2000 + val);
break;
case 'yyyy':
year = val;
date.setFullYear(val);
break;
}
}
date = new Date(year, month, day, 0 ,0 ,0);
}
return date;
},
formatDate: function(date, format){
var val = {
d: date.getDate(),
m: date.getMonth() + 1,
yy: date.getFullYear().toString().substring(2),
yyyy: date.getFullYear()
};
val.dd = (val.d < 10 ? '0' : '') + val.d;
val.mm = (val.m < 10 ? '0' : '') + val.m;
var date = [];
for (var i=0, cnt = format.parts.length; i < cnt; i++) {
date.push(val[format.parts[i]]);
}
return date.join(format.separator);
},
headTemplate: '<thead>'+
'<tr>'+
'<th class="prev">&lsaquo;</th>'+
'<th colspan="5" class="switch"></th>'+
'<th class="next">&rsaquo;</th>'+
'</tr>'+
'</thead>',
contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>'
};
DPGlobal.template = '<div class="datepicker dropdown-menu">'+
'<div class="datepicker-days">'+
'<table class=" table-condensed">'+
DPGlobal.headTemplate+
'<tbody></tbody>'+
'</table>'+
'</div>'+
'<div class="datepicker-months">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
'</table>'+
'</div>'+
'<div class="datepicker-years">'+
'<table class="table-condensed">'+
DPGlobal.headTemplate+
DPGlobal.contTemplate+
'</table>'+
'</div>'+
'</div>';

}( window.jQuery );

+ 182
- 0
jm2l/static/vendor/datepicker/datepicker.css View File

@@ -0,0 +1,182 @@
/*!
* Datepicker for Bootstrap
*
* Copyright 2012 Stefan Petre
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
*/
.datepicker {
top: 0;
left: 0;
padding: 4px;
margin-top: 1px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
/*.dow {
border-top: 1px solid #ddd !important;
}*/

}
.datepicker:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
top: -7px;
left: 6px;
}
.datepicker:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
position: absolute;
top: -6px;
left: 7px;
}
.datepicker > div {
display: none;
}
.datepicker table {
width: 100%;
margin: 0;
}
.datepicker td,
.datepicker th {
text-align: center;
width: 20px;
height: 20px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datepicker td.day:hover {
background: #eeeeee;
cursor: pointer;
}
.datepicker td.day.disabled {
color: #eeeeee;
}
.datepicker td.old,
.datepicker td.new {
color: #999999;
}
.datepicker td.active,
.datepicker td.active:hover {
color: #ffffff;
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #0044cc;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */

filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker td.active:hover,
.datepicker td.active:hover:hover,
.datepicker td.active:focus,
.datepicker td.active:hover:focus,
.datepicker td.active:active,
.datepicker td.active:hover:active,
.datepicker td.active.active,
.datepicker td.active:hover.active,
.datepicker td.active.disabled,
.datepicker td.active:hover.disabled,
.datepicker td.active[disabled],
.datepicker td.active:hover[disabled] {
color: #ffffff;
background-color: #0044cc;
*background-color: #003bb3;
}
.datepicker td.active:active,
.datepicker td.active:hover:active,
.datepicker td.active.active,
.datepicker td.active:hover.active {
background-color: #003399 \9;
}
.datepicker td span {
display: block;
width: 47px;
height: 54px;
line-height: 54px;
float: left;
margin: 2px;
cursor: pointer;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.datepicker td span:hover {
background: #eeeeee;
}
.datepicker td span.active {
color: #ffffff;
background-color: #006dcc;
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
background-image: linear-gradient(to bottom, #0088cc, #0044cc);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
border-color: #0044cc #0044cc #002a80;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #0044cc;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */

filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker td span.active:hover,
.datepicker td span.active:focus,
.datepicker td span.active:active,
.datepicker td span.active.active,
.datepicker td span.active.disabled,
.datepicker td span.active[disabled] {
color: #ffffff;
background-color: #0044cc;
*background-color: #003bb3;
}
.datepicker td span.active:active,
.datepicker td span.active.active {
background-color: #003399 \9;
}
.datepicker td span.old {
color: #999999;
}
.datepicker th.switch {
width: 145px;
}
.datepicker th.next,
.datepicker th.prev {
font-size: 21px;
}
.datepicker thead tr:first-child th {
cursor: pointer;
}
.datepicker thead tr:first-child th:hover {
background: #eeeeee;
}
.input-append.date .add-on i,
.input-prepend.date .add-on i {
display: block;
cursor: pointer;
width: 16px;
height: 16px;
}

+ 64
- 37
jm2l/templates/NewIndex.mako View File

@@ -2,7 +2,7 @@
<%def name="jsAddOn()"> <%def name="jsAddOn()">
<script src="/vendor/timeline/js/timeline-src.js"></script> <script src="/vendor/timeline/js/timeline-src.js"></script>
<script> <script>
var timeline = new VMM.Timeline("timeline", '850px', '500px');
var timeline = new VMM.Timeline("timeline", '95%', '500px');
var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}}; var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}};
timeline.init(c, "/2015/timeline-json"); timeline.init(c, "/2015/timeline-json");
</script> </script>
@@ -10,42 +10,69 @@
<%def name="cssAddOn()"> <%def name="cssAddOn()">
<!-- The default timeline stylesheet --> <!-- The default timeline stylesheet -->
<link rel="stylesheet" href="/vendor/timeline/css/timeline.css" /> <link rel="stylesheet" href="/vendor/timeline/css/timeline.css" />
<style>
.enum li {
list-style-type: none;
background-image: url(/img/puce.png);
background-repeat: no-repeat;
background-position: 0 6px;
padding-left: 16px;
}
</style>
</%def> </%def>
<div class="pull-right">
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">&nbsp;</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>

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

@@ -47,6 +47,8 @@
</ol> </ol>
% if not link: % if not link:
<strong>Remplissez ce formulaire :</strong> <strong>Remplissez ce formulaire :</strong>
<div class="row-fluid">
<div class="span7 offset3">
<% <%
DicForm ={ DicForm ={
'nom': {'PlaceHolder':u"Mon nom", 'ContainerStyle':'float:left;'}, 'nom': {'PlaceHolder':u"Mon nom", 'ContainerStyle':'float:left;'},
@@ -68,10 +70,11 @@ DicForm ={
</div> </div>
<button class="btn btn-large btn-primary" type="submit">C'est parti !</button> <button class="btn btn-large btn-primary" type="submit">C'est parti !</button>
</form> </form>
</div>
</div>
% else: % else:
<p> <p>
Vous venez de recevoir un mail... Vous venez de recevoir un mail...
Ici, ... le texte à définir ...
</p> </p>
Cliquez sur ce lien pour finir votre inscription : <a href="${request.route_path('bymail', hash=link)}">Mon lien</a> Cliquez sur ce lien pour finir votre inscription : <a href="${request.route_path('bymail', hash=link)}">Mon lien</a>
% endif % endif


+ 47
- 10
jm2l/templates/Profil/Profil.mako View File

@@ -1,11 +1,6 @@
<%namespace name="Modals" file="jm2l:templates/modals.mako"/> <%namespace name="Modals" file="jm2l:templates/modals.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> <%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<%def name="profil_wrapper(uprofil, profil_form)"> <%def name="profil_wrapper(uprofil, profil_form)">
<div id="Photos">
${helpers.show_my_pictures(uprofil)}
</div>
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien</a>
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>


##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');"> ##<form id="ProfilForm" action="javascript:DoPost('/2015/modal/Place/${form.place_id.data}');">
% if uprofil!=request.user and request.user.uid==1: % if uprofil!=request.user and request.user.uid==1:
@@ -14,8 +9,42 @@
<form id="ProfilForm" action="/MesJM2L" method="POST"> <form id="ProfilForm" action="/MesJM2L" method="POST">
% endif % endif


<div class="row-fluid">
<div class="span8">
<a href="/sign/jm2l/${uprofil.my_hash}">Mon lien de connection</a> -
<a href="/user/${request.user.slug}">Mon profil publique</a><br>
<h3>${profil_form.prenom.data} ${profil_form.nom.data}</h3>
<% <%
DicForm = {
DicFormA = {
'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False},
'prenom': {'PlaceHolder':u"Mon Prénom", 'ContainerClass':"span6", 'next':True},
'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False},
'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True},
'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False},
'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True},
'gpg_key': {'PlaceHolder':u"Ma clé gpg", 'ContainerClass':"span6", 'next':False},
'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True},
'bio': {'Ignore':True},
'tiersship': {'Ignore':True},
'id': {'Ignore':True},
'user_id': {'Ignore':True},
}

DicFormB = {
'nom': {'Ignore':True },
'prenom': {'Ignore':True },
'pseudo': {'Ignore':True },
'mail': {'Ignore':True },
'phone': {'Ignore':True },
'website': {'Ignore':True },
'gpg_key': {'Ignore':True},
'soc_link': {'Ignore':True},
'bio': {'PlaceHolder':u"Ma Bilibiographie", "ckeditor":1, 'ContainerClass':"span11", 'next':False },
'tiersship': {'Ignore':True}
}


DicForm2 = {
'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, 'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"},
'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"}, 'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"},
'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, 'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"},
@@ -27,10 +56,17 @@ DicForm = {
'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 }, 'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 },
'tiersship': {'Ignore':True} 'tiersship': {'Ignore':True}
} }
%>
${helpers.DisplayForm(profil_form, DicForm)}


<fieldset>
%>
${helpers.DisplayRespForm(profil_form, DicFormA)}
</div>
<div class="span4">
${helpers.show_my_pictures(uprofil)}
</div>
</div>
${helpers.DisplayRespForm(profil_form, DicFormB)}
<fieldset>
<legend>Activité</legend> <legend>Activité</legend>
Si vous ne trouvez pas l'entité que vous souhaitez promouvoir (Association, GULL, Entreprise, Logiciel, ...). Si vous ne trouvez pas l'entité que vous souhaitez promouvoir (Association, GULL, Entreprise, Logiciel, ...).
Vous pouvez <a href="/entity"> en ajouter une. </a> Vous pouvez <a href="/entity"> en ajouter une. </a>
@@ -110,8 +146,9 @@ DicForm = {
</div> </div>
</fieldset> </fieldset>


<div class="span2 offset5">
<input class="btn btn-primary" type="submit" value="Enregistrer !" /> <input class="btn btn-primary" type="submit" value="Enregistrer !" />
</div>
</form> </form>


</%def> </%def>

+ 25
- 32
jm2l/templates/Profil/Sejour.mako View File

@@ -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&eacute;e</legend> <legend>Arriv&eacute;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>


&agrave; &agrave;
<select style="width:6em;" id="Arrival:Hour" class="formforform-field" name="field_8" title="Le">
<select style="width:6em;" id="Arrival:Hour" class="formforform-field" name="Arrival:Hour" title="Le">
% for hour in range(24): % for hour in range(24):
% for minutes in range(0,60,10):
<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>

+ 35
- 14
jm2l/templates/Public/Plan.mako View File

@@ -1,4 +1,16 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%def name="jsAddOn_head()">
<script src="/vendor/leaflet/js/leaflet.js"></script>
</%def>
<%def name="cssAddOn()">
<link rel="stylesheet" href="/vendor/leaflet/css/leaflet.css" />
<style>
#come_map {
height: 300px;
}
</style>
</%def>

<h2 class="page-title">Nous rejoindre...</h2> <h2 class="page-title">Nous rejoindre...</h2>


<div class="span10 offset1"> <div class="span10 offset1">
@@ -12,9 +24,11 @@
<div class="span4 offset1"> <div class="span4 offset1">
<h4>Le staff</h4> <h4>Le staff</h4>
<dl> <dl>
<dt>Mail</dt>
<dt>sur IRC</dt>
<dd>» #jm2l@irc.freenode.net</dd>
<dt>par Mail</dt>
<dd>» contact at jm2l.linux-azur.org</dd> <dd>» contact at jm2l.linux-azur.org</dd>
<dt>Téléphone</dt>
<dt>par Téléphone</dt>
<dd>» +33 (0)&nbsp;6 52 42 31 37</dd> <dd>» +33 (0)&nbsp;6 52 42 31 37</dd>
</dl> </dl>
</div> </div>
@@ -25,12 +39,28 @@
930, route des Colles (site des Templiers)&nbsp;<br> 930, route des Colles (site des Templiers)&nbsp;<br>
06903 Sophia Antipolis (Biot) 06903 Sophia Antipolis (Biot)
</address> </address>
<p>GPS Lat.: 43°36'57.72"N - Lon.: 7°4'17.03"E</p>
<p>GPS Lat.: 43°61'56.9"N - Lon.: 7°0'71.95"E</p>
</div> </div>
</div> </div>

<div class="row-fluid"> <div class="row-fluid">
<div class="span6">
<div class="span8 offset2">
<div id="come_map"></div>
<script type="text/javascript">
var map = L.map('come_map');
// create the tile layer with correct attribution
var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var osmAttrib='Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors';
var osm = new L.TileLayer(osmUrl, {minZoom: 7, maxZoom: 18, attribution: osmAttrib});
// start the map on specified GPS Coords
map.setView(new L.LatLng(43.61562,7.0724),15);
marker = L.marker([43.615693, 7.0726221]).addTo(map);
map.addLayer(osm);
</script>
</div>
</div>
<br>
<div class="row-fluid">
<div class="span10 offset1">
<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"><a href="#Trsp" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en bus" src="/img/tr_bus_.png"></a></li> <li class="active"><a href="#Trsp" data-toggle="tab"><img style="margin-bottom: -15px;" alt="en bus" src="/img/tr_bus_.png"></a></li>
@@ -137,15 +167,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="span6">
<p>
<img alt="" src="http://jm2l.linux-azur.org/sites/jm2l.linux-azur.org/files/jm2l_plan_acces_polytech.png" style="height:507px; width:665px">
</p>
<p>
<a href="http://www.openstreetmap.org/?lat=43.61211&amp;lon=7.07081&amp;zoom=14&amp;layers=M&amp;mlat=43.61637&amp;mlon=7.08520">Voir une carte plus grande</a>
</p>
</div> </div>


</div>
<br>



+ 8
- 1
jm2l/templates/Public/Presse.mako View File

@@ -1,7 +1,9 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% <%
DisplayYear = request.session.get('year',2015) DisplayYear = request.session.get('year',2015)
%> %>
<div class="span9">
<h1 class="page-title">Dossier de presse ${DisplayYear}</h1> <h1 class="page-title">Dossier de presse ${DisplayYear}</h1>
% if content and content.doss_presse: % if content and content.doss_presse:
<div class="span10 offset1"> <div class="span10 offset1">
@@ -76,4 +78,9 @@ DisplayYear = request.session.get('year',2015)
<p class="spip">Et pour ce ux qui veullent tout mettre en local sur leur espace web, l’image banner2007.png est ici&nbsp;: <a href="/web/20071231104349/http://jm2l.linux-azur.org/IMG/png/banner2007.png" class="spip_url spip_out">http://jm2l.linux-azur.org/IMG/png/...</a> <p class="spip">Et pour ce ux qui veullent tout mettre en local sur leur espace web, l’image banner2007.png est ici&nbsp;: <a href="/web/20071231104349/http://jm2l.linux-azur.org/IMG/png/banner2007.png" class="spip_url spip_out">http://jm2l.linux-azur.org/IMG/png/...</a>
Préférez quand même la première méthode qui présente 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>

+ 37
- 21
jm2l/templates/Public/Programme.mako View File

@@ -1,4 +1,5 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% <%
TabDisplay = [ TabDisplay = [
(u'Tables rondes', 'Table ronde'), (u'Tables rondes', 'Table ronde'),
@@ -7,6 +8,11 @@ TabDisplay = [
(u'Stands', 'Stand'), (u'Stands', 'Stand'),
] ]
%> %>
<%def name="jsAddOn()">
<script type="text/javascript" src="/vendor/d3js/d3.v3.min.js"></script>
<script type="text/javascript" src="/js/programme.js"></script>
</%def>
<%def name="cssAddOn()">
<style> <style>
.myblock { .myblock {
background-color:#EEE; background-color:#EEE;
@@ -31,11 +37,9 @@ TabDisplay = [
} }
.Atelier { .Atelier {
fill: #faebeb; fill: #faebeb;
stroke: #dc7070;
} }
.Table-ronde { .Table-ronde {
fill: #fff4e5; fill: #fff4e5;
stroke: #ff9912;
} }
.Repas { .Repas {
fill: #2EE; fill: #2EE;
@@ -54,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>

+ 5
- 0
jm2l/templates/Staff/list.mako View File

@@ -8,6 +8,9 @@ from slugify import slugify
</a> </a>
<h3>Liste des tâches JM2L Staff</h3> <h3>Liste des tâches JM2L Staff</h3>


<div class="row-fluid">
<div class="span10 offset1">

<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> <ul class="nav nav-tabs" style="margin-bottom: 5px;">
% for Num, Entity in enumerate(sorted(tasks.keys(), key=lambda x:x.name)): % for Num, Entity in enumerate(sorted(tasks.keys(), key=lambda x:x.name)):
@@ -84,6 +87,8 @@ from slugify import slugify
</div> </div>
</div> </div>


</div>
</div>
<%def name="jsAddOn()"> <%def name="jsAddOn()">
<script> <script>
$('a[data-toggle="tab"]') $('a[data-toggle="tab"]')


+ 7
- 1
jm2l/templates/Staff/new.mako View File

@@ -1,9 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>


<div class="row-fluid">
<div class="span10 offset1">

<h1>Add a new task</h1> <h1>Add a new task</h1>


<form action="/Staff/new" method="post"> <form action="/Staff/new" method="post">
<input type="text" maxlength="100" name="name"> <input type="text" maxlength="100" name="name">
<input type="submit" class="btn btn-primary" name="add" value="ADD" class="button"> <input type="submit" class="btn btn-primary" name="add" value="ADD" class="button">
</form>
</form>

</div>
</div>

+ 21
- 4
jm2l/templates/Staff/pole.mako View File

@@ -15,6 +15,14 @@
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript>
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript>
</%def> </%def>

<div class="row-fluid">
<div class="span10 offset1">

<a class="btn" href="${request.route_path('list_task', _anchor=form.name.data)}">
<i class="icon-arrow-left"></i> Retour à la liste
</a>

% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<h3>Editer un Pôle</h3> <h3>Editer un Pôle</h3>
% else: % else:
@@ -34,11 +42,20 @@ DicForm = {
<form action="/Staff/poles" method="post"> <form action="/Staff/poles" method="post">
%endif %endif
${helpers.DisplayForm(form, DicForm)} ${helpers.DisplayForm(form, DicForm)}
<input type="submit" class="btn btn-primary" />

<br>
<center>
<button type="submit" class="btn btn-large btn-primary" />
<i class="icon-ok icon-white"></i> Enregistrer
</button>
</center>

</form> </form>
% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<center>
${helpers.uploader("poles", form.uid.data, u"Attachement" )} ${helpers.uploader("poles", form.uid.data, u"Attachement" )}
</center>
%endif %endif
<script>
## var editor = CKEDITOR.replace( 'description', { autoGrow_onStartup: true, language: 'fr' } );
</script>
</div>
</div>

+ 21
- 3
jm2l/templates/Staff/tasks.mako View File

@@ -25,8 +25,14 @@
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript>
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript>
</%def> </%def>
<p>Green checkmarks indicate that class is visible in your current viewport.</p>
<a style="float:right;" href="${request.route_path('list_task', _anchor=area)}">Retour à la liste</a>

<div class="row-fluid">
<div class="span10 offset1">

<a class="btn" href="${request.route_path('list_task', _anchor=area)}">
<i class="icon-arrow-left"></i> Retour à la liste
</a>

% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<h3>Editer une tâche</h3> <h3>Editer une tâche</h3>
% else: % else:
@@ -49,8 +55,20 @@ DicForm = {
<form action="/Staff/tasks" method="post"> <form action="/Staff/tasks" method="post">
%endif %endif
${helpers.DisplayForm(form, DicForm)} ${helpers.DisplayForm(form, DicForm)}
<input type="submit" class="btn btn-primary" value="Valider" />

<br>
<center>
<button type="submit" class="btn btn-large btn-primary" />
<i class="icon-ok icon-white"></i> Enregistrer
</button>
</center>

</form> </form>
% if 'uid' in form._fields.keys(): % if 'uid' in form._fields.keys():
<center>
${helpers.uploader("tasks", form.uid.data, u"une pièce jointe" )} ${helpers.uploader("tasks", form.uid.data, u"une pièce jointe" )}
</center>
%endif %endif

</div>
</div>

+ 43
- 100
jm2l/templates/edit_event.mako View File

@@ -16,33 +16,10 @@
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript>
</%def> </%def>
<% from datetime import datetime %> <% from datetime import datetime %>
<style>
.borderbox {
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">&times;</button>
<h4>Erreur!</h4>
${ error }
</div>
% endfor
${Field(placeholder=PlaceHolder, style="width:16em;")}
</div>
% endfor
## Then the submit for this form
${formAdd.add}
</form>

</fieldset> </fieldset>
<div class="clearfix">&nbsp;</div> <div class="clearfix">&nbsp;</div>
<p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p>
@@ -186,27 +127,31 @@ TabFields = [
<br/> <br/>
<hr/> <hr/>


% if 0:
% 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

+ 13
- 14
jm2l/templates/edit_tiers.mako View File

@@ -8,6 +8,11 @@
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript>
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> <noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript>
</%def> </%def>
<div class="row-fluid">
<div class="span10 offset1">
<a class="pull-right" href="/categorie/entity">Editer les catégories</a> <a class="pull-right" href="/categorie/entity">Editer les catégories</a>
<br> <br>
<form action="" method="POST"> <form action="" method="POST">
@@ -30,18 +35,18 @@ DicForm = {
<fieldset> <fieldset>
<legend>Acteurs</legend> <legend>Acteurs</legend>
<div class="repeat"> <div class="repeat">
<table class="wrapper" width="100%">
<table class="wrapper table table-striped table-bordered" width="100%">
<thead> <thead>
<tr class="row"> <tr class="row">
<th style="width:5em;text-align:center;">Année</th> <th style="width:5em;text-align:center;">Année</th>
<th>Personne</th>
<th style="width:22em;">Personne</th>
<th style="width:22em;">Rôle</th> <th style="width:22em;">Rôle</th>
<th style="width:5em;">Action</th> <th style="width:5em;">Action</th>
</tr> </tr>
</thead> </thead>
<tbody class="container"> <tbody class="container">
<tr class="row template" style="line-height:2.2em;"> <tr class="row template" style="line-height:2.2em;">
<td><span class="move btn btn-mini btn-info">Move</span></td>
##<td><span class="move btn btn-mini btn-info">Move</span></td>
<td> <td>
<select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid" <select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid"
id="membership-{{row-count-placeholder}}-year_uid"> id="membership-{{row-count-placeholder}}-year_uid">
@@ -65,6 +70,7 @@ DicForm = {
<option value="${opt.uid}">${opt.exch_subtype}</option> <option value="${opt.uid}">${opt.exch_subtype}</option>
% endfor % endfor
</select> </select>
<input type="text" class="form-control" name="membership-{{row-count-placeholder}}-role" />
</td> </td>
<td> <td>
<span class="remove btn btn-mini btn-danger"> <span class="remove btn btn-mini btn-danger">
@@ -74,7 +80,7 @@ DicForm = {
</tr> </tr>
% for num, dicdata in enumerate(form._fields.get("membership").data): % for num, dicdata in enumerate(form._fields.get("membership").data):
<tr class="row" style="padding:5px;line-height:2.2em;"> <tr class="row" style="padding:5px;line-height:2.2em;">
<td><span class="move btn btn-mini btn-info">Move</span></td>
##<td><span class="move btn btn-mini btn-info">Move</span></td>
<td style="text-align:center;"> <td style="text-align:center;">
<input type="hidden" class="form-control" name="membership-${num}-year_uid" <input type="hidden" class="form-control" name="membership-${num}-year_uid"
value="${dicdata.get('year_uid')}" style="width:4em;" /> value="${dicdata.get('year_uid')}" style="width:4em;" />
@@ -91,8 +97,6 @@ DicForm = {
% endif % endif
</td> </td>
<td style="text-align:center;"> <td style="text-align:center;">
<input type="hidden" class="form-control" name="membership-${num}-role"
value="${dicdata.get('role')}" />
<i>${dicdata.get('role', 'Aucun')}</i> <i>${dicdata.get('role', 'Aucun')}</i>
</td> </td>
<td> <td>
@@ -140,13 +144,9 @@ DicForm = {
<br>NB: Vous devez proposer votre entité avant de pouvoir <br>NB: Vous devez proposer votre entité avant de pouvoir
téléverser des fichiers la concernant. téléverser des fichiers la concernant.
% endif % endif
<br>
<br>
<br>
##% if 'uid' in form._fields:
## ${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({});
} }
}); });
}); });


+ 76
- 9
jm2l/templates/helpers.mako View File

@@ -1,6 +1,72 @@
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
## Afficher un form ## Afficher un form
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="DisplayRespForm(form, DicFormat)">
<%
TabJs = {'select':[], 'desc':[]}
%>
<div class="row-fluid">
% for FieldName, Field in form._fields.items():
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("Ignore"):
<% continue %>
% endif
% if Field.type in ['HiddenField', 'CSRFTokenField']:
${Field}
<% continue %>
% elif Field.type=="SelectField":
<% TabJs['select'].append(Field.label.field_id) %>
% endif
<div class="${DicFormat[Field.name].get("ContainerClass")}">
<label for="${Field.label.field_id}">${Field.label.text}
% if Field.description:
<% TabJs['desc'].append(Field.label.field_id) %>
<a id="${Field.label.field_id}-help" data-toggle="popover"
data-original-title="${Field.label.text}"
data-content="${Field.description}">
<i class="icon-me" style="background-image: url('/img/Help.png');background-position:1px 2px;"></i>
</a>
% endif
</label>
% if DicFormat.has_key(Field.name):
<%
PlaceHolder = DicFormat[Field.name].get("PlaceHolder")
Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ]
%>
% if Field.type == "date":
${Field(placeholder=PlaceHolder or False, class_="datepicker", style="width:100%" )}
% else:
${Field(placeholder=PlaceHolder or False, class_=Class, style="width:100%")}
% endif
% else:
${Field(style="width:100%")}
% endif
% for error in Field.errors:
<div class="alert alert-error">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<h4>Erreur!</h4>
${ error }
</div>
% endfor
</div>

% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("next")==True:
</div>
<div class="row-fluid">
% endif

% endfor
</div>
<%
for jsitem in TabJs['select']:
context._kwargs['postpone_js'].append( "$('#%s').select2({});" % jsitem )
for jsitem in TabJs['desc']:
context._kwargs['postpone_js'].append( "$('#%s-help').popover();" % jsitem )
%>

</%def>
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
## Afficher un form
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="DisplayForm(form, DicFormat)"> <%def name="DisplayForm(form, DicFormat)">
<% <%
TabJs = {'select':[], 'desc':[]} TabJs = {'select':[], 'desc':[]}
@@ -361,14 +427,12 @@ TabJs = {'select':[], 'desc':[]}
## Wrapper pour les photos ## Wrapper pour les photos
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="show_my_pictures(uprofil)"> \ <%def name="show_my_pictures(uprofil)"> \
<div class="profile-icon" style="float:right;height:250px;width:250px;">
<div class="profile-icon">
<% photos = uprofil.PhotosLinks %> <% photos = uprofil.PhotosLinks %>
<div style="text-align: center;line-height:20px;"><b>${request.user.slug}</b></div>
<div style="text-align: center;line-height:20px;"> <div style="text-align: center;line-height:20px;">
<a data-target="#AjaxModal" Myhref="/2015/modal/Password/1" role="button" handle="modal">Changer mon mot de passe</a> <a data-target="#AjaxModal" Myhref="/2015/modal/Password/1" role="button" handle="modal">Changer mon mot de passe</a>
</div> </div>
<div style="text-align: center;line-height:20px;">
<a data-target="#AjaxModal" Myhref="/2015/modal/UserPicture/${uprofil.uid}" handle="modal">Changer ma photo</a>
</div>
<div id="MyPictureCarousel" class="carousel slide"> <div id="MyPictureCarousel" class="carousel slide">
% if len(photos)>1: % if len(photos)>1:
<!-- Carousel nav --> <!-- Carousel nav -->
@@ -376,24 +440,27 @@ TabJs = {'select':[], 'desc':[]}
<a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a> <a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a>
% endif % endif
<!-- Carousel items --> <!-- Carousel items -->
<div class="carousel-inner" style="height: 220px;">
<div class="carousel-inner">
% if len(photos): % if len(photos):
% for num, link in enumerate(photos): % for num, link in enumerate(photos):
<div class="${['','active '][num==0]}item" id="UserPic${num}"> <div class="${['','active '][num==0]}item" id="UserPic${num}">
<div style="margin:auto;">
<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> \
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=


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

@@ -57,6 +57,7 @@
</div> </div>


<div class="row-fluid"> <div class="row-fluid">
<div class="span10 offset1">
<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> <ul class="nav nav-tabs" style="margin-bottom: 5px;">
<li class="active"><a href="#Profil" id="Map_Profil" data-toggle="tab">Mon Profil</a></li> <li class="active"><a href="#Profil" id="Map_Profil" data-toggle="tab">Mon Profil</a></li>
@@ -149,5 +150,6 @@
</div> </div>
</div> </div>
</div>
</div> </div>
##${h.uploader_js()} ##${h.uploader_js()}

+ 46
- 20
jm2l/templates/layout.mako View File

@@ -21,12 +21,15 @@
<link rel="stylesheet" href="/static/ie6.css" type="text/css" media="screen" charset="utf-8" /> <link rel="stylesheet" href="/static/ie6.css" type="text/css" media="screen" charset="utf-8" />
<![endif]--> <![endif]-->
<script src="/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script> <script src="/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script>
${self.cssAddOn()}
${self.jsAddOn_head()}
</head> </head>
<body> <body>
<% <%
context._kwargs['postpone_js']=[] context._kwargs['postpone_js']=[]
DisplayYear = request.session.get('year', 2015) DisplayYear = request.session.get('year', 2015)
%> %>
<%def name="jsAddOn_head()"></%def>
<%def name="jsAddOn()"></%def> <%def name="jsAddOn()"></%def>
<%def name="cssAddOn()"></%def> <%def name="cssAddOn()"></%def>
${helpers.uploader_js()} ${helpers.uploader_js()}
@@ -36,8 +39,10 @@ ${helpers.uploader_js()}
% if DisplayYear!=2015: % if DisplayYear!=2015:
## style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> ## style="background: url( ${"/img/%s/headerbg.png" % DisplayYear} ) repeat-x scroll 0 top #ffffff;">
<div class="align-center"> <div class="align-center">
<a href="/">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"> <div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent">
</div> </div>
</a>
</div> </div>
% else: % else:
<!-- Carousel <!-- Carousel
@@ -51,14 +56,28 @@ ${helpers.uploader_js()}
</ol> </ol>
<div class="carousel-inner" role="listbox"> <div class="carousel-inner" role="listbox">
<div class="item active"> <div class="item active">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"></div>
<a href="/">
<div style="height:215px;background: url(/img/2015/logo.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
<div class="item"> <div class="item">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2013} ) no-repeat scroll center center transparent"></div>
<a href="/">
<div style="height:215px;background: url(/img/2015/logo_1.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
<div class="item"> <div class="item">
<div style="height:215px;background: url( ${"/img/%s/logo.png" % 2012} ) no-repeat scroll center center transparent"></div>
<a href="/">
<div style="height:215px;background: url(/img/2015/logo_2.png) no-repeat scroll center center transparent"></div>
</a>
<div class="carousel-vote">
<a href="#" class="btn btn-primary">Je vote pour ce logo !</a>
</div>
</div> </div>
</div> </div>
<a class="left Tcarousel-control" href="#TitleCarousel" role="button" data-slide="prev"> <a class="left Tcarousel-control" href="#TitleCarousel" role="button" data-slide="prev">
@@ -107,16 +126,17 @@ ${helpers.uploader_js()}
<li><a href="/participer-l-evenement#inscription">Je m'inscris</a></li> <li><a href="/participer-l-evenement#inscription">Je m'inscris</a></li>
<li><a href="/sign/login">Je m'identifie</a></li> <li><a href="/sign/login">Je m'identifie</a></li>
% endif % endif
<li>Mode
<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">&times;</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>




+ 9
- 3
jm2l/templates/list_tiers.mako View File

@@ -1,5 +1,8 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>


<div class="row-fluid">
<div class="span10 offset1">

<a class="pull-right" href="/categorie/entity">Editer les catégories</a> <a class="pull-right" href="/categorie/entity">Editer les catégories</a>
<br> <br>
<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
@@ -31,16 +34,16 @@
<img src="${img_path}" alt="logo" /> <img src="${img_path}" alt="logo" />
% endfor % endfor
</td> </td>
<td style="text-align:center;">
${entity.get_entity_type.entity_subtype}
</td>
<td style="position: relative;"> <td style="position: relative;">
${Entity_Type}, ${entity.get_entity_type.entity_subtype}<br>
<strong> <strong>
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}">${entity.name}</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}">${entity.name}</a>
</strong> </strong>
% if request.user.Staff:
<span style="float:right;"> <span style="float:right;">
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">edit</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">edit</a>
</span> </span>
% endif
</td> </td>
</tr> </tr>
% endfor % endfor
@@ -49,3 +52,6 @@
</div> </div>
% endfor % endfor
</div> </div>

</div>
</div>

+ 37
- 25
jm2l/templates/login.mako View File

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

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

@@ -166,6 +166,7 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form id="ModalForm" action="javascript:DoPost('/2015/modal/Password/${uid}');" style='margin:0;'> <form id="ModalForm" action="javascript:DoPost('/2015/modal/Password/${uid}');" style='margin:0;'>
<div class="description">Votre identifiant est <b>${request.user.slug}</b>
<div class="description">Pour modifier le mot de passe actuel, <div class="description">Pour modifier le mot de passe actuel,
entrez un nouveau mot de passe dans chacune des deux zones de texte. entrez un nouveau mot de passe dans chacune des deux zones de texte.
</div> </div>


+ 9
- 28
jm2l/templates/show_user.mako View File

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

+ 26
- 16
jm2l/templates/view_event.mako View File

@@ -1,4 +1,9 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>

<div class="row-fluid">
<div class="span10 offset1">

<strong>${event.event_type}</strong>: <strong>${event.event_type}</strong>:
<div class="borderboxtime"> <div class="borderboxtime">
${event.start_time.strftime('%d %b %Y').decode('utf-8')} - ${event.start_time.strftime('%d %b %Y').decode('utf-8')} -
@@ -10,7 +15,11 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
%if event.event_uid: %if event.event_uid:
<a href="http://jm2l.linux-azur.org/node/${event.event_uid}">Link</a> - <a href="http://jm2l.linux-azur.org/node/${event.event_uid}">Link</a> -
%endif %endif
% if event.for_year==2015 and (request.user.Staff or request.user in event.intervenants):
<a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a> <a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a>
% elif request.user.Staff:
<a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a>
% endif
<h3 style="line-height:30px;">${event.name}</h3> <h3 style="line-height:30px;">${event.name}</h3>


% if event.description : % if event.description :
@@ -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">&nbsp;</div> <div class="clearfix">&nbsp;</div>
<p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${event.created.strftime('%d %b %Y').decode('utf-8')}</p>
<br/> <br/>
<hr/> <hr/>

</div>
</div>

+ 27
- 15
jm2l/templates/view_tiers.mako View File

@@ -1,7 +1,11 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>


<% The_entity_type = entity.get_entity_type %> <% The_entity_type = entity.get_entity_type %>


<div class="row-fluid">
<div class="span10 offset1">

<strong>${The_entity_type.entity_type}</strong> <strong>${The_entity_type.entity_type}</strong>
% if The_entity_type.entity_subtype!=The_entity_type.entity_type: % if The_entity_type.entity_subtype!=The_entity_type.entity_type:
${The_entity_type.entity_subtype} ${The_entity_type.entity_subtype}
@@ -12,7 +16,9 @@ ${The_entity_type.entity_subtype}
%if entity.tiers_id: %if entity.tiers_id:
<a href="http://jm2l.linux-azur.org/node/${entity.tiers_id}">Link</a> - <a href="http://jm2l.linux-azur.org/node/${entity.tiers_id}">Link</a> -
%endif %endif
% if (request.user.Staff or request.user in entity.members):
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">Editer</a> <a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">Editer</a>
% endif
<div clear='both'></div> <div clear='both'></div>
<div> <div>
<a style="float:right;" href="/entities">Liste des entités</a> <a style="float:right;" href="/entities">Liste des entités</a>
@@ -57,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>

+ 6
- 0
jm2l/templates/view_user.mako View File

@@ -1,6 +1,10 @@
<%inherit file="jm2l:templates/layout.mako"/> <%inherit file="jm2l:templates/layout.mako"/>
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> <%namespace name="helpers" file="jm2l:templates/helpers.mako"/>



<div class="row-fluid">
<div class="span10 offset1">

% if request.user and (DispUser.uid==request.user.uid or request.user.uid==1): % if request.user and (DispUser.uid==request.user.uid or request.user.uid==1):
<a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a> <a style="float:right;" href="/MesJM2L?user=${DispUser.uid}">Editer</a>
% endif % endif
@@ -43,3 +47,5 @@
% endif % endif
<p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${DispUser.created.strftime('%d %b %Y').decode('utf-8')}</p>


</div>
</div>

+ 3
- 0
jm2l/upload.py View File

@@ -96,6 +96,9 @@ class MediaPath():
elif media_table=='tasks': elif media_table=='tasks':
# Use Current Year # Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ] p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
elif media_table=='poles':
# Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
elif media_table in ['RIB', 'Justif']: elif media_table in ['RIB', 'Justif']:
slug = User.by_id(linked_id).slug slug = User.by_id(linked_id).slug
p = IMAGEPATH + ['users'] + [ slug ] + [ self.media_table ] p = IMAGEPATH + ['users'] + [ slug ] + [ self.media_table ]


+ 44
- 37
jm2l/views.py View File

@@ -195,7 +195,7 @@ def JSON_TimeLine_Request(request):
"text":"<i><span class='c1'>9ème Édition</span></i>", "text":"<i><span class='c1'>9ème Édition</span></i>",
"asset": "asset":
{ {
"media":"",
"media":"https://www.youtube.com/watch?v=DnfjrxVoLao",
"credit":"JM2L", "credit":"JM2L",
"caption":"" "caption":""
} }
@@ -208,8 +208,7 @@ def JSON_TimeLine_Request(request):
## =-=- Here, We handle HTTP requests - Public Part -=-= ## =-=- Here, We handle HTTP requests - Public Part -=-=
@view_config(route_name='home', renderer="jm2l:templates/NewIndex.mako") @view_config(route_name='home', renderer="jm2l:templates/NewIndex.mako")
def index_page(request): def index_page(request):
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'',
"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))


Loading…
Cancel
Save