Le repo des sources pour le site web des JM2L
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

176 lines
8.1 KiB

  1. # -*- coding: utf8 -*-
  2. from pyramid.authentication import AuthTktAuthenticationPolicy
  3. from pyramid.authorization import ACLAuthorizationPolicy
  4. from pyramid.config import Configurator
  5. from pyramid.renderers import JSON, JSONP
  6. from pyramid.session import SignedCookieSessionFactory
  7. from pyramid.events import BeforeRender
  8. from sqlalchemy import engine_from_config
  9. from pyramid.renderers import render_to_response
  10. from .models import DBSession, get_user, get_sponsors, get_exposants
  11. from .security import EntryFactory, groupfinder
  12. from pyramid_mailer import mailer_factory_from_settings
  13. from pyramid_mailer.message import Attachment, Message
  14. import locale
  15. from .helpers import Sejour_helpers
  16. from apscheduler.schedulers.background import BackgroundScheduler
  17. # Database access imports
  18. from pyramid.request import Request
  19. from mako.template import Template
  20. from .models import User
  21. import logging
  22. def add_renderer_globals(event):
  23. event['mytrip'] = Sejour_helpers(event)
  24. #@sched.scheduled_job('cron', day_of_week='sun', hour=22, minute=07)
  25. def mailer_tasks(config):
  26. # Send the Welcome Mail
  27. mailer = config.registry['mailer']
  28. Contact = DBSession.query(User).filter(User.uid==1).one()
  29. request = Request.blank('/', base_url='http://jm2l.linux-azur.org')
  30. request.registry = config.registry
  31. for StaffUser in DBSession.query(User).filter(User.Staff == True):
  32. # Skip mail to contact
  33. if StaffUser==Contact:
  34. continue
  35. # Skip those that have no task assigned
  36. if len(filter(lambda k:not k.closed, StaffUser.task_assoc))==0:
  37. continue
  38. # Prepare Plain Text Message :
  39. Mail_template = Template(filename='jm2l/templates/mail_plain.mako')
  40. mail_plain = Mail_template.render(request=request, User=StaffUser, Contact=Contact, action="Tasks")
  41. print mail_plain
  42. # Prepare HTML Message :
  43. Mail_template = Template(filename='jm2l/templates/mail_html.mako')
  44. mail_html = Mail_template.render(request=request, User=StaffUser, Contact=Contact, action="Tasks")
  45. print mail_html
  46. # Prepare Message
  47. message = Message(subject="[JM2L] Rappel des Tâches pour les JM2L",
  48. sender="contact@jm2l.linux-azur.org",
  49. recipients=[StaffUser.mail],
  50. body=mail_plain, html=mail_html)
  51. message.add_bcc("spam@style-python.fr")
  52. mailer.send(message)
  53. def main(global_config, **settings):
  54. """ This function returns a Pyramid WSGI application.
  55. """
  56. locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
  57. engine = engine_from_config(settings, 'sqlalchemy.')
  58. DBSession.configure(bind=engine)
  59. # Extract secrets from configuration file if any
  60. CookiesPasswd = settings.get('secret_Cookies', 'itsthefirstseekreet')
  61. AuthTktPasswd = settings.get('secret_AuthTkt', 'itsthesecondseekreet')
  62. my_session_factory = SignedCookieSessionFactory(CookiesPasswd)
  63. authentication_policy = AuthTktAuthenticationPolicy(AuthTktPasswd,
  64. callback=groupfinder, hashalg='sha512', debug=True)
  65. authorization_policy = ACLAuthorizationPolicy()
  66. config = Configurator(settings=settings,
  67. root_factory='.security.RootFactory',
  68. authentication_policy=authentication_policy,
  69. authorization_policy=authorization_policy
  70. )
  71. config.add_subscriber(add_renderer_globals, BeforeRender)
  72. config.registry['mailer'] = mailer_factory_from_settings(settings)
  73. sched = BackgroundScheduler()
  74. #sched.add_job(mailer_tasks, 'interval', minutes=1, args=[ config ])
  75. sched.add_job(mailer_tasks, 'cron', day_of_week='fri', hour=18, args=[ config ])
  76. sched.start() # start the scheduler
  77. config.add_renderer('json', JSON(indent=4))
  78. config.add_renderer('jsonp', JSONP(param_name='callback'))
  79. config.set_session_factory(my_session_factory)
  80. config.add_request_method(get_user, 'user', reify=True)
  81. config.add_request_method(get_sponsors, 'sponsors', reify=False)
  82. config.add_request_method(get_exposants, 'exposants', reify=False)
  83. config.add_static_view('static', 'static', cache_max_age=3600)
  84. config.add_static_view('img', 'static/img', cache_max_age=3600)
  85. config.add_static_view('css', 'static/css', cache_max_age=3600)
  86. config.add_static_view('js', 'static/js', cache_max_age=3600)
  87. config.add_static_view('vendor', 'static/vendor', cache_max_age=3600)
  88. config.add_static_view('upload', 'upload', cache_max_age=3600)
  89. config.add_static_view('resources', 'resources', cache_max_age=3600)
  90. # ICal Routes
  91. config.add_route('progr_iCal', '/{year:\d+}/JM2L.ics')
  92. # JSON Routes
  93. config.add_route('users_json', '/json-users')
  94. config.add_route('tiers_json', '/json-tiers')
  95. config.add_route('progr_json', '/{year:\d+}/le-prog-json')
  96. config.add_route('timeline_json', '/{year:\d+}/timeline-json')
  97. # Session setting Routes
  98. config.add_route('year', '/year/{year:\d+}')
  99. config.add_route('vote_logo', '/vote_logo/{num:\d+}')
  100. # HTML Routes - Staff
  101. config.add_route('list_task', '/Staff')
  102. config.add_route('handle_pole', '/Staff/poles{sep:/*}{pole_id:(\d+)?}')
  103. config.add_route('handle_task', '/Staff/tasks{sep:/*}{task_id:(\d+)?}')
  104. config.add_route('action_task', '/Staff/{action:(\w+)}/{task_id:(\d+)}')
  105. config.add_route('action_task_area', '/Staff/pole/{action:(\w+)}/{pole_id:(\d+)}')
  106. config.add_route('list_salles', '/ListSalles')
  107. config.add_route('handle_salle', '/Salles{sep:/*}{salle_id:(\d+)?}')
  108. config.add_route('handle_salle_phy', '/PhySalles{sep:/*}{salle_id:(\d+)?}')
  109. config.add_route('action_salle', '/Salles/{action:(\w+)}/{salle_id:(\d+)}')
  110. config.add_route('pict_salle', '/salle_picture/{salle_id:(\d+)}')
  111. config.add_route('list_users', '/ListParticipant')
  112. # HTML Routes - Public
  113. config.add_route('home', '/{year:(\d+/)?}')
  114. config.add_route('edit_index', '/{year:\d+}/edit')
  115. config.add_route('presse', '/{year:\d+}/dossier-de-presse')
  116. config.add_route('edit_presse', '/{year:\d+}/dossier-de-presse/edit')
  117. config.add_route('programme', '/{year:\d+}/le-programme')
  118. config.add_route('plan', 'nous-rejoindre')
  119. config.add_route('participer', 'participer-l-evenement')
  120. config.add_route('captcha', '/captcha')
  121. ## Events
  122. config.add_route('event', '/event/{year:\d+}/{event_id:([\w-]+)?}')
  123. config.add_route('link_event_user', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_user')
  124. config.add_route('link_event_tiers', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_tiers')
  125. config.add_route('edit_event', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}{sep:/*}{event_id:([\w-]+)?}')
  126. ## Entities
  127. config.add_route('entities', '/entities') #{sep:/*}{Nature:\w+?}')
  128. config.add_route('add_entity', '/entity')
  129. config.add_route('delete_entity', '/entity/{entity_id:(\d+)}/delete')
  130. config.add_route('show_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}')
  131. config.add_route('edit_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)}/edit')
  132. config.add_route('edit_entity_cat', '/categorie/entity')
  133. ## Users
  134. config.add_route('pict_user', '/user_picture')
  135. config.add_route('show_user', '/user/{user_slug:([\w-]+)?}')
  136. # HTML Routes - Logged
  137. #config.add_route('profil', 'MesJM2L')
  138. config.add_route('jm2l', '/MesJM2L')
  139. config.add_route('miam', '/MonMiam')
  140. config.add_route('sejour', '/MonSejour')
  141. config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}')
  142. # Handle exchanges
  143. config.add_route('exchange', '/{year:\d+}/exchange/{modtype:\w+}/{id:(\d+)}/{action:\w+}')
  144. # Handle authentication
  145. config.add_route('register', '/register')
  146. config.add_route('auth', '/sign/{action}')
  147. config.add_route('bymail', '/sign/jm2l/{hash}')
  148. # Handle Multimedia and Uploads
  149. config.add_route('media_view', '/image/{media_table:\w+}/{uid:\d+}/{name:.+}')
  150. config.add_route('media_upload', '/uploader/{media_table:\w+}/{uid:\d+}/proceed{sep:/*}{name:.*}')
  151. config.scan()
  152. return config.make_wsgi_app()