Version 16.76

This commit is contained in:
Antonio Cañas Vargas 2016-11-29 01:38:59 +01:00
parent f7be7f6d9e
commit 6add447c4e
11 changed files with 1446 additions and 199 deletions

View File

@ -598,6 +598,15 @@ CREATE TABLE IF NOT EXISTS links (
WWW VARCHAR(255) NOT NULL,
UNIQUE INDEX(LnkCod));
--
-- Table locations: stores the teachers' locations
--
CREATE TABLE IF NOT EXISTS locations (
LocCod INT NOT NULL AUTO_INCREMENT,
StartDate DATE NOT NULL,
EndDate DATE NOT NULL,
Location VARCHAR(255) NOT NULL,
UNIQUE INDEX(LocCod));
--
-- Table log_banners: stores the log of clicked banners
--
CREATE TABLE IF NOT EXISTS log_banners (

View File

@ -81,7 +81,7 @@ extern struct Globals Gbl;
/************************ Internal global variables **************************/
/*****************************************************************************/
/*
1223 actions in one CGI:
1230 actions in one CGI:
0. ActAll Any action (used for statistics)
1. ActUnk Unknown action
2. ActHom Show home menu
@ -1344,82 +1344,89 @@ Profile:
1155. ActAnnSee Mark announcement as seen
1156. ActChgMyRol Change type of logged user
1157. ActChkUsrAcc Check if already exists a new account without password associated to a ID
1158. ActCreUsrAcc Create new user account
1159. ActRemID_Me Remove one of my user's IDs
1160. ActNewIDMe Create a new user's ID for me
1161. ActRemOldNic Remove one of my old nicknames
1162. ActChgNic Change my nickname
1163. ActRemMaiMe Remove one of my old emails
1164. ActNewMaiMe Change my email address
1165. ActCnfMai Confirm email address
1166. ActFrmChgMyPwd Show form to the change of the password
1167. ActChgPwd Change the password
1168. ActReqRemMyAcc Request the removal of my account
1169. ActRemMyAcc Remove my account
1157. ActEdiLoc Edit my locations
1158. ActNewLoc Request the creation of a location
1159. ActRemLoc Remove a location
1160. ActChgLocStrDat Change start date of a location
1161. ActChgLocEndDat Change end date of a location
1162. ActRenLoc Rename a location
1170. ActChgMyData Update my personal data
1163. ActChkUsrAcc Check if already exists a new account without password associated to a ID
1164. ActCreUsrAcc Create new user account
1165. ActRemID_Me Remove one of my user's IDs
1166. ActNewIDMe Create a new user's ID for me
1167. ActRemOldNic Remove one of my old nicknames
1168. ActChgNic Change my nickname
1169. ActRemMaiMe Remove one of my old emails
1170. ActNewMaiMe Change my email address
1171. ActCnfMai Confirm email address
1172. ActFrmChgMyPwd Show form to the change of the password
1173. ActChgPwd Change the password
1174. ActReqRemMyAcc Request the removal of my account
1175. ActRemMyAcc Remove my account
1171. ActReqMyPho Show form to send my photo
1172. ActDetMyPho Receive my photo and detect faces on it
1173. ActUpdMyPho Update my photo
1174. ActReqRemMyPho Request the removal of my photo
1175. ActRemMyPho Remove my photo
1176. ActChgMyData Update my personal data
1176. ActEdiPri Edit my privacy
1177. ActChgPriPho Change privacy of my photo
1178. ActChgPriPrf Change privacy of my public profile
1177. ActReqMyPho Show form to send my photo
1178. ActDetMyPho Receive my photo and detect faces on it
1179. ActUpdMyPho Update my photo
1180. ActReqRemMyPho Request the removal of my photo
1181. ActRemMyPho Remove my photo
1179. ActReqEdiMyIns Request the edition of my institution, centre and department
1180. ActChgCtyMyIns Change the country of my institution
1181. ActChgMyIns Change my institution
1182. ActChgMyCtr Change my centre
1183. ActChgMyDpt Change my department
1184. ActChgMyOff Change my office
1185. ActChgMyOffPho Change my office phone
1182. ActEdiPri Edit my privacy
1183. ActChgPriPho Change privacy of my photo
1184. ActChgPriPrf Change privacy of my public profile
1186. ActReqEdiMyNet Request the edition of my social networks
1187. ActChgMyNet Change my web and social networks
1185. ActReqEdiMyIns Request the edition of my institution, centre and department
1186. ActChgCtyMyIns Change the country of my institution
1187. ActChgMyIns Change my institution
1188. ActChgMyCtr Change my centre
1189. ActChgMyDpt Change my department
1190. ActChgMyOff Change my office
1191. ActChgMyOffPho Change my office phone
1188. ActChgThe Change theme
1189. ActReqChgLan Ask if change language
1190. ActChgLan Change language
1191. ActChg1stDay Change first day of the week
1192. ActChgCol Change side columns
1193. ActHidLftCol Hide left side column
1194. ActHidRgtCol Hide right side column
1195. ActShoLftCol Show left side column
1196. ActShoRgtCol Show right side column
1197. ActChgIco Change icon set
1198. ActChgMnu Change menu
1199. ActChgNtfPrf Change whether to notify by email new messages
1200. ActPrnUsrQR Show my QR code ready to print
1192. ActReqEdiMyNet Request the edition of my social networks
1193. ActChgMyNet Change my web and social networks
1201. ActPrnMyTT Show the timetable listo to impresión of all my courses
1202. ActEdiTut Edit the timetable of tutorías
1203. ActChgTut Modify the timetable of tutorías
1204. ActChgMyTT1stDay Change first day of week and show timetable of the course
1194. ActChgThe Change theme
1195. ActReqChgLan Ask if change language
1196. ActChgLan Change language
1197. ActChg1stDay Change first day of the week
1198. ActChgCol Change side columns
1119. ActHidLftCol Hide left side column
1200. ActHidRgtCol Hide right side column
1201. ActShoLftCol Show left side column
1202. ActShoRgtCol Show right side column
1203. ActChgIco Change icon set
1204. ActChgMnu Change menu
1205. ActChgNtfPrf Change whether to notify by email new messages
1206. ActPrnUsrQR Show my QR code ready to print
1205. ActReqRemFilBrf Request removal of a file of the briefcase
1206. ActRemFilBrf Remove a file of the briefcase
1207. ActRemFolBrf Remove a folder empty of the briefcase
1208. ActCopBrf Set source of copy in the briefcase
1209. ActPasBrf Paste a folder or file in the briefcase
1210. ActRemTreBrf Remove a folder no empty of the briefcase
1211. ActFrmCreBrf Form to crear a folder or file in the briefcase
1212. ActCreFolBrf Create a new folder in the briefcase
1213. ActCreLnkBrf Create a new link in the briefcase
1214. ActRenFolBrf Rename a folder of the briefcase
1215. ActRcvFilBrfDZ Receive a file in the briefcase using Dropzone.js
1216. ActRcvFilBrfCla Receive a file in the briefcase using the classic way
1217. ActExpBrf Expand a folder in briefcase
1218. ActConBrf Contract a folder in briefcase
1219. ActZIPBrf Compress a folder in briefcase
1220. ActReqDatBrf Ask for metadata of a file in the briefcase
1221. ActChgDatBrf Change metadata of a file in the briefcase
1222. ActDowBrf Download a file in the briefcase
1223. ActReqRemOldBrf Ask for removing old files in the briefcase
1224. ActRemOldBrf Remove old files in the briefcase
1207. ActPrnMyTT Show the timetable listo to impresión of all my courses
1208. ActEdiTut Edit the timetable of tutorías
1209. ActChgTut Modify the timetable of tutorías
1210. ActChgMyTT1stDay Change first day of week and show timetable of the course
1211. ActReqRemFilBrf Request removal of a file of the briefcase
1212. ActRemFilBrf Remove a file of the briefcase
1213. ActRemFolBrf Remove a folder empty of the briefcase
1214. ActCopBrf Set source of copy in the briefcase
1215. ActPasBrf Paste a folder or file in the briefcase
1216. ActRemTreBrf Remove a folder no empty of the briefcase
1217. ActFrmCreBrf Form to crear a folder or file in the briefcase
1218. ActCreFolBrf Create a new folder in the briefcase
1219. ActCreLnkBrf Create a new link in the briefcase
1220. ActRenFolBrf Rename a folder of the briefcase
1221. ActRcvFilBrfDZ Receive a file in the briefcase using Dropzone.js
1222. ActRcvFilBrfCla Receive a file in the briefcase using the classic way
1223. ActExpBrf Expand a folder in briefcase
1224. ActConBrf Contract a folder in briefcase
1225. ActZIPBrf Compress a folder in briefcase
1226. ActReqDatBrf Ask for metadata of a file in the briefcase
1227. ActChgDatBrf Change metadata of a file in the briefcase
1228. ActDowBrf Download a file in the briefcase
1229. ActReqRemOldBrf Ask for removing old files in the briefcase
1230. ActRemOldBrf Remove old files in the briefcase
*/
struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
@ -2768,7 +2775,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActMyCrs */{ 987, 2,TabPrf,ActMyCrs ,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Crs_ReqSelectOneOfMyCourses ,"mygroups64x64.gif" },
/* ActSeeMyTT */{ 408, 3,TabPrf,ActSeeMyTT ,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,TT_ShowClassTimeTable ,"clock64x64.gif" },
/* ActSeeMyAgd */{1581, 4,TabPrf,ActSeeMyAgd ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Agd_ShowMyAgenda ,"date64x64.gif" },
/* ActSeeMyLoc */{1602, 5,TabPrf,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_ShowMyLocation ,"mapmarker64x64.png" },
/* ActSeeMyLoc */{1602, 5,TabPrf,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_SeeLocations ,"mapmarker64x64.png" },
/* ActFrmMyAcc */{ 36, 6,TabPrf,ActFrmMyAcc ,0x1FF,0x1FF,0x1FF,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Acc_ShowFormMyAccount ,"arroba64x64.gif" },
/* ActReqEdiRecCom */{ 285, 7,TabPrf,ActReqEdiRecCom ,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ShowFormMySharedRecord ,"card64x64.gif" },
/* ActEdiPrf */{ 673, 8,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Pre_EditPrefs ,"heart64x64.gif" },
@ -2785,6 +2792,13 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActAnnSee */{1234,-1,TabUnk,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Ann_MarkAnnouncementAsSeen ,NULL},
/* ActChgMyRol */{ 589,-1,TabUnk,ActFrmRolSes ,0x1FE,0x1FE,0x1FE,Act_CONT_NORM,Act_THIS_WINDOW,Rol_ChangeMyRole ,Usr_ShowFormsLogoutAndRole ,NULL},
/* ActEdiLoc */{1603,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_EditLocations ,NULL},
/* ActNewLoc */{1604,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_RecFormNewLocation ,NULL},
/* ActRemLoc */{1605,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_RemoveLocation ,NULL},
/* ActChgLocStrDat */{1606,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_ChangeStartDate ,NULL},
/* ActChgLocEndDat */{1607,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_ChangeEndDate ,NULL},
/* ActRenLoc */{1608,-1,TabUnk,ActSeeMyLoc ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Loc_RenameLocation ,NULL},
/* ActChkUsrAcc */{1584,-1,TabUnk,ActFrmMyAcc ,0x1FF,0x1FF,0x1FF,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Acc_CheckIfEmptyAccountExists ,NULL},
/* ActCreUsrAcc */{1163,-1,TabUnk,ActFrmMyAcc ,0x1FF,0x1FF,0x1FF,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Acc_AfterCreationNewAccount ,NULL},
@ -4477,6 +4491,12 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActRenCrsFulCfg, // #1600
ActRenCrsShoCfg, // #1601
ActSeeMyLoc, // #1602
ActEdiLoc, // #1603
ActNewLoc, // #1604
ActRemLoc, // #1605
ActChgLocStrDat, // #1606
ActChgLocEndDat, // #1607
ActRenLoc, // #1608
};
/*****************************************************************************/

