mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-02 06:45:30 +02:00
Version 17.10
This commit is contained in:
parent
6dca856aaa
commit
7c6774bc6c
2410
swad_action.c
2410
swad_action.c
File diff suppressed because it is too large
Load Diff
|
@ -252,13 +252,15 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 17.9.4 (2017-09-24)"
|
#define Log_PLATFORM_VERSION "SWAD 17.10 (2017-09-24)"
|
||||||
#define CSS_FILE "swad17.0.css"
|
#define CSS_FILE "swad17.0.css"
|
||||||
#define JS_FILE "swad16.206.3.js"
|
#define JS_FILE "swad16.206.3.js"
|
||||||
|
|
||||||
// Number of lines (includes comments but not blank lines) has been got with the following command:
|
// 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
|
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1
|
||||||
/*
|
/*
|
||||||
|
Version 17.10: Sep 24, 2017 Changes in permissions to view/edit projects.
|
||||||
|
Show project URL in listings of projects. (231319 lines)
|
||||||
Version 17.9.4: Sep 24, 2017 Changes in listing of projects. (231216 lines)
|
Version 17.9.4: Sep 24, 2017 Changes in listing of projects. (231216 lines)
|
||||||
Version 17.9.3: Sep 24, 2017 Write students' IDs in listing of projects. (231214 lines)
|
Version 17.9.3: Sep 24, 2017 Write students' IDs in listing of projects. (231214 lines)
|
||||||
Version 17.9.2: Sep 24, 2017 Header in listing of all projects in a table. (231206 lines)
|
Version 17.9.2: Sep 24, 2017 Header in listing of all projects in a table. (231206 lines)
|
||||||
|
|
164
swad_project.c
164
swad_project.c
|
@ -49,7 +49,7 @@
|
||||||
extern struct Globals Gbl;
|
extern struct Globals Gbl;
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************* Public constants and types ************************/
|
/************************* Private constants and types ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
@ -59,6 +59,8 @@ typedef enum
|
||||||
Prj_EDIT_ONE_PROJECT,
|
Prj_EDIT_ONE_PROJECT,
|
||||||
} Prj_ProjectView_t;
|
} Prj_ProjectView_t;
|
||||||
|
|
||||||
|
#define Prj_INTERVAL_DEFAULT ((time_t) 365 * (time_t) 24 * (time_t) 60 * (time_t) 60) // 1 year
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/***************************** Private variables *****************************/
|
/***************************** Private variables *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -85,6 +87,9 @@ static void Prj_ShowOneProjectTxtField (struct Project *Prj,
|
||||||
const char *Label,char *TxtField);
|
const char *Label,char *TxtField);
|
||||||
static void Prj_ShowTableAllProjectsTxtField (struct Project *Prj,
|
static void Prj_ShowTableAllProjectsTxtField (struct Project *Prj,
|
||||||
char *TxtField);
|
char *TxtField);
|
||||||
|
static void Prj_ShowOneProjectURL (const struct Project *Prj,
|
||||||
|
Prj_ProjectView_t ProjectView);
|
||||||
|
static void Prj_ShowTableAllProjectsURL (const struct Project *Prj);
|
||||||
static void Prj_ShowOneProjectUsrs (const struct Project *Prj,
|
static void Prj_ShowOneProjectUsrs (const struct Project *Prj,
|
||||||
Prj_ProjectView_t ProjectView,
|
Prj_ProjectView_t ProjectView,
|
||||||
Prj_RoleInProject_t RoleInProject);
|
Prj_RoleInProject_t RoleInProject);
|
||||||
|
@ -106,6 +111,10 @@ static bool Prj_CheckIfICanRemUsrFromPrj (void);
|
||||||
static void Prj_GetParamPrjOrder (void);
|
static void Prj_GetParamPrjOrder (void);
|
||||||
|
|
||||||
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden);
|
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden);
|
||||||
|
|
||||||
|
static bool Prj_CheckIfICanEditProject (long PrjCod);
|
||||||
|
static bool Prj_GetIfIAmTutorInProject (long PrjCod);
|
||||||
|
|
||||||
static void Prj_PutParams (void);
|
static void Prj_PutParams (void);
|
||||||
static void Prj_GetDataOfProject (struct Project *Prj,const char *Query);
|
static void Prj_GetDataOfProject (struct Project *Prj,const char *Query);
|
||||||
static void Prj_ResetProject (struct Project *Prj);
|
static void Prj_ResetProject (struct Project *Prj);
|
||||||
|
@ -146,6 +155,9 @@ void Prj_ShowTableAllProjects (void)
|
||||||
unsigned NumPrj;
|
unsigned NumPrj;
|
||||||
struct Project Prj;
|
struct Project Prj;
|
||||||
|
|
||||||
|
/***** Get parameters *****/
|
||||||
|
Prj_GetParamPrjOrder ();
|
||||||
|
|
||||||
/***** Get list of projects *****/
|
/***** Get list of projects *****/
|
||||||
Prj_GetListProjects ();
|
Prj_GetListProjects ();
|
||||||
|
|
||||||
|
@ -302,6 +314,7 @@ static void Prj_ShowTableAllProjectsHead (void)
|
||||||
extern const char *Txt_Description;
|
extern const char *Txt_Description;
|
||||||
extern const char *Txt_Required_knowledge;
|
extern const char *Txt_Required_knowledge;
|
||||||
extern const char *Txt_Required_materials;
|
extern const char *Txt_Required_materials;
|
||||||
|
extern const char *Txt_URL;
|
||||||
extern const char *Txt_Preassigned_QUESTION;
|
extern const char *Txt_Preassigned_QUESTION;
|
||||||
extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT];
|
extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT];
|
||||||
Prj_Order_t Order;
|
Prj_Order_t Order;
|
||||||
|
@ -320,6 +333,8 @@ static void Prj_ShowTableAllProjectsHead (void)
|
||||||
Txt_Required_knowledge);
|
Txt_Required_knowledge);
|
||||||
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||||
Txt_Required_materials);
|
Txt_Required_materials);
|
||||||
|
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||||
|
Txt_URL);
|
||||||
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||||
Txt_Preassigned_QUESTION);
|
Txt_Preassigned_QUESTION);
|
||||||
|
|
||||||
|
@ -338,8 +353,21 @@ static void Prj_ShowTableAllProjectsHead (void)
|
||||||
|
|
||||||
static bool Prj_CheckIfICanCreateProjects (void)
|
static bool Prj_CheckIfICanCreateProjects (void)
|
||||||
{
|
{
|
||||||
return (bool) (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
static const bool ICanCreateProjects[Rol_NUM_ROLES] =
|
||||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
{
|
||||||
|
false, // Rol_UNK
|
||||||
|
false, // Rol_GST
|
||||||
|
false, // Rol_USR
|
||||||
|
false, // Rol_STD
|
||||||
|
true, // Rol_NET
|
||||||
|
true, // Rol_TCH
|
||||||
|
true, // Rol_DEG_ADM
|
||||||
|
true, // Rol_CTR_ADM
|
||||||
|
true, // Rol_INS_ADM
|
||||||
|
true, // Rol_SYS_ADM
|
||||||
|
};
|
||||||
|
|
||||||
|
return ICanCreateProjects[Gbl.Usrs.Me.Role.Logged];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -461,7 +489,7 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
|
||||||
/***** Write first row of data of this project *****/
|
/***** Write first row of data of this project *****/
|
||||||
/* Forms to remove/edit this project */
|
/* Forms to remove/edit this project */
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
"<td rowspan=\"8\" class=\"CONTEXT_COL");
|
"<td rowspan=\"9\" class=\"CONTEXT_COL");
|
||||||
if (ProjectView == Prj_LIST_PROJECTS)
|
if (ProjectView == Prj_LIST_PROJECTS)
|
||||||
{
|
{
|
||||||
fprintf (Gbl.F.Out," COLOR%u\">",Gbl.RowEvenOdd);
|
fprintf (Gbl.F.Out," COLOR%u\">",Gbl.RowEvenOdd);
|
||||||
|
@ -536,6 +564,9 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
|
||||||
Prj_ShowOneProjectTxtField (Prj,ProjectView,
|
Prj_ShowOneProjectTxtField (Prj,ProjectView,
|
||||||
Txt_Required_materials,Prj->Materials);
|
Txt_Required_materials,Prj->Materials);
|
||||||
|
|
||||||
|
/* Link to view more info about the project */
|
||||||
|
Prj_ShowOneProjectURL (Prj,ProjectView);
|
||||||
|
|
||||||
/* Preassigned? */
|
/* Preassigned? */
|
||||||
fprintf (Gbl.F.Out,"<tr>"
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
"<td colspan=\"2\" class=\"RIGHT_TOP");
|
"<td colspan=\"2\" class=\"RIGHT_TOP");
|
||||||
|
@ -646,6 +677,9 @@ static void Prj_ShowTableAllProjectsOneRow (struct Project *Prj)
|
||||||
/* Required materials to carry out the project */
|
/* Required materials to carry out the project */
|
||||||
Prj_ShowTableAllProjectsTxtField (Prj,Prj->Materials);
|
Prj_ShowTableAllProjectsTxtField (Prj,Prj->Materials);
|
||||||
|
|
||||||
|
/* Link to view more info about the project */
|
||||||
|
Prj_ShowTableAllProjectsURL (Prj);
|
||||||
|
|
||||||
/* Preassigned? */
|
/* Preassigned? */
|
||||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u %s\">"
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u %s\">"
|
||||||
"%s"
|
"%s"
|
||||||
|
@ -776,6 +810,60 @@ static void Prj_ShowTableAllProjectsTxtField (struct Project *Prj,
|
||||||
TxtField);
|
TxtField);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/********************** Show URL associated to project ***********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void Prj_ShowOneProjectURL (const struct Project *Prj,
|
||||||
|
Prj_ProjectView_t ProjectView)
|
||||||
|
{
|
||||||
|
extern const char *Txt_URL;
|
||||||
|
bool PutLink;
|
||||||
|
|
||||||
|
/***** Write row with label and text *****/
|
||||||
|
PutLink = (ProjectView == Prj_LIST_PROJECTS && Prj->URL[0]);
|
||||||
|
|
||||||
|
fprintf (Gbl.F.Out,"<tr>"
|
||||||
|
"<td colspan=\"2\" class=\"RIGHT_TOP");
|
||||||
|
if (ProjectView == Prj_LIST_PROJECTS)
|
||||||
|
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
|
||||||
|
fprintf (Gbl.F.Out," %s\">"
|
||||||
|
"%s:"
|
||||||
|
"</td>"
|
||||||
|
"<td colspan=\"2\" class=\"LEFT_TOP",
|
||||||
|
Prj->Hidden ? "ASG_LABEL_LIGHT" :
|
||||||
|
"ASG_LABEL",
|
||||||
|
Txt_URL);
|
||||||
|
if (ProjectView == Prj_LIST_PROJECTS)
|
||||||
|
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
|
||||||
|
fprintf (Gbl.F.Out," %s\">",
|
||||||
|
Prj->Hidden ? "DAT_LIGHT" :
|
||||||
|
"DAT");
|
||||||
|
if (PutLink)
|
||||||
|
fprintf (Gbl.F.Out,"<a href=\"%s\" target=\"_blank\""
|
||||||
|
" class=\"%s\">",
|
||||||
|
Prj->URL,
|
||||||
|
Prj->Hidden ? "DAT_LIGHT" :
|
||||||
|
"DAT");
|
||||||
|
fprintf (Gbl.F.Out,"%s",Prj->URL);
|
||||||
|
if (PutLink)
|
||||||
|
fprintf (Gbl.F.Out,"</a>");
|
||||||
|
fprintf (Gbl.F.Out,"</td>"
|
||||||
|
"</tr>");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Prj_ShowTableAllProjectsURL (const struct Project *Prj)
|
||||||
|
{
|
||||||
|
/***** Show URL *****/
|
||||||
|
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u %s\">"
|
||||||
|
"%s"
|
||||||
|
"</td>",
|
||||||
|
Gbl.RowEvenOdd,
|
||||||
|
Prj->Hidden ? "DAT_LIGHT" :
|
||||||
|
"DAT",
|
||||||
|
Prj->URL);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/************************* Show users row in a project ***********************/
|
/************************* Show users row in a project ***********************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1354,32 +1442,57 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden)
|
||||||
{
|
{
|
||||||
Gbl.Prjs.PrjCodToEdit = PrjCod; // Used as parameter in contextual links
|
Gbl.Prjs.PrjCodToEdit = PrjCod; // Used as parameter in contextual links
|
||||||
|
|
||||||
|
if (Prj_CheckIfICanEditProject (PrjCod))
|
||||||
|
{
|
||||||
|
/***** Put form to remove project *****/
|
||||||
|
Ico_PutContextualIconToRemove (ActReqRemPrj,Prj_PutParams);
|
||||||
|
|
||||||
|
/***** Put form to hide/show project *****/
|
||||||
|
if (Hidden)
|
||||||
|
Ico_PutContextualIconToUnhide (ActShoPrj,Prj_PutParams);
|
||||||
|
else
|
||||||
|
Ico_PutContextualIconToHide (ActHidPrj,Prj_PutParams);
|
||||||
|
|
||||||
|
/***** Put form to edit project *****/
|
||||||
|
Ico_PutContextualIconToEdit (ActEdiOnePrj,Prj_PutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***** Put form to print project *****/
|
||||||
|
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/************************ Can I edit a given project? ************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static bool Prj_CheckIfICanEditProject (long PrjCod)
|
||||||
|
{
|
||||||
switch (Gbl.Usrs.Me.Role.Logged)
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
{
|
{
|
||||||
|
case Rol_NET:
|
||||||
|
return Prj_GetIfIAmTutorInProject (PrjCod);
|
||||||
case Rol_TCH:
|
case Rol_TCH:
|
||||||
case Rol_SYS_ADM:
|
case Rol_SYS_ADM:
|
||||||
/***** Put form to remove project *****/
|
return true;
|
||||||
Ico_PutContextualIconToRemove (ActReqRemPrj,Prj_PutParams);
|
|
||||||
|
|
||||||
/***** Put form to hide/show project *****/
|
|
||||||
if (Hidden)
|
|
||||||
Ico_PutContextualIconToUnhide (ActShoPrj,Prj_PutParams);
|
|
||||||
else
|
|
||||||
Ico_PutContextualIconToHide (ActHidPrj,Prj_PutParams);
|
|
||||||
|
|
||||||
/***** Put form to edit project *****/
|
|
||||||
Ico_PutContextualIconToEdit (ActEdiOnePrj,Prj_PutParams);
|
|
||||||
// no break
|
|
||||||
case Rol_STD:
|
|
||||||
case Rol_NET:
|
|
||||||
/***** Put form to print project *****/
|
|
||||||
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutParams);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*********************** Am I tutor in a given project? **********************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static bool Prj_GetIfIAmTutorInProject (long PrjCod)
|
||||||
|
{
|
||||||
|
char Query[256];
|
||||||
|
|
||||||
|
sprintf (Query,"SELECT COUNT(*) FROM prj_usr"
|
||||||
|
" WHERE PrjCod=%ld AND RoleInProject=%u AND UsrCod=%ld",
|
||||||
|
PrjCod,Prj_ROLE_TUT,Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||||
|
return (bool) (DB_QueryCOUNT (Query,"can not get number of projects in course") != 0);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********************** Params used to edit a project ************************/
|
/********************** Params used to edit a project ************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
@ -1420,6 +1533,7 @@ void Prj_GetListProjects (void)
|
||||||
/* Hidden subquery */
|
/* Hidden subquery */
|
||||||
switch (Gbl.Usrs.Me.Role.Logged)
|
switch (Gbl.Usrs.Me.Role.Logged)
|
||||||
{
|
{
|
||||||
|
case Rol_NET:
|
||||||
case Rol_TCH:
|
case Rol_TCH:
|
||||||
case Rol_SYS_ADM:
|
case Rol_SYS_ADM:
|
||||||
HiddenSubQuery[0] = '\0';
|
HiddenSubQuery[0] = '\0';
|
||||||
|
@ -1921,7 +2035,8 @@ static void Prj_RequestCreatOrEditPrj (long PrjCod)
|
||||||
/* Initialize to empty project */
|
/* Initialize to empty project */
|
||||||
Prj_ResetProject (&Prj);
|
Prj_ResetProject (&Prj);
|
||||||
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
||||||
Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
|
Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC +
|
||||||
|
Prj_INTERVAL_DEFAULT;
|
||||||
Prj.Open = true;
|
Prj.Open = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2180,7 +2295,8 @@ void Prj_RecFormProject (void)
|
||||||
if (Prj.TimeUTC[Dat_START_TIME] == 0)
|
if (Prj.TimeUTC[Dat_START_TIME] == 0)
|
||||||
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
||||||
if (Prj.TimeUTC[Dat_END_TIME] == 0)
|
if (Prj.TimeUTC[Dat_END_TIME] == 0)
|
||||||
Prj.TimeUTC[Dat_END_TIME] = Prj.TimeUTC[Dat_START_TIME] + 2 * 60 * 60; // +2 hours
|
Prj.TimeUTC[Dat_END_TIME] = Prj.TimeUTC[Dat_START_TIME] +
|
||||||
|
Prj_INTERVAL_DEFAULT;
|
||||||
|
|
||||||
/***** Check if title is correct *****/
|
/***** Check if title is correct *****/
|
||||||
if (!Prj.Title[0]) // If there is not a project title
|
if (!Prj.Title[0]) // If there is not a project title
|
||||||
|
|
|
@ -43,18 +43,19 @@
|
||||||
#define Rol_NUM_ROLES 10
|
#define Rol_NUM_ROLES 10
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
Rol_UNK = 0, // User not logged in
|
Rol_UNK = 0, // User not logged in
|
||||||
Rol_GST = 1, // User not belonging to any course
|
Rol_GST = 1, // User not belonging to any course
|
||||||
Rol_USR = 2, // Student, non-editing teacher or teacher in some courses...
|
Rol_USR = 2, // Student, non-editing teacher or teacher in some courses...
|
||||||
// ...but no course selected
|
// ...but no course selected
|
||||||
// ...or not belonging to the current course
|
// ...or not belonging to the current course
|
||||||
|
|
||||||
Rol_STD = 3, // Student in the current course
|
Rol_STD = 3, // Student in the current course
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
Rol_NET = 4, // Non-editing teacher in the current course
|
Rol_NET = 4, // Non-editing teacher in the current course
|
||||||
Rol_TCH = 5, // Teacher in the current course
|
Rol_TCH = 5, // Teacher in the current course
|
||||||
|
|
||||||
Rol_DEG_ADM = 6, // Degree administrator
|
Rol_DEG_ADM = 6, // Degree administrator
|
||||||
Rol_CTR_ADM = 7, // Centre administrator
|
Rol_CTR_ADM = 7, // Centre administrator
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
Rol_INS_ADM = 8, // Institution administrator
|
Rol_INS_ADM = 8, // Institution administrator
|
||||||
Rol_SYS_ADM = 9, // System administrator (superuser)
|
Rol_SYS_ADM = 9, // System administrator (superuser)
|
||||||
} Rol_Role_t;
|
} Rol_Role_t;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user