apsmir / custom_field_sql

redmine sql custom field
14 stars 8 forks source link

%issue_id% parameter for sql #13

Open sgiordy opened 2 years ago

sgiordy commented 2 years ago

Hello,

thank you for your great work.

Consider adding this code in sql.rb in formatsdirectory:

              if object.issue_id.nil?
                sql = sql.gsub('%issue_id%', 'null')
              else
                sql = sql.gsub('%issue_id%', object.issue_id.to_s)
              end

It's very useful to fill dropdown with specific values in Time Tracking Entries.

S.

Seahawk240 commented 1 year ago

Yeah very nice addition! I just noticed though that when i use it and add a new sql custom_field to issues I get an error because the issue object does not have an issue_id => only an id. To fix this i did this:

if object.try(:issue_id).nil? sql = sql.gsub('%issue_id%', 'null') else sql = sql.gsub('%issue_id%', object.issue_id.to_s) end

Complete File: module CustomFieldSql module CustomFields module Formats

  class SqlSearch < Redmine::FieldFormat::StringFormat
    add 'sql_search'
    field_attributes :sql, :form_params, :search_by_click, :db_config, :strict_selection, :strict_error_message
    self.form_partial = 'custom_fields/formats/sql'
  end

  class Sql < Redmine::FieldFormat::List
    add 'sql'
    field_attributes :sql
    self.form_partial = 'custom_fields/formats/sql'

    def possible_values_options(custom_field, object = nil)
      sql = custom_field.sql
      if sql
        if object
          return [] unless (object.class.to_s + 'CustomField')==custom_field.class.to_s
          if object.id.nil?
            sql = sql.gsub('%id%', 'null')
          else
            sql = sql.gsub('%id%', object.id.to_s)
          end
          if object.try(:issue_id).nil?
              sql = sql.gsub('%issue_id%', 'null')
          else
              sql = sql.gsub('%issue_id%', object.issue_id.to_s)
          end
        end
        result = ActiveRecord::Base.connection.select_all(sql)
        result.rows
      else
        []
      end
    end

    def group_statement(custom_field)
      order_statement(custom_field)
    end

    def validate_custom_field(custom_field)
      errors = []
      #errors << [:language, :blank] if custom_field.language.blank?
      errors
    end
  end

end

end end