浏览代码

Added Caroussel for Room pictures

Fix mail from Damien remarks
Added room pictures
Added tiers deletion
Added Redirect to login when not logged
master
父节点
当前提交
7cf8f61c4e
共有 14 个文件被更改,包括 165 次插入41 次删除
  1. +3
    -2
      jm2l/__init__.py
  2. +7
    -2
      jm2l/models.py
  3. +2
    -2
      jm2l/static/css/jm2l.css
  4. 二进制
      jm2l/static/img/no-image.jpg
  5. +2
    -0
      jm2l/templates/Salles/pict_salle.mako
  6. +18
    -0
      jm2l/templates/edit_event.mako
  7. +13
    -4
      jm2l/templates/edit_tiers.mako
  8. +41
    -0
      jm2l/templates/helpers.mako
  9. +1
    -0
      jm2l/templates/layout.mako
  10. +14
    -16
      jm2l/templates/mail_html.mako
  11. +6
    -5
      jm2l/templates/view_event.mako
  12. +6
    -1
      jm2l/templates/view_tiers.mako
  13. +9
    -3
      jm2l/upload.py
  14. +43
    -6
      jm2l/views.py

+ 3
- 2
jm2l/__init__.py 查看文件

@@ -67,6 +67,7 @@ def main(global_config, **settings):
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+)}')
config.add_route('pict_salle', '/salle_picture/{salle_id:(\d+)}')

# HTML Routes - Public
config.add_route('home', '/{year:(\d+/)?}')
@@ -86,10 +87,10 @@ def main(global_config, **settings):
## Entities
config.add_route('entities', '/entities') #{sep:/*}{Nature:\w+?}')
config.add_route('add_entity', '/entity')
config.add_route('add_entity', '/entity')
config.add_route('delete_entity', '/entity/{entity_id:(\d+)}/delete')
config.add_route('show_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}')
config.add_route('edit_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)}/edit')
config.add_route('edit_entity_cat', '/categorie/entity')
## Users


+ 7
- 2
jm2l/models.py 查看文件

@@ -260,8 +260,8 @@ class Tiers(Base):
roles = relationship('Role_Tiers', backref="roles_tiers") #secondary='role_tiers_link' )
@classmethod
def by_id(cls, id):
return DBSession.query(cls).filter(cls.uid == id).first()
def by_id(cls, uid):
return DBSession.query(cls).filter(cls.uid == uid).first()
@classmethod
def by_slug(cls, slug):
@@ -348,6 +348,11 @@ class SallePhy(Base):
@classmethod
def by_id(cls, uid):
return DBSession.query(cls).filter(cls.uid == uid).first()

@property
def PhotosLinks(self):
from .upload import MediaPath
return MediaPath().get_list('salle', self.uid, 'Image')
class Salles(Base):
__tablename__ = 'salle'


+ 2
- 2
jm2l/static/css/jm2l.css 查看文件

@@ -205,8 +205,8 @@ a {
border: 1px solid #d4d4d4;
}
.ShowEntities td img {
width: 100%;
height: 100%;
width: 5em;
height: 5em;
}

.ShowEntities td:hover {


二进制
jm2l/static/img/no-image.jpg 查看文件

之前 之后
宽度: 279  |  高度: 279  |  大小: 6.9 KiB

+ 2
- 0
jm2l/templates/Salles/pict_salle.mako 查看文件

@@ -0,0 +1,2 @@
<%namespace name="helpers" file="jm2l:templates/helpers.mako"/>
${helpers.show_salles(Salles, IdSalle)}

+ 18
- 0
jm2l/templates/edit_event.mako 查看文件

@@ -20,6 +20,9 @@
<div class="row-fluid">
<div class="span10 offset1">

<div id="SalleCarousel">
${helpers.show_salles( Salles, form.salle_uid.data or form.salle_uid.choices[0][0] )}
</div>

% if 'uid' in form._fields:
<div class="borderboxtime">
@@ -31,6 +34,7 @@
</div>
%endif
<h3 style="line-height:30px;" class="lowshadow">${form.event_type.data}</h3>

% if 'uid' in form._fields:
<div class="borderbox">
Intrevenants programmés:
@@ -186,6 +190,20 @@ DicForm = {
}
}
});
$(document.body).on("change","#salle_uid",function(){
$.ajax({
url:'/salle_picture/' + this.value,
success:function(result, status, jqXHR){
var pictureresult = $('<div />').append(result).find('#MyPictureCarousel').html();
var picturename = $('<div />').append(result).find('#CarName').html();
$('#MyPictureCarousel').html(pictureresult);
$('#CarName').html(picturename);
},
error:function(result, error){
alert(error);
},
});
});
});
</script>
</%def>


+ 13
- 4
jm2l/templates/edit_tiers.mako 查看文件

