๋ฌธ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ถํ์ ์์ฑํ๊ณ django-guardian ์ง์์ผ๋ก ์ก์ธ์ค ์ ์ด๋ฅผ ์๋์ผ๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.
์ก์ธ์ค ์ ์ด ๊ฐ์?
์ด ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์ต๋๊น?
Django-guardian์ ๋ชจ๋ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค ์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ ๊ทธ๋ฃน์ผ ์๋ ์์ต๋๋ค. ์์ ํ๋ก์ ํธ์์ ์ก์ธ์ค ์ ์ด๋ฅผ ์ฐธ์กฐํ์ญ์์ค. https://github.com/django-guardian/django-guardian/blob/devel/example_project/articles/views.py#L35 ๋ฅผ ์ฐธ์กฐ
์๋ฒฝํ!
์ด๊ฒ์ ๋ด ์ค ๋ํซ ์ฝ๋์ ๋๋ค.
def create_user_profile(sender, instance, created, **kwargs):
print("create_user_profile")
try:
print("created: "+ str(created))
if created:
Profile.objects.create(user=instance)
print("Member.objects.get_or_create(django_user=instance)")
#Create a user into groups_manager_member
member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
print("member instance created")
print(member)
print("Group.objects.create(name=ID_GROUP+instance.username)")
#Create a group into groups_manager_group
group = Group.objects.create(name=ID_GROUP+instance.username)
print("group instance created")
print(group)
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
except Exception as e:
print("Exception: "+str(e))
pass
def save_user_profile(sender, instance, **kwargs):
print("save_user_profile")
try:
instance.profile.save()
except Exception as e:
print("Exception: "+str(e))
pass
post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)
๊ทธ๋ฃน์ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ ์ ์๋ ๊ถํ์ด ํ์ํฉ๋๋ค.
์ด๋์ ๋ฌธ์ ๊ฐ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ํ์ํฉ๋๋ค.
class ProtectedGroupUpdateView(PermissionRequiredMixin, GroupUpdateView):
permission_required = ['change_group', ]
...
์์ฑ ์ ๊ทธ๋ฃน์ ๊ถํ์ ํ ๋นํฉ๋๋ค.
"๊ตฌ์ฑ์ ์ถ๊ฐ ๊ฐ๋ฅ" ๊ถํ์ ์ถ๊ฐํ๋ ค๊ณ ํ์ผ๋ ์ง์์ด ์๋ ๋ชจ๋ ๊ทธ๋ฃน์์ ๊ฐ๋ฅํฉ๋๋ค.
๋ฌด์จ ๋ง์์ด์ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. django-guardian ๊ถํ์ ํญ์ ์ฌ์ฉ์ ๋๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ถ์ฌ๋ฉ๋๋ค. ์ญํ ์ด๋ ํน๋ณํ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ง์์๊ฒ "X" ๊ทธ๋ฃน์ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ ค๋ฉด "์ง์" ๊ทธ๋ฃน์ ๋ง๋ค๊ณ ์ฌ๊ธฐ์ ์ง์์ ์ถ๊ฐํ๊ณ "X" ๊ทธ๋ฃน์ ์ถ๊ฐํ๊ณ "์ง์" ๊ทธ๋ฃน์ "X"๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค. ๊ทธ๋ฃน.
๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๊ฐ ํ์ํฉ๋๋ค.
"X"๋ ๊ทธ๋ฃน "X"์ ๋ํด์๋ง ์ถ๊ฐ ๋๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ถํํ๋ ์ง๊ธ์ ๊ทธ๋ ์ง ์์ต๋๋ค. "์ฌ์ฉ์ ์ถ๊ฐ ๊ฐ๋ฅ" ๊ถํ์ด ์์ผ๋ฉด ๊ฒฌ์ต์์ด ์๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ํด ์ํํ ์ ์์ต๋๋ค.
๋ด ํ์ฐฎ์ ์์ด ์ค๋ ฅ์ ์ฃ์กํ๋ค๋ ๋ง์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค
๋ถํํ๋ ๋๋ ๋น์ ์ ๊ธฐ๋๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. ์์ ํ๋ก์ ํธ๋ฅผ ์ฃผ์ ๊น๊ฒ
"X" can add or remove only for group "X"
์๋ฏธ:
์ค์ ๋ก "x" ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ทธ๋ฃน์์ ๋ค๋ฅธ ์ฌ์ฉ์๋ง ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
@Allan-Nava , django-guardian ๊ถํ์ ํญ์ ์ฌ์ฉ์ ๋๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ถ์ฌ๋ฉ๋๋ค. ์ญํ ์ด๋ ํน๋ณํ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ทธ๋ฃน์ ๊ด๋ฆฌํ๋๋ก ํ๋ ค๋ฉด ํด๋น ๊ทธ๋ฃน์ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ ๊ทธ๋ฃน์ ๋ถ์ฌํฉ๋๋ค.
"X" ๊ทธ๋ฃน์ ๊ด๋ฆฌํ๊ธฐ ์ํด "X" ๊ทธ๋ฃน ๊ถํ์ ํ ๋น ๋ฐ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
netflix์ ๊ฐ์์ผ ํฉ๋๋ค(๊ทธ๋ฌ๋ ๋ชจ๋ ๊ตฌ์ฑ์์ ๋ก๊ทธ์ธํ ์ ์์): ๋ชจ๋ ์ฌ์ฉ์๋ ์์ ์ด ์ ํธํ๋ ๊ฒ์ ๋ฐ๋ผ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ ๊ฐ์ธ ๊ทธ๋ฃน์ด ์์ด์ผ ํฉ๋๋ค. ๋ฌธ์ ๋ ์ด ๊ถํ์ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๊ฐ ์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ทธ๋ฃน์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ ์ด ๊ถํ์ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๊ฐ ์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ทธ๋ฃน์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ๋๋ค.
ํ์คํ ์ฌ์ค์ด ์๋๋๋ค. ์ด ๋ฌธ์ฅ์ Django ์ฝ์ด์ ํด๋น๋ฉ๋๋ค. ๊ทธ๋ฃน X์ ๋ํด ๊ด๋ฆฌ ๊ทธ๋ฃน X์ ๋ถ์ฌ๋ ์ฌ๋ฐ๋ฅธ Django-guardian ๊ถํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ทธ๋ฃน X์๋ง ์ ์ฉ๋ฉ๋๋ค. ์์ ํ๋ก์ ํธ์์์ ๊ฐ์ด ํน์ ๊ธฐ์ฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ค๊ณ ํด์ ๋ค๋ฅธ ๊ธฐ์ฌ๋ฅผ ํธ์งํ ์ ์๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ ์ฌ์ฉ์์ ์ํด.
๋ชจ๋ ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฉค๋ฒ์ญ ๊ทธ๋ฃน์ ๋ค๋ฅธ ์ฌ๋์ ์ถ๊ฐํ ์ ์๋ ๋จ์ผ ๊ถํ์ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ๊ทธ์ ๋ฉค๋ฒ์ญ ๊ทธ๋ฃน 'X'๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ฉ์๋ฅผ ์์ฑํ ๋๋ง๋ค 'X์ ๋ํ ๊ทธ๋ฃน ์ถ๊ฐ ๊ฐ๋ฅ'์ด๋ผ๋ ์ ๊ถํ์ด ์์ฑ๋๊ธฐ๋ฅผ ์ํ๋ฉฐ ํด๋น ๊ถํ์๋ ๊ทธ๋ฃน 'X'๊ฐ ๊ฐ์ฒด๋ก ์์ด์ผ ํฉ๋๋ค.
์ด์ ๊ฐ์ด:
def create_user_profile(sender, instance, created, **kwargs):
print("create_user_profile")
try:
print("created: "+ str(created))
if created:
Profile.objects.create(user=instance)
print("Member.objects.get_or_create(django_user=instance)")
#Create a user into groups_manager_member
member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
print("member instance created")
print(member)
print("Group.objects.create(name=ID_GROUP+instance.username)")
#Create a group into groups_manager_group
group = Group.objects.create(name=ID_GROUP+instance.username)
print("group instance created")
print(group)
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
UserObjectPermission.objects.assign_perm('can_add_member_for_xgroup', member, obj=group)
except Exception as e:
print("Exception: "+str(e))
pass
def save_user_profile(sender, instance, **kwargs):
print("save_user_profile")
try:
instance.profile.save()
except Exception as e:
print("Exception: "+str(e))
pass
post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)
๋น์ ์์ ์ฒ ๊ฐ์ ๊ถํ์ ๋ง๋๋ ๊ฒ์
๋๋ค. assign_perm('manage_group',group,group)
๋๋ assign_perm('manage_group',user,group)
์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค. ๋๋จธ์ง๋ ์ฌ์ฉ์์๊ฒ ํน์ ๊ทธ๋ฃน์ ๊ด๋ฆฌํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค.
์ข์์, ํ์ง๋ง ํ ํ ๋ณด๊ธฐ์์ ์ด๋ป๊ฒ ํ์ธํ ์ ์๋์?
{{ perms.groups_manager.canaddmemberx2}}
@ad-m ๋ค ๊ฐ์ฌํฉ๋๋ค. ์ ์ค๋ํซ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
from guardian.shortcuts import assign_perm
def create_user_profile(sender, instance, created, **kwargs):
print("create_user_profile")
try:
print("created: "+ str(created))
if created:
Profile.objects.create(user=instance)
print("Member.objects.get_or_create(django_user=instance)")
#Create a user into groups_manager_member
member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
print("member instance created")
print(member)
print("Group.objects.create(name=ID_GROUP+instance.username)")
#Create a group into groups_manager_group
group = Group.objects.create(name=ID_GROUP+instance.username)
print("group instance created")
print(group)
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
#UserObjectPermission.objects.assign_perm('can_add_member_for_xgroup', member, obj=group)
assign_perm('groups_manager.can_add_member_custom', member, group)
except Exception as e:
print("Exception: "+str(e))
pass
def save_user_profile(sender, instance, **kwargs):
print("save_user_profile")
try:
instance.profile.save()
except Exception as e:
print("Exception: "+str(e))
pass
post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)
@ad-m ์ด ์ฝ๋๋ฅผ ์๋ํ์ง๋ง ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
#Assign permission for the groups
assign_perm('groups_manager.can_add_member_custom', member, group)
print("assign_perm('groups_manager.can_add_member_custom', member, group)")
@Allan-Nava, ์ค๋ฅ ๋ฉ์์ง์์ ๋ช ํํ์ง ์์ ๊ฒ์ ๋ฌด์์ ๋๊น?
@ad-m
์ด ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค.
def create_user_profile(sender, instance, created, **kwargs):
print("create_user_profile")
try:
print("created: "+ str(created))
if created:
Profile.objects.create(user=instance)
print("Member.objects.get_or_create(django_user=instance)")
#Create a user into groups_manager_member
member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
print("member instance created")
print(member)
print("Group.objects.create(name=ID_GROUP+instance.username)")
#Create a group into groups_manager_group
group = Group.objects.create(name=ID_GROUP+instance.username)
print("group instance created")
print(group)
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
#Assign permission for the groups
assign_perm('groups_manager.can_add_member_custom', instance, group)
print("assign_perm('groups_manager.can_add_member_custom', instance, group)")
except Exception as e:
print("Exception: "+str(e))
pass
@Allan-Nava, ์ค๋ฅ ๋ฉ์์ง์์ ๋ช ํํ์ง ์์ ๊ฒ์ ๋ฌด์์ ๋๊น?
@ad-m ์ด๋์ ๋ฌธ์ ๊ฐ ์๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
@Allan-Nava, ์ด๋ฐ ์ข ๋ฅ์ ๊ถํ์ ์์ต๋๋ค. ์ด๋ค ๊ถํ์ด ์๋์ง ๋ฌธ์๋ฅผ ์ฝ์ผ์ญ์์ค.
์๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ ์ฌ์ฉ์๋ฅผ ๋ง๋ค ๋ N ๊ทธ๋ฃน/์ฌ์ฉ์์ ๋ํด N ๊ถํ์ ๋ง๋ค์ด์ผ ํฉ๋๊น?
content_type = ContentType.objects.get_for_model(Group)
permission = Permission.objects.create(
codename='can_add_member_custom',
name='Can Add Member Custom',
content_type=content_type,
)
์ ์ ๋งํ๋ฏ์ด :
๋น์ ์์ ์ฒ ๊ฐ์ ๊ถํ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์์ ์ ํ๋น ํ๋์ ๊ถํ.
์ด์ ์ ๋งํ๋ฏ์ด:
๋น์ ์์ ์ฒ ๊ฐ์ ๊ถํ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์์ ์ ํ๋น ํ๋์ ๊ถํ.
์๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ผ๋ฐ ๊ถํ์ ์ด๋ป๊ฒ ๋ง๋ญ๋๊น?
Django ํต์ฌ ๋ฌธ์์์ ๋งํ๋ฏ์ด. ์์ ๋งํฌํ์ต๋๋ค.
์ข์, ๋๋ Django Groups Manager๋ฅผ ์ฌ์ฉํ๋ค:
์ด๊ฒ์ ๋ด ๋ชจ๋ธ ๊ทธ๋ฃน์ ๋๋ค .
class Group(GroupMixin):
group_type = models.ForeignKey(GroupType, null=True, blank=True, on_delete=models.SET_NULL,
related_name='%(app_label)s_%(class)s_set')
group_entities = models.ManyToManyField(GroupEntity, blank=True,
related_name='%(app_label)s_%(class)s_set')
django_group = models.ForeignKey(DjangoGroup, null=True, blank=True, on_delete=models.SET_NULL)
group_members = models.ManyToManyField(Member, through='GroupMember',
related_name='%(app_label)s_%(class)s_set')
# this is just required for easy explanation
class Meta(GroupMixin.Meta):
abstract = False
permissions = (
('can_add_member_custom', 'Can Add Member Custom'),
)
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ด ๋ชจ๋ธ ํ๋กํ์ ๋๋ค .
from __future__ import unicode_literals
import hashlib
import os.path
import urllib
from django.conf import settings
from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.utils.encoding import python_2_unicode_compatible
from bootcamp.activities.models import Notification
#Custom class - ParentsProfile
from bootcamp.parents.models import ParentsProfile
#Custom class - MemberMixin TO CREATE INTO groups_manager_member
from bootcamp.groups_manager.models import MemberMixin, Member, Group
#Import django guardian assign_perm
from guardian.shortcuts import assign_perm
#import UserObjectPermission
from guardian.models import UserObjectPermission
import datetime
ID_GROUP = "Group_"
'''
User Model - Authentication
'''
<strong i="12">@python_2_unicode_compatible</strong>
class Profile(models.Model):
user = models.OneToOneField(User)
location = models.CharField(max_length=50, null=True, blank=True)
url = models.CharField(max_length=50, null=True, blank=True)
job_title = models.CharField(max_length=50, null=True, blank=True)
#I need to delete the parents application
#Other tascout attributes
birthdate = models.DateField(default=datetime.date.today)
address = models.CharField(max_length=255, null=True, blank=True)
main_role = models.CharField(max_length=255, null=True, blank=True)
other_roles = models.CharField(max_length=255, null=True, blank=True)
mobile = models.CharField(max_length=255, null=True, blank=True)
background_photo = models.CharField(max_length=255, null=True, blank=True)
profile_photo = models.CharField(max_length=255, null=True, blank=True)
biography = models.TextField(null=True, blank=True)
idols = models.TextField(null=True, blank=True)
weight = models.IntegerField(default=0)
height = models.IntegerField(default=0)
favorite_team = models.CharField(max_length=255, null=True, blank=True)
level = models.IntegerField(default=0)
sex = models.CharField(max_length=1, default="M")
nationality = models.CharField(max_length=255, null=True, blank=True)
city = models.CharField(max_length=255, null=True, blank=True)
postal_code = models.CharField(max_length=255, null=True, blank=True)
province = models.CharField(max_length=255, null=True, blank=True)
number = models.CharField(max_length=255, null=True, blank=True)
latitude = models.DecimalField( null=True, blank=True, max_digits=9, decimal_places=6)
longitude = models.DecimalField( null=True, blank=True, max_digits=9, decimal_places=6)
class Meta:
db_table = 'auth_profile'
def __str__(self):
return self.user.username
def get_url(self):
url = self.url
if "http://" not in self.url and "https://" not in self.url and len(self.url) > 0: # noqa: E501
url = "http://" + str(self.url)
return url
def get_picture(self):
no_picture = settings.MEDIA_URL +'/profile_pictures/user.png'
try:
filename = settings.MEDIA_ROOT + '/profile_pictures/' +\
self.user.username + '.jpg'
picture_url = settings.MEDIA_URL + 'profile_pictures/' +\
self.user.username + '.jpg'
if os.path.isfile(filename): # pragma: no cover
return picture_url
else: # pragma: no cover
gravatar_url = 'http://www.gravatar.com/avatar/{0}?{1}'.format(
hashlib.md5(self.user.email.lower()).hexdigest(),
urllib.urlencode({'d': no_picture, 's': '256'})
)
return gravatar_url
except Exception:
return no_picture
#Retrieve users' cover
def get_cover(self):
no_cover = settings.MEDIA_ROOT +'profile_covers/cover.jpg'
try:
filename = settings.MEDIA_ROOT + '/profile_covers/' +\
self.user.username + '.jpg'
cover_url = settings.MEDIA_URL + 'profile_covers/' +\
self.user.username + '.jpg'
if os.path.isfile(filename) and os.path.exists(filename): # pragma: no cover
if cover_url != None:
return cover_url
else:
return no_cover
else:
no_cover
except Exception:
return no_cover
def get_screen_name(self):
try:
if self.user.get_full_name():
return self.user.get_full_name()
else:
return self.user.username
except:
return self.user.username
def notify_liked(self, feed):
if self.user != feed.user:
Notification(notification_type=Notification.LIKED,
from_user=self.user, to_user=feed.user,
feed=feed).save()
def unotify_liked(self, feed):
if self.user != feed.user:
Notification.objects.filter(notification_type=Notification.LIKED,
from_user=self.user, to_user=feed.user,
feed=feed).delete()
def notify_commented(self, feed):
if self.user != feed.user:
Notification(notification_type=Notification.COMMENTED,
from_user=self.user, to_user=feed.user,
feed=feed).save()
def notify_also_commented(self, feed):
comments = feed.get_comments()
users = []
for comment in comments:
if comment.user != self.user and comment.user != feed.user:
users.append(comment.user.pk)
users = list(set(users))
for user in users:
Notification(notification_type=Notification.ALSO_COMMENTED,
from_user=self.user,
to_user=User(id=user), feed=feed).save()
def notify_favorited(self, question):
if self.user != question.user:
Notification(notification_type=Notification.FAVORITED,
from_user=self.user, to_user=question.user,
question=question).save()
def unotify_favorited(self, question):
if self.user != question.user:
Notification.objects.filter(
notification_type=Notification.FAVORITED,
from_user=self.user,
to_user=question.user,
question=question).delete()
def notify_answered(self, question):
if self.user != question.user:
Notification(notification_type=Notification.ANSWERED,
from_user=self.user,
to_user=question.user,
question=question).save()
def notify_accepted(self, answer):
if self.user != answer.user:
Notification(notification_type=Notification.ACCEPTED_ANSWER,
from_user=self.user,
to_user=answer.user,
answer=answer).save()
def unotify_accepted(self, answer):
if self.user != answer.user:
Notification.objects.filter(
notification_type=Notification.ACCEPTED_ANSWER,
from_user=self.user,
to_user=answer.user,
answer=answer).delete()
def create_user_profile(sender, instance, created, **kwargs):
print("create_user_profile")
try:
print("created: "+ str(created))
if created:
Profile.objects.create(user=instance)
print("Member.objects.get_or_create(django_user=instance)")
#Create a user into groups_manager_member
member = Member.objects.create(django_user=instance, first_name=instance.first_name, last_name=instance.last_name, username=instance.username, email=instance.email)
print("member instance created")
print(member)
print("Group.objects.create(name=ID_GROUP+instance.username)")
#Create a group into groups_manager_group
group = Group.objects.create(name=ID_GROUP+instance.username)
print("group instance created")
print(group)
#Add member into the group correct
group.add_member(member=member)
print("member added into the group correct")
#Assign permission for the groups
assign_perm('can_add_member_custom', instance, group)
#print("assign_perm('can_add_member_custom', instance, group)")
except Exception as e:
print("Exception: "+str(e))
pass
def save_user_profile(sender, instance, **kwargs):
print("save_user_profile")
try:
instance.profile.save()
except Exception as e:
print("Exception: "+str(e))
pass
post_save.connect(create_user_profile, sender=User)
post_save.connect(save_user_profile, sender=User)
Django-guardian์ ๋จ์ผ ๊ฐ์ฒด๋ณ ๊ถํ ๊ด๋ฆฌ์ด๋ฏ๋ก ๋จ์ผ ์ฌ์ฉ์/๊ทธ๋ฃน ๊ถํ์ ๋จ์ผ ๊ฐ์ฒด์ ๋ถ์ฌํฉ๋๋ค.
์ข์ ์๋ฒฝํ์ง๋ง ๋ชจ๋ธ ๊ทธ๋ฃน ์์ ๊ถํ์ ์ถ๊ฐํ์ง๋ง ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
์๋ํ์ง ์๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
์ด ์ค:
#Assign permission for the groups
assign_perm('can_add_member_custom', instance, group)
print("assign_perm('can_add_member_custom', instance, group)")
์ธ์คํด์ค๋ ์ฌ์ฉ์ ๊ฐ์ฒด ์ด์ง๋ง ๊ทธ๋ฃน ๋ชจ๋ธ์ ๊ถํ์ ์ถ๊ฐํฉ๋๋ค.
# this is just required for easy explanation
class Meta(GroupMixin.Meta):
abstract = False
permissions = (
('can_add_member_custom', 'Can Add Member Custom'),
)
๋๋ ๋ฐ๋ณด์ผ, ๋๋ ์ด์ฃผํ๊ณ ์ด์ฃผํด์ผ ํ๋ค:
python3 manage.py makemigrations
python3 manage.py migrate
๊ธฐ๋ค๋ ค์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐ @ad-m
๊ทธ๋ฌ๋ ํ
ํ๋ฆฟ ๋ณด๊ธฐ์์ ์ด๋ป๊ฒ ํ์ธํ ์ ์์ต๋๊น?
์ด๊ฒ:
jack.has_perm('change_group', admins)
django ์
ธ์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.