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.
 
 
 
 
 

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