@@ -12,7 +12,11 @@
<div class="row-fluid">
<div class="span10 offset1">
% if 'uid' in form._fields.keys():
<a class="btn btn-danger btn-mini pull-right" href="${request.route_path('delete_entity', action='delete_entity', entity_id=form.uid.data)}">
<i class="icon-remove icon-white"></i> Supprimer cette entit&eacute;e
</a>
%endif
<a class="pull-right" href="/categorie/entity">Editer les catégories</a>
<br>
<form action="" method="POST">
@@ -196,12 +200,17 @@ DicForm = {
</fieldset>
% endif
<br>
<center>
<button type="submit" class="btn btn-large btn-primary" />
% if 'uid' in form._fields:
<button class="btn btn-primary" type="submit">Enregistrer</button>
<i class="icon-ok icon-white"></i> Mettre &agrave; jour
% else:
<button class="btn btn-primary" type="submit">Proposer</button>
<i class="icon-ok icon-white"></i> Proposer
</button>
% endif
</center>
</form>
% if 'uid' in form._fields:
% if request.user:


+ 41
- 0
jm2l/templates/helpers.mako 查看文件

@@ -506,6 +506,47 @@ TabJs = {'select':[], 'desc':[]}
</div>
</%def> \
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="show_salles(Salles, IdSalle)"> \
<div class="profile-icon pull-right" style="padding: 0 15px;">
<%
if not IdSalle:
return ""
SallePhy = Salles.by_id(IdSalle).phy
if not SallePhy:
return ""
photos = SallePhy.PhotosLinks
%>
<div id="CarName" style="text-align: center;line-height:20px;"><strong>Salle</strong>: ${Salles.by_id(IdSalle).name}</div>
<div id="MyPictureCarousel" class="carousel slide">
% if len(photos)>1:
<!-- Carousel nav -->
<a class="Ucarousel-control left" href="#MyPictureCarousel" data-slide="prev">&lsaquo;</a>
<a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a>
% endif
<!-- Carousel items -->
<div class="carousel-inner">
% if len(photos):
% for num, link in enumerate(photos):
<div class="${['','active '][num==0]}item" id="UserPic${num}">
<div style="margin:auto;">
<img src="${link}" class="img-polaroid" style="max-height:205px;max-width:235px;" alt="Photo ${SallePhy.name}" />
</div>
</div>
% endfor
% else:
<div class="active item" id="UserPic0">
<div style="margin:auto;width:170px;">
<center>
<img src="/img/no-image.jpg" class="img-polaroid" alt="Photo ${SallePhy.name}" style="max-height:130px;" />
<center>
</div>
</div>
% endif
</div>
</div>
</div>
</%def> \
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
## Wrapper pour les échanges utilisateurs
## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<%def name="show_exchange(Exchange, Asker, Provider)"> \


+ 1
- 0
jm2l/templates/layout.mako 查看文件

@@ -125,6 +125,7 @@ ${helpers.uploader_js()}
% if request.user.Staff:
<li><a href="/Staff">Partie Staff</a></li>
<li><a href="/ListSalles">Gérer les salles</a></li>
<li><a href="/entities">Gérer les entités</a></li>
% endif
<li><a href="/sign/out">Me déconnecter</a></li>
% else:


+ 14
- 16
jm2l/templates/mail_html.mako 查看文件

@@ -5,24 +5,24 @@ Bonjour ${User.prenom},<br>
<br>
Vous venez de vous inscrire sur le site des JM2L et c'est une bonne idée :).<br>
<br>
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :<br>
Pour acc&eacute;der à votre espace il vous suffit dor&eacute;navant de cliquer sur le lien suivant :<br>
<a href="${request.route_url('bymail', hash=User.my_hash)}">Votre lien !</a>
<br>
À partir de là vous avez la possibilité de :
À partir de là vous avez la possibilit&eacute; de :
<ul>
<li>inscrire votre stand pour la journée du 28 novembre</li>
<li>inscrire une conférence</li>
<li>inscrire votre stand pour la journ&eacute;e du 28 novembre</li>
<li>inscrire une conf&eacute;rence</li>
<li>inscrire un atelier</li>
<li>chercher/proposer du covoiturage</li>
<li>chercher/proposer un hébergement</li>
<li>chercher/proposer un h&eacute;bergement</li>
<li>vous faire rembourser vos frais</li>
<li>chercher proposer du matériel (câbles, etc)</li>
<li>chercher proposer du mat&eacute;riel (câbles, etc)</li>
</ul>

<p>
Pour plus d'information vous pouvez vous connectez au site des JM2L : http://jm2l.linux-azur.org ou
nous envoyer un mail à «contact at jm2l.linux-azur.org ». Et si vous êtes vraiment perdu vous pouvez
toujours nous téléphoner au +33 6 52 42 31 37.
toujours nous t&eacute;l&eacute;phoner au +33 6 52 42 31 37.
</p>
<p>
Nous vous attendons avec impatience le 28 novembre à Sophia Antipolis pour fêter le libre et partager
@@ -38,29 +38,27 @@ Bonjour ${User.prenom},<br>
<br>
Vous venez de demander le renvoi de vos identifiants sur le site des JM2L.<br>
<br>
Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :<br>
Pour acc&eacute;der à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :<br>
<a href="${request.route_url('bymail', hash=User.my_hash)}">Votre lien !</a>
<br>
N'hésitez pas à l'ajouter à vos liens favoris.
N'h&eacute;sitez pas à l'ajouter à vos liens favoris.
<br>
Vos identifiants de connection sont les suivants:
<br>
<b>Login</b>: ${User.slug}
<br>
<b>Password</b>: ${User.password}
<br>
Une fois connecté vous pouvez changer votre mot de passe sur votre fiche.
<b>Login</b>: ${User.slug}<br>
<b>Password</b>: ${User.password}<br>
Une fois connect&eacute; vous pouvez changer votre mot de passe sur votre fiche.
<br>
<p>
Pour plus d'information vous pouvez nous envoyer un mail à «contact at jm2l.linux-azur.org ». Et si vous êtes vraiment perdu vous pouvez
toujours nous téléphoner au +33 6 52 42 31 37.
toujours nous t&eacute;l&eacute;phoner au +33 6 52 42 31 37.
</p>
<p>
Nous vous attendons avec impatience le 28 novembre 2015 à Sophia Antipolis pour fêter le libre et partager
de la connaissance, de la bonne humeur et du soleil :)
</p>
<br>
L'équipe des <b>JM2L</b>
L'&eacute;quipe des <b>JM2L</b>
<br>
</%def> \
% if action=='Welcome':


