Version 20.91.1: Jun 10, 2021 Queries moved to module swad_enrolment_database.

This commit is contained in:
acanas 2021-06-10 13:50:23 +02:00
parent b40c74e613
commit f5d59b104d
17 changed files with 297 additions and 191 deletions

View File

@ -83,7 +83,25 @@ static void ID_RemoveUsrID (const struct UsrData *UsrDat,bool ItsMe);
static bool ID_CheckIfConfirmed (long UsrCod,const char *UsrID); static bool ID_CheckIfConfirmed (long UsrCod,const char *UsrID);
static void ID_RemoveUsrIDFromDB (long UsrCod,const char *UsrID); static void ID_RemoveUsrIDFromDB (long UsrCod,const char *UsrID);
static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe); static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe);
static void ID_InsertANewUsrIDInDB (long UsrCod,const char *NewID,bool Confirmed);
/*****************************************************************************/
/*************************** Create new user's ID ****************************/
/*****************************************************************************/
void ID_DB_InsertANewUsrID (long UsrCod,
const char ID[ID_MAX_BYTES_USR_ID + 1],
bool Confirmed)
{
DB_QueryINSERT ("can not create user's ID",
"INSERT INTO usr_ids"
" (UsrCod,UsrID,CreatTime,Confirmed)"
" VALUES"
" (%ld,'%s',NOW(),'%c')",
UsrCod,
ID,
Confirmed ? 'Y' :
'N');
}
/*****************************************************************************/ /*****************************************************************************/
/********************** Get list of IDs of a user ****************************/ /********************** Get list of IDs of a user ****************************/
@ -982,7 +1000,7 @@ static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe)
/***** Save this new ID *****/ /***** Save this new ID *****/
// It's me ==> ID not confirmed // It's me ==> ID not confirmed
// Not me ==> ID confirmed // Not me ==> ID confirmed
ID_InsertANewUsrIDInDB (UsrDat->UsrCod,NewID,!ItsMe); ID_DB_InsertANewUsrID (UsrDat->UsrCod,NewID,!ItsMe);
Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,ID_ID_SECTION_ID,
Txt_The_ID_X_has_been_registered_successfully, Txt_The_ID_X_has_been_registered_successfully,
@ -998,24 +1016,6 @@ static void ID_NewUsrID (const struct UsrData *UsrDat,bool ItsMe)
Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission (); Ale_CreateAlertUserNotFoundOrYouDoNotHavePermission ();
} }
/*****************************************************************************/
/******************* Insert a new ID for me in database **********************/
/*****************************************************************************/
static void ID_InsertANewUsrIDInDB (long UsrCod,const char *NewID,bool Confirmed)
{
/***** Update my nickname in database *****/
DB_QueryINSERT ("can not insert a new ID",
"INSERT INTO usr_ids"
" (UsrCod,UsrID,CreatTime,Confirmed)"
" VALUES"
" (%ld,'%s',NOW(),'%c')",
UsrCod,
NewID,
Confirmed ? 'Y' :
'N');
}
/*****************************************************************************/ /*****************************************************************************/
/************************ Confirm another user's ID **************************/ /************************ Confirm another user's ID **************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -55,6 +55,10 @@ struct ListIDs
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void ID_DB_InsertANewUsrID (long UsrCod,
const char ID[ID_MAX_BYTES_USR_ID + 1],
bool Confirmed);
void ID_GetListIDsFromUsrCod (struct UsrData *UsrDat); void ID_GetListIDsFromUsrCod (struct UsrData *UsrDat);
void ID_ReallocateListIDs (struct UsrData *UsrDat,unsigned NumIDs); void ID_ReallocateListIDs (struct UsrData *UsrDat,unsigned NumIDs);
void ID_FreeListIDs (struct UsrData *UsrDat); void ID_FreeListIDs (struct UsrData *UsrDat);

View File

@ -733,11 +733,11 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount)
Acc_CreateNewEncryptedUsrCod (UsrDat); Acc_CreateNewEncryptedUsrCod (UsrDat);
/***** Filter some user's data before inserting */ /***** Filter some user's data before inserting */
Enr_FilterUsrDat (UsrDat); Usr_FilterUsrBirthday (&UsrDat->Birthday);
/***** Insert new user in database *****/ /***** Insert new user in database *****/
/* Insert user's data */ /* Insert user's data */
Acc_DB_CreateNewUsr (UsrDat); UsrDat->UsrCod = Acc_DB_CreateNewUsr (UsrDat);
/* Insert user's IDs as confirmed */ /* Insert user's IDs as confirmed */
for (NumID = 0; for (NumID = 0;
@ -745,7 +745,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat,bool CreatingMyOwnAccount)
NumID++) NumID++)
{ {
Str_ConvertToUpperText (UsrDat->IDs.List[NumID].ID); Str_ConvertToUpperText (UsrDat->IDs.List[NumID].ID);
Acc_DB_CreateNewUsrID (UsrDat->UsrCod, ID_DB_InsertANewUsrID (UsrDat->UsrCod,
UsrDat->IDs.List[NumID].ID, UsrDat->IDs.List[NumID].ID,
UsrDat->IDs.List[NumID].Confirmed); UsrDat->IDs.List[NumID].Confirmed);
} }

