| @@ -26,6 +26,7 @@ import logging | |||||
| def add_renderer_globals(event): | def add_renderer_globals(event): | ||||
| event['mytrip'] = Sejour_helpers(event) | event['mytrip'] = Sejour_helpers(event) | ||||
| event['myorga'] = Orga_helpers(event) | event['myorga'] = Orga_helpers(event) | ||||
| event['SelectedYear'] = CurrentYear | |||||
| event['CurrentYear'] = CurrentYear | event['CurrentYear'] = CurrentYear | ||||
| #@sched.scheduled_job('cron', day_of_week='sun', hour=22, minute=07) | #@sched.scheduled_job('cron', day_of_week='sun', hour=22, minute=07) | ||||
| @@ -62,7 +63,8 @@ def mailer_tasks(config): | |||||
| def main(global_config, **settings): | def main(global_config, **settings): | ||||
| """ This function returns a Pyramid WSGI application. | """ This function returns a Pyramid WSGI application. | ||||
| """ | """ | ||||
| locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") | |||||
| #locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") | |||||
| locale.setlocale(locale.LC_ALL, "fr_FR.utf8") | |||||
| engine = engine_from_config(settings, 'sqlalchemy.') | engine = engine_from_config(settings, 'sqlalchemy.') | ||||
| DBSession.configure(bind=engine) | DBSession.configure(bind=engine) | ||||
| # Extract secrets from configuration file if any | # Extract secrets from configuration file if any | ||||
| @@ -1 +1 @@ | |||||
| CurrentYear = 2017 | |||||
| CurrentYear = 2018 | |||||
| @@ -189,7 +189,7 @@ class PlaceCreateForm(MyBaseForm): | |||||
| name = StringField('Nom Complet', [validators.Length(min=1, max=80)], | name = StringField('Nom Complet', [validators.Length(min=1, max=80)], | ||||
| filters=[strip_filter]) | filters=[strip_filter]) | ||||
| gps_coord = StringField(u'Coordonnées GPS', [validators.Length(max=30), | gps_coord = StringField(u'Coordonnées GPS', [validators.Length(max=30), | ||||
| validators.Regexp( "^[0-9]*\.?[0-9],[0-9]*\.?[0-9]+", | |||||
| validators.Regexp( "^[0-9]+\.?[0-9]+,[0-9]+\.?[0-9]+$", | |||||
| message=u"Le GPS devrait être sous la forme 43.6158372,7.0723401")], | message=u"Le GPS devrait être sous la forme 43.6158372,7.0723401")], | ||||
| filters=[strip_filter]) | filters=[strip_filter]) | ||||
| adresse = TextAreaField('Adresse', [validators.Length(max=100)], | adresse = TextAreaField('Adresse', [validators.Length(max=100)], | ||||
| @@ -42,11 +42,11 @@ class Sejour_helpers(DummySejour): | |||||
| return TabResult | return TabResult | ||||
| if self.Sejour: | if self.Sejour: | ||||
| ArrDate = datetime.strftime(self.Sejour.arrival_time,"%d %B %Y") | |||||
| DepDate = datetime.strftime(self.Sejour.depart_time,"%d %B %Y") | |||||
| 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') | |||||
| else: | else: | ||||
| ArrDate = datetime.strftime( self.CurrentEventYear.start_time,"%d %B %Y" ) | |||||
| DepDate = datetime.strftime( self.CurrentEventYear.end_time,"%d %B %Y" ) | |||||
| 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') | |||||
| for oneday in myDayRange: | for oneday in myDayRange: | ||||
| if arrival: | if arrival: | ||||
| @@ -55,7 +55,7 @@ class Sejour_helpers(DummySejour): | |||||
| TmpDay = self.CurrentEventYear.start_time + timedelta(days=oneday) | TmpDay = self.CurrentEventYear.start_time + timedelta(days=oneday) | ||||
| DayName = datetime.strftime(TmpDay,"%A") | DayName = datetime.strftime(TmpDay,"%A") | ||||
| DayNum = datetime.strftime(TmpDay,"%d/%m/%y") | DayNum = datetime.strftime(TmpDay,"%d/%m/%y") | ||||
| DayString = datetime.strftime(TmpDay,"%d %B %Y") | |||||
| DayString = datetime.strftime(TmpDay,"%d %B %Y").decode('utf-8') | |||||
| if arrival and ArrDate==DayString: | if arrival and ArrDate==DayString: | ||||
| TabResult.append((DayNum, DayName, 'selected="selected"')) | TabResult.append((DayNum, DayName, 'selected="selected"')) | ||||
| elif departure and DepDate==DayString: | elif departure and DepDate==DayString: | ||||
| @@ -102,7 +102,7 @@ class JM2L_Year(Base): | |||||
| .filter(JM2L_Year.start_time == | .filter(JM2L_Year.start_time == | ||||
| DBSession.query(func.max(JM2L_Year.start_time)) | DBSession.query(func.max(JM2L_Year.start_time)) | ||||
| ).one() | ).one() | ||||
| return last_record.start_time.strftime("%A %d %b %Y") | |||||
| return last_record.start_time.strftime("%A %d %b %Y").decode('utf-8') | |||||
| @property | @property | ||||
| def AvailableTimeSlots(self, TimeStep=30): | def AvailableTimeSlots(self, TimeStep=30): | ||||
| @@ -6,12 +6,13 @@ import time | |||||
| import lxml.etree as ET | import lxml.etree as ET | ||||
| from sqlalchemy import engine_from_config | from sqlalchemy import engine_from_config | ||||
| from sqlalchemy import create_engine | |||||
| from sqlalchemy import create_engine, MetaData, Table | |||||
| import unicodedata | import unicodedata | ||||
| import urllib | import urllib | ||||
| # Usefull tools | # Usefull tools | ||||
| from slugify import slugify | from slugify import slugify | ||||
| from sqlite3 import dbapi2 as sqlite | from sqlite3 import dbapi2 as sqlite | ||||
| import sqlite3 | |||||
| from os import path | from os import path | ||||
| from pyramid.paster import ( | from pyramid.paster import ( | ||||
| get_appsettings, | get_appsettings, | ||||
| @@ -19,7 +20,7 @@ from pyramid.paster import ( | |||||
| ) | ) | ||||
| from string import printable | from string import printable | ||||
| from random import choice | from random import choice | ||||
| from sqlalchemy import orm, or_ | |||||
| from jm2l.models import * | from jm2l.models import * | ||||
| from datetime import datetime | from datetime import datetime | ||||
| @@ -30,8 +31,139 @@ def usage(argv): | |||||
| '(example: "%s development.ini")' % (cmd, cmd)) | '(example: "%s development.ini")' % (cmd, cmd)) | ||||
| sys.exit(1) | sys.exit(1) | ||||
| def make_session(connection_string): | |||||
| engine = create_engine(connection_string, echo=False, convert_unicode=True) | |||||
| Session = sessionmaker(bind=engine) | |||||
| return Session(), engine | |||||
| def quick_mapper(table): | |||||
| Base = declarative_base() | |||||
| class GenericMapper(Base): | |||||
| __table__ = table | |||||
| return GenericMapper | |||||
| def pull_data(from_db, to_db, tables): | |||||
| source, sengine = make_session(from_db) | |||||
| smeta = MetaData(bind=sengine) | |||||
| destination, dengine = make_session(to_db) | |||||
| for table_name in tables: | |||||
| print 'Processing', table_name | |||||
| print 'Pulling schema from source server' | |||||
| table = Table(table_name, smeta, autoload=True) | |||||
| print 'Creating table on destination server' | |||||
| table.metadata.create_all(dengine) | |||||
| NewRecord = quick_mapper(table) | |||||
| columns = table.columns.keys() | |||||
| print 'Transferring records' | |||||
| for record in source.query(table).all(): | |||||
| data = dict( | |||||
| [(str(column), getattr(record, column)) for column in columns] | |||||
| ) | |||||
| if table_name=='salle': | |||||
| if data['place_type']=='Ateliers': | |||||
| data['place_type']='Atelier' | |||||
| if table_name=='events': | |||||
| if data['event_type']=='Concert': | |||||
| data['event_type']='MAO' | |||||
| try: | |||||
| destination.merge(NewRecord(**data)) | |||||
| except: | |||||
| print data | |||||
| pass | |||||
| print 'Committing changes' | |||||
| destination.commit() | |||||
| def main(argv=sys.argv): | def main(argv=sys.argv): | ||||
| connection_string = "sqlite:////home/tr4ck3ur/Dev/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 | |||||
| def main4(argv=sys.argv): | |||||
| import csv | |||||
| from sqlalchemy import func | |||||
| connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite" | |||||
| if 1: | |||||
| conn = sqlite3.connect("/home/tr4ck3ur/Dev/jm2l/JM2L.sqlite") | |||||
| c = conn.cursor() | |||||
| try: | |||||
| c.execute("ALTER TABLE users ADD COLUMN wifi_user VARCHAR(80);") | |||||
| c.execute("ALTER TABLE users ADD COLUMN wifi_pass VARCHAR(80);") | |||||
| except: | |||||
| pass # handle the error | |||||
| c.close() | |||||
| engine = create_engine(connection_string, echo=False, convert_unicode=True) | |||||
| DBSession.configure(bind=engine) | |||||
| with transaction.manager: | |||||
| f = open("/home/tr4ck3ur/Dev/jm2l/wifi-11-11-pass.csv", 'rt') | |||||
| try: | |||||
| reader = csv.reader(f) | |||||
| for row in reader: | |||||
| prenom, nom, w_user, w_pass = row | |||||
| slug = unicode( slugify(prenom +" "+nom) ) | |||||
| u = DBSession.query(User)\ | |||||
| .filter(User.slug==slug).first() | |||||
| if u: | |||||
| u.wifi_user = w_user | |||||
| u.wifi_pass = w_pass | |||||
| DBSession.merge(u) | |||||
| print row, u | |||||
| finally: | |||||
| f.close() | |||||
| if 0: | |||||
| p0, p1 = orm.aliased(User,name="p0"), orm.aliased(User ,name="p1") | |||||
| import pprint | |||||
| def main_3(argv=sys.argv): | |||||
| connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite" | |||||
| engine = create_engine(connection_string, echo=True, convert_unicode=True) | |||||
| DBSession.configure(bind=engine) | |||||
| p0, p1 = orm.aliased(User,name="p0"), orm.aliased(User ,name="p1") | |||||
| import pprint | |||||
| ## permtation | |||||
| with transaction.manager: | |||||
| Datas = DBSession.query(p0, p1)\ | |||||
| .filter(p0.slug==p1.slug)\ | |||||
| .filter(p0.uid!=p1.uid)\ | |||||
| .filter(p0.last_logged<p1.last_logged)\ | |||||
| .with_entities(p0.slug,p0.uid,p1.uid).all() | |||||
| for slug, idsrc, iddst in Datas: | |||||
| print slug | |||||
| # Events | |||||
| Events = DBSession.query(User_Event)\ | |||||
| .filter(User_Event.user_uid==idsrc) | |||||
| for uev in Events: | |||||
| uev.user_uid = iddst | |||||
| DBSession.merge(uev) | |||||
| DBSession.flush() | |||||
| UTiers = DBSession.query(User_Tiers)\ | |||||
| .filter(User_Tiers.user_uid==idsrc) | |||||
| for ut in UTiers: | |||||
| ut.user_uid=iddst | |||||
| DBSession.merge(ut) | |||||
| DBSession.flush() | |||||
| orig = DBSession.query(User).filter(User.uid==idsrc).one() | |||||
| DBSession.delete(orig) | |||||
| #User_Event.year_uid, Event.name | |||||
| #pprint.pprint( ) | |||||
| #pprint.pprint( DBSession.query( user_id | |||||
| def main_(argv=sys.argv): | |||||
| if len(argv) != 2: | if len(argv) != 2: | ||||
| usage(argv) | usage(argv) | ||||
| config_uri = argv[1] | config_uri = argv[1] | ||||
| @@ -40,7 +172,35 @@ def main(argv=sys.argv): | |||||
| engine = engine_from_config(settings, 'sqlalchemy.') | engine = engine_from_config(settings, 'sqlalchemy.') | ||||
| DBSession.configure(bind=engine) | DBSession.configure(bind=engine) | ||||
| Base.metadata.create_all(engine) | Base.metadata.create_all(engine) | ||||
| DBSession.flush() | |||||
| pull_data("sqlite:////home/tr4ck3ur/Dev/jm2l/PRD_JM2L.sqlite", | |||||
| "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite", | |||||
| ['users', | |||||
| 'staff_tasks_area', | |||||
| 'staff_tasks', | |||||
| 'user_event_link', | |||||
| 'jm2l_year', | |||||
| 'users', | |||||
| 'tiers_opt', | |||||
| 'tiers', | |||||
| 'role_tiers_link', | |||||
| 'user_tiers_link', | |||||
| 'medias', | |||||
| 'phy_salle', | |||||
| 'salle', | |||||
| 'place', | |||||
| 'itineraire', | |||||
| 'exchange_category', | |||||
| 'exchanges', | |||||
| 'sejour', | |||||
| 'events', | |||||
| 'entries' | |||||
| ]) | |||||
| def Initialize(): | |||||
| with transaction.manager: | with transaction.manager: | ||||
| admin = User(nom=u'jm2l', prenom=u'contact', | admin = User(nom=u'jm2l', prenom=u'contact', | ||||
| slug=u'contact jm2l', password=u'jm2l', | slug=u'contact jm2l', password=u'jm2l', | ||||
| @@ -1,11 +1,28 @@ | |||||
| # -*- coding: utf8 -*- | # -*- coding: utf8 -*- | ||||
| from pyramid.security import Allow, Everyone, Authenticated | from pyramid.security import Allow, Everyone, Authenticated | ||||
| from pyramid.httpexceptions import HTTPFound, HTTPNotFound, HTTPForbidden | |||||
| from pyramid.httpexceptions import HTTPBadRequest, HTTPUnauthorized | |||||
| USERS = { 1:'editor', | USERS = { 1:'editor', | ||||
| 'editor':'editor', | 'editor':'editor', | ||||
| 'viewer':'viewer'} | 'viewer':'viewer'} | ||||
| GROUPS = {'editor':['group:editors'], 1:['group:editors']} | GROUPS = {'editor':['group:editors'], 1:['group:editors']} | ||||
| def check_logged(request): | |||||
| """ This function is intended to raise an exception if the user is not logged""" | |||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| def check_staff(request): | |||||
| """ This function is intended to raise an exception if the user is not a Staff member""" | |||||
| check_logged(request) | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| def groupfinder(userid, request): | def groupfinder(userid, request): | ||||
| if userid in USERS: | if userid in USERS: | ||||
| return GROUPS.get(userid, []) | return GROUPS.get(userid, []) | ||||
| @@ -58,7 +58,7 @@ | |||||
| % if reason: | % if reason: | ||||
| <p>${reason}</p> | <p>${reason}</p> | ||||
| % else: | % else: | ||||
| <p>Vous n'êtes pas authentifié, ou n'avez pas les autorisations nécessaires.</p> | |||||
| <p>Vous n'êtes pas authentifié, ou n'avez pas les authorisations nécessaires.</p> | |||||
| % endif | % endif | ||||
| </body> | </body> | ||||
| </html> | </html> | ||||
| @@ -54,7 +54,7 @@ | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <img src="/img/error404.png" width="200px" /> | <img src="/img/error404.png" width="200px" /> | ||||
| <h1>Page non trouvée</h1> | |||||
| <h1>Page non trouvée</h1> | |||||
| % if reason: | % if reason: | ||||
| <p>${reason}</p> | <p>${reason}</p> | ||||
| % else: | % else: | ||||
| @@ -10,7 +10,7 @@ | |||||
| </thead> | </thead> | ||||
| <tbody> | <tbody> | ||||
| <tr> | <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') ): | % if len( request.user.year_events('Conference') ): | ||||
| % for evt in request.user.year_events('Conference'): | % for evt in request.user.year_events('Conference'): | ||||
| % endfor | % endfor | ||||
| @@ -106,11 +106,11 @@ elif Type=='T': | |||||
| %> | %> | ||||
| % if Type!='O': | % if Type!='O': | ||||
| <fieldset> | <fieldset> | ||||
| <legend class="lowshadow">Vos ${CurTitles} programmé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 = filter(lambda x:(x.event_type==CurEventType and x.for_year==CurrentYear), uprofil.events) | ||||
| HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) | HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) | ||||
| NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| %> | %> | ||||
| ${helpers.show_Interventions(Selection, "Sujet", NothingTitle )} | ${helpers.show_Interventions(Selection, "Sujet", NothingTitle )} | ||||
| </fieldset> | </fieldset> | ||||
| @@ -118,31 +118,31 @@ NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| % if Type=='C': | % if Type=='C': | ||||
| <p> | <p> | ||||
| <strong>Proposer une conférence / un lighting talk</strong><br/> | |||||
| <strong>Proposer une conférence / un lighting talk</strong><br/> | |||||
| <ul> | <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> | que vous souhaitez partager.</li> | ||||
| <li>Si vous êtes acteur d’un des sujets actuels qui menacent ou qui | <li>Si vous êtes acteur d’un des sujets actuels qui menacent ou qui | ||||
| promeuvent le logiciel libre.</li> | 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> | </ul> | ||||
| Nous serons heureux de vous écouter. | |||||
| Nous serons heureux de vous écouter. | |||||
| <br> | <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 | 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 | 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> | |||||
| Le but de ces conférences est double : | |||||
| communauté ou de vos propres expériences d’utilisateur quotidien. <br> | |||||
| Le but de ces conférences est double : | |||||
| <ul> | <ul> | ||||
| <li>donner confiance aux futurs utilisateurs de logiciels libres</li> | <li>donner confiance aux futurs utilisateurs de logiciels libres</li> | ||||
| <li>donner matière à réflexion aux auditrices et aux auditeurs expérimentés.</li> | |||||
| <li>donner matière à réflexion aux auditrices et aux auditeurs expérimentés.</li> | |||||
| </ul> | </ul> | ||||
| Les conférences ont un format défini de 5, 20, 50 ou 70 minutes, | |||||
| modulable à loisir entre présentation et questions. Vous aideriez l'équipe | |||||
| d'organisation en essayant au maximum de ne pas dépasser la durée que vous réservez. | |||||
| Dans tous les cas, 5 minutes supplémentaires vous sont attribuées pour | |||||
| la mise en place de votre conférence. | |||||
| Les conférences ont un format défini de 5, 20, 50 ou 70 minutes, | |||||
| modulable à loisir entre présentation et questions. Vous aideriez l'équipe | |||||
| d'organisation en essayant au maximum de ne pas dépasser la durée que vous réservez. | |||||
| Dans tous les cas, 5 minutes supplémentaires vous sont attribuées pour | |||||
| la mise en place de votre conférence. | |||||
| </p> | </p> | ||||
| % elif Type=='A': | % elif Type=='A': | ||||
| <p> | <p> | ||||
| @@ -154,10 +154,10 @@ NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| l’utilisation de Linux et des logiciels libres standards pour | l’utilisation de Linux et des logiciels libres standards pour | ||||
| une utilisation familiale : soyez les bienvenus. | une utilisation familiale : soyez les bienvenus. | ||||
| Les ateliers sont organisés dans des salles équipées en matériel | |||||
| informatique et en vidéo-projecteur. Afin de ne pas perdre de temps, | |||||
| Les ateliers sont organisés dans des salles équipées en matériel | |||||
| informatique et en vidéo-projecteur. Afin de ne pas perdre de temps, | |||||
| nous avons besoin de connaître les logiciels et installations | nous avons besoin de connaître les logiciels et installations | ||||
| spéciales à préparer avant la session de l’atelier. | |||||
| spéciales à préparer avant la session de l’atelier. | |||||
| </p> | </p> | ||||
| % endif | % endif | ||||
| @@ -172,8 +172,8 @@ NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| c'est celle où chacun apporte sa contribution. | c'est celle où chacun apporte sa contribution. | ||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| Dans ce genre d'évènement nous avons besoin de bras et de bonnes volontés. | |||||
| Vous pouvez nous aider en vous inscrivant en tant que "bénévole du jour" sur un | |||||
| Dans ce genre d'évènement nous avons besoin de bras et de bonnes volontés. | |||||
| Vous pouvez nous aider en vous inscrivant en tant que "bénévole du jour" sur un | |||||
| certains nombre de missions : | certains nombre de missions : | ||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| @@ -189,7 +189,7 @@ NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| % endfor | % endfor | ||||
| </ul> | </ul> | ||||
| <p> | <p> | ||||
| Avant l'évènement, et en fonction des cases cochés, les coordinateurs metterons à jour le planning et vous receverez les instructions par mail. | |||||
| Avant l'évènement, et en fonction des cases cochés, les coordinateurs metterons à jour le planning et vous receverez les instructions par mail. | |||||
| </p> | </p> | ||||
| <div class="span2 offset5"> | <div class="span2 offset5"> | ||||
| @@ -207,7 +207,7 @@ NothingTitle = u"Vous n'avez pas sollicité d'intervention %s." % CurEvent | |||||
| <% | <% | ||||
| Selection = filter(lambda x:(x.event_type==CurEventType and x.for_year!=CurrentYear), uprofil.events) | Selection = filter(lambda x:(x.event_type==CurEventType and x.for_year!=CurrentYear), uprofil.events) | ||||
| HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) | HeadHistTitle = u"L'historique de vos %s ( %d ) " % ( CurTitles, len(Selection) ) | ||||
| NothingTitle = u"Désolé, Il n'y a rien dans l'historique vous concernant." | |||||
| NothingTitle = u"Désolé, Il n'y a rien dans l'historique vous concernant." | |||||
| %> | %> | ||||
| ${helpers.show_Interventions(Selection, HeadHistTitle, NothingTitle )} | ${helpers.show_Interventions(Selection, HeadHistTitle, NothingTitle )} | ||||
| </fieldset> | </fieldset> | ||||
| @@ -17,24 +17,24 @@ | |||||
| <h3>Live JM2L</h3> | <h3>Live JM2L</h3> | ||||
| <p> | <p> | ||||
| Voici les liens vers les conférences Live: | |||||
| Voici les liens vers les conférences Live: | |||||
| <h4>En ce moment:</h4> | <h4>En ce moment:</h4> | ||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| % for ev in events: | % for ev in events: | ||||
| <a href="http://jm2l-bkp.linux-azur.org:8080/${ev.Salle.phy_salle_id}.webm" target="_blank"> Live Vidéo</a> - | |||||
| ## <a href="http://jm2l.linux-azur.org:8081/${ev.Salle.phy_salle_id}.webm" target="_blank"> Live Vidéo</a> - | |||||
| <a href="http://jm2l-bkp.linux-azur.org:8080/${ev.Salle.phy_salle_id}.webm" target="_blank"> Live Vidéo</a> - | |||||
| ## <a href="http://jm2l.linux-azur.org:8081/${ev.Salle.phy_salle_id}.webm" target="_blank"> Live Vidéo</a> - | |||||
| <a href="http://jm2l.linux-azur.org/event/${ev.for_year}/${ev.slug}"> ${ev.event_type} </a> - ${ev.name} | <a href="http://jm2l.linux-azur.org/event/${ev.for_year}/${ev.slug}"> ${ev.event_type} </a> - ${ev.name} | ||||
| </br> | </br> | ||||
| % endfor | % endfor | ||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| Réalisé avec le concours des admins réseau Polytech'Nice. Encore merci pour leur disponibilité .. <br/> | |||||
| Rechargez la page pour voir les évenements en cours en fonction de l'heure...<br/> | |||||
| Réalisé avec le concours des admins réseau Polytech'Nice. Encore merci pour leur disponibilité .. <br/> | |||||
| Rechargez la page pour voir les évenements en cours en fonction de l'heure...<br/> | |||||
| </p> | </p> | ||||
| <p> NB : si vous n'avez pas l'audio à travers votre navigateur...<br> | <p> NB : si vous n'avez pas l'audio à travers votre navigateur...<br> | ||||
| n'hésitez pas à mettre à contribution votre lecteur de vidéo préféré ( VLC, ffmpeg )<br> | |||||
| n'hésitez pas à mettre à contribution votre lecteur de vidéo préféré ( VLC, ffmpeg )<br> | |||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| Vous avez le droit de vous plaindre, c'est du Do It Yourself ;) | Vous avez le droit de vous plaindre, c'est du Do It Yourself ;) | ||||
| @@ -9,10 +9,10 @@ DicExch = Exchanges.get_overview( request.user.uid ) | |||||
| <ul class="nav nav-tabs navbar" style="margin-bottom:0;background-color: #f7f7f7;"> | <ul class="nav nav-tabs navbar" style="margin-bottom:0;background-color: #f7f7f7;"> | ||||
| <li class="active"> <a href="#ResumeInt" data-toggle="tab">Resumé</a> </li> | <li class="active"> <a href="#ResumeInt" data-toggle="tab">Resumé</a> </li> | ||||
| <li> <a href="#Miam" data-toggle="tab">Miam</a> </li> | |||||
| <li> <a href="#Covoiturage" data-toggle="tab"><i class="icon-road"></i> Covoiturage</a> </li> | |||||
| <li> <a href="#Hebergement" data-toggle="tab"><i class="icon-home"></i> Hébergement</a> </li> | |||||
| <li> <a href="#Materiel" data-toggle="tab"><i class="icon-shopping-cart"></i> Matériel</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> | |||||
| </ul> | </ul> | ||||
| <div class="tab-content"> | <div class="tab-content"> | ||||
| @@ -30,7 +30,7 @@ DicExch = Exchanges.get_overview( request.user.uid ) | |||||
| ${tables.DoTable(Type, 'Ask', DicExch)} | ${tables.DoTable(Type, 'Ask', DicExch)} | ||||
| ${tables.DoTable(Type, 'Proposal', DicExch)} | ${tables.DoTable(Type, 'Proposal', DicExch)} | ||||
| <fieldset> | <fieldset> | ||||
| <legend>Tous les échanges</legend> | |||||
| <legend>Tous les échanges</legend> | |||||
| ${Missing(Type, DicExch['Missing'])} | ${Missing(Type, DicExch['Missing'])} | ||||
| </fieldset> | </fieldset> | ||||
| </%def> | </%def> | ||||
| @@ -59,23 +59,23 @@ DicForm = { | |||||
| </td> | </td> | ||||
| <td> | <td> | ||||
| <p> | <p> | ||||
| Complé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> | </p> | ||||
| <u>Vendredi soir :</u> | <u>Vendredi soir :</u> | ||||
| <p> | <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> | <a href="http://groupelacasa.com/la-carte-et-les-menus-1-2-75"> La carte CASA </a> | ||||
| le vendredi soir autour d'un verre et d'un bon repas ! | le vendredi soir autour d'un verre et d'un bon repas ! | ||||
| </p> | </p> | ||||
| <u>Samedi Midi :</u> | <u>Samedi Midi :</u> | ||||
| <p> | <p> | ||||
| À 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> | </p> | ||||
| <u>Samedi Soir :</u> | <u>Samedi Soir :</u> | ||||
| <p> | <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 /> | Nous vous proposons de nous retrouver à Antibes au restaurant Les Tonnelles<br /> | ||||
| <a href="https://fr-fr.facebook.com/lestonnellesantibes/?_fb_noscript=1"> Les Tonnelles </a> | <a href="https://fr-fr.facebook.com/lestonnellesantibes/?_fb_noscript=1"> Les Tonnelles </a> | ||||
| </p> | </p> | ||||
| @@ -100,7 +100,7 @@ elif Type=='M': | |||||
| <thead> | <thead> | ||||
| <tr> | <tr> | ||||
| <th colspan="5"> | <th colspan="5"> | ||||
| Les échanges ${CurTitle} | |||||
| Les échanges ${CurTitle} | |||||
| % if 0: | % if 0: | ||||
| <span style="float:right;"> | <span style="float:right;"> | ||||
| <a data-original-title="Afficher les demandes" data-toggle="tooltip" id="${Type}_Demande"> | <a data-original-title="Afficher les demandes" data-toggle="tooltip" id="${Type}_Demande"> | ||||
| @@ -124,7 +124,7 @@ elif Type=='M': | |||||
| <tr> | <tr> | ||||
| <th style="width:1em;"></th> | <th style="width:1em;"></th> | ||||
| <th>Détails</th> | |||||
| <th>Détails</th> | |||||
| <th style="width:1em;"></th> | <th style="width:1em;"></th> | ||||
| <tr> | <tr> | ||||
| </thead> | </thead> | ||||
| @@ -132,7 +132,7 @@ elif Type=='M': | |||||
| % if len(Selection)==0: | % if len(Selection)==0: | ||||
| <tr> | <tr> | ||||
| <td colspan="5" style="text-align:center;"> | <td colspan="5" style="text-align:center;"> | ||||
| <i>Il n'y a aucun échange ${CurTitle} proposé actuellement...</i> | |||||
| <i>Il n'y a aucun échange ${CurTitle} proposé actuellement...</i> | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| % else: | % else: | ||||
| @@ -284,7 +284,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||||
| </div> | </div> | ||||
| <div class="accordion-group"> | <div class="accordion-group"> | ||||
| <div class="accordion-heading"> | <div class="accordion-heading"> | ||||
| <a class="accordion-toggle" data-toggle="collapse" data-parent="#AccordionCounter" href="#collapseAll">Les compteur 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> | ||||
| <div id="collapseAll" class="accordion-body collapse"> | <div id="collapseAll" class="accordion-body collapse"> | ||||
| <div class="accordion-inner"> | <div class="accordion-inner"> | ||||
| @@ -338,7 +338,7 @@ ListWrap = ["Co-voiturage",u"Hébergement","Matos"] | |||||
| <p> | <p> | ||||
| Rendez-vous à l'accueil pour retirer votre badge ! | Rendez-vous à l'accueil pour retirer votre badge ! | ||||
| <br> | <br> | ||||
| Pour que tout se passe pour le mieux dans l'organisation de l'événement, nous vous invitons à : | |||||
| Pour que tout se passe pour le mieux dans l'organisation de l'événement, nous vous invitons à : | |||||
| <ul> | <ul> | ||||
| <li>Renseigner et valider vos horaires d'arrivée / de départ dans la section "Mon Séjour".</li> | <li>Renseigner et valider vos horaires d'arrivée / de départ dans la section "Mon Séjour".</li> | ||||
| <li>Procéder à la réservation de vos repas dans la section "Miam" !</li> | <li>Procéder à la réservation de vos repas dans la section "Miam" !</li> | ||||
| @@ -2,7 +2,7 @@ | |||||
| <%def name="jsAddOn()"> | <%def name="jsAddOn()"> | ||||
| <script src="/vendor/timeline/js/timeline-src.js"></script> | <script src="/vendor/timeline/js/timeline-src.js"></script> | ||||
| <script> | <script> | ||||
| var timeline = new VMM.Timeline("timeline", '95%', '500px'); | |||||
| var timeline = new VMM.Timeline("timeline", '95%', '600px'); | |||||
| var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}}; | var c = {language:{ lang:"fr",api:{wikipedia:"fr"},date:{month:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],month_abbr:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","dec."],day:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],day_abbr:["Dim.","Lu.","Ma.","Me.","Jeu.","Vend.","Sam."]},dateformats:{year:"yyyy",month_short:"mmm",month:"mmmm yyyy",full_short:"d mmm",full:"d mmmm yyyy",time_short:"HH:MM:SS",time_no_seconds_short:"HH:MM",time_no_seconds_small_date:"HH:MM'<br/><small>'d mmmm yyyy'</small>'",full_long:"dddd',' d mmm yyyy 'à' HH:MM",full_long_small_date:"HH:MM'<br/><small>'dddd',' d mmm yyyy'</small>'"},messages:{loading_timeline:"Chargement de la frise en cours... ",return_to_title:"Retour à la page d'accueil",expand_timeline:"Elargir la frise",contract_timeline:"Réduire la frise",wikipedia:"Extrait de Wikipedia, l'encyclopédie libre",loading_content:"Chargement",loading:"Chargement",swipe_nav:"Swipe to Navigate"}}}; | ||||
| timeline.init(c, "/${year}/timeline-json"); | timeline.init(c, "/${year}/timeline-json"); | ||||
| </script> | </script> | ||||
| @@ -23,12 +23,12 @@ | |||||
| <% | <% | ||||
| DicFormA = { | DicFormA = { | ||||
| 'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False}, | 'nom': {'PlaceHolder':u"Mon Nom", 'ContainerClass':"span6", 'next':False}, | ||||
| 'prenom': {'PlaceHolder':u"Mon Prénom", 'ContainerClass':"span6", 'next':True}, | |||||
| 'prenom': {'PlaceHolder':u"Mon Prénom", 'ContainerClass':"span6", 'next':True}, | |||||
| 'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False}, | 'pseudo': {'PlaceHolder':u"Mon Pseudo", 'ContainerClass':"span6", 'next':False}, | ||||
| 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True}, | 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", 'ContainerClass':"span6", 'next':True}, | ||||
| 'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False}, | 'phone': {'PlaceHolder':u"0612345678", 'ContainerClass':"span6", 'next':False}, | ||||
| 'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True}, | 'website': {'PlaceHolder':u"http://ma-page-web.moi",'ContainerClass':"span6", 'next':True}, | ||||
| 'gpg_key': {'PlaceHolder':u"Ma clé gpg", 'ContainerClass':"span6", 'next':False}, | |||||
| 'gpg_key': {'PlaceHolder':u"Ma clé gpg", 'ContainerClass':"span6", 'next':False}, | |||||
| 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True}, | 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org",'ContainerClass':"span6", 'next':True}, | ||||
| 'bio': {'Ignore':True}, | 'bio': {'Ignore':True}, | ||||
| 'tiersship': {'Ignore':True}, | 'tiersship': {'Ignore':True}, | ||||
| @@ -52,12 +52,12 @@ DicFormB = { | |||||
| DicForm2 = { | DicForm2 = { | ||||
| 'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | 'nom': {'PlaceHolder':u"Mon Nom", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | ||||
| 'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"}, | |||||
| 'prenom': {'PlaceHolder':u"Mon Prénom", "FieldStyle":"width:16em;"}, | |||||
| 'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | 'pseudo': {'PlaceHolder':u"Mon Pseudo", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | ||||
| 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", "FieldStyle":"width:16em;"}, | 'mail': {'PlaceHolder':u"mon.mail@fqdn.tld", "FieldStyle":"width:16em;"}, | ||||
| 'phone': {'PlaceHolder':u"0612345678", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | 'phone': {'PlaceHolder':u"0612345678", "FieldStyle":"width:16em;", 'ContainerStyle':"float:left;"}, | ||||
| 'website': {'PlaceHolder':u"http://ma-page-web.moi","FieldStyle":"width:16em;"}, | 'website': {'PlaceHolder':u"http://ma-page-web.moi","FieldStyle":"width:16em;"}, | ||||
| 'gpg_key': {'PlaceHolder':u"Ma clé gpg", "FieldStyle":"width:90%;"}, | |||||
| 'gpg_key': {'PlaceHolder':u"Ma clé gpg", "FieldStyle":"width:90%;"}, | |||||
| 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org","FieldStyle":"width:90%;"}, | 'soc_link':{'PlaceHolder':u"#jm2l sur irc.freenode.org","FieldStyle":"width:90%;"}, | ||||
| 'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 }, | 'bio': {'PlaceHolder':u"Ma Bilibiographie", "FieldStyle":"width:95%;min-height:150px;", "fieldset":True, "ckeditor":1 }, | ||||
| 'tiersship': {'Ignore':True} | 'tiersship': {'Ignore':True} | ||||
| @@ -84,7 +84,7 @@ DicForm2 = { | |||||
| <dt>Vos identifiants:</dt> | <dt>Vos identifiants:</dt> | ||||
| <dd>Nous n'avons pas encore l'information</dd> | <dd>Nous n'avons pas encore l'information</dd> | ||||
| </dl> | </dl> | ||||
| <a href="https://wifi.unice.fr/">Plus de détails ...</a> | |||||
| <a href="https://wifi.unice.fr/">Plus de détails ...</a> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -92,21 +92,21 @@ DicForm2 = { | |||||
| ${helpers.DisplayRespForm(profil_form, DicFormB)} | ${helpers.DisplayRespForm(profil_form, DicFormB)} | ||||
| <fieldset> | <fieldset> | ||||
| <legend>Activité</legend> | |||||
| <legend>Activité</legend> | |||||
| <div class="pull-right"> | <div class="pull-right"> | ||||
| <a href="/entities" class="add btn btn-block btn-mini btn-info"><i class="icon-list-alt icon-white"> </i> La Liste des entités </a> | |||||
| <a href="/entity" class="add btn btn-block btn-mini btn-primary"><i class="icon-plus-sign icon-white"> </i> Ajouter une entité </a> | |||||
| <a href="/entities" class="add btn btn-block btn-mini btn-info"><i class="icon-list-alt icon-white"> </i> La Liste des entités </a> | |||||
| <a href="/entity" class="add btn btn-block btn-mini btn-primary"><i class="icon-plus-sign icon-white"> </i> Ajouter une entité </a> | |||||
| </div> | </div> | ||||
| Saisissez ci-dessous les entités que vous souhaiter représenter pendant l'événement. | |||||
| Saisissez ci-dessous les entités que vous souhaiter représenter pendant l'événement. | |||||
| (Association, GULL, Entreprise, Logiciel, ...).<br> | (Association, GULL, Entreprise, Logiciel, ...).<br> | ||||
| Si elle n'existe pas dans la liste proposée, vous pouvez <a href="/entity"> en ajouter une. </a> | |||||
| Si elle n'existe pas dans la liste proposée, vous pouvez <a href="/entity"> en ajouter une. </a> | |||||
| <div class="repeat"> | <div class="repeat"> | ||||
| <table class="wrapper table" width="100%"> | <table class="wrapper table" width="100%"> | ||||
| <thead> | <thead> | ||||
| <tr class="row"> | <tr class="row"> | ||||
| <th style="width:4em;text-align:center;">Année</th> | |||||
| <th style="width:19em;text-align:center;">Entité</th> | |||||
| <th style="width:4em;text-align:center;">Année</th> | |||||
| <th style="width:19em;text-align:center;">Entité</th> | |||||
| <th style="text-align:center";>Rôle</th> | <th style="text-align:center";>Rôle</th> | ||||
| <th style="width:6em;text-align:center;">Action</th> | <th style="width:6em;text-align:center;">Action</th> | ||||
| </tr> | </tr> | ||||
| @@ -68,7 +68,7 @@ fieldset:disabled { | |||||
| </li> | </li> | ||||
| <li><label class="checkbox"> | <li><label class="checkbox"> | ||||
| <input id="Cov" ${mytrip.IsCheck("Arrival:Cov")|n} name="Arrival:Cov" title="Covoiturage" type="checkbox"> | <input id="Cov" ${mytrip.IsCheck("Arrival:Cov")|n} name="Arrival:Cov" title="Covoiturage" type="checkbox"> | ||||
| d'un covoiturage, d'un hébergement...<br>(j'ai rempli/je vais remplir la section Logistique).</input></label> | |||||
| d'un covoiturage, d'un hébergement...<br>(j'ai rempli/je vais remplir la section Logistique).</input></label> | |||||
| </li> | </li> | ||||
| <li><label class="checkbox"> | <li><label class="checkbox"> | ||||
| <input id="Bras" ${mytrip.IsCheck("Arrival:Bras")|n} name="Arrival:Bras" title="Bras" type="checkbox"> | <input id="Bras" ${mytrip.IsCheck("Arrival:Bras")|n} name="Arrival:Bras" title="Bras" type="checkbox"> | ||||
| @@ -1,3 +1,4 @@ | |||||
| ## -*- coding: utf-8 -*- | |||||
| <%inherit file="jm2l:templates/layout.mako"/> | <%inherit file="jm2l:templates/layout.mako"/> | ||||
| <%def name="jsAddOn_head()"> | <%def name="jsAddOn_head()"> | ||||
| <script src="/vendor/leaflet/js/leaflet.js"></script> | <script src="/vendor/leaflet/js/leaflet.js"></script> | ||||
| @@ -28,13 +29,13 @@ | |||||
| <h2 class="shadow">Nous rejoindre ou nous joindre...</h2> | <h2 class="shadow">Nous rejoindre ou nous joindre...</h2> | ||||
| <div class="span10 offset1"> | <div class="span10 offset1"> | ||||
| <p>Le ${request.registry['event_date']} d’où que vous veniez, tout est mis en place pour que vous | |||||
| puissiez vous rendre en toute simplicité sur les lieux de l’événement. | |||||
| <br> N'hésitez pas à utiliser la section covoiturage de votre profil. Et | |||||
| <p>Le ${request.registry['event_date']}, d'où que vous veniez, tout est mis en place pour que vous | |||||
| puissiez vous rendre en toute simplicité sur les lieux de l'événement. | |||||
| <br> N'hésitez pas à utiliser la section covoiturage de votre profil. Et | |||||
| pas de panique ! Demain, ce sera pire... </p> | pas de panique ! Demain, ce sera pire... </p> | ||||
| <p> | <p> | ||||
| <b>Si vous désirez devenir sponsor</b> de cet événement du libre | |||||
| merci de prendre contact avec le staff (par mail de préférence) : | |||||
| <b>Si vous désirez devenir sponsor</b> de cet événement du libre | |||||
| merci de prendre contact avec le staff (par mail de préférence) : | |||||
| </p> | </p> | ||||
| </div> | </div> | ||||
| @@ -47,7 +48,7 @@ | |||||
| <dd>» #jm2l@irc.freenode.net</dd> | <dd>» #jm2l@irc.freenode.net</dd> | ||||
| <dt>par Mail</dt> | <dt>par Mail</dt> | ||||
| <dd>» contact at jm2l.linux-azur.org</dd> | <dd>» contact at jm2l.linux-azur.org</dd> | ||||
| <dt>par Téléphone</dt> | |||||
| <dt>par Téléphone</dt> | |||||
| <dd>» +33 6 52 42 31 37</dd> | <dd>» +33 6 52 42 31 37</dd> | ||||
| </dl> | </dl> | ||||
| </div> | </div> | ||||
| @@ -85,7 +86,7 @@ | |||||
| if (i==1) { | if (i==1) { | ||||
| return L.marker(wp.latLng, { | return L.marker(wp.latLng, { | ||||
| icon: L.divIcon({ className: 'car_place', iconSize: [30, 30] }) | icon: L.divIcon({ className: 'car_place', iconSize: [30, 30] }) | ||||
| }).bindTooltip('Parking P2 (conseillé)', {direction: 'right'}) | |||||
| }).bindTooltip('Parking P2 (conseillé)', {direction: 'right'}) | |||||
| } else { | } else { | ||||
| return L.marker(wp.latLng).bindTooltip('Suivre Campus Poly\'tech', {direction: 'bottom'}); | return L.marker(wp.latLng).bindTooltip('Suivre Campus Poly\'tech', {direction: 'bottom'}); | ||||
| } | } | ||||
| @@ -119,10 +120,14 @@ | |||||
| <div class="tab-content"> | <div class="tab-content"> | ||||
| <div class="tab-pane fade active in" id="Trsp"> | <div class="tab-pane fade active in" id="Trsp"> | ||||
| <h3>Bus</h3> | <h3>Bus</h3> | ||||
| <h4>Depuis Nice (durée : environ 30') :</h4> | |||||
| <h4> </h4> | |||||
| <ul> | |||||
| <li><a href="https://www.maregionsud.fr/uploads/media/tarif_2018.pdf">Les tarifs du coin</a> (pan) </li> | |||||
| </ul> | |||||
| <h4>Depuis Nice (durée : environ 30') :</h4> | |||||
| <ul> | <ul> | ||||
| <li>Trajet sur la ligne Nice-Sophia Express : | <li>Trajet sur la ligne Nice-Sophia Express : | ||||
| <a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/cg06-transports_lignes_230.pdf">ligne 230</a> | |||||
| <a href="https://www.departement06.fr/documents/A-votre-service/Deplacements/transports-en-commun/dpt06-transports_230-2017mars.pdf">ligne 230</a> | |||||
| </li> | </li> | ||||
| <li>Trajet sur la ligne Cagnes-Villeneuve-Biot-Sophia : | <li>Trajet sur la ligne Cagnes-Villeneuve-Biot-Sophia : | ||||
| <a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/231.pdf">ligne 231</a> | <a href="http://www.cg06.fr/document/?f=servir-les-habitants/fr/231.pdf">ligne 231</a> | ||||
| @@ -133,22 +138,22 @@ | |||||
| <li>Trajet sur la ligne Vence-StPaul-Valbonne-Sophia : | <li>Trajet sur la ligne Vence-StPaul-Valbonne-Sophia : | ||||
| <a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/233.pdf">ligne 233</a> | <a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/233.pdf">ligne 233</a> | ||||
| <ul> | <ul> | ||||
| <li>Arrivée : descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| <li>Arrivée : descendre à l’arrêt lesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| </ul> | </ul> | ||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| <h4>Depuis Cannes (durée : environ 30') :</h4> | |||||
| <h4>Depuis Cannes (durée : environ 30') :</h4> | |||||
| <ul> | <ul> | ||||
| <li>Trajet sur la ligne Cannes - Sophia Antipolis : | <li>Trajet sur la ligne Cannes - Sophia Antipolis : | ||||
| <a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/630.pdf">ligne 630</a> | <a href="https://www.cg06.fr/documents/A-votre-service/Deplacements/transports-en-commun/630.pdf">ligne 630</a> | ||||
| <ul> | <ul> | ||||
| <li>Arrivée : descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| <li>Arrivée : descendre à l’arrêt des LesTempliers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| </ul> | </ul> | ||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| <h4>Depuis Antibes (durée : entre 10 et 30') :</h4> | |||||
| <h4>Depuis Antibes (durée : entre 10 et 30') :</h4> | |||||
| <ul> | <ul> | ||||
| <li>Trajet sur la ligne Express (uniquement pour le vendredi) | <li>Trajet sur la ligne Express (uniquement pour le vendredi) | ||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne 100</a> | <a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne 100</a> | ||||
| @@ -162,48 +167,48 @@ | |||||
| <li>Trajet sur la | <li>Trajet sur la | ||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=14&id_commune=1">ligne 11</a> | <a href="http://www.envibus.fr/ligne_detail.asp?id=14&id_commune=1">ligne 11</a> | ||||
| <ul> | <ul> | ||||
| <li>Arrivée : descendre à l’arrêt Les Templiers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| <li>Arrivée : descendre à l’arrêt Les Templiers (à 700m à pied) ou IUT (à 150m à pied)</li> | |||||
| </ul> | </ul> | ||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| </div> | </div> | ||||
| <div class="tab-pane fade in" id="Avion"> | <div class="tab-pane fade in" id="Avion"> | ||||
| <h3>Avion</h3> | <h3>Avion</h3> | ||||
| <p>Des lignes régulières desservent l’aéroport de Nice Côte d’Azur | |||||
| <p>Des lignes régulières desservent l’aéroport de Nice Côte d’Azur | |||||
| depuis les grandes villes de France et d’Europe. Depuis Paris, | depuis les grandes villes de France et d’Europe. Depuis Paris, | ||||
| la Navette Air France a un départ toutes les heures. Un service | |||||
| la Navette Air France a un départ toutes les heures. Un service | |||||
| de taxis vous conduira à grands frais jusqu’à Polytech’Nice-Sophia. | de taxis vous conduira à grands frais jusqu’à Polytech’Nice-Sophia. | ||||
| Pensez à contacter la communauté pour vous éviter ces frais. | |||||
| Quelqu’un pourra certainement vous récupérer à l’aéroport et | |||||
| vous amener à Polytech’Nice-Sophia. Autrement, La société | |||||
| Pensez à contacter la communauté pour vous éviter ces frais. | |||||
| Quelqu’un pourra certainement vous récupérer à l’aéroport et | |||||
| vous amener à Polytech’Nice-Sophia. Autrement, La société | |||||
| <a href="http://www.nice.aeroport.fr/acces_stationnement/bus/recherche.asp?lign_id=%7B3396BEE2-4ED0-4FAF-8E25-2F031FF4FE7E%7D">STCAR</a> | <a href="http://www.nice.aeroport.fr/acces_stationnement/bus/recherche.asp?lign_id=%7B3396BEE2-4ED0-4FAF-8E25-2F031FF4FE7E%7D">STCAR</a> | ||||
| propose une navette reliant l’aéroport de Nice directement à Sophia Antipolis via la navette. | |||||
| propose une navette reliant l’aéroport de Nice directement à Sophia Antipolis via la navette. | |||||
| </p> | </p> | ||||
| <p><a href="http://www.cg06.fr/fr/servir-les-habitants/deplacements/transport-collectifs/lignes-et-horaires/lignes-et-horaires/">Site transports du conseil général.</a></p> | |||||
| <p><a href="http://www.cg06.fr/fr/servir-les-habitants/deplacements/transport-collectifs/lignes-et-horaires/lignes-et-horaires/">Site transports du conseil général.</a></p> | |||||
| <ul> | <ul> | ||||
| <li>Départ : Terminal 1 ou 2</li> | |||||
| <li>Arrivée : descendre à l’arrêt Templiers (700m à pied) ou IUT (à 150m à pied)</li> | |||||
| <li>Départ : Terminal 1 ou 2</li> | |||||
| <li>Arrivée : descendre à l’arrêt Templiers (700m à pied) ou IUT (à 150m à pied)</li> | |||||
| </ul> | </ul> | ||||
| </div> | </div> | ||||
| <div class="tab-pane fade in" id="Train"> | <div class="tab-pane fade in" id="Train"> | ||||
| <h3>Train</h3> | <h3>Train</h3> | ||||
| <p>La gare la plus proche est celle d’Antibes. Les | <p>La gare la plus proche est celle d’Antibes. Les | ||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=1&id_commune=1#">lignes de bus numéro 1</a>, | |||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne de bus numéro 100 (uniquement le vendredi) </a> | |||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=1&id_commune=1#">lignes de bus numéro 1</a>, | |||||
| <a href="http://www.envibus.fr/ligne_detail.asp?id=79&id_commune=1">ligne de bus numéro 100 (uniquement le vendredi) </a> | |||||
| vous emmèneront depuis la gare (arret Passerelle SNCF) jusqu’à l’IUT de Sophia Antipolis. | vous emmèneront depuis la gare (arret Passerelle SNCF) jusqu’à l’IUT de Sophia Antipolis. | ||||
| Polytech’Nice-Sophia partage le site avec l’IUT. Suivez les indications sur place. | Polytech’Nice-Sophia partage le site avec l’IUT. Suivez les indications sur place. | ||||
| </p> | </p> | ||||
| <p> | <p> | ||||
| Attention, des perturbations sont à prévoir ! | |||||
| Attention, des perturbations sont à prévoir ! | |||||
| </p> | </p> | ||||
| </div> | </div> | ||||
| <div class="tab-pane fade in" id="Voiture"> | <div class="tab-pane fade in" id="Voiture"> | ||||
| <h3>Voiture</h3> | <h3>Voiture</h3> | ||||
| <p>Par l’autoroute, prendre la sortie 44 Antibes ou Sophia, selon le sens de circulation. | <p>Par l’autoroute, prendre la sortie 44 Antibes ou Sophia, selon le sens de circulation. | ||||
| Prendre direction Sophia Antipolis (la première route à droite après le péage).</p> | |||||
| Prendre direction Sophia Antipolis (la première route à droite après le péage).</p> | |||||
| <p>Au rond point en bas de la Route des Chappes, suivre ensuite la direction Sophia Tech.</p> | <p>Au rond point en bas de la Route des Chappes, suivre ensuite la direction Sophia Tech.</p> | ||||
| <p><a href="http://wiki.linux-azur.org/PlanJm2L">http://wiki.linux-azur.org/PlanJm2L</a></p> | <p><a href="http://wiki.linux-azur.org/PlanJm2L">http://wiki.linux-azur.org/PlanJm2L</a></p> | ||||
| <p>Un <strong>flêchage de l’itinéraire</strong> noir sur fond jaune ou orange - | |||||
| <p>Un <strong>flêchage de l’itinéraire</strong> noir sur fond jaune ou orange - | |||||
| JM2L - est en place pour vous guider à partir de la sortie 44 de l’autoroute A8. | JM2L - est en place pour vous guider à partir de la sortie 44 de l’autoroute A8. | ||||
| </p> | </p> | ||||
| <p>Pensez aussi au co-voiturage :-) | <p>Pensez aussi au co-voiturage :-) | ||||
| @@ -6,7 +6,7 @@ DisplayYear = request.session.get('year',CurrentYear) | |||||
| % if request.user and request.user.Staff: | % if request.user and request.user.Staff: | ||||
| <a href="dossier-de-presse/edit">Modifier</a><br> | <a href="dossier-de-presse/edit">Modifier</a><br> | ||||
| % endif | % endif | ||||
| <h2 class="shadow">Communiqué de presse ${DisplayYear}</h2> | |||||
| <h2 class="shadow">Communiqué de presse ${DisplayYear}</h2> | |||||
| <div class="row-fluid"> | <div class="row-fluid"> | ||||
| <div class="span8 offset1"> | <div class="span8 offset1"> | ||||
| % if content and content.doss_presse: | % if content and content.doss_presse: | ||||
| @@ -21,7 +21,6 @@ TabDisplay = [ | |||||
| } | } | ||||
| .SvgBody { | .SvgBody { | ||||
| padding: 0px; | padding: 0px; | ||||
| /* background-color: transparent; */ | |||||
| } | } | ||||
| .EvtBox { | .EvtBox { | ||||
| font-size: 0.7em; | font-size: 0.7em; | ||||
| @@ -97,16 +96,6 @@ Counter = Events.filter(Event.event_type==EvtType).count() | |||||
| if Counter==0: | if Counter==0: | ||||
| continue | continue | ||||
| %> | %> | ||||
| ## <div class="accordion-group"> | |||||
| ## <div class="accordion-heading"> | |||||
| ## <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordionEvent" href="#collapseEvent${num}"> | |||||
| ## ${Counter} ${Title} | |||||
| ## </a> | |||||
| ## </div> | |||||
| ## <div id="collapseEvent${num}" class="accordion-body collapse"> | |||||
| ## <div class="accordion-inner"> | |||||
| <table class="table table-striped table-bordered table-hover"> | <table class="table table-striped table-bordered table-hover"> | ||||
| <thead> | <thead> | ||||
| <tr> | <tr> | ||||
| @@ -159,13 +148,7 @@ if Counter==0: | |||||
| % endfor | % endfor | ||||
| </tbody> | </tbody> | ||||
| </table> | </table> | ||||
| ## </div> | |||||
| ## </div> | |||||
| ## </div> | |||||
| % endfor | % endfor | ||||
| ##</div> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -37,7 +37,7 @@ from slugify import slugify | |||||
| % if len(DicSalle[Entity])==0: | % if len(DicSalle[Entity])==0: | ||||
| <tr> | <tr> | ||||
| <td style="text-align:center;"> | <td style="text-align:center;"> | ||||
| <i>Il n'y a pas de salle définie pour l'année ${Entity.year_uid}</i> | |||||
| <i>Il n'y a pas de salle définie pour l'année ${Entity.year_uid}</i> | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| % endif | % endif | ||||
| @@ -54,7 +54,7 @@ from slugify import slugify | |||||
| % if Salle.phy_salle_id: | % if Salle.phy_salle_id: | ||||
| [ <a href="/PhySalles/${Salle.phy_salle_id}">${Salle.phy.name}</a> ${Salle.phy.nb_places} places ] | [ <a href="/PhySalles/${Salle.phy_salle_id}">${Salle.phy.name}</a> ${Salle.phy.nb_places} places ] | ||||
| % else: | % else: | ||||
| [ <a href="/PhySalles">Créer</a> ] | |||||
| [ <a href="/PhySalles">Créer</a> ] | |||||
| % endif | % endif | ||||
| </div> | </div> | ||||
| </td> | </td> | ||||
| @@ -24,7 +24,7 @@ from slugify import slugify | |||||
| % if len(DicSallePhy)==0: | % if len(DicSallePhy)==0: | ||||
| <tr> | <tr> | ||||
| <td style="text-align:center;"> | <td style="text-align:center;"> | ||||
| <i>Il n'y a pas de salle définie pour le moment.</i> | |||||
| <i>Il n'y a pas de salle définie pour le moment.</i> | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| % endif | % endif | ||||
| @@ -43,7 +43,7 @@ from slugify import slugify | |||||
| % if SallePhy.uid: | % if SallePhy.uid: | ||||
| [ ${SallePhy.nb_places} places ] | [ ${SallePhy.nb_places} places ] | ||||
| % else: | % else: | ||||
| [ <a href="/PhySalles">Créer</a> ] | |||||
| [ <a href="/PhySalles">Créer</a> ] | |||||
| % endif | % endif | ||||
| </div> | </div> | ||||
| @@ -29,9 +29,9 @@ | |||||
| %endif | %endif | ||||
| <% | <% | ||||
| DicForm = { | 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;" }, | '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%;" }, | 'name': {'PlaceHolder':u"Nom de la salle", "FieldStyle":"width:90%;" }, | ||||
| 'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" }, | 'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" }, | ||||
| } | } | ||||
| @@ -42,7 +42,7 @@ | |||||
| % if len(found)==0: | % if len(found)==0: | ||||
| <tr> | <tr> | ||||
| <td colspan="3" style="text-align:center;"> | <td colspan="3" style="text-align:center;"> | ||||
| <i>Aucun justificatif trouvé</i> | |||||
| <i>Aucun justificatif trouvé</i> | |||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| % endif | % endif | ||||
| @@ -4,7 +4,7 @@ | |||||
| from slugify import slugify | from slugify import slugify | ||||
| %> | %> | ||||
| <a style="float:right;" class="btn btn-mini btn-info" role="button" href="/${year}/Staff/poles"> | <a style="float:right;" class="btn btn-mini btn-info" role="button" href="/${year}/Staff/poles"> | ||||
| <i class="icon-plus-sign icon-white"></i> Ajouter un Pôle d'activité | |||||
| <i class="icon-plus-sign icon-white"></i> Ajouter un Pôle d'activité | |||||
| </a> | </a> | ||||
| <h3>Liste des tâches JM2L Staff</h3> | <h3>Liste des tâches JM2L Staff</h3> | ||||
| @@ -70,7 +70,7 @@ from slugify import slugify | |||||
| <td style="position: relative;width:70px;"> | <td style="position: relative;width:70px;"> | ||||
| <div class="actions"> | <div class="actions"> | ||||
| % if task.closed: | % if task.closed: | ||||
| [ <a href="/${year}/Staff/open/${task.uid}">ré-ouvrir</a> ] | |||||
| [ <a href="/${year}/Staff/open/${task.uid}">ré-ouvrir</a> ] | |||||
| % else: | % else: | ||||
| [ <a href="/${year}/Staff/close/${task.uid}">c'est fait</a> ] | [ <a href="/${year}/Staff/close/${task.uid}">c'est fait</a> ] | ||||
| % endif | % endif | ||||
| @@ -142,7 +142,7 @@ TabJs = {'select':[], 'desc':[]} | |||||
| <%def name="sejour_wrapper(Places)"> | <%def name="sejour_wrapper(Places)"> | ||||
| <div class="form-inline"> | <div class="form-inline"> | ||||
| Départ : | |||||
| Départ : | |||||
| <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | ||||
| % for place in Places: | % for place in Places: | ||||
| <option value="${place.place_id}">${place.display_name}</option> | <option value="${place.place_id}">${place.display_name}</option> | ||||
| @@ -151,7 +151,7 @@ TabJs = {'select':[], 'desc':[]} | |||||
| </div> | </div> | ||||
| <br /> | <br /> | ||||
| <div class="form-inline"> | <div class="form-inline"> | ||||
| Arrivée : | |||||
| Arrivée : | |||||
| <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu"> | ||||
| % for place in Places: | % for place in Places: | ||||
| <option value="${place.place_id}">${place.display_name}</option> | <option value="${place.place_id}">${place.display_name}</option> | ||||
| @@ -184,7 +184,7 @@ TabJs = {'select':[], 'desc':[]} | |||||
| ${itin_form.arrival_place(style='width:17em;')} | ${itin_form.arrival_place(style='width:17em;')} | ||||
| </div> | </div> | ||||
| <div style="padding:5px;"> | <div style="padding:5px;"> | ||||
| <small style="color:#999">Si je n´ai pas trouvé le lieu dont j´ai besoin dans ces listes...</small> | |||||
| <small style="color:#999">Si je n´ai pas trouvé le lieu dont j´ai besoin dans ces listes...</small> | |||||
| <br /> | <br /> | ||||
| <small style="color:#999">Je peux </small> | <small style="color:#999">Je peux </small> | ||||
| <a class="btn btn-mini btn-info" role="button" href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/0');"> | <a class="btn btn-mini btn-info" role="button" href="javascript:DoGetLieu('/${CurrentYear}/modal/Place/0');"> | ||||
| @@ -352,7 +352,7 @@ TabJs = {'select':[], 'desc':[]} | |||||
| % if NotFoundTitle: | % if NotFoundTitle: | ||||
| <i>${NotFoundTitle}</i> | <i>${NotFoundTitle}</i> | ||||
| % else: | % 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 | % endif | ||||
| </td> | </td> | ||||
| </tr> | </tr> | ||||
| @@ -1,6 +1,6 @@ | |||||
| <%inherit file="jm2l:templates/layout.mako"/> | <%inherit file="jm2l:templates/layout.mako"/> | ||||
| <p> | <p> | ||||
| Pour que l'évenement JM2L 2017 se passe dans les meilleures conditions | |||||
| Pour que l'évenement JM2L context._kwargs['CurrentYear'] se passe dans les meilleures conditions | |||||
| possible. | possible. | ||||
| Il s'agit ici pour toi de te connecter et de compléter les formulaires, | Il s'agit ici pour toi de te connecter et de compléter les formulaires, | ||||
| d'essayer de les tenir à jour au fur et à meusure, de les compléter | d'essayer de les tenir à jour au fur et à meusure, de les compléter | ||||
| @@ -79,7 +79,7 @@ | |||||
| <div class="tabbable tabs-left" id="Interventions_tab"> | <div class="tabbable tabs-left" id="Interventions_tab"> | ||||
| <ul class="nav nav-tabs navbar" style="margin-bottom:0;"> | <ul class="nav nav-tabs navbar" style="margin-bottom:0;"> | ||||
| <li class="active"> <a href="#ResumePart" data-toggle="tab">Resumé</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="#Conference" data-toggle="tab">Conférence</a> </li> | ||||
| <li> <a href="#Stand" data-toggle="tab">Stand</a> </li> | <li> <a href="#Stand" data-toggle="tab">Stand</a> </li> | ||||
| <li> <a href="#Atelier" data-toggle="tab">Atelier</a> </li> | <li> <a href="#Atelier" data-toggle="tab">Atelier</a> </li> | ||||
| @@ -118,12 +118,12 @@ | |||||
| <div class="tab-pane fade" id="Frais"> | <div class="tab-pane fade" id="Frais"> | ||||
| <fieldset> | <fieldset> | ||||
| <legend class="lowshadow">Une participation à mes frais ?</legend> | <legend class="lowshadow">Une participation à mes frais ?</legend> | ||||
| L'équipe des JM2L participe aux <u>frais de transport</u> des intervenants !<br /><br /> | |||||
| L'équipe des JM2L participe aux <u>frais de transport</u> des intervenants !<br /><br /> | |||||
| Et bien oui, mais cette participation ne sera effective que si vous remplissez <u>toutes les conditions</u> suivantes: | Et bien oui, mais cette participation ne sera effective que si vous remplissez <u>toutes les conditions</u> suivantes: | ||||
| <ul style="list-style:circle;"> | <ul style="list-style:circle;"> | ||||
| <li>Vous animez <strong>un atelier, une confé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>Vous <strong>présentez l'original de vos tickets</strong> à l'accueil pendant l'évènement.</li> | ||||
| <li>Tous vos documents sont conformes.</li> | <li>Tous vos documents sont conformes.</li> | ||||
| </ul> | </ul> | ||||
| @@ -1,8 +1,12 @@ | |||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||
| <html> | <html> | ||||
| <%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | <%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | ||||
| <% | |||||
| context._kwargs['postpone_js']=[] | |||||
| DisplayYear = request.session.get('year', 2018) | |||||
| %> | |||||
| <head> | <head> | ||||
| <title>JM2L 2017</title> | |||||
| <title>JM2L ${DisplayYear}</title> | |||||
| <meta charset="utf-8"> | <meta charset="utf-8"> | ||||
| <meta name="keywords" content="python web application" /> | <meta name="keywords" content="python web application" /> | ||||
| <meta name="description" content="jm2l LinuxAzur journée méditéranéenne logiciel libre" /> | <meta name="description" content="jm2l LinuxAzur journée méditéranéenne logiciel libre" /> | ||||
| @@ -26,10 +30,6 @@ | |||||
| ${self.jsAddOn_head()} | ${self.jsAddOn_head()} | ||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <% | |||||
| context._kwargs['postpone_js']=[] | |||||
| DisplayYear = request.session.get('year', 2017) | |||||
| %> | |||||
| <%def name="jsAddOn_head()"></%def> | <%def name="jsAddOn_head()"></%def> | ||||
| <%def name="jsAddOn()"></%def> | <%def name="jsAddOn()"></%def> | ||||
| <%def name="cssAddOn()"></%def> | <%def name="cssAddOn()"></%def> | ||||
| @@ -39,7 +39,7 @@ ${helpers.uploader_js()} | |||||
| <div id="top"> | <div id="top"> | ||||
| % if DisplayYear!=2017: | % if DisplayYear!=2017: | ||||
| <div class="align-center" style="background: url( ${'/img/%s/headerbg.png' % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> | <div class="align-center" style="background: url( ${'/img/%s/headerbg.png' % DisplayYear} ) repeat-x scroll 0 top #ffffff;"> | ||||
| <a href="${"/%s/" % DisplayYear}"> | |||||
| <a href="${'/%s/' % DisplayYear}"> | |||||
| <div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"> | <div style="height:215px;background: url( ${"/img/%s/logo.png" % DisplayYear} ) no-repeat scroll center center transparent"> | ||||
| </div> | </div> | ||||
| </a> | </a> | ||||
| @@ -69,11 +69,11 @@ ${helpers.uploader_js()} | |||||
| <div class="item active"> | <div class="item active"> | ||||
| <div class="align-center"> | <div class="align-center"> | ||||
| <H1>JM2L 2017</H1> | <H1>JM2L 2017</H1> | ||||
| <h3>Choisissez ici votre logo préféré !</h3> | |||||
| <h3>Choisissez ici votre logo préféré !</h3> | |||||
| <p>Utilisez les flèches pour choisir et voter !<br> | <p>Utilisez les flèches pour choisir et voter !<br> | ||||
| Vous pouvez changer à tout moment, mais vous n'aurez droit qu'a un seul choix, le vôtre ;)</p> | Vous pouvez changer à tout moment, mais vous n'aurez droit qu'a un seul choix, le vôtre ;)</p> | ||||
| <p>Vous souhaitez proposer le vôtre ? <br> | <p>Vous souhaitez proposer le vôtre ? <br> | ||||
| N'hésitez pas à envoyer vos propositions par mail à l'équipe !</p> | |||||
| N'hésitez pas à envoyer vos propositions par mail à l'équipe !</p> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| % endif | % endif | ||||
| @@ -141,11 +141,6 @@ ${helpers.uploader_js()} | |||||
| <li><a href="/participer-l-evenement#inscription">Je m'inscris</a></li> | <li><a href="/participer-l-evenement#inscription">Je m'inscris</a></li> | ||||
| <li><a href="/sign/login">Je m'identifie</a></li> | <li><a href="/sign/login">Je m'identifie</a></li> | ||||
| % endif | % endif | ||||
| ## <li>Mode | |||||
| ## <span class="visible-phone"> ✔ Phone</span> | |||||
| ## <span class="visible-tablet"> ✔ Tablet</span> | |||||
| ## <span class="visible-desktop"> ✔ Desktop</span> | |||||
| ## </li> | |||||
| </ul> | </ul> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| @@ -189,7 +184,7 @@ ${helpers.uploader_js()} | |||||
| <footer class="footer"> | <footer class="footer"> | ||||
| <div class="container"> | <div class="container"> | ||||
| <h4>JM2L 2005-2017</h4> | |||||
| <h4>JM2L 2005-2018</h4> | |||||
| <p> | <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> | <a href="http://creativecommons.org/licenses/by-sa/4.0/">CopyFriendly</a> | ||||
| @@ -109,7 +109,7 @@ | |||||
| %else: | %else: | ||||
| <div class="alert"> | <div class="alert"> | ||||
| <button type="button" class="close" data-dismiss="alert">×</button> | <button type="button" class="close" data-dismiss="alert">×</button> | ||||
| <strong>Non disponible!</strong> Vous devez d'abord compléter le champ GPS pour activer cette fonctionnalité. | |||||
| <strong>Non disponible!</strong> Vous devez d'abord compléter le champ GPS pour activer cette fonctionnalité. | |||||
| </div> | </div> | ||||
| %endif | %endif | ||||
| @@ -147,7 +147,7 @@ | |||||
| <div class="modal-body"> | <div class="modal-body"> | ||||
| <div> | <div> | ||||
| <i class="icon-question-sign"></i> | <i class="icon-question-sign"></i> | ||||
| Les images de taille supérieure à 300x300 pixels seront redimensionnés. | |||||
| Les images de taille supérieure à 300x300 pixels seront redimensionnés. | |||||
| </div> | </div> | ||||
| ${helpers.uploader("users", uid, "une Photo")} | ${helpers.uploader("users", uid, "une Photo")} | ||||
| </div> | </div> | ||||
| @@ -174,7 +174,7 @@ | |||||
| ${ helpers.DisplayForm(form, {}) } | ${ helpers.DisplayForm(form, {}) } | ||||
| <div id="pswd_info" style="display: block;"> | <div id="pswd_info" style="display: block;"> | ||||
| Pour renforcer la sécurité de votre mot de passe : | |||||
| Pour renforcer la sécurité de votre mot de passe : | |||||
| <ul> | <ul> | ||||
| <li id="length" class="invalid">Saisissez au moins 6 caractères</li> | <li id="length" class="invalid">Saisissez au moins 6 caractères</li> | ||||
| <li id="ltrMin" class="invalid">Ajoutez des lettres minuscules</li> | <li id="ltrMin" class="invalid">Ajoutez des lettres minuscules</li> | ||||
| @@ -35,6 +35,7 @@ | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <hr/> | <hr/> | ||||
| <hr/> | |||||
| % if event.presentation.count() and event.video.count(): | % if event.presentation.count() and event.video.count(): | ||||
| <div class="row-fluid"> | <div class="row-fluid"> | ||||
| <div id="pres" class="span6"> | <div id="pres" class="span6"> | ||||
| @@ -70,7 +70,7 @@ ${The_entity_type.entity_subtype} | |||||
| </div> | </div> | ||||
| % endfor | % endfor | ||||
| % endif | % endif | ||||
| % for iterv in entity.members: | |||||
| % for iterv in entity.members[::-1]: | |||||
| <p> | <p> | ||||
| <div class="titleborderbox"> | <div class="titleborderbox"> | ||||
| Intervenant <strong><a href="/user/${iterv.slug}">${iterv.prenom} ${iterv.nom}</a></strong>. | Intervenant <strong><a href="/user/${iterv.slug}">${iterv.prenom} ${iterv.nom}</a></strong>. | ||||
| @@ -504,7 +504,8 @@ class MediaUpload(MediaPath): | |||||
| result['size'] = self.get_file_size(fieldStorage.file) | result['size'] = self.get_file_size(fieldStorage.file) | ||||
| if self.validate(result, fieldStorage.file): | if self.validate(result, fieldStorage.file): | ||||
| local_filename = slugify( result['name'] ) | |||||
| filename, file_extension = os.path.splitext( result['name'] ) | |||||
| local_filename = slugify( filename ) + file_extension | |||||
| # Keep mime-type in .type file | # Keep mime-type in .type file | ||||
| with open( self.mediapath( local_filename ) + '.type', 'w') as f: | with open( self.mediapath( local_filename ) + '.type', 'w') as f: | ||||
| f.write(result['type']) | f.write(result['type']) | ||||
| @@ -22,6 +22,7 @@ from icalendar import Calendar | |||||
| from pytz import timezone | from pytz import timezone | ||||
| from icalendar import Event as Evt | from icalendar import Event as Evt | ||||
| from pyramid_mailer.message import Message | from pyramid_mailer.message import Message | ||||
| from security import check_staff, check_logged | |||||
| # Then, standard libs | # Then, standard libs | ||||
| import csv | import csv | ||||
| import cStringIO as StringIO | import cStringIO as StringIO | ||||
| @@ -289,7 +290,21 @@ def JSON_TimeLine_Request(request): | |||||
| "credit": ",".join(["%s %s" % (i.prenom, i.nom) for i in ev.intervenants]), | "credit": ",".join(["%s %s" % (i.prenom, i.nom) for i in ev.intervenants]), | ||||
| "caption":"" } | "caption":"" } | ||||
| } ) | } ) | ||||
| if year==2017: | |||||
| if year==2018: | |||||
| DicResult = { | |||||
| "lang":"fr", | |||||
| "headline":"JM2L 2018", | |||||
| "type":"default", | |||||
| "startDate":"2018,12,15,10", | |||||
| "text":"<i><span class='c1'>11ème Édition</span></i>", | |||||
| "asset": | |||||
| { | |||||
| "media":embeed_video("video/ogg","/resources/2017/Video/JM2L2017_Reportage_FR3.ogv"), | |||||
| "credit":"Reportage France 3", | |||||
| "caption":"JM2L 2018" | |||||
| } | |||||
| } | |||||
| elif year==2017: | |||||
| DicResult = { | DicResult = { | ||||
| "lang":"fr", | "lang":"fr", | ||||
| "headline":"JM2L 2017", | "headline":"JM2L 2017", | ||||
| @@ -298,7 +313,8 @@ def JSON_TimeLine_Request(request): | |||||
| "text":"<i><span class='c1'>10ème Édition</span></i>", | "text":"<i><span class='c1'>10ème Édition</span></i>", | ||||
| "asset": | "asset": | ||||
| { | { | ||||
| "media":embeed_video("video/ogg","/resources/2017/Video/JM2L2017_Reportage_FR3.ogv"), | |||||
| #"media":"https://www.youtube.com/watch?v=91X65eEKxvU&t=6s", | |||||
| "media":embeed_video("video/ogg","/resources/2017/Video/JM2L2017_Reportage_PleinSud.ogv"), | |||||
| "credit":"Reportage France 3", | "credit":"Reportage France 3", | ||||
| "caption":"JM2L 2017" | "caption":"JM2L 2017" | ||||
| } | } | ||||
| @@ -391,6 +407,8 @@ def index_page(request): | |||||
| return {'year': year, 'content':content, 'edition':u"9<sup>ème</sup>" } | return {'year': year, 'content':content, 'edition':u"9<sup>ème</sup>" } | ||||
| elif year==2017: | elif year==2017: | ||||
| return {'year': year, 'content':content, 'edition':u"10<sup>ème</sup>" } | return {'year': year, 'content':content, 'edition':u"10<sup>ème</sup>" } | ||||
| elif year==2018: | |||||
| return {'year': year, 'content':content, 'edition':u"11<sup>ème</sup>" } | |||||
| else: | else: | ||||
| edition = year - 2005 | edition = year - 2005 | ||||
| return {'year': year, 'content':content, 'edition':u"%d<sup>ème</sup>" % edition } | return {'year': year, 'content':content, 'edition':u"%d<sup>ème</sup>" % edition } | ||||
| @@ -404,14 +422,12 @@ def index_page(request): | |||||
| ListPhotos = map(lambda x: TargetUrl + x, listdir(TargetDir)) | ListPhotos = map(lambda x: TargetUrl + x, listdir(TargetDir)) | ||||
| else: | else: | ||||
| ListPhotos = [] | ListPhotos = [] | ||||
| return {'year': CurrentYear, 'content':content, 'edition':u"10<sup>ème</sup>", 'ListPhotos': ListPhotos} | |||||
| return {'year': CurrentYear, 'content':content, 'edition':u"11<sup>ème</sup>", 'ListPhotos': ListPhotos} | |||||
| @view_config(route_name='edit_index', renderer="jm2l:templates/Staff/EditIndex.mako") | @view_config(route_name='edit_index', renderer="jm2l:templates/Staff/EditIndex.mako") | ||||
| def edit_index(request): | def edit_index(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first() | content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first() | ||||
| form = IndexForm(request.POST, content, meta={'csrf_context': request.session}) | form = IndexForm(request.POST, content, meta={'csrf_context': request.session}) | ||||
| if request.method == 'POST' and form.validate(): | if request.method == 'POST' and form.validate(): | ||||
| @@ -437,7 +453,7 @@ def programme(request): | |||||
| ListDay = [] | ListDay = [] | ||||
| for day in Days: | for day in Days: | ||||
| RefDay = datetime.datetime.strptime(day[0],'%d-%m-%Y') | RefDay = datetime.datetime.strptime(day[0],'%d-%m-%Y') | ||||
| ListDay.append( ( RefDay.strftime('%A %d %b %Y'), | |||||
| ListDay.append( ( RefDay.strftime('%A %d %b %Y').decode('utf-8'), | |||||
| RefDay.strftime('%d') ) ) | RefDay.strftime('%d') ) ) | ||||
| MainTab = {'programme':'active','DisplayYear':year, \ | MainTab = {'programme':'active','DisplayYear':year, \ | ||||
| 'Events':Events, 'Event':Event, 'Days':ListDay, "logged_in":request.authenticated_userid } | 'Events':Events, 'Event':Event, 'Days':ListDay, "logged_in":request.authenticated_userid } | ||||
| @@ -452,13 +468,8 @@ def static_presse(request): | |||||
| @view_config(route_name='edit_presse', renderer="jm2l:templates/Staff/EditPresse.mako") | @view_config(route_name='edit_presse', renderer="jm2l:templates/Staff/EditPresse.mako") | ||||
| def edit_presse(request): | def edit_presse(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', None)) | year = int(request.matchdict.get('year', None)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first() | content = DBSession.query(JM2L_Year).filter(JM2L_Year.year_uid==year).first() | ||||
| form = DossPresse(request.POST, content, meta={'csrf_context': request.session}) | form = DossPresse(request.POST, content, meta={'csrf_context': request.session}) | ||||
| if request.method == 'POST' and form.validate(): | if request.method == 'POST' and form.validate(): | ||||
| @@ -477,13 +488,8 @@ def static_plan(request): | |||||
| ## =-=- Here, We handle HTTP requests - Staff Logged Part -=-= | ## =-=- Here, We handle HTTP requests - Staff Logged Part -=-= | ||||
| @view_config(route_name='list_task', renderer='jm2l:templates/Staff/list.mako') | @view_config(route_name='list_task', renderer='jm2l:templates/Staff/list.mako') | ||||
| def list_view(request): | def list_view(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| DicTask = {} | DicTask = {} | ||||
| taskgroup = DBSession.query( TasksArea ).filter( TasksArea.year_uid == year).all() | taskgroup = DBSession.query( TasksArea ).filter( TasksArea.year_uid == year).all() | ||||
| for grp in taskgroup: | for grp in taskgroup: | ||||
| @@ -497,14 +503,8 @@ def list_view(request): | |||||
| @view_config(route_name='list_expenses', renderer='jm2l:templates/Staff/compta.mako') | @view_config(route_name='list_expenses', renderer='jm2l:templates/Staff/compta.mako') | ||||
| def expenses(request): | def expenses(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| output = [] | output = [] | ||||
| dic_out = {} | dic_out = {} | ||||
| for name in glob.glob('jm2l/upload/images/users/*/RIB/*'): | for name in glob.glob('jm2l/upload/images/users/*/RIB/*'): | ||||
| @@ -570,13 +570,8 @@ def expenses(request): | |||||
| @view_config(route_name='handle_task', renderer='jm2l:templates/Staff/tasks.mako') | @view_config(route_name='handle_task', renderer='jm2l:templates/Staff/tasks.mako') | ||||
| def tasks(request): | def tasks(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| task_id = request.matchdict.get('task_id') | task_id = request.matchdict.get('task_id') | ||||
| # Convert the pole_id GET parameter to int or 0 | # Convert the pole_id GET parameter to int or 0 | ||||
| if request.params.get('pole_id') and request.params.get('pole_id').isdigit(): | if request.params.get('pole_id') and request.params.get('pole_id').isdigit(): | ||||
| @@ -631,13 +626,8 @@ def tasks(request): | |||||
| @view_config(route_name='handle_pole', renderer='jm2l:templates/Staff/pole.mako') | @view_config(route_name='handle_pole', renderer='jm2l:templates/Staff/pole.mako') | ||||
| def tasks_area(request): | def tasks_area(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| pole_id = request.matchdict.get('pole_id') | pole_id = request.matchdict.get('pole_id') | ||||
| if pole_id: | if pole_id: | ||||
| Pole = TasksArea.by_id(int(pole_id)) | Pole = TasksArea.by_id(int(pole_id)) | ||||
| @@ -660,13 +650,8 @@ def tasks_area(request): | |||||
| @view_config(route_name='action_task') | @view_config(route_name='action_task') | ||||
| def action_task(request): | def action_task(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| action = request.matchdict.get('action') | action = request.matchdict.get('action') | ||||
| task_id = request.matchdict.get('task_id') | task_id = request.matchdict.get('task_id') | ||||
| Task = Tasks.by_id(int(task_id)) | Task = Tasks.by_id(int(task_id)) | ||||
| @@ -685,13 +670,8 @@ def action_task(request): | |||||
| @view_config(route_name='action_task_area') | @view_config(route_name='action_task_area') | ||||
| def action_task_area(request): | def action_task_area(request): | ||||
| check_staff(request) | |||||
| year = int(request.matchdict.get('year', CurrentYear)) | year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| action = request.matchdict.get('action') | action = request.matchdict.get('action') | ||||
| pole_id = request.matchdict.get('pole_id') | pole_id = request.matchdict.get('pole_id') | ||||
| Pole = TasksArea.by_id(int(pole_id)) | Pole = TasksArea.by_id(int(pole_id)) | ||||
| @@ -704,12 +684,7 @@ def action_task_area(request): | |||||
| @view_config(route_name='list_salles', renderer='jm2l:templates/Salles/list.mako') | @view_config(route_name='list_salles', renderer='jm2l:templates/Salles/list.mako') | ||||
| def list_salles(request): | def list_salles(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| check_staff(request) | |||||
| DicSalle = {} | DicSalle = {} | ||||
| years = DBSession.query( JM2L_Year ).all() | years = DBSession.query( JM2L_Year ).all() | ||||
| for year in years: | for year in years: | ||||
| @@ -722,12 +697,7 @@ def list_salles(request): | |||||
| @view_config(route_name='list_salles_phy', renderer='jm2l:templates/Salles/list_phy.mako') | @view_config(route_name='list_salles_phy', renderer='jm2l:templates/Salles/list_phy.mako') | ||||
| def list_salles_phy(request): | def list_salles_phy(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| check_staff(request) | |||||
| salles_phy = DBSession.query( SallePhy )\ | salles_phy = DBSession.query( SallePhy )\ | ||||
| .order_by(SallePhy.name).all() | .order_by(SallePhy.name).all() | ||||
| return {'DicSallePhy': salles_phy } | return {'DicSallePhy': salles_phy } | ||||
| @@ -735,12 +705,7 @@ def list_salles_phy(request): | |||||
| @view_config(route_name='handle_salle', renderer='jm2l:templates/Salles/salle.mako') | @view_config(route_name='handle_salle', renderer='jm2l:templates/Salles/salle.mako') | ||||
| def handle_salle(request): | def handle_salle(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| check_staff(request) | |||||
| salle_id = request.matchdict.get('salle_id') | salle_id = request.matchdict.get('salle_id') | ||||
| if salle_id: | if salle_id: | ||||
| Salle = Salles.by_id(int(salle_id)) | Salle = Salles.by_id(int(salle_id)) | ||||
| @@ -750,7 +715,7 @@ def handle_salle(request): | |||||
| else: | else: | ||||
| Salle = Salles() | Salle = Salles() | ||||
| form = SalleForm(request.POST, Salle, meta={'csrf_context': request.session}) | form = SalleForm(request.POST, Salle, meta={'csrf_context': request.session}) | ||||
| form.year_uid.choices = map(tuple, DBSession.query(JM2L_Year.year_uid, JM2L_Year.year_uid).all()) | |||||
| form.year_uid.choices = map(tuple, DBSession.query(JM2L_Year.year_uid, JM2L_Year.year_uid).order_by(sa.desc(JM2L_Year.year_uid)).all()) | |||||
| form.phy_salle_id.choices = map(tuple, DBSession.query(SallePhy.uid, SallePhy.name).all()) | form.phy_salle_id.choices = map(tuple, DBSession.query(SallePhy.uid, SallePhy.name).all()) | ||||
| if request.method == 'POST' and form.validate(): | if request.method == 'POST' and form.validate(): | ||||
| form.populate_obj(Salle) | form.populate_obj(Salle) | ||||
| @@ -763,12 +728,7 @@ def handle_salle(request): | |||||
| @view_config(route_name='handle_salle_phy', renderer='jm2l:templates/Salles/salle_phy.mako') | @view_config(route_name='handle_salle_phy', renderer='jm2l:templates/Salles/salle_phy.mako') | ||||
| def handle_salle_phy(request): | def handle_salle_phy(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| check_staff(request) | |||||
| salle_id = request.matchdict.get('salle_id') | salle_id = request.matchdict.get('salle_id') | ||||
| if salle_id: | if salle_id: | ||||
| Salle = SallePhy.by_id(int(salle_id)) | Salle = SallePhy.by_id(int(salle_id)) | ||||
| @@ -802,12 +762,7 @@ def handle_salle_phy(request): | |||||
| @view_config(route_name='action_salle') | @view_config(route_name='action_salle') | ||||
| def action_salle(request): | def action_salle(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| check_staff(request) | |||||
| action = request.matchdict.get('action') | action = request.matchdict.get('action') | ||||
| salle_id = request.matchdict.get('salle_id') | salle_id = request.matchdict.get('salle_id') | ||||
| Salle = Salles.by_id(int(salle_id)) | Salle = Salles.by_id(int(salle_id)) | ||||
| @@ -870,10 +825,7 @@ def exchange(request): | |||||
| @view_config(route_name='miam') | @view_config(route_name='miam') | ||||
| def miam(request): | def miam(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| check_logged(request) | |||||
| miam_form = MiamForm(request.POST, request.user, meta={'csrf_context': request.session}) | miam_form = MiamForm(request.POST, request.user, meta={'csrf_context': request.session}) | ||||
| if request.method == 'POST' and miam_form.validate(): | if request.method == 'POST' and miam_form.validate(): | ||||
| FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | ||||
| @@ -904,9 +856,7 @@ def miam(request): | |||||
| @view_config(route_name='sejour') | @view_config(route_name='sejour') | ||||
| def sejour(request): | def sejour(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| check_logged(request) | |||||
| if request.method == 'POST': | if request.method == 'POST': | ||||
| FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | ||||
| if FicheSejour: | if FicheSejour: | ||||
| @@ -953,9 +903,7 @@ def sejour(request): | |||||
| @view_config(route_name='orga') | @view_config(route_name='orga') | ||||
| def orga(request): | def orga(request): | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| check_logged(request) | |||||
| if request.method == 'POST': | if request.method == 'POST': | ||||
| FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | FicheSejour = Sejour.by_user(request.user.uid, CurrentYear) | ||||
| UpdateOrga=False | UpdateOrga=False | ||||
| @@ -1013,13 +961,8 @@ def vote_logo(request): | |||||
| @view_config(route_name='list_users_csv', renderer="string") | @view_config(route_name='list_users_csv', renderer="string") | ||||
| def list_users_csv(request): | def list_users_csv(request): | ||||
| check_staff(request) | |||||
| for_year = int(request.matchdict.get('year', CurrentYear)) | for_year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| stmt = (DBSession.query(Sejour).filter(Sejour.for_year==for_year)).subquery() | stmt = (DBSession.query(Sejour).filter(Sejour.for_year==for_year)).subquery() | ||||
| # stmt_event = (DBSession.query(User_Event).filter() | # stmt_event = (DBSession.query(User_Event).filter() | ||||
| adalias = aliased(Sejour, stmt) | adalias = aliased(Sejour, stmt) | ||||
| @@ -1049,13 +992,8 @@ def list_users_csv(request): | |||||
| @view_config(route_name='list_users', renderer="jm2l:templates/Participant/list_users.mako") | @view_config(route_name='list_users', renderer="jm2l:templates/Participant/list_users.mako") | ||||
| def list_users(request): | def list_users(request): | ||||
| check_staff(request) | |||||
| for_year = int(request.matchdict.get('year', CurrentYear)) | for_year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| stmt = (DBSession.query(Sejour).filter(Sejour.for_year==for_year)).subquery() | stmt = (DBSession.query(Sejour).filter(Sejour.for_year==for_year)).subquery() | ||||
| adalias = aliased(Sejour, stmt) | adalias = aliased(Sejour, stmt) | ||||
| Data = DBSession.query(User, adalias ) \ | Data = DBSession.query(User, adalias ) \ | ||||
| @@ -1077,12 +1015,8 @@ def list_users(request): | |||||
| @view_config(route_name='list_orga', renderer="jm2l:templates/Participant/list_orga.mako") | @view_config(route_name='list_orga', renderer="jm2l:templates/Participant/list_orga.mako") | ||||
| def list_orga(request): | def list_orga(request): | ||||
| check_staff(request) | |||||
| for_year = int(request.matchdict.get('year', CurrentYear)) | for_year = int(request.matchdict.get('year', CurrentYear)) | ||||
| if request.user is None: | |||||
| # Don't answer to users that aren't logged | |||||
| raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') | |||||
| if not request.user.Staff: | |||||
| raise HTTPForbidden(u'Vous n\'avez pas l\'autorité suffisante pour effectuer cette action.') | |||||
| Data = DBSession.query(User, Sejour)\ | Data = DBSession.query(User, Sejour)\ | ||||
| .outerjoin(Sejour)\ | .outerjoin(Sejour)\ | ||||
| .filter(Sejour.for_year == for_year)\ | .filter(Sejour.for_year == for_year)\ | ||||
| @@ -1630,7 +1564,7 @@ def edit_event(request): | |||||
| if not TheYear: | if not TheYear: | ||||
| raise HTTPNotFound(u"Cette année n'est pas pris en charge") | raise HTTPNotFound(u"Cette année n'est pas pris en charge") | ||||
| # Generate Timeslots for current year | # Generate Timeslots for current year | ||||
| TimeSlots = list(enumerate( [ x.strftime('%a %d %b %H:%M') for x in | |||||
| TimeSlots = list(enumerate( [ x.strftime('%a %d %b %H:%M').decode('utf-8') for x in | |||||
| TheYear.AvailableTimeSlots ] )) | TheYear.AvailableTimeSlots ] )) | ||||
| if event_id: | if event_id: | ||||
| @@ -1651,7 +1585,7 @@ def edit_event(request): | |||||
| start_sel = TheYear.AvailableTimeSlots.index(TheEvent.start_time) | start_sel = TheYear.AvailableTimeSlots.index(TheEvent.start_time) | ||||
| else: | else: | ||||
| start_sel = len(TimeSlots) | start_sel = len(TimeSlots) | ||||
| TimeSlots.append( (len(TimeSlots), TheEvent.start_time.strftime('%a %d %b %H:%M'))) | |||||
| TimeSlots.append( (len(TimeSlots), TheEvent.start_time.strftime('%a %d %b %H:%M').decode('utf-8'))) | |||||
| duration = (TheEvent.end_time - TheEvent.start_time).total_seconds()/60 | duration = (TheEvent.end_time - TheEvent.start_time).total_seconds()/60 | ||||
| end = TheEvent.start_time + datetime.timedelta(minutes=duration) | end = TheEvent.start_time + datetime.timedelta(minutes=duration) | ||||
| # prepare the form with update | # prepare the form with update | ||||
| @@ -1940,7 +1874,8 @@ def edit_tiers(request): | |||||
| # First we ensure there is no related event that already exist with that slug | # First we ensure there is no related event that already exist with that slug | ||||
| CheckTiers = Tiers.by_slug( slugify(form.name.data) ) | CheckTiers = Tiers.by_slug( slugify(form.name.data) ) | ||||
| if CheckTiers: | if CheckTiers: | ||||
| request.session.flash(('warning',u'Attention, Choisissez un autre titre pour votre entitée, elle est en conflit avec une autre.')) | |||||
| request.session.flash(('warning',u'Attention, Choisissez un autre titre pour votre entitée,' | |||||
| u'elle est en conflit avec une autre.')) | |||||
| DBSession.rollback() | DBSession.rollback() | ||||
| return HTTPFound(location=request.route_url('edit_entity', sep='/', | return HTTPFound(location=request.route_url('edit_entity', sep='/', | ||||
| entity_id=str(OriginalSlug), tiers_type=TheTiers.get_entity_type.entity_type)) | entity_id=str(OriginalSlug), tiers_type=TheTiers.get_entity_type.entity_type)) | ||||