+ 6
- 5
jm2l/templates/view_event.mako 查看文件

@@ -8,14 +8,16 @@
</%def>
<div class="row-fluid">
<div class="span10 offset1">

<div id="SalleCarousel">
${helpers.show_salles( Salles, event.Salle.salle_id )}
</div>
<strong>${event.event_type}</strong>:
<div class="borderboxtime">
${event.start_time.strftime('%d %b %Y').decode('utf-8')} -
${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
%if event.Salle:
- <strong>Salle</strong>: ${event.Salle.name}
%endif
##%if event.Salle:
## - <strong>Salle</strong>: ${event.Salle.name}
##%endif
</div>
##%if event.event_uid:
## <a href="http://jm2l.linux-azur.org/node/${event.event_uid}">Link</a> -
@@ -26,7 +28,6 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')}
<a href="/MesJM2L/${event.for_year}/${event.event_type}/${event.slug}">Editer</a>
% endif
<h3 style="line-height:30px;">${event.name}</h3>

% if event.description :
<div class="borderbox">
${event.description | n}


+ 6
- 1
jm2l/templates/view_tiers.mako 查看文件

@@ -17,7 +17,12 @@ ${The_entity_type.entity_subtype}
## <a href="http://jm2l.linux-azur.org/node/${entity.tiers_id}">Link</a> -
##%endif
% if request.user and (request.user.Staff or request.user in entity.members):
<a href="/entity/${entity.get_entity_type.entity_type}/${entity.slug}/edit">Editer</a>
<a href="/entity/${entity.get_entity_type.slug_entity_type}/${entity.slug}/edit">Editer</a>
% endif
% if request.user and (request.user.Staff or request.user in entity.members):
<a class="btn btn-danger btn-mini pull-right" href="${request.route_path('delete_entity', action='delete_entity', entity_id=entity.uid)}">
<i class="icon-remove icon-white"></i> Supprimer cette entit&eacute;e
</a>
% endif
<div clear='both'></div>
<div>


+ 9
- 3
jm2l/upload.py 查看文件

@@ -2,6 +2,7 @@
from pyramid.view import view_config, view_defaults
from pyramid.response import Response
from pyramid.exceptions import NotFound
from pyramid.httpexceptions import HTTPNotFound
from pyramid.request import Request
from PIL import Image
import re, os, shutil
@@ -13,6 +14,7 @@ import cStringIO as StringIO
# Database access imports
from .models import User, Place, Tiers, Event, SallePhy

CurrentYear = 2015
MIN_FILE_SIZE = 1 # bytes
MAX_FILE_SIZE = 500000000 # bytes
IMAGE_TYPES = re.compile('image/(gif|p?jpeg|(x-)?png)')
@@ -103,15 +105,19 @@ class MediaPath():
p = IMAGEPATH + [ media_table ] + [ linked_id ]
elif media_table=='tasks':
# Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
p = IMAGEPATH + [ str(CurrentYear), media_table ] + [ linked_id ]
elif media_table=='poles':
# Use Current Year
p = IMAGEPATH + [ str(2015), media_table ] + [ linked_id ]
p = IMAGEPATH + [ str(CurrentYear), media_table ] + [ linked_id ]
elif media_table in ['RIB', 'Justif']:
slug = User.by_id(linked_id).slug
p = IMAGEPATH + ['users'] + [ slug ] + [ self.media_table ]
elif media_table=='users':
slug = User.by_id(linked_id).slug
user = User.by_id(linked_id)
if not user:
raise HTTPNotFound()
else:
slug = user.slug
p = IMAGEPATH + ['users'] + [ slug ]
elif media_table=='event':
ev = Event.by_id(linked_id)


+ 43
- 6
jm2l/views.py 查看文件

@@ -911,6 +911,11 @@ def change_year(request):
def pict_user(request):
return {"uprofil":request.user}

@view_config(route_name='pict_salle', renderer="jm2l:templates/Salles/pict_salle.mako")
def pict_salle(request):
salle_id = int(request.matchdict.get('salle_id', -1))
return {"Salles":Salles, "IdSalle":salle_id}

@view_config(route_name='event', renderer="jm2l:templates/view_event.mako")
def show_event(request):
year = int(request.matchdict.get('year', -1))
@@ -924,7 +929,7 @@ def show_event(request):
if TheEvent is None:
raise HTTPNotFound()
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'',
'event':TheEvent, 'logged_in':request.authenticated_userid }
'event':TheEvent, 'logged_in':request.authenticated_userid, "Salles":Salles }
return MainTab

