diff --git a/swad_ID.c b/swad_ID.c
index 68e3f4b0d..0e867fd12 100644
--- a/swad_ID.c
+++ b/swad_ID.c
@@ -461,7 +461,7 @@ static void ID_PutLinkToConfirmID (struct UsrData *UsrDat,unsigned NumID,
case Rol_TCH:
NextAction = ActCnfID_Tch;
break;
- default: // Guest, visitor or admin
+ default: // Guest, user or admin
NextAction = ActCnfID_Oth;
break;
}
@@ -521,7 +521,7 @@ void ID_PutLinkToChangeUsrIDs (void)
case Rol_TCH:
NextAction = ActFrmIDsTch;
break;
- default: // Guest, visitor or admin
+ default: // Guest, user or admin
NextAction = ActFrmIDsOth;
break;
}
@@ -623,7 +623,7 @@ void ID_ShowFormChangeUsrID (const struct UsrData *UsrDat,bool ItsMe)
case Rol_TCH:
NextAction = ActRemID_Tch;
break;
- default: // Guest, visitor or admin
+ default: // Guest, user or admin
NextAction = ActRemID_Oth;
break;
}
@@ -688,7 +688,7 @@ void ID_ShowFormChangeUsrID (const struct UsrData *UsrDat,bool ItsMe)
case Rol_TCH:
NextAction = ActNewID_Tch;
break;
- default: // Guest, visitor or admin
+ default: // Guest, user or admin
NextAction = ActNewID_Oth;
break;
}
diff --git a/swad_changelog.h b/swad_changelog.h
index a713b50a0..4c6980c97 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -233,13 +233,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 16.220.10 (2017-05-22)"
+#define Log_PLATFORM_VERSION "SWAD 16.220.11 (2017-05-22)"
#define CSS_FILE "swad16.209.3.css"
#define JS_FILE "swad16.206.3.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.220.11:May 22, 2017 Changes related with new role. Not finished. (220019 lines)
Version 16.220.10:May 22, 2017 Changes related with new role. Not finished. (219775 lines)
Version 16.220.9: May 22, 2017 Changes related with new role. Not finished. (219720 lines)
Version 16.220.8: May 22, 2017 Changes related with new role. Not finished. (219663 lines)
diff --git a/swad_enrolment.c b/swad_enrolment.c
index 1036dc0bc..5a510eb97 100644
--- a/swad_enrolment.c
+++ b/swad_enrolment.c
@@ -55,7 +55,7 @@ static const bool Enr_ICanAdminOtherUsrs[Rol_NUM_ROLES] =
false, // Rol_GST
false, // Rol_USR
false, // Rol_STD
- false, // Rol_NED_TCH
+ false, // Rol_NET
/* Users who can admin */
true, // Rol_TCH
diff --git a/swad_file_browser.c b/swad_file_browser.c
index 42a691ffd..2dd27d9ed 100644
--- a/swad_file_browser.c
+++ b/swad_file_browser.c
@@ -1115,7 +1115,7 @@ const unsigned long long Brw_MAX_QUOTA_BRIEF[Rol_NUM_ROLES] = // MaxRole is used
0, // Rol_GST
0, // Rol_USR
32ULL*Brw_GiB, // Rol_STD
- 32ULL*Brw_GiB, // Rol_NED_TCH
+ 32ULL*Brw_GiB, // Rol_NET
64ULL*Brw_GiB, // Rol_TCH
0, // Rol_DEG_ADM
0, // Rol_CTR_ADM
diff --git a/swad_mail.c b/swad_mail.c
index 76300716d..4481ccb34 100644
--- a/swad_mail.c
+++ b/swad_mail.c
@@ -1127,6 +1127,7 @@ long Mai_GetUsrCodFromEmail (const char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1])
void Mai_PutLinkToChangeOtherUsrEmails (void)
{
extern const char *Txt_Change_email;
+ Act_Action_t NextAction;
/***** Link for changing the password *****/
if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
@@ -1135,13 +1136,26 @@ void Mai_PutLinkToChangeOtherUsrEmails (void)
Txt_Change_email,Txt_Change_email,
NULL);
else // Not me
- Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActFrmMaiStd :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActFrmMaiTch :
- ActFrmMaiOth),
- NULL,Usr_PutParamOtherUsrCodEncrypted,
+ {
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActFrmMaiStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActFrmMaiTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActFrmMaiOth;
+ break;
+ }
+ Lay_PutContextualLink (NextAction,NULL,
+ Usr_PutParamOtherUsrCodEncrypted,
"msg64x64.gif",
Txt_Change_email,Txt_Change_email,
NULL);
+ }
}
/*****************************************************************************/
@@ -1203,6 +1217,7 @@ void Mai_ShowFormChangeUsrEmail (const struct UsrData *UsrDat,bool ItsMe)
unsigned NumEmails;
unsigned NumEmail;
bool Confirmed;
+ Act_Action_t NextAction;
/***** Get my emails *****/
sprintf (Query,"SELECT E_mail,Confirmed FROM usr_emails"
@@ -1248,9 +1263,20 @@ void Mai_ShowFormChangeUsrEmail (const struct UsrData *UsrDat,bool ItsMe)
Act_FormStart (ActRemMaiMe);
else
{
- Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActRemMaiStd :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActRemMaiTch :
- ActRemMaiOth)); // Guest, visitor or admin
+ switch (UsrDat->RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActRemMaiStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActRemMaiTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActRemMaiOth;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
fprintf (Gbl.F.Out,"",
@@ -1284,9 +1310,20 @@ void Mai_ShowFormChangeUsrEmail (const struct UsrData *UsrDat,bool ItsMe)
Act_FormStart (ActNewMaiMe);
else
{
- Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActNewMaiStd :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActNewMaiTch :
- ActNewMaiOth)); // Guest, visitor or admin
+ switch (UsrDat->RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActNewMaiStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActNewMaiTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActNewMaiOth;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
fprintf (Gbl.F.Out,"",
@@ -1314,9 +1351,20 @@ void Mai_ShowFormChangeUsrEmail (const struct UsrData *UsrDat,bool ItsMe)
Act_FormStart (ActNewMaiMe);
else
{
- Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActNewMaiStd :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActNewMaiTch :
- ActNewMaiOth)); // Guest, visitor or admin
+ switch (UsrDat->RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActNewMaiStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActNewMaiTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActNewMaiOth;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
fprintf (Gbl.F.Out,"
"
@@ -1832,18 +1880,21 @@ bool Mai_ICanSeeOtherUsrEmail (const struct UsrData *UsrDat)
if (UsrDat->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
return true;
- /* Check if I have permission to see another user's email */
+ /***** Check if I have permission to see another user's email *****/
switch (Gbl.Usrs.Me.LoggedRole)
{
case Rol_STD:
/* If I am a student in the current course,
I can see the email of confirmed teachers */
- return (UsrDat->RoleInCurrentCrsDB == Rol_TCH && // A teacher
- UsrDat->Accepted); // who accepted registration
+ return (UsrDat->RoleInCurrentCrsDB == Rol_NET || // A non-editing teacher
+ UsrDat->RoleInCurrentCrsDB == Rol_TCH) && // or a teacher
+ UsrDat->Accepted; // who accepted registration
+ case Rol_NET:
case Rol_TCH:
/* If I am a teacher in the current course,
I can see the email of confirmed students and teachers */
return (UsrDat->RoleInCurrentCrsDB == Rol_STD || // A student
+ UsrDat->RoleInCurrentCrsDB == Rol_NET || // or a non-editing teacher
UsrDat->RoleInCurrentCrsDB == Rol_TCH) && // or a teacher
UsrDat->Accepted; // who accepted registration
case Rol_DEG_ADM:
diff --git a/swad_mark.c b/swad_mark.c
index ba8d5a02f..19245157f 100644
--- a/swad_mark.c
+++ b/swad_mark.c
@@ -624,7 +624,7 @@ void Mrk_ShowMyMarks (void)
/***** Set the student whose marks will be shown *****/
if (Gbl.Usrs.Me.LoggedRole == Rol_STD) // If I am logged as student...
UsrDat = &Gbl.Usrs.Me.UsrDat; // ...use my list of IDs
- else // If I am logged as teacher, administrator, superuser...
+ else // If I am logged as non-editing teacher, teacher or admin
{
/* Select a random student from the course */
if (Gbl.CurrentCrs.Grps.GrpCod > 0) // Group zone
diff --git a/swad_message.c b/swad_message.c
index c49d4fdf9..7bbe0a161 100644
--- a/swad_message.c
+++ b/swad_message.c
@@ -181,8 +181,9 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1])
bool ShowUsrsInCrs = false;
bool GetUsrsInCrs;
- Gbl.Usrs.LstUsrs[Rol_TCH].NumUsrs =
- Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs = 0;
+ Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs =
+ Gbl.Usrs.LstUsrs[Rol_NET].NumUsrs =
+ Gbl.Usrs.LstUsrs[Rol_TCH].NumUsrs = 0;
/***** Get parameter that indicates if the message is a reply to another message *****/
if ((Gbl.Msg.Reply.IsReply = Par_GetParToBool ("IsReply")))
@@ -213,10 +214,12 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1])
Grp_GetParCodsSeveralGrpsToShowUsrs ();
/***** Get and order lists of users from this course *****/
- Usr_GetListUsrs (Rol_TCH,Sco_SCOPE_CRS);
Usr_GetListUsrs (Rol_STD,Sco_SCOPE_CRS);
- NumUsrsInCrs = Gbl.Usrs.LstUsrs[Rol_TCH].NumUsrs +
- Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs;
+ Usr_GetListUsrs (Rol_NET,Sco_SCOPE_CRS);
+ Usr_GetListUsrs (Rol_TCH,Sco_SCOPE_CRS);
+ NumUsrsInCrs = Gbl.Usrs.LstUsrs[Rol_STD].NumUsrs + // Students
+ Gbl.Usrs.LstUsrs[Rol_NET].NumUsrs + // Non-editing teachers
+ Gbl.Usrs.LstUsrs[Rol_TCH].NumUsrs; // Teachers
}
/***** Start frame *****/
@@ -288,6 +291,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1])
if (ShowUsrsInCrs)
{
Usr_ListUsersToSelect (Rol_TCH); // All teachers in course
+ Usr_ListUsersToSelect (Rol_NET); // All non-editing teachers in course
Usr_ListUsersToSelect (Rol_STD); // All students in selected groups
}
Msg_WriteFormUsrsIDsOrNicksOtherRecipients (); // Other users (nicknames)
@@ -325,6 +329,7 @@ static void Msg_PutFormMsgUsrs (char Content[Cns_MAX_BYTES_LONG_TEXT + 1])
if (GetUsrsInCrs)
{
Usr_FreeUsrsList (Rol_TCH);
+ Usr_FreeUsrsList (Rol_NET);
Usr_FreeUsrsList (Rol_STD);
}
diff --git a/swad_password.c b/swad_password.c
index bc8664150..2137327cd 100644
--- a/swad_password.c
+++ b/swad_password.c
@@ -813,6 +813,7 @@ void Pwd_ShowFormOthPwd (void)
extern const char *Txt_Password;
extern const char *Txt_Change_password;
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
+ Act_Action_t NextAction;
/***** Get user whose password must be changed *****/
if (Usr_GetParamOtherUsrCodEncryptedAndGetUsrData ())
@@ -828,9 +829,20 @@ void Pwd_ShowFormOthPwd (void)
/***** Form to change password *****/
/* Start form */
- Act_FormStart ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActChgPwdStd :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActChgPwdTch :
- ActChgPwdOth));
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActChgPwdStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActChgPwdTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActChgPwdOth;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamOtherUsrCodEncrypted ();
/* New password */
@@ -874,18 +886,32 @@ void Pwd_PutLinkToChangeMyPassword (void)
void Pwd_PutLinkToChangeOtherUsrPassword (void)
{
extern const char *Txt_Change_password;
+ Act_Action_t NextAction;
/***** Link for changing the password *****/
if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
Pwd_PutLinkToChangeMyPassword ();
else // Not me
- Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActFrmPwdStd :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActFrmPwdTch :
- ActFrmPwdOth),
- NULL,Usr_PutParamOtherUsrCodEncrypted,
+ {
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActFrmPwdStd;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActFrmPwdTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActFrmPwdOth;
+ break;
+ }
+ Lay_PutContextualLink (NextAction,NULL,
+ Usr_PutParamOtherUsrCodEncrypted,
"key64x64.gif",
Txt_Change_password,Txt_Change_password,
NULL);
+ }
}
/*****************************************************************************/
diff --git a/swad_photo.c b/swad_photo.c
index 1019277bd..a97a4fb5c 100644
--- a/swad_photo.c
+++ b/swad_photo.c
@@ -140,9 +140,9 @@ bool Pho_ICanChangeOtherUsrPhoto (const struct UsrData *UsrDat)
switch (Gbl.Usrs.Me.LoggedRole)
{
case Rol_TCH:
- /* Check 1: I can change the photo of confirmed students */
+ /* A teacher can change the photo of confirmed students */
if (UsrDat->RoleInCurrentCrsDB == Rol_STD && // A student
- UsrDat->Accepted) // who accepted registration
+ UsrDat->Accepted) // who accepted registration
return true;
return false;
@@ -185,6 +185,7 @@ void Pho_PutLinkToChangeOtherUsrPhoto (void)
bool PhotoExists;
char PhotoURL[PATH_MAX + 1];
const char *TitleText;
+ Act_Action_t NextAction;
/***** Link for changing / uploading the photo *****/
if (Gbl.Usrs.Other.UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod) // It's me
@@ -195,10 +196,21 @@ void Pho_PutLinkToChangeOtherUsrPhoto (void)
PhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL);
TitleText = PhotoExists ? Txt_Change_photo :
Txt_Upload_photo;
- Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActReqStdPho :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActReqTchPho :
- ActReqOthPho), // Guest, visitor or admin
- NULL,Usr_PutParamOtherUsrCodEncrypted,
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActReqStdPho;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActReqTchPho;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActReqOthPho;
+ break;
+ }
+ Lay_PutContextualLink (NextAction,NULL,
+ Usr_PutParamOtherUsrCodEncrypted,
"photo64x64.gif",
TitleText,TitleText,
NULL);
@@ -230,17 +242,31 @@ static void Pho_PutIconToRequestRemoveOtherUsrPhoto (void)
extern const char *Txt_Remove_photo;
char PhotoURL[PATH_MAX + 1];
bool PhotoExists;
+ Act_Action_t NextAction;
/***** Link to request the removal of another user's photo *****/
PhotoExists = Pho_BuildLinkToPhoto (&Gbl.Usrs.Other.UsrDat,PhotoURL);
if (PhotoExists)
- Lay_PutContextualLink ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActReqRemStdPho :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActReqRemTchPho :
- ActReqRemOthPho), // Guest, visitor or admin
- NULL,Usr_PutParamOtherUsrCodEncrypted,
+ {
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActReqRemStdPho;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActReqRemTchPho;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActReqRemOthPho;
+ break;
+ }
+ Lay_PutContextualLink (NextAction,NULL,
+ Usr_PutParamOtherUsrCodEncrypted,
"remove-on64x64.png",
Txt_Remove_photo,NULL,
NULL);
+ }
}
/*****************************************************************************/
@@ -295,6 +321,7 @@ static void Pho_ReqPhoto (const struct UsrData *UsrDat,const char *PhotoURL)
extern const char *Txt_File_with_the_photo;
extern const char *Txt_Upload_photo;
bool ItsMe = (UsrDat->UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod);
+ Act_Action_t NextAction;
/***** Start frame *****/
Lay_StartRoundFrame (NULL,Txt_Photo,
@@ -307,9 +334,20 @@ static void Pho_ReqPhoto (const struct UsrData *UsrDat,const char *PhotoURL)
Act_FormStart (ActDetMyPho);
else
{
- Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActDetStdPho :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActDetTchPho :
- ActDetOthPho)); // Guest, visitor or admin
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActDetStdPho;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActDetTchPho;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActDetOthPho;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
}
@@ -459,6 +497,7 @@ void Pho_ReqRemoveUsrPhoto (void)
extern const char *Txt_The_photo_no_longer_exists;
extern const char *Txt_User_not_found_or_you_do_not_have_permission_;
char PhotoURL[PATH_MAX + 1];
+ Act_Action_t NextAction;
/***** Get user's code from form *****/
Usr_GetParamOtherUsrCodEncryptedAndGetListIDs ();
@@ -482,10 +521,21 @@ void Pho_ReqRemoveUsrPhoto (void)
"PHOTO186x248",Pho_NO_ZOOM,false);
/* End alert */
- Ale_ShowAlertAndButton2 ( Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_STD ? ActRemStdPho :
- (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB == Rol_TCH ? ActRemTchPho :
- ActRemOthPho), // Guest, visitor or admin
- NULL,Usr_PutParamOtherUsrCodEncrypted,
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActRemStdPho;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActRemTchPho;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActRemOthPho;
+ break;
+ }
+ Ale_ShowAlertAndButton2 (NextAction,NULL,
+ Usr_PutParamOtherUsrCodEncrypted,
Lay_REMOVE_BUTTON,Txt_Remove_photo);
}
else
@@ -560,6 +610,7 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr
unsigned Radius;
unsigned BackgroundCode;
char StrFileName[NAME_MAX + 1];
+ Act_Action_t NextAction;
/***** Creates directories if not exist *****/
sprintf (PathPhotosPriv,"%s/%s",
@@ -648,12 +699,26 @@ static bool Pho_ReceivePhotoAndDetectFaces (bool ItsMe,const struct UsrData *Usr
if (BackgroundCode == 1)
{
NumFacesGreen++;
- Act_FormStart (ItsMe ? ActUpdMyPho :
- (UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActUpdStdPho :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActUpdTchPho :
- ActUpdOthPho))); // Guest, visitor or admin
- if (!ItsMe)
+ if (ItsMe)
+ Act_FormStart (ActUpdMyPho);
+ else
+ {
+ switch (Gbl.Usrs.Other.UsrDat.RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActUpdStdPho;
+ break;
+ case Rol_NET:
+ case Rol_TCH:
+ NextAction = ActUpdTchPho;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActUpdOthPho;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod);
+ }
Par_PutHiddenParamString ("FileName",StrFileName);
Act_FormEnd ();
}
diff --git a/swad_record.c b/swad_record.c
index 9ddd0b54d..1501b5b4f 100644
--- a/swad_record.c
+++ b/swad_record.c
@@ -95,6 +95,7 @@ static bool Rec_GetParamShowOfficeHours (void);
static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
struct UsrData *UsrDat,const char *Anchor);
static void Rec_ShowMyCrsRecordUpdated (void);
+static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility);
static void Rec_PutIconsCommands (void);
static void Rec_PutParamUsrCodEncrypted (void);
@@ -1135,7 +1136,8 @@ static void Rec_ShowRecordOneStdCrs (void)
/***** Record of the student in the course *****/
if (Gbl.CurrentCrs.Records.LstFields.Num) // There are fields in the record
{
- if (Gbl.Usrs.Me.LoggedRole == Rol_TCH ||
+ if (Gbl.Usrs.Me.LoggedRole == Rol_NET ||
+ Gbl.Usrs.Me.LoggedRole == Rol_TCH ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
{
fprintf (Gbl.F.Out,"");
@@ -1264,7 +1266,8 @@ static void Rec_ListRecordsStds (Rec_SharedRecordViewType_t ShaTypeOfView,
/* Record of the student in the course */
if (Gbl.CurrentCrs.Records.LstFields.Num) // There are fields in the record
- if ( Gbl.Usrs.Me.LoggedRole == Rol_TCH ||
+ if ( Gbl.Usrs.Me.LoggedRole == Rol_NET ||
+ Gbl.Usrs.Me.LoggedRole == Rol_TCH ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
(Gbl.Usrs.Me.LoggedRole == Rol_STD && // I am student in this course...
UsrDat.UsrCod == Gbl.Usrs.Me.UsrDat.UsrCod)) // ...and it's me
@@ -1736,7 +1739,7 @@ static void Rec_ShowCrsRecord (Rec_CourseRecordViewType_t TypeOfView,
Lay_ShowErrorAndExit (Txt_You_dont_have_permission_to_perform_this_action);
break;
}
- else // It's not me ==> i am a student trying to do something forbidden
+ else // It's not me ==> I am a student trying to do something forbidden
Lay_ShowErrorAndExit (Txt_You_dont_have_permission_to_perform_this_action);
}
@@ -1913,8 +1916,7 @@ void Rec_GetFieldsCrsRecordFromForm (void)
for (NumField = 0;
NumField < Gbl.CurrentCrs.Records.LstFields.Num;
NumField++)
- if (Gbl.Usrs.Me.LoggedRole > Rol_STD ||
- Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD)
+ if (Rec_CheckIfICanEditField (Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility))
{
/* Get text of the form */
sprintf (FieldParamName,"Field%ld",Gbl.CurrentCrs.Records.LstFields.Lst[NumField].FieldCod);
@@ -1936,8 +1938,7 @@ void Rec_UpdateCrsRecord (long UsrCod)
for (NumField = 0;
NumField < Gbl.CurrentCrs.Records.LstFields.Num;
NumField++)
- if (Gbl.Usrs.Me.LoggedRole > Rol_STD ||
- Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD)
+ if (Rec_CheckIfICanEditField (Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility))
{
/***** Check if already exists this field for this user in database *****/
FieldAlreadyExists = (Rec_GetFieldFromCrsRecord (UsrCod,Gbl.CurrentCrs.Records.LstFields.Lst[NumField].FieldCod,&mysql_res) != 0);
@@ -2049,8 +2050,7 @@ void Rec_AllocMemFieldsRecordsCrs (void)
for (NumField = 0;
NumField < Gbl.CurrentCrs.Records.LstFields.Num;
NumField++)
- if (Gbl.Usrs.Me.LoggedRole > Rol_STD ||
- Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD)
+ if (Rec_CheckIfICanEditField (Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility))
/* Allocate memory for the texts of the fields */
if ((Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Text = malloc (Cns_MAX_BYTES_TEXT + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store records of the course.");
@@ -2067,8 +2067,7 @@ void Rec_FreeMemFieldsRecordsCrs (void)
for (NumField = 0;
NumField < Gbl.CurrentCrs.Records.LstFields.Num;
NumField++)
- if (Gbl.Usrs.Me.LoggedRole > Rol_STD ||
- Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility == Rec_EDITABLE_FIELD)
+ if (Rec_CheckIfICanEditField (Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Visibility))
/* Free memory of the text of the field */
if (Gbl.CurrentCrs.Records.LstFields.Lst[NumField].Text)
{
@@ -2077,6 +2076,19 @@ void Rec_FreeMemFieldsRecordsCrs (void)
}
}
+/*****************************************************************************/
+/* Check if I can edit a field depending on my role and the field visibility */
+/*****************************************************************************/
+
+static bool Rec_CheckIfICanEditField (Rec_VisibilityRecordFields_t Visibility)
+ {
+ // Non-editing teachers can not edit fields
+ return Gbl.Usrs.Me.LoggedRole == Rol_TCH ||
+ Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM ||
+ (Gbl.Usrs.Me.LoggedRole == Rol_STD &&
+ Visibility == Rec_EDITABLE_FIELD);
+ }
+
/*****************************************************************************/
/*********** Show form to sign up and edit my shared record card *************/
/*****************************************************************************/
@@ -2212,7 +2224,7 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
Hlp_USERS_Guests, // Rol_GST
NULL, // Rol_USR
Hlp_USERS_Students_shared_record_card, // Rol_STD
- Hlp_USERS_Teachers_shared_record_card, // Rol_NED_TCH
+ Hlp_USERS_Teachers_shared_record_card, // Rol_NET
Hlp_USERS_Teachers_shared_record_card, // Rol_TCH
NULL, // Rol_DEG_ADM
NULL, // Rol_CTR_ADM
@@ -2222,39 +2234,50 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
char StrRecordWidth[10 + 1];
const char *ClassForm = "REC_DAT";
bool ItsMe;
- bool IAmLoggedAsTeacher;
- bool IAmLoggedAsSysAdm;
+ bool IAmLoggedAsTeacherOrSysAdm;
bool CountryForm;
bool ICanEdit;
bool PutFormLinks; // Put links (forms) inside record card
bool ShowData;
bool ShowIDRows;
bool ShowAddressRows;
+ bool StudentInCurrentCrs;
+ bool TeacherInCurrentCrs;
+ bool TeacherInAnyCrs;
bool ShowTeacherRows;
struct Instit Ins;
+ Act_Action_t NextAction;
/***** Initializations *****/
ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == UsrDat->UsrCod);
- IAmLoggedAsTeacher = (Gbl.Usrs.Me.LoggedRole == Rol_TCH); // My current role is teacher
- IAmLoggedAsSysAdm = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); // My current role is superuser
+ IAmLoggedAsTeacherOrSysAdm = (Gbl.Usrs.Me.LoggedRole == Rol_NET || // My current role is non-editing teacher
+ Gbl.Usrs.Me.LoggedRole == Rol_TCH || // My current role is teacher
+ Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); // My current role is system admin
CountryForm = (TypeOfView == Rec_SHA_MY_RECORD_FORM);
ShowData = (ItsMe ||
Gbl.Usrs.Me.LoggedRole >= Rol_DEG_ADM ||
UsrDat->Accepted);
ShowIDRows = (TypeOfView != Rec_SHA_RECORD_PUBLIC);
+
+ StudentInCurrentCrs = UsrDat->RoleInCurrentCrsDB == Rol_STD;
+ TeacherInCurrentCrs = UsrDat->RoleInCurrentCrsDB == Rol_NET ||
+ UsrDat->RoleInCurrentCrsDB == Rol_TCH;
+ TeacherInAnyCrs = UsrDat->Roles & ((1 << Rol_NET) |
+ (1 << Rol_TCH));
+
ShowAddressRows = (TypeOfView == Rec_SHA_MY_RECORD_FORM ||
TypeOfView == Rec_SHA_MY_RECORD_CHECK ||
((TypeOfView == Rec_SHA_RECORD_LIST ||
TypeOfView == Rec_SHA_RECORD_PRINT) &&
- (IAmLoggedAsTeacher || IAmLoggedAsSysAdm) &&
- UsrDat->RoleInCurrentCrsDB == Rol_STD));
+ IAmLoggedAsTeacherOrSysAdm &&
+ StudentInCurrentCrs)); // He/she is a student in the current course
Rol_GetRolesInAllCrssIfNotYetGot (UsrDat); // Get user's roles if not got
ShowTeacherRows = (((TypeOfView == Rec_SHA_MY_RECORD_FORM ||
TypeOfView == Rec_SHA_MY_RECORD_CHECK) &&
- (UsrDat->Roles & (1 << Rol_TCH))) || // He/she (me, really) is a teacher in any course
+ TeacherInAnyCrs) || // He/she (me, really) is a teacher in any course
((TypeOfView == Rec_SHA_RECORD_LIST ||
TypeOfView == Rec_SHA_RECORD_PRINT) &&
- UsrDat->RoleInCurrentCrsDB == Rol_TCH)); // He/she is a teacher in the current course
+ TeacherInCurrentCrs)); // He/she is a teacher in the current course
/* Data form = I can edit fields like surnames and name */
switch (TypeOfView)
@@ -2358,15 +2381,41 @@ void Rec_ShowSharedUsrRecord (Rec_SharedRecordViewType_t TypeOfView,
Act_FormStart (ActChgMyData);
break;
case Rec_SHA_OTHER_NEW_USR_FORM:
- Act_FormStart ( Gbl.Action.Act == ActReqMdfStd ? ActCreStd :
- (Gbl.Action.Act == ActReqMdfTch ? ActCreTch :
- ActCreOth));
+ switch (Gbl.Action.Act)
+ {
+ case ActReqMdfStd:
+ NextAction = ActCreStd;
+ break;
+ case ActReqMdfNET:
+ NextAction = ActCreNET;
+ break;
+ case ActReqMdfTch:
+ NextAction = ActCreTch;
+ break;
+ default:
+ NextAction = ActCreOth;
+ break;
+ }
+ Act_FormStart (NextAction);
ID_PutParamOtherUsrIDPlain (); // New user
break;
case Rec_SHA_OTHER_EXISTING_USR_FORM:
- Act_FormStart ( UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActUpdStd :
- (UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActUpdTch :
- ActUpdOth));
+ switch (UsrDat->RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActUpdStd;
+ break;
+ case Rol_NET:
+ NextAction = ActUpdNET;
+ break;
+ case Rol_TCH:
+ NextAction = ActUpdTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActUpdOth;
+ break;
+ }
+ Act_FormStart (NextAction);
Usr_PutParamUsrCodEncrypted (UsrDat->EncryptedUsrCod); // Existing user
break;
default:
@@ -2502,9 +2551,11 @@ static void Rec_PutIconsCommands (void)
extern const char *Txt_Follow;
bool ItsMe = (Gbl.Usrs.Me.UsrDat.UsrCod == Gbl.Record.UsrDat->UsrCod);
bool IAmLoggedAsStudent = (Gbl.Usrs.Me.LoggedRole == Rol_STD); // My current role is student
- bool IAmLoggedAsTeacher = (Gbl.Usrs.Me.LoggedRole == Rol_TCH); // My current role is teacher
+ bool IAmLoggedAsTeacher = (Gbl.Usrs.Me.LoggedRole == Rol_NET || // My current role is non-editing teacher
+ Gbl.Usrs.Me.LoggedRole == Rol_TCH); // My current role is teacher
bool IAmLoggedAsSysAdm = (Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM); // My current role is superuser
bool ICanViewUsrProfile;
+ Act_Action_t NextAction;
if (!Gbl.Form.Inside && // Only if not inside another form
Act_Actions[Gbl.Action.Act].BrowserWindow == Act_THIS_WINDOW && // Only in main window
@@ -2565,17 +2616,32 @@ static void Rec_PutIconsCommands (void)
(Gbl.CurrentCtr.Ctr.CtrCod > 0 && Gbl.Usrs.Me.LoggedRole == Rol_CTR_ADM) ||
(Gbl.CurrentIns.Ins.InsCod > 0 && Gbl.Usrs.Me.LoggedRole == Rol_INS_ADM) ||
Gbl.Usrs.Me.LoggedRole == Rol_SYS_ADM)
- Lay_PutContextualLink ( Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STD ? ActReqMdfStd :
- (Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_TCH ? ActReqMdfTch :
- ActReqMdfOth),
- NULL,Rec_PutParamUsrCodEncrypted,
+ {
+ switch (Gbl.Record.UsrDat->RoleInCurrentCrsDB)
+ {
+ case Rol_STD:
+ NextAction = ActReqMdfStd;
+ break;
+ case Rol_NET:
+ NextAction = ActReqMdfNET;
+ break;
+ case Rol_TCH:
+ NextAction = ActReqMdfTch;
+ break;
+ default: // Guest, user or admin
+ NextAction = ActReqMdfOth;
+ break;
+ }
+ Lay_PutContextualLink (NextAction,NULL,
+ Rec_PutParamUsrCodEncrypted,
"config64x64.gif",
Txt_Administer_user,NULL,
NULL);
+ }
if (Gbl.CurrentCrs.Crs.CrsCod > 0 && // A course is selected
Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STD && // He/she is a student in the current course
- (ItsMe || IAmLoggedAsTeacher || IAmLoggedAsSysAdm)) // I can view
+ (ItsMe || IAmLoggedAsTeacher || IAmLoggedAsSysAdm)) // I can view
{
/***** Button to view user's assignments and works *****/
if (ItsMe) // I am a student
@@ -2618,9 +2684,9 @@ static void Rec_PutIconsCommands (void)
/***** Button to print QR code *****/
if (ItsMe || IAmLoggedAsSysAdm ||
- (Gbl.CurrentCrs.Crs.CrsCod > 0 && // A course is selected
+ (Gbl.CurrentCrs.Crs.CrsCod > 0 && // A course is selected
Gbl.Record.UsrDat->RoleInCurrentCrsDB == Rol_STD && // He/she is a student in the current course
- IAmLoggedAsTeacher)) // I am a teacher in the current course
+ IAmLoggedAsTeacher)) // I am a teacher in the current course
Lay_PutContextualLink (ActPrnUsrQR,NULL,Rec_PutParamUsrCodEncrypted,
"qr64x64.gif",
Txt_QR_code,NULL,
@@ -2914,10 +2980,13 @@ static void Rec_ShowRole (struct UsrData *UsrDat,
switch (TypeOfView)
{
case Rec_SHA_SIGN_UP_FORM: // I want to apply for enrolment
- DefaultRoleInCurrentCrs = ((UsrDat->Roles & (1 << Rol_TCH)) || // I am teacher in other courses
- UsrDat->UsrCod == Gbl.CurrentCrs.Crs.RequesterUsrCod) ? // I am the creator of the course
- Rol_TCH :
- Rol_STD;
+ if (UsrDat->UsrCod == Gbl.CurrentCrs.Crs.RequesterUsrCod || // Creator of the course
+ (UsrDat->Roles & (1 << Rol_TCH))) // Teacher in other courses
+ DefaultRoleInCurrentCrs = Rol_TCH;
+ else if ((UsrDat->Roles & (1 << Rol_NET))) // Non-editing teacher in other courses
+ DefaultRoleInCurrentCrs = Rol_NET;
+ else
+ DefaultRoleInCurrentCrs = Rol_STD;
fprintf (Gbl.F.Out,"