Django-guardian: рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдмрдирд╛рдо рд╡рд╕реНрддреБ рдЕрдиреБрдорддрд┐рдпрд╛рдБ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рджрд┐рд╕ре░ 2015  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: django-guardian/django-guardian

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рд░реВрдЯреАрди рдХреЗ рдХрд╛рд░рдг рдХрдИ рдмрдЧ рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рдВрдмрдВрдзрд┐рдд рдмрдЧ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдВрдЧреЗред

API change Enhancement

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд╛рдБ!

allow_required_or_403 рдореЗрдВ accept_global_perms рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рд▓реЗрдХрд┐рди get_obj_perms рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ

рдореИрдВ рдПрдХ get_obj_perms_with_global рдЯреИрдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░рдорд┐рдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕ рд╕рдбрд╝рдХ рдХреЛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛; рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╢реБрд░реБрдЖрдд рдХрд░ рджреА рд╣реИ рддреЛ рдмреЗрдЭрд┐рдЭрдХ рдореБрдЭреЗ рд░реЛрдХреЗрдВ :)

рдкреАрдПрд╕ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ "рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХреНрд╕ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ" рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рдСрдмреНрдЬреЗрдХреНрдЯ, рд╕рдореВрд╣/рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛/рд╡реИрд╢реНрд╡рд┐рдХ, рд╕рдореВрд╣/рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпрд╛рдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрддрдирд╛ рд╕рдм рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж, рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдЬрд╛рдВрдЪрдирд╛ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ...рд╣рдореНрдордоред

рдкреЗрд╕реНрдЯрд┐рдХрд▓реНрд╕: рдпрд╣ рдХрд┐рддрдирд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрднрд┐рднрд╛рд╡рдХ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рдореБрджреНрджреЗ рд╣реИрдВред рд╣рдо рд╣рд░ рдЫрд╣ рдорд╣реАрдиреЗ рдореЗрдВ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ ... рдпрджрд┐ request.user.has_access('foo', obj) рд╕рддреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рд╣реИ рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдЪреЗрдХ рдХреЛ рджреЛ рдмрд╛рд░ рд▓рд┐рдЦрдирд╛ рдпрдХреА рд╣реИред

рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ ... рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐ рдпрд╣ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝рддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрджрд┐ рдпрд╣ рд╕рдордЭрджрд╛рд░ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛)ред

рдкреБрд░рд╛рдирд╛ рдореБрджреНрджрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рддрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░? рдореИрдВ рдЙрд╕реА рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдЕрдиреБрдорд╛рдирд┐рдд рдирд╣реАрдВ рд╣реИред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВрдиреЗ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ #49 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдереА рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдЧреНрд▓реЛрдмрд▓реНрд╕ рдкрд░ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рдЖрдирд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдмрдВрдж рдореБрджреНрджреЛрдВ рдиреЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдЬрд╛рд░реА рдХреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред

рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрд░рд╛ рдЗрд░рд╛рджрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрди рдореБрджреНрджреЛрдВ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

327 рдореБрдЭреЗ рддрдп рд▓рдЧрддрд╛ рд╣реИред

