Version 15.225.6

This commit is contained in:
Antonio Cañas Vargas 2016-06-15 14:42:28 +02:00
parent db079c2b9f
commit ea2aa6df16
5 changed files with 206 additions and 19 deletions

View File

@ -128,13 +128,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 15.225.5 (2016-06-15)"
#define Log_PLATFORM_VERSION "SWAD 15.225.6 (2016-06-15)"
#define CSS_FILE "swad15.224.3.css"
#define JS_FILE "swad15.216.js"
// 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
/*
Version 15.225.6: Jun 15, 2016 Listing possible duplicate users. (202761 lines)
Version 15.225.5: Jun 15, 2016 Simplification in texts (links) to view guests and admins. (202586 lines)
Version 15.225.4: Jun 15, 2016 Listing possible duplicate users. Not finished. (202623 lines)
1 change necessary in database:

View File

@ -2836,6 +2836,7 @@ static void Enr_ShowEnrollmentRequestsGivenRoles (unsigned RolesSelected)
/***** User name *****/
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP\">");
Usr_RestrictLengthAndWriteName (&UsrDat,20);
fprintf (Gbl.F.Out,"</td>");
/***** Requested role (row[3]) *****/
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP\">"

View File

@ -4047,7 +4047,7 @@ static void Tst_WriteFloatAnsAssessExam (unsigned NumQst,MYSQL_RES *mysql_res,
static void Tst_WriteHeadUserCorrect (void)
{
extern const char *Txt_User;
extern const char *Txt_User[Usr_NUM_SEXS];
extern const char *Txt_TST_Correct_ANSWER;
fprintf (Gbl.F.Out,"<td class=\"DAT_SMALL CENTER_MIDDLE\">"
@ -4056,7 +4056,7 @@ static void Tst_WriteHeadUserCorrect (void)
"<td class=\"DAT_SMALL CENTER_MIDDLE\">"
"&nbsp;%s&nbsp;"
"</td>",
Txt_User,Txt_TST_Correct_ANSWER);
Txt_User[Usr_SEX_UNKNOWN],Txt_TST_Correct_ANSWER);
}
/*****************************************************************************/
@ -7006,7 +7006,7 @@ void Tst_ShowUsrsExams (void)
static void Tst_ShowHeaderTestResults (void)
{
extern const char *Txt_User;
extern const char *Txt_User[Usr_NUM_SEXS];
extern const char *Txt_Date;
extern const char *Txt_Questions;
extern const char *Txt_Non_blank_BR_questions;
@ -7039,7 +7039,7 @@ static void Tst_ShowHeaderTestResults (void)
"</th>"
"<th></th>"
"</tr>",
Txt_User,
Txt_User[Usr_SEX_UNKNOWN],
Txt_Date,
Txt_Questions,
Txt_Non_blank_BR_questions,

View File

@ -15299,6 +15299,27 @@ const char *Txt_INFO_SRC_SHORT_TEXT[Inf_NUM_INFO_SOURCES] =
#endif
};
const char *Txt_Informants =
#if L==1
"Informadors";
#elif L==2
"Informanten";
#elif L==3
"Informants";
#elif L==4
"Informantes";
#elif L==5
"Informateurs";
#elif L==6
"Informantes"; // Okoteve traducción
#elif L==7
"Informatori";
#elif L==8
"informator&oacute;w";
#elif L==9
"Informantes";
#endif
const char *Txt_Inline_math =
#if L==1
"F&oacute;rmula";
@ -49018,26 +49039,88 @@ const char *Txt_Use_this_nickname =
"Utilizar esta alcunha";
#endif
const char *Txt_User =
const char *Txt_User[Usr_NUM_SEXS] =
{ // Usr_SEX_UNKNOWN
#if L==1
"Usuari";
"Usuari/a"
#elif L==2
"Benutzer";
"Benutzer"
#elif L==3
"User";
"User"
#elif L==4
"Usuario";
"Usuario/a"
#elif L==5
"Utilisateur";
"Utilisateur/se"
#elif L==6
"Puruh&aacute;ra";
"Puruh&atilde;ra"
#elif L==7
"Utente";
"Utente"
#elif L==8
"User"; // Potrzebujesz tlumaczenie
"U&zdot;ytkownika"
#elif L==9
"Utilizador";
"Utilizador/a"
#endif
, // Usr_SEX_FEMALE
#if L==1
"Usuaria"
#elif L==2
"Benutzer"
#elif L==3
"User"
#elif L==4
"Usuaria"
#elif L==5
"Utilisateuse"
#elif L==6
"Puruh&atilde;ra"
#elif L==7
"Utente"
#elif L==8
"U&zdot;ytkownika"
#elif L==9
"Utilizadora"
#endif
, // Usr_SEX_MALE
#if L==1
"Usuari"
#elif L==2
"Benutzer"
#elif L==3
"User"
#elif L==4
"Usuario"
#elif L==5
"Utilisateur"
#elif L==6
"Puruh&atilde;ra"
#elif L==7
"Utente"
#elif L==8
"U&zdot;ytkownika"
#elif L==9
"Utilizador"
#endif
, // Usr_SEX_ALL
#if L==1
"Usuari/a"
#elif L==2
"Benutzer"
#elif L==3
"User"
#elif L==4
"Usuario/a"
#elif L==5
"Utilisateur/se"
#elif L==6
"Puruh&atilde;ra"
#elif L==7
"Utente"
#elif L==8
"U&zdot;ytkownika"
#elif L==9
"Utilizador/a"
#endif
};
const char *Txt_user[Usr_NUM_SEXS] =
{ // Usr_SEX_UNKNOWN

View File

@ -1486,7 +1486,7 @@ void Usr_PutLinkToLogin (void)
void Usr_WriteFormLogin (void)
{
extern const char *Txt_Log_in;
extern const char *Txt_User;
extern const char *Txt_User[Usr_NUM_SEXS];
extern const char *Txt_nick_email_or_ID;
extern const char *Txt_Password;
extern const char *Txt_password;
@ -1530,8 +1530,8 @@ void Usr_WriteFormLogin (void)
"</td>"
"</tr>",
Gbl.Prefs.IconsURL,
Txt_User,
Txt_User,
Txt_User[Usr_SEX_UNKNOWN],
Txt_User[Usr_SEX_UNKNOWN],
Usr_MAX_LENGTH_USR_LOGIN,
Txt_nick_email_or_ID,
Gbl.Usrs.Me.UsrIdLogin,
@ -7903,11 +7903,113 @@ void Usr_PutLinkToListDupUsrs (void)
void Usr_ListDuplicateUsrs (void)
{
extern const char *Txt_Possibly_duplicate_users;
extern const char *Txt_User[Usr_NUM_SEXS];
extern const char *Txt_Informants;
extern const char *Txt_Date;
extern const char *Txt_No_users_found[Rol_NUM_ROLES];
char Query[1024];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumUsrs;
unsigned NumUsr;
struct UsrData UsrDat;
unsigned NumInformers;
bool ShowPhoto = false;
char PhotoURL[PATH_MAX+1];
/***** Start frame with list of possible duplicate users *****/
Lay_StartRoundFrame (NULL,Txt_Possibly_duplicate_users,NULL);
Lay_ShowAlert (Lay_INFO,"Option under development."); // TODO: Write listing of users
/***** Build query *****/
sprintf (Query,"SELECT UsrCod,COUNT(*) AS N,MIN(UNIX_TIMESTAMP(InformTime)) AS T"
" FROM usr_duplicated"
" GROUP BY UsrCod"
" ORDER BY N DESC,T DESC");
NumUsrs = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get requests for enrollment");
/***** List possible duplicated users *****/
if (NumUsrs)
{
/* Initialize structure with user's data */
Usr_UsrDataConstructor (&UsrDat);
/* Start table */
fprintf (Gbl.F.Out,"<table class=\"CELLS_PAD_2\""
" style=\"margin:0 auto;\">"
"<th></th>"
"<th colspan=\"2\" class=\"LEFT_TOP\">"
"%s"
"</th>"
"<th class=\"RIGHT_TOP\">"
"%s"
"</th>"
"<th class=\"CENTER_TOP\">"
"%s"
"</th>"
"</tr>",
Txt_User[Usr_SEX_UNKNOWN],
Txt_Informants,
Txt_Date);
/* List users */
for (NumUsr = 0;
NumUsr < NumUsrs;
NumUsr++)
{
row = mysql_fetch_row (mysql_res);
/* Get user code (row[0]) */
UsrDat.UsrCod = Str_ConvertStrCodToLongCod (row[0]);
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat))
{
/***** Number *****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT RIGHT_TOP\">"
"%u"
"</td>",
NumUsrs - NumUsr);
/***** User photo *****/
fprintf (Gbl.F.Out,"<td class=\"DAT CENTER_TOP\""
" style=\"width:22px;\">");
ShowPhoto = Pho_ShowUsrPhotoIsAllowed (&UsrDat,PhotoURL);
Pho_ShowUsrPhoto (&UsrDat,ShowPhoto ? PhotoURL :
NULL,
"PHOTO21x28",Pho_ZOOM,false);
fprintf (Gbl.F.Out,"</td>");
/***** User name *****/
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_TOP\">");
Usr_RestrictLengthAndWriteName (&UsrDat,20);
fprintf (Gbl.F.Out,"</td>");
/***** Number of informers (row[1]) *****/
if (sscanf (row[1],"%u",&NumInformers) != 1)
Lay_ShowErrorAndExit ("Wrong number of informers.");
fprintf (Gbl.F.Out,"<td class=\"DAT RIGHT_TOP\">"
"%u"
"</td>",
NumInformers);
/***** Inform time (row[2]) *****/
Msg_WriteMsgDate (Dat_GetUNIXTimeFromStr (row[2]),"DAT");
fprintf (Gbl.F.Out,"</tr>");
}
else // User does not exists or user already belongs to course ==> remove user from table of possible duplicate users
{
// TODO: Remove user from table of possible duplicate users
}
}
/* End table */
fprintf (Gbl.F.Out,"</table>");
/* Free memory used for user's data */
Usr_UsrDataDestructor (&UsrDat);
}
else // There are no users
Lay_ShowAlert (Lay_INFO,Txt_No_users_found[Rol_UNKNOWN]);
/***** End frame *****/
Lay_EndRoundFrame ();