def clearRaceConditions(cls, georefObj, dbsession): """ Function clears race condition for a given process process :type cls: georeference.models.vkdb.georeferenzierungsprozess.Georeferenzierungsprozess :type georefObj: georeference.models.vkdb.georeferenzierungsprozess.Georeferenzierungsprozess :type dbsession: sqlalchemy.orm.session.Session :return: georeference.models.vkdb.georeferenzierungsprozess.Georeferenzierungsprozess """ concurrentObjs = dbsession.query(Georeferenzierungsprozess).filter(Georeferenzierungsprozess.mapid == georefObj.mapid)\ .filter(Georeferenzierungsprozess.type == georefObj.type)\ .filter(Georeferenzierungsprozess.overwrites == georefObj.overwrites)\ .order_by(desc(Georeferenzierungsprozess.timestamp)).all() # there are no race conflicts if len(concurrentObjs) == 1: return georefObj # there are race conflicts for i in range(1, len(concurrentObjs)): # check if there is a adminjob for this process and delete it first adminjobs = AdminJobs.allForGeoreferenceid(concurrentObjs[i].id, dbsession) for adminjob in adminjobs: dbsession.delete(adminjob) dbsession.flush() dbsession.delete(concurrentObjs[i]) return concurrentObjs[0]
def createNewAdminJob(georeferenceprocess, setto, userid, comment): return AdminJobs(georefid=georeferenceprocess.id, processed=False, setto=setto, timestamp=convertTimestampToPostgisString(datetime.now()), comment=comment, userid=userid)
def runningAdminJobs(dbsession, logger): """ Runs new admin jobs :type sqlalchemy.orm.session.Session: dbsession :type logging.Logger: logger """ logger.info('Check for admin jobs') jobs = AdminJobs.getUnprocessedJobs(dbsession) # process jobs for job in jobs: if job.setto == 'isvalide': setIsValide(job, dbsession, logger) job.processed = True elif job.setto == 'invalide': setInValide(job, dbsession, logger) job.processed = True