Le repo des sources pour le site web des JM2L
Você não pode selecionar mais de 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.
 
 
 
 
 

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