From 300c65113593567c196f91982aae0b5135222f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Thu, 3 Jan 2019 11:32:14 +0100 Subject: [PATCH] Version 18.26.3 --- swad_changelog.h | 7 +++- swad_classroom.c | 101 +++++++++++++++++++++++++++-------------------- swad_classroom.h | 21 +++++----- swad_database.c | 4 +- swad_text.c | 70 ++++++++++++++++---------------- 5 files changed, 110 insertions(+), 93 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index b8909e468..2abbee4c4 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -345,6 +345,8 @@ Buenos d // TODO: Que un grupo tenga asociado un lugar, como un aula, así al hacer un evento de asistencia, podría tener por defecto el lugar asignado al grupo elegido. +// TODO: Refactorize OrderBySubQuery + /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ @@ -364,11 +366,12 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.26.2 (2019-01-02)" +#define Log_PLATFORM_VERSION "SWAD 18.26.3 (2019-01-03)" #define CSS_FILE "swad18.22.css" #define JS_FILE "swad17.17.1.js" /* - Version 18.26.2: Jan 02, 2019 New field location in classrooms table. (238711 lines) + Version 18.26.3: Jan 03, 2019 New column location in classrooms listing. (238725 lines) + Version 18.26.2: Jan 02, 2019 New column location in classrooms table. (238711 lines) 1 change necessary in database: ALTER TABLE classrooms ADD COLUMN Location VARCHAR(2047) NOT NULL AFTER Capacity; diff --git a/swad_classroom.c b/swad_classroom.c index ff33b2675..0e5708487 100644 --- a/swad_classroom.c +++ b/swad_classroom.c @@ -25,7 +25,9 @@ /********************************** Headers **********************************/ /*****************************************************************************/ +#define _GNU_SOURCE // For asprintf #include // For NULL +#include // For asprintf #include // For string functions #include "swad_box.h" @@ -84,8 +86,8 @@ void Cla_SeeClassrooms (void) { extern const char *Hlp_CENTRE_Classrooms; extern const char *Txt_Classrooms; - extern const char *Txt_CLASSROOMS_HELP_ORDER[2]; - extern const char *Txt_CLASSROOMS_ORDER[2]; + extern const char *Txt_CLASSROOMS_HELP_ORDER[Cla_NUM_ORDERS]; + extern const char *Txt_CLASSROOMS_ORDER[Cla_NUM_ORDERS]; extern const char *Txt_New_classroom; Cla_Order_t Order; unsigned NumCla; @@ -103,8 +105,8 @@ void Cla_SeeClassrooms (void) Hlp_CENTRE_Classrooms,Box_NOT_CLOSABLE); Tbl_StartTableWideMargin (2); fprintf (Gbl.F.Out,""); - for (Order = Cla_ORDER_BY_CLASSROOM; - Order <= Cla_ORDER_BY_CAPACITY; + for (Order = (Cla_Order_t) 0; + Order <= (Cla_Order_t) (Cla_NUM_ORDERS - 1); Order++) { fprintf (Gbl.F.Out,""); @@ -136,7 +138,11 @@ void Cla_SeeClassrooms (void) Gbl.Classrooms.Lst[NumCla].FullName); Cla_WriteCapacity (Gbl.Classrooms.Lst[NumCla].Capacity); fprintf (Gbl.F.Out,"" - ""); + "" + "%s" + "" + "", + Gbl.Classrooms.Lst[NumCla].Location); } /***** End table *****/ @@ -261,7 +267,7 @@ void Cla_PutIconToViewClassrooms (void) void Cla_GetListClassrooms (void) { - char OrderBySubQuery[256]; + char *OrderBySubQuery; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -269,26 +275,41 @@ void Cla_GetListClassrooms (void) struct Classroom *Cla; /***** Get classrooms from database *****/ + /* Build order subquery */ switch (Gbl.Classrooms.SelectedOrder) { case Cla_ORDER_BY_CLASSROOM: - sprintf (OrderBySubQuery,"FullName"); + if (asprintf (&OrderBySubQuery,"FullName") < 0) + Lay_NotEnoughMemoryExit (); break; case Cla_ORDER_BY_CAPACITY: - sprintf (OrderBySubQuery,"Capacity DESC,FullName"); + if (asprintf (&OrderBySubQuery,"Capacity DESC," + "FullName") < 0) + Lay_NotEnoughMemoryExit (); + break; + case Cla_ORDER_BY_LOCATION: + if (asprintf (&OrderBySubQuery,"Location DESC," + "FullName") < 0) + Lay_NotEnoughMemoryExit (); break; } + + /* Build query */ NumRows = DB_QuerySELECT (&mysql_res,"can not get classrooms", "SELECT ClaCod," "ShortName," "FullName," - "Capacity" + "Capacity," + "Location" " FROM classrooms" " WHERE CtrCod=%ld" " ORDER BY %s", Gbl.CurrentCtr.Ctr.CtrCod, OrderBySubQuery); + /* Free allocated memory for subquery */ + free ((void *) OrderBySubQuery); + /***** Count number of rows in result *****/ if (NumRows) // Classrooms found... { @@ -314,15 +335,19 @@ void Cla_GetListClassrooms (void) /* Get the short name of the classroom (row[1]) */ Str_Copy (Cla->ShrtName,row[1], - Cla_MAX_BYTES_CLASSROOM_SHRT_NAME); + Cla_MAX_BYTES_SHRT_NAME); /* Get the full name of the classroom (row[2]) */ Str_Copy (Cla->FullName,row[2], - Cla_MAX_BYTES_CLASSROOM_FULL_NAME); + Cla_MAX_BYTES_FULL_NAME); /* Get seating capacity in this classroom (row[3]) */ if (sscanf (row[3],"%u",&Cla->Capacity) != 1) Cla->Capacity = Cla_UNLIMITED_CAPACITY; + + /* Get the full name of the classroom (row[4]) */ + Str_Copy (Cla->Location,row[4], + Cla_MAX_BYTES_LOCATION); } } else @@ -338,8 +363,6 @@ void Cla_GetListClassrooms (void) void Cla_GetDataOfClassroomByCod (struct Classroom *Cla) { - extern const char *Txt_Classroom_unspecified; - extern const char *Txt_Another_classroom; MYSQL_RES *mysql_res; MYSQL_ROW row; unsigned long NumRows; @@ -348,29 +371,17 @@ void Cla_GetDataOfClassroomByCod (struct Classroom *Cla) Cla->ShrtName[0] = '\0'; Cla->FullName[0] = '\0'; Cla->Capacity = Cla_UNLIMITED_CAPACITY; + Cla->Location[0] = '\0'; /***** Check if classroom code is correct *****/ - if (Cla->ClaCod < 0) - { - Str_Copy (Cla->ShrtName,Txt_Classroom_unspecified, - Cla_MAX_BYTES_CLASSROOM_SHRT_NAME); - Str_Copy (Cla->FullName,Txt_Classroom_unspecified, - Cla_MAX_BYTES_CLASSROOM_FULL_NAME); - } - else if (Cla->ClaCod == 0) - { - Str_Copy (Cla->ShrtName,Txt_Another_classroom, - Cla_MAX_BYTES_CLASSROOM_SHRT_NAME); - Str_Copy (Cla->FullName,Txt_Another_classroom, - Cla_MAX_BYTES_CLASSROOM_FULL_NAME); - } - else if (Cla->ClaCod > 0) + if (Cla->ClaCod > 0) { /***** Get data of a classroom from database *****/ NumRows = DB_QuerySELECT (&mysql_res,"can not get data of a classroom", "SELECT ShortName," "FullName," - "Capacity" + "Capacity," + "Location" " FROM classrooms" " WHERE ClaCod=%ld", Cla->ClaCod); @@ -383,15 +394,19 @@ void Cla_GetDataOfClassroomByCod (struct Classroom *Cla) /* Get the short name of the classroom (row[0]) */ Str_Copy (Cla->ShrtName,row[0], - Cla_MAX_BYTES_CLASSROOM_SHRT_NAME); + Cla_MAX_BYTES_SHRT_NAME); /* Get the full name of the classroom (row[1]) */ Str_Copy (Cla->FullName,row[1], - Cla_MAX_BYTES_CLASSROOM_FULL_NAME); + Cla_MAX_BYTES_FULL_NAME); /* Get seating capacity in this classroom (row[2]) */ if (sscanf (row[2],"%u",&Cla->Capacity) != 1) Cla->Capacity = Cla_UNLIMITED_CAPACITY; + + /* Get the location of the classroom (row[3]) */ + Str_Copy (Cla->Location,row[3], + Cla_MAX_BYTES_LOCATION); } /***** Free structure that stores the query result *****/ @@ -457,7 +472,7 @@ static void Cla_ListClassroomsForEdition (void) " maxlength=\"%u\" value=\"%s\"" " class=\"INPUT_SHORT_NAME\"" " onchange=\"document.getElementById('%s').submit();\" />", - Cla_MAX_CHARS_CLASSROOM_SHRT_NAME,Cla->ShrtName,Gbl.Form.Id); + Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName,Gbl.Form.Id); Frm_EndForm (); fprintf (Gbl.F.Out,""); @@ -469,7 +484,7 @@ static void Cla_ListClassroomsForEdition (void) " maxlength=\"%u\" value=\"%s\"" " class=\"INPUT_FULL_NAME\"" " onchange=\"document.getElementById('%s').submit();\" />", - Cla_MAX_CHARS_CLASSROOM_FULL_NAME,Cla->FullName,Gbl.Form.Id); + Cla_MAX_CHARS_FULL_NAME,Cla->FullName,Gbl.Form.Id); Frm_EndForm (); fprintf (Gbl.F.Out,""); @@ -574,7 +589,7 @@ static void Cla_RenameClassroom (Cns_ShrtOrFullName_t ShrtOrFullName) const char *FieldName = NULL; // Initialized to avoid warning unsigned MaxBytes = 0; // Initialized to avoid warning char *CurrentClaName = NULL; // Initialized to avoid warning - char NewClaName[Cla_MAX_BYTES_CLASSROOM_FULL_NAME + 1]; + char NewClaName[Cla_MAX_BYTES_FULL_NAME + 1]; Cla = &Gbl.Classrooms.EditingCla; switch (ShrtOrFullName) @@ -582,13 +597,13 @@ static void Cla_RenameClassroom (Cns_ShrtOrFullName_t ShrtOrFullName) case Cns_SHRT_NAME: ParamName = "ShortName"; FieldName = "ShortName"; - MaxBytes = Cla_MAX_BYTES_CLASSROOM_SHRT_NAME; + MaxBytes = Cla_MAX_BYTES_SHRT_NAME; CurrentClaName = Cla->ShrtName; break; case Cns_FULL_NAME: ParamName = "FullName"; FieldName = "FullName"; - MaxBytes = Cla_MAX_BYTES_CLASSROOM_FULL_NAME; + MaxBytes = Cla_MAX_BYTES_FULL_NAME; CurrentClaName = Cla->FullName; break; } @@ -705,7 +720,7 @@ void Cla_ChangeMaxStudents (void) NewCapacity = (unsigned) Par_GetParToUnsignedLong ("Capacity", 0, - Cla_MAX_CAPACITY_OF_A_CLASSROOM, + Cla_MAX_CAPACITY, Cla_UNLIMITED_CAPACITY); /***** Get data of the classroom from database *****/ @@ -752,7 +767,7 @@ void Cla_ChangeMaxStudents (void) static void Cla_WriteCapacity (unsigned Capacity) { - if (Capacity <= Cla_MAX_CAPACITY_OF_A_CLASSROOM) + if (Capacity <= Cla_MAX_CAPACITY) fprintf (Gbl.F.Out,"%u",Capacity); } @@ -793,7 +808,7 @@ static void Cla_PutFormToCreateClassroom (void) " class=\"INPUT_SHORT_NAME\"" " required=\"required\" />" "", - Cla_MAX_CHARS_CLASSROOM_SHRT_NAME,Cla->ShrtName); + Cla_MAX_CHARS_SHRT_NAME,Cla->ShrtName); /***** Classroom full name *****/ fprintf (Gbl.F.Out,"" @@ -802,7 +817,7 @@ static void Cla_PutFormToCreateClassroom (void) " class=\"INPUT_FULL_NAME\"" " required=\"required\" />" "", - Cla_MAX_CHARS_CLASSROOM_FULL_NAME,Cla->FullName); + Cla_MAX_CHARS_FULL_NAME,Cla->FullName); /***** Seating capacity *****/ fprintf (Gbl.F.Out,"" @@ -866,16 +881,16 @@ void Cla_RecFormNewClassroom (void) /***** Get parameters from form *****/ /* Get classroom short name */ - Par_GetParToText ("ShortName",Cla->ShrtName,Cla_MAX_BYTES_CLASSROOM_SHRT_NAME); + Par_GetParToText ("ShortName",Cla->ShrtName,Cla_MAX_BYTES_SHRT_NAME); /* Get classroom full name */ - Par_GetParToText ("FullName",Cla->FullName,Cla_MAX_BYTES_CLASSROOM_FULL_NAME); + Par_GetParToText ("FullName",Cla->FullName,Cla_MAX_BYTES_FULL_NAME); /* Get seating capacity */ Cla->Capacity = (unsigned) Par_GetParToUnsignedLong ("Capacity", 0, - Cla_MAX_CAPACITY_OF_A_CLASSROOM, + Cla_MAX_CAPACITY, Cla_UNLIMITED_CAPACITY); if (Cla->ShrtName[0] && Cla->FullName[0]) // If there's a classroom name diff --git a/swad_classroom.h b/swad_classroom.h index e777ba188..64c457af3 100644 --- a/swad_classroom.h +++ b/swad_classroom.h @@ -33,15 +33,15 @@ /************************** Public types and constants ***********************/ /*****************************************************************************/ -#define Cla_MAX_CHARS_CLASSROOM_SHRT_NAME (32 - 1) // 31 -#define Cla_MAX_BYTES_CLASSROOM_SHRT_NAME ((Cla_MAX_CHARS_CLASSROOM_SHRT_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 511 +#define Cla_MAX_CHARS_SHRT_NAME (32 - 1) // 31 +#define Cla_MAX_BYTES_SHRT_NAME ((Cla_MAX_CHARS_SHRT_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 511 -#define Cla_MAX_CHARS_CLASSROOM_FULL_NAME (128 - 1) // 127 -#define Cla_MAX_BYTES_CLASSROOM_FULL_NAME ((Cla_MAX_CHARS_CLASSROOM_FULL_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 +#define Cla_MAX_CHARS_FULL_NAME (128 - 1) // 127 +#define Cla_MAX_BYTES_FULL_NAME ((Cla_MAX_CHARS_FULL_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 -#define Cla_MAX_CAPACITY_OF_A_CLASSROOM 10000 // If capacity of a classroom is greater than this, it is considered infinite -#define Cla_UNLIMITED_CAPACITY INT_MAX // This number can be stored in database as an integer... - // ...and means that a classroom has no limited capacity +#define Cla_MAX_CAPACITY 10000 // If capacity of a classroom is greater than this, it is considered infinite +#define Cla_UNLIMITED_CAPACITY INT_MAX // This number can be stored in database as an integer... + // ...and means that a classroom has no limited capacity #define Cla_MAX_CHARS_LOCATION (128 - 1) // 127 #define Cla_MAX_BYTES_LOCATION ((Cla_MAX_CHARS_LOCATION + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 @@ -50,17 +50,18 @@ struct Classroom { long ClaCod; long InsCod; - char ShrtName[Cla_MAX_BYTES_CLASSROOM_SHRT_NAME + 1]; - char FullName[Cla_MAX_BYTES_CLASSROOM_FULL_NAME + 1]; + char ShrtName[Cla_MAX_BYTES_SHRT_NAME + 1]; + char FullName[Cla_MAX_BYTES_FULL_NAME + 1]; unsigned Capacity; // Seating capacity (maximum number of people that fit in the room) char Location[Cla_MAX_BYTES_LOCATION + 1]; // Examples: Ground floor, first floor, basement }; -#define Cla_NUM_ORDERS 2 +#define Cla_NUM_ORDERS 3 typedef enum { Cla_ORDER_BY_CLASSROOM = 0, Cla_ORDER_BY_CAPACITY = 1, + Cla_ORDER_BY_LOCATION = 2, } Cla_Order_t; #define Cla_ORDER_DEFAULT Cla_ORDER_BY_CLASSROOM diff --git a/swad_database.c b/swad_database.c index 66683d7d4..dcd1034d7 100644 --- a/swad_database.c +++ b/swad_database.c @@ -482,8 +482,8 @@ mysql> DESCRIBE classrooms; DB_CreateTable ("CREATE TABLE IF NOT EXISTS classrooms (" "ClaCod INT NOT NULL AUTO_INCREMENT," "CtrCod INT NOT NULL," - "ShortName VARCHAR(511) NOT NULL," // Cla_MAX_BYTES_CLASSROOM_SHRT_NAME - "FullName VARCHAR(2047) NOT NULL," // Cla_MAX_BYTES_CLASSROOM_FULL_NAME + "ShortName VARCHAR(511) NOT NULL," // Cla_MAX_BYTES_SHRT_NAME + "FullName VARCHAR(2047) NOT NULL," // Cla_MAX_BYTES_FULL_NAME "Capacity INT NOT NULL," "Location VARCHAR(2047) NOT NULL," // Cla_MAX_BYTES_LOCATION "UNIQUE INDEX(ClaCod)," diff --git a/swad_text.c b/swad_text.c index 1703cbeca..ec9f8f051 100644 --- a/swad_text.c +++ b/swad_text.c @@ -1642,27 +1642,6 @@ const char *Txt_Another_centre = "Outro centro"; #endif -const char *Txt_Another_classroom = -#if L==1 // ca - "Una altra aula"; -#elif L==2 // de - "Ein weiterer Klassenzimmer"; -#elif L==3 // en - "Another classroom"; -#elif L==4 // es - "Otra aula"; -#elif L==5 // fr - "Une autre salle de classe"; -#elif L==6 // gn - "Otra aula"; // Okoteve traducción -#elif L==7 // it - "Un'altra aula"; -#elif L==8 // pl - "Innym klasa"; -#elif L==9 // pt - "Outra sala de aula"; -#endif - const char *Txt_Another_country = #if L==1 // ca "Un altre país"; @@ -3918,7 +3897,7 @@ const char *Txt_Classroom_X_removed = // Warning: it is very important to includ const char *Txt_CLASSROOMS_HELP_ORDER[Cla_NUM_ORDERS] = { #if L==1 // ca - "Ordenar por aula" // Necessita traduccio + "Ordenar per aula" #elif L==2 // de "Nach Klassenzimmer sortieren" #elif L==3 // en @@ -3955,6 +3934,26 @@ const char *Txt_CLASSROOMS_HELP_ORDER[Cla_NUM_ORDERS] = "Sortuj wed&lsgtrok;ug pojemności miejsc" #elif L==9 // pt "Ordenar por capacidade" +#endif + , +#if L==1 // ca + "Ordenar per ubicació" +#elif L==2 // de + "Nach Standort sortieren" +#elif L==3 // en + "Sort by location" +#elif L==4 // es + "Ordenar por ubicación" +#elif L==5 // fr + "Trier par emplacement" +#elif L==6 // gn + "Ordenar por ubicación" // Okoteve traducción +#elif L==7 // it + "Ordina per posizione" +#elif L==8 // pl + "Sortuj wedlug lokacja" +#elif L==9 // pt + "Classificar por localização" #endif }; @@ -3999,28 +3998,27 @@ const char *Txt_CLASSROOMS_ORDER[Cla_NUM_ORDERS] = #elif L==9 // pt "Capacidade" #endif - }; - -const char *Txt_Classroom_unspecified = + , #if L==1 // ca - "Aula sense especificar"; + "Ubicació" #elif L==2 // de - "Klassenzimmer nicht spezifiziert"; + "Standort" #elif L==3 // en - "Classroom unspecified"; + "Location" #elif L==4 // es - "Aula sin especificar"; + "Ubicación" #elif L==5 // fr - "Salle de classe non spécifiée"; + "Emplacement" #elif L==6 // gn - "Aula sin especificar"; // Okoteve traducción + "Ñemohenda" #elif L==7 // it - "Aula non specificata"; + "Posizione" #elif L==8 // pl - "Klasa nieokreslone"; + "Lokacja" #elif L==9 // pt - "Sala de aula indeterminada"; + "Localização" #endif + }; const char *Txt_Classrooms = #if L==1 // ca @@ -17150,7 +17148,7 @@ const char *Txt_Location = #elif L==5 // fr "Emplacement"; #elif L==6 // gn - "Ubicación"; // Okoteve traducción + "Tenda"; #elif L==7 // it "Posizione"; #elif L==8 // pl @@ -17171,7 +17169,7 @@ const char *Txt_Locations = #elif L==5 // fr "Emplacements"; #elif L==6 // gn - "Ubicación"; // Okoteve traducción + "Tenda"; #elif L==7 // it "Posizioni"; #elif L==8 // pl