View File

@ -108,8 +108,9 @@ bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_A
/*****************************************************************************/ /*****************************************************************************/
/****************************** Create new user ******************************/ /****************************** Create new user ******************************/
/*****************************************************************************/ /*****************************************************************************/
// Return new user's code
void Acc_DB_CreateNewUsr (struct UsrData *UsrDat) long Acc_DB_CreateNewUsr (const struct UsrData *UsrDat)
{ {
extern const char *The_ThemeId[The_NUM_THEMES]; extern const char *The_ThemeId[The_NUM_THEMES];
extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS]; extern const char *Ico_IconSetId[Ico_NUM_ICON_SETS];
@ -120,7 +121,7 @@ void Acc_DB_CreateNewUsr (struct UsrData *UsrDat)
/***** Create new user *****/ /***** Create new user *****/
Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes
UsrDat->UsrCod = return
DB_QueryINSERTandReturnCode ("can not create user", DB_QueryINSERTandReturnCode ("can not create user",
"INSERT INTO usr_data" "INSERT INTO usr_data"
" (EncryptedUsrCod,Password," " (EncryptedUsrCod,Password,"
@ -164,22 +165,41 @@ void Acc_DB_CreateNewUsr (struct UsrData *UsrDat)
(unsigned) Cfg_DEFAULT_COLUMNS); (unsigned) Cfg_DEFAULT_COLUMNS);
} }
/*****************************************************************************/ /*****************************************************************************/
/*************************** Create new user's ID ****************************/ /***************************** Update user's data ****************************/
/*****************************************************************************/ /*****************************************************************************/
// UsrDat->UsrCod must be > 0
void Acc_DB_CreateNewUsrID (long UsrCod, void Acc_DB_UpdateUsrData (const struct UsrData *UsrDat)
const char ID[ID_MAX_BYTES_USR_ID + 1],
bool Confirmed)
{ {
DB_QueryINSERT ("can not store user's ID when creating user", extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
"INSERT INTO usr_ids" char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1];
" (UsrCod,UsrID,CreatTime,Confirmed)"
" VALUES" /***** Update user's common data *****/
" (%ld,'%s',NOW(),'%c')", Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes
UsrCod, DB_QueryUPDATE ("can not update user's data",
ID, "UPDATE usr_data"
Confirmed ? 'Y' : " SET Password='%s',"
'N'); "Surname1='%s',"
"Surname2='%s',"
"FirstName='%s',"
"Sex='%s',"
"CtyCod=%ld,"
"LocalPhone='%s',"
"FamilyPhone='%s',"
"Birthday=%s,"
"Comments='%s'"
" WHERE UsrCod=%ld",
UsrDat->Password,
UsrDat->Surname1,
UsrDat->Surname2,
UsrDat->FrstName,
Usr_StringsSexDB[UsrDat->Sex],
UsrDat->CtyCod,
UsrDat->Phone[0],
UsrDat->Phone[1],
BirthdayStrDB,
UsrDat->Comments ? UsrDat->Comments :
"",
UsrDat->UsrCod);
} }

View File

