Version 15.237.1

This commit is contained in:
Antonio Cañas Vargas 2016-07-01 11:38:53 +02:00
parent 5796cd39fc
commit 2c70fc6956
11 changed files with 954 additions and 1450 deletions

View File

@ -58,13 +58,621 @@
<tr>
<td align="center">
Last update: April 18, 2016
Last update: June 13, 2016
</td>
</tr>
<tr>
<td align="left">
<dl>
<dt>Version 15.224.3: Jun 13, 2016</dt>
<dd>
Fix bug while finding cell content in file of marks. (202266 lines)
</dd>
<dt>Version 15.224.2: Jun 12, 2016</dt>
<dd>
Info about number of files is moved to bottom of file browsers. (202266 lines)
</dd>
<dt>Version 15.224.1: Jun 12, 2016</dt>
<dd>
Change in layout of file browsers. (202266 lines)
</dd>
<dt>Version 15.224: Jun 12, 2016</dt>
<dd>
Now a user can unfollow users followed by him/her whose profile is not visible.<br />
Code refactoring in list of follwing/followers. (202304 lines)
</dd>
<dt>Version 15.223.3: Jun 12, 2016</dt>
<dd>
Fixed layout of list of forums. (202282 lines)
</dd>
<dt>Version 15.223.2: Jun 12, 2016</dt>
<dd>
Fixed bug in results of search of students. (202277 lines)
</dd>
<dt>Version 15.223.1: Jun 12, 2016</dt>
<dd>
Show only users to follow with first name and surname 1. (202276 lines)
</dd>
<dt>Version 15.223: Jun 12, 2016</dt>
<dd>
New forms to change course configuration. (202268 lines)<br />
4 changes necessary in database:<br />
<small><code>
UPDATE actions SET Txt='Cambiar c&oacute;d. institucional asignatura' WHERE ActCod='1024' AND Language='es';<br />
UPDATE actions SET Txt='Cambiar c&oacute;d. institucional asignatura' WHERE ActCod='1025' AND Language='es';<br />
UPDATE actions SET Txt='Cambiar a&ntilde;o/semestre asignatura' WHERE ActCod='561' AND Language='es';<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1573','es','N','Cambiar a&ntilde;o/semestre asignatura');
</code></small>
</dd>
<dt>Version 15.222.6: Jun 11, 2016</dt>
<dd>
Fixed layout in students column in result of search of teachers. (202214 lines)
</dd>
<dt>Version 15.222.5: Jun 10, 2016</dt>
<dd>
Indicators of a course are always calculated and stored in course configuration. (202214 lines)
</dd>
<dt>Version 15.222.4: Jun 09, 2016</dt>
<dd>
Code refactoring in indicators. (202208 lines)
</dd>
<dt>Version 15.222.3: Jun 09, 2016</dt>
<dd>
Indicators form is sended automatically when any parameter changes. (202214 lines)
</dd>
<dt>Version 15.222.2: Jun 09, 2016</dt>
<dd>
Code refactoring in indicators. (202233 lines)
</dd>
<dt>Version 15.222.1: Jun 09, 2016</dt>
<dd>
Optimization in number of indicators. (202230 lines)
</dd>
<dt>Version 15.222: Jun 09, 2016</dt>
<dd>
Number of indicators is stored in table of courses. (202224 lines)
</dd>
<dt>Version 15.221.4: Jun 09, 2016</dt>
<dd>
New columns in table of courses to store number of indicators. (202153 lines)<br />
1 change necessary in database:<br />
<small><code>
ALTER TABLE courses ADD COLUMN NumIndicators INT NOT NULL DEFAULT -1 AFTER FullName;
</code></small>
</dd>
<dt>Version 15.221.3: Jun 08, 2016</dt>
<dd>
Fix bug in calculation of number of files in groups of a course. (202146 lines)
</dd>
<dt>Version 15.221.2: Jun 08, 2016</dt>
<dd>
Fix bug in calculation of number of files in groups of a course. (202149 lines)
</dd>
<dt>Version 15.221.1: Jun 08, 2016</dt>
<dd>
Fix bug in form of indicators.<br />
Speed up database queries to get course info when getting indicators. (? lines)
</dd>
<dt>Version 15.221: Jun 08, 2016</dt>
<dd>
Single (radio) selection of number of indicators changed to multiple (checkbox) selection. (202028 lines)
</dd>
<dt>Version 15.220.1: Jun 08, 2016</dt>
<dd>
Code refactoring in form to view indicators of courses. (202031 lines)
</dd>
<dt>Version 15.220: Jun 08, 2016</dt>
<dd>
Number of indicators now appears inside form. (202029 lines)
</dd>
<dt>Version 15.219.1: Jun 05, 2016</dt>
<dd>
Highlighted row with number of indicators selected. (202023 lines)
</dd>
<dt>Version 15.219: Jun 04, 2016</dt>
<dd>
Changes in listing of indicators of courses. (202001 lines)
</dd>
<dt>Version 15.218.5: Jun 04, 2016</dt>
<dd>
Fix bug in social notes, reported by Raymon Moreno Colina. (201940 lines)<br />
2 changes necessary in database:<br />
<small><code>
DROP INDEX NoteType ON social_notes;<br />
CREATE INDEX NoteType ON social_notes (NoteType,Cod);
</code></small>
</dd>
<dt>Version 15.218.4: Jun 04, 2016</dt>
<dd>
User can change license of files in briefcase.<br />
Code refactoring related to file metadata. (201936 lines)
</dd>
<dt>Version 15.218.3: Jun 04, 2016</dt>
<dd>
Code refactoring related to setlocale. (201952 lines)
</dd>
<dt>Version 15.218.2: Jun 04, 2016</dt>
<dd>
Checked value returned by setlocale in all calls. (201957 lines)
</dd>
<dt>Version 15.218.1: Jun 04, 2016</dt>
<dd>
Change in listing of courses. (201934 lines)
</dd>
<dt>Version 15.218: Jun 03, 2016</dt>
<dd>
New module swad_MFU for most frequently used actions.<br />
Change in layout of most frequent actions. (201934 lines)
</dd>
<dt>Version 15.217.2: Jun 03, 2016</dt>
<dd>
Fixed bug in copy-paste from briefcase to another file browser. (201827 lines)
</dd>
<dt>Version 15.217.1: Jun 03, 2016</dt>
<dd>
Fixed bug when creating zip file for students works, reported by Francisco Barranco Exp&oacute;sito. (201809 lines)
</dd>
<dt>Version 15.217: Jun 01, 2016</dt>
<dd>
When clicking on a social note associated to an exam announcement, show that exam announcement highlighted. (201801 lines)<br />
1 change necessary in database:<br />
<small><code>
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1572','es','N','Ver convocatoria');
</code></small>
</dd>
<dt>Version 15.216: Jun 01, 2016</dt>
<dd>
When clicking on a day on calendar, all exam announcements in that day are shown highlighted. (201751 lines)<br />
1 change necessary in database:<br />
<small><code>
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1571','es','N','Ver convocatorias de una fecha');
</code></small>
</dd>
<dt>Version 15.215: Jun 01, 2016</dt>
<dd>
List exam announcements as a list, like notices. (201670 lines)
</dd>
<dt>Version 15.214: May 31, 2016</dt>
<dd>
Fixed bug in renaming test tags. (201589 lines)
</dd>
<dt>Version 15.213: May 31, 2016</dt>
<dd>
Code refactoring related to renaming test tags.<br />
Fixed bug in dates, reported by Christian A. Morillas Guti&eacute;rrez. (201581 lines)
</dd>
<dt>Version 15.212.9: May 30, 2016</dt>
<dd>
Link to list institutions of country in country configuration. (201567 lines)
</dd>
<dt>Version 15.212.8: May 30, 2016</dt>
<dd>
Link to list centres of institution in institution configuration. (201555 lines)
</dd>
<dt>Version 15.212.7: May 30, 2016</dt>
<dd>
Link to list degrees of centre in centre configuration. (201547 lines)
</dd>
<dt>Version 15.212.6: May 30, 2016</dt>
<dd>
Link to list courses of degree in degree configuration. (201539 lines)
</dd>
<dt>Version 15.212.5: May 30, 2016</dt>
<dd>
Fixed bug in number of courses of a degree. (201531 lines)
</dd>
<dt>Version 15.212.4: May 30, 2016</dt>
<dd>
Changed links from external degrees to internal degrees in STATS > Degrees. (201529 lines)
</dd>
<dt>Version 15.212.3: May 30, 2016</dt>
<dd>
Fixed bug in test question. A student can see now his/her test results. (201522 lines)
</dd>
<dt>Version 15.212.2: May 30, 2016</dt>
<dd>
Fixed bug in test question. Button &quot;Add a new question&quot; in tests will not be available for students. (201516 lines)
</dd>
<dt>Version 15.212.1: May 30, 2016</dt>
<dd>
Fixed bug in course information. (201515 lines)
</dd>
<dt>Version 15.212: May 30, 2016</dt>
<dd>
Fixed bug in edition of syllabus, reported by Raymon Moreno Colina and Javier Fern&aacute;ndez Baldomero.<br />
Code refactoring related to course info. (201471 lines)
</dd>
<dt>Version 15.211.2: May 13, 2016</dt>
<dd>
Fixed bug in test questions, reported by Nuria Torres Rosell. (201394 lines)
</dd>
<dt>Version 15.211.1: May 07, 2016</dt>
<dd>
Files in briefcase older than 1 year are removed automatically. (201397 lines)
</dd>
<dt>Version 15.211: May 07, 2016</dt>
<dd>
Code refactoring related to removing old files in briefcase.<br />
Old files in briefcase are removed automatically. (201396 lines)
</dd>
<dt>Version 15.210.4: May 05, 2016</dt>
<dd>
Link to change logo of degree is moved to top of window. (201385 lines)
</dd>
<dt>Version 15.210.3: May 05, 2016</dt>
<dd>
Link to change logo of centre is moved to top of window. (201407 lines)
</dd>
<dt>Version 15.210.2: May 05, 2016</dt>
<dd>
Link to change logo of institution is moved to top of window. (201399 lines)
</dd>
<dt>Version 15.210.1: May 05, 2016</dt>
<dd>
New icon to change logo of institution/centre/degree. (201388 lines)<br />
1 change necessary in icons:
<small><code>
Copy file icon/logo64x64.png to public icon directory
</code></small>
</dd>
<dt>Version 15.210: May 05, 2016</dt>
<dd>
Commands/shortcuts in record are removed from left of window. (201389 lines)
</dd>
<dt>Version 15.209: May 05, 2016</dt>
<dd>
Commands/shortcuts in record are cloned to top of window. (201614 lines)
</dd>
<dt>Version 15.208.6: May 05, 2016</dt>
<dd>
Integrated &quot;Configure&quot; link in tests at top of window, near &quot;Edit&quot; icon. (201463 lines)
</dd>
<dt>Version 15.208.5: May 05, 2016</dt>
<dd>
Changes in Statistics > Degrees. (201469 lines)
</dd>
<dt>Version 15.208.4: May 05, 2016</dt>
<dd>
In Statistics > Degrees, show all degrees with students. (201458 lines)
</dd>
<dt>Version 15.208.3: May 03, 2016</dt>
<dd>
Fixed bug in sessions database table when no social publishings available. (201446 lines)
</dd>
<dt>Version 15.208.2: May 01, 2016</dt>
<dd>
Add default values in some database fields. (201439 lines)<br />
1 change necessary in database:<br />
<small><code>
ALTER TABLE sessions CHANGE COLUMN SearchString SearchString VARCHAR(255) NOT NULL DEFAULT '';
</code></small>
</dd>
<dt>Version 15.208.2: May 01, 2016</dt>
<dd>
Fixed bug in user's last data. (201439 lines)
</dd>
<dt>Version 15.208.1: May 01, 2016</dt>
<dd>
Minor fix to avoid warning related to size_t. (201438 lines)
</dd>
<dt>Version 15.208: May 01, 2016</dt>
<dd>
Changes in config for swadberry.ugr.es.<br />
Removed cevuna.una.py from config. (201435 lines)
</dd>
<dt>Version 15.207.2: May 01, 2016</dt>
<dd>
Fixed bug in database table log_full. (201515 lines)
</dd>
<dt>Version 15.207.1: May 01, 2016</dt>
<dd>
Minor fix to avoid warning related to char type limits. (201515 lines)
</dd>
<dt>Version 15.207: May 01, 2016</dt>
<dd>
Add default values for fields in users' data table. (201514 lines)<br />
Birthday default value now is NULL.<br />
18 changes necessary in database:<br />
<small><code>
ALTER TABLE usr_data CHANGE COLUMN EncryptedUsrCod EncryptedUsrCod CHAR(43) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Password Password CHAR(86) COLLATE latin1_bin NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Surname1 Surname1 VARCHAR(32) COLLATE latin1_spanish_ci NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Surname2 Surname2 VARCHAR(32) COLLATE latin1_spanish_ci NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN FirstName FirstName VARCHAR(32) COLLATE latin1_spanish_ci NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Theme Theme CHAR(16) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN IconSet IconSet CHAR(16) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Language Language CHAR(2) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Photo Photo CHAR(43) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Office Office VARCHAR(127) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN OfficePhone OfficePhone CHAR(16) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN LocalAddress LocalAddress VARCHAR(127) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN LocalPhone LocalPhone CHAR(16) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN FamilyAddress FamilyAddress VARCHAR(127) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN FamilyPhone FamilyPhone CHAR(16) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN OriginPlace OriginPlace VARCHAR(127) NOT NULL DEFAULT '';<br />
ALTER TABLE usr_data CHANGE COLUMN Birthday Birthday DATE;<br />
UPDATE usr_data SET Birthday=NULL WHERE Birthday='0000-00-00';
</code></small>
</dd>
<dt>Version 15.206: Apr 30, 2016</dt>
<dd>
Remove default DATETIME fields to avoid errors if 0 is not allowed in date in database. (201424 lines)<br />
7 changes necessary in database:<br />
<small><code>
ALTER TABLE connected CHANGE COLUMN LastTime LastTime DATETIME NOT NULL;<br />
ALTER TABLE crs_grp_types CHANGE COLUMN OpenTime OpenTime DATETIME NOT NULL;<br />
ALTER TABLE crs_last CHANGE COLUMN LastTime LastTime DATETIME NOT NULL;<br />
ALTER TABLE sessions CHANGE COLUMN LastTime LastTime DATETIME NOT NULL;<br />
ALTER TABLE sessions CHANGE COLUMN LastRefresh LastRefresh DATETIME NOT NULL;<br />
ALTER TABLE usr_last CHANGE COLUMN LastTime LastTime DATETIME NOT NULL;<br />
ALTER TABLE usr_last CHANGE COLUMN LastAccNotif LastAccNotif DATETIME NOT NULL;
</code></small>
</dd>
<dt>Version 15.205: Apr 30, 2016</dt>
<dd>
New demo server added to swad_config.h: swadberry.ugr.es. (201409 lines)
</dd>
<dt>Version 15.204.1: Apr 25, 2016</dt>
<dd>
Fixed bug in changes in database necessary in version 15.201. (201366 lines)<br />
6 changes necessary in database:<br />
<small><code>
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1565','es','N','Solicitar conf. ID invitado');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1566','es','N','Solicitar conf. ID estudiante');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1567','es','N','Solicitar conf. ID profesor');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1568','es','N','Confirmar ID invitado');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1569','es','N','Confirmar ID estudiante');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1570','es','N','Confirmar ID profesor');
</code></small>
</dd>
<dt>Version 15.204: Apr 25, 2016</dt>
<dd>
New form to confirm another user's ID. (201326 lines)
</dd>
<dt>Version 15.203.6: Apr 24, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201295 lines)
</dd>
<dt>Version 15.203.5: Apr 24, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201230 lines)
</dd>
<dt>Version 15.203.4: Apr 23, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201140 lines)
</dd>
<dt>Version 15.203.3: Apr 23, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201113 lines)
</dd>
<dt>Version 15.203.2: Apr 23, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201104 lines)
</dd>
<dt>Version 15.203.1: Apr 23, 2016</dt>
<dd>
New form to confirm another user's ID. Not finished. (201090 lines)
</dd>
<dt>Version 15.203: Apr 23, 2016</dt>
<dd>
Changes in layout and CSS related to record card. (201076 lines)
</dd>
<dt>Version 15.202.19:Apr 23, 2016</dt>
<dd>
User's ID is shown in green or red in user's account. (201120 lines)
</dd>
<dt>Version 15.202.18:Apr 23, 2016</dt>
<dd>
Change of message about ID in user's account. (201092 lines)
</dd>
<dt>Version 15.202.17:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201081 lines)
</dd>
<dt>Version 15.202.16:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201070 lines)
</dd>
<dt>Version 15.202.15:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201059 lines)
</dd>
<dt>Version 15.202.14:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201048 lines)
</dd>
<dt>Version 15.202.13:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201037 lines)
</dd>
<dt>Version 15.202.12:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201026 lines)
</dd>
<dt>Version 15.202.11:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201014 lines)
</dd>
<dt>Version 15.202.10:Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (201000 lines)
</dd>
<dt>Version 15.202.9: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200987 lines)
</dd>
<dt>Version 15.202.8: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200979 lines)
</dd>
<dt>Version 15.202.7: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200964 lines)
</dd>
<dt>Version 15.202.6: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200949 lines)
</dd>
<dt>Version 15.202.5: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200934 lines)
</dd>
<dt>Version 15.202.4: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200926 lines)
</dd>
<dt>Version 15.202.3: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200911 lines)
</dd>
<dt>Version 15.202.2: Apr 23, 2016</dt>
<dd>
Code refactoring in record card. (200899 lines)
</dd>
<dt>Version 15.202.1: Apr 23, 2016</dt>
<dd>
Code refactoring related to showing user's e-mail. (200887 lines)
</dd>
<dt>Version 15.202: Apr 23, 2016</dt>
<dd>
User's IDs are show in green or red.<br />
Code refactoring and bug fixing related to showing user's ID and e-mail. (200908 lines)
</dd>
<dt>Version 15.201.9: Apr 22, 2016</dt>
<dd>
Code refactoring in record card.<br />
Changes in layout of record cards. (200895 lines)
</dd>
<dt>Version 15.201.8: Apr 22, 2016</dt>
<dd>
Code refactoring in record card.<br />
Fixed bugs in record cards. (200881 lines)
</dd>
<dt>Version 15.201.7: Apr 22, 2016</dt>
<dd>
Code refactoring in record card.<br />
Fixed bugs in record cards. (200862 lines)
</dd>
<dt>Version 15.201.6: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200842 lines)
</dd>
<dt>Version 15.201.5: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200832 lines)
</dd>
<dt>Version 15.201.4: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200822 lines)
</dd>
<dt>Version 15.201.3: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200812 lines)
</dd>
<dt>Version 15.201.2: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200806 lines)
</dd>
<dt>Version 15.201.1: Apr 22, 2016</dt>
<dd>
Code refactoring in record card. (200778 lines)
</dd>
<dt>Version 15.201: Apr 21, 2016</dt>
<dd>
New private file zone for the teachers who belong to a course. (200768 lines)<br />
82 changes necessary in database:<br />
<small><code>
CREATE TABLE notif_backup LIKE notif;<br />
INSERT INTO notif_backup SELECT * FROM notif;<br />
<br />
CREATE TABLE sta_notif_backup LIKE sta_notif;<br />
INSERT INTO sta_notif_backup SELECT * FROM sta_notif;<br />
<br />
CREATE TABLE usr_data_backup LIKE usr_data;<br />
INSERT INTO usr_data_backup SELECT * FROM usr_data;<br />
<br />
UPDATE notif SET NotifyEvent=19 WHERE NotifyEvent=18;<br />
UPDATE notif SET NotifyEvent=18 WHERE NotifyEvent=17;<br />
UPDATE notif SET NotifyEvent=17 WHERE NotifyEvent=16;<br />
UPDATE notif SET NotifyEvent=16 WHERE NotifyEvent=15;<br />
UPDATE notif SET NotifyEvent=15 WHERE NotifyEvent=14;<br />
UPDATE notif SET NotifyEvent=14 WHERE NotifyEvent=13;<br />
UPDATE notif SET NotifyEvent=13 WHERE NotifyEvent=12;<br />
UPDATE notif SET NotifyEvent=12 WHERE NotifyEvent=11;<br />
UPDATE notif SET NotifyEvent=11 WHERE NotifyEvent=10;<br />
UPDATE notif SET NotifyEvent=10 WHERE NotifyEvent=9;<br />
UPDATE notif SET NotifyEvent=9 WHERE NotifyEvent=8;<br />
UPDATE notif SET NotifyEvent=8 WHERE NotifyEvent=7;<br />
UPDATE notif SET NotifyEvent=7 WHERE NotifyEvent=6;<br />
UPDATE notif SET NotifyEvent=6 WHERE NotifyEvent=5;<br />
UPDATE notif SET NotifyEvent=5 WHERE NotifyEvent=4;<br />
UPDATE notif SET NotifyEvent=4 WHERE NotifyEvent=3;<br />
UPDATE notif SET NotifyEvent=3 WHERE NotifyEvent=2;<br />
<br />
UPDATE sta_notif SET NotifyEvent=19 WHERE NotifyEvent=18;<br />
UPDATE sta_notif SET NotifyEvent=18 WHERE NotifyEvent=17;<br />
UPDATE sta_notif SET NotifyEvent=17 WHERE NotifyEvent=16;<br />
UPDATE sta_notif SET NotifyEvent=16 WHERE NotifyEvent=15;<br />
UPDATE sta_notif SET NotifyEvent=15 WHERE NotifyEvent=14;<br />
UPDATE sta_notif SET NotifyEvent=14 WHERE NotifyEvent=13;<br />
UPDATE sta_notif SET NotifyEvent=13 WHERE NotifyEvent=12;<br />
UPDATE sta_notif SET NotifyEvent=12 WHERE NotifyEvent=11;<br />
UPDATE sta_notif SET NotifyEvent=11 WHERE NotifyEvent=10;<br />
UPDATE sta_notif SET NotifyEvent=10 WHERE NotifyEvent=9;<br />
UPDATE sta_notif SET NotifyEvent=9 WHERE NotifyEvent=8;<br />
UPDATE sta_notif SET NotifyEvent=8 WHERE NotifyEvent=7;<br />
UPDATE sta_notif SET NotifyEvent=7 WHERE NotifyEvent=6;<br />
UPDATE sta_notif SET NotifyEvent=6 WHERE NotifyEvent=5;<br />
UPDATE sta_notif SET NotifyEvent=5 WHERE NotifyEvent=4;<br />
UPDATE sta_notif SET NotifyEvent=4 WHERE NotifyEvent=3;<br />
UPDATE sta_notif SET NotifyEvent=3 WHERE NotifyEvent=2;<br />
<br />
UPDATE usr_data SET NotifNtfEvents = (((NotifNtfEvents & ~0x3) << 1) | (NotifNtfEvents & 0x3) | 0x04);<br />
UPDATE usr_data SET EmailNtfEvents = (((EmailNtfEvents & ~0x3) << 1) | (EmailNtfEvents & 0x3));<br />
<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1525','es','N','Administrar zona de profesores');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1526','es','N','Cambiar a admin. archivos prof.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1527','es','N','Administrar archivos prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1528','es','N','Solicitar elim. arch. prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1529','es','N','Eliminar archivo prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1530','es','N','Eliminar carpeta prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1531','es','N','Copiar de zona prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1532','es','N','Pegar en zona prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1533','es','N','Eliminar &aacute;rbol prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1534','es','N','Solic.nuevo arch/carp prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1535','es','N','Crear carpeta prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1536','es','N','Crear enlace prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1537','es','N','Renombrar carpeta prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1538','es','N','Subir archivo prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1539','es','N','Subir archivo prof. asg. (ant.)');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1540','es','N','Expandir carpeta prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1541','es','N','Contraer carpeta prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1542','es','N','Crear ZIP prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1543','es','N','Ver metadatos arch. prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1544','es','N','Cambiar metadatos arch. prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1545','es','N','Descargar arch. prof. asg.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1546','es','N','Administrar archivos prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1547','es','N','Solicitar elim. arch. prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1548','es','N','Eliminar archivo prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1549','es','N','Eliminar carpeta prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1550','es','N','Copiar de zona prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1551','es','N','Pegar en zona prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1552','es','N','Eliminar &aacute;rbol prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1553','es','N','Solic.nuevo arch/carp prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1554','es','N','Crear carpeta prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1555','es','N','Crear enlace prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1556','es','N','Renombrar carpeta prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1557','es','N','Subir archivo prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1558','es','N','Subir archivo prof. asg. (grp.)');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1559','es','N','Expandir carpeta prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1560','es','N','Contraer carpeta prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1561','es','N','Crear ZIP prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1562','es','N','Ver metadatos arch. prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1563','es','N','Cambiar metadatos arch. prof. grp.');<br />
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1564','es','N','Descargar arch. prof. grp.');
</code></small>
</dd>
<dt>Version 15.200.5: Apr 18, 2016</dt>
<dd>
Removed link to enter from external service. (199764 lines)
@ -698,7 +1306,7 @@ ALTER TABLE tst_questions ADD COLUMN Image CHAR(43) NOT NULL AFTER Stem;
</dd>
<dt>Version 15.163.1: Mar 27, 2016</dt>
<dd>
Added HTML directives "label" for scope and other form fields. (196654 lines)
Added HTML directives &quot;label&quot; for scope and other form fields. (196654 lines)
</dd>
<dt>Version 15.163: Mar 27, 2016</dt>
<dd>
@ -751,12 +1359,12 @@ Copy file recycle64x64.png to icon directory
</dd>
<dt>Version 15.161.2: Mar 24, 2016</dt>
<dd>
Removed contextual icon "update" integrated in frame in "enrollment requests". (196577 lines)
Removed contextual icon &quot;update&quot; integrated in frame in &quot;enrollment requests&quot;. (196577 lines)
</dd>
<dt>Version 15.161.1: Mar 24, 2016</dt>
<dd>
Code refactoring in forms to select roles.<br />
Put contextual icon "update" integrated in frame in "enrollment requests". (196598 lines)
Put contextual icon &quot;update&quot; integrated in frame in &quot;enrollment requests&quot;. (196598 lines)
</dd>
<dt>Version 15.161: Mar 24, 2016</dt>
<dd>
@ -768,11 +1376,11 @@ INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1522','es','N','Actu
</dd>
<dt>Version 15.160.4: Mar 24, 2016</dt>
<dd>
Put contextual icon "update" integrated in frame in "Connected users". (196543 lines)
Put contextual icon &quot;update&quot; integrated in frame in &quot;Connected users&quot;. (196543 lines)
</dd>
<dt>Version 15.160.3: Mar 24, 2016</dt>
<dd>
Put contextual icon "update" integrated in frame in "Who to follow". (196538 lines)
Put contextual icon &quot;update&quot; integrated in frame in &quot;Who to follow&quot;. (196538 lines)
</dd>
<dt>Version 15.160.2: Mar 22, 2016</dt>
<dd>
@ -1153,7 +1761,7 @@ UPDATE actions SET Obsolete='Y' WHERE ActCod='1006';
</dd>
<dt>Version 15.140: Mar 01, 2016</dt>
<dd>
New option "landing page". (195817 lines)<br />
New option &quot;landing page&quot;. (195817 lines)<br />
2 changes necessary in database:<br />
<small><code>
UPDATE actions SET Txt='Formularios cambiar rol y cerrar sesi&oacute;n' WHERE ActCod='843' AND Language='es';<br />
@ -1262,11 +1870,11 @@ UPDATE actions SET Obsolete='Y' WHERE ActCod IN ('550','551');
</dd>
<dt>Version 15.133.6: Jan 28, 2016</dt>
<dd>
Changes in layout of "Who to follow". (195287 lines)
Changes in layout of &quot;Who to follow&quot;. (195287 lines)
</dd>
<dt>Version 15.133.5: Jan 28, 2016</dt>
<dd>
Unlogged users can not view "Who to follow". (195276 lines)
Unlogged users can not view &quot;Who to follow&quot;. (195276 lines)
</dd>
<dt>Version 15.133.4: Jan 28, 2016</dt>
<dd>
@ -1646,7 +2254,7 @@ ALTER TABLE imported_sessions CHANGE SessionId SessionId CHAR(43) COLLATE latin1
</dd>
<dt>Version 15.118: Jan 18, 2016</dt>
<dd>
Change in privacy options (new value "unknown"). (192967 lines)<br />
Change in privacy options (new value &quot;unknown&quot;). (192967 lines)<br />
3 changes necessary in database:<br />
<small><code>
ALTER TABLE usr_data CHANGE COLUMN PhotoVisibility PhotoVisibility ENUM('unknown','user','course','system','world') NOT NULL DEFAULT 'unknown';<br />
@ -2599,7 +3207,7 @@ INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1490','es','N','Ver
<dd>
Fixed bug in privacy form.<br />
Privacy is moved to preferences.<br />
Default privacy is changed from "user" to "system". (187700 lines)
Default privacy is changed from &quot;user&quot; to &quot;system&quot;. (187700 lines)
</dd>
<dt>Version 15.72.7: Dec 24, 2015</dt>
<dd>

