# -*- coding: utf8 -*- from pyramid.httpexceptions import HTTPFound, HTTPNotFound, HTTPForbidden from pyramid.httpexceptions import HTTPBadRequest, HTTPUnauthorized from pyramid.renderers import render_to_response from pyramid.response import Response from pyramid.view import notfound_view_config, forbidden_view_config from pyramid.view import view_config from pyramid_mailer import get_mailer from mako.template import Template # Import Web Forms from .forms import * # Database access imports from .models import * from sqlalchemy.exc import DBAPIError from sqlalchemy import func, or_ # Usefull tools from slugify import slugify from icalendar import Calendar from pytz import timezone from icalendar import Event as Evt from pyramid_mailer import get_mailer from pyramid_mailer.message import Attachment, Message # Then, standard libs import webhelpers.paginate as paginate import unicodedata import time import datetime import re CurrentYear = 2015 ## =-=- Here, We keep some usefull function -=-= def remove_accents(input_str): """ This function is intended to remove all accent from input unicode string """ nkfd_form = unicodedata.normalize('NFKD', input_str) only_ascii = nkfd_form.encode('ASCII', 'ignore') return only_ascii ## =-=- Here, We handle ICal requests -=-= @view_config(route_name='progr_iCal', renderer="string") def ICal_Progamme_Request(request): year = int(request.matchdict.get('year', CurrentYear)) # Initialization DicResult = dict() # Query database # Compute days used by all events matching the specified input year Events = DBSession.query(Event)\ .filter(Event.for_year == year)\ .filter(Event.event_type != 'Stand')\ .order_by(Event.start_time) cal = Calendar() cal.add('prodid', '-//Programme %d//jm2l.linux-azur.org//' % year) cal.add('version', '2.0') tz = timezone('Europe/Paris') for ev in Events: if ev.event_type: event = Evt() event['uid'] = "%d/%d" % ( year, ev.uid ) event.add('summary', ev.name ) event.add('dtstart', ev.start_time.replace(tzinfo=tz) ) event.add('dtend', ev.end_time.replace(tzinfo=tz) ) event.add('created', ev.last_change.replace(tzinfo=tz) ) event.add('description', "http://www.linux-azur.org/event/%s/%s" % (ev.for_year, ev.slug) ) event.add('url', "http://www.linux-azur.org/event/%s/%s" % (ev.for_year, ev.slug) ) event.add('priority', 5) cal.add_component(event) return cal.to_ical() ## =-=- Here, We handle Json requests -=-= @view_config(route_name='users_json', renderer="json") def JSON_User_Request(request): """ Build a JSON answer with active users and pagination handling """ # Check arguments consitency pageSize = request.params.get('pageSize',"8") current_page = request.params.get('pageNum',"1") UserQuery = request.params.get('searchTerm', u"") # Don't answer to users that aren't logged if not request.user: raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') # Check consistancy of parameters if pageSize.isdigit() and current_page.isdigit(): current_page = int(current_page) pageSize = int(pageSize) else: return HTTPBadRequest('pageSize and pageNum accept only digits.') # Query database Users = DBSession.query(User.uid, User.nom, User.prenom)\ .filter(User.slug.contains( remove_accents(UserQuery) )) page_url = paginate.PageURL_WebOb(request) records = paginate.Page(Users, current_page, url=page_url, items_per_page=pageSize) ListMatchUser = map( lambda u:{"id": u.uid, "text":"%s %s" % ( u.prenom, u.nom )}, records ) return { "Results": ListMatchUser, "Total":records.item_count, "logged_in":request.authenticated_userid } @view_config(route_name='tiers_json', renderer="json") def JSON_Tiers_Request(request): """ Build a JSON answer with active users and pagination handling """ # Check arguments consitency pageSize = request.params.get('pageSize',"8") current_page = request.params.get('pageNum',"1") TiersQuery = request.params.get('searchTerm', u"") # Don't answer to users that aren't logged if not request.user: raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.') # Check consistancy of parameters if pageSize.isdigit() and current_page.isdigit(): current_page = int(current_page) pageSize = int(pageSize) else: return HTTPBadRequest('pageSize and pageNum accept only digits.') # Query database JTiers = DBSession.query(Tiers.uid, Tiers.name)\ .filter(Tiers.slug.contains( remove_accents(TiersQuery) )) page_url = paginate.PageURL_WebOb(request) records = paginate.Page(JTiers, current_page, url=page_url, items_per_page=pageSize) ListMatchTiers = map( lambda t:{"id": t.uid, "text": t.name }, records ) return { "Results": ListMatchTiers, "Total":records.item_count, "logged_in":request.authenticated_userid } @view_config(route_name='progr_json', renderer="json") def JSON_Progamme_Request(request): year = int(request.matchdict.get('year', CurrentYear)) # Initialization DicResult = dict() # Query database # Compute days used by all events matching the specified input year Days = DBSession.query( func.strftime('%d', Event.start_time).label('day') )\ .filter(Event.for_year == year)\ .filter(Event.event_type != None)\ .group_by(func.strftime('%d', Event.start_time)).all() for Day in Days: Events = DBSession.query(Event)\ .filter(Event.for_year == year)\ .filter(Event.event_type != 'Stand')\ .filter("strftime('%d', start_time) = :dow").params(dow=Day.day)\ .order_by(Event.start_time) ListEv = [] for ev in Events: if ev.event_type: ListEv.append( { "uid":"%d/%d" % ( year, ev.uid ), "desc":ev.name, "startDate":ev.start_time.strftime('%Y-%m-%dT%H:%M:%S'), "endDate":ev.end_time.strftime('%Y-%m-%dT%H:%M:%S'), "placeName":ev.Salle and (ev.Salle.name or "unk") , "status":ev.event_type } ) DicResult[Day.day] = ListEv return { 'all':DicResult } @view_config(route_name='timeline_json', renderer="json") def JSON_TimeLine_Request(request): year = int(request.matchdict.get('year', CurrentYear)) # Initialization DicResult = dict() # Query database # Compute days used by all events matching the specified input year Days = DBSession.query( func.strftime('%d', Event.start_time).label('day') )\ .filter(Event.for_year == year)\ .filter(Event.event_type != None)\ .group_by(func.strftime('%d', Event.start_time)).all() ListEv = [] for Day in Days: Events = DBSession.query(Event)\ .filter(Event.for_year == year)\ .filter(Event.event_type != 'Stand')\ .filter("strftime('%d', start_time) = :dow").params(dow=Day.day)\ .order_by(Event.start_time) #ListEv = [] for ev in Events: if ev.event_type: CurMedia = ev.video.first() or "" if CurMedia: Container = "