@ -30,6 +30,7 @@
#include <mysql/mysql.h> // To access MySQL databases #include <mysql/mysql.h> // To access MySQL databases
#include "swad_ID.h" #include "swad_ID.h"
#include "swad_user.h"
/*****************************************************************************/ /*****************************************************************************/
/****************************** Public constants *****************************/ /****************************** Public constants *****************************/
@ -49,9 +50,7 @@ unsigned Acc_DB_GetUsrsWithID (MYSQL_RES **mysql_res,
bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_FROM_FORM + 1]); bool Acc_DB_CheckIfNicknameAlreadyExists (const char NewNickWithoutArr[Nck_MAX_BYTES_NICK_FROM_FORM + 1]);
bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]); bool Acc_DB_CheckIfEmailAlreadyExists (const char NewEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
void Acc_DB_CreateNewUsr (struct UsrData *UsrDat); long Acc_DB_CreateNewUsr (const struct UsrData *UsrDat);
void Acc_DB_CreateNewUsrID (long UsrCod, void Acc_DB_UpdateUsrData (const struct UsrData *UsrDat);
const char ID[ID_MAX_BYTES_USR_ID + 1],
bool Confirmed);
#endif #endif

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/ */
#define Log_PLATFORM_VERSION "SWAD 20.91 (2021-06-09)" #define Log_PLATFORM_VERSION "SWAD 20.91.1 (2021-06-10)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js" #define JS_FILE "swad20.69.1.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.91.1: Jun 10, 2021 Queries moved to module swad_enrolment_database. (313145 lines)
Version 20.91: Jun 09, 2021 New module swad_enrolment_database for database queries related to user's enrolment. (313063 lines) Version 20.91: Jun 09, 2021 New module swad_enrolment_database for database queries related to user's enrolment. (313063 lines)
Version 20.90.1: Jun 09, 2021 Queries moved to module swad_duplicate_database. (312962 lines) Version 20.90.1: Jun 09, 2021 Queries moved to module swad_duplicate_database. (312962 lines)
Version 20.90: Jun 05, 2021 New module swad_duplicate_database for database queries related to duplicate users. (? lines) Version 20.90: Jun 05, 2021 New module swad_duplicate_database for database queries related to duplicate users. (? lines)

View File

@ -31,6 +31,7 @@
#include <string.h> // For string functions #include <string.h> // For string functions
#include "swad_account.h" #include "swad_account.h"
#include "swad_account_database.h"
#include "swad_announcement.h" #include "swad_announcement.h"
#include "swad_attendance_database.h" #include "swad_attendance_database.h"
#include "swad_box.h" #include "swad_box.h"
@ -51,6 +52,7 @@
#include "swad_parameter.h" #include "swad_parameter.h"
#include "swad_photo.h" #include "swad_photo.h"
#include "swad_role.h" #include "swad_role.h"
#include "swad_setting.h"
#include "swad_test_print.h" #include "swad_test_print.h"
#include "swad_user.h" #include "swad_user.h"
@ -211,7 +213,7 @@ void Enr_PutButtonInlineToRegisterStds (long CrsCod)
{ {
Frm_BeginForm (ActReqEnrSevStd); Frm_BeginForm (ActReqEnrSevStd);
Crs_PutParamCrsCod (CrsCod); Crs_PutParamCrsCod (CrsCod);
Btn_PutCreateButtonInline (Txt_Register_students); Btn_PutCreateButtonInline (Txt_Register_students);
Frm_EndForm (); Frm_EndForm ();
} }
} }
@ -237,7 +239,11 @@ void Enr_PutLinkToRequestSignUp (void)
void Enr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole) void Enr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole)
{ {
/***** Check if user's role is allowed *****/ /***** Trivial check 1: current course code should be > 0 *****/
if (Gbl.Hierarchy.Crs.CrsCod <= 0)
Err_WrongCourseExit ();
/***** Trivial check 2: check if user's role is allowed *****/
switch (NewRole) switch (NewRole)
{ {
case Rol_STD: case Rol_STD:
@ -249,14 +255,7 @@ void Enr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole)
} }
/***** Update the role of a user in a course *****/ /***** Update the role of a user in a course *****/
DB_QueryUPDATE ("can not modify user's role in course", Rol_DB_UpdateUsrRoleInCurrentCrs (UsrDat->UsrCod,NewRole);
"UPDATE crs_users"
" SET Role=%u"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
(unsigned) NewRole,
Gbl.Hierarchy.Crs.CrsCod,
UsrDat->UsrCod);
/***** Flush caches *****/ /***** Flush caches *****/
Usr_FlushCachesUsr (); Usr_FlushCachesUsr ();
@ -281,9 +280,11 @@ void Enr_ModifyRoleInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole)
void Enr_RegisterUsrInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole, void Enr_RegisterUsrInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole,
Enr_KeepOrSetAccepted_t KeepOrSetAccepted) Enr_KeepOrSetAccepted_t KeepOrSetAccepted)
{ {
extern const char *Usr_StringsUsrListTypeInDB[Usr_NUM_USR_LIST_TYPES]; /***** Trivial check 1: current course code should be > 0 *****/
if (Gbl.Hierarchy.Crs.CrsCod <= 0)
Err_WrongCourseExit ();
/***** Check if user's role is allowed *****/ /***** Trivial check 2: check if user's role is allowed *****/
switch (NewRole) switch (NewRole)
{ {
case Rol_STD: case Rol_STD:
@ -295,36 +296,10 @@ void Enr_RegisterUsrInCurrentCrs (struct UsrData *UsrDat,Rol_Role_t NewRole,
} }
/***** Register user in current course in database *****/ /***** Register user in current course in database *****/
DB_QueryINSERT ("can not register user in course", Enr_DB_InsertUsrInCurrentCrs (UsrDat->UsrCod,NewRole,KeepOrSetAccepted);
"INSERT INTO crs_users"
" (CrsCod,UsrCod,Role,Accepted)"
" VALUES"
" (%ld,%ld,%u,'%c')",
Gbl.Hierarchy.Crs.CrsCod,
UsrDat->UsrCod,
(unsigned) NewRole,
KeepOrSetAccepted == Enr_SET_ACCEPTED_TO_TRUE ? 'Y' :
'N');
/***** Register last prefs in current course in database *****/ /***** Register last prefs in current course in database *****/
DB_QueryINSERT ("can not register user in course", Set_DB_InsertUsrInCurrentCrsSettings (UsrDat->UsrCod);
"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')",
UsrDat->UsrCod,
Gbl.Hierarchy.Crs.CrsCod,
(long) (time_t) 0, // The user never accessed to tests in this course
Usr_StringsUsrListTypeInDB[Usr_SHOW_USRS_TYPE_DEFAULT],
Usr_CLASS_PHOTO_COLS_DEF,
Usr_LIST_WITH_PHOTOS_DEF ? 'Y' :
'N');
/***** Flush caches *****/ /***** Flush caches *****/
Usr_FlushCachesUsr (); Usr_FlushCachesUsr ();
@ -522,12 +497,7 @@ void Enr_GetNotifEnrolment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
SummaryStr[0] = '\0'; // Return nothing on error SummaryStr[0] = '\0'; // Return nothing on error
/***** Get user's role in course from database *****/ /***** Get user's role in course from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get user's role in course", if (Rol_DB_GetUsrRoleInCrs (&mysql_res,CrsCod,UsrCod) == 1) // Result should have a unique row
"SELECT Role" // row[0]
" FROM crs_users"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
CrsCod,UsrCod) == 1) // Result should have a unique row
{ {
/***** Get user's role in course *****/ /***** Get user's role in course *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);
@ -561,57 +531,15 @@ void Enr_GetNotifEnrolment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
void Enr_UpdateUsrData (struct UsrData *UsrDat) void Enr_UpdateUsrData (struct UsrData *UsrDat)
{ {
extern const char *Usr_StringsSexDB[Usr_NUM_SEXS];
char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1];
/***** Check if user's code is initialized *****/ /***** Check if user's code is initialized *****/
if (UsrDat->UsrCod <= 0) if (UsrDat->UsrCod <= 0)
Err_WrongUserExit (); Err_WrongUserExit ();
/***** Filter some user's data before updating */ /***** Filter some user's data before updating */
Enr_FilterUsrDat (UsrDat); Usr_FilterUsrBirthday (&UsrDat->Birthday);
/***** Update user's common data *****/ /***** Update user's common data *****/
Usr_CreateBirthdayStrDB (UsrDat,BirthdayStrDB); // It can include start and ending apostrophes Acc_DB_UpdateUsrData (UsrDat);
DB_QueryUPDATE ("can not update user's data",
"UPDATE usr_data"
" SET Password='%s',"
"Surname1='%s',"
"Surname2='%s',"
"FirstName='%s',"
"Sex='%s',"
"CtyCod=%ld,"
"LocalPhone='%s',"
"FamilyPhone='%s',"
"Birthday=%s,"
"Comments='%s'"
" WHERE UsrCod=%ld",
UsrDat->Password,
UsrDat->Surname1,
UsrDat->Surname2,
UsrDat->FrstName,
Usr_StringsSexDB[UsrDat->Sex],
UsrDat->CtyCod,
UsrDat->Phone[0],
UsrDat->Phone[1],
BirthdayStrDB,
UsrDat->Comments ? UsrDat->Comments :
"",
UsrDat->UsrCod);
}
/*****************************************************************************/
/************************* Filter some user's data ***************************/
/*****************************************************************************/
void Enr_FilterUsrDat (struct UsrData *UsrDat)
{
/***** Fix birthday *****/
if (UsrDat->Birthday.Year < Gbl.Now.Date.Year-99 ||
UsrDat->Birthday.Year > Gbl.Now.Date.Year-16)
UsrDat->Birthday.Year =
UsrDat->Birthday.Month =
UsrDat->Birthday.Day = 0;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -878,24 +806,7 @@ void Enr_RemoveOldUsrs (void)
SecondsWithoutAccess = (time_t) MonthsWithoutAccess * Dat_SECONDS_IN_ONE_MONTH; SecondsWithoutAccess = (time_t) MonthsWithoutAccess * Dat_SECONDS_IN_ONE_MONTH;
/***** Get old users from database *****/ /***** Get old users from database *****/
NumUsrs = (unsigned) if ((NumUsrs = Usr_DB_GetOldUsrs (&mysql_res,SecondsWithoutAccess)))
DB_QuerySELECT (&mysql_res,"can not get old users",
"SELECT UsrCod"
" FROM (SELECT UsrCod"
" FROM usr_last"
" WHERE LastTime<FROM_UNIXTIME(UNIX_TIMESTAMP()-%lu)"
" UNION "
"SELECT UsrCod"
" FROM usr_data"
" WHERE UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_last)"
") AS candidate_usrs"
" WHERE UsrCod NOT IN"
" (SELECT DISTINCT UsrCod"
" FROM crs_users)",
(unsigned long) SecondsWithoutAccess);
if (NumUsrs)
{ {
Ale_ShowAlert (Ale_INFO,Txt_Eliminating_X_users_who_were_not_enroled_in_any_course_and_with_more_than_Y_months_without_access_to_Z, Ale_ShowAlert (Ale_INFO,Txt_Eliminating_X_users_who_were_not_enroled_in_any_course_and_with_more_than_Y_months_without_access_to_Z,
NumUsrs, NumUsrs,
@ -2005,38 +1916,14 @@ void Enr_SignUpInCrs (void)
RoleFromForm == Rol_TCH)) RoleFromForm == Rol_TCH))
Err_WrongRoleExit (); Err_WrongRoleExit ();
/***** Try to get and old request of the same user in the same course from database *****/ /***** Try to get and old request of the same user (me) in the current course *****/
ReqCod = DB_QuerySELECTCode ("can not get enrolment request", ReqCod = Enr_DB_GetMyLastEnrolmentRequestInCurrentCrs ();
"SELECT ReqCod"
" FROM crs_requests"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
/***** Request user in current course in database *****/ /***** Request user in current course in database *****/
if (ReqCod > 0) // Old request exists in database if (ReqCod > 0) // Old request exists in database
DB_QueryUPDATE ("can not update enrolment request", Enr_DB_UpdateMyEnrolmentRequestInCurrentCrs (ReqCod,RoleFromForm);
"UPDATE crs_requests" else // No request in database for this user in this course
" SET Role=%u," ReqCod = Enr_DB_CreateMyEnrolmentRequestInCurrentCrs (RoleFromForm);
"RequestTime=NOW()"
" WHERE ReqCod=%ld"
" AND CrsCod=%ld"
" AND UsrCod=%ld",
(unsigned) RoleFromForm,
ReqCod,
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
else // No request in database for this user in this course
ReqCod =
DB_QueryINSERTandReturnCode ("can not save enrolment request",
"INSERT INTO crs_requests"
" (CrsCod,UsrCod,Role,RequestTime)"
" VALUES"
" (%ld,%ld,%u,NOW())",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
(unsigned) RoleFromForm);
/***** Show confirmation message *****/ /***** Show confirmation message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Your_request_for_enrolment_as_X_in_the_course_Y_has_been_accepted_for_processing, Ale_ShowAlert (Ale_SUCCESS,Txt_Your_request_for_enrolment_as_X_in_the_course_Y_has_been_accepted_for_processing,
@ -2073,12 +1960,7 @@ void Enr_GetNotifEnrolmentRequest (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
SummaryStr[0] = '\0'; // Return nothing on error SummaryStr[0] = '\0'; // Return nothing on error
/***** Get user and requested role from database *****/ /***** Get user and requested role from database *****/
if (DB_QuerySELECT (&mysql_res,"can not get enrolment request", if (Enr_DB_GetEnrolmentRequestByCod (&mysql_res,ReqCod) == 1) // Result should have a unique row
"SELECT UsrCod," // row[0]
"Role" // row[1]
" FROM crs_requests"
" WHERE ReqCod=%ld",
ReqCod) == 1) // Result should have a unique row
{ {
/***** Get user and requested role *****/ /***** Get user and requested role *****/
row = mysql_fetch_row (mysql_res); row = mysql_fetch_row (mysql_res);

View File

@ -86,7 +86,6 @@ void Enr_ReqAcceptRegisterInCrs (void);
void Enr_GetNotifEnrolment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1], void Enr_GetNotifEnrolment (char SummaryStr[Ntf_MAX_BYTES_SUMMARY + 1],
long CrsCod,long UsrCod); long CrsCod,long UsrCod);
void Enr_UpdateUsrData (struct UsrData *UsrDat); void Enr_UpdateUsrData (struct UsrData *UsrDat);
void Enr_FilterUsrDat (struct UsrData *UsrDat);
void Enr_ReqAdminStds (void); void Enr_ReqAdminStds (void);
void Enr_ReqAdminNonEditingTchs (void); void Enr_ReqAdminNonEditingTchs (void);

View File

@ -80,6 +80,25 @@ extern struct Globals Gbl;
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
/*****************************************************************************/
/*************** Register user in current course in database *****************/
/*****************************************************************************/
void Enr_DB_InsertUsrInCurrentCrs (long UsrCod,Rol_Role_t NewRole,
Enr_KeepOrSetAccepted_t KeepOrSetAccepted)
{
DB_QueryINSERT ("can not register user in course",
"INSERT INTO crs_users"
" (CrsCod,UsrCod,Role,Accepted)"
" VALUES"
" (%ld,%ld,%u,'%c')",
Gbl.Hierarchy.Crs.CrsCod,
UsrCod,
(unsigned) NewRole,
KeepOrSetAccepted == Enr_SET_ACCEPTED_TO_TRUE ? 'Y' :
'N');
}
/*****************************************************************************/ /*****************************************************************************/
/**************** Update institution, center and department ******************/ /**************** Update institution, center and department ******************/
/*****************************************************************************/ /*****************************************************************************/
@ -116,6 +135,73 @@ void Enr_DB_AcceptUsrInCrs (long UsrCod)
UsrCod); UsrCod);
} }
/*****************************************************************************/
/****** Get enrolment request (user and requested role) given its code *******/
/*****************************************************************************/
unsigned Enr_DB_GetEnrolmentRequestByCod (MYSQL_RES **mysql_res,long ReqCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get enrolment request",
"SELECT UsrCod," // row[0]
"Role" // row[1]
" FROM crs_requests"
" WHERE ReqCod=%ld",
ReqCod);
}
/*****************************************************************************/
/*** Try to get and old request of me in the current course from database ****/
/*****************************************************************************/
long Enr_DB_GetMyLastEnrolmentRequestInCurrentCrs (void)
{
return
DB_QuerySELECTCode ("can not get enrolment request",
"SELECT ReqCod"
" FROM crs_requests"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/
/************ Create my enrolment request in the current course **************/
/*****************************************************************************/
long Enr_DB_CreateMyEnrolmentRequestInCurrentCrs (Rol_Role_t NewRole)
{
return
DB_QueryINSERTandReturnCode ("can not save enrolment request",
"INSERT INTO crs_requests"
" (CrsCod,UsrCod,Role,RequestTime)"
" VALUES"
" (%ld,%ld,%u,NOW())",
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod,
(unsigned) NewRole);
}
/*****************************************************************************/
/************* Update my enrolment request in the current course *************/
/*****************************************************************************/
void Enr_DB_UpdateMyEnrolmentRequestInCurrentCrs (long ReqCod,Rol_Role_t NewRole)
{
DB_QueryUPDATE ("can not update enrolment request",
"UPDATE crs_requests"
" SET Role=%u,"
"RequestTime=NOW()"
" WHERE ReqCod=%ld"
" AND CrsCod=%ld"
" AND UsrCod=%ld",
(unsigned) NewRole,
ReqCod,
Gbl.Hierarchy.Crs.CrsCod,
Gbl.Usrs.Me.UsrDat.UsrCod);
}
/*****************************************************************************/ /*****************************************************************************/
/*********** Remove all users' requests for inscription in a course **********/ /*********** Remove all users' requests for inscription in a course **********/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -28,6 +28,7 @@
/*****************************************************************************/ /*****************************************************************************/
// #include "swad_course.h" // #include "swad_course.h"
#include "swad_enrolment.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
// #include "swad_notification.h" // #include "swad_notification.h"
// #include "swad_user.h" // #include "swad_user.h"
@ -44,10 +45,18 @@
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
void Enr_DB_InsertUsrInCurrentCrs (long UsrCod,Rol_Role_t NewRole,
Enr_KeepOrSetAccepted_t KeepOrSetAccepted);
void Enr_DB_UpdateInstitutionCenterDepartment (void); void Enr_DB_UpdateInstitutionCenterDepartment (void);
void Enr_DB_AcceptUsrInCrs (long UsrCod); void Enr_DB_AcceptUsrInCrs (long UsrCod);
unsigned Enr_DB_GetEnrolmentRequestByCod (MYSQL_RES **mysql_res,long ReqCod);
long Enr_DB_GetMyLastEnrolmentRequestInCurrentCrs (void);
long Enr_DB_CreateMyEnrolmentRequestInCurrentCrs (Rol_Role_t NewRole);
void Enr_DB_UpdateMyEnrolmentRequestInCurrentCrs (long ReqCod,Rol_Role_t NewRole);
void Enr_DB_RemCrsRequests (long CrsCod); void Enr_DB_RemCrsRequests (long CrsCod);
void Enr_DB_RemUsrRequests (long UsrCod); void Enr_DB_RemUsrRequests (long UsrCod);
void Enr_DB_RemAllUsrsFromCrsSettings (long CrsCod); void Enr_DB_RemAllUsrsFromCrsSettings (long CrsCod);

View File

@ -133,7 +133,7 @@ void Err_WrongDepartmentExit (void)
void Err_WrongPlaceExit (void) void Err_WrongPlaceExit (void)
{ {
Err_ShowErrorAndExit ("Wrong department."); Err_ShowErrorAndExit ("Wrong place.");
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -648,3 +648,35 @@ Rol_Role_t Rol_GetRequestedRole (long UsrCod)
Gbl.Hierarchy.Crs.CrsCod, Gbl.Hierarchy.Crs.CrsCod,
UsrCod); UsrCod);
} }
/*****************************************************************************/
/******************* Get user's role in course from database *****************/
/*****************************************************************************/
unsigned Rol_DB_GetUsrRoleInCrs (MYSQL_RES **mysql_res,long CrsCod,long UsrCod)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get user's role in course",
"SELECT Role" // row[0]
" FROM crs_users"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
CrsCod,
UsrCod);
}
/*****************************************************************************/
/************* Update the role of a user in the current course ***************/
/*****************************************************************************/
void Rol_DB_UpdateUsrRoleInCurrentCrs (long UsrCod,Rol_Role_t NewRole)
{
DB_QueryUPDATE ("can not modify user's role in course",
"UPDATE crs_users"
" SET Role=%u"
" WHERE CrsCod=%ld"
" AND UsrCod=%ld",
(unsigned) NewRole,
Gbl.Hierarchy.Crs.CrsCod,
UsrCod);
}