View File

@ -55,9 +55,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+14+93+73+70+249+186+155+172+36+31+86)
#define Act_NUM_ACTIONS (1+9+51+14+93+73+70+249+186+155+172+36+31+92)
#define Act_MAX_ACTION_COD 1602
#define Act_MAX_ACTION_COD 1608
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 11
@ -1381,84 +1381,90 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
#define ActAutUsrChgLan (ActSeeMyUsgRep+16)
#define ActAnnSee (ActSeeMyUsgRep+17)
#define ActChgMyRol (ActSeeMyUsgRep+18)
#define ActChkUsrAcc (ActSeeMyUsgRep+19)
#define ActCreUsrAcc (ActSeeMyUsgRep+20)
#define ActRemID_Me (ActSeeMyUsgRep+21)
#define ActNewIDMe (ActSeeMyUsgRep+22)
#define ActRemOldNic (ActSeeMyUsgRep+23)
#define ActChgNic (ActSeeMyUsgRep+24)
#define ActRemMaiMe (ActSeeMyUsgRep+25)
#define ActNewMaiMe (ActSeeMyUsgRep+26)
#define ActCnfMai (ActSeeMyUsgRep+27)
#define ActFrmChgMyPwd (ActSeeMyUsgRep+28)
#define ActChgPwd (ActSeeMyUsgRep+29)
#define ActReqRemMyAcc (ActSeeMyUsgRep+30)
#define ActRemMyAcc (ActSeeMyUsgRep+31)
#define ActEdiLoc (ActSeeMyUsgRep+19)
#define ActNewLoc (ActSeeMyUsgRep+20)
#define ActRemLoc (ActSeeMyUsgRep+21)
#define ActChgLocStrDat (ActSeeMyUsgRep+22)
#define ActChgLocEndDat (ActSeeMyUsgRep+23)
#define ActRenLoc (ActSeeMyUsgRep+24)
#define ActChkUsrAcc (ActSeeMyUsgRep+25)
#define ActCreUsrAcc (ActSeeMyUsgRep+26)
#define ActRemID_Me (ActSeeMyUsgRep+27)
#define ActNewIDMe (ActSeeMyUsgRep+28)
#define ActRemOldNic (ActSeeMyUsgRep+29)
#define ActChgNic (ActSeeMyUsgRep+30)
#define ActRemMaiMe (ActSeeMyUsgRep+31)
#define ActNewMaiMe (ActSeeMyUsgRep+32)
#define ActCnfMai (ActSeeMyUsgRep+33)
#define ActFrmChgMyPwd (ActSeeMyUsgRep+34)
#define ActChgPwd (ActSeeMyUsgRep+35)
#define ActReqRemMyAcc (ActSeeMyUsgRep+36)
#define ActRemMyAcc (ActSeeMyUsgRep+37)
#define ActChgMyData (ActSeeMyUsgRep+32)
#define ActChgMyData (ActSeeMyUsgRep+38)
#define ActReqMyPho (ActSeeMyUsgRep+33)
#define ActDetMyPho (ActSeeMyUsgRep+34)
#define ActUpdMyPho (ActSeeMyUsgRep+35)
#define ActReqRemMyPho (ActSeeMyUsgRep+36)
#define ActRemMyPho (ActSeeMyUsgRep+37)
#define ActReqMyPho (ActSeeMyUsgRep+39)
#define ActDetMyPho (ActSeeMyUsgRep+40)
#define ActUpdMyPho (ActSeeMyUsgRep+41)
#define ActReqRemMyPho (ActSeeMyUsgRep+42)
#define ActRemMyPho (ActSeeMyUsgRep+43)
#define ActEdiPri (ActSeeMyUsgRep+38)
#define ActChgPriPho (ActSeeMyUsgRep+39)
#define ActChgPriPrf (ActSeeMyUsgRep+40)
#define ActEdiPri (ActSeeMyUsgRep+44)
#define ActChgPriPho (ActSeeMyUsgRep+45)
#define ActChgPriPrf (ActSeeMyUsgRep+46)
#define ActReqEdiMyIns (ActSeeMyUsgRep+41)
#define ActChgCtyMyIns (ActSeeMyUsgRep+42)
#define ActChgMyIns (ActSeeMyUsgRep+43)
#define ActChgMyCtr (ActSeeMyUsgRep+44)
#define ActChgMyDpt (ActSeeMyUsgRep+45)
#define ActChgMyOff (ActSeeMyUsgRep+46)
#define ActChgMyOffPho (ActSeeMyUsgRep+47)
#define ActReqEdiMyIns (ActSeeMyUsgRep+47)
#define ActChgCtyMyIns (ActSeeMyUsgRep+48)
#define ActChgMyIns (ActSeeMyUsgRep+49)
#define ActChgMyCtr (ActSeeMyUsgRep+50)
#define ActChgMyDpt (ActSeeMyUsgRep+51)
#define ActChgMyOff (ActSeeMyUsgRep+52)
#define ActChgMyOffPho (ActSeeMyUsgRep+53)
#define ActReqEdiMyNet (ActSeeMyUsgRep+48)
#define ActChgMyNet (ActSeeMyUsgRep+49)
#define ActReqEdiMyNet (ActSeeMyUsgRep+54)
#define ActChgMyNet (ActSeeMyUsgRep+55)
#define ActChgThe (ActSeeMyUsgRep+50)
#define ActReqChgLan (ActSeeMyUsgRep+51)
#define ActChgLan (ActSeeMyUsgRep+52)
#define ActChg1stDay (ActSeeMyUsgRep+53)
#define ActChgCol (ActSeeMyUsgRep+54)
#define ActHidLftCol (ActSeeMyUsgRep+55)
#define ActHidRgtCol (ActSeeMyUsgRep+56)
#define ActShoLftCol (ActSeeMyUsgRep+57)
#define ActShoRgtCol (ActSeeMyUsgRep+58)
#define ActChgIco (ActSeeMyUsgRep+59)
#define ActChgMnu (ActSeeMyUsgRep+60)
#define ActChgNtfPrf (ActSeeMyUsgRep+61)
#define ActChgThe (ActSeeMyUsgRep+56)
#define ActReqChgLan (ActSeeMyUsgRep+57)
#define ActChgLan (ActSeeMyUsgRep+58)
#define ActChg1stDay (ActSeeMyUsgRep+59)
#define ActChgCol (ActSeeMyUsgRep+60)
#define ActHidLftCol (ActSeeMyUsgRep+61)
#define ActHidRgtCol (ActSeeMyUsgRep+62)
#define ActShoLftCol (ActSeeMyUsgRep+63)
#define ActShoRgtCol (ActSeeMyUsgRep+64)
#define ActChgIco (ActSeeMyUsgRep+65)
#define ActChgMnu (ActSeeMyUsgRep+66)
#define ActChgNtfPrf (ActSeeMyUsgRep+67)
#define ActPrnUsrQR (ActSeeMyUsgRep+62)
#define ActPrnUsrQR (ActSeeMyUsgRep+68)
#define ActPrnMyTT (ActSeeMyUsgRep+63)
#define ActEdiTut (ActSeeMyUsgRep+64)
#define ActChgTut (ActSeeMyUsgRep+65)
#define ActChgMyTT1stDay (ActSeeMyUsgRep+66)
#define ActPrnMyTT (ActSeeMyUsgRep+69)
#define ActEdiTut (ActSeeMyUsgRep+70)
#define ActChgTut (ActSeeMyUsgRep+71)
#define ActChgMyTT1stDay (ActSeeMyUsgRep+72)
#define ActReqRemFilBrf (ActSeeMyUsgRep+67)
#define ActRemFilBrf (ActSeeMyUsgRep+68)
#define ActRemFolBrf (ActSeeMyUsgRep+69)
#define ActCopBrf (ActSeeMyUsgRep+70)
#define ActPasBrf (ActSeeMyUsgRep+71)
#define ActRemTreBrf (ActSeeMyUsgRep+72)
#define ActFrmCreBrf (ActSeeMyUsgRep+73)
#define ActCreFolBrf (ActSeeMyUsgRep+74)
#define ActCreLnkBrf (ActSeeMyUsgRep+75)
#define ActRenFolBrf (ActSeeMyUsgRep+76)
#define ActRcvFilBrfDZ (ActSeeMyUsgRep+77)
#define ActRcvFilBrfCla (ActSeeMyUsgRep+78)
#define ActExpBrf (ActSeeMyUsgRep+79)
#define ActConBrf (ActSeeMyUsgRep+80)
#define ActZIPBrf (ActSeeMyUsgRep+81)
#define ActReqDatBrf (ActSeeMyUsgRep+82)
#define ActChgDatBrf (ActSeeMyUsgRep+83)
#define ActDowBrf (ActSeeMyUsgRep+84)
#define ActReqRemFilBrf (ActSeeMyUsgRep+73)
#define ActRemFilBrf (ActSeeMyUsgRep+74)
#define ActRemFolBrf (ActSeeMyUsgRep+75)
#define ActCopBrf (ActSeeMyUsgRep+76)
#define ActPasBrf (ActSeeMyUsgRep+77)
#define ActRemTreBrf (ActSeeMyUsgRep+78)
#define ActFrmCreBrf (ActSeeMyUsgRep+79)
#define ActCreFolBrf (ActSeeMyUsgRep+80)
#define ActCreLnkBrf (ActSeeMyUsgRep+81)
#define ActRenFolBrf (ActSeeMyUsgRep+82)
#define ActRcvFilBrfDZ (ActSeeMyUsgRep+83)
#define ActRcvFilBrfCla (ActSeeMyUsgRep+84)
#define ActExpBrf (ActSeeMyUsgRep+85)
#define ActConBrf (ActSeeMyUsgRep+86)
#define ActZIPBrf (ActSeeMyUsgRep+87)
#define ActReqDatBrf (ActSeeMyUsgRep+88)
#define ActChgDatBrf (ActSeeMyUsgRep+89)
#define ActDowBrf (ActSeeMyUsgRep+90)
#define ActReqRemOldBrf (ActSeeMyUsgRep+85)
#define ActRemOldBrf (ActSeeMyUsgRep+86)
#define ActReqRemOldBrf (ActSeeMyUsgRep+91)
#define ActRemOldBrf (ActSeeMyUsgRep+92)
/*****************************************************************************/
/******************************** Public types *******************************/

