Classes | |
| class | savepoint |
Functions | |
| def | list_names |
| def | list |
| def | build_xml_from_model |
| def | build_xml_from_libraries |
| def | push_overlay |
| def | create |
| def | restore_last |
| def | restore |
Variables | |
| list | OVERLAY_MODELS |
| def py::qo::backup::build_xml_from_libraries | ( | ) |
00196 : 00197 doc = qo.xmlutil.create_document("libraries") 00198 root = doc.documentElement 00199 00200 for library in qodb.models.Library.objects.all().order_by('id') : 00201 library_element = doc.createElement("library") 00202 library_element.setAttribute("name", library.name) 00203 library_element.setAttribute("type", str(library.type)) 00204 00205 for copy in library.albums.all().select_related().order_by('album') : 00206 element = doc.createElement("albumcopy") 00207 element.setAttribute("copyid", str(copy.id)) 00208 element.setAttribute("album", copy.album.qoid) 00209 element.setAttribute("original_edition", qo.xmlutil.to_string(copy.original_edition)) 00210 element.setAttribute("quoted_value", qo.xmlutil.to_string(copy.quoted_value)) 00211 library_element.appendChild(element) 00212 00213 root.appendChild(library_element) 00214 00215 return doc 00216 OVERLAY_MODELS = [
| def py::qo::backup::build_xml_from_model | ( | model, | ||
only_fields = None, |
||||
exclude_fields = [] | ||||
| ) |
00149 : 00150 if only_fields : 00151 fields = only_fields 00152 else : 00153 def field_filter( field ) : 00154 return not isinstance(field, django.db.models.AutoField) 00155 fields = map(lambda f : f.get_attname(), filter(field_filter, model._meta.fields)) 00156 def field_filter( field ) : 00157 return field not in ['created_by_user', 'catalog_id'] + exclude_fields 00158 fields = filter(field_filter, fields) 00159 00160 doc = qo.xmlutil.create_document("catalog") 00161 root = doc.documentElement 00162 00163 name = model.__name__.lower() 00164 00165 underlay_model = model.get_underlay_class() 00166 00167 def push_entity( entity, fields ) : 00168 element = doc.createElement(name) 00169 00170 for field in fields : 00171 if field.endswith("_id") : 00172 field = field[:-3] 00173 value = getattr(getattr(entity, field),"qoid") 00174 else : 00175 value = getattr(entity, field) 00176 if not isinstance(value, (str, unicode)) : 00177 value = str(value) 00178 00179 element.setAttribute(field, value.strip()) 00180 00181 root.appendChild(element) 00182 00183 for u_entity in underlay_model.objects.all().order_by('entity').select_related() : 00184 u_fields = [] 00185 for field in fields : 00186 if field in u_entity.properties and getattr(u_entity, field) is not None : 00187 u_fields.append(field) 00188 push_entity(u_entity.entity, ["qoid"] + u_fields) 00189 00190 for entity in model.objects.filter(created_by_user=True).select_related() : 00191 push_entity(entity, fields) 00192 00193 return doc 00194 00195 def build_xml_from_libraries() :
| def py::qo::backup::create | ( | ) |
creates a new savepoint if needed
00230 : 00231 """ 00232 creates a new savepoint if needed 00233 """ 00234 bcktime = datetime.datetime.now() 00235 bckname = "backup_%s" % bcktime.strftime("%Y%m%d_%H%M%S") 00236 00237 sp = savepoint(bckname, "w") 00238 push_overlay(sp) 00239 sp.push("libraries.xml", build_xml_from_libraries()) 00240 sp.flush() 00241 00242 def restore_last() :
| def py::qo::backup::list | ( | ) |
| def py::qo::backup::list_names | ( | ) |
00044 : 00045 def extract_name( filename ) : 00046 return filename.split('.')[0] 00047 return sorted(map(extract_name,filter(lambda f: f.endswith(".qobck"), os.listdir(qocfg.get_backup_dir())))) 00048 def list() :
| def py::qo::backup::push_overlay | ( | sp | ) |
00226 : 00227 for model, args in OVERLAY_MODELS : 00228 sp.push("%s.xml"%model.__name__.lower(), build_xml_from_model(model, **args)) 00229 def create() :
| def py::qo::backup::restore | ( | bckname | ) |
restore a savepoint. WARNING! there is no undo ;)
00250 : 00251 """ 00252 restore a savepoint. 00253 WARNING! there is no undo ;) 00254 """ 00255 sp = savepoint(bckname) 00256 00257 # 1. clear user changes 00258 00259 # 1.1 clear libraries 00260 clear_models = [qodb.models.AlbumCopy, qodb.models.Library] 00261 for model in clear_models : 00262 model.objects.all().delete() 00263 00264 # 1.2 clear created entities 00265 all_models = [qodb.models.Album, qodb.models.Series, qodb.models.Collection, qodb.models.Editor, qodb.models.Author] 00266 for model in all_models : 00267 model.objects.filter(created_by_user=True).delete() 00268 00269 # 1.3 revert modifications 00270 for model in all_models : 00271 underlay = model.get_underlay_class() 00272 for underentity in underlay.objects.all() : 00273 underentity.entity.unoverlay() 00274 00275 # 1.4 clear underlay 00276 for model in all_models : 00277 model = model.get_underlay_class() 00278 if model.objects.all().count() > 0 : 00279 qo_error("%s n'est pas vide!!!" % model) 00280 model.objects.all().delete() 00281 00282 # 2. dump savepoint 00283 00284 sp_files = dict(sp.items()).keys() 00285 00286 cache = qo.catalog.create_cache() 00287 00288 def decode_item_key( (key, value) ) : 00289 return key.encode('utf-8'), value 00290 00291 forward_attr = { 00292 "editor" : qodb.models.Editor, 00293 "collection" : qodb.models.Collection, 00294 "series" : qodb.models.Series, 00295 } 00296 00297 fixer = qo.catalog.qoid_fixer() # album qoid fixes 00298 00299 # 2.1 overlay 00300 for model in reversed(all_models) : 00301 name = model.__name__.lower() 00302 file = "%s.xml" % name 00303 if file not in sp_files : 00304 continue 00305 for element in sp.pull(file).getElementsByTagName(name) : 00306 params = dict(map(decode_item_key, element.attributes.items())) 00307 for key in params.keys() : 00308 if key in forward_attr : 00309 ref_qoid = params[key] 00310 if ref_qoid not in cache[key] : 00311 cache[key][ref_qoid] = forward_attr[key].objects.get(qoid=ref_qoid) 00312 params[key] = cache[key][ref_qoid] 00313 00314 if model is qodb.models.Album : 00315 params["qoid"] = fixer[params["qoid"]] 00316 entity = model.make_overlay(cache=cache, **params) 00317 try : 00318 entity.save() 00319 except : 00320 print model, params, element.toxml() 00321 traceback.print_exc() 00322 00323 # 2.2 libraries 00324 file = "libraries.xml" 00325 if file in sp_files : 00326 for library_element in sp.pull(file).getElementsByTagName("library") : 00327 params = { 00328 "name" : library_element.getAttribute("name"), 00329 "type" : int(library_element.getAttribute("type")), 00330 } 00331 if params["type"] == qodb.cte.main_library_type : 00332 params["id"] = qodb.cte.main_library_id 00333 elif params["type"] == qodb.cte.shopping_list_type : 00334 params["id"] = qodb.cte.shopping_list_id 00335 library, isnew = qodb.models.Library.objects.get_or_create(**params) 00336 if not isnew : 00337 library.albums.all().delete() 00338 for element in library_element.getElementsByTagName("albumcopy") : 00339 params = { 00340 "id" : int(element.getAttribute("copyid")), 00341 "album" : qodb.models.Album.objects.get(qoid=fixer[element.getAttribute("album")]), 00342 } 00343 if element.hasAttribute("original_edition") : 00344 params["original_edition"] = qo.xmlutil.bool_from_string(element.getAttribute("original_edition")) 00345 if element.hasAttribute("quoted_value") and len(element.getAttribute("quoted_value")) : 00346 params["quoted_value"] = float(element.getAttribute("quoted_value")) 00347 library.albums.create(**params) 00348 00349
| def py::qo::backup::restore_last | ( | ) |
00243 : 00244 bcks = list_names() 00245 if bcks : 00246 return restore(bcks[-1]) 00247 00248 00249 @qodb.transaction.commit_on_success def restore( bckname ) :
list py::qo::backup::OVERLAY_MODELS [static] |
Initial value:
[
(qodb.models.Author, {}),
(qodb.models.Editor, {}),
(qodb.models.Collection, {}),
(qodb.models.Series, {"exclude_fields" : ["matching"]}),
(qodb.models.Album, {"exclude_fields" : ["authors_str", "drawers_str", "matching"] }),
]
1.5.3