소스 검색

Added Salle Physical Salle Management

Added Role Form for entities
master
tr4ck3ur des JM2L 9 년 전
부모
커밋
d8ca5c80a5
12개의 변경된 파일593개의 추가작업 그리고 62개의 파일을 삭제
  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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

@@ -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 파일 보기

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


불러오는 중...
취소
저장