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.
 
 
 
 
 

716 lines
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')