Version 20.50.3: Mar 16, 2021 Assignments database table renamed.

This commit is contained in:
acanas 2021-03-16 00:58:21 +01:00
parent c6aa4fe3cc
commit 986b7e6d11
6 changed files with 239 additions and 194 deletions

View File

@ -58,16 +58,9 @@ CREATE TABLE IF NOT EXISTS ann_seen (
UsrCod INT NOT NULL, UsrCod INT NOT NULL,
UNIQUE INDEX(AnnCod,UsrCod)); UNIQUE INDEX(AnnCod,UsrCod));
-- --
-- Table asg_grp: stores the groups associated to assigments -- Table asg_assignments: stores the assignments proposed by the teachers to their students
-- --
CREATE TABLE IF NOT EXISTS asg_grp ( CREATE TABLE IF NOT EXISTS asg_assignments (
AsgCod INT NOT NULL,
GrpCod INT NOT NULL,
UNIQUE INDEX(AsgCod,GrpCod));
--
-- Table assignments: stores the assignments proposed by the teachers to their students
--
CREATE TABLE IF NOT EXISTS assignments (
AsgCod INT NOT NULL AUTO_INCREMENT, AsgCod INT NOT NULL AUTO_INCREMENT,
CrsCod INT NOT NULL DEFAULT -1, CrsCod INT NOT NULL DEFAULT -1,
Hidden ENUM('N','Y') NOT NULL DEFAULT 'N', Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',
@ -81,6 +74,13 @@ CREATE TABLE IF NOT EXISTS assignments (
UNIQUE INDEX(AsgCod), UNIQUE INDEX(AsgCod),
INDEX(CrsCod,Hidden)); INDEX(CrsCod,Hidden));
-- --
-- Table asg_grp: stores the groups associated to assigments
--
CREATE TABLE IF NOT EXISTS asg_grp (
AsgCod INT NOT NULL,
GrpCod INT NOT NULL,
UNIQUE INDEX(AsgCod,GrpCod));
--
-- Table att_events: stores events used to control attendance -- Table att_events: stores events used to control attendance
-- --
CREATE TABLE IF NOT EXISTS att_events ( CREATE TABLE IF NOT EXISTS att_events (

View File

@ -695,11 +695,22 @@ static void Asg_GetListAssignments (struct Asg_Assignments *Assignments)
if (Gbl.Crs.Grps.WhichGrps == Grp_MY_GROUPS) if (Gbl.Crs.Grps.WhichGrps == Grp_MY_GROUPS)
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments",
"SELECT AsgCod" "SELECT AsgCod"
" FROM assignments" " FROM asg_assignments"
" WHERE CrsCod=%ld%s" " WHERE CrsCod=%ld%s"
" AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR" " AND ("
" AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" // Assignment is for the whole course
" WHERE crs_grp_usr.UsrCod=%ld AND asg_grp.GrpCod=crs_grp_usr.GrpCod))" "AsgCod NOT IN"
" (SELECT AsgCod"
" FROM asg_grp)" // Not associated to any group
" OR"
// Assignment is for some of my groups
" AsgCod IN"
" (SELECT asg_grp.AsgCod"
" FROM asg_grp,"
"crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod)"
")"
" ORDER BY %s", " ORDER BY %s",
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
HiddenSubQuery[Gbl.Usrs.Me.Role.Logged], HiddenSubQuery[Gbl.Usrs.Me.Role.Logged],
@ -708,7 +719,7 @@ static void Asg_GetListAssignments (struct Asg_Assignments *Assignments)
else // Gbl.Crs.Grps.WhichGrps == Grp_ALL_GROUPS else // Gbl.Crs.Grps.WhichGrps == Grp_ALL_GROUPS
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignments",
"SELECT AsgCod" "SELECT AsgCod"
" FROM assignments" " FROM asg_assignments"
" WHERE CrsCod=%ld%s" " WHERE CrsCod=%ld%s"
" ORDER BY %s", " ORDER BY %s",
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
@ -765,9 +776,11 @@ void Asg_GetDataOfAssignmentByCod (struct Asg_Assignment *Asg)
"NOW() BETWEEN StartTime AND EndTime," // row[5] "NOW() BETWEEN StartTime AND EndTime," // row[5]
"Title," // row[6] "Title," // row[6]
"Folder" // row[7] "Folder" // row[7]
" FROM assignments" " FROM asg_assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " WHERE AsgCod=%ld"
Asg->AsgCod,Gbl.Hierarchy.Crs.CrsCod); " AND CrsCod=%ld",
Asg->AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Get data of assignment *****/ /***** Get data of assignment *****/
Asg_GetDataOfAssignment (Asg,&mysql_res,NumRows); Asg_GetDataOfAssignment (Asg,&mysql_res,NumRows);
@ -801,9 +814,11 @@ void Asg_GetDataOfAssignmentByFolder (struct Asg_Assignment *Asg)
"NOW() BETWEEN StartTime AND EndTime," // row[5] "NOW() BETWEEN StartTime AND EndTime," // row[5]
"Title," // row[6] "Title," // row[6]
"Folder" // row[7] "Folder" // row[7]
" FROM assignments" " FROM asg_assignments"
" WHERE CrsCod=%ld AND Folder='%s'", " WHERE CrsCod=%ld"
Gbl.Hierarchy.Crs.CrsCod,Asg->Folder); " AND Folder='%s'",
Gbl.Hierarchy.Crs.CrsCod,
Asg->Folder);
/***** Get data of assignment *****/ /***** Get data of assignment *****/
Asg_GetDataOfAssignment (Asg,&mysql_res,NumRows); Asg_GetDataOfAssignment (Asg,&mysql_res,NumRows);
@ -925,9 +940,12 @@ static void Asg_GetAssignmentTxtFromDB (long AsgCod,char Txt[Cns_MAX_BYTES_TEXT
/***** Get text of assignment from database *****/ /***** Get text of assignment from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignment text", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignment text",
"SELECT Txt FROM assignments" "SELECT Txt" // row[0]
" WHERE AsgCod=%ld AND CrsCod=%ld", " FROM asg_assignments"
AsgCod,Gbl.Hierarchy.Crs.CrsCod); " WHERE AsgCod=%ld"
" AND CrsCod=%ld",
AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** The result of the query must have one row or none *****/ /***** The result of the query must have one row or none *****/
if (NumRows == 1) if (NumRows == 1)
@ -964,7 +982,9 @@ void Asg_GetNotifAssignment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
/***** Build query *****/ /***** Build query *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get assignment title and text", NumRows = DB_QuerySELECT (&mysql_res,"can not get assignment title and text",
"SELECT Title,Txt FROM assignments" "SELECT Title," // row[0]
"Txt" // row[1]
" FROM asg_assignments"
" WHERE AsgCod=%ld", " WHERE AsgCod=%ld",
AsgCod); AsgCod);
@ -1082,8 +1102,11 @@ void Asg_RemoveAssignment (void)
/***** Remove assignment *****/ /***** Remove assignment *****/
DB_QueryDELETE ("can not remove assignment", DB_QueryDELETE ("can not remove assignment",
"DELETE FROM assignments WHERE AsgCod=%ld AND CrsCod=%ld", "DELETE FROM asg_assignments"
Asg.AsgCod,Gbl.Hierarchy.Crs.CrsCod); " WHERE AsgCod=%ld"
" AND CrsCod=%ld",
Asg.AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Mark possible notifications as removed *****/ /***** Mark possible notifications as removed *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_ASSIGNMENT,Asg.AsgCod); Ntf_MarkNotifAsRemoved (Ntf_EVENT_ASSIGNMENT,Asg.AsgCod);
@ -1122,9 +1145,12 @@ void Asg_HideAssignment (void)
/***** Hide assignment *****/ /***** Hide assignment *****/
DB_QueryUPDATE ("can not hide assignment", DB_QueryUPDATE ("can not hide assignment",
"UPDATE assignments SET Hidden='Y'" "UPDATE asg_assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " SET Hidden='Y'"
Asg.AsgCod,Gbl.Hierarchy.Crs.CrsCod); " WHERE AsgCod=%ld"
" AND CrsCod=%ld",
Asg.AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Show all assignments again *****/ /***** Show all assignments again *****/
Asg_ShowAllAssignments (&Assignments); Asg_ShowAllAssignments (&Assignments);
@ -1156,9 +1182,12 @@ void Asg_ShowAssignment (void)
/***** Hide assignment *****/ /***** Hide assignment *****/
DB_QueryUPDATE ("can not show assignment", DB_QueryUPDATE ("can not show assignment",
"UPDATE assignments SET Hidden='N'" "UPDATE asg_assignments"
" WHERE AsgCod=%ld AND CrsCod=%ld", " SET Hidden='N'"
Asg.AsgCod,Gbl.Hierarchy.Crs.CrsCod); " WHERE AsgCod=%ld"
" AND CrsCod=%ld",
Asg.AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Show all assignments again *****/ /***** Show all assignments again *****/
Asg_ShowAllAssignments (&Assignments); Asg_ShowAllAssignments (&Assignments);
@ -1172,9 +1201,10 @@ static bool Asg_CheckIfSimilarAssignmentExists (const char *Field,const char *Va
{ {
/***** Get number of assignments with a field value from database *****/ /***** Get number of assignments with a field value from database *****/
return (DB_QueryCOUNT ("can not get similar assignments", return (DB_QueryCOUNT ("can not get similar assignments",
"SELECT COUNT(*) FROM assignments" "SELECT COUNT(*)"
" FROM asg_assignments"
" WHERE CrsCod=%ld" " WHERE CrsCod=%ld"
" AND %s='%s' AND AsgCod<>%ld", " AND %s='%s' AND AsgCod<>%ld",
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
Field,Value,AsgCod) != 0); Field,Value,AsgCod) != 0);
} }
@ -1572,11 +1602,12 @@ void Asg_ReceiveFormAssignment (void)
static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigned NumUsrsToBeNotifiedByEMail) static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigned NumUsrsToBeNotifiedByEMail)
{ {
/***** Update number of users notified *****/ /***** Update number of users notified *****/
DB_QueryUPDATE ("can not update the number of notifications" DB_QueryUPDATE ("can not update the number of notifs. of an assignment",
" of an assignment", "UPDATE asg_ssignments"
"UPDATE assignments SET NumNotif=NumNotif+%u" " SET NumNotif=NumNotif+%u"
" WHERE AsgCod=%ld", " WHERE AsgCod=%ld",
NumUsrsToBeNotifiedByEMail,AsgCod); NumUsrsToBeNotifiedByEMail,
AsgCod);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1588,7 +1619,7 @@ static void Asg_CreateAssignment (struct Asg_Assignment *Asg,const char *Txt)
/***** Create a new assignment *****/ /***** Create a new assignment *****/
Asg->AsgCod = Asg->AsgCod =
DB_QueryINSERTandReturnCode ("can not create new assignment", DB_QueryINSERTandReturnCode ("can not create new assignment",
"INSERT INTO assignments" "INSERT INTO asg_assignments"
" (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)" " (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)"
" VALUES" " VALUES"
" (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld)," " (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
@ -1614,17 +1645,21 @@ static void Asg_UpdateAssignment (struct Asg_Assignment *Asg,const char *Txt)
{ {
/***** Update the data of the assignment *****/ /***** Update the data of the assignment *****/
DB_QueryUPDATE ("can not update assignment", DB_QueryUPDATE ("can not update assignment",
"UPDATE assignments SET " "UPDATE asg_assignments"
"StartTime=FROM_UNIXTIME(%ld)," " SET StartTime=FROM_UNIXTIME(%ld),"
"EndTime=FROM_UNIXTIME(%ld)," "EndTime=FROM_UNIXTIME(%ld),"
"Title='%s',Folder='%s',Txt='%s'" "Title='%s',"
" WHERE AsgCod=%ld AND CrsCod=%ld", "Folder='%s',"
"Txt='%s'"
" WHERE AsgCod=%ld"
" AND CrsCod=%ld",
Asg->TimeUTC[Dat_START_TIME], Asg->TimeUTC[Dat_START_TIME],
Asg->TimeUTC[Dat_END_TIME ], Asg->TimeUTC[Dat_END_TIME ],
Asg->Title, Asg->Title,
Asg->Folder, Asg->Folder,
Txt, Txt,
Asg->AsgCod,Gbl.Hierarchy.Crs.CrsCod); Asg->AsgCod,
Gbl.Hierarchy.Crs.CrsCod);
/***** Update groups *****/ /***** Update groups *****/
/* Remove old groups */ /* Remove old groups */
@ -1768,16 +1803,18 @@ static void Asg_GetAndWriteNamesOfGrpsAssociatedToAsg (struct Asg_Assignment *As
void Asg_RemoveCrsAssignments (long CrsCod) void Asg_RemoveCrsAssignments (long CrsCod)
{ {
/***** Remove groups *****/ /***** Remove groups *****/
DB_QueryDELETE ("can not remove all the groups associated" DB_QueryDELETE ("can not remove groups associated to assignments in a course",
" to assignments of a course", "DELETE FROM asg_grp"
"DELETE FROM asg_grp USING assignments,asg_grp" " USING asg_assignments,"
" WHERE assignments.CrsCod=%ld" "asg_grp"
" AND assignments.AsgCod=asg_grp.AsgCod", " WHERE asg_assignments.CrsCod=%ld"
" AND asg_assignments.AsgCod=asg_grp.AsgCod",
CrsCod); CrsCod);
/***** Remove assignments *****/ /***** Remove assignments *****/
DB_QueryDELETE ("can not remove all the assignments of a course", DB_QueryDELETE ("can not remove all assignments in a course",
"DELETE FROM assignments WHERE CrsCod=%ld", "DELETE FROM asg_assignments"
" WHERE CrsCod=%ld",
CrsCod); CrsCod);
} }
@ -1795,19 +1832,22 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
// Students and teachers can do assignments depending on groups // Students and teachers can do assignments depending on groups
/***** Get if I can do an assignment from database *****/ /***** Get if I can do an assignment from database *****/
return (DB_QueryCOUNT ("can not check if I can do an assignment", return (DB_QueryCOUNT ("can not check if I can do an assignment",
"SELECT COUNT(*) FROM assignments" "SELECT COUNT(*)"
" FROM asg_assignments"
" WHERE AsgCod=%ld" " WHERE AsgCod=%ld"
" AND " " AND ("
"(" // Assignment is for the whole course
// Assignment is for the whole course "AsgCod NOT IN"
"AsgCod NOT IN (SELECT AsgCod FROM asg_grp)" " (SELECT AsgCod FROM asg_grp)"
" OR " " OR "
// Assignment is for specific groups // Assignment is for some of my groups
"AsgCod IN" "AsgCod IN"
" (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" " (SELECT asg_grp.AsgCod"
" WHERE crs_grp_usr.UsrCod=%ld" " FROM asg_grp,"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod)" "crs_grp_usr"
")", " WHERE crs_grp_usr.UsrCod=%ld"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod)"
")",
AsgCod,Gbl.Usrs.Me.UsrDat.UsrCod) != 0); AsgCod,Gbl.Usrs.Me.UsrDat.UsrCod) != 0);
case Rol_SYS_ADM: case Rol_SYS_ADM:
return true; return true;
@ -1824,92 +1864,78 @@ static bool Asg_CheckIfIBelongToCrsOrGrpsThisAssignment (long AsgCod)
unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope) unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope)
{ {
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumCourses;
/***** Get number of courses with assignments from database *****/ /***** Get number of courses with assignments from database *****/
switch (Scope) switch (Scope)
{ {
case Hie_Lvl_SYS: case Hie_Lvl_SYS:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM assignments" "SELECT COUNT(DISTINCT CrsCod)"
" WHERE CrsCod>0"); " FROM asg_assignments"
break; " WHERE CrsCod>0");
case Hie_Lvl_CTY: case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT assignments.CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM ins_instits," "SELECT COUNT(DISTINCT asg_assignments.CrsCod)"
"ctr_centers," " FROM ins_instits,"
"deg_degrees," "ctr_centers,"
"courses," "deg_degrees,"
"assignments" "courses,"
" WHERE ins_instits.CtyCod=%ld" "asg_assignments"
" AND ins_instits.InsCod=ctr_centers.InsCod" " WHERE ins_instits.CtyCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.Status=0"
Gbl.Hierarchy.Cty.CtyCod); " AND crs_courses.CrsCod=asg_assignments.CrsCod",
break; Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT assignments.CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM ctr_centers," "SELECT COUNT(DISTINCT asg_assignments.CrsCod)"
"deg_degrees," " FROM ctr_centers,"
"crs_courses," "deg_degrees,"
"assignments" "crs_courses,"
" WHERE ctr_centers.InsCod=%ld" "asg_assignments"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " WHERE ctr_centers.InsCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.Status=0"
Gbl.Hierarchy.Ins.InsCod); " AND crs_courses.CrsCod=asg_assignments.CrsCod",
break; Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT assignments.CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM deg_degrees," "SELECT COUNT(DISTINCT asg_assignments.CrsCod)"
"crs_courses," " FROM deg_degrees,"
"assignments" "crs_courses,"
" WHERE deg_degrees.CtrCod=%ld" "asg_assignments"
" AND deg_degrees.DegCod=crs_courses.DegCod" " WHERE deg_degrees.CtrCod=%ld"
" AND crs_courses.Status=0" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.Status=0"
Gbl.Hierarchy.Ctr.CtrCod); " AND crs_courses.CrsCod=asg_assignments.CrsCod",
break; Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT assignments.CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM crs_courses," "SELECT COUNT(DISTINCT asg_assignments.CrsCod)"
"assignments" " FROM crs_courses,"
" WHERE crs_courses.DegCod=%ld" "asg_assignments"
" AND crs_courses.Status=0" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.Status=0"
Gbl.Hierarchy.Deg.DegCod); " AND crs_courses.CrsCod=asg_assignments.CrsCod",
break; Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of courses with assignments", return (unsigned)
"SELECT COUNT(DISTINCT CrsCod)" DB_QueryCOUNT ("can not get number of courses with assignments",
" FROM assignments" "SELECT COUNT(DISTINCT CrsCod)"
" WHERE CrsCod=%ld", " FROM asg_assignments"
Gbl.Hierarchy.Crs.CrsCod); " WHERE CrsCod=%ld",
break; Gbl.Hierarchy.Crs.CrsCod);
default: default:
Lay_WrongScopeExit (); Lay_WrongScopeExit ();
break; return 0;
} }
/***** Get number of courses *****/
row = mysql_fetch_row (mysql_res);
if (sscanf (row[0],"%u",&NumCourses) != 1)
Lay_ShowErrorAndExit ("Error when getting number of courses with assignments.");
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
return NumCourses;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1931,66 +1957,66 @@ unsigned Asg_GetNumAssignments (Hie_Lvl_Level_t Scope,unsigned *NumNotif)
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," // row[0] "SELECT COUNT(*)," // row[0]
"SUM(NumNotif)" // row[1] "SUM(NumNotif)" // row[1]
" FROM assignments" " FROM asg_assignments"
" WHERE CrsCod>0"); " WHERE CrsCod>0");
break; break;
case Hie_Lvl_CTY: case Hie_Lvl_CTY:
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," // row[0] "SELECT COUNT(*)," // row[0]
"SUM(assignments.NumNotif)" // row[1] "SUM(asg_assignments.NumNotif)" // row[1]
" FROM ins_instits," " FROM ins_instits,"
"ctr_centers," "ctr_centers,"
"deg_degrees," "deg_degrees,"
"crs_courses," "crs_courses,"
"assignments" "asg_assignments"
" WHERE ins_instits.CtyCod=%ld" " WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
break; break;
case Hie_Lvl_INS: case Hie_Lvl_INS:
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," // row[0] "SELECT COUNT(*)," // row[0]
"SUM(assignments.NumNotif)" // row[1] "SUM(asg_assignments.NumNotif)" // row[1]
" FROM ctr_centers," " FROM ctr_centers,"
"deg_degrees," "deg_degrees,"
"crs_courses," "crs_courses,"
"assignments" "asg_assignments"
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
break; break;
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," "SELECT COUNT(*),"
"SUM(assignments.NumNotif)" "SUM(asg_assignments.NumNotif)"
" FROM deg_degrees," " FROM deg_degrees,"
"crs_courses," "crs_courses,"
"assignments" "asg_assignments"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
break; break;
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," "SELECT COUNT(*),"
"SUM(assignments.NumNotif)" "SUM(asg_assignments.NumNotif)"
" FROM crs_courses," " FROM crs_courses,"
"assignments" "asg_assignments"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
break; break;
case Hie_Lvl_CRS: case Hie_Lvl_CRS:
DB_QuerySELECT (&mysql_res,"can not get number of assignments", DB_QuerySELECT (&mysql_res,"can not get number of assignments",
"SELECT COUNT(*)," "SELECT COUNT(*),"
"SUM(NumNotif)" "SUM(NumNotif)"
" FROM assignments" " FROM asg_assignments"
" WHERE CrsCod=%ld", " WHERE CrsCod=%ld",
Gbl.Hierarchy.Crs.CrsCod); Gbl.Hierarchy.Crs.CrsCod);
break; break;
@ -2026,9 +2052,10 @@ unsigned Asg_GetNumAssignments (Hie_Lvl_Level_t Scope,unsigned *NumNotif)
unsigned Asg_GetNumAssignmentsInCrs (long CrsCod) unsigned Asg_GetNumAssignmentsInCrs (long CrsCod)
{ {
/***** Get number of assignments in a course from database *****/ /***** Get number of assignments in a course from database *****/
return return (unsigned)
(unsigned) DB_QueryCOUNT ("can not get number of assignments in course", DB_QueryCOUNT ("can not get number of assignments in course",
"SELECT COUNT(*) FROM assignments" "SELECT COUNT(*)"
" WHERE CrsCod=%ld", " FROM asg_assignments"
CrsCod); " WHERE CrsCod=%ld",
CrsCod);
} }

