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);