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.
 
 
 
 
 

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