View File

@ -600,12 +600,16 @@ TODO: Salvador Romero Cort
TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria. TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria.
*/ */
#define Log_PLATFORM_VERSION "SWAD 20.50.2 (2021-03-15)" #define Log_PLATFORM_VERSION "SWAD 20.50.3 (2021-03-16)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js" #define JS_FILE "swad20.6.2.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
Version 20.50.3: Mar 16, 2021 Assignments database table renamed. (307241 lines)
1 change necessary in database:
RENAME TABLE assignments TO asg_assignments;
Version 20.50.2: Mar 15, 2021 Global announcements database table renamed. (307166 lines) Version 20.50.2: Mar 15, 2021 Global announcements database table renamed. (307166 lines)
1 change necessary in database: 1 change necessary in database:
RENAME TABLE announcements TO ann_announcements; RENAME TABLE announcements TO ann_announcements;

View File

@ -214,25 +214,9 @@ mysql> DESCRIBE ann_seen;
"UsrCod INT NOT NULL," "UsrCod INT NOT NULL,"
"UNIQUE INDEX(AnnCod,UsrCod))"); "UNIQUE INDEX(AnnCod,UsrCod))");
/***** Table asg_grp *****/ /***** Table asg_assignments *****/
/* /*
mysql> DESCRIBE asg_grp; mysql> DESCRIBE asg_assignments;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| AsgCod | int(11) | NO | PRI | NULL | |
| GrpCod | int(11) | NO | PRI | NULL | |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS asg_grp ("
"AsgCod INT NOT NULL,"
"GrpCod INT NOT NULL,"
"UNIQUE INDEX(AsgCod,GrpCod))");
/***** Table assignments *****/
/*
mysql> DESCRIBE assignments;
+-----------+----------------+------+-----+---------+----------------+ +-----------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+-----------+----------------+------+-----+---------+----------------+ +-----------+----------------+------+-----+---------+----------------+
@ -249,7 +233,7 @@ mysql> DESCRIBE assignments;
+-----------+----------------+------+-----+---------+----------------+ +-----------+----------------+------+-----+---------+----------------+
10 rows in set (0,00 sec) 10 rows in set (0,00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS assignments (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS asg_assignments ("
"AsgCod INT NOT NULL AUTO_INCREMENT," "AsgCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"Hidden ENUM('N','Y') NOT NULL DEFAULT 'N'," "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',"
@ -263,6 +247,22 @@ mysql> DESCRIBE assignments;
"UNIQUE INDEX(AsgCod)," "UNIQUE INDEX(AsgCod),"
"INDEX(CrsCod,Hidden))"); "INDEX(CrsCod,Hidden))");
/***** Table asg_grp *****/
/*
mysql> DESCRIBE asg_grp;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| AsgCod | int(11) | NO | PRI | NULL | |
| GrpCod | int(11) | NO | PRI | NULL | |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS asg_grp ("
"AsgCod INT NOT NULL,"
"GrpCod INT NOT NULL,"
"UNIQUE INDEX(AsgCod,GrpCod))");
/***** Table att_events *****/ /***** Table att_events *****/
/* /*
mysql> DESCRIBE att_events; mysql> DESCRIBE att_events;

View File

@ -2729,12 +2729,22 @@ static void Brw_CreateFoldersAssignmentsIfNotExist (long ZoneUsrCod)
/***** Get assignment folders from database *****/ /***** Get assignment folders from database *****/
NumRows = DB_QuerySELECT (&mysql_res,"can not get folders of assignments", NumRows = DB_QuerySELECT (&mysql_res,"can not get folders of assignments",
"SELECT Folder FROM assignments" "SELECT Folder" // row[0]
" WHERE CrsCod=%ld AND Hidden='N' AND Folder<>''" " FROM asg_assignments"
" AND (AsgCod NOT IN (SELECT AsgCod FROM asg_grp) OR" " WHERE CrsCod=%ld"
" AsgCod IN (SELECT asg_grp.AsgCod FROM asg_grp,crs_grp_usr" " AND Hidden='N'"
" WHERE crs_grp_usr.UsrCod=%ld" " AND Folder<>''"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod))", " AND ("
"AsgCod NOT IN"
" (SELECT AsgCod FROM asg_grp)"
" OR "
"AsgCod IN"
" (SELECT asg_grp.AsgCod"
" FROM asg_grp,"
"crs_grp_usr"
" WHERE crs_grp_usr.UsrCod=%ld"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod)"
")",
Gbl.Hierarchy.Crs.CrsCod,ZoneUsrCod); Gbl.Hierarchy.Crs.CrsCod,ZoneUsrCod);
/***** Create one folder for each assignment *****/ /***** Create one folder for each assignment *****/

