Browse Source

Added Salle Physical Salle Management

Added Role Form for entities
master
tr4ck3ur des JM2L 10 years ago
parent
commit
d8ca5c80a5
12 changed files with 593 additions and 62 deletions
  1. +11
    -5
      jm2l/__init__.py
  2. +40
    -1
      jm2l/forms.py
  3. +1
    -0
      jm2l/models.py
  4. +90
    -0
      jm2l/templates/Salles/list.mako
  5. +58
    -0
      jm2l/templates/Salles/salle.mako
  6. +61
    -0
      jm2l/templates/Salles/salle_phy.mako
  7. +35
    -1
      jm2l/templates/edit_event.mako
  8. +144
    -36
      jm2l/templates/edit_tiers.mako
  9. +1
    -1
      jm2l/templates/layout.mako
  10. +8
    -1
      jm2l/templates/view_tiers.mako
  11. +2
    -6
      jm2l/upload.py
  12. +142
    -11
      jm2l/views.py

+ 11
- 5
jm2l/__init__.py View File

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


+ 40
- 1
jm2l/forms.py View File

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


+ 1
- 0
jm2l/models.py View File

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


+ 90
- 0
jm2l/templates/Salles/list.mako View File

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

+ 58
- 0
jm2l/templates/Salles/salle.mako View File

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

+ 61
- 0
jm2l/templates/Salles/salle_phy.mako View File

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

+ 35
- 1
jm2l/templates/edit_event.mako View File

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


+ 144
- 36
jm2l/templates/edit_tiers.mako View File

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

+ 1
- 1
jm2l/templates/layout.mako View File

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


+ 8
- 1
jm2l/templates/view_tiers.mako View File

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


+ 2
- 6
jm2l/upload.py View File

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


+ 142
- 11
jm2l/views.py View File

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


Loading…
Cancel
Save