Version 16.43

This commit is contained in:
Antonio Cañas Vargas 2016-10-26 01:23:02 +02:00
parent dd5655d0e9
commit fc2906daa4
9 changed files with 130 additions and 51 deletions

View File

@ -11649,3 +11649,20 @@ CREATE TABLE IF NOT EXISTS usr_report (RepCod INT NOT NULL AUTO_INCREMENT,UsrCod
SELECT CrsCod,COUNT(*) AS N FROM crs_usr LEFT JOIN log_full ON (crs_usr.CrsCod=log_full.CrsCod AND crs_usr.UsrCod=log_full.UsrCod AND crs_usr.Role=log_full.Role) WHERE UsrCod='7' AND Role='3' GROUP BY CrsCod ORDER BY N DESC;
(SELECT crs_usr.UsrCod FROM surveys,crs_usr WHERE surveys.SvyCod='6' AND surveys.SvyCod NOT IN (SELECT SvyCod FROM svy_grp WHERE SvyCod='6') AND surveys.CrsCod=crs_usr.CrsCod AND crs_usr.UsrCod<>'1' AND (surveys.Roles&(1<<crs_usr.Role))<>0)
UNION
(SELECT DISTINCT crs_grp_usr.UsrCod FROM svy_grp,crs_grp_usr,surveys,crs_usr WHERE svy_grp.SvyCod='6' AND svy_grp.GrpCod=crs_grp_usr.GrpCod AND crs_grp_usr.UsrCod=crs_usr.UsrCod AND crs_grp_usr.UsrCod<>'1' AND svy_grp.SvyCod=surveys.SvyCod AND surveys.CrsCod=crs_usr.CrsCod AND (surveys.Roles&(1<<crs_usr.Role))<>0);

View File

@ -252,7 +252,7 @@ static void Att_ShowAllAttEvents (void)
for (NumAttEvent = Pagination.FirstItemVisible, Gbl.RowEvenOdd = 0;
NumAttEvent <= Pagination.LastItemVisible;
NumAttEvent++)
Att_ShowOneAttEvent (&Gbl.AttEvents.Lst[NumAttEvent-1],false);
Att_ShowOneAttEvent (&Gbl.AttEvents.Lst[NumAttEvent - 1],false);
/***** End table *****/
fprintf (Gbl.F.Out,"</table>");

View File

@ -149,13 +149,14 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
#define Log_PLATFORM_VERSION "SWAD 16.42.1 (2016-10-25)"
#define Log_PLATFORM_VERSION "SWAD 16.43 (2016-10-26)"
#define CSS_FILE "swad16.32.1.css"
#define JS_FILE "swad15.238.1.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.43: Oct 26, 2016 Fixed bugs and code refactoring in scope of surveys. (205537 lines)
Version 16.42.1: Oct 25, 2016 Added button "New question" in survey when the survey has no questions.
Change in layout of survey questions. (205485 lines)
Version 16.42: Oct 24, 2016 Changres in rules to admin other user and change other user's photo. (205481 lines)

View File

@ -1057,7 +1057,7 @@ static void For_ShowThreadPosts (long ThrCod,char *LastSubject)
/***** Show posts from this page, the author and the date of last reply *****/
Lay_StartRoundFrameTable (NULL,2,Txt_Messages);
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible-1));
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible - 1));
for (NumRow = Pagination.FirstItemVisible;
NumRow <= Pagination.LastItemVisible;
NumRow++)
@ -2559,7 +2559,7 @@ void For_ShowForumThrs (void)
Gbl.Pag.CurrentPage = (unsigned) PaginationThrs.CurrentPage;
/***** Fill the list of threads for current page *****/
mysql_data_seek (mysql_res,(my_ulonglong) (PaginationThrs.FirstItemVisible-1));
mysql_data_seek (mysql_res,(my_ulonglong) (PaginationThrs.FirstItemVisible - 1));
for (NumThr = PaginationThrs.FirstItemVisible, NumThrInScreen = 0;
NumThr <= PaginationThrs.LastItemVisible;
NumThr++, NumThrInScreen++)

View File

@ -1751,7 +1751,7 @@ static void Msg_ShowSentOrReceivedMessages (Msg_TypeOfMessages_t TypeOfMessages)
fprintf (Gbl.F.Out,"<table class=\"CELLS_PAD_2\""
" style=\"width:100%%;\">");
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible-1));
mysql_data_seek (mysql_res,(my_ulonglong) (Pagination.FirstItemVisible - 1));
for (NumRow = Pagination.FirstItemVisible;
NumRow <= Pagination.LastItemVisible;
NumRow++)

