From 0358f6ca96f581650c436dd343e01f855584901b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Sun, 25 Jan 2015 02:07:04 +0100 Subject: [PATCH] Version 14.67.1 --- swad_changelog.h | 3 ++- swad_file_browser.c | 35 +++++++++++++++++++++++------------ swad_file_browser.h | 4 +++- swad_mark.c | 36 +++++++++++++++++++++++++----------- swad_notification.c | 2 +- swad_text.c | 24 ++++++++++++------------ swad_web_service.c | 4 ++-- 7 files changed, 68 insertions(+), 40 deletions(-) diff --git a/swad_changelog.h b/swad_changelog.h index 1e9c7c69b..13abc5d1f 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -39,11 +39,12 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.67 (2015/01/25)" +#define Log_PLATFORM_VERSION "SWAD 14.67.1 (2015/01/25)" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h | tail -1 /* + Version 14.67.1: Jan 25, 2015 Fixed bugs in file browsers. (175395 lines) Version 14.67: Jan 25, 2015 Changes in files table. (175369 lines) 16 changes necessary in database: ALTER TABLE files ADD COLUMN ZoneUsrCod2 INT NOT NULL DEFAULT -1 AFTER FileBrowser; diff --git a/swad_file_browser.c b/swad_file_browser.c index 5491c2c31..d289ea35b 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -96,7 +96,7 @@ const char *Brw_Licenses_DB[Brw_NUM_LICENSES] = }; */ // Brosers types for database "files" table -static const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER] = +const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER] = { Brw_FILE_BRW_UNKNOWN, // Brw_FILE_BRW_UNKNOWN = 0, Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS, // Brw_FILE_BRW_SEE_DOCUMENTS_CRS = 1, @@ -1331,7 +1331,6 @@ static void Brw_ChangeFileOrFolderHiddenInDB (const char *Path,bool IsHidden); static void Brw_ChangeFilePublicInDB (long PublisherUsrCod,const char *Path, bool IsPublic,Brw_License_t License); -static long Brw_GetCodForFiles (void); static long Brw_GetZoneUsrCodForFiles (void); static void Brw_RemoveOneFileOrFolderFromDB (const char *Path); @@ -6899,6 +6898,8 @@ static bool Brw_PasteTreeIntoFolder (const char *PathOrg,const char *PathDstInTr char PathDstWithFile[PATH_MAX+1]; struct stat FileStatus; struct dirent **FileList; + bool AdminMarks; + struct MarksProperties Marks; int NumFileInThisDir; int NumFilesInThisDir; unsigned NumLevls; @@ -6972,16 +6973,21 @@ static bool Brw_PasteTreeIntoFolder (const char *PathOrg,const char *PathDstInTr } /***** If the target file browser is that of marks, only HTML files are allowed *****/ - if (Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_CRS || - Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_GRP) + AdminMarks = Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_CRS || + Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_GRP; + if (AdminMarks) + { /* Check extension of the file */ - if (!Str_FileIsHTML (FileNameOrg)) + if (Str_FileIsHTML (FileNameOrg)) + Mrk_CheckFileOfMarks (PathOrg,&Marks); // Gbl.Message contains feedback text + else { sprintf (Gbl.Message,Txt_The_copy_has_stopped_when_trying_to_paste_the_file_X_because_you_can_not_paste_a_file_here_of_a_type_other_than_HTML, FileNameToShow); Lay_ShowAlert (Lay_WARNING,Gbl.Message); return false; } + } /***** Update and check the quota before copying the file *****/ Gbl.FileBrowser.Size.NumFiles++; @@ -7004,6 +7010,10 @@ static bool Brw_PasteTreeIntoFolder (const char *PathOrg,const char *PathDstInTr if (*FirstFilCod <= 0) *FirstFilCod = FilCod; + /* Add a new entry of marks into database */ + if (AdminMarks) + Mrk_AddMarksToDB (FilCod,&Marks); + if (FileType == Brw_IS_FILE) (*NumFilesPasted)++; else // FileType == Brw_IS_LINK @@ -9262,7 +9272,7 @@ void Brw_GetFileMetadataByCod (struct FileMetadata *FileMetadata) /***** Get metadata of a file from database *****/ sprintf (Query,"SELECT FilCod,FileBrowser,Cod,ZoneUsrCod," - ",PublisherUsrCod,FileType,Path,Hidden,Public,License" + "PublisherUsrCod,FileType,Path,Hidden,Public,License" " FROM files" " WHERE FilCod='%ld'", FileMetadata->FilCod); @@ -9655,7 +9665,7 @@ static void Brw_ChangeFilePublicInDB (long PublisherUsrCod,const char *Path, /**** Get code of institution, degree, course, group for expanded folders ****/ /*****************************************************************************/ -static long Brw_GetCodForFiles (void) +long Brw_GetCodForFiles (void) { switch (Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type]) { @@ -9705,24 +9715,25 @@ static long Brw_GetZoneUsrCodForFiles (void) /******** Get code of user in assignment / works for expanded folders ********/ /*****************************************************************************/ -void Brw_GetCrsGrpFromFileMetadata (struct FileMetadata *FileMetadata,long *CrsCod,long *GrpCod) +void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod, + long *CrsCod,long *GrpCod) { struct GroupData GrpDat; - switch (FileMetadata->FileBrowser) + switch (FileBrowser) { case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: case Brw_FILE_BRW_COMMON_CRS: case Brw_FILE_BRW_ASSIGNMENTS_USR: case Brw_FILE_BRW_WORKS_USR: case Brw_FILE_BRW_ADMIN_MARKS_CRS: - *CrsCod = FileMetadata->Cod; + *CrsCod = Cod; *GrpCod = -1L; break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: case Brw_FILE_BRW_COMMON_GRP: case Brw_FILE_BRW_ADMIN_MARKS_GRP: - *GrpCod = GrpDat.GrpCod = FileMetadata->Cod; + *GrpCod = GrpDat.GrpCod = Cod; Grp_GetDataOfGroupByCod (&GrpDat); *CrsCod = GrpDat.CrsCod; break; @@ -10327,7 +10338,7 @@ static void Brw_WriteRowDocData (unsigned *NumDocsNotHidden,MYSQL_ROW row) if (!Brw_CheckIfFileOrFolderIsHidden (&FileMetadata)) { BgColor = Gbl.ColorRows[Gbl.RowEvenOdd]; - Brw_GetCrsGrpFromFileMetadata (&FileMetadata,&CrsCod,&GrpCod); + Brw_GetCrsGrpFromFileMetadata (FileMetadata.FileBrowser,FileMetadata.Cod,&CrsCod,&GrpCod); if (CrsCod > 0 && CrsCod == Gbl.CurrentCrs.Crs.CrsCod) BgColor = VERY_LIGHT_BLUE; diff --git a/swad_file_browser.h b/swad_file_browser.h index cde30a0cc..4a0a1e7e1 100644 --- a/swad_file_browser.h +++ b/swad_file_browser.h @@ -176,7 +176,9 @@ bool Brw_GetFileSizeAndDate (struct FileMetadata *FileMetadata); void Brw_GetAndUpdateFileViews (struct FileMetadata *FileMetadata); void Brw_UpdateMyFileViews (long FilCod); -void Brw_GetCrsGrpFromFileMetadata (struct FileMetadata *FileMetadata,long *CrsCod,long *GrpCod); +long Brw_GetCodForFiles (void); +void Brw_GetCrsGrpFromFileMetadata (Brw_FileBrowser_t FileBrowser,long Cod, + long *CrsCod,long *GrpCod); long Brw_AddPathToDB (long PublisherUsrCod,Brw_FileType_t FileType, const char *Path,bool IsPublic,Brw_License_t License); diff --git a/swad_mark.c b/swad_mark.c index edc1f3177..20f8ff9ba 100644 --- a/swad_mark.c +++ b/swad_mark.c @@ -180,6 +180,8 @@ void Mrk_GetAndWriteNumRowsHeaderAndFooter (Brw_FileType_t FileType, static void Mrk_GetNumRowsHeaderAndFooter (struct MarksProperties *Marks) { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; + long Cod = Brw_GetCodForFiles (); char Query[512+PATH_MAX]; MYSQL_RES *mysql_res; MYSQL_ROW row; @@ -188,12 +190,12 @@ static void Mrk_GetNumRowsHeaderAndFooter (struct MarksProperties *Marks) /***** Get number of rows of header and footer from database *****/ sprintf (Query,"SELECT marks_properties.%s,marks_properties.%s" " FROM files,marks_properties" - " WHERE files.CrsCod='%ld' AND files.GrpCod='%ld' AND files.Path='%s'" + " WHERE files.FileBrowser='%u' AND files.Cod='%ld' AND files.Path='%s'" " AND files.FilCod=marks_properties.FilCod", Mrk_HeadOrFootStr[Brw_HEADER], Mrk_HeadOrFootStr[Brw_FOOTER], - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.CurrentCrs.Grps.GrpCod, + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, Gbl.FileBrowser.Priv.FullPathInTree); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get the number of rows in header and footer"); @@ -245,8 +247,10 @@ void Mrk_ChangeNumRowsFooter (void) static void Mrk_ChangeNumRowsHeaderOrFooter (Brw_HeadOrFoot_t HeaderOrFooter) { + extern const Brw_FileBrowser_t Brw_FileBrowserForDB_files[Brw_NUM_TYPES_FILE_BROWSER]; extern const char *Txt_The_number_of_rows_is_now_X; char UnsignedStr[10+1]; + long Cod; char Query[512+PATH_MAX]; unsigned NumRows; @@ -258,16 +262,19 @@ static void Mrk_ChangeNumRowsHeaderOrFooter (Brw_HeadOrFoot_t HeaderOrFooter) if (sscanf (UnsignedStr,"%u",&NumRows) == 1) { /***** Update properties of marks in the database *****/ + Cod = Brw_GetCodForFiles (); sprintf (Query,"UPDATE marks_properties,files" " SET marks_properties.%s='%u'" - " WHERE files.CrsCod='%ld' AND files.GrpCod='%ld' AND files.Path='%s'" + " WHERE files.FileBrowser='%u' AND files.Cod='%ld' AND files.Path='%s'" " AND files.FilCod=marks_properties.FilCod", Mrk_HeadOrFootStr[HeaderOrFooter],NumRows, - Gbl.CurrentCrs.Crs.CrsCod, - Gbl.CurrentCrs.Grps.GrpCod, + (unsigned) Brw_FileBrowserForDB_files[Gbl.FileBrowser.Type], + Cod, Gbl.FileBrowser.Priv.FullPathInTree); DB_QueryUPDATE (Query,"can not update properties of marks"); + Lay_ShowAlert (Lay_INFO,Query); + /***** Write message of success *****/ sprintf (Gbl.Message,Txt_The_number_of_rows_is_now_X, NumRows); @@ -648,6 +655,9 @@ void Mrk_GetNotifMyMarks (char *SummaryStr,char **ContentStr, MYSQL_RES *mysql_res; MYSQL_ROW row; struct UsrData UsrDat; + unsigned UnsignedNum; + Brw_FileBrowser_t FileBrowser; + long Cod; long CrsCod; long GrpCod; struct MarksProperties Marks; @@ -672,7 +682,7 @@ void Mrk_GetNotifMyMarks (char *SummaryStr,char **ContentStr, ID_GetListIDsFromUsrCod (&UsrDat); /***** Get subject of message from database *****/ - sprintf (Query,"SELECT files.CrsCod,files.GrpCod,files.Path," + sprintf (Query,"SELECT files.FileBrowser,files.Cod,files.Path," "marks_properties.Header,marks_properties.Footer" " FROM files,marks_properties" " WHERE files.FilCod='%ld'" @@ -687,11 +697,15 @@ void Mrk_GetNotifMyMarks (char *SummaryStr,char **ContentStr, /***** Get data of this file of marks *****/ row = mysql_fetch_row (mysql_res); - /* Course code (row[0]) */ - CrsCod = Str_ConvertStrCodToLongCod (row[0]); + /* Get file browser type in database (row[0]) */ + FileBrowser = Brw_FILE_BRW_UNKNOWN; + if (sscanf (row[0],"%u",&UnsignedNum) == 1) + if (UnsignedNum < Brw_NUM_TYPES_FILE_BROWSER) + FileBrowser = (Brw_FileBrowser_t) UnsignedNum; - /* Group code (row[1]) */ - GrpCod = Str_ConvertStrCodToLongCod (row[1]); + /* Course/group code (row[1]) */ + Cod = Str_ConvertStrCodToLongCod (row[1]); + Brw_GetCrsGrpFromFileMetadata (FileBrowser,Cod,&CrsCod,&GrpCod); /* Path (row[2]) */ strncpy (FullPathInTreeFromDBMarksTable,row[2],PATH_MAX); diff --git a/swad_notification.c b/swad_notification.c index 3d62e8bcd..7f5d66a65 100644 --- a/swad_notification.c +++ b/swad_notification.c @@ -621,7 +621,7 @@ static void Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent, { FileMetadata.FilCod = Cod; Brw_GetFileMetadataByCod (&FileMetadata); - Brw_GetCrsGrpFromFileMetadata (&FileMetadata,&CrsCod,&GrpCod); + Brw_GetCrsGrpFromFileMetadata (FileMetadata.FileBrowser,FileMetadata.Cod,&CrsCod,&GrpCod); Str_SplitFullPathIntoPathAndFileName (FileMetadata.Path, PathUntilFileName, FileName); diff --git a/swad_text.c b/swad_text.c index 1651db4e5..7115f2a5c 100644 --- a/swad_text.c +++ b/swad_text.c @@ -38450,17 +38450,17 @@ const char *Txt_The_email_address_X_matches_the_one_you_had_previously_registere const char *Txt_The_enrollment_of_students_into_groups_of_type_X_is_now_mandatory = // Warning: it is very important to include %s in the following sentences #if L==0 - "La adscripción de estudiantes a grupos del tipo %s es ahora obligatoria."; // Necessita traduccio + "La adscripción de estudiantes a grupos del tipo %s ahora es obligatoria."; // Necessita traduccio #elif L==1 "The enrollment of students into groups of type %s is now mandatory."; // Need Übersetzung #elif L==2 "The enrollment of students into groups of type %s is now mandatory."; #elif L==3 - "La adscripción de estudiantes a grupos del tipo %s es ahora obligatoria."; + "La adscripción de estudiantes a grupos del tipo %s ahora es obligatoria."; #elif L==4 "The enrollment of students into groups of type %s is now mandatory."; // Besoin de traduction #elif L==5 - "La adscripción de estudiantes a grupos del tipo %s es ahora obligatoria."; // Okoteve traducción + "La adscripción de estudiantes a grupos del tipo %s ahora es obligatoria."; // Okoteve traducción #elif L==6 "La registrazione di studenti nei gruppi di tipo %s è ora obbligatoria."; #elif L==7 @@ -38471,17 +38471,17 @@ const char *Txt_The_enrollment_of_students_into_groups_of_type_X_is_now_mandator const char *Txt_The_enrollment_of_students_into_groups_of_type_X_is_now_voluntary = // Warning: it is very important to include %s in the following sentences #if L==0 - "La adscripción de estudiantes a grupos del tipo %s es ahora voluntaria."; // Necessita traduccio + "La adscripción de estudiantes a grupos del tipo %s ahora es voluntaria."; // Necessita traduccio #elif L==1 "The enrollment of students into groups of type %s is now voluntary."; // Need Übersetzung #elif L==2 "The enrollment of students into groups of type %s is now voluntary."; #elif L==3 - "La adscripción de estudiantes a grupos del tipo %s es ahora voluntaria."; + "La adscripción de estudiantes a grupos del tipo %s ahora es voluntaria."; #elif L==4 "The enrollment of students into groups of type %s is now voluntary."; // Besoin de traduction #elif L==5 - "La adscripción de estudiantes a grupos del tipo %s es ahora voluntaria."; // Okoteve traducción + "La adscripción de estudiantes a grupos del tipo %s ahora es voluntaria."; // Okoteve traducción #elif L==6 "La registrazione di studenti nei gruppi di tipo %s è ora volontaria."; #elif L==7 @@ -39546,7 +39546,7 @@ const char *Txt_The_maximum_number_of_students_in_the_group_X_has_not_changed = const char *Txt_The_maximum_number_of_students_in_the_group_X_is_now_Y = // Warning: it is very important to include %s and %u in the following sentences #if L==0 "El nº máximo de estudiantes" - " del grupo %s es ahora %u."; // Necessita traduccio + " del grupo %s ahora es %u."; // Necessita traduccio #elif L==1 "The maximum number of students" " in the group %s is now %u."; // Need Übersetzung @@ -39555,13 +39555,13 @@ const char *Txt_The_maximum_number_of_students_in_the_group_X_is_now_Y = // Warn " in the group %s is now %u."; #elif L==3 "El nº máximo de estudiantes" - " del grupo %s es ahora %u."; + " del grupo %s ahora es %u."; #elif L==4 "The maximum number of students" " in the group %s is now %u."; // Besoin de traduction #elif L==5 "El nº máximo de estudiantes" - " del grupo %s es ahora %u."; // Okoteve traducción + " del grupo %s ahora es %u."; // Okoteve traducción #elif L==6 "Il numero massimo di studenti" " nel gruppo %s è ora %u."; @@ -40517,17 +40517,17 @@ const char *Txt_The_number_of_questions_must_be_in_the_interval_X = // Warning: const char *Txt_The_number_of_rows_is_now_X = // Warning: it is very important to include %u in the following sentences #if L==0 - "El número de filas es ahora %u."; // Necessita traduccio + "El número de filas ahora es %u."; // Necessita traduccio #elif L==1 "Die Anzahl der Zeilen ist jetzt %u."; #elif L==2 "The number of rows is now %u."; #elif L==3 - "El número de filas es ahora %u."; + "El número de filas ahora es %u."; #elif L==4 "The number of rows is now %u."; // Besoin de traduction #elif L==5 - "El número de filas es ahora %u."; // Okoteve traducción + "El número de filas ahora es %u."; // Okoteve traducción #elif L==6 "Il numero di righe è ora %u."; #elif L==7 diff --git a/swad_web_service.c b/swad_web_service.c index 511607a81..36ee8e23c 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -3867,7 +3867,7 @@ int swad__getFile (struct soap *soap, "The file requested does not exists"); /***** Set course and group codes *****/ - Brw_GetCrsGrpFromFileMetadata (&FileMetadata, + Brw_GetCrsGrpFromFileMetadata (FileMetadata.FileBrowser,FileMetadata.Cod, &Gbl.CurrentCrs.Crs.CrsCod, &Gbl.CurrentCrs.Grps.GrpCod); @@ -4004,7 +4004,7 @@ int swad__getMarks (struct soap *soap, "You can not get marks from this file"); /***** Set course and group codes *****/ - Brw_GetCrsGrpFromFileMetadata (&FileMetadata, + Brw_GetCrsGrpFromFileMetadata (FileMetadata.FileBrowser,FileMetadata.Cod, &Gbl.CurrentCrs.Crs.CrsCod, &Gbl.CurrentCrs.Grps.GrpCod);