Django-guardian: рднреВрдорд┐рдХрд╛рдПрдВ рдЬреЛрдбрд╝реЗрдВ

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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рднреВрдорд┐рдХрд╛рдПрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реАрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, Django рдХреА рдиреАрддрд┐ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреА рдЧрдИ рдмреИрдЯрд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИред django.contrib.auth рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХрд┐рддрдиреА рдмрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдирд╣реАрдВред рдЕрднрд┐рднрд╛рд╡рдХ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рдРрдк рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░" рдХрд░рдирд╛ рд╣реИред рдФрд░ рдмрд╕ред рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдХреБрдЫ рд╢реЙрд░реНрдЯрдХрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рд▓реЗрдХрд┐рди рдпрд╣ "рд╕рдордЭрджрд╛рд░" рднрд╛рдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред

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

рдареАрдХ рд╣реИ, рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ, v1.0 рд▓рдЧрднрдЧ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ред рддреЛ v1.1 рдХреЗ рд▓рд┐рдП, рднреВрдорд┐рдХрд╛ рд╕рдорд░реНрдерди рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред рдлрд┐рд░ рднреА, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рд╡реИрдХрд▓реНрдкрд┐рдХ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

API change Enhancement

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

+1 рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рднреВрдорд┐рдХрд╛рдПрдВ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ django рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдРрдкреНрд╕ рдореЗрдВ рд▓рдЧрднрдЧ рдХрднреА рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд╕рдордп-рд╕рдордп рдкрд░ рд╣рдорд╛рд░реЗ рдЬреИрд╕рд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдРрдк (рдХрд╕реНрдЯрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП django рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░рдорд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ :) рднреВрдорд┐рдХрд╛рдПрдВ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ v1.1 . рдореЗрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрд╕рд╛рди рд╣реИред рдЬреИрд╕реЗ django рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реИрд╕реЗ рд╣реА рд▓реЛрдЧреЛрдВ рдХреЛ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдРрдк рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП thxред
рдПрд╢

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП +1ред

рднреВрдорд┐рдХрд╛рдУрдВ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП +1

рдореИрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ "рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рд╕рдореВрд╣" рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВред рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХ рднреВрдорд┐рдХрд╛ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣:

http://docs.python.org/library/stdtypes.html#set -types-set-frozenset
http://en.wikibooks.org/wiki/Python_Programming/Sets

рднреВрдорд┐рдХрд╛рдУрдВ, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП +1

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

рдореИрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдпрд╣ django-guardian рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдореИрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдРрдк рдмрдирд╛рдЙрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ django-guardian рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдФрд░ рдШрдЯрдХ рдареАрдХ рд╣реИрдВ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдореИрдВ рдкрд╣рд┐рдпрд╛ рдХрд╛ рдкреБрди: рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдмрд▓реНрдХрд┐ рдЙрдирдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рддреЛ рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рдЕрдЧрд░ рдЖрдк django-guarding рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдкреНрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ): рдСрдмреНрдЬреЗрдХреНрдЯрдкреНрд░рдорд┐рд╢рди рдЪреЗрдХрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдмрдирд╛рдПрдВ, рдЬреЛ рдЕрдиреНрдп рдРрдкреНрд╕ рдХреЛ рдЪреЗрдХрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА рдЬреЛ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддреА рд╣реИ?

рддреБрдо рд▓реЛрдЧ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?

рдзрдиреНрдпрд╡рд╛рдж
рдЬреБрдПрд░реНрдЧреЗрди

рд╣реЗрдЬ @schacki , рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдиреЙрдЯ-рдбрд┐рдлреЙрд▓реНрдЯ рдЪреЗрдХрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рд╕рдВрднрд╡рдд: рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреЗрдХрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВ рдХрд┐рд╕реА рднреА рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреЗрдХрд░ рд╡рд░реНрдЧ рдХреЛ django-guardign рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ "рдЕрдиреНрдп" рдРрдк рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдЙрдВрдЧрд╛ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреЗрдХрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдРрдк рдХрд╛ рдХрд╛рдо рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЕрдзрд┐рдХ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдЦреЛрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред "рдХрд╛рд░реНрдп" рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИ? рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ: рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╣рдлреНрддреЗ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ [1] рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреБрдЫ рднреА рдорджрдж рдХрд░рддреА рд╣реИ?

[рез] https://github.com/vintasoftware/django-role-permissions

#330 рд╕реЗ @suriya рджреНрд╡рд╛рд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╛рда рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐

рдкрд┐рдЫрд▓реЗ #23 рдореЗрдВ django-guardian рдореЗрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЬреНрдпрд╛рджрд╛ рджреВрд░ рдирд╣реАрдВ рдЪрд▓рд╛ред рдРрд╕рд╛ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ django-guardian рдореЗрдВ рднреВрдорд┐рдХрд╛рдПрдВ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред

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