View File

@ -64,4 +64,7 @@ unsigned Rol_GetSelectedRoles (void);
Rol_Role_t Rol_GetRequestedRole (long UsrCod); Rol_Role_t Rol_GetRequestedRole (long UsrCod);
unsigned Rol_DB_GetUsrRoleInCrs (MYSQL_RES **mysql_res,long CrsCod,long UsrCod);
void Rol_DB_UpdateUsrRoleInCurrentCrs (long UsrCod,Rol_Role_t NewRole);
#endif #endif

View File

@ -401,7 +401,35 @@ void Set_EndOneSettingSelector (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/************************ Remove a user from a course ************************/ /************ Register last prefs in current course in database **************/
/*****************************************************************************/
void Set_DB_InsertUsrInCurrentCrsSettings (long UsrCod)
{
extern const char *Usr_StringsUsrListTypeInDB[Usr_NUM_USR_LIST_TYPES];
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,
Gbl.Hierarchy.Crs.CrsCod,
(long) (time_t) 0, // The user never accessed to tests in this course
Usr_StringsUsrListTypeInDB[Usr_SHOW_USRS_TYPE_DEFAULT],
Usr_CLASS_PHOTO_COLS_DEF,
Usr_LIST_WITH_PHOTOS_DEF ? 'Y' :
'N');
}
/*****************************************************************************/
/******************** Remove a user from course settings *********************/
/*****************************************************************************/ /*****************************************************************************/
void Set_DB_RemCrsUsrSettings (long UsrCod) void Set_DB_RemCrsUsrSettings (long UsrCod)

