From 26baa58280ddd4b3ac5f10416659a2a00375aea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Fri, 23 Oct 2015 13:20:42 +0200 Subject: [PATCH] Version 15.18 --- css/swad_desktop.css | 1 + css/swad_mobile.css | 1 + js/swad.js | 59 ++++++++--- swad_assignment.c | 43 ++++---- swad_attendance.c | 240 +++++++++++++------------------------------ swad_attendance.h | 2 +- swad_changelog.h | 4 +- swad_file_browser.c | 8 +- swad_web_service.c | 19 +--- 9 files changed, 149 insertions(+), 228 deletions(-) diff --git a/css/swad_desktop.css b/css/swad_desktop.css index ca432a21..d1ba3bc4 100644 --- a/css/swad_desktop.css +++ b/css/swad_desktop.css @@ -403,6 +403,7 @@ hr.YELLOW_SEPARA {height:0; border-top:0; border-bottom:#BD4815 dotted 1px;} /*********************************** Icons ***********************************/ .ICON16x16 {width:20px; height:20px; vertical-align:middle;} +.ICON16x12B {width:20px; height:15px; vertical-align:middle; display:block;} .ICON16x16B {width:20px; height:20px; vertical-align:middle; display:block;} .ICON20x20 {width:25px; height:25px; vertical-align:middle;} .ICON28x28 {width:32px; height:32px; vertical-align:middle;} diff --git a/css/swad_mobile.css b/css/swad_mobile.css index 2e688bce..8e545257 100644 --- a/css/swad_mobile.css +++ b/css/swad_mobile.css @@ -370,6 +370,7 @@ form {margin:0; display:inline;} /*********************************** Icons ***********************************/ .ICON16x16 {width:20px; height:20px; vertical-align:middle;} +.ICON16x12B {width:20px; height:15px; vertical-align:middle; display:block;} .ICON16x16B {width:20px; height:20px; vertical-align:middle; display:block;} .ICON20x20 {width:25px; height:25px; vertical-align:middle;} .ICON32x32 {width:40px; height:40px; vertical-align:middle;} diff --git a/js/swad.js b/js/swad.js index 0bb99da3..c04d4ef0 100644 --- a/js/swad.js +++ b/js/swad.js @@ -35,30 +35,55 @@ var countClockConnected = 0; // Write a date in client local time function writeLocalDateFromUTC(id,secsSince1970UTC) { var d = new Date; + var Yea; + var Mon; + var Day; + var StrMon; + var StrDay; d.setTime(secsSince1970UTC * 1000); - document.getElementById(id).innerHTML = d.toLocaleDateString(); + Yea = d.getFullYear(); + Mon = d.getMonth() + 1; + Day = d.getDate(); + StrMon = ((Mon < 10) ? '0' : '') + Mon; + StrDay = ((Day < 10) ? '0' : '') + Day; + document.getElementById(id).innerHTML = Yea + '/' + StrMon + '/' + StrDay; } -// Write a date-time in client local time -function writeLocalDateTimeFromUTC(id,secsSince1970UTC) { +/*************** Write a date-time in client local time **********************/ +// - id is the id of the HTML element in which date-time will be written +// - secsSince1970UTC is the date-time to write in UTC UNIX time format +// - separator is HTML code to write between date and time + +function writeLocalDateTimeFromUTC(id,secsSince1970UTC,separator) { var d = new Date; - var H; - var M; - var S; - var StrH; - var StrM; - var StrS; + var Yea; + var Mon; + var Day; + var Hou; + var Min; + var Sec; + var StrMon; + var StrDay; + var StrHou; + var StrMin; + var StrSec; d.setTime(secsSince1970UTC * 1000); - H = d.getHours(); - M = d.getMinutes(); - S = d.getSeconds(); - StrH = ((H < 10) ? '0' : '') + H; - StrM = ((M < 10) ? '0' : '') + M; - StrS = ((S < 10) ? '0' : '') + S; - document.getElementById(id).innerHTML = d.toLocaleDateString() + '
' + - StrH + ':' + StrM + ':' + StrS; + Yea = d.getFullYear(); + Mon = d.getMonth() + 1; + Day = d.getDate(); + Hou = d.getHours(); + Min = d.getMinutes(); + Sec = d.getSeconds(); + StrMon = ((Mon < 10) ? '0' : '') + Mon; + StrDay = ((Day < 10) ? '0' : '') + Day; + StrHou = ((Hou < 10) ? '0' : '') + Hou; + StrMin = ((Min < 10) ? '0' : '') + Min; + StrSec = ((Sec < 10) ? '0' : '') + Sec; + document.getElementById(id).innerHTML = Yea + '/' + StrMon + '/' + StrDay + + separator + + StrHou + ':' + StrMin + ':' + StrSec; } // Set local date-time form fields from UTC time diff --git a/swad_assignment.c b/swad_assignment.c index 6d317bb7..80261005 100644 --- a/swad_assignment.c +++ b/swad_assignment.c @@ -241,9 +241,9 @@ static void Asg_ShowOneAssignment (long AsgCod) /* Start date/time */ UniqueId++; fprintf (Gbl.F.Out,"" - "" + "" "" "", UniqueId, @@ -256,9 +256,9 @@ static void Asg_ShowOneAssignment (long AsgCod) /* End date/time */ UniqueId++; - fprintf (Gbl.F.Out,"" + fprintf (Gbl.F.Out,"" "" "", UniqueId, @@ -685,11 +685,11 @@ static void Asg_GetDataOfAssignment (struct Assignment *Asg,const char *Query) /* Get author of the assignment (row[2]) */ Asg->UsrCod = Str_ConvertStrCodToLongCod (row[2]); - /* Get start date (row[3] holds the start date in YYYYMMDDHHMMSS format) */ + /* Get start date (row[3] holds the start UTC time) */ Asg->TimeUTC[Asg_START_TIME] = Dat_GetUNIXTimeFromStr (row[3]); - /* Get end date (row[4] holds the end date in YYYYMMDDHHMMSS format) */ - Asg->TimeUTC[Asg_END_TIME] = Dat_GetUNIXTimeFromStr (row[4]); + /* Get end date (row[4] holds the end UTC time) */ + Asg->TimeUTC[Asg_END_TIME ] = Dat_GetUNIXTimeFromStr (row[4]); /* Get whether the assignment is open or closed (row(5)) */ Asg->Open = (row[5][0] == '1'); @@ -1099,7 +1099,8 @@ void Asg_RequestCreatOrEditAsg (void) /* Date-time */ Dat_WriteFormClientLocalDateTime (Id[StartOrEndTime], Asg.TimeUTC[StartOrEndTime], - Gbl.Now.Date.Year-1,Gbl.Now.Date.Year+1, + Gbl.Now.Date.Year - 1, + Gbl.Now.Date.Year + 1, false,false); fprintf (Gbl.F.Out,"" @@ -1216,8 +1217,11 @@ void Asg_RecFormAssignment (void) extern const char *Txt_Already_existed_an_assignment_with_the_title_X; extern const char *Txt_Already_existed_an_assignment_with_the_folder_X; extern const char *Txt_You_must_specify_the_title_of_the_assignment; + extern const char *Txt_Created_new_assignment_X; + extern const char *Txt_The_assignment_has_been_modified; extern const char *Txt_You_can_not_disable_file_uploading_once_folders_have_been_created; - struct Assignment OldAsg,NewAsg; + struct Assignment OldAsg; + struct Assignment NewAsg; bool ItsANewAssignment; bool NewAssignmentIsCorrect = true; unsigned NumUsrsToBeNotifiedByEMail; @@ -1311,14 +1315,25 @@ void Asg_RecFormAssignment (void) Grp_GetParCodsSeveralGrpsToEditAsgAttOrSvy (); if (ItsANewAssignment) + { Asg_CreateAssignment (&NewAsg,Txt); // Add new assignment to database + + /***** Write success message *****/ + sprintf (Gbl.Message,Txt_Created_new_assignment_X,NewAsg.Title); + Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); + } else { if (OldAsg.Folder[0] && NewAsg.Folder[0]) if (strcmp (OldAsg.Folder,NewAsg.Folder)) // Folder name has changed NewAssignmentIsCorrect = Brw_UpdateFoldersAssigmentsIfExistForAllUsrs (OldAsg.Folder,NewAsg.Folder); if (NewAssignmentIsCorrect) + { Asg_UpdateAssignment (&NewAsg,Txt); + + /***** Write success message *****/ + Lay_ShowAlert (Lay_SUCCESS,Txt_The_assignment_has_been_modified); + } } /* Free memory for list of selected groups */ @@ -1358,7 +1373,6 @@ static void Asg_UpdateNumUsrsNotifiedByEMailAboutAssignment (long AsgCod,unsigne static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) { - extern const char *Txt_Created_new_assignment_X; char Query[1024+Cns_MAX_BYTES_TEXT]; /***** Create a new assignment *****/ @@ -1379,11 +1393,6 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) /***** Create groups *****/ if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps) Asg_CreateGrps (Asg->AsgCod); - - /***** Write success message *****/ - sprintf (Gbl.Message,Txt_Created_new_assignment_X, - Asg->Title); - Lay_ShowAlert (Lay_SUCCESS,Gbl.Message); } /*****************************************************************************/ @@ -1392,7 +1401,6 @@ static void Asg_CreateAssignment (struct Assignment *Asg,const char *Txt) static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) { - extern const char *Txt_The_assignment_has_been_modified; char Query[1024+Cns_MAX_BYTES_TEXT]; /***** Update the data of the assignment *****/ @@ -1416,9 +1424,6 @@ static void Asg_UpdateAssignment (struct Assignment *Asg,const char *Txt) /* Create new groups */ if (Gbl.CurrentCrs.Grps.LstGrpsSel.NumGrps) Asg_CreateGrps (Asg->AsgCod); - - /***** Write success message *****/ - Lay_ShowAlert (Lay_SUCCESS,Txt_The_assignment_has_been_modified); } /*****************************************************************************/ diff --git a/swad_attendance.c b/swad_attendance.c index 783619ff..e258db64 100644 --- a/swad_attendance.c +++ b/swad_attendance.c @@ -258,6 +258,7 @@ static void Att_PutFormToSelectWhichGroupsToShow (void) static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAttEventComplete) { extern const char *Txt_View_event; + static unsigned UniqueId = 0; char Txt[Cns_MAX_BYTES_TEXT+1]; /***** Get data of this attendance event *****/ @@ -265,8 +266,10 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt Att_GetNumStdsTotalWhoAreInAttEvent (Att); /***** Start date/time *****/ + UniqueId++; fprintf (Gbl.F.Out,"" \ - "Hidden ? (Att->Open ? "DATE_GREEN_LIGHT" : "DATE_RED_LIGHT") : (Att->Open ? "DATE_GREEN" : @@ -274,17 +277,15 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt if (!ShowOnlyThisAttEventComplete) fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd); fprintf (Gbl.F.Out,"\">" - "%02u/%02u/%02u
" - "%02u:%02u h" + "" "", - Att->DateTimes[Att_START_TIME].Date.Day, - Att->DateTimes[Att_START_TIME].Date.Month, - Att->DateTimes[Att_START_TIME].Date.Year % 100, - Att->DateTimes[Att_START_TIME].Time.Hour, - Att->DateTimes[Att_START_TIME].Time.Minute); + UniqueId,Att->TimeUTC[Att_START_TIME]); /***** End date/time *****/ - fprintf (Gbl.F.Out,"Hidden ? (Att->Open ? "DATE_GREEN_LIGHT" : "DATE_RED_LIGHT") : (Att->Open ? "DATE_GREEN" : @@ -292,14 +293,11 @@ static void Att_ShowOneAttEvent (struct AttendanceEvent *Att,bool ShowOnlyThisAt if (!ShowOnlyThisAttEventComplete) fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd); fprintf (Gbl.F.Out,"\">" - "%02u/%02u/%02u
" - "%02u:%02u h" + "" "", - Att->DateTimes[Att_END_TIME ].Date.Day, - Att->DateTimes[Att_END_TIME ].Date.Month, - Att->DateTimes[Att_END_TIME ].Date.Year % 100, - Att->DateTimes[Att_END_TIME ].Time.Hour, - Att->DateTimes[Att_END_TIME ].Time.Minute); + UniqueId,Att->TimeUTC[Att_END_TIME]); /***** Attendance event title *****/ fprintf (Gbl.F.Out,"AttCod); /***** Clear data *****/ - Att->DateTimes[Att_START_TIME].Date.Day = - Att->DateTimes[Att_START_TIME].Date.Month = - Att->DateTimes[Att_START_TIME].Date.Year = 0; + Att->TimeUTC[Att_START_TIME] = + Att->TimeUTC[Att_END_TIME ] = (time_t) 0; Att->Title[0] = '\0'; /***** Get data of attendance event from database *****/ @@ -673,13 +670,11 @@ bool Att_GetDataOfAttEventByCod (struct AttendanceEvent *Att) /* Get author of the attendance event (row[3]) */ Att->UsrCod = Str_ConvertStrCodToLongCod (row[3]); - /* Get start date (row[4] holds the start date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(Att->DateTimes[Att_START_TIME]),row[4]))) - Lay_ShowErrorAndExit ("Error when reading start date of attendance event."); + /* Get start date (row[4] holds the start UTC time) */ + Att->TimeUTC[Att_START_TIME] = Dat_GetUNIXTimeFromStr (row[4]); - /* Get end date (row[5] holds the end date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&(Att->DateTimes[Att_END_TIME]),row[5]))) - Lay_ShowErrorAndExit ("Error when reading end date of attendance event."); + /* Get end date (row[5] holds the end UTC time) */ + Att->TimeUTC[Att_END_TIME ] = Dat_GetUNIXTimeFromStr (row[5]); /* Get whether the attendance event is open or closed (row(6)) */ Att->Open = (row[6][0] == '1'); @@ -753,22 +748,14 @@ static void Att_GetAttEventTxtFromDB (long AttCod,char *Txt) void Att_GetNotifAttEvent (char *SummaryStr,char **ContentStr,long AttCod,unsigned MaxChars,bool GetContent) { - extern const char *Txt_Start_date; - extern const char *Txt_End_date; char Query[512]; MYSQL_RES *mysql_res; MYSQL_ROW row; - struct DateTime DateTimes[Att_NUM_DATES]; SummaryStr[0] = '\0'; // Return nothing on error /***** Build query *****/ - sprintf (Query,"SELECT Title," - "DATE_FORMAT(StartTime,'%%Y%%m%%d%%H%%i%%S')," - "DATE_FORMAT(EndTime,'%%Y%%m%%d%%H%%i%%S')," - "Txt" - " FROM att_events" - " WHERE AttCod='%ld'", + sprintf (Query,"SELECT Title,Txt FROM att_events WHERE AttCod='%ld'", AttCod); if (!mysql_query (&Gbl.mysql,Query)) if ((mysql_res = mysql_store_result (&Gbl.mysql)) != NULL) @@ -789,30 +776,7 @@ void Att_GetNotifAttEvent (char *SummaryStr,char **ContentStr,long AttCod,unsign { if ((*ContentStr = (char *) malloc (512+Cns_MAX_BYTES_TEXT)) == NULL) Lay_ShowErrorAndExit ("Error allocating memory for notification content."); - (*ContentStr)[0] = '\0'; // Return nothing on error - - /* Get start date (row[1] holds the start date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&DateTimes[Att_START_TIME],row[1]))) - Lay_ShowErrorAndExit ("Error when reading start date of attendance event."); - - /* Get end date (row[2] holds the end date in YYYYMMDDHHMMSS format) */ - if (!(Dat_GetDateTimeFromYYYYMMDDHHMMSS (&DateTimes[Att_END_TIME ],row[2]))) - Lay_ShowErrorAndExit ("Error when reading end date of attendance event."); - - sprintf (*ContentStr,"%s: %02u/%02u/%04u %02u:%02u
%s: %02u/%02u/%04u %02u:%02u
%s", - Txt_Start_date, - DateTimes[Att_START_TIME].Date.Day, - DateTimes[Att_START_TIME].Date.Month, - DateTimes[Att_START_TIME].Date.Year, - DateTimes[Att_START_TIME].Time.Hour, - DateTimes[Att_START_TIME].Time.Minute, - Txt_End_date, - DateTimes[Att_END_TIME].Date.Day, - DateTimes[Att_END_TIME].Date.Month, - DateTimes[Att_END_TIME].Date.Year, - DateTimes[Att_END_TIME].Time.Hour, - DateTimes[Att_END_TIME].Time.Minute, - row[3]); + strcpy (*ContentStr,row[1]); } } mysql_free_result (mysql_res); @@ -1023,8 +987,6 @@ void Att_RequestCreatOrEditAttEvent (void) bool ItsANewAttEvent; Att_StartOrEndTime_t StartOrEndTime; const char *Id[Att_NUM_DATES] = {"Start","End"}; - const char *NameSelectHour [Att_NUM_DATES] = {"StartHour" ,"EndHour" }; - const char *NameSelectMinute[Att_NUM_DATES] = {"StartMinute","EndMinute"}; const char *Dates[Att_NUM_DATES] = {Txt_Start_date,Txt_End_date}; char Txt[Cns_MAX_BYTES_TEXT+1]; @@ -1041,18 +1003,8 @@ void Att_RequestCreatOrEditAttEvent (void) { /* Initialize to empty attendance event */ Att.AttCod = -1L; - Att.DateTimes[Att_START_TIME].Date.Day = Gbl.Now.Date.Day; - Att.DateTimes[Att_START_TIME].Date.Month = Gbl.Now.Date.Month; - Att.DateTimes[Att_START_TIME].Date.Year = Gbl.Now.Date.Year; - Att.DateTimes[Att_START_TIME].Time.Hour = Gbl.Now.Time.Hour; - Att.DateTimes[Att_START_TIME].Time.Minute = Gbl.Now.Time.Minute; - Att.DateTimes[Att_START_TIME].Time.Second = Gbl.Now.Time.Second; - - Att.DateTimes[Att_END_TIME ].Date.Day = Gbl.Now.Date.Day; - Att.DateTimes[Att_END_TIME ].Date.Month = Gbl.Now.Date.Month; - Att.DateTimes[Att_END_TIME ].Date.Year = Gbl.Now.Date.Year; - Att.DateTimes[Att_END_TIME ].Time.Hour = 23; - Att.DateTimes[Att_END_TIME ].Time.Minute = 59; + Att.TimeUTC[Asg_START_TIME] = Gbl.TimeStartExecution; + Att.TimeUTC[Asg_END_TIME ] = Gbl.TimeStartExecution + (2 * 60 * 60); // +2 hours Att.Open = true; Att.Title[0] = '\0'; } @@ -1107,22 +1059,15 @@ void Att_RequestCreatOrEditAttEvent (void) "" "" "" - "" "
", - The_ClassForm[Gbl.Prefs.Theme],Dates[StartOrEndTime]); + The_ClassForm[Gbl.Prefs.Theme], + Dates[StartOrEndTime]); - /* Date */ - Dat_WriteFormDate (Gbl.Now.Date.Year-1,Gbl.Now.Date.Year+1, - Id[StartOrEndTime], - &(Att.DateTimes[StartOrEndTime].Date), - false,false); - - fprintf (Gbl.F.Out,""); - - /* Time */ - Dat_WriteFormHourMinute (NameSelectHour [StartOrEndTime], - NameSelectMinute[StartOrEndTime], - &(Att.DateTimes[StartOrEndTime].Time), - false,false); + /* Date-time */ + Dat_WriteFormClientLocalDateTime (Id[StartOrEndTime], + Att.TimeUTC[StartOrEndTime], + Gbl.Now.Date.Year - 1, + Gbl.Now.Date.Year + 1, + false,false); fprintf (Gbl.F.Out,"
" @@ -1246,7 +1191,8 @@ void Att_RecFormAttEvent (void) extern const char *Txt_You_must_specify_the_title_of_the_event; extern const char *Txt_Created_new_event_X; extern const char *Txt_The_event_has_been_modified; - struct AttendanceEvent OldAtt,NewAtt; + struct AttendanceEvent OldAtt; + struct AttendanceEvent NewAtt; char YN[1+1]; bool ItsANewAttEvent; bool NewAttEventIsCorrect = true; @@ -1262,25 +1208,9 @@ void Att_RecFormAttEvent (void) Att_GetDataOfAttEventByCodAndCheckCrs (&OldAtt); } - /***** Get start date *****/ - Dat_GetDateFromForm ("StartDay","StartMonth","StartYear", - &(NewAtt.DateTimes[Att_START_TIME].Date.Day), - &(NewAtt.DateTimes[Att_START_TIME].Date.Month), - &(NewAtt.DateTimes[Att_START_TIME].Date.Year)); - Dat_GetHourMinuteFromForm ("StartHour","StartMinute", - &(NewAtt.DateTimes[Att_START_TIME].Time.Hour), - &(NewAtt.DateTimes[Att_START_TIME].Time.Minute)); - NewAtt.DateTimes[Att_START_TIME].Time.Second = 0; - - /***** Get end date *****/ - Dat_GetDateFromForm ("EndDay","EndMonth","EndYear", - &(NewAtt.DateTimes[Att_END_TIME].Date.Day), - &(NewAtt.DateTimes[Att_END_TIME].Date.Month), - &(NewAtt.DateTimes[Att_END_TIME].Date.Year)); - Dat_GetHourMinuteFromForm ("EndHour","EndMinute", - &(NewAtt.DateTimes[Att_END_TIME].Time.Hour), - &(NewAtt.DateTimes[Att_END_TIME].Time.Minute)); - NewAtt.DateTimes[Att_END_TIME].Time.Second = 59; + /***** Get start/end date-times *****/ + NewAtt.TimeUTC[Asg_START_TIME] = Dat_GetTimeUTCFromForm ("StartTimeUTC"); + NewAtt.TimeUTC[Asg_END_TIME ] = Dat_GetTimeUTCFromForm ("EndTimeUTC" ); /***** Get boolean parameter that indicates if teacher's comments are visible by students *****/ Par_GetParToText ("CommentTchVisible",YN,1); @@ -1293,26 +1223,10 @@ void Att_RecFormAttEvent (void) Par_GetParToHTML ("Txt",Txt,Cns_MAX_BYTES_TEXT); // Store in HTML format (not rigorous) /***** Adjust dates *****/ - if (NewAtt.DateTimes[Att_START_TIME].Date.Day == 0 || - NewAtt.DateTimes[Att_START_TIME].Date.Month == 0 || - NewAtt.DateTimes[Att_START_TIME].Date.Year == 0) - { - NewAtt.DateTimes[Att_START_TIME].Date.Day = Gbl.Now.Date.Day; - NewAtt.DateTimes[Att_START_TIME].Date.Month = Gbl.Now.Date.Month; - NewAtt.DateTimes[Att_START_TIME].Date.Year = Gbl.Now.Date.Year; - NewAtt.DateTimes[Att_START_TIME].Time.Hour = Gbl.Now.Time.Hour; - NewAtt.DateTimes[Att_START_TIME].Time.Minute = Gbl.Now.Time.Minute; - } - if (NewAtt.DateTimes[Att_END_TIME].Date.Day == 0 || - NewAtt.DateTimes[Att_END_TIME].Date.Month == 0 || - NewAtt.DateTimes[Att_END_TIME].Date.Year == 0) - { - NewAtt.DateTimes[Att_END_TIME].Date.Day = Gbl.Now.Date.Day; - NewAtt.DateTimes[Att_END_TIME].Date.Month = Gbl.Now.Date.Month; - NewAtt.DateTimes[Att_END_TIME].Date.Year = Gbl.Now.Date.Year; - NewAtt.DateTimes[Att_END_TIME].Time.Hour = 23; - NewAtt.DateTimes[Att_END_TIME].Time.Minute = 59; - } + if (NewAtt.TimeUTC[Asg_START_TIME] == 0) + NewAtt.TimeUTC[Asg_START_TIME] = Gbl.TimeStartExecution; + if (NewAtt.TimeUTC[Asg_END_TIME] == 0) + NewAtt.TimeUTC[Asg_END_TIME] = NewAtt.TimeUTC[Asg_START_TIME] + 2*60*60; // +2 hours /***** Check if title is correct *****/ if (NewAtt.Title[0]) // If there's an attendance event title @@ -1374,21 +1288,12 @@ void Att_CreateAttEvent (struct AttendanceEvent *Att,const char *Txt) /***** Create a new attendance event *****/ sprintf (Query,"INSERT INTO att_events (CrsCod,UsrCod,StartTime,EndTime,CommentTchVisible,Title,Txt)" - " VALUES ('%ld','%ld','%04u%02u%02u%02u%02u%02u','%04u%02u%02u%02u%02u%02u','%c','%s','%s')", + " VALUES ('%ld','%ld',FROM_UNIXTIME('%ld'),FROM_UNIXTIME('%ld')," + "'%c','%s','%s')", Gbl.CurrentCrs.Crs.CrsCod, Gbl.Usrs.Me.UsrDat.UsrCod, - Att->DateTimes[Att_START_TIME].Date.Year, - Att->DateTimes[Att_START_TIME].Date.Month, - Att->DateTimes[Att_START_TIME].Date.Day, - Att->DateTimes[Att_START_TIME].Time.Hour, - Att->DateTimes[Att_START_TIME].Time.Minute, - Att->DateTimes[Att_START_TIME].Time.Second, - Att->DateTimes[Att_END_TIME ].Date.Year, - Att->DateTimes[Att_END_TIME ].Date.Month, - Att->DateTimes[Att_END_TIME ].Date.Day, - Att->DateTimes[Att_END_TIME ].Time.Hour, - Att->DateTimes[Att_END_TIME ].Time.Minute, - Att->DateTimes[Att_END_TIME ].Time.Second, + Att->TimeUTC[Asg_START_TIME], + Att->TimeUTC[Asg_END_TIME ], Att->CommentTchVisible ? 'Y' : 'N', Att->Title, @@ -1409,22 +1314,13 @@ void Att_UpdateAttEvent (struct AttendanceEvent *Att,const char *Txt) char Query[1024+Cns_MAX_BYTES_TEXT]; /***** Update the data of the attendance event *****/ - sprintf (Query,"UPDATE att_events" - " SET StartTime='%04u%02u%02u%02u%02u%02u',EndTime='%04u%02u%02u%02u%02u%02u'," + sprintf (Query,"UPDATE att_events SET " + "StartTime=FROM_UNIXTIME('%ld')," + "EndTime=FROM_UNIXTIME('%ld')," "CommentTchVisible='%c',Title='%s',Txt='%s'" " WHERE AttCod='%ld' AND CrsCod='%ld'", - Att->DateTimes[Att_START_TIME].Date.Year, - Att->DateTimes[Att_START_TIME].Date.Month, - Att->DateTimes[Att_START_TIME].Date.Day, - Att->DateTimes[Att_START_TIME].Time.Hour, - Att->DateTimes[Att_START_TIME].Time.Minute, - Att->DateTimes[Att_START_TIME].Time.Second, - Att->DateTimes[Att_END_TIME ].Date.Year, - Att->DateTimes[Att_END_TIME ].Date.Month, - Att->DateTimes[Att_END_TIME ].Date.Day , - Att->DateTimes[Att_END_TIME ].Time.Hour, - Att->DateTimes[Att_END_TIME ].Time.Minute, - Att->DateTimes[Att_END_TIME ].Time.Second, + Att->TimeUTC[Asg_START_TIME], + Att->TimeUTC[Asg_END_TIME ], Att->CommentTchVisible ? 'Y' : 'N', Att->Title, @@ -2923,6 +2819,7 @@ static void Att_ListEventsToSelect (void) extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS]; extern const char *Txt_Update_attendance_according_to_selected_events; extern const char *Txt_Update_attendance; + static unsigned UniqueId = 0; unsigned NumAttEvent; /***** Start form to update the attendance @@ -2954,6 +2851,8 @@ static void Att_ListEventsToSelect (void) NumAttEvent < Gbl.AttEvents.Num; NumAttEvent++) { + UniqueId++; + /* Get data of the attendance event from database */ Att_GetDataOfAttEventByCodAndCheckCrs (&Gbl.AttEvents.Lst[NumAttEvent]); Att_GetNumStdsTotalWhoAreInAttEvent (&Gbl.AttEvents.Lst[NumAttEvent]); @@ -2972,7 +2871,10 @@ static void Att_ListEventsToSelect (void) "%u:" "" "" - "%02u/%02u/%04u %02u:%02u h %s" + " %s" + "" "" "" "%u" @@ -2981,12 +2883,9 @@ static void Att_ListEventsToSelect (void) Gbl.RowEvenOdd, NumAttEvent + 1, Gbl.RowEvenOdd, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Day, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Month, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Year, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Time.Hour, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Time.Minute, + UniqueId, Gbl.AttEvents.Lst[NumAttEvent].Title, + UniqueId,Gbl.AttEvents.Lst[NumAttEvent].TimeUTC[Att_START_TIME], Gbl.RowEvenOdd, Gbl.AttEvents.Lst[NumAttEvent].NumStdsTotal); @@ -3275,6 +3174,7 @@ static void Att_ListAttEventsForAStd (unsigned NumStd,struct UsrData *UsrDat) extern const char *Txt_Absent; extern const char *Txt_Student_comment; extern const char *Txt_Teachers_comment; + static unsigned UniqueId = 0; char PhotoURL[PATH_MAX+1]; bool ShowPhoto; unsigned NumAttEvent; @@ -3341,6 +3241,7 @@ static void Att_ListAttEventsForAStd (unsigned NumStd,struct UsrData *UsrDat) Present = Att_CheckIfUsrIsPresentInAttEventAndGetComments (Gbl.AttEvents.Lst[NumAttEvent].AttCod,UsrDat->UsrCod,CommentStd,CommentTch); /***** Write a row for this event *****/ + UniqueId++; fprintf (Gbl.F.Out,"" "" "" @@ -3349,7 +3250,11 @@ static void Att_ListAttEventsForAStd (unsigned NumStd,struct UsrData *UsrDat) "" "\"%s\"" - " %02u/%02u/%04u %02u:%02u h %s" + " %s" + "" + "" "", Gbl.RowEvenOdd, Gbl.RowEvenOdd, @@ -3362,12 +3267,9 @@ static void Att_ListAttEventsForAStd (unsigned NumStd,struct UsrData *UsrDat) Txt_Absent, Present ? Txt_Present : Txt_Absent, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Day, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Month, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Date.Year, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Time.Hour, - Gbl.AttEvents.Lst[NumAttEvent].DateTimes[Att_START_TIME].Time.Minute, - Gbl.AttEvents.Lst[NumAttEvent].Title); + UniqueId, + Gbl.AttEvents.Lst[NumAttEvent].Title, + UniqueId,Gbl.AttEvents.Lst[NumAttEvent].TimeUTC[Att_START_TIME]); /***** Write comments for this student *****/ if (CommentStd[0] || diff --git a/swad_attendance.h b/swad_attendance.h index d067d088..19eaf7bf 100644 --- a/swad_attendance.h +++ b/swad_attendance.h @@ -49,7 +49,7 @@ struct AttendanceEvent long CrsCod; bool Hidden; long UsrCod; - struct DateTime DateTimes[Att_NUM_DATES]; + time_t TimeUTC[Att_NUM_DATES]; bool Open; char Title[Att_MAX_LENGTH_ATTENDANCE_EVENT_TITLE+1]; bool CommentTchVisible; diff --git a/swad_changelog.h b/swad_changelog.h index 294d782e..156bcf46 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -108,11 +108,13 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 15.17.3 (2015/10/23)" +#define Log_PLATFORM_VERSION "SWAD 15.18 (2015/10/23)" // 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 /* + Version 15.18: Oct 23, 2015 Attendance date-times are displayed in client local date-time. + Changes in JavaScript functions related to date-time. (186403 lines) Version 15.17.3: Oct 23, 2015 Changes in JavaScript functions related to date-time. (186477 lines) Version 15.17.2: Oct 23, 2015 Code refactoring related to forms. (186472 lines) Version 15.17.1: Oct 23, 2015 Code refactoring related to dates and JavaScript. (186407 lines) diff --git a/swad_file_browser.c b/swad_file_browser.c index 9b762841..cc7223ac 100644 --- a/swad_file_browser.c +++ b/swad_file_browser.c @@ -5783,7 +5783,7 @@ static void Brw_WriteDatesAssignment (void) Gbl.FileBrowser.Asg.Open ? "ASG_LST_DATE_GREEN" : "ASG_LST_DATE_RED"); fprintf (Gbl.F.Out,"", UniqueId, (long) Gbl.FileBrowser.Asg.TimeUTC[Asg_START_TIME]); @@ -5793,7 +5793,7 @@ static void Brw_WriteDatesAssignment (void) fprintf (Gbl.F.Out,"" "\"\"" + " class=\"ICON16x12B\" />" "", Gbl.Prefs.IconsURL, Gbl.FileBrowser.Asg.Open ? "green" : @@ -5805,7 +5805,7 @@ static void Brw_WriteDatesAssignment (void) Gbl.FileBrowser.Asg.Open ? "ASG_LST_DATE_GREEN" : "ASG_LST_DATE_RED"); fprintf (Gbl.F.Out,"", UniqueId, (long) Gbl.FileBrowser.Asg.TimeUTC[Asg_END_TIME]); @@ -8986,7 +8986,7 @@ void Brw_ShowFileMetadata (void) The_ClassForm[Gbl.Prefs.Theme],Txt_Date_of_creation); fprintf (Gbl.F.Out,"", (long) FileMetadata.Time); diff --git a/swad_web_service.c b/swad_web_service.c index cbe9060d..b7cd0c5d 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -2087,7 +2087,6 @@ int swad__sendAttendanceEvent (struct soap *soap, { int ReturnCode; struct AttendanceEvent Att; - time_t StartOrEndTime; bool ItsANewAttEvent; const char *Ptr; char LongStr[1+10+1]; @@ -2151,24 +2150,10 @@ int swad__sendAttendanceEvent (struct soap *soap, Att.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod; /* startTime */ - StartOrEndTime = (time_t) startTime; - Dat_GetLocalTimeFromClock (&StartOrEndTime); - Att.DateTimes[Att_START_TIME].Date.Year = Gbl.tblock->tm_year + 1900; - Att.DateTimes[Att_START_TIME].Date.Month = Gbl.tblock->tm_mon + 1; - Att.DateTimes[Att_START_TIME].Date.Day = Gbl.tblock->tm_mday; - Att.DateTimes[Att_START_TIME].Time.Hour = Gbl.tblock->tm_hour; - Att.DateTimes[Att_START_TIME].Time.Minute = Gbl.tblock->tm_min; - Att.DateTimes[Att_START_TIME].Time.Second = Gbl.tblock->tm_sec; + Att.TimeUTC[Att_START_TIME] = (time_t) startTime; /* endTime */ - StartOrEndTime = (time_t) endTime; - Dat_GetLocalTimeFromClock (&StartOrEndTime); - Att.DateTimes[Att_END_TIME].Date.Year = Gbl.tblock->tm_year + 1900; - Att.DateTimes[Att_END_TIME].Date.Month = Gbl.tblock->tm_mon + 1; - Att.DateTimes[Att_END_TIME].Date.Day = Gbl.tblock->tm_mday; - Att.DateTimes[Att_END_TIME].Time.Hour = Gbl.tblock->tm_hour; - Att.DateTimes[Att_END_TIME].Time.Minute = Gbl.tblock->tm_min; - Att.DateTimes[Att_END_TIME].Time.Second = Gbl.tblock->tm_sec; + Att.TimeUTC[Att_END_TIME ] = (time_t) endTime; /* Are teacher's comments visible? */ Att.CommentTchVisible = (commentsTeachersVisible ? true :