我正在使用django-guardian在我的 sweetpie api 中实现对象级权限,我希望能够在私有和公共之间切换资源权限的实例。
例如,我有一个Event
资源。当 aUser
创建一个Event
时,将Event.creator
设置为User
实例。我在 上使用 aapost_save
信号为创建它Event
的人授予对象级权限User
- 使其对创建者私有。
我希望User
能够切换权限级别Event
以允许所有用户能够访问它 - 也就是将事件从私有更改为公共(然后再返回)。
处理这个问题的最佳方法是什么?如果可能的话,我想坚持监护人,但我没有结婚。以下是一些有助于说明的代码片段:
模型.py
class UserProfile(models.Model):
user = models.OneToOneField(User, primary_key=True)
events = models.ManyToManyField('myapp.Event', through="myapp.EventMembership", null=True, blank=True)
class Event(models.Model):
name = models.CharField(max_length=64)
creator = models.ForeignKey('myapp.UserProfile', related_name="creator")
资源.py
class EventResource(ModelResource):
class Meta:
queryset = Event.objects.all()
resource_name = 'events'
authentication = ApiKeyAuthentication()
authorization = GuardianAuthorization(
create_permission_code = "myapp.add_event",
view_permission_code = "myapp.view_event",
update_permission_code = "myapp.change_event",
delete_permission_code = "myapp.delete_event"
)
always_return_data = True
creator = fields.ForeignKey('myapp.UserProfile', 'creator', full=True)
def hydrate(self, bundle, **kwargs):
bundle.obj.creator = UserProfile.objects.get(user_id=bundle.request.user)
return bundle
信号.py
@receiver(post_save, sender=User)
def allow_user_to_create_events(sender, instance, **kwargs):
if not instance:
return None
if kwargs.get('created'):
ApiKey.objects.create(user=instance)
# give newly created user permissions to create events
add_permission(instance, "myapp.add_event", Event)
@receiver(post_save, sender=Event)
def allow_user_to_edit_events(sender, instance, *args, **kwargs):
if not instance or not isinstance(instance, Event):
return None
# assign_perm is a guardian shortcut
assign_perm("myapp.view_event", instance.creator.user, instance)
assign_perm("myapp.edit_event", instance.creator.user, instance)
assign_perm("myapp.delete_event", instance.creator.user, instance)
感谢您的时间和帮助!
注意:我在我的美味派资源中使用了监护人授权。但是,我认为我的问题更像是一个监护人的问题,而不是与美味派一起使用。