Le repo des sources pour le site web des JM2L
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

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