diff --git a/sql/cambios.sql b/sql/cambios.sql index 647da0236..4f2d80be8 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -10358,7 +10358,9 @@ UPDATE usr_last SET WhatToSearch=WhatToSearch+1 WHERE WhatToSearch>=7; ----- 2014-10-05, swad14.1.2 -ALTER TABLE debug ADD COLUMN DbgCod INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (DbgCod); +ALTER TABLE debug ADD COLUMN DbgCod INT NOT NULL AUTO_INCREMENT FIRST + + ----- 2014-10-07, swad14.4 @@ -10454,4 +10456,10 @@ ALTER TABLE IP_prefs ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER IconSet; ALTER TABLE usr_data DROP COLUMN WWW,DROP COLUMN Twitter,DROP COLUMN Skype; -SELECT DegCod,CtrCod,DegTypCod,Status,RequesterUsrCod,ShortName,FullName,FirstYear,LastYear,OptYear,WWW FROM degrees; \ No newline at end of file +SELECT DegCod,CtrCod,DegTypCod,Status,RequesterUsrCod,ShortName,FullName,FirstYear,LastYear,OptYear,WWW FROM degrees; + +----- 2015-01-20, swad14.59.4 + +ALTER TABLE clipboard ADD COLUMN InsCod INT NOT NULL DEFAULT -1 AFTER FileBrowser, ADD INDEX (InsCod); +ALTER TABLE clipboard ADD COLUMN CtrCod INT NOT NULL DEFAULT -1 AFTER InsCod, ADD INDEX (CtrCod); +ALTER TABLE clipboard ADD COLUMN DegCod INT NOT NULL DEFAULT -1 AFTER CtrCod, ADD INDEX (DegCod); \ No newline at end of file diff --git a/swad_centre.c b/swad_centre.c index 77b180619..eaac46bbf 100644 --- a/swad_centre.c +++ b/swad_centre.c @@ -1423,8 +1423,15 @@ void Ctr_RemoveCentre (void) Lay_ShowAlert (Lay_WARNING,Txt_To_remove_a_centre_you_must_first_remove_all_degrees_and_teachers_in_the_centre); else // Centre has no teachers ==> remove it { + /***** Remove information related to files in centre *****/ + /* Remove clipboards related to the centre */ + sprintf (Query,"DELETE FROM clipboard WHERE CtrCod='%ld'", + Ctr.CtrCod); + DB_QueryDELETE (Query,"can not remove clipboards in a centre"); + /***** Remove centre *****/ - sprintf (Query,"DELETE FROM centres WHERE CtrCod='%ld'",Ctr.CtrCod); + sprintf (Query,"DELETE FROM centres WHERE CtrCod='%ld'", + Ctr.CtrCod); DB_QueryDELETE (Query,"can not remove a centre"); /***** Write message to show the change made *****/ diff --git a/swad_changelog.h b/swad_changelog.h index 65c9b10a9..02e8cd245 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -39,11 +39,18 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.59.3 (2015/01/20)" +#define Log_PLATFORM_VERSION "SWAD 14.60 (2015/01/20)" // 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 /* +TODO: adapt tables files and file_view !!!!! + Version 14.60: Jan 20, 2015 See/admin documents of degree, centre and institution (not finished). (175079 lines) + 3 changes necessary in database: +ALTER TABLE clipboard ADD COLUMN InsCod INT NOT NULL DEFAULT -1 AFTER FileBrowser, ADD INDEX (InsCod); +ALTER TABLE clipboard ADD COLUMN CtrCod INT NOT NULL DEFAULT -1 AFTER InsCod, ADD INDEX (CtrCod); +ALTER TABLE clipboard ADD COLUMN DegCod INT NOT NULL DEFAULT -1 AFTER CtrCod, ADD INDEX (DegCod); + Version 14.59.3: Jan 20, 2015 See/admin documents of degree, centre and institution (not finished). (174862 lines) Version 14.59.2: Jan 19, 2015 See/admin documents of degree, centre and institution (not finished). (174864 lines) Version 14.59.1: Jan 19, 2015 See/admin documents of degree, centre and institution (not finished). (174711 lines) diff --git a/swad_database.c b/swad_database.c index 9ddc4cf76..9b86c622f 100644 --- a/swad_database.c +++ b/swad_database.c @@ -435,6 +435,9 @@ mysql> DESCRIBE clipboard; +-------------+------------+------+-----+-------------------+-----------------------------+ | UsrCod | int(11) | NO | PRI | NULL | | | FileBrowser | tinyint(4) | NO | MUL | NULL | | +| InsCod | int(11) | NO | MUL | -1 | | +| CtrCod | int(11) | NO | MUL | -1 | | +| DegCod | int(11) | NO | MUL | -1 | | | CrsCod | int(11) | NO | MUL | -1 | | | GrpCod | int(11) | NO | | NULL | | | WorksUsrCod | int(11) | NO | | NULL | | @@ -442,18 +445,21 @@ mysql> DESCRIBE clipboard; | Path | text | NO | | NULL | | | CopyTime | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------------+------------+------+-----+-------------------+-----------------------------+ -8 rows in set (0.00 sec) +11 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS clipboard (" "UsrCod INT NOT NULL," "FileBrowser TINYINT NOT NULL," + "InsCod INT NOT NULL DEFAULT -1," + "CtrCod INT NOT NULL DEFAULT -1," + "DegCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1," "GrpCod INT NOT NULL," "WorksUsrCod INT NOT NULL," "FileType TINYINT NOT NULL DEFAULT 0," "Path TEXT COLLATE latin1_bin NOT NULL," "CopyTime TIMESTAMP," - "UNIQUE INDEX(UsrCod),INDEX(FileBrowser),INDEX(CrsCod))"); + "UNIQUE INDEX(UsrCod),INDEX(FileBrowser),INDEX(InsCod),INDEX(CtrCod),INDEX(DegCod),INDEX(CrsCod))"); /***** Table connected *****/ /* diff --git a/swad_degree.c b/swad_degree.c index 54568d1f0..01a1aaac4 100644 --- a/swad_degree.c +++ b/swad_degree.c @@ -3182,12 +3182,20 @@ static void Deg_RemoveDegreeCompletely (long DegCod) For_FORUM_DEGREE_USRS,For_FORUM_DEGREE_TCHS,DegCod); DB_QueryDELETE (Query,"can not remove threads in forums of a degree"); + /***** Remove information related to files in degree *****/ + /* Remove clipboards related to the degree */ + sprintf (Query,"DELETE FROM clipboard WHERE DegCod='%ld'", + DegCod); + DB_QueryDELETE (Query,"can not remove clipboards in a degree"); + /***** Remove administrators of this degree *****/ - sprintf (Query,"DELETE FROM deg_admin WHERE DegCod='%ld'",DegCod); + sprintf (Query,"DELETE FROM deg_admin WHERE DegCod='%ld'", + DegCod); DB_QueryDELETE (Query,"can not remove administrators of a degree"); /***** Remove the degree *****/ - sprintf (Query,"DELETE FROM degrees WHERE DegCod='%ld'",DegCod); + sprintf (Query,"DELETE FROM degrees WHERE DegCod='%ld'", + DegCod); DB_QueryDELETE (Query,"can not remove a degree"); /***** Delete all the degrees in sta_degrees table not present in degrees table *****/ diff --git a/swad_enrollment.c b/swad_enrollment.c index 28dc4ec72..9ab998fb1 100644 --- a/swad_enrollment.c +++ b/swad_enrollment.c @@ -3221,7 +3221,7 @@ static void Enr_EffectivelyRemUsrFromCrs (struct UsrData *UsrDat,struct Course * /***** Remove fields of this user in its course record *****/ Rec_RemoveFieldsCrsRecordInCrs (UsrDat->UsrCod,Crs,QuietOrVerbose); - /***** Remove user's clipboard in course *****/ + /***** Remove user's clipboard *****/ Brw_RemoveUsrClipboardInCrs (UsrDat->UsrCod,Crs->CrsCod); /***** Remove user's expanded folders in course *****/ diff --git a/swad_file_browser.c b/swad_file_browser.c index 11de35917..75f75b85a 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -2054,42 +2054,42 @@ static void Brw_SetPathFileBrowser (void) case Brw_FILE_BRW_SEE_DOCUMENTS_INS: case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: sprintf (Path,"%s/%s", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_INS); + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS); Fil_CreateDirIfNotExists (Path); sprintf (Path,"%s/%s/%02u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_INS, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS, (unsigned) (Gbl.CurrentIns.Ins.InsCod % 100)); Fil_CreateDirIfNotExists (Path); sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_INS, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS, (unsigned) (Gbl.CurrentIns.Ins.InsCod % 100), (unsigned) Gbl.CurrentIns.Ins.InsCod); break; case Brw_FILE_BRW_SEE_DOCUMENTS_CTR: case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: sprintf (Path,"%s/%s", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR); + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR); Fil_CreateDirIfNotExists (Path); sprintf (Path,"%s/%s/%02u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR, (unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100)); Fil_CreateDirIfNotExists (Path); sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR, (unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100), (unsigned) Gbl.CurrentCtr.Ctr.CtrCod); break; case Brw_FILE_BRW_SEE_DOCUMENTS_DEG: case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: sprintf (Path,"%s/%s", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_DEG); + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG); Fil_CreateDirIfNotExists (Path); sprintf (Path,"%s/%s/%02u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_DEG, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG, (unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100)); Fil_CreateDirIfNotExists (Path); sprintf (Gbl.FileBrowser.Priv.PathAboveRootFolder,"%s/%s/%02u/%u", - Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_DEG, + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG, (unsigned) (Gbl.CurrentDeg.Deg.DegCod % 100), (unsigned) Gbl.CurrentDeg.Deg.DegCod); break; @@ -3951,9 +3951,15 @@ static bool Brw_WriteRowFileBrowser (unsigned Level, bool IsRecent = false; struct FileMetadata FileMetadata; char FileNameToShow[NAME_MAX+1]; - bool SeeDocsZone = Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_CRS || + bool SeeDocsZone = Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_INS || + Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_CTR || + Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_DEG || + Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_CRS || Gbl.FileBrowser.Type == Brw_FILE_BRW_SEE_DOCUMENTS_GRP; - bool AdminDocsZone = Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS || + bool AdminDocsZone = Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_INS || + Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR || + Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG || + Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS || Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP; bool CommonZone = Gbl.FileBrowser.Type == Brw_FILE_BRW_COMMON_CRS || Gbl.FileBrowser.Type == Brw_FILE_BRW_COMMON_GRP; @@ -5479,6 +5485,9 @@ static void Brw_WriteCurrentClipboard (void) extern const char *Txt_works_zone; extern const char *Txt_marks_management_zone; extern const char *Txt_private_storage_zone; + extern const char *Txt_institution; + extern const char *Txt_centre; + extern const char *Txt_degree; extern const char *Txt_course; extern const char *Txt_group; extern const char *Txt_user[Usr_NUM_SEXS]; @@ -5487,6 +5496,9 @@ static void Brw_WriteCurrentClipboard (void) extern const char *Txt_file; extern const char *Txt_folder; extern const char *Txt_link; + struct Institution Ins; + struct Centre Ctr; + struct Degree Deg; struct Course Crs; struct GroupData GrpDat; struct UsrData UsrDat; @@ -5496,8 +5508,26 @@ static void Brw_WriteCurrentClipboard (void) if (Gbl.FileBrowser.Clipboard.FileBrowser != Brw_FILE_BRW_BRIEFCASE_USR) { - Crs.CrsCod = Gbl.FileBrowser.Clipboard.CrsCod; - Crs_GetDataOfCourseByCod (&Crs); + if (Gbl.FileBrowser.Clipboard.CrsCod > 0) + { + Crs.CrsCod = Gbl.FileBrowser.Clipboard.CrsCod; + Crs_GetDataOfCourseByCod (&Crs); + } + else if (Gbl.FileBrowser.Clipboard.DegCod > 0) + { + Deg.DegCod = Gbl.FileBrowser.Clipboard.DegCod; + Deg_GetDataOfDegreeByCod (&Deg); + } + else if (Gbl.FileBrowser.Clipboard.CtrCod > 0) + { + Ctr.CtrCod = Gbl.FileBrowser.Clipboard.CtrCod; + Ctr_GetDataOfCentreByCod (&Ctr); + } + else if (Gbl.FileBrowser.Clipboard.InsCod > 0) + { + Ins.InsCod = Gbl.FileBrowser.Clipboard.InsCod; + Ins_GetDataOfInstitutionByCod (&Ins,false); + } } fprintf (Gbl.F.Out,"
" @@ -5505,6 +5535,21 @@ static void Brw_WriteCurrentClipboard (void) Txt_Copy_source); switch (Gbl.FileBrowser.Clipboard.FileBrowser) { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + fprintf (Gbl.F.Out,"%s, %s %s", + Txt_documents_management_zone, + Txt_institution,Ins.ShortName); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + fprintf (Gbl.F.Out,"%s, %s %s", + Txt_documents_management_zone, + Txt_centre,Ctr.ShortName); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + fprintf (Gbl.F.Out,"%s, %s %s", + Txt_documents_management_zone, + Txt_degree,Deg.ShortName); + break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: fprintf (Gbl.F.Out,"%s, %s %s", Txt_documents_management_zone, @@ -5635,7 +5680,7 @@ static bool Brw_GetMyClipboard (void) unsigned UnsignedNum; /***** Get my current clipboard from database *****/ - sprintf (Query,"SELECT FileBrowser,CrsCod,GrpCod,WorksUsrCod,FileType,Path" + sprintf (Query,"SELECT FileBrowser,InsCod,CtrCod,DegCod,CrsCod,GrpCod,WorksUsrCod,FileType,Path" " FROM clipboard WHERE UsrCod='%ld'", Gbl.Usrs.Me.UsrDat.UsrCod); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get source of copy from clipboard"); @@ -5645,6 +5690,9 @@ static bool Brw_GetMyClipboard (void) { /***** Clear clipboard data *****/ Gbl.FileBrowser.Clipboard.FileBrowser = Brw_FILE_BRW_UNKNOWN; + Gbl.FileBrowser.Clipboard.InsCod = -1L; + Gbl.FileBrowser.Clipboard.CtrCod = -1L; + Gbl.FileBrowser.Clipboard.DegCod = -1L; Gbl.FileBrowser.Clipboard.CrsCod = -1L; Gbl.FileBrowser.Clipboard.GrpCod = -1L; Gbl.FileBrowser.Clipboard.WorksUsrCod = -1L; @@ -5662,24 +5710,33 @@ static bool Brw_GetMyClipboard (void) { Gbl.FileBrowser.Clipboard.FileBrowser = (Brw_FileBrowser_t) UnsignedNum; - /* Get course code (row[1]) */ - Gbl.FileBrowser.Clipboard.CrsCod = Str_ConvertStrCodToLongCod (row[1]); + /* Get institution code (row[1]) */ + Gbl.FileBrowser.Clipboard.InsCod = Str_ConvertStrCodToLongCod (row[1]); - /* Get group code (row[2]) */ - if (sscanf (row[2],"%ld",&Gbl.FileBrowser.Clipboard.GrpCod) != 1) + /* Get centre code (row[2]) */ + Gbl.FileBrowser.Clipboard.CtrCod = Str_ConvertStrCodToLongCod (row[2]); + + /* Get degree code (row[3]) */ + Gbl.FileBrowser.Clipboard.DegCod = Str_ConvertStrCodToLongCod (row[3]); + + /* Get course code (row[4]) */ + Gbl.FileBrowser.Clipboard.CrsCod = Str_ConvertStrCodToLongCod (row[4]); + + /* Get group code (row[5]) */ + if (sscanf (row[5],"%ld",&Gbl.FileBrowser.Clipboard.GrpCod) != 1) Gbl.FileBrowser.Clipboard.GrpCod = -1L; - /* Get works user's code (row[3]) */ - Gbl.FileBrowser.Clipboard.WorksUsrCod = Str_ConvertStrCodToLongCod (row[3]); + /* Get works user's code (row[6]) */ + Gbl.FileBrowser.Clipboard.WorksUsrCod = Str_ConvertStrCodToLongCod (row[6]); - /* Get file type (row[4]) */ + /* Get file type (row[7]) */ Gbl.FileBrowser.Clipboard.FileType = Brw_IS_UNKNOWN; // default - if (sscanf (row[4],"%u",&UnsignedNum) == 1) + if (sscanf (row[7],"%u",&UnsignedNum) == 1) if (UnsignedNum < Brw_NUM_FILE_TYPES) Gbl.FileBrowser.Clipboard.FileType = (Brw_FileType_t) UnsignedNum; - /* Get file path (row[5]) */ - strcpy (Gbl.FileBrowser.Clipboard.Path,row[5]); + /* Get file path (row[8]) */ + strcpy (Gbl.FileBrowser.Clipboard.Path,row[8]); Str_SplitFullPathIntoPathAndFileName (Gbl.FileBrowser.Clipboard.Path, PathUntilFileName, Gbl.FileBrowser.Clipboard.FileName); @@ -5687,6 +5744,9 @@ static bool Brw_GetMyClipboard (void) else { Gbl.FileBrowser.Clipboard.FileBrowser = Brw_FILE_BRW_UNKNOWN; + Gbl.FileBrowser.Clipboard.InsCod = -1L; + Gbl.FileBrowser.Clipboard.CtrCod = -1L; + Gbl.FileBrowser.Clipboard.DegCod = -1L; Gbl.FileBrowser.Clipboard.CrsCod = -1L; Gbl.FileBrowser.Clipboard.GrpCod = -1L; Gbl.FileBrowser.Clipboard.WorksUsrCod = -1L; @@ -5717,6 +5777,18 @@ static bool Brw_CheckIfClipboardIsInThisTree (void) { switch (Gbl.FileBrowser.Type) { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + if (Gbl.FileBrowser.Clipboard.InsCod == Gbl.CurrentIns.Ins.InsCod) + IsThisTree = true; // I am in the institution of the clipboard + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + if (Gbl.FileBrowser.Clipboard.CtrCod == Gbl.CurrentCtr.Ctr.CtrCod) + IsThisTree = true; // I am in the centre of the clipboard + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + if (Gbl.FileBrowser.Clipboard.DegCod == Gbl.CurrentDeg.Deg.DegCod) + IsThisTree = true; // I am in the degree of the clipboard + break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: case Brw_FILE_BRW_COMMON_CRS: @@ -5728,7 +5800,7 @@ static bool Brw_CheckIfClipboardIsInThisTree (void) case Brw_FILE_BRW_ASSIGNMENTS_CRS: case Brw_FILE_BRW_WORKS_CRS: if (Gbl.FileBrowser.Clipboard.CrsCod == Gbl.CurrentCrs.Crs.CrsCod) - IsThisTree = true; // We are in the course of the clipboard + IsThisTree = true; // I am in the course of the clipboard break; case Brw_FILE_BRW_BRIEFCASE_USR: IsThisTree = true; @@ -5763,21 +5835,51 @@ static bool Brw_CheckIfClipboardIsInThisTree (void) static void Brw_AddPathToClipboards (Brw_FileType_t FileType,const char *Path) { char Query[512+PATH_MAX]; + long InsCod = -1L; + long CtrCod = -1L; + long DegCod = -1L; + long CrsCod = -1L; + long GrpCod = -1L; + long WorksUsrCod = -1L; + + switch (Gbl.FileBrowser.Type) + { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + InsCod = Gbl.CurrentIns.Ins.InsCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + CtrCod = Gbl.CurrentCtr.Ctr.CtrCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + DegCod = Gbl.CurrentDeg.Deg.DegCod; + break; + case Brw_FILE_BRW_ASSIGNMENTS_CRS: + case Brw_FILE_BRW_WORKS_CRS: + WorksUsrCod = Gbl.Usrs.Other.UsrDat.UsrCod; + /* no break */ + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: + case Brw_FILE_BRW_COMMON_CRS: + case Brw_FILE_BRW_ADMIN_MARKS_CRS: + CrsCod = Gbl.CurrentCrs.Crs.CrsCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: + case Brw_FILE_BRW_COMMON_GRP: + case Brw_FILE_BRW_ADMIN_MARKS_GRP: + CrsCod = Gbl.CurrentCrs.Crs.CrsCod; + GrpCod = Gbl.CurrentCrs.Grps.GrpCod; + break; + default: + break; + } /***** Add path to clipboards *****/ - sprintf (Query,"INSERT INTO clipboard (UsrCod,FileBrowser,CrsCod,GrpCod,WorksUsrCod,FileType,Path)" - " VALUES ('%ld','%u','%ld','%ld','%ld','%u','%s')", + sprintf (Query,"INSERT INTO clipboard (UsrCod,FileBrowser,InsCod,CtrCod,DegCod," + "CrsCod,GrpCod,WorksUsrCod,FileType,Path)" + " VALUES ('%ld','%u','%ld','%ld','%ld'," + "'%ld','%ld','%ld','%u','%s')", Gbl.Usrs.Me.UsrDat.UsrCod, (unsigned) Gbl.FileBrowser.Type, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_BRIEFCASE_USR) ? -1L : - Gbl.CurrentCrs.Crs.CrsCod, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP || - Gbl.FileBrowser.Type == Brw_FILE_BRW_COMMON_GRP || - Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_GRP) ? Gbl.CurrentCrs.Grps.GrpCod : - -1L, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_ASSIGNMENTS_CRS || - Gbl.FileBrowser.Type == Brw_FILE_BRW_WORKS_CRS) ? Gbl.Usrs.Other.UsrDat.UsrCod : - -1L, + InsCod,CtrCod,DegCod,CrsCod,GrpCod,WorksUsrCod, (unsigned) FileType, Path); DB_QueryINSERT (Query,"can not add source of copy to clipboard"); @@ -5790,21 +5892,50 @@ static void Brw_AddPathToClipboards (Brw_FileType_t FileType,const char *Path) static void Brw_UpdatePathInClipboard (Brw_FileType_t FileType,const char *Path) { char Query[512+PATH_MAX]; + long InsCod = -1L; + long CtrCod = -1L; + long DegCod = -1L; + long CrsCod = -1L; + long GrpCod = -1L; + long WorksUsrCod = -1L; + + switch (Gbl.FileBrowser.Type) + { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + InsCod = Gbl.CurrentIns.Ins.InsCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + CtrCod = Gbl.CurrentCtr.Ctr.CtrCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + DegCod = Gbl.CurrentDeg.Deg.DegCod; + break; + case Brw_FILE_BRW_ASSIGNMENTS_CRS: + case Brw_FILE_BRW_WORKS_CRS: + WorksUsrCod = Gbl.Usrs.Other.UsrDat.UsrCod; + /* no break */ + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: + case Brw_FILE_BRW_COMMON_CRS: + case Brw_FILE_BRW_ADMIN_MARKS_CRS: + CrsCod = Gbl.CurrentCrs.Crs.CrsCod; + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: + case Brw_FILE_BRW_COMMON_GRP: + case Brw_FILE_BRW_ADMIN_MARKS_GRP: + CrsCod = Gbl.CurrentCrs.Crs.CrsCod; + GrpCod = Gbl.CurrentCrs.Grps.GrpCod; + break; + default: + break; + } /***** Update path in my clipboard *****/ sprintf (Query,"UPDATE clipboard" - " SET FileBrowser='%u',CrsCod='%ld',GrpCod='%ld',WorksUsrCod='%ld',FileType='%u',Path='%s'" + " SET FileBrowser='%u',InsCod='%ld',CtrCod='%ld',DegCod='%ld'," + "CrsCod='%ld',GrpCod='%ld',WorksUsrCod='%ld',FileType='%u',Path='%s'" " WHERE UsrCod='%ld'", (unsigned) Gbl.FileBrowser.Type, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_BRIEFCASE_USR) ? -1L : - Gbl.CurrentCrs.Crs.CrsCod, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP || - Gbl.FileBrowser.Type == Brw_FILE_BRW_COMMON_GRP || - Gbl.FileBrowser.Type == Brw_FILE_BRW_ADMIN_MARKS_GRP) ? Gbl.CurrentCrs.Grps.GrpCod : - -1L, - (Gbl.FileBrowser.Type == Brw_FILE_BRW_ASSIGNMENTS_CRS || - Gbl.FileBrowser.Type == Brw_FILE_BRW_WORKS_CRS) ? Gbl.Usrs.Other.UsrDat.UsrCod : - -1L, + InsCod,CtrCod,DegCod,CrsCod,GrpCod,WorksUsrCod, (unsigned) FileType, Path, Gbl.Usrs.Me.UsrDat.UsrCod); @@ -6116,6 +6247,21 @@ static void Brw_RemoveAffectedClipboards (Brw_FileBrowser_t FileBrowser,long MyU from a course or from a user *****/ switch (FileBrowser) { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + sprintf (Query,"DELETE FROM clipboard" + " WHERE FileBrowser='%u' AND InsCod='%ld'", + (unsigned) FileBrowser,Gbl.CurrentIns.Ins.InsCod); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + sprintf (Query,"DELETE FROM clipboard" + " WHERE FileBrowser='%u' AND CtrCod='%ld'", + (unsigned) FileBrowser,Gbl.CurrentCtr.Ctr.CtrCod); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + sprintf (Query,"DELETE FROM clipboard" + " WHERE FileBrowser='%u' AND DegCod='%ld'", + (unsigned) FileBrowser,Gbl.CurrentDeg.Deg.DegCod); + break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: case Brw_FILE_BRW_COMMON_CRS: case Brw_FILE_BRW_ADMIN_MARKS_CRS: @@ -6321,11 +6467,17 @@ void Brw_PasteIntoFileBrowser (void) /*****************************************************************************/ // Source: // Type of file browser: Gbl.FileBrowser.Clipboard.FileBrowser +// Possible institution: Gbl.FileBrowser.Clipboard.InsCod +// Possible centre: Gbl.FileBrowser.Clipboard.CtrCod +// Possible degree: Gbl.FileBrowser.Clipboard.DegCod // Possible course: Gbl.FileBrowser.Clipboard.CrsCod // Possible student in works: Gbl.FileBrowser.Clipboard.WorksUsrCod // Path (file or folder): Gbl.FileBrowser.Clipboard.Path // Destination: // Type of file browser: Gbl.FileBrowser.Type +// Possible institution: Gbl.CurrentIns.Ins.InsCod +// Possible centre: Gbl.CurrentCtr.Ctr.CtrCod +// Possible degree: Gbl.CurrentDeg.Deg.DegCod // Possible course: Gbl.CurrentCrs.Crs.CrsCod // Possible student in works: Gbl.Usrs.Other.UsrDat.UsrCod // Path (should be a folder): Gbl.FileBrowser.Priv.FullPathInTree @@ -6338,8 +6490,11 @@ static void Brw_PasteClipboard (void) extern const char *Txt_Folders_copied; extern const char *Txt_Links_copied; extern const char *Txt_You_can_not_paste_file_or_folder_here; + struct Institution Ins; + struct Centre Ctr; + struct Degree Deg; struct Course Crs; - char PathCrsOrg[PATH_MAX+1]; + char PathAboveRootFolderOrg[PATH_MAX+1]; char PathOrg[PATH_MAX+1]; unsigned NumFilesPasted = 0; unsigned NumFoldsPasted = 0; @@ -6354,6 +6509,36 @@ static void Brw_PasteClipboard (void) /***** Construct the relative path of the origin file or folder *****/ switch (Gbl.FileBrowser.Clipboard.FileBrowser) { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + Ins.InsCod = Gbl.FileBrowser.Clipboard.InsCod; + if (Ins_GetDataOfInstitutionByCod (&Ins,false)) + sprintf (PathAboveRootFolderOrg,"%s/%s/%02u/%u", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_INS, + (unsigned) (Ins.InsCod % 100), + (unsigned) Ins.InsCod); + else + Lay_ShowErrorAndExit ("The institution of copy source does not exist."); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + Ctr.CtrCod = Gbl.FileBrowser.Clipboard.CtrCod; + if (Ctr_GetDataOfCentreByCod (&Ctr)) + sprintf (PathAboveRootFolderOrg,"%s/%s/%02u/%u", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CTR, + (unsigned) (Ctr.CtrCod % 100), + (unsigned) Ctr.CtrCod); + else + Lay_ShowErrorAndExit ("The centre of copy source does not exist."); + break; + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: + Deg.DegCod = Gbl.FileBrowser.Clipboard.DegCod; + if (Deg_GetDataOfDegreeByCod (&Deg)) + sprintf (PathAboveRootFolderOrg,"%s/%s/%02u/%u", + Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_DEG, + (unsigned) (Deg.DegCod % 100), + (unsigned) Deg.DegCod); + else + Lay_ShowErrorAndExit ("The degree of copy source does not exist."); + break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: case Brw_FILE_BRW_COMMON_CRS: @@ -6366,7 +6551,7 @@ static void Brw_PasteClipboard (void) case Brw_FILE_BRW_WORKS_CRS: Crs.CrsCod = Gbl.FileBrowser.Clipboard.CrsCod; if (Crs_GetDataOfCourseByCod (&Crs)) - sprintf (PathCrsOrg,"%s/%s/%ld", + sprintf (PathAboveRootFolderOrg,"%s/%s/%ld", Cfg_PATH_SWAD_PRIVATE,Cfg_FOLDER_CRS,Crs.CrsCod); else Lay_ShowErrorAndExit ("The course of copy source does not exist."); @@ -6376,25 +6561,28 @@ static void Brw_PasteClipboard (void) } switch (Gbl.FileBrowser.Clipboard.FileBrowser) { + case Brw_FILE_BRW_ADMIN_DOCUMENTS_INS: + case Brw_FILE_BRW_ADMIN_DOCUMENTS_CTR: + case Brw_FILE_BRW_ADMIN_DOCUMENTS_DEG: case Brw_FILE_BRW_ADMIN_DOCUMENTS_CRS: case Brw_FILE_BRW_COMMON_CRS: case Brw_FILE_BRW_ADMIN_MARKS_CRS: sprintf (PathOrg,"%s/%s", - PathCrsOrg, + PathAboveRootFolderOrg, Gbl.FileBrowser.Clipboard.Path); break; case Brw_FILE_BRW_ADMIN_DOCUMENTS_GRP: case Brw_FILE_BRW_COMMON_GRP: case Brw_FILE_BRW_ADMIN_MARKS_GRP: sprintf (PathOrg,"%s/grp/%ld/%s", - PathCrsOrg, + PathAboveRootFolderOrg, Gbl.FileBrowser.Clipboard.GrpCod, Gbl.FileBrowser.Clipboard.Path); break; case Brw_FILE_BRW_ASSIGNMENTS_USR: case Brw_FILE_BRW_WORKS_USR: sprintf (PathOrg,"%s/usr/%02u/%ld/%s", - PathCrsOrg, + PathAboveRootFolderOrg, (unsigned) (Gbl.Usrs.Me.UsrDat.UsrCod % 100), Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.FileBrowser.Clipboard.Path); @@ -6402,7 +6590,7 @@ static void Brw_PasteClipboard (void) case Brw_FILE_BRW_ASSIGNMENTS_CRS: case Brw_FILE_BRW_WORKS_CRS: sprintf (PathOrg,"%s/usr/%02u/%ld/%s", - PathCrsOrg, + PathAboveRootFolderOrg, (unsigned) (Gbl.FileBrowser.Clipboard.WorksUsrCod % 100), Gbl.FileBrowser.Clipboard.WorksUsrCod, Gbl.FileBrowser.Clipboard.Path); diff --git a/swad_global.h b/swad_global.h index abf9cee75..3af288482 100644 --- a/swad_global.h +++ b/swad_global.h @@ -511,7 +511,10 @@ struct Globals struct { Brw_FileBrowser_t FileBrowser; // Type of the file browser - long CrsCod; // Course code + long InsCod; // Code of the institution related to the file browser with the clipboard + long CtrCod; // Code of the centre related to the file browser with the clipboard + long DegCod; // Code of the degree related to the file browser with the clipboard + long CrsCod; // Code of the course related to the file browser with the clipboard long GrpCod; // Code of the group related to the file browser with the clipboard long WorksUsrCod; // User code of the user related to the works file browser with the clipboard char Path[PATH_MAX+1]; // Complete path in the file browser diff --git a/swad_institution.c b/swad_institution.c index 40a8dabae..b6c648b03 100644 --- a/swad_institution.c +++ b/swad_institution.c @@ -1378,8 +1378,15 @@ void Ins_RemoveInstitution (void) Lay_ShowAlert (Lay_WARNING,Txt_To_remove_an_institution_you_must_first_remove_all_centres_and_users_in_the_institution); else // Institution has no users ==> remove it { + /***** Remove information related to files in institution *****/ + /* Remove clipboards related to the institution */ + sprintf (Query,"DELETE FROM clipboard WHERE InsCod='%ld'", + Ins.InsCod); + DB_QueryDELETE (Query,"can not remove clipboards in an institution"); + /***** Remove institution *****/ - sprintf (Query,"DELETE FROM institutions WHERE InsCod='%ld'",Ins.InsCod); + sprintf (Query,"DELETE FROM institutions WHERE InsCod='%ld'", + Ins.InsCod); DB_QueryDELETE (Query,"can not remove an institution"); /***** Write message to show the change made *****/