소스 검색

Added Caroussel for Room pictures

Fix mail from Damien remarks
Added room pictures
Added tiers deletion
Added Redirect to login when not logged
master
tr4ck3ur des JM2L 9 년 전
부모
커밋
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. BIN
      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 {


BIN
jm2l/static/img/no-image.jpg 파일 보기

Before After
Width: 279  |  Height: 279  |  Size: 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):


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