mirror of
https://github.com/acanas/swad-core.git
synced 2024-09-23 00:00:50 +02:00
511 lines
19 KiB
C
511 lines
19 KiB
C
// swad_setting.c: user's settings / preferences, operations with database
|
|
|
|
/*
|
|
SWAD (Shared Workspace At a Distance),
|
|
is a web platform developed at the University of Granada (Spain),
|
|
and used to support university teaching.
|
|
|
|
This file is part of SWAD core.
|
|
Copyright (C) 1999-2024 Antonio Cañas Vargas
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as
|
|
published by the Free Software Foundation, either version 3 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
/*****************************************************************************/
|
|
/********************************** Headers **********************************/
|
|
/*****************************************************************************/
|
|
|
|
#include "swad_database.h"
|
|
#include "swad_global.h"
|
|
#include "swad_parameter.h"
|
|
|
|
/*****************************************************************************/
|
|
/*************** External global variables from others modules ***************/
|
|
/*****************************************************************************/
|
|
|
|
extern struct Globals Gbl;
|
|
|
|
/*****************************************************************************/
|
|
/****************************** Public constants *****************************/
|
|
/*****************************************************************************/
|
|
|
|
const char *Set_DB_StringsUsrListTypes[Set_NUM_USR_LIST_TYPES] =
|
|
{
|
|
[Set_USR_LIST_UNKNOWN ] = "",
|
|
[Set_USR_LIST_AS_CLASS_PHOTO] = "classphoto",
|
|
[Set_USR_LIST_AS_LISTING ] = "list",
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/**************** Update my language to the current language *****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutLanguage (void)
|
|
{
|
|
extern const char *Lan_STR_LANG_ID[1 + Lan_NUM_LANGUAGES];
|
|
|
|
DB_QueryUPDATE ("can not update your language",
|
|
"UPDATE usr_data"
|
|
" SET Language='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
Lan_STR_LANG_ID[Gbl.Prefs.Language],
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/******************** Update my settings about date format *******************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutDateFormat (Dat_Format_t DateFormat)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about date format",
|
|
"UPDATE usr_data"
|
|
" SET DateFormat=%u"
|
|
" WHERE UsrCod=%ld",
|
|
(unsigned) DateFormat,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/***************** Update my settings about first day of week ****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutFirstDayOfWeek (unsigned FirstDayOfWeek)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about first day of week",
|
|
"UPDATE usr_data"
|
|
" SET FirstDayOfWeek=%u"
|
|
" WHERE UsrCod=%ld",
|
|
FirstDayOfWeek,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/********************* Update my settings about icon set *********************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutIconSet (const char *IconSetId)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about icon set",
|
|
"UPDATE usr_data"
|
|
" SET IconSet='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
IconSetId,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/***************** Update my settings about first day of week ****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutMenu (Mnu_Menu_t Menu)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about menu",
|
|
"UPDATE usr_data"
|
|
" SET Menu=%u"
|
|
" WHERE UsrCod=%ld",
|
|
(unsigned) Menu,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*********************** Update my settings about theme **********************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutTheme (const char *ThemeId)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about theme",
|
|
"UPDATE usr_data"
|
|
" SET Theme='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
ThemeId,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/************** Update layout of side colums on user data table **************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutSideCols (void)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about side columns",
|
|
"UPDATE usr_data"
|
|
" SET SideCols=%u"
|
|
" WHERE UsrCod=%ld",
|
|
Gbl.Prefs.SideCols,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**************** Update user photo shape on user data table *****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutPhotoShape (void)
|
|
{
|
|
DB_QueryUPDATE ("can not update your setting about user photo shape",
|
|
"UPDATE usr_data"
|
|
" SET PhotoShape=%u"
|
|
" WHERE UsrCod=%ld",
|
|
(unsigned) Gbl.Prefs.PhotoShape,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/***************** Update my settings about photo visibility *****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutPhotoVisibility (void)
|
|
{
|
|
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
|
|
|
|
DB_QueryUPDATE ("can not update user's settings",
|
|
"UPDATE usr_data"
|
|
" SET PhotoVisibility='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.PhotoVisibility],
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/************ Update my settings about public profile visibility *************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutBasicProfile (void)
|
|
{
|
|
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
|
|
|
|
DB_QueryUPDATE ("can not update your setting"
|
|
" about public profile visibility",
|
|
"UPDATE usr_data"
|
|
" SET BaPrfVisibility='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.BaPrfVisibility],
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
void Set_DB_UpdateMySettingsAboutExtendedProfile (void)
|
|
{
|
|
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
|
|
|
|
DB_QueryUPDATE ("can not update your setting"
|
|
" about public profile visibility",
|
|
"UPDATE usr_data"
|
|
" SET ExPrfVisibility='%s'"
|
|
" WHERE UsrCod=%ld",
|
|
Pri_VisibilityDB[Gbl.Usrs.Me.UsrDat.ExPrfVisibility],
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/******************* Update my settings about notify events ******************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMySettingsAboutNotifyEvents (void)
|
|
{
|
|
DB_QueryUPDATE ("can not update user's settings",
|
|
"UPDATE usr_data"
|
|
" SET NotifNtfEvents=%u,"
|
|
"EmailNtfEvents=%u"
|
|
" WHERE UsrCod=%ld",
|
|
Gbl.Usrs.Me.UsrDat.NtfEvents.CreateNotif,
|
|
Gbl.Usrs.Me.UsrDat.NtfEvents.SendEmail,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/********************* Get my language from database *************************/
|
|
/*****************************************************************************/
|
|
|
|
unsigned Set_DB_GetMyLanguage (MYSQL_RES **mysql_res)
|
|
{
|
|
return (unsigned)
|
|
DB_QuerySELECT (mysql_res,"can not get user's language",
|
|
"SELECT Language" // row[0]
|
|
" FROM usr_data"
|
|
" WHERE UsrCod=%ld",
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/************ Register last prefs in current course in database **************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_InsertUsrInCrsSettings (long UsrCod,long HieCod)
|
|
{
|
|
DB_QueryINSERT ("can not register user in course",
|
|
"INSERT INTO crs_user_settings"
|
|
" (UsrCod,CrsCod,"
|
|
"LastDowGrpCod,LastComGrpCod,LastAssGrpCod,"
|
|
"NumAccTst,LastAccTst,NumQstsLastTst,"
|
|
"UsrListType,ColsClassPhoto,ListWithPhotos)"
|
|
" VALUES"
|
|
" (%ld,%ld,"
|
|
"-1,-1,-1,"
|
|
"0,FROM_UNIXTIME(%ld),0,"
|
|
"'%s',%u,'%c')",
|
|
UsrCod,
|
|
HieCod,
|
|
(long) (time_t) 0, // The user never accessed to tests in this course
|
|
Set_DB_StringsUsrListTypes[Set_SHOW_USRS_TYPE_DEFAULT],
|
|
Usr_CLASS_PHOTO_COLS_DEF,
|
|
Usr_LIST_WITH_PHOTOS_DEF ? 'Y' :
|
|
'N');
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/******** Update the group of my last access to a file browser zone **********/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateGrpMyLastAccZone (const char *FieldNameDB,long GrpCod)
|
|
{
|
|
DB_QueryUPDATE ("can not update the group of the last access to a file browser",
|
|
"UPDATE crs_user_settings"
|
|
" SET %s=%ld"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
FieldNameDB,GrpCod,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/***************** Save my preference about type of users' list **************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMyUsrListType (void)
|
|
{
|
|
DB_QueryUPDATE ("can not update type of listing",
|
|
"UPDATE crs_user_settings"
|
|
" SET UsrListType='%s'"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Set_DB_StringsUsrListTypes[Gbl.Usrs.Me.ListType],
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/** Save my prefs. about number of colums in class photo for current course **/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMyColsClassPhoto (void)
|
|
{
|
|
if (Gbl.Usrs.Me.Logged &&
|
|
Gbl.Hierarchy.Level == Hie_CRS) // Course selected
|
|
/***** Update number of colums in class photo for current course *****/
|
|
DB_QueryUPDATE ("can not update number of columns in class photo",
|
|
"UPDATE crs_user_settings"
|
|
" SET ColsClassPhoto=%u"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Gbl.Usrs.ClassPhoto.Cols,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**** Save my preference about photos in users' list for current course ******/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMyPrefAboutListWithPhotosPhoto (void)
|
|
{
|
|
if (Gbl.Usrs.Me.Logged &&
|
|
Gbl.Hierarchy.Level == Hie_CRS) // Course selected
|
|
/***** Update number of colums in class photo for current course *****/
|
|
DB_QueryUPDATE ("can not update your preference about photos in listing",
|
|
"UPDATE crs_user_settings"
|
|
" SET ListWithPhotos='%c'"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Gbl.Usrs.Listing.WithPhotos ? 'Y' :
|
|
'N',
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*************** Get my type of listing of users from database ***************/
|
|
/*****************************************************************************/
|
|
|
|
unsigned Set_DB_GetMyUsrListType (MYSQL_RES **mysql_res)
|
|
{
|
|
return (unsigned)
|
|
DB_QuerySELECT (mysql_res,"can not get type of listing of users",
|
|
"SELECT UsrListType" // row[0]
|
|
" FROM crs_user_settings"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*********** Get my number of columns in class photo from database ***********/
|
|
/*****************************************************************************/
|
|
|
|
unsigned Set_DB_GetMyColsClassPhoto (MYSQL_RES **mysql_res)
|
|
{
|
|
return (unsigned)
|
|
DB_QuerySELECT (mysql_res,"can not get number of columns in class photo",
|
|
"SELECT ColsClassPhoto" // row[0]
|
|
" FROM crs_user_settings"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/********* Get my preference about listing with photos from database *********/
|
|
/*****************************************************************************/
|
|
|
|
unsigned Set_DB_GetMyPrefAboutListWithPhotosPhoto (MYSQL_RES **mysql_res)
|
|
{
|
|
return (unsigned)
|
|
DB_QuerySELECT (mysql_res,"can not check if listing of users"
|
|
" should show photos",
|
|
"SELECT ListWithPhotos" // row[0]
|
|
" FROM crs_user_settings"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Hierarchy.Node[Hie_CRS].HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/****************** Remove a user from a courses setting *********************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_RemUsrFromCrsSettings (long UsrCod,long HieCod)
|
|
{
|
|
DB_QueryDELETE ("can not remove a user from a course",
|
|
"DELETE FROM crs_user_settings"
|
|
" WHERE UsrCod=%ld"
|
|
" AND CrsCod=%ld",
|
|
UsrCod,
|
|
HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/***************** Remove a user from all courses settings *******************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_RemUsrFromAllCrssSettings (long UsrCod)
|
|
{
|
|
DB_QueryDELETE ("can not remove a user from all courses",
|
|
"DELETE FROM crs_user_settings"
|
|
" WHERE UsrCod=%ld",
|
|
UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*************** Remove all users from settings in a course ******************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_RemAllUsrsFromCrsSettings (long HieCod)
|
|
{
|
|
DB_QueryDELETE ("can not remove users from a course settings",
|
|
"DELETE FROM crs_user_settings"
|
|
" WHERE CrsCod=%ld",
|
|
HieCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**************** Update settings from current IP in database ****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMyIPSettingsForCurrentIP (void)
|
|
{
|
|
extern const char *The_ThemeId[The_NUM_THEMES];
|
|
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
|
|
|
DB_QueryREPLACE ("can not store settings from current IP address",
|
|
"REPLACE INTO set_ip_settings"
|
|
" (IP,UsrCod,LastChange,"
|
|
"FirstDayOfWeek,DateFormat,Theme,IconSet,Menu,SideCols,PhotoShape)"
|
|
" VALUES"
|
|
" ('%s',%ld,NOW(),"
|
|
"%u,%u,'%s','%s',%u,%u,%u)",
|
|
Par_GetIP (),
|
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
|
Gbl.Prefs.FirstDayOfWeek,
|
|
(unsigned) Gbl.Prefs.DateFormat,
|
|
The_ThemeId[Gbl.Prefs.Theme],
|
|
Ico_IconSetId[Gbl.Prefs.IconSet],
|
|
(unsigned) Gbl.Prefs.Menu,
|
|
Gbl.Prefs.SideCols,
|
|
(unsigned) Gbl.Prefs.PhotoShape);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/**************** Update my settings from all IP in database *****************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_UpdateMyIPSettingsForAllMyIPs (void)
|
|
{
|
|
extern const char *The_ThemeId[The_NUM_THEMES];
|
|
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
|
|
|
|
DB_QueryUPDATE ("can not update your settings",
|
|
"UPDATE set_ip_settings"
|
|
" SET FirstDayOfWeek=%u,"
|
|
"DateFormat=%u,"
|
|
"Theme='%s',"
|
|
"IconSet='%s',"
|
|
"Menu=%u,"
|
|
"SideCols=%u,"
|
|
"PhotoShape=%u"
|
|
" WHERE UsrCod=%ld",
|
|
Gbl.Prefs.FirstDayOfWeek,
|
|
(unsigned) Gbl.Prefs.DateFormat,
|
|
The_ThemeId[Gbl.Prefs.Theme],
|
|
Ico_IconSetId[Gbl.Prefs.IconSet],
|
|
(unsigned) Gbl.Prefs.Menu,
|
|
Gbl.Prefs.SideCols,
|
|
(unsigned) Gbl.Prefs.PhotoShape,
|
|
Gbl.Usrs.Me.UsrDat.UsrCod);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/******************** Get settings changed from current IP *******************/
|
|
/*****************************************************************************/
|
|
|
|
unsigned Set_DB_GetSettingsFromIP (MYSQL_RES **mysql_res)
|
|
{
|
|
return (unsigned)
|
|
DB_QuerySELECT (mysql_res,"can not get settings",
|
|
"SELECT FirstDayOfWeek," // row[0]
|
|
"DateFormat," // row[1]
|
|
"Theme," // row[2]
|
|
"IconSet," // row[3]
|
|
"Menu," // row[4]
|
|
"SideCols," // row[5]
|
|
"PhotoShape" // row[6]
|
|
" FROM set_ip_settings"
|
|
" WHERE IP='%s'",
|
|
Par_GetIP ());
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/*********************** Remove old settings from IP *************************/
|
|
/*****************************************************************************/
|
|
|
|
void Set_DB_RemoveOldSettingsFromIP (void)
|
|
{
|
|
/***** Remove old settings *****/
|
|
DB_QueryDELETE ("can not remove old settings",
|
|
"DELETE LOW_PRIORITY FROM set_ip_settings"
|
|
" WHERE LastChange<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)",
|
|
Cfg_TIME_TO_DELETE_IP_PREFS);
|
|
}
|