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