NinjaBat
NinjaBat

Reputation: 390

What happens to related fields when I archive a record?

Odoo - All versions

When a record is archived, all the relational fields are lost. When I again make the record active, the relational records are shown again.

What happens to those foreign keys ?? Is it possible to get the relational records when it is still inactive ? Also, is it possible to overwrite archive functionality. If yes, how ? Thanks.

Upvotes: 1

Views: 587

Answers (1)

Ahrimann Steiner
Ahrimann Steiner

Reputation: 1314

The archiving-feature is based on a simple boolean field, which is used to filter out from display:

  class BlogPost(models.Model):
     _inherit = 'blog.post'
     active = fields.Boolean(string='Active', default=True)

The record field: "active" will change when it's toggled but the corresponding record and its relations remain unchanged.

The underlying code corresponding to the filtering can be found in the file src/odoo/odoo/models.py :

 class MetaModel(api.Meta):
 """ The metaclass of all model classes.
    Its main purpose is to register the models per module.
 """
    def action_archive(self):
        """
        Set active=False on a recordset, by calling toggle_active 
        to take the corresponding actions according to the model
        """
       return self.filtered(lambda record: record.active).toggle_active()

    @api.model
    def _where_calc(self, domain, active_test=True):
       """Computes the WHERE clause needed to implement an OpenERP domain.
       :param domain: the domain to compute
       :type domain: list
       :param active_test: whether the default filtering of 
        records with ``active`` field set to ``False`` should be 
       applied.
       :return: the query expressing the given domain as provided in domain
      :rtype: osv.query.Query
      """
      # if the object has a field named 'active', filter out all inactive
      # records unless they were explicitely asked for
      if 'active' in self._fields and active_test and self._context.get('active_test', True):
        # the item[0] trick below works for domain items and '&'/'|'/'!'
        # operators too
          if not any(item[0] == 'active' for item in domain):
            domain = [('active', '=', 1)] + domain

          if domain:
            e = expression.expression(domain, self)
            tables = e.get_tables()
            where_clause, where_params = e.to_sql()
            where_clause = [where_clause] if where_clause else []
          else:
             where_clause, where_params, tables = [], [], ['"%s"' 
             % self._table]

          return Query(tables, where_clause, where_params)

To display all records (archived and active):

class Blog(models.Model):
    _inherit = 'blog'
    post_ids = fields.One2many(
        'blog.post', 'id', 
         domain=['|', ('active', '=', True), ('active', '=', False)],
        context={'active_test': False})

Upvotes: 1

Related Questions