From db9ac7fb0efb1dd7cfb2f0fd6f1966ef998e6134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Ca=C3=B1as=20Vargas?= Date: Fri, 9 Dec 2016 13:59:33 +0100 Subject: [PATCH] Version 16.92 --- swad_action.c | 3 +- swad_agenda.c | 37 +++++----- swad_changelog.h | 4 +- swad_follow.c | 5 +- swad_photo.c | 2 +- swad_preference.c | 1 + swad_privacy.c | 12 ++-- swad_privacy.h | 16 ++--- swad_privacy_visibility_type.h | 50 ++++++++++++++ swad_profile.c | 4 +- swad_record.c | 64 ++++++++---------- swad_text.c | 23 ++++++- swad_user.c | 120 +++++++++++++++++++++++++++++++-- swad_user.h | 8 ++- 14 files changed, 262 insertions(+), 87 deletions(-) create mode 100644 swad_privacy_visibility_type.h diff --git a/swad_action.c b/swad_action.c index 3056967c..4cbd30df 100644 --- a/swad_action.c +++ b/swad_action.c @@ -60,6 +60,7 @@ #include "swad_password.h" #include "swad_photo.h" #include "swad_preference.h" +#include "swad_privacy.h" #include "swad_profile.h" #include "swad_QR.h" #include "swad_report.h" @@ -2352,7 +2353,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActLstTchAll */{ 578,-1,TabUnk,ActLstTch ,0x1F0,0x1F0,0x1E0,Act_CONT_NORM,Act_BLNK_WINDOW,NULL ,Usr_ListAllDataTchs ,NULL}, /* ActSeeRecOneStd */{1174,-1,TabUnk,ActLstStd ,0x118,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneStdCrs,NULL}, - /* ActSeeRecOneTch */{1175,-1,TabUnk,ActLstTch ,0x1FE,0x1FE,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneTchCrs,NULL}, + /* ActSeeRecOneTch */{1175,-1,TabUnk,ActLstTch ,0x1FC,0x1FC,0x1FC,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_GetUsrAndShowRecordOneTchCrs,NULL}, /* ActSeeRecSevGst */{1187,-1,TabUnk,ActLstOth ,0x100,0x100,0x100,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsGsts ,NULL}, /* ActSeeRecSevStd */{ 89,-1,TabUnk,ActLstStd ,0x118,0x100,0x000,Act_CONT_NORM,Act_THIS_WINDOW,NULL ,Rec_ListRecordsStdsForEdit ,NULL}, diff --git a/swad_agenda.c b/swad_agenda.c index efefe1d8..13446683 100644 --- a/swad_agenda.c +++ b/swad_agenda.c @@ -175,28 +175,33 @@ void Agd_ShowUsrAgenda (void) extern const char *Txt_Public_agenda_USER; extern const char *Txt_User_not_found_or_you_do_not_have_permission_; bool ItsMe; + bool Error = true; /***** Get user *****/ if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) - { - /***** Start frame *****/ - sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Other.UsrDat.FullName); - ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); - Lay_StartRoundFrame ("100%",Gbl.Title, - ItsMe ? Agd_PutIconToViewEditMyFullAgenda : - NULL, - Hlp_PROFILE_Agenda_public_agenda); + if (Usr_CheckIfICanViewUsrAgenda (&Gbl.Usrs.Other.UsrDat)) + { + Error = false; - /***** Show the current events in the user's agenda *****/ - Agd_ShowEventsToday (Agd_OTHER_PUBLIC_AGENDA_TODAY); + /***** Start frame *****/ + sprintf (Gbl.Title,Txt_Public_agenda_USER,Gbl.Usrs.Other.UsrDat.FullName); + ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Usrs.Other.UsrDat.UsrCod); + Lay_StartRoundFrame ("100%",Gbl.Title, + ItsMe ? Agd_PutIconToViewEditMyFullAgenda : + NULL, + Hlp_PROFILE_Agenda_public_agenda); - /***** Show all the visible events in the user's agenda *****/ - Agd_ShowEvents (Agd_OTHER_PUBLIC_AGENDA); + /***** Show the current events in the user's agenda *****/ + Agd_ShowEventsToday (Agd_OTHER_PUBLIC_AGENDA_TODAY); - /***** End frame *****/ - Lay_EndRoundFrame (); - } - else + /***** Show all the visible events in the user's agenda *****/ + Agd_ShowEvents (Agd_OTHER_PUBLIC_AGENDA); + + /***** End frame *****/ + Lay_EndRoundFrame (); + } + + if (Error) Lay_ShowAlert (Lay_WARNING,Txt_User_not_found_or_you_do_not_have_permission_); } diff --git a/swad_changelog.h b/swad_changelog.h index 6e5627b0..afef8f26 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -185,13 +185,15 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.91.6 (2016-12-09)" +#define Log_PLATFORM_VERSION "SWAD 16.92 (2016-12-09)" #define CSS_FILE "swad16.86.5.css" #define JS_FILE "swad16.90.2.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 /* + Version 16.92: Dec 09, 2016 Teachers' record cards can be viewed by users sharing courses with them even if no course is selected. + Code refactoring in user's record card. (210269 lines) Version 16.91.6: Dec 09, 2016 Code refactoring in agenda. (210128 lines) Version 16.91.5: Dec 08, 2016 Removed author in agenda events. (210148 lines) Version 16.91.4: Dec 07, 2016 Default ordering in agendas is start date. (210189 lines) diff --git a/swad_follow.c b/swad_follow.c index 2df21749..6cc800b8 100644 --- a/swad_follow.c +++ b/swad_follow.c @@ -33,6 +33,7 @@ #include "swad_follow.h" #include "swad_global.h" #include "swad_notification.h" +#include "swad_privacy.h" #include "swad_profile.h" #include "swad_user.h" @@ -683,7 +684,7 @@ static void Fol_ShowFollowedOrFollower (const struct UsrData *UsrDat) extern const char *Txt_Follow; bool ShowPhoto; char PhotoURL[PATH_MAX+1]; - bool Visible = Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat->UsrCod); + bool Visible = Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat); /***** Show user's photo *****/ fprintf (Gbl.F.Out,""); @@ -773,7 +774,7 @@ void Fol_FollowUsr (void) if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ()) { // Follow only if I can view his/her public profile - if (Pri_ShowIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,Gbl.Usrs.Other.UsrDat.UsrCod)) + if (Pri_ShowIsAllowed (Gbl.Usrs.Other.UsrDat.ProfileVisibility,&Gbl.Usrs.Other.UsrDat)) // Follow only if I do not follow him/her if (!Fol_CheckUsrIsFollowerOf (Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Other.UsrDat.UsrCod)) diff --git a/swad_photo.c b/swad_photo.c index 848a88b3..76804163 100644 --- a/swad_photo.c +++ b/swad_photo.c @@ -955,7 +955,7 @@ bool Pho_ShowUsrPhotoIsAllowed (const struct UsrData *UsrDat,char *PhotoURL) bool ICanSeePhoto; /***** Check if I can see the other's photo *****/ - ICanSeePhoto = Pri_ShowIsAllowed (UsrDat->PhotoVisibility,UsrDat->UsrCod); + ICanSeePhoto = Pri_ShowIsAllowed (UsrDat->PhotoVisibility,UsrDat); /***** Photo is shown if I can see it, and it exists *****/ return ICanSeePhoto ? Pho_BuildLinkToPhoto (UsrDat,PhotoURL) : diff --git a/swad_preference.c b/swad_preference.c index 40675f4c..09dfdc96 100644 --- a/swad_preference.c +++ b/swad_preference.c @@ -39,6 +39,7 @@ #include "swad_menu.h" #include "swad_parameter.h" #include "swad_preference.h" +#include "swad_privacy.h" #include "swad_text.h" /*****************************************************************************/ diff --git a/swad_privacy.c b/swad_privacy.c index 34555639..adc2f6f1 100644 --- a/swad_privacy.c +++ b/swad_privacy.c @@ -246,10 +246,10 @@ Pri_Visibility_t Pri_GetParamVisibility (const char *ParamName) /*****************************************************************************/ // Returns true if it can be shown and false if not. -bool Pri_ShowIsAllowed (Pri_Visibility_t Visibility,long OtherUsrCod) +bool Pri_ShowIsAllowed (Pri_Visibility_t Visibility,const struct UsrData *UsrDat) { /***** It's me? I always can see my things *****/ - if (OtherUsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) + if (UsrDat->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) return true; /***** System admins always can see others' profiles *****/ @@ -262,13 +262,9 @@ bool Pri_ShowIsAllowed (Pri_Visibility_t Visibility,long OtherUsrCod) case Pri_VISIBILITY_UNKNOWN: return false; // It's not me case Pri_VISIBILITY_USER: // Only visible by me and my teachers if I am a student or me and my students if I am a teacher - if (Gbl.Usrs.Me.Logged) - return Usr_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (OtherUsrCod); // Both users share the same course but whit different role - return false; + return Usr_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (UsrDat->UsrCod); // Both users share the same course but whit different role case Pri_VISIBILITY_COURSE: // Visible by users sharing courses with me - if (Gbl.Usrs.Me.Logged) - return Usr_CheckIfUsrSharesAnyOfMyCrs (OtherUsrCod); // Both users share the same course - return false; + return Usr_CheckIfUsrSharesAnyOfMyCrs (UsrDat); // Both users share the same course case Pri_VISIBILITY_SYSTEM: // Visible by any user logged in platform return Gbl.Usrs.Me.Logged; case Pri_VISIBILITY_WORLD: // Public, visible by everyone, even unlogged visitors diff --git a/swad_privacy.h b/swad_privacy.h index 5c0047a8..a8b81d75 100644 --- a/swad_privacy.h +++ b/swad_privacy.h @@ -27,22 +27,14 @@ /********************************* Headers ***********************************/ /*****************************************************************************/ +#include "swad_privacy_visibility_type.h" +#include "swad_user.h" + /*****************************************************************************/ /************************* Public types and constants ************************/ /*****************************************************************************/ /***** Visibility (who can see user's photo / public profile) *****/ -#define Pri_NUM_OPTIONS_PRIVACY 5 - -typedef enum - { - Pri_VISIBILITY_UNKNOWN = 0, // Only visible by me and my teachers if I am a student or my students if I am a teacher - Pri_VISIBILITY_USER = 1, // Only visible by me and my teachers if I am a student or my students if I am a teacher - Pri_VISIBILITY_COURSE = 2, // Visible by users sharing courses with me - Pri_VISIBILITY_SYSTEM = 3, // Visible by any user logged in platform - Pri_VISIBILITY_WORLD = 4, // Public, visible by all the people, even unlogged visitors - } Pri_Visibility_t; - #define Pri_PHOTO_VISIBILITY_DEFAULT Pri_VISIBILITY_SYSTEM #define Pri_PROFILE_VISIBILITY_DEFAULT Pri_VISIBILITY_SYSTEM @@ -56,6 +48,6 @@ void Pri_EditMyPrivacy (void); Pri_Visibility_t Pri_GetVisibilityFromStr (const char *Str); Pri_Visibility_t Pri_GetParamVisibility (const char *ParamName); -bool Pri_ShowIsAllowed (Pri_Visibility_t Visibility,long OtherUsrCod); +bool Pri_ShowIsAllowed (Pri_Visibility_t Visibility,const struct UsrData *UsrDat); #endif diff --git a/swad_privacy_visibility_type.h b/swad_privacy_visibility_type.h new file mode 100644 index 00000000..a53f1674 --- /dev/null +++ b/swad_privacy_visibility_type.h @@ -0,0 +1,50 @@ +// swad_privacy_visibility_type.h: definition of privacy visibility type + +#ifndef _SWAD_PRI_VIS_T +#define _SWAD_PRI_VIS_T +/* + SWAD (Shared Workspace At a Distance in Spanish), + is a web platform developed at the University of Granada (Spain), + and used to support university teaching. + + This file is part of SWAD core. + Copyright (C) 1999-2016 Antonio Cañas Vargas + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/*****************************************************************************/ +/********************************* Headers ***********************************/ +/*****************************************************************************/ + +/*****************************************************************************/ +/************************* Public types and constants ************************/ +/*****************************************************************************/ + +/***** Visibility (who can see user's photo / public profile) *****/ +#define Pri_NUM_OPTIONS_PRIVACY 5 + +typedef enum + { + Pri_VISIBILITY_UNKNOWN = 0, // Only visible by me and my teachers if I am a student or my students if I am a teacher + Pri_VISIBILITY_USER = 1, // Only visible by me and my teachers if I am a student or my students if I am a teacher + Pri_VISIBILITY_COURSE = 2, // Visible by users sharing courses with me + Pri_VISIBILITY_SYSTEM = 3, // Visible by any user logged in platform + Pri_VISIBILITY_WORLD = 4, // Public, visible by all the people, even unlogged visitors + } Pri_Visibility_t; + +/*****************************************************************************/ +/***************************** Public prototypes *****************************/ +/*****************************************************************************/ + +#endif diff --git a/swad_profile.c b/swad_profile.c index c8492e3b..853e5b29 100644 --- a/swad_profile.c +++ b/swad_profile.c @@ -268,7 +268,7 @@ bool Prf_ShowUserProfile (struct UsrData *UsrDat) } /***** Check if I can see the public profile *****/ - if (Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat->UsrCod)) + if (Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat)) { if (!ItsMe && // If not it's me... Gbl.CurrentCrs.Crs.CrsCod > 0) // ...and a course is selected @@ -1485,7 +1485,7 @@ void Prf_ShowUsrInRanking (const struct UsrData *UsrDat,unsigned Rank) extern const char *Txt_View_public_profile; bool ShowPhoto; char PhotoURL[PATH_MAX+1]; - bool Visible = Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat->UsrCod); + bool Visible = Pri_ShowIsAllowed (UsrDat->ProfileVisibility,UsrDat); fprintf (Gbl.F.Out,"" diff --git a/swad_record.c b/swad_record.c index def9504e..23fad569 100644 --- a/swad_record.c +++ b/swad_record.c @@ -42,6 +42,7 @@ #include "swad_parameter.h" #include "swad_photo.h" #include "swad_preference.h" +#include "swad_privacy.h" #include "swad_QR.h" #include "swad_record.h" #include "swad_user.h" @@ -1030,9 +1031,7 @@ void Rec_GetUsrAndShowRecordOneStdCrs (void) Usr_GetParamOtherUsrCodEncryptedAndGetListIDs (); if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Get from the database the data of the student - if ((Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = - Rol_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Other.UsrDat.UsrCod)) == Rol_STUDENT) + if (Usr_CheckIfICanViewRecordStd (&Gbl.Usrs.Other.UsrDat)) Rec_ShowRecordOneStdCrs (); } @@ -1217,9 +1216,7 @@ void Rec_GetUsrAndShowRecordOneTchCrs (void) /***** Show the record *****/ if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&Gbl.Usrs.Other.UsrDat)) // Get from the database the data of the teacher - if ((Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB = - Rol_GetRoleInCrs (Gbl.CurrentCrs.Crs.CrsCod, - Gbl.Usrs.Other.UsrDat.UsrCod)) == Rol_TEACHER) + if (Usr_CheckIfICanViewRecordTch (&Gbl.Usrs.Other.UsrDat)) Rec_ShowRecordOneTchCrs (); } @@ -2306,6 +2303,7 @@ static void Rec_PutIconsCommands (void) extern struct Act_Actions Act_Actions[Act_NUM_ACTIONS]; extern const char *Txt_Edit_my_personal_data; extern const char *Txt_View_record_for_this_course; + extern const char *Txt_View_record_and_office_hours; extern const char *Txt_View_agenda; extern const char *Txt_Admin_user; extern const char *Txt_Write_a_message; @@ -2318,16 +2316,12 @@ static void Rec_PutIconsCommands (void) bool IAmLoggedAsStudent = (Gbl.Usrs.Me.LoggedRole == Rol_STUDENT); // My current role is student bool IAmLoggedAsTeacher = (Gbl.Usrs.Me.LoggedRole == Rol_TEACHER); // My current role is teacher bool IAmLoggedAsSysAdm = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); // My current role is superuser - bool IBelongToCurrentCrs = (Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT || - Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER); - bool HeBelongsToCurrentCrs = (Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STUDENT || - Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_TEACHER); - bool ICanViewAgenda; if (!Gbl.Form.Inside && // Only if not inside another form Act_Actions[Gbl.Action.Act].BrowserWindow == Act_THIS_WINDOW && // Only in main window Gbl.Usrs.Me.Logged) // Only if I am logged { + /***** Start container *****/ fprintf (Gbl.F.Out,"
"); /***** Button to edit my record card *****/ @@ -2337,39 +2331,34 @@ static void Rec_PutIconsCommands (void) Txt_Edit_my_personal_data,NULL, NULL); - /***** Button to view user's record card in course when: - - a course is selected && the user belongs to it && - - I can view user's record card in course *****/ - if (HeBelongsToCurrentCrs && (IBelongToCurrentCrs || IAmLoggedAsSysAdm)) - Lay_PutContextualLink (Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STUDENT ? ActSeeRecOneStd : - ActSeeRecOneTch, + /***** Button to view user's record card *****/ + if (Usr_CheckIfICanViewRecordStd (Gbl.Record.UsrDat)) + /* View student's records: common record card and course record card */ + Lay_PutContextualLink (ActSeeRecOneStd, + Rec_PutParamUsrCodEncrypted, + "card64x64.gif", + Txt_View_record_for_this_course,NULL, + NULL); + else if (Usr_CheckIfICanViewRecordTch (Gbl.Record.UsrDat)) + Lay_PutContextualLink (ActSeeRecOneTch, Rec_PutParamUsrCodEncrypted, "card64x64.gif", - Txt_View_record_for_this_course,NULL, - NULL); + Txt_View_record_and_office_hours,NULL, + NULL); - /***** Button to view user's agenda - when I share any course with him/her *****/ + /***** Button to view user's agenda *****/ if (ItsMe) Lay_PutContextualLink (ActSeeMyAgd, NULL, "date64x64.gif", Txt_View_agenda,NULL, NULL); - else // Not me - { - if (!(ICanViewAgenda = (IBelongToCurrentCrs && - HeBelongsToCurrentCrs) || // Course selected and we both belong to it - IAmLoggedAsSysAdm)) // I am system admin - // The following slow check is made only if the previous fails - ICanViewAgenda = Usr_CheckIfUsrSharesAnyOfMyCrs (Gbl.Record.UsrDat->UsrCod); - if (ICanViewAgenda) - Lay_PutContextualLink (ActSeeUsrAgd, - Rec_PutParamUsrCodEncrypted, - "date64x64.gif", - Txt_View_agenda,NULL, - NULL); - } + else if (Usr_CheckIfICanViewUsrAgenda (Gbl.Record.UsrDat)) + Lay_PutContextualLink (ActSeeUsrAgd, + Rec_PutParamUsrCodEncrypted, + "date64x64.gif", + Txt_View_agenda,NULL, + NULL); /***** Button to admin user *****/ if (ItsMe || @@ -2386,7 +2375,7 @@ static void Rec_PutIconsCommands (void) Txt_Admin_user,NULL, NULL); - if (Gbl.CurrentCrs.Crs.CrsCod > 0 && // A course is selected + if (Gbl.CurrentCrs.Crs.CrsCod > 0 && // A course is selected Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STUDENT && // He/she is a student in the current course (ItsMe || IAmLoggedAsTeacher || IAmLoggedAsSysAdm)) // I can view { @@ -2448,7 +2437,7 @@ static void Rec_PutIconsCommands (void) else // I do not follow user if (Pri_ShowIsAllowed (Gbl.Record.UsrDat->ProfileVisibility, - Gbl.Record.UsrDat->UsrCod)) + Gbl.Record.UsrDat)) // I can view user's profile Lay_PutContextualLink (ActFolUsr,Rec_PutParamUsrCodEncrypted, "follow64x64.png", @@ -2456,6 +2445,7 @@ static void Rec_PutIconsCommands (void) NULL); // Put button to follow } + /***** End container *****/ fprintf (Gbl.F.Out,"
"); } } diff --git a/swad_text.c b/swad_text.c index 2231d679..ec56eec2 100644 --- a/swad_text.c +++ b/swad_text.c @@ -50381,6 +50381,27 @@ const char *Txt_View_public_profile = "Ver perfil público"; #endif +const char *Txt_View_record_and_office_hours = +#if L==1 + "Veure fitxa i horari de tutories"; +#elif L==2 + "Anzeigen profil und Geschäftszeiten"; +#elif L==3 + "View record and office hours"; +#elif L==4 + "Ver ficha y horario de tutorías"; +#elif L==5 + "Voir carte et heures de tuteur"; +#elif L==6 + "Ver ficha y horario de tutorías"; // Okoteve traducción +#elif L==7 + "Vedi scheda e orario di tutoraggi"; +#elif L==8 + "Zobacz rekord i godziny pracy"; +#elif L==9 + "Ver cartão e horário de tutor"; +#endif + const char *Txt_View_record_for_this_course = #if L==1 "Veure fitxa en aquesta assignatura"; @@ -50399,7 +50420,7 @@ const char *Txt_View_record_for_this_course = #elif L==8 "Zobacz rekord na ten kurs"; #elif L==9 - "Meu cartão em disciplina"; + "Ver cartão em disciplina"; #endif const char *Txt_View_survey = diff --git a/swad_user.c b/swad_user.c index d90c8740..0b5ebb59 100644 --- a/swad_user.c +++ b/swad_user.c @@ -54,6 +54,7 @@ #include "swad_parameter.h" #include "swad_password.h" #include "swad_preference.h" +#include "swad_privacy.h" #include "swad_QR.h" #include "swad_record.h" #include "swad_tab.h" @@ -895,20 +896,127 @@ unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole, return NumUsrs; } +/*****************************************************************************/ +/************ Check if I can view the record card of a student ***************/ +/*****************************************************************************/ + +bool Usr_CheckIfICanViewRecordStd (const struct UsrData *UsrDat) + { + bool HeIsAStudentInCurrentCrs = UsrDat->RoleInCurrentCrsDB == Rol_STUDENT; + bool IBelongToCurrentCrs = Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT || + Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER; + bool IAmLoggedAsSysAdm = Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM; + + return HeIsAStudentInCurrentCrs && // Course is selected and user is student in it + (IBelongToCurrentCrs || // I am student or teacher in current course + IAmLoggedAsSysAdm); // I am logged as system admin + } + +/*****************************************************************************/ +/************ Check if I can view the record card of a teacher ***************/ +/*****************************************************************************/ + +bool Usr_CheckIfICanViewRecordTch (const struct UsrData *UsrDat) + { + /***** 1. Fast check: Is he/she a teacher in any course? *****/ + if (!(UsrDat->Roles & (1 << Rol_TEACHER))) + return false; + + /***** 2. Fast check: Am I logged? *****/ + if (!Gbl.Usrs.Me.Logged) + return false; + + /***** 3. Fast check: It's me? *****/ + if (Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod) + return true; + + /***** 4. Fast check: Am I logged as system admin? *****/ + if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) + return true; + + /***** 5. Slow check: Get if user shares any course with me from database *****/ + return Usr_CheckIfUsrSharesAnyOfMyCrs (UsrDat); + } + +/*****************************************************************************/ +/******************* Check if I can view a user's agenda *********************/ +/*****************************************************************************/ + +bool Usr_CheckIfICanViewUsrAgenda (const struct UsrData *UsrDat) + { + /***** 1. Fast check: Am I logged? *****/ + if (!Gbl.Usrs.Me.Logged) + return false; + + /***** 2. Fast check: It's me? *****/ + if (Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod) + return true; + + /***** 3. Fast check: Am I logged as system admin? *****/ + if (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM) + return true; + + /***** 4. Slow check: Get if user shares any course with me from database *****/ + return Usr_CheckIfUsrSharesAnyOfMyCrs (UsrDat); + } + /*****************************************************************************/ /*************** Check if a user belongs to any of my courses ****************/ /*****************************************************************************/ -bool Usr_CheckIfUsrSharesAnyOfMyCrs (long UsrCod) +bool Usr_CheckIfUsrSharesAnyOfMyCrs (const struct UsrData *UsrDat) { char Query[256]; + bool IBelongToCurrentCrs; + bool HeBelongsToCurrentCrs; + static struct + { + long UsrCodChecked; + bool UsrSharesAnyOfMyCrs; + } Cached = + { + -1L, + false + }; // A cache. If this function is called consecutive times + // with the same user, only the first time is slow - /***** Get if a user shares any course with me from database *****/ + /***** 1. Fast check: Am I logged? *****/ + if (!Gbl.Usrs.Me.Logged) + return false; + + /***** 2. Fast check: It is a valid user code? *****/ + if (UsrDat->UsrCod <= 0) + return false; + + /***** 3. Fast check: It's me? *****/ + if (Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod) + return true; + + /***** 4. Fast check: Does he/she belong to any course? *****/ + if (!(UsrDat->Roles & (1 << Rol_STUDENT || + 1 << Rol_TEACHER))) + return false; + + /***** 5. Fast check: Is course selected and we both belong to it? *****/ + IBelongToCurrentCrs = Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_STUDENT || + Gbl.Usrs.Me.UsrDat.RoleInCurrentCrsDB == Rol_TEACHER; + HeBelongsToCurrentCrs = UsrDat->RoleInCurrentCrsDB == Rol_STUDENT || + UsrDat->RoleInCurrentCrsDB == Rol_TEACHER; + if (IBelongToCurrentCrs && HeBelongsToCurrentCrs) // Course selected and we both belong to it + return true; + + /***** 6. Fast check: Is already calculated if user shares any course with me? *****/ + if (UsrDat->UsrCod == Cached.UsrCodChecked) + return Cached.UsrSharesAnyOfMyCrs; + + /***** 5. Slow check: Get if user shares any course with me from database *****/ sprintf (Query,"SELECT COUNT(*) FROM crs_usr" " WHERE UsrCod='%ld'" " AND CrsCod IN (SELECT CrsCod FROM my_courses_tmp)", - UsrCod); - return (DB_QueryCOUNT (Query,"can not check if a user shares any course with you") != 0); + UsrDat->UsrCod); + Cached.UsrSharesAnyOfMyCrs = DB_QueryCOUNT (Query,"can not check if a user shares any course with you") != 0; + Cached.UsrCodChecked = UsrDat->UsrCod; + return Cached.UsrSharesAnyOfMyCrs; } /*****************************************************************************/ @@ -920,6 +1028,10 @@ bool Usr_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (long UsrCod) char Query[512]; bool UsrSharesAnyOfMyCrsWithDifferentRole; + /***** 1. Fast check: Am I logged? *****/ + if (!Gbl.Usrs.Me.Logged) + return false; + /***** Remove temporary table if exists *****/ sprintf (Query,"DROP TEMPORARY TABLE IF EXISTS usr_courses_tmp"); if (mysql_query (&Gbl.mysql,Query)) diff --git a/swad_user.h b/swad_user.h index 1b337835..5cd7b703 100644 --- a/swad_user.h +++ b/swad_user.h @@ -38,7 +38,7 @@ #include "swad_layout.h" #include "swad_menu.h" #include "swad_nickname.h" -#include "swad_privacy.h" +#include "swad_privacy_visibility_type.h" #include "swad_role.h" #include "swad_scope.h" #include "swad_search.h" @@ -232,7 +232,11 @@ unsigned Usr_GetNumCrssOfUsrWithARoleNotAccepted (long UsrCod,Rol_Role_t Role); unsigned Usr_GetNumUsrsInCrssOfAUsr (long UsrCod,Rol_Role_t UsrRole, Rol_Role_t OthersRole); -bool Usr_CheckIfUsrSharesAnyOfMyCrs (long UsrCod); + +bool Usr_CheckIfICanViewRecordStd (const struct UsrData *UsrDat); +bool Usr_CheckIfICanViewRecordTch (const struct UsrData *UsrDat); +bool Usr_CheckIfICanViewUsrAgenda (const struct UsrData *UsrDat); +bool Usr_CheckIfUsrSharesAnyOfMyCrs (const struct UsrData *UsrDat); bool Usr_CheckIfUsrSharesAnyOfMyCrsWithDifferentRole (long UsrCod); void Usr_GetMyCountrs (void);