mirror of
https://github.com/acanas/swad-core.git
synced 2024-06-02 06:45:30 +02:00
Version 15.229
This commit is contained in:
parent
c5f0a6fcac
commit
5e4e2db59a
2662
css/swad15.226.css
2662
css/swad15.226.css
File diff suppressed because it is too large
Load Diff
|
@ -129,17 +129,18 @@
|
||||||
/****************************** Public constants *****************************/
|
/****************************** Public constants *****************************/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#define Log_PLATFORM_VERSION "SWAD 15.228.2 (2016-06-23)"
|
#define Log_PLATFORM_VERSION "SWAD 15.229 (2016-06-23)"
|
||||||
#define CSS_FILE "swad15.226.css"
|
#define CSS_FILE "swad15.229.css"
|
||||||
#define JS_FILE "swad15.226.js"
|
#define JS_FILE "swad15.226.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 15.228.2 Jun 23, 2015 Code refactoring in lists of users. (202791 lines)
|
Version 15.229: Jun 23, 2015 Search of students available for all users. (203194 lines)
|
||||||
Version 15.228.1 Jun 23, 2015 Code refactoring in lists of users. (202794 lines)
|
Version 15.228.2: Jun 23, 2015 Code refactoring in lists of users. (202791 lines)
|
||||||
Version 15.228 Jun 23, 2015 Code refactoring in lists of users. (202814 lines)
|
Version 15.228.1: Jun 23, 2015 Code refactoring in lists of users. (202794 lines)
|
||||||
Version 15.227.1 Jun 23, 2015 Code refactoring in getting/searching users. (202854 lines)
|
Version 15.228: Jun 23, 2015 Code refactoring in lists of users. (202814 lines)
|
||||||
|
Version 15.227.1: Jun 23, 2015 Code refactoring in getting/searching users. (202854 lines)
|
||||||
Version 15.227: Jun 21, 2015 Query optimization in search of users. (202820 lines)
|
Version 15.227: Jun 21, 2015 Query optimization in search of users. (202820 lines)
|
||||||
Version 15.226.7: Jun 19, 2015 One new social network. (202969 lines)
|
Version 15.226.7: Jun 19, 2015 One new social network. (202969 lines)
|
||||||
1 change necessary in database:
|
1 change necessary in database:
|
||||||
|
|
|
@ -296,8 +296,8 @@ static bool Sch_CheckIfIHavePermissionToSearch (Sch_WhatToSearch_t WhatToSearch)
|
||||||
0x1FF, // Sch_SEARCH_DEGREES
|
0x1FF, // Sch_SEARCH_DEGREES
|
||||||
0x1FF, // Sch_SEARCH_COURSES
|
0x1FF, // Sch_SEARCH_COURSES
|
||||||
0x1FF, // Sch_SEARCH_TEACHERS
|
0x1FF, // Sch_SEARCH_TEACHERS
|
||||||
0x100, // Sch_SEARCH_STUDENTS Only for superusers
|
0x1FF, // Sch_SEARCH_STUDENTS
|
||||||
0x100, // Sch_SEARCH_GUESTS Only for superusers
|
0x1FF, // Sch_SEARCH_GUESTS
|
||||||
0x1FF, // Sch_SEARCH_OPEN_DOCUMENTS
|
0x1FF, // Sch_SEARCH_OPEN_DOCUMENTS
|
||||||
0x1FE, // Sch_SEARCH_DOCUM_IN_MY_COURSES Only if I am logged
|
0x1FE, // Sch_SEARCH_DOCUM_IN_MY_COURSES Only if I am logged
|
||||||
0x1FE, // Sch_SEARCH_MY_DOCUMENTS Only if I am logged
|
0x1FE, // Sch_SEARCH_MY_DOCUMENTS Only if I am logged
|
||||||
|
@ -742,7 +742,7 @@ static unsigned Sch_SearchUsrsInDB (Rol_Role_t Role)
|
||||||
/***** Check user's permission *****/
|
/***** Check user's permission *****/
|
||||||
if (Sch_CheckIfIHavePermissionToSearch ( Role == Rol_TEACHER ? Sch_SEARCH_TEACHERS :
|
if (Sch_CheckIfIHavePermissionToSearch ( Role == Rol_TEACHER ? Sch_SEARCH_TEACHERS :
|
||||||
(Role == Rol_STUDENT ? Sch_SEARCH_STUDENTS :
|
(Role == Rol_STUDENT ? Sch_SEARCH_STUDENTS :
|
||||||
Sch_SEARCH_GUESTS)))
|
Sch_SEARCH_GUESTS)))
|
||||||
/***** Split user string into words *****/
|
/***** Split user string into words *****/
|
||||||
if (Sch_BuildSearchQuery (SearchQuery,
|
if (Sch_BuildSearchQuery (SearchQuery,
|
||||||
"CONCAT_WS(' ',usr_data.FirstName,usr_data.Surname1,usr_data.Surname2)",
|
"CONCAT_WS(' ',usr_data.FirstName,usr_data.Surname1,usr_data.Surname2)",
|
||||||
|
@ -1149,7 +1149,7 @@ static unsigned Sch_SearchMyDocumentsInDB (const char *RangeQuery)
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/****** Build a search query by splitting a string to search into words ******/
|
/****** Build a search query by splitting a string to search into words ******/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
// Returns true if a valid search query is biult
|
// Returns true if a valid search query is built
|
||||||
// Returns false when no valid search query
|
// Returns false when no valid search query
|
||||||
|
|
||||||
static bool Sch_BuildSearchQuery (char *SearchQuery,const char *FieldName,
|
static bool Sch_BuildSearchQuery (char *SearchQuery,const char *FieldName,
|
||||||
|
|
582
swad_user.c
582
swad_user.c
|
@ -142,6 +142,7 @@ static void Usr_WriteUsrData (const char *BgColor,
|
||||||
bool NonBreak,bool Accepted);
|
bool NonBreak,bool Accepted);
|
||||||
|
|
||||||
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,bool Search,const char *UsrQuery,char *Query);
|
static void Usr_BuildQueryToGetUsrsLstCrs (Rol_Role_t Role,bool Search,const char *UsrQuery,char *Query);
|
||||||
|
static void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery);
|
||||||
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
|
static void Usr_GetAdmsLst (Sco_Scope_t Scope);
|
||||||
static void Usr_GetGstsLst (Sco_Scope_t Scope);
|
static void Usr_GetGstsLst (Sco_Scope_t Scope);
|
||||||
static void Usr_GetListUsrsFromQuery (const char *Query,Rol_Role_t Role,Sco_Scope_t Scope);
|
static void Usr_GetListUsrsFromQuery (const char *Query,Rol_Role_t Role,Sco_Scope_t Scope);
|
||||||
|
@ -3797,13 +3798,13 @@ void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope)
|
||||||
Usr_GetListUsrsFromQuery (Query,Role,Scope);
|
Usr_GetListUsrsFromQuery (Query,Role,Scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/********* Search list of users with a given role in current scope ***********/
|
/********* Search list of users with a given role in current scope ***********/
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery)
|
static void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery)
|
||||||
{
|
{
|
||||||
|
extern const char *Pri_VisibilityDB[Pri_NUM_OPTIONS_PRIVACY];
|
||||||
char Query[16*1024];
|
char Query[16*1024];
|
||||||
|
|
||||||
/***** Build query *****/
|
/***** Build query *****/
|
||||||
|
@ -3830,105 +3831,508 @@ void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery)
|
||||||
case Sco_SCOPE_SYS:
|
case Sco_SCOPE_SYS:
|
||||||
/* Search users in courses from the whole platform */
|
/* Search users in courses from the whole platform */
|
||||||
// 2 columns are retrieved: UsrCod, Sex
|
// 2 columns are retrieved: UsrCod, Sex
|
||||||
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
switch (Gbl.Usrs.Me.LoggedRole)
|
||||||
"(SELECT DISTINCT candidate_users.UsrCod"
|
{
|
||||||
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr"
|
case Rol_SYS_ADM:
|
||||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
" AND crs_usr.Role='%u') AS list_usrs,usr_data"
|
"(SELECT DISTINCT candidate_users.UsrCod"
|
||||||
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr"
|
||||||
" ORDER BY "
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
"usr_data.Surname1,"
|
" AND crs_usr.Role='%u') AS list_usrs,usr_data"
|
||||||
"usr_data.Surname2,"
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
"usr_data.FirstName,"
|
" ORDER BY "
|
||||||
"usr_data.UsrCod",
|
"usr_data.Surname1,"
|
||||||
UsrQuery,
|
"usr_data.Surname2,"
|
||||||
(unsigned) Role);
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
|
"("
|
||||||
|
// Users whose privacy is
|
||||||
|
// Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility IN ('%s','%s')"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me
|
||||||
|
// and whose privacy is Pri_VISIBILITY_COURSE
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod FROM crs_usr WHERE UsrCod='%ld') AS my_crs,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me with another role
|
||||||
|
// and whose privacy is Pri_VISIBILITY_USER
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld') AS my_crs_role,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs_role.CrsCod"
|
||||||
|
" AND crs_usr.Role<>my_crs_role.Role"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
") "
|
||||||
|
"AS list_usrs,usr_data"
|
||||||
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM],
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_WORLD ],
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_COURSE],
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_USER ]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CTY:
|
case Sco_SCOPE_CTY:
|
||||||
/* Search users in courses from the current country */
|
/* Search users in courses from the current country */
|
||||||
// 2 columns are retrieved: UsrCod, Sex
|
// 2 columns are retrieved: UsrCod, Sex
|
||||||
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
switch (Gbl.Usrs.Me.LoggedRole)
|
||||||
"(SELECT DISTINCT candidate_users.UsrCod"
|
{
|
||||||
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees,centres,institutions"
|
case Rol_SYS_ADM:
|
||||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
" AND crs_usr.Role='%u'"
|
"(SELECT DISTINCT candidate_users.UsrCod"
|
||||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees,centres,institutions"
|
||||||
" AND courses.DegCod=degrees.DegCod"
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
" AND degrees.CtrCod=centres.CtrCod"
|
" AND crs_usr.Role='%u'"
|
||||||
" AND centres.InsCod=institutions.InsCod"
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
" AND institutions.CtyCod='%ld') AS list_usrs,usr_data"
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
" ORDER BY "
|
" AND centres.InsCod=institutions.InsCod"
|
||||||
"usr_data.Surname1,"
|
" AND institutions.CtyCod='%ld') AS list_usrs,usr_data"
|
||||||
"usr_data.Surname2,"
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
"usr_data.FirstName,"
|
" ORDER BY "
|
||||||
"usr_data.UsrCod",
|
"usr_data.Surname1,"
|
||||||
UsrQuery,
|
"usr_data.Surname2,"
|
||||||
(unsigned) Role,
|
"usr_data.FirstName,"
|
||||||
Gbl.CurrentCty.Cty.CtyCod);
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Gbl.CurrentCty.Cty.CtyCod);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
|
"("
|
||||||
|
// Users whose privacy is
|
||||||
|
// Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres,institutions"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility IN ('%s','%s')"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod=institutions.InsCod"
|
||||||
|
" AND institutions.CtyCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me
|
||||||
|
// and whose privacy is Pri_VISIBILITY_COURSE
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod FROM crs_usr WHERE UsrCod='%ld') AS my_crs,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres,institutions"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod=institutions.InsCod"
|
||||||
|
" AND institutions.CtyCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me with another role
|
||||||
|
// and whose privacy is Pri_VISIBILITY_USER
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld') AS my_crs_role,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres,institutions"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs_role.CrsCod"
|
||||||
|
" AND crs_usr.Role<>my_crs_role.Role"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod=institutions.InsCod"
|
||||||
|
" AND institutions.CtyCod='%ld'"
|
||||||
|
") "
|
||||||
|
"AS list_usrs,usr_data"
|
||||||
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM],
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_WORLD ],
|
||||||
|
Gbl.CurrentCty.Cty.CtyCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_COURSE],
|
||||||
|
Gbl.CurrentCty.Cty.CtyCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_USER ],
|
||||||
|
Gbl.CurrentCty.Cty.CtyCod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_INS:
|
case Sco_SCOPE_INS:
|
||||||
/* Search users in courses from the current institution */
|
/* Search users in courses from the current institution */
|
||||||
// 2 columns are retrieved: UsrCod, Sex
|
// 2 columns are retrieved: UsrCod, Sex
|
||||||
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
switch (Gbl.Usrs.Me.LoggedRole)
|
||||||
"(SELECT DISTINCT candidate_users.UsrCod"
|
{
|
||||||
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees,centres"
|
case Rol_INS_ADM:
|
||||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
case Rol_SYS_ADM:
|
||||||
" AND crs_usr.Role='%u'"
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
"(SELECT DISTINCT candidate_users.UsrCod"
|
||||||
" AND courses.DegCod=degrees.DegCod"
|
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees,centres"
|
||||||
" AND degrees.CtrCod=centres.CtrCod"
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
" AND centres.InsCod='%ld') AS list_usrs,usr_data"
|
" AND crs_usr.Role='%u'"
|
||||||
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
" ORDER BY "
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
"usr_data.Surname1,"
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
"usr_data.Surname2,"
|
" AND centres.InsCod='%ld') AS list_usrs,usr_data"
|
||||||
"usr_data.FirstName,"
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
"usr_data.UsrCod",
|
" ORDER BY "
|
||||||
UsrQuery,
|
"usr_data.Surname1,"
|
||||||
(unsigned) Role,
|
"usr_data.Surname2,"
|
||||||
Gbl.CurrentIns.Ins.InsCod);
|
"usr_data.FirstName,"
|
||||||
break;
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Gbl.CurrentIns.Ins.InsCod);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
|
"("
|
||||||
|
// Users whose privacy is
|
||||||
|
// Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility IN ('%s','%s')"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me
|
||||||
|
// and whose privacy is Pri_VISIBILITY_COURSE
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod FROM crs_usr WHERE UsrCod='%ld') AS my_crs,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me with another role
|
||||||
|
// and whose privacy is Pri_VISIBILITY_USER
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld') AS my_crs_role,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees,centres"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs_role.CrsCod"
|
||||||
|
" AND crs_usr.Role<>my_crs_role.Role"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod=centres.CtrCod"
|
||||||
|
" AND centres.InsCod='%ld'"
|
||||||
|
") "
|
||||||
|
"AS list_usrs,usr_data"
|
||||||
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM],
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_WORLD ],
|
||||||
|
Gbl.CurrentIns.Ins.InsCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_COURSE],
|
||||||
|
Gbl.CurrentIns.Ins.InsCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_USER ],
|
||||||
|
Gbl.CurrentIns.Ins.InsCod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Sco_SCOPE_CTR:
|
case Sco_SCOPE_CTR:
|
||||||
/* Search users in courses from the current centre */
|
/* Search users in courses from the current centre */
|
||||||
// 2 columns are retrieved: UsrCod, Sex
|
// 2 columns are retrieved: UsrCod, Sex
|
||||||
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
switch (Gbl.Usrs.Me.LoggedRole)
|
||||||
"(SELECT DISTINCT candidate_users.UsrCod"
|
{
|
||||||
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees"
|
case Rol_CTR_ADM:
|
||||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
case Rol_INS_ADM:
|
||||||
" AND crs_usr.Role='%u'"
|
case Rol_SYS_ADM:
|
||||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
" AND courses.DegCod=degrees.DegCod"
|
"(SELECT DISTINCT candidate_users.UsrCod"
|
||||||
" AND degrees.CtrCod='%ld') AS list_usrs,usr_data"
|
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses,degrees"
|
||||||
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
" ORDER BY "
|
" AND crs_usr.Role='%u'"
|
||||||
"usr_data.Surname1,"
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
"usr_data.Surname2,"
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
"usr_data.FirstName,"
|
" AND degrees.CtrCod='%ld') AS list_usrs,usr_data"
|
||||||
"usr_data.UsrCod",
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
UsrQuery,
|
" ORDER BY "
|
||||||
(unsigned) Role,
|
"usr_data.Surname1,"
|
||||||
Gbl.CurrentCtr.Ctr.CtrCod);
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
|
"("
|
||||||
|
// Users whose privacy is
|
||||||
|
// Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility IN ('%s','%s')"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me
|
||||||
|
// and whose privacy is Pri_VISIBILITY_COURSE
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod FROM crs_usr WHERE UsrCod='%ld') AS my_crs,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me with another role
|
||||||
|
// and whose privacy is Pri_VISIBILITY_USER
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld') AS my_crs_role,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses,degrees"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs_role.CrsCod"
|
||||||
|
" AND crs_usr.Role<>my_crs_role.Role"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod=degrees.DegCod"
|
||||||
|
" AND degrees.CtrCod='%ld'"
|
||||||
|
") "
|
||||||
|
"AS list_usrs,usr_data"
|
||||||
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM],
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_WORLD ],
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_COURSE],
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_USER ],
|
||||||
|
Gbl.CurrentCtr.Ctr.CtrCod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_DEG:
|
case Sco_SCOPE_DEG:
|
||||||
/* Search users in courses from the current degree */
|
/* Search users in courses from the current degree */
|
||||||
// 2 columns are retrieved: UsrCod, Sex
|
// 2 columns are retrieved: UsrCod, Sex
|
||||||
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
switch (Gbl.Usrs.Me.LoggedRole)
|
||||||
"(SELECT DISTINCT candidate_users.UsrCod"
|
{
|
||||||
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses"
|
case Rol_DEG_ADM:
|
||||||
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
case Rol_CTR_ADM:
|
||||||
" AND crs_usr.Role='%u'"
|
case Rol_INS_ADM:
|
||||||
" AND crs_usr.CrsCod=courses.CrsCod"
|
case Rol_SYS_ADM:
|
||||||
" AND courses.DegCod='%ld') AS list_usrs,usr_data"
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
"(SELECT DISTINCT candidate_users.UsrCod"
|
||||||
" ORDER BY "
|
" FROM (SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,crs_usr,courses"
|
||||||
"usr_data.Surname1,"
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
"usr_data.Surname2,"
|
" AND crs_usr.Role='%u'"
|
||||||
"usr_data.FirstName,"
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
"usr_data.UsrCod",
|
" AND courses.DegCod='%ld') "
|
||||||
UsrQuery,
|
"AS list_usrs,usr_data"
|
||||||
(unsigned) Role,
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
Gbl.CurrentDeg.Deg.DegCod);
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sprintf (Query,"SELECT list_usrs.UsrCod,usr_data.Sex FROM "
|
||||||
|
"("
|
||||||
|
// Users whose privacy is
|
||||||
|
// Pri_VISIBILITY_SYSTEM or Pri_VISIBILITY_WORLD
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility IN ('%s','%s')"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me
|
||||||
|
// and whose privacy is Pri_VISIBILITY_COURSE
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod FROM crs_usr WHERE UsrCod='%ld') AS my_crs,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs.CrsCod"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod='%ld'"
|
||||||
|
" UNION "
|
||||||
|
// Users who share any course with me with another role
|
||||||
|
// and whose privacy is Pri_VISIBILITY_USER
|
||||||
|
"SELECT DISTINCT crs_usr.UsrCod FROM "
|
||||||
|
"(SELECT UsrCod FROM usr_data WHERE %s) AS candidate_users,"
|
||||||
|
"(SELECT CrsCod,Role FROM crs_usr WHERE UsrCod='%ld') AS my_crs_role,"
|
||||||
|
"crs_usr,"
|
||||||
|
"usr_data,"
|
||||||
|
"courses"
|
||||||
|
" WHERE candidate_users.UsrCod=crs_usr.UsrCod"
|
||||||
|
" AND crs_usr.Role='%u'"
|
||||||
|
" AND crs_usr.CrsCod=my_crs_role.CrsCod"
|
||||||
|
" AND crs_usr.Role<>my_crs_role.Role"
|
||||||
|
" AND crs_usr.UsrCod=usr_data.UsrCod"
|
||||||
|
" AND usr_data.ProfileVisibility='%s'"
|
||||||
|
" AND crs_usr.CrsCod=courses.CrsCod"
|
||||||
|
" AND courses.DegCod='%ld'"
|
||||||
|
") "
|
||||||
|
"AS list_usrs,usr_data"
|
||||||
|
" WHERE list_usrs.UsrCod=usr_data.UsrCod "
|
||||||
|
" ORDER BY "
|
||||||
|
"usr_data.Surname1,"
|
||||||
|
"usr_data.Surname2,"
|
||||||
|
"usr_data.FirstName,"
|
||||||
|
"usr_data.UsrCod",
|
||||||
|
UsrQuery,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_SYSTEM],
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_WORLD ],
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_COURSE],
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod,
|
||||||
|
UsrQuery,
|
||||||
|
Gbl.Usrs.Me.UsrDat.UsrCod,
|
||||||
|
(unsigned) Role,
|
||||||
|
Pri_VisibilityDB[Pri_VISIBILITY_USER ],
|
||||||
|
Gbl.CurrentDeg.Deg.DegCod);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Sco_SCOPE_CRS:
|
case Sco_SCOPE_CRS:
|
||||||
/* Search users in courses from the current course */
|
/* Search users in courses from the current course */
|
||||||
|
@ -3939,10 +4343,10 @@ void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery)
|
||||||
Lay_ShowErrorAndExit ("Wrong scope.");
|
Lay_ShowErrorAndExit ("Wrong scope.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SYS_ADM)
|
// if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SYS_ADM)
|
||||||
Lay_ShowAlert (Lay_INFO,Query);
|
Lay_ShowAlert (Lay_INFO,Query);
|
||||||
*/
|
|
||||||
/***** Get list of users from database given a query *****/
|
/***** Get list of users from database given a query *****/
|
||||||
Usr_GetListUsrsFromQuery (Query,Role,Gbl.Scope.Current);
|
Usr_GetListUsrsFromQuery (Query,Role,Gbl.Scope.Current);
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,7 +304,6 @@ unsigned Usr_GetNumUsrsWhoClaimToBelongToCtr (long CtrCod);
|
||||||
unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod);
|
unsigned Usr_GetNumberOfTeachersInCentre (long CtrCod);
|
||||||
|
|
||||||
void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope);
|
void Usr_GetListUsrs (Rol_Role_t Role,Sco_Scope_t Scope);
|
||||||
void Usr_SearchListUsrs (Rol_Role_t Role,const char *UsrQuery);
|
|
||||||
|
|
||||||
void Usr_GetUnorderedStdsCodesInDeg (long DegCod);
|
void Usr_GetUnorderedStdsCodesInDeg (long DegCod);
|
||||||
void Usr_FreeUsrsList (Rol_Role_t Role);
|
void Usr_FreeUsrsList (Rol_Role_t Role);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user