View File

@ -89,7 +89,7 @@ void Pag_CalculatePagination (struct Pagination *Pagination)
Pagination->CurrentPage = 1; // If there is only a page, the number of page to show is 1
Pagination->LastItemVisible = Pagination->CurrentPage * Pag_ITEMS_PER_PAGE;
Pagination->FirstItemVisible = Pagination->LastItemVisible - (Pag_ITEMS_PER_PAGE-1);
Pagination->FirstItemVisible = Pagination->LastItemVisible - (Pag_ITEMS_PER_PAGE - 1);
if (Pagination->LastItemVisible > Pagination->NumItems)
Pagination->LastItemVisible = Pagination->NumItems;
}

View File

@ -53,12 +53,12 @@ struct Pagination // Used for threads and messages pagination
unsigned NumItems;
int StartPage;
int LeftPage;
int CurrentPage;
int CurrentPage; // 1, 2, 3...
int RightPage;
int EndPage;
int NumPags;
unsigned FirstItemVisible;
unsigned LastItemVisible;
unsigned FirstItemVisible; // 1, 2, 3...
unsigned LastItemVisible; // 1, 2, 3...
bool MoreThanOnePage;
};

View File

@ -96,7 +96,8 @@ static void Svy_PutIconToCreateNewSvy (void);
static void Svy_PutButtonToCreateNewSvy (void);
static void Svy_PutParamsToCreateNewSvy (void);
static void Svy_PutFormToSelectWhichGroupsToShow (void);
static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool ShowOnlyThisSvyComplete);
static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,
bool ShowOnlyThisSvyComplete);
static void Svy_WriteAuthor (struct Survey *Svy);
static void Svy_WriteStatus (struct Survey *Svy);
static void Svy_GetParamSvyOrderType (void);
@ -110,9 +111,10 @@ static long Svy_GetParamSvyCod (void);
static void Svy_PutButtonToResetSurvey (void);
static bool Svy_CheckIfSimilarSurveyExists (struct Survey *Svy);
static bool Svy_SetDefaultAndAllowedForEdition (void);
static void Svy_SetDefaultAndAllowedScope (struct Survey *Svy);
static void Svy_ShowLstGrpsToEditSurvey (long SvyCod);
static void Svy_UpdateNumUsrsNotifiedByEMailAboutSurvey (long SvyCod,unsigned NumUsrsToBeNotifiedByEMail);
static void Svy_UpdateNumUsrsNotifiedByEMailAboutSurvey (long SvyCod,
unsigned NumUsrsToBeNotifiedByEMail);
static void Svy_CreateSurvey (struct Survey *Svy,const char *Txt);
static void Svy_UpdateSurvey (struct Survey *Svy,const char *Txt);
static bool Svy_CheckIfSvyIsAssociatedToGrps (long SvyCod);
@ -223,6 +225,8 @@ static void Svy_ListAllSurveys (struct SurveyQuestion *SvyQst)
Order++)
{
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">");
/* Form to change order */
Act_FormStart (ActSeeAllSvy);
Grp_PutParamWhichGrps ();
Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage);
@ -235,6 +239,7 @@ static void Svy_ListAllSurveys (struct SurveyQuestion *SvyQst)
fprintf (Gbl.F.Out,"</u>");
fprintf (Gbl.F.Out,"</a>");
Act_FormEnd ();
fprintf (Gbl.F.Out,"</th>");
}
fprintf (Gbl.F.Out,"<th class=\"CENTER_MIDDLE\">"
@ -251,7 +256,7 @@ static void Svy_ListAllSurveys (struct SurveyQuestion *SvyQst)
for (NumSvy = Pagination.FirstItemVisible;
NumSvy <= Pagination.LastItemVisible;
NumSvy++)
Svy_ShowOneSurvey (Gbl.Svys.LstSvyCods[NumSvy-1],SvyQst,false);
Svy_ShowOneSurvey (Gbl.Svys.LstSvyCods[NumSvy - 1],SvyQst,false);
/***** End table *****/
fprintf (Gbl.F.Out,"</table>");
@ -372,7 +377,8 @@ void Svy_SeeOneSurvey (void)
/****************************** Show one survey ******************************/
/*****************************************************************************/
static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool ShowOnlyThisSvyComplete)
static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,
bool ShowOnlyThisSvyComplete)
{
extern const char *Txt_Survey;
extern const char *Txt_Today;
@ -473,6 +479,7 @@ static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool Sh
if (Svy.Status.ICanAnswer)
{
fprintf (Gbl.F.Out,"<div class=\"BUTTONS_AFTER_ALERT\">");
Act_FormStart (ActSeeOneSvy);
Svy_PutParamSvyCod (Svy.SvyCod);
Svy_PutHiddenParamSvyOrderType ();
@ -480,12 +487,14 @@ static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool Sh
Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage);
Lay_PutCreateButtonInline (Txt_Answer_survey);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</div>");
}
/* Possible button to see the result of the survey */
else if (Svy.Status.ICanViewResults)
{
fprintf (Gbl.F.Out,"<div class=\"BUTTONS_AFTER_ALERT\">");
Act_FormStart (ActSeeOneSvy);
Svy_PutParamSvyCod (Svy.SvyCod);
Svy_PutHiddenParamSvyOrderType ();
@ -493,6 +502,7 @@ static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool Sh
Pag_PutHiddenParamPagNum (Gbl.Pag.CurrentPage);
Lay_PutConfirmButtonInline (Txt_View_survey_results);
Act_FormEnd ();
fprintf (Gbl.F.Out,"</div>");
}
}
@ -554,7 +564,7 @@ static void Svy_ShowOneSurvey (long SvyCod,struct SurveyQuestion *SvyQst,bool Sh
/* Text of the survey */
Svy_GetSurveyTxtFromDB (Svy.SvyCod,Txt);
Str_ChangeFormat (Str_FROM_HTML,Str_TO_RIGOROUS_HTML,
Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to recpectful HTML
Txt,Cns_MAX_BYTES_TEXT,false); // Convert from HTML to rigorous HTML
Str_InsertLinks (Txt,Cns_MAX_BYTES_TEXT,60); // Insert links
fprintf (Gbl.F.Out,"<p class=\"%s\">"
"%s"
@ -721,11 +731,14 @@ static void Svy_GetParamSvyOrderType (void)
char UnsignedStr[10+1];
unsigned UnsignedNum;
/***** Set default order type *****/
Gbl.Svys.SelectedOrderType = Svy_ORDER_BY_START_DATE;
/***** Get parameter from form with the order type *****/
Par_GetParToText ("Order",UnsignedStr,10);
if (sscanf (UnsignedStr,"%u",&UnsignedNum) == 1)
Gbl.Svys.SelectedOrderType = (tSvysOrderType) UnsignedNum;
else
Gbl.Svys.SelectedOrderType = Svy_ORDER_BY_START_DATE;
if (UnsignedNum < Svy_NUM_ORDERS)
Gbl.Svys.SelectedOrderType = (tSvysOrderType) UnsignedNum;
}
/*****************************************************************************/
@ -982,6 +995,14 @@ void Svy_GetDataOfSurveyByCod (struct Survey *Svy)
if (Svy->CrsCod != Gbl.CurrentCrs.Crs.CrsCod)
Lay_ShowErrorAndExit ("Wrong survey course.");
/* Set survey scope */
if (Svy->CrsCod > 0)
Svy->Scope = Sco_SCOPE_CRS;
else if (Svy->DegCod > 0)
Svy->Scope = Sco_SCOPE_DEG;
else
Svy->Scope = Sco_SCOPE_SYS;
/* Get whether the survey is hidden (row[3]) */
Svy->Status.Visible = (row[3][0] == 'N');
@ -1049,15 +1070,16 @@ void Svy_GetDataOfSurveyByCod (struct Survey *Svy)
case Rol_TEACHER:
Svy->Status.ICanViewResults = (Svy->NumQsts != 0) &&
!Svy->Status.ICanAnswer;
Svy->Status.ICanEdit = Svy->CrsCod > 0 &&
Svy->Status.ICanEdit = Svy->Scope == Sco_SCOPE_CRS &&
Svy->Status.IBelongToDegCrsGrps;
break;
case Rol_DEG_ADM:
Svy->Status.ICanViewResults = false;
Svy->Status.ICanEdit = Svy->DegCod > 0 &&
Svy->CrsCod < 0 &&
Svy->Status.ICanEdit = Svy->Scope == Sco_SCOPE_DEG &&
Svy->Status.IBelongToDegCrsGrps;
break;
// TODO: Add Rol_CTR_ADM
// TODO: Add Rol_INS_ADM
case Rol_SYS_ADM:
Svy->Status.ICanViewResults = (Svy->NumQsts != 0);
Svy->Status.ICanEdit = true;
@ -1072,7 +1094,9 @@ void Svy_GetDataOfSurveyByCod (struct Survey *Svy)
{
/* Initialize to empty survey */
Svy->SvyCod = -1L;
Svy->Roles = 0;
Svy->Scope = Sco_SCOPE_UNK;
Svy->Roles = 0;
Svy->UsrCod = -1L;
Svy->TimeUTC[Svy_START_TIME] =
Svy->TimeUTC[Svy_END_TIME ] = (time_t) 0;
Svy->Title[0] = '\0';
@ -1513,10 +1537,12 @@ void Svy_RequestCreatOrEditSvy (void)
/* Initialize to empty survey */
Svy.SvyCod = -1L;
Svy.Scope = Sco_SCOPE_UNK;
Svy.Roles = (1 << Rol_STUDENT);
Svy.UsrCod = Gbl.Usrs.Me.UsrDat.UsrCod;
Svy.TimeUTC[Svy_START_TIME] = Gbl.StartExecutionTimeUTC;
Svy.TimeUTC[Svy_END_TIME ] = Gbl.StartExecutionTimeUTC + (24 * 60 * 60); // +24 hours
Svy.Title[0] = '\0';
Svy.Roles = (1 << Rol_STUDENT);
Svy.NumQsts = 0;
Svy.NumUsrs = 0;
Svy.Status.Visible = true;
@ -1548,7 +1574,7 @@ void Svy_RequestCreatOrEditSvy (void)
Lay_StartRoundFrameTable (NULL,2,ItsANewSurvey ? Txt_New_survey :
Txt_Edit_survey);
/***** Survey for anywhere, degree or course? *****/
/***** Scope of the survey *****/
fprintf (Gbl.F.Out,"<tr>"
"<td class=\"RIGHT_MIDDLE\">"
"<label class=\"%s\">%s:</label>"
@ -1556,8 +1582,7 @@ void Svy_RequestCreatOrEditSvy (void)
"<td class=\"LEFT_MIDDLE\">",
The_ClassForm[Gbl.Prefs.Theme],
Txt_Scope);
if (!Svy_SetDefaultAndAllowedForEdition ())
Lay_ShowErrorAndExit ("You don't have permission to edit surveys here.");
Svy_SetDefaultAndAllowedScope (&Svy);
Sco_GetScope ("ScopeSvy");
Sco_PutSelectorScope ("ScopeSvy",false);
fprintf (Gbl.F.Out,"</td>"
@ -1630,43 +1655,72 @@ void Svy_RequestCreatOrEditSvy (void)
/*****************************************************************************/
/*** Set default and allowed location ranges depending on logged user type ***/
/*****************************************************************************/
// Return true if user can edit surveys in current location
// Return true if user can edit survey
// Return false if user can not edit survey
static bool Svy_SetDefaultAndAllowedForEdition (void)
static void Svy_SetDefaultAndAllowedScope (struct Survey *Svy)
{
bool ICanEdit = false;
/***** Set default scope *****/
Gbl.Scope.Default = Sco_SCOPE_UNK;
Gbl.Scope.Allowed = 0;
switch (Gbl.Usrs.Me.LoggedRole)
{
case Rol_TEACHER:
if (Gbl.CurrentCrs.Crs.CrsCod > 0)
{
Gbl.Scope.Default = Sco_SCOPE_CRS;
Gbl.Scope.Allowed = 1 << Sco_SCOPE_CRS;
return true;
}
return false;
if (Gbl.CurrentCrs.Crs.CrsCod > 0)
{
if (Svy->Scope == Sco_SCOPE_UNK) // Scope not defined
Svy->Scope = Sco_SCOPE_CRS;
if (Svy->Scope == Sco_SCOPE_CRS)
{
Gbl.Scope.Default = Svy->Scope;
Gbl.Scope.Allowed = 1 << Sco_SCOPE_CRS;
ICanEdit = true;
}
}
break;
case Rol_DEG_ADM:
if (Gbl.CurrentDeg.Deg.DegCod > 0)
{
Gbl.Scope.Default = Sco_SCOPE_DEG;
Gbl.Scope.Allowed = 1 << Sco_SCOPE_DEG;
return true;
}
return false;
if (Svy->Scope == Sco_SCOPE_UNK) // Scope not defined
Svy->Scope = Sco_SCOPE_DEG;
if (Svy->Scope == Sco_SCOPE_DEG)
{
Gbl.Scope.Default = Svy->Scope;
Gbl.Scope.Allowed = 1 << Sco_SCOPE_DEG;
ICanEdit = true;
}
break;
// TODO: Add Rol_CTR_ADM
// TODO: Add Rol_INS_ADM
case Rol_SYS_ADM:
Gbl.Scope.Default = Sco_SCOPE_SYS;
if (Svy->Scope == Sco_SCOPE_UNK)
{
if (Gbl.CurrentCrs.Crs.CrsCod > 0)
Svy->Scope = Sco_SCOPE_CRS;
else if (Gbl.CurrentDeg.Deg.DegCod > 0)
Svy->Scope = Sco_SCOPE_DEG;
// TODO: Add Sco_SCOPE_CTR
// TODO: Add Sco_SCOPE_INS
// TODO: Add Sco_SCOPE_CTY
else
Svy->Scope = Sco_SCOPE_SYS;
}
Gbl.Scope.Default = Svy->Scope;
Gbl.Scope.Allowed = 1 << Sco_SCOPE_SYS |
// 1 << Sco_SCOPE_CTY | // TODO: Add this scope
// 1 << Sco_SCOPE_CTY | // TODO: Add this scope
// 1 << Sco_SCOPE_INS | // TODO: Add this scope
// 1 << Sco_SCOPE_CTR | // TODO: Add this scope
1 << Sco_SCOPE_DEG |
// 1 << Sco_SCOPE_CTR | // TODO: Add this scope
1 << Sco_SCOPE_DEG |
1 << Sco_SCOPE_CRS;
return true;
ICanEdit = true;
break;
default:
return false;
break;
}
if (!ICanEdit)
Lay_ShowErrorAndExit ("You don't have permission to edit surveys here.");
}
/*****************************************************************************/
@ -1765,12 +1819,14 @@ void Svy_RecFormSurvey (void)
case Sco_SCOPE_SYS:
NewSvy.DegCod = -1L;
NewSvy.CrsCod = -1L;
NewSvy.Scope = Sco_SCOPE_SYS;
break;
case Sco_SCOPE_DEG:
if (Gbl.CurrentDeg.Deg.DegCod > 0)
{
NewSvy.DegCod = Gbl.CurrentDeg.Deg.DegCod;
NewSvy.CrsCod = -1L;
NewSvy.Scope = Sco_SCOPE_DEG;
}
else
Lay_ShowErrorAndExit ("Wrong survey location.");
@ -1780,6 +1836,7 @@ void Svy_RecFormSurvey (void)
{
NewSvy.DegCod = -1L; // DegCod doen't mind when CrsCod > 0
NewSvy.CrsCod = Gbl.CurrentCrs.Crs.CrsCod;
NewSvy.Scope = Sco_SCOPE_CRS;
}
else
Lay_ShowErrorAndExit ("Wrong survey location.");
@ -1859,7 +1916,8 @@ void Svy_RecFormSurvey (void)
/*********** Update number of users notified in table of surveys *************/
/*****************************************************************************/
static void Svy_UpdateNumUsrsNotifiedByEMailAboutSurvey (long SvyCod,unsigned NumUsrsToBeNotifiedByEMail)
static void Svy_UpdateNumUsrsNotifiedByEMailAboutSurvey (long SvyCod,
unsigned NumUsrsToBeNotifiedByEMail)
{
char Query[512];
@ -1915,7 +1973,8 @@ static void Svy_UpdateSurvey (struct Survey *Svy,const char *Txt)
char Query[1024+Cns_MAX_BYTES_TEXT];
/***** Update the data of the survey *****/
sprintf (Query,"UPDATE surveys SET DegCod='%ld',CrsCod='%ld',Roles='%u',"
sprintf (Query,"UPDATE surveys"
" SET DegCod='%ld',CrsCod='%ld',Roles='%u',"
"StartTime=FROM_UNIXTIME('%ld'),"
"EndTime=FROM_UNIXTIME('%ld'),"
"Title='%s',Txt='%s'"

View File

@ -47,10 +47,11 @@ struct Survey
long SvyCod;
long DegCod;
long CrsCod;
Sco_Scope_t Scope;
unsigned Roles; // Example: if survey can be made by students and teachers, Roles == (1 << Rol_ROLE_STUDENT) | (1 << Rol_ROLE_TEACHER)
long UsrCod;
time_t TimeUTC[Svy_NUM_DATES];
char Title[Svy_MAX_LENGTH_SURVEY_TITLE+1];
time_t TimeUTC[Svy_NUM_DATES];
unsigned NumQsts; // Number of questions in the survey
unsigned NumUsrs; // Number of distinct users who have already answered the survey
struct
@ -66,6 +67,7 @@ struct Survey
} Status;
};
#define Svy_NUM_ORDERS 2
typedef enum
{
Svy_ORDER_BY_START_DATE = 0,