View File

@ -1135,9 +1135,9 @@
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',<br />
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',<br />
'0','1','2','3','4','5','6','7','8','9','-','_'<br />
<code>mysql&gt; INSERT INTO usr_data (EncryptedUsrCod) VALUES(@EncryptedUsrCod);</code><br />
<code>mysql&gt; INSERT INTO usr_data (EncryptedUsrCod,Comments) VALUES(@EncryptedUsrCod,'');</code><br />
<code>mysql&gt; INSERT INTO usr_IDs (UsrCod,UsrID,CreatTime,Confirmed) VALUES(LAST_INSERT_ID(),@MyID,NOW(),'Y');</code><br />
<code>mysql&gt; INSERT INTO deg_admin (UsrCod,DegCod) VALUES (LAST_INSERT_ID(),'-2');</code><br />
<code>mysql&gt; INSERT INTO admin (UsrCod,Scope,Cod) VALUES (LAST_INSERT_ID(),'Sys','0');</code><br />
<code>mysql&gt; quit</code>
</p>
@ -1208,7 +1208,13 @@
</ul>
<p>
Create the public directory <code>swad</code>, that will store the SWAD public content,
The directory <code>swad</code> inside <code>cgi-bin</code>,
will be created later.
</p>
<p>
Create the public directory <code>swad</code>,
that will store the SWAD public content,
inside the main public directory:
<table width="100%">
<tr>
@ -1574,7 +1580,7 @@
that can be downloaded from:<br />
<a href="http://www.cs.fsu.edu/~engelen/soap.html">http://www.cs.fsu.edu/~engelen/soap.html</a><br />
<a href="http://sourceforge.net/projects/gsoap2/files/">http://sourceforge.net/projects/gsoap2/files/</a><br />
(Tested with the version 2.8.18,
(Tested with the version 2.8.30,
probably more recent versions also work.)
</p>
@ -1585,12 +1591,12 @@
Go to directory <code>/home/&lt;user_directory&gt;/swad/gsoap</code>:<br />
<code>cd /home/&lt;user_directory&gt;/swad/gsoap</code><br />
Download the file <code>gsoap_2.8.18.zip</code> (or later)
Download the file <code>gsoap_2.8.30.zip</code> (or later)
and copy it in <code>/home/&lt;user_directory&gt;/swad/gsoap</code><br />
<code>wget http://downloads.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.18.zip</code><br />
<code>wget http://downloads.sourceforge.net/project/gsoap2/gSOAP/gsoap_2.8.30.zip</code><br />
Uncompress gSOAP:<br />
<code>unzip gsoap_2.8.18.zip</code> (or later)<br />
<code>unzip gsoap_2.8.30.zip</code> (or later)<br />
It should have been created the directory <code>gsoap-2.8</code>. Go to that directory:<br />
<code>cd gsoap-2.8</code><br />
Configure:<br />
@ -1637,7 +1643,7 @@
<code>//gsoap swad service location: URL</code><br />
Replace <code>URL</code> (everything after the two points)
by our SWAD address,
for example <code>https://swad.ugr.es/</code> or <code>https://cevuna.una.py/swad/</code>,
for example <code>https://openswad.org/</code> or <code>https://swad.ugr.es/</code>,
and save the file.
</p>
@ -1665,10 +1671,17 @@
</tr>
</table>
</p>
<p>
Go to directory <code>/home/&lt;user_directory&gt;/swad/swad-core/sha2</code>:<br />
<code>cd /home/&lt;user_directory&gt;/swad/swad-core/sha2</code><br />
to compile <code>sha2</code>:<br />
<code>gcc -O2 -c sha2.c -o sha2.o</code>
</p>
<p>
Return to directory <code>/home/&lt;user_directory&gt;/swad/swad-core</code>:<br />
<code>cd /home/&lt;user_directory&gt;/swad/swad-core</code><br />
<code>cd /home/&lt;user_directory&gt;/swad/swad-core</code>
</p>
<p>

View File

@ -40,7 +40,7 @@
<td align="center">
<h1>Source code</h1>
<a href="http://creativecommons.org/licenses/by-sa/3.0/deed.es_ES" title="License of text on this page" class="COPYRIGHT"><img src="/img/cc-by-sa.png" style="width:88px; height=31px; vertical-align:middle;" alt="CC BY-SA" /></a>
<a href="http://www.ugr.es/~acanas/">Antonio Ca&ntilde;as Vargas</a>, 1999-2015
<a href="http://www.ugr.es/~acanas/">Antonio Ca&ntilde;as Vargas</a>, 1999-2016
</td>
</tr>
@ -105,7 +105,6 @@
</p>
<h3>Main core (<code>swad-core</code>)</h3>
<a href="img/lineas-codigo-modulo-principal.png"><img src="img/lineas-codigo-modulo-principal.png" width="50%" height="50%" border="0" alt="Main swad core code lines" align="right" hspace="30" vspace="30"></a>
<p align="justify">
Programmed by <a href="https://github.com/acanas">Antonio Ca&ntilde;as Vargas</a>.
@ -123,15 +122,19 @@
<a href="http://en.wikipedia.org/wiki/Database">database management system</a>
<a href="http://www.mysql.com/">MySQL</a> or <a href="https://mariadb.org/">MariaDB</a>.
The reader will probably think &quot;a web application written in C?&quot;
Yes, it is not usual, <a href="http://www.youtube.com/watch?v=1S1fISh-pag">but... ;-)</a>
Yes, it is not usual, <a href="http://www.youtube.com/watch?v=1S1fISh-pag">but... ;-)</a>
A little more seriously, we could say that we have developed swad-core
following the philosophy of <a href="http://handmadedev.org/manifesto/">The Handmade Manifesto</a>.
</p>
<p align="justify">
SWAD core has about 185 000 <a href="http://en.wikipedia.org/wiki/Source_lines_of_code">lines of source code</a>.
Each executable program (one for each language) has a size of 1.85 <a href="http://en.wikipedia.org/wiki/Mebibyte">MiB</a>
SWAD core has about 200 000 <a href="http://en.wikipedia.org/wiki/Source_lines_of_code">lines of source code</a>.
Each executable program (one for each language) has a size of 1.8 <a href="http://en.wikipedia.org/wiki/Mebibyte">MiB</a>
and in most of the possible actions
generates the <a href="http://en.wikipedia.org/wiki/Web_page">page</a> in few milliseconds.
</p>
<a href="img/lineas-codigo-modulo-principal.png"><img src="img/lineas-codigo-modulo-principal.png" width="100%" height="50%" border="0" alt="Main swad core code lines" align="right" hspace="30" vspace="30"></a>
<p align="justify">
For <a href="http://en.wikipedia.org/wiki/Cryptography">encryption</a> of passwords

