7

グループに (既に存在し、meta タグのアクセス許可によって定義された) アクセス許可を追加し、そのための正しい場所を探したいと考えています。sync_db コマンドの後で、すべてのグループに正しい権限が割り当てられていることを確認する必要があります。

post_syncdb シグナルを接続することを考えていましたが、シグナル ドキュメントには次のように書かれています。

syncdb コマンド中にフラッシュ管理コマンドが実行された場合、フラッシュ管理コマンドが失敗する可能性があるため、このシグナルのハンドラーがべき等の変更 (データベースの変更なしなど) を実行することが重要です。

したがって、誰かが sync_db_post シグナルを介して呼び出される管理コマンドでグループにパーミッションを追加することはおそらくお勧めできません。

次のように権限を設定する予定でした。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    company = models.ForeignKey(Company, related_name='user_profiles')
    department = models.ForeignKey(Department, related_name='user_profiles')

    class Meta:
        permissions = (
            ('admin_section_access', 'Access to front-end admin section'),
        )

管理コマンドで:

from django.core.management.base import BaseCommand, CommandError
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType


class Command(BaseCommand):
    args = 'none'
    help = 'Sets the defined group permissions'

    def handle(self, *args, **options):
        front_end_admin_group, created = Group.objects.get_or_create(name="Front End Admin")

        #get the content type for the UserProfile model
        user_profile_ct = ContentType.objects.get(app_label='organization', model='userprofile')
        admin_section_access_perm = Permission.objects.get(content_type=user_profile_ct, codename="admin_section_access")
        front_end_admin_group.permissions.add(admin_section_access_perm)
        self.stdout.write('Successfully setup group permissions.')
4

1 に答える 1

0

ここには 2 つの主なオプションがあります。1 つ目は、Django ドキュメントで説明されているように、データベースのフィクスチャを作成することです。これは、データベースにデータ (アクセス許可の xref レコード) をシードする最も古い方法です。

2 番目のオプション (最初のオプションよりも私が好む) は、Southを使用して、データベースへの変更をプログラムで追跡および管理することです。最も一般的にはスキーマの変更に使用されますが、そのデータ移行機能は、必要なものを処理するのに最適な場所です. これをコマンド ラインで実行します。./manage.py datamigration my_app seed_permissions次に、提供された関数内でアクセス許可を取得するために必要な Django コードを記述しforwardsます。

migrate2 番目のオプションの主な落とし穴は、 afterの追加コマンドを実行する必要があることですがsync_db、South が真実であるため (そして 1.7 で Django のコアになる予定です)、これはおそらく避けられません。

于 2014-01-08T19:50:40.203 に答える