ScolaSync  1.0
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
db.py
Aller à la documentation de ce fichier.
1 # -*- coding: utf-8 -*-
2 # $Id: db.py 47 2011-06-13 10:20:14Z georgesk $
3 
4 licence={}
5 licence['en']="""
6  file db.py
7  this file is part of the project scolasync
8 
9  Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
10 
11  This program is free software: you can redistribute it and/or modify
12  it under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version3 of the License, or
14  (at your option) any later version.
15 
16  This program is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  GNU General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with this program. If not, see <http://www.gnu.org/licenses/>.
23 """
24 
25 import os.path, sqlite3, subprocess
26 import version
27 from globaldef import userShareDir
28 
29 database= None # base de données sqlite 3 commune à tous les modules
30 cursor=None
31 
32 ##
33 #
34 # Ouverture de la base de données de l'application, et création si nécessaire.
35 # @return une instance de base de données sqlite3
36 #
37 def openDb():
38  global database, cursor
39  dir=os.path.expanduser(userShareDir)
40  if not os.path.isdir(dir):
41  subprocess.call("mkdir %s" %dir, shell=True)
42  database = sqlite3.connect(os.path.join(dir,"db"))
43  cursor=database.cursor()
44  cursor.execute('''create table if not exists owners (stickid text, uuid text, tatoo text, student text)''')
45  cursor.execute('''create table if not exists version (major text, minor text)''')
46  cursor.execute('''create table if not exists preferences (checkable int, mv int, schoolfile text, workdir text, manfile text, refresh_enabled int, refresh_delay int)''')
47  database.commit()
48  checkVersion(version.major(), version.minor())
49 
50 ##
51 #
52 # Vérifie si la base de données reste compatible.
53 # Un changement de version majeur implique une mise à jour en cas de
54 # base de donnée ancienne. Un changmeent de version mineur n'implique
55 # pas de changement de structure de la base de données.
56 #
57 def checkVersion(major, minor):
58  cursor.execute('''select * from version''')
59  values=cursor.fetchone()
60  if values == None:
61  # pas de version existante, on la crée
62  cursor.execute('''insert into version values (?,?)''', (version.major(), version.minor()))
63  else:
64  major, minor = values
65  if major < version.major():
66  raise KeyError, "The database version is too old!"
67  elif minor < version.minor():
68  cursor.execute("""update version
69  set minor=?
70  where major=?""", (version.minor(), version.major()))
71  database.commit()
72 
73 ##
74 #
75 # vérifie qu'un étudiant est déjà connu
76 # @param student propriétaire du baladeur
77 # @return True si le propriétaire existe déjà
78 #
79 def hasStudent(student):
80  global cursor
81  cursor.execute("select * from owners where student=?", (student,))
82  return cursor.fetchone() != None
83 
84 ##
85 #
86 # dit si une clé USB est déjà connue
87 # @param stickid un identifiant de baladeur
88 # @param uuid un identifiant de partition
89 # @param tattoo un tatouage de partition
90 # @return un booléen vrai si la clé USB est connue, faux sinon
91 #
92 def knowsId(stickid, uuid,tattoo):
93  global cursor
94  cursor.execute("select * from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
95  return cursor.fetchone() != None
96 
97 ##
98 #
99 # Renvoie la liste des tatouages connus de la base de données
100 #
102  global cursor
103  cursor.execute("select tatoo from owners")
104  return cursor.fetchmany()
105 
106 ##
107 #
108 # renvoie l'étudiant qui possède une clé USB
109 # @return un nom d'étudiant ou None si la clé est inconnue
110 #
111 def readStudent(stickid, uuid, tattoo):
112  global cursor
113  cursor.execute("select student from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
114  s = cursor.fetchone()
115  if s != None:
116  return s[0]
117  else:
118  return None
119 
120 ##
121 #
122 # renvoie les préférences de ScolaSync
123 # @return un dictionnaire de préférences
124 #
125 def readPrefs():
126  global cursor
127  cursor.execute("select checkable, mv, schoolfile,workdir, manfile, refresh_enabled, refresh_delay from preferences")
128  s = cursor.fetchone()
129  if s != None:
130  checkable = s[0]==1
131  mv = s[1]==1
132  schoolFile = s[2]
133  workdir = s[3]
134  manfile = s[4]
135  refreshEnabled = s[5]==1
136  refreshDelay = s[6]
137  return {"checkable" : checkable,
138  "mv" : mv,
139  "schoolFile" : schoolFile,
140  "workdir" : workdir,
141  "manfile" : manfile,
142  "refreshEnabled": refreshEnabled,
143  "refreshDelay" : refreshDelay
144  }
145  else:
146  # valeur par défaut si la base est vide de préférences
147  return {"checkable" : True,
148  "mv" : False,
149  "schoolFile" : "/usr/share/scolasync/exemple/SCONET_test.xml",
150  "workdir" : "Travail",
151  "manfile" : "/usr/share/scolasync/help/manualPage_fr_FR.html",
152  "refreshEnabled": False,
153  "refreshDelay" : 30
154  }
155 
156 ##
157 #
158 # définit le nouveau nom du répertoire de travail préféré.
159 #
160 def setWd(newDir):
161  cursor.execute("""update preferences set workdir=?""",
162  (newDir,))
163  database.commit()
164 
165 ##
166 #
167 # inscrit un étudiant comme propriétaire d'une clé USB
168 # @param student un nom d'étudiant
169 #
170 def writeStudent(stickid, uuid, tattoo, student):
171  global database, cursor
172  if knowsId(stickid, uuid, tattoo):
173  cursor.execute("""update owners
174  set student=?
175  where stickid=? and uuid=? and tatoo=?""", (student, stickid, uuid, tattoo))
176  else:
177  cursor.execute("""insert into owners
178  values (?,?,?,?)""", (stickid, uuid, tattoo, student))
179  database.commit()
180 
181 ##
182 #
183 # inscrit les préférences
184 # @param prefs un dictionnaire {"checkable": booléen vrai si on doit afficher des cases à cocher, "workdir" : le répertoire préféré pour les fichiers de travail}
185 #
186 def writePrefs(prefs):
187  global database, cursor
188  if prefs["checkable"]:
189  checkable=1
190  else:
191  checkable=0
192  if prefs["mv"]:
193  mv=1
194  else:
195  mv=0
196  if prefs["refreshEnabled"]:
197  refreshEnabled=1
198  else:
199  refreshEnabled=0
200  cursor.execute("select checkable from preferences")
201  s = cursor.fetchone()
202  newValues=(checkable, mv, prefs["schoolFile"], prefs["workdir"], prefs["manfile"], refreshEnabled, prefs["refreshDelay"])
203  if s != None:
204  cursor.execute("""update preferences
205  set checkable=?, mv=?, schoolfile=?, workdir=?, manfile=?, refresh_enabled=?, refresh_delay=?""",
206  newValues)
207  else:
208  cursor.execute("""insert into preferences
209  values (?,?,?,?,?,?,?)""",
210  newValues)
211  database.commit()
212 
213 
214 if database == None:
215  openDb()
216