View File

@ -190,7 +190,8 @@
<li><a href="#getTests"><code>getTests</code></a></li>
<li style="margin-bottom:1em;"><a href="#getTrivialQuestion"><code>getTrivialQuestion</code></a></li>
<li style="margin-bottom:1em;"><a href="#getUsers"><code>getUsers</code></a></li>
<li><a href="#getUsers"><code>getUsers</code></a></li>
<li style="margin-bottom:1em;"><a href="#findUsers"><code>findUsers</code></a></li>
<li><a href="#getAttendanceEvents"><code>getAttendanceEvents</code></a></li>
<li><a href="#sendAttendanceEvent"><code>sendAttendanceEvent</code></a></li>
@ -278,9 +279,9 @@
with one of the following 4 values:
<ul>
<li><var>0</var>: unknown, an error has occurred.</li>
<li><var>1</var>: invited, not enrolled in any course.</li>
<li><var>1</var>: guest, not enrolled in any course.</li>
<li><var>2</var>: student in all his/her courses.</li>
<li><var>3</var>: teacher in at aleast one of his/her courses.</li>
<li><var>3</var>: teacher in at least one of his/her courses.</li>
</ul>
</li>
</ul>
@ -321,9 +322,9 @@
with one of the following 4 values:
<ul>
<li><var>0</var>: unknown, an error has occurred.</li>
<li><var>1</var>: invited, not enrolled in any course.</li>
<li><var>1</var>: guest, not enrolled in any course.</li>
<li><var>2</var>: student in all his/her courses.</li>
<li><var>3</var>: teacher in at aleast one of his/her courses.</li>
<li><var>3</var>: teacher in at least one of his/her courses.</li>
</ul>
</li>
<li><strong>degreeName</strong>: string.</li>
@ -517,7 +518,7 @@
If &lt; 0 &rArr; there is no limit of students in the group.</li>
<li><strong>numStudents</strong>: integer, current number of students in the group.</li>
<li><strong>fileZones</strong>: integer. If not 0 &rArr; the file zones for this group are enabled.</li>
<li><strong>member</strong>: integer. If not 0 &rArr; the logged user belongs to this group.</li>
<li><strong>member</strong>: integer. If not 0 &rArr; the requester belongs to this group.</li>
</ul>
</li>
</ul>
@ -527,7 +528,7 @@
<a name="sendMyGroups"><h3 class="WS_FUNCTION"><code>sendMyGroups</code></h3></a>
<p align="justify">
It sends to the server a list with all the groups in a course
to which the logged user wants to belong.
to which the requester wants to belong.
It tries to enroll the user in those groups if possible,
and remove from the groups not in the list.
If all the changes are not possible, no change is performed.
@ -569,7 +570,7 @@
<a name="getDirectoryTree"><h3 class="WS_FUNCTION"><code>getDirectoryTree</code></h3></a>
<p align="justify">
Returns the full tree of a file zone (documents, shared files or marks) in a course or a group.
The logged user must belong to the course or the group.
The requester must belong to the course or the group.
</p>
<ul>
<li>Call parameters:
@ -598,12 +599,12 @@
or <a href="#getFile"><code>getFile</code></a>:
<ul>
<li>
if the logged user is a student in the course/group,
if the requester is a student in the course/group,
the client should call <a href="#getMarks"><code>getMarks</code></a>
to view the student's specific marks.
</li>
<li>
if the logged user is a teacher in the course/group,
if the requester is a teacher in the course/group,
the client should call <a href="#getFile"><code>getFile</code></a>
to download the HTML file with the marks of several students.
</li>
@ -656,7 +657,7 @@
<p align="justify">
This function must be called each time the user wants to download a file
from a documents zone or a shared files zone in a course or a group.
The logged user must belong to the course or group.
The requester must belong to the course or group.
The function counts the access as a visit to the file
and returns information about the file.
</p>
@ -668,13 +669,22 @@
<a href="#loginBySessionKey"><code>loginBySessionKey</code></a>.
</li>
<li><strong>fileCode</strong>: integer,
corresponding to an element <code>&lt;code&gt;</code>
of the XML tree returned by <a href="#getDirectoryTree"><code>getDirectoryTree</code></a>.
If the file code corresponds to an HTML file of marks
(<code>treeCode</code> = 3 in <a href="#getDirectoryTree"><code>getDirectoryTree</code></a>,
the requester should be a student in the course/group.
If the logged user is a teacher, the client should call
<a href="#getMarks"><code>getMarks</code></a> instead <code>getFile</code>.
corresponding to:
<ul>
<li>an element <code>&lt;code&gt;</code>
of the XML tree returned by
<a href="#getDirectoryTree"><code>getDirectoryTree</code></a>.
</li>
<li>the value of <code>eventCode</code>
returned by <a href="#getNotifications"><code>getNotifications</code></a>
if <code>eventType</code> is <var>documentFile</var> or <var>sharedFile</var>.
</li>
<li>the value of <code>eventCode</code>
returned by <a href="#getNotifications"><code>getNotifications</code></a>
if the requester is a teacher and
<code>eventType</code> is <var>marksFile</var>.
</li>
</ul>
</li>
</ul>
</li>
@ -701,10 +711,11 @@
<a name="getMarks"><h3 class="WS_FUNCTION"><code>getMarks</code></h3></a>
<p align="justify">
Returns information about the marks (qualifications, scores) of the logged user (requester)
Returns information about the marks (qualifications, scores) of the requester
from a given HTML file of marks.
This function is allowed only for students. The requester must be a student in the course/group.
If the logged user is a teacher, the client should call
This function is allowed <strong>only for students</strong>.
The requester must be a student in the course/group.
If the requester is a teacher, the client should call
<a href="#getFile"><code>getFile</code></a> instead of <code>getMarks</code>.
</p>
<ul>
@ -714,9 +725,18 @@
<a href="#loginByUserPasswordKey"><code>loginByUserPasswordKey</code></a> or
<a href="#loginBySessionKey"><code>loginBySessionKey</code></a>.</li>
<li><strong>fileCode</strong>: integer,
corresponding to an element <code>&lt;code&gt;</code>
of the XML tree returned
by <a href="#getDirectoryTree"><code>getDirectoryTree</code></a>.</li>
corresponding to:
<ul>
<li>an element <code>&lt;code&gt;</code>
of the XML tree returned by
<a href="#getDirectoryTree"><code>getDirectoryTree</code></a>.
</li>
<li>the value of <code>eventCode</code>
returned by <a href="#getNotifications"><code>getNotifications</code></a>
if the requester is a student and
<code>eventType</code> is <var>marksFile</var>.
</li>
</ul>
</ul>
</li>
<li>Returns a data structure with the following fields:
@ -894,10 +914,10 @@
<hr />
<a name="getUsers" ><h3 class="WS_FUNCTION"><code>getUsers</code></h3></a>
<a name="getUsers"><h3 class="WS_FUNCTION"><code>getUsers</code></h3></a>
<p align="justify">
Returns the list of users of a given type (students or teachers)
enrolled in a course and group (code of group &lt;= 0 means the whole course).
Returns the list of users with a given role (students or teachers)
enrolled in a course (and optionally in some groups of the course).
</p>
<ul>
<li>Call parameters:
@ -905,11 +925,16 @@
<li><strong>wsKey</strong>: string, identifier returned by
<a href="#loginByUserPasswordKey"><code>loginByUserPasswordKey</code></a> or
<a href="#loginBySessionKey"><code>loginBySessionKey</code></a>.</li>
<li><strong>courseCode</strong>: integer.</li>
<li><strong>groupCode</strong>: integer (&lt;= 0 means the whole course).</li>
<li><strong>userRole</strong>: integer, role of the users to be listed
(2=students;
3=teachers)
<li><strong>courseCode</strong>: integer</li>
<li><strong>groups</strong>: string.
List of codes of groups (each code is an integer number, all the groups must belong to the course).<br />
If the list is empty, the whole course will be used. </li>
<li><strong>userRole</strong>: integer, role of the users to be listed,
with one of the following 2 values:
<ul>
<li><var>2</var>: students.</li>
<li><var>3</var>: teachers.</li>
</ul>
</li>
</ul>
</li>
@ -940,12 +965,82 @@
</li>
</ul>
<a name="findUsers"><h3 class="WS_FUNCTION"><code>findUsers</code></h3></a>
<p align="justify">
Returns a list of users whose full name contains the words given in filter.
</p>
<ul>
<li>Call parameters:
<ul>
<li><strong>wsKey</strong>: string, identifier returned by
<a href="#loginByUserPasswordKey"><code>loginByUserPasswordKey</code></a> or
<a href="#loginBySessionKey"><code>loginBySessionKey</code></a>.</li>
<li><strong>courseCode</strong>: integer
(&le; 0 &rArr; users from the whole platform;
&gt; 0 &rArr; users from the course given by <code>courseCode</code>).
</li>
<li><strong>filter</strong>: string, one or several words separated by spaces.<br />
Only those users whose full name will contain
all the words in <code>filter</code> as substrings will be returned,
provided that the two following conditions are satisfied:
<ul>
<li>The length of the longest word in <code>filter</code> must be &ge; a given <var>n</var>.
Eg. For <var>n</var> = 3, &quot;Bruce Lee&quot; is valid, &quot;B Le&quot; is not valid.
</li>
<li>The total number of characters in all the words
(not counting spaces) must be &ge; a given <var>m</var>.
Eg. For <var>m</var> = 7, &quot;Bruce Lee&quot; is valid, but &quot;Bruce&quot; or &quot;Lee&quot; are not valid.
</li>
</ul>
<var>n</var> and <var>m</var> can change in the server side.
A client should delegate to the server.
If any of these two conditions is not satisfied,
a negative value is returned in <code>numUsers</code>, indicating filter too short.
</li>
<li><strong>userRole</strong>: integer, role of the users to be listed,
with one of the following 4 values:
<ul>
<li><var>0</var>: unknown, any role (guests, students, teachers).</li>
<li><var>1</var>: guests, not enrolled in any course.</li>
<li><var>2</var>: students.</li>
<li><var>3</var>: teachers.</li>
</ul>
</li>
</ul>
</li>
<li>Returns a data structure with the following fields:
<ul>
<li><strong>numUsers</strong>: integer, number of users found. If < 0 &rArr; filter is too short.</li>
<li><strong>usersArray</strong>: list of elements,
where each element is a data structure with the following fields:
<ul>
<li><strong>userCode</strong>: integer, unique identifier for each user.</li>
<li><strong>userNickname</strong>: string, user's nickname (without @).</li>
<li><strong>userID</strong>: string, DNI/passport of the user.
If the requester has permission to see the user's ID, the ID is shown.
If not, the ID is hidden.
</li>
<li><strong>userSurname1</strong>: string.</li>
<li><strong>userSurname2</strong>: string.</li>
<li><strong>userFirstname</strong>: string.</li>
<li><strong>userPhoto</strong>: string
with the full URL of a JPG image
of size 150 (width) &times; 200 (height).
If it is an empty string, the user
has no photo or it can not be shown.
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr />
<a name="getAttendanceEvents"><h3 class="WS_FUNCTION"><code>getAttendanceEvents</code></h3></a>
<p align="justify">
Returns the list of the attendance events in a course available for the logged user
(associated to the whole course or to the groups to which the logged user belongs).
Returns the list of the attendance events in a course available for the requester
(associated to the whole course or to the groups to which the requester belongs).
</p>
<ul>
<li>Call parameters:
@ -992,7 +1087,7 @@
<a name="sendAttendanceEvent"><h3 class="WS_FUNCTION"><code>sendAttendanceEvent</code></h3></a>
<p align="justify">
Sends an attendance event.
The logged user must be a teacher in the course.
The requester must be a teacher in the course.
</p>
<ul>
<li>Call parameters:
@ -1034,7 +1129,7 @@
<a name="getAttendanceUsers"><h3 class="WS_FUNCTION"><code>getAttendanceUsers</code></h3></a>
<p align="justify">
Returns the list of users (students) in an attendance event.
The logged user must be teacher in the selected course.
The requester must be teacher in the selected course.
</p>
<ul>
<li>Call parameters:
@ -1080,7 +1175,7 @@
who have attended to an attendance event.
All users in this list will be marked as present;
other users formerly marked as present will be marked as absent when <code>setOthersAsAbsent</code> = 1.
The logged user must be teacher in the selected course.
The requester must be teacher in the selected course.
</p>
<ul>
<li>Call parameters:
@ -1125,7 +1220,7 @@
<a name="getNotifications"><h3 class="WS_FUNCTION"><code>getNotifications</code></h3></a>
<p align="justify">
Returns the list of recent notifications for the logged user.
Returns the list of recent notifications for the requester.
</p>
<ul>
<li>Call parameters:
@ -1151,13 +1246,39 @@
When a user opens this notification,
you should call <a href="#markNotificationsAsRead"><code>markNotificationsAsRead</code></a> with this value.</li>
<li><strong>eventType</strong>: string,
with one of the following 18 values:
with one of the following 19 values:
<ol>
<li><var>documentFile</var>: document.</li>
<li><var>sharedFile</var>: shared file.</li>
<li><var>documentFile</var>: document.
To download the file, clients can call
<a href="#getFile"><code>getFile</code></a>
with the value returned in <code>eventCode</code>
as parameter <code>fileCode</code>.
</li>
<li><var>teachersFile</var>: teachers' file.</li>
<li><var>sharedFile</var>: shared file.
To download the file, clients can call
<a href="#getFile"><code>getFile</code></a>
with the value returned in <code>eventCode</code>
as parameter <code>fileCode</code>.
</li>
<li><var>assignment</var>: assignment.</li>
<li><var>examAnnouncement</var>: exam announcement.</li>
<li><var>marksFile</var>: marks/grades file.</li>
<li><var>marksFile</var>: marks/grades file.
<ul>
<li>If the requester is a student, <code>content</code>
will contain a full HTML page containing the marks of the requester.
The client application can also call <a href="#getMarks"><code>getMarks</code></a>
with the value returned in <code>eventCode</code>
as parameter <code>fileCode</code>.
</li>
<li>If the requester is a teacher,
and he/she wants to download the file,
the client application can call <a href="#getFile"><code>getFile</code></a>
with the value returned in <code>eventCode</code>
as parameter <code>fileCode</code>.
</li>
</ul>
</li>
<li><var>enrollmentStudent</var>: I have been enrolled in a course as a student.</li>
<li><var>enrollmentTeacher</var>: I have been enrolled in a course as a teacher.</li>
<li><var>enrollmentRequest</var>: enrollment request.</li>
@ -1254,7 +1375,7 @@
<a name="sendNotice"><h3 class="WS_FUNCTION"><code>sendNotice</code></h3></a>
<p align="justify">
Sends a public notice (yellow note) to a course.
The logged user must be a teacher in the course.
The requester must be a teacher in the course.
</p>
<ul>
<li>Call parameters:

File diff suppressed because it is too large Load Diff

View File

@ -2659,7 +2659,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActReqMsgUsr */{ 26, 3,TabMsg,ActReqMsgUsr ,0x1FC,0x1FC,0x1FC,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_FormMsgUsrs ,"editnewmsg64x64.gif" },
/* ActSeeRcvMsg */{ 3, 4,TabMsg,ActSeeRcvMsg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_ShowRecMsgs ,"recmsg64x64.gif" },
/* ActSeeSntMsg */{ 70, 5,TabMsg,ActSeeSntMsg ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_ShowSntMsgs ,"sntmsg64x64.gif" },
/* ActMaiStd */{ 100, 6,TabMsg,ActMaiStd ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Msg_ListEMails ,"email64x64.gif" },
/* ActMaiStd */{ 100, 6,TabMsg,ActMaiStd ,0x110,0x100,0x000,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Mai_ListEMails ,"email64x64.gif" },
// Actions not in menu:
/* ActWriAnn */{1237,-1,TabMsg,ActSeeAnn ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ann_ShowFormAnnouncement ,NULL},

View File

@ -126,20 +126,23 @@
// TODO: Put Raúl Hinojosa (iSWAD developer) in a row of marks file of EC (B,C) and publish file
// TODO: Check if white lines are correct when composing a message and clicking in "Show more recipients"
// TODO: Fill hidden subject and content of message in selectors of class photo / list
// TODO: Add path to information about file in notifications
// TODO: Add a new WS function to count the nunmber of users to return in call to function getUsers
// TODO: Add new WS functions to count the number of users to return in call to functions getUsers/findUsers?
/*****************************************************************************/
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 15.237 (2016-07-01)"
#define Log_PLATFORM_VERSION "SWAD 15.237.1 (2016-07-01)"
#define CSS_FILE "swad15.229.css"
#define JS_FILE "swad15.237.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.237.1: Jul 01, 2015 Code refactoring in function to send e-mail to students. (203254 lines)
Version 15.237: Jul 01, 2015 The form "Show more recipients" now have a hidden field with the content. (203243 lines)
Version 15.236: Jun 30, 2015 The form "Show more recipients" now have a hidden field with the subject. (? lines)
Version 15.235.1: Jun 30, 2015 Minor change in icon to download files. (203206 lines)

View File

@ -769,6 +769,139 @@ static void Mai_CreateMailDomain (struct Mail *Mai)
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
}
/*****************************************************************************/
/***** List the e-mails of all the students to creates an e-mail message *****/
/*****************************************************************************/
#define Mai_MAX_LENGTH_STR_ADDR (32*5000)
void Mai_ListEMails (void)
{
extern const char *The_ClassFormBold[The_NUM_THEMES];
extern const char *Txt_Students_who_have_accepted_and_who_have_e_mail;
extern const char *Txt_X_students_who_have_e_mail;
extern const char *Txt_X_students_who_have_accepted_and_who_have_e_mail;
extern const char *Txt_Create_e_mail_message;
unsigned NumUsr;
unsigned NumStdsWithEmail = 0;
unsigned NumAcceptedStdsWithEmail = 0;
char StrAddresses[Mai_MAX_LENGTH_STR_ADDR+1];
unsigned int LengthStrAddr = 0;
struct UsrData UsrDat;
/***** Form to select groups *****/
Grp_ShowFormToSelectSeveralGroups (ActMaiStd);
/***** Get and order list of students in this course *****/
Usr_GetListUsrs (Rol_STUDENT,Sco_SCOPE_CRS);
if (Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs)
{
if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs))
{
/***** Start of the frame used to list the e-mails *****/
Lay_StartRoundFrameTable (NULL,0,Txt_Students_who_have_accepted_and_who_have_e_mail);
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT_SMALL LEFT_MIDDLE\">");
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** List the students' e-mail addresses *****/
for (NumUsr = 0;
NumUsr < Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs;
NumUsr++)
{
UsrDat.UsrCod = Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].UsrCod;
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // If user's data exist...
{
UsrDat.Accepted = Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].Accepted;
if (UsrDat.Email[0])
{
NumStdsWithEmail++;
if (UsrDat.Accepted) // If student has e-mail and has accepted
{
if (NumAcceptedStdsWithEmail > 0)
{
fprintf (Gbl.F.Out,", ");
LengthStrAddr += 2;
if (LengthStrAddr <= Mai_MAX_LENGTH_STR_ADDR)
strcat (StrAddresses,",");
else
Lay_ShowErrorAndExit ("The space allocated to store e-mail addresses is full.");
}
LengthStrAddr += strlen (UsrDat.Email);
if (LengthStrAddr <= Mai_MAX_LENGTH_STR_ADDR)
strcat (StrAddresses,UsrDat.Email);
else
Lay_ShowErrorAndExit ("The space allocated to store e-mail addresses is full.");
fprintf (Gbl.F.Out,"<a href=\"mailto:%s?subject=%s\">%s</a>",
UsrDat.Email,Gbl.CurrentCrs.Crs.FullName,UsrDat.Email);
NumAcceptedStdsWithEmail++;
}
}
}
}
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
/***** Show a message with the number of students with e-mail ****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT CENTER_MIDDLE\">");
fprintf (Gbl.F.Out,Txt_X_students_who_have_e_mail,
NumStdsWithEmail,
((float) NumStdsWithEmail /
(float) Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs) * 100.0,
Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** Show a message with the number of students who have accepted and have e-mail ****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT CENTER_MIDDLE\">");
fprintf (Gbl.F.Out,Txt_X_students_who_have_accepted_and_who_have_e_mail,
NumAcceptedStdsWithEmail,
((float) NumAcceptedStdsWithEmail /
(float) Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs) * 100.0,
Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** End of the frame used to list the e-mails *****/
Lay_EndRoundFrameTable ();
/***** Icon to open the client e-mail program *****/
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">"
"<a href=\"mailto:%s?subject=%s&cc=%s&bcc=%s\""
" title=\"%s\" class=\"%s\">",
Gbl.Usrs.Me.UsrDat.Email,
Gbl.CurrentCrs.Crs.FullName,
Gbl.Usrs.Me.UsrDat.Email,
StrAddresses,
Txt_Create_e_mail_message,
The_ClassFormBold[Gbl.Prefs.Theme]);
Lay_PutIconWithText ("editnewmsg16x16.gif",
Txt_Create_e_mail_message,
Txt_Create_e_mail_message);
fprintf (Gbl.F.Out,"</a>"
"</div>");
}
}
else
Usr_ShowWarningNoUsersFound (Rol_STUDENT);
/***** Free memory for students list *****/
Usr_FreeUsrsList (Rol_STUDENT);
/***** Free memory for list of selected groups *****/
Grp_FreeListCodSelectedGrps ();
}
/*****************************************************************************/
/**************** Check whether an e-mail address if valid *******************/
/*****************************************************************************/

