ScolaSync  4.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 python3safe=True
26 import os.path, sqlite3, subprocess
27 import version
28 from globaldef import userShareDir
29 
30 database= None # base de données sqlite 3 commune à tous les modules
31 cursor=None
32 
33 ##
34 #
35 # Ouverture de la base de données de l'application, et création si nécessaire.
36 # @return une instance de base de données sqlite3
37 #
38 def openDb():
39  global database, cursor
40  dir=os.path.expanduser(userShareDir)
41  if not os.path.isdir(dir):
42  subprocess.call("mkdir %s" %dir, shell=True)
43  database = sqlite3.connect(os.path.join(dir,"db"))
44  cursor=database.cursor()
45  cursor.execute('''create table if not exists owners (stickid text, uuid text, tatoo text, student text)''')
46  cursor.execute('''create table if not exists version (major text, minor text)''')
47  cursor.execute('''create table if not exists preferences (checkable int, mv int, schoolfile text, workdir text, manfile text, refresh_enabled int, refresh_delay int)''')
48  database.commit()
49  checkVersion(version.major(), version.minor())
50 
51 ##
52 #
53 # Vérifie si la base de données reste compatible.
54 # Un changement de version majeur implique une mise à jour en cas de
55 # base de donnée ancienne. Un changmeent de version mineur n'implique
56 # pas de changement de structure de la base de données.
57 #
58 def checkVersion(major, minor):
59  cursor.execute('''select * from version''')
60  values=cursor.fetchone()
61  if values == None:
62  # pas de version existante, on la crée
63  cursor.execute('''insert into version values (?,?)''', (version.major(), version.minor()))
64  else:
65  major, minor = values
66  if major < version.major():
67  raise KeyError("The database version is too old!")
68  elif minor < version.minor():
69  cursor.execute("""update version
70  set minor=?
71  where major=?""", (version.minor(), version.major()))
72  database.commit()
73 
74 ##
75 #
76 # vérifie qu'un étudiant est déjà connu
77 # @param student propriétaire du baladeur
78 # @return True si le propriétaire existe déjà
79 #
80 def hasStudent(student):
81  global cursor
82  cursor.execute("select * from owners where student=?", (student,))
83  return cursor.fetchone() != None
84 
85 ##
86 #
87 # dit si une clé USB est déjà connue
88 # @param stickid un identifiant de baladeur
89 # @param uuid un identifiant de partition
90 # @param tattoo un tatouage de partition
91 # @return un booléen vrai si la clé USB est connue, faux sinon
92 #
93 def knowsId(stickid, uuid,tattoo):
94  global cursor
95  cursor.execute("select * from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
96  return cursor.fetchone() != None
97 
98 ##
99 #
100 # Renvoie la liste des tatouages connus de la base de données
101 #
103  global cursor
104  cursor.execute("select tatoo from owners")
105  return cursor.fetchmany()
106 
107 ##
108 #
109 # renvoie l'étudiant qui possède une clé USB
110 # @return un nom d'étudiant ou None si la clé est inconnue
111 #
112 def readStudent(stickid, uuid, tattoo):
113  global cursor
114  cursor.execute("select student from owners where stickid=? and uuid=? and tatoo=?", (stickid, uuid,tattoo))
115  s = cursor.fetchone()
116  if s != None:
117  return s[0]
118  else:
119  return None
120 
121 ##
122 #
123 # renvoie les préférences de ScolaSync
124 # @return un dictionnaire de préférences
125 #
126 def readPrefs():
127  global cursor
128  cursor.execute("select checkable, mv, schoolfile,workdir, manfile, refresh_enabled, refresh_delay from preferences")
129  s = cursor.fetchone()
130  if s != None:
131  checkable = s[0]==1
132  mv = s[1]==1
133  schoolFile = s[2]
134  workdir = s[3]
135  manfile = s[4]
136  refreshEnabled = s[5]==1
137  refreshDelay = s[6]
138  return {"checkable" : checkable,
139  "mv" : mv,
140  "schoolFile" : schoolFile,
141  "workdir" : workdir,
142  "manfile" : manfile,
143  "refreshEnabled": refreshEnabled,
144  "refreshDelay" : refreshDelay
145  }
146  else:
147  # valeur par défaut si la base est vide de préférences
148  return {"checkable" : True,
149  "mv" : False,
150  "schoolFile" : "/usr/share/scolasync/exemple/SCONET_test.xml",
151  "workdir" : "Travail",
152  "manfile" : "/usr/share/scolasync/help/manualPage_fr_FR.html",
153  "refreshEnabled": False,
154  "refreshDelay" : 30
155  }
156 
157 ##
158 #
159 # définit le nouveau nom du répertoire de travail préféré.
160 #
161 def setWd(newDir):
162  cursor.execute("""update preferences set workdir=?""",
163  (newDir,))
164  database.commit()
165 
166 ##
167 #
168 # inscrit un étudiant comme propriétaire d'une clé USB
169 # @param student un nom d'étudiant
170 #
171 def writeStudent(stickid, uuid, tattoo, student):
172  global database, cursor
173  if knowsId(stickid, uuid, tattoo):
174  cursor.execute("""update owners
175  set student=?
176  where stickid=? and uuid=? and tatoo=?""", (student, stickid, uuid, tattoo))
177  else:
178  cursor.execute("""insert into owners
179  values (?,?,?,?)""", (stickid, uuid, tattoo, student))
180  database.commit()
181 
182 ##
183 #
184 # inscrit les préférences
185 # @param prefs un dictionnaire {"checkable": booléen toujours vrai, "workdir" : le répertoire préféré pour les fichiers de travail}
186 #
187 def writePrefs(prefs):
188  global database, cursor
189  checkable=1
190  if prefs["mv"]:
191  mv=1
192  else:
193  mv=0
194  if prefs["refreshEnabled"]:
195  refreshEnabled=1
196  else:
197  refreshEnabled=0
198  cursor.execute("select checkable from preferences")
199  s = cursor.fetchone()
200  newValues=(1, mv, prefs["schoolFile"], prefs["workdir"], prefs["manfile"], refreshEnabled, prefs["refreshDelay"])
201  if s != None:
202  cursor.execute("""update preferences
203  set checkable=?, mv=?, schoolfile=?, workdir=?, manfile=?, refresh_enabled=?, refresh_delay=?""",
204  newValues)
205  else:
206  cursor.execute("""insert into preferences
207  values (?,?,?,?,?,?,?)""",
208  newValues)
209  database.commit()
210 
211 
212 if database == None:
213  openDb()
214