View File

@ -58,6 +58,7 @@ void Set_EndSettingsHead (void);
void Set_BeginOneSettingSelector (void); void Set_BeginOneSettingSelector (void);
void Set_EndOneSettingSelector (void); void Set_EndOneSettingSelector (void);
void Set_DB_InsertUsrInCurrentCrsSettings (long UsrCod);
void Set_DB_RemCrsUsrSettings (long UsrCod); void Set_DB_RemCrsUsrSettings (long UsrCod);
#endif #endif

View File

@ -2779,6 +2779,20 @@ static void Usr_InsertMyBirthday (void)
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
} }
/*****************************************************************************/
/************************* Filter some user's data ***************************/
/*****************************************************************************/
void Usr_FilterUsrBirthday (struct Date *Birthday)
{
/***** Fix birthday *****/
if (Birthday->Year < Gbl.Now.Date.Year-99 ||
Birthday->Year > Gbl.Now.Date.Year-16)
Birthday->Year =
Birthday->Month =
Birthday->Day = 0;
}
/*****************************************************************************/ /*****************************************************************************/
/************************ Write form for user log in *************************/ /************************ Write form for user log in *************************/
/*****************************************************************************/ /*****************************************************************************/
@ -10347,3 +10361,28 @@ Usr_Who_t Usr_GetHiddenParamWho (void)
Usr_NUM_WHO - 1, Usr_NUM_WHO - 1,
Usr_WHO_UNKNOWN); Usr_WHO_UNKNOWN);
} }
/*****************************************************************************/
/************************* Get old users from database ***********************/
/*****************************************************************************/
unsigned Usr_DB_GetOldUsrs (MYSQL_RES **mysql_res,time_t SecondsWithoutAccess)
{
return (unsigned)
DB_QuerySELECT (mysql_res,"can not get old users",
"SELECT UsrCod"
" FROM (SELECT UsrCod"
" FROM usr_last"
" WHERE LastTime<FROM_UNIXTIME(UNIX_TIMESTAMP()-%llu)"
" UNION "
"SELECT UsrCod"
" FROM usr_data"
" WHERE UsrCod NOT IN"
" (SELECT UsrCod"
" FROM usr_last)"
") AS candidate_usrs"
" WHERE UsrCod NOT IN"
" (SELECT DISTINCT UsrCod"
" FROM crs_users)",
(unsigned long long) SecondsWithoutAccess);
}

View File

@ -384,6 +384,7 @@ void Usr_WelcomeUsr (void);
void Usr_CreateBirthdayStrDB (const struct UsrData *UsrDat, void Usr_CreateBirthdayStrDB (const struct UsrData *UsrDat,
char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1]); char BirthdayStrDB[Usr_BIRTHDAY_STR_DB_LENGTH + 1]);
void Usr_FilterUsrBirthday (struct Date *Birthday);
void Usr_PutFormLogIn (void); void Usr_PutFormLogIn (void);
void Usr_WriteLoggedUsrHead (void); void Usr_WriteLoggedUsrHead (void);
@ -551,4 +552,6 @@ void Usr_PutWhoIcon (Usr_Who_t Who);
void Usr_PutHiddenParamWho (Usr_Who_t Who); void Usr_PutHiddenParamWho (Usr_Who_t Who);
Usr_Who_t Usr_GetHiddenParamWho (void); Usr_Who_t Usr_GetHiddenParamWho (void);
unsigned Usr_DB_GetOldUsrs (MYSQL_RES **mysql_res,time_t SecondsWithoutAccess);
#endif #endif