Django-guardian: рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдп рдЬреЛрдбрд╝реЗрдВ/рдирд┐рдХрд╛рд▓реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдирд╡ре░ 2017  ┬╖  35рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: django-guardian/django-guardian

рдирдорд╕реНрддреЗ, рдореБрдЭреЗ рдПрдХ рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдореВрд╣ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

рд╕рднреА 35 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдЖрдкрдХреЛ рдРрд╕реА рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдмрдирд╛рдиреА рд╣реЛрдВрдЧреА рдФрд░ django-guardian рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкрд╕рдВрдж рд╣реИ?

рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

Django- рдЕрднрд┐рднрд╛рд╡рдХ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдРрд╕реА рд╡рд╕реНрддреБ рд╕рдореВрд╣ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рджреЗрдЦреЗрдВред рджреЗрдЦреЗрдВ 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-рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рднреВрдорд┐рдХрд╛ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджреЗрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реНрдЯрд╛рдл рд╕рджрд╕реНрдпреЛрдВ рдХреЛ "X" рд╕рдореВрд╣ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ "рд╕реНрдЯрд╛рдлрд╝" рд╕рдореВрд╣ рдмрдирд╛рдПрдВ, рдЙрд╕рдореЗрдВ рд╕реНрдЯрд╛рдл рд╕рджрд╕реНрдп рдЬреЛрдбрд╝реЗрдВ, "X" рд╕рдореВрд╣ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ "рд╕реНрдЯрд╛рдлрд╝" рд╕рдореВрд╣ рдХреЛ "X" рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рд╕рдореВрд╣ред

рдореБрдЭреЗ рдРрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ
"X" рдХреЗрд╡рд▓ рд╕рдореВрд╣ "X" рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝ рдпрд╛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ "рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ" рдЗрд╕реЗ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рди рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖реБ рдХреЗ рд▓рд┐рдПред

рдореЗрд░реА рдЦрд░рд╛рдм рдЗрдВрдЧреНрд▓рд┐рд╢ рдХреЗ рд▓рд┐рдП рдорд╛рдлрд╝ рдХреАрдЬрд┐рдпреЗ

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ред рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

"X" can add or remove only for group "X" рдорддрд▓рдм:

  1. рдЧреНрд░реБрдк рдПрдХреНрд╕ рдмрдирд╛рдПрдВ,
  2. рд╕рдореВрд╣ X рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ
  3. рд╕рдореВрд╣ X рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореВрд╣ X рдХреА рдЕрдиреБрдорддрд┐ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рд╕рдореВрд╣ "x" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд╡рд╣ рдЕрдкрдиреЗ рд╕рдореВрд╣ рд╕реЗ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛

@ рдПрд▓рди-рдирд╛рд╡рд╛, django-рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рднреВрдорд┐рдХрд╛ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рджреЗрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдВ, рддреЛ рд╕рдореВрд╣ рдХреЛ рдЙрд╕ рд╕рдореВрд╣ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ "X" рд╕рдореВрд╣ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "X" рд╕рдореВрд╣ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ?

рдпрд╣ рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рд╕рднреА рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкрд╛рд╕ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ): рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдореВрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рд╡рд╣ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рдпрд╛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдпрд╣ рдЕрдиреНрдп рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛ рдЙрд╕ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ

рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдпрд╣ рдЕрдиреНрдп рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛ рдЙрд╕ рд╕рдореВрд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рдХреНрдп Django рдХреЛрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдореВрд╣ X рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрди рд╕рдореВрд╣ X рдХреЛ рджреА рдЧрдИ рд╕рд╣реА Django-рдЕрднрд┐рднрд╛рд╡рдХ рдЕрдиреБрдорддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рд╕рдореВрд╣ 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)")

screen shot 2017-11-21 at 10 14 30

@ рдПрд▓рди-рдирд╛рд╡рд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ?

@ рд╡рд┐рдЬреНрдЮрд╛рдкрди-рдПрдо
рдореБрдЭреЗ рдпрд╣ рдмрдЧ рдорд┐рд▓рд╛:

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

screen shot 2017-11-21 at 12 53 38

@ рдПрд▓рди-рдирд╛рд╡рд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ?

@ ad-m рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдБ рд╣реИ

@ рдПрд▓рди-рдирд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрдИ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдбреЙрдХреНрд╕ рдкрдврд╝реЗрдВ рдХреНрдпрд╛ рдЕрдиреБрдорддрд┐ рдореМрдЬреВрдж рд╣реИ ред

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрди рд╕рдореВрд╣реЛрдВ/рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрди рдЕрдиреБрдорддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ?

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 рд╕рдореВрд╣ рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

рдпрд╣ рдореЗрд░рд╛ рдореЙрдбрд▓ рд╕рдореВрд╣ рд╣реИ :

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-рдЕрднрд┐рднрд╛рд╡рдХ рдкреНрд░рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐ рдкреНрд░рдмрдВрдзрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рд╕рдореВрд╣ рдЕрдиреБрдорддрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдореЙрдбрд▓ рд╕рдореВрд╣ рдореЗрдВ рдЕрдиреБрдорддрд┐ рдЬреЛрдбрд╝реА рд╣реИ

рдХреНрдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛?

рдпрд╣ рд░реЗрдЦрд╛:

#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'),
        )

рдореИрдВрдиреЗ рдЗрд╕ django-groups-manager . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

рдореИрдВ рдореВрд░реНрдЦ рд╣реВрдБ, рдореБрдЭреЗ рдкреНрд░рд╡рд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдкрд▓рд╛рдпрди рдХрд░рдирд╛ рд╣реИ:

python3 manage.py makemigrations
python3 manage.py migrate

рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж ЁЯСН @ad-m

рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡реНрдпреВ рдореЗрдВ, рдореИрдВ рдХреИрд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВ?
рдпрд╣:
jack.has_perm('change_group', admins)

django рдЦреЛрд▓ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
screen shot 2017-11-21 at 16 42 17

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