code: def get_task_filelist(cls, task_factory, courseid, taskid):
          
          task_fs = task_factory.get_task_fs(courseid, taskid)
          if not task_fs.exists():
              return []
  
          tmp_out = {}
          entries = task_fs.list(True, True, True)
          for entry in entries:
              if os.path.splitext(entry)[0] == "task" and os.path.splitext(entry)[1][1:] in task_factory.get_available_task_file_extensions():
                  continue
  
              data = entry.split("/")
              is_directory = False
              if data[-1] == "":
                  is_directory = True
                  data = data[0:len(data)-1]
              cur_pos = 0
              tree_pos = tmp_out
              while cur_pos != len(data):
                  if data[cur_pos] not in tree_pos:
                      tree_pos[data[cur_pos]] = {} if is_directory or cur_pos != len(data) - 1 else None
                  tree_pos = tree_pos[data[cur_pos]]
                  cur_pos += 1
  
          def recur_print(current, level, current_name):
              iteritems = sorted(current.items())
              # First, the files
              recur_print.flattened += [(level, False, f, current_name+"/"+f) for f, t in iteritems if t is None]
              # Then, the dirs
              for name, sub in iteritems:
                  if sub is not None:
                      recur_print.flattened.append((level, True, name, current_name+"/"+name+"/"))
                      recur_print(sub, level + 1, current_name + "/" + name)
          recur_print.flattened = []
          recur_print(tmp_out, 0, '')
          return recur_print.flattened
docs: Returns a flattened version of all the files inside the task directory, excluding the files task.* and hidden files.
              It returns a list of tuples, of the type (Integer Level, Boolean IsDirectory, String Name, String CompleteName)