@@ -56,12 +56,17 @@ def main(global_config, **settings): | |||
config.add_route('vote_logo', '/vote_logo/{num:\d+}') | |||
# HTML Routes - Staff | |||
config.add_route('list_task', '/Staff') | |||
config.add_route('handle_pole', '/Staff/poles{sep:/*}{pole_id:(\d+)?}') | |||
config.add_route('handle_task', '/Staff/tasks{sep:/*}{task_id:(\d+)?}') | |||
config.add_route('action_task', '/Staff/{action:(\w+)}/{task_id:(\d+)}') | |||
config.add_route('list_task', '/Staff') | |||
config.add_route('handle_pole', '/Staff/poles{sep:/*}{pole_id:(\d+)?}') | |||
config.add_route('handle_task', '/Staff/tasks{sep:/*}{task_id:(\d+)?}') | |||
config.add_route('action_task', '/Staff/{action:(\w+)}/{task_id:(\d+)}') | |||
config.add_route('action_task_area', '/Staff/pole/{action:(\w+)}/{pole_id:(\d+)}') | |||
config.add_route('list_salles', '/ListSalles') | |||
config.add_route('handle_salle', '/Salles{sep:/*}{salle_id:(\d+)?}') | |||
config.add_route('handle_salle_phy', '/PhySalles{sep:/*}{salle_id:(\d+)?}') | |||
config.add_route('action_salle', '/Salles/{action:(\w+)}/{salle_id:(\d+)}') | |||
# HTML Routes - Public | |||
config.add_route('home', '/') | |||
config.add_route('presse', '/{year:\d+}/dossier-de-presse') | |||
@@ -73,7 +78,8 @@ def main(global_config, **settings): | |||
## Events | |||
config.add_route('event', '/event/{year:\d+}/{event_id:([\w-]+)?}') | |||
config.add_route('link_event', '/MesJM2L/{year:\d+}/{intervention:\w+}/link') | |||
config.add_route('link_event_user', '/MesJM2L/{year:\d+}/{intervention:\w+}/link_user') | |||
config.add_route('link_event_tiers', '/MesJM2L/{year:\d+}/{intervention:\w+}/link_tiers') | |||
config.add_route('edit_event', '/MesJM2L/{year:\d+}/{intervention:\w+}{sep:/*}{event_id:([\w-]+)?}') | |||
## Entities | |||
@@ -79,6 +79,13 @@ class TiersMember(MyBaseForm): | |||
year_uid = SelectField(u'Année', coerce=int, choices=zip(range(2006,2016),range(2006,2016))) | |||
user_uid = TextField(u'user') | |||
role = TextField(u'Role') | |||
class TiersRole(MyBaseForm): | |||
class Meta: | |||
csrf = False | |||
year_uid = SelectField(u'Année', coerce=int, choices=zip(range(2006,2016),range(2006,2016))) | |||
tiers_role = SelectField(u'Role', choices=TIERS_ROLE) | |||
class TiersChoice(MyBaseForm): | |||
class Meta: | |||
@@ -96,6 +103,13 @@ class AddIntervenant(MyBaseForm): | |||
event_uid = HiddenField() | |||
intervenant = SelectField(u'Intervenant', coerce=int ) | |||
class AddTiers(MyBaseForm): | |||
class Meta: | |||
csrf = False | |||
event_uid = HiddenField() | |||
tiers = SelectField(u'Entité', coerce=int ) | |||
class ConfCreateForm(MyBaseForm): | |||
event_type = HiddenField() | |||
@@ -133,6 +147,29 @@ class ConfCreateForm(MyBaseForm): | |||
class ConfUpdateForm(ConfCreateForm): | |||
uid = HiddenField() | |||
class SalleForm(MyBaseForm): | |||
year_uid = SelectField(u'Année', coerce=int) | |||
phy_salle_id = SelectField('Salle Physique', coerce=int) | |||
place_type = SelectField('Type', choices=[('Conference','Conference'), | |||
('Stand','Stand'), ('Ateliers','Ateliers'), ('Autres','Autres') ]) | |||
name = TextField('Nom de la salle', [validators.Length(min=1, max=40)], | |||
filters=[strip_filter]) | |||
description = TextAreaField('Description', | |||
filters=[strip_filter]) | |||
class EditSalleForm(SalleForm): | |||
salle_id = HiddenField() | |||
class SallePhyForm(MyBaseForm): | |||
name = TextField('Nom de la salle', [validators.Length(min=1, max=40)], | |||
filters=[strip_filter]) | |||
nb_places = TextField('Nombre de places', [validators.Length(max=4)]) | |||
description = TextAreaField('Description', | |||
filters=[strip_filter]) | |||
class EditSallePhyForm(SallePhyForm): | |||
uid = HiddenField() | |||
class PlaceCreateForm(MyBaseForm): | |||
place_type = SelectField('Type', choices=PLACE_TYPE) | |||
@@ -342,7 +379,9 @@ class TiersForm(MyBaseForm): | |||
description = u"Vous pouvez insérer les détails" | |||
) | |||
membership = FieldList(FormField(TiersMember)) | |||
membership = FieldList(FormField(TiersMember)) | |||
roles = FieldList(FormField(TiersRole)) | |||
class UpdateTiersForm(TiersForm): | |||
uid = HiddenField() | |||
@@ -345,6 +345,7 @@ class Salles(Base): | |||
created = Column(DateTime, default=datetime.datetime.now) | |||
last_change = Column(DateTime, default=datetime.datetime.now) | |||
phy = relationship(SallePhy) | |||
@classmethod | |||
def by_id(cls, uid): | |||
return DBSession.query(cls).filter(cls.salle_id == uid).first() | |||
@@ -0,0 +1,90 @@ | |||
# -*- coding: utf-8 -*- | |||
<%inherit file="jm2l:templates/layout.mako"/> | |||
<% | |||
from slugify import slugify | |||
%> | |||
<a style="float:right;" class="btn btn-mini btn-info" role="button" href="/Salles"> | |||
<i class="icon-plus-sign icon-white"></i> Ajouter une Salle | |||
</a> | |||
<h3>Gestion des salles JM2L</h3> | |||
<div class="row-fluid"> | |||
<div class="span10 offset1"> | |||
<div class="tabbable" id="main_tab"> | |||
<ul class="nav nav-tabs" style="margin-bottom: 5px;"> | |||
% for Num, Entity in enumerate(sorted(DicSalle.keys(), key=lambda x:x.year_uid)): | |||
<li class="${["","active"][Num==0]}"> | |||
<a href="#${Entity.year_uid}" id="Map_Pole_${Entity.year_uid}" data-toggle="tab">${Entity.year_uid}</a> | |||
</li> | |||
% endfor | |||
</ul> | |||
<div class="tab-content" style="padding:0 10px"> | |||
% for Num, Entity in enumerate(sorted(DicSalle.keys(), key=lambda x:x.year_uid)): | |||
<div class="tab-pane fade ${["","active "][Num==0]} in" id="${Entity.year_uid}"> | |||
<h4>${Entity.year_uid}</h4> | |||
<table class="table table-striped table-bordered table-hover"> | |||
<thead> | |||
<tr> | |||
<th colspan="2" style="text-align:center;"> | |||
Liste des salles | |||
</th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
% if len(DicSalle[Entity])==0: | |||
<tr> | |||
<td style="text-align:center;"> | |||
<i>Il n'y a pas de salle définie pour l'année ${Entity.year_uid}</i> | |||
</td> | |||
</tr> | |||
% endif | |||
% for Salle in DicSalle[Entity]: | |||
<tr> | |||
<td> | |||
${Salle.place_type or ""} <a href="/Salles/${Salle.salle_id}">${Salle.name or ""}</a> | |||
${len(Salle.allevents)} : [ | |||
% for e in Salle.allevents: | |||
<a href="/event/${e.for_year}/${e.slug}">${e.uid}</a>, | |||
% endfor | |||
] | |||
<div class="pull-right"> | |||
% if Salle.phy_salle_id: | |||
[ <a href="/PhySalles/${Salle.phy_salle_id}">${Salle.phy.name}</a> ${Salle.phy.nb_places} places ] | |||
% else: | |||
[ <a href="/PhySalles">Créer</a> ] | |||
% endif | |||
</div> | |||
</td> | |||
</tr> | |||
% if Salle.description: | |||
<tr> | |||
<td><div>${Salle.description | n}</div></td> | |||
</tr> | |||
% endif | |||
% endfor | |||
</tbody> | |||
</table> | |||
</div> | |||
% endfor | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
<%def name="jsAddOn()"> | |||
<script> | |||
$('a[data-toggle="tab"]') | |||
.on('shown', function(e) { | |||
//stateObj = { tab: $(e.target).attr('href').substr(1) }; | |||
//history.replaceState(stateObj, "", "/Staff" + $(e.target).attr('href') ); | |||
location.hash = $(e.target).attr('href'); | |||
}); | |||
if (location.hash !== '') { | |||
$('a[href="' + location.hash + '"]').tab('show'); | |||
} | |||
</script> | |||
</%def> |
@@ -0,0 +1,58 @@ | |||
# -*- coding: utf-8 -*- | |||
<%inherit file="jm2l:templates/layout.mako"/> | |||
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | |||
<%def name="jsAddOn()"> | |||
<script src="/js/jm2l.js"></script> | |||
<script src="/vendor/ckeditor/ckeditor.js"></script> | |||
<script src="/vendor/select2/js/select2.js"></script> | |||
</%def> | |||
<%def name="cssAddOn()"> | |||
<link rel="stylesheet" href="/css/jm2l.css" /> | |||
<link rel="stylesheet" href="/vendor/select2/css/select2.css" type="text/css" media="screen" /> | |||
</%def> | |||
<div class="row-fluid"> | |||
<div class="span10 offset1"> | |||
<a class="btn" href="${request.route_path('list_salles')}"> | |||
<i class="icon-arrow-left"></i> Retour à la liste | |||
</a> | |||
% if 'salle_id' in form._fields.keys(): | |||
<a class="btn btn-danger btn-mini pull-right" href="${request.route_path('action_salle', action='delete', salle_id=form.salle_id.data)}"> | |||
<i class="icon-remove icon-white"></i> Supprimer cette salle | |||
</a> | |||
%endif | |||
% if 'salle_id' in form._fields.keys(): | |||
<h3>Editer une Salle</h3> | |||
% else: | |||
<h3>Ajouter une Salle</h3> | |||
%endif | |||
<% | |||
DicForm = { | |||
'year_uid': {'PlaceHolder':u"Année", "FieldStyle":"width:7em;", "ContainerStyle":"float:left;" }, | |||
'phy_salle_id': {'PlaceHolder':u"Salle Physique", "FieldStyle":"width:20em;", "ContainerStyle":"float:left;" }, | |||
'place_type': {'PlaceHolder':u"Type d'évenement","FieldStyle":"width:15em;" }, | |||
'name': {'PlaceHolder':u"Nom de la salle", "FieldStyle":"width:90%;" }, | |||
'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" }, | |||
} | |||
%> | |||
% if 'salle_id' in form._fields.keys(): | |||
<form action="/Salles/${form.salle_id.data}" method="post"> | |||
${form.salle_id()} | |||
%else: | |||
<form action="/Salles" method="post"> | |||
%endif | |||
${helpers.DisplayForm(form, DicForm)} | |||
<br> | |||
<center> | |||
<button type="submit" class="btn btn-large btn-primary" /> | |||
<i class="icon-ok icon-white"></i> Enregistrer | |||
</button> | |||
</center> | |||
</form> | |||
</div> | |||
</div> |
@@ -0,0 +1,61 @@ | |||
# -*- coding: utf-8 -*- | |||
<%inherit file="jm2l:templates/layout.mako"/> | |||
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> | |||
<%def name="jsAddOn()"> | |||
<script src="/js/jm2l.js"></script> | |||
<script src="/vendor/ckeditor/ckeditor.js"></script> | |||
<script src="/vendor/select2/js/select2.js"></script> | |||
</%def> | |||
<%def name="cssAddOn()"> | |||
<link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload.css"> | |||
<link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui.css"> | |||
<link rel="stylesheet" href="/css/jm2l.css" /> | |||
<link rel="stylesheet" href="/vendor/select2/css/select2.css" type="text/css" media="screen" /> | |||
<!-- CSS adjustments for browsers with JavaScript disabled --> | |||
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-noscript.css"></noscript> | |||
<noscript><link rel="stylesheet" href="/vendor/fileupload/css/jquery.fileupload-ui-noscript.css"></noscript> | |||
</%def> | |||
<div class="row-fluid"> | |||
<div class="span10 offset1"> | |||
<a class="btn" href="${request.route_path('list_salles')}"> | |||
<i class="icon-arrow-left"></i> Retour à la liste | |||
</a> | |||
% if 'uid' in form._fields.keys(): | |||
<h3>Editer une Salle Physique</h3> | |||
% else: | |||
<h3>Ajouter une Salle Physique</h3> | |||
%endif | |||
<% | |||
DicForm = { | |||
'name': {'PlaceHolder':u"Nom de la salle", "FieldStyle":"width:25em;", "ContainerStyle":"float:left;" }, | |||
'nb_places': {'PlaceHolder':u"Nombre de places", "FieldStyle":"width:10em;" }, | |||
'description': {'PlaceHolder':u"Description", "ContainerStyle":"width:95%;min-height:150px;padding-top: 12px;", "ckeditor":"1" }, | |||
} | |||
%> | |||
% if 'uid' in form._fields.keys(): | |||
<form action="/PhySalles/${form.uid.data}" method="post"> | |||
${form.uid()} | |||
%else: | |||
<form action="/PhySalles" method="post"> | |||
%endif | |||
${helpers.DisplayForm(form, DicForm)} | |||
<br> | |||
<center> | |||
<button type="submit" class="btn btn-large btn-primary" /> | |||
<i class="icon-ok icon-white"></i> Enregistrer | |||
</button> | |||
</center> | |||
</form> | |||
% if 'uid' in form._fields.keys(): | |||
<center> | |||
${helpers.uploader("salle", form.uid.data, u"Attachement" )} | |||
</center> | |||
%endif | |||
</div> | |||
</div> |
@@ -99,12 +99,31 @@ DicForm = { | |||
% endif | |||
% if 'uid' in form._fields: | |||
<fieldset> | |||
<legend>Indiquez l'entité dont vous faites la promotion :</legend> | |||
<p> | |||
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link_tiers" method="POST"> | |||
${formAddT.event_uid} | |||
<input type="hidden" id="tiers" name="tiers" style="width:20em;" | |||
class="form-control select2-offscreen" tabindex="-1"> | |||
</input> | |||
<button type="submit" class="btn btn-primary" /> | |||
<i class="icon-plus icon-white"></i> Ajouter cette entitée | |||
</button> | |||
</form> | |||
NB : Notez que les entités séléctionnées apparaissent dans les exposants. | |||
</p> | |||
</fieldset> | |||
<fieldset> | |||
<legend>Ajouter vos co-intervenants</legend> | |||
<p> | |||
Vous avez la possibilité d'être plusieurs pour un même évenement.<br> | |||
Chacun des intervenants doit être inscrit sur le site. | |||
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link" method="POST"> | |||
<form action="/MesJM2L/${form.for_year.data}/${form.event_type.data}/link_user" method="POST"> | |||
${formAdd.event_uid} | |||
<input type="hidden" id="intervenant" name="intervenant" style="width:20em;" | |||
class="form-control select2-offscreen" tabindex="-1"> | |||
@@ -134,6 +153,21 @@ DicForm = { | |||
<script src="/vendor/select2/js/select2.js"></script> | |||
<script> | |||
jQuery(function() { | |||
$("#tiers").select2( | |||
{ | |||
placeholder: 'Entrez ici votre entitée', | |||
minimumInputLength: 2, allowClear: true, | |||
ajax: { | |||
quietMillis: 250, url: "/json-tiers", dataType: 'json', | |||
data: function (term, page) { | |||
return { pageSize: 8, pageNum: page, searchTerm: term }; | |||
}, | |||
results: function (data, page) { | |||
var more = (page * 8) < data.Total; | |||
return { results: data.Results, more: more }; | |||
} | |||
} | |||
}); | |||
$("#intervenant").select2( | |||
{ | |||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||
@@ -24,8 +24,9 @@ DicForm = { | |||
'name': {'PlaceHolder':u"Nom", 'ContainerStyle':"padding-right:5px;float:left;width:35em;", "FieldStyle":"width:31em;"}, | |||
'tiers_type': {'PlaceHolder':u"Nature", 'ContainerStyle':"padding-right:5px;", "FieldStyle":"width:15em;"}, | |||
'description': {'PlaceHolder':u"Description", 'ContainerStyle':"padding-right:5px;padding-top: 20px;", "FieldStyle":"width:90%;min-height:150px;" }, | |||
'website': {'PlaceHolder':u"Site web", 'ContainerStyle':"padding-right:15px;", 'ContainerStyle':"width:30em;"}, | |||
'membership': {'Ignore':True} | |||
'website': {'PlaceHolder':u"Site web", 'ContainerStyle':"padding-right:15px;padding-top: 20px;", 'FieldStyle':"width:30em;"}, | |||
'membership': {'Ignore':True }, | |||
'roles': {'Ignore':True } | |||
} | |||
%> | |||
@@ -33,18 +34,18 @@ DicForm = { | |||
% if 'uid' in form._fields: | |||
<fieldset> | |||
<legend>Acteurs</legend> | |||
<legend>Ses acteurs</legend> | |||
<div class="repeat"> | |||
<table class="wrapper table table-striped table-bordered" width="100%"> | |||
<table class="wrapper table" width="100%"> | |||
<thead> | |||
<tr class="row"> | |||
<th style="width:5em;text-align:center;">Année</th> | |||
<th style="width:22em;">Personne</th> | |||
<th style="width:22em;">Rôle</th> | |||
<th style="width:10em;">Action</th> | |||
<th style="width:22em;text-align:center;">Personne</th> | |||
<th style="width:22em;text-align:center;">Rôle</th> | |||
<th style="width:10em;text-align:center;">Action</th> | |||
</tr> | |||
</thead> | |||
<tbody class="container"> | |||
<tbody class="container" id="tab_member"> | |||
<tr class="row template" style="line-height:2.2em;"> | |||
<td> | |||
<select class="form-control" style="width:5em;" name="membership-{{row-count-placeholder}}-year_uid" | |||
@@ -77,7 +78,7 @@ DicForm = { | |||
<input type="hidden" class="form-control" name="membership-${num}-year_uid" | |||
id="membership-${num}-year_uid" | |||
value="${dicdata.get('year_uid')}" style="width:4em;" /> | |||
<div id="content-${num}-year_uid">${dicdata.get('year_uid')}</div> | |||
<div id="content-member-${num}-year_uid">${dicdata.get('year_uid')}</div> | |||
</td> | |||
<td style="text-align:center;"> | |||
<input type="hidden" class="form-control" name="membership-${num}-user_uid" | |||
@@ -86,17 +87,17 @@ DicForm = { | |||
tmpUser = DBUser.by_id(dicdata.get('user_uid')) | |||
%> | |||
% if tmpUser: | |||
<div id="content-${num}-user_uid">${tmpUser.prenom} ${tmpUser.nom}</div> | |||
<div id="content-member-${num}-user_uid">${tmpUser.prenom} ${tmpUser.nom}</div> | |||
% endif | |||
</td> | |||
<td style="text-align:center;"> | |||
<input type="text" class="form-control" name="membership-${num}-role" style="display:none" | |||
<input type="text" class="form-control" name="membership-${num}-role" style="display:none;width:95%;" | |||
id="membership-${num}-role" | |||
value="${dicdata.get('role', 'Aucun')}" /> | |||
<div id="content-${num}-role"><i>${dicdata.get('role', 'Aucun')}</i></div> | |||
<div id="content-member-${num}-role"><i>${dicdata.get('role', 'Aucun')}</i></div> | |||
</td> | |||
<td> | |||
<a class="btn btn-mini btn-primary" href="javascript:edit(${num})"> | |||
<a class="btn btn-mini btn-primary" href="#" onclick="return edit_member(this, ${num});"> | |||
<i class="icon-pencil icon-white"></i> Edit. | |||
</a> | |||
<span class="remove btn btn-mini btn-danger"> | |||
@@ -117,6 +118,85 @@ DicForm = { | |||
</div> | |||
</fieldset> | |||
% endif | |||
% if 'uid' in form._fields: | |||
<fieldset> | |||
<legend>Ses rôles</legend> | |||
<div class="repeat"> | |||
<table class="wrapper table" width="100%"> | |||
<thead> | |||
<tr class="row"> | |||
<th style="width:5em;text-align:center;">Année</th> | |||
<th style="width:22em;text-align:center;">Rôle</th> | |||
<th style="width:10em;text-align:center;">Action</th> | |||
</tr> | |||
</thead> | |||
<tbody class="container" id="tab_role"> | |||
<tr class="row template" style="line-height:2.2em;"> | |||
<td> | |||
<select class="form-control" style="width:5em;" name="roles-{{row-count-placeholder}}-year_uid" | |||
id="roles-{{row-count-placeholder}}-year_uid"> | |||
% for year in range(2015, 2005, -1): | |||
<% | |||
if year in [2014]: | |||
continue | |||
%> \ | |||
<option value="${year}">${year}</option> | |||
%endfor | |||
</select> | |||
</td> | |||
<td style="text-align: center;"> | |||
<select class="form-control" name="roles-{{row-count-placeholder}}-tiers_role" /> | |||
<option value="Exposant">Exposant</option> | |||
<option value="Sponsor">Sponsor</option> | |||
<option value="Donateur">Donateur</option> | |||
</select> | |||
</td> | |||
<td> | |||
<span class="remove btn btn-mini btn-danger"> | |||
<i class="icon-remove-sign icon-white"></i> Suppr. | |||
</span> | |||
</td> | |||
</tr> | |||
% for num, dicdata in enumerate(form._fields.get("roles").data): | |||
<tr class="row" style="padding:5px;line-height:2.2em;"> | |||
<td style="text-align:center;"> | |||
<input type="hidden" class="form-control" name="roles-${num}-year_uid" | |||
id="roles-${num}-year_uid" | |||
value="${dicdata.get('year_uid')}" style="width:4em;" /> | |||
<div id="content-role-${num}-year_uid">${dicdata.get('year_uid')}</div> | |||
</td> | |||
<td style="text-align:center;"> | |||
<input type="hidden" class="form-control" name="roles-${num}-tiers_role" | |||
id="roles-${num}-tiers_role" | |||
value="${dicdata.get('tiers_role', 'Aucun')}" /> | |||
<div id="content-role-${num}-tiers_role"><i>${dicdata.get('tiers_role', 'Aucun')}</i></div> | |||
</td> | |||
<td> | |||
<a class="btn btn-mini btn-primary" href="#" onclick="return edit_role(this, ${num});"> | |||
<i class="icon-pencil icon-white"></i> Edit. | |||
</a> | |||
<span class="remove btn btn-mini btn-danger"> | |||
<i class="icon-remove-sign icon-white"></i> Suppr. | |||
</span> | |||
</td> | |||
</tr> | |||
% endfor | |||
</tbody> | |||
<tfoot> | |||
<tr> | |||
<td colspan="5" style="text-align:center;line-height: 3em;"> | |||
<span class="add btn btn-mini btn-primary"><i class="icon-plus-sign icon-white"></i> Ajouter</span> | |||
</td> | |||
</tr> | |||
</tfoot> | |||
</table> | |||
</div> | |||
</fieldset> | |||
% endif | |||
% if 'uid' in form._fields: | |||
<button class="btn btn-primary" type="submit">Enregistrer</button> | |||
% else: | |||
@@ -126,12 +206,12 @@ DicForm = { | |||
% if 'uid' in form._fields: | |||
% if request.user: | |||
<fieldset> | |||
<legend>Support liés</legend> | |||
<legend>Les supports liés</legend> | |||
<div style="float:right;width:60%"> | |||
<p> En plus de vos support de présentation classique. | |||
Pensez aussi aux affiches, aux flyers, aux stickers, | |||
au bulletin d'adhésion à une association, à la documentation technique... | |||
Tous ce qui peut être utile, de près ou de loin à la promotion de votre évenement. | |||
Tous ce qui peut être utile, de près ou de loin à sa promotion. | |||
</p> | |||
</div> | |||
${helpers.uploader("tiers", form.uid.data, u"fichiers" )} | |||
@@ -153,9 +233,13 @@ DicForm = { | |||
<script src="/vendor/ckeditor/ckeditor.js"></script> | |||
<script type="text/javascript"> | |||
var year_data = Array(); | |||
var role_data = Array(); | |||
var editor = CKEDITOR.replace('description', { autoGrow_onStartup: true, language: 'fr' } ); | |||
for (var i=2005;i<2016;i++) | |||
year_data.push( {id:i, text:i.toString()}); | |||
role_data.push({id:'Exposant', text:'Exposant'}); | |||
role_data.push({id:'Sponsor', text:'Sponsor'}); | |||
role_data.push({id:'Donateur', text:'Donateur'}); | |||
$("#tiers_type").select2({}); | |||
@@ -173,42 +257,49 @@ jQuery(function() { | |||
{ | |||
is_ready: function(container, therow) { | |||
var numrow=$(container).attr('data-rf-row-count'); | |||
$("#membership-"+ (numrow-1) +"-user_uid").select2( | |||
{ | |||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||
minimumInputLength: 2, allowClear: true, | |||
ajax: { | |||
quietMillis: 250, url: "/json-users", dataType: 'json', | |||
data: function (term, page) { | |||
return { pageSize: 8, pageNum: page, searchTerm: term }; | |||
}, | |||
results: function (data, page) { | |||
var more = (page * 8) < data.Total; | |||
return { results: data.Results, more: more }; | |||
if ($(container).attr("id")=="tab_member") { | |||
$("#membership-"+ (numrow-1) +"-user_uid").select2( | |||
{ | |||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||
minimumInputLength: 2, allowClear: true, | |||
ajax: { | |||
quietMillis: 250, url: "/json-users", dataType: 'json', | |||
data: function (term, page) { | |||
return { pageSize: 8, pageNum: page, searchTerm: term }; | |||
}, | |||
results: function (data, page) { | |||
var more = (page * 8) < data.Total; | |||
return { results: data.Results, more: more }; | |||
} | |||
} | |||
} | |||
}); | |||
$("#membership-"+ (numrow-1) +"-year_uid").select2({}); | |||
}); | |||
$("#membership-"+ (numrow-1) +"-year_uid").select2({}); | |||
} | |||
if ($(container).attr("id")=="tab_role") { | |||
$("#roles-"+ (numrow-1) +"-year_uid").select2({}); | |||
$("#roles-"+ (numrow-1) +"-tiers_role").select2({}); | |||
} | |||
} | |||
}); | |||
}); | |||
}); | |||
function edit(num) { | |||
$("#content-"+ num +"-year_uid").hide(); | |||
function edit_member(srcobj, num) { | |||
$(srcobj).addClass("disabled"); | |||
$("#content-member-"+ num +"-year_uid").hide(); | |||
$("#membership-"+ num +"-year_uid").select2({ | |||
width:'80px', | |||
data: year_data | |||
}); | |||
$('select').select2(); | |||
$("#content-"+ num +"-user_uid").hide(); | |||
//$('select').select2(); | |||
$("#content-member-"+ num +"-user_uid").hide(); | |||
$("#membership-"+ num +"-user_uid").select2( | |||
{ | |||
width:'250px', | |||
placeholder: 'Entrez ici un Nom ou un Prénom', | |||
minimumInputLength: 2, allowClear: true, | |||
initSelection: function(element, callback){ | |||
callback({id: element.val(), text: $("#content-"+ num +"-user_uid").text() }) | |||
callback({id: element.val(), text: $("#content-member-"+ num +"-user_uid").text() }) | |||
}, | |||
ajax: { | |||
quietMillis: 250, url: "/json-users", dataType: 'json', | |||
@@ -221,8 +312,25 @@ function edit(num) { | |||
} | |||
} | |||
}); | |||
$("#content-"+ num +"-role").hide(); | |||
$("#content-member-"+ num +"-role").hide(); | |||
$("#membership-"+ num +"-role").show(); | |||
return false; | |||
}; | |||
function edit_role(srcobj, num) { | |||
$(srcobj).addClass("disabled"); | |||
$("#roles-"+ num +"-year_uid").select2({ | |||
width:'80px', | |||
data: year_data | |||
}); | |||
$("#roles-"+ num +"-tiers_role").select2({ | |||
width:'100%', | |||
data: role_data | |||
}); | |||
$("#content-role-"+ num +"-year_uid").hide(); | |||
$("#content-role-"+ num +"-tiers_role").hide(); | |||
$("#roles-"+ num +"-tiers_role").show(); | |||
return false; | |||
}; | |||
</script> | |||
</%def> |
@@ -233,7 +233,7 @@ HandleControls(); | |||
function handlevote() { | |||
currentIndex = $('div.active').index() + 1; | |||
$('.carousel-vote a').attr('href', "/vote_logo/" + currentIndex ) | |||
if (currentIndex==${request.user.vote_logo}) { | |||
if (currentIndex==${request.user.vote_logo or 0}) { | |||
$('.carousel-vote a').removeClass('btn-primary').addClass('btn-success') | |||
$('.carousel-vote a').html("<i class='icon-ok icon-white'></i> Mon préféré ! "); | |||
} else { | |||
@@ -38,6 +38,13 @@ ${The_entity_type.entity_subtype} | |||
<p>Cette entité n'a pas de description.</p> | |||
% endif | |||
</div> | |||
<div class="footborderbox"> | |||
% if entity.website: | |||
<div style="float:right;"> | |||
<a href="${entity.website}">${entity.website}</a> | |||
</div> | |||
% endif | |||
</div> | |||
% if 0: | |||
% for media in entity.PhotosLinks: | |||
@@ -87,7 +94,7 @@ ${The_entity_type.entity_subtype} | |||
</div> | |||
</p> | |||
% endfor | |||
<br/><br/> | |||
<p style="float:right;">Créé le ${entity.created.strftime('%d %b %Y').decode('utf-8')}</p> | |||
<br/> | |||
<hr/> | |||
@@ -11,7 +11,7 @@ import magic | |||
import subprocess | |||
import cStringIO as StringIO | |||
# Database access imports | |||
from .models import User, Place, Tiers, Event | |||
from .models import User, Place, Tiers, Event, SallePhy | |||
MIN_FILE_SIZE = 1 # bytes | |||
MAX_FILE_SIZE = 500000000 # bytes | |||
@@ -84,11 +84,7 @@ class MediaPath(): | |||
if media_table=='place': | |||
slug = Place.by_id(linked_id).slug | |||
if media_table=='salle': | |||
phyid = Salles.by_id(linked_id).phy_salle_id | |||
if phyid: | |||
slug = SallePhy.by_id(phyid) | |||
else: | |||
slug = linked_id | |||
slug = SallePhy.by_id(linked_id).slug | |||
p = IMAGEPATH + [ media_table ] + [ slug ] | |||
elif media_table=='presse': | |||
# Use Year in linked_id | |||
@@ -364,6 +364,74 @@ def action_task_area(request): | |||
DBSession.delete(Pole) | |||
return HTTPFound(location=request.route_url('list_task')) | |||
@view_config(route_name='list_salles', renderer='jm2l:templates/Salles/list.mako') | |||
def list_salles(request): | |||
DicSalle = {} | |||
years = DBSession.query( JM2L_Year ).all() | |||
for year in years: | |||
salles = DBSession.query( Salles )\ | |||
.filter( Salles.year_uid==year.year_uid )\ | |||
.order_by(Salles.name).all() | |||
DicSalle[year] = salles | |||
return {'DicSalle': DicSalle } | |||
@view_config(route_name='handle_salle', renderer='jm2l:templates/Salles/salle.mako') | |||
def handle_salle(request): | |||
salle_id = request.matchdict.get('salle_id') | |||
if salle_id: | |||
Salle = Salles.by_id(int(salle_id)) | |||
if not Salle: | |||
raise HTTPNotFound() | |||
form = EditSalleForm(request.POST, Salle, meta={'csrf_context': request.session}) | |||
else: | |||
Salle = Salles() | |||
form = SalleForm(request.POST, Salle, meta={'csrf_context': request.session}) | |||
form.year_uid.choices = map(tuple, DBSession.query(JM2L_Year.year_uid, JM2L_Year.year_uid).all()) | |||
form.phy_salle_id.choices = map(tuple, DBSession.query(SallePhy.uid, SallePhy.name).all()) | |||
if request.method == 'POST' and form.validate(): | |||
form.populate_obj(Salle) | |||
if 'uid' in form._fields.keys(): | |||
DBSession.merge(Salle) | |||
else: | |||
DBSession.add(Salle) | |||
return HTTPFound(location=request.route_url('list_salles')) | |||
return {'form':form } | |||
@view_config(route_name='handle_salle_phy', renderer='jm2l:templates/Salles/salle_phy.mako') | |||
def handle_salle_phy(request): | |||
salle_id = request.matchdict.get('salle_id') | |||
if salle_id: | |||
Salle = SallePhy.by_id(int(salle_id)) | |||
if not Salle: | |||
raise HTTPNotFound() | |||
form = EditSallePhyForm(request.POST, Salle, meta={'csrf_context': request.session}) | |||
else: | |||
Salle = SallePhy() | |||
form = SallePhyForm(request.POST, Salle, meta={'csrf_context': request.session}) | |||
if request.method == 'POST' and form.validate(): | |||
form.populate_obj(Salle) | |||
Salle.slug = slugify(Salle.name) | |||
if 'uid' in form._fields.keys(): | |||
DBSession.merge(Salle) | |||
else: | |||
DBSession.add(Salle) | |||
return HTTPFound(location=request.route_url('list_salles')) | |||
return {'form':form } | |||
@view_config(route_name='action_salle') | |||
def action_salle(request): | |||
action = request.matchdict.get('action') | |||
salle_id = request.matchdict.get('salle_id') | |||
Salle = Salles.by_id(int(salle_id)) | |||
if not Salle: | |||
raise HTTPNotFound() | |||
if action=='delete': | |||
request.session.flash(('info', u'La Salle a été supprimée !')) | |||
DBSession.delete(Salle) | |||
return HTTPFound(location=request.route_url('list_salles')) | |||
## =-=- Here, We handle HTTP requests - User Logged Part -=-= | |||
@view_config(route_name='exchange', renderer="jm2l:templates/Logistique/Logistique.mako") | |||
def exchange(request): | |||
@@ -757,9 +825,9 @@ def show_event(request): | |||
'event':TheEvent, 'logged_in':request.authenticated_userid } | |||
return MainTab | |||
@view_config(route_name='link_event') | |||
def link_event(request): | |||
""" Create user if not exist, add it to current event """ | |||
@view_config(route_name='link_event_user') | |||
def link_event_user(request): | |||
""" Get user and add it to current event """ | |||
year = int(request.matchdict.get('year', -1)) | |||
form = AddIntervenant(request.POST, meta={'csrf_context': request.session}) | |||
intervention = request.matchdict.get('intervention', None) | |||
@@ -778,6 +846,34 @@ def link_event(request): | |||
return HTTPFound(location=request.route_url('edit_event', sep='/', | |||
year=str(year), intervention=intervention, event_id=str(TargetEvent.uid))) | |||
@view_config(route_name='link_event_tiers') | |||
def link_event_tiers(request): | |||
""" Create user if not exist, add it to current event """ | |||
year = int(request.matchdict.get('year', -1)) | |||
form = AddTiers(request.POST, meta={'csrf_context': request.session}) | |||
intervention = request.matchdict.get('intervention', None) | |||
TargetEvent = Event.by_id(form.event_uid.data) | |||
Exist = Tiers.by_id(form.tiers.data) | |||
if not Exist: | |||
request.session.flash(('error',u"Une erreur s'est produite lors de l'ajout de votre entitée !")) | |||
return HTTPFound(location=request.route_url('edit_event', sep='/', | |||
year=str(year), intervention=intervention, event_id=str(TargetEvent.uid))) | |||
else: | |||
TargetTiers = Exist | |||
if len(DBSession.query(Role_Tiers)\ | |||
.filter(Role_Tiers.year_uid==year)\ | |||
.filter(Role_Tiers.tiers_role=="Exposant")\ | |||
.filter(Role_Tiers.tiers_uid==TargetTiers.uid)\ | |||
.all())==0: | |||
tev = Role_Tiers(year_uid=year, tiers_role="Exposant", tiers_uid=TargetTiers.uid) | |||
DBSession.add(tev) | |||
return HTTPFound(location=request.route_url('edit_event', sep='/', | |||
year=str(year), intervention=intervention, event_id=str(TargetEvent.uid))) | |||
@view_config(route_name='edit_event', renderer="jm2l:templates/edit_event.mako") | |||
def edit_event(request): | |||
year = int(request.matchdict.get('year', -1)) | |||
@@ -836,6 +932,16 @@ def edit_event(request): | |||
# Put some users on form | |||
formAdd.intervenant.choices = [(u.uid, "%s %s" % (u.nom, u.prenom)) | |||
for u in Users] | |||
# Each event can get severals entities | |||
formAddT = AddTiers(event_uid=TheEvent.uid) | |||
# Build list of entities | |||
# Get entities from db | |||
TmpTiers = DBSession.query(Tiers)\ | |||
.order_by('name').limit(10) | |||
# Put some entities on form | |||
formAddT.tiers.choices = [(u.uid, "%s %s" % (u.nom, u.prenom)) | |||
for u in Users] | |||
else: | |||
TheEvent = Event() | |||
# prepare the form for creation | |||
@@ -849,6 +955,11 @@ def edit_event(request): | |||
duration=60 | |||
# No intervenant | |||
formAdd = None | |||
formAddT = None | |||
SalleDispo = DBSession.query(Salles)\ | |||
.filter(Salles.year_uid==year)\ | |||
.order_by('name') | |||
if intervention=="Conference": | |||
form.duration.choices =[ | |||
@@ -861,27 +972,27 @@ def edit_event(request): | |||
form.duration.choices.append( (duration,u'Conférence (%d min)' % duration) ) | |||
if not form._fields.has_key("uid"): | |||
form.duration.data=60 | |||
SalleDispo = SalleDispo.filter(Salles.place_type=='Conference') | |||
elif intervention=="Stand": | |||
form.duration.choices =[ | |||
(8*60, u'Toute la journée'), | |||
(4*60, u'une demi-journée') | |||
] | |||
SalleDispo = SalleDispo.filter(Salles.place_type=='Stand') | |||
elif intervention=="Atelier": | |||
form.duration.choices = map( lambda d:(d, u'Atelier (%dh%.2d)' % (d/60, d%60) ), \ | |||
[60, 90, 120, 150, 180, 210, 240] ) | |||
if not duration in map(lambda (d,y): d, form.duration.choices): | |||
form.duration.choices.append( (duration,u'Atelier (%dh%.2d)' % (duration/60, duration%60) ) ) | |||
SalleDispo = SalleDispo.filter(Salles.place_type=='Ateliers') | |||
elif intervention=="Table_Ronde": | |||
form.duration.choices = map( lambda d:(d, u'Table ronde (%dh%.2d)' % (d/60, d%60) ), \ | |||
[60, 90, 120, 150] ) | |||
if not duration in map(lambda (d,y): d, form.duration.choices): | |||
form.duration.choices.append( (duration,u'Table ronde (%dh%.2d)' % (duration/60, duration%60) ) ) | |||
form.duration.choices.append( (duration,u'Table ronde (%dh%.2d)' % (duration/60, duration%60) ) ) | |||
SalleDispo = SalleDispo.filter(Salles.place_type=='Conference') | |||
else: | |||
return HTTPForbidden(u"Pas encore disponible.") | |||
SalleDispo = DBSession.query(Salles)\ | |||
.filter(Salles.year_uid==year)\ | |||
.order_by('name') | |||
form.salle_uid.choices = [(s.salle_id, s.name) for s in SalleDispo] | |||
form.start_sel.choices = TimeSlots | |||
@@ -900,14 +1011,14 @@ def edit_event(request): | |||
uev.user_uid = request.user.uid | |||
TheEvent.interventions.append( uev ) | |||
DBSession.flush() | |||
request.session.flash(('sucess','Votre intervention a été créee !')) | |||
request.session.flash(('sucess',u'Votre intervention a été créee !')) | |||
return HTTPFound(location=request.route_url('edit_event', sep='/', | |||
year=str(year), intervention=intervention, event_id=str(TheEvent.slug))) | |||
else: | |||
DBSession.merge(TheEvent) | |||
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'', | |||
'event':TheEvent, 'form':form, 'formAdd':formAdd, | |||
'event':TheEvent, 'form':form, 'formAdd':formAdd, 'formAddT':formAddT, | |||
'logged_in':request.authenticated_userid } | |||
return MainTab | |||
@@ -979,18 +1090,30 @@ def edit_tiers(request): | |||
#test_form = TiersForm(request.POST, TheTiers, meta={'csrf_context': request.session}) | |||
if request.method == 'POST' and form.validate(): | |||
print request.POST | |||
ToDelete = list() | |||
ToDeleteR = list() | |||
# First, we remove entries no more present | |||
for obj in form.membership.object_data: | |||
MatchEntry = filter( lambda x: x.object_data and x.object_data._sa_instance_state == obj._sa_instance_state, | |||
form.membership.entries ) | |||
if not MatchEntry: | |||
ToDelete.append(obj) | |||
# For roles too | |||
for obj in form.roles.object_data: | |||
MatchEntry = filter( lambda x: x.object_data and x.object_data._sa_instance_state == obj._sa_instance_state, | |||
form.roles.entries ) | |||
if not MatchEntry: | |||
ToDeleteR.append(obj) | |||
# We should remove it as it's not in original data | |||
for obj in ToDelete: | |||
TheTiers.membership.remove(obj) | |||
DBSession.delete(obj) | |||
# For roles too | |||
for obj in ToDeleteR: | |||
TheTiers.roles.remove(obj) | |||
DBSession.delete(obj) | |||
# Then, it's time to consider new entries | |||
for entry in form.membership.entries: | |||
if entry.object_data is None: | |||
@@ -998,6 +1121,14 @@ def edit_tiers(request): | |||
entry.object_data = TmpUser | |||
TheTiers.membership.append(TmpUser) | |||
form.membership.object_data = TheTiers.membership | |||
# For roles too | |||
for entry in form.roles.entries: | |||
if entry.object_data is None: | |||
TmpRole = Role_Tiers() | |||
entry.object_data = TmpRole | |||
TheTiers.roles.append(TmpRole) | |||
form.roles.object_data = TheTiers.roles | |||
form.populate_obj(TheTiers) | |||
# Handle Remove of accents | |||
TheTiers.slug = slugify(form.name.data) | |||