5

OpenERP でいくつかのカスタム オブジェクトを定義しました。これらは、複数の会社の環境で使用されることになっています。したがって、各オブジェクトは「company_id」フィールドを定義します。これですべてのセットアップが完了し、正常に動作します。ただ、ユーザーは新しいオブジェクト インスタンスが属する会社を明示的に選択する必要があるため、UI はあまりユーザー フレンドリーではありません。

company_id フィールドは次のように設定されます。

...
'company_id' : fields.many2one('res.company', string='Company', selection=compute_company_select, required=True)
...


def compute_company_select(self, cr, uid, context):
    c_proxy = self.pool.get('res.company')

    user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
    search = [('id', 'child_of', user.company_id.id)]
    if uid == SUPERUSER_ID:
        search = [] #superuser can assign any company

    ids = c_proxy.search(cr, uid, search, context=context)
    return [(c.id, c.name) for c in c_proxy.browse(cr, uid, ids, context=context)]

「compute_company_select」関数の検索ドメインを使用して、フィールド定義でドメイン式を定義するだけで、これを解決することもできます。スーパーユーザーがすべての会社にアクセスできるように構成されていない場合、スーパーユーザーはすべての会社を割り当てることができませんでした。

私が今やりたいことは、彼が新しいレコードを作成するときに、company_id フィールドにユーザーの会社を事前入力することです。そして、これは不可能のようです。静的な値またはモジュール XML で定義された値のいずれかをフィールドに事前入力する可能性をいくつか発見しました。しかし、実行時にのみ利用可能な値、つまり現在のユーザー レコードを使用するオプションはないようです。

OpenERP 6.1 を使用しています。

4

1 に答える 1

5

公式の OpenERP アドオンの多くのドキュメントには類似した複数企業向けの機能が含まれているため、おそらく同じ実装手法を再利用する必要があります。これはユース ケースと一致しているようです。

"company_id"またはを検索すると、ソース コードにたくさんの例があります。"company_id.*fields.many2one"たとえば、モジュールのSales Shopsです。sale

簡単に言えば、次のことを行う必要があります。

  1. company_idフィールドを通常のmany2oneに対して宣言しますres.company。デフォルトのセキュリティ レコード ルール(ここで定義) は、ユーザーの現在の会社の子会社である会社のみを動的に表示するように処理します。ユーザーは、プリファレンスでいつでも現在の会社を許可された会社のいずれかに変更して、別の会社のコンテキストで作業することができます。また、特別な管理者ユーザーにはセキュリティ レコード ルールが適用されないため、管理者としてログインすると、いつでも任意の会社を選択できます。

    'company_id': fields.many2one('res.company', 'Company', required=False)
    
  2. 新しいレコードを作成するときに、ユーザーの現在の会社をデフォルトとして自動的に選択します。フレームワークは、まさにそれを行うためのメソッドを提供します: res.company._company_default_get(). ドキュメントの種類ごとにデフォルトの会社を選択するためのカスタム ルールを定義することができますが、デフォルトはユーザーの現在の会社になります。したがって、このスニペットをモデルの に追加するのと同じくらい簡単です_defaults:

    'company_id': lambda self,cr,uid,ctx: self.pool['res.company']._company_default_get(cr,uid,object='<your_model>',context=ctx)
    
  3. company_idフィールドをモデルのフォーム ビューに追加します。multi-company通常、実際に必要なユーザーにのみ表示するために、グループに制限します。

    <field name="company_id" groups="base.group_multi_company"/>
    

それはそれと同じくらい簡単なはずです。

于 2013-01-23T11:32:46.223 に答える