Redmine рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдирд╛

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

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп


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

рдбреЗрд╡рд▓рдкрд░реНрд╕, рдмреЗрд╢рдХ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд▓реНрдХрд┐ рджреБрд░реНрд▓рдн рд╣реИрдВред рдореИрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред



рдХрд╛рд░реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ "рдЯрд╛рд╕реНрдХ рдХреНрд▓реЛрдЬреНрдб" рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рд╕реВрдЪрдирд╛рдПрдБ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╖реНрдЯрдкреНрд░рдж рдереАрдВред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдп рдХреЛ рдлрд┐рд░ рд╕реЗ "рдирдпрд╛" рдХрд╛ рджрд░реНрдЬрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЯрд┐рдкреНрдкрдгреА рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реВрдВред

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

рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдп: рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЦрд╛рддреЗ рдореЗрдВ рдХрд╛рд░реНрдп рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рди рдХрд░реЗрдВ"ред

рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди


рдореИрдВ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛; рдЗрд╕реЗ redmine.org рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рдЪреЗрдХрдорд╛рд░реНрдХ рдЬреЛрдбрд╝реЗрдВ, "рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рди рдХрд░реЗрдВред" рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ \ app \ views \ users \ _mail_notifications.html.erb рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ HTML рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред

рдпрд╣ рдмрд╣реБрдд рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдХ рд╣реБрдХ : view_users_form , рдЧрд▓рдд рд╕реНрдерд╛рди рдкрд░ рдЪреЗрдХрдмреЙрдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде Redmine рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реБрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣рдореЗрд╢рд╛ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдФрд░ рдпрд╣ рдорд╛рдорд▓рд╛ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд▓рд╛, "рдкреИрдЪ" 3 рд╡рд┐рдзрд┐рдпрд╛рдБ, рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЦрд╛рддрд╛ рдкреГрд╖реНрда рдкрд░ рд╕рдВрдкрд╛рджрди рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╣реБрдХ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реБрдХ" рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛: alias_method рдФрд░ alias_method_chain ред рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рддрд░реНрдХ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдирд╛рдо, рд▓рд┐рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд▓рд┐рдВрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдХ рдЦрд╛рддрд╛ my_controller рдирд┐рдпрдВрддреНрд░рдХ, рдЦрд╛рддрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдо рдкреНрд▓рдЧрдЗрди \ sub \ рдкреИрдЪ \ my_controller_patch.rb рдХреЗ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдХрд░ рдЗрд╕реЗ рдкреИрдЪ рдХрд░реЗрдВрдЧреЗ

module Patches module MyControllerPatch def self.included(base) #    base.extend(ClassMethods) #     base.send(:include, InstanceMethods) base.class_eval do unloadable #     alias_method_chain :account, :ext end end module ClassMethods end module InstanceMethods #     ext def account_with_ext if request.post? #           User.current.pref[:no_self_notified_closed] = (params[:no_self_notified_closed] == '1') end #    account account_without_ext end end end end 

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдирд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рдЗрд╕реА рддрд░рд╣ред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рддреЗ рд╕рдордп рд╕реЗрдЯ рдорд╛рди рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдореЙрдбрд▓, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╡рд┐рдзрд┐ рдФрд░ watcher_recipients рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ \ lib \ patches \ issue_patch.rb рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдмрджрд▓реЗрдВред

 module Patches module IssuePatch def self.included(base) тАж base.class_eval do unloadable #     alias_method :recipients, :recipients_ext alias_method :watcher_recipients, :watcher_recipients_ext end end тАж module InstanceMethods #     def recipients_ext #       @status = IssueStatus.find_by_id(self.status_id) notified = project.notified_users #         ( allow_notify_closed) notified << author if author && author.active? && author.notify_about?(self) && allow_notify_closed?(author) if assigned_to if assigned_to.is_a?(Group) notified += assigned_to.users.select { |u| u.active? && u.notify_about?(self) && allow_notify_closed?(u) } else notified << assigned_to if assigned_to.active? && assigned_to.notify_about?(self) && allow_notify_closed?(assigned_to) end end notified.uniq! notified.reject! { |user| !visible?(user) } notified.collect(&:mail) end #  def watcher_recipients_ext notified = watcher_users.active notified.reject! { |user| user.mail_notification == 'none' || allow_notify_closed?(user) === false } if respond_to?(:visible?) notified.reject! { |user| !visible?(user) } end notified.collect(&:mail).compact end private #   ,          def allow_notify_closed?(user) (user.pref[:no_self_notified_closed] && @status.is_closed?) ? false : true end end end end 

рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреИрдЪ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реИред рдкреНрд▓рдЧ рдЗрди рдХреА рдЬрдбрд╝ рдореЗрдВ, init.rb рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:

 # dispatcher       require 'dispatcher' Dispatcher.to_prepare do MyController.send(:include, Patches::MyControllerPatch) UsersController.send(:include, Patches::UsersControllerPatch) Issue.send(:include, Patches::IssuePatch) end 

/ рд╡рд┐рдХреНрд░реЗрддрд╛ / рдкреНрд▓рдЧрдЗрдиреНрд╕ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░реЗрдВред рдпрд╣реА рд╣реИ, рдЕрдм рдЖрдк рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдИрдореЗрд▓ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк Redmine рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕реНрд░реЛрдд рд╕реЗ рд▓рд┐рдВрдХ https://github.com/parshukovvv/redmine_notice

Source: https://habr.com/ru/post/In142584/


All Articles