@view_config(route_name='link_event_user')
@@ -1121,6 +1126,7 @@ def edit_event(request):
MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'',
'event':TheEvent, 'form':form, 'formAdd':formAdd, 'formAddT':formAddT,
'Salles':Salles,
'logged_in':request.authenticated_userid }
return MainTab
@@ -1154,6 +1160,32 @@ def show_tiers(request):
'entity':TheTiers, 'logged_in':request.authenticated_userid }
return MainTab


@view_config(route_name='delete_entity')
def delete_tiers(request):
entity_id = request.matchdict.get('entity_id', None)
if entity_id:
if entity_id.isdigit():
TheTiers = Tiers.by_id(int(entity_id))
if TheTiers is None:
raise HTTPNotFound()
else:
TheTiers = Tiers.by_slug(entity_id)
if TheTiers is None:
raise HTTPNotFound()
if len(TheTiers.membership)!=0:
request.session.flash(('error', u"Vous devez supprimer tous les membres liés avant la suppression d'une entitée."))
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug, tiers_type=TheTiers.get_entity_type.slug_entity_type))
if len(TheTiers.membership)!=0:
request.session.flash(('error', u"Vous devez supprimer tous les roles liés avant la suppression d'une entitée."))
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug, tiers_type=TheTiers.get_entity_type.slug_entity_type))
DBSession.delete(TheTiers)
request.session.flash(('info', u"L'entitée a bien été supprimée"))
return HTTPFound(location=request.route_url('entities'))
else:
raise HTTPNotFound()


@view_config(route_name='add_entity', renderer="jm2l:templates/edit_tiers.mako")
@view_config(route_name='edit_entity', renderer="jm2l:templates/edit_tiers.mako")
def edit_tiers(request):
@@ -1241,7 +1273,9 @@ def edit_tiers(request):
return HTTPFound(location=request.route_url('edit_entity', sep='/',
entity_id=str(TheTiers.slug), tiers_type=TheTiers.get_entity_type.entity_type))
DBSession.merge(TheTiers)
return HTTPFound(location=request.route_url('entities'))
return HTTPFound(location=request.route_url('show_entity', entity_id=TheTiers.slug,
tiers_type=TheTiers.get_entity_type.slug_entity_type))

MainTab = {'programme':'','presse':'', 'plan':'', 'participer':'',
'form':form, 'DBUser':User, 'UserOptions':UserOptions,
'logged_in':request.authenticated_userid }
@@ -1355,10 +1389,13 @@ def link_role_entity(request):

@forbidden_view_config()
def forbidden(reason, request):
#return Response('forbidden')
request.response.status = 403
return render_to_response('jm2l:templates/Errors/403.mako', { "reason":reason },
request=request)
if 'ident' in reason.detail:
request.session.flash(('info', reason.detail))
return HTTPFound(location='/sign/login' )
else:
request.response.status = 403
return render_to_response('jm2l:templates/Errors/403.mako', { "reason":reason },
request=request)

@notfound_view_config()
def notfound(reason, request):


正在加载...
取消
保存