View File

@ -176,13 +176,24 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.75 (2016-11-28)"
#define Log_PLATFORM_VERSION "SWAD 16.76 (2016-11-29)"
#define CSS_FILE "swad16.69.css"
#define JS_FILE "swad16.46.1.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 16.76: Nov 29, 2016 New form to create location. Not finished. (208936 lines)
8 changes necessary in database:
CREATE TABLE IF NOT EXISTS locations (LocCod INT NOT NULL AUTO_INCREMENT,StartDate DATE NOT NULL,EndDate DATE NOT NULL,Location VARCHAR(255) NOT NULL,UNIQUE INDEX(LocCod));
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1602','es','N','Ver mis ubicaciones');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1603','es','N','Editar mis ubicaciones');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1604','es','N','Solicitar creación de ubicación');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1605','es','N','Eliminar ubicación');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1606','es','N','Cambiar fecha inicial de ubicación');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1607','es','N','Cambiar fecha final de ubicación');
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1608','es','N','Renombrar ubicación');
Version 16.75: Nov 28, 2016 New option to show my location. (207947 lines)
Version 16.74.1: Nov 28, 2016 Changed icon to show places. (207807 lines)
Copy icon/mapmarker64x64.png to public icons directory

View File

@ -1297,6 +1297,26 @@ mysql> DESCRIBE links;
"WWW VARCHAR(255) NOT NULL,"
"UNIQUE INDEX(LnkCod))");
/***** Table locations *****/
/*
mysql> DESCRIBE locations;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| LocCod | int(11) | NO | PRI | NULL | auto_increment |
| StartDate | date | NO | | NULL | |
| EndDate | date | NO | | NULL | |
| Location | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0,01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS locations ("
"LocCod INT NOT NULL AUTO_INCREMENT,"
"StartDate DATE NOT NULL,"
"EndDate DATE NOT NULL,"
"Location VARCHAR(255) NOT NULL,"
"UNIQUE INDEX (LocCod))");
/***** Table log_banners *****/
/*
mysql> DESCRIBE log_banners;

View File

@ -53,6 +53,7 @@
#include "swad_institution.h"
#include "swad_layout.h"
#include "swad_link.h"
#include "swad_location.h"
#include "swad_mail.h"
#include "swad_mark.h"
#include "swad_message.h"
@ -354,6 +355,14 @@ struct Globals
long DegCod;
} Crss[Crs_MAX_COURSES_PER_USR];
} MyCrss;
struct
{
bool LstIsRead; // Is the list already read from database, or it needs to be read?
unsigned Num; // Number of locations
struct Location *Lst; // List of locations
struct Location EditingLoc;
Loc_OrderType_t SelectedOrderType;
} Locs;
Usr_ShowUsrsType_t ListType; // My preference about user's list type
unsigned NumFollowers; // Number of users who follow me
unsigned NumFollowing; // Number of users I follow

View File

@ -227,6 +227,9 @@ const char *Hlp_PROFILE_Courses = WIKI "PROFILE.Courses";
const char *Hlp_PROFILE_Timetable = WIKI "PROFILE.Timetable";
const char *Hlp_PROFILE_Location = WIKI "PROFILE.Location";
const char *Hlp_PROFILE_Location_edit = WIKI "PROFILE.Location#edit";
const char *Hlp_PROFILE_Record = WIKI "PROFILE.Record";
const char *Hlp_PROFILE_Institution = WIKI "PROFILE.Institution";
const char *Hlp_PROFILE_Webs = WIKI "PROFILE.Webs";

View File

@ -632,7 +632,7 @@ long Hld_GetParamHldCod (void)
void Hld_RemoveHoliday (void)
{
extern const char *Txt_Holiday_X_removed;
char Query[512];
char Query[128];
struct Holiday Hld;
/***** Get holiday code *****/