рдПрдХ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП django-рдЕрднрд┐рднрд╛рд╡рдХ рдХреА рдЕрдиреБрдорддрд┐ рдЬрд╛рдБрдЪ рдХрд╛ рдореВрд▓ рдХрд╛рд░реНрдп get_403_or_None() рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рд╣реИрдВред https://github.com/lukaszb/django-guardian/blob/112c373f213a19d93baa81fa4a941a41333115b5/guardian/utils.py#L98

has_permissions = all(request.user.has_perm(perm, obj) for perm in perms)

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

if require_all_permissions:
    has_permissions = all(request.user.has_perm(perm, obj) for perm in perms)
else:
    has_permissions = any(request.user.has_perm(perm, obj) for perm in perms)

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

рдореИрдВрдиреЗ #386 рдЦреЛрд▓рд╛ рдФрд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рд╡рд╣реА рд╣реИред рдореБрдЭреЗ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдХреЛрдб рдореЗрдВ рдореИрдВ рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ "рдХреНрдпрд╛ рдЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╕рдВрдкрд╛рджрди рдЕрдиреБрдорддрд┐рдпрд╛рдВ рд╣реИрдВ", рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ "рдореЙрдбрд░реЗрдЯрд░" рдЕрдиреБрдорддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рд╣реИ "рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ" рдЕрдиреБрдорддрд┐ рд╕рд╣рд┐рдд рдХрдИ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯред рдпрд╣ рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдмрд┐рдирд╛ "рдореЙрдбрд░реЗрдЯрд░" рдХреЛ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рдо рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЗрд╕ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рднреВрдорд┐рдХрд╛рдУрдВ, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд▓рд┐рдП +1

рдореИрдВрдиреЗ рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдПрдХ рднреВрдорд┐рдХрд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд╛рдЧреВ рдХреА:

рдЕрдиреБрдХреВрд▓рд┐рдд get_40x_or_None

from django.conf import settings
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.http import HttpResponseForbidden, HttpResponseNotFound
from django.shortcuts import render
from guardian.conf import settings as guardian_settings


def get_40x_or_None(request, perms, global_perms, obj=None, login_url=None,
                    redirect_field_name=None, return_403=False,
                    return_404=False):
    """check if the given perms and global_perms are both granted by the user in combination"""
    login_url = login_url or settings.LOGIN_URL
    redirect_field_name = redirect_field_name or REDIRECT_FIELD_NAME

    # Handles both original and with object provided permission check
    # as ``obj`` defaults to None

    has_permissions = False
    if not has_permissions:
        has_permissions = all(request.user.has_perm(perm, obj) for perm in perms) and \
                          all(request.user.has_perm(perm) for perm in global_perms)

    if not has_permissions:
        if return_403:
            if guardian_settings.RENDER_403:
                response = render(request, guardian_settings.TEMPLATE_403)
                response.status_code = 403
                return response
            elif guardian_settings.RAISE_403:
                raise PermissionDenied
            return HttpResponseForbidden()
        if return_404:
            if guardian_settings.RENDER_404:
                response = render(request, guardian_settings.TEMPLATE_404)
                response.status_code = 404
                return response
            elif guardian_settings.RAISE_404:
                raise ObjectDoesNotExist
            return HttpResponseNotFound()
        else:
            from django.contrib.auth.views import redirect_to_login
            return redirect_to_login(request.get_full_path(),
                                     login_url,
                                     redirect_field_name)

рдХрд╕реНрдЯрдо GlobalPermissionRequiredMixin

from django.core.exceptions import PermissionDenied, ImproperlyConfigured
from guardian.mixins import PermissionRequiredMixin
from collections.abc import Iterable

from permission.utils import get_40x_or_None


class GlobalPermissionRequiredMixin(PermissionRequiredMixin):
    global_permission_required = None

    def get_global_required_permissions(self, request=None):
        """
        Returns list of permissions in format *<app_label>.<codename>* that
        should be checked against *request.user* and *object*. By default, it
        returns list from ``global_permission_required`` attribute.

        :param request: Original request.
        """
        if isinstance(self.global_permission_required, str):
            perms = [self.global_permission_required]
        elif isinstance(self.global_permission_required, Iterable):
            perms = [p for p in self.global_permission_required]
        else:
            raise ImproperlyConfigured("'GlobalPermissionRequiredMixin' requires "
                                       "'global_permission_required' attribute to be set to "
                                       "'<app_label>.<permission codename>' but is set to '%s' instead"
                                       % self.global_permission_required)
        return perms

    def check_permissions(self, request):
        """
        Checks if *request.user* has all permissions returned by
        *get_required_permissions* method.

        :param request: Original request.
        """
        obj = self.get_permission_object()

        forbidden = get_40x_or_None(request,
                                    perms=self.get_required_permissions(request),
                                    global_perms=self.get_global_required_permissions(request),
                                    obj=obj,
                                    login_url=self.login_url,
                                    redirect_field_name=self.redirect_field_name,
                                    return_403=self.return_403,
                                    return_404=self.return_404,
                                    )
        if forbidden:
            self.on_permission_check_fail(request, forbidden, obj=obj)
        if forbidden and self.raise_exception:
            raise PermissionDenied()
        return forbidden

