Le repo des sources pour le site web des JM2L
Não pode escolher mais do que 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.
 
 
 
 
 

711 linhas
28 KiB

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