775
swad_location.c Normal file
View File

@ -0,0 +1,775 @@
// swad_location.c: teacher's location
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2016 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General 3 License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include <linux/stddef.h> // For NULL
#include <stdlib.h> // For calloc
#include <string.h> // For string functions
#include "swad_database.h"
#include "swad_global.h"
#include "swad_location.h"
#include "swad_parameter.h"
#include "swad_text.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private variables *****************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static void Loc_GetParamLocOrderType (void);
static void Loc_PutIconToEditLocs (void);
static void Loc_GetDataOfLocationByCod (struct Location *Loc);
static void Loc_ListLocationsForEdition (void);
static void Loc_PutParamLocCod (long LocCod);
static void Loc_ChangeDate (Loc_StartOrEndDate_t StartOrEndDate);
static void Loc_PutFormToCreateLocation (void);
static void Loc_PutHeadLocations (void);
static void Loc_CreateLocation (struct Location *Loc);
/*****************************************************************************/
/*************************** List all my locations ***************************/
/*****************************************************************************/
void Loc_SeeLocations (void)
{
extern const char *Hlp_PROFILE_Location;
extern const char *Txt_Locations;
extern const char *Txt_LOCATIONS_HELP_ORDER[2];
extern const char *Txt_LOCATIONS_ORDER[2];
extern const char *Txt_Location;
Loc_OrderType_t Order;
unsigned NumLoc;
/***** Get parameter with the type of order in the list of locations *****/
Loc_GetParamLocOrderType ();
/***** Get list of locations *****/
Loc_GetListLocations ();
/***** Table head *****/
Lay_StartRoundFrameTable (NULL,Txt_Locations,
Gbl.Usrs.Me.LoggedRole >= Rol_INS_ADM ? Loc_PutIconToEditLocs :
NULL,
Hlp_PROFILE_Location,2);
fprintf (Gbl.F.Out,"<tr>");
for (Order = Loc_ORDER_BY_START_DATE;
Order <= Loc_ORDER_BY_END_DATE;
Order++)
{
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">");
Act_FormStart (ActSeeMyLoc);
Par_PutHiddenParamUnsigned ("Order",(unsigned) Order);
Act_LinkFormSubmit (Txt_LOCATIONS_HELP_ORDER[Order],"TIT_TBL",NULL);
if (Order == Gbl.Usrs.Me.Locs.SelectedOrderType)
fprintf (Gbl.F.Out,"<u>");
fprintf (Gbl.F.Out,"%s",Txt_LOCATIONS_ORDER[Order]);
if (Order == Gbl.Usrs.Me.Locs.SelectedOrderType)
fprintf (Gbl.F.Out,"</u>");
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
fprintf (Gbl.F.Out,"</th>");
}
fprintf (Gbl.F.Out,"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>",
Txt_Location);
/***** Write all the locations *****/
for (NumLoc = 0;
NumLoc < Gbl.Usrs.Me.Locs.Num;
NumLoc++)
{
/* Write data of this location */
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT LEFT_MIDDLE\">"
"&nbsp;%04u-%02u-%02u"
"</td>",
Gbl.Usrs.Me.Locs.Lst[NumLoc].StartDate.Year,
Gbl.Usrs.Me.Locs.Lst[NumLoc].StartDate.Month,
Gbl.Usrs.Me.Locs.Lst[NumLoc].StartDate.Day);
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"&nbsp;%04u-%02u-%02u"
"</td>",
Gbl.Usrs.Me.Locs.Lst[NumLoc].EndDate.Year,
Gbl.Usrs.Me.Locs.Lst[NumLoc].EndDate.Month,
Gbl.Usrs.Me.Locs.Lst[NumLoc].EndDate.Day);
fprintf (Gbl.F.Out,"<td class=\"DAT LEFT_MIDDLE\">"
"&nbsp;%s"
"</td>"
"</tr>",
Gbl.Usrs.Me.Locs.Lst[NumLoc].Location);
}
/***** End table *****/
Lay_EndRoundFrameTable ();
/***** Free list of locations *****/
Loc_FreeListLocations ();
}
/*****************************************************************************/
/********* Get parameter with the type or order in list of locations *********/
/*****************************************************************************/
static void Loc_GetParamLocOrderType (void)
{
char UnsignedStr[10+1];
unsigned UnsignedNum;
Par_GetParToText ("Order",UnsignedStr,10);
if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
Gbl.Usrs.Me.Locs.SelectedOrderType = (Loc_OrderType_t) UnsignedNum;
else
Gbl.Usrs.Me.Locs.SelectedOrderType = Loc_DEFAULT_ORDER_TYPE;
}
/*****************************************************************************/
/************************* Put icon to edit locations ************************/
/*****************************************************************************/
static void Loc_PutIconToEditLocs (void)
{
extern const char *Txt_Edit;
Lay_PutContextualLink (ActEdiLoc,NULL,
"edit64x64.png",
Txt_Edit,NULL,
NULL);
}
/*****************************************************************************/
/************************ Put forms to edit degree types *********************/
/*****************************************************************************/
void Loc_EditLocations (void)
{
extern const char *Txt_There_are_no_locations;
/***** Get list of places *****/
Plc_GetListPlaces ();
/***** Get list of locations *****/
Loc_GetListLocations ();
if (!Gbl.Usrs.Me.Locs.Num)
/***** Help message *****/
Lay_ShowAlert (Lay_INFO,Txt_There_are_no_locations);
/***** Put a form to create a new location *****/
Loc_PutFormToCreateLocation ();
/***** Forms to edit current locations *****/
if (Gbl.Usrs.Me.Locs.Num)
Loc_ListLocationsForEdition ();
/***** Free list of locations *****/
Loc_FreeListLocations ();
/***** Free list of places *****/
Plc_FreeListPlaces ();
}
/*****************************************************************************/
/*************************** List all the locations **************************/
/*****************************************************************************/
void Loc_GetListLocations (void)
{
char OrderBySubQuery[256];
char Query[512];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
unsigned NumLoc;
struct Location *Loc;
if (Gbl.DB.DatabaseIsOpen)
{
if (Gbl.Usrs.Me.Locs.LstIsRead)
Loc_FreeListLocations ();
/***** Get locations from database *****/
switch (Gbl.Usrs.Me.Locs.SelectedOrderType)
{
case Loc_ORDER_BY_START_DATE:
sprintf (OrderBySubQuery,"StartDate,EndDate,Location");
break;
case Loc_ORDER_BY_END_DATE:
sprintf (OrderBySubQuery,"EndDate,StartDate,Location");
break;
}
sprintf (Query,"SELECT LocCod,"
"DATE_FORMAT(StartDate,'%%Y%%m%%d') AS StartDate,"
"DATE_FORMAT(EndDate,'%%Y%%m%%d') AS EndDate,"
"Location"
" FROM locations"
" ORDER BY %s",
OrderBySubQuery);
if ((Gbl.Usrs.Me.Locs.Num = (unsigned) DB_QuerySELECT (Query,&mysql_res,"can not get locations"))) // Locations found...
{
/***** Create list of locations *****/
if ((Gbl.Usrs.Me.Locs.Lst = (struct Location *) calloc ((size_t) Gbl.Usrs.Me.Locs.Num,sizeof (struct Location))) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store locations.");
/***** Get the locations *****/
for (NumLoc = 0;
NumLoc < Gbl.Usrs.Me.Locs.Num;
NumLoc++)
{
Loc = &(Gbl.Usrs.Me.Locs.Lst[NumLoc]);
/* Get next location */
row = mysql_fetch_row (mysql_res);
/* Get location code (row[0]) */
if ((Loc->LocCod = Str_ConvertStrCodToLongCod (row[0])) < 0)
Lay_ShowErrorAndExit ("Wrong location code.");
/* Get start date (row[1] holds the start date in YYYYMMDD format) */
if (!(Dat_GetDateFromYYYYMMDD (&(Loc->StartDate),row[1])))
Lay_ShowErrorAndExit ("Wrong start date.");
/* Get end date (row[2] holds the end date in YYYYMMDD format) */
if (!(Dat_GetDateFromYYYYMMDD (&(Loc->EndDate),row[2])))
Lay_ShowErrorAndExit ("Wrong end date.");
/* Get the location (row[3]) */
strcpy (Loc->Location,row[3]);
}
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
Gbl.Usrs.Me.Locs.LstIsRead = true;
}
}
/*****************************************************************************/
/************************* Get location data by code *************************/
/*****************************************************************************/
static void Loc_GetDataOfLocationByCod (struct Location *Loc)
{
char Query[1024];
MYSQL_RES *mysql_res;
MYSQL_ROW row;
/***** Clear data *****/
Loc->StartDate.Day =
Loc->StartDate.Month =
Loc->StartDate.Year = 0;
Loc->Location[0] = '\0';
/***** Check if location code is correct *****/
if (Loc->LocCod <= 0)
Lay_ShowErrorAndExit ("Wrong code of location.");
/***** Get data of location from database *****/
sprintf (Query,"SELECT "
"DATE_FORMAT(StartDate,'%%Y%%m%%d'),"
"DATE_FORMAT(EndDate,'%%Y%%m%%d'),"
"Location"
" FROM locations"
" WHERE LocCod='%ld'",
Loc->LocCod);
if (DB_QuerySELECT (Query,&mysql_res,"can not get data of a location")) // Location found...
{
/* Get row */
row = mysql_fetch_row (mysql_res);
/* Get start date (row[0] holds the start date in YYYYMMDD format) */
if (!(Dat_GetDateFromYYYYMMDD (&(Loc->StartDate),row[0])))
Lay_ShowErrorAndExit ("Wrong start date.");
/* Get end date (row[1] holds the end date in YYYYMMDD format) */
if (!(Dat_GetDateFromYYYYMMDD (&(Loc->EndDate),row[1])))
Lay_ShowErrorAndExit ("Wrong end date.");
/* Get the location (row[2]) */
strcpy (Loc->Location,row[2]);
}
/***** Free structure that stores the query result *****/
DB_FreeMySQLResult (&mysql_res);
}
/*****************************************************************************/
/**************************** Free list of locations *************************/
/*****************************************************************************/
void Loc_FreeListLocations (void)
{
if (Gbl.Usrs.Me.Locs.LstIsRead && Gbl.Usrs.Me.Locs.Lst)
{
/***** Free memory used by the list of courses in degree *****/
free ((void *) Gbl.Usrs.Me.Locs.Lst);
Gbl.Usrs.Me.Locs.Lst = NULL;
Gbl.Usrs.Me.Locs.Num = 0;
Gbl.Usrs.Me.Locs.LstIsRead = false;
}
}
/*****************************************************************************/
/********************* List all the locations for edition ********************/
/*****************************************************************************/
static void Loc_ListLocationsForEdition (void)
{
extern const char *Hlp_PROFILE_Location_edit;
extern const char *Txt_Locations;
unsigned NumLoc;
struct Location *Loc;
Lay_StartRoundFrameTable (NULL,Txt_Locations,
NULL,Hlp_PROFILE_Location_edit,2);
/***** Table head *****/
Loc_PutHeadLocations ();
/***** Write all the locations *****/
for (NumLoc = 0;
NumLoc < Gbl.Usrs.Me.Locs.Num;
NumLoc++)
{
Loc = &Gbl.Usrs.Me.Locs.Lst[NumLoc];
/* Put icon to remove location */
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"BM\">");
Act_FormStart (ActRemLoc);
Loc_PutParamLocCod (Loc->LocCod);
Lay_PutIconRemove ();
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>");
/* Location start date */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Act_FormStart (ActChgLocStrDat);
Loc_PutParamLocCod (Loc->LocCod);
Dat_WriteFormDate (Gbl.Now.Date.Year - 1,
Gbl.Now.Date.Year + 1,
"Start",
&(Gbl.Usrs.Me.Locs.Lst[NumLoc].StartDate),
true,false);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>");
/* Location end date */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Act_FormStart (ActChgLocEndDat);
Loc_PutParamLocCod (Loc->LocCod);
Dat_WriteFormDate (Gbl.Now.Date.Year - 1,
Gbl.Now.Date.Year + 1,
"End",
&(Gbl.Usrs.Me.Locs.Lst[NumLoc].EndDate),
true,false);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>");
/* Location */
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Act_FormStart (ActRenLoc);
Loc_PutParamLocCod (Loc->LocCod);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Location\""
" size=\"20\" maxlength=\"%u\" value=\"%s\""
" onchange=\"document.getElementById('%s').submit();\" />",
Loc_MAX_LENGTH_LOCATION,Loc->Location,Gbl.Form.Id);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</td>"
"</tr>");
}
Lay_EndRoundFrameTable ();
}
/*****************************************************************************/
/******************** Write parameter with code of location ******************/
/*****************************************************************************/
static void Loc_PutParamLocCod (long LocCod)
{
Par_PutHiddenParamLong ("LocCod",LocCod);
}
/*****************************************************************************/
/********************* Get parameter with code of location *******************/
/*****************************************************************************/
long Loc_GetParamLocCod (void)
{
char LongStr[1+10+1];
/***** Get parameter with code of location *****/
Par_GetParToText ("LocCod",LongStr,1+10);
return Str_ConvertStrCodToLongCod (LongStr);
}
/*****************************************************************************/
/******************************* Remove a location ***************************/
/*****************************************************************************/
void Loc_RemoveLocation (void)
{
extern const char *Txt_Location_removed;
char Query[128];
struct Location Loc;
/***** Get location code *****/
if ((Loc.LocCod = Loc_GetParamLocCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of location is missing.");
/***** Get data of the location from database *****/
Loc_GetDataOfLocationByCod (&Loc);
/***** Remove location *****/
sprintf (Query,"DELETE FROM locations WHERE LocCod='%ld'",Loc.LocCod);
DB_QueryDELETE (Query,"can not remove a location");
/***** Write message to show the change made *****/
sprintf (Gbl.Message,Txt_Location_removed,Loc.Location);
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
/***** Show the form again *****/
Loc_EditLocations ();
}
/*****************************************************************************/
/******************* Change the start date of a location *********************/
/*****************************************************************************/
void Loc_ChangeStartDate (void)
{
Loc_ChangeDate (LOC_START_DATE);
}
/*****************************************************************************/
/******************** Change the end date of a location **********************/
/*****************************************************************************/
void Loc_ChangeEndDate (void)
{
Loc_ChangeDate (LOC_END_DATE);
}
/*****************************************************************************/
/**************** Change the start/end date of a location ********************/
/*****************************************************************************/
static void Loc_ChangeDate (Loc_StartOrEndDate_t StartOrEndDate)
{
extern const char *Txt_The_date_of_the_location_has_changed_to_X;
char Query[512];
struct Location *Loc;
struct Date NewDate;
struct Date *PtrDate = NULL; // Initialized to avoid warning
const char *StrStartOrEndDate;
char StrDate[11];
Loc = &Gbl.Usrs.Me.Locs.EditingLoc;
/***** Get the code of the location *****/
if ((Loc->LocCod = Loc_GetParamLocCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of location is missing.");
/***** Get from the database the data of the location *****/
Loc_GetDataOfLocationByCod (Loc);
/***** Get the new date for the location *****/
switch (StartOrEndDate)
{
case LOC_START_DATE:
StrStartOrEndDate = "StartDate";
PtrDate = &(Loc->StartDate);
Dat_GetDateFromForm ("StartDay","StartMonth","StartYear",
&(NewDate.Day),&(NewDate.Month),&(NewDate.Year));
if (NewDate.Day == 0 ||
NewDate.Month == 0 ||
NewDate.Year == 0)
Dat_AssignDate (&NewDate,&Gbl.Now.Date);
break;
case LOC_END_DATE:
StrStartOrEndDate = "EndDate";
PtrDate = &(Loc->EndDate);
Dat_GetDateFromForm ("EndDay","EndMonth","EndYear",
&(NewDate.Day),&(NewDate.Month),&(NewDate.Year));
if (NewDate.Day == 0 ||
NewDate.Month == 0 ||
NewDate.Year == 0)
Dat_AssignDate (&NewDate,&Gbl.Now.Date);
break;
}
/***** Update the date in database *****/
sprintf (Query,"UPDATE locations SET %s='%04u%02u%02u' WHERE LocCod='%ld'",
StrStartOrEndDate,
NewDate.Year,
NewDate.Month,
NewDate.Day,
Loc->LocCod);
DB_QueryUPDATE (Query,"can not update the date of a location");
/***** Write message to show the change made *****/
sprintf (StrDate,"%04u-%02u-%02u",
NewDate.Year,NewDate.Month,NewDate.Day); // Change format depending on location
sprintf (Gbl.Message,Txt_The_date_of_the_location_has_changed_to_X,StrDate);
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
/***** Show the form again *****/
Dat_AssignDate (PtrDate,&NewDate);
Loc_EditLocations ();
}
/*****************************************************************************/
/***************************** Rename the location ***************************/
/*****************************************************************************/
void Loc_RenameLocation (void)
{
extern const char *Txt_You_can_not_leave_the_location_empty;
extern const char *Txt_The_location_has_changed_to_X;
extern const char *Txt_The_location_has_not_changed;
char Query[512];
struct Location *Loc;
char NewLoc[Loc_MAX_LENGTH_LOCATION+1];
Loc = &Gbl.Usrs.Me.Locs.EditingLoc;
/***** Get parameters from form *****/
/* Get the code of the location */
if ((Loc->LocCod = Loc_GetParamLocCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of location is missing.");
/* Get the new location */
Par_GetParToText ("Location",NewLoc,Loc_MAX_LENGTH_LOCATION);
/***** Get from the database the old location *****/
Loc_GetDataOfLocationByCod (Loc);
/***** Check if new location is empty *****/
if (!NewLoc[0])
Lay_ShowAlert (Lay_WARNING,Txt_You_can_not_leave_the_location_empty);
else
{
/***** Check if old and new locations are the same
(this happens when user press enter
with no changes in the form) *****/
if (strcmp (Loc->Location,NewLoc)) // Different locations
{
/***** If degree was in database... *****/
/* Update the table changing old location by new location */
sprintf (Query,"UPDATE locations SET Location='%s' WHERE LocCod='%ld'",
NewLoc,Loc->LocCod);
DB_QueryUPDATE (Query,"can not update the location");
/***** Write message to show the change made *****/
sprintf (Gbl.Message,Txt_The_location_has_changed_to_X,NewLoc);
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
}
else // The same location
Lay_ShowAlert (Lay_INFO,Txt_The_location_has_not_changed);
}
/***** Show the form again *****/
strcpy (Loc->Location,NewLoc);
Loc_EditLocations ();
}
/*****************************************************************************/
/********************* Put a form to create a new location *******************/
/*****************************************************************************/
static void Loc_PutFormToCreateLocation (void)
{
extern const char *Hlp_PROFILE_Location_edit;
extern const char *Txt_New_location;
extern const char *Txt_Create_location;
struct Location *Loc;
Loc = &Gbl.Usrs.Me.Locs.EditingLoc;
/***** Start form *****/
Act_FormStart (ActNewLoc);
/***** Start of frame *****/
Lay_StartRoundFrameTable (NULL,Txt_New_location,
NULL,Hlp_PROFILE_Location_edit,2);
/***** Table head *****/
Loc_PutHeadLocations ();
/***** Put disabled icon to remove centre *****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"BM\">");
Lay_PutIconRemovalNotAllowed ();
fprintf (Gbl.F.Out,"</td>");
/***** Location start date *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Dat_WriteFormDate (Gbl.Now.Date.Year - 1,
Gbl.Now.Date.Year + 1,
"Start",
&(Loc->StartDate),
false,false);
fprintf (Gbl.F.Out,"</td>");
/***** Location end date *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">");
Dat_WriteFormDate (Gbl.Now.Date.Year - 1,
Gbl.Now.Date.Year + 1,
"End",
&(Loc->EndDate),
false,false);
fprintf (Gbl.F.Out,"</td>");
/***** Location *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
"<input type=\"text\" name=\"Location\""
" size=\"20\" maxlength=\"%u\" value=\"%s\""
" required=\"required\" />"
"</td>"
"<td></td>"
"</tr>",
Loc_MAX_LENGTH_LOCATION,Loc->Location);
/***** Send button and end of frame *****/
Lay_EndRoundFrameTableWithButton (Lay_CREATE_BUTTON,Txt_Create_location);
/***** End of form *****/
Act_FormEnd ();
}
/*****************************************************************************/
/******************* Write header with fields of a location ******************/
/*****************************************************************************/
static void Loc_PutHeadLocations (void)
{
extern const char *Txt_Start_date;
extern const char *Txt_End_date;
extern const char *Txt_Location;
fprintf (Gbl.F.Out,"<tr>"
"<th class=\"BM\"></th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"<th class=\"LEFT_MIDDLE\">"
"%s"
"</th>"
"</tr>",
Txt_Start_date,
Txt_End_date,
Txt_Location);
}
/*****************************************************************************/
/******************* Receive form to create a new location *******************/
/*****************************************************************************/
void Loc_RecFormNewLocation (void)
{
extern const char *Txt_You_must_specify_the_new_location;
struct Location *Loc;
Loc = &Gbl.Usrs.Me.Locs.EditingLoc;
/***** Get start date *****/
Dat_GetDateFromForm ("StartDay","StartMonth","StartYear",
&(Loc->StartDate.Day),&(Loc->StartDate.Month),&(Loc->StartDate.Year));
if (Loc->StartDate.Day == 0 ||
Loc->StartDate.Month == 0 ||
Loc->StartDate.Year == 0)
Dat_AssignDate (&Loc->StartDate,&Gbl.Now.Date);
/***** Get end date *****/
Dat_GetDateFromForm ("EndDay","EndMonth","EndYear",
&(Loc->EndDate.Day),&(Loc->EndDate.Month),&(Loc->EndDate.Year));
if (Loc->EndDate.Day == 0 ||
Loc->EndDate.Month == 0 ||
Loc->EndDate.Year == 0)
Dat_AssignDate (&Loc->EndDate,&Gbl.Now.Date);
/***** Get location *****/
Par_GetParToText ("Location",Loc->Location,Loc_MAX_LENGTH_LOCATION);
/***** Create the new location or write warning message *****/
if (Loc->Location[0]) // If there's a location
Loc_CreateLocation (Loc);
else // If there is not a location
Lay_ShowAlert (Lay_WARNING,Txt_You_must_specify_the_new_location);
/***** Show the form again *****/
Loc_EditLocations ();
}
/*****************************************************************************/
/**************************** Create a new location **************************/
/*****************************************************************************/
static void Loc_CreateLocation (struct Location *Loc)
{
extern const char *Txt_Created_new_location;
char Query[256+Loc_MAX_LENGTH_LOCATION];
/***** Create a new location *****/
sprintf (Query,"INSERT INTO locations (StartDate,EndDate,Location)"
" VALUES ('%04u%02u%02u','%04u%02u%02u','%s')",
Loc->StartDate.Year,
Loc->StartDate.Month,
Loc->StartDate.Day,
Loc->EndDate.Year,
Loc->EndDate.Month,
Loc->EndDate.Day,
Loc->Location);
DB_QueryINSERT (Query,"can not create location");
/***** Write success message *****/
Lay_ShowAlert (Lay_SUCCESS,Txt_Created_new_location);
}

77
swad_location.h Normal file
View File

@ -0,0 +1,77 @@
// swad_location.h: teacher's location
#ifndef _SWAD_LOC
#define _SWAD_LOC
/*
SWAD (Shared Workspace At a Distance in Spanish),
is a web platform developed at the University of Granada (Spain),
and used to support university teaching.
This file is part of SWAD core.
Copyright (C) 1999-2016 Antonio Cañas Vargas
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_date.h"
#include "swad_place.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
#define Loc_MAX_LENGTH_LOCATION 255
typedef enum
{
LOC_START_DATE,
LOC_END_DATE
} Loc_StartOrEndDate_t;
struct Location
{
long LocCod;
struct Date StartDate;
struct Date EndDate;
char Location[Loc_MAX_LENGTH_LOCATION+1];
};
typedef enum
{
Loc_ORDER_BY_START_DATE = 0,
Loc_ORDER_BY_END_DATE = 1,
} Loc_OrderType_t;
#define Loc_DEFAULT_ORDER_TYPE Loc_ORDER_BY_START_DATE
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
void Loc_SeeLocations (void);
void Loc_EditLocations (void);
void Loc_GetListLocations (void);
void Loc_FreeListLocations (void);
long Loc_GetParamLocCod (void);
void Loc_RemoveLocation (void);
void Loc_ChangeStartDate (void);
void Loc_ChangeEndDate (void);
void Loc_RenameLocation (void);
void Loc_RecFormNewLocation (void);
#endif

View File

@ -6296,6 +6296,27 @@ const char *Txt_Create_link =
"Criar liga&ccedil;&atilde;o";
#endif
const char *Txt_Create_location =
#if L==1
"Crear ubicaci&oacute;";
#elif L==2
"Standort eingeben";
#elif L==3
"Create location";
#elif L==4
"Crear ubicaci&oacute;n";
#elif L==5
"Cr&eacute;er emplacement";
#elif L==6
"Crear ubicaci&oacute;n"; // Okoteve traducción
#elif L==7
"Crea posizione";
#elif L==8
"Tworzenie lokalizacj&eogon;";
#elif L==9
"Criar localiza&ccedil;&atilde;o";
#endif
const char *Txt_Create_notice =
#if L==1
"Crear av&iacute;s";
@ -6821,6 +6842,27 @@ const char *Txt_Created_new_link_X = // Warning: it is very important to include
"Criado nova liga&ccedil;&atilde;o <strong>%s</strong>.";
#endif
const char *Txt_Created_new_location =
#if L==1
"Creada nova ubicaci&oacute;.";
#elif L==2
"Neuer Standort eingegeben.";
#elif L==3
"Created new location.";
#elif L==4
"Creada nueva ubicaci&oacute;n.";
#elif L==5
"Cr&eacute;&eacute; nouvel emplacement.";
#elif L==6
"Creada nueva ubicaci&oacute;n."; // Okoteve traducción
#elif L==7
"Creata nuova posizione.";
#elif L==8
"Utworzono nowe lokacja.";
#elif L==9
"Criado nova localiza&ccedil;&atilde;o.";
#endif
const char *Txt_Created_new_place_X = // Warning: it is very important to include %s in the following sentences
#if L==1
"Creado nuevo lugar <strong>%s</strong>."; // Necessita traduccio
@ -17049,25 +17091,153 @@ const char *Txt_Local_address =
const char *Txt_Location =
#if L==1
"Lloc";
"Ubicaci&oacute;";
#elif L==2
"Standort";
#elif L==3
"Location";
#elif L==4
"Sitio";
"Ubicaci&oacute;n";
#elif L==5
"Emplacement";
#elif L==6
"Sitio"; // Okoteve traducción
"Ubicaci&oacute;n"; // Okoteve traducción
#elif L==7
"Locazione";
"Posizione";
#elif L==8
"Lokalizacja";
"Lokacja";
#elif L==9
"Site";
"Localiza&ccedil;&atilde;o";
#endif
const char *Txt_Location_removed =
#if L==1
"Ubicaci&oacute; eliminada.";
#elif L==2
"Standort entfernt.";
#elif L==3
"Location removed.";
#elif L==4
"Ubicaci&oacute;n eliminada.";
#elif L==5
"Emplacement supprim&eacute;.";
#elif L==6
"Ubicaci&oacute;n eliminada."; // Okoteve traducción
#elif L==7
"Posizione rimossa.";
#elif L==8
"Lokacja usuniete.";
#elif L==9
"Localiza&ccedil;&atilde;o removida.";
#endif
const char *Txt_Locations =
#if L==1
"Ubicacions";
#elif L==2
"Standorte";
#elif L==3
"Locations";
#elif L==4
"Ubicaciones";
#elif L==5
"Emplacements";
#elif L==6
"Ubicaci&oacute;n"; // Okoteve traducción
#elif L==7
"Posizioni";
#elif L==8
"Lokalizacje";
#elif L==9
"Localiza&ccedil;&otilde;es";
#endif
const char *Txt_LOCATIONS_HELP_ORDER[2] =
{
#if L==1
"Ordenar por fecha inicial" // Necessita traduccio
#elif L==2
"Sortieren nach Startdatum"
#elif L==3
"Sort by start date"
#elif L==4
"Ordenar por fecha inicial"
#elif L==5
"Trier par date initiale"
#elif L==6
"Ordenar por fecha inicial" // Okoteve traducción
#elif L==7
"Ordina per data iniziale"
#elif L==8
"Sortuj wedlug daty rozpoczecia"
#elif L==9
"Classificar por data de in&iacute;cio"
#endif
,
#if L==1
"Ordenar por fecha final" // Necessita traduccio
#elif L==2
"Sortieren nach Enddatum"
#elif L==3
"Sort by end date"
#elif L==4
"Ordenar por fecha final"
#elif L==5
"Trier par date finale"
#elif L==6
"Ordenar por fecha final" // Okoteve traducción
#elif L==7
"Ordina per data finale"
#elif L==8
"Sortuj wedlug daty koncowa"
#elif L==9
"Classificar por data final"
#endif
};
const char *Txt_LOCATIONS_ORDER[2] =
{
#if L==1
"Data inicial"
#elif L==2
"Startdatum"
#elif L==3
"Start date"
#elif L==4
"Fecha inicial"
#elif L==5
"Date initiale"
#elif L==6
"Fecha inicial" // Okoteve traducción
#elif L==7
"Data iniziale"
#elif L==8
"Data rozpoczecia"
#elif L==9
"Data de in&iacute;cio"
#endif
,
#if L==1
"Data final"
#elif L==2
"Enddatum"
#elif L==3
"End date"
#elif L==4
"Fecha final"
#elif L==5
"Date finale"
#elif L==6
"Fecha final" // Okoteve traducción
#elif L==7
"Data finale"
#elif L==8
"Data koncowa"
#elif L==9
"Data final"
#endif
};
const char *Txt_LOG_More_info =
#if L==1
"Observaciones"; // Necessita traduccio
@ -23502,6 +23672,27 @@ const char *Txt_New_link =
"Nova liga&ccedil;&atilde;o";
#endif
const char *Txt_New_location =
#if L==1
"Nova ubicaci&oacute;";
#elif L==2
"Neue Standort";
#elif L==3
"New location";
#elif L==4
"Nueva ubicaci&oacute;n";
#elif L==5
"Nouvel emplacement";
#elif L==6
"Nueva ubicaci&oacute;n"; // Okoteve traducción
#elif L==7
"Nuova posizione";
#elif L==8
"Nowe lokacja";
#elif L==9
"Nova localiza&ccedil;&atilde;o";
#endif
const char *Txt_New_message =
#if L==1
"Nou missatge";
@ -42096,6 +42287,27 @@ const char *Txt_The_date_of_the_holiday_X_has_changed_to_Y = // Warning: it is v
"The date of the holiday <strong>%s</strong> has changed to <strong>%s</strong>."; // Necessita de tradução
#endif
const char *Txt_The_date_of_the_location_has_changed_to_X = // Warning: it is very important to include %s in the following sentences
#if L==1
"La fecha de la festividad ha cambiado a <strong>%s</strong>."; // Necessita traduccio
#elif L==2
"The date of the location has changed to <strong>%s</strong>."; // Need Übersetzung
#elif L==3
"The date of the location has changed to <strong>%s</strong>.";
#elif L==4
"La fecha de la ubicaci&oacute;n ha cambiado a <strong>%s</strong>.";
#elif L==5
"The date of the location has changed to <strong>%s</strong>."; // Besoin de traduction
#elif L==6
"La fecha de la ubicaci&oacute;n ha cambiado a <strong>%s</strong>."; // Okoteve traducción
#elif L==7
"La data delle posizione &egrave; cambiata a <strong>%s</strong>.";
#elif L==8
"The date of the location has changed to <strong>%s</strong>."; // Potrzebujesz tlumaczenie
#elif L==9
"The date of the location has changed to <strong>%s</strong>."; // Necessita de tradução
#endif
const char *Txt_The_date_range_must_be_less_than_or_equal_to_X_days = // Warning: it is very important to include %u in the following sentences
#if L==1
"El rango de fechas debe ser menor o igual a %u d&iacute;as."; // Necessita traduccio
@ -43119,6 +43331,27 @@ const char *Txt_The_institution_X_already_exists = // Warning: it is very import
"The institution <strong>%s</strong> already exists."; // Necessita de tradução
#endif
const char *Txt_The_institution_X_has_been_renamed_as_Y = // Warning: it is very important to include two %s in the following sentences
#if L==1
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>."; // Necessita traduccio
#elif L==2
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Need Übersetzung
#elif L==3
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>.";
#elif L==4
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>.";
#elif L==5
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Besoin de traduction
#elif L==6
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>."; // Okoteve traducción
#elif L==7
"L'istituzione <strong>%s</strong> &egrave; stata rinominata <strong>%s</strong>.";
#elif L==8
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Potrzebujesz tlumaczenie
#elif L==9
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Necessita de tradução
#endif
const char *Txt_The_institution_of_the_centre_has_changed =
#if L==1
"La instituci&oacute;n del centro ha cambiado."; // Necessita traduccio
@ -43347,6 +43580,48 @@ const char *Txt_The_list_of_X_users_is_too_large_to_be_displayed = // Warning: i
"The list of %u users is too large to be displayed."; // Necessita de tradução
#endif
const char *Txt_The_location_has_changed_to_X = // Warning: it is very important to include %s in the following sentences
#if L==1
"La ubicaci&oacute; ha canviat a <strong>%s</strong>.";
#elif L==2
"Der Standort wurde in <strong>%s</strong> ge&auml;ndert.";
#elif L==3
"The location has changed to <strong>%s</strong>.";
#elif L==4
"La ubicaci&oacute;n ha cambiado a <strong>%s</strong>.";
#elif L==5
"L'emplacement a chang&eacute; en <strong>%s</strong>.";
#elif L==6
"La ubicaci&oacute;n ha cambiado a <strong>%s</strong>."; // Okoteve traducción
#elif L==7
"La posizione &egrave; cambiato a <strong>%s</strong>.";
#elif L==8
"Zmieniona na miejscu <strong>%s</strong>.";
#elif L==9
"A localiza&ccedil;&atilde;o mudou para <strong>%s</strong>.";
#endif
const char *Txt_The_location_has_not_changed =
#if L==1
"La ubicaci&oacute; no ha canviat.";
#elif L==2
"Der Standort wurde nicht ge&auml;ndert.";
#elif L==3
"The location has not changed.";
#elif L==4
"La ubicaci&oacute;n no ha cambiado.";
#elif L==5
"L'emplacement n'a pas chang&eacute;.";
#elif L==6
"La ubicaci&oacute;n no ha cambiado."; // Okoteve traducción
#elif L==7
"La posizione non &egrave; cambiato.";
#elif L==8
"Miejsca nie uleg&lstrok;a zmianie.";
#elif L==9
"A localiza&ccedil;&atilde;o n&atilde;o foi alterado.";
#endif
const char *Txt_The_lower_limit_of_correct_answers_must_be_less_than_or_equal_to_the_upper_limit =
#if L==1
"El l&iacute;mite inferior del intervalo de respuestas correctas"
@ -43782,27 +44057,6 @@ const char *Txt_The_name_of_the_holiday_X_has_not_changed = // Warning: it is ve
"The name of the holiday <strong>%s</strong> has not changed."; // Necessita de tradução
#endif
const char *Txt_The_institution_X_has_been_renamed_as_Y = // Warning: it is very important to include two %s in the following sentences
#if L==1
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>."; // Necessita traduccio
#elif L==2
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Need Übersetzung
#elif L==3
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>.";
#elif L==4
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>.";
#elif L==5
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Besoin de traduction
#elif L==6
"La instituci&oacute;n <strong>%s</strong> ha pasado a denominarse <strong>%s</strong>."; // Okoteve traducción
#elif L==7
"L'istituzione <strong>%s</strong> &egrave; stata rinominata <strong>%s</strong>.";
#elif L==8
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Potrzebujesz tlumaczenie
#elif L==9
"The institution <strong>%s</strong> has been renamed as <strong>%s</strong>."; // Necessita de tradução
#endif
const char *Txt_The_name_of_the_institution_X_has_not_changed = // Warning: it is very important to include %s in the following sentences
#if L==1
"El nombre de la instituci&oacute;n <strong>%s</strong> no ha cambiado."; // Necessita traduccio
@ -46380,6 +46634,27 @@ const char *Txt_There_are_no_links =
"There are no links."; // Necessita de tradução
#endif
const char *Txt_There_are_no_locations =
#if L==1
"No hi ha ubicacions.";
#elif L==2
"Es gibt keine Standorte.";
#elif L==3
"There are no locations.";
#elif L==4
"No existen ubicaciones.";
#elif L==5
"Il n'y a pas d'emplacements.";
#elif L==6
"No existen ubicaciones."; // Okoteve traducción
#elif L==7
"Non ci sono posizioni.";
#elif L==8
"Brak lokalizacje.";
#elif L==9
"N&atilde;o existem localiza&ccedil;&otilde;es.";
#endif
const char *Txt_There_are_no_places =
#if L==1
"No existen lugares."; // Necessita traduccio
@ -51894,6 +52169,27 @@ const char *Txt_You_can_not_leave_the_IP_address_empty =
"You can not leave the IP address empty."; // Necessita de tradução
#endif
const char *Txt_You_can_not_leave_the_location_empty =
#if L==1
"No es pot deixar la ubicaci&oacute; buido.";
#elif L==2
"Sie k&ouml;nnen den Standort nicht leer lassen.";
#elif L==3
"You can not leave the location empty.";
#elif L==4
"No puede dejar la ubicaci&oacute;n vac&iacute;a.";
#elif L==5
"Vous ne pouvez pas laisser l'emplacement vide.";
#elif L==6
"No puede dejar la ubicaci&oacute;n vac&iacute;a."; // Okoteve traducción
#elif L==7
"Non puoi lasciare la posizione vuota.";
#elif L==8
"Nie mo&zdot;na pozostawi&cacute; miejsca pustego.";
#elif L==9
"Voc&ecirc; n&atilde;o pode deixar a localiza&ccedil;&atilde;o vazia.";
#endif
const char *Txt_You_can_not_leave_the_logo_empty =
#if L==1
"No puede dejar el logo vac&iacute;o."; // Necessita traduccio
@ -52095,6 +52391,36 @@ const char *Txt_You_can_not_leave_the_name_of_the_department_X_empty = // Warnin
" of the department <strong>%s</strong> empty."; // Necessita de tradução
#endif
const char *Txt_You_can_not_leave_the_name_of_the_email_domain_X_empty = // Warning: it is very important to include %s in the following sentences
#if L==1
"No puede dejar el nombre "
"del dominio de correo <strong>%s</strong> vac&iacute;o."; // Necessita traduccio
#elif L==2
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Need Übersetzung
#elif L==3
"You can not leave the name"
" of the email domain <strong>%s</strong> empty.";
#elif L==4
"No puede dejar el nombre"
" del dominio de correo <strong>%s</strong> vac&iacute;o.";
#elif L==5
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Besoin de traduction
#elif L==6
"No puede dejar el nombre"
" del dominio de correo <strong>%s</strong> vac&iacute;o."; // Okoteve traducción
#elif L==7
"Non puoi lasciare il nome"
" del campo mail <strong>%s</strong> vuoto.";
#elif L==8
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Potrzebujesz tlumaczenie
#elif L==9
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Necessita de tradução
#endif
const char *Txt_You_can_not_leave_the_name_of_the_field_X_empty = // Warning: it is very important to include %s in the following sentences
#if L==1
"No puede dejar el nombre"
@ -52245,36 +52571,6 @@ const char *Txt_You_can_not_leave_the_name_of_the_link_X_empty = // Warning: it
" of the link <strong>%s</strong> empty."; // Necessita de tradução
#endif
const char *Txt_You_can_not_leave_the_name_of_the_email_domain_X_empty = // Warning: it is very important to include %s in the following sentences
#if L==1
"No puede dejar el nombre "
"del dominio de correo <strong>%s</strong> vac&iacute;o."; // Necessita traduccio
#elif L==2
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Need Übersetzung
#elif L==3
"You can not leave the name"
" of the email domain <strong>%s</strong> empty.";
#elif L==4
"No puede dejar el nombre"
" del dominio de correo <strong>%s</strong> vac&iacute;o.";
#elif L==5
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Besoin de traduction
#elif L==6
"No puede dejar el nombre"
" del dominio de correo <strong>%s</strong> vac&iacute;o."; // Okoteve traducción
#elif L==7
"Non puoi lasciare il nome"
" del campo mail <strong>%s</strong> vuoto.";
#elif L==8
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Potrzebujesz tlumaczenie
#elif L==9
"You can not leave the name"
" of the email domain <strong>%s</strong> empty."; // Necessita de tradução
#endif
const char *Txt_You_can_not_leave_the_name_of_the_place_X_empty = // Warning: it is very important to include %s in the following sentences
#if L==1
"No puede dejar el nombre"
@ -53796,6 +54092,27 @@ const char *Txt_You_must_specify_the_name_of_the_new_type_of_group =
"You must specify the name of the new type of group."; // Necessita de tradução
#endif
const char *Txt_You_must_specify_the_new_location =
#if L==1
"Cal especificar la nova ubicaci&oacute;.";
#elif L==2
"Sie m&uuml;ssen den neuen Speicherort angeben.";
#elif L==3
"You must specify the new location.";
#elif L==4
"Debe especificar la nueva ubicaci&oacute;n.";
#elif L==5
"Vous devez sp&eacute;cifier le nouvel emplacement.";
#elif L==6
"Debe especificar la nueva ubicaci&oacute;n."; // Okoteve traducción
#elif L==7
"Devi specificare la nuova posizione.";
#elif L==8
"Musisz poda&cacute; nazw&eogon; nowej lokalizacji.";
#elif L==9
"Voc&ecirc; deve especificar a nova localiza&ccedil;&atilde;o.";
#endif
const char *Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_banner =
#if L==1
"Debe especificar el nombre breve y el nombre completo"