Version 15.42

This commit is contained in:
Antonio Cañas Vargas 2015-11-21 20:23:28 +01:00
parent 0b13d86fc2
commit 0936bb7bc2
26 changed files with 438 additions and 217 deletions

View File

@ -7,6 +7,7 @@ CREATE TABLE IF NOT EXISTS IP_prefs (
IP CHAR(15) NOT NULL,
UsrCod INT NOT NULL DEFAULT -1,
LastChange DATETIME NOT NULL,
FirstDayOfWeek TINYINT NOT NULL DEFAULT 0,
Layout TINYINT NOT NULL DEFAULT 0,
Theme CHAR(16) NOT NULL,
IconSet CHAR(16) NOT NULL,
@ -1127,6 +1128,7 @@ CREATE TABLE IF NOT EXISTS usr_data (
Theme CHAR(16) NOT NULL,
IconSet CHAR(16) NOT NULL,
Language CHAR(2) NOT NULL,
FirstDayOfWeek TINYINT NOT NULL DEFAULT 0,
Photo CHAR(43) NOT NULL,
PhotoVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user',
ProfileVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user',
@ -1154,6 +1156,7 @@ CREATE TABLE IF NOT EXISTS usr_data (
INDEX(Theme),
INDEX(IconSet),
INDEX(Language),
INDEX(FirstDayOfWeek),
INDEX(CtyCod),
INDEX(InsCtyCod),
INDEX(InsCod),

View File

@ -29,6 +29,7 @@
#include "swad_account.h"
#include "swad_announcement.h"
#include "swad_calendar.h"
#include "swad_database.h"
#include "swad_enrollment.h"
#include "swad_global.h"
@ -433,12 +434,12 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat)
/***** Insert new user in database *****/
/* Insert user's data */
sprintf (Query,"INSERT INTO usr_data (EncryptedUsrCod,Password,Surname1,Surname2,FirstName,Sex,"
"Layout,Theme,IconSet,Language,PhotoVisibility,ProfileVisibility,"
"Layout,Theme,IconSet,Language,FirstDayOfWeek,PhotoVisibility,ProfileVisibility,"
"CtyCod,"
"LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments,"
"Menu,SideCols,NotifNtfEvents,EmailNtfEvents)"
" VALUES ('%s','%s','%s','%s','%s','%s',"
"'%u','%s','%s','%s','%s','%s',"
"'%u','%s','%s','%s','%u','%s','%s',"
"'%ld',"
"'%s','%s','%s','%s','%s','%04u-%02u-%02u','%s',"
"'%u','%u','-1','0')",
@ -450,6 +451,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat)
The_ThemeId[UsrDat->Prefs.Theme],
Ico_IconSetId[UsrDat->Prefs.IconSet],
Txt_STR_LANG_ID[UsrDat->Prefs.Language],
Cal_FIRST_DAY_OF_WEEK_DEFAULT,
Pri_VisibilityDB[UsrDat->PhotoVisibility],
Pri_VisibilityDB[UsrDat->ProfileVisibility],
UsrDat->CtyCod,

View File

@ -1273,6 +1273,7 @@ Profile:
1078. ActChgThe Change theme
1079. ActReqChgLan Ask if change language
1080. ActChgLan Change language
-----> 1080. ActChg1stDay Change first day of the week
1081. ActChgCol Change side columns
1082. ActHidLftCol Hide left side column
1083. ActHidRgtCol Hide right side column
@ -2754,6 +2755,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActChgThe */{ 841,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,The_ChangeTheme ,Pre_EditPrefs ,NULL},
/* ActReqChgLan */{ 992,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pre_AskChangeLanguage ,NULL},
/* ActChgLan */{ 654,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeLanguage ,Pre_EditPrefs ,NULL},
/* ActChg1stDay */{1484,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Cal_ChangeFirstDayOfWeek ,Pre_EditPrefs ,NULL},
/* ActChgCol */{ 674,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_ChangeSideCols ,Pre_EditPrefs ,NULL},
/* ActHidLftCol */{ 668,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideLeftCol ,Pre_EditPrefs ,NULL},
/* ActHidRgtCol */{ 669,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pre_HideRightCol ,Pre_EditPrefs ,NULL},
@ -4278,6 +4280,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActNewMaiOth, // #1481
ActNewMaiStd, // #1482
ActNewMaiTch, // #1483
ActChg1stDay, // #1484
};
/*****************************************************************************/

View File

@ -70,9 +70,9 @@ typedef enum
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+182+154+171+27+79)
#define Act_NUM_ACTIONS (7+52+15+90+73+68+204+182+154+171+27+80)
#define Act_MAX_ACTION_COD 1483
#define Act_MAX_ACTION_COD 1484
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20
@ -1314,38 +1314,39 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
#define ActChgThe (ActSeeAllStaCrs+47)
#define ActReqChgLan (ActSeeAllStaCrs+48)
#define ActChgLan (ActSeeAllStaCrs+49)
#define ActChgCol (ActSeeAllStaCrs+50)
#define ActHidLftCol (ActSeeAllStaCrs+51)
#define ActHidRgtCol (ActSeeAllStaCrs+52)
#define ActShoLftCol (ActSeeAllStaCrs+53)
#define ActShoRgtCol (ActSeeAllStaCrs+54)
#define ActChgIco (ActSeeAllStaCrs+55)
#define ActChgMnu (ActSeeAllStaCrs+56)
#define ActChgNtfPrf (ActSeeAllStaCrs+57)
#define ActChg1stDay (ActSeeAllStaCrs+50)
#define ActChgCol (ActSeeAllStaCrs+51)
#define ActHidLftCol (ActSeeAllStaCrs+52)
#define ActHidRgtCol (ActSeeAllStaCrs+53)
#define ActShoLftCol (ActSeeAllStaCrs+54)
#define ActShoRgtCol (ActSeeAllStaCrs+55)
#define ActChgIco (ActSeeAllStaCrs+56)
#define ActChgMnu (ActSeeAllStaCrs+57)
#define ActChgNtfPrf (ActSeeAllStaCrs+58)
#define ActPrnUsrQR (ActSeeAllStaCrs+58)
#define ActPrnUsrQR (ActSeeAllStaCrs+59)
#define ActPrnMyTimTbl (ActSeeAllStaCrs+59)
#define ActEdiTut (ActSeeAllStaCrs+60)
#define ActChgTut (ActSeeAllStaCrs+61)
#define ActReqRemFilBrf (ActSeeAllStaCrs+62)
#define ActRemFilBrf (ActSeeAllStaCrs+63)
#define ActRemFolBrf (ActSeeAllStaCrs+64)
#define ActCopBrf (ActSeeAllStaCrs+65)
#define ActPasBrf (ActSeeAllStaCrs+66)
#define ActRemTreBrf (ActSeeAllStaCrs+67)
#define ActFrmCreBrf (ActSeeAllStaCrs+68)
#define ActCreFolBrf (ActSeeAllStaCrs+69)
#define ActCreLnkBrf (ActSeeAllStaCrs+70)
#define ActRenFolBrf (ActSeeAllStaCrs+71)
#define ActRcvFilBrfDZ (ActSeeAllStaCrs+72)
#define ActRcvFilBrfCla (ActSeeAllStaCrs+73)
#define ActExpBrf (ActSeeAllStaCrs+74)
#define ActConBrf (ActSeeAllStaCrs+75)
#define ActZIPBrf (ActSeeAllStaCrs+76)
#define ActReqDatBrf (ActSeeAllStaCrs+77)
#define ActChgDatBrf (ActSeeAllStaCrs+78)
#define ActDowBrf (ActSeeAllStaCrs+79)
#define ActPrnMyTimTbl (ActSeeAllStaCrs+60)
#define ActEdiTut (ActSeeAllStaCrs+61)
#define ActChgTut (ActSeeAllStaCrs+62)
#define ActReqRemFilBrf (ActSeeAllStaCrs+63)
#define ActRemFilBrf (ActSeeAllStaCrs+64)
#define ActRemFolBrf (ActSeeAllStaCrs+65)
#define ActCopBrf (ActSeeAllStaCrs+66)
#define ActPasBrf (ActSeeAllStaCrs+67)
#define ActRemTreBrf (ActSeeAllStaCrs+68)
#define ActFrmCreBrf (ActSeeAllStaCrs+69)
#define ActCreFolBrf (ActSeeAllStaCrs+70)
#define ActCreLnkBrf (ActSeeAllStaCrs+71)
#define ActRenFolBrf (ActSeeAllStaCrs+72)
#define ActRcvFilBrfDZ (ActSeeAllStaCrs+73)
#define ActRcvFilBrfCla (ActSeeAllStaCrs+74)
#define ActExpBrf (ActSeeAllStaCrs+75)
#define ActConBrf (ActSeeAllStaCrs+76)
#define ActZIPBrf (ActSeeAllStaCrs+77)
#define ActReqDatBrf (ActSeeAllStaCrs+78)
#define ActChgDatBrf (ActSeeAllStaCrs+79)
#define ActDowBrf (ActSeeAllStaCrs+80)
/*****************************************************************************/
/******************************** Public types *******************************/

