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.
 
 
 
 
 

242 lines
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