Redmine: пользовательское поле фильтра для добавления новостей

Я хотел бы добавить настраиваемое поле фильтра на страницу «Добавить новость» в Redmine, чтобы при добавлении новой новости я мог выбрать группу пользователей, которым должно быть отправлено электронное письмо.

Само поле представляет собой список групп пользователей Redmine, и каждый пользователь относится как минимум к одной из них.

Кто-нибудь сделал это? Мы ценим любые предложения

Я нашел 3 файла, связанных с проблемой:

  • /приложение/контроллер/news_controller.rb
  • /app/models/news.rb
  • /app/views/новости/_form.html.erb
Environment:
  Redmine version                          2.2.1.stable.11156
  Ruby version                             1.8.7 (x86_64-linux)
  Rails version                            3.2.11
  Environment                              production
  Database adapter                         MySQL
Redmine plugins:
  no plugin installed

Пока сделал только 1 модификацию в Redmine, которая рассылает добавленные новости всем зарегистрированным пользователям. Файл: /app/modelsmailer.rb

Обзор:

http://www.lwks.com/images/custom/redmine_question.png

РЕДАКТИРОВАТЬ: Следуя вашему совету, я перенес функцию рассылки на контроллер:

  def create
    @news = News.new(:project => @project, :author => User.current)
    @news.safe_attributes = params[:news]
    @news.save_attachments(params[:attachments])

    if @news.save
      #news_added(@news)
      if params[:group]
        mail :to => GroupsUser.find(params[:group][:ids]).joins(:users).select("users.mail").compact,
            :subject => "[#{@news.project.name}] #{l(:label_news)}: #{@news.title}"
      else
        render :new
      end
    end
  end

Но я получаю сообщение об ошибке: NameError (неинициализированная константа NewsController::GroupsUser): указывает на строку

mail :to => GroupsUser.find

person WooDzu    schedule 15.01.2013    source источник
comment
Я думаю, что понятно, что вы пытаетесь сделать, но менее ясно, что нужно сделать для этого. У вас уже есть группы, определенные где-то, или вам нужна помощь с этим? Вам нужна помощь с View для отображения окна множественного выбора? Или вам просто нужна помощь с контроллером, чтобы ограничить круг получателей электронных писем?   -  person Geoff    schedule 22.01.2013
comment
Определить эти группы не проблема, они основаны на группах пользователей Redmine по умолчанию (таблица базы данных: groups_users). Мне просто нужно вытащить список из БД, отобразить в поле зрения и заставить контроллер отфильтровать эти группы перед отправкой.   -  person WooDzu    schedule 22.01.2013


Ответы (1)


news_controller.rb:

def new
  @news = News.new
  @groups = GroupsUser.all
end

новости/_form.html.erb:

<%= label_tag :group_ids "Groups"
<%= collection_select :group, :ids, @groups, :id, :name, {}, multiple: true %>

Изменить:

Мне придется сделать несколько предположений о том, как выглядят ваши контроллеры, но я дам вам кое-что близкое. Основываясь на предоставленной вами функции почтовой программы, я предполагаю, что она была вызвана из контроллера create после сохранения News. После этого я бы вызвал функцию почты. Что-то вроде этого:

def create
  news = News.new(params[:news]
  if news.save
    news_added(news)
    send_mail_to_groups(params[:group][:ids]) if params[:group]
    redirect_to ...
  else
    render :new
  end
end

Почтовая часть должна быть удалена из news_added

def news_added(news)
  redmine_headers 'Project' => news.project.identifier
  @author = news.author
  message_id news
  @news = news
  @news_url = url_for(:controller => 'news', :action => 'show', :id => news)
end

в пользу своего нового распорядка:

send_mail_to_users_by_group_ids(group_ids)
    # Woo: Sent to all users, despite their email settings
    mail :to => GroupsUser.find(group_ids).joins(:users).select("users.mail").compact,
      :subject => "[#{@news.project.name}] #{l(:label_news)}: #{@news.title}"
end

Возможно, вы захотите добавить пункт where, чтобы включить только активных пользователей.

Я думаю, это правильно. Я делаю это из головы, так что, вероятно, там опечатка или ошибка или две. Надеюсь, это укажет вам правильное направление.

person Geoff    schedule 21.01.2013
comment
Привет Джефф. Спасибо, что попробовали! Я добавил к своему вопросу содержимое models/mailer.rb - person WooDzu; 22.01.2013
comment
Привет еще раз. Следуя вашему совету, я перенес функцию почтовой программы на контроллер. Не могли бы вы взглянуть на обновленный вопрос - person WooDzu; 28.01.2013
comment
Это правильный запрос Active Record? .select(users.mail).where(users.status = 1).compact - person WooDzu; 28.01.2013
comment
Извините, я не знал, что код был в почтовой программе. (Вы пометили это, но я пропустил.) Базовый код, вероятно, должен остаться там, где он был. Это может быть причиной ошибки, которую вы видите. Я просто хотел указать, что создание модели должно быть отделено от рассылки. Да, фрагмент в комментарии выше выглядит законно. - person Geoff; 28.01.2013
comment
Итак, я переместил бит почтовой программы обратно в модель mailer.rb, но теперь я получаю NameError (неинициализированная константа Mailer::GroupsUser): Как мне инициализировать GroupsUser из ActiveRecord правильно? - person WooDzu; 28.01.2013
comment
Ах да, извините. Попробуйте переместить find() в конец. Незадолго до compact. - person Geoff; 29.01.2013
comment
Спасибо, Джефф, за все ваши усилия. Я так близок к тому, чтобы сдаться. pastebin.com/Nqba8NJ6, который заканчивается без каких-либо внутренних ошибок (просто не отправляются электронные письма), если я удалю Mailer.news_added(@news).deliver с контроллера. Как бы то ни было, я получаю эту ошибку undefined method `ascii_only?' - person WooDzu; 29.01.2013
comment
Боюсь, я не в своей лиге по этой ошибке. Почему бы не написать новый, более целенаправленный вопрос? - person Geoff; 29.01.2013