Version 14.56

This commit is contained in:
Antonio Cañas Vargas 2015-01-17 13:31:25 +01:00
parent acee6c9455
commit 20e7fdad39
18 changed files with 166 additions and 281 deletions

View File

@ -35,7 +35,7 @@ OBJS = swad_account.o swad_action.o swad_announcement.o swad_assignment.o swad_a
swad_global.o swad_group.o \
swad_holiday.o \
swad_icon.o swad_ID.o swad_import.o swad_indicator.o swad_info.o swad_institution.o \
swad_layout.o swad_link.o \
swad_layout.o swad_link.o swad_logo.o \
swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \
swad_network.o swad_nickname.o swad_notice.o swad_notification.o \
swad_pagination.o swad_parameter.o swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_preference.o \

View File

@ -627,7 +627,6 @@ CREATE TABLE IF NOT EXISTS institutions (
RequesterUsrCod INT NOT NULL DEFAULT -1,
ShortName VARCHAR(32) NOT NULL,
FullName TEXT NOT NULL,
Logo VARCHAR(32) NOT NULL,
WWW VARCHAR(255) NOT NULL,
UNIQUE INDEX(InsCod),
INDEX(CtyCod),

View File

@ -172,7 +172,8 @@ Institution:
80. ActInsSch Search for courses, teachers, documents...
81. ActPrnInsInf Print information on the current institution
82. ActChgInsLog Change logo of institution
--. ActReqInsLog Show form to send the logo of the current institution
82. ActRecInsLog Receive and store the logo of the current institution
83. ActEdiCtr Edit centres
84. ActReqCtr Request the creation of a request for a new centre (a teacher makes the petition to an administrator)
@ -1312,7 +1313,8 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActInsSch */{1182,-1,TabIns,ActInsReqSch ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Sch_GetParamsSearch ,Sch_InsSearch ,NULL},
/* ActPrnInsInf */{1154,-1,TabIns,ActSeeInsInf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,Ins_PrintConfiguration ,NULL},
/* ActChgInsLog */{ 699,-1,TabIns,ActSeeIns ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ins_ChangeInsLogo ,NULL},
/* ActReqInsLog */{1245,-1,TabCtr,ActSeeInsInf ,0x100,0x100,0x100,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ins_RequestLogo ,NULL},
/* ActRecInsLog */{ 699,-1,TabCtr,ActSeeInsInf ,0x100,0x100,0x100,Act_CONTENT_DATA,Act_MAIN_WINDOW,NULL ,Ins_ReceiveLogo ,NULL},
/* ActEdiCtr */{ 681,-1,TabIns,ActSeeCtr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_EditCentres ,NULL},
/* ActReqCtr */{1208,-1,TabIns,ActSeeCtr ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,NULL ,Ctr_RecFormReqCtr ,NULL},
@ -2980,7 +2982,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActSeeIns, // #696
ActEdiIns, // #697
ActNewIns, // #698
ActChgInsLog, // #699
ActRecInsLog, // #699
ActChgInsWWW, // #700
ActRenInsFul, // #701
ActRenInsSho, // #702
@ -3526,6 +3528,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq
ActSeeSyl, // #1242
ActChgMnu, // #1243
ActReqCtrLog, // #1244
ActReqInsLog, // #1245
};
/*****************************************************************************/

View File

@ -69,9 +69,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 (7+52+15+39+23+17+204+184+94+168+28+75)
#define Act_NUM_ACTIONS (7+52+15+40+23+17+204+184+94+168+28+75)
#define Act_MAX_ACTION_COD 1244
#define Act_MAX_ACTION_COD 1245
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20
@ -186,41 +186,42 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica
// Secondary actions
#define ActInsSch (ActChgInsSta+ 7)
#define ActPrnInsInf (ActChgInsSta+ 8)
#define ActChgInsLog (ActChgInsSta+ 9)
#define ActReqInsLog (ActChgInsSta+ 9)
#define ActRecInsLog (ActChgInsSta+ 10)
#define ActEdiCtr (ActChgInsSta+ 10)
#define ActReqCtr (ActChgInsSta+ 11)
#define ActNewCtr (ActChgInsSta+ 12)
#define ActRemCtr (ActChgInsSta+ 13)
#define ActChgCtrIns (ActChgInsSta+ 14)
#define ActChgCtrPlc (ActChgInsSta+ 15)
#define ActRenCtrSho (ActChgInsSta+ 16)
#define ActRenCtrFul (ActChgInsSta+ 17)
#define ActChgCtrWWW (ActChgInsSta+ 18)
#define ActChgCtrSta (ActChgInsSta+ 19)
#define ActEdiCtr (ActChgInsSta+ 11)
#define ActReqCtr (ActChgInsSta+ 12)
#define ActNewCtr (ActChgInsSta+ 13)
#define ActRemCtr (ActChgInsSta+ 14)
#define ActChgCtrIns (ActChgInsSta+ 15)
#define ActChgCtrPlc (ActChgInsSta+ 16)
#define ActRenCtrSho (ActChgInsSta+ 17)
#define ActRenCtrFul (ActChgInsSta+ 18)
#define ActChgCtrWWW (ActChgInsSta+ 19)
#define ActChgCtrSta (ActChgInsSta+ 20)
#define ActEdiDpt (ActChgInsSta+ 20)
#define ActNewDpt (ActChgInsSta+ 21)
#define ActRemDpt (ActChgInsSta+ 22)
#define ActChgDptIns (ActChgInsSta+ 23)
#define ActRenDptSho (ActChgInsSta+ 24)
#define ActRenDptFul (ActChgInsSta+ 25)
#define ActChgDptWWW (ActChgInsSta+ 26)
#define ActEdiDpt (ActChgInsSta+ 21)
#define ActNewDpt (ActChgInsSta+ 22)
#define ActRemDpt (ActChgInsSta+ 23)
#define ActChgDptIns (ActChgInsSta+ 24)
#define ActRenDptSho (ActChgInsSta+ 25)
#define ActRenDptFul (ActChgInsSta+ 26)
#define ActChgDptWWW (ActChgInsSta+ 27)
#define ActEdiPlc (ActChgInsSta+ 27)
#define ActNewPlc (ActChgInsSta+ 28)
#define ActRemPlc (ActChgInsSta+ 29)
#define ActRenPlcSho (ActChgInsSta+ 30)
#define ActRenPlcFul (ActChgInsSta+ 31)
#define ActEdiPlc (ActChgInsSta+ 28)
#define ActNewPlc (ActChgInsSta+ 29)
#define ActRemPlc (ActChgInsSta+ 30)
#define ActRenPlcSho (ActChgInsSta+ 31)
#define ActRenPlcFul (ActChgInsSta+ 32)
#define ActEdiHld (ActChgInsSta+ 32)
#define ActNewHld (ActChgInsSta+ 33)
#define ActRemHld (ActChgInsSta+ 34)
#define ActChgHldPlc (ActChgInsSta+ 35)
#define ActChgHldTyp (ActChgInsSta+ 36)
#define ActChgHldStrDat (ActChgInsSta+ 37)
#define ActChgHldEndDat (ActChgInsSta+ 38)
#define ActRenHld (ActChgInsSta+ 39)
#define ActEdiHld (ActChgInsSta+ 33)
#define ActNewHld (ActChgInsSta+ 34)
#define ActRemHld (ActChgInsSta+ 35)
#define ActChgHldPlc (ActChgInsSta+ 36)
#define ActChgHldTyp (ActChgInsSta+ 37)
#define ActChgHldStrDat (ActChgInsSta+ 38)
#define ActChgHldEndDat (ActChgInsSta+ 39)
#define ActRenHld (ActChgInsSta+ 40)
/*****************************************************************************/
/********************************* Centre tab ********************************/

