diff --git a/swad_action.c b/swad_action.c
index 2cfc34b7a..5b3332aa6 100644
--- a/swad_action.c
+++ b/swad_action.c
@@ -984,9 +984,12 @@ Users:
821. ActUpdOthPho Update other user's photo
822. ActUpdStdPho Update other user's photo
823. ActUpdTchPho Update other user's photo
+ NEW. ActRemOthPho Request the removal of other user's photo
+ NEW. ActRemStdPho Request the removal of student's photo
+ NEW. ActRemTchPho Request the removal of teacher's photo
824. ActRemOthPho Remove other user's photo
- 825. ActRemStdPho Remove other user's photo
- 826. ActRemTchPho Remove other user's photo
+ 825. ActRemStdPho Remove student's photo
+ 826. ActRemTchPho Remove teacher's photo
827. ActCreOth Create a new user
828. ActCreStd Create a new user
829. ActCreTch Create a new user
@@ -1338,6 +1341,7 @@ Profile:
1150. ActReqMyPho Show form to send my photo
1151. ActDetMyPho Receive my photo and detect faces on it
1152. ActUpdMyPho Update my photo
+ NEW. ActReqRemMyPho Request the removal of my photo
1153. ActRemMyPho Remove my photo
1154. ActEdiPri Edit my privacy
@@ -2366,6 +2370,9 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActUpdStdPho */{1439,-1,TabUsr,ActLstStd ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL},
/* ActUpdTchPho */{1440,-1,TabUsr,ActLstTch ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pho_UpdateUsrPhoto1 ,Pho_UpdateUsrPhoto2 ,NULL},
+ /* ActRemOthPho */{1574,-1,TabUsr,ActLstOth ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqRemoveUsrPhoto ,NULL},
+ /* ActRemStdPho */{1575,-1,TabUsr,ActLstStd ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqRemoveUsrPhoto ,NULL},
+ /* ActRemTchPho */{1576,-1,TabUsr,ActLstTch ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqRemoveUsrPhoto ,NULL},
/* ActRemOthPho */{1441,-1,TabUsr,ActLstOth ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_RemoveUsrPhoto ,NULL},
/* ActRemStdPho */{1442,-1,TabUsr,ActLstStd ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_RemoveUsrPhoto ,NULL},
/* ActRemTchPho */{1443,-1,TabUsr,ActLstTch ,0x1F0,0x1E0,0x1E0,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_RemoveUsrPhoto ,NULL},
@@ -2759,9 +2766,10 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActChgMyData */{ 298,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Rec_UpdateMyRecord ,Rec_ShowMyCommonRecordUpd ,NULL},
- /* ActReqMyPho */{ 30,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqMyPhotoWithContextualLinks ,NULL},
+ /* ActReqMyPho */{ 30,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqMyPhotoWithContextLinks ,NULL},
/* ActDetMyPho */{ 693,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Pho_RecMyPhotoDetFaces ,NULL},
/* ActUpdMyPho */{ 694,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pho_UpdateMyPhoto1 ,Pho_UpdateMyPhoto2 ,NULL},
+ /* ActReqRemMyPho */{1577,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pho_ReqRemoveMyPhoto ,NULL},
/* ActRemMyPho */{ 428,-1,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Pho_RemoveMyPhoto1 ,Pho_RemoveMyPhoto2 ,NULL},
/* ActEdiPri */{1403,-1,TabPrf,ActEdiPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Pri_EditMyPrivacy ,NULL},
@@ -4400,6 +4408,10 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActSeeDatExaAnn, // #1571
ActSeeOneExaAnn, // #1572
ActChgCrsYeaCfg, // #1573
+ ActReqRemOthPho, // #1574
+ ActReqRemStdPho, // #1575
+ ActReqRemTchPho, // #1576
+ ActReqRemMyPho, // #1577
};
/*****************************************************************************/
diff --git a/swad_action.h b/swad_action.h
index 31a1d4322..bc2e75b58 100644
--- a/swad_action.h
+++ b/swad_action.h
@@ -72,9 +72,9 @@ typedef enum
typedef int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
-#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+150+172+36+28+83)
+#define Act_NUM_ACTIONS (1+9+51+15+90+70+67+246+186+153+172+36+28+84)
-#define Act_MAX_ACTION_COD 1573
+#define Act_MAX_ACTION_COD 1577
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20
@@ -1022,76 +1022,79 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
#define ActUpdOthPho (ActChgNumRowFooGrp+ 87)
#define ActUpdStdPho (ActChgNumRowFooGrp+ 88)
#define ActUpdTchPho (ActChgNumRowFooGrp+ 89)
-#define ActRemOthPho (ActChgNumRowFooGrp+ 90)
-#define ActRemStdPho (ActChgNumRowFooGrp+ 91)
-#define ActRemTchPho (ActChgNumRowFooGrp+ 92)
-#define ActCreOth (ActChgNumRowFooGrp+ 93)
-#define ActCreStd (ActChgNumRowFooGrp+ 94)
-#define ActCreTch (ActChgNumRowFooGrp+ 95)
-#define ActUpdOth (ActChgNumRowFooGrp+ 96)
-#define ActUpdStd (ActChgNumRowFooGrp+ 97)
-#define ActUpdTch (ActChgNumRowFooGrp+ 98)
+#define ActReqRemOthPho (ActChgNumRowFooGrp+ 90)
+#define ActReqRemStdPho (ActChgNumRowFooGrp+ 91)
+#define ActReqRemTchPho (ActChgNumRowFooGrp+ 92)
+#define ActRemOthPho (ActChgNumRowFooGrp+ 93)
+#define ActRemStdPho (ActChgNumRowFooGrp+ 94)
+#define ActRemTchPho (ActChgNumRowFooGrp+ 95)
+#define ActCreOth (ActChgNumRowFooGrp+ 96)
+#define ActCreStd (ActChgNumRowFooGrp+ 97)
+#define ActCreTch (ActChgNumRowFooGrp+ 98)
+#define ActUpdOth (ActChgNumRowFooGrp+ 99)
+#define ActUpdStd (ActChgNumRowFooGrp+100)
+#define ActUpdTch (ActChgNumRowFooGrp+101)
-#define ActReqAccEnrStd (ActChgNumRowFooGrp+ 99)
-#define ActReqAccEnrTch (ActChgNumRowFooGrp+100)
-#define ActAccEnrStd (ActChgNumRowFooGrp+101)
-#define ActAccEnrTch (ActChgNumRowFooGrp+102)
-#define ActRemMe_Std (ActChgNumRowFooGrp+103)
-#define ActRemMe_Tch (ActChgNumRowFooGrp+104)
+#define ActReqAccEnrStd (ActChgNumRowFooGrp+102)
+#define ActReqAccEnrTch (ActChgNumRowFooGrp+103)
+#define ActAccEnrStd (ActChgNumRowFooGrp+104)
+#define ActAccEnrTch (ActChgNumRowFooGrp+105)
+#define ActRemMe_Std (ActChgNumRowFooGrp+106)
+#define ActRemMe_Tch (ActChgNumRowFooGrp+107)
-#define ActNewAdmIns (ActChgNumRowFooGrp+105)
-#define ActRemAdmIns (ActChgNumRowFooGrp+106)
-#define ActNewAdmCtr (ActChgNumRowFooGrp+107)
-#define ActRemAdmCtr (ActChgNumRowFooGrp+108)
-#define ActNewAdmDeg (ActChgNumRowFooGrp+109)
-#define ActRemAdmDeg (ActChgNumRowFooGrp+110)
+#define ActNewAdmIns (ActChgNumRowFooGrp+108)
+#define ActRemAdmIns (ActChgNumRowFooGrp+109)
+#define ActNewAdmCtr (ActChgNumRowFooGrp+110)
+#define ActRemAdmCtr (ActChgNumRowFooGrp+111)
+#define ActNewAdmDeg (ActChgNumRowFooGrp+112)
+#define ActRemAdmDeg (ActChgNumRowFooGrp+113)
-#define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp+111)
-#define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp+112)
+#define ActRcvFrmEnrSevStd (ActChgNumRowFooGrp+114)
+#define ActRcvFrmEnrSevTch (ActChgNumRowFooGrp+115)
-#define ActReqCnfID_Oth (ActChgNumRowFooGrp+113)
-#define ActReqCnfID_Std (ActChgNumRowFooGrp+114)
-#define ActReqCnfID_Tch (ActChgNumRowFooGrp+115)
-#define ActCnfID_Oth (ActChgNumRowFooGrp+116)
-#define ActCnfID_Std (ActChgNumRowFooGrp+117)
-#define ActCnfID_Tch (ActChgNumRowFooGrp+118)
+#define ActReqCnfID_Oth (ActChgNumRowFooGrp+116)
+#define ActReqCnfID_Std (ActChgNumRowFooGrp+117)
+#define ActReqCnfID_Tch (ActChgNumRowFooGrp+118)
+#define ActCnfID_Oth (ActChgNumRowFooGrp+119)
+#define ActCnfID_Std (ActChgNumRowFooGrp+120)
+#define ActCnfID_Tch (ActChgNumRowFooGrp+121)
-#define ActFrmIDsOth (ActChgNumRowFooGrp+119)
-#define ActFrmIDsStd (ActChgNumRowFooGrp+120)
-#define ActFrmIDsTch (ActChgNumRowFooGrp+121)
-#define ActRemID_Oth (ActChgNumRowFooGrp+122)
-#define ActRemID_Std (ActChgNumRowFooGrp+123)
-#define ActRemID_Tch (ActChgNumRowFooGrp+124)
-#define ActNewID_Oth (ActChgNumRowFooGrp+125)
-#define ActNewID_Std (ActChgNumRowFooGrp+126)
-#define ActNewID_Tch (ActChgNumRowFooGrp+127)
-#define ActFrmPwdOth (ActChgNumRowFooGrp+128)
-#define ActFrmPwdStd (ActChgNumRowFooGrp+129)
-#define ActFrmPwdTch (ActChgNumRowFooGrp+130)
-#define ActChgPwdOth (ActChgNumRowFooGrp+131)
-#define ActChgPwdStd (ActChgNumRowFooGrp+132)
-#define ActChgPwdTch (ActChgNumRowFooGrp+133)
-#define ActFrmMaiOth (ActChgNumRowFooGrp+134)
-#define ActFrmMaiStd (ActChgNumRowFooGrp+135)
-#define ActFrmMaiTch (ActChgNumRowFooGrp+136)
-#define ActRemMaiOth (ActChgNumRowFooGrp+137)
-#define ActRemMaiStd (ActChgNumRowFooGrp+138)
-#define ActRemMaiTch (ActChgNumRowFooGrp+139)
-#define ActNewMaiOth (ActChgNumRowFooGrp+140)
-#define ActNewMaiStd (ActChgNumRowFooGrp+141)
-#define ActNewMaiTch (ActChgNumRowFooGrp+142)
+#define ActFrmIDsOth (ActChgNumRowFooGrp+122)
+#define ActFrmIDsStd (ActChgNumRowFooGrp+123)
+#define ActFrmIDsTch (ActChgNumRowFooGrp+124)
+#define ActRemID_Oth (ActChgNumRowFooGrp+125)
+#define ActRemID_Std (ActChgNumRowFooGrp+126)
+#define ActRemID_Tch (ActChgNumRowFooGrp+127)
+#define ActNewID_Oth (ActChgNumRowFooGrp+128)
+#define ActNewID_Std (ActChgNumRowFooGrp+129)
+#define ActNewID_Tch (ActChgNumRowFooGrp+130)
+#define ActFrmPwdOth (ActChgNumRowFooGrp+131)
+#define ActFrmPwdStd (ActChgNumRowFooGrp+132)
+#define ActFrmPwdTch (ActChgNumRowFooGrp+133)
+#define ActChgPwdOth (ActChgNumRowFooGrp+134)
+#define ActChgPwdStd (ActChgNumRowFooGrp+135)
+#define ActChgPwdTch (ActChgNumRowFooGrp+136)
+#define ActFrmMaiOth (ActChgNumRowFooGrp+137)
+#define ActFrmMaiStd (ActChgNumRowFooGrp+138)
+#define ActFrmMaiTch (ActChgNumRowFooGrp+139)
+#define ActRemMaiOth (ActChgNumRowFooGrp+140)
+#define ActRemMaiStd (ActChgNumRowFooGrp+141)
+#define ActRemMaiTch (ActChgNumRowFooGrp+142)
+#define ActNewMaiOth (ActChgNumRowFooGrp+143)
+#define ActNewMaiStd (ActChgNumRowFooGrp+144)
+#define ActNewMaiTch (ActChgNumRowFooGrp+145)
-#define ActRemStdCrs (ActChgNumRowFooGrp+143)
-#define ActRemTchCrs (ActChgNumRowFooGrp+144)
-#define ActRemUsrGbl (ActChgNumRowFooGrp+145)
+#define ActRemStdCrs (ActChgNumRowFooGrp+146)
+#define ActRemTchCrs (ActChgNumRowFooGrp+147)
+#define ActRemUsrGbl (ActChgNumRowFooGrp+148)
-#define ActReqRemAllStdCrs (ActChgNumRowFooGrp+146)
-#define ActRemAllStdCrs (ActChgNumRowFooGrp+147)
+#define ActReqRemAllStdCrs (ActChgNumRowFooGrp+149)
+#define ActRemAllStdCrs (ActChgNumRowFooGrp+150)
-#define ActReqRemOldUsr (ActChgNumRowFooGrp+148)
-#define ActRemOldUsr (ActChgNumRowFooGrp+149)
+#define ActReqRemOldUsr (ActChgNumRowFooGrp+151)
+#define ActRemOldUsr (ActChgNumRowFooGrp+152)
-#define ActLstClk (ActChgNumRowFooGrp+150)
+#define ActLstClk (ActChgNumRowFooGrp+153)
/*****************************************************************************/
/******************************** Social tab *********************************/
@@ -1394,64 +1397,65 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
#define ActReqMyPho (ActSeeAllStaCrs+31)
#define ActDetMyPho (ActSeeAllStaCrs+32)
#define ActUpdMyPho (ActSeeAllStaCrs+33)
-#define ActRemMyPho (ActSeeAllStaCrs+34)
+#define ActReqRemMyPho (ActSeeAllStaCrs+34)
+#define ActRemMyPho (ActSeeAllStaCrs+35)
-#define ActEdiPri (ActSeeAllStaCrs+35)
-#define ActChgPriPho (ActSeeAllStaCrs+36)
-#define ActChgPriPrf (ActSeeAllStaCrs+37)
+#define ActEdiPri (ActSeeAllStaCrs+36)
+#define ActChgPriPho (ActSeeAllStaCrs+37)
+#define ActChgPriPrf (ActSeeAllStaCrs+38)
-#define ActReqEdiMyIns (ActSeeAllStaCrs+38)
-#define ActChgCtyMyIns (ActSeeAllStaCrs+39)
-#define ActChgMyIns (ActSeeAllStaCrs+40)
-#define ActChgMyCtr (ActSeeAllStaCrs+41)
-#define ActChgMyDpt (ActSeeAllStaCrs+42)
-#define ActChgMyOff (ActSeeAllStaCrs+43)
-#define ActChgMyOffPho (ActSeeAllStaCrs+44)
+#define ActReqEdiMyIns (ActSeeAllStaCrs+39)
+#define ActChgCtyMyIns (ActSeeAllStaCrs+40)
+#define ActChgMyIns (ActSeeAllStaCrs+41)
+#define ActChgMyCtr (ActSeeAllStaCrs+42)
+#define ActChgMyDpt (ActSeeAllStaCrs+43)
+#define ActChgMyOff (ActSeeAllStaCrs+44)
+#define ActChgMyOffPho (ActSeeAllStaCrs+45)
-#define ActReqEdiMyNet (ActSeeAllStaCrs+45)
-#define ActChgMyNet (ActSeeAllStaCrs+46)
+#define ActReqEdiMyNet (ActSeeAllStaCrs+46)
+#define ActChgMyNet (ActSeeAllStaCrs+47)
-#define ActChgThe (ActSeeAllStaCrs+47)
-#define ActReqChgLan (ActSeeAllStaCrs+48)
-#define ActChgLan (ActSeeAllStaCrs+49)
-#define ActChg1stDay (ActSeeAllStaCrs+50)
-#define ActChgCol (ActSeeAllStaCrs+51)
-#define ActHidLftCol (ActSeeAllStaCrs+52)
-#define ActHidRgtCol (ActSeeAllStaCrs+53)
-#define ActShoLftCol (ActSeeAllStaCrs+54)
-#define ActShoRgtCol (ActSeeAllStaCrs+55)
-#define ActChgIco (ActSeeAllStaCrs+56)
-#define ActChgMnu (ActSeeAllStaCrs+57)
-#define ActChgNtfPrf (ActSeeAllStaCrs+58)
+#define ActChgThe (ActSeeAllStaCrs+48)
+#define ActReqChgLan (ActSeeAllStaCrs+49)
+#define ActChgLan (ActSeeAllStaCrs+50)
+#define ActChg1stDay (ActSeeAllStaCrs+51)
+#define ActChgCol (ActSeeAllStaCrs+52)
+#define ActHidLftCol (ActSeeAllStaCrs+53)
+#define ActHidRgtCol (ActSeeAllStaCrs+54)
+#define ActShoLftCol (ActSeeAllStaCrs+55)
+#define ActShoRgtCol (ActSeeAllStaCrs+56)
+#define ActChgIco (ActSeeAllStaCrs+57)
+#define ActChgMnu (ActSeeAllStaCrs+58)
+#define ActChgNtfPrf (ActSeeAllStaCrs+59)
-#define ActPrnUsrQR (ActSeeAllStaCrs+59)
+#define ActPrnUsrQR (ActSeeAllStaCrs+60)
-#define ActPrnMyTT (ActSeeAllStaCrs+60)
-#define ActEdiTut (ActSeeAllStaCrs+61)
-#define ActChgTut (ActSeeAllStaCrs+62)
-#define ActChgMyTT1stDay (ActSeeAllStaCrs+63)
+#define ActPrnMyTT (ActSeeAllStaCrs+61)
+#define ActEdiTut (ActSeeAllStaCrs+62)
+#define ActChgTut (ActSeeAllStaCrs+63)
+#define ActChgMyTT1stDay (ActSeeAllStaCrs+64)
-#define ActReqRemFilBrf (ActSeeAllStaCrs+64)
-#define ActRemFilBrf (ActSeeAllStaCrs+65)
-#define ActRemFolBrf (ActSeeAllStaCrs+66)
-#define ActCopBrf (ActSeeAllStaCrs+67)
-#define ActPasBrf (ActSeeAllStaCrs+68)
-#define ActRemTreBrf (ActSeeAllStaCrs+69)
-#define ActFrmCreBrf (ActSeeAllStaCrs+70)
-#define ActCreFolBrf (ActSeeAllStaCrs+71)
-#define ActCreLnkBrf (ActSeeAllStaCrs+72)
-#define ActRenFolBrf (ActSeeAllStaCrs+73)
-#define ActRcvFilBrfDZ (ActSeeAllStaCrs+74)
-#define ActRcvFilBrfCla (ActSeeAllStaCrs+75)
-#define ActExpBrf (ActSeeAllStaCrs+76)
-#define ActConBrf (ActSeeAllStaCrs+77)
-#define ActZIPBrf (ActSeeAllStaCrs+78)
-#define ActReqDatBrf (ActSeeAllStaCrs+79)
-#define ActChgDatBrf (ActSeeAllStaCrs+80)
-#define ActDowBrf (ActSeeAllStaCrs+81)
+#define ActReqRemFilBrf (ActSeeAllStaCrs+65)
+#define ActRemFilBrf (ActSeeAllStaCrs+66)
+#define ActRemFolBrf (ActSeeAllStaCrs+67)
+#define ActCopBrf (ActSeeAllStaCrs+68)
+#define ActPasBrf (ActSeeAllStaCrs+69)
+#define ActRemTreBrf (ActSeeAllStaCrs+70)
+#define ActFrmCreBrf (ActSeeAllStaCrs+71)
+#define ActCreFolBrf (ActSeeAllStaCrs+72)
+#define ActCreLnkBrf (ActSeeAllStaCrs+73)
+#define ActRenFolBrf (ActSeeAllStaCrs+74)
+#define ActRcvFilBrfDZ (ActSeeAllStaCrs+75)
+#define ActRcvFilBrfCla (ActSeeAllStaCrs+76)
+#define ActExpBrf (ActSeeAllStaCrs+77)
+#define ActConBrf (ActSeeAllStaCrs+78)
+#define ActZIPBrf (ActSeeAllStaCrs+79)
+#define ActReqDatBrf (ActSeeAllStaCrs+80)
+#define ActChgDatBrf (ActSeeAllStaCrs+81)
+#define ActDowBrf (ActSeeAllStaCrs+82)
-#define ActReqRemOldBrf (ActSeeAllStaCrs+82)
-#define ActRemOldBrf (ActSeeAllStaCrs+83)
+#define ActReqRemOldBrf (ActSeeAllStaCrs+83)
+#define ActRemOldBrf (ActSeeAllStaCrs+84)
/*****************************************************************************/
/******************************** Public types *******************************/
diff --git a/swad_changelog.h b/swad_changelog.h
index c7641cd29..07097ef04 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -119,8 +119,8 @@
// TODO: Change PhotoAttribution in table centres from TEXT to VARCHAR(255) (check maximum length first)
// TODO: In social refreshing via AJAX, an error occurs when session expirates
// TODO: Messages in msg_content_deleted older than a certain time should be deleted to ensure the protection of personal data
-// TODO: Request confirmation to remove user's photo
// TODO: FIX BUG: A teacher uploads a document in course documents zone, then he/she unregister from course, then he/she search for his/her documents, a document is shown in results but he/she can not view it
+// TODO: Teachers should have a button to report a student as probably duplicated. System admin should view a list of users reported and, for each of them, a small list with the possible duplicated (people with the same ID, the same name, etc.)
// TODO: Modify WS function getUsers changing: userRole to indicate all users, and a new parameter filter (search string (name, @nickname, mail)) to restring number of users
// TODO: Add a new WS function to count the nunmber of users to return in call to function getUsers
@@ -129,18 +129,26 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 15.224.3 (2016-06-13)"
+#define Log_PLATFORM_VERSION "SWAD 15.225 (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: Jun 14, 2016 Removing a user's photo now requires confirmation. (202425 lines)
+ 5 changes necessary in database:
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1574','es','N','Preguntar si eliminar foto otro usr.');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1575','es','N','Preguntar si eliminar foto estudiante');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1576','es','N','Preguntar si eliminar foto profesor');
+INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1577','es','N','Preguntar si eliminar mi foto');
+UPDATE actions SET Txt='Eliminar mi foto' WHERE ActCod='428' AND Language='es';
+
Version 15.224.3: Jun 13, 2016 Fix bug while finding cell content in file of marks. (202266 lines)
Version 15.224.2: Jun 12, 2016 Info about number of files is moved to bottom of file browsers. (202266 lines)
Version 15.224.1: Jun 12, 2016 Change in layout of file browsers. (202266 lines)
Version 15.224: Jun 12, 2016 Now a user can unfollow users followed by him/her whose profile is not visible.
- Code refactoring in list of follweing/followers. (202304 lines)
+ Code refactoring in list of follwing/followers. (202304 lines)
Version 15.223.3: Jun 12, 2016 Fixed layout of list of forums. (202282 lines)
Version 15.223.2: Jun 12, 2016 Fixed bug in results of search of students. (202277 lines)
Version 15.223.1: Jun 12, 2016 Show only users to follow with first name and surname 1. (202276 lines)
diff --git a/swad_photo.c b/swad_photo.c
index 62d0458af..7fcb6c021 100644
--- a/swad_photo.c
+++ b/swad_photo.c
@@ -84,8 +84,8 @@ const char *Pho_StrAvgPhotoPrograms[Pho_NUM_AVERAGE_PHOTO_TYPES] =
/***************************** Private prototypes ****************************/
/*****************************************************************************/
-static void Pho_PutIconToRemoveMyPhoto (void);
-static void Pho_PutIconToRemoveOtherUsrPhoto (void);
+static void Pho_PutIconToRequestRemoveMyPhoto (void);
+static void Pho_PutIconToRequestRemoveOtherUsrPhoto (void);
static void Pho_ReqMyPhoto (void);
static void Pho_ReqOtherUsrPhoto (void);
@@ -219,35 +219,35 @@ void Pho_PutLinkToChangeOtherUsrPhoto (void)
}
/*****************************************************************************/
-/********************* Put a link to remove user's photo *********************/
+/************** Put a link to request the removal of my photo ****************/
/*****************************************************************************/
-static void Pho_PutIconToRemoveMyPhoto (void)
+static void Pho_PutIconToRequestRemoveMyPhoto (void)
{
extern const char *Txt_Remove_photo;
- /***** Link to remove my photo *****/
+ /***** Link to request the removal of my photo *****/
if (Gbl.Usrs.Me.MyPhotoExists)
- Lay_PutContextualLink (ActRemMyPho,NULL,"remove-on64x64.png",
+ Lay_PutContextualLink (ActReqRemMyPho,NULL,"remove-on64x64.png",
Txt_Remove_photo,NULL);
}
/*****************************************************************************/
-/********************* Put a link to remove user's photo *********************/
+/********** Put a link to request the removal of a user's photo **************/
/*****************************************************************************/
-static void Pho_PutIconToRemoveOtherUsrPhoto (void)
+static void Pho_PutIconToRequestRemoveOtherUsrPhoto (void)
{
extern const char *Txt_Remove_photo;
char PhotoURL[PATH_MAX+1];
bool PhotoExists;
- /***** Link for removing the photo *****/
+ /***** Link to request the removal of another user's photo *****/
PhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,true);
if (PhotoExists)
- Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT ? ActRemStdPho :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER ? ActRemTchPho :
- ActRemOthPho), // Guest, visitor or admin
+ Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT ? ActReqRemStdPho :
+ (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER ? ActReqRemTchPho :
+ ActReqRemOthPho), // Guest, visitor or admin
Usr_PutParamOtherUsrCodEncrypted,
"remove-on64x64.png",
Txt_Remove_photo,NULL);
@@ -257,7 +257,7 @@ static void Pho_PutIconToRemoveOtherUsrPhoto (void)
/************************ Form for sending my photo **************************/
/*****************************************************************************/
-void Pho_ReqMyPhotoWithContextualLinks (void)
+void Pho_ReqMyPhotoWithContextLinks (void)
{
/***** Contextual links to remove photo and change privacy *****/
if (Gbl.Usrs.Me.MyPhotoExists) // I have photo
@@ -307,8 +307,8 @@ static void Pho_ReqPhoto (const struct UsrData *UsrDat,const char *PhotoURL)
/***** Start frame *****/
Lay_StartRoundFrame (NULL,Txt_Photo,
- ItsMe ? Pho_PutIconToRemoveMyPhoto :
- Pho_PutIconToRemoveOtherUsrPhoto);
+ ItsMe ? Pho_PutIconToRequestRemoveMyPhoto :
+ Pho_PutIconToRequestRemoveOtherUsrPhoto);
/***** Start form *****/
if (ItsMe)
@@ -362,7 +362,7 @@ void Pho_SendPhotoUsr (void)
true);
if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
/***** Form to send my photo *****/
- Pho_ReqMyPhotoWithContextualLinks ();
+ Pho_ReqMyPhotoWithContextLinks ();
else
/***** Form to send another user's photo *****/
Pho_ReqOtherUsrPhoto ();
@@ -407,6 +407,40 @@ void Pho_RecOtherUsrPhotoDetFaces (void)
Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
}
+/*****************************************************************************/
+/********************** Request the removal of my photo **********************/
+/*****************************************************************************/
+
+void Pho_ReqRemoveMyPhoto (void)
+ {
+ extern const char *Txt_Photo;
+ extern const char *Txt_Do_you_really_want_to_remove_your_photo;
+ extern const char *Txt_Remove_photo;
+ extern const char *Txt_The_photo_no_longer_exists;
+
+ /***** Show current photo and help message *****/
+ if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Me.UsrDat,Gbl.Usrs.Me.PhotoURL,true))
+ {
+ /***** Start frame *****/
+ Lay_StartRoundFrame (NULL,Txt_Photo,Pho_PutIconToRequestRemoveMyPhoto);
+
+ /***** Show current photo and help message *****/
+ Pho_ShowUsrPhoto (&Gbl.Usrs.Me.UsrDat,Gbl.Usrs.Me.PhotoURL,
+ "PHOTO186x248",Pho_NO_ZOOM,false);
+ Lay_ShowAlert (Lay_INFO,Txt_Do_you_really_want_to_remove_your_photo);
+
+ /***** Button to remove my photo *****/
+ Act_FormStart (ActRemMyPho);
+ Lay_PutRemoveButton (Txt_Remove_photo);
+ Act_FormEnd ();
+
+ /***** End frame *****/
+ Lay_EndRoundFrame ();
+ }
+ else
+ Lay_ShowAlert (Lay_INFO,Txt_The_photo_no_longer_exists);
+ }
+
/*****************************************************************************/
/****************************** Remove my photo ******************************/
/*****************************************************************************/
@@ -428,6 +462,59 @@ void Pho_RemoveMyPhoto2 (void)
Lay_ShowAlert (Lay_SUCCESS,Txt_Photo_removed);
}
+/*****************************************************************************/
+/**************** Request the removal of another user's photo ****************/
+/*****************************************************************************/
+
+void Pho_ReqRemoveUsrPhoto (void)
+ {
+ extern const char *Txt_Photo;
+ extern const char *Txt_Do_you_really_want_to_remove_the_photo_of_X;
+ extern const char *Txt_Remove_photo;
+ extern const char *Txt_The_photo_no_longer_exists;
+ extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
+ char PhotoURL[PATH_MAX+1];
+
+ /***** Get user's code from form *****/
+ Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ();
+
+ /***** Get password, user type and user's data from database *****/
+ if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat))
+ {
+ if (Pho_CheckIfICanChangeOtherUsrPhoto (&Gbl.Usrs.Other.UsrDat))
+ {
+ /***** Show current photo and help message *****/
+ if (Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,true))
+ {
+ /***** Start frame *****/
+ Lay_StartRoundFrame (NULL,Txt_Photo,Pho_PutIconToRequestRemoveOtherUsrPhoto);
+
+ Pho_ShowUsrPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL,
+ "PHOTO186x248",Pho_NO_ZOOM,false);
+ sprintf (Gbl.Message,Txt_Do_you_really_want_to_remove_the_photo_of_X,Gbl.Usrs.Other.UsrDat.FullName);
+ Lay_ShowAlert (Lay_INFO,Gbl.Message);
+
+ /***** Button to remove user's photo *****/
+ Act_FormStart ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT ? ActRemStdPho :
+ (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER ? ActRemTchPho :
+ ActRemOthPho)); // Guest, visitor or admin
+ Usr_PutParamOtherUsrCodEncrypted ();
+ Lay_PutRemoveButton (Txt_Remove_photo);
+ Act_FormEnd ();
+
+ /***** End frame *****/
+ Lay_EndRoundFrame ();
+ }
+ else
+ Lay_ShowAlert (Lay_INFO,Txt_The_photo_no_longer_exists);
+ }
+ else
+ Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
+ }
+ else
+ Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_);
+ }
+
/*****************************************************************************/
/************************ Remove another user's photo ************************/
/*****************************************************************************/
diff --git a/swad_photo.h b/swad_photo.h
index b8f2b2a36..b9aa335d9 100644
--- a/swad_photo.h
+++ b/swad_photo.h
@@ -83,14 +83,18 @@ typedef enum
bool Pho_CheckIfICanChangeOtherUsrPhoto (const struct UsrData *UsrDat);
void Pho_PutLinkToChangeMyPhoto (void);
void Pho_PutLinkToChangeOtherUsrPhoto (void);
-void Pho_ReqMyPhotoWithContextualLinks (void);
+void Pho_ReqMyPhotoWithContextLinks (void);
void Pho_ReqUsrPhotoWithContextualLinks (struct UsrData *UsrDat);
void Pho_SendPhotoUsr (void);
void Pho_RecMyPhotoDetFaces (void);
void Pho_RecOtherUsrPhotoDetFaces (void);
+
+void Pho_ReqRemoveMyPhoto (void);
void Pho_RemoveMyPhoto1 (void);
void Pho_RemoveMyPhoto2 (void);
+void Pho_ReqRemoveUsrPhoto (void);
void Pho_RemoveUsrPhoto (void);
+
void Pho_UpdateMyPhoto1 (void);
void Pho_UpdateMyPhoto2 (void);
void Pho_UpdateUsrPhoto1 (void);
diff --git a/swad_text.c b/swad_text.c
index d09cf30b9..7910dc2c8 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -8974,7 +8974,7 @@ const char *Txt_Do_you_really_want_to_remove_the_group_X = // Warning: it is ver
#elif L==8
"Czy na pewno chcesz usunac grupe %s?";
#elif L==9
- "Do you really want to remove the group %s?"; // Necessita de tradução
+ "Do you really want to remove the group %s?"; // Necessita de tradução
#endif
const char *Txt_Do_you_really_want_to_remove_the_group_X_1_student_ = // Warning: it is very important to include %s in the following sentences
@@ -9037,6 +9037,27 @@ const char *Txt_Do_you_really_want_to_remove_the_group_X_Y_students_ = // Warnin
"Doing so will remove %u students from that group."; // Necessita de tradução
#endif
+const char *Txt_Do_you_really_want_to_remove_the_photo_of_X = // Warning: it is very important to include %s in the following sentences
+#if L==1
+ "De veres voleu eliminar la foto de %s?";
+#elif L==2
+ "Wollen Sie die wirklich das Foto von %s zu entfernen?";
+#elif L==3
+ "Do you really want to remove the photo of %s?";
+#elif L==4
+ "¿Realmente desea eliminar la foto de %s?";
+#elif L==5
+ "Voulez-vous vraiment supprimer la photo de %s?";
+#elif L==6
+ "¿Realmente desea eliminar la foto de %s?"; // Okoteve traducción
+#elif L==7
+ "Vuoi realmente rimuovere la foto di %s?";
+#elif L==8
+ "Czy na pewno chcesz usunąć zdjęcie %s?";
+#elif L==9
+ "Você realmente deseja remover la foto de %s?";
+#endif
+
const char *Txt_Do_you_really_want_to_remove_the_question_X = // Warning: it is very important to include %lu in the following sentences
#if L==1
"¿Realmente desea eliminar la pregunta %lu?"; // Necessita traduccio
@@ -9139,6 +9160,27 @@ const char *Txt_Do_you_really_want_to_remove_the_type_of_group_X_Y_groups_ = //
"Doing so will also remove %u groups of that type."; // Necessita de tradução
#endif
+const char *Txt_Do_you_really_want_to_remove_your_photo =
+#if L==1
+ "De veres voleu eliminar la seva foto?";
+#elif L==2
+ "Wollen Sie die Ihr Foto zu entfernen?";
+#elif L==3
+ "Do you really want to remove your photo?";
+#elif L==4
+ "¿Realmente desea eliminar su foto?";
+#elif L==5
+ "Voulez-vous vraiment supprimer votre photo?";
+#elif L==6
+ "¿Realmente desea eliminar su foto?"; // Okoteve traducción
+#elif L==7
+ "Vuoi realmente rimuovere la tua foto?";
+#elif L==8
+ "Czy na pewno chcesz usunąć swoje zdjęcie?";
+#elif L==9
+ "Você realmente deseja remover a sua foto?";
+#endif
+
const char *Txt_Do_you_really_want_to_reset_the_survey_X = // Warning: it is very important to include %s in the following sentences
#if L==1
"¿Realmente desea poner a cero la encuesta %s?"; // Necessita traduccio
@@ -41199,6 +41241,27 @@ const char *Txt_The_centre_X_has_been_renamed_as_Y = // Warning: it is very impo
"The centre %s has been renamed as %s."; // Necessita de tradução
#endif
+const char *Txt_The_comment_no_longer_exists =
+#if L==1
+ "El comentari ja no existeix.";
+#elif L==2
+ "Der Kommentar nicht mehr existiert.";
+#elif L==3
+ "The comment no longer exists.";
+#elif L==4
+ "El comentario ya no existe.";
+#elif L==5
+ "Le commentaire a disparu.";
+#elif L==6
+ "El comentario ya no existe."; // Okoteve traducción
+#elif L==7
+ "Il commento non esiste più.";
+#elif L==8
+ "Komentarz już nie istnieje.";
+#elif L==9
+ "O comentário não existe mais.";
+#endif
+
const char *Txt_The_contents_of_the_folder_are_too_big =
#if L==1
"El contingut de la carpeta és massa gran.";
@@ -43941,25 +44004,25 @@ const char *Txt_The_numerical_code_X_already_exists = // Warning: it is very imp
"The ISO 3166-1 numerical code %03ld already exists."; // Necessita de tradução
#endif
-const char *Txt_The_comment_no_longer_exists =
+const char *Txt_The_photo_no_longer_exists =
#if L==1
- "El comentari ja no existeix.";
+ "La foto ja no existeix.";
#elif L==2
- "Der Kommentar nicht mehr existiert.";
+ "Das Foto nicht mehr existiert.";
#elif L==3
- "The comment no longer exists.";
+ "The photo no longer exists.";
#elif L==4
- "El comentario ya no existe.";
+ "La foto ya no existe.";
#elif L==5
- "Le commentaire a disparu.";
+ "La photo a disparu.";
#elif L==6
- "El comentario ya no existe."; // Okoteve traducción
+ "La foto ya no existe."; // Okoteve traducción
#elif L==7
- "Il commento non esiste più.";
+ "La foto non esiste più.";
#elif L==8
- "Komentarz już nie istnieje.";
+ "Zdjęcie już nie istnieje.";
#elif L==9
- "O comentário não existe mais.";
+ "La foto não existe mais.";
#endif
const char *Txt_The_original_post_no_longer_exists =