Le repo des sources pour le site web des JM2L
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 

747 linhas
29 KiB

  1. # -*- coding: utf8 -*-
  2. import datetime
  3. import sqlalchemy as sa
  4. import hashlib
  5. from pyramid.security import unauthenticated_userid
  6. from sqlalchemy.orm import relationship, backref
  7. from sqlalchemy import func
  8. from sqlalchemy import or_
  9. from sqlalchemy import (
  10. Column,
  11. Integer,
  12. Unicode,
  13. UnicodeText,
  14. DateTime,
  15. Enum,
  16. Boolean,
  17. ForeignKey
  18. )
  19. from slugify import slugify
  20. from webhelpers.text import urlify
  21. from webhelpers.paginate import PageURL_WebOb, Page
  22. from webhelpers.date import time_ago_in_words
  23. from sqlalchemy.ext.declarative import declarative_base
  24. from sqlalchemy.orm import (
  25. scoped_session,
  26. sessionmaker
  27. )
  28. from zope.sqlalchemy import ZopeTransactionExtension
  29. from jm2l.const import CurrentYear
  30. from passlib.hash import argon2
  31. DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
  32. Base = declarative_base()
  33. class TasksArea(Base):
  34. __tablename__ = 'staff_tasks_area'
  35. uid = Column(Integer, primary_key=True)
  36. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  37. name = Column(Unicode(80))
  38. description = Column(UnicodeText)
  39. @classmethod
  40. def by_id(cls, uid):
  41. return DBSession.query(cls).filter(cls.uid == uid).first()
  42. class Tasks(Base):
  43. __tablename__ = 'staff_tasks'
  44. uid = Column(Integer, primary_key=True)
  45. area_uid = Column(Integer, ForeignKey('staff_tasks_area.uid') )
  46. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  47. due_date = Column(DateTime, default=None)
  48. closed_by = Column(Integer, ForeignKey('users.uid') )
  49. closed_date = Column(DateTime, default=None)
  50. closed = Column(Integer, default=0)
  51. name = Column(Unicode(80))
  52. description = Column(UnicodeText)
  53. area = relationship(TasksArea, backref=backref("tasks") )
  54. assignee = relationship('User', backref=backref("task_assoc") )
  55. @classmethod
  56. def by_id(cls, uid):
  57. return DBSession.query(cls).filter(cls.uid == uid).first()
  58. class User_Event(Base):
  59. """ Créer le lien entre la personne et l' évenement en fonction de l'année"""
  60. __tablename__ = 'user_event_link'
  61. uid = Column(Integer, primary_key=True)
  62. event_uid = Column(Integer, ForeignKey('events.uid') )
  63. #, primary_key=True)
  64. #
  65. user_uid = Column(Integer, ForeignKey('users.uid') )
  66. #, primary_key=True)
  67. #
  68. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  69. role = Column(Unicode(80))
  70. # Define some relation
  71. #user = relationship('User', backref=backref("events_assoc") )
  72. #event = relationship('events', backref=backref("users_assoc") )
  73. class JM2L_Year(Base):
  74. __tablename__ = 'jm2l_year'
  75. year_uid = Column(Integer, primary_key=True)
  76. description = Column(UnicodeText)
  77. doss_presse = Column(UnicodeText)
  78. state = Column(Enum('Archived', 'Cancelled', 'Ongoing'))
  79. start_time = Column(DateTime, default=datetime.datetime.now)
  80. end_time = Column(DateTime, default=datetime.datetime.now)
  81. created = Column(DateTime, default=datetime.datetime.now)
  82. last_change = Column(DateTime, default=datetime.datetime.now)
  83. @classmethod
  84. def get_latest_jm2l_startdate(cls, fakeparam=None):
  85. """ This property will return latest JM2L planned event startdate from database """
  86. last_record = DBSession.query(JM2L_Year) \
  87. .filter(JM2L_Year.start_time ==
  88. DBSession.query(func.max(JM2L_Year.start_time))
  89. ).one()
  90. return last_record.start_time.strftime("%A %d %b %Y").decode('utf-8')
  91. @property
  92. def AvailableTimeSlots(self, TimeStep=30):
  93. Available = self.end_time - self.start_time
  94. NbMinutes = Available.total_seconds()/60
  95. NbSteps = NbMinutes/TimeStep
  96. # Create the range of date each 30min
  97. date_list = [self.start_time + datetime.timedelta(minutes=TimeStep*x) for x in range(0, int(NbSteps))]
  98. # Remove out of range datetime
  99. # Remove hours > 19h
  100. date_list = filter(lambda x:x.hour < 19, date_list)
  101. # Remove hours < 10h
  102. date_list = filter(lambda x:x.hour >= 10, date_list)
  103. # Remove 12h < hours < 13h
  104. date_list = filter(lambda x: x.hour<12 or x.hour>=13, date_list)
  105. return date_list
  106. @property
  107. def DocLinks(self):
  108. from .upload import MediaPath
  109. return zip( sorted(MediaPath().get_list('presse', self.year_uid, 'Other')),
  110. sorted(MediaPath().get_thumb('presse', self.year_uid, 'Other'))
  111. )
  112. class User(Base):
  113. __tablename__ = 'users'
  114. uid = Column(Integer, primary_key=True)
  115. user_id = Column(Integer)
  116. nom = Column(Unicode(80))
  117. prenom = Column(Unicode(80))
  118. pseudo = Column(Unicode(80))
  119. slug = Column(Unicode(164))
  120. mail = Column(Unicode(100))
  121. password = Column(Unicode(100), nullable=False)
  122. fonction = Column(Unicode(80))
  123. website = Column(Unicode(100))
  124. phone = Column(Unicode(10))
  125. created = Column(DateTime, default=datetime.datetime.now)
  126. last_logged = Column(DateTime, default=datetime.datetime.now)
  127. last_change = Column(DateTime, default=datetime.datetime.now)
  128. active = Column(Integer, default=1)
  129. bio = Column(UnicodeText)
  130. gpg_key = Column(UnicodeText)
  131. soc_link = Column(UnicodeText)
  132. Staff = Column(Integer, default=0)
  133. vote_logo = Column(Integer, default=0)
  134. wifi_user = Column(Unicode(80), nullable=True)
  135. wifi_pass = Column(Unicode(80), nullable=True)
  136. # relations
  137. tiers = relationship('Tiers', secondary='user_tiers_link' )
  138. events = relationship('Event', secondary='user_event_link' )
  139. tiersship = relationship('User_Tiers', backref="matching_users")
  140. @classmethod
  141. def by_id(cls, uid):
  142. return DBSession.query(cls).filter(cls.uid == uid).first()
  143. @classmethod
  144. def by_mail(cls, mail):
  145. return DBSession.query(cls).filter(cls.mail == mail).first()
  146. @classmethod
  147. def by_slug(cls, slug):
  148. return DBSession.query(cls).filter(cls.slug == slug).first()
  149. @classmethod
  150. def by_user_id(cls, user_id):
  151. return DBSession.query(cls).filter(cls.user_id == user_id).first()
  152. @classmethod
  153. def by_name(cls, name):
  154. return DBSession.query(cls).filter(cls.nom == name).first()
  155. @classmethod
  156. def by_hash(cls, tsthash):
  157. for u in DBSession.query(cls):
  158. if u.my_hash==tsthash:
  159. return u
  160. return None
  161. @property
  162. def is_Intervenant(self):
  163. """ This property will return if User do an event on specified year """
  164. return DBSession.query(Event).join(User_Event) \
  165. .filter(User_Event.user_uid==self.uid) \
  166. .filter(Event.for_year==CurrentYear).count()
  167. def is_IntervenantOnYear(self, year=CurrentYear):
  168. """ This property will return if User do an event on specified year """
  169. return DBSession.query(Event).join(User_Event) \
  170. .filter(User_Event.user_uid==self.uid) \
  171. .filter(Event.for_year==year).count()
  172. @property
  173. def is_crew(self, year=CurrentYear):
  174. """ This property will return if User subscribe orga task on specified year """
  175. orga_checked = DBSession.query(User, Sejour.orga_part)\
  176. .outerjoin(Sejour) \
  177. .filter(Sejour.for_year == year)\
  178. .filter(User.uid == self.uid).first()
  179. if orga_checked:
  180. return orga_checked
  181. else:
  182. return False
  183. def year_events(self, EventType='All', year=CurrentYear):
  184. if EventType=='All':
  185. return filter(lambda e: e.for_year==year, self.events)
  186. else:
  187. return filter(lambda e: e.for_year==year and e.event_type==EventType, self.events)
  188. @property
  189. def my_hash(self):
  190. m = hashlib.sha1()
  191. m.update("Nobody inspects ")
  192. if self.nom:
  193. m.update(unicode.encode(self.nom,'utf8'))
  194. if self.pseudo:
  195. m.update(unicode.encode(self.pseudo,'utf8'))
  196. if self.prenom:
  197. m.update(unicode.encode(self.prenom,'utf8'))
  198. m.update(" the spammish repetition")
  199. return m.hexdigest()
  200. @property
  201. def Photos(self):
  202. return DBSession.query(Media.filename) \
  203. .filter(Media.media_table=='users') \
  204. .filter(Media.media_type=='Image') \
  205. .filter(Media.link_id == self.user_id).all()
  206. @property
  207. def PhotosLinks(self):
  208. from .upload import MediaPath
  209. return MediaPath().get_list('users', self.uid)
  210. @property
  211. def PhotosThumb(self):
  212. from .upload import MediaPath
  213. return MediaPath().get_thumb('users', self.uid)
  214. def verify_password(self, password):
  215. if not argon2.identify(self.password): # Update existing clear-text password
  216. self.password = argon2.using(rounds=4).hash(self.password)
  217. DBSession.merge(self)
  218. return argon2.verify(password, self.password)
  219. class TiersOpt(Base):
  220. __tablename__ = 'tiers_opt'
  221. uid = Column(Integer, primary_key=True)
  222. entity_type = Column(Unicode(80), nullable=False)
  223. entity_subtype = Column(Unicode(80))
  224. entity_role = Column(Unicode(80))
  225. @property
  226. def slug_entity_type(self):
  227. return slugify(self.entity_type)
  228. @property
  229. def slug_entity_subtype(self):
  230. return slugify(self.entity_subtype)
  231. @classmethod
  232. def get_entity_type(cls):
  233. return DBSession.query(cls, func.count(Tiers.ent_type).label('count'))\
  234. .outerjoin(Tiers)\
  235. .group_by(cls.entity_type).all()
  236. @classmethod
  237. def get_entity_sub_type(cls, entity_type):
  238. return DBSession.query(cls, func.count(Tiers.ent_type).label('count'))\
  239. .outerjoin(Tiers)\
  240. .filter(cls.entity_type == entity_type)\
  241. .group_by(cls.entity_subtype).all()
  242. @classmethod
  243. def by_id(cls, uid):
  244. return DBSession.query(cls).filter(cls.uid == uid).first()
  245. class Tiers(Base):
  246. __tablename__ = 'tiers'
  247. uid = Column(Integer, primary_key=True)
  248. tiers_id = Column(Integer)
  249. name = Column(Unicode(100), nullable=False)
  250. slug = Column(Unicode(100))
  251. description = Column(UnicodeText)
  252. website = Column(Unicode(100))
  253. tiers_type = Column(Integer, ForeignKey('tiers_opt.uid'), default=1)
  254. created = Column(DateTime, default=datetime.datetime.now)
  255. last_change = Column(DateTime, default=datetime.datetime.now)
  256. # relations
  257. ent_type = relationship('TiersOpt')
  258. #members = relationship('User', secondary='user_tiers_link' )
  259. members = relationship(User,
  260. secondary='user_tiers_link',
  261. backref=backref('associate', uselist=False),
  262. lazy='dynamic')
  263. creator_id = Column(Integer)
  264. membership = relationship('User_Tiers', backref="matching_tiers")
  265. roles = relationship('Role_Tiers', backref="roles_tiers") #secondary='role_tiers_link' )
  266. @classmethod
  267. def by_id(cls, uid):
  268. return DBSession.query(cls).filter(cls.uid == uid).first()
  269. @classmethod
  270. def by_slug(cls, slug):
  271. return DBSession.query(cls).filter(cls.slug == slug).first()
  272. @property
  273. def get_entity_type(self):
  274. return DBSession.query(TiersOpt)\
  275. .filter(TiersOpt.uid == self.tiers_type).first()
  276. @property
  277. def logo(self):
  278. return DBSession.query(Media) \
  279. .filter(Media.media_table == 'tiers') \
  280. .filter(Media.media_type == 'Image') \
  281. .filter(Media.link_id == self.uid)
  282. @property
  283. def DocLinks(self):
  284. from .upload import MediaPath
  285. return zip( sorted( MediaPath().get_list('tiers', self.uid, 'Other') ),
  286. sorted( MediaPath().get_thumb('tiers', self.uid, 'Other') )
  287. )
  288. @property
  289. def PhotosLinks(self):
  290. from .upload import MediaPath
  291. return MediaPath().get_list('tiers', self.uid, 'Image')
  292. @property
  293. def ThumbLinks(self):
  294. from .upload import MediaPath
  295. return MediaPath().get_thumb('tiers', self.uid)
  296. class Role_Tiers(Base):
  297. """ Créer le lien entre le tiers et son rôle dans l'évenement en fonction de l'année"""
  298. __tablename__ = 'role_tiers_link'
  299. uid_role = Column(Integer, primary_key=True)
  300. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  301. tiers_uid = Column(Integer, ForeignKey('tiers.uid'))
  302. tiers = relationship(Tiers, backref=backref("roles_assoc") )
  303. tiers_role = Column(Enum('Exposant', 'Sponsor', 'Donateur'))
  304. event_uid = Column(Integer, default=None) # Optionnal link with Event
  305. class User_Tiers(Base):
  306. """ Créer le lien entre la personne et le tiers en fonction de l'année"""
  307. __tablename__ = 'user_tiers_link'
  308. uid_tiers = Column(Integer, primary_key=True)
  309. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  310. tiers_uid = Column(Integer, ForeignKey('tiers.uid'))
  311. tiers = relationship(Tiers, backref=backref("users_assoc") )
  312. user_uid = Column(Integer, ForeignKey('users.uid'))
  313. user = relationship(User, backref=backref("tiers_assoc") )
  314. role = Column(Unicode(80))
  315. class Media(Base):
  316. __tablename__ = 'medias'
  317. media_id = Column(Integer, primary_key=True)
  318. for_year = Column(Integer, ForeignKey('jm2l_year.year_uid'))
  319. media_table = Column(Enum('users', 'tiers', 'place', 'salle', 'RIB', 'Justif', 'event' ))
  320. media_type = Column(Enum('Image', 'Video', 'Pres', 'Document'))
  321. link_id = Column(Integer)
  322. mime_type = Column(Unicode(20))
  323. size = Column(Integer)
  324. width = Column(Integer)
  325. height = Column(Integer)
  326. length = Column(Integer)
  327. filename = Column(UnicodeText)
  328. created = Column(DateTime, default=datetime.datetime.now)
  329. @property
  330. def get_path(self):
  331. #return '/upload/%s/%s/%s' % (self.media_type, self.media_table, self.filename)
  332. return '/resources/%s/%s/%s' % (self.for_year, self.media_type, self.filename)
  333. class SallePhy(Base):
  334. """ Représente une salle dans les locaux """
  335. __tablename__ = 'phy_salle'
  336. uid = Column(Integer, primary_key=True)
  337. name = Column(Unicode(40)) # Numéro de salle vu de polytech
  338. slug = Column(Unicode(40))
  339. description = Column(UnicodeText) # Description du matériel disponible
  340. nb_places = Column(Integer, default=0) # Nombre de places assises
  341. @classmethod
  342. def by_id(cls, uid):
  343. return DBSession.query(cls).filter(cls.uid == uid).first()
  344. @property
  345. def PhotosLinks(self):
  346. from .upload import MediaPath
  347. return MediaPath().get_list('salle', self.uid, 'Image')
  348. class Salles(Base):
  349. __tablename__ = 'salle'
  350. salle_id = Column(Integer, primary_key=True)
  351. phy_salle_id = Column(Integer, ForeignKey('phy_salle.uid'))
  352. year_uid = Column(Integer, ForeignKey('jm2l_year.year_uid'), default=CurrentYear)
  353. name = Column(Unicode(40))
  354. place_type = Column(Enum('Conference', 'Stand', 'Atelier', 'Table ronde', 'MAO', 'Repas', 'Autres'))
  355. description = Column(UnicodeText) # Description du matériel disponible
  356. created = Column(DateTime, default=datetime.datetime.now)
  357. last_change = Column(DateTime, default=datetime.datetime.now)
  358. phy = relationship(SallePhy)
  359. @classmethod
  360. def by_id(cls, uid):
  361. return DBSession.query(cls).filter(cls.salle_id == uid).first()
  362. class Place(Base):
  363. __tablename__ = 'place'
  364. place_id = Column(Integer, primary_key=True)
  365. usage = Column(Boolean, default=False) # By Default / Extended
  366. place_type = Column(Enum('Aeroport', 'Gare', 'JM2L', \
  367. 'Hotel', 'Habitant', 'Restaurant', 'Autres'))
  368. display_name = Column(Unicode(20))
  369. name = Column(Unicode(80))
  370. slug = Column(Unicode(80))
  371. specific = Column(Unicode(80)) # eg Terminal 2
  372. gps_coord = Column(Unicode(30))
  373. adresse = Column(Unicode(100))
  374. codePostal = Column(Unicode(5))
  375. ville = Column(Unicode(40))
  376. website = Column(Unicode(100))
  377. description = Column(UnicodeText)
  378. created_by = Column(Integer, ForeignKey('users.user_id'))
  379. created = Column(DateTime, default=datetime.datetime.now)
  380. last_change = Column(DateTime, default=datetime.datetime.now)
  381. @classmethod
  382. def by_id(cls, uid):
  383. return DBSession.query(cls).filter(cls.place_id == uid).first()
  384. @classmethod
  385. def get_list(cls, All=False):
  386. if All:
  387. return DBSession.query(cls).all()
  388. else:
  389. return DBSession.query(cls).filter(cls.usage==True).all()
  390. class Itineraire(Base):
  391. __tablename__ = 'itineraire'
  392. itin_id = Column(Integer, primary_key=True)
  393. start_place = Column(Integer, ForeignKey('place.place_id')) # Place link
  394. arrival_place = Column(Integer, ForeignKey('place.place_id')) # Place link
  395. distance = Column(Integer)
  396. duration = Column(Integer)
  397. price = Column(Integer)
  398. tr_pied = Column(Boolean, default=False)
  399. tr_velo = Column(Boolean, default=False)
  400. tr_moto = Column(Boolean, default=False)
  401. tr_voiture = Column(Boolean, default=False)
  402. tr_bus = Column(Boolean, default=False)
  403. tr_taxi = Column(Boolean, default=False)
  404. tr_avion = Column(Boolean, default=False)
  405. description = Column(UnicodeText)
  406. created_by = Column(Integer, ForeignKey('users.user_id')) # User link
  407. created = Column(DateTime, default=datetime.datetime.now)
  408. last_change = Column(DateTime, default=datetime.datetime.now)
  409. # relations
  410. start = relationship(Place, foreign_keys=[start_place])
  411. arrival = relationship(Place, foreign_keys=[arrival_place])
  412. class Exchange_Cat(Base):
  413. __tablename__ = 'exchange_category'
  414. cat_id = Column(Integer, primary_key=True)
  415. exch_type = Column(Enum('H', 'C', 'M')) # Heberg, Co-voit, Materiel
  416. exch_subtype = Column(Unicode(80))
  417. description = Column(UnicodeText)
  418. class Exchange(Base):
  419. __tablename__ = 'exchanges'
  420. exch_id = Column(Integer, primary_key=True)
  421. for_year = Column(Integer, ForeignKey('jm2l_year.year_uid')) # link JM2L_Year
  422. exch_done = Column(Boolean, default=False)
  423. exch_state = Column(Enum('Ask', 'Proposal'))
  424. exch_type = Column(Enum('H', 'C', 'M')) # Heberg, Co-Voit, Materiel
  425. exch_categ = Column(Integer, ForeignKey('exchange_category.cat_id')) # Exchange_Cat link
  426. # Users
  427. asker_id = Column(Integer, ForeignKey('users.uid')) # User link
  428. provider_id = Column(Integer, ForeignKey('users.uid')) # User link
  429. start_time = Column(DateTime, default=datetime.datetime.now)
  430. end_time = Column(DateTime, default=datetime.datetime.now)
  431. # Co-voiturage
  432. itin_id = Column(Integer, ForeignKey('itineraire.itin_id')) # Itineraire link
  433. # Hebergement
  434. place_id = Column(Integer, ForeignKey('place.place_id')) # Place link
  435. # Materiel
  436. duration = Column(Integer)
  437. description = Column(UnicodeText)
  438. pictures = Column(Unicode(80))
  439. created_by = Column(Integer) # User link
  440. created = Column(DateTime, default=datetime.datetime.now)
  441. last_change = Column(DateTime, default=datetime.datetime.now)
  442. # relations
  443. Category = relationship(Exchange_Cat, backref="exchanges")
  444. Itin = relationship(Itineraire, backref="exchanged")
  445. asker = relationship(User, foreign_keys=[asker_id], backref="asked")
  446. provider = relationship(User, foreign_keys=[provider_id], backref="provided")
  447. @classmethod
  448. def by_id(cls, uid):
  449. return DBSession.query(cls).filter(cls.exch_id == uid).first()
  450. @classmethod
  451. def get_counters(cls):
  452. return DBSession.query(cls.exch_state, cls.exch_type, cls.exch_done, func.count(cls.exch_id))\
  453. .filter(cls.for_year==CurrentYear)\
  454. .group_by(cls.exch_state, cls.exch_type, cls.exch_done)
  455. @classmethod
  456. def get_my_counters(cls, uid):
  457. return DBSession.query(cls.exch_state, cls.exch_type, cls.exch_done, func.count(cls.exch_id))\
  458. .filter(cls.for_year==CurrentYear)\
  459. .filter( or_(cls.asker_id==uid, cls.provider_id==uid) )\
  460. .group_by(cls.exch_state, cls.exch_type, cls.exch_done)
  461. @classmethod
  462. def get_overview(cls, uid):
  463. # Build a Dic with all exchange to save database access
  464. DicResult= {}
  465. for extype in ['F','C','H','M']:
  466. DicResult[extype] = {}
  467. for exstate in ['Ask','Proposal','Missing','Agree']:
  468. DicResult[extype][exstate]=[]
  469. DicResult[extype]['Counters']={'AllAsk':0, 'AllProp':0, 'AllAgree':0}
  470. Query = DBSession.query(cls)\
  471. .filter(cls.for_year==CurrentYear)\
  472. .order_by(cls.start_time).all()
  473. for item in Query:
  474. if item.exch_done:
  475. DicResult[item.exch_type]['Counters']['AllAgree']+=1
  476. if item.exch_state=='Ask':
  477. DicResult[item.exch_type]['Counters']['AllAsk']+=1
  478. if item.exch_state=='Proposal':
  479. DicResult[item.exch_type]['Counters']['AllProp']+=1
  480. if item.asker_id==uid or item.provider_id==uid:
  481. if item.asker_id==uid and item.exch_state=='Ask':
  482. DicResult[item.exch_type]['Ask'].append(item)
  483. if item.provider_id==uid and item.exch_state=='Ask':
  484. DicResult[item.exch_type]['Proposal'].append(item)
  485. if item.asker_id==uid and item.exch_state=='Proposal':
  486. DicResult[item.exch_type]['Ask'].append(item)
  487. if item.provider_id==uid and item.exch_state=='Proposal':
  488. DicResult[item.exch_type]['Proposal'].append(item)
  489. if item.exch_done:
  490. DicResult[item.exch_type]['Agree'].append(item)
  491. else:
  492. DicResult[item.exch_type]['Missing'].append(item)
  493. return DicResult
  494. @classmethod
  495. def get_pub_list(cls, exch_type):
  496. return DBSession.query(cls).filter(cls.for_year==CurrentYear and cls.exch_state in ['Ask','Proposal'])\
  497. .filter(cls.exch_type=='%s' % exch_type)\
  498. .filter(cls.exch_done==False)\
  499. .all()
  500. @classmethod
  501. def get_my_list(cls, uid, exch_type):
  502. DicResult = {}
  503. DicResult['Ask']=DBSession.query(cls)\
  504. .filter(cls.for_year==CurrentYear)\
  505. .filter( or_(cls.asker_id==uid, cls.provider_id==uid) )\
  506. .filter(cls.exch_type=='%s' % exch_type)\
  507. .filter(cls.exch_state=='Ask')\
  508. .order_by(cls.start_time).all()
  509. DicResult['Proposal']=DBSession.query(cls)\
  510. .filter(cls.for_year==CurrentYear)\
  511. .filter( or_(cls.asker_id==uid, cls.provider_id==uid) )\
  512. .filter(cls.exch_type=='%s' % exch_type)\
  513. .filter(cls.exch_state=='Proposal')\
  514. .order_by(cls.start_time).all()
  515. return DicResult
  516. class Sejour(Base):
  517. __tablename__ = 'sejour'
  518. sej_id = Column(Integer, primary_key=True)
  519. user_id = Column(Integer, ForeignKey('users.uid')) # User link
  520. for_year = Column(Integer, ForeignKey('jm2l_year.year_uid')) # link JM2L_Year
  521. arrival_time = Column(DateTime)
  522. arrival_place = Column(Integer, ForeignKey('place.place_id')) # Place link
  523. arrival_check = Column(Integer, default=0)
  524. arrival_text = Column(Unicode(100))
  525. depart_time = Column(DateTime)
  526. depart_place = Column(Integer, ForeignKey('place.place_id')) # Place link
  527. depart_check = Column(Integer, default=0)
  528. depart_text = Column(Unicode(100))
  529. repas = Column(Integer)
  530. repas_allerg = Column(Unicode(100))
  531. repas_contr = Column(Unicode(100))
  532. orga_part = Column(Integer, default=0)
  533. travel_detail = Column(UnicodeText)
  534. created = Column(DateTime, default=datetime.datetime.now)
  535. last_change = Column(DateTime, default=datetime.datetime.now)
  536. @classmethod
  537. def by_user(cls, uid, year):
  538. return DBSession.query(cls)\
  539. .filter(cls.user_id == uid)\
  540. .filter(cls.for_year == year)\
  541. .first()
  542. class Event(Base):
  543. __tablename__ = 'events'
  544. uid = Column(Integer, primary_key=True)
  545. salle_uid = Column(Integer, ForeignKey('salle.salle_id'))
  546. event_uid = Column(Integer)
  547. for_year = Column(Integer, ForeignKey('jm2l_year.year_uid')) # link JM2L_Year
  548. name = Column(Unicode(100), nullable=False)
  549. slug = Column(Unicode(100))
  550. event_type = Column(Enum('Conference', 'Stand', 'Atelier', 'Table ronde', 'MAO', 'Repas', 'Autres'))
  551. start_time = Column(DateTime, default=datetime.datetime.now)
  552. end_time = Column(DateTime, default=datetime.datetime.now)
  553. description = Column(UnicodeText)
  554. created = Column(DateTime, default=datetime.datetime.now)
  555. last_change = Column(DateTime, default=datetime.datetime.now)
  556. intervenants = relationship(User,
  557. secondary='user_event_link',
  558. backref=backref('participate', uselist=False),
  559. lazy='dynamic')
  560. interventions = relationship(User_Event, backref="matching_events")
  561. Salle = relationship(Salles, backref='allevents')
  562. @classmethod
  563. def by_id(cls, uid):
  564. return DBSession.query(cls)\
  565. .filter(cls.uid == uid).first()
  566. @classmethod
  567. def by_slug(cls, slug, year=None):
  568. if not year is None:
  569. return DBSession.query(cls)\
  570. .filter(cls.for_year==year)\
  571. .filter(cls.slug == slug).first()
  572. else:
  573. return DBSession.query(cls)\
  574. .filter(cls.slug == slug).first()
  575. def get_linked_tiers(self):
  576. ListLink = DBSession.query(Role_Tiers.tiers_uid) \
  577. .filter(Role_Tiers.year_uid==self.for_year) \
  578. .filter(Role_Tiers.tiers_role=="Exposant") \
  579. .filter(Role_Tiers.event_uid==self.uid)
  580. return DBSession.query(Tiers).filter( Tiers.uid.in_( ListLink ) )
  581. @property
  582. def video(self):
  583. return DBSession.query(Media) \
  584. .filter(Media.media_table == 'event') \
  585. .filter(Media.media_type == 'Video') \
  586. .filter(Media.link_id == self.uid)
  587. @property
  588. def presentation(self):
  589. return DBSession.query(Media) \
  590. .filter(Media.media_table == 'event') \
  591. .filter(Media.media_type == 'Pres') \
  592. .filter(Media.link_id == self.uid)
  593. @property
  594. def created_in_words(self):
  595. return time_ago_in_words(self.created)
  596. class Entry(Base):
  597. __tablename__ = 'entries'
  598. id = Column(Integer, primary_key=True)
  599. active = Column(Integer, default=True)
  600. title = Column(Unicode(255), unique=True, nullable=False)
  601. body = Column(UnicodeText, default=u'')
  602. created = Column(DateTime, default=datetime.datetime.now)
  603. edited = Column(DateTime, default=datetime.datetime.now)
  604. @classmethod
  605. def all(cls):
  606. return DBSession.query(Entry).order_by(sa.desc(Entry.created))
  607. @classmethod
  608. def by_id(cls, uid):
  609. return DBSession.query(Entry).filter(Entry.id == uid).first()
  610. @property
  611. def slug(self):
  612. return urlify(self.title)
  613. @property
  614. def created_in_words(self):
  615. return time_ago_in_words(self.created)
  616. @classmethod
  617. def get_paginator(cls, request, page=1):
  618. page_url = PageURL_WebOb(request)
  619. return Page(Entry.all(), page, url=page_url, items_per_page=5)
  620. #class Seances(Base):
  621. # __tablename__ = 'seances'
  622. def get_user(request):
  623. # the below line is just an example, use your own method of
  624. # accessing a database connection here (this could even be another
  625. # request property such as request.db, implemented using this same
  626. # pattern).
  627. userid = unauthenticated_userid(request)
  628. if userid is not None:
  629. # this should return None if the user doesn't exist
  630. # in the database
  631. return DBSession.query(User).filter(User.uid==userid).first()
  632. def get_sponsors(request, Year):
  633. if Year:
  634. return DBSession.query(Tiers)\
  635. .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\
  636. .filter( Role_Tiers.tiers_role == 'Sponsor')\
  637. .filter( Role_Tiers.year_uid == Year)
  638. else:
  639. return DBSession.query(Tiers)\
  640. .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\
  641. .filter( Role_Tiers.tiers_role == 'Sponsor')
  642. def get_exposants(request, Year):
  643. if Year:
  644. return DBSession.query(Tiers)\
  645. .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\
  646. .filter( Role_Tiers.tiers_role == 'Exposant')\
  647. .filter( Role_Tiers.year_uid == Year)
  648. else:
  649. return DBSession.query(Tiers)\
  650. .join(Role_Tiers, Role_Tiers.tiers_uid == Tiers.uid )\
  651. .filter( Role_Tiers.tiers_role == 'Exposant')