# encoding: utf-8 module ApiHelper ONE_MINUTE = 60 * 1000 ONE_HOUR = 60 * ONE_MINUTE ONE_DAY = 24 * ONE_HOUR ONE_MONTH = 30 * ONE_DAY ONE_YEAR = 12 * ONE_MONTH #获取用户的工作单位 def get_user_work_unit user work_unit = "" if user.user_extensions.identity == 0 || user.user_extensions.identity == 1 work_unit = user.user_extensions.school.name unless user.user_extensions.school.nil? elsif user.user_extensions.identity == 3 work_unit = user.user_extensions.occupation elsif user.user_extensions.identity == 2 work_unit = user.firstname end work_unit end #获取用户地区 def get_user_location user location = "" location << (user.user_extensions.location || '') location << (user.user_extensions.location_city || '') location end def get_user_realname user name = user.lastname + user.firstname name.empty? || name.nil? || name == " " ? user.login : name end def get_assigned_homeworks(homeworks, n, index) homeworks += homeworks homeworks[index + 1 .. index + n] end def stars_to_json_like starts,show_jour,homework,show_name result = [] starts.each do |s| comment = get_homework_review homework,show_jour,s.rater rater_name = show_name ? s.rater.login : l(:label_anonymous) rater_id = show_name ? s.rater.id : '' result << {:rater_id =>rater_id ,:rater_name => rater_name,:created_at => format_time(s.created_at),:stars => s.stars,:comment => comment} end result end ######################################################### #sw #获取课程未匿评数量 #param: user => "用户", course_id => "查询的课程ID" #return: 作业的数量 ######################################################### def get_course_anonymous_evaluation user,course count = 0 if course is_teacher = is_course_teacher user,course if is_teacher #如果是老师,显示学生提交的作业数 course.homeworks.each do |bid| count += bid.homeworks.count end else #如果是学生,显示未匿评的数量 course.homeworks.each do |bid| count += get_student_not_batch_homework_list bid,user end end end [count,is_teacher] end def get_user_language user (user.language.nil? || user.language == "") ? 'zh':user.language end # 学生获取课程作业的状态 def get_homework_status homework homework_status = "" if homework if homework.homework_type == 1 && homework.homework_detail_manual case homework.homework_detail_manual.comment_status when 1 homework_status = show_homework_deadline homework when 2 homework_status = "正在匿评" when 3 homework_status = "匿评结束" end elsif homework.homework_type == 0 homework_status = "未启用匿评" elsif homework.homework_type == 2 homework_status = "编程作业" else end end homework_status end #获取作业的是否可以匿评的描述 def homework_status_desc homework if homework.homework_type == 1 && homework.homework_detail_manual #匿评作业 if homework.end_time >= Time.now link = show_homework_deadline homework elsif homework.student_works.count >= 2 #作业份数大于2 case homework.homework_detail_manual.comment_status when 1 link = '启动匿评' when 2 link = '关闭匿评' when 3 link = " 匿评结束" end else link = "提交作业数过少" end else link = "未开启匿评作业" end link end #获取 def get_submit_sutdent_list homework studentlist = [] if homework.is_a?(Hash) && homework.key?(:studentlist) studentlist = homework[:studentlist] else homework.student_works.order("created_at desc").page(1).per(6).each do |work| studentlist << work.user end end studentlist end def get_homework_state(bid) state = nil if !bid.nil? if bid.homework_type == 1 && bid.homework_detail_manual case bid.homework_detail_manual.comment_status when 1 state = show_homework_deadline bid when 2 state = "正在匿评中" when 3 state = "匿评已结束" end elsif bid.homework_type == 0 state = "未启用匿评" elsif bid.homework_type == 2 state = "编程作业" else end end state end #计算作业的截止日期,剩余日期 def show_homework_deadline homework day = 0 if (day = (Date.parse(homework.end_time.to_s) - Date.parse(Time.now.to_s)).to_i) > 0 "距作业截止还有" << day.to_s << "天" else "已截止,但可补交" end end #获取作业中学生的匿评比率 # 匿评比率 = 学生总共评价的作业的作业份数 / 作业份数 * 分配数 * 100% # 教辅匿评比率 = 教辅已经评价的作业份数 / 总的作业份数 * 100% def get_evaluation_part homework,role homework_eva_completed_task_num = 0 homework_eva_task_num = 0 #匿评作业 # 且匿评状态不是还没有开启匿评 if homework.homework_type == 1 && homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 # 总共需要评价的任务数 homework_eva_task_num = homework.homework_detail_manual.evaluation_num * homework.student_works.count unless homework_eva_task_num == 0 #总任务数不为0 的情况下 #获取已经评价了多少的份作业 student_work_score里记录了评价情况,每条记录有提交作业的id #先求出提交作业的id集合 work_ids = "(" + homework.student_works.map(&:id).join(",") + ")" #只要 student_work_score 中的 student_work_id在work_ids集合中,那么久说明这个任务被完成了 sql = "select count(1) from student_works_scores where reviewer_role = #{role} and student_work_id in #{work_ids} " homework_eva_completed_task_num = ActiveRecord::Base.connection().select_value(sql) end end if homework_eva_task_num == 0 0 else ( homework_eva_completed_task_num / homework_eva_task_num.to_f * 100 ) .round(1) end end # 获取当前时间 def time_from_now time lastUpdateTime = time.to_i*1000 currentTime = Time.now.to_i*1000 timePassed = currentTime - lastUpdateTime; timeIntoFormat = 0 updateAtValue = "" if timePassed < 0 updateAtValue = "刚刚" elsif timePassed < ONE_MINUTE updateAtValue = "1分钟前" elsif timePassed < ONE_HOUR timeIntoFormat = timePassed / ONE_MINUTE updateAtValue = timeIntoFormat.to_s + "分钟前" elsif (timePassed < ONE_DAY) timeIntoFormat = timePassed / ONE_HOUR updateAtValue = timeIntoFormat.to_s + "小时前" elsif (timePassed < ONE_MONTH) timeIntoFormat = timePassed / ONE_DAY updateAtValue = timeIntoFormat.to_s + "天前" elsif (timePassed < ONE_YEAR) timeIntoFormat = timePassed / ONE_MONTH updateAtValue = timeIntoFormat.to_s + "个月前" else timeIntoFormat = timePassed / ONE_YEAR updateAtValue = timeIntoFormat.to_s + "年前" end updateAtValue end # 获取当前时间 def time_from_future time lastUpdateTime = time.to_i*1000 currentTime = Time.now.to_i*1000 timePassed = lastUpdateTime - currentTime; timeIntoFormat = 0 updateAtValue = "" if timePassed < 0 updateAtValue = "马上" elsif timePassed < ONE_MINUTE updateAtValue = "1分钟" elsif timePassed < ONE_HOUR timeIntoFormat = timePassed / ONE_MINUTE updateAtValue = timeIntoFormat.to_s + "分钟" elsif (timePassed < ONE_DAY) timeIntoFormat = timePassed / ONE_HOUR updateAtValue = timeIntoFormat.to_s + "小时" elsif (timePassed < ONE_MONTH) timeIntoFormat = timePassed / ONE_DAY updateAtValue = timeIntoFormat.to_s + "天" elsif (timePassed < ONE_YEAR) timeIntoFormat = timePassed / ONE_MONTH updateAtValue = timeIntoFormat.to_s + "个月" else timeIntoFormat = timePassed / ONE_YEAR updateAtValue = timeIntoFormat.to_s + "年" end updateAtValue end # 计算到结束还有多长时间 **天**小时**分 def how_much_time time result = "" result = ((time - Time.now.to_i).to_i / (24*60*60)).to_s + " 天 " result += (((time - Time.now.to_i).to_i % (24*60*60)) / (60*60)).to_s + " 小时 " result += ((((time - Time.now.to_i).to_i % (24*60*60)) % (60*60)) / 60).to_s + " 分 " end # 计算到结束还有多少天 def how_much_day time result = "" result = (time - Time.now.to_i).to_i < 0 ? "0天" : ((time - Time.now.to_i).to_i / (24*60*60.0)).ceil.to_s + " 天 " end #日期转换为时间 def convert_to_time date, num if num == 0 date = date.to_s + " 00:00" elsif num == 1 date = date.to_s + " 23:59" end return date end #获取用户 def get_user user_id user = User.find user_id user end #获取项目 def get_project project_id project = Project.find project_id project end #获取课程 def get_course course_id course = Course.find course_id course end #获取点赞数 def get_activity_praise_num(object) obj_type = object.class obj_id = object.id record = PraiseTreadCache.find_by_object_id_and_object_type(obj_id,obj_type) if record return ((record.praise_num.nil? ? 0 : record.praise_num.to_i)-(record.tread_num.nil? ? 0 : record.tread_num.to_i)) else return 0 end end #获取缺陷的优先级 def get_issue_priority_api value issuetype = "" if value == 4 issuetype = "紧急" elsif value == 2 issuetype = "正常" elsif value == 3 issuetype = "高" elsif value == 1 issuetype = "低" else issuetype = "立刻" end end def jdetails_to_strings(details, no_html=false, options={}) options[:only_path] = (options[:only_path] == false ? false : true) options[:token] = options[:token] if options[:token] strings = [] values_by_field = {} details.each do |detail| if detail.property == 'cf' field_id = detail.prop_key field = CustomField.find_by_id(field_id) if field && field.multiple? values_by_field[field_id] ||= {:added => [], :deleted => []} if detail.old_value values_by_field[field_id][:deleted] << detail.old_value end if detail.value values_by_field[field_id][:added] << detail.value end next end end strings << jshow_detail(detail, no_html, options) end values_by_field.each do |field_id, changes| detail = JournalDetail.new(:property => 'cf', :prop_key => field_id) if changes[:added].any? detail.value = changes[:added] strings << jshow_detail(detail, no_html, options) elsif changes[:deleted].any? detail.old_value = changes[:deleted] strings << jshow_detail(detail, no_html, options) end end strings end # Returns the textual representation of a single journal detail def jshow_detail(detail, no_html=false, options={}) multiple = false case detail.property when 'attr' field = detail.prop_key.to_s.gsub(/\_id$/, "") label = l(("field_" + field).to_sym) case detail.prop_key when 'due_date', 'start_date' value = format_date(detail.value.to_date) if detail.value old_value = format_date(detail.old_value.to_date) if detail.old_value when 'project_id', 'status_id', 'tracker_id', 'assigned_to_id', 'priority_id', 'category_id', 'fixed_version_id' value = find_name_by_reflection(field, detail.value) old_value = find_name_by_reflection(field, detail.old_value) when 'estimated_hours' value = "%0.02f" % detail.value.to_f unless detail.value.blank? old_value = "%0.02f" % detail.old_value.to_f unless detail.old_value.blank? when 'parent_id' label = l(:field_parent_issue) value = "##{detail.value}" unless detail.value.blank? old_value = "##{detail.old_value}" unless detail.old_value.blank? when 'is_private' value = l(detail.value == "0" ? :general_text_No : :general_text_Yes) unless detail.value.blank? old_value = l(detail.old_value == "0" ? :general_text_No : :general_text_Yes) unless detail.old_value.blank? end when 'cf' custom_field = CustomField.find_by_id(detail.prop_key) if custom_field multiple = custom_field.multiple? label = custom_field.name value = format_value(detail.value, custom_field.field_format) if detail.value old_value = format_value(detail.old_value, custom_field.field_format) if detail.old_value end when 'attachment' label = l(:label_attachment) end call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value }) label ||= detail.prop_key value ||= detail.value old_value ||= detail.old_value unless no_html label = content_tag('strong', label) old_value = content_tag("i", old_value) if detail.old_value old_value = content_tag("del", old_value) if detail.old_value and detail.value.blank? if detail.property == 'attachment' && !value.blank? && atta = Attachment.find_by_id(detail.prop_key) # Link to the attachment if it has not been removed if options[:token].nil? value = atta.filename else value = atta.filename end # 放大镜搜索功能 # if options[:only_path] != false && atta.is_text? # value += link_to( # image_tag('magnifier.png'), # :controller => 'attachments', :action => 'show', # :id => atta, :filename => atta.filename # ) # end else value = content_tag("i", value) if value end end # 缺陷更新结果在消息中显示样式 if no_html == "message" label = content_tag(:span, label, :class => "issue_update_message") old_value = content_tag("span", old_value) if detail.old_value old_value = content_tag("del", old_value) if detail.old_value and detail.value.blank? if detail.property == 'attachment' && !value.blank? && atta = Attachment.find_by_id(detail.prop_key) # Link to the attachment if it has not been removed if options[:token].nil? value = atta.filename else value = atta.filename end else value = content_tag(:span, value, :class => "issue_update_message_value") if value end end if detail.property == 'attr' && detail.prop_key == 'description' s = l(:text_journal_changed_no_detail, :label => label) unless no_html diff_link = link_to l(:label_diff), {:controller => 'journals', :action => 'diff', :id => detail.journal_id, :detail_id => detail.id, :only_path => options[:only_path]}, :title => l(:label_view_diff) s << " (#{ diff_link })" end s.html_safe elsif detail.value.present? case detail.property when 'attr', 'cf' if detail.old_value.present? l(:text_journal_changed, :label => label, :old => old_value, :new => value).html_safe elsif multiple l(:text_journal_added, :label => label, :value => value).html_safe else l(:text_journal_set_to, :label => label, :value => value).html_safe end when 'attachment' l(:text_journal_added, :label => label, :value => value).html_safe end else l(:text_journal_deleted, :label => label, :old => old_value).html_safe end end #课程动态的更新 def update_course_activity_api type, id course_activity = CourseActivity.where("course_act_type=? and course_act_id =?", type.to_s, id.to_i).first if course_activity course_activity.updated_at = Time.now course_activity.save end end #首页动态更新 def update_user_activity_api type, id user_activity = UserActivity.where("act_type=? and act_id =?", type.to_s, id.to_i).first if user_activity user_activity.updated_at = Time.now user_activity.save end end #项目动态更新 def update_forge_activity_api type, id forge_activity = ForgeActivity.where("forge_act_type=? and forge_act_id=?", type.to_s, id.to_i).first if forge_activity forge_activity.updated_at = Time.now forge_activity.save end end #组织动态更新 def update_org_activity_api type , id org_activity = OrgActivity.where("org_act_type=? and org_act_id =?", type.to_s, id.to_i).first if org_activity org_activity.updated_at = Time.now org_activity.save end end #个人动态更新 def update_principal_activity_api type, id principal_activity = PrincipalActivity.where("principal_act_type=? and principal_act_id =?", type.to_s, id.to_i).first if principal_activity principal_activity.updated_at = Time.now principal_activity.save end end #赞/取消赞 def praise_or_cancel(type,id,user,flag) unless id.nil? and type.nil? #首先创建或更新praise_tread 表 pt = PraiseTread.new pt.user_id = user.id pt.praise_tread_object_id = id.to_i pt.praise_tread_object_type = type pt.praise_or_tread = flag pt.save # end #再创建或更新praise_tread_cache表 #@ptc = PraiseTreadCache.find_by_object_id_and_object_type(id,type) ptc = PraiseTreadCache.where("object_id = ? and object_type = ?",id.to_i,type).first ptc = ptc.nil? ? PraiseTreadCache.new : ptc ptc.object_id = id.to_i ptc.object_type = type ptc.save ptc.praise_plus(flag,1) end end def praise_plus(flag,num) case flag when 1 self.update_attribute(:praise_num, self.praise_num.to_i + num) end end def praise_minus(num) self.update_attribute(:praise_num, self.praise_num.to_i - num) end class Errors def self.define_error(arr) @errors = {} arr.each_with_index { |item, index| if index %2 == 1 @errors[arr[index-1]] = item end } if arr.count % 2== 1 @default_error = arr.last else @default_error = "未知错误" end end def self.message(msg_id) @errors[msg_id] || @default_error end end end