Version 14.67.1

This commit is contained in:
Antonio Cañas Vargas 2015-01-25 02:07:04 +01:00
parent 2296f89ac1
commit 0358f6ca96
7 changed files with 68 additions and 40 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora obligatoria."; // Necessita traduccio
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es obligatoria."; // Necessita traduccio
#elif L==1
"The enrollment of students into groups of type <strong>%s</strong> is now mandatory."; // Need Übersetzung
#elif L==2
"The enrollment of students into groups of type <strong>%s</strong> is now mandatory.";
#elif L==3
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora obligatoria.";
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es obligatoria.";
#elif L==4
"The enrollment of students into groups of type <strong>%s</strong> is now mandatory."; // Besoin de traduction
#elif L==5
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora obligatoria."; // Okoteve traducción
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es obligatoria."; // Okoteve traducción
#elif L==6
"La registrazione di studenti nei gruppi di tipo <strong>%s</strong> &egrave; 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&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora voluntaria."; // Necessita traduccio
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es voluntaria."; // Necessita traduccio
#elif L==1
"The enrollment of students into groups of type <strong>%s</strong> is now voluntary."; // Need Übersetzung
#elif L==2
"The enrollment of students into groups of type <strong>%s</strong> is now voluntary.";
#elif L==3
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora voluntaria.";
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es voluntaria.";
#elif L==4
"The enrollment of students into groups of type <strong>%s</strong> is now voluntary."; // Besoin de traduction
#elif L==5
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> es ahora voluntaria."; // Okoteve traducción
"La adscripci&oacute;n de estudiantes a grupos del tipo <strong>%s</strong> ahora es voluntaria."; // Okoteve traducción
#elif L==6
"La registrazione di studenti nei gruppi di tipo <strong>%s</strong> &egrave; 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&ordm; m&aacute;ximo de estudiantes"
" del grupo <strong>%s</strong> es ahora <strong>%u</strong>."; // Necessita traduccio
" del grupo <strong>%s</strong> ahora es <strong>%u</strong>."; // Necessita traduccio
#elif L==1
"The maximum number of students"
" in the group <strong>%s</strong> is now <strong>%u</strong>."; // 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 <strong>%s</strong> is now <strong>%u</strong>.";
#elif L==3
"El n&ordm; m&aacute;ximo de estudiantes"
" del grupo <strong>%s</strong> es ahora <strong>%u</strong>.";
" del grupo <strong>%s</strong> ahora es <strong>%u</strong>.";
#elif L==4
"The maximum number of students"
" in the group <strong>%s</strong> is now <strong>%u</strong>."; // Besoin de traduction
#elif L==5
"El n&ordm; m&aacute;ximo de estudiantes"
" del grupo <strong>%s</strong> es ahora <strong>%u</strong>."; // Okoteve traducción
" del grupo <strong>%s</strong> ahora es <strong>%u</strong>."; // Okoteve traducción
#elif L==6
"Il numero massimo di studenti"
" nel gruppo <strong>%s</strong> &egrave; ora <strong>%u</strong>.";
@ -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&uacute;mero de filas es ahora <strong>%u</strong>."; // Necessita traduccio
"El n&uacute;mero de filas ahora es <strong>%u</strong>."; // Necessita traduccio
#elif L==1
"Die Anzahl der Zeilen ist jetzt <strong>%u</strong>.";
#elif L==2
"The number of rows is now <strong>%u</strong>.";
#elif L==3
"El n&uacute;mero de filas es ahora <strong>%u</strong>.";
"El n&uacute;mero de filas ahora es <strong>%u</strong>.";
#elif L==4
"The number of rows is now <strong>%u</strong>."; // Besoin de traduction
#elif L==5
"El n&uacute;mero de filas es ahora <strong>%u</strong>."; // Okoteve traducción
"El n&uacute;mero de filas ahora es <strong>%u</strong>."; // Okoteve traducción
#elif L==6
"Il numero di righe &egrave; ora <strong>%u</strong>.";
#elif L==7

View File

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