View File

@ -66,6 +66,8 @@ void Mai_RenameMailDomainShort (void);
void Mai_RenameMailDomainFull (void);
void Mai_RecFormNewMailDomain (void);
void Mai_ListEMails (void); // Creates an e-mail message to students
bool Mai_CheckIfEmailIsValid (const char *Email);
bool Mai_GetEmailFromUsrCod (struct UsrData *UsrDat);
long Mai_GetUsrCodFromEmail (const char *Email);

View File

@ -57,7 +57,6 @@ extern struct Globals Gbl;
/*****************************************************************************/
#define Msg_MAX_LENGTH_MESSAGES_QUERY 4096
#define Msg_MAX_LENGTH_STR_ADDR (32*5000)
// Forum images will be saved with:
// - maximum width of Msg_IMAGE_SAVED_MAX_HEIGHT
@ -142,128 +141,6 @@ static void Msg_PutFormToUnbanSender (struct UsrData *UsrDat);
static void Msg_UnbanSender (void);
static bool Msg_CheckIfUsrIsBanned (long FromUsrCod,long ToUsrCod);
/*****************************************************************************/
/******************* List the e-mails of all the students ********************/
/*****************************************************************************/
void Msg_ListEMails (void)
{
extern const char *The_ClassFormBold[The_NUM_THEMES];
extern const char *Txt_Students_who_have_accepted_and_who_have_e_mail;
extern const char *Txt_X_students_who_have_e_mail;
extern const char *Txt_X_students_who_have_accepted_and_who_have_e_mail;
extern const char *Txt_Create_e_mail_message;
unsigned NumUsr,NumStdsWithEmail = 0,NumAcceptedStdsWithEmail = 0;
char StrAddresses[Msg_MAX_LENGTH_STR_ADDR+1];
unsigned int LengthStrAddr = 0;
struct UsrData UsrDat;
/***** Form to select groups *****/
Grp_ShowFormToSelectSeveralGroups (ActMaiStd);
/***** Get and order list of students in this course *****/
Usr_GetListUsrs (Rol_STUDENT,Sco_SCOPE_CRS);
if (Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs)
{
if (Usr_GetIfShowBigList (Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs))
{
/***** Start of the frame used to list the e-mails *****/
Lay_StartRoundFrameTable (NULL,0,Txt_Students_who_have_accepted_and_who_have_e_mail);
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT_SMALL LEFT_MIDDLE\">");
/***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat);
/***** List the students' e-mail addresses *****/
for (NumUsr = 0;
NumUsr < Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs;
NumUsr++)
{
UsrDat.UsrCod = Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].UsrCod;
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat)) // If user's data exist...
{
UsrDat.Accepted = Gbl.Usrs.LstUsrs[Rol_STUDENT].Lst[NumUsr].Accepted;
if (UsrDat.Email[0])
{
NumStdsWithEmail++;
if (UsrDat.Accepted) // If student has e-mail and has accepted
{
if (NumAcceptedStdsWithEmail > 0)
{
fprintf (Gbl.F.Out,", ");
LengthStrAddr += 2;
if (LengthStrAddr <= Msg_MAX_LENGTH_STR_ADDR)
strcat (StrAddresses,",");
else
Lay_ShowErrorAndExit ("The space allocated to store e-mail addresses is full.");
}
LengthStrAddr += strlen (UsrDat.Email);
if (LengthStrAddr <= Msg_MAX_LENGTH_STR_ADDR)
strcat (StrAddresses,UsrDat.Email);
else
Lay_ShowErrorAndExit ("The space allocated to store e-mail addresses is full.");
fprintf (Gbl.F.Out,"<a href=\"mailto:%s?subject=%s\">%s</a>",
UsrDat.Email,Gbl.CurrentCrs.Crs.FullName,UsrDat.Email);
NumAcceptedStdsWithEmail++;
}
}
}
}
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** Free memory used for user's data *****/
Usr_UsrDataDestructor (&UsrDat);
/***** Show a message with the number of students with e-mail ****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT CENTER_MIDDLE\">");
fprintf (Gbl.F.Out,Txt_X_students_who_have_e_mail,
NumStdsWithEmail,
((float) NumStdsWithEmail / (float) Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs) * 100.0,Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** Show a message with the number of students who have accepted and have e-mail ****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"DAT CENTER_MIDDLE\">");
fprintf (Gbl.F.Out,Txt_X_students_who_have_accepted_and_who_have_e_mail,
NumAcceptedStdsWithEmail,
((float) NumAcceptedStdsWithEmail /
(float) Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs) * 100.0,
Gbl.Usrs.LstUsrs[Rol_STUDENT].NumUsrs);
fprintf (Gbl.F.Out,"</td>"
"</tr>");
/***** End of the frame used to list the e-mails *****/
Lay_EndRoundFrameTable ();
/***** Icon to open the client e-mail program *****/
fprintf (Gbl.F.Out,"<div class=\"CONTEXT_MENU\">"
"<a href=\"mailto:%s?subject=%s&cc=%s&bcc=%s\" title=\"%s\" class=\"%s\">",
Gbl.Usrs.Me.UsrDat.Email,
Gbl.CurrentCrs.Crs.FullName,Gbl.Usrs.Me.UsrDat.Email,StrAddresses,
Txt_Create_e_mail_message,
The_ClassFormBold[Gbl.Prefs.Theme]);
Lay_PutIconWithText ("editnewmsg16x16.gif",Txt_Create_e_mail_message,Txt_Create_e_mail_message);
fprintf (Gbl.F.Out,"</a>"
"</div>");
}
}
else
Usr_ShowWarningNoUsersFound (Rol_STUDENT);
/***** Free memory for students list *****/
Usr_FreeUsrsList (Rol_STUDENT);
/***** Free memory for list of selected groups *****/
Grp_FreeListCodSelectedGrps ();
}
/*****************************************************************************/
/***************** Put a form to write a new message to users ****************/
/*****************************************************************************/

View File

@ -56,8 +56,6 @@ typedef enum
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Msg_ListEMails (void); // Creates an e-mail message to students
void Msg_FormMsgUsrs (void);
void Msg_PutHiddenParamAnotherRecipient (const struct UsrData *UsrDat);
void Msg_PutHiddenParamOtherRecipients (void);