View File

@ -1230,19 +1230,23 @@ unsigned Ntf_StoreNotifyEventsToAllUsrs (Ntf_NotifyEvent_t NotifyEvent,long Cod)
// Cases 1 and 2 are mutually exclusive, so the union returns the case 1 or 2 // Cases 1 and 2 are mutually exclusive, so the union returns the case 1 or 2
NumRows = DB_QuerySELECT (&mysql_res,"can not get users" NumRows = DB_QuerySELECT (&mysql_res,"can not get users"
" to be notified", " to be notified",
"(SELECT crs_usr.UsrCod" "(SELECT crs_usr.UsrCod" // row[0]
" FROM assignments,crs_usr" " FROM asg_assignments,"
" WHERE assignments.AsgCod=%ld" "crs_usr"
" AND assignments.AsgCod NOT IN" " WHERE asg_assignments.AsgCod=%ld"
" (SELECT AsgCod FROM asg_grp WHERE AsgCod=%ld)" " AND asg_assignments.AsgCod NOT IN"
" AND assignments.CrsCod=crs_usr.CrsCod" " (SELECT AsgCod"
" AND crs_usr.UsrCod<>%ld)" " FROM asg_grp"
" WHERE AsgCod=%ld)"
" AND asg_assignments.CrsCod=crs_usr.CrsCod"
" AND crs_usr.UsrCod<>%ld)"
" UNION " " UNION "
"(SELECT DISTINCT crs_grp_usr.UsrCod" "(SELECT DISTINCT crs_grp_usr.UsrCod"
" FROM asg_grp,crs_grp_usr" " FROM asg_grp,"
" WHERE asg_grp.AsgCod=%ld" "crs_grp_usr"
" AND asg_grp.GrpCod=crs_grp_usr.GrpCod" " WHERE asg_grp.AsgCod=%ld"
" AND crs_grp_usr.UsrCod<>%ld)", " AND asg_grp.GrpCod=crs_grp_usr.GrpCod"
" AND crs_grp_usr.UsrCod<>%ld)",
Cod,Cod,Gbl.Usrs.Me.UsrDat.UsrCod, Cod,Cod,Gbl.Usrs.Me.UsrDat.UsrCod,
Cod,Gbl.Usrs.Me.UsrDat.UsrCod); Cod,Gbl.Usrs.Me.UsrDat.UsrCod);
break; break;