def _do_sync(self): """ Runs as a separate thread """ # Get list of all activities on server try: srv_activities, tmp = network.request("GET", "%s/api/activity" % sett.server_url, decode=True) except network.NetworkException as err: log.error("Cannot load list of activities from server %s" % err) return # print("srvactivities", srvactivities) for srv_activity in srv_activities: srv_activity = AttrDict(srv_activity) log.debug("Server activity %s" % srv_activity) sql = "SELECT * FROM activity WHERE server_id=?" local_activity = self.localdb.select_one(sql, (srv_activity["_id"],) ) if local_activity: # we have the activity locally, check if changed changes = [] for attr in ['name', "description", "active"]: if getattr(local_activity, attr) != getattr(srv_activity, attr): changes.append(attr) if len(changes): log.debugf(DEBUG_ACTIVITYMGR, "Updating local copy of activity, changed columns %s, %s" % (changes, str(srv_activity).replace("\n", " "))) local_activity.name = srv_activity["name"] local_activity.server_id = srv_activity["_id"] local_activity.active = srv_activity["active"] try: self.localdb.update("activity", d=local_activity, primary_key="_id") except db.DbException as err: log.error("Cannot update local activity %s" % err) return else: # new activity log.debugf(DEBUG_ACTIVITYMGR, "New activity '%s' on server, saving in local database" % srv_activity.name) srv_activity.server_id = srv_activity._id srv_activity._id = -1 try: self.localdb.insert("activity", d=srv_activity, primary_key="_id") except db.DbException as err: log.error("Cannot save new activity in local database %s" % err) return self._loadList() self.sig.emit()