рдХреНрд░реВрдб рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд django рдореЗрдВ рдЕрдм global_required_permissions рдФрд░ required_permissions рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

class ResourceDeleteView(GlobalPermissionRequiredMixin, DeleteView):
    ...
    global_permission_required = [app.delete_resource]
    permission_required = [app.view_resource]
    ...

рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ User рдкрд╛рд╕ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рд╣реИ, рдЬрд┐рд╕реЗ django auth рдореЙрдбрд▓ (рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреВрдорд┐рдХрд╛) рд╕реЗ Group рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ django auth рдореЙрдбрд▓ рд╕реЗ view_resource Permission рдЖрдзрд╛рд░рд┐рдд рд╡рд╕реНрддреБ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ django рдЕрднрд┐рднрд╛рд╡рдХ рдХреЗ рд╕рд╛рде рднреВрдорд┐рдХрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрдо рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рддреЛ рдореИрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдореЗрд░реЗ рдХреЛрдб рдХреЗ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдореБрдХреНрдд рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдЦреЛрд▓реВрдВрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг @jokieferред рдореБрдЭреЗ рд╡рд╣ рдкрд╕рдВрдж рд╣реИ, рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде guardian рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ view рдпрд╛ edit рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП view рдпрд╛ edit рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рдПрдХ рд╕рдХреНрд╖рдо рдЕрдиреБрдорддрд┐ рдХреЗ рдЕрдзрд┐рдирд┐рдпрдо рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкреВрдЫрдиреЗ рдЬрд╛ рд░рд╣реА рдереА рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреА рдереАрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЪреАрдЬреЛрдВ рдХрд╛ рдкреБрдирд░реНрдЧрдарди рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдирдореВрдирд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛? рдпрд╛рдиреА рд╡реИрд╢реНрд╡рд┐рдХ delete рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ delete рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБ-рдЖрдзрд╛рд░рд┐рдд delete рдЕрдиреБрдорддрд┐ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡реИрд╢реНрд╡рд┐рдХ delete рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рд╡рд╕реНрддреБ рд╡рд┐рд╢рд┐рд╖реНрдЯ view ? рдХреНрдпрд╛ рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрдореЗрд▓ рд╣реИ?

@dwasyl

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдирдореВрдирд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛?
рд╣рд╛рдБ рдпрд╣ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдКрдкрд░ рдХреЗ рдирдореВрдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдо рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ acl рдРрдк (AccessControlList) рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдРрдк рдореЗрдВ рдПрдХ рдХреЛрд░ рдореЙрдбрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдПрд╕реАрдПрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдореЙрдбрд▓ atomic рдЕрднрд┐рднрд╛рд╡рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рд░ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ, рд╕реБрд▓рдн рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕реЗрдЯ (рд╕реЗрдЯреЛрдВ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдкреАрдЫреЗ рдХреА рдЬрд╛рджреБрдИ рдЪреАрдЬ рдХреБрдЫ рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ownable_models_handling.py рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХреЗрдд рд╣реИ рдЬреЛ рдЕрдиреНрдп рд╕рднреА рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдЕрднрд┐рднрд╛рд╡рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реБрд▓рдн рд╣реЛрдВрдЧреЗред рдпрджрд┐ рд╣рдо рдЕрдзрд┐рдХ рдореЙрдбрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ AccessControlList рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ m2m рдлрд╝реАрд▓реНрдб рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА accessible_MODELNAME рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред acl_handling.py рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП AccessControlList рдЖрдзрд╛рд░ рдкрд░ рдЕрднрд┐рднрд╛рд╡рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛/рд╣рдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЧрд╛рд░реНрдЬрд┐рдпрди рдХреЛрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрд╕реАрдПрд▓ рдРрдк рдЖрдкрдХреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдирдореВрдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдХрд░реЗред acl рдРрдк рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рд╕реЗ рдЖрдЙрдЯрд╕реЛрд░реНрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧреБрдЖрдбрд┐рдпрди (рдЕрднрд┐рднрд╛рд╡рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖ рдРрдк рд╕рдорд╛рдзрд╛рди) рдореЗрдВ рднреВрдорд┐рдХрд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реЛред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

BenDevelopment picture BenDevelopment  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Allan-Nava picture Allan-Nava  ┬╖  35рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xuhcc picture xuhcc  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ad-m picture ad-m  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

David-OConnor picture David-OConnor  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