Merge branches 'classroom_secondary_directory' and 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into classroom_secondary_directory

PCqiandao
杨树明 5 years ago
commit cb5726e9ec

@ -0,0 +1,39 @@
class AttendancesController < ApplicationController
before_action :require_login
before_action :find_course, only: [:index, :student_attendances, :history_attendances]
before_action :find_attendance, except: [:index, :student_attendances, :history_attendances]
before_action :user_course_identity
def index
current_date = Date.current
current_end_time = Time.current.strftime("%H:%M:%S")
if params[:history]
@attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
(attendance_date = '#{current_date}' and end_time < '#{current_end_time}')")
else
@attendances = @course.course_attendances.where("attendance_date > '#{current_date}' or
(attendance_date = '#{current_date}' and end_time > '#{current_end_time}')")
end
@attendances_count = @attendances.size
@attendances = @attendances.order("attendance_date desc, start_time desc")
@attendances = paginate @attendances.includes(:user, :course_member_attendances)
end
def history_attendances
current_date = Date.current
current_end_time = Time.current.strftime("%H:%M:%S")
@history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
(attendance_date = '#{current_date}' and end_time < '#{current_end_time}')").order("id desc")
@all_history_count = @history_attendances.size
@history_attendances = paginate @history_attendances.includes(:course_member_attendances)
end
private
def find_attendance
@attendance = CourseAttendance.find params[:id]
@course = @attendance.course
end
end

@ -94,7 +94,9 @@ class Weapps::AttendancesController < ApplicationController
@absence_count = @attendance.absence_count
@all_count = @attendance.course_member_attendances.size
@_is_current_attendance = @attendance.current_attendance?
a_end_time = "#{@attendance.attendance_date} #{@attendance.end_time}".to_time
@_is_current_attendance = Time.current < a_end_time
if @attendance.course_attendance_groups.first&.course_group_id.to_i == 0
@group_ids = @course.course_groups.pluck(:id) + [0]

@ -38,9 +38,9 @@ class CreateWatchVideoService < ApplicationService
end
else
# 开始播放时记录一次
if params[:course_id].present?
if params[:course_video_id].present?
# 课堂视频
course_video = CourseVideo.find_by(params[:course_video_id])
course_video = CourseVideo.find(params[:course_video_id])
watch_course_video = WatchCourseVideo.find_or_initialize_by(course_video_id: course_video.id, user_id: user.id) do |d|
d.start_at = current_time
d.duration = params[:duration]

@ -0,0 +1,18 @@
json.attendances @attendances do |attendance|
json.(attendance, :id, :name, :normal_count, :all_count, :mode)
json.author do
user = attendance.user
json.user_name user.real_name
json.user_login user.login
end
json.attendance_date attendance.attendance_date.strftime("%Y-%m-%d")
json.start_time attendance.start_time.strftime("%H:%M")
json.end_time attendance.end_time.strftime("%H:%M")
json.edit_auth @user_course_identity < Course::PROFESSOR || attendance.user_id == User.current.id
if @user_course_identity < Course::PROFESSOR == Course::STUDENT
json.attendance_status student_attendance_status(attendance, User.current)
end
end
json.attendances_count @attendances_count

@ -550,6 +550,10 @@ Rails.application.routes.draw do
end
end
resources :attendances, shallow: true do
end
resources :polls, only:[:index,:new,:create] do
collection do
post :publish # 立即发布

@ -0,0 +1,28 @@
#coding=utf-8
desc "合并高校的数据,第一个参数是: 正确高校的id, 第二个参数是: 错误高校需要合并到正确高校的id"
# 命令: bundle exec rake schools:merge_school_data f_school=1 s_school=2,3
namespace :schools do
task merge_school_data: :environment do
f_school = ENV['f_school'].to_i
school = School.find_by(id: f_school)
return if school.blank?
s_school = ENV['s_school'].split(",")
merge_schools = School.where(id: s_school)
# 改变用户的学校id 和 单位
UserExtension.where(school_id: merge_schools)
.update_all(school_id: f_school, department_id: nil)
# 改变课堂的学校id
Course.where(school_id: merge_schools).update_all(school_id: f_school)
# 实训报告表迁移数据
s_report = SchoolReport.find_by(school_id: f_school)
SchoolReport.where(school_id: merge_schools).each do |sr|
s_report.update_column(:shixun_evaluate_count, (s_report.shixun_evaluate_count+sr.shixun_evaluate_count))
sr.update(shixun_evaluate_count: 0)
end
end
end

@ -34,6 +34,9 @@ render() {
}
.color848282{
color:#848282;
}
.task-btn{
color: #fff !important;
}
`
}
@ -50,7 +53,7 @@ render() {
</div>
:
<div className="clearfix mt30 edu-txt-center">
<a className="task-btn mr30" onClick={this.props.modalCancel}>取消</a>
<a className="task-btn mr30" onClick={this.props.modalCancel}>{this.props.cancelText || '取消'}</a>
<a className="task-btn task-btn-orange" onClick={this.props.modalSave}>{this.props.okText || '确定'}</a>
</div>
}

@ -32,7 +32,10 @@ class DetailTop extends Component{
getappointmenttype:false,
openpathss:false,
cancel_publics:false,
cancel_has_publics:false
cancel_has_publics:false,
applyissuePaths:false,
cancelText:undefined,
okText:undefined
}
}
componentDidMount(){
@ -110,21 +113,27 @@ class DetailTop extends Component{
applyissuePath=()=>{
this.setState({
loadtype:true,
Modalstype: true,
Modalstopval:` 课程需经过平台审核方可公开使用,公开的课程将对平台所`,
modalsMidval:"有人公开可见,若仅本人教学使用则无需申请公开,直接发",
Modalsbottomval:"送到课堂即可。",
applyissuePaths:true
})
}
showapplyissuePath=()=>{
let pathid=this.props.match.params.pathId;
let url ="/paths/"+pathid+"/publish.json";
axios.post(url).then((result)=>{
if(result.status===200){
if(result.data.status===0){
this.setState({
loadtype:true,
Modalstype: true,
Modalstopval: ` 课程需经过平台审核方可公开使用,公开的课程将对平台所`,
modalsMidval:"有人公开可见。若仅本人教学使用则无需申请公开, 直接发",
Modalsbottomval:"送到课堂即可.",
cardsModalsavetype: true,
})
this.props.showNotification(result.data.message)
this.props.getlistdatas();
this.cardsModalcancel()
}else if(result.data.status===1){
// window.location.reload();
}
@ -132,9 +141,7 @@ class DetailTop extends Component{
}).catch((error)=>{
console.log(error);
})
}
}
postcancelissuePath=()=>{
let pathId=this.props.match.params.pathId;
let url ="/paths/"+pathId+"/cancel_publish.json";
@ -180,12 +187,15 @@ class DetailTop extends Component{
modalsMidval:'',
modalstyles:'',
cardsModalsavetype:false,
applyissuePath:false,
applyissuePaths:false,
openpathss:false,
cancel_publics:false,
cancel_has_publics:false,
Modalstopval:``,
cancelText:undefined,
okText:undefined
})
}
cardsModalsave=()=>{
@ -369,13 +379,13 @@ class DetailTop extends Component{
openpaths=()=>{
this.setState({
loadtype:true,
Modalstype: true,
openpathss:true,
Modalstopval: "公开申请已提交,请等待管理员的审核",
modalsMidval:"• 我们将在1-2个工作日内完成审核",
Loadtype:true,
modalstyles:"848282"
Modalstopval: "公开课程需经过平台标准化审核审核周期为1-2天公开",
modalsMidval:"的课程将对平台所有人可见。若仅本人教学使用则无需",
Modalsbottomval:"申请公开,直接发送到课堂即可",
cancelText:"取消申请",
okText:"确定申请"
})
}
@ -433,7 +443,7 @@ class DetailTop extends Component{
render(){
let{detailInfoList}=this.props;
let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype,openpathss,cancel_publics,cancel_has_publics}=this.state;
let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype,openpathss,cancel_publics,cancel_has_publics,applyissuePaths}=this.state;
const radioStyle = {
display: 'block',
height: '30px',
@ -470,8 +480,10 @@ class DetailTop extends Component{
modalsTopval={Modalstopval}
modalsBottomval={Modalsbottomval}
modalCancel={cardsModalcancel}
modalSave={loadtype===true&&openpathss===false?()=>this.cardsModalcancel():cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()}
modalSave={applyissuePaths===true?()=>this.showapplyissuePath():loadtype===true&&openpathss===false?()=>this.cardsModalcancel():cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()}
loadtype={loadtype}
cancelText={this.state.cancelText}
okText={this.state.okText}
modalsMidval={this.state.modalsMidval}
modalstyles={this.state.modalstyles}
>
@ -605,8 +617,8 @@ class DetailTop extends Component{
{
detailInfoList.publish_status===0&&detailInfoList.allow_add_member===true?
<a className="fr font-18 color-white kaike mr20 kkbths"
style={{'width':'65px'}}
onClick={this.applyissuePath}>发布</a>:""
style={{'width':'95px'}}
onClick={this.applyissuePath}>申请发布</a>:""
}

@ -60,7 +60,8 @@ class TPMBanner extends Component {
openshowpublictype:false,
Radiovalue:1,
TextAreaintshow:false,
cancelText:undefined,
okText:undefined,
}
}
@ -434,6 +435,9 @@ class TPMBanner extends Component {
modalsMidval:undefined,
ModalsBottomval:"",
modalstyles:"",
cancelText:undefined,
okText:undefined,
Loadtype:false,
})
}
ModalSave = () => {
@ -441,7 +445,10 @@ class TPMBanner extends Component {
let url = "/shixuns/" + id + "/cancel_publish.json";
axios.get(url).then((response) => {
this.props.showSnackbar(response.data.message);
window.location.reload()
// window.location.reload()
this.ModalCancel()
this.props.getcomponentdidmount()
}).catch((error) => {
console.log(error)
});
@ -461,16 +468,21 @@ class TPMBanner extends Component {
ModalSaveopenpublic= () => {
this.setState({
Modalstype: true,
Modalstopval: "公开申请已提交,请等待管理员的审核",
modalsMidval:"• 我们将在1-2个工作日内完成审核",
ModalCancel: this.eopenpublicupdatadata,
Modalstopval:"公开实训需经过平台标准化审核审核周期为1-2天",
modalsMidval:"公开的实训将对平台所有人可见。若仅本人教学使用",
ModalsBottomval:"则无需申请公开, 直接发送到课堂即可。",
cancelText:"取消申请",
okText:"确定申请",
ModalCancel: this.ModalCancel,
ModalSave: this.eopenpublicupdatadata,
Loadtype:true,
modalstyles:"848282"
// Loadtype:true,
// modalstyles:"848282"
})
}
eopenpublicupdatadata=()=>{
window.location.reload()
// window.location.reload()
this.ModalCancel()
this.props.getcomponentdidmount()
}
openpublic=()=>{
let id = this.props.match.params.shixunId;
@ -490,7 +502,9 @@ class TPMBanner extends Component {
let url = `/shixuns/${id}/cancel_apply_public.json`;
axios.get(url).then((response) => {
if(response.data.status===0){
window.location.reload()
// window.location.reload()
this.ModalCancel()
this.props.getcomponentdidmount()
}
}).catch((error) => {
console.log(error)
@ -522,7 +536,10 @@ class TPMBanner extends Component {
evaluation_set_position = response.data.evaluation_set_position
}
if(response.data.status===0){
window.location.reload()
// window.location.reload()
this.applyreleaseopen()
// this.ModalCancel()
this.props.getcomponentdidmount()
}else{
this.setState({
Issuevisible: true,
@ -536,13 +553,23 @@ class TPMBanner extends Component {
console.log(error)
});
};
applyreleaseopen = () => {
this.setState({
Modalstype: true,
Loadtype:true,
Modalstopval: "实训发布后即可发送课堂使用",
ModalSave: this.ModalCancel,
})
}
hiddenIssuevisible = (val) => {
this.setState({
Issuevisible: false
})
if (val === 0 || val === 1) {
window.location.reload()
// window.location.reload()
this.ModalCancel()
this.props.getcomponentdidmount()
}
}
@ -803,7 +830,9 @@ class TPMBanner extends Component {
hidestartshixunsreplacevalue,
Forkvisibletype,
AccountProfiletype,
isIE
isIE,
cancelText,
okText,
} = this.state;
let {shixunsDetails, shixunId, star_info, star_infos} = this.props;
let challengeBtnTipText = '';
@ -900,6 +929,8 @@ class TPMBanner extends Component {
modalsMidval={this.state.modalsMidval}
loadtype={this.state.Loadtype}
modalstyles={this.state.modalstyles}
cancelText={this.state.cancelText}
okText={this.state.okText}
/> : ""}
<div className="educontent clearfix">

@ -412,6 +412,7 @@ class TPMIndex extends Component {
{...this.props}
{...this.state}
is_jupyter={this.state. is_jupyter}
getcomponentdidmount={()=>this.getcomponentdidmount()}
></TPMBanner>
}

Loading…
Cancel
Save