diff --git a/sql/swad.sql b/sql/swad.sql index e13a9be7..b6b975c4 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -1245,14 +1245,6 @@ CREATE TABLE IF NOT EXISTS prj_rubrics ( RubCod INT NOT NULL, UNIQUE INDEX(CrsCod,Type,RubCod)); -- --- Table prj_scores: stores the rubric criteria scores for each project --- -CREATE TABLE IF NOT EXISTS prj_scores ( - PrjCod INT NOT NULL, - CriCod INT NOT NULL, - Score DOUBLE PRECISION NOT NULL DEFAULT 0, - UNIQUE INDEX(PrjCod,CriCod)); --- -- Table prj_users: stores the users inside projects -- CREATE TABLE IF NOT EXISTS prj_users ( @@ -1332,6 +1324,17 @@ CREATE TABLE IF NOT EXISTS rub_rubrics ( UNIQUE INDEX(RubCod), INDEX(CrsCod)); -- +-- Table rub_scores: stores the rubric criteria scores for each project +-- +CREATE TABLE IF NOT EXISTS rub_scores ( + Type ENUM('non','asg','prj','cfe','exa','gam','rub','doc','mrk','att','for','svy') NOT NULL DEFAULT 'non', + Cod INT NOT NULL, + UsrCod INT NOT NULL DEFAULT -1, + CriCod INT NOT NULL, + EvlCod INT NOT NULL DEFAULT -1, + Score DOUBLE PRECISION NOT NULL DEFAULT 0, + UNIQUE INDEX(Type,Cod,UsrCod,CriCod)); +-- -- Table ses_params: stores some hidden parameters passed from a page to another using database instead of forms -- CREATE TABLE IF NOT EXISTS ses_params ( diff --git a/swad_changelog.h b/swad_changelog.h index 0b7d274e..44c15129 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -629,10 +629,19 @@ TODO: Emilce Barrera Mesa: Podr TODO: Emilce Barrera Mesa: Mis estudiantes presentan muchas dificultades a la hora de poner la foto porque la plataforma es muy exigente respecto al fondo de la imagen. */ -#define Log_PLATFORM_VERSION "SWAD 22.114 (2023-05-19)" +#define Log_PLATFORM_VERSION "SWAD 22.115 (2023-05-19)" #define CSS_FILE "swad22.107.36.css" #define JS_FILE "swad22.49.js" /* + Version 22.115: May 19, 2023 Generalization of rubric scores. (337010 lines) + 1 change necessary in database: +CREATE TABLE IF NOT EXISTS rub_scores (Type ENUM('non','asg','prj','cfe','exa','gam','rub','doc','mrk','att','for','svy') NOT NULL DEFAULT 'non',Cod INT NOT NULL,UsrCod INT NOT NULL DEFAULT -1,CriCod INT NOT NULL,EvlCod INT NOT NULL DEFAULT -1,Score DOUBLE PRECISION NOT NULL DEFAULT 0,UNIQUE INDEX(Type,Cod,UsrCod,CriCod)); + If you want to use MyISAM: +ALTER TABLE rub_scores ENGINE=MyISAM; + 2 changes necessary in database: +INSERT INTO rub_scores SELECT 'prj',PrjCod,-1,CriCod,-1,Score FROM prj_scores ORDER BY PrjCod,CriCod; +DROP TABLE prj_scores; + Version 22.114: May 19, 2023 Check if a rubric is recursive. (336984 lines) Version 22.113: May 19, 2023 Check if a rubric is recursive. (336936 lines) Version 22.112: May 18, 2023 Code refactoring in options of selectors. (336794 lines) diff --git a/swad_database.c b/swad_database.c index 4fc7acd4..da9cdb8c 100644 --- a/swad_database.c +++ b/swad_database.c @@ -2659,24 +2659,6 @@ mysql> DESCRIBE prj_rubrics; "RubCod INT NOT NULL," "UNIQUE INDEX(CrsCod,Type,RubCod))"); - /***** Table prj_scores *****/ -/* -mysql> DESCRIBE prj_scores; -+--------+--------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+--------+--------+------+-----+---------+-------+ -| PrjCod | int | NO | PRI | NULL | | -| CriCod | int | NO | PRI | NULL | | -| Score | double | NO | | 0 | | -+--------+--------+------+-----+---------+-------+ -3 rows in set (0,00 sec) -*/ - DB_CreateTable ("CREATE TABLE IF NOT EXISTS prj_scores (" - "PrjCod INT NOT NULL," - "CriCod INT NOT NULL," - "Score DOUBLE PRECISION NOT NULL DEFAULT 0," - "UNIQUE INDEX(PrjCod,CriCod))"); - /***** Table prj_users *****/ /* mysql> DESCRIBE prj_users; @@ -2866,6 +2848,30 @@ mysql> DESCRIBE rub_rubrics; "UNIQUE INDEX(RubCod)," "INDEX(CrsCod))"); + /***** Table rub_scores *****/ +/* +mysql> DESCRIBE rub_scores; ++--------+-------------------------------------------------------------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------+-------------------------------------------------------------------------------+------+-----+---------+-------+ +| Type | enum('non','asg','prj','cfe','exa','gam','rub','doc','mrk','att','for','svy') | NO | PRI | non | | +| Cod | int | NO | PRI | NULL | | +| UsrCod | int | NO | PRI | -1 | | +| CriCod | int | NO | PRI | NULL | | +| EvlCod | int | NO | | -1 | | +| Score | double | NO | | 0 | | ++--------+-------------------------------------------------------------------------------+------+-----+---------+-------+ +6 rows in set (0,00 sec) +*/ + DB_CreateTable ("CREATE TABLE IF NOT EXISTS rub_scores (" + "Type ENUM('non','asg','prj','cfe','exa','gam','rub','doc','mrk','att','for','svy') NOT NULL DEFAULT 'non'," + "Cod INT NOT NULL," + "UsrCod INT NOT NULL DEFAULT -1," + "CriCod INT NOT NULL," + "EvlCod INT NOT NULL DEFAULT -1," + "Score DOUBLE PRECISION NOT NULL DEFAULT 0," + "UNIQUE INDEX(Type,Cod,UsrCod,CriCod))"); + /***** Table ses_params *****/ /* mysql> DESCRIBE ses_params; diff --git a/swad_project.c b/swad_project.c index 1d9d02d8..d67d9393 100644 --- a/swad_project.c +++ b/swad_project.c @@ -4676,7 +4676,7 @@ void Prj_ChangeCriterionScore (void) /***** Update review *****/ if (Prj_CheckIfICanFillRubric (Prj.PrjCod,WhichRubric)) - Prj_DB_UpdateScore (Prj.PrjCod,CriCod,Score); + Rub_DB_UpdateScore (Rsc_PROJECT,Prj.PrjCod,-1L,CriCod,Score); else Err_NoPermission (); diff --git a/swad_project_config.c b/swad_project_config.c index b154bedb..020c58d6 100644 --- a/swad_project_config.c +++ b/swad_project_config.c @@ -349,7 +349,6 @@ void PrjCfg_ChangeNETCanCreate (void) void PrjCfg_ChangeRubricsOfType (void) { extern const char *Txt_The_configuration_of_the_projects_has_been_updated; - struct Prj_Projects Projects; struct Rub_Rubrics Rubrics; PrjCfg_RubricType_t RubricType; struct PrgCfg_ListRubCods ListRubCods; @@ -361,9 +360,6 @@ void PrjCfg_ChangeRubricsOfType (void) /***** Get list of rubrics *****/ Rub_GetListRubrics (&Rubrics); - /***** Reset projects *****/ - Prj_ResetPrjsAndReadConfig (&Projects); - /***** Get parameter with the type of rubric *****/ Par_GetParText ("RubricType",StrType,sizeof (StrType) - 1); RubricType = PrjCfg_GetRubricFromString (StrType); @@ -372,7 +368,7 @@ void PrjCfg_ChangeRubricsOfType (void) PrjCfg_GetListRubCods (&Rubrics,&ListRubCods); /***** Update database *****/ - Prj_DB_UpdateRubrics (&Projects,RubricType,&ListRubCods); + Prj_DB_UpdateRubrics (RubricType,&ListRubCods); /***** Show confirmation message *****/ Ale_ShowAlert (Ale_SUCCESS,Txt_The_configuration_of_the_projects_has_been_updated); diff --git a/swad_project_database.c b/swad_project_database.c index 0095aecb..4d774a29 100644 --- a/swad_project_database.c +++ b/swad_project_database.c @@ -226,22 +226,6 @@ void Prj_DB_UpdateReview (const struct Prj_Project *Prj) Gbl.Hierarchy.Crs.CrsCod); } -/*****************************************************************************/ -/**************** Update score of a criterion in a project *******************/ -/*****************************************************************************/ - -void Prj_DB_UpdateScore (long PrjCod,long CriCod,double Score) - { - Str_SetDecimalPointToUS (); // To write the decimal point as a dot - DB_QueryREPLACE ("can not save score", - "REPLACE INTO prj_scores" - " (PrjCod,CriCod,Score)" - " VALUES" - " (%ld,%ld,%.15lg)", - PrjCod,CriCod,Score); - Str_SetDecimalPointToLocal (); // Return to local system - } - /*****************************************************************************/ /******************************** Get projects *******************************/ /*****************************************************************************/ @@ -699,21 +683,6 @@ long Prj_DB_GetCrsOfPrj (long PrjCod) PrjCod); // Project found... } -/*****************************************************************************/ -/********************* Get criteria in a given rubric ************************/ -/*****************************************************************************/ - -double Prj_DB_GetScore (long PrjCod,long CriCod) - { - return DB_QuerySELECTDouble ("can not get score", - "SELECT Score" - " FROM prj_scores" - " WHERE PrjCod=%ld" - " AND CriCod=%ld", - PrjCod, - CriCod); - } - /*****************************************************************************/ /******************** Get number of courses with projects ********************/ /*****************************************************************************/ @@ -999,8 +968,7 @@ void Prj_DB_UpdateNETCanCreate (const struct Prj_Projects *Projects) /********* Update rubrics associated to projects for current course **********/ /*****************************************************************************/ -void Prj_DB_UpdateRubrics (const struct Prj_Projects *Projects, - PrjCfg_RubricType_t RubricType, +void Prj_DB_UpdateRubrics (PrjCfg_RubricType_t RubricType, const struct PrgCfg_ListRubCods *ListRubCods) { unsigned RubCod; diff --git a/swad_project_database.h b/swad_project_database.h index 450b51a3..ab9ec88e 100644 --- a/swad_project_database.h +++ b/swad_project_database.h @@ -41,7 +41,6 @@ void Prj_DB_UpdateProject (const struct Prj_Project *Prj); void Prj_DB_AddUsrToPrj (long PrjCod,Prj_RoleInProject_t RoleInProject,long UsrCod); void Prj_DB_HideOrUnhideProject (long PrjCod,bool Hide); void Prj_DB_UpdateReview (const struct Prj_Project *Prj); -void Prj_DB_UpdateScore (long PrjCod,long CriCod,double Score); unsigned Prj_DB_GetListProjects (MYSQL_RES **mysql_res, const struct Prj_Projects *Projects, @@ -54,7 +53,6 @@ unsigned Prj_DB_GetUsrsInPrj (MYSQL_RES **mysql_res, long PrjCod,Prj_RoleInProject_t RoleInProject); unsigned Prj_DB_GetMyRolesInPrj (MYSQL_RES **mysql_res,long PrjCod); long Prj_DB_GetCrsOfPrj (long PrjCod); -double Prj_DB_GetScore (long PrjCod,long CriCod); unsigned Prj_DB_GetNumCoursesWithProjects (HieLvl_Level_t Scope); unsigned Prj_DB_GetNumProjects (HieLvl_Level_t Scope); @@ -70,8 +68,7 @@ void Prj_DB_RemoveCrsPrjs (long CrsCod); //----------------------------- Configuration --------------------------------- void Prj_DB_UpdateNETCanCreate (const struct Prj_Projects *Projects); -void Prj_DB_UpdateRubrics (const struct Prj_Projects *Projects, - PrjCfg_RubricType_t RubricType, +void Prj_DB_UpdateRubrics (PrjCfg_RubricType_t RubricType, const struct PrgCfg_ListRubCods *ListRubCods); unsigned Prj_DB_GetConfig (MYSQL_RES **mysql_res); unsigned Prj_DB_GetRubricsOfType (MYSQL_RES **mysql_res, diff --git a/swad_rubric.c b/swad_rubric.c index 531dbe79..03024c65 100644 --- a/swad_rubric.c +++ b/swad_rubric.c @@ -78,6 +78,8 @@ static bool Rub_CheckRubricFieldsReceivedFromForm (const struct Rub_Rubric *Rubr static void Rub_CreateRubric (struct Rub_Rubric *Rubric); static void Rub_UpdateRubric (struct Rub_Rubric *Rubric); +static bool Rub_CheckIfRecursiveTree (long RubCod,struct Rub_Node **TOS); + /*****************************************************************************/ /*************************** Reset rubrics context ***************************/ /*****************************************************************************/ @@ -345,7 +347,7 @@ void Rub_ShowOnlyOneRubric (struct Rub_Rubrics *Rubrics) { extern const char *Hlp_ASSESSMENT_Rubrics; extern const char *Txt_Rubric; - struct Node *TOS = NULL; + struct Rub_Node *TOS = NULL; /***** Begin box *****/ Box_BoxBegin (NULL,Rubrics->Rubric.Title[0] ? Rubrics->Rubric.Title : @@ -788,7 +790,7 @@ void Rub_PutFormsOneRubric (struct Rub_Rubrics *Rubrics, [Rub_EXISTING_RUBRIC] = &Hlp_ASSESSMENT_Rubrics_edit_rubric, [Rub_NEW_RUBRIC ] = &Hlp_ASSESSMENT_Rubrics_new_rubric, }; - struct Node *TOS = NULL; + struct Rub_Node *TOS = NULL; /***** Begin box *****/ Box_BoxBegin (NULL, @@ -1061,7 +1063,7 @@ Handwritten Handwritten |_______| Handwritten / | \ Handwritten Handwritten Handwritten */ -bool Rub_CheckIfRecursiveTree (long RubCod,struct Node **TOS) +static bool Rub_CheckIfRecursiveTree (long RubCod,struct Rub_Node **TOS) { bool RecursiveTree; MYSQL_RES *mysql_res; @@ -1077,25 +1079,25 @@ bool Rub_CheckIfRecursiveTree (long RubCod,struct Node **TOS) /***** Push rubric code in stack *****/ Rub_PushRubCod (TOS,RubCod); - /* For each criteria in this rubric... */ - NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); - for (NumCriterion = 0; - NumCriterion < NumCriteria; - NumCriterion++) - { - /* Get criterion data */ - RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); + /***** For each criteria in this rubric... *****/ + NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); + for (NumCriterion = 0; + NumCriterion < NumCriteria; + NumCriterion++) + { + /* Get criterion data */ + RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); - if (Criterion.Link.Type == Rsc_RUBRIC) - if (Rub_CheckIfRecursiveTree (Criterion.Link.Cod,TOS)) - { - RecursiveTree = true; - break; - } - } + if (Criterion.Link.Type == Rsc_RUBRIC) + if (Rub_CheckIfRecursiveTree (Criterion.Link.Cod,TOS)) + { + RecursiveTree = true; + break; + } + } - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); /***** Pop rubric code from stack *****/ Rub_PopRubCod (TOS); diff --git a/swad_rubric.h b/swad_rubric.h index e14e5214..de35bea5 100644 --- a/swad_rubric.h +++ b/swad_rubric.h @@ -37,12 +37,6 @@ #define RubCri_AFTER_LAST_CRITERION ((unsigned)((1UL << 31) - 1)) // 2^31 - 1, don't change this number because it is used in database -struct Node - { - long RubCod; - struct Node *Prev; - }; - /*****************************************************************************/ /***************************** Public prototypes *****************************/ /*****************************************************************************/ @@ -78,8 +72,6 @@ void Rub_PutFormsOneRubric (struct Rub_Rubrics *Rubrics, void Rub_ReceiveFormRubric (void); -bool Rub_CheckIfRecursiveTree (long RubCod,struct Node **TOS); - //-------------------------------- Figures ------------------------------------ void Rub_GetAndShowRubricsStats (void); diff --git a/swad_rubric_criteria.c b/swad_rubric_criteria.c index 3776ef00..a659a5bb 100644 --- a/swad_rubric_criteria.c +++ b/swad_rubric_criteria.c @@ -109,7 +109,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, unsigned NumCriteria, MYSQL_RES *mysql_res); static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects, - struct Node **TOS, + struct Rub_Node **TOS, bool ICanFill, unsigned NumCriteria, MYSQL_RES *mysql_res); @@ -122,7 +122,8 @@ static void RubCri_WriteWeight (const struct RubCri_Criterion *Criterion); static void RubCri_WriteTotalLabel (unsigned ColSpan); static void RubCri_WriteTotalValue (double Total); -static bool RubCri_ComputeRubricScore (long PrjCod,struct Node **TOS,long RubCod, +static bool RubCri_ComputeRubricScore (Rsc_Type_t Type,long Cod,long UsrCod, + struct Rub_Node **TOS,long RubCod, double *RubricScore); static void RubCri_PutTableHeadingForCriteria (RubCri_PutColumnForIcons_t PutColumnForIcons, @@ -575,7 +576,7 @@ void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, { MYSQL_RES *mysql_res; unsigned NumCriteria; - struct Node *TOS; + struct Rub_Node *TOS; /***** Get data of rubric criteria from database *****/ NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); @@ -806,7 +807,7 @@ static void RubCri_ListOneOrMoreCriteriaForEdition (struct Rub_Rubrics *Rubrics, /*****************************************************************************/ static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects, - struct Node **TOS, + struct Rub_Node **TOS, bool ICanFill, unsigned NumCriteria, MYSQL_RES *mysql_res) @@ -854,7 +855,7 @@ static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects switch (Criterion.Link.Type) { case Rsc_NONE: - CriterionScore = Prj_DB_GetScore (Projects->Prj.PrjCod,Criterion.CriCod); + CriterionScore = Rub_DB_GetScore (Rsc_PROJECT,Projects->Prj.PrjCod,-1L,Criterion.CriCod); if (ICanFill) { Frm_BeginFormAnchor (ActChgPrjSco,Anchor); @@ -875,8 +876,8 @@ static void RubCri_ListOneOrMoreCriteriaInProject (struct Prj_Projects *Projects HTM_Double2Decimals (CriterionScore); break; case Rsc_RUBRIC: - if (RubCri_ComputeRubricScore (Projects->Prj.PrjCod,TOS, - Criterion.Link.Cod, + if (RubCri_ComputeRubricScore (Rsc_PROJECT,Projects->Prj.PrjCod,-1L, + TOS,Criterion.Link.Cod, &CriterionScore)) Err_RecursiveRubric (); else @@ -1008,7 +1009,8 @@ static void RubCri_WriteTotalValue (double Total) /*****************************************************************************/ // Return true if rubric tree is recursive -static bool RubCri_ComputeRubricScore (long PrjCod,struct Node **TOS,long RubCod, +static bool RubCri_ComputeRubricScore (Rsc_Type_t Type,long Cod,long UsrCod, + struct Rub_Node **TOS,long RubCod, double *RubricScore) { bool RecursiveTree; @@ -1029,37 +1031,38 @@ static bool RubCri_ComputeRubricScore (long PrjCod,struct Node **TOS,long RubCod /***** Push rubric code in stack *****/ Rub_PushRubCod (TOS,RubCod); - /***** Get data of rubric criteria from database *****/ - NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); - for (NumCriterion = 0; - NumCriterion < NumCriteria; - NumCriterion++) + /***** Get data of rubric criteria from database *****/ + NumCriteria = Rub_DB_GetCriteria (&mysql_res,RubCod); + for (NumCriterion = 0; + NumCriterion < NumCriteria; + NumCriterion++) + { + /***** Get criterion data *****/ + RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); + + /***** Get/compute criterion score *****/ + CriterionScore = 0.0; + switch (Criterion.Link.Type) { - /***** Get criterion data *****/ - RubCri_GetCriterionDataFromRow (mysql_res,&Criterion); - - /* Get/compute criterion score */ - CriterionScore = 0.0; - switch (Criterion.Link.Type) - { - case Rsc_NONE: - CriterionScore = Prj_DB_GetScore (PrjCod,Criterion.CriCod); - break; - case Rsc_RUBRIC: - if (RubCri_ComputeRubricScore (PrjCod,TOS,Criterion.Link.Cod, - &CriterionScore)) - RecursiveTree = true; - break; - default: - break; - } - - /***** Compute score of this criterion in the child rubric *****/ - *RubricScore += Criterion.Weight * CriterionScore; // Update weighted sum + case Rsc_NONE: + CriterionScore = Rub_DB_GetScore (Rsc_PROJECT,Cod,UsrCod,Criterion.CriCod); + break; + case Rsc_RUBRIC: + if (RubCri_ComputeRubricScore (Type,Cod,UsrCod, + TOS,Criterion.Link.Cod, + &CriterionScore)) + RecursiveTree = true; + break; + default: + break; } - /***** Free structure that stores the query result *****/ - DB_FreeMySQLResult (&mysql_res); + /***** Compute score of this criterion in the child rubric *****/ + *RubricScore += Criterion.Weight * CriterionScore; // Update weighted sum + } + + /***** Free structure that stores the query result *****/ + DB_FreeMySQLResult (&mysql_res); /***** Pop rubric code from stack *****/ Rub_PopRubCod (TOS); @@ -1072,23 +1075,23 @@ static bool RubCri_ComputeRubricScore (long PrjCod,struct Node **TOS,long RubCod /********************** Push/pop rubric code in stack ************************/ /*****************************************************************************/ -void Rub_PushRubCod (struct Node **TOS,long RubCod) +void Rub_PushRubCod (struct Rub_Node **TOS,long RubCod) { - struct Node *Node; + struct Rub_Node *Node; /***** Save current top of stack *****/ Node = *TOS; /***** Create top of stack node *****/ - if ((*TOS = malloc (sizeof (struct Node))) == NULL) + if ((*TOS = malloc (sizeof (struct Rub_Node))) == NULL) Err_NotEnoughMemoryExit (); (*TOS)->RubCod = RubCod; (*TOS)->Prev = Node; // Link to previous top of stack } -void Rub_PopRubCod (struct Node **TOS) +void Rub_PopRubCod (struct Rub_Node **TOS) { - struct Node *Node; + struct Rub_Node *Node; if (*TOS) { @@ -1108,7 +1111,7 @@ void Rub_PopRubCod (struct Node **TOS) /*****************************************************************************/ // Return true if found -bool Rub_FindRubCodInStack (const struct Node *TOS,long RubCod) +bool Rub_FindRubCodInStack (const struct Rub_Node *TOS,long RubCod) { while (TOS) { diff --git a/swad_rubric_criteria.h b/swad_rubric_criteria.h index 0b3e9138..0d194522 100644 --- a/swad_rubric_criteria.h +++ b/swad_rubric_criteria.h @@ -47,9 +47,9 @@ void RubCri_ListCriteriaForEdition (struct Rub_Rubrics *Rubrics); void RubCri_ListCriteriaInProject (struct Prj_Projects *Projects,long RubCod, bool ICanFill); -void Rub_PushRubCod (struct Node **TOS,long RubCod); -void Rub_PopRubCod (struct Node **TOS); -bool Rub_FindRubCodInStack (const struct Node *TOS,long RubCod); +void Rub_PushRubCod (struct Rub_Node **TOS,long RubCod); +void Rub_PopRubCod (struct Rub_Node **TOS); +bool Rub_FindRubCodInStack (const struct Rub_Node *TOS,long RubCod); double RubCri_GetParScore (void); diff --git a/swad_rubric_database.c b/swad_rubric_database.c index c1b4ed58..82ac1145 100644 --- a/swad_rubric_database.c +++ b/swad_rubric_database.c @@ -825,3 +825,44 @@ void Rub_DB_RemoveCrsRubricCriteria (long CrsCod) " AND rub_rubrics.RubCod=rub_criteria.RubCod", CrsCod); } + +/*****************************************************************************/ +/** Update score of a criterion given an assignment/project code and a user **/ +/*****************************************************************************/ + +void Rub_DB_UpdateScore (Rsc_Type_t Type,long Cod,long UsrCod,long CriCod, + double Score) + { + extern const char *Rsc_ResourceTypesDB[Rsc_NUM_TYPES]; + + Str_SetDecimalPointToUS (); // To write the decimal point as a dot + DB_QueryREPLACE ("can not save score", + "REPLACE INTO rub_scores" + " (Type,Cod,UsrCod,CriCod,EvlCod,Score)" + " VALUES" + " ('%s',%ld,%ld,%ld,%ld,%.15lg)", + Rsc_ResourceTypesDB[Type],Cod,UsrCod,CriCod, + Gbl.Usrs.Me.UsrDat.UsrCod,Score); + Str_SetDecimalPointToLocal (); // Return to local system + } + +/*****************************************************************************/ +/**** Get score of a criterion given an assignment/project code and a user ***/ +/*****************************************************************************/ + +double Rub_DB_GetScore (Rsc_Type_t Type,long Cod,long UsrCod,long CriCod) + { + extern const char *Rsc_ResourceTypesDB[Rsc_NUM_TYPES]; + + return DB_QuerySELECTDouble ("can not get score", + "SELECT Score" + " FROM rub_scores" + " WHERE Type='%s'" + " AND Cod=%ld" + " AND UsrCod=%ld" + " AND CriCod=%ld", + Rsc_ResourceTypesDB[Type], + Cod, + UsrCod, + CriCod); + } diff --git a/swad_rubric_database.h b/swad_rubric_database.h index 31fd2981..0bcd7327 100644 --- a/swad_rubric_database.h +++ b/swad_rubric_database.h @@ -53,7 +53,7 @@ unsigned Rub_DB_GetNumRubrics (HieLvl_Level_t Scope); void Rub_DB_RemoveRubric (long RubCod); void Rub_DB_RemoveCrsRubrics (long CrsCod); -//--------------------------- Rubric criteria ------------------------------- +//---------------------------- Rubric criteria -------------------------------- long Rub_DB_CreateCriterion (const struct RubCri_Criterion *Criterion); void Rub_DB_UpdateCriterionTitle (const struct RubCri_Criterion *Criterion); void Rub_DB_UpdateCriterionLink (const struct RubCri_Criterion *Criterion); @@ -82,4 +82,10 @@ void Rub_DB_RemoveCriterionFromRubric (const struct RubCri_Criterion *Criterion) void Rub_DB_RemoveRubricCriteria (long RubCod); void Rub_DB_RemoveCrsRubricCriteria (long CrsCod); +//----------------------------- Rubric scores --------------------------------- +void Rub_DB_UpdateScore (Rsc_Type_t Type,long Cod,long UsrCod,long CriCod, + double Score); + +double Rub_DB_GetScore (Rsc_Type_t Type,long Cod,long UsrCod,long CriCod); + #endif diff --git a/swad_rubric_type.h b/swad_rubric_type.h index 267fa30f..cc73856a 100644 --- a/swad_rubric_type.h +++ b/swad_rubric_type.h @@ -88,4 +88,11 @@ typedef enum Rub_NEW_RUBRIC, } Rub_ExistingNewRubric_t; +/* Stack node to check is a rubric is recursive */ +struct Rub_Node + { + long RubCod; + struct Rub_Node *Prev; + }; + #endif