def remove(self, args): """ Removes the level and all it's children from the filesystem and the database. """ # Get full syntax syntax, depth = self.syntax_and_depth(args) # Check to see if level exists level_list = Level.find_by_syntax(syntax) if not level_list: pipeline.utils.report("Error - Syntax does not match any levels") return if len(level_list) > 1: pipeline.utils.report("Error - Syntax matches multiple levels") return level = level_list[0] # Get settings info hierarchy = settings.hierarchy() abbr = settings.abbreviations() aliases = ['', 'bin'] shell = Shell() # If we're removing a level in our current environment clean_env = True for n in level.branch(): # Check each level of the env against our level branch clean_env = True try: clean_env = (n.name != shell.getenv("@" + hierarchy[n.depth].upper())) except EnvVarNotFound: clean_env = False break # Necessary? if not clean_env: break # If necessary unset all environment variables and aliases # associated with this level and those below if clean_env: depth = level.depth for level_name in hierarchy[level.depth:]: shell.unset("@" + level_name.upper()) for alias in aliases: shell.unalias(abbr[depth] + alias) depth += 1 # Write out a syntax file so it is up-to-date with current env self.write_last(level.parent) shell.commit() # Remove the level from disk shutil.rmtree(level.file_path()) # Remove the level and all its children from the database level.destroy_children() session.delete(level) session.flush()
def destroy_children(self): """ Destroys all child levels of the instance. """ if self.depth == pipeline.settings.depth(): # Level is a terminal level and has no children return query = session.query(Level) # subquery = select([Taggable.c.id], query._criterion, # from_obj= query._from_obj).as_scalar() # query = query.filter( ) filters = [] subquery = Level.parent_id == self.id final = subquery # Somehow this shit works! # for i in range(self.depth, len(pipeline.settings.hierarchy()) - 1, 1): # alias = Level._table.alias() # subquery = Level.parent_id.in_(select([alias.c.parent_id], subquery)) # final = final | subquery for i in range(self.depth, len(pipeline.settings.hierarchy()) - 1, 1): alias = Level._table.alias() subquery = alias.c.parent_id == self.id for j in range(self.depth, i, 1): next_alias = Level._table.alias() subquery = next_alias.c.parent_id.in_(select([alias.c.id], subquery)) alias = next_alias subquery = Level.parent_id.in_(select([alias.c.id], subquery)) final = final | subquery # alias = Level._table.alias() # # alias2 = Level._table.alias() # subquery = alias.c.parent_id == self.id # subquery = Level.parent_id.in_(select([alias.c.id], subquery)) # final = final | subquery # alias2 = Level._table.alias() # subquery = alias2.c.parent_id == self.id # subquery = alias.c.parent_id.in_(select([alias2.c.id], subquery)) # subquery = Level.parent_id.in_(select([alias.c.id], subquery)) # final = final | subquery # # alias3 = Level._table.alias() # subquery = alias3.c.parent_id == self.id # subquery = alias2.c.parent_id.in_(select([alias3.c.id], subquery)) # subquery = alias.c.parent_id.in_(select([alias2.c.id], subquery)) # subquery = Level.parent_id.in_(select([alias.c.id], subquery)) # final = final | subquery query = query.filter(final) # sys.stderr.write(str(query) + "\n\n") level_list = query.all() # Must be a better way of doing this! for level in level_list: session.delete(level) session.flush()