mirror of https://github.com/acanas/swad-core.git
Version 17.10
This commit is contained in:
parent
6dca856aaa
commit
7c6774bc6c
2410
swad_action.c
2410
swad_action.c
File diff suppressed because it is too large
Load Diff
|
@ -252,13 +252,15 @@
|
|||
/****************************** Public constants *****************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#define Log_PLATFORM_VERSION "SWAD 17.9.4 (2017-09-24)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 17.10 (2017-09-24)"
|
||||
#define CSS_FILE "swad17.0.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 17.10: Sep 24, 2017 Changes in permissions to view/edit projects.
|
||||
Show project URL in listings of projects. (231319 lines)
|
||||
Version 17.9.4: Sep 24, 2017 Changes in listing of projects. (231216 lines)
|
||||
Version 17.9.3: Sep 24, 2017 Write students' IDs in listing of projects. (231214 lines)
|
||||
Version 17.9.2: Sep 24, 2017 Header in listing of all projects in a table. (231206 lines)
|
||||
|
|
164
swad_project.c
164
swad_project.c
|
@ -49,7 +49,7 @@
|
|||
extern struct Globals Gbl;
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Public constants and types ************************/
|
||||
/************************* Private constants and types ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef enum
|
||||
|
@ -59,6 +59,8 @@ typedef enum
|
|||
Prj_EDIT_ONE_PROJECT,
|
||||
} Prj_ProjectView_t;
|
||||
|
||||
#define Prj_INTERVAL_DEFAULT ((time_t) 365 * (time_t) 24 * (time_t) 60 * (time_t) 60) // 1 year
|
||||
|
||||
/*****************************************************************************/
|
||||
/***************************** Private variables *****************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -85,6 +87,9 @@ static void Prj_ShowOneProjectTxtField (struct Project *Prj,
|
|||
const char *Label,char *TxtField);
|
||||
static void Prj_ShowTableAllProjectsTxtField (struct Project *Prj,
|
||||
char *TxtField);
|
||||
static void Prj_ShowOneProjectURL (const struct Project *Prj,
|
||||
Prj_ProjectView_t ProjectView);
|
||||
static void Prj_ShowTableAllProjectsURL (const struct Project *Prj);
|
||||
static void Prj_ShowOneProjectUsrs (const struct Project *Prj,
|
||||
Prj_ProjectView_t ProjectView,
|
||||
Prj_RoleInProject_t RoleInProject);
|
||||
|
@ -106,6 +111,10 @@ static bool Prj_CheckIfICanRemUsrFromPrj (void);
|
|||
static void Prj_GetParamPrjOrder (void);
|
||||
|
||||
static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden);
|
||||
|
||||
static bool Prj_CheckIfICanEditProject (long PrjCod);
|
||||
static bool Prj_GetIfIAmTutorInProject (long PrjCod);
|
||||
|
||||
static void Prj_PutParams (void);
|
||||
static void Prj_GetDataOfProject (struct Project *Prj,const char *Query);
|
||||
static void Prj_ResetProject (struct Project *Prj);
|
||||
|
@ -146,6 +155,9 @@ void Prj_ShowTableAllProjects (void)
|
|||
unsigned NumPrj;
|
||||
struct Project Prj;
|
||||
|
||||
/***** Get parameters *****/
|
||||
Prj_GetParamPrjOrder ();
|
||||
|
||||
/***** Get list of projects *****/
|
||||
Prj_GetListProjects ();
|
||||
|
||||
|
@ -302,6 +314,7 @@ static void Prj_ShowTableAllProjectsHead (void)
|
|||
extern const char *Txt_Description;
|
||||
extern const char *Txt_Required_knowledge;
|
||||
extern const char *Txt_Required_materials;
|
||||
extern const char *Txt_URL;
|
||||
extern const char *Txt_Preassigned_QUESTION;
|
||||
extern const char *Txt_PROJECT_ROLES_PLURAL_Abc[Prj_NUM_ROLES_IN_PROJECT];
|
||||
Prj_Order_t Order;
|
||||
|
@ -320,6 +333,8 @@ static void Prj_ShowTableAllProjectsHead (void)
|
|||
Txt_Required_knowledge);
|
||||
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||
Txt_Required_materials);
|
||||
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||
Txt_URL);
|
||||
fprintf (Gbl.F.Out,"<th class=\"LEFT_TOP DAT_N\">%s</th>",
|
||||
Txt_Preassigned_QUESTION);
|
||||
|
||||
|
@ -338,8 +353,21 @@ static void Prj_ShowTableAllProjectsHead (void)
|
|||
|
||||
static bool Prj_CheckIfICanCreateProjects (void)
|
||||
{
|
||||
return (bool) (Gbl.Usrs.Me.Role.Logged == Rol_TCH ||
|
||||
Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM);
|
||||
static const bool ICanCreateProjects[Rol_NUM_ROLES] =
|
||||
{
|
||||
false, // Rol_UNK
|
||||
false, // Rol_GST
|
||||
false, // Rol_USR
|
||||
false, // Rol_STD
|
||||
true, // Rol_NET
|
||||
true, // Rol_TCH
|
||||
true, // Rol_DEG_ADM
|
||||
true, // Rol_CTR_ADM
|
||||
true, // Rol_INS_ADM
|
||||
true, // Rol_SYS_ADM
|
||||
};
|
||||
|
||||
return ICanCreateProjects[Gbl.Usrs.Me.Role.Logged];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -461,7 +489,7 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
|
|||
/***** Write first row of data of this project *****/
|
||||
/* Forms to remove/edit this project */
|
||||
fprintf (Gbl.F.Out,"<tr>"
|
||||
"<td rowspan=\"8\" class=\"CONTEXT_COL");
|
||||
"<td rowspan=\"9\" class=\"CONTEXT_COL");
|
||||
if (ProjectView == Prj_LIST_PROJECTS)
|
||||
{
|
||||
fprintf (Gbl.F.Out," COLOR%u\">",Gbl.RowEvenOdd);
|
||||
|
@ -536,6 +564,9 @@ static void Prj_ShowOneProject (struct Project *Prj,Prj_ProjectView_t ProjectVie
|
|||
Prj_ShowOneProjectTxtField (Prj,ProjectView,
|
||||
Txt_Required_materials,Prj->Materials);
|
||||
|
||||
/* Link to view more info about the project */
|
||||
Prj_ShowOneProjectURL (Prj,ProjectView);
|
||||
|
||||
/* Preassigned? */
|
||||
fprintf (Gbl.F.Out,"<tr>"
|
||||
"<td colspan=\"2\" class=\"RIGHT_TOP");
|
||||
|
@ -646,6 +677,9 @@ static void Prj_ShowTableAllProjectsOneRow (struct Project *Prj)
|
|||
/* Required materials to carry out the project */
|
||||
Prj_ShowTableAllProjectsTxtField (Prj,Prj->Materials);
|
||||
|
||||
/* Link to view more info about the project */
|
||||
Prj_ShowTableAllProjectsURL (Prj);
|
||||
|
||||
/* Preassigned? */
|
||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u %s\">"
|
||||
"%s"
|
||||
|
@ -776,6 +810,60 @@ static void Prj_ShowTableAllProjectsTxtField (struct Project *Prj,
|
|||
TxtField);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************** Show URL associated to project ***********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Prj_ShowOneProjectURL (const struct Project *Prj,
|
||||
Prj_ProjectView_t ProjectView)
|
||||
{
|
||||
extern const char *Txt_URL;
|
||||
bool PutLink;
|
||||
|
||||
/***** Write row with label and text *****/
|
||||
PutLink = (ProjectView == Prj_LIST_PROJECTS && Prj->URL[0]);
|
||||
|
||||
fprintf (Gbl.F.Out,"<tr>"
|
||||
"<td colspan=\"2\" class=\"RIGHT_TOP");
|
||||
if (ProjectView == Prj_LIST_PROJECTS)
|
||||
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
|
||||
fprintf (Gbl.F.Out," %s\">"
|
||||
"%s:"
|
||||
"</td>"
|
||||
"<td colspan=\"2\" class=\"LEFT_TOP",
|
||||
Prj->Hidden ? "ASG_LABEL_LIGHT" :
|
||||
"ASG_LABEL",
|
||||
Txt_URL);
|
||||
if (ProjectView == Prj_LIST_PROJECTS)
|
||||
fprintf (Gbl.F.Out," COLOR%u",Gbl.RowEvenOdd);
|
||||
fprintf (Gbl.F.Out," %s\">",
|
||||
Prj->Hidden ? "DAT_LIGHT" :
|
||||
"DAT");
|
||||
if (PutLink)
|
||||
fprintf (Gbl.F.Out,"<a href=\"%s\" target=\"_blank\""
|
||||
" class=\"%s\">",
|
||||
Prj->URL,
|
||||
Prj->Hidden ? "DAT_LIGHT" :
|
||||
"DAT");
|
||||
fprintf (Gbl.F.Out,"%s",Prj->URL);
|
||||
if (PutLink)
|
||||
fprintf (Gbl.F.Out,"</a>");
|
||||
fprintf (Gbl.F.Out,"</td>"
|
||||
"</tr>");
|
||||
}
|
||||
|
||||
static void Prj_ShowTableAllProjectsURL (const struct Project *Prj)
|
||||
{
|
||||
/***** Show URL *****/
|
||||
fprintf (Gbl.F.Out,"<td class=\"LEFT_TOP COLOR%u %s\">"
|
||||
"%s"
|
||||
"</td>",
|
||||
Gbl.RowEvenOdd,
|
||||
Prj->Hidden ? "DAT_LIGHT" :
|
||||
"DAT",
|
||||
Prj->URL);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************* Show users row in a project ***********************/
|
||||
/*****************************************************************************/
|
||||
|
@ -1354,32 +1442,57 @@ static void Prj_PutFormsToRemEditOnePrj (long PrjCod,bool Hidden)
|
|||
{
|
||||
Gbl.Prjs.PrjCodToEdit = PrjCod; // Used as parameter in contextual links
|
||||
|
||||
if (Prj_CheckIfICanEditProject (PrjCod))
|
||||
{
|
||||
/***** Put form to remove project *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemPrj,Prj_PutParams);
|
||||
|
||||
/***** Put form to hide/show project *****/
|
||||
if (Hidden)
|
||||
Ico_PutContextualIconToUnhide (ActShoPrj,Prj_PutParams);
|
||||
else
|
||||
Ico_PutContextualIconToHide (ActHidPrj,Prj_PutParams);
|
||||
|
||||
/***** Put form to edit project *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOnePrj,Prj_PutParams);
|
||||
}
|
||||
|
||||
/***** Put form to print project *****/
|
||||
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutParams);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/************************ Can I edit a given project? ************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_CheckIfICanEditProject (long PrjCod)
|
||||
{
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
return Prj_GetIfIAmTutorInProject (PrjCod);
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
/***** Put form to remove project *****/
|
||||
Ico_PutContextualIconToRemove (ActReqRemPrj,Prj_PutParams);
|
||||
|
||||
/***** Put form to hide/show project *****/
|
||||
if (Hidden)
|
||||
Ico_PutContextualIconToUnhide (ActShoPrj,Prj_PutParams);
|
||||
else
|
||||
Ico_PutContextualIconToHide (ActHidPrj,Prj_PutParams);
|
||||
|
||||
/***** Put form to edit project *****/
|
||||
Ico_PutContextualIconToEdit (ActEdiOnePrj,Prj_PutParams);
|
||||
// no break
|
||||
case Rol_STD:
|
||||
case Rol_NET:
|
||||
/***** Put form to print project *****/
|
||||
Ico_PutContextualIconToPrint (ActPrnOnePrj,Prj_PutParams);
|
||||
break;
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*********************** Am I tutor in a given project? **********************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static bool Prj_GetIfIAmTutorInProject (long PrjCod)
|
||||
{
|
||||
char Query[256];
|
||||
|
||||
sprintf (Query,"SELECT COUNT(*) FROM prj_usr"
|
||||
" WHERE PrjCod=%ld AND RoleInProject=%u AND UsrCod=%ld",
|
||||
PrjCod,Prj_ROLE_TUT,Gbl.Usrs.Me.UsrDat.UsrCod);
|
||||
return (bool) (DB_QueryCOUNT (Query,"can not get number of projects in course") != 0);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/********************** Params used to edit a project ************************/
|
||||
/*****************************************************************************/
|
||||
|
@ -1420,6 +1533,7 @@ void Prj_GetListProjects (void)
|
|||
/* Hidden subquery */
|
||||
switch (Gbl.Usrs.Me.Role.Logged)
|
||||
{
|
||||
case Rol_NET:
|
||||
case Rol_TCH:
|
||||
case Rol_SYS_ADM:
|
||||
HiddenSubQuery[0] = '\0';
|
||||
|
@ -1921,7 +2035,8 @@ static void Prj_RequestCreatOrEditPrj (long PrjCod)
|
|||
/* Initialize to empty project */
|
||||
Prj_ResetProject (&Prj);
|
||||
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
||||
Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC + (2 * 60 * 60); // +2 hours
|
||||
Prj.TimeUTC[Dat_END_TIME ] = Gbl.StartExecutionTimeUTC +
|
||||
Prj_INTERVAL_DEFAULT;
|
||||
Prj.Open = true;
|
||||
}
|
||||
else
|
||||
|
@ -2180,7 +2295,8 @@ void Prj_RecFormProject (void)
|
|||
if (Prj.TimeUTC[Dat_START_TIME] == 0)
|
||||
Prj.TimeUTC[Dat_START_TIME] = Gbl.StartExecutionTimeUTC;
|
||||
if (Prj.TimeUTC[Dat_END_TIME] == 0)
|
||||
Prj.TimeUTC[Dat_END_TIME] = Prj.TimeUTC[Dat_START_TIME] + 2 * 60 * 60; // +2 hours
|
||||
Prj.TimeUTC[Dat_END_TIME] = Prj.TimeUTC[Dat_START_TIME] +
|
||||
Prj_INTERVAL_DEFAULT;
|
||||
|
||||
/***** Check if title is correct *****/
|
||||
if (!Prj.Title[0]) // If there is not a project title
|
||||
|
|
|
@ -43,18 +43,19 @@
|
|||
#define Rol_NUM_ROLES 10
|
||||
typedef enum
|
||||
{
|
||||
// -------------------------------------------------------------------------
|
||||
Rol_UNK = 0, // User not logged in
|
||||
Rol_GST = 1, // User not belonging to any course
|
||||
Rol_USR = 2, // Student, non-editing teacher or teacher in some courses...
|
||||
// ...but no course selected
|
||||
// ...or not belonging to the current course
|
||||
|
||||
Rol_STD = 3, // Student in the current course
|
||||
// -------------------------------------------------------------------------
|
||||
Rol_NET = 4, // Non-editing teacher in the current course
|
||||
Rol_TCH = 5, // Teacher in the current course
|
||||
|
||||
Rol_DEG_ADM = 6, // Degree administrator
|
||||
Rol_CTR_ADM = 7, // Centre administrator
|
||||
// -------------------------------------------------------------------------
|
||||
Rol_INS_ADM = 8, // Institution administrator
|
||||
Rol_SYS_ADM = 9, // System administrator (superuser)
|
||||
} Rol_Role_t;
|
||||
|
|
Loading…
Reference in New Issue