Skip to content
Snippets Groups Projects
Commit c54a213d authored by Anton Bagliy's avatar Anton Bagliy
Browse files

Merge branch 'issue487_inactive_disciplines' into develop

parents 0d07033b ede0b6a3
Branches
No related merge requests found
ALTER TABLE disciplines
ADD COLUMN isinactive bool;
ALTER TABLE disciplines
ALTER COLUMN isinactive set default FALSE;
UPDATE disciplines SET isinactive = FALSE;
CREATE OR REPLACE FUNCTION public.discipline_setinactive(pdisciplineid integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
BEGIN
UPDATE disciplines SET isinactive=TRUE
WHERE disciplines.id = pdisciplineid;
RETURN 0;
EXCEPTION
when others
then RETURN -1;
end
$function$;
CREATE OR REPLACE FUNCTION public.discipline_setactive(pdisciplineid integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
BEGIN
UPDATE disciplines SET isinactive=FALSE
WHERE disciplines.id = pdisciplineid;
RETURN 0;
EXCEPTION
when others
then RETURN -1;
end
$function$;
drop view if exists public.view_disciplines_stat;
DROP FUNCTION IF EXISTS public.disciplinecollection_get(psemesterid integer, pfacultyid integer);
CREATE OR REPLACE FUNCTION public.disciplinecollection_get(psemesterid integer, pfacultyid integer)
RETURNS TABLE("ID" integer, "SubjectName" character varying, "AuthorID" integer, "State" text, "IsInactive" bool)
LANGUAGE plpgsql
AS $function$
-- select public.discipline_getwithfullness(
-- :psemesterid, -- put the psemesterid parameter value instead of 'psemesterid' (int4)
-- :pfacultyid -- put the pfacultyid parameter value instead of 'pfacultyid' (int4)
-- );
BEGIN
return query
SELECT view_disciplines.DisciplineID AS ID,
view_disciplines.SubjectName As SubjectName,
view_disciplines.AuthorID As AuthorID,
CASE
WHEN (view_disciplines.MaxRate < 100 AND view_disciplines.IsLocked = 0) THEN 'no_map'
WHEN (view_disciplines.MaxRate = 100 AND view_disciplines.IsLocked = 0) THEN 'no_rates'
WHEN (view_disciplines.MaxRate = 100 AND view_disciplines.IsLocked = 1) THEN 'in_progress'
ELSE 'other'
END AS State,
disciplines.IsInactive as IsInactive
FROM view_disciplines
JOIN disciplines ON view_disciplines.disciplineid = disciplines.id
WHERE view_disciplines.SemesterID = pSemesterID AND
view_disciplines.FacultyID = pFacultyID;
END
$function$;
CREATE OR REPLACE VIEW public.view_disciplines_stat
AS SELECT ff.name,
( SELECT count(*) AS count
FROM disciplinecollection_get(11, ff.id) disciplinecollection_get("ID", "SubjectName", "AuthorID", "State")) AS "Всего дисциплин",
( SELECT count(*) AS count
FROM disciplinecollection_get(11, ff.id) t("ID", "SubjectName", "AuthorID", "State", "IsInactive")
WHERE t."State" = 'no_map'::text AND t."IsInactive" = false) AS "Без УКД"
FROM faculties ff;
DROP VIEW IF EXISTS public.view_disciplines;
CREATE OR REPLACE VIEW public.view_disciplines
AS SELECT disciplines.id AS disciplineid,
disciplines.authorid,
disciplines.examtype,
disciplines.lecturecount,
disciplines.practicecount,
disciplines.labcount,
disciplines.semesterid,
disciplines.islocked,
disciplines.milestone,
disciplines.subtype,
disciplines.compounddiscid,
disciplines.maxrate,
disciplines.currate,
disciplines.isinactive,
grades.id AS gradeid,
grades.num AS gradenum,
grades.degree,
subjects.id AS subjectid,
subjects.name AS subjectname,
subjects.abbr AS subjectabbr,
faculties.id AS facultyid,
faculties.name AS facultyname,
faculties.abbr AS facultyabbr,
compound_disciplines.name AS compounddiscname
FROM disciplines
JOIN subjects ON subjects.id = disciplines.subjectid
JOIN faculties ON faculties.id = disciplines.facultyid
LEFT JOIN grades ON grades.id = disciplines.gradeid
LEFT JOIN compound_disciplines ON compound_disciplines.id = disciplines.compounddiscid;
DROP FUNCTION IF EXISTS public.discipline_getinfo(pdisciplineid integer);
CREATE OR REPLACE FUNCTION public.discipline_getinfo(pdisciplineid integer)
RETURNS TABLE("ID" integer, "AuthorID" integer, "GradeID" integer, "GradeNum" integer, "Degree" bachelor_master_specialist, "Type" exam_credit_grading_credit, "Lectures" integer, "Practice" integer, "Labs" integer, "SemesterID" integer, "SubjectID" integer, "SubjectName" character varying, "SubjectAbbr" character varying, "FacultyID" integer, "FacultyName" character varying, "IsLocked" integer, "Milestone" integer, "Subtype" scientific_disciplinary_coursework, "CompoundDiscID" integer, "IsMapCreated" boolean, "IsBonus" boolean, "semesterNum" integer, "semesterYear" integer, "IsInactive" bool)
LANGUAGE plpgsql
AS $function$
DECLARE vIsBonus BOOLEAN;
begin
-- select * from public.discipline_getinfo(
-- :pdisciplineid -- put the pdisciplineid parameter value instead of 'pdisciplineid' (int4)
--);
vIsBonus := EXISTS(
SELECT * FROM modules
WHERE modules.DisciplineID = pDisciplineID AND
modules.Type = 'bonus'
LIMIT 1
);
return query
SELECT
view_disciplines.DisciplineID AS "ID",
view_disciplines.AuthorID as "AuthorID",
view_disciplines.GradeID as "GradeID",
view_disciplines.GradeNum as "GradeNum",
view_disciplines."degree" as "Degree",
view_disciplines.ExamType AS "Type",
view_disciplines.LectureCount AS "Lectures",
view_disciplines.PracticeCount AS "Practice",
view_disciplines.LabCount AS "Labs",
view_disciplines.SemesterID as "SemesterID",
view_disciplines.SubjectID as "SubjectID",
view_disciplines.SubjectName as "SubjectName",
view_disciplines.SubjectAbbr as "SubjectAbbr",
view_disciplines.FacultyID as "FacultyID",
view_disciplines.FacultyName as "FacultyName",
view_disciplines.IsLocked as "IsLocked",
view_disciplines.Milestone as "Milestone",
view_disciplines.Subtype as "Subtype",
view_disciplines.CompoundDiscID as "CompoundDiscID",
(view_disciplines.MaxRate = 100) AS "IsMapCreated",
vIsBonus AS "IsBonus",
semesters.Num AS "semesterNum", -- TODO: Camelize
semesters.Year AS "semesterYear",
view_disciplines.IsInactive as "IsInactive"
FROM view_disciplines
INNER JOIN semesters ON semesters.ID = view_disciplines.SemesterID
WHERE view_disciplines.DisciplineID = pDisciplineID
LIMIT 1;
END ;
$function$;
CREATE OR REPLACE FUNCTION public.getdisciplinesforteacher(pteacherid integer, psemesterid integer)
RETURNS TABLE("ID" integer, "Type" exam_credit_grading_credit, "SubType" scientific_disciplinary_coursework, "GradeID" integer, "GradeNum" integer, "Degree" bachelor_master_specialist, "GroupID" integer, "GroupNum" integer, "GroupName" character varying, "SubjectID" integer, "SubjectName" character varying, "AuthorID" integer, "IsLocked" integer, "IsMapCreated" boolean)
LANGUAGE sql
AS $function$
--select public.getdisciplinesforteacher(
-- :pteacherid, -- put the pteacherid parameter value instead of 'pteacherid' (int4)
-- :psemesterid -- put the psemesterid parameter value instead of 'psemesterid' (int4)
--);
SELECT DISTINCT view_disciplines.DisciplineID AS "ID",
view_disciplines.ExamType AS "Type",
view_disciplines.Subtype as "SubType",
view_disciplines.GradeID as "GradeID",
view_disciplines.GradeNum as "GradeNum",
view_disciplines."degree" as "Degree",
view_groups.GroupID as "GroupID",
view_groups.GroupNum as "GroupNum",
view_groups.GroupName as "GroupName",
view_disciplines.SubjectID as "SubjectID",
view_disciplines.SubjectName as "SubjectName",
view_disciplines.AuthorID as "AuthorID",
view_disciplines.IsLocked AS "IsLocked", -- bodging, db schema remembered lowerCase
(view_disciplines.MaxRate = 100) AS "IsMapCreated"
FROM disciplines_teachers
INNER JOIN view_disciplines ON disciplines_teachers.DisciplineID = view_disciplines.DisciplineID
INNER JOIN semesters ON semesters.ID = view_disciplines.SemesterID
LEFT JOIN disciplines_groups ON disciplines_groups.DisciplineID = disciplines_teachers.DisciplineID
LEFT JOIN view_groups ON view_groups.GroupID = disciplines_groups.GroupID AND view_groups.Year = semesters.Year
WHERE disciplines_teachers.TeacherID = pTeacherID AND view_disciplines.SemesterID = pSemesterID AND view_disciplines.IsInactive = FALSE
ORDER BY view_disciplines.GradeID ASC,
view_disciplines.SubjectName ASC,
view_disciplines.DisciplineID ASC,
view_groups.GroupNum ASC;
$function$;
CREATE OR REPLACE FUNCTION public.student_getdisciplines(precordbookid integer, psemesterid integer)
RETURNS TABLE("ID" integer, "SubjectID" integer, "SubjectName" character varying, "Type" exam_credit_grading_credit, "Subtype" scientific_disciplinary_coursework, "LastName" character varying, "FirstName" character varying, "SecondName" character varying, "Rate" bigint, "MaxCurrentRate" bigint)
LANGUAGE plpgsql
AS $function$
DECLARE vRes INT DEFAULT -1;
begin
-- select public.student_getdisciplines(
-- :precordbookid, -- put the precordbookid parameter value instead of 'precordbookid' (int4)
-- :psemesterid -- put the psemesterid parameter value instead of 'psemesterid' (int4)
--);
DROP TABLE IF EXISTS tStudentDisciplines;
vRes = Student_GetDisciplinesTemp(pRecordBookID, pSemesterID);
return query
SELECT view_disciplines.DisciplineID AS "ID",
view_disciplines.SubjectID as "SubjectID",
view_disciplines.SubjectName as "SubjectName",
view_disciplines.ExamType AS "Type",
view_disciplines.Subtype as "Subtype",
accounts.LastName as "LastName",
accounts.FirstName as "FirstName",
accounts.SecondName as "SecondName",
( tDR.RateExam + tDR.RateMExam ) AS "Rate",
( tDR.MaxRegularRate + tDR.MaxExamRate ) AS "MaxCurrentRate"
FROM (
SELECT tRating.DisciplineID,
SUM(
iif_sql( tRating.SubmoduleIsUsed = 1 AND
tRating.ModuleType is not null and
tRating.ModuleType = 'regular',
tRating.SubmoduleRate, 0)
) AS MaxRegularRate,
MAX(
iif_sql( tRating.SubmoduleIsUsed = 1 AND
tRating.ModuleType is not null and
tRating.ModuleType = 'exam',
tRating.SubmoduleRate, 0)
) AS MaxExamRate,
SUM(
iif_sql(tRating.ModuleType is not null and
tRating.ModuleType != 'exam', tRating.Rate, 0)
) AS RateMExam,
MAX(
iif_sql(tRating.ModuleType is not null and
tRating.ModuleType = 'exam' AND
tRating.Rate IS NOT NULL, tRating.Rate, 0)
) AS RateExam
FROM (
SELECT tStudentDisciplines.DisciplineID,
vr.SubmoduleRate,
vr.ModuleType,
rt.Rate,
vr.SubmoduleIsUsed
FROM tStudentDisciplines
LEFT JOIN view_roadmap AS vr ON vr.DisciplineID = tStudentDisciplines.DisciplineID
LEFT JOIN rating_table AS rt ON rt.RecordBookID = pRecordBookID AND
rt.SubmoduleID = vr.SubmoduleID
) AS tRating
GROUP BY tRating.DisciplineID
) AS tDR
INNER JOIN view_disciplines ON view_disciplines.DisciplineID = tDR.DisciplineID
INNER JOIN teachers ON teachers.ID = view_disciplines.AuthorID
INNER JOIN accounts ON teachers.AccountID = accounts.ID
WHERE view_disciplines.IsInactive = FALSE
ORDER BY view_disciplines.ExamType ASC, view_disciplines.SubjectName ASC;
end
$function$;
CREATE OR REPLACE FUNCTION public.getdisciplinesforgroup(pgroupid integer, psemesterid integer)
RETURNS TABLE("ID" integer, "SubjectName" character varying, "Subtype" scientific_disciplinary_coursework, "Type" exam_credit_grading_credit, "CompoundDiscID" integer, "CompoundDiscName" character varying, "CurRate" integer, "MaxRate" integer)
LANGUAGE plpgsql
AS $function$
BEGIN
return query
SELECT DISTINCT view_disciplines.DisciplineID AS "ID",
view_disciplines.SubjectName as "SubjectName",
view_disciplines.Subtype as "Subtype",
view_disciplines.ExamType AS "Type",
view_disciplines.CompoundDiscID as "CompoundDiscID",
view_disciplines.CompoundDiscName as "CompoundDiscName",
view_disciplines.CurRate as "CurRate",
view_disciplines.MaxRate as "MaxRate"
FROM students_groups
LEFT JOIN view_disciplines_recordbooks ON students_groups.RecordBookID = view_disciplines_recordbooks.RecordBookID
INNER JOIN view_disciplines ON view_disciplines_recordbooks.DisciplineID = view_disciplines.DisciplineID
WHERE students_groups.GroupID = pGroupID AND
students_groups.SemesterID = pSemesterID AND
view_disciplines.SemesterID = pSemesterID AND
view_disciplines.IsInactive = False AND
students_groups.State <= 'outlet' AND
-- view_disciplines_recordbooks.Type may be attach or NULL
COALESCE(view_disciplines_recordbooks.Type, 'attach') = 'attach'
ORDER BY view_disciplines.ExamType DESC,
view_disciplines.SubjectName ASC;
end;
$function$;
......@@ -63,4 +63,34 @@ $(() => {
}
});
$('.disciplineInactiveSwitch').click(function () {
let idString = $(this).attr('id');
let disciplineID = parseInt(idString.substr(18, idString.length));
let isInactive = $(this).hasClass('disciplineInactive')
let path = 'handler/discipline/';
if (isInactive) {
path = path + 'setActive';
} else {
path = path + 'setInactive';
}
$.post(g_URLdir + path, {id: disciplineID}).done(_ => {
Popup.success('Изменения сохранены');
if (isInactive) {
$(this).removeClass('disciplineInactive');
$(this).addClass('disciplineActive');
$(this).text('включена');
} else {
$(this).removeClass('disciplineActive');
$(this).addClass('disciplineInactive');
$(this).text('выключена');
}
}).fail(_ => {
Popup.error('Произошла ошибка');
}).always(_ => {
});
});
});
\ No newline at end of file
......@@ -24,6 +24,14 @@
background-color: @ColorBaseWhite;
white-space: nowrap;
.disciplineInactive {
color: #7cc1f0;
}
.disciplineActive {
color: #1d68cd;
}
tr {
&:hover,
&.focus {
......
......@@ -146,6 +146,28 @@ class Controller_Handler_Discipline extends Controller_Handler_Api
return json_encode($code);
}
public function action_setInactive() {
$this->user->checkAccess(User::RIGHTS_TEACHER);
$id = (int)$this->request->post('id');
$discipline = Model_Discipline::load($id);
if (($discipline->AuthorID != $this->user->TeacherID) && !($this->user->isDean() || $this->user->isAdmin()))
throw new LogicException(Error::ACCESS_DENIED);
$code = $discipline->setInactive();
$code = $code.'';
return json_encode($code);
}
public function action_setActive() {
$this->user->checkAccess(User::RIGHTS_TEACHER);
$id = (int)$this->request->post('id');
$discipline = Model_Discipline::load($id);
if (($discipline->AuthorID != $this->user->TeacherID) && !($this->user->isDean() || $this->user->isAdmin()))
throw new LogicException(Error::ACCESS_DENIED);
$code = $discipline->setActive();
$code = $code.'';
return json_encode($code);
}
public function action_getSimilarDisciplines() {
$discipline = $this->loadDisciplineAndAuthorCheck();
$teacherID = (int) $this->user->TeacherID;
......@@ -192,7 +214,7 @@ class Controller_Handler_Discipline extends Controller_Handler_Api
$id = (int)$this->request->post('id');
$discipline = Model_Discipline::load($id);
if (($discipline->AuthorID != $this->user->TeacherID) && !($this->user->isDean() || $this->user->isAdmin()))
if (($discipline->IsInactive) || ($discipline->AuthorID != $this->user->TeacherID) && !($this->user->isDean() || $this->user->isAdmin()))
throw new LogicException(Error::ACCESS_DENIED);
return $discipline;
}
......
......@@ -10,6 +10,13 @@ class Controller_Handler_Map extends Controller_Handler
parent::before();
$this->user->checkAccess(User::RIGHTS_TEACHER);
}
public function checkDisciplineActive($modelDiscipline) {
if ($modelDiscipline->IsInactive) {
throw new LogicException(Error::ACCESS_DENIED);
}
}
......@@ -18,6 +25,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$failed = $map->changeDisciplineSubject($this->user->TeacherID, $_POST['SubjectID']);
......@@ -28,6 +36,7 @@ class Controller_Handler_Map extends Controller_Handler
public function action_ChangeStatusBonusModule() {
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
if ($this->post['BonusRate'] === "true") {
......@@ -46,8 +55,9 @@ class Controller_Handler_Map extends Controller_Handler
if (!Model_System::loadConfig()->Functional->DisciplineCreation)
throw HTTP_Exception::factory(404);
$failed = Model_Discipline::load($_POST['DisciplineID'])
->changeGrade($this->user->TeacherID, $_POST['GradeID']);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$failed = $discipline->changeGrade($this->user->TeacherID, $_POST['GradeID']);
$response['success'] = !$failed;
$this->response->body(json_encode($response));
......@@ -58,6 +68,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$result = $map->changeDisciplineControl($this->user->TeacherID, $_POST['Control']);
......@@ -67,6 +78,7 @@ class Controller_Handler_Map extends Controller_Handler
public function action_ChangeDisciplineHours() {
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$failed = $map->changeDisciplineHours($this->user->TeacherID, $_POST['Hours'], $_POST['Type']);
......@@ -85,7 +97,9 @@ class Controller_Handler_Map extends Controller_Handler
// Structure stuff
public function action_addModule() {
$map = Model_Map::of(Model_Discipline::load($_POST['id']));
$discipline = Model_Discipline::load($_POST['id']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$module_id = $map->addModule($this->user->TeacherID);
if ($module_id < 0) $this->fail();
......@@ -136,6 +150,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$code = $map->bindGroup($this->user->TeacherID, $_POST['GroupID']);
......@@ -149,6 +164,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$failed = $map->unbindGroup($this->user->TeacherID, $_POST['GroupID']);
......@@ -162,6 +178,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$failed = $map->bindStudent($this->user->TeacherID, $_POST['StudentID']);
......@@ -175,6 +192,7 @@ class Controller_Handler_Map extends Controller_Handler
throw HTTP_Exception::factory(404);
$discipline = Model_Discipline::load($_POST['DisciplineID']);
$this->checkDisciplineActive($discipline);
$map = Model_Map::of($discipline);
$failed = $map->unbindStudent($this->user->TeacherID, $_POST['StudentID']);
......
......@@ -31,10 +31,12 @@ class Controller_Office_Disciplines extends Controller_Environment_Office {
$teachers[$discipline['ID']] = Model_Teacher::with($discipline['AuthorID']);
}
$inMainList = $state === null;
$this->twig->set_filename(self::OFFICE . 'disciplines/index')
->set([
'Disciplines' => $disciplines,
'Teachers' => $teachers
'Teachers' => $teachers,
'InMainList' => $inMainList
]);
}
......
......@@ -294,6 +294,24 @@ class Model_Discipline extends Model_Container
return $res;
}
public function setInactive() {
$sql = 'SELECT * FROM Discipline_setInactive(:discipline) as "Num"';
$res = DB::query(Database::SELECT, $sql)
->parameters([
':discipline' => $this->ID
])->execute()->get("Num");
return $res;
}
public function setActive() {
$sql = 'SELECT * FROM Discipline_setActive(:discipline) as "Num"';
$res = DB::query(Database::SELECT, $sql)
->parameters([
':discipline' => $this->ID
])->execute()->get("Num");
return $res;
}
public function copyDisciplineMapFrom($disciplineToID, $disciplineFromID)
{
$sql = 'SELECT * FROM copy_map(:from, :to) as "Num"';
......
......@@ -17,7 +17,11 @@ class Model_Disciplines extends Model_Collection
// filtering
return array_filter($this->data,
function($record) use ($state) {
return $record['State'] == $state;
if ($state === null) {
return $record['State'] == $state;
} else {
return $record['State'] == $state && $record['IsInactive'] == false;
}
});
}
......
......@@ -23,6 +23,9 @@
<td style="width: 70px;"></td>
<td>Название</td>
<td style="width: 250px;">Автор</td>
{% if InMainList %}
<td style="width: 100px;">вкл./выкл.</td>
{% endif %}
</tr>
</thead>
<tbody>
......@@ -31,6 +34,19 @@
<td style="text-align: center;">{{ discipline.ID }}</td>
<td style="white-space: normal;"><a href="{{ URL.site("discipline/") }}/{{ discipline.ID }}/structure">{{ discipline.SubjectName }}</a></td>
<td><a href="{{ URL.site("office/teachers/profile/") }}/{{ Teachers[discipline.ID].ID }}">{{ Text.abbreviateName(Teachers[discipline.ID]) }}</a></td>
{% if InMainList %}
<td>
{% if discipline.IsInactive %}
<a id="discipline_switch_{{ discipline.ID }}" class="disciplineInactiveSwitch disciplineInactive" href="#">
выключена
</a>
{% else %}
<a id="discipline_switch_{{ discipline.ID }}" class="disciplineInactiveSwitch disciplineActive" href="#">
включена
</a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment