Version 17.2.3

This commit is contained in:
Antonio Cañas Vargas 2017-09-17 23:37:03 +02:00
parent 44d65b3b91
commit 6fa1b01f4b
14 changed files with 174 additions and 236 deletions

BIN
icon/usr64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1021 B

BIN
icon/usr_off64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 959 B

View File

@ -943,12 +943,11 @@ CREATE TABLE IF NOT EXISTS projects (
PrjCod INT NOT NULL AUTO_INCREMENT, PrjCod INT NOT NULL AUTO_INCREMENT,
CrsCod INT NOT NULL DEFAULT -1, CrsCod INT NOT NULL DEFAULT -1,
Hidden ENUM('N','Y') NOT NULL DEFAULT 'N', Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',
NumNotif INT NOT NULL DEFAULT 0,
UsrCod INT NOT NULL, UsrCod INT NOT NULL,
StartTime DATETIME NOT NULL, StartTime DATETIME NOT NULL,
EndTime DATETIME NOT NULL, EndTime DATETIME NOT NULL,
Title VARCHAR(2047) NOT NULL, Title VARCHAR(2047) NOT NULL,
Folder VARBINARY(255) NOT NULL, Preassigned ENUM('N','Y') NOT NULL DEFAULT 'N',
Txt TEXT NOT NULL, Txt TEXT NOT NULL,
UNIQUE INDEX(PrjCod), UNIQUE INDEX(PrjCod),
INDEX(CrsCod,Hidden)); INDEX(CrsCod,Hidden));

View File

@ -679,7 +679,7 @@ static void Agd_PutIconsOtherPublicAgenda (void)
&Gbl.Usrs.Other.UsrDat)) &Gbl.Usrs.Other.UsrDat))
Lay_PutContextualLink (ActSeeOthPubPrf,NULL, Lay_PutContextualLink (ActSeeOthPubPrf,NULL,
Usr_PutParamOtherUsrCodEncrypted, Usr_PutParamOtherUsrCodEncrypted,
"usr64x64.gif", "usr64x64.png",
Txt_Another_user_s_profile,NULL, Txt_Another_user_s_profile,NULL,
NULL); NULL);

View File

@ -831,7 +831,7 @@ static void Asg_ResetAssignment (struct Assignment *Asg)
Asg->TimeUTC[Dat_END_TIME ] = (time_t) 0; Asg->TimeUTC[Dat_END_TIME ] = (time_t) 0;
Asg->Open = false; Asg->Open = false;
Asg->Title[0] = '\0'; Asg->Title[0] = '\0';
Asg->SendWork = false; Asg->SendWork = Asg_DO_NOT_SEND_WORK;
Asg->Folder[0] = '\0'; Asg->Folder[0] = '\0';
Asg->IBelongToCrsOrGrps = false; Asg->IBelongToCrsOrGrps = false;
} }
@ -1145,7 +1145,7 @@ void Asg_RequestCreatOrEditAsg (void)
Asg.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours Asg.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
Asg.Open = true; Asg.Open = true;
Asg.Title[0] = '\0'; Asg.Title[0] = '\0';
Asg.SendWork = false; Asg.SendWork = Asg_DO_NOT_SEND_WORK;
Asg.Folder[0] = '\0'; Asg.Folder[0] = '\0';
Asg.IBelongToCrsOrGrps = false; Asg.IBelongToCrsOrGrps = false;
} }

View File

@ -252,14 +252,22 @@
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
/*****************************************************************************/ /*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 17.2.1 (2017-09-17)" #define Log_PLATFORM_VERSION "SWAD 17.2.3 (2017-09-17)"
#define CSS_FILE "swad17.0.css" #define CSS_FILE "swad17.0.css"
#define JS_FILE "swad16.206.3.js" #define JS_FILE "swad16.206.3.js"
// Number of lines (includes comments but not blank lines) has been got with the following command: // 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 sql/swad*.sql | tail -1 // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
/* /*
Version 17.2.2: Sep 17, 2017 New option for projects. Not finished. (? lines) Version 17.2.3: Sep 17, 2017 New option for projects. Not finished. (229906 lines)
3 changes necessary in database:
ALTER TABLE projects DROP COLUMN NumNotif;
ALTER TABLE projects DROP COLUMN Folder;
ALTER TABLE projects ADD COLUMN Preassigned ENUM('N','Y') NOT NULL DEFAULT 'N' AFTER Title;
Copy the following icons to icon public directory:
sudo cp icon/usr64x64.png /var/www/html/swad/icon/
Version 17.2.2: Sep 17, 2017 New option for projects. Not finished. (229964 lines)
Version 17.2.1: Sep 17, 2017 New option for projects. Not finished. (229884 lines) Version 17.2.1: Sep 17, 2017 New option for projects. Not finished. (229884 lines)
Version 17.2: Sep 17, 2017 New option for projects. Not finished. (229575 lines) Version 17.2: Sep 17, 2017 New option for projects. Not finished. (229575 lines)
12 changes necessary in database: 12 changes necessary in database:

View File

@ -2004,33 +2004,31 @@ mysql> DESCRIBE prj_grp;
/***** Table projects *****/ /***** Table projects *****/
/* /*
mysql> DESCRIBE projects; mysql> DESCRIBE projects;
+-----------+----------------+------+-----+---------+----------------+ +-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra | | Field | Type | Null | Key | Default | Extra |
+-----------+----------------+------+-----+---------+----------------+ +-------------+---------------+------+-----+---------+----------------+
| PrjCod | int(11) | NO | PRI | NULL | auto_increment | | PrjCod | int(11) | NO | PRI | NULL | auto_increment |
| CrsCod | int(11) | NO | MUL | -1 | | | CrsCod | int(11) | NO | MUL | -1 | |
| Hidden | enum('N','Y') | NO | | N | | | Hidden | enum('N','Y') | NO | | N | |
| NumNotif | int(11) | NO | | 0 | | | UsrCod | int(11) | NO | | NULL | |
| UsrCod | int(11) | NO | | NULL | | | StartTime | datetime | NO | | NULL | |
| StartTime | datetime | NO | | NULL | | | EndTime | datetime | NO | | NULL | |
| EndTime | datetime | NO | | NULL | | | Title | varchar(2047) | NO | | NULL | |
| Title | varchar(2047) | NO | | NULL | | | Preassigned | enum('N','Y') | NO | | N | |
| Folder | varbinary(255) | NO | | NULL | | | Txt | text | NO | | NULL | |
| Txt | text | NO | | NULL | | +-------------+---------------+------+-----+---------+----------------+
+-----------+----------------+------+-----+---------+----------------+ 9 rows in set (0,00 sec)
10 rows in set (0,00 sec)
*/ */
DB_CreateTable ("CREATE TABLE IF NOT EXISTS projects (" DB_CreateTable ("CREATE TABLE IF NOT EXISTS projects ("
"PrjCod INT NOT NULL AUTO_INCREMENT," "PrjCod INT NOT NULL AUTO_INCREMENT,"
"CrsCod INT NOT NULL DEFAULT -1," "CrsCod INT NOT NULL DEFAULT -1,"
"Hidden ENUM('N','Y') NOT NULL DEFAULT 'N'," "Hidden ENUM('N','Y') NOT NULL DEFAULT 'N',"
"NumNotif INT NOT NULL DEFAULT 0,"
"UsrCod INT NOT NULL," "UsrCod INT NOT NULL,"
"StartTime DATETIME NOT NULL," "StartTime DATETIME NOT NULL,"
"EndTime DATETIME NOT NULL," "EndTime DATETIME NOT NULL,"
"Title VARCHAR(2047) NOT NULL," // Prj_MAX_BYTES_ASSIGNMENT_TITLE "Title VARCHAR(2047) NOT NULL," // Prj_MAX_CHARS_PROJECT_TITLE
"Folder VARBINARY(255) NOT NULL," // Brw_MAX_BYTES_FOLDER "Preassigned ENUM('N','Y') NOT NULL DEFAULT 'N',"
"Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT "Txt TEXT NOT NULL," // Cns_MAX_BYTES_TEXT
"UNIQUE INDEX(PrjCod)," "UNIQUE INDEX(PrjCod),"
"INDEX(CrsCod,Hidden))"); "INDEX(CrsCod,Hidden))");

View File

@ -941,7 +941,7 @@ static void Fol_PutInactiveIconToFollowUnfollow (void)
{ {
/***** Inactive icon to follow/unfollow *****/ /***** Inactive icon to follow/unfollow *****/
fprintf (Gbl.F.Out,"<div class=\"FOLLOW_USR_ICO ICO_HIDDEN\">" fprintf (Gbl.F.Out,"<div class=\"FOLLOW_USR_ICO ICO_HIDDEN\">"
"<img src=\"%s/usr64x64.gif\"" "<img src=\"%s/usr64x64.png\""
" alt=\"\"" " alt=\"\""
" class=\"ICO20x20\" />" " class=\"ICO20x20\" />"
"</div>", "</div>",

View File

@ -131,7 +131,7 @@ void Prf_PutLinkMyPublicProfile (void)
extern const char *Txt_My_public_profile; extern const char *Txt_My_public_profile;
Lay_PutContextualLink (ActSeeOthPubPrf,NULL,Usr_PutParamMyUsrCodEncrypted, Lay_PutContextualLink (ActSeeOthPubPrf,NULL,Usr_PutParamMyUsrCodEncrypted,
"usr64x64.gif", "usr64x64.png",
Txt_My_public_profile,Txt_My_public_profile, Txt_My_public_profile,Txt_My_public_profile,
NULL); NULL);
} }
@ -145,7 +145,7 @@ void Prf_PutLinkRequestAnotherUserProfile (void)
extern const char *Txt_Another_user_s_profile; extern const char *Txt_Another_user_s_profile;
Lay_PutContextualLink (ActReqOthPubPrf,NULL,NULL, Lay_PutContextualLink (ActReqOthPubPrf,NULL,NULL,
"usr64x64.gif", "usr64x64.png",
Txt_Another_user_s_profile,Txt_Another_user_s_profile, Txt_Another_user_s_profile,Txt_Another_user_s_profile,
NULL); NULL);
} }

View File

