Upstream Autotest merge.

As titled, a merge up to 93fc426ca133e775eb495f34d138fc57d92fb55e.

- Removes a bunch of deprecated code.
- Moves several private utilities into the private repo.
- Couple changes ported upstream and resynced.

BUG=None
TEST=In progress... will spin up new Autotest server and use
run_remote_tests for bvt, regression, smoke.

Change-Id: Id3e2ad529bb7b05f148e5d98aea46bb9ea828200
Reviewed-on: http://gerrit.chromium.org/gerrit/3350
Tested-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
diff --git a/frontend/afe/model_logic.py b/frontend/afe/model_logic.py
index d7b553d..204799f 100644
--- a/frontend/afe/model_logic.py
+++ b/frontend/afe/model_logic.py
@@ -124,21 +124,6 @@
             self._custom_joins.append(join_dict)
 
 
-        def get_from_clause(self):
-            from_, params = (super(ExtendedManager.CustomQuery, self)
-                             .get_from_clause())
-
-            for join_dict in self._custom_joins:
-                from_.append('%s %s AS %s ON (%s)'
-                             % (join_dict['join_type'],
-                                _quote_name(join_dict['table']),
-                                _quote_name(join_dict['alias']),
-                                join_dict['condition']))
-                params.extend(join_dict['condition_values'])
-
-            return from_, params
-
-
         @classmethod
         def convert_query(self, query_set):
             """
@@ -163,7 +148,7 @@
             self._values = values
 
 
-        def as_sql(self, qn=None):
+        def as_sql(self, qn=None, connection=None):
             return self._clause, self._values
 
 
@@ -237,11 +222,13 @@
         info['lhs_column'] = field.rel.get_related_field().column
         rhs_where = join_to_query.query.where
         rhs_where.relabel_aliases({rhs_table: alias})
-        initial_clause, values = rhs_where.as_sql()
-        all_clauses = (initial_clause,) + join_to_query.query.extra_where
-        info['where_clause'] = ' AND '.join('(%s)' % clause
-                                            for clause in all_clauses)
-        values += join_to_query.query.extra_params
+        compiler = join_to_query.query.get_compiler(using=join_to_query.db)
+        initial_clause, values = compiler.as_sql()
+        all_clauses = (initial_clause,)
+        if hasattr(join_to_query.query, 'extra_where'):
+            all_clauses += join_to_query.query.extra_where
+        info['where_clause'] = (
+                    ' AND '.join('(%s)' % clause for clause in all_clauses))
         info['values'] = values
         return info
 
@@ -364,7 +351,8 @@
 
 
     def _custom_select_query(self, query_set, selects):
-        sql, params = query_set.query.as_sql()
+        compiler = query_set.query.get_compiler(using=query_set.db)
+        sql, params = compiler.as_sql()
         from_ = sql[sql.find(' FROM'):]
 
         if query_set.query.distinct:
@@ -711,7 +699,7 @@
         return data
 
 
-    def validate_unique(self):
+    def _validate_unique(self):
         """\
         Validate that unique fields are unique.  Django manipulators do
         this too, but they're a huge pain to use manually.  Trust me.
@@ -772,7 +760,7 @@
 
     def do_validate(self):
         errors = self._validate()
-        unique_errors = self.validate_unique()
+        unique_errors = self._validate_unique()
         for field_name, error in unique_errors.iteritems():
             errors.setdefault(field_name, error)
         if errors:
@@ -1074,6 +1062,7 @@
 
 
     def delete(self):
+        self.invalid = self.invalid
         assert not self.invalid
         self.invalid = True
         self.save()
@@ -1110,7 +1099,7 @@
         is a dict of args to pass to attribute_model.objects.get() to get an
         instance of the given attribute on this object.
         """
-        raise NotImplemented
+        raise NotImplementedError
 
 
     def set_attribute(self, attribute, value):