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