@ -74,7 +74,6 @@ static void Prj_PutFormToSelectWhichGroupsToShow (void);
static void Prj_ParamsWhichGroupsToShow (void); static void Prj_ParamsWhichGroupsToShow (void);
static void Prj_ShowOneProject (long PrjCod,bool PrintView); static void Prj_ShowOneProject (long PrjCod,bool PrintView);
static void Prj_WritePrjAuthor (struct Project *Prj); static void Prj_WritePrjAuthor (struct Project *Prj);
static void Prj_WriteProjectFolder (struct Project *Prj,bool PrintView);
static void Prj_GetParamPrjOrder (void); static void Prj_GetParamPrjOrder (void);
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden); static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden);
@ -191,8 +190,7 @@ static void Prj_PutHeadForSeeing (bool PrintView)
extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME]; extern const char *Txt_START_END_TIME_HELP[Dat_NUM_START_END_TIME];
extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME]; extern const char *Txt_START_END_TIME[Dat_NUM_START_END_TIME];
extern const char *Txt_Project; extern const char *Txt_Project;
extern const char *Txt_Upload_files_QUESTION; extern const char *Txt_Preassigned_QUESTION;
extern const char *Txt_Folder;
Dat_StartEndTime_t Order; Dat_StartEndTime_t Order;
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -230,13 +228,9 @@ static void Prj_PutHeadForSeeing (bool PrintView)
"<th class=\"CENTER_MIDDLE\">" "<th class=\"CENTER_MIDDLE\">"
"%s" "%s"
"</th>" "</th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>", "</tr>",
Txt_Project, Txt_Project,
Txt_Upload_files_QUESTION, Txt_Preassigned_QUESTION);
Txt_Folder);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -331,11 +325,11 @@ void Prj_PrintOneProject (void)
/***** Table head *****/ /***** Table head *****/
Tbl_StartTableWideMargin (2); Tbl_StartTableWideMargin (2);
Prj_PutHeadForSeeing (true); // Print view Prj_PutHeadForSeeing (true); // Print view
/***** Write project *****/ /***** Write project *****/
Prj_ShowOneProject (PrjCod, Prj_ShowOneProject (PrjCod,
true); // Print view true); // Print view
/***** End table *****/ /***** End table *****/
Tbl_EndTable (); Tbl_EndTable ();
@ -348,7 +342,7 @@ void Prj_PrintOneProject (void)
static void Prj_ShowOneProject (long PrjCod,bool PrintView) static void Prj_ShowOneProject (long PrjCod,bool PrintView)
{ {
extern const char *Txt_Today; extern const char *Txt_Today;
extern const char *Txt_ASSIGNMENT_TYPES[Prj_NUM_TYPES_SEND_WORK]; extern const char *Txt_PREASSIGNED_TYPES[Prj_NUM_TYPES_PREASSIGNED];
extern const char *Txt_Yes; extern const char *Txt_Yes;
extern const char *Txt_No; extern const char *Txt_No;
static unsigned UniqueId = 0; static unsigned UniqueId = 0;
@ -421,34 +415,25 @@ static void Prj_ShowOneProject (long PrjCod,bool PrintView)
Prj.Title); Prj.Title);
fprintf (Gbl.F.Out,"</td>"); fprintf (Gbl.F.Out,"</td>");
/* Send work? */ /* Preassigned? */
fprintf (Gbl.F.Out,"<td class=\"%s CENTER_TOP", fprintf (Gbl.F.Out,"<td class=\"%s CENTER_TOP",
(Prj.SendWork == Prj_SEND_WORK) ? "DAT_N" : (Prj.Preassigned == Prj_PREASSIGNED) ? "DAT_N" :
"DAT"); "DAT");
if (!PrintView) if (!PrintView)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd); fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">" fprintf (Gbl.F.Out,"\">"
"<img src=\"%s/%s16x16.gif\"" "<img src=\"%s/%s64x64.png\""
" alt=\"%s\" title=\"%s\" class=\"ICO20x20\" />" " alt=\"%s\" title=\"%s\" class=\"ICO20x20\" />"
"<br />%s" "<br />%s"
"</td>", "</td>"
"</tr>",
Gbl.Prefs.IconsURL, Gbl.Prefs.IconsURL,
(Prj.SendWork == Prj_SEND_WORK) ? "file_on" : (Prj.Preassigned == Prj_PREASSIGNED) ? "usr" :
"file_off", "usr_off",
Txt_ASSIGNMENT_TYPES[Prj.SendWork], Txt_PREASSIGNED_TYPES[Prj.Preassigned],
Txt_ASSIGNMENT_TYPES[Prj.SendWork], Txt_PREASSIGNED_TYPES[Prj.Preassigned],
(Prj.SendWork == Prj_SEND_WORK) ? Txt_Yes : (Prj.Preassigned == Prj_PREASSIGNED) ? Txt_Yes :
Txt_No); Txt_No);
/* Project folder */
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP");
if (!PrintView)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">");
if (Prj.SendWork == Prj_SEND_WORK)
Prj_WriteProjectFolder (&Prj,PrintView);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** Write second row of data of this project *****/ /***** Write second row of data of this project *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -467,7 +452,7 @@ static void Prj_ShowOneProject (long PrjCod,bool PrintView)
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML, Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML
Str_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links Str_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
fprintf (Gbl.F.Out,"<td colspan=\"3\" class=\"LEFT_TOP"); fprintf (Gbl.F.Out,"<td colspan=\"2\" class=\"LEFT_TOP");
if (!PrintView) if (!PrintView)
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd); fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
fprintf (Gbl.F.Out,"\">"); fprintf (Gbl.F.Out,"\">");
@ -496,51 +481,6 @@ static void Prj_WritePrjAuthor (struct Project *Prj)
Usr_WriteAuthor1Line (Prj->UsrCod,Prj->Hidden); Usr_WriteAuthor1Line (Prj->UsrCod,Prj->Hidden);
} }
/*****************************************************************************/
/*********************** Write the folder of a project ***********************/
/*****************************************************************************/
static void Prj_WriteProjectFolder (struct Project *Prj,bool PrintView)
{
extern const char *Txt_Upload_file_or_create_folder_in_FOLDER;
extern const char *Txt_Folder;
bool ICanSendFiles = !Prj->Hidden && // It's visible (not hidden)
Prj->Open && // It's open (inside dates)
Prj->IBelongToCrsOrGrps && // I belong to course or groups
Gbl.Usrs.Me.Role.Logged == Rol_STD; // I am a student
/***** Folder icon *****/
if (!PrintView && // Not print view
ICanSendFiles) // I can send files to this project folder
{
/* Form to create a new file or folder */
Act_FormStart (ActFrmCreAsgUsr); // TODO: Remove this feature
Brw_PutParamsFileBrowser (ActUnk,
Brw_INTERNAL_NAME_ROOT_FOLDER_ASSIGNMENTS,
Prj->Folder,
Brw_IS_FOLDER,-1L);
sprintf (Gbl.Title,Txt_Upload_file_or_create_folder_in_FOLDER,
Prj->Folder);
fprintf (Gbl.F.Out,"<input type=\"image\""
" src=\"%s/folder-open-plus16x16.gif\""
" alt=\"%s\" title=\"%s\" class=\"ICO20x20\" />",
Gbl.Prefs.IconsURL,
Gbl.Title,
Gbl.Title);
Act_FormEnd ();
}
else // I can't send files to this project folder
fprintf (Gbl.F.Out,"<img src=\"%s/%s\" alt=\"%s\" title=\"%s\""
" class=\"ICO20x20\" />",
Gbl.Prefs.IconsURL,
ICanSendFiles ? "folder-open16x16.gif" :
"folder-closed16x16.gif",
Txt_Folder,Txt_Folder);
/***** Folder name *****/
fprintf (Gbl.F.Out,"%s",Prj->Folder);
}
/*****************************************************************************/ /*****************************************************************************/
/********* Get parameter with the type or order in list of projects **********/ /********* Get parameter with the type or order in list of projects **********/
/*****************************************************************************/ /*****************************************************************************/
@ -710,7 +650,7 @@ void Prj_GetDataOfProjectByCod (struct Project *Prj)
"UNIX_TIMESTAMP(StartTime)," "UNIX_TIMESTAMP(StartTime),"
"UNIX_TIMESTAMP(EndTime)," "UNIX_TIMESTAMP(EndTime),"
"NOW() BETWEEN StartTime AND EndTime," "NOW() BETWEEN StartTime AND EndTime,"
"Title,Folder" "Title,Preassigned"
" FROM projects" " FROM projects"
" WHERE PrjCod=%ld AND CrsCod=%ld", " WHERE PrjCod=%ld AND CrsCod=%ld",
Prj->PrjCod,Gbl.CurrentCrs.Crs.CrsCod); Prj->PrjCod,Gbl.CurrentCrs.Crs.CrsCod);
@ -726,37 +666,6 @@ void Prj_GetDataOfProjectByCod (struct Project *Prj)
} }
} }
/*****************************************************************************/
/***************** Get project data using its folder name ********************/
/*****************************************************************************/
void Prj_GetDataOfProjectByFolder (struct Project *Prj)
{
char Query[1024 + Brw_MAX_BYTES_FOLDER];
if (Prj->Folder[0])
{
/***** Query database *****/
sprintf (Query,"SELECT PrjCod,Hidden,UsrCod,"
"UNIX_TIMESTAMP(StartTime),"
"UNIX_TIMESTAMP(EndTime),"
"NOW() BETWEEN StartTime AND EndTime,"
"Title,Folder"
" FROM projects"
" WHERE CrsCod=%ld AND Folder='%s'",
Gbl.CurrentCrs.Crs.CrsCod,Prj->Folder);
/***** Get data of project *****/
Prj_GetDataOfProject (Prj,Query);
}
else
{
/***** Clear all project data *****/
Prj->PrjCod = -1L;
Prj_ResetProject (Prj);
}
}
/*****************************************************************************/ /*****************************************************************************/
/**************************** Get project data *******************************/ /**************************** Get project data *******************************/
/*****************************************************************************/ /*****************************************************************************/
@ -795,12 +704,11 @@ static void Prj_GetDataOfProject (struct Project *Prj,const char *Query)
/* Get the title of the project (row[6]) */ /* Get the title of the project (row[6]) */
Str_Copy (Prj->Title,row[6], Str_Copy (Prj->Title,row[6],
Prj_MAX_BYTES_ASSIGNMENT_TITLE); Prj_MAX_BYTES_PROJECT_TITLE);
/* Get the folder for the project files (row[7]) */ /* Get the folder for the project files (row[7]) */
Str_Copy (Prj->Folder,row[7], Prj->Preassigned = (row[7][0] == 'Y') ? Prj_PREASSIGNED :
Brw_MAX_BYTES_FOLDER); Prj_NOT_PREASSIGNED;
Prj->SendWork = (Prj->Folder[0] != '\0');
/* Can I do this project? */ /* Can I do this project? */
Prj->IBelongToCrsOrGrps = Prj_CheckIfIBelongToCrsOrGrpsThisProject (Prj->PrjCod); Prj->IBelongToCrsOrGrps = Prj_CheckIfIBelongToCrsOrGrpsThisProject (Prj->PrjCod);
@ -825,8 +733,7 @@ static void Prj_ResetProject (struct Project *Prj)
Prj->TimeUTC[Dat_END_TIME ] = (time_t) 0; Prj->TimeUTC[Dat_END_TIME ] = (time_t) 0;
Prj->Open = false; Prj->Open = false;
Prj->Title[0] = '\0'; Prj->Title[0] = '\0';
Prj->SendWork = false; Prj->Preassigned = Prj_NOT_PREASSIGNED;
Prj->Folder[0] = '\0';
Prj->IBelongToCrsOrGrps = false; Prj->IBelongToCrsOrGrps = false;
} }
@ -951,10 +858,6 @@ void Prj_RemoveProject (void)
/***** Get data of the project from database *****/ /***** Get data of the project from database *****/
Prj_GetDataOfProjectByCod (&Prj); // Inside this function, the course is checked to be the current one Prj_GetDataOfProjectByCod (&Prj); // Inside this function, the course is checked to be the current one
/***** Remove all the folders associated to this project *****/
if (Prj.Folder[0])
Brw_RemoveFoldersAssignmentsIfExistForAllUsrs (Prj.Folder);
/***** Remove all the groups of this project *****/ /***** Remove all the groups of this project *****/
Prj_RemoveAllTheGrpsAssociatedToAProject (Prj.PrjCod); Prj_RemoveAllTheGrpsAssociatedToAProject (Prj.PrjCod);
@ -1043,7 +946,7 @@ void Prj_ShowProject (void)
static bool Prj_CheckIfSimilarProjectsExists (const char *Field,const char *Value,long PrjCod) static bool Prj_CheckIfSimilarProjectsExists (const char *Field,const char *Value,long PrjCod)
{ {
char Query[256 + Prj_MAX_BYTES_ASSIGNMENT_TITLE]; char Query[256 + Prj_MAX_BYTES_PROJECT_TITLE];
/***** Get number of projects with a field value from database *****/ /***** Get number of projects with a field value from database *****/
sprintf (Query,"SELECT COUNT(*) FROM projects" sprintf (Query,"SELECT COUNT(*) FROM projects"
@ -1064,8 +967,9 @@ void Prj_RequestCreatOrEditPrj (void)
extern const char *Txt_New_project; extern const char *Txt_New_project;
extern const char *Txt_Edit_project; extern const char *Txt_Edit_project;
extern const char *Txt_Title; extern const char *Txt_Title;
extern const char *Txt_Upload_files_QUESTION; extern const char *Txt_Preassigned_QUESTION;
extern const char *Txt_Folder; extern const char *Txt_No;
extern const char *Txt_Yes;
extern const char *Txt_Description; extern const char *Txt_Description;
extern const char *Txt_Create_project; extern const char *Txt_Create_project;
extern const char *Txt_Save; extern const char *Txt_Save;
@ -1090,8 +994,7 @@ void Prj_RequestCreatOrEditPrj (void)
Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
Prj.Open = true; Prj.Open = true;
Prj.Title[0] = '\0'; Prj.Title[0] = '\0';
Prj.SendWork = false; Prj.Preassigned = Prj_NOT_PREASSIGNED;
Prj.Folder[0] = '\0';
Prj.IBelongToCrsOrGrps = false; Prj.IBelongToCrsOrGrps = false;
} }
else else
@ -1136,27 +1039,34 @@ void Prj_RequestCreatOrEditPrj (void)
"</td>" "</td>"
"</tr>", "</tr>",
The_ClassForm[Gbl.Prefs.Theme],Txt_Title, The_ClassForm[Gbl.Prefs.Theme],Txt_Title,
Prj_MAX_CHARS_ASSIGNMENT_TITLE,Prj.Title); Prj_MAX_CHARS_PROJECT_TITLE,Prj.Title);
/***** Project start and end dates *****/ /***** Project start and end dates *****/
Dat_PutFormStartEndClientLocalDateTimes (Prj.TimeUTC,Dat_FORM_SECONDS_ON); Dat_PutFormStartEndClientLocalDateTimes (Prj.TimeUTC,Dat_FORM_SECONDS_ON);
/***** Send work? *****/ /***** Preassigned? *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s RIGHT_MIDDLE\">" "<td class=\"%s RIGHT_MIDDLE\">"
"%s:" "%s:"
"</td>" "</td>"
"<td class=\"LEFT_MIDDLE\">" "<td class=\"LEFT_MIDDLE\">"
"<label class=\"DAT\">%s:" "<select name=\"Preassigned\">",
"<input type=\"text\" name=\"Folder\""
" size=\"30\" maxlength=\"%u\" value=\"%s\" />"
"</label>"
"</td>"
"</tr>",
The_ClassForm[Gbl.Prefs.Theme], The_ClassForm[Gbl.Prefs.Theme],
Txt_Upload_files_QUESTION, Txt_Preassigned_QUESTION);
Txt_Folder,
Brw_MAX_CHARS_FOLDER,Prj.Folder); fprintf (Gbl.F.Out,"<option value=\"N\"");
if (Prj.Preassigned == Prj_NOT_PREASSIGNED)
fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out,">%s</option>",Txt_No);
fprintf (Gbl.F.Out,"<option value=\"Y\"");
if (Prj.Preassigned == Prj_PREASSIGNED)
fprintf (Gbl.F.Out," selected=\"selected\"");
fprintf (Gbl.F.Out,">%s</option>",Txt_Yes);
fprintf (Gbl.F.Out,"</select>"
"</td>"
"</tr>");
/***** Project text *****/ /***** Project text *****/
fprintf (Gbl.F.Out,"<tr>" fprintf (Gbl.F.Out,"<tr>"
@ -1256,11 +1166,9 @@ static void Prj_ShowLstGrpsToEditProject (long PrjCod)
void Prj_RecFormProject (void) void Prj_RecFormProject (void)
{ {
extern const char *Txt_Already_existed_a_project_with_the_title_X; extern const char *Txt_Already_existed_a_project_with_the_title_X;
extern const char *Txt_Already_existed_a_project_with_the_folder_X;
extern const char *Txt_You_must_specify_the_title_of_the_project; extern const char *Txt_You_must_specify_the_title_of_the_project;
extern const char *Txt_Created_new_project_X; extern const char *Txt_Created_new_project_X;
extern const char *Txt_The_project_has_been_modified; extern const char *Txt_The_project_has_been_modified;
extern const char *Txt_You_can_not_disable_file_uploading_once_folders_have_been_created;
struct Project OldPrj; // Current assigment data in database struct Project OldPrj; // Current assigment data in database
struct Project NewPrj; // Project data received from form struct Project NewPrj; // Project data received from form
bool ItsANewProject; bool ItsANewProject;
@ -1289,12 +1197,11 @@ void Prj_RecFormProject (void)
NewPrj.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); NewPrj.TimeUTC[Dat_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" );
/***** Get project title *****/ /***** Get project title *****/
Par_GetParToText ("Title",NewPrj.Title,Prj_MAX_BYTES_ASSIGNMENT_TITLE); Par_GetParToText ("Title",NewPrj.Title,Prj_MAX_BYTES_PROJECT_TITLE);
/***** Get folder name where to send works of the project *****/ /***** Get folder name where to send works of the project *****/
Par_GetParToText ("Folder",NewPrj.Folder,Brw_MAX_BYTES_FOLDER); NewPrj.Preassigned = (Par_GetParToBool ("Preassigned")) ? Prj_PREASSIGNED :
NewPrj.SendWork = (NewPrj.Folder[0]) ? Prj_SEND_WORK : Prj_NOT_PREASSIGNED;
Prj_DO_NOT_SEND_WORK;
/***** Get project text *****/ /***** Get project text *****/
Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous)
@ -1316,38 +1223,6 @@ void Prj_RecFormProject (void)
NewPrj.Title); NewPrj.Title);
Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt); Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt);
} }
else // Title is correct
{
if (NewPrj.SendWork == Prj_SEND_WORK)
{
if (Str_ConvertFilFolLnkNameToValid (NewPrj.Folder)) // If folder name is valid...
{
if (Prj_CheckIfSimilarProjectsExists ("Folder",NewPrj.Folder,NewPrj.PrjCod)) // If folder of project was in database...
{
NewProjectIsCorrect = false;
sprintf (Gbl.Alert.Txt,Txt_Already_existed_a_project_with_the_folder_X,
NewPrj.Folder);
Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt);
}
}
else // Folder name not valid
{
NewProjectIsCorrect = false;
Ale_ShowAlert (Ale_WARNING,Gbl.Alert.Txt);
}
}
else // NewPrj.SendWork == Prj_DO_NOT_SEND_WORK
{
if (OldPrj.SendWork == Prj_SEND_WORK)
{
if (Brw_CheckIfExistsFolderAssigmentForAnyUsr (OldPrj.Folder))
{
NewProjectIsCorrect = false;
Ale_ShowAlert (Ale_WARNING,Txt_You_can_not_disable_file_uploading_once_folders_have_been_created);
}
}
}
}
} }
else // If there is not a project title else // If there is not a project title
{ {
@ -1369,19 +1244,13 @@ void Prj_RecFormProject (void)
sprintf (Gbl.Alert.Txt,Txt_Created_new_project_X,NewPrj.Title); sprintf (Gbl.Alert.Txt,Txt_Created_new_project_X,NewPrj.Title);
Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt); Ale_ShowAlert (Ale_SUCCESS,Gbl.Alert.Txt);
} }
else else if (NewProjectIsCorrect)
{ {
if (OldPrj.Folder[0] && NewPrj.Folder[0]) Prj_UpdateProject (&NewPrj,Txt);
if (strcmp (OldPrj.Folder,NewPrj.Folder)) // Folder name has changed
NewProjectIsCorrect = Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (OldPrj.Folder,NewPrj.Folder);
if (NewProjectIsCorrect)
{
Prj_UpdateProject (&NewPrj,Txt);
/***** Write success message *****/ /***** Write success message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_The_project_has_been_modified); Ale_ShowAlert (Ale_SUCCESS,Txt_The_project_has_been_modified);
} }
}
/* Free memory for list of selected groups */ /* Free memory for list of selected groups */
Grp_FreeListCodSelectedGrps (); Grp_FreeListCodSelectedGrps ();
@ -1401,21 +1270,22 @@ void Prj_RecFormProject (void)
static void Prj_CreateProject (struct Project *Prj,const char *Txt) static void Prj_CreateProject (struct Project *Prj,const char *Txt)
{ {
char Query[1024 + char Query[1024 +
Prj_MAX_BYTES_ASSIGNMENT_TITLE + Prj_MAX_BYTES_PROJECT_TITLE +
Cns_MAX_BYTES_TEXT]; Cns_MAX_BYTES_TEXT];
/***** Create a new project *****/ /***** Create a new project *****/
sprintf (Query,"INSERT INTO projects" sprintf (Query,"INSERT INTO projects"
" (CrsCod,UsrCod,StartTime,EndTime,Title,Folder,Txt)" " (CrsCod,UsrCod,StartTime,EndTime,Title,Preassigned,Txt)"
" VALUES" " VALUES"
" (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld)," " (%ld,%ld,FROM_UNIXTIME(%ld),FROM_UNIXTIME(%ld),"
"'%s','%s','%s')", "'%s','%c','%s')",
Gbl.CurrentCrs.Crs.CrsCod, Gbl.CurrentCrs.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Prj->TimeUTC[Dat_START_TIME], Prj->TimeUTC[Dat_START_TIME],
Prj->TimeUTC[Dat_END_TIME ], Prj->TimeUTC[Dat_END_TIME ],
Prj->Title, Prj->Title,
Prj->Folder, Prj->Preassigned == Prj_PREASSIGNED ? 'Y' :
'N',
Txt); Txt);
Prj->PrjCod = DB_QueryINSERTandReturnCode (Query,"can not create new project"); Prj->PrjCod = DB_QueryINSERTandReturnCode (Query,"can not create new project");
@ -1431,19 +1301,20 @@ static void Prj_CreateProject (struct Project *Prj,const char *Txt)
static void Prj_UpdateProject (struct Project *Prj,const char *Txt) static void Prj_UpdateProject (struct Project *Prj,const char *Txt)
{ {
char Query[1024 + char Query[1024 +
Prj_MAX_BYTES_ASSIGNMENT_TITLE + Prj_MAX_BYTES_PROJECT_TITLE +
Cns_MAX_BYTES_TEXT]; Cns_MAX_BYTES_TEXT];
/***** Update the data of the project *****/ /***** Update the data of the project *****/
sprintf (Query,"UPDATE projects SET " sprintf (Query,"UPDATE projects SET "
"StartTime=FROM_UNIXTIME(%ld)," "StartTime=FROM_UNIXTIME(%ld),"
"EndTime=FROM_UNIXTIME(%ld)," "EndTime=FROM_UNIXTIME(%ld),"
"Title='%s',Folder='%s',Txt='%s'" "Title='%s',Preassigned='%c',Txt='%s'"
" WHERE PrjCod=%ld AND CrsCod=%ld", " WHERE PrjCod=%ld AND CrsCod=%ld",
Prj->TimeUTC[Dat_START_TIME], Prj->TimeUTC[Dat_START_TIME],
Prj->TimeUTC[Dat_END_TIME ], Prj->TimeUTC[Dat_END_TIME ],
Prj->Title, Prj->Title,
Prj->Folder, Prj->Preassigned == Prj_PREASSIGNED ? 'Y' :
'N',
Txt, Txt,
Prj->PrjCod,Gbl.CurrentCrs.Crs.CrsCod); Prj->PrjCod,Gbl.CurrentCrs.Crs.CrsCod);
DB_QueryUPDATE (Query,"can not update project"); DB_QueryUPDATE (Query,"can not update project");

View File

@ -36,15 +36,15 @@
/************************** Public types and constants ***********************/ /************************** Public types and constants ***********************/
/*****************************************************************************/ /*****************************************************************************/
#define Prj_MAX_CHARS_ASSIGNMENT_TITLE (128 - 1) // 127 #define Prj_MAX_CHARS_PROJECT_TITLE (128 - 1) // 127
#define Prj_MAX_BYTES_ASSIGNMENT_TITLE ((Prj_MAX_CHARS_ASSIGNMENT_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047 #define Prj_MAX_BYTES_PROJECT_TITLE ((Prj_MAX_CHARS_PROJECT_TITLE + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Prj_NUM_TYPES_SEND_WORK 2 #define Prj_NUM_TYPES_PREASSIGNED 2
typedef enum typedef enum
{ {
Prj_DO_NOT_SEND_WORK = 0, Prj_NOT_PREASSIGNED = 0,
Prj_SEND_WORK = 1, Prj_PREASSIGNED = 1,
} Prj_SendWork_t; } Prj_Preassigned_t;
struct Project struct Project
{ {
@ -53,9 +53,8 @@ struct Project
long UsrCod; long UsrCod;
time_t TimeUTC[Dat_NUM_START_END_TIME]; time_t TimeUTC[Dat_NUM_START_END_TIME];
bool Open; bool Open;
char Title[Prj_MAX_BYTES_ASSIGNMENT_TITLE + 1]; char Title[Prj_MAX_BYTES_PROJECT_TITLE + 1];
Prj_SendWork_t SendWork; Prj_Preassigned_t Preassigned;
char Folder[Brw_MAX_BYTES_FOLDER + 1];
bool IBelongToCrsOrGrps; // I can do this assignment bool IBelongToCrsOrGrps; // I can do this assignment
// (it is associated to no groups // (it is associated to no groups
// or, if associated to groups, // or, if associated to groups,
@ -75,7 +74,6 @@ void Prj_PutHiddenParamPrjOrder (void);
void Prj_RequestCreatOrEditPrj (void); void Prj_RequestCreatOrEditPrj (void);
void Prj_GetListProjects (void); void Prj_GetListProjects (void);
void Prj_GetDataOfProjectByCod (struct Project *Prj); void Prj_GetDataOfProjectByCod (struct Project *Prj);
void Prj_GetDataOfProjectByFolder (struct Project *Prj);
void Prj_FreeListProjects (void); void Prj_FreeListProjects (void);
long Prj_GetParamPrjCod (void); long Prj_GetParamPrjCod (void);

View File

@ -2570,7 +2570,7 @@ static void Rec_PutIconsCommands (void)
/***** Button to view user's profile *****/ /***** Button to view user's profile *****/
Lay_PutContextualLink (ActSeeOthPubPrf,NULL, Lay_PutContextualLink (ActSeeOthPubPrf,NULL,
Rec_PutParamUsrCodEncrypted, Rec_PutParamUsrCodEncrypted,
"usr64x64.gif", "usr64x64.png",
ItsMe ? Txt_My_public_profile : ItsMe ? Txt_My_public_profile :
Txt_Another_user_s_profile,NULL, Txt_Another_user_s_profile,NULL,
NULL); NULL);

View File

@ -7025,7 +7025,6 @@ static void Sta_GetAndShowGamesStats (void)
extern const char *Txt_Number_of_BR_courses_with_BR_games; extern const char *Txt_Number_of_BR_courses_with_BR_games;
extern const char *Txt_Average_number_BR_of_games_BR_per_course; extern const char *Txt_Average_number_BR_of_games_BR_per_course;
unsigned NumGames; unsigned NumGames;
unsigned NumNotif;
unsigned NumCoursesWithGames = 0; unsigned NumCoursesWithGames = 0;
float NumGamesPerCourse = 0.0; float NumGamesPerCourse = 0.0;

View File

@ -83,6 +83,7 @@
#include "swad_menu.h" #include "swad_menu.h"
#include "swad_notification.h" #include "swad_notification.h"
#include "swad_photo.h" #include "swad_photo.h"
#include "swad_project.h"
#include "swad_QR.h" #include "swad_QR.h"
#include "swad_record.h" #include "swad_record.h"
#include "swad_social.h" #include "swad_social.h"
@ -30409,6 +30410,70 @@ const char *Txt_Post_unbanned =
"Post unbanned."; // Necessita de tradução "Post unbanned."; // Necessita de tradução
#endif #endif
const char *Txt_Preassigned_QUESTION =
#if L==1
"Preassignat?";
#elif L==2
"Vorzugeordnet?";
#elif L==3
"Preassigned?";
#elif L==4
"&iquest;Preasignado?";
#elif L==5
"Pr&eacute;assign&eacute;?";
#elif L==6
"&iquest;Preasignado?"; // Okoteve traducción
#elif L==7
"Preassegnato?";
#elif L==8
"Zadany?";
#elif L==9
"Pr&eacute;-atribu&iacute;do?";
#endif
const char *Txt_PREASSIGNED_TYPES[Prj_NUM_TYPES_PREASSIGNED] =
{
#if L==1
"No preassignat"
#elif L==2
"Nicht vorzugeordnet"
#elif L==3
"Not preassigned"
#elif L==4
"No preasignado"
#elif L==5
"Non pr&eacute;assign&eacute;"
#elif L==6
"No preasignado" // Okoteve traducción
#elif L==7
"Non preassegnato"
#elif L==8
"Nieprzypisane"
#elif L==9
"N&atilde;o pr&eacute;-atribu&iacute;do"
#endif
,
#if L==1
"Preassignat"
#elif L==2
"Vorzugeordnet"
#elif L==3
"Preassigned"
#elif L==4
"Preasignado"
#elif L==5
"Pr&eacute;assign&eacute;"
#elif L==6
"Preasignado" // Okoteve traducción
#elif L==7
"Preassegnato"
#elif L==8
"Zadany"
#elif L==9
"Pr&eacute;-atribu&iacute;do"
#endif
};
const char *Txt_Preferences = const char *Txt_Preferences =
#if L==1 #if L==1
"Prefer&egrave;ncies"; "Prefer&egrave;ncies";
@ -46511,7 +46576,7 @@ const char *Txt_The_project_has_been_modified =
#elif L==3 #elif L==3
"The project has been modified."; "The project has been modified.";
#elif L==4 #elif L==4
"Le projet ha sido modificado."; "El proyecto ha sido modificado.";
#elif L==5 #elif L==5
"Le projet a &eacute;t&eacute; modifi&eacute;."; "Le projet a &eacute;t&eacute; modifi&eacute;.";
#elif L==6 #elif L==6
@ -52569,7 +52634,7 @@ const char *Txt_Welcome_X_and_happy_birthday[Usr_NUM_SEXS] = // Warning: it is v
const char *Txt_What_would_you_like_to_do = const char *Txt_What_would_you_like_to_do =
#if L==1 #if L==1
"Qu&egrave; voleu fer?"; "&iquest;Qu&egrave; voleu fer?";
#elif L==2 #elif L==2
"Was w&uuml;rden Sie tun?"; "Was w&uuml;rden Sie tun?";
#elif L==3 #elif L==3