```
рдмреНрд░реИрдВрдбрди=Person.objects.get(first_name='BRANDON')
Brandon.is_superuser
рдЭреВрдард╛

рд╕реНрдХреВрд▓ = рд╕реНрдХреВрд▓.рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕.рдЧреЗрдЯ (рдкреАрдХреЗ = 1)

get_users_with_perms(рд╕реНрдХреВрд▓, рдЕрдЯреИрдЪ_рдкрд░рдореНрд╕=рд╕рдЪ, with_superusers=рдЧрд▓рдд, with_group_users=рдЧрд▓рдд)
{}

рдЕрд╕рд╛рдЗрди_рдкрд░реНрдо ('рдРрдб_рд╕реНрдХреВрд▓', рдмреНрд░реИрдВрдбрди, рд╕реНрдХреВрд▓)

get_users_with_perms(рд╕реНрдХреВрд▓, рдЕрдЯреИрдЪ_рдкрд░рдореНрд╕=рд╕рдЪ, with_superusers=рдЧрд▓рдд, with_group_users=рдЧрд▓рдд)
{: ['рдРрдб_рд╕реНрдХреВрд▓']}

mehmet=Person.objects.get(first_name='Mehmet')
mehmet.is_superuser
рд╕рддреНрдп

get_users_with_perms(рд╕реНрдХреВрд▓, рдЕрдЯреИрдЪ_рдкрд░рдореНрд╕=рд╕рдЪ, with_superusers=рд╕рддреНрдп, with_group_users=рдЧрд▓рдд)
{: [],: ['add_school', 'change_school', 'delete_school']}

рдЕрд╕рд╛рдЗрди_рдкрд░реНрдо ('add_school', рдореЗрд╣рдордд, рд╕реНрдХреВрд▓)

get_users_with_perms(рд╕реНрдХреВрд▓, рдЕрдЯреИрдЪ_рдкрд░рдореНрд╕=рд╕рдЪ, with_superusers=рд╕рддреНрдп, with_group_users=рдЧрд▓рдд)
{: [],: ['add_school', 'change_school', 'delete_school']}

get_users_with_perms(рд╕реНрдХреВрд▓, рдЕрдЯреИрдЪ_рдкрд░рдореНрд╕=рд╕рдЪ, with_superusers=рдЧрд▓рдд, with_group_users=рдЧрд▓рдд)
{: ['рдРрдб_рд╕реНрдХреВрд▓'],: ['add_school']}

#155 рдкрд░:

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ get_obj_perms_field_choices (self) :

        if self.exclude_default:
            choices = list(set(choices).intersection(self.obj._meta.permissions))

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

рд▓реЗрдХрд┐рди, рдЙрд╕ рдкрд░ рдЧреМрд░ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдо рдореЙрдбрд▓ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

    def save_obj_perms(self):
        """
        Saves selected object permissions by creating new ones and removing
        those which were not selected but already exists.

        Should be called *after* form is validated.
        """
        perms = self.cleaned_data[self.get_obj_perms_field_name()]
        model_perms = [c[0] for c in self.get_obj_perms_field_choices()]

        to_remove = set(model_perms) - set(perms)
        for perm in to_remove:
            remove_perm(perm, self.user, self.obj)

        for perm in perms:
            assign_perm(perm, self.user, self.obj)

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧ рдЬреИрд╕реЗ GUARDIAN_FALLBACK_TO_MODEL=False рдФрд░ рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдЬреИрд╕реЗ fallback_to_model=False рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдФрд░ рдореЙрдбрд▓ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред False рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдпрд╛ рддрд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рддреНрдп рд╣реИ, рддреЛ рдлрд╝реЙрд▓рдмреИрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

GUARDIAN_FALLBACK_TO_MODEL рдХреЗ рд▓рд┐рдП +1ред

#49 рдкрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрдЯрд┐рдВрдЧ рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ рдХрд┐ ObjectPermissionBackend рд╕реНрдкрд╖реНрдЯ рдерд╛ рдпрд╛ рдирд╣реАрдВред

рдореИрдВрдиреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ (#546)ред рдпрд╣ core.py рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдЪреЗрдХрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореЙрдбрд▓ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ (рдпрд╛ рд╢рд╛рдорд┐рд▓) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреА рднреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдЙрдирдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдореЗрдВ рдХреВрджрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд▓рдЧрддрд╛ рд╣реИ #327 рдЕрдм рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред #рейрейреи рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред #155 (рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЗрд╡рд▓ рдПрдХ рдкрдХреНрд╖ рдореБрджреНрджрд╛ рдмрдЪрд╛ рд╣реИред рдЕрдЧрд░ рдЗрд╕ рдкрд░ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ (рдпрд╛ рдХрд┐рд╕реА рдЕрд▓рдЧ рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛), рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЕрднреА рднреА рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдВ рдЧрд▓рдд рд╣реВрдВ?

u = User.objects.get(id=1)
c = Client.objects.get(id=1)
assign_perm('core.change_client', u)
u = User.objects.get(id=1)  # reloading user for perm refresh
u.has_perm('core.change_client')  # True
u.has_perm('core.change_client', c)  # False
u.has_perm('change_client', c)  # False
get_perms(u, c)  # []

рдФрд░ GUARDIAN_GLOBAL_PERMISSIONS_CARRY_OVER рдпрд╛ FALLBACK_TO_MODEL рд╕реЗрдЯрд┐рдВрдЧ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ? рди рддреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕реЗ core.py рдЬреЛрдбрд╝рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛?

get_user_perms:126 рдЬреЛ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрдорддрд┐ рдЬрд╛рдБрдЪ рдХрд╛ рдХреЗрдВрджреНрд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ; рдмреВрд▓рд┐рдпрди рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп

def get_user_perms(self, obj):
    # ....
    user_global_perms = Permission.objects.filter(content_type=ctype)\
                                        .filter(user=self.user)\
                                        .values_list('codename', flat=True)
    user_object_perms = user_perms_qs.values_list("codename", flat=True)
    user_perms = list(chain(user_global_perms, user_object_perms))
    return user_perms
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