diff --git a/swad_API.c b/swad_API.c
index 2a06a5d97..000534ef3 100644
--- a/swad_API.c
+++ b/swad_API.c
@@ -264,7 +264,7 @@ static void API_CopyListUsers (struct soap *soap,
struct swad__getUsersOutput *getUsersOut);
static void API_CopyUsrData (struct soap *soap,
struct swad__user *Usr,struct Usr_Data *UsrDat,
- bool UsrIDIsVisible);
+ Usr_ICan_t ICanSeeUsrID);
static void API_GetListGrpsInAttendanceEventFromDB (struct soap *soap,
long AttCod,char **ListGroups);
@@ -1743,7 +1743,7 @@ static void API_CopyListUsers (struct soap *soap,
unsigned NumUsrs;
unsigned NumUsr;
struct Usr_Data UsrDat;
- bool ICanSeeUsrID;
+ Usr_ICan_t ICanSeeUsrID;
/***** Initialize result *****/
getUsersOut->numUsers = 0;
@@ -1772,7 +1772,7 @@ static void API_CopyListUsers (struct soap *soap,
/* Get list of user's IDs */
ID_GetListIDsFromUsrCod (&UsrDat);
- ICanSeeUsrID = (ID_ICanSeeOtherUsrIDs (&UsrDat) == Usr_I_CAN);
+ ICanSeeUsrID = ID_ICanSeeOtherUsrIDs (&UsrDat);
/* Get nickname */
Nck_DB_GetNicknameFromUsrCod (UsrDat.UsrCod,UsrDat.Nickname);
@@ -2191,7 +2191,7 @@ int swad__sendMyGroups (struct soap *soap,
static void API_CopyUsrData (struct soap *soap,
struct swad__user *Usr,struct Usr_Data *UsrDat,
- bool UsrIDIsVisible)
+ Usr_ICan_t ICanSeeUsrID)
{
char PhotoURL[Cns_MAX_BYTES_WWW + 1];
const char *FirstID;
@@ -2206,7 +2206,7 @@ static void API_CopyUsrData (struct soap *soap,
Str_Copy (Usr->userNickname,UsrDat->Nickname,Length);
/* Copy user's first ID */
- if (UsrIDIsVisible && UsrDat->IDs.List)
+ if (ICanSeeUsrID == Usr_I_CAN && UsrDat->IDs.List)
FirstID = UsrDat->IDs.List[0].ID;
else // Hide user's ID
FirstID = "********";
@@ -3262,7 +3262,7 @@ int swad__sendMessage (struct soap *soap,
API_CopyUsrData (soap,
&(sendMessageOut->usersArray.__ptr[NumUsr]),
&Gbl.Usrs.Other.UsrDat,
- false);
+ Usr_I_CAN_NOT);
}
}
}
diff --git a/swad_MFU.c b/swad_MFU.c
index 914ef79a0..ac640af58 100644
--- a/swad_MFU.c
+++ b/swad_MFU.c
@@ -112,7 +112,7 @@ void MFU_GetMFUActions (struct MFU_ListMFUActions *ListMFUActions,unsigned MaxAc
ActCod = DB_GetNextCode (mysql_res);
if ((Action = Act_GetActionFromActCod (ActCod)) != ActUnk)
if (Act_GetIndexInMenu (Action) >= 0) // MFU actions must be only actions shown on menu (database could contain wrong action numbers)
- if (Act_CheckIfIHavePermissionToExecuteAction (Action))
+ if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
ListMFUActions->Actions[ListMFUActions->NumActions++] = Action;
}
@@ -148,7 +148,7 @@ Act_Action_t MFU_GetMyLastActionInCurrentTab (void)
if (ActCod >= 0 && ActCod <= ActLst_MAX_ACTION_COD)
if ((Action = Act_GetActionFromActCod (ActCod)) >= 0)
if (Act_GetTab (Action) == Gbl.Action.Tab)
- if (Act_CheckIfIHavePermissionToExecuteAction (Action))
+ if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
{
MoreRecentActionInCurrentTab = Action;
break;
diff --git a/swad_action.c b/swad_action.c
index 3b224f869..f0c015776 100644
--- a/swad_action.c
+++ b/swad_action.c
@@ -99,12 +99,12 @@ Act_Action_t Act_GetSuperAction (Act_Action_t Action)
/************* Check if I have permission to execute an action ***************/
/*****************************************************************************/
-bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action)
+Usr_ICan_t Act_CheckIfICanExecuteAction (Act_Action_t Action)
{
unsigned Permission;
if ((unsigned) Action >= ActLst_NUM_ACTIONS)
- return false;
+ return Usr_I_CAN_NOT;
switch (Gbl.Hierarchy.Level)
{
@@ -128,10 +128,11 @@ bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action)
ActLst_Actions[Action].PermissionCrsIfIDontBelong;
break;
default:
- return false;
+ return Usr_I_CAN_NOT;
}
- return ((Permission & (1 << Gbl.Usrs.Me.Role.Logged)) != 0);
+ return ((Permission & (1 << Gbl.Usrs.Me.Role.Logged)) != 0) ? Usr_I_CAN :
+ Usr_I_CAN_NOT;
}
/*****************************************************************************/
diff --git a/swad_action.h b/swad_action.h
index d3e0d8bec..5837be509 100644
--- a/swad_action.h
+++ b/swad_action.h
@@ -35,6 +35,7 @@
#include "swad_language.h"
#include "swad_string.h"
#include "swad_tab.h"
+#include "swad_user_type.h"
/*****************************************************************************/
/****************************** Public constants *****************************/
@@ -105,7 +106,7 @@ long Act_GetActCod (Act_Action_t Action);
signed int Act_GetIndexInMenu (Act_Action_t Action);
Tab_Tab_t Act_GetTab (Act_Action_t Action);
Act_Action_t Act_GetSuperAction (Act_Action_t Action);
-bool Act_CheckIfIHavePermissionToExecuteAction (Act_Action_t Action);
+Usr_ICan_t Act_CheckIfICanExecuteAction (Act_Action_t Action);
Act_Content_t Act_GetContentType (Act_Action_t Action);
Act_BrowserTab_t Act_GetBrowserTab (Act_Action_t Action);
void (*Act_GetFunctionPriori (Act_Action_t Action)) (void);
diff --git a/swad_admin.c b/swad_admin.c
index 080b12b14..490f39f0d 100644
--- a/swad_admin.c
+++ b/swad_admin.c
@@ -90,7 +90,7 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
[Hie_DEG] = ActNewAdmDeg,
[Hie_CRS] = ActUnk,
};
- bool ICanRegister;
+ Usr_ICan_t ICanRegister;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@@ -100,8 +100,9 @@ void Adm_ReqAddAdm (Hie_Level_t Level)
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
- (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
- if (ICanRegister)
+ (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
+ Usr_I_CAN_NOT;
+ if (ICanRegister == Usr_I_CAN)
{
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level)) // User is already an administrator of current institution/center/degree
{
@@ -185,7 +186,7 @@ void Adm_GetAdmsLst (Hie_Level_t Level)
static void Adm_AddAdm (Hie_Level_t Level)
{
- bool ICanRegister;
+ Usr_ICan_t ICanRegister;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@@ -195,8 +196,9 @@ static void Adm_AddAdm (Hie_Level_t Level)
/* Check if I am allowed to register user as administrator in institution/center/degree */
ICanRegister = ((Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
- (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
- if (ICanRegister)
+ (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
+ Usr_I_CAN_NOT;
+ if (ICanRegister == Usr_I_CAN)
{
/***** Register administrator in current institution/center/degree in database *****/
Adm_RegisterAdmin (&Gbl.Usrs.Other.UsrDat,Level);
@@ -298,7 +300,7 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
{
extern const char *Txt_THE_USER_X_is_not_an_administrator_of_Y;
Usr_MeOrOther_t MeOrOther;
- bool ICanRemove;
+ Usr_ICan_t ICanRemove;
if (Gbl.Hierarchy.Node[Level].HieCod > 0)
{
@@ -310,8 +312,9 @@ static void Adm_ReqRemOrRemAdm (Enr_ReqDelOrDelUsr_t ReqDelOrDelUsr,
ICanRemove = (MeOrOther == Usr_ME ||
(Level == Hie_DEG && Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM) ||
(Level == Hie_CTR && Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM) ||
- (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM));
- if (ICanRemove)
+ (Level == Hie_INS && Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM)) ? Usr_I_CAN :
+ Usr_I_CAN_NOT;
+ if (ICanRemove == Usr_I_CAN)
{
/* Check if the other user is an admin of the current institution/center/degree */
if (Adm_DB_CheckIfUsrIsAdm (Gbl.Usrs.Other.UsrDat.UsrCod,Level))
diff --git a/swad_attendance.c b/swad_attendance.c
index 37ad699ee..6904e8fe2 100644
--- a/swad_attendance.c
+++ b/swad_attendance.c
@@ -338,14 +338,15 @@ static void Att_ParsWhichGroupsToShow (void *Events)
static void Att_PutIconsInListOfEvents (void *Events)
{
- bool ICanEdit;
+ Usr_ICan_t ICanEdit;
if (Events)
{
/***** Put icon to create a new attendance event *****/
ICanEdit = (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
- Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
- if (ICanEdit)
+ Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM) ? Usr_I_CAN :
+ Usr_I_CAN_NOT;
+ if (ICanEdit == Usr_I_CAN)
Att_PutIconToCreateNewEvent ((struct Att_Events *) Events);
/***** Put icon to show attendance list *****/
@@ -1655,9 +1656,9 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
bool Present;
char CommentStd[Cns_MAX_BYTES_TEXT + 1];
char CommentTch[Cns_MAX_BYTES_TEXT + 1];
- bool ICanChangeStdAttendance;
- bool ICanEditStdComment;
- bool ICanEditTchComment;
+ Usr_ICan_t ICanChangeStdAttendance;
+ Usr_ICan_t ICanEditStdComment;
+ Usr_ICan_t ICanEditTchComment;
/***** Set who can edit *****/
switch (Gbl.Usrs.Me.Role.Logged)
@@ -1666,24 +1667,25 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
// A student can see only her/his attendance
if (Usr_ItsMe (UsrDat->UsrCod) == Usr_OTHER)
Err_ShowErrorAndExit ("Wrong call.");
- ICanChangeStdAttendance = false;
- ICanEditStdComment = Event->Open; // Attendance event is open
- ICanEditTchComment = false;
+ ICanChangeStdAttendance = Usr_I_CAN_NOT;
+ ICanEditStdComment = Event->Open ? Usr_I_CAN : // Attendance event is open
+ Usr_I_CAN_NOT;
+ ICanEditTchComment = Usr_I_CAN_NOT;
break;
case Rol_TCH:
- ICanChangeStdAttendance = true;
- ICanEditStdComment = false;
- ICanEditTchComment = true;
+ ICanChangeStdAttendance = Usr_I_CAN;
+ ICanEditStdComment = Usr_I_CAN_NOT;
+ ICanEditTchComment = Usr_I_CAN;
break;
case Rol_SYS_ADM:
- ICanChangeStdAttendance = true;
- ICanEditStdComment = false;
- ICanEditTchComment = false;
+ ICanChangeStdAttendance = Usr_I_CAN;
+ ICanEditStdComment = Usr_I_CAN_NOT;
+ ICanEditTchComment = Usr_I_CAN_NOT;
break;
default:
- ICanChangeStdAttendance = false;
- ICanEditStdComment = false;
- ICanEditTchComment = false;
+ ICanChangeStdAttendance = Usr_I_CAN_NOT;
+ ICanEditStdComment = Usr_I_CAN_NOT;
+ ICanEditTchComment = Usr_I_CAN_NOT;
break;
}
@@ -1706,8 +1708,8 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"id=\"Std%u\" value=\"%s\"%s%s",
NumUsr,UsrDat->EnUsrCod,
Present ? " checked=\"checked\"" : "",
- ICanChangeStdAttendance ? "" :
- " disabled=\"disabled\"");
+ (ICanChangeStdAttendance == Usr_I_CAN) ? "" :
+ " disabled=\"disabled\"");
HTM_TD_End ();
/***** Write number of student in the list *****/
@@ -1755,7 +1757,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL",
The_GetSuffix (),
The_GetColorRows ());
- if (ICanEditStdComment) // Show with form
+ if (ICanEditStdComment == Usr_I_CAN) // Show with form
{
HTM_TEXTAREA_Begin ("name=\"CommentStd%s\" cols=\"40\" rows=\"3\""
" class=\"INPUT_%s\"",
@@ -1778,7 +1780,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
"DAT_SMALL",
The_GetSuffix (),
The_GetColorRows ());
- if (ICanEditTchComment) // Show with form
+ if (ICanEditTchComment == Usr_I_CAN) // Show with form
{
HTM_TEXTAREA_Begin ("name=\"CommentTch%s\" cols=\"40\" rows=\"3\""
" class=\"INPUT_%s\"",
@@ -1787,7 +1789,7 @@ static void Att_WriteRowUsrToCallTheRoll (unsigned NumUsr,
HTM_Txt (CommentTch);
HTM_TEXTAREA_End ();
}
- else if (Event->CommentTchVisible) // Show without form
+ else if (Event->CommentTchVisible) // Show without form
{
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
CommentTch,Cns_MAX_BYTES_TEXT,
diff --git a/swad_browser.c b/swad_browser.c
index 2b519c6fd..4aa846fa8 100644
--- a/swad_browser.c
+++ b/swad_browser.c
@@ -1140,7 +1140,7 @@ static void Brw_ListDir (unsigned Level,const char *RowId,
static bool Brw_WriteRowFileBrowser (unsigned Level,const char *RowId,
bool TreeContracted,
Brw_IconTree_t IconThisRow);
-static bool Brw_CheckIfCanPasteIn (unsigned Level);
+static Usr_ICan_t Brw_CheckIfCanPasteIn (unsigned Level);
static void Brw_PutIconRemove (void);
static void Brw_PutIconCopy (void);
static void Brw_PutIconPaste (unsigned Level);
@@ -4137,26 +4137,26 @@ void Brw_SetFullPathInTree (void)
/*****************************************************************************/
// Return true if Gbl.FileBrowser.Clipboard.FilFolLnk.Full can be pasted into Gbl.FileBrowser.FilFolLnk.Full
-static bool Brw_CheckIfCanPasteIn (unsigned Level)
+static Usr_ICan_t Brw_CheckIfCanPasteIn (unsigned Level)
{
char PathDstWithFile[PATH_MAX + 1 + NAME_MAX + 1];
/***** If not in a folder... *****/
if (Gbl.FileBrowser.FilFolLnk.Type != Brw_IS_FOLDER)
- return false;
+ return Usr_I_CAN_NOT;
/***** If there is nothing in clipboard... *****/
if (Gbl.FileBrowser.Clipboard.FileBrowser == Brw_UNKNOWN)
- return false;
+ return Usr_I_CAN_NOT;
/***** Do not paste a link in marks... *****/
if (Gbl.FileBrowser.Clipboard.FilFolLnk.Type == Brw_IS_LINK &&
Brw_TypeIsAdmMrk[Gbl.FileBrowser.Type])
- return false;
+ return Usr_I_CAN_NOT;
/**** If I can not create elements into this folder... *****/
if (Brw_CheckIfICanCreateIntoFolder (Level) == Usr_I_CAN_NOT)
- return false; // Pasting into top level of assignments is forbidden
+ return Usr_I_CAN_NOT; // Pasting into top level of assignments is forbidden
/**** If we are in the same tree of the clipboard... *****/
if (Gbl.FileBrowser.Clipboard.IsThisTree) // We are in the same tree of the clipboard ==>
@@ -4167,11 +4167,12 @@ static bool Brw_CheckIfCanPasteIn (unsigned Level)
Gbl.FileBrowser.FilFolLnk.Full,
Gbl.FileBrowser.Clipboard.FilFolLnk.Name);
- return !Str_Path1BeginsByPath2 (PathDstWithFile,
- Gbl.FileBrowser.Clipboard.FilFolLnk.Full);
+ return Str_Path1BeginsByPath2 (PathDstWithFile,
+ Gbl.FileBrowser.Clipboard.FilFolLnk.Full) ? Usr_I_CAN_NOT :
+ Usr_I_CAN;
}
- return true; // I can paste
+ return Usr_I_CAN; // I can paste
}
/*****************************************************************************/
@@ -4233,7 +4234,7 @@ static void Brw_PutIconPaste (unsigned Level)
if (Gbl.FileBrowser.FilFolLnk.Type == Brw_IS_FOLDER) // Can't paste in a file or link
{
/* Icon to paste */
- if (Brw_CheckIfCanPasteIn (Level))
+ if (Brw_CheckIfCanPasteIn (Level) == Usr_I_CAN)
{
/***** Form to paste the content of the clipboard *****/
Ico_PutContextualIconToPaste (Brw_ActPaste[Gbl.FileBrowser.Type],
@@ -5768,7 +5769,7 @@ static void Brw_PasteClipboard (struct BrwSiz_BrowserSize *Size)
Pasted.NumFolds = 0;
Gbl.FileBrowser.Clipboard.IsThisTree = Brw_CheckIfClipboardIsInThisTree ();
- if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level))
+ if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level) == Usr_I_CAN)
{
/***** Construct the relative path of the origin file or folder *****/
switch (Gbl.FileBrowser.Clipboard.FileBrowser)
@@ -6212,7 +6213,7 @@ void Brw_ShowFormFileBrowser (void)
{
/***** Check if we can paste in this folder *****/
Gbl.FileBrowser.Clipboard.IsThisTree = Brw_CheckIfClipboardIsInThisTree ();
- if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level))
+ if (Brw_CheckIfCanPasteIn (Gbl.FileBrowser.Level) == Usr_I_CAN)
Brw_PutFormToPasteAFileOrFolder (FileNameToShow);
}
diff --git a/swad_changelog.h b/swad_changelog.h
index 5fbca0061..f2126f021 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -633,10 +633,11 @@ Me sale este error, no s
"can npt create received message (duplicated entry '243218-2160773' for key 'UsrCod_MsgCod')
*/
-#define Log_PLATFORM_VERSION "SWAD 23.72 (2024-04-01)"
+#define Log_PLATFORM_VERSION "SWAD 23.72.1 (2024-04-01)"
#define CSS_FILE "swad23.67.2.css"
#define JS_FILE "swad23.53.6.js"
/*
+ Version 23.72.1: Apr 01, 2024 New type Usr_ICan_t. (334912 lines)
Version 23.72: Apr 01, 2024 New type Usr_ICan_t. (334879 lines)
Version 23.71.4: Mar 22, 2024 Code refactoring. (334860 lines)
Version 23.71.3: Mar 22, 2024 Code refactoring. (334827 lines)
diff --git a/swad_main.c b/swad_main.c
index 73341bd93..bfb57ed3a 100644
--- a/swad_main.c
+++ b/swad_main.c
@@ -147,7 +147,7 @@ int main (void)
Fir_CheckFirewallAndExitIfTooManyRequests ();
/***** Check if the user have permission to execute the action *****/
- if (!Act_CheckIfIHavePermissionToExecuteAction (Gbl.Action.Act))
+ if (Act_CheckIfICanExecuteAction (Gbl.Action.Act) == Usr_I_CAN_NOT)
Err_NoPermissionExit ();
/***** Update most frequently used actions *****/
diff --git a/swad_menu.c b/swad_menu.c
index fffb9ba0b..1181d0e7d 100644
--- a/swad_menu.c
+++ b/swad_menu.c
@@ -227,7 +227,7 @@ Act_Action_t Mnu_GetFirstActionAvailableInCurrentTab (void)
{
if ((Action = Mnu_Menu[Gbl.Action.Tab][NumOptInMenu].Action) == 0)
return ActUnk;
- if (Act_CheckIfIHavePermissionToExecuteAction (Action))
+ if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
return Action;
}
return ActUnk;
@@ -264,7 +264,7 @@ void Mnu_WriteMenuThisTab (void)
Action = Mnu_Menu[Gbl.Action.Tab][NumOptInMenu].Action;
if (Action == 0) // At the end of each tab, actions are initialized to 0, so 0 marks the end of the menu
break;
- if (Act_CheckIfIHavePermissionToExecuteAction (Action))
+ if (Act_CheckIfICanExecuteAction (Action) == Usr_I_CAN)
{
IsTheSelectedAction = (Action == Act_GetSuperAction (Gbl.Action.Act));
diff --git a/swad_user.h b/swad_user.h
index d77d850e7..4d9da7cb6 100644
--- a/swad_user.h
+++ b/swad_user.h
@@ -49,119 +49,10 @@
#include "swad_string.h"
#include "swad_theme.h"
-/*****************************************************************************/
-/****************************** Public constants *****************************/
-/*****************************************************************************/
-
-#define Usr_MIN_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 6
-#define Usr_DEF_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 12
-#define Usr_MAX_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 60
-
-#define Usr_MAX_CHARS_FIRSTNAME_OR_SURNAME (32 - 1) // 31
-#define Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME ((Usr_MAX_CHARS_FIRSTNAME_OR_SURNAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 511
-
-#define Usr_MAX_BYTES_SURNAMES (Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME)
- // Surname1 +' '+ Surname2
-#define Usr_MAX_BYTES_FULL_NAME (Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 6 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME)
- // Surname1 +' '+ Surname2 + ','+' ' + FirstName
- // Surname1 +' '+ Surname2 + '
' + FirstName
-
-#define Usr_BIRTHDAY_STR_DB_LENGTH (1 + 4 + 1 + 2 + 1 + 2 + 1) // "'%04u-%02u-%02u'"
-
-#define Usr_MAX_CHARS_ADDRESS (128 - 1) // 127
-#define Usr_MAX_BYTES_ADDRESS ((Usr_MAX_CHARS_ADDRESS + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
-
-#define Usr_MAX_CHARS_PHONE 16
-#define Usr_MAX_BYTES_PHONE Usr_MAX_CHARS_PHONE
-
-#define Usr_CLASS_PHOTO_COLS_DEF 10 // Default number of columns in a class photo
-#define Usr_CLASS_PHOTO_COLS_MAX 100 // Maximum number of columns in a class photo
-
-#define Usr_LIST_WITH_PHOTOS_DEF true
-
-#define Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS (Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 * Cfg_MAX_USRS_IN_LIST)
-
-#define Usr_NUM_MAIN_FIELDS_DATA_USR 8
-
-#define Usr_USER_LIST_SECTION_ID "user_list"
-
/*****************************************************************************/
/******************************** Public types *******************************/
/*****************************************************************************/
-// Get user's data with or without personal settings
-typedef enum
- {
- Usr_DONT_GET_PREFS = 0,
- Usr_GET_PREFS = 1,
- } Usr_GetPrefs_t;
-
-typedef enum
- {
- Usr_DONT_GET_ROLE_IN_CRS = 0,
- Usr_GET_ROLE_IN_CRS = 1,
- } Usr_GetRoleInCurrentCrs_t;
-
-
-// Related with user's sexes
-#define Usr_NUM_SEXS 4 // Unknown, female, male, all
-typedef enum
- {
- Usr_SEX_UNKNOWN = 0,
- Usr_SEX_FEMALE = 1,
- Usr_SEX_MALE = 2,
- Usr_SEX_ALL = 3, // Usr_SEX_ALL is intended for "all sexs"
- } Usr_Sex_t;
-// Don't change these numbers! They are used for user's sex in database
-
-// Related with class photograph
-#define Usr_NUM_CLASS_PHOTO_TYPE 3
-typedef enum
- {
- Usr_CLASS_PHOTO_SEL, // Only for selection of users
- Usr_CLASS_PHOTO_SEL_SEE, // Selecting and seeing users
- Usr_CLASS_PHOTO_PRN, // Only print users
- } Usr_ClassPhotoType_t;
-
-#define Usr_LIST_USRS_NUM_OPTIONS 8
-typedef enum
- {
- Usr_OPTION_UNKNOWN = 0,
- Usr_OPTION_RECORDS = 1,
- Usr_OPTION_HOMEWORK = 2,
- Usr_OPTION_ATTENDANCE = 3,
- Usr_OPTION_MESSAGE = 4,
- Usr_OPTION_EMAIL = 5,
- Usr_OPTION_FOLLOW = 6,
- Usr_OPTION_UNFOLLOW = 7,
- } Usr_ListUsrsOption_t;
-#define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS
-
-#define Usr_NUM_I_CAN 2
-typedef enum
- {
- Usr_I_CAN_NOT,
- Usr_I_CAN,
- } Usr_ICan_t;
-
-#define Usr_NUM_ME_OR_OTHER 2
-typedef enum
- {
- Usr_ME,
- Usr_OTHER,
- } Usr_MeOrOther_t;
-
-#define Usr_NUM_WHO 5
-typedef enum
- {
- Usr_WHO_UNKNOWN,
- Usr_WHO_ME,
- Usr_WHO_SELECTED,
- Usr_WHO_FOLLOWED,
- Usr_WHO_ALL,
- } Usr_Who_t;
-#define Usr_WHO_DEFAULT Usr_WHO_ALL
-
// Related with user's data
struct Usr_Data
{
diff --git a/swad_user_type.h b/swad_user_type.h
new file mode 100644
index 000000000..4b619601e
--- /dev/null
+++ b/swad_user_type.h
@@ -0,0 +1,138 @@
+// swad_user_type.h: definition of types for users
+
+#ifndef _SWAD_USR_TYP
+#define _SWAD_USR_TYP
+/*
+ SWAD (Shared Workspace At a Distance in Spanish),
+ 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 .
+*/
+/*****************************************************************************/
+/****************************** Public constants *****************************/
+/*****************************************************************************/
+
+#define Usr_MIN_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 6
+#define Usr_DEF_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 12
+#define Usr_MAX_MONTHS_WITHOUT_ACCESS_TO_REMOVE_OLD_USRS 60
+
+#define Usr_MAX_CHARS_FIRSTNAME_OR_SURNAME (32 - 1) // 31
+#define Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME ((Usr_MAX_CHARS_FIRSTNAME_OR_SURNAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 511
+
+#define Usr_MAX_BYTES_SURNAMES (Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME)
+ // Surname1 +' '+ Surname2
+#define Usr_MAX_BYTES_FULL_NAME (Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 1 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME + 6 + Usr_MAX_BYTES_FIRSTNAME_OR_SURNAME)
+ // Surname1 +' '+ Surname2 + ','+' ' + FirstName
+ // Surname1 +' '+ Surname2 + '
' + FirstName
+
+#define Usr_BIRTHDAY_STR_DB_LENGTH (1 + 4 + 1 + 2 + 1 + 2 + 1) // "'%04u-%02u-%02u'"
+
+#define Usr_MAX_CHARS_ADDRESS (128 - 1) // 127
+#define Usr_MAX_BYTES_ADDRESS ((Usr_MAX_CHARS_ADDRESS + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
+
+#define Usr_MAX_CHARS_PHONE 16
+#define Usr_MAX_BYTES_PHONE Usr_MAX_CHARS_PHONE
+
+#define Usr_CLASS_PHOTO_COLS_DEF 10 // Default number of columns in a class photo
+#define Usr_CLASS_PHOTO_COLS_MAX 100 // Maximum number of columns in a class photo
+
+#define Usr_LIST_WITH_PHOTOS_DEF true
+
+#define Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS (Cry_BYTES_ENCRYPTED_STR_SHA256_BASE64 * Cfg_MAX_USRS_IN_LIST)
+
+#define Usr_NUM_MAIN_FIELDS_DATA_USR 8
+
+#define Usr_USER_LIST_SECTION_ID "user_list"
+
+/*****************************************************************************/
+/******************************** Public types *******************************/
+/*****************************************************************************/
+
+// Get user's data with or without personal settings
+typedef enum
+ {
+ Usr_DONT_GET_PREFS = 0,
+ Usr_GET_PREFS = 1,
+ } Usr_GetPrefs_t;
+
+typedef enum
+ {
+ Usr_DONT_GET_ROLE_IN_CRS = 0,
+ Usr_GET_ROLE_IN_CRS = 1,
+ } Usr_GetRoleInCurrentCrs_t;
+
+// Related with user's sexes
+#define Usr_NUM_SEXS 4 // Unknown, female, male, all
+typedef enum
+ {
+ Usr_SEX_UNKNOWN = 0,
+ Usr_SEX_FEMALE = 1,
+ Usr_SEX_MALE = 2,
+ Usr_SEX_ALL = 3, // Usr_SEX_ALL is intended for "all sexs"
+ } Usr_Sex_t;
+// Don't change these numbers! They are used for user's sex in database
+
+// Related with class photograph
+#define Usr_NUM_CLASS_PHOTO_TYPE 3
+typedef enum
+ {
+ Usr_CLASS_PHOTO_SEL, // Only for selection of users
+ Usr_CLASS_PHOTO_SEL_SEE, // Selecting and seeing users
+ Usr_CLASS_PHOTO_PRN, // Only print users
+ } Usr_ClassPhotoType_t;
+
+#define Usr_LIST_USRS_NUM_OPTIONS 8
+typedef enum
+ {
+ Usr_OPTION_UNKNOWN = 0,
+ Usr_OPTION_RECORDS = 1,
+ Usr_OPTION_HOMEWORK = 2,
+ Usr_OPTION_ATTENDANCE = 3,
+ Usr_OPTION_MESSAGE = 4,
+ Usr_OPTION_EMAIL = 5,
+ Usr_OPTION_FOLLOW = 6,
+ Usr_OPTION_UNFOLLOW = 7,
+ } Usr_ListUsrsOption_t;
+#define Usr_LIST_USRS_DEFAULT_OPTION Usr_OPTION_RECORDS
+
+#define Usr_NUM_I_CAN 2
+typedef enum
+ {
+ Usr_I_CAN_NOT,
+ Usr_I_CAN,
+ } Usr_ICan_t;
+
+#define Usr_NUM_ME_OR_OTHER 2
+typedef enum
+ {
+ Usr_ME,
+ Usr_OTHER,
+ } Usr_MeOrOther_t;
+
+#define Usr_NUM_WHO 5
+typedef enum
+ {
+ Usr_WHO_UNKNOWN,
+ Usr_WHO_ME,
+ Usr_WHO_SELECTED,
+ Usr_WHO_FOLLOWED,
+ Usr_WHO_ALL,
+ } Usr_Who_t;
+#define Usr_WHO_DEFAULT Usr_WHO_ALL
+
+#endif