View File

@ -35,6 +35,7 @@
#include "swad_database.h"
#include "swad_global.h"
#include "swad_institution.h"
#include "swad_logo.h"
#include "swad_parameter.h"
#include "swad_QR.h"
#include "swad_string.h"
@ -82,7 +83,7 @@ static Ctr_Status_t Ctr_GetStatusBitsFromStatusTxt (Ctr_StatusTxt_t StatusTxt);
static void Ctr_PutParamOtherCtrCod (long CtrCod);
static void Ctr_RenameCentre (Cns_ShortOrFullName_t ShortOrFullName);
static bool Ctr_CheckIfCentreNameExistsInCurrentIns (const char *FieldName,const char *Name,long CtrCod);
static void Ctr_PutFormToChangeCtrLogo (bool LogoExists);
static void Ctr_PutFormToChangeCtrPhoto (bool PhotoExists);
static void Ctr_PutFormToCreateCentre (void);
static void Ctr_PutHeadCentresForSeeing (bool OrderSelectable);
@ -242,8 +243,6 @@ static void Ctr_Configuration (bool PrintView)
extern const char *Txt_Degrees;
extern const char *Txt_Courses;
extern const char *Txt_ROLES_PLURAL_Abc[Rol_NUM_ROLES][Usr_NUM_SEXS];
char PathLogo[PATH_MAX+1];
bool LogoExists;
char PathPhoto[PATH_MAX+1];
bool PhotoExists;
char *PhotoAttribution = NULL;
@ -251,14 +250,6 @@ static void Ctr_Configuration (bool PrintView)
if (Gbl.CurrentCtr.Ctr.CtrCod > 0)
{
/***** Path to logo *****/
sprintf (PathLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod,
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
LogoExists = Fil_CheckIfPathExists (PathLogo);
/***** Path to photo *****/
sprintf (PathPhoto,"%s/%s/%02u/%u/%u.jpg",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
@ -267,7 +258,7 @@ static void Ctr_Configuration (bool PrintView)
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
PhotoExists = Fil_CheckIfPathExists (PathPhoto);
/***** Links to print view and upload photo *****/
/***** Links to print view, upload logo and upload photo *****/
if (!PrintView)
{
fprintf (Gbl.F.Out,"<div style=\"text-align:center;\">");
@ -276,10 +267,10 @@ static void Ctr_Configuration (bool PrintView)
Lay_PutLinkToPrintView1 (ActPrnCtrInf);
Lay_PutLinkToPrintView2 ();
/* Link to upload photo */
/* Links to upload logo and photo */
if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_CTR_ADMIN)
{
Ctr_PutFormToChangeCtrLogo (LogoExists);
Log_PutFormToChangeLogo (Sco_SCOPE_CENTRE);
Ctr_PutFormToChangeCtrPhoto (PhotoExists);
}
@ -1725,129 +1716,22 @@ void Ctr_ChangeCtrStatus (void)
Ctr_EditCentres ();
}
/*****************************************************************************/
/********* Put a link to the action used to request logo of centre ***********/
/*****************************************************************************/
static void Ctr_PutFormToChangeCtrLogo (bool LogoExists)
{
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_Change_logo;
extern const char *Txt_Upload_logo;
const char *Msg;
/***** Link for changing / uploading the photo *****/
Act_FormStart (ActReqCtrLog);
Msg = LogoExists ? Txt_Change_logo :
Txt_Upload_logo;
Act_LinkFormSubmit (Msg,The_ClassFormul[Gbl.Prefs.Theme]);
Lay_PutSendIcon ("ctr",Msg,Msg);
fprintf (Gbl.F.Out,"</form>");
}
/*****************************************************************************/
/*********** Show a form for sending a logo of the current centre ************/
/*****************************************************************************/
void Ctr_RequestLogo (void)
{
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_You_can_send_a_file_with_an_image_in_png_format_transparent_background_and_size_X_Y;
extern const char *Txt_File_with_the_logo;
extern const char *Txt_Upload_logo;
/***** Write help message *****/
sprintf (Gbl.Message,Txt_You_can_send_a_file_with_an_image_in_png_format_transparent_background_and_size_X_Y,
64,64);
Lay_ShowAlert (Lay_INFO,Gbl.Message);
/***** Write a form to send logo *****/
Act_FormStart (ActRecCtrLog);
fprintf (Gbl.F.Out,"<table style=\"margin:0 auto;\">"
"<tr>"
"<td class=\"%s\" style=\"text-align:right;\">"
"%s:"
"</td>"
"<td style=\"text-align:left;\">"
"<input type=\"file\" name=\"%s\" size=\"40\" maxlength=\"100\" value=\"\" />"
"</td>"
"</tr>"
"<tr>"
"<td colspan=\"2\" style=\"text-align:center;\">"
"<input type=\"submit\" value=\"%s\" accept=\"image/jpeg\" />"
"</td>"
"</tr>"
"</table>"
"</form>",
The_ClassFormul[Gbl.Prefs.Theme],
Txt_File_with_the_logo,
Fil_NAME_OF_PARAM_FILENAME_ORG,
Txt_Upload_logo);
Log_RequestLogo (Sco_SCOPE_CENTRE);
}
/*****************************************************************************/
/****************** Receive a photo of the current centre ********************/
/***************** Receive the logo of the current centre ********************/
/*****************************************************************************/
void Ctr_ReceiveLogo (void)
{
extern const char *Txt_The_file_is_not_X;
char Path[PATH_MAX+1];
char FileNameLogoSrc[PATH_MAX+1];
char MIMEType[Brw_MAX_BYTES_MIME_TYPE+1];
char FileNameLogo[PATH_MAX+1]; // Full name (including path and .png) of the destination file
bool WrongType = false;
/***** Creates directories if not exist *****/
sprintf (Path,"%s/%s",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR);
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100));
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u/%u",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
Fil_CreateDirIfNotExists (Path);
sprintf (Path,"%s/%s/%02u/%u/logo",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
Fil_CreateDirIfNotExists (Path);
/***** Copy in disk the file received from stdin (really from Gbl.F.Tmp) *****/
Fil_StartReceptionOfFile (FileNameLogoSrc,MIMEType);
/* Check if the file type is image/jpeg or image/pjpeg or application/octet-stream */
if (strcmp (MIMEType,"image/png"))
if (strcmp (MIMEType,"image/x-png"))
if (strcmp (MIMEType,"application/octet-stream"))
if (strcmp (MIMEType,"application/octetstream"))
if (strcmp (MIMEType,"application/octet"))
WrongType = true;
if (WrongType)
{
sprintf (Gbl.Message,Txt_The_file_is_not_X,"png");
Lay_ShowAlert (Lay_WARNING,Gbl.Message);
return;
}
/* End the reception of logo in a temporary file */
sprintf (FileNameLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_CTR,
(unsigned) (Gbl.CurrentCtr.Ctr.CtrCod % 100),
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod,
(unsigned) Gbl.CurrentCtr.Ctr.CtrCod);
if (!Fil_EndReceptionOfFile (FileNameLogo))
{
Lay_ShowAlert (Lay_WARNING,"Error uploading file.");
return;
}
/***** Show the centre information again *****/
Ctr_ShowConfiguration ();
Log_ReceiveLogo (Sco_SCOPE_CENTRE);
}
/*****************************************************************************/

View File

@ -103,6 +103,7 @@ void Ctr_RenameCentreShort (void);
void Ctr_RenameCentreFull (void);
void Ctr_ChangeCtrWWW (void);
void Ctr_ChangeCtrStatus (void);
void Ctr_RequestLogo (void);
void Ctr_ReceiveLogo (void);
void Ctr_RequestPhoto (void);

View File

@ -1,7 +1,7 @@
// swad_changelog.h: changelog
#ifndef _SWAD_LOG
#define _SWAD_LOG
#ifndef _SWAD_CHG
#define _SWAD_CHG
/*
SWAD (Shared Workspace At a Distance),
is a web platform developed at the University of Granada (Spain),
@ -39,22 +39,31 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 14.55.5 (2015/01/16)"
#define Log_PLATFORM_VERSION "SWAD 14.56 (2015/01/17)"
// 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 | tail -1
/*
Version 14.56: Jan 17, 2015 New module swad_logo for drawing logos of institutions, centres and degrees.
New option to upload logo of institution. (173735 lines)
1 change necessary in Makefile:
Add swad_logo.o to list of object files
3 changes necessary in database:
UPDATE actions SET Txt='Cambiar logo de instituci&oacute;n' WHERE ActCod='699' AND Language='es';
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1245','es','N','Solicitar env&iacute;o de logo de instituci&oacute;n');
ALTER TABLE institutions DROP COLUMN Logo;
Version 14.55.5: Jan 16, 2015 Code refactoring related to maps of countries. (173573 lines)
Version 14.55.4: Jan 16, 2015 Fixed bugs in enrollment.
New MIME type, reported by Francisco Ocaña Lara. (173576 lines)
New MIME type, suggested by Francisco Ocaña Lara. (173576 lines)
Version 14.55.3: Jan 16, 2015 Link in course information to request registration in course.
Fixed bug in enrollment. (173570 lines)
Version 14.55.2: Jan 15, 2015 Logo of centre, degree, institution or country in title. (173546 lines)
Version 14.55.1: Jan 14, 2015 Fixed bug in user's photo. (173510 lines)
Version 14.55 : Jan 14, 2015 New option to upload logo of a centre. (173509 lines)
Version 14.55: Jan 14, 2015 New option to upload logo of a centre. (173509 lines)
3 changes necessary in database:
UPDATE actions SET Txt='Enviar logo del centro' WHERE ActCod='1051' AND Language='es';
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1244','es','N','Solicitar env&iacute;o de foto del centro');
UPDATE actions SET Txt='Cambiar logo de centro' WHERE ActCod='1051' AND Language='es';
INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1244','es','N','Solicitar env&iacute;o de logo cde entro');
ALTER TABLE centres DROP COLUMN Logo;
Version 14.54.7: Jan 13, 2015 Fixed bug in edition of centres. (173349 lines)

View File

@ -348,9 +348,15 @@
#define Cfg_MAX_BYTES_DATABASE_PASSWORD 256
#define Cfg_MAX_BYTES_SMTP_PASSWORD 256
/* Folders for courses, inside public and private swad directories */
/* Folders for institutions, inside public and private swad directories */
#define Cfg_FOLDER_INS "ins" // If not exists, it should be created during installation inside swad private and public directory!
/* Folders for centres, inside public and private swad directories */
#define Cfg_FOLDER_CTR "ctr" // If not exists, it should be created during installation inside swad private and public directory!
/* Folders for centres, inside public and private swad directories */
#define Cfg_FOLDER_DEG "deg" // If not exists, it should be created during installation inside swad private and public directory!
/* Folders for courses, inside public and private swad directories */
#define Cfg_FOLDER_CRS "crs" // If not exists, it should be created during installation inside swad private and public directory!
@ -393,7 +399,6 @@
#define Cfg_ICON_FOLDER_THEMES "theme" // Directory with all the images for each theme
#define Cfg_ICON_FOLDER_ICON_SETS "iconset" // Directory with all the icons for each icon set
#define Cfg_ICON_FOLDER_COUNTRIES "country" // Directory with icons for countries
#define Cfg_ICON_FOLDER_INSTITUTIONS "institution" // Directory with icons for institutions
#define Cfg_ICON_FOLDER_DEGREES "degree" // Directory with icons for degrees
#define Cfg_ICON_FOLDER_FILEXT "filext" // Directory with icons for file extensions
#define Cfg_ICON_FOLDER_PLUGINS "plugin" // Directory with icons for plugins

View File

@ -672,7 +672,7 @@ static void Crs_WriteListMyCoursesToSelectOne (void)
Ins_PutParamInsCod (Ins.InsCod);
Act_LinkFormSubmit (Act_GetActionTextFromDB (Act_Actions[ActSeeInsInf].ActCod,ActTxt),
The_ClassFormul[Gbl.Prefs.Theme]);
Ins_DrawInstitutionLogo (Ins.Logo,Ins.ShortName,16,"vertical-align:middle;");
Ins_DrawInstitutionLogo (Ins.InsCod,Ins.ShortName,16,"vertical-align:middle;");
Highlight = (Gbl.CurrentCtr.Ctr.CtrCod <= 0 &&
Gbl.CurrentIns.Ins.InsCod == Ins.InsCod);
if (Highlight)

View File

@ -1304,10 +1304,9 @@ mysql> DESCRIBE institutions;
| RequesterUsrCod | int(11) | NO | | -1 | |
| ShortName | varchar(32) | NO | | NULL | |
| FullName | text | NO | | NULL | |
| Logo | varchar(32) | NO | | NULL | |
| WWW | varchar(255) | NO | | NULL | |
+-----------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
7 rows in set (0.01 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS institutions ("
"InsCod INT NOT NULL AUTO_INCREMENT,"
@ -1316,7 +1315,6 @@ mysql> DESCRIBE institutions;
"RequesterUsrCod INT NOT NULL DEFAULT -1,"
"ShortName VARCHAR(32) NOT NULL,"
"FullName TEXT NOT NULL,"
"Logo VARCHAR(32) NOT NULL,"
"WWW VARCHAR(255) NOT NULL,"
"UNIQUE INDEX(InsCod),INDEX(CtyCod),INDEX(Status))");

View File

@ -41,6 +41,7 @@
#include "swad_global.h"
#include "swad_indicator.h"
#include "swad_info.h"
#include "swad_logo.h"
#include "swad_notification.h"
#include "swad_parameter.h"
#include "swad_QR.h"
@ -296,12 +297,19 @@ static void Deg_Configuration (bool PrintView)
if (Gbl.CurrentDeg.Deg.DegCod > 0)
{
/***** Links to print view and upload logo *****/
if (!PrintView)
{
/* Link to print view */
fprintf (Gbl.F.Out,"<div style=\"text-align:center;\">");
/* Link to print view */
Lay_PutLinkToPrintView1 (ActPrnDegInf);
Lay_PutLinkToPrintView2 ();
/* Link to upload logo */
if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_DEG_ADMIN)
Log_PutFormToChangeLogo (Sco_SCOPE_DEGREE);
fprintf (Gbl.F.Out,"</div>");
}
@ -754,7 +762,7 @@ void Deg_WriteBigNameCtyInsCtrDegCrs (void)
Ctr_DrawCentreLogo (Gbl.CurrentCtr.Ctr.CtrCod,Gbl.CurrentCtr.Ctr.ShortName,32,
"vertical-align:top; margin-right:8px;");
else if (Gbl.CurrentIns.Ins.InsCod > 0)
Ins_DrawInstitutionLogo (Gbl.CurrentIns.Ins.Logo,Gbl.CurrentIns.Ins.ShortName,32,
Ins_DrawInstitutionLogo (Gbl.CurrentIns.Ins.InsCod,Gbl.CurrentIns.Ins.ShortName,32,
"vertical-align:top; margin-right:8px;");
else if (Gbl.CurrentCty.Cty.CtyCod > 0)
if (Cty_CheckIfCountryMapExists (&Gbl.CurrentCty.Cty))

View File

@ -790,7 +790,7 @@ static void Exa_ShowExamAnnouncement (long ExaCod,Exa_tTypeViewExamAnnouncement_
else
fprintf (Gbl.F.Out,"<a href=\"%s\" target=\"_blank\" class=\"%s\">",
Ins.WWW,StyleTitle);
Ins_DrawInstitutionLogo (Ins.Logo,Ins.FullName,64,NULL);
Ins_DrawInstitutionLogo (Ins.InsCod,Ins.FullName,64,NULL);
fprintf (Gbl.F.Out,"<br />%s%s" \
"</td>" \
"</tr>",

View File

@ -2146,7 +2146,7 @@ static void For_WriteLinkToForum (For_ForumType_t ForumType,Act_Action_t NextAct
{
case For_FORUM_INSTITUTION_USRS:
case For_FORUM_INSTITUTION_TCHS:
Ins_DrawInstitutionLogo (Gbl.Forum.Ins.Logo,ForumName,16,"vertical-align:middle;");
Ins_DrawInstitutionLogo (Gbl.Forum.Ins.InsCod,ForumName,16,"vertical-align:middle;");
break;
case For_FORUM_CENTRE_USRS:
case For_FORUM_CENTRE_TCHS:

View File

@ -34,6 +34,7 @@
#include "swad_database.h"
#include "swad_global.h"
#include "swad_institution.h"
#include "swad_logo.h"
#include "swad_parameter.h"
#include "swad_QR.h"
#include "swad_text.h"
@ -162,7 +163,7 @@ void Ins_SeeInsWithPendingCtrs (void)
" vertical-align:middle; background-color:%s;\">"
"<a href=\"%s\" title=\"%s\" class=\"DAT\" target=\"_blank\">",
BgColor,Ins.WWW,Ins.FullName);
Ins_DrawInstitutionLogo (Ins.Logo,Ins.ShortName,16,NULL);
Ins_DrawInstitutionLogo (Ins.InsCod,Ins.ShortName,16,"vertical-align:top;");
fprintf (Gbl.F.Out,"</a>"
"</td>");
@ -226,7 +227,6 @@ static void Ins_Configuration (bool PrintView)
extern const char *The_ClassFormul[The_NUM_THEMES];
extern const char *Txt_Institution;
extern const char *Txt_Short_Name;
extern const char *Txt_Logo;
extern const char *Txt_Shortcut_to_this_institution;
extern const char *Txt_QR_code;
extern const char *Txt_Centres;
@ -238,12 +238,19 @@ static void Ins_Configuration (bool PrintView)
if (Gbl.CurrentIns.Ins.InsCod > 0)
{
/***** Link to print view *****/
/***** Links to print view and upload logo *****/
if (!PrintView)
{
fprintf (Gbl.F.Out,"<div style=\"text-align:center;\">");
/* Link to print view */
Lay_PutLinkToPrintView1 (ActPrnInsInf);
Lay_PutLinkToPrintView2 ();
/* Link to upload logo */
if (Gbl.Usrs.Me.LoggedRole >= Rol_ROLE_INS_ADMIN)
Log_PutFormToChangeLogo (Sco_SCOPE_INSTITUTION);
fprintf (Gbl.F.Out,"</div>");
}
@ -259,7 +266,7 @@ static void Ins_Configuration (bool PrintView)
" class=\"TITLE_LOCATION\" title=\"%s\">",
Gbl.CurrentIns.Ins.WWW,
Gbl.CurrentIns.Ins.FullName);
Ins_DrawInstitutionLogo (Gbl.CurrentIns.Ins.Logo,
Ins_DrawInstitutionLogo (Gbl.CurrentIns.Ins.InsCod,
Gbl.CurrentIns.Ins.ShortName,
64,NULL);
fprintf (Gbl.F.Out,"<br />%s",Gbl.CurrentIns.Ins.FullName);
@ -305,28 +312,6 @@ static void Ins_Configuration (bool PrintView)
Txt_Short_Name,
Gbl.CurrentIns.Ins.ShortName);
/***** Institution logo *****/
if (Gbl.Usrs.Me.LoggedRole == Rol_ROLE_SUPERUSER)
{
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s\" style=\"text-align:right;"
" vertical-align:middle;\">"
"%s:"
"</td>"
"<td style=\"text-align:left;"
" vertical-align:middle;\">",
The_ClassFormul[Gbl.Prefs.Theme],
Txt_Logo);
Act_FormStart (ActChgInsLog);
fprintf (Gbl.F.Out,"<input type=\"text\" name=\"Logo\" size=\"10\" maxlength=\"%u\" value=\"%s\""
" onchange=\"javascript:document.getElementById('%s').submit();\" />"
"</form>"
"</td>"
"</tr>",
Ins_MAX_LENGTH_INSTITUTION_LOGO,Gbl.CurrentIns.Ins.Logo,
Gbl.FormId);
}
/***** Link to the institution *****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"%s\" style=\"text-align:right;"
@ -545,7 +530,7 @@ static void Ins_ListOneInstitutionForSeeing (struct Institution *Ins,unsigned Nu
"<a href=\"%s\" target=\"_blank\" title=\"%s\">",
BgColor,
Ins->WWW,Ins->FullName);
Ins_DrawInstitutionLogo (Ins->Logo,Ins->ShortName,16,NULL);
Ins_DrawInstitutionLogo (Ins->InsCod,Ins->ShortName,16,NULL);
fprintf (Gbl.F.Out,"</a>"
"</td>");
@ -737,11 +722,11 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
{
case Ins_GET_MINIMAL_DATA:
if (CtyCod <= 0) // Get all the institutions, belonging to any country
sprintf (Query,"SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW"
sprintf (Query,"SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,WWW"
" FROM institutions"
" ORDER BY FullName");
else // Get only the institutions belonging to the country specified by CtyCod
sprintf (Query,"SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW"
sprintf (Query,"SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,WWW"
" FROM institutions"
" WHERE CtyCod='%ld'"
" ORDER BY FullName",
@ -761,12 +746,12 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
sprintf (Query,"(SELECT institutions.InsCod,institutions.CtyCod,"
"institutions.Status,institutions.RequesterUsrCod,"
"institutions.ShortName,institutions.FullName,"
"institutions.Logo,institutions.WWW,COUNT(*) AS NumUsrs"
"institutions.WWW,COUNT(*) AS NumUsrs"
" FROM institutions,usr_data"
" WHERE institutions.InsCod=usr_data.InsCod"
" GROUP BY institutions.InsCod)"
" UNION "
"(SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW,0 AS NumUsrs"
"(SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,WWW,0 AS NumUsrs"
" FROM institutions"
" WHERE InsCod NOT IN (SELECT DISTINCT InsCod FROM usr_data))"
" ORDER BY %s",
@ -775,12 +760,12 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
sprintf (Query,"(SELECT institutions.InsCod,institutions.CtyCod,"
"institutions.Status,institutions.RequesterUsrCod,"
"institutions.ShortName,institutions.FullName,"
"institutions.Logo,institutions.WWW,COUNT(*) AS NumUsrs"
"institutions.WWW,COUNT(*) AS NumUsrs"
" FROM institutions,usr_data"
" WHERE institutions.CtyCod='%ld' AND institutions.InsCod=usr_data.InsCod"
" GROUP BY institutions.InsCod)"
" UNION "
"(SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW,0 AS NumUsrs"
"(SELECT InsCod,CtyCod,Status,RequesterUsrCod,ShortName,FullName,WWW,0 AS NumUsrs"
" FROM institutions"
" WHERE CtyCod='%ld' AND InsCod NOT IN (SELECT DISTINCT InsCod FROM usr_data))"
" ORDER BY %s",
@ -830,11 +815,8 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
strncpy (Ins->FullName,row[5],Ins_MAX_LENGTH_INSTITUTION_FULL_NAME);
Ins->FullName[Ins_MAX_LENGTH_INSTITUTION_FULL_NAME] = '\0';
/* Get the logo of the institution (row[6]) */
strcpy (Ins->Logo,row[6]);
/* Get the URL of the institution (row[7]) */
strcpy (Ins->WWW,row[7]);
/* Get the URL of the institution (row[6]) */
strcpy (Ins->WWW,row[6]);
/* Get extra data */
switch (GetExtraData)
@ -844,8 +826,8 @@ void Ins_GetListInstitutions (long CtyCod,Ins_GetExtraData_t GetExtraData)
Ins->NumCtrs = Ins->NumDpts = Ins->NumDegs = 0;
break;
case Ins_GET_EXTRA_DATA:
/* Get number of users in this institution (row[8]) */
if (sscanf (row[8],"%u",&Ins->NumUsrs) == 1)
/* Get number of users in this institution (row[7]) */
if (sscanf (row[7],"%u",&Ins->NumUsrs) == 1)
{
if (Ins->NumUsrs)
{
@ -894,7 +876,6 @@ bool Ins_GetDataOfInstitutionByCod (struct Institution *Ins,
Ins->RequesterUsrCod = -1L;
Ins->ShortName[0] =
Ins->FullName[0] =
Ins->Logo[0] =
Ins->WWW[0] = '\0';
Ins->NumStds = Ins->NumTchs = Ins->NumUsrs =
Ins->NumCtrs = Ins->NumDpts = Ins->NumDegs = 0;
@ -905,7 +886,7 @@ bool Ins_GetDataOfInstitutionByCod (struct Institution *Ins,
// Ins->InsCod > 0
/***** Get data of an institution from database *****/
sprintf (Query,"SELECT CtyCod,Status,RequesterUsrCod,ShortName,FullName,Logo,WWW"
sprintf (Query,"SELECT CtyCod,Status,RequesterUsrCod,ShortName,FullName,WWW"
" FROM institutions WHERE InsCod='%ld'",
Ins->InsCod);
@ -934,16 +915,13 @@ bool Ins_GetDataOfInstitutionByCod (struct Institution *Ins,
strncpy (Ins->FullName,row[4],Ins_MAX_LENGTH_INSTITUTION_FULL_NAME);
Ins->FullName[Ins_MAX_LENGTH_INSTITUTION_FULL_NAME] = '\0';
/* Get the logo of the institution (row[5]) */
strcpy (Ins->Logo,row[5]);
/* Get the URL of the institution (row[6]) */
strcpy (Ins->WWW,row[6]);
/* Get the URL of the institution (row[5]) */
strcpy (Ins->WWW,row[5]);
/* Get extra data */
if (GetExtraData == Ins_GET_EXTRA_DATA)
{
/* Get number of users in this institution (row[8]) */
/* Get number of users in this institution */
Ins->NumStds = Usr_GetNumberOfUsersInInstitution (Ins->InsCod,Rol_ROLE_STUDENT); // Slow query
Ins->NumTchs = Usr_GetNumberOfUsersInInstitution (Ins->InsCod,Rol_ROLE_TEACHER); // Slow query
Ins->NumUsrs = Ins->NumStds + Ins->NumTchs;
@ -1136,7 +1114,7 @@ static void Ins_ListInstitutionsForEdition (void)
fprintf (Gbl.F.Out,"<td title=\"%s\""
" style=\"width:20px; text-align:left;\">",
Ins->FullName);
Ins_DrawInstitutionLogo (Ins->Logo,Ins->ShortName,16,NULL);
Ins_DrawInstitutionLogo (Ins->InsCod,Ins->ShortName,16,NULL);
fprintf (Gbl.F.Out,"</td>");
/* Country */
@ -1546,7 +1524,7 @@ void Ins_ChangeInsCountry (void)
extern const char *Txt_The_country_of_the_institution_X_has_changed_Y;
struct Institution *Ins;
struct Country NewCty;
char Query[256+Ins_MAX_LENGTH_INSTITUTION_LOGO];
char Query[256];
Ins = &Gbl.Inss.EditingIns;
@ -1583,8 +1561,9 @@ void Ins_ChangeInsCountry (void)
}
else
{
/***** Update the table changing old logo by new logo *****/
sprintf (Query,"UPDATE institutions SET CtyCod='%ld' WHERE InsCod='%ld'",
/***** Update the table changing the country of the institution *****/
sprintf (Query,"UPDATE institutions SET CtyCod='%ld'"
" WHERE InsCod='%ld'",
NewCty.CtyCod,Ins->InsCod);
DB_QueryUPDATE (Query,"can not update the country of an institution");
@ -1601,31 +1580,6 @@ void Ins_ChangeInsCountry (void)
Ins_EditInstitutions ();
}
/*****************************************************************************/
/********************* Change the logo of a institution **********************/
/*****************************************************************************/
void Ins_ChangeInsLogo (void)
{
extern const char *Txt_The_new_logo_is_X;
char Query[256+Ins_MAX_LENGTH_INSTITUTION_LOGO];
/***** Get the new logo for the institution from form *****/
Par_GetParToText ("Logo",Gbl.CurrentIns.Ins.Logo,Ins_MAX_LENGTH_INSTITUTION_LOGO);
/***** Update the table changing old logo by new logo *****/
sprintf (Query,"UPDATE institutions SET Logo='%s' WHERE InsCod='%ld'",
Gbl.CurrentIns.Ins.Logo,Gbl.CurrentIns.Ins.InsCod);
DB_QueryUPDATE (Query,"can not update the logo of the institution");
/***** Write message to show the change made *****/
sprintf (Gbl.Message,Txt_The_new_logo_is_X,Gbl.CurrentIns.Ins.Logo);
Lay_ShowAlert (Lay_SUCCESS,Gbl.Message);
/***** Show the form again *****/
Ins_ShowConfiguration ();
}
/*****************************************************************************/
/********************** Change the URL of a institution **********************/
/*****************************************************************************/
@ -1715,6 +1669,24 @@ void Ins_ChangeInsStatus (void)
Ins_EditInstitutions ();
}
/*****************************************************************************/
/******** Show a form for sending a logo of the current institution **********/
/*****************************************************************************/
void Ins_RequestLogo (void)
{
Log_RequestLogo (Sco_SCOPE_INSTITUTION);
}
/*****************************************************************************/
/************** Receive the logo of the current institution ******************/
/*****************************************************************************/
void Ins_ReceiveLogo (void)
{
Log_ReceiveLogo (Sco_SCOPE_INSTITUTION);
}
/*****************************************************************************/
/******************* Put a form to create a new institution ******************/
/*****************************************************************************/
@ -1761,7 +1733,7 @@ static void Ins_PutFormToCreateInstitution (void)
/***** Institution logo *****/
fprintf (Gbl.F.Out,"<td style=\"width:20px; text-align:left;\">");
Ins_DrawInstitutionLogo (NULL,"",16,NULL);
Ins_DrawInstitutionLogo (-1L,"",16,NULL);
fprintf (Gbl.F.Out,"</td>");
/***** Country *****/
@ -1958,7 +1930,7 @@ static void Ins_RecFormRequestOrCreateIns (unsigned Status)
else // Add new institution to database
Ins_CreateInstitution (Ins,Status);
}
else // If there is not a logo or a web
else // If there is not a web
Lay_ShowAlert (Lay_WARNING,Txt_You_must_specify_the_web_address_of_the_new_institution);
}
else // If there is not a institution name
@ -1979,9 +1951,9 @@ static void Ins_CreateInstitution (struct Institution *Ins,unsigned Status)
/***** Create a new institution *****/
sprintf (Query,"INSERT INTO institutions (CtyCod,Status,RequesterUsrCod,"
"ShortName,FullName,Logo,WWW)"
"ShortName,FullName,WWW)"
" VALUES ('%ld','%u','%ld',"
"'%s','%s','','%s')",
"'%s','%s','%s')",
Ins->CtyCod,
Status,
Gbl.Usrs.Me.UsrDat.UsrCod,
@ -2096,33 +2068,37 @@ unsigned Ins_GetNumInssWithUsrs (Rol_Role_t Role,const char *SubQuery)
/**************************** Draw institution logo **************************/
/*****************************************************************************/
void Ins_DrawInstitutionLogo (const char *Logo,const char *AltText,
void Ins_DrawInstitutionLogo (long InsCod,const char *AltText,
unsigned Size,const char *Style)
{
char PathLogo[PATH_MAX+1];
bool LogoExists = false;
/***** Path to logo *****/
if (Logo)
if (Logo[0])
{
sprintf (PathLogo,"%s/%s/%s/%s64x64.gif",
Cfg_PATH_SWAD_PUBLIC,
Cfg_FOLDER_PUBLIC_ICON,
Cfg_ICON_FOLDER_INSTITUTIONS,
Logo);
LogoExists = Fil_CheckIfPathExists (PathLogo);
}
if (InsCod > 0)
{
sprintf (PathLogo,"%s/%s/%02u/%u/logo/%u.png",
Cfg_PATH_SWAD_PUBLIC,Cfg_FOLDER_INS,
(unsigned) (InsCod % 100),
(unsigned) InsCod,
(unsigned) InsCod);
LogoExists = Fil_CheckIfPathExists (PathLogo);
}
else
LogoExists = false;
/***** Draw logo *****/
fprintf (Gbl.F.Out,"<img src=\"");
if (LogoExists)
fprintf (Gbl.F.Out,"%s/%s/%s",
Gbl.Prefs.IconsURL,Cfg_ICON_FOLDER_INSTITUTIONS,Logo);
fprintf (Gbl.F.Out,"%s/%s/%02u/%u/logo/%u.png",
Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_INS,
(unsigned) (InsCod % 100),
(unsigned) InsCod,
(unsigned) InsCod);
else
fprintf (Gbl.F.Out,"%s/ins",
fprintf (Gbl.F.Out,"%s/ins64x64.gif",
Gbl.Prefs.IconsURL);
fprintf (Gbl.F.Out,"64x64.gif\" alt=\"%s\" class=\"ICON%ux%u\"",
fprintf (Gbl.F.Out,"\" alt=\"%s\" class=\"ICON%ux%u\"",
AltText,Size,Size);
if (Style)
if (Style[0])

View File

@ -54,7 +54,6 @@ typedef enum
#define Ins_MAX_LENGTH_INSTITUTION_SHORT_NAME 32
#define Ins_MAX_LENGTH_INSTITUTION_FULL_NAME 1024
#define Ins_MAX_LENGTH_INSTITUTION_LOGO 32
struct Institution
{
@ -64,7 +63,6 @@ struct Institution
long RequesterUsrCod; // User code of the person who requested the creation of this institution
char ShortName[Ins_MAX_LENGTH_INSTITUTION_SHORT_NAME+1];
char FullName[Ins_MAX_LENGTH_INSTITUTION_FULL_NAME+1];
char Logo[Ins_MAX_LENGTH_INSTITUTION_LOGO+1];
char WWW[Cns_MAX_LENGTH_WWW+1];
unsigned NumStds;
unsigned NumTchs;
@ -110,9 +108,10 @@ void Ins_RemoveInstitution (void);
void Ins_RenameInsShort (void);
void Ins_RenameInsFull (void);
void Ins_ChangeInsCountry (void);
void Ins_ChangeInsLogo (void);
void Ins_ChangeInsWWW (void);
void Ins_ChangeInsStatus (void);
void Ins_RequestLogo (void);
void Ins_ReceiveLogo (void);
void Ins_RecFormReqIns (void);
void Ins_RecFormNewIns (void);
@ -123,7 +122,7 @@ unsigned Ins_GetNumInssWithDegs (const char *SubQuery);
unsigned Ins_GetNumInssWithCrss (const char *SubQuery);
unsigned Ins_GetNumInssWithUsrs (Rol_Role_t Role,const char *SubQuery);
void Ins_DrawInstitutionLogo (const char *Logo,const char *AltText,unsigned Size,const char *Style);
void Ins_DrawInstitutionLogo (long InsCod,const char *AltText,unsigned Size,const char *Style);
unsigned Ins_ListInssFound (const char *Query);

View File

@ -1278,7 +1278,7 @@ void Lay_WriteHeaderClassPhoto (unsigned NumColumns,bool PrintView,bool DrawingC
{
if (!PrintView)
fprintf (Gbl.F.Out,"<a href=\"%s\" target=\"_blank\">",Ins.WWW);
Ins_DrawInstitutionLogo (Ins.Logo,Ins.ShortName,Size,NULL);
Ins_DrawInstitutionLogo (Ins.InsCod,Ins.ShortName,Size,NULL);
if (!PrintView)
fprintf (Gbl.F.Out,"</a>");
}

View File

@ -2143,7 +2143,7 @@ void Rec_ShowCommonRecord (Rec_RecordViewType_t TypeOfView,
{
Ins.InsCod = UsrDat->InsCod;
Ins_GetDataOfInstitutionByCod (&Ins,Ins_GET_MINIMAL_DATA);
Ins_DrawInstitutionLogo (Ins.Logo,Ins.ShortName,Rec_INSTITUTION_LOGO_SIZE,NULL);
Ins_DrawInstitutionLogo (Ins.InsCod,Ins.ShortName,Rec_INSTITUTION_LOGO_SIZE,NULL);
fprintf (Gbl.F.Out,"</td>"
"<td class=\"%s\" style=\"text-align:left;"
" vertical-align:middle;\">"

View File

@ -27,6 +27,8 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_bool.h"
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/