py::qo::backup Namespace Reference


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


Function Documentation

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 (  ) 

00049            :
00050         ret = []
00051         for name in list_names() :
00052                 t = name[7:].replace('_','')
00053                 date = datetime.datetime(*map(int, (t[:4],t[4:6],t[6:8],t[8:10],t[10:12],t[12:14])))
00054                 ret.append((name, date))
00055         return ret
00056 
class savepoint :

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 ) :


Variable Documentation

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"] }),
]


Generated on Tue Oct 9 20:40:31 2007 for Qomics by  doxygen 1.5.3