Migration to python 3

This commit is contained in:
2020-07-26 17:38:55 +02:00
parent b6af9a0e08
commit ad9883ae09
37 changed files with 1690 additions and 1567 deletions
+2 -2
View File
@@ -19,7 +19,7 @@ from pyramid.request import Request
from mako.template import Template from mako.template import Template
from .models import User from .models import User
from jm2l.const import CurrentYear from jm2l.const import CurrentYear
from models import JM2L_Year from .models import JM2L_Year
import logging import logging
@@ -80,7 +80,7 @@ def main(global_config, **settings):
authorization_policy=authorization_policy authorization_policy=authorization_policy
) )
config.add_subscriber(add_renderer_globals, BeforeRender) config.add_subscriber(add_renderer_globals, BeforeRender)
config.registry['mailer'] = mailer_factory_from_settings(settings) # config.registry['mailer'] = mailer_factory_from_settings(settings)
config.registry['event_date'] = JM2L_Year.get_latest_jm2l_startdate() config.registry['event_date'] = JM2L_Year.get_latest_jm2l_startdate()
sched = BackgroundScheduler() sched = BackgroundScheduler()
sched.add_job(mailer_tasks, 'cron', day_of_week='fri', hour=18, args=[ config ]) sched.add_job(mailer_tasks, 'cron', day_of_week='fri', hour=18, args=[ config ])
+1 -1
View File
@@ -8,7 +8,7 @@ from pyramid_mailer import get_mailer
from pyramid_mailer.message import Attachment, Message from pyramid_mailer.message import Attachment, Message
from .forms import UserPasswordForm from .forms import UserPasswordForm
from passlib.hash import argon2 from passlib.hash import argon2
from security import check_logged from .security import check_logged
import datetime import datetime
import re import re
+26 -12
View File
@@ -1,7 +1,11 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from pyramid.httpexceptions import HTTPNotFound, HTTPForbidden from pyramid.httpexceptions import HTTPNotFound, HTTPForbidden
from pyramid.response import Response from pyramid.response import Response
import cStringIO as StringIO
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from pyramid.view import view_config from pyramid.view import view_config
from .models import DBSession, User from .models import DBSession, User
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
@@ -12,12 +16,14 @@ import qrcode
import subprocess import subprocess
from .upload import MediaPath from .upload import MediaPath
from jm2l.const import CurrentYear from jm2l.const import CurrentYear
# Create PDF container # Create PDF container
EXPIRATION_TIME = 300 # seconds EXPIRATION_TIME = 300 # seconds
WIDTH = 85 * mm WIDTH = 85 * mm
HEIGHT = 60 * mm HEIGHT = 60 * mm
ICONSIZE = 10 * mm ICONSIZE = 10 * mm
def JM2L_Logo(canvas, Offset=(0, 0)): def JM2L_Logo(canvas, Offset=(0, 0)):
OffX, OffY = Offset OffX, OffY = Offset
logoobject = canvas.beginText() logoobject = canvas.beginText()
@@ -36,6 +42,7 @@ def JM2L_Logo(canvas, Offset=(0,0)):
yearobject.textLines(" ".join(str(CurrentYear))) yearobject.textLines(" ".join(str(CurrentYear)))
canvas.drawText(yearobject) canvas.drawText(yearobject)
def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0, 0)): def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0, 0)):
Border = 0 Border = 0
OffX, OffY = Offset OffX, OffY = Offset
@@ -45,7 +52,11 @@ def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0,0)):
MaxX, MaxY = 34 * mm, 18 * mm MaxX, MaxY = 34 * mm, 18 * mm
num = 0 num = 0
canvas.setStrokeColorRGB(0.5, 0.5, 0.5) canvas.setStrokeColorRGB(0.5, 0.5, 0.5)
Logos = filter(lambda x:x.ThumbLinks, DispUser.tiers)[:3] Logos = list()
for thumb in DispUser.tiers:
if thumb.ThumbLinks:
Logos.append(thumb.ThumbLinks[:3])
# Logos = list(filter(lambda x: x.ThumbLinks, DispUser.tiers)[:3])
# Should We compute a better positionning for logos ? # Should We compute a better positionning for logos ?
DicPos = {} DicPos = {}
DicPos[1] = {0: (1. / 2, 1. / 2)} DicPos[1] = {0: (1. / 2, 1. / 2)}
@@ -76,7 +87,7 @@ def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0,0)):
else: else:
size = ICONSIZE * 1.5 size = ICONSIZE * 1.5
canvas.drawImage(ImagePath, canvas.drawImage(ImagePath,
PosX, PosY, size, size,\ PosX, PosY, size, size,
preserveAspectRatio=True, preserveAspectRatio=True,
anchor='c', anchor='c',
mask='auto' mask='auto'
@@ -85,6 +96,7 @@ def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0,0)):
# canvas.roundRect(PosX, PosY, ICONSIZE, ICONSIZE, radius=2, stroke=True) # canvas.roundRect(PosX, PosY, ICONSIZE, ICONSIZE, radius=2, stroke=True)
num += 1 num += 1
def QRCode(DispUser): def QRCode(DispUser):
qr = qrcode.QRCode( qr = qrcode.QRCode(
version=1, version=1,
@@ -98,6 +110,7 @@ def QRCode(DispUser):
return qr.make_image() return qr.make_image()
def one_badge(c, DispUser, Offset=(0, 0)): def one_badge(c, DispUser, Offset=(0, 0)):
# Logo on Top # Logo on Top
JM2L_Logo(c, Offset) JM2L_Logo(c, Offset)
@@ -165,7 +178,7 @@ def one_badge(c, DispUser, Offset=(0,0)):
Tiers_Logo(c, DispUser, None, Offset) Tiers_Logo(c, DispUser, None, Offset)
@view_config(route_name='badge_user', http_cache = (EXPIRATION_TIME, {'public':True})) @view_config(route_name='badge_user') # , http_cache=(EXPIRATION_TIME, {'public': True}))
def badge_user(request): def badge_user(request):
isoutpng = request.params.get('png') isoutpng = request.params.get('png')
user_slug = request.matchdict.get('user_slug', None) user_slug = request.matchdict.get('user_slug', None)
@@ -185,8 +198,8 @@ def badge_user(request):
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf" ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo)) pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
pdf = StringIO.StringIO() pdf = StringIO()
out_img = StringIO.StringIO() out_img = StringIO()
c = canvas.Canvas(pdf, pagesize=(WIDTH, HEIGHT)) c = canvas.Canvas(pdf, pagesize=(WIDTH, HEIGHT))
c.translate(mm, mm) c.translate(mm, mm)
@@ -198,22 +211,23 @@ def badge_user(request):
c.saveState() c.saveState()
one_badge(c, DispUser) one_badge(c, DispUser)
OutPDF = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.pdf')
c.showPage() c.showPage()
c._filename = OutPDF
c.save() c.save()
pdf.seek(0) pdf.seek(0)
if isoutpng: if isoutpng:
OutPDF = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.pdf')
OutPNG = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.png') OutPNG = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.png')
#  Let's generate a png file for website #  Let's generate a png file for website
with open( OutPDF ,'wb') as pdff: with open("./%s" % OutPDF, 'wb') as pdff:
pdff.write(pdf.read()) pdff.write(bytes(pdf.read(), 'utf8')) # .encode('utf8'))
Command = ["convert", "-density", "150x150", OutPDF, OutPNG] Command = ["convert", "-density", "150x150", OutPDF, OutPNG]
subprocess.call(Command) subprocess.call(Command)
with open( OutPNG, 'rb') as pngfile: with open("./%s" % OutPNG, 'r') as pngfile:
out_img.write(pngfile.read()) out_img.write(bytes(pngfile.read(), 'utf8')) # bytes(pngfile.read(), "utf8"))
out_img.seek(0) out_img.seek(0)
return Response(app_iter=out_img, content_type='image/png') return Response(app_iter=out_img, content_type='image/png')
+4 -1
View File
@@ -3,7 +3,10 @@
import random import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter from PIL import Image, ImageDraw, ImageFont, ImageFilter
import cStringIO as StringIO try:
from StringIO import StringIO
except ImportError:
from io import StringIO
import math import math
from pyramid.view import view_config from pyramid.view import view_config
from .words import TabMots from .words import TabMots
+1 -1
View File
@@ -1 +1 @@
CurrentYear = 2018 CurrentYear = 2020
+10 -7
View File
@@ -4,6 +4,7 @@ from datetime import timedelta, datetime
import itertools import itertools
from jm2l.const import CurrentYear from jm2l.const import CurrentYear
class DummySejour(object): class DummySejour(object):
def __init__(self, event): def __init__(self, event):
@@ -16,6 +17,7 @@ class DummySejour(object):
.filter(Sejour.for_year == self.CurrentEventYear.year_uid) \ .filter(Sejour.for_year == self.CurrentEventYear.year_uid) \
.first() .first()
class Sejour_helpers(DummySejour): class Sejour_helpers(DummySejour):
def __init__(self, event): def __init__(self, event):
@@ -33,20 +35,20 @@ class Sejour_helpers(DummySejour):
if typedate == "arrival": if typedate == "arrival":
# Let's say people should arrive until 2 day before # Let's say people should arrive until 2 day before
arrival = True arrival = True
myDayRange = xrange(2,-1,-1) myDayRange = range(2, -1, -1)
elif typedate == "departure": elif typedate == "departure":
# Let's say people should go back home until 2 day after # Let's say people should go back home until 2 day after
departure = True departure = True
myDayRange = xrange(3) myDayRange = range(3)
else: else:
return TabResult return TabResult
if self.Sejour: if self.Sejour:
ArrDate = datetime.strftime(self.Sejour.arrival_time,"%d %B %Y").decode('utf-8') ArrDate = datetime.strftime(self.Sejour.arrival_time, "%d %B %Y")
DepDate = datetime.strftime(self.Sejour.depart_time,"%d %B %Y").decode('utf-8') DepDate = datetime.strftime(self.Sejour.depart_time, "%d %B %Y")
else: else:
ArrDate = datetime.strftime( self.CurrentEventYear.start_time,"%d %B %Y" ).decode('utf-8') ArrDate = datetime.strftime(self.CurrentEventYear.start_time, "%d %B %Y")
DepDate = datetime.strftime( self.CurrentEventYear.end_time,"%d %B %Y" ).decode('utf-8') DepDate = datetime.strftime(self.CurrentEventYear.end_time, "%d %B %Y")
for oneday in myDayRange: for oneday in myDayRange:
if arrival: if arrival:
@@ -55,7 +57,7 @@ class Sejour_helpers(DummySejour):
TmpDay = self.CurrentEventYear.start_time + timedelta(days=oneday) TmpDay = self.CurrentEventYear.start_time + timedelta(days=oneday)
DayName = datetime.strftime(TmpDay, "%A") DayName = datetime.strftime(TmpDay, "%A")
DayNum = datetime.strftime(TmpDay, "%d/%m/%y") DayNum = datetime.strftime(TmpDay, "%d/%m/%y")
DayString = datetime.strftime(TmpDay,"%d %B %Y").decode('utf-8') DayString = datetime.strftime(TmpDay, "%d %B %Y")
if arrival and ArrDate == DayString: if arrival and ArrDate == DayString:
TabResult.append((DayNum, DayName, 'selected="selected"')) TabResult.append((DayNum, DayName, 'selected="selected"'))
elif departure and DepDate == DayString: elif departure and DepDate == DayString:
@@ -107,6 +109,7 @@ class Sejour_helpers(DummySejour):
else: else:
return "" return ""
class Orga_helpers(DummySejour): class Orga_helpers(DummySejour):
def __init__(self, event): def __init__(self, event):
+44 -17
View File
@@ -18,10 +18,10 @@ from sqlalchemy import (
) )
from slugify import slugify from slugify import slugify
from webhelpers.text import urlify # from webhelpers.text import urlify
from webhelpers.paginate import PageURL_WebOb, Page from paginate import Page # PageURL_WebOb
from webhelpers.date import time_ago_in_words
from webhelpers2.date import time_ago_in_words
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
@@ -30,14 +30,24 @@ from sqlalchemy.orm import (
sessionmaker sessionmaker
) )
from zope.sqlalchemy import ZopeTransactionExtension # from zope.sqlalchemy import ZopeTransactionExtension
from zope.sqlalchemy import register
from jm2l.const import CurrentYear from jm2l.const import CurrentYear
from passlib.hash import argon2 from passlib.hash import argon2
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
def urlify(in_string, in_string_length):
return ''.join('%20' if c == ' ' else c for c in in_string[:in_string_length])
DBSession = scoped_session(sessionmaker(autoflush=False))
register(DBSession)
# DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base() Base = declarative_base()
class TasksArea(Base): class TasksArea(Base):
__tablename__ = 'staff_tasks_area' __tablename__ = 'staff_tasks_area'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -49,6 +59,7 @@ class TasksArea(Base):
def by_id(cls, uid): def by_id(cls, uid):
return DBSession.query(cls).filter(cls.uid == uid).first() return DBSession.query(cls).filter(cls.uid == uid).first()
class Tasks(Base): class Tasks(Base):
__tablename__ = 'staff_tasks' __tablename__ = 'staff_tasks'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -68,6 +79,7 @@ class Tasks(Base):
def by_id(cls, uid): def by_id(cls, uid):
return DBSession.query(cls).filter(cls.uid == uid).first() return DBSession.query(cls).filter(cls.uid == uid).first()
class User_Event(Base): class User_Event(Base):
""" Créer le lien entre la personne et l' évenement en fonction de l'année""" """ Créer le lien entre la personne et l' évenement en fonction de l'année"""
__tablename__ = 'user_event_link' __tablename__ = 'user_event_link'
@@ -84,6 +96,7 @@ class User_Event(Base):
# user = relationship('User', backref=backref("events_assoc") ) # user = relationship('User', backref=backref("events_assoc") )
# event = relationship('events', backref=backref("users_assoc") ) # event = relationship('events', backref=backref("users_assoc") )
class JM2L_Year(Base): class JM2L_Year(Base):
__tablename__ = 'jm2l_year' __tablename__ = 'jm2l_year'
year_uid = Column(Integer, primary_key=True) year_uid = Column(Integer, primary_key=True)
@@ -102,7 +115,7 @@ class JM2L_Year(Base):
.filter(JM2L_Year.start_time == .filter(JM2L_Year.start_time ==
DBSession.query(func.max(JM2L_Year.start_time)) DBSession.query(func.max(JM2L_Year.start_time))
).one() ).one()
return last_record.start_time.strftime("%A %d %B %Y").decode('utf-8') return last_record.start_time.strftime("%A %d %B %Y") # .decode('utf-8')
@property @property
def AvailableTimeSlots(self, TimeStep=30): def AvailableTimeSlots(self, TimeStep=30):
@@ -125,6 +138,7 @@ class JM2L_Year(Base):
from .upload import MediaPath from .upload import MediaPath
return sorted(MediaPath().get_all('presse', self.year_uid)) return sorted(MediaPath().get_all('presse', self.year_uid))
class User(Base): class User(Base):
__tablename__ = 'users' __tablename__ = 'users'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -208,25 +222,23 @@ class User(Base):
else: else:
return False return False
def year_events(self, EventType='All', year=CurrentYear): def year_events(self, EventType='All', year=CurrentYear):
if EventType == 'All': if EventType == 'All':
return filter(lambda e: e.for_year==year, self.events) return list(filter(lambda e: e.for_year == year, self.events))
else: else:
return filter(lambda e: e.for_year==year and e.event_type==EventType, self.events) return list(filter(lambda e: e.for_year == year and e.event_type == EventType, self.events))
@property @property
def my_hash(self): def my_hash(self):
m = hashlib.sha1() m = hashlib.sha1()
m.update("Nobody inspects ") m.update("Nobody inspects ".encode('utf-8'))
if self.nom: if self.nom:
m.update(unicode.encode(self.nom,'utf8')) m.update(self.nom.encode('utf-8')) # unicode.encode(self.nom, 'utf8'))
if self.pseudo: if self.pseudo:
m.update(unicode.encode(self.pseudo,'utf8')) m.update(self.pseudo.encode('utf-8')) # unicode.encode(self.pseudo, 'utf8'))
if self.prenom: if self.prenom:
m.update(unicode.encode(self.prenom,'utf8')) m.update(self.prenom.encode('utf-8')) # unicode.encode(self.prenom, 'utf8'))
m.update(" the spammish repetition") m.update(" the spammish repetition".encode('utf-8'))
return m.hexdigest() return m.hexdigest()
@property @property
@@ -253,6 +265,7 @@ class User(Base):
return argon2.verify(password, self.password) return argon2.verify(password, self.password)
class TiersOpt(Base): class TiersOpt(Base):
__tablename__ = 'tiers_opt' __tablename__ = 'tiers_opt'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -285,6 +298,7 @@ class TiersOpt(Base):
def by_id(cls, uid): def by_id(cls, uid):
return DBSession.query(cls).filter(cls.uid == uid).first() return DBSession.query(cls).filter(cls.uid == uid).first()
class Tiers(Base): class Tiers(Base):
__tablename__ = 'tiers' __tablename__ = 'tiers'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -344,6 +358,7 @@ class Tiers(Base):
from .upload import MediaPath from .upload import MediaPath
return MediaPath().get_thumb('tiers', self.uid) return MediaPath().get_thumb('tiers', self.uid)
class Role_Tiers(Base): class Role_Tiers(Base):
""" Créer le lien entre le tiers et son rôle dans l'évenement en fonction de l'année""" """ Créer le lien entre le tiers et son rôle dans l'évenement en fonction de l'année"""
__tablename__ = 'role_tiers_link' __tablename__ = 'role_tiers_link'
@@ -354,6 +369,7 @@ class Role_Tiers(Base):
tiers_role = Column(Enum('Exposant', 'Sponsor', 'Donateur')) tiers_role = Column(Enum('Exposant', 'Sponsor', 'Donateur'))
event_uid = Column(Integer, default=None) # Optionnal link with Event event_uid = Column(Integer, default=None) # Optionnal link with Event
class User_Tiers(Base): class User_Tiers(Base):
""" Créer le lien entre la personne et le tiers en fonction de l'année""" """ Créer le lien entre la personne et le tiers en fonction de l'année"""
__tablename__ = 'user_tiers_link' __tablename__ = 'user_tiers_link'
@@ -365,6 +381,7 @@ class User_Tiers(Base):
user = relationship(User, backref=backref("tiers_assoc")) user = relationship(User, backref=backref("tiers_assoc"))
role = Column(Unicode(80)) role = Column(Unicode(80))
class Media(Base): class Media(Base):
__tablename__ = 'medias' __tablename__ = 'medias'
media_id = Column(Integer, primary_key=True) media_id = Column(Integer, primary_key=True)
@@ -385,6 +402,7 @@ class Media(Base):
# return '/upload/%s/%s/%s' % (self.media_type, self.media_table, self.filename) # return '/upload/%s/%s/%s' % (self.media_type, self.media_table, self.filename)
return '/resources/%s/%s/%s' % (self.for_year, self.media_type, self.filename) return '/resources/%s/%s/%s' % (self.for_year, self.media_type, self.filename)
class SallePhy(Base): class SallePhy(Base):
""" Représente une salle dans les locaux """ """ Représente une salle dans les locaux """
__tablename__ = 'phy_salle' __tablename__ = 'phy_salle'
@@ -403,6 +421,7 @@ class SallePhy(Base):
from .upload import MediaPath from .upload import MediaPath
return MediaPath().get_list('salle', self.uid, 'Image') return MediaPath().get_list('salle', self.uid, 'Image')
class Salles(Base): class Salles(Base):
__tablename__ = 'salle' __tablename__ = 'salle'
salle_id = Column(Integer, primary_key=True) salle_id = Column(Integer, primary_key=True)
@@ -415,10 +434,12 @@ class Salles(Base):
last_change = Column(DateTime, default=datetime.datetime.now) last_change = Column(DateTime, default=datetime.datetime.now)
phy = relationship(SallePhy) phy = relationship(SallePhy)
@classmethod @classmethod
def by_id(cls, uid): def by_id(cls, uid):
return DBSession.query(cls).filter(cls.salle_id == uid).first() return DBSession.query(cls).filter(cls.salle_id == uid).first()
class Place(Base): class Place(Base):
__tablename__ = 'place' __tablename__ = 'place'
place_id = Column(Integer, primary_key=True) place_id = Column(Integer, primary_key=True)
@@ -450,6 +471,7 @@ class Place(Base):
else: else:
return DBSession.query(cls).filter(cls.usage == True).all() return DBSession.query(cls).filter(cls.usage == True).all()
class Itineraire(Base): class Itineraire(Base):
__tablename__ = 'itineraire' __tablename__ = 'itineraire'
itin_id = Column(Integer, primary_key=True) itin_id = Column(Integer, primary_key=True)
@@ -473,6 +495,7 @@ class Itineraire(Base):
start = relationship(Place, foreign_keys=[start_place]) start = relationship(Place, foreign_keys=[start_place])
arrival = relationship(Place, foreign_keys=[arrival_place]) arrival = relationship(Place, foreign_keys=[arrival_place])
class Exchange_Cat(Base): class Exchange_Cat(Base):
__tablename__ = 'exchange_category' __tablename__ = 'exchange_category'
cat_id = Column(Integer, primary_key=True) cat_id = Column(Integer, primary_key=True)
@@ -480,6 +503,7 @@ class Exchange_Cat(Base):
exch_subtype = Column(Unicode(80)) exch_subtype = Column(Unicode(80))
description = Column(UnicodeText) description = Column(UnicodeText)
class Exchange(Base): class Exchange(Base):
__tablename__ = 'exchanges' __tablename__ = 'exchanges'
exch_id = Column(Integer, primary_key=True) exch_id = Column(Integer, primary_key=True)
@@ -586,6 +610,7 @@ class Exchange(Base):
.order_by(cls.start_time).all() .order_by(cls.start_time).all()
return DicResult return DicResult
class Sejour(Base): class Sejour(Base):
__tablename__ = 'sejour' __tablename__ = 'sejour'
sej_id = Column(Integer, primary_key=True) sej_id = Column(Integer, primary_key=True)
@@ -614,6 +639,7 @@ class Sejour(Base):
.filter(cls.for_year == year) \ .filter(cls.for_year == year) \
.first() .first()
class Event(Base): class Event(Base):
__tablename__ = 'events' __tablename__ = 'events'
uid = Column(Integer, primary_key=True) uid = Column(Integer, primary_key=True)
@@ -640,7 +666,6 @@ class Event(Base):
return DBSession.query(cls) \ return DBSession.query(cls) \
.filter(cls.uid == uid).first() .filter(cls.uid == uid).first()
@classmethod @classmethod
def by_slug(cls, slug, year=None): def by_slug(cls, slug, year=None):
if not year is None: if not year is None:
@@ -676,6 +701,7 @@ class Event(Base):
def created_in_words(self): def created_in_words(self):
return time_ago_in_words(self.created) return time_ago_in_words(self.created)
class Entry(Base): class Entry(Base):
__tablename__ = 'entries' __tablename__ = 'entries'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
@@ -706,6 +732,7 @@ class Entry(Base):
page_url = PageURL_WebOb(request) page_url = PageURL_WebOb(request)
return Page(Entry.all(), page, url=page_url, items_per_page=5) return Page(Entry.all(), page, url=page_url, items_per_page=5)
# class Seances(Base): # class Seances(Base):
# __tablename__ = 'seances' # __tablename__ = 'seances'
def get_user(request): def get_user(request):
@@ -731,6 +758,7 @@ def get_sponsors(request, Year):
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid) \ .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid) \
.filter(Role_Tiers.tiers_role == 'Sponsor') .filter(Role_Tiers.tiers_role == 'Sponsor')
def get_exposants(request, Year): def get_exposants(request, Year):
if Year: if Year:
return DBSession.query(Tiers) \ return DBSession.query(Tiers) \
@@ -741,4 +769,3 @@ def get_exposants(request, Year):
return DBSession.query(Tiers) \ return DBSession.query(Tiers) \
.join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid) \ .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid) \
.filter(Role_Tiers.tiers_role == 'Exposant') .filter(Role_Tiers.tiers_role == 'Exposant')
+11 -12
View File
@@ -48,14 +48,14 @@ def pull_data(from_db, to_db, tables):
destination, dengine = make_session(to_db) destination, dengine = make_session(to_db)
for table_name in tables: for table_name in tables:
print 'Processing', table_name print('Processing', table_name)
print 'Pulling schema from source server' print('Pulling schema from source server')
table = Table(table_name, smeta, autoload=True) table = Table(table_name, smeta, autoload=True)
print 'Creating table on destination server' print('Creating table on destination server')
table.metadata.create_all(dengine) table.metadata.create_all(dengine)
NewRecord = quick_mapper(table) NewRecord = quick_mapper(table)
columns = table.columns.keys() columns = table.columns.keys()
print 'Transferring records' print('Transferring records')
for record in source.query(table).all(): for record in source.query(table).all():
data = dict( data = dict(
[(str(column), getattr(record, column)) for column in columns] [(str(column), getattr(record, column)) for column in columns]
@@ -69,20 +69,20 @@ def pull_data(from_db, to_db, tables):
try: try:
destination.merge(NewRecord(**data)) destination.merge(NewRecord(**data))
except: except:
print data print(data)
pass pass
print 'Committing changes' print('Committing changes')
destination.commit() destination.commit()
def main(argv=sys.argv): def main(argv=sys.argv):
connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite" connection_string = "sqlite:////home/tr4ck3ur/git_repository/jm2l/JM2L.sqlite"
engine = create_engine(connection_string, echo=False, convert_unicode=True) engine = create_engine(connection_string, echo=False, convert_unicode=True)
DBSession.configure(bind=engine) DBSession.configure(bind=engine)
Users = DBSession.query(User) Users = DBSession.query(User)
ListUser = filter(lambda x: x.is_Intervenant, Users) ListUser = filter(lambda x: x.is_Intervenant, Users)
for i in ListUser: for i in ListUser:
print i.mail print(i.mail)
def main4(argv=sys.argv): def main4(argv=sys.argv):
import csv import csv
@@ -116,7 +116,7 @@ def main4(argv=sys.argv):
u.wifi_user = w_user u.wifi_user = w_user
u.wifi_pass = w_pass u.wifi_pass = w_pass
DBSession.merge(u) DBSession.merge(u)
print row, u print(row, u)
finally: finally:
f.close() f.close()
@@ -141,7 +141,7 @@ def main_3(argv=sys.argv):
.filter(p0.last_logged<p1.last_logged)\ .filter(p0.last_logged<p1.last_logged)\
.with_entities(p0.slug,p0.uid,p1.uid).all() .with_entities(p0.slug,p0.uid,p1.uid).all()
for slug, idsrc, iddst in Datas: for slug, idsrc, iddst in Datas:
print slug print(slug)
# Events # Events
Events = DBSession.query(User_Event)\ Events = DBSession.query(User_Event)\
.filter(User_Event.user_uid==idsrc) .filter(User_Event.user_uid==idsrc)
@@ -238,5 +238,4 @@ def Initialize():
u.password = password u.password = password
u.Staff = 0 u.Staff = 0
DBSession.merge(u) DBSession.merge(u)
print u.nom, u.prenom, u.Staff print(u.nom, u.prenom, u.Staff)
+1 -1
View File
@@ -58,7 +58,7 @@
% if reason: % if reason:
<p>${reason}</p> <p>${reason}</p>
% else: % else:
<p>Vous n'êtes pas authentifi&eacute;, ou n'avez pas les authorisations n&eacute;cessaires.</p> <p>Vous n'êtes pas authentifié, ou n'avez pas les authorisations nécessaires.</p>
% endif % endif
</body> </body>
</html> </html>
+1 -1
View File
@@ -54,7 +54,7 @@
</head> </head>
<body> <body>
<img src="/img/error404.png" width="200px" /> <img src="/img/error404.png" width="200px" />
<h1>Page non trouv&eacute;e</h1> <h1>Page non trouvée</h1>
% if reason: % if reason:
<p>${reason}</p> <p>${reason}</p>
% else: % else:
+12 -12
View File
@@ -10,7 +10,7 @@
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>Conf&eacute;rences</td> <td style="text-align:center"> <td>Conférences</td> <td style="text-align:center">
% if len( request.user.year_events('Conference') ): % if len( request.user.year_events('Conference') ):
% for evt in request.user.year_events('Conference'): % for evt in request.user.year_events('Conference'):
% endfor % endfor
@@ -106,11 +106,11 @@ elif Type=='T':
%> %>
% if Type!='O': % if Type!='O':
<fieldset> <fieldset>
<legend class="lowshadow">Vos ${CurTitles} programm&eacute;s pour ${CurrentYear}</legend> <legend class="lowshadow">Vos ${CurTitles} programmés pour ${CurrentYear}</legend>
<% <%
Selection = filter(lambda x:(x.event_type==CurEventType and x.for_year==CurrentYear), uprofil.events) Selection = list(filter(lambda x:(x.event_type==CurEventType and x.for_year==CurrentYear), uprofil.events))
HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) )
NothingTitle = u"Vous n'avez pas sollicit&eacute; d'intervention %s." % CurEvent NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent
%> %>
${helpers.show_Interventions(Selection, "Sujet", NothingTitle )} ${helpers.show_Interventions(Selection, "Sujet", NothingTitle )}
</fieldset> </fieldset>
@@ -118,21 +118,21 @@ NothingTitle = u"Vous n'avez pas sollicit&eacute; d'intervention %s." % CurEvent
% if Type=='C': % if Type=='C':
<p> <p>
<strong>Proposer une conf&eacute;rence / un lighting talk</strong><br/> <strong>Proposer une conférence / un lighting talk</strong><br/>
<ul> <ul>
<li>Si vous avez une exp&eacute;rience particulière avec les logiciels libres <li>Si vous avez une expérience particulière avec les logiciels libres
que vous souhaitez partager.</li> que vous souhaitez partager.</li>
<li>Si vous êtes acteur dun des sujets actuels qui menacent ou qui <li>Si vous êtes acteur dun des sujets actuels qui menacent ou qui
promeuvent le logiciel libre.</li> promeuvent le logiciel libre.</li>
<li>Si vous voulez pr&eacute;senter un logiciel libre dont vous êtes lauteur.</li> <li>Si vous voulez présenter un logiciel libre dont vous êtes lauteur.</li>
</ul> </ul>
Nous serons heureux de vous &eacute;couter. Nous serons heureux de vous écouter.
<br> <br>
Nous souhaitons proposer des conf&eacute;rences pour un public d&eacute;butant Nous souhaitons proposer des conférences pour un public débutant
autant que pour des visiteurs avertis. Les sujets ne doivent pas autant que pour des visiteurs avertis. Les sujets ne doivent pas
forc&eacute;ment être techniques, mais aussi dordre g&eacute;n&eacute;ral avec la seule forcément être techniques, mais aussi dordre général avec la seule
contrainte de traiter de près ou de loin des logiciels libres, de la contrainte de traiter de près ou de loin des logiciels libres, de la
communaut&eacute; ou de vos propres exp&eacute;riences dutilisateur quotidien. <br> communauté ou de vos propres exp&eacute;riences dutilisateur quotidien. <br>
Le but de ces conf&eacute;rences est double : Le but de ces conf&eacute;rences est double :
<ul> <ul>
<li>donner confiance aux futurs utilisateurs de logiciels libres</li> <li>donner confiance aux futurs utilisateurs de logiciels libres</li>
@@ -205,7 +205,7 @@ NothingTitle = u"Vous n'avez pas sollicit&eacute; d'intervention %s." % CurEvent
<fieldset> <fieldset>
<legend class="lowshadow">Historique</legend> <legend class="lowshadow">Historique</legend>
<% <%
Selection = filter(lambda x:(x.event_type==CurEventType and x.for_year!=CurrentYear), uprofil.events) Selection = list(filter(lambda x:(x.event_type==CurEventType and x.for_year!=CurrentYear), uprofil.events))
HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) )
NothingTitle = u"D&eacute;sol&eacute;, Il n'y a rien dans l'historique vous concernant." NothingTitle = u"D&eacute;sol&eacute;, Il n'y a rien dans l'historique vous concernant."
%> %>
+1 -1
View File
@@ -30,7 +30,7 @@
</tbody> </tbody>
</table> </table>
<div class="center"> <div class="center">
Pour un co-voiturage le <u>${Exch.start_time.strftime("%a %d %b").decode('utf-8')}</u> Pour un co-voiturage le <u>${Exch.start_time.strftime("%a %d %b")}</u>
vers <strong>${Exch.start_time.strftime("%H:%M")}</strong> vers <strong>${Exch.start_time.strftime("%H:%M")}</strong>
</div> </div>
Temps de voyage estimé à <span id="summary"></span> Temps de voyage estimé à <span id="summary"></span>
+1 -1
View File
@@ -12,7 +12,7 @@
<dd>Un hébergement</dd> <dd>Un hébergement</dd>
% endif % endif
<dt>Quand </dt> <dt>Quand </dt>
<dd>La nuit du ${Exch.start_time.strftime('%A %d %b %Y').decode('utf-8')} jusqu'au lendemain</dd> <dd>La nuit du ${Exch.start_time.strftime('%A %d %b %Y')} jusqu'au lendemain</dd>
% if Exch.description: % if Exch.description:
<dt>Détails </dt> <dt>Détails </dt>
<dd>${Exch.description}</dd> <dd>${Exch.description}</dd>
+2 -2
View File
@@ -8,8 +8,8 @@
<dt>Catégorie</dt> <dt>Catégorie</dt>
<dd>${Exch.Category.exch_subtype}</dd> <dd>${Exch.Category.exch_subtype}</dd>
<dt>Quand </dt> <dt>Quand </dt>
<dd>de ${Exch.start_time.strftime('%A %d %b %Y').decode('utf-8')} vers ${Exch.start_time.strftime('%Hh%M')} <dd>de ${Exch.start_time.strftime('%A %d %b %Y')} vers ${Exch.start_time.strftime('%Hh%M')}
à ${Exch.end_time.strftime('%A %d %b %Y').decode('utf-8')} vers ${Exch.end_time.strftime('%Hh%M')} à ${Exch.end_time.strftime('%A %d %b %Y')} vers ${Exch.end_time.strftime('%Hh%M')}
</dd> </dd>
<dt>Détails </dt> <dt>Détails </dt>
<dd>${Exch.description}</dd> <dd>${Exch.description}</dd>
+17 -17
View File
@@ -8,11 +8,11 @@ DicExch = Exchanges.get_overview( request.user.uid )
<div class="tabbable tabs-left" id="Intendance_tab"> <div class="tabbable tabs-left" id="Intendance_tab">
<ul class="nav nav-tabs navbar" style="margin-bottom:0;background-color: #f7f7f7;"> <ul class="nav nav-tabs navbar" style="margin-bottom:0;background-color: #f7f7f7;">
<li class="active"> <a href="#ResumeInt" data-toggle="tab">Resum&eacute;</a> </li> <li class="active"> <a href="#ResumeInt" data-toggle="tab">Resumé</a> </li>
<li> <a href="#Miam" data-toggle="tab"><span style="font-size:1.8em;">&#127869;</span> Miam</a> </li> <li> <a href="#Miam" data-toggle="tab"><span style="font-size:1.8em;">&#127869;</span> Miam</a> </li>
<li> <a href="#Covoiturage" data-toggle="tab"><span style="font-size:1.8em;">&#128664;</span> Covoiturage</a> </li> <li> <a href="#Covoiturage" data-toggle="tab"><span style="font-size:1.8em;">&#128664;</span> Covoiturage</a> </li>
<li> <a href="#Hebergement" data-toggle="tab"><span style="font-size:1.8em;">&#127962;</span> H&eacute;bergement</a> </li> <li> <a href="#Hebergement" data-toggle="tab"><span style="font-size:1.8em;">&#127962;</span> Hébergement</a> </li>
<li> <a href="#Materiel" data-toggle="tab"><span style="font-size:1.8em;">&#128722;</span> Mat&eacute;riel</a> </li> <li> <a href="#Materiel" data-toggle="tab"><span style="font-size:1.8em;">&#128722;</span> Matériel</a> </li>
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
@@ -30,7 +30,7 @@ DicExch = Exchanges.get_overview( request.user.uid )
${tables.DoTable(Type, 'Ask', DicExch)} ${tables.DoTable(Type, 'Ask', DicExch)}
${tables.DoTable(Type, 'Proposal', DicExch)} ${tables.DoTable(Type, 'Proposal', DicExch)}
<fieldset> <fieldset>
<legend>Tous les &eacute;changes</legend> <legend>Tous les échanges</legend>
${Missing(Type, DicExch['Missing'])} ${Missing(Type, DicExch['Missing'])}
</fieldset> </fieldset>
</%def> </%def>
@@ -59,23 +59,23 @@ DicForm = {
</td> </td>
<td> <td>
<p> <p>
Compl&eacute;tez dès à pr&eacute;sent votre partie repas afin que l'on puisse faire les r&eacute;servations n&eacute;cessaires ! Complétez dès à présent votre partie repas afin que l'on puisse faire les réservations nécessaires !
</p> </p>
<u>Vendredi soir :</u> <u>Vendredi soir :</u>
<p> <p>
Certains conf&eacute;renciers viennent de très loin et seront pr&eacute;sent d&eacute;s le vendredi.<br /> Certains conférenciers viennent de très loin et seront présent dés le vendredi.<br />
Nous vous proposons de nous retrouver à proximit&eacute;, à la CASA.<br /> Nous vous proposons de nous retrouver à proximité, à la CASA.<br />
<a href="http://groupelacasa.com/la-carte-et-les-menus-1-2-75"> La carte CASA </a> <a href="http://groupelacasa.com/la-carte-et-les-menus-1-2-75"> La carte CASA </a>
le vendredi soir autour d'un verre et d'un bon repas ! le vendredi soir autour d'un verre et d'un bon repas !
</p> </p>
<u>Samedi Midi :</u> <u>Samedi Midi :</u>
<p> <p>
&Agrave; la pause du midi, nous vous proposons un repas avec le food-truck 'les frères toqu&eacute;s' qui sera pr&eacute;sent sur le parking de PolyTech<br /> &Agrave; la pause du midi, nous vous proposons un repas avec le food-truck 'les frères toqués' qui sera présent sur le parking de PolyTech<br />
</p> </p>
<u>Samedi Soir :</u> <u>Samedi Soir :</u>
<p> <p>
Pour conclure la journ&eacute;e nous avons l'habitude de nous retrouver au repas de cloture.<br /> Pour conclure la journée nous avons l'habitude de nous retrouver au repas de cloture.<br />
Nous vous proposons de nous retrouver à Antibes au restaurant Les Tonnelles<br /> Nous vous proposons de nous retrouver à Antibes au restaurant Les Tonnelles<br />
<a href="https://fr-fr.facebook.com/lestonnellesantibes/?_fb_noscript=1"> Les Tonnelles </a> <a href="https://fr-fr.facebook.com/lestonnellesantibes/?_fb_noscript=1"> Les Tonnelles </a>
</p> </p>
@@ -100,7 +100,7 @@ elif Type=='M':
<thead> <thead>
<tr> <tr>
<th colspan="5"> <th colspan="5">
Les &eacute;changes ${CurTitle} Les échanges ${CurTitle}
% if 0: % if 0:
<span style="float:right;"> <span style="float:right;">
<a data-original-title="Afficher les demandes" data-toggle="tooltip" id="${Type}_Demande"> <a data-original-title="Afficher les demandes" data-toggle="tooltip" id="${Type}_Demande">
@@ -124,7 +124,7 @@ elif Type=='M':
<tr> <tr>
<th style="width:1em;"></th> <th style="width:1em;"></th>
<th>D&eacute;tails</th> <th>Détails</th>
<th style="width:1em;"></th> <th style="width:1em;"></th>
<tr> <tr>
</thead> </thead>
@@ -132,7 +132,7 @@ elif Type=='M':
% if len(Selection)==0: % if len(Selection)==0:
<tr> <tr>
<td colspan="5" style="text-align:center;"> <td colspan="5" style="text-align:center;">
<i>Il n'y a aucun &eacute;change ${CurTitle} propos&eacute; actuellement...</i> <i>Il n'y a aucun échange ${CurTitle} proposé actuellement...</i>
</td> </td>
</tr> </tr>
% else: % else:
@@ -155,7 +155,7 @@ elif Type=='M':
<a href="/user/${item.provider.slug}"> ${item.provider.prenom} ${item.provider.nom} </a> offre <a href="/user/${item.provider.slug}"> ${item.provider.prenom} ${item.provider.nom} </a> offre
% endif % endif
% if item.exch_type=="C": % if item.exch_type=="C":
un co-voiturage le ${item.start_time.strftime('%a %d %b vers %Hh%M').decode('utf-8')} un co-voiturage le ${item.start_time.strftime('%a %d %b vers %Hh%M')}
de <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.start.place_id}')">${item.Itin.start.display_name}</a> de <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.start.place_id}')">${item.Itin.start.display_name}</a>
à <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.arrival.place_id}')">${item.Itin.arrival.display_name}</a> à <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.arrival.place_id}')">${item.Itin.arrival.display_name}</a>
% elif item.exch_type=="M": % elif item.exch_type=="M":
@@ -165,8 +165,8 @@ elif Type=='M':
% if item.description: % if item.description:
${item.description[:30]} ${item.description[:30]}
% endif % endif
de ${item.start_time.strftime('%a %d %b %Hh%M').decode('utf-8')} de ${item.start_time.strftime('%a %d %b %Hh%M')}
à ${item.end_time.strftime('%a %d %b %Hh%M').decode('utf-8')} à ${item.end_time.strftime('%a %d %b %Hh%M')}
% else: % else:
% if item.Category: % if item.Category:
<i>${item.Category.exch_subtype}</i> <i>${item.Category.exch_subtype}</i>
@@ -174,7 +174,7 @@ elif Type=='M':
% if item.description: % if item.description:
${item.description[:30]} ${item.description[:30]}
% endif % endif
${item.start_time.strftime('%a %d %b').decode('utf-8')} soir ${item.start_time.strftime('%a %d %b')} soir
% endif % endif
</p> </p>
</td> </td>
@@ -284,7 +284,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"]
</div> </div>
<div class="accordion-group"> <div class="accordion-group">
<div class="accordion-heading"> <div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#AccordionCounter" href="#collapseAll">Les compteurs de l´&eacute;v&eacute;nement</a> <a class="accordion-toggle" data-toggle="collapse" data-parent="#AccordionCounter" href="#collapseAll">Les compteurs de l´év&eacute;nement</a>
</div> </div>
<div id="collapseAll" class="accordion-body collapse"> <div id="collapseAll" class="accordion-body collapse">
<div class="accordion-inner"> <div class="accordion-inner">
+4 -4
View File
@@ -97,17 +97,17 @@ elif Type=='M':
</td> </td>
<td> <td>
%if Type=='C': %if Type=='C':
${item.start_time.strftime('%A %d %b %Y').decode('utf-8')} vers ${item.start_time.strftime('%Hh%M')} ${item.start_time.strftime('%A %d %b %Y')} vers ${item.start_time.strftime('%Hh%M')}
de <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.start.place_id}')">${item.Itin.start.display_name}</a> de <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.start.place_id}')">${item.Itin.start.display_name}</a>
à <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.arrival.place_id}')">${item.Itin.arrival.display_name}</a> à <a href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/${item.Itin.arrival.place_id}')">${item.Itin.arrival.display_name}</a>
%elif Type=='H': %elif Type=='H':
% if item.Category: % if item.Category:
<i>${item.Category.exch_subtype}</i>, <i>${item.Category.exch_subtype}</i>,
% endif % endif
La nuit du ${item.start_time.strftime('%A %d %b %Y').decode('utf-8')}<br> La nuit du ${item.start_time.strftime('%A %d %b %Y')}<br>
%elif Type=='M': %elif Type=='M':
de ${item.start_time.strftime('%A %d %b %Y').decode('utf-8')} vers ${item.start_time.strftime('%Hh%M')} de ${item.start_time.strftime('%A %d %b %Y')} vers ${item.start_time.strftime('%Hh%M')}
à ${item.end_time.strftime('%A %d %b %Y').decode('utf-8')} vers ${item.end_time.strftime('%Hh%M')}<br> à ${item.end_time.strftime('%A %d %b %Y')} vers ${item.end_time.strftime('%Hh%M')}<br>
${item.Category.exch_subtype} ${item.Category.exch_subtype}
%endif %endif
%if item.description: %if item.description:
+4 -4
View File
@@ -23,12 +23,12 @@
<% <%
DicFormA = { DicFormA = {
'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False}, 'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False},
'prenom': {'PlaceHolder':u"Mon Pr&eacute;nom", 'ContainerClass':"span6", 'next':True}, 'prenom': {'PlaceHolder':u"Mon Prénom", 'ContainerClass':"span6", 'next':True},
'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False}, 'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False},
'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True}, 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True},
'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False}, 'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False},
'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True}, 'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True},
'gpg_key': {'PlaceHolder':u"Ma cl&eacute; gpg", 'ContainerClass':"span6", 'next':False}, 'gpg_key': {'PlaceHolder':u"Ma clé gpg", 'ContainerClass':"span6", 'next':False},
'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True}, 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True},
'bio': {'Ignore':True}, 'bio': {'Ignore':True},
'tiersship': {'Ignore':True}, 'tiersship': {'Ignore':True},
@@ -52,12 +52,12 @@ DicFormB = {
DicForm2 = { 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&eacute;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;"},
'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", "FieldStyle":"width:16em;"}, 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", "FieldStyle":"width:16em;"},
'phone': {'PlaceHolder':u"0612345678", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, 'phone': {'PlaceHolder':u"0612345678", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"},
'website': {'PlaceHolder':u"http://ma-page-web.moi","FieldStyle":"width:16em;"}, 'website': {'PlaceHolder':u"http://ma-page-web.moi","FieldStyle":"width:16em;"},
'gpg_key': {'PlaceHolder':u"Ma cl&eacute; gpg", "FieldStyle":"width:90%;"}, 'gpg_key': {'PlaceHolder':u"Ma clé gpg", "FieldStyle":"width:90%;"},
'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org","FieldStyle":"width:90%;"}, 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org","FieldStyle":"width:90%;"},
'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}
+13 -13
View File
@@ -14,14 +14,14 @@ fieldset:disabled {
% else: % else:
<legend class="lowshadow"> <legend class="lowshadow">
<img style="max-height:50px;" src="/img/warn.png" alt="Attention !"> <img style="max-height:50px;" src="/img/warn.png" alt="Attention !">
Vous n'avez pas confirm&eacute; votre venue aux JM2L ${CurrentYear} Vous n'avez pas confirmé votre venue aux JM2L ${CurrentYear}
</legend> </legend>
<h4 class="lowshadow">Compl&eacute;tez et validez vite ce formulaire !</h4> <h4 class="lowshadow">Complétez et validez vite ce formulaire !</h4>
% endif % endif
<form id="ProfilForm" action="/MonSejour" method="POST"> <form id="ProfilForm" action="/MonSejour" method="POST">
<fieldset class="ComeToJM2L"> <fieldset class="ComeToJM2L">
<legend>Arriv&eacute;e</legend> <legend>Arrivée</legend>
<div class="form-inline"> <div class="form-inline">
J'arrive J'arrive
<select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu">
@@ -63,16 +63,16 @@ fieldset:disabled {
<ul style="list-style-type: none;"> <ul style="list-style-type: none;">
<li><label class="checkbox"> <li><label class="checkbox">
<input id="PMR" ${mytrip.IsCheck("Arrival:PMR")|n} name="Arrival:PMR" title="Assistance Personne à mobilit&eacute; r&eacute;duite (PMR)" type="checkbox"> <input id="PMR" ${mytrip.IsCheck("Arrival:PMR")|n} name="Arrival:PMR" title="Assistance Personne à mobilité réduite (PMR)" type="checkbox">
d'assistance : Personne à mobilit&eacute; r&eacute;duite (PMR)</input></label> d'assistance : Personne à mobilité réduite (PMR)</input></label>
</li> </li>
<li><label class="checkbox"> <li><label class="checkbox">
<input id="Cov" ${mytrip.IsCheck("Arrival:Cov")|n} name="Arrival:Cov" title="Covoiturage" type="checkbox"> <input id="Cov" ${mytrip.IsCheck("Arrival:Cov")|n} name="Arrival:Cov" title="Covoiturage" type="checkbox">
d'un covoiturage, d'un h&eacute;bergement...<br>(j'ai rempli/je vais remplir la section Logistique).</input></label> d'un covoiturage, d'un hébergement...<br>(j'ai rempli/je vais remplir la section Logistique).</input></label>
</li> </li>
<li><label class="checkbox"> <li><label class="checkbox">
<input id="Bras" ${mytrip.IsCheck("Arrival:Bras")|n} name="Arrival:Bras" title="Bras" type="checkbox"> <input id="Bras" ${mytrip.IsCheck("Arrival:Bras")|n} name="Arrival:Bras" title="Bras" type="checkbox">
de bras, car je rapporte plein de mat&eacute;riel. <br>(Je transporte ma maison, mon garage ...)</input></label> de bras, car je rapporte plein de matériel. <br>(Je transporte ma maison, mon garage ...)</input></label>
</li> </li>
<li> <li>
<div class="form-inline"> <div class="form-inline">
@@ -81,7 +81,7 @@ fieldset:disabled {
Autres Autres
</input></label> </input></label>
<input type="text" style="width:20em;" name="Arrival:Comment" <input type="text" style="width:20em;" name="Arrival:Comment"
placeholder="Pr&eacute;cisions à propos de mon arriv&eacute;e…" /> placeholder="Précisions à propos de mon arrivée…" />
</div> </div>
</li> </li>
</ul> </ul>
@@ -90,7 +90,7 @@ fieldset:disabled {
</fieldset> </fieldset>
<fieldset class="ComeToJM2L"> <fieldset class="ComeToJM2L">
<legend>D&eacute;part</legend> <legend>Départ</legend>
<div class="form-inline"> <div class="form-inline">
Je repars Je repars
<select style="width:12em;" id="Departure:Place" class="formforform-field" name="Departure:Place" title="Alors, j'arrive"> <select style="width:12em;" id="Departure:Place" class="formforform-field" name="Departure:Place" title="Alors, j'arrive">
@@ -130,8 +130,8 @@ fieldset:disabled {
Je vais avoir besoin: &nbsp;&nbsp;<small style="color: #aaa;">(Cochez les cases correspondantes)</small> Je vais avoir besoin: &nbsp;&nbsp;<small style="color: #aaa;">(Cochez les cases correspondantes)</small>
<ul style="list-style-type: none;"> <ul style="list-style-type: none;">
<li><label class="checkbox"> <li><label class="checkbox">
<input id="PMR" ${mytrip.IsCheck("Departure:PMR")|n} name="Departure:PMR" title="d'Assistance : Personne à mobilit&eacute; r&eacute;duite (PMR)" type="checkbox"> <input id="PMR" ${mytrip.IsCheck("Departure:PMR")|n} name="Departure:PMR" title="d'Assistance : Personne à mobilité réduite (PMR)" type="checkbox">
d'assistance : Personne à mobilit&eacute; r&eacute;duite (PMR)</input> d'assistance : Personne à mobilité réduite (PMR)</input>
</label> </label>
</li> </li>
<li><label class="checkbox"> <li><label class="checkbox">
@@ -141,7 +141,7 @@ fieldset:disabled {
</li> </li>
<li><label class="checkbox"> <li><label class="checkbox">
<input id="Bras" ${mytrip.IsCheck("Departure:Bras")|n} name="Departure:Bras" title="de bras" type="checkbox"> <input id="Bras" ${mytrip.IsCheck("Departure:Bras")|n} name="Departure:Bras" title="de bras" type="checkbox">
de bras, car j'ai en stock plein de mat&eacute;riel (Ma maison).</input> de bras, car j'ai en stock plein de matériel (Ma maison).</input>
</label> </label>
</li> </li>
<li> <li>
@@ -151,7 +151,7 @@ fieldset:disabled {
Autres Autres
</input></label> </input></label>
<input type="text" style="width:20em;" name="Departure:Comment" <input type="text" style="width:20em;" name="Departure:Comment"
placeholder="Pr&eacute;cisions à propos de mon d&eacute;part…" /> placeholder="Précisions à propos de mon départ…" />
</div> </div>
</li> </li>
</ul> </ul>
+1 -1
View File
@@ -111,7 +111,7 @@ if Counter==0:
vid = event.video.first() vid = event.video.first()
pres = event.presentation.first() pres = event.presentation.first()
%> %>
${event.start_time.strftime("%a %d %b").decode('utf-8')}<br> ${event.start_time.strftime("%a %d %b")}<br>
${event.start_time.strftime("%H:%M")} - ${event.end_time.strftime("%H:%M")} ${event.start_time.strftime("%H:%M")} - ${event.end_time.strftime("%H:%M")}
</td> </td>
<td style="position: relative;"> <td style="position: relative;">
+2 -2
View File
@@ -24,7 +24,7 @@ from slugify import slugify
% if len(DicSallePhy)==0: % if len(DicSallePhy)==0:
<tr> <tr>
<td style="text-align:center;"> <td style="text-align:center;">
<i>Il n'y a pas de salle d&eacute;finie pour le moment.</i> <i>Il n'y a pas de salle définie pour le moment.</i>
</td> </td>
</tr> </tr>
% endif % endif
@@ -43,7 +43,7 @@ from slugify import slugify
% if SallePhy.uid: % if SallePhy.uid:
[ ${SallePhy.nb_places} places ] [ ${SallePhy.nb_places} places ]
% else: % else:
[ <a href="/PhySalles">Cr&eacute;er</a> ] [ <a href="/PhySalles">Créer</a> ]
% endif % endif
</div> </div>
+2 -2
View File
@@ -29,9 +29,9 @@
%endif %endif
<% <%
DicForm = { DicForm = {
'year_uid': {'PlaceHolder':u"Ann&eacute;e", "FieldStyle":"width:7em;", "ContainerStyle":"float:left;" }, 'year_uid': {'PlaceHolder':u"Année", "FieldStyle":"width:7em;", "ContainerStyle":"float:left;" },
'phy_salle_id': {'PlaceHolder':u"Salle Physique", "FieldStyle":"width:20em;", "ContainerStyle":"float:left;" }, 'phy_salle_id': {'PlaceHolder':u"Salle Physique", "FieldStyle":"width:20em;", "ContainerStyle":"float:left;" },
'place_type': {'PlaceHolder':u"Type d'&eacute;vènement","FieldStyle":"width:15em;" }, 'place_type': {'PlaceHolder':u"Type d'évènement","FieldStyle":"width:15em;" },
'name': {'PlaceHolder':u"Nom de la salle", "FieldStyle":"width:90%;" }, 'name': {'PlaceHolder':u"Nom de la salle", "FieldStyle":"width:90%;" },
'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" }, 'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" },
} }
+1 -1
View File
@@ -46,7 +46,7 @@
</td> </td>
</tr> </tr>
% endif % endif
% for item, one_dic in found.iteritems(): % for item, one_dic in found.items():
<tr> <tr>
<td> <td>
<a href="/user/${item}"> <a href="/user/${item}">
+1 -1
View File
@@ -63,7 +63,7 @@ from slugify import slugify
</a> </a>
<span style="float:right;"> <span style="float:right;">
- <a href="/user/${task.assignee.slug}">${task.assignee.pseudo or ' '.join([task.assignee.prenom, task.assignee.nom]) }</a> - <a href="/user/${task.assignee.slug}">${task.assignee.pseudo or ' '.join([task.assignee.prenom, task.assignee.nom]) }</a>
- ${task.due_date.strftime("%d %b").decode("utf-8")} - ${task.due_date.strftime("%d %b")}
</span> </span>
% endif % endif
</td> </td>
+3 -3
View File
@@ -30,7 +30,7 @@
%endif %endif
% if 'uid' in form._fields: % if 'uid' in form._fields:
<div class="borderboxtime"> <div class="borderboxtime">
${event.start_time.strftime('%d %b %Y').decode('utf-8')} - ${event.start_time.strftime('%d %b %Y')} -
${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')} ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
%if event.Salle: %if event.Salle:
- <strong>Salle</strong>: ${event.Salle.name} - <strong>Salle</strong>: ${event.Salle.name}
@@ -184,10 +184,10 @@ DicForm = {
</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')}</p>
%else: %else:
<p style="float:right;">Créé le <p style="float:right;">Créé le
${datetime.now().strftime('%d %b %Y').decode('utf-8')} ${datetime.now().strftime('%d %b %Y')}
</p> </p>
% endif % endif
<br/> <br/>
+14 -14
View File
@@ -7,7 +7,7 @@ TabJs = {'select':[], 'desc':[]}
%> %>
<div class="row-fluid"> <div class="row-fluid">
% for FieldName, Field in form._fields.items(): % for FieldName, Field in form._fields.items():
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("Ignore"): % if Field.name in DicFormat and DicFormat[Field.name].get("Ignore"):
<% continue %> <% continue %>
% endif % endif
% if Field.type in ['HiddenField', 'CSRFTokenField']: % if Field.type in ['HiddenField', 'CSRFTokenField']:
@@ -27,7 +27,7 @@ TabJs = {'select':[], 'desc':[]}
</a> </a>
% endif % endif
</label> </label>
% if DicFormat.has_key(Field.name): % if Field.name in DicFormat:
<% <%
PlaceHolder = DicFormat[Field.name].get("PlaceHolder") PlaceHolder = DicFormat[Field.name].get("PlaceHolder")
Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ] Class = [False,"ckeditor"][ "ckeditor" in DicFormat[Field.name] ]
@@ -49,7 +49,7 @@ TabJs = {'select':[], 'desc':[]}
% endfor % endfor
</div> </div>
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("next")==True: % if Field.name in DicFormat and DicFormat[Field.name].get("next")==True:
</div> </div>
<div class="row-fluid"> <div class="row-fluid">
% endif % endif
@@ -72,7 +72,7 @@ TabJs = {'select':[], 'desc':[]}
TabJs = {'select':[], 'desc':[]} TabJs = {'select':[], 'desc':[]}
%> %>
% for FieldName, Field in form._fields.items(): % for FieldName, Field in form._fields.items():
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("Ignore"): % if Field.name in DicFormat and DicFormat[Field.name].get("Ignore"):
<% continue %> <% continue %>
% endif % endif
% if Field.type in ['HiddenField', 'CSRFTokenField']: % if Field.type in ['HiddenField', 'CSRFTokenField']:
@@ -81,11 +81,11 @@ TabJs = {'select':[], 'desc':[]}
% elif Field.type=="SelectField": % elif Field.type=="SelectField":
<% TabJs['select'].append(Field.label.field_id) %> <% TabJs['select'].append(Field.label.field_id) %>
% endif % endif
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("fieldset"): % if Field.name in DicFormat and DicFormat[Field.name].get("fieldset"):
<fieldset> <fieldset>
<legend>${Field.label.text}</legend> <legend>${Field.label.text}</legend>
% else: % else:
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("ContainerStyle"): % if Field.name in DicFormat and DicFormat[Field.name].get("ContainerStyle"):
<div style="padding-right:5px;${DicFormat[Field.name].get("ContainerStyle")}"> <div style="padding-right:5px;${DicFormat[Field.name].get("ContainerStyle")}">
% else: % else:
<div style="padding-right:5px;"> <div style="padding-right:5px;">
@@ -101,7 +101,7 @@ TabJs = {'select':[], 'desc':[]}
% endif % endif
</label> </label>
% endif % endif
% if DicFormat.has_key(Field.name): % if Field.name in DicFormat:
<% <%
PlaceHolder = DicFormat[Field.name].get("PlaceHolder") PlaceHolder = DicFormat[Field.name].get("PlaceHolder")
FieldStyle = DicFormat[Field.name].get("FieldStyle") FieldStyle = DicFormat[Field.name].get("FieldStyle")
@@ -122,7 +122,7 @@ TabJs = {'select':[], 'desc':[]}
${ error } ${ error }
</div> </div>
% endfor % endfor
% if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("fieldset"): % if Field.name in DicFormat and DicFormat[Field.name].get("fieldset"):
</fieldset> </fieldset>
% else: % else:
</div> </div>
@@ -142,7 +142,7 @@ TabJs = {'select':[], 'desc':[]}
<%def name="sejour_wrapper(Places)"> <%def name="sejour_wrapper(Places)">
<div class="form-inline"> <div class="form-inline">
D&eacute;part : Départ :
<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: % for place in Places:
<option value="${place.place_id}">${place.display_name}</option> <option value="${place.place_id}">${place.display_name}</option>
@@ -151,7 +151,7 @@ TabJs = {'select':[], 'desc':[]}
</div> </div>
<br /> <br />
<div class="form-inline"> <div class="form-inline">
Arriv&eacute;e : Arrivée :
<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: % for place in Places:
<option value="${place.place_id}">${place.display_name}</option> <option value="${place.place_id}">${place.display_name}</option>
@@ -184,7 +184,7 @@ TabJs = {'select':[], 'desc':[]}
${itin_form.arrival_place(style='width:17em;')} ${itin_form.arrival_place(style='width:17em;')}
</div> </div>
<div style="padding:5px;"> <div style="padding:5px;">
<small style="color:#999">Si je n´ai pas trouv&eacute; le lieu dont j´ai besoin dans ces listes...</small> <small style="color:#999">Si je n´ai pas trouvé le lieu dont j´ai besoin dans ces listes...</small>
<br /> <br />
<small style="color:#999">Je peux </small> <small style="color:#999">Je peux </small>
<a class="btn btn-mini btn-info" role="button" href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/0');"> <a class="btn btn-mini btn-info" role="button" href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/0');">
@@ -350,9 +350,9 @@ TabJs = {'select':[], 'desc':[]}
<tr> <tr>
<td style="text-align:center;" colspan="2"> <td style="text-align:center;" colspan="2">
% if NotFoundTitle: % if NotFoundTitle:
<i>${NotFoundTitle}</i> <i>${NotFoundTitle | h}</i>
% else: % else:
<i>D&eacute;sol&eacute;, Il n'y a rien dans l'historique.</i> <i>Désolé;, Il n'y a rien dans l'historique.</i>
% endif % endif
</td> </td>
</tr> </tr>
@@ -366,7 +366,7 @@ TabJs = {'select':[], 'desc':[]}
vid = event.video.first() vid = event.video.first()
pres = event.presentation.first() pres = event.presentation.first()
%> %>
${event.start_time.strftime('%d %b %Y').decode('utf-8')} ${event.start_time.strftime('%d %b %Y')}
${start.hour}:${"%.2d" % start.minute}-${end.hour}:${"%.2d" % end.minute} ${start.hour}:${"%.2d" % start.minute}-${end.hour}:${"%.2d" % end.minute}
</td> </td>
<td style="position: relative;">${event.event_type}: <td style="position: relative;">${event.event_type}:
+7 -7
View File
@@ -61,7 +61,7 @@
<div class="tabbable" id="main_tab"> <div class="tabbable" id="main_tab">
<ul class="nav nav-tabs nav-pills" style="margin-bottom: 5px;"> <ul class="nav nav-tabs nav-pills" 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>
<li><a href="#Sejour" id="Map_Sejour" data-toggle="tab">Mon S&eacute;jour</a></li> <li><a href="#Sejour" id="Map_Sejour" data-toggle="tab">Mon Séjour</a></li>
<li><a href="#Logistique" id="Map_Logistique" data-toggle="tab">Logistique</a></li> <li><a href="#Logistique" id="Map_Logistique" data-toggle="tab">Logistique</a></li>
<li><a href="#Interventions" id="Map_Interventions" data-toggle="tab">Mes Interventions</a></li> <li><a href="#Interventions" id="Map_Interventions" data-toggle="tab">Mes Interventions</a></li>
<li><a href="#Frais" id="Map_Frais" data-toggle="tab">Mes Frais</a></li> <li><a href="#Frais" id="Map_Frais" data-toggle="tab">Mes Frais</a></li>
@@ -79,8 +79,8 @@
<div class="tabbable tabs-left" id="Interventions_tab"> <div class="tabbable tabs-left" id="Interventions_tab">
<ul class="nav nav-tabs navbar" style="margin-bottom:0;"> <ul class="nav nav-tabs navbar" style="margin-bottom:0;">
<li class="active"> <a href="#ResumePart" data-toggle="tab">Resum&eacute;</a> </li> <li class="active"> <a href="#ResumePart" data-toggle="tab">Resumé</a> </li>
<li> <a href="#Conference" data-toggle="tab">Conf&eacute;rence</a> </li> <li> <a href="#Conference" data-toggle="tab">Conférence</a> </li>
<li> <a href="#Stand" data-toggle="tab">Stand</a> </li> <li> <a href="#Stand" data-toggle="tab">Stand</a> </li>
<li> <a href="#Atelier" data-toggle="tab">Atelier</a> </li> <li> <a href="#Atelier" data-toggle="tab">Atelier</a> </li>
<li> <a href="#TableRonde" data-toggle="tab">Table Ronde</a> </li> <li> <a href="#TableRonde" data-toggle="tab">Table Ronde</a> </li>
@@ -118,12 +118,12 @@
<div class="tab-pane fade" id="Frais"> <div class="tab-pane fade" id="Frais">
<fieldset> <fieldset>
<legend class="lowshadow">Une participation à mes frais ?</legend> <legend class="lowshadow">Une participation à mes frais ?</legend>
L'&eacute;quipe des JM2L participe aux <u>frais de transport</u> des intervenants !<br /><br /> L'équipe des JM2L participe aux <u>frais de transport</u> des intervenants !<br /><br />
Et bien oui, mais cette participation ne sera effective que si vous remplissez <u>toutes les conditions</u> suivantes: Et bien oui, mais cette participation ne sera effective que si vous remplissez <u>toutes les conditions</u> suivantes:
<ul style="list-style:circle;"> <ul style="list-style:circle;">
<li>Vous animez <strong>un atelier, une conf&eacute;rence ou une table ronde</strong> aux JM2L ${CurrentYear}.</li> <li>Vous animez <strong>un atelier, une conférence ou une table ronde</strong> aux JM2L ${CurrentYear}.</li>
<li>Votre fiche est renseign&eacute;e avec <strong>votre RIB</strong>.</li> <li>Votre fiche est renseignée avec <strong>votre RIB</strong>.</li>
<li>Votre fiche est renseign&eacute;e avec <strong>les preuves</strong> de vos achats.</li> <li>Votre fiche est renseignée avec <strong>les preuves</strong> de vos achats.</li>
<li>Vous <strong>présentez l'original de vos tickets</strong> à l'accueil pendant l'évènement.</li> <li>Vous <strong>présentez l'original de vos tickets</strong> à l'accueil pendant l'évènement.</li>
<li>Tous vos documents sont conformes.</li> <li>Tous vos documents sont conformes.</li>
</ul> </ul>
+16 -16
View File
@@ -3,7 +3,7 @@
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> <%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
<% <%
context._kwargs['postpone_js']=[] context._kwargs['postpone_js']=[]
DisplayYear = request.session.get('year', 2018) DisplayYear = request.session.get('year', 2020)
%> %>
<head> <head>
<title>JM2L ${DisplayYear}</title> <title>JM2L ${DisplayYear}</title>
@@ -68,12 +68,12 @@ ${helpers.uploader_js()}
% if request.user and request.user.vote_logo not in [1,2,3]: % if request.user and request.user.vote_logo not in [1,2,3]:
<div class="item active"> <div class="item active">
<div class="align-center"> <div class="align-center">
<H1>JM2L 2017</H1> <H1>JM2L 2020</H1>
<h3>Choisissez ici votre logo pr&eacute;f&eacute;r&eacute; !</h3> <h3>Choisissez ici votre logo préféré !</h3>
<p>Utilisez les flèches pour choisir et voter !<br> <p>Utilisez les flèches pour choisir et voter !<br>
Vous pouvez changer à tout moment, mais vous n'aurez droit qu'a un seul choix, le vôtre ;)</p> Vous pouvez changer à tout moment, mais vous n'aurez droit qu'a un seul choix, le vôtre ;)</p>
<p>Vous souhaitez proposer le vôtre ? <br> <p>Vous souhaitez proposer le vôtre ? <br>
N'h&eacute;sitez pas à envoyer vos propositions par mail à l'&eacute;quipe !</p> N'hésitez pas à envoyer vos propositions par mail à l'équipe !</p>
</div> </div>
</div> </div>
% endif % endif
@@ -105,10 +105,10 @@ ${helpers.uploader_js()}
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#"> <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
Édition&nbsp;<span class="caret"></span></a> Édition&nbsp;<span class="caret"></span></a>
<ul class="dropdown-menu pull-right" style="min-width:0"> <ul class="dropdown-menu pull-right" style="min-width:0">
% for tmpyear in range(2018, 2005, -1): % for tmpyear in range(2020, 2005, -1):
% if tmpyear==DisplayYear: % if tmpyear==DisplayYear:
<li><a style="font-weight: bold;" href="/year/${tmpyear}">${tmpyear}</a></li> <li><a style="font-weight: bold;" href="/year/${tmpyear}">${tmpyear}</a></li>
% elif tmpyear!=2014 and tmpyear!=2016: % elif tmpyear not in [2014, 2016, 2018, 2019]:
<li><a href="/year/${tmpyear}">${tmpyear}</a></li> <li><a href="/year/${tmpyear}">${tmpyear}</a></li>
% endif % endif
% endfor % endfor
@@ -128,17 +128,17 @@ ${helpers.uploader_js()}
% if request.user: % if request.user:
% if request.user.Staff: % if request.user.Staff:
<li><a href="/${DisplayYear}/Staff">Partie Staff</a></li> <li><a href="/${DisplayYear}/Staff">Partie Staff</a></li>
<li><a href="/${DisplayYear}/ListParticipant">G&eacute;rer les intervenants</a></li> <li><a href="/${DisplayYear}/ListParticipant">Gérer les intervenants</a></li>
<li><a href="/ListSalles">G&eacute;rer les salles</a></li> <li><a href="/ListSalles">Gérer les salles</a></li>
<li><a href="/entities">G&eacute;rer les entit&eacute;s</a></li> <li><a href="/entities">Gérer les entités</a></li>
<li><a href="/${DisplayYear}/ListOrga">Participations &agrave; l'orga</a></li> <li><a href="/${DisplayYear}/ListOrga">Participations &agrave; l'orga</a></li>
<li><a href="/${DisplayYear}/Staff/compta">Comptabilit&eacute;</a></li> <li><a href="/${DisplayYear}/Staff/compta">Comptabilité</a></li>
<li><a href="/ListSallesPhy">Les salles &agrave; Poly'tech</a></li> <li><a href="/ListSallesPhy">Les salles &agrave; Poly'tech</a></li>
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
% endif % endif
<li><a href="/MesJM2L">Mon profil</a></li> <li><a href="/MesJM2L">Mon profil</a></li>
<li><a href="/user/${request.user.slug}">Mon profil public</a></li> <li><a href="/user/${request.user.slug}">Mon profil public</a></li>
<li><a href="/sign/out">Me d&eacute;connecter</a></li> <li><a href="/sign/out">Me déconnecter</a></li>
% else: % else:
<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>
@@ -186,9 +186,9 @@ ${helpers.uploader_js()}
<footer class="footer"> <footer class="footer">
<div class="container"> <div class="container">
<h4>JM2L 2005-2018</h4> <h4>JM2L 2005-2020</h4>
<p> <p>
Concoct&eacute; par <a href="http://www.linux-azur.org/">Linux Azur</a> ~ Concocté par <a href="http://www.linux-azur.org/">Linux Azur</a> ~
<a href="http://creativecommons.org/licenses/by-sa/4.0/">CopyFriendly</a> <a href="http://creativecommons.org/licenses/by-sa/4.0/">CopyFriendly</a>
</p> </p>
<p> <p>
@@ -196,10 +196,10 @@ ${helpers.uploader_js()}
</p> </p>
<p> <p>
Conception et construction en <a href="http://git.linux-azur.org/JM2L/jm2l/src/master">DIY</a> ~ Conception et construction en <a href="http://git.linux-azur.org/JM2L/jm2l/src/master">DIY</a> ~
H&eacute;berg&eacute; 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> <p>
Vous avez trouv&eacute; un bug ? <a href="http://git.linux-azur.org/JM2L/jm2l/issues">Reportez-le ici</a> Vous avez trouvé un bug ? <a href="http://git.linux-azur.org/JM2L/jm2l/issues">Reportez-le ici</a>
</p> </p>
</div> </div>
</footer> </footer>
@@ -245,7 +245,7 @@ function handlevote() {
$('.carousel-vote a').attr('href', "/vote_logo/" + currentIndex ) $('.carousel-vote a').attr('href', "/vote_logo/" + currentIndex )
if (currentIndex==${request.user.vote_logo or 0}) { if (currentIndex==${request.user.vote_logo or 0}) {
$('.carousel-vote a').removeClass('btn-primary').addClass('btn-success') $('.carousel-vote a').removeClass('btn-primary').addClass('btn-success')
$('.carousel-vote a').html("<i class='icon-ok icon-white'></i> Mon pr&eacute;f&eacute;r&eacute; ! "); $('.carousel-vote a').html("<i class='icon-ok icon-white'></i> Mon préféré ! ");
} else { } else {
$('.carousel-vote a').removeClass('btn-success').addClass('btn-primary'); $('.carousel-vote a').removeClass('btn-success').addClass('btn-primary');
$('.carousel-vote a').html("<i class='icon-star icon-white'></i> Je vote pour ce logo ! "); $('.carousel-vote a').html("<i class='icon-star icon-white'></i> Je vote pour ce logo ! ");
+3 -3
View File
@@ -96,7 +96,7 @@ Voici ce qu'il y'a dans la liste des tâches qui te sont assignées:
% for t in sorted(User.task_assoc, key=lambda k:k.due_date): % for t in sorted(User.task_assoc, key=lambda k:k.due_date):
% if not t.closed: % if not t.closed:
<tr> <tr>
<td>${t.due_date.strftime('%d %B %Y').decode('utf-8', 'xmlcharrefreplace')}</td><td>${t.area.name}</td> <td>${t.due_date.strftime('%d %B %Y')}</td><td>${t.area.name}</td>
<td><a href="http://jm2l.linux-azur.org/2017/Staff/tasks/${t.uid}">${t.name}</a> <td><a href="http://jm2l.linux-azur.org/2017/Staff/tasks/${t.uid}">${t.name}</a>
% endif % endif
% endfor % endfor
@@ -107,7 +107,7 @@ Voici ce qu'il y'a dans la liste des tâches qui te sont assignées:
% for t in sorted(Contact.task_assoc, key=lambda k:k.due_date): % for t in sorted(Contact.task_assoc, key=lambda k:k.due_date):
% if not t.closed: % if not t.closed:
<tr> <tr>
<td>${t.due_date.strftime('%d %B %Y').decode('utf-8', 'xmlcharrefreplace')}</td><td>${t.area.name}</td> <td>${t.due_date.strftime('%d %B %Y')}</td><td>${t.area.name}</td>
<td><a href="http://jm2l.linux-azur.org/2017/Staff/tasks/${t.uid}">${t.name}</a> <td><a href="http://jm2l.linux-azur.org/2017/Staff/tasks/${t.uid}">${t.name}</a>
% endif % endif
% endfor % endfor
@@ -116,7 +116,7 @@ Voici ce qu'il y'a dans la liste des tâches qui te sont assignées:
Pour accéder à ton espace sur le site, il te suffit de cliquer sur le <a href="${request.route_url('bymail', hash=User.my_hash)}">lien suivant.</a> Pour accéder à ton espace sur le site, il te suffit de cliquer sur le <a href="${request.route_url('bymail', hash=User.my_hash)}">lien suivant.</a>
<br/><br/> <br/><br/>
% for t in filter(lambda k:k.uid==51, Contact.task_assoc): % for t in filter(lambda k:k.uid==51, Contact.task_assoc):
Nous avons fixé la prochaine réunion JM2L au ${t.due_date.strftime('%d %B').decode('utf-8', 'xmlcharrefreplace')} à 19h30. Nous avons fixé la prochaine réunion JM2L au ${t.due_date.strftime('%d %B')} à 19h30.
% endfor % endfor
<p> <p>
Bon courage ! Bon courage !
+3 -3
View File
@@ -65,7 +65,7 @@ Voici ce qu'il y'a dans la liste des tâches qui te sont assignées:
% for t in sorted(User.task_assoc, key=lambda k:k.due_date): % for t in sorted(User.task_assoc, key=lambda k:k.due_date):
% if not t.closed: % if not t.closed:
- Pour le ${t.due_date.strftime('%d %B %Y').decode('utf-8', 'xmlcharrefreplace')} - ${t.area.name} tâche ${t.uid} - Pour le ${t.due_date.strftime('%d %B %Y')} - ${t.area.name} tâche ${t.uid}
=> ${t.name} => ${t.name}
% endif % endif
@@ -75,7 +75,7 @@ Et il y'a aussi des tâches communes !
% for t in sorted(Contact.task_assoc, key=lambda k:k.due_date): % for t in sorted(Contact.task_assoc, key=lambda k:k.due_date):
% if not t.closed and t.uid!=51: % if not t.closed and t.uid!=51:
- Pour le ${t.due_date.strftime('%d %B %Y').decode('utf-8', 'xmlcharrefreplace')} - ${t.area.name} tâche ${t.uid} - Pour le ${t.due_date.strftime('%d %B %Y')} - ${t.area.name} tâche ${t.uid}
=> ${t.name} => ${t.name}
% endif % endif
@@ -85,7 +85,7 @@ Pour accéder à ton espace il te suffit de cliquer sur le lien suivant :
${request.route_url('bymail', hash=User.my_hash)}. ${request.route_url('bymail', hash=User.my_hash)}.
% for t in filter(lambda k:k.uid==51, Contact.task_assoc): % for t in filter(lambda k:k.uid==51, Contact.task_assoc):
Nous avons fixé la prochaine réunion JM2L au ${t.due_date.strftime('%d %B').decode('utf-8', 'xmlcharrefreplace')} à 19h30. Nous avons fixé la prochaine réunion JM2L au ${t.due_date.strftime('%d %B')} à 19h30.
% endfor % endfor
+1 -1
View File
@@ -52,7 +52,7 @@
</div> </div>
<br/> <br/>
<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')}</p>
</div> </div>
</div> </div>
+2 -2
View File
@@ -13,7 +13,7 @@
</div> </div>
<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')} -
${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')} ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
</div> </div>
% if event.for_year==CurrentYear and request.user and (request.user.Staff or request.user in event.intervenants): % if event.for_year==CurrentYear and request.user and (request.user.Staff or request.user in event.intervenants):
@@ -116,7 +116,7 @@
</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')}</p>
<br/> <br/>
<hr/> <hr/>
</div> </div>
+1 -1
View File
@@ -103,7 +103,7 @@ ${The_entity_type.entity_subtype}
</p> </p>
% endfor % endfor
<br/><br/> <br/><br/>
<p style="float:right;">Créé le ${entity.created.strftime('%d %b %Y').decode('utf-8')}</p> <p style="float:right;">Créé le ${entity.created.strftime('%d %b %Y')}</p>
<br/> <br/>
<hr/> <hr/>
+1 -1
View File
@@ -47,7 +47,7 @@
<h4>Ses interventions :</h4> <h4>Ses interventions :</h4>
${helpers.show_Interventions(DispUser.events)} ${helpers.show_Interventions(DispUser.events)}
% 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')}</p>
</div> </div>
</div> </div>
+4 -1
View File
@@ -1,6 +1,9 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from pyramid.response import Response from pyramid.response import Response
import cStringIO as StringIO try:
from StringIO import StringIO
except ImportError:
from io import StringIO
from pyramid.view import view_config from pyramid.view import view_config
from .models import DBSession, Event, Salles from .models import DBSession, Event, Salles
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
+12 -8
View File
@@ -9,7 +9,10 @@ from os import path
import mimetypes import mimetypes
import magic import magic
import subprocess import subprocess
import cStringIO as StringIO try:
from StringIO import StringIO
except ImportError:
from io import StringIO
# Database access imports # Database access imports
from .models import User, Place, Tiers, Event, SallePhy from .models import User, Place, Tiers, Event, SallePhy
from .blenderthumbnailer import blend_extract_thumb, write_png from .blenderthumbnailer import blend_extract_thumb, write_png
@@ -32,8 +35,6 @@ ACCEPTED_MIMES = ['application/pdf',
'application/x-blender' 'application/x-blender'
] ]
ACCEPT_FILE_TYPES = IMAGE_TYPES ACCEPT_FILE_TYPES = IMAGE_TYPES
THUMBNAIL_SIZE = 80 THUMBNAIL_SIZE = 80
EXPIRATION_TIME = 300 # seconds EXPIRATION_TIME = 300 # seconds
@@ -45,6 +46,7 @@ DELETEMETHOD="DELETE"
mimetypes.init() mimetypes.init()
class MediaPath(): class MediaPath():
def get_all(self, media_table, linked_id, MediaType=None): def get_all(self, media_table, linked_id, MediaType=None):
@@ -73,7 +75,6 @@ class MediaPath():
filelist.append((ress_url, thumb_url)) filelist.append((ress_url, thumb_url))
return filelist return filelist
def get_list(self, media_table, linked_id, MediaType=None): def get_list(self, media_table, linked_id, MediaType=None):
filelist = list() filelist = list()
curpath = self.get_mediapath(media_table, linked_id, None) curpath = self.get_mediapath(media_table, linked_id, None)
@@ -191,7 +192,7 @@ class MediaPath():
if not os.path.isdir(os.path.dirname(TargetPath)): if not os.path.isdir(os.path.dirname(TargetPath)):
try: try:
os.makedirs(os.path.dirname(TargetPath)) os.makedirs(os.path.dirname(TargetPath))
except OSError, e: except OSError as e:
if e.errno != 17: if e.errno != 17:
raise e raise e
return os.path.join('jm2l/upload', *p) return os.path.join('jm2l/upload', *p)
@@ -217,12 +218,12 @@ class MediaPath():
fileobj.seek(0) fileobj.seek(0)
# Check if the binary file is a blender file # Check if the binary file is a blender file
if ( mimetype == "application/octet-stream" or mimetype == "application/x-gzip" ) and self.check_blend_file(fileobj): if (mimetype == "application/octet-stream" or mimetype == "application/x-gzip") and self.check_blend_file(
fileobj):
return "application/x-blender", True return "application/x-blender", True
else: else:
return mimetype, False return mimetype, False
def get_mimetype(self, name): def get_mimetype(self, name):
""" This function return the mime-type based on .type file """ """ This function return the mime-type based on .type file """
try: try:
@@ -232,6 +233,7 @@ class MediaPath():
except IOError: except IOError:
return None return None
@view_defaults(route_name='media_upload') @view_defaults(route_name='media_upload')
class MediaUpload(MediaPath): class MediaUpload(MediaPath):
@@ -378,8 +380,9 @@ class MediaUpload(MediaPath):
('Impress', 'odp'), ('Impress', 'odp'),
('Calc', 'ods'), ('Calc', 'ods'),
('Draw', 'odg')] ('Draw', 'odg')]
stampfilename = filter(lambda (x,y): ext.endswith(y), istamp) stampfilename = filter(lambda x, y: ext.endswith(y), istamp)
stamp = Image.open("jm2l/static/img/%s-icon.png" % stampfilename[0][0]) stamp = Image.open("jm2l/static/img/%s-icon.png" % stampfilename[0][0])
timage = Image.new('RGBA', (THUMBNAIL_SIZE, THUMBNAIL_SIZE), (255, 255, 255, 0)) timage = Image.new('RGBA', (THUMBNAIL_SIZE, THUMBNAIL_SIZE), (255, 255, 255, 0))
# Add thumbnail # Add thumbnail
timage.paste( timage.paste(
@@ -570,6 +573,7 @@ class MediaUpload(MediaPath):
results.append(result) results.append(result)
return {"files": results} return {"files": results}
@view_defaults(route_name='media_view') @view_defaults(route_name='media_view')
class MediaView(MediaPath): class MediaView(MediaPath):
+113 -44
View File
@@ -22,11 +22,14 @@ from icalendar import Calendar
from pytz import timezone from pytz import timezone
from icalendar import Event as Evt from icalendar import Event as Evt
from pyramid_mailer.message import Message from pyramid_mailer.message import Message
from security import check_staff, check_logged from .security import check_staff, check_logged
# Then, standard libs # Then, standard libs
import csv import csv
import cStringIO as StringIO try:
import webhelpers.paginate as paginate from StringIO import StringIO
except ImportError:
from io import StringIO
import paginate
import unicodedata import unicodedata
import datetime import datetime
import re import re
@@ -36,6 +39,7 @@ from jm2l.const import CurrentYear
from passlib.hash import argon2 from passlib.hash import argon2
## =-=- Here, We keep some usefull function -=-= ## =-=- Here, We keep some usefull function -=-=
def remove_accents(input_str): def remove_accents(input_str):
""" This function is intended to remove all accent from input unicode string """ """ This function is intended to remove all accent from input unicode string """
@@ -43,6 +47,7 @@ def remove_accents(input_str):
only_ascii = nkfd_form.encode('ASCII', 'ignore') only_ascii = nkfd_form.encode('ASCII', 'ignore')
return only_ascii return only_ascii
def embeed_video(mime_type, link): def embeed_video(mime_type, link):
Container = "<video controls='controls' preload='metadata' style='width:60%'>" Container = "<video controls='controls' preload='metadata' style='width:60%'>"
Container += "<source type='%s' " % mime_type Container += "<source type='%s' " % mime_type
@@ -63,6 +68,7 @@ def Live(request):
.order_by(Event.start_time) .order_by(Event.start_time)
return {'year': year, "DisplayYear": year, 'events': Events, "logged_in": request.authenticated_userid} return {'year': year, "DisplayYear": year, 'events': Events, "logged_in": request.authenticated_userid}
## =-=- Here, We handle ICal requests -=-= ## =-=- Here, We handle ICal requests -=-=
@view_config(route_name='progr_iCal', renderer="string") @view_config(route_name='progr_iCal', renderer="string")
def ICal_Progamme_Request(request): def ICal_Progamme_Request(request):
@@ -103,6 +109,7 @@ def ICal_Progamme_Request(request):
request.response.content_type = "text/calendar" request.response.content_type = "text/calendar"
return cal.to_ical() return cal.to_ical()
## =-=- Here, We handle ICal requests -=-= ## =-=- Here, We handle ICal requests -=-=
@view_config(route_name='progr_dyn_iCal', renderer="string") @view_config(route_name='progr_dyn_iCal', renderer="string")
def ICal_Progamme_Dyn_Request(request): def ICal_Progamme_Dyn_Request(request):
@@ -147,10 +154,13 @@ def ICal_Progamme_Dyn_Request(request):
event = Evt() event = Evt()
event['uid'] = "%d/%d" % (year, ev.uid) event['uid'] = "%d/%d" % (year, ev.uid)
event.add('summary', ev.name) event.add('summary', ev.name)
event.add('dtstart', ev.start_time.replace(tzinfo=tz, day=today.day, month = today.month, hour=(ev.start_time.hour)%24 ) ) event.add('dtstart', ev.start_time.replace(tzinfo=tz, day=today.day, month=today.month,
event.add('dtend', ev.end_time.replace(tzinfo=tz, day=today.day, month = today.month, hour=(ev.end_time.hour)%24 ) ) hour=(ev.start_time.hour) % 24))
event.add('dtend',
ev.end_time.replace(tzinfo=tz, day=today.day, month=today.month, hour=(ev.end_time.hour) % 24))
event.add('created', ev.last_change.replace(tzinfo=tz)) event.add('created', ev.last_change.replace(tzinfo=tz))
event.add('description', "http://jm2l.linux-azur.org:8080/%s.webm" % TabCorr.get(ev.Salle.phy_salle_id, ev.Salle.phy_salle_id) ) event.add('description', "http://jm2l.linux-azur.org:8080/%s.webm" % TabCorr.get(ev.Salle.phy_salle_id,
ev.Salle.phy_salle_id))
event.add('location', "http://jm2l.linux-azur.org/img/%d.gif" % ev.Salle.phy_salle_id) event.add('location', "http://jm2l.linux-azur.org/img/%d.gif" % ev.Salle.phy_salle_id)
event.add('url', "http://www.linux-azur.org/event/%s/%s" % (ev.for_year, ev.slug)) event.add('url', "http://www.linux-azur.org/event/%s/%s" % (ev.for_year, ev.slug))
event.add('priority', 5) event.add('priority', 5)
@@ -185,6 +195,7 @@ def JSON_User_Request(request):
return {"Results": ListMatchUser, "Total": records.item_count, return {"Results": ListMatchUser, "Total": records.item_count,
"logged_in": request.authenticated_userid} "logged_in": request.authenticated_userid}
@view_config(route_name='tiers_json', renderer="json") @view_config(route_name='tiers_json', renderer="json")
def JSON_Tiers_Request(request): def JSON_Tiers_Request(request):
""" Build a JSON answer with active users and pagination handling """ """ Build a JSON answer with active users and pagination handling """
@@ -210,6 +221,7 @@ def JSON_Tiers_Request(request):
return {"Results": ListMatchTiers, "Total": records.item_count, return {"Results": ListMatchTiers, "Total": records.item_count,
"logged_in": request.authenticated_userid} "logged_in": request.authenticated_userid}
@view_config(route_name='progr_json', renderer="json") @view_config(route_name='progr_json', renderer="json")
def JSON_Progamme_Request(request): def JSON_Progamme_Request(request):
year = int(request.matchdict.get('year', CurrentYear)) year = int(request.matchdict.get('year', CurrentYear))
@@ -242,10 +254,9 @@ def JSON_Progamme_Request(request):
}) })
DicResult[Day.day] = ListEv DicResult[Day.day] = ListEv
return {'all': DicResult} return {'all': DicResult}
@view_config(route_name='timeline_json', renderer="json") @view_config(route_name='timeline_json', renderer="json")
def JSON_TimeLine_Request(request): def JSON_TimeLine_Request(request):
year = int(request.matchdict.get('year', CurrentYear)) year = int(request.matchdict.get('year', CurrentYear))
@@ -389,6 +400,7 @@ def JSON_TimeLine_Request(request):
DicResult["date"] = ListEv DicResult["date"] = ListEv
return {'timeline': DicResult} return {'timeline': DicResult}
## =-=- 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):
@@ -424,6 +436,7 @@ def index_page(request):
ListPhotos = [] ListPhotos = []
return {'year': CurrentYear, 'content': content, 'edition': u"11<sup>ème</sup>", 'ListPhotos': ListPhotos} return {'year': CurrentYear, 'content': content, 'edition': u"11<sup>ème</sup>", 'ListPhotos': ListPhotos}
@view_config(route_name='edit_index', renderer="jm2l:templates/Staff/EditIndex.mako") @view_config(route_name='edit_index', renderer="jm2l:templates/Staff/EditIndex.mako")
def edit_index(request): def edit_index(request):
check_staff(request) check_staff(request)
@@ -437,6 +450,7 @@ def edit_index(request):
'form': form, 'DisplayYear': year} 'form': form, 'DisplayYear': year}
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")
def programme(request): def programme(request):
year = int(request.matchdict.get('year')) year = int(request.matchdict.get('year'))
@@ -453,12 +467,14 @@ def programme(request):
ListDay = [] ListDay = []
for day in Days: for day in Days:
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').decode('utf-8'), # .decode('utf-8'),
ListDay.append((RefDay.strftime('%A %d %b %Y'),
RefDay.strftime('%d'))) RefDay.strftime('%d')))
MainTab = {'programme': 'active', '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
@view_config(route_name='presse', renderer="jm2l:templates/Public/Presse.mako") @view_config(route_name='presse', renderer="jm2l:templates/Public/Presse.mako")
def static_presse(request): def static_presse(request):
year = int(request.matchdict.get('year', None)) year = int(request.matchdict.get('year', None))
@@ -466,6 +482,7 @@ def static_presse(request):
MainTab = {'presse': 'active', "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")
def edit_presse(request): def edit_presse(request):
check_staff(request) check_staff(request)
@@ -478,6 +495,7 @@ def edit_presse(request):
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):
session = request.session session = request.session
@@ -485,6 +503,7 @@ def static_plan(request):
MainTab = {'plan': 'active', "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 -=-=
@view_config(route_name='list_task', renderer='jm2l:templates/Staff/list.mako') @view_config(route_name='list_task', renderer='jm2l:templates/Staff/list.mako')
def list_view(request): def list_view(request):
@@ -624,6 +643,7 @@ def tasks(request):
return {'form': form, 'area': TmpTask.area and slugify(TmpTask.area.name) or '', 'year': year} return {'form': form, 'area': TmpTask.area and slugify(TmpTask.area.name) or '', 'year': year}
@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):
check_staff(request) check_staff(request)
@@ -648,6 +668,7 @@ def tasks_area(request):
return HTTPFound(location=request.route_url('list_task', year=year) + "#" + slugify(Pole.name)) return HTTPFound(location=request.route_url('list_task', year=year) + "#" + slugify(Pole.name))
return {'form': form, 'year': year} return {'form': form, 'year': year}
@view_config(route_name='action_task') @view_config(route_name='action_task')
def action_task(request): def action_task(request):
check_staff(request) check_staff(request)
@@ -668,6 +689,7 @@ def action_task(request):
DBSession.delete(Task) DBSession.delete(Task)
return HTTPFound(location=request.route_url('list_task', year=year) + "#" + slugify(Task.area.name)) return HTTPFound(location=request.route_url('list_task', year=year) + "#" + slugify(Task.area.name))
@view_config(route_name='action_task_area') @view_config(route_name='action_task_area')
def action_task_area(request): def action_task_area(request):
check_staff(request) check_staff(request)
@@ -682,6 +704,7 @@ def action_task_area(request):
DBSession.delete(Pole) DBSession.delete(Pole)
return HTTPFound(location=request.route_url('list_task', year=year)) return HTTPFound(location=request.route_url('list_task', year=year))
@view_config(route_name='list_salles', renderer='jm2l:templates/Salles/list.mako') @view_config(route_name='list_salles', renderer='jm2l:templates/Salles/list.mako')
def list_salles(request): def list_salles(request):
check_staff(request) check_staff(request)
@@ -715,7 +738,8 @@ def handle_salle(request):
else: else:
Salle = Salles() Salle = Salles()
form = SalleForm(request.POST, Salle, meta={'csrf_context': request.session}) form = SalleForm(request.POST, Salle, meta={'csrf_context': request.session})
form.year_uid.choices = map(tuple, DBSession.query(JM2L_Year.year_uid, JM2L_Year.year_uid).order_by(sa.desc(JM2L_Year.year_uid)).all()) form.year_uid.choices = map(tuple, DBSession.query(JM2L_Year.year_uid, JM2L_Year.year_uid).order_by(
sa.desc(JM2L_Year.year_uid)).all())
form.phy_salle_id.choices = map(tuple, DBSession.query(SallePhy.uid, SallePhy.name).all()) form.phy_salle_id.choices = map(tuple, DBSession.query(SallePhy.uid, SallePhy.name).all())
if request.method == 'POST' and form.validate(): if request.method == 'POST' and form.validate():
form.populate_obj(Salle) form.populate_obj(Salle)
@@ -726,6 +750,7 @@ def handle_salle(request):
return HTTPFound(location=request.route_url('list_salles')) return HTTPFound(location=request.route_url('list_salles'))
return {'form': form} return {'form': form}
@view_config(route_name='handle_salle_phy', renderer='jm2l:templates/Salles/salle_phy.mako') @view_config(route_name='handle_salle_phy', renderer='jm2l:templates/Salles/salle_phy.mako')
def handle_salle_phy(request): def handle_salle_phy(request):
check_staff(request) check_staff(request)
@@ -748,7 +773,7 @@ def handle_salle_phy(request):
if orig_slug and orig_slug != dest_slug: if orig_slug and orig_slug != dest_slug:
try: try:
mp = MediaPath().move_mediapath('salle', orig_slug, dest_slug) mp = MediaPath().move_mediapath('salle', orig_slug, dest_slug)
except RuntimeError, err: except RuntimeError as err:
request.session.flash(('error', u"Le nom de cette salle est déjà utilisé : " + err.message)) request.session.flash(('error', u"Le nom de cette salle est déjà utilisé : " + err.message))
return {'form': form} return {'form': form}
Salle.slug = slugify(Salle.name) Salle.slug = slugify(Salle.name)
@@ -760,6 +785,7 @@ def handle_salle_phy(request):
return HTTPFound(location=request.route_url('list_salles')) return HTTPFound(location=request.route_url('list_salles'))
return {'form': form} return {'form': form}
@view_config(route_name='action_salle') @view_config(route_name='action_salle')
def action_salle(request): def action_salle(request):
check_staff(request) check_staff(request)
@@ -773,6 +799,7 @@ def action_salle(request):
DBSession.delete(Salle) DBSession.delete(Salle)
return HTTPFound(location=request.route_url('list_salles')) return HTTPFound(location=request.route_url('list_salles'))
## =-=- Here, We handle HTTP requests - User Logged Part -=-= ## =-=- Here, We handle HTTP requests - User Logged Part -=-=
@view_config(route_name='exchange', renderer="jm2l:templates/Logistique/Logistique.mako") @view_config(route_name='exchange', renderer="jm2l:templates/Logistique/Logistique.mako")
def exchange(request): def exchange(request):
@@ -823,6 +850,7 @@ def exchange(request):
} }
return MainTab return MainTab
@view_config(route_name='miam') @view_config(route_name='miam')
def miam(request): def miam(request):
check_logged(request) check_logged(request)
@@ -901,6 +929,7 @@ def sejour(request):
return HTTPFound(location='/MesJM2L#Sejour') return HTTPFound(location='/MesJM2L#Sejour')
@view_config(route_name='orga') @view_config(route_name='orga')
def orga(request): def orga(request):
check_logged(request) check_logged(request)
@@ -929,7 +958,8 @@ def orga(request):
FicheSejour.orga_part = OrgaPart FicheSejour.orga_part = OrgaPart
if UpdateOrga: if UpdateOrga:
request.session.flash(('info',u'Vos modifications de participation à l\'organisation ont été pris en compte.')) request.session.flash(
('info', u'Vos modifications de participation à l\'organisation ont été pris en compte.'))
else: else:
request.session.flash(('info', u'\\o/ Votre participation à l\'organisation est enregistrée !')) request.session.flash(('info', u'\\o/ Votre participation à l\'organisation est enregistrée !'))
@@ -940,6 +970,7 @@ def orga(request):
return HTTPFound(location='/MesJM2L#Organisation') return HTTPFound(location='/MesJM2L#Organisation')
@view_config(route_name='vote_logo') @view_config(route_name='vote_logo')
def vote_logo(request): def vote_logo(request):
if request.user is None: if request.user is None:
@@ -959,6 +990,7 @@ def vote_logo(request):
return HTTPFound(location=come) return HTTPFound(location=come)
raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.')
@view_config(route_name='list_users_csv', renderer="string") @view_config(route_name='list_users_csv', renderer="string")
def list_users_csv(request): def list_users_csv(request):
check_staff(request) check_staff(request)
@@ -1013,6 +1045,7 @@ def list_users(request):
if (r[0] & 4 == 4): DicRepas["Soir"] += 1 if (r[0] & 4 == 4): DicRepas["Soir"] += 1
return {'Users': Data, 'UserEvent': User_Event, "DicRepas": DicRepas, "for_year": for_year} return {'Users': Data, 'UserEvent': User_Event, "DicRepas": DicRepas, "for_year": for_year}
@view_config(route_name='list_orga', renderer="jm2l:templates/Participant/list_orga.mako") @view_config(route_name='list_orga', renderer="jm2l:templates/Participant/list_orga.mako")
def list_orga(request): def list_orga(request):
check_staff(request) check_staff(request)
@@ -1023,6 +1056,7 @@ def list_orga(request):
.all() .all()
return {'Users': Data} return {'Users': Data}
@view_config(route_name='drop_sejour') @view_config(route_name='drop_sejour')
def drop_sejour(request): def drop_sejour(request):
if request.user is None: if request.user is None:
@@ -1038,6 +1072,7 @@ def drop_sejour(request):
raise HTTPNotFound() raise HTTPNotFound()
return HTTPFound(location='/MesJM2L#Sejour') 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:
@@ -1061,7 +1096,6 @@ def jm2l_page(request):
profil_form = ProfilForm(request.POST, profil, meta={'csrf_context': request.session}) profil_form = ProfilForm(request.POST, profil, meta={'csrf_context': request.session})
miam_form = MiamForm(request.POST, profil, meta={'csrf_context': request.session}) miam_form = MiamForm(request.POST, profil, meta={'csrf_context': request.session})
# Feed FicheSejour if any # Feed FicheSejour if any
FicheSejour = Sejour.by_user(profil.uid, CurrentYear) FicheSejour = Sejour.by_user(profil.uid, CurrentYear)
if FicheSejour: if FicheSejour:
@@ -1110,6 +1144,7 @@ def jm2l_page(request):
} }
return MainTab return MainTab
@view_config(route_name='modal', renderer="jm2l:templates/modals.mako") @view_config(route_name='modal', renderer="jm2l:templates/modals.mako")
def Modal(request): def Modal(request):
year = int(request.matchdict.get('year', None)) year = int(request.matchdict.get('year', None))
@@ -1241,7 +1276,8 @@ def Modal(request):
Exch.itin_id = Itinerary.itin_id Exch.itin_id = Itinerary.itin_id
if form._fields.has_key("Hour_start"): if form._fields.has_key("Hour_start"):
TargetTime = datetime.datetime.strptime('%d %d %d %s' % (year, int(Week), \ TargetTime = datetime.datetime.strptime('%d %d %d %s' % (year, int(Week), \
int(form.Day_start.data), form.Hour_start.data), "%Y %W %w %H:%M") int(form.Day_start.data),
form.Hour_start.data), "%Y %W %w %H:%M")
Exch.start_time = TargetTime Exch.start_time = TargetTime
elif form._fields.has_key("Day_start"): elif form._fields.has_key("Day_start"):
TargetTime = datetime.datetime.strptime('%d %d %d' % (year, int(Week), \ TargetTime = datetime.datetime.strptime('%d %d %d' % (year, int(Week), \
@@ -1250,7 +1286,8 @@ def Modal(request):
if form._fields.has_key("Hour_end"): if form._fields.has_key("Hour_end"):
TargetTime = datetime.datetime.strptime('%d %d %d %s' % (year, int(Week), \ TargetTime = datetime.datetime.strptime('%d %d %d %s' % (year, int(Week), \
int(form.Day_end.data), form.Hour_end.data), "%Y %W %w %H:%M") int(form.Day_end.data), form.Hour_end.data),
"%Y %W %w %H:%M")
Exch.end_time = TargetTime Exch.end_time = TargetTime
elif form._fields.has_key("Day_end"): elif form._fields.has_key("Day_end"):
TargetTime = datetime.datetime.strptime('%d %d %d' % (year, int(Week), \ TargetTime = datetime.datetime.strptime('%d %d %d' % (year, int(Week), \
@@ -1290,6 +1327,7 @@ def Modal(request):
'logged_in': request.authenticated_userid} 'logged_in': request.authenticated_userid}
return MainTab return MainTab
@view_config(route_name='participer', renderer="jm2l:templates/Participer.mako") @view_config(route_name='participer', renderer="jm2l:templates/Participer.mako")
def participer(request): def participer(request):
session = request.session session = request.session
@@ -1344,6 +1382,7 @@ def participer(request):
'logged_in': request.authenticated_userid} 'logged_in': request.authenticated_userid}
return MainTab return MainTab
@view_config(route_name='year') @view_config(route_name='year')
def change_year(request): def change_year(request):
year = int(request.matchdict.get('year', -1)) year = int(request.matchdict.get('year', -1))
@@ -1353,15 +1392,18 @@ def change_year(request):
return HTTPFound(location='/%s/' % year) return HTTPFound(location='/%s/' % year)
return HTTPFound(location=request.route_url('home', year='')) return HTTPFound(location=request.route_url('home', year=''))
@view_config(route_name='pict_user', renderer="jm2l:templates/Profil/pict_user.mako") @view_config(route_name='pict_user', renderer="jm2l:templates/Profil/pict_user.mako")
def pict_user(request): def pict_user(request):
return {"uprofil": request.user} return {"uprofil": request.user}
@view_config(route_name='pict_salle', renderer="jm2l:templates/Salles/pict_salle.mako") @view_config(route_name='pict_salle', renderer="jm2l:templates/Salles/pict_salle.mako")
def pict_salle(request): def pict_salle(request):
salle_id = int(request.matchdict.get('salle_id', -1)) salle_id = int(request.matchdict.get('salle_id', -1))
return {"Salles": Salles, "IdSalle": salle_id} return {"Salles": Salles, "IdSalle": salle_id}
@view_config(route_name='event', renderer="jm2l:templates/view_event.mako") @view_config(route_name='event', renderer="jm2l:templates/view_event.mako")
def show_event(request): def show_event(request):
year = int(request.matchdict.get('year', -1)) year = int(request.matchdict.get('year', -1))
@@ -1378,6 +1420,7 @@ def show_event(request):
'event': TheEvent, 'logged_in': request.authenticated_userid, "Salles": Salles} 'event': TheEvent, 'logged_in': request.authenticated_userid, "Salles": Salles}
return MainTab return MainTab
@view_config(route_name='link_event_user') @view_config(route_name='link_event_user')
def link_event_user(request): def link_event_user(request):
""" Get user and add it to current event """ """ Get user and add it to current event """
@@ -1392,7 +1435,8 @@ def link_event_user(request):
if not Exist: if not Exist:
request.session.flash(('error', u"Une erreur s'est produite lors de l'ajout de votre intervenant !")) 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='/', return HTTPFound(location=request.route_url('edit_event', sep='/',
year=str(year), intervention=intervention, event_id=str(TargetEvent.uid))) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid)))
else: else:
TargetUser = Exist TargetUser = Exist
@@ -1400,7 +1444,8 @@ def link_event_user(request):
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, event_id=str(TargetEvent.uid))) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid)))
@view_config(route_name='link_event_tiers') @view_config(route_name='link_event_tiers')
@@ -1417,11 +1462,11 @@ def link_event_tiers(request):
if not Exist: if not Exist:
request.session.flash(('error', u"Une erreur s'est produite lors de l'ajout de votre entité !")) request.session.flash(('error', u"Une erreur s'est produite lors de l'ajout de votre entité !"))
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(TargetEvent.uid))) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid)))
else: else:
TargetTiers = Exist TargetTiers = Exist
Matching = DBSession.query(Role_Tiers) \ Matching = DBSession.query(Role_Tiers) \
.filter(Role_Tiers.year_uid == year) \ .filter(Role_Tiers.year_uid == year) \
.filter(Role_Tiers.tiers_role == "Exposant") \ .filter(Role_Tiers.tiers_role == "Exposant") \
@@ -1434,7 +1479,9 @@ def link_event_tiers(request):
DBSession.add(tev) DBSession.add(tev)
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(TargetEvent.uid), _anchor="Tiers")) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid), _anchor="Tiers"))
@view_config(route_name='delete_link_u') @view_config(route_name='delete_link_u')
def delete_link_event_user(request): def delete_link_event_user(request):
@@ -1450,7 +1497,8 @@ def delete_link_event_user(request):
if not Exist: if not Exist:
request.session.flash(('error', u"Une erreur s'est produite lors de votre suppression !")) request.session.flash(('error', u"Une erreur s'est produite lors de votre suppression !"))
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(TargetEvent.uid))) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid)))
else: else:
TargetUser = Exist TargetUser = Exist
@@ -1467,8 +1515,8 @@ def delete_link_event_user(request):
DBSession.delete(item) DBSession.delete(item)
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(TargetEvent.uid), _anchor="Tiers")) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid), _anchor="Tiers"))
@view_config(route_name='delete_link_t') @view_config(route_name='delete_link_t')
@@ -1485,7 +1533,8 @@ def delete_link_event_tiers(request):
if not Exist: if not Exist:
request.session.flash(('error', u"Une erreur s'est produite lors de l'ajout de votre entité !")) request.session.flash(('error', u"Une erreur s'est produite lors de l'ajout de votre entité !"))
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(TargetEvent.uid))) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid)))
else: else:
TargetTiers = Exist TargetTiers = Exist
@@ -1503,7 +1552,9 @@ def delete_link_event_tiers(request):
DBSession.delete(item) DBSession.delete(item)
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(TargetEvent.uid), _anchor="Tiers")) year=str(year), intervention=intervention,
event_id=str(TargetEvent.uid), _anchor="Tiers"))
@view_config(route_name='delete_event') @view_config(route_name='delete_event')
def delete_event(request): def delete_event(request):
@@ -1541,6 +1592,7 @@ def delete_event(request):
DBSession.delete(TheEvent) DBSession.delete(TheEvent)
return HTTPFound(location=request.route_url('jm2l', _anchor="Interventions")) return HTTPFound(location=request.route_url('jm2l', _anchor="Interventions"))
@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):
if request.user is None: if request.user is None:
@@ -1654,19 +1706,19 @@ def edit_event(request):
elif intervention == "Atelier": elif intervention == "Atelier":
form.duration.choices = map(lambda d: (d, u'Atelier (%dh%.2d)' % (d / 60, d % 60)), \ form.duration.choices = map(lambda d: (d, u'Atelier (%dh%.2d)' % (d / 60, d % 60)), \
[60, 90, 120, 150, 180, 210, 240]) [60, 90, 120, 150, 180, 210, 240])
if not duration in map(lambda (d,y): d, form.duration.choices): if not duration in map(lambda d, y: d, form.duration.choices):
form.duration.choices.append((duration, u'Atelier (%dh%.2d)' % (duration / 60, duration % 60))) form.duration.choices.append((duration, u'Atelier (%dh%.2d)' % (duration / 60, duration % 60)))
SalleDispo = SalleDispo.filter(Salles.place_type.in_(['Atelier', 'MAO'])) SalleDispo = SalleDispo.filter(Salles.place_type.in_(['Atelier', 'MAO']))
elif intervention == "Table_ronde": elif intervention == "Table_ronde":
form.duration.choices = map(lambda d: (d, u'Table ronde (%dh%.2d)' % (d / 60, d % 60)), \ form.duration.choices = map(lambda d: (d, u'Table ronde (%dh%.2d)' % (d / 60, d % 60)), \
[60, 90, 120, 150]) [60, 90, 120, 150])
if not duration in map(lambda (d,y): d, form.duration.choices): if not duration in map(lambda d, y: d, form.duration.choices):
form.duration.choices.append((duration, u'Table ronde (%dh%.2d)' % (duration / 60, duration % 60))) form.duration.choices.append((duration, u'Table ronde (%dh%.2d)' % (duration / 60, duration % 60)))
SalleDispo = SalleDispo.filter(Salles.place_type == 'Table ronde') SalleDispo = SalleDispo.filter(Salles.place_type == 'Table ronde')
elif intervention == "Concert": elif intervention == "Concert":
form.duration.choices = map(lambda d: (d, u'Concert (%dh%.2d)' % (d / 60, d % 60)), \ form.duration.choices = map(lambda d: (d, u'Concert (%dh%.2d)' % (d / 60, d % 60)), \
[60, 90, 120, 150, 180, 210, 240]) [60, 90, 120, 150, 180, 210, 240])
if not duration in map(lambda (d,y): d, form.duration.choices): if not duration in map(lambda d, y: d, form.duration.choices):
form.duration.choices.append((duration, u'Concert (%dh%.2d)' % (duration / 60, duration % 60))) form.duration.choices.append((duration, u'Concert (%dh%.2d)' % (duration / 60, duration % 60)))
SalleDispo = SalleDispo.filter(Salles.place_type.in_(['Stand', 'MAO'])) SalleDispo = SalleDispo.filter(Salles.place_type.in_(['Stand', 'MAO']))
else: else:
@@ -1691,16 +1743,19 @@ 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',u'Votre intervention a été créee ! Vous pouvez la compléter à tout moment.')) request.session.flash(
('sucess', u'Votre intervention a été créee ! Vous pouvez la compléter à tout moment.'))
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:
if slugify(TheEvent.name) != TheEvent.slug: if slugify(TheEvent.name) != TheEvent.slug:
# We should move some file as slug have been changed # We should move some file as slug have been changed
# First we ensure there is no related event that already exist with that slug # First we ensure there is no related event that already exist with that slug
CheckEvent = Event.by_slug(unicode(slugify(TheEvent.name)), year) CheckEvent = Event.by_slug(unicode(slugify(TheEvent.name)), year)
if CheckEvent: if CheckEvent:
request.session.flash(('warning',u'Choisissez un autre titre pour votre évènement, il est en conflit avec un autre.')) request.session.flash(('warning',
u'Choisissez un autre titre pour votre évènement, il est en conflit avec un autre.'))
return {'event': TheEvent, 'form': form, 'formAdd': formAdd, 'formAddT': formAddT, 'Salles': Salles} return {'event': TheEvent, 'form': form, 'formAdd': formAdd, 'formAddT': formAddT, 'Salles': Salles}
else: else:
SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [str(year)] + [TheEvent.slug])) SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['event'] + [str(year)] + [TheEvent.slug]))
@@ -1715,7 +1770,8 @@ def edit_event(request):
DBSession.merge(TheEvent) DBSession.merge(TheEvent)
request.session.flash(('sucess', u'Votre intervention a été mis à jour !')) request.session.flash(('sucess', u'Votre intervention a été mis à jour !'))
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)))
MainTab = {'programme': '', 'presse': '', 'plan': '', 'participer': '', MainTab = {'programme': '', 'presse': '', 'plan': '', 'participer': '',
'event': TheEvent, 'form': form, 'formAdd': formAdd, 'formAddT': formAddT, 'event': TheEvent, 'form': form, 'formAdd': formAdd, 'formAddT': formAddT,
@@ -1723,6 +1779,7 @@ def edit_event(request):
return MainTab return MainTab
@view_config(route_name='entities', renderer="jm2l:templates/list_tiers.mako") @view_config(route_name='entities', renderer="jm2l:templates/list_tiers.mako")
def list_tiers(request): def list_tiers(request):
Entities = dict() Entities = dict()
@@ -1736,6 +1793,7 @@ def list_tiers(request):
'entities': Entities, 'logged_in': request.authenticated_userid} 'entities': Entities, 'logged_in': request.authenticated_userid}
return MainTab return MainTab
@view_config(route_name='show_entity', renderer="jm2l:templates/view_tiers.mako") @view_config(route_name='show_entity', renderer="jm2l:templates/view_tiers.mako")
def show_tiers(request): def show_tiers(request):
tiers_type = request.matchdict.get('tiers_type') tiers_type = request.matchdict.get('tiers_type')
@@ -1769,11 +1827,15 @@ def delete_tiers(request):
if TheTiers is None: if TheTiers is None:
raise HTTPNotFound() raise HTTPNotFound()
if len(TheTiers.membership) != 0: if len(TheTiers.membership) != 0:
request.session.flash(('error', u"Vous devez supprimer tous les membres liés avant la suppression d'une entité.")) request.session.flash(
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug, tiers_type=TheTiers.get_entity_type.slug_entity_type)) ('error', u"Vous devez supprimer tous les membres liés avant la suppression d'une entité."))
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug,
tiers_type=TheTiers.get_entity_type.slug_entity_type))
if len(TheTiers.membership) != 0: if len(TheTiers.membership) != 0:
request.session.flash(('error', u"Vous devez supprimer tous les roles liés avant la suppression d'une entité.")) request.session.flash(
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug, tiers_type=TheTiers.get_entity_type.slug_entity_type)) ('error', u"Vous devez supprimer tous les roles liés avant la suppression d'une entité."))
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug,
tiers_type=TheTiers.get_entity_type.slug_entity_type))
DBSession.delete(TheTiers) DBSession.delete(TheTiers)
request.session.flash(('info', u"L'entité a bien été supprimée")) request.session.flash(('info', u"L'entité a bien été supprimée"))
return HTTPFound(location=request.route_url('entities')) return HTTPFound(location=request.route_url('entities'))
@@ -1867,7 +1929,8 @@ def edit_tiers(request):
DBSession.add(TheTiers) DBSession.add(TheTiers)
DBSession.flush() DBSession.flush()
return HTTPFound(location=request.route_url('edit_entity', sep='/', return HTTPFound(location=request.route_url('edit_entity', sep='/',
entity_id=str(TheTiers.slug), tiers_type=TheTiers.get_entity_type.entity_type)) entity_id=str(TheTiers.slug),
tiers_type=TheTiers.get_entity_type.entity_type))
else: else:
if OriginalSlug != slugify(form.name.data): if OriginalSlug != slugify(form.name.data):
# We should move some file as slug have been changed # We should move some file as slug have been changed
@@ -1878,7 +1941,8 @@ def edit_tiers(request):
u'elle est en conflit avec une autre.')) u'elle est en conflit avec une autre.'))
DBSession.rollback() DBSession.rollback()
return HTTPFound(location=request.route_url('edit_entity', sep='/', return HTTPFound(location=request.route_url('edit_entity', sep='/',
entity_id=str(OriginalSlug), tiers_type=TheTiers.get_entity_type.entity_type)) entity_id=str(OriginalSlug),
tiers_type=TheTiers.get_entity_type.entity_type))
else: else:
TheTiers.slug = slugify(form.name.data) TheTiers.slug = slugify(form.name.data)
SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['tiers'] + [OriginalSlug])) SRCPath = path.join('jm2l/upload', *(IMAGEPATH + ['tiers'] + [OriginalSlug]))
@@ -1898,6 +1962,7 @@ def edit_tiers(request):
'logged_in': request.authenticated_userid} 'logged_in': request.authenticated_userid}
return MainTab return MainTab
@view_config(route_name='edit_entity_cat', renderer="jm2l:templates/edit_tiers_categ.mako") @view_config(route_name='edit_entity_cat', renderer="jm2l:templates/edit_tiers_categ.mako")
def edit_tiers_category(request): def edit_tiers_category(request):
if request.user is None: if request.user is None:
@@ -1910,15 +1975,15 @@ def edit_tiers_category(request):
RegExist = re.compile('collection\[(?P<slug>[\w-]+)\]\[(?P<num>\d+)\]\[(?P<id>\d+)\]') RegExist = re.compile('collection\[(?P<slug>[\w-]+)\]\[(?P<num>\d+)\]\[(?P<id>\d+)\]')
RegTitle = re.compile('collection\[(?P<slug>[\w-]+)\]\[title]') RegTitle = re.compile('collection\[(?P<slug>[\w-]+)\]\[title]')
RegNew = re.compile('collection\[(?P<slug>[\w-]+)\]\[(?P<num>\d+)\]\[id\]') RegNew = re.compile('collection\[(?P<slug>[\w-]+)\]\[(?P<num>\d+)\]\[id\]')
for key, value in request.POST.iteritems(): for key, value in request.POST.items():
regN = RegNew.match(key) regN = RegNew.match(key)
regT = RegTitle.match(key) regT = RegTitle.match(key)
reg = RegExist.match(key) reg = RegExist.match(key)
if reg: if reg:
if not DicResult.has_key(reg.group('slug')): if not reg.group('slug') in DicResult:
DicResult[reg.group('slug')] = dict() DicResult[reg.group('slug')] = dict()
if DicResult[reg.group('slug')].has_key('items'): if 'items' in DicResult[reg.group('slug')]:
DicResult[reg.group('slug')]['items'].append((int(reg.group('id')), value)) DicResult[reg.group('slug')]['items'].append((int(reg.group('id')), value))
else: else:
DicResult[reg.group('slug')]['items'] = [(int(reg.group('id')), value)] DicResult[reg.group('slug')]['items'] = [(int(reg.group('id')), value)]
@@ -1939,8 +2004,8 @@ def edit_tiers_category(request):
raise raise
for opt in DBSession.query(TiersOpt).all(): for opt in DBSession.query(TiersOpt).all():
if DicResult.has_key(opt.slug_entity_type): if opt.slug_entity_type in DicResult:
found = filter( lambda (x,y): opt.uid==x, found = filter(lambda x, y: opt.uid == x,
DicResult[opt.slug_entity_type].get('items', [])) DicResult[opt.slug_entity_type].get('items', []))
if not found: if not found:
ListChanges.append(('remove', opt.uid, opt.entity_type, opt.entity_subtype)) ListChanges.append(('remove', opt.uid, opt.entity_type, opt.entity_subtype))
@@ -1974,6 +2039,7 @@ def edit_tiers_category(request):
'logged_in': request.authenticated_userid, 'TiersOpt': TiersOpt} 'logged_in': request.authenticated_userid, 'TiersOpt': TiersOpt}
return MainTab return MainTab
@view_config(route_name='show_user', renderer="jm2l:templates/view_user.mako") @view_config(route_name='show_user', renderer="jm2l:templates/view_user.mako")
def show_user(request): def show_user(request):
user_slug = request.matchdict.get('user_slug', None) user_slug = request.matchdict.get('user_slug', None)
@@ -1987,6 +2053,7 @@ 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):
if request.user is None: if request.user is None:
@@ -2000,6 +2067,7 @@ def link_user_entity(request):
raise HTTPNotFound() raise HTTPNotFound()
return HTTPFound(location=request.route_url('edit_entity', uid=uid)) return HTTPFound(location=request.route_url('edit_entity', uid=uid))
# @view_config(route_name='link_role_entity') # @view_config(route_name='link_role_entity')
def link_role_entity(request): def link_role_entity(request):
if request.user is None: if request.user is None:
@@ -2013,6 +2081,7 @@ def link_role_entity(request):
raise HTTPNotFound() raise HTTPNotFound()
return HTTPFound(location=request.route_url('edit_entity', uid=uid)) return HTTPFound(location=request.route_url('edit_entity', uid=uid))
@forbidden_view_config() @forbidden_view_config()
def forbidden(reason, request): def forbidden(reason, request):
if 'ident' in reason.detail: if 'ident' in reason.detail:
@@ -2023,9 +2092,9 @@ def forbidden(reason, request):
return render_to_response('jm2l:templates/Errors/403.mako', {"reason": reason}, return render_to_response('jm2l:templates/Errors/403.mako', {"reason": reason},
request=request) request=request)
@notfound_view_config() @notfound_view_config()
def notfound(reason, request): def notfound(reason, request):
request.response.status = 404 request.response.status = 404
return render_to_response('jm2l:templates/Errors/404.mako', {"reason": reason}, return render_to_response('jm2l:templates/Errors/404.mako', {"reason": reason},
request=request) request=request)
+3 -2
View File
@@ -28,13 +28,14 @@ requires = [
'python-magic', 'python-magic',
'Pillow', 'Pillow',
'pyramid_exclog', 'pyramid_exclog',
'repoze.sendmail==4.1', 'repoze.sendmail',
'pyramid_mailer', 'pyramid_mailer',
'apscheduler', 'apscheduler',
'qrcode', 'qrcode',
'reportlab', 'reportlab',
'passlib', 'passlib',
'argon2_cffi' 'argon2_cffi',
'paginate'
] ]
setup(name='JM2L', setup(name='JM2L',