View File

@ -28,7 +28,11 @@
#include <string.h> // For string functions
#include "swad_exam.h"
#include "swad_calendar.h"
#include "swad_database.h"
#include "swad_global.h"
#include "swad_parameter.h"
#include "swad_preference.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
@ -40,10 +44,103 @@ extern struct Globals Gbl;
/**************************** Private constants ******************************/
/*****************************************************************************/
const bool Cal_DayIsValidAsFirstDayOfWeek[7] =
{
true, // 0: monday
false, // 1: tuesday
false, // 2: wednesday
false, // 3: thursday
false, // 4: friday
false, // 5: saturday
true, // 6: sunday
};
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static unsigned Cal_GetParamFirstDayOfWeek (void);
/*****************************************************************************/
/************** Put icons to select the first day of the week ****************/
/*****************************************************************************/
void Cal_PutIconsToSelectFirstDayOfWeek (void)
{
extern const char *Txt_Calendar;
extern const char *Txt_First_day_of_the_week;
extern const char *Txt_DAYS_SMALL[7];
unsigned FirstDayOfWeek;
Lay_StartRoundFrameTable (NULL,2,Txt_Calendar);
fprintf (Gbl.F.Out,"<tr>");
for (FirstDayOfWeek = 0; // Monday
FirstDayOfWeek <= 6; // Sunday
FirstDayOfWeek++)
if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
{
fprintf (Gbl.F.Out,"<td class=\"%s\">",
FirstDayOfWeek == Gbl.Prefs.FirstDayOfWeek ? "LAYOUT_ON" :
"LAYOUT_OFF");
Act_FormStart (ActChg1stDay);
Par_PutHiddenParamUnsigned ("FirstDayOfWeek",FirstDayOfWeek);
fprintf (Gbl.F.Out,"<input type=\"image\" src=\"%s/first-day-of-week-%u-64x64.png\""
" alt=\"%s\" title=\"%s: %s\" class=\"ICON32x32B\""
" style=\"margin:0 auto;\" />",
Gbl.Prefs.IconsURL,
FirstDayOfWeek,
Txt_DAYS_SMALL[FirstDayOfWeek],
Txt_First_day_of_the_week,Txt_DAYS_SMALL[FirstDayOfWeek]);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>");
}
fprintf (Gbl.F.Out,"</tr>");
Lay_EndRoundFrameTable ();
}
/*****************************************************************************/
/************************* Change first day of week **************************/
/*****************************************************************************/
void Cal_ChangeFirstDayOfWeek (void)
{
char Query[512];
/***** Get param with icon set *****/
Gbl.Prefs.FirstDayOfWeek = Cal_GetParamFirstDayOfWeek ();
/***** Store icon set in database *****/
if (Gbl.Usrs.Me.Logged)
{
sprintf (Query,"UPDATE usr_data SET FirstDayOfWeek='%u'"
" WHERE UsrCod='%ld'",
Gbl.Prefs.FirstDayOfWeek,
Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update your preference about first day of week");
}
/***** Set preferences from current IP *****/
Pre_SetPrefsFromIP ();
}
/*****************************************************************************/
/*********************** Get parameter with icon set *************************/
/*****************************************************************************/
static unsigned Cal_GetParamFirstDayOfWeek (void)
{
char UnsignedStr[10+1];
unsigned UnsignedNum;
unsigned FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT;
Par_GetParToText ("FirstDayOfWeek",UnsignedStr,10);
if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
if (Cal_DayIsValidAsFirstDayOfWeek[UnsignedNum])
FirstDayOfWeek = UnsignedNum;
return FirstDayOfWeek;
}
/*****************************************************************************/
/***************************** Draw current month ****************************/
/*****************************************************************************/

View File

@ -31,6 +31,8 @@
/***************************** Public constants ******************************/
/*****************************************************************************/
#define Cal_FIRST_DAY_OF_WEEK_DEFAULT 0 // Monday
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
@ -39,6 +41,9 @@
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Cal_PutIconsToSelectFirstDayOfWeek (void);
void Cal_ChangeFirstDayOfWeek (void);
void Cal_DrawCurrentMonth (void);
void Cal_DrawCalendar (void);

View File

@ -111,11 +111,17 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 15.41 (2015/11/21)"
#define Log_PLATFORM_VERSION "SWAD 15.42 (2015/11/21)"
// 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.42: Nov 21, 2015 New option in preferences to select first day of the week. (187520 lines)
3 changes necessary in database:
ALTER TABLE IP_prefs ADD COLUMN FirstDayOfWeek TINYINT NOT NULL DEFAULT 0 AFTER LastChange;
ALTER TABLE usr_data ADD COLUMN FirstDayOfWeek TINYINT NOT NULL DEFAULT 0 AFTER Language,ADD INDEX (FirstDayOfWeek);
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1484','es','N','Cambiar primer d&iacute;a de semana');
Version 15.41: Nov 21, 2015 Javascript code to draw a month with sunday as the first day of a week. (187316 lines)
Version 15.40.8: Nov 20, 2015 Password is requested only one time when creating a new account. (187309 lines)
Version 15.40.7: Nov 20, 2015 New help button to register students in courses without them. (187319 lines)

View File

@ -105,7 +105,8 @@ void Cty_SeeCtyWithPendingInss (void)
" FROM institutions,countries"
" WHERE (institutions.Status & %u)<>0"
" AND institutions.CtyCod=countries.CtyCod"
" GROUP BY institutions.CtyCod ORDER BY countries.Name_%s",
" GROUP BY institutions.CtyCod"
" ORDER BY countries.Name_%s",
(unsigned) Ins_STATUS_BIT_PENDING,
Txt_STR_LANG_ID[Gbl.Prefs.Language]);
break;
@ -320,8 +321,10 @@ static void Cty_Configuration (bool PrintView)
"</tr>",
The_ClassForm[Gbl.Prefs.Theme],
Txt_Shortcut,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCty.Cty.CtyCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCty.Cty.CtyCod);
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentCty.Cty.CtyCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentCty.Cty.CtyCod);
if (PrintView)
{

View File

@ -354,8 +354,10 @@ static void Crs_Configuration (bool PrintView)
"</tr>",
The_ClassForm[Gbl.Prefs.Theme],
Txt_Shortcut,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCrs.Crs.CrsCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentCrs.Crs.CrsCod);
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentCrs.Crs.CrsCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentCrs.Crs.CrsCod);
if (PrintView)
{

View File

@ -88,24 +88,26 @@ void DB_CreateTablesIfNotExist (void)
/***** Table IP_prefs *****/
/*
mysql> DESCRIBE IP_prefs;
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| IP | char(15) | NO | PRI | NULL | |
| UsrCod | int(11) | NO | MUL | -1 | |
| LastChange | datetime | NO | MUL | NULL | |
| Layout | tinyint(4) | NO | | 0 | |
| Theme | char(16) | NO | | NULL | |
| IconSet | char(16) | NO | | NULL | |
| Menu | tinyint(4) | NO | | 0 | |
| SideCols | tinyint(4) | NO | | NULL | |
+------------+------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| IP | char(15) | NO | PRI | NULL | |
| UsrCod | int(11) | NO | MUL | -1 | |
| LastChange | datetime | NO | MUL | NULL | |
| FirstDayOfWeek | tinyint(4) | NO | | 0 | |
| Layout | tinyint(4) | NO | | 0 | |
| Theme | char(16) | NO | | NULL | |
| IconSet | char(16) | NO | | NULL | |
| Menu | tinyint(4) | NO | | 0 | |
| SideCols | tinyint(4) | NO | | NULL | |
+----------------+------------+------+-----+---------+-------+
9 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS IP_prefs ("
"IP CHAR(15) NOT NULL,"
"UsrCod INT NOT NULL DEFAULT -1,"
"LastChange DATETIME NOT NULL,"
"FirstDayOfWeek TINYINT NOT NULL DEFAULT 0,"
"Layout TINYINT NOT NULL DEFAULT 0,"
"Theme CHAR(16) NOT NULL,"
"IconSet CHAR(16) NOT NULL,"
@ -2277,6 +2279,7 @@ mysql> DESCRIBE usr_data;
| Theme | char(16) | NO | MUL | NULL | |
| IconSet | char(16) | NO | MUL | NULL | |
| Language | char(2) | NO | MUL | NULL | |
| FirstDayOfWeek | tinyint(4) | NO | MUL | 0 | |
| Photo | char(43) | NO | | NULL | |
| PhotoVisibility | enum('user','course','system','world') | NO | | user | |
| ProfileVisibility | enum('user','course','system','world') | NO | | user | |
@ -2299,7 +2302,7 @@ mysql> DESCRIBE usr_data;
| NotifNtfEvents | int(11) | NO | | 0 | |
| EmailNtfEvents | int(11) | NO | | 0 | |
+-------------------+----------------------------------------+------+-----+---------+----------------+
32 rows in set (0.00 sec)
33 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS usr_data ("
"UsrCod INT NOT NULL AUTO_INCREMENT,"
@ -2313,6 +2316,7 @@ mysql> DESCRIBE usr_data;
"Theme CHAR(16) NOT NULL,"
"IconSet CHAR(16) NOT NULL,"
"Language CHAR(2) NOT NULL,"
"FirstDayOfWeek TINYINT NOT NULL DEFAULT 0,"
"Photo CHAR(43) NOT NULL,"
"PhotoVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user',"
"ProfileVisibility ENUM('user','course','system','world') NOT NULL DEFAULT 'user',"
@ -2334,7 +2338,7 @@ mysql> DESCRIBE usr_data;
"SideCols TINYINT NOT NULL DEFAULT 3,"
"NotifNtfEvents INT NOT NULL DEFAULT 0,"
"EmailNtfEvents INT NOT NULL DEFAULT 0,"
"PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))");
"PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(FirstDayOfWeek),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))");
/***** Table usr_emails *****/
/*

View File

@ -414,8 +414,10 @@ static void Deg_Configuration (bool PrintView)
"</tr>",
The_ClassForm[Gbl.Prefs.Theme],
Txt_Shortcut,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentDeg.Deg.DegCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.CurrentDeg.Deg.DegCod);
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentDeg.Deg.DegCod,
Cfg_HTTPS_URL_SWAD_CGI,Txt_STR_LANG_ID[Gbl.Prefs.Language],
Gbl.CurrentDeg.Deg.DegCod);
if (PrintView)
{

View File

@ -447,7 +447,7 @@ void Enr_UpdateUsrData (struct UsrData *UsrDat)
sprintf (Query,"UPDATE usr_data"
" SET Password='%s',"
"Surname1='%s',Surname2='%s',FirstName='%s',Sex='%s',"
"Layout='%u',Theme='%s',IconSet='%s',Language='%s',PhotoVisibility='%s',ProfileVisibility='%s',"
"Layout='%u',Theme='%s',IconSet='%s',Language='%s',FirstDayOfWeek='%u',PhotoVisibility='%s',ProfileVisibility='%s',"
"CtyCod='%ld',"
"LocalAddress='%s',LocalPhone='%s',FamilyAddress='%s',FamilyPhone='%s',OriginPlace='%s',Birthday='%04u-%02u-%02u',Comments='%s'"
" WHERE UsrCod='%ld'",
@ -458,6 +458,7 @@ void Enr_UpdateUsrData (struct UsrData *UsrDat)
The_ThemeId[UsrDat->Prefs.Theme],
Ico_IconSetId[UsrDat->Prefs.IconSet],
Txt_STR_LANG_ID[UsrDat->Prefs.Language],
UsrDat->Prefs.FirstDayOfWeek,
Pri_VisibilityDB[UsrDat->PhotoVisibility],
Pri_VisibilityDB[UsrDat->ProfileVisibility],
UsrDat->CtyCod,

View File

@ -35,6 +35,7 @@
#include <unistd.h> // For getpid
#include "swad_action.h"
#include "swad_calendar.h"
#include "swad_config.h"
#include "swad_constant.h"
#include "swad_exam.h"
@ -125,14 +126,15 @@ void Gbl_InitializeGlobals (void)
Gbl.HiddenParamsInsertedIntoDB = false;
Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language;
Gbl.Prefs.FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT; // Default first day of week
Gbl.Prefs.Layout = Lay_LAYOUT_DEFAULT; // Default layout
Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu
Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right
Gbl.Prefs.Theme = The_THEME_DEFAULT; // Default theme
Gbl.Prefs.IconSet = Ico_ICON_SET_DEFAULT; // Default icon set
sprintf (Gbl.Prefs.IconsURL,"%s/%s",
Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_PUBLIC_ICON);
Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language;
Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu
Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right
sprintf (Gbl.Prefs.PathTheme,"%s/%s/%s",
Gbl.Prefs.IconsURL,
Cfg_ICON_FOLDER_THEMES,

View File

@ -130,15 +130,16 @@ struct Globals
} Imported;
struct
{
Txt_Language_t Language;
unsigned FirstDayOfWeek;
Lay_Layout_t Layout;
Mnu_Menu_t Menu;
unsigned SideCols;
The_Theme_t Theme;
char PathTheme[PATH_MAX+1];
Txt_Language_t Language;
unsigned SideCols;
Ico_IconSet_t IconSet;
char PathIconSet[PATH_MAX+1];
char IconsURL[PATH_MAX+1];
Mnu_Menu_t Menu;
} Prefs;
struct

View File

@ -46,7 +46,7 @@ extern struct Globals Gbl;
/******************************** Private constants **************************/
/*****************************************************************************/
#define MAX_ICON_SET_ID 16
#define Ico_MAX_BYTES_ICON_SET_ID 16
const char *Ico_IconSetId[Ico_NUM_ICON_SETS] =
{
@ -129,17 +129,17 @@ void Ico_ChangeIconSet (void)
Ico_IconSet_t Ico_GetParamIconSet (void)
{
char IconSetId[MAX_ICON_SET_ID+1];
char IconSetId[Ico_MAX_BYTES_ICON_SET_ID+1];
Ico_IconSet_t IconSet;
Par_GetParToText ("IconSet",IconSetId,MAX_ICON_SET_ID);
Par_GetParToText ("IconSet",IconSetId,Ico_MAX_BYTES_ICON_SET_ID);
for (IconSet = (Ico_IconSet_t) 0;
IconSet < Ico_NUM_ICON_SETS;
IconSet++)
if (!strcmp (IconSetId,Ico_IconSetId[IconSet]))
return IconSet;
return Ico_ICON_SET_UNKNOWN;
return Ico_ICON_SET_DEFAULT;
}
/*****************************************************************************/
@ -156,5 +156,5 @@ Ico_IconSet_t Ico_GetIconSetFromStr (const char *Str)
if (!strcasecmp (Str,Ico_IconSetId[IconSet]))
return IconSet;
return Ico_ICON_SET_UNKNOWN;
return Ico_ICON_SET_DEFAULT;
}

View File

@ -41,7 +41,6 @@ typedef enum
{
Ico_ICON_SET_AWESOME = 0,
Ico_ICON_SET_NUVOLA = 1,
Ico_ICON_SET_UNKNOWN = 2,
} Ico_IconSet_t;
#define Ico_ICON_SET_DEFAULT Ico_ICON_SET_AWESOME

View File

@ -1721,31 +1721,39 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf
StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
"");
if (FilterFromToSubquery[0])
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt,usr_data"
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod"
" FROM msg_rcv,msg_snt,usr_data"
" WHERE msg_rcv.UsrCod='%ld'%s"
" AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.CrsCod='%ld'"
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
" AND msg_snt.CrsCod='%ld'"
" AND msg_snt.UsrCod=usr_data.UsrCod%s"
" ORDER BY msg_rcv.MsgCod DESC",
UsrCod,StrUnreadMsg,FilterCrsCod,
FilterFromToSubquery);
else
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt"
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod"
" FROM msg_rcv,msg_snt"
" WHERE msg_rcv.UsrCod='%ld'%s"
" AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.CrsCod='%ld'"
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
" AND msg_snt.CrsCod='%ld'"
" ORDER BY msg_rcv.MsgCod DESC",
UsrCod,StrUnreadMsg,
FilterCrsCod);
break;
case Msg_MESSAGES_SENT:
if (FilterFromToSubquery[0])
sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod FROM msg_snt,msg_rcv,usr_data"
" WHERE msg_snt.UsrCod='%ld' AND msg_snt.CrsCod='%ld'"
" AND msg_snt.MsgCod=msg_rcv.MsgCod AND msg_rcv.UsrCod=usr_data.UsrCod%s"
sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod"
" FROM msg_snt,msg_rcv,usr_data"
" WHERE msg_snt.UsrCod='%ld'"
" AND msg_snt.CrsCod='%ld'"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.UsrCod=usr_data.UsrCod%s"
" ORDER BY msg_snt.MsgCod DESC",
UsrCod,FilterCrsCod,
FilterFromToSubquery);
else
sprintf (PtrQuery,"SELECT MsgCod FROM msg_snt"
sprintf (PtrQuery,"SELECT MsgCod"
" FROM msg_snt"
" WHERE UsrCod='%ld' AND CrsCod='%ld'"
" ORDER BY MsgCod DESC",
UsrCod,FilterCrsCod);
@ -1761,9 +1769,11 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf
{
StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND msg_rcv.Open='N'" :
"");
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod FROM msg_rcv,msg_snt,usr_data"
sprintf (PtrQuery,"SELECT msg_rcv.MsgCod"
" FROM msg_rcv,msg_snt,usr_data"
" WHERE msg_rcv.UsrCod='%ld'%s"
" AND msg_rcv.MsgCod=msg_snt.MsgCod AND msg_snt.UsrCod=usr_data.UsrCod%s"
" AND msg_rcv.MsgCod=msg_snt.MsgCod"
" AND msg_snt.UsrCod=usr_data.UsrCod%s"
" ORDER BY msg_rcv.MsgCod DESC",
UsrCod,StrUnreadMsg,
FilterFromToSubquery);
@ -1772,7 +1782,8 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf
{
StrUnreadMsg = (Gbl.Msg.ShowOnlyUnreadMsgs ? " AND Open='N'" :
"");
sprintf (PtrQuery,"SELECT MsgCod FROM msg_rcv"
sprintf (PtrQuery,"SELECT MsgCod"
" FROM msg_rcv"
" WHERE UsrCod='%ld'%s"
" ORDER BY MsgCod DESC",
UsrCod,StrUnreadMsg);
@ -1780,14 +1791,17 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf
break;
case Msg_MESSAGES_SENT:
if (FilterFromToSubquery[0])
sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod FROM msg_snt,msg_rcv,usr_data"
sprintf (PtrQuery,"SELECT DISTINCT msg_snt.MsgCod"
" FROM msg_snt,msg_rcv,usr_data"
" WHERE msg_snt.UsrCod='%ld'"
" AND msg_snt.MsgCod=msg_rcv.MsgCod AND msg_rcv.UsrCod=usr_data.UsrCod%s"
" AND msg_snt.MsgCod=msg_rcv.MsgCod"
" AND msg_rcv.UsrCod=usr_data.UsrCod%s"
" ORDER BY msg_snt.MsgCod DESC",
UsrCod,
FilterFromToSubquery);
else
sprintf (PtrQuery,"SELECT MsgCod FROM msg_snt"
sprintf (PtrQuery,"SELECT MsgCod"
" FROM msg_snt"
" WHERE UsrCod='%ld'"
" ORDER BY MsgCod DESC",
UsrCod);
@ -1797,7 +1811,8 @@ static void Msg_ConstructQueryToSelectSentOrReceivedMsgs (char *Query,Msg_TypeOf
}
if (Gbl.Msg.FilterContent[0])
sprintf (Query,"SELECT MsgCod FROM msg_content"
sprintf (Query,"SELECT MsgCod"
" FROM msg_content"
" WHERE MsgCod IN (%s)"
" AND MATCH (Subject,Content) AGAINST ('%s')",
SubQuery,

View File

@ -156,7 +156,8 @@ long Nck_GetUsrCodFromNickname (const char *Nickname)
/***** Get user's code from database *****/
/* Check if user code from table usr_nicknames is also in table usr_data */
sprintf (Query,"SELECT usr_nicknames.UsrCod FROM usr_nicknames,usr_data"
sprintf (Query,"SELECT usr_nicknames.UsrCod"
" FROM usr_nicknames,usr_data"
" WHERE usr_nicknames.Nickname='%s'"
" AND usr_nicknames.UsrCod=usr_data.UsrCod",
NicknameWithoutArroba);

View File

@ -985,7 +985,9 @@ static void Pho_ClearPhotoName (long UsrCod)
char Query[128];
/***** Clear photo name in user's data *****/
sprintf (Query,"UPDATE usr_data SET Photo='' WHERE UsrCod='%ld'",UsrCod);
sprintf (Query,"UPDATE usr_data SET Photo=''"
" WHERE UsrCod='%ld'",
UsrCod);
DB_QueryUPDATE (Query,"can not clear the name of a user's photo");
}
@ -999,7 +1001,8 @@ void Pho_UpdatePhotoName (struct UsrData *UsrDat)
char PathPublPhoto[PATH_MAX+1];
/***** Update photo name in database *****/
sprintf (Query,"UPDATE usr_data SET Photo='%s' WHERE UsrCod='%ld'",
sprintf (Query,"UPDATE usr_data SET Photo='%s'"
" WHERE UsrCod='%ld'",
Gbl.UniqueNameEncrypted,UsrDat->UsrCod);
DB_QueryUPDATE (Query,"can not update the name of a user's photo");

View File

@ -30,6 +30,7 @@
#include <stdio.h> // For fprintf, etc.
#include <string.h>
#include "swad_calendar.h"
#include "swad_config.h"
#include "swad_database.h"
#include "swad_global.h"
@ -67,35 +68,42 @@ void Pre_EditPrefs (void)
extern const char *Txt_You_can_only_receive_email_notifications_if_;
char MailDomain[Usr_MAX_BYTES_USR_EMAIL+1];
/***** Language *****/
/***** Language and first day of week *****/
fprintf (Gbl.F.Out,"<table style=\"margin:0 auto; border-spacing:16px 0;\">"
"<tr>"
"<td>");
Lay_StartRoundFrame (NULL,Txt_Language);
Pre_PutSelectorToSelectLanguage ();
fprintf (Gbl.F.Out,"<div style=\"height:46px;\">");
Pre_PutSelectorToSelectLanguage (); // 1. Language
fprintf (Gbl.F.Out,"</div>");
Lay_EndRoundFrame ();
fprintf (Gbl.F.Out,"</td>"
"<td>");
Cal_PutIconsToSelectFirstDayOfWeek (); // 2. First day of week
fprintf (Gbl.F.Out,"</td>"
"</tr>"
"</table>");
/***** Layout, side columns, theme, icon set & menu *****/
fprintf (Gbl.F.Out,"<table style=\"margin:0 auto; border-spacing:16px 0;\">"
"<tr>"
"<td>");
Lay_PutIconsToSelectLayout (); // 1. Layout
Lay_PutIconsToSelectLayout (); // 3. Layout
fprintf (Gbl.F.Out,"</td>");
if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP)
{
fprintf (Gbl.F.Out,"<td>");
Mnu_PutIconsToSelectMenu (); // 2. Menu
Mnu_PutIconsToSelectMenu (); // 4. Menu
fprintf (Gbl.F.Out,"</td>"
"<td>");
Pre_PutIconsToSelectSideCols (); // 3. Side columns
Pre_PutIconsToSelectSideCols (); // 5. Side columns
fprintf (Gbl.F.Out,"</td>");
}
fprintf (Gbl.F.Out,"</tr>"
"</table>"
"<table style=\"margin:0 auto; border-spacing:16px 0;\">"
"<tr>"
"<td>");
The_PutIconsToSelectTheme (); // 4. Theme
fprintf (Gbl.F.Out,"<td>");
The_PutIconsToSelectTheme (); // 6. Theme
fprintf (Gbl.F.Out,"</td>"
"<td>");
Ico_PutIconsToSelectIconSet (); // 5. Icon set
Ico_PutIconsToSelectIconSet (); // 7. Icon set
fprintf (Gbl.F.Out,"</td>"
"</tr>"
"</table>");
@ -178,9 +186,10 @@ void Pre_SetPrefsFromIP (void)
char Query[512];
/***** Update preferences from current IP in database *****/
sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,Layout,Theme,IconSet,Menu,SideCols)"
" VALUES ('%s','%ld',NOW(),'%u','%s','%s','%u','%u')",
sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,FirstDayOfWeek,Layout,Theme,IconSet,Menu,SideCols)"
" VALUES ('%s','%ld',NOW(),'%u','%u','%s','%s','%u','%u')",
Gbl.IP,Gbl.Usrs.Me.UsrDat.UsrCod,
Gbl.Prefs.FirstDayOfWeek,
(unsigned) Gbl.Prefs.Layout,
The_ThemeId[Gbl.Prefs.Theme],
Ico_IconSetId[Gbl.Prefs.IconSet],
@ -191,8 +200,9 @@ void Pre_SetPrefsFromIP (void)
/***** If a user is logged, update its preferences in database for all its IP's *****/
if (Gbl.Usrs.Me.Logged)
{
sprintf (Query,"UPDATE IP_prefs SET Layout='%u',Theme='%s',IconSet='%s',Menu='%u',SideCols='%u'"
sprintf (Query,"UPDATE IP_prefs SET FirstDayOfWeek='%u',Layout='%u',Theme='%s',IconSet='%s',Menu='%u',SideCols='%u'"
" WHERE UsrCod='%ld'",
Gbl.Prefs.FirstDayOfWeek,
(unsigned) Gbl.Prefs.Layout,
The_ThemeId[Gbl.Prefs.Theme],
Ico_IconSetId[Gbl.Prefs.IconSet],
@ -234,7 +244,8 @@ void Pre_PutSelectorToSelectLanguage (void)
};
Act_FormStart (ActReqChgLan);
fprintf (Gbl.F.Out,"<select name=\"Lan\" style=\"width:%upx; margin:0;\""
fprintf (Gbl.F.Out,"<select name=\"Lan\""
" style=\"width:%upx; margin:0;\""
" onchange=\"document.getElementById('%s').submit();\">",
SelectorWidth[Gbl.Prefs.Layout],Gbl.FormId);
for (Lan = (Txt_Language_t) 0;
@ -286,11 +297,8 @@ void Pre_AskChangeLanguage (void)
void Pre_ChangeLanguage (void)
{
extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES];
extern const char *Txt_Your_language_has_changed_to_LANGUAGE;
extern const char *Txt_The_language_has_changed_to_LANGUAGE;
extern const char *Txt_STR_LANG_NAME[Txt_NUM_LANGUAGES];
char Query[512];
bool MyLanguageHasChanged = false;
/***** Get param language *****/
Gbl.Prefs.Language = Pre_GetParamLanguage ();
@ -298,20 +306,14 @@ void Pre_ChangeLanguage (void)
/***** Store language in database *****/
if (Gbl.Usrs.Me.Logged && Gbl.Prefs.Language != Gbl.Usrs.Me.UsrDat.Prefs.Language)
{
sprintf (Query,"UPDATE usr_data SET Language='%s' WHERE UsrCod='%ld'",
sprintf (Query,"UPDATE usr_data SET Language='%s'"
" WHERE UsrCod='%ld'",
Txt_STR_LANG_ID[Gbl.Prefs.Language],Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update your language");
MyLanguageHasChanged = true;
}
/***** Set preferences from current IP *****/
Pre_SetPrefsFromIP ();
/***** Confirmation *****/
if (MyLanguageHasChanged)
Lay_ShowAlert (Lay_SUCCESS,
MyLanguageHasChanged ? Txt_Your_language_has_changed_to_LANGUAGE :
Txt_The_language_has_changed_to_LANGUAGE);
}
/*****************************************************************************/
@ -513,7 +515,8 @@ static void Pre_UpdateSideColsOnUsrDataTable (void)
{
char Query[512];
sprintf (Query,"UPDATE usr_data SET SideCols='%u' WHERE UsrCod='%ld'",
sprintf (Query,"UPDATE usr_data SET SideCols='%u'"
" WHERE UsrCod='%ld'",
Gbl.Prefs.SideCols,Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update your preference about side columns");
}

View File

@ -3734,8 +3734,7 @@ void Rec_UpdateMyOffice (void)
Par_GetParToText ("Office",Gbl.Usrs.Me.UsrDat.Tch.Office,Cns_MAX_BYTES_STRING);
/***** Update office *****/
sprintf (Query,"UPDATE usr_data"
" SET Office='%s'"
sprintf (Query,"UPDATE usr_data SET Office='%s'"
" WHERE UsrCod='%ld'",
Gbl.Usrs.Me.UsrDat.Tch.Office,
Gbl.Usrs.Me.UsrDat.UsrCod);
@ -3757,8 +3756,7 @@ void Rec_UpdateMyOfficePhone (void)
Par_GetParToText ("OfficePhone",Gbl.Usrs.Me.UsrDat.Tch.OfficePhone,Usr_MAX_BYTES_PHONE);
/***** Update office phone *****/
sprintf (Query,"UPDATE usr_data"
" SET OfficePhone='%s'"
sprintf (Query,"UPDATE usr_data SET OfficePhone='%s'"
" WHERE UsrCod='%ld'",
Gbl.Usrs.Me.UsrDat.Tch.OfficePhone,
Gbl.Usrs.Me.UsrDat.UsrCod);

View File

@ -3578,6 +3578,27 @@ const char *Txt_Calculate_average_photo_of_THE_DEGREE_X =
"Calculate average photo of"; // Necessita de tradução
#endif
const char *Txt_Calendar =
#if L==0
"Calendari";
#elif L==1
"Kalender";
#elif L==2
"Calendar";
#elif L==3
"Calendario";
#elif L==4
"Calendrier";
#elif L==5
"Arapapaha";
#elif L==6
"Calendario";
#elif L==7
"Kalendarz";
#elif L==8
"Calend&aacute;rio";
#endif
const char *Txt_Call_the_roll =
#if L==0
"Passar llista";
@ -11627,6 +11648,27 @@ const char *Txt_Files_works =
"Arquivos trabalhos";
#endif
const char *Txt_First_day_of_the_week =
#if L==0
"Primer dia de la setmana";
#elif L==1
"Erster Tag der Woche";
#elif L==2
"First day of the week";
#elif L==3
"Primer d&iacute;a de la semana";
#elif L==4
"Premier jour de la semaine";
#elif L==5
"Primer d&iacute;a de la semana"; // Okoteve traducción
#elif L==6
"Primo giorno della settimana";
#elif L==7
"Pierwszy dzie&nacute; tygodnia";
#elif L==8
"Primeiro dia da semana";
#endif
const char *Txt_first_message_not_allowed =
#if L==0
"primer mensaje no permitido"; // Necessita traduccio
@ -15133,23 +15175,23 @@ const char *Txt_It_is_optional_to_choose_a_group =
const char *Txt_Language =
#if L==0
"Idioma";
"Idioma (language)";
#elif L==1
"Sprache";
"Sprache (language)";
#elif L==2
"Language";
#elif L==3
"Idioma";
"Idioma (language)";
#elif L==4
"Langue";
"Langue (language)";
#elif L==5
"&Ntilde;e'&#7869;";
"&Ntilde;e'&#7869; (language)";
#elif L==6
"Lingua";
"Lingua (language)";
#elif L==7
"J&eogon;zyk";
"J&eogon;zyk (language)";
#elif L==8
"Lingua";
"Lingua (language)";
#endif
const char *Txt_Last_clicks =
@ -40467,27 +40509,6 @@ const char *Txt_The_integrated_editor_is_not_yet_available =
"The integrated editor is not yet available."; // Necessita de tradução
#endif
const char *Txt_The_language_has_changed_to_LANGUAGE =
#if L==0
"S'ha canviat l'idioma a catal&agrave;.";
#elif L==1
"Die Sprache ist nun Deutsch.";
#elif L==2
"The language has changed to English.";
#elif L==3
"Se ha cambiado el idioma a espa&ntilde;ol.";
#elif L==4
"La langue a chang&eacute; au fran&ccedil;ais.";
#elif L==5
"Pe &ntilde;e'&#7869; ha moambuepapyre pe ava&ntilde;e'&#7869;.";
#elif L==6
"La lingua &egrave; cambiata a italiano.";
#elif L==7
"J&eogon;zyk zosta&lstrok; zmieniony na polski.";
#elif L==8
"O idioma mudou para o portugu&ecirc;s.";
#endif
const char *Txt_The_link_X_already_exists = // Warning: it is very important to include %s in the following sentences
#if L==0
"El enlace <strong>%s</strong> ya existe."; // Necessita traduccio
@ -51949,27 +51970,6 @@ const char *Txt_Your_comment_has_been_updated =
"O seu coment&aacute;rio foi atualizado.";
#endif
const char *Txt_Your_language_has_changed_to_LANGUAGE =
#if L==0
"El seu idioma ha canviat a catal&agrave;.";
#elif L==1
"Ihre Sprache ist nun Deutsch.";
#elif L==2
"Your language has changed to English.";
#elif L==3
"Su idioma ha cambiado a espa&ntilde;ol.";
#elif L==4
"Votre langue a chang&eacute; au fran&ccedil;ais.";
#elif L==5
"Pe &ntilde;e'&#7869; ha moambuepapyre pe ava&ntilde;e'&#7869;.";
#elif L==6
"La tua lingua &egrave; cambiata a italiano.";
#elif L==7
"J&eogon;zyk zosta&lstrok; zmieniony na polski.";
#elif L==8
"Suo idioma mudou para o portugu&ecirc;s.";
#endif
const char *Txt_Your_nickname_X_has_been_registered_successfully = // Warning: it is very important to include %s in the following sentences
#if L==0
"Su apodo <strong>@%s</strong>"

View File

@ -276,7 +276,8 @@ void The_ChangeTheme (void)
/***** Store theme in database *****/
if (Gbl.Usrs.Me.Logged)
{
sprintf (Query,"UPDATE usr_data SET Theme='%s' WHERE UsrCod='%ld'",
sprintf (Query,"UPDATE usr_data SET Theme='%s'"
" WHERE UsrCod='%ld'",
The_ThemeId[Gbl.Prefs.Theme],Gbl.Usrs.Me.UsrDat.UsrCod);
DB_QueryUPDATE (Query,"can not update your preference about theme");
}

View File

@ -36,6 +36,7 @@
#include "swad_account.h"
#include "swad_announcement.h"
#include "swad_calendar.h"
#include "swad_config.h"
#include "swad_connected.h"
#include "swad_course.h"
@ -272,6 +273,7 @@ void Usr_ResetUsrDataExceptUsrCodAndIDs (struct UsrData *UsrDat)
UsrDat->Tch.OfficePhone[0] = '\0';
UsrDat->Prefs.Language = Cfg_DEFAULT_LANGUAGE_FOR_NEW_USERS;
UsrDat->Prefs.FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT; // Default first day of week
UsrDat->Prefs.Layout = Lay_LAYOUT_DEFAULT;
UsrDat->Prefs.Theme = The_THEME_DEFAULT;
UsrDat->Prefs.IconSet = Ico_ICON_SET_DEFAULT;
@ -359,7 +361,8 @@ void Usr_GetUsrCodFromEncryptedUsrCod (struct UsrData *UsrDat)
if (UsrDat->EncryptedUsrCod[0])
{
/***** Get user's code from database *****/
sprintf (Query,"SELECT UsrCod FROM usr_data WHERE EncryptedUsrCod='%s'",
sprintf (Query,"SELECT UsrCod FROM usr_data"
" WHERE EncryptedUsrCod='%s'",
UsrDat->EncryptedUsrCod);
NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get user's code");
@ -384,6 +387,7 @@ void Usr_GetUsrCodFromEncryptedUsrCod (struct UsrData *UsrDat)
void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat)
{
extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
extern const char *Txt_STR_LANG_ID[Txt_NUM_LANGUAGES];
extern const char *The_ThemeId[The_NUM_THEMES];
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
@ -399,7 +403,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat)
/***** Get user's data from database *****/
sprintf (Query,"SELECT EncryptedUsrCod,Password,Surname1,Surname2,FirstName,Sex,"
"Layout,Theme,IconSet,Language,Photo,PhotoVisibility,ProfileVisibility,"
"Layout,Theme,IconSet,Language,FirstDayOfWeek,Photo,PhotoVisibility,ProfileVisibility,"
"CtyCod,InsCtyCod,InsCod,DptCod,CtrCod,Office,OfficePhone,"
"LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments,"
"Menu,SideCols,NotifNtfEvents,EmailNtfEvents"
@ -480,47 +484,53 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat)
break;
}
/* Get rest of data */
strncpy (UsrDat->Photo,row[10],sizeof (UsrDat->Photo) - 1);
UsrDat->Photo[sizeof (UsrDat->Photo) - 1] = '\0';
UsrDat->PhotoVisibility = Pri_GetVisibilityFromStr (row[11]);
UsrDat->ProfileVisibility = Pri_GetVisibilityFromStr (row[12]);
UsrDat->CtyCod = Str_ConvertStrCodToLongCod (row[13]);
UsrDat->InsCtyCod = Str_ConvertStrCodToLongCod (row[14]);
UsrDat->InsCod = Str_ConvertStrCodToLongCod (row[15]);
/* Get first day of week */
UsrDat->Prefs.FirstDayOfWeek = Cal_FIRST_DAY_OF_WEEK_DEFAULT;
if (sscanf (row[10],"%u",&UnsignedNum) == 1)
if (Cal_DayIsValidAsFirstDayOfWeek[UnsignedNum])
UsrDat->Prefs.FirstDayOfWeek = UnsignedNum;
UsrDat->Tch.DptCod = Str_ConvertStrCodToLongCod (row[16]);
UsrDat->Tch.CtrCod = Str_ConvertStrCodToLongCod (row[17]);
strncpy (UsrDat->Tch.Office ,row[18],sizeof (UsrDat->Tch.Office ) - 1);
/* Get rest of data */
strncpy (UsrDat->Photo,row[11],sizeof (UsrDat->Photo) - 1);
UsrDat->Photo[sizeof (UsrDat->Photo) - 1] = '\0';
UsrDat->PhotoVisibility = Pri_GetVisibilityFromStr (row[12]);
UsrDat->ProfileVisibility = Pri_GetVisibilityFromStr (row[13]);
UsrDat->CtyCod = Str_ConvertStrCodToLongCod (row[14]);
UsrDat->InsCtyCod = Str_ConvertStrCodToLongCod (row[15]);
UsrDat->InsCod = Str_ConvertStrCodToLongCod (row[16]);
UsrDat->Tch.DptCod = Str_ConvertStrCodToLongCod (row[17]);
UsrDat->Tch.CtrCod = Str_ConvertStrCodToLongCod (row[18]);
strncpy (UsrDat->Tch.Office ,row[19],sizeof (UsrDat->Tch.Office ) - 1);
UsrDat->Tch.Office [sizeof (UsrDat->Tch.Office ) - 1] = '\0';
strncpy (UsrDat->Tch.OfficePhone,row[19],sizeof (UsrDat->Tch.OfficePhone) - 1);
strncpy (UsrDat->Tch.OfficePhone,row[20],sizeof (UsrDat->Tch.OfficePhone) - 1);
UsrDat->Tch.OfficePhone[sizeof (UsrDat->Tch.OfficePhone) - 1] = '\0';
strncpy (UsrDat->LocalAddress ,row[20],sizeof (UsrDat->LocalAddress ) - 1);
strncpy (UsrDat->LocalAddress ,row[21],sizeof (UsrDat->LocalAddress ) - 1);
UsrDat->LocalAddress [sizeof (UsrDat->LocalAddress ) - 1] = '\0';
strncpy (UsrDat->LocalPhone ,row[21],sizeof (UsrDat->LocalPhone ) - 1);
strncpy (UsrDat->LocalPhone ,row[22],sizeof (UsrDat->LocalPhone ) - 1);
UsrDat->LocalPhone [sizeof (UsrDat->LocalPhone ) - 1] = '\0';
strncpy (UsrDat->FamilyAddress,row[22],sizeof (UsrDat->FamilyAddress) - 1);
strncpy (UsrDat->FamilyAddress,row[23],sizeof (UsrDat->FamilyAddress) - 1);
UsrDat->FamilyAddress[sizeof (UsrDat->FamilyAddress) - 1] = '\0';
strncpy (UsrDat->FamilyPhone ,row[23],sizeof (UsrDat->FamilyPhone ) - 1);
strncpy (UsrDat->FamilyPhone ,row[24],sizeof (UsrDat->FamilyPhone ) - 1);
UsrDat->FamilyPhone [sizeof (UsrDat->FamilyPhone ) - 1] = '\0';
strncpy (UsrDat->OriginPlace ,row[24],sizeof (UsrDat->OriginPlace ) - 1);
strncpy (UsrDat->OriginPlace ,row[25],sizeof (UsrDat->OriginPlace ) - 1);
UsrDat->OriginPlace [sizeof (UsrDat->OriginPlace ) - 1] = '\0';
strcpy (StrBirthday,
row[25] ? row[25] :
row[26] ? row[26] :
"0000-00-00");
Usr_GetUsrCommentsFromString (row[26] ? row[26] :
Usr_GetUsrCommentsFromString (row[27] ? row[27] :
"",
UsrDat); // Get the comments comunes a todas the courses
/* Get menu */
UsrDat->Prefs.Menu = Mnu_MENU_DEFAULT;
if (sscanf (row[27],"%u",&UnsignedNum) == 1)
if (sscanf (row[28],"%u",&UnsignedNum) == 1)
if (UnsignedNum < Mnu_NUM_MENUS)
UsrDat->Prefs.Menu = (Mnu_Menu_t) UnsignedNum;
/* Get if user wants to show side columns */
if (sscanf (row[28],"%u",&UsrDat->Prefs.SideCols) == 1)
if (sscanf (row[29],"%u",&UsrDat->Prefs.SideCols) == 1)
{
if (UsrDat->Prefs.SideCols > Lay_SHOW_BOTH_COLUMNS)
UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS;
@ -529,11 +539,11 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat)
UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS;
/* Get on which events I want to be notified inside the platform */
if (sscanf (row[29],"%u",&UsrDat->Prefs.NotifNtfEvents) != 1)
if (sscanf (row[30],"%u",&UsrDat->Prefs.NotifNtfEvents) != 1)
UsrDat->Prefs.NotifNtfEvents = (unsigned) -1; // 0xFF..FF
/* Get on which events I want to be notified by e-mail */
if (sscanf (row[30],"%u",&UsrDat->Prefs.EmailNtfEvents) != 1)
if (sscanf (row[31],"%u",&UsrDat->Prefs.EmailNtfEvents) != 1)
UsrDat->Prefs.EmailNtfEvents = 0;
if (UsrDat->Prefs.EmailNtfEvents >= (1 << Ntf_NUM_NOTIFY_EVENTS)) // Maximum binary value for NotifyEvents is 000...0011...11
UsrDat->Prefs.EmailNtfEvents = 0;
@ -3705,7 +3715,11 @@ static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,const char *UsrQuery,
}
/***** The last part of the query is for ordering the list *****/
strcat (Query," ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod");
strcat (Query," ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod");
}
/*****************************************************************************/
@ -3754,7 +3768,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" (SELECT UsrCod FROM usr_data WHERE %s))"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
(unsigned) Role,UsrQuery,
(unsigned) Role,UsrQuery,
(unsigned) Role,UsrQuery);
@ -3773,7 +3791,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" WHERE Role='%u' AND Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
(unsigned) Role,
(unsigned) Role,
(unsigned) Role);
@ -3816,7 +3838,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
UsrQuery,Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role,
UsrQuery,Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role,
UsrQuery,Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role);
@ -3854,7 +3880,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role,
Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role,
Gbl.CurrentCty.Cty.CtyCod,(unsigned) Role);
@ -3894,7 +3924,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
UsrQuery,Gbl.CurrentIns.Ins.InsCod,(unsigned) Role,
UsrQuery,Gbl.CurrentIns.Ins.InsCod,(unsigned) Role,
UsrQuery,Gbl.CurrentIns.Ins.InsCod,(unsigned) Role);
@ -3929,7 +3963,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentIns.Ins.InsCod,(unsigned) Role,
Gbl.CurrentIns.Ins.InsCod,(unsigned) Role,
Gbl.CurrentIns.Ins.InsCod,(unsigned) Role);
@ -3966,7 +4004,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
UsrQuery,Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role,
UsrQuery,Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role,
UsrQuery,Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role);
@ -3998,7 +4040,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role,
Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role,
Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) Role);
@ -4032,7 +4078,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
UsrQuery,Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role,
UsrQuery,Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role,
UsrQuery,Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role);
@ -4058,7 +4108,11 @@ void Usr_GetUsrsLst (Rol_Role_t Role,Sco_Scope_t Scope,const char *UsrQuery,bool
" AND crs_usr.Accepted='N')"
") AS list_usrs,usr_data"
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role,
Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role,
Gbl.CurrentDeg.Deg.DegCod,(unsigned) Role);
@ -4098,8 +4152,11 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
" WHERE (admin.Scope='Deg'"
" OR admin.Scope='Sys')"
" AND admin.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,"
"usr_data.FirstName,usr_data.UsrCod");
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod");
break;
case Sco_SCOPE_INS:
sprintf (Query,"SELECT DISTINCT admin.UsrCod,'Y',usr_data.Sex"
@ -4110,8 +4167,11 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
" AND admin.Scope='Deg')"
" OR admin.Scope='Sys')"
" AND admin.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,"
"usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentIns.Ins.InsCod);
break;
case Sco_SCOPE_CTR:
@ -4122,8 +4182,11 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
" AND admin.Scope='Deg')"
" OR admin.Scope='Sys')"
" AND admin.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,"
"usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentCtr.Ctr.CtrCod);
break;
case Sco_SCOPE_DEG:
@ -4132,8 +4195,11 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
" WHERE ((admin.Scope='Deg' AND admin.Cod='%ld')"
" OR admin.Scope='Sys')"
" AND admin.UsrCod=usr_data.UsrCod "
" ORDER BY usr_data.Surname1,usr_data.Surname2,"
"usr_data.FirstName,usr_data.UsrCod",
" ORDER BY "
"usr_data.Surname1,"
"usr_data.Surname2,"
"usr_data.FirstName,"
"usr_data.UsrCod",
Gbl.CurrentDeg.Deg.DegCod);
break;
default: // not aplicable

View File

@ -151,6 +151,7 @@ struct UsrData
struct
{
Txt_Language_t Language;
unsigned FirstDayOfWeek;
Lay_Layout_t Layout;
The_Theme_t Theme;
Ico_IconSet_t IconSet;

View File

@ -2721,7 +2721,8 @@ static int Svc_GetLanguageFromUsrCod (long UsrCod)
Txt_Language_t Lan;
/***** Get user's language *****/
sprintf (Query,"SELECT Language FROM usr_data WHERE UsrCod='%ld'",
sprintf (Query,"SELECT Language FROM usr_data"
" WHERE UsrCod='%ld'",
UsrCod);
if (DB_QuerySELECT (Query,&mysql_res,"can not get user's language") != 1)
return soap_receiver_fault (Gbl.soap,
@ -2906,7 +2907,8 @@ int swad__sendMessage (struct soap *soap,
/***** Build query for recipients from database *****/
if (ReplyUsrCod > 0)
sprintf (Query,"SELECT UsrCod FROM usr_data WHERE UsrCod='%ld'",
sprintf (Query,"SELECT UsrCod FROM usr_data"
" WHERE UsrCod='%ld'",
ReplyUsrCod);
else
Query[0] = '\0';