diff --git a/jm2l/__init__.py b/jm2l/__init__.py index 4c5920c..7e29124 100644 --- a/jm2l/__init__.py +++ b/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 diff --git a/jm2l/models.py b/jm2l/models.py index 7443c92..de4aa46 100644 --- a/jm2l/models.py +++ b/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' diff --git a/jm2l/static/css/jm2l.css b/jm2l/static/css/jm2l.css index 60f22ba..3959118 100644 --- a/jm2l/static/css/jm2l.css +++ b/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 { diff --git a/jm2l/static/img/no-image.jpg b/jm2l/static/img/no-image.jpg new file mode 100644 index 0000000..4c0fc21 Binary files /dev/null and b/jm2l/static/img/no-image.jpg differ diff --git a/jm2l/templates/Salles/pict_salle.mako b/jm2l/templates/Salles/pict_salle.mako new file mode 100644 index 0000000..ae5e4c3 --- /dev/null +++ b/jm2l/templates/Salles/pict_salle.mako @@ -0,0 +1,2 @@ +<%namespace name="helpers" file="jm2l:templates/helpers.mako"/> +${helpers.show_salles(Salles, IdSalle)} \ No newline at end of file diff --git a/jm2l/templates/edit_event.mako b/jm2l/templates/edit_event.mako index 86697f0..8c29898 100644 --- a/jm2l/templates/edit_event.mako +++ b/jm2l/templates/edit_event.mako @@ -20,6 +20,9 @@
+
+ ${helpers.show_salles( Salles, form.salle_uid.data or form.salle_uid.choices[0][0] )} +
% if 'uid' in form._fields:
@@ -31,6 +34,7 @@
%endif

${form.event_type.data}

+ % if 'uid' in form._fields:
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 = $('
').append(result).find('#MyPictureCarousel').html(); + var picturename = $('
').append(result).find('#CarName').html(); + $('#MyPictureCarousel').html(pictureresult); + $('#CarName').html(picturename); + }, + error:function(result, error){ + alert(error); + }, + }); + }); }); diff --git a/jm2l/templates/edit_tiers.mako b/jm2l/templates/edit_tiers.mako index 18100f5..5da789d 100644 --- a/jm2l/templates/edit_tiers.mako +++ b/jm2l/templates/edit_tiers.mako @@ -12,7 +12,11 @@
- +% if 'uid' in form._fields.keys(): + + Supprimer cette entitée + +%endif Editer les catégories
@@ -196,12 +200,17 @@ DicForm = { % endif - +
+
+ + Mettre à jour % else: - + Proposer + % endif +
+
% if 'uid' in form._fields: % if request.user: diff --git a/jm2l/templates/helpers.mako b/jm2l/templates/helpers.mako index 30bfb83..3853aa8 100644 --- a/jm2l/templates/helpers.mako +++ b/jm2l/templates/helpers.mako @@ -506,6 +506,47 @@ TabJs = {'select':[], 'desc':[]}
\ ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +<%def name="show_salles(Salles, IdSalle)"> \ +
+ <% + if not IdSalle: + return "" + SallePhy = Salles.by_id(IdSalle).phy + if not SallePhy: + return "" + photos = SallePhy.PhotosLinks + %> +
Salle: ${Salles.by_id(IdSalle).name}
+ +
+ \ +## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ## Wrapper pour les échanges utilisateurs ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= <%def name="show_exchange(Exchange, Asker, Provider)"> \ diff --git a/jm2l/templates/layout.mako b/jm2l/templates/layout.mako index 13d8175..ad6d66f 100644 --- a/jm2l/templates/layout.mako +++ b/jm2l/templates/layout.mako @@ -125,6 +125,7 @@ ${helpers.uploader_js()} % if request.user.Staff:
  • Partie Staff
  • Gérer les salles
  • +
  • Gérer les entités
  • % endif
  • Me déconnecter
  • % else: diff --git a/jm2l/templates/mail_html.mako b/jm2l/templates/mail_html.mako index f3ccf09..66572ec 100644 --- a/jm2l/templates/mail_html.mako +++ b/jm2l/templates/mail_html.mako @@ -5,24 +5,24 @@ Bonjour ${User.prenom},

    Vous venez de vous inscrire sur le site des JM2L et c'est une bonne idée :).

    -Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :
    +Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :
    Votre lien !
    -À partir de là vous avez la possibilité de : +À partir de là vous avez la possibilité de :
      -
    • inscrire votre stand pour la journée du 28 novembre
    • -
    • inscrire une conférence
    • +
    • inscrire votre stand pour la journée du 28 novembre
    • +
    • inscrire une conférence
    • inscrire un atelier
    • chercher/proposer du covoiturage
    • -
    • chercher/proposer un hébergement
    • +
    • chercher/proposer un hébergement
    • vous faire rembourser vos frais
    • -
    • chercher proposer du matériel (câbles, etc)
    • +
    • chercher proposer du matériel (câbles, etc)

    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éléphoner au +33 6 52 42 31 37.

    Nous vous attendons avec impatience le 28 novembre à Sophia Antipolis pour fêter le libre et partager @@ -38,29 +38,27 @@ Bonjour ${User.prenom},

    Vous venez de demander le renvoi de vos identifiants sur le site des JM2L.

    -Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :
    +Pour accéder à votre espace il vous suffit dorénavant de cliquer sur le lien suivant :
    Votre lien !
    -N'hésitez pas à l'ajouter à vos liens favoris. +N'hésitez pas à l'ajouter à vos liens favoris.
    Vos identifiants de connection sont les suivants:
    -Login: ${User.slug} -
    -Password: ${User.password} -
    -Une fois connecté vous pouvez changer votre mot de passe sur votre fiche. +Login: ${User.slug}
    +Password: ${User.password}
    +Une fois connecté vous pouvez changer votre mot de passe sur votre fiche.

    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éléphoner au +33 6 52 42 31 37.

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


    -L'équipe des JM2L +L'équipe des JM2L
    \ % if action=='Welcome': diff --git a/jm2l/templates/view_event.mako b/jm2l/templates/view_event.mako index 53adf51..32776b8 100644 --- a/jm2l/templates/view_event.mako +++ b/jm2l/templates/view_event.mako @@ -8,14 +8,16 @@
    - +
    + ${helpers.show_salles( Salles, event.Salle.salle_id )} +
    ${event.event_type}:
    ${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: - - Salle: ${event.Salle.name} -%endif +##%if event.Salle: +## - Salle: ${event.Salle.name} +##%endif
    ##%if event.event_uid: ## Link - @@ -26,7 +28,6 @@ ${event.start_time.strftime('%H:%M')} à ${event.end_time.strftime('%H:%M')} Editer % endif

    ${event.name}

    - % if event.description :
    ${event.description | n} diff --git a/jm2l/templates/view_tiers.mako b/jm2l/templates/view_tiers.mako index f82913e..900ad95 100644 --- a/jm2l/templates/view_tiers.mako +++ b/jm2l/templates/view_tiers.mako @@ -17,7 +17,12 @@ ${The_entity_type.entity_subtype} ## Link - ##%endif % if request.user and (request.user.Staff or request.user in entity.members): - Editer + Editer +% endif +% if request.user and (request.user.Staff or request.user in entity.members): + + Supprimer cette entitée + % endif
    diff --git a/jm2l/upload.py b/jm2l/upload.py index ce05c93..063d804 100644 --- a/jm2l/upload.py +++ b/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) diff --git a/jm2l/views.py b/jm2l/views.py index c82a5d8..ae76a14 100644 --- a/jm2l/views.py +++ b/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):