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.
 
 
 
 
 

617 lines
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()