def initialize_extraction(self, period=None, force=None): """Check if Period parameter is valid, if the Period entity already exists and create a new Period. """ self.response.headers['Content-Type'] = "application/json" # Check that 'period' is provided if not self.period: s = "Version: %s\n" % __version__ s += "Period not found on POST body. Aborting." logging.error(s) self.error(400) resp = {"status": "error", "message": s} self.response.write(json.dumps(resp) + "\n") return 1 # Check that 'period' is valid if len(self.period) != 6: s = "Version: %s\n" % __version__ s += "Malformed period. Should be YYYYMM (e.g., 201603)" logging.error(s) self.error(400) resp = {"status": "error", "message": s} self.response.write(json.dumps(resp) + "\n") return 1 # Get existing period period_key = ndb.Key("Period", self.period) period_entity = period_key.get() # If existing, abort or clear and start from scratch if period_entity: if self.force is not True: s = "Version: %s\n" % __version__ s += "Period %s already exists. " % self.period s += "Aborting. To override, use 'force=true'." logging.error(s) resp = {"status": "error", "message": s} self.response.write(json.dumps(resp) + "\n") return 1 else: s = "Version: %s\n" % __version__ s += "Period %s already exists. " % self.period s += "Overriding." logging.warning(s) # Delete Reports referencing period r = Report.query().filter(Report.reported_period == period_key) to_delete = r.fetch(keys_only=True) s = "Version: %s\n" % __version__ s += "Deleting %d Report entities" % len(to_delete) logging.info(s) deleted = ndb.delete_multi(to_delete) s = "Version: %s\n" % __version__ s += "%d Report entities removed" % len(deleted) logging.info(s) # Delete Period itself s = "Version: %s\n" % __version__ s += "Deleting Period %s" % period_key logging.info(s) period_key.delete() s = "Version: %s\n" % __version__ s += "Period %s deleted" % period_key logging.info(s) # Create new Period (id=YYYYMM) s = "Version: %s\n" % __version__ s += "Creating new Period %s" % self.period logging.info(s) y, m = (int(self.period[:4]), int(self.period[-2:])) p = Period(id=self.period) p.year = y p.month = m p.status = 'in progress' period_key = p.put() # Check if period_key: s = "Version: %s\n" % __version__ s += "New Period %s created successfully" % self.period s += "with key %s" % period_key logging.info(s) else: self.error(500) s = "Version: %s\n" % __version__ s += "Could not create new Period %s" % self.period logging.error(s) resp = {"status": "error", "message": s} self.response.write(json.dumps(resp) + "\n") return 1 # Clear temporary entities keys_to_delete = ReportToProcess.query().fetch(keys_only=True) s = "Version: %s\n" % __version__ s += "Deleting %d temporal (internal use only) entities" % len( keys_to_delete) logging.info(s) ndb.delete_multi(keys_to_delete) return 0
def initialize_extraction(self, period=None, force=None): """Check if Period parameter is valid, if the Period entity already exists and create a new Period.""" self.response.headers['Content-Type'] = "application/json" # Check that 'period' is provided if not self.period: logging.error("Period not found on POST body. Aborting.") self.error(400) resp = { "status": "error", "message": "Period not found on POST body. " + "Aborting." } self.response.write(json.dumps(resp) + "\n") return 1 # Check that 'period' is valid if len(self.period) != 6: self.error(400) resp = { "status": "error", "message": "Malformed period. Should be YYYYMM (e.g., 201603)" } self.response.write(json.dumps(resp) + "\n") return 1 # Get existing period period_key = ndb.Key("Period", self.period) period_entity = period_key.get() # If existing, abort or clear and start from scratch if period_entity: if self.force is not True: logging.error("Period %s already exists. " % self.period + "Aborting. To override, use 'force=true'.") resp = { "status": "error", "message": "Period %s already exists. " % self.period + "Aborting. To override, use 'force=true'." } self.response.write(json.dumps(resp) + "\n") return 1 else: logging.warning("Period %s already exists. " % self.period + "Overriding.") # Delete Reports referencing period r = Report.query().filter(Report.reported_period == period_key) to_delete = r.fetch(keys_only=True) logging.info("Deleting %d Report entities" % len(to_delete)) deleted = ndb.delete_multi(to_delete) logging.info("%d Report entities removed" % len(deleted)) # Delete Period itself logging.info("Deleting Period %s" % period_key) period_key.delete() logging.info("Period entity deleted") # Create new Period (id=YYYYMM) logging.info("Creating new Period %s" % self.period) y, m = (int(self.period[:4]), int(self.period[-2:])) p = Period(id=self.period) p.year = y p.month = m p.status = 'in progress' period_key = p.put() # Check if period_key: logging.info("New Period %s created successfully." % self.period) logging.info("New period's key = %s" % period_key) else: self.error(500) logging.error("Could not create new Period %s" % self.period) resp = { "status": "error", "message": "Could not create new Period %s" % self.period } self.response.write(json.dumps(resp) + "\n") return 1 # Clear temporary entities keys_to_delete = ReportToProcess.query().fetch(keys_only=True) logging.info("Deleting %d temporal (internal use only) entities" % len(keys_to_delete)) ndb.delete_multi(keys_to_delete) return 0