рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рднреВрдорд┐рдХрд╛рдПрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реАрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, Django рдХреА рдиреАрддрд┐ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреА рдЧрдИ рдмреИрдЯрд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИред django.contrib.auth рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдХрд┐рддрдиреА рдмрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдирд╣реАрдВред рдЕрднрд┐рднрд╛рд╡рдХ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рдордЭрджрд╛рд░ рдФрд░ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде, рдРрдк рдХреЛ "рд╡рд┐рд╕реНрддрд╛рд░" рдХрд░рдирд╛ рд╣реИред рдФрд░ рдмрд╕ред рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдХреБрдЫ рд╢реЙрд░реНрдЯрдХрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рд▓реЗрдХрд┐рди рдпрд╣ "рд╕рдордЭрджрд╛рд░" рднрд╛рдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ)ред
рдЕрдм, рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛? рд╡реЗ рд╕рдм рд╣рдореЗрд╢рд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИред рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рднреА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рдХреЗ рд▓рд┐рдП рдПрдХ рдореМрд▓рд┐рдХ рдЗрдХрд╛рдИ рд╣реИред
рдареАрдХ рд╣реИ, рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ, v1.0 рд▓рдЧрднрдЧ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ред рддреЛ v1.1 рдХреЗ рд▓рд┐рдП, рднреВрдорд┐рдХрд╛ рд╕рдорд░реНрдерди рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред рдлрд┐рд░ рднреА, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рд╡реИрдХрд▓реНрдкрд┐рдХ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
+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
рдРрдк рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рд╕реЗ рдЖрдЙрдЯрд╕реЛрд░реНрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧреБрдЖрдбрд┐рдпрди (рдЕрднрд┐рднрд╛рд╡рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реАрд░реНрд╖ рдРрдк рд╕рдорд╛рдзрд╛рди) рдореЗрдВ рднреВрдорд┐рдХрд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реЛред