Le repo des sources pour le site web des JM2L
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

242 lignes
7.8 KiB

  1. # -*- coding: utf8 -*-
  2. import os
  3. import sys
  4. import transaction
  5. import time
  6. import lxml.etree as ET
  7. from sqlalchemy import engine_from_config
  8. from sqlalchemy import create_engine, MetaData, Table
  9. import unicodedata
  10. import urllib
  11. # Usefull tools
  12. from slugify import slugify
  13. from sqlite3 import dbapi2 as sqlite
  14. import sqlite3
  15. from os import path
  16. from pyramid.paster import (
  17. get_appsettings,
  18. setup_logging,
  19. )
  20. from string import printable
  21. from random import choice
  22. from sqlalchemy import orm, or_
  23. from jm2l.models import *
  24. from datetime import datetime
  25. def usage(argv):
  26. cmd = os.path.basename(argv[0])
  27. print('usage: %s <config_uri>\n'
  28. '(example: "%s development.ini")' % (cmd, cmd))
  29. sys.exit(1)
  30. def make_session(connection_string):
  31. engine = create_engine(connection_string, echo=False, convert_unicode=True)
  32. Session = sessionmaker(bind=engine)
  33. return Session(), engine
  34. def quick_mapper(table):
  35. Base = declarative_base()
  36. class GenericMapper(Base):
  37. __table__ = table
  38. return GenericMapper
  39. def pull_data(from_db, to_db, tables):
  40. source, sengine = make_session(from_db)
  41. smeta = MetaData(bind=sengine)
  42. destination, dengine = make_session(to_db)
  43. for table_name in tables:
  44. print 'Processing', table_name
  45. print 'Pulling schema from source server'
  46. table = Table(table_name, smeta, autoload=True)
  47. print 'Creating table on destination server'
  48. table.metadata.create_all(dengine)
  49. NewRecord = quick_mapper(table)
  50. columns = table.columns.keys()
  51. print 'Transferring records'
  52. for record in source.query(table).all():
  53. data = dict(
  54. [(str(column), getattr(record, column)) for column in columns]
  55. )
  56. if table_name=='salle':
  57. if data['place_type']=='Ateliers':
  58. data['place_type']='Atelier'
  59. if table_name=='events':
  60. if data['event_type']=='Concert':
  61. data['event_type']='MAO'
  62. try:
  63. destination.merge(NewRecord(**data))
  64. except:
  65. print data
  66. pass
  67. print 'Committing changes'
  68. destination.commit()
  69. def main(argv=sys.argv):
  70. connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite"
  71. engine = create_engine(connection_string, echo=False, convert_unicode=True)
  72. DBSession.configure(bind=engine)
  73. Users = DBSession.query(User)
  74. ListUser = filter(lambda x: x.is_Intervenant, Users)
  75. for i in ListUser:
  76. print i.mail
  77. def main4(argv=sys.argv):
  78. import csv
  79. from sqlalchemy import func
  80. connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite"
  81. if 1:
  82. conn = sqlite3.connect("/home/tr4ck3ur/Dev/jm2l/JM2L.sqlite")
  83. c = conn.cursor()
  84. try:
  85. c.execute("ALTER TABLE users ADD COLUMN wifi_user VARCHAR(80);")
  86. c.execute("ALTER TABLE users ADD COLUMN wifi_pass VARCHAR(80);")
  87. except:
  88. pass # handle the error
  89. c.close()
  90. engine = create_engine(connection_string, echo=False, convert_unicode=True)
  91. DBSession.configure(bind=engine)
  92. with transaction.manager:
  93. f = open("/home/tr4ck3ur/Dev/jm2l/wifi-11-11-pass.csv", 'rt')
  94. try:
  95. reader = csv.reader(f)
  96. for row in reader:
  97. prenom, nom, w_user, w_pass = row
  98. slug = unicode( slugify(prenom +" "+nom) )
  99. u = DBSession.query(User)\
  100. .filter(User.slug==slug).first()
  101. if u:
  102. u.wifi_user = w_user
  103. u.wifi_pass = w_pass
  104. DBSession.merge(u)
  105. print row, u
  106. finally:
  107. f.close()
  108. if 0:
  109. p0, p1 = orm.aliased(User,name="p0"), orm.aliased(User ,name="p1")
  110. import pprint
  111. def main_3(argv=sys.argv):
  112. connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite"
  113. engine = create_engine(connection_string, echo=True, convert_unicode=True)
  114. DBSession.configure(bind=engine)
  115. p0, p1 = orm.aliased(User,name="p0"), orm.aliased(User ,name="p1")
  116. import pprint
  117. ## permtation
  118. with transaction.manager:
  119. Datas = DBSession.query(p0, p1)\
  120. .filter(p0.slug==p1.slug)\
  121. .filter(p0.uid!=p1.uid)\
  122. .filter(p0.last_logged<p1.last_logged)\
  123. .with_entities(p0.slug,p0.uid,p1.uid).all()
  124. for slug, idsrc, iddst in Datas:
  125. print slug
  126. # Events
  127. Events = DBSession.query(User_Event)\
  128. .filter(User_Event.user_uid==idsrc)
  129. for uev in Events:
  130. uev.user_uid = iddst
  131. DBSession.merge(uev)
  132. DBSession.flush()
  133. UTiers = DBSession.query(User_Tiers)\
  134. .filter(User_Tiers.user_uid==idsrc)
  135. for ut in UTiers:
  136. ut.user_uid=iddst
  137. DBSession.merge(ut)
  138. DBSession.flush()
  139. orig = DBSession.query(User).filter(User.uid==idsrc).one()
  140. DBSession.delete(orig)
  141. #User_Event.year_uid, Event.name
  142. #pprint.pprint( )
  143. #pprint.pprint( DBSession.query( user_id
  144. def main_(argv=sys.argv):
  145. if len(argv) != 2:
  146. usage(argv)
  147. config_uri = argv[1]
  148. setup_logging(config_uri)
  149. settings = get_appsettings(config_uri)
  150. engine = engine_from_config(settings, 'sqlalchemy.')
  151. DBSession.configure(bind=engine)
  152. Base.metadata.create_all(engine)
  153. DBSession.flush()
  154. pull_data("sqlite:////home/tr4ck3ur/Dev/jm2l/PRD_JM2L.sqlite",
  155. "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite",
  156. ['users',
  157. 'staff_tasks_area',
  158. 'staff_tasks',
  159. 'user_event_link',
  160. 'jm2l_year',
  161. 'users',
  162. 'tiers_opt',
  163. 'tiers',
  164. 'role_tiers_link',
  165. 'user_tiers_link',
  166. 'medias',
  167. 'phy_salle',
  168. 'salle',
  169. 'place',
  170. 'itineraire',
  171. 'exchange_category',
  172. 'exchanges',
  173. 'sejour',
  174. 'events',
  175. 'entries'
  176. ])
  177. def Initialize():
  178. with transaction.manager:
  179. admin = User(nom=u'jm2l', prenom=u'contact',
  180. slug=u'contact jm2l', password=u'jm2l',
  181. mail=u'contact@jm2l.linux-azur.org',
  182. Staff=1
  183. )
  184. DBSession.add(admin)
  185. # Create 2015 year event
  186. jm2l = JM2L_Year(year_uid=2015,
  187. state="Ongoing",
  188. description=u"%d, %dème édition des JM2L." % ( 2015, 9 ),
  189. start_time=datetime.strptime("28-11-2015 10:00","%d-%m-%Y %H:%M"),
  190. end_time=datetime.strptime("28-11-2015 19:00","%d-%m-%Y %H:%M")
  191. )
  192. DBSession.add(jm2l)
  193. # Create 2015 Physic room event
  194. phy_salle = SallePhy( name=u"Polytech salle 211",
  195. description=u"Salle informatique, présence de postes de travail",)
  196. DBSession.add(phy_salle)
  197. DBSession.flush()
  198. # Create matching room place (Name could change each year)
  199. salle = Salles(name=u"Mystère", description=u"Salle Mystère",
  200. phy_salle_id = phy_salle.uid,
  201. year_uid = jm2l.year_uid)
  202. DBSession.add(salle)
  203. with transaction.manager:
  204. # Re-Generate passwords
  205. for u in DBSession.query(User).filter(User.Staff==None):
  206. # Fix empty fields
  207. password = ''.join(choice(printable[:-6]) for _ in range(12))
  208. u.password = password
  209. u.Staff = 0
  210. DBSession.merge(u)
  211. print u.nom, u.prenom, u.Staff