Version 20.86: May 31, 2021 New module swad_call_for_exam_database for database queries related to calls for exams.

This commit is contained in:
acanas 2021-05-31 13:52:39 +02:00
parent 96e80a87b7
commit 3699490179
8 changed files with 328 additions and 211 deletions

View File

@ -32,9 +32,9 @@ OBJS = swad_account.o swad_account_database.o swad_action.o swad_agenda.o \
swad_assignment_database.o swad_attendance.o swad_attendance_database.o \
swad_banner.o swad_banner_database.o swad_box.o swad_building.o \
swad_button.o \
swad_calendar.o swad_call_for_exam.o swad_center.o \
swad_center_config.o swad_chat.o swad_chat_database.o swad_config.o \
swad_connected.o swad_connected_database.o swad_cookie.o \
swad_calendar.o swad_call_for_exam.o swad_call_for_exam_database.o \
swad_center.o swad_center_config.o swad_chat.o swad_chat_database.o \
swad_config.o swad_connected.o swad_connected_database.o swad_cookie.o \
swad_cookie_database.o swad_country.o swad_country_config.o \
swad_country_database.o swad_course.o swad_course_config.o \
swad_course_database.o swad_cryptography.o \

View File

@ -33,6 +33,7 @@
#include "swad_box.h"
#include "swad_call_for_exam.h"
#include "swad_call_for_exam_database.h"
#include "swad_config.h"
#include "swad_database.h"
#include "swad_degree_database.h"
@ -80,9 +81,6 @@ static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams)
static void Cfe_AllocMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_FreeMemCallForExam (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_UpdateNumUsrsNotifiedByEMailAboutCallForExam (long ExaCod,
unsigned NumUsrsToBeNotifiedByEMail);
static void Cfe_GetExaCodToHighlight (struct Cfe_CallsForExams *CallsForExams);
static void Cfe_GetDateToHighlight (struct Cfe_CallsForExams *CallsForExams);
@ -91,9 +89,6 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams,
static void Cfe_PutIconToCreateNewCallForExam (__attribute__((unused)) void *Args);
static void Cfe_PutButtonToCreateNewCallForExam (void);
static long Cfe_AddCallForExamToDB (const struct Cfe_CallsForExams *CallsForExams);
static void Cfe_ModifyCallForExamInDB (const struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
static void Cfe_GetDataCallForExamFromDB (struct Cfe_CallsForExams *CallsForExams,
long ExaCod);
static void Cfe_ShowCallForExam (struct Cfe_CallsForExams *CallsForExams,
@ -124,7 +119,7 @@ static struct Cfe_CallsForExams *Cfe_GetGlobalCallsForExams (void)
void Cfe_ResetCallsForExams (struct Cfe_CallsForExams *CallsForExams)
{
CallsForExams->NumCallsForExams = 0;
CallsForExams->NumCallsForExams = 0;
CallsForExams->Lst = NULL;
CallsForExams->NewExaCod = -1L;
CallsForExams->HighlightExaCod = -1L;
@ -200,10 +195,10 @@ static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams)
/***** Get the year *****/
CallsForExams->CallForExam.Year = (unsigned)
Par_GetParToUnsignedLong ("Year",
0, // N.A.
Deg_MAX_YEARS_PER_DEGREE,
(unsigned long) Gbl.Hierarchy.Crs.Year);
Par_GetParToUnsignedLong ("Year",
0, // N.A.
Deg_MAX_YEARS_PER_DEGREE,
(unsigned long) Gbl.Hierarchy.Crs.Year);
/***** Get the type of call for exam *****/
Par_GetParToText ("ExamSession",CallsForExams->CallForExam.Session,Cfe_MAX_BYTES_SESSION);
@ -234,26 +229,16 @@ static long Cfe_GetParamsCallsForExams (struct Cfe_CallsForExams *CallsForExams)
CallsForExams->CallForExam.Duration.Minute = (unsigned) Par_GetParToUnsignedLong ("DurationMinute",
0,59,0);
/***** Get the place where the exam will happen *****/
Par_GetParToHTML ("Place",CallsForExams->CallForExam.Place,Cns_MAX_BYTES_TEXT);
/***** Get the modality of exam *****/
Par_GetParToHTML ("ExamMode",CallsForExams->CallForExam.Mode,Cns_MAX_BYTES_TEXT);
/***** Get the structure of exam *****/
Par_GetParToHTML ("Structure",CallsForExams->CallForExam.Structure,Cns_MAX_BYTES_TEXT);
/***** Get the mandatory documentation *****/
/***** Get the place where the exam will happen, the modality of exam,
the structure of exam, the mandatory documentation, the mandatory material,
the allowed material and other information *****/
Par_GetParToHTML ("Place" ,CallsForExams->CallForExam.Place ,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("ExamMode" ,CallsForExams->CallForExam.Mode ,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("Structure" ,CallsForExams->CallForExam.Structure ,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("DocRequired",CallsForExams->CallForExam.DocRequired,Cns_MAX_BYTES_TEXT);
/***** Get the mandatory material *****/
Par_GetParToHTML ("MatRequired",CallsForExams->CallForExam.MatRequired,Cns_MAX_BYTES_TEXT);
/***** Get the allowed material *****/
Par_GetParToHTML ("MatAllowed",CallsForExams->CallForExam.MatAllowed,Cns_MAX_BYTES_TEXT);
/***** Get other information *****/
Par_GetParToHTML ("OtherInfo",CallsForExams->CallForExam.OtherInfo,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("MatAllowed" ,CallsForExams->CallForExam.MatAllowed ,Cns_MAX_BYTES_TEXT);
Par_GetParToHTML ("OtherInfo" ,CallsForExams->CallForExam.OtherInfo ,Cns_MAX_BYTES_TEXT);
return ExaCod;
}
@ -356,9 +341,9 @@ void Cfe_ReceiveCallForExam1 (void)
/***** Add the call for exam to the database and read it again from the database *****/
if (NewCallForExam)
CallsForExams->NewExaCod = ExaCod = Cfe_AddCallForExamToDB (CallsForExams);
CallsForExams->NewExaCod = ExaCod = Cfe_DB_CreateCallForExam (&CallsForExams->CallForExam);
else
Cfe_ModifyCallForExamInDB (CallsForExams,ExaCod);
Cfe_DB_ModifyCallForExam (&CallsForExams->CallForExam,ExaCod);
/***** Free memory of the call for exam *****/
Cfe_FreeMemCallForExam (CallsForExams);
@ -381,7 +366,7 @@ void Cfe_ReceiveCallForExam2 (void)
/***** Notify by email about the new call for exam *****/
if ((NumUsrsToBeNotifiedByEMail = Ntf_StoreNotifyEventsToAllUsrs (Ntf_EVENT_CALL_FOR_EXAM,CallsForExams->HighlightExaCod)))
Cfe_UpdateNumUsrsNotifiedByEMailAboutCallForExam (CallsForExams->HighlightExaCod,NumUsrsToBeNotifiedByEMail);
Cfe_DB_UpdateNumUsrsNotifiedByEMailAboutCallForExam (CallsForExams->HighlightExaCod,NumUsrsToBeNotifiedByEMail);
/***** Create a new social note about the new call for exam *****/
Tml_Not_StoreAndPublishNote (TL_NOTE_CALL_FOR_EXAM,CallsForExams->HighlightExaCod);
@ -393,23 +378,6 @@ void Cfe_ReceiveCallForExam2 (void)
Cfe_ListCallsForExamsEdit ();
}
/*****************************************************************************/
/******* Update number of users notified in table of calls for exams *********/
/*****************************************************************************/
static void Cfe_UpdateNumUsrsNotifiedByEMailAboutCallForExam (long ExaCod,
unsigned NumUsrsToBeNotifiedByEMail)
{
/***** Update number of users notified *****/
DB_QueryUPDATE ("can not update the number of notifications"
" of a call for exam",
"UPDATE cfe_exams"
" SET NumNotif=NumNotif+%u"
" WHERE ExaCod=%ld",
NumUsrsToBeNotifiedByEMail,
ExaCod);
}
/*****************************************************************************/
/*************************** Print a call for exam ***************************/
/*****************************************************************************/
@ -462,15 +430,14 @@ void Cfe_ReqRemoveCallForExam (void)
/* Begin alert */
Ale_ShowAlertAndButton1 (Ale_QUESTION,Txt_Do_you_really_want_to_remove_the_following_call_for_exam);
/* Show call for exam */
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
Cfe_ShowCallForExam (&CallsForExams,ExaCod,Cfe_NORMAL_VIEW,
false); // Don't highlight
Cfe_FreeMemCallForExam (&CallsForExams);
/* Show call for exam */
Cfe_AllocMemCallForExam (&CallsForExams);
Cfe_GetDataCallForExamFromDB (&CallsForExams,ExaCod);
Cfe_ShowCallForExam (&CallsForExams,ExaCod,Cfe_NORMAL_VIEW,
false); // Don't highlight
Cfe_FreeMemCallForExam (&CallsForExams);
/* End alert */
Ale_ShowAlertAndButton2 (ActRemCfe,NULL,NULL,
Cfe_PutParamExaCodToEdit,&CallsForExams.ExaCod,
Btn_REMOVE_BUTTON,Txt_Remove);
@ -495,14 +462,7 @@ void Cfe_RemoveCallForExam1 (void)
Err_WrongCallForExamExit ();
/***** Mark the call for exam as deleted in the database *****/
DB_QueryUPDATE ("can not remove call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld",
(unsigned) Cfe_DELETED_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
Cfe_DB_MarkACallForExamAsDeleted (ExaCod);
/***** Mark possible notifications as removed *****/
Ntf_MarkNotifAsRemoved (Ntf_EVENT_CALL_FOR_EXAM,ExaCod);
@ -544,14 +504,7 @@ void Cfe_HideCallForExam (void)
Err_WrongCallForExamExit ();
/***** Mark the call for exam as hidden in the database *****/
DB_QueryUPDATE ("can not hide call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld",
(unsigned) Cfe_HIDDEN_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
Cfe_DB_HideCallForExam (ExaCod);
/***** Set exam to be highlighted *****/
CallsForExams->HighlightExaCod = ExaCod;
@ -576,14 +529,7 @@ void Cfe_UnhideCallForExam (void)
Err_WrongCallForExamExit ();
/***** Mark the call for exam as visible in the database *****/
DB_QueryUPDATE ("can not unhide call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld",
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
Cfe_DB_UnhideCallForExam (ExaCod);
/***** Set exam to be highlighted *****/
CallsForExams->HighlightExaCod = ExaCod;
@ -710,7 +656,7 @@ static void Cfe_ListCallsForExams (struct Cfe_CallsForExams *CallsForExams,
NumExaAnns = (unsigned)
DB_QuerySELECT (&mysql_res,"can not get calls for exams"
" in this course for listing",
"SELECT ExaCod" // row[0]
"SELECT ExaCod" // row[0]
" FROM cfe_exams"
" WHERE CrsCod=%ld"
" AND %s"
@ -798,98 +744,10 @@ static void Cfe_PutButtonToCreateNewCallForExam (void)
extern const char *Txt_New_call_FOR_EXAM;
Frm_BeginForm (ActEdiCfe);
Btn_PutConfirmButton (Txt_New_call_FOR_EXAM);
Btn_PutConfirmButton (Txt_New_call_FOR_EXAM);
Frm_EndForm ();
}
/*****************************************************************************/
/******************** Add a call for exam to the database ********************/
/*****************************************************************************/
// Return the code of the call for exam just added
static long Cfe_AddCallForExamToDB (const struct Cfe_CallsForExams *CallsForExams)
{
long ExaCod;
/***** Add call for exam *****/
ExaCod =
DB_QueryINSERTandReturnCode ("can not create a new call for exam",
"INSERT INTO cfe_exams "
"(CrsCod,Status,NumNotif,CrsFullName,Year,ExamSession,"
"CallDate,ExamDate,Duration,"
"Place,ExamMode,Structure,"
"DocRequired,MatRequired,MatAllowed,OtherInfo)"
" VALUES "
"(%ld,%u,0,'%s',%u,'%s',"
"NOW(),'%04u-%02u-%02u %02u:%02u:00','%02u:%02u:00',"
"'%s','%s','%s',"
"'%s','%s','%s','%s')",
Gbl.Hierarchy.Crs.CrsCod,
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM,
CallsForExams->CallForExam.CrsFullName,
CallsForExams->CallForExam.Year,
CallsForExams->CallForExam.Session,
CallsForExams->CallForExam.ExamDate.Year,
CallsForExams->CallForExam.ExamDate.Month,
CallsForExams->CallForExam.ExamDate.Day,
CallsForExams->CallForExam.StartTime.Hour,
CallsForExams->CallForExam.StartTime.Minute,
CallsForExams->CallForExam.Duration.Hour,
CallsForExams->CallForExam.Duration.Minute,
CallsForExams->CallForExam.Place,
CallsForExams->CallForExam.Mode,
CallsForExams->CallForExam.Structure,
CallsForExams->CallForExam.DocRequired,
CallsForExams->CallForExam.MatRequired,
CallsForExams->CallForExam.MatAllowed,
CallsForExams->CallForExam.OtherInfo);
return ExaCod;
}
/*****************************************************************************/
/***************** Modify a call for exam in the database ********************/
/*****************************************************************************/
static void Cfe_ModifyCallForExamInDB (const struct Cfe_CallsForExams *CallsForExams,
long ExaCod)
{
/***** Modify call for exam *****/
DB_QueryUPDATE ("can not update a call for exam",
"UPDATE cfe_exams"
" SET CrsFullName='%s',"
"Year=%u,"
"ExamSession='%s',"
"ExamDate='%04u-%02u-%02u %02u:%02u:00',"
"Duration='%02u:%02u:00',"
"Place='%s',"
"ExamMode='%s',"
"Structure='%s',"
"DocRequired='%s',"
"MatRequired='%s',"
"MatAllowed='%s',"
"OtherInfo='%s'"
" WHERE ExaCod=%ld",
CallsForExams->CallForExam.CrsFullName,
CallsForExams->CallForExam.Year,
CallsForExams->CallForExam.Session,
CallsForExams->CallForExam.ExamDate.Year,
CallsForExams->CallForExam.ExamDate.Month,
CallsForExams->CallForExam.ExamDate.Day,
CallsForExams->CallForExam.StartTime.Hour,
CallsForExams->CallForExam.StartTime.Minute,
CallsForExams->CallForExam.Duration.Hour,
CallsForExams->CallForExam.Duration.Minute,
CallsForExams->CallForExam.Place,
CallsForExams->CallForExam.Mode,
CallsForExams->CallForExam.Structure,
CallsForExams->CallForExam.DocRequired,
CallsForExams->CallForExam.MatRequired,
CallsForExams->CallForExam.MatAllowed,
CallsForExams->CallForExam.OtherInfo,
ExaCod);
}
/*****************************************************************************/
/******** Create a list with the dates of all the calls for exams ************/
/*****************************************************************************/
@ -1842,17 +1700,3 @@ static void Cfe_GetNotifContentCallForExam (const struct Cfe_CallsForExams *Call
Txt_CALL_FOR_EXAM_Other_information,CallsForExams->CallForExam.OtherInfo) < 0)
Err_NotEnoughMemoryExit ();
}
/*****************************************************************************/
/*********** Mark all exam announcements in the course as deleted ************/
/*****************************************************************************/
void Cfe_DB_MarkCallForExamsInCrsAsDeleted (long CrsCod)
{
DB_QueryUPDATE ("can not remove calls for exams of a course",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE CrsCod=%ld",
(unsigned) Cfe_DELETED_CALL_FOR_EXAM,
CrsCod);
}

View File

@ -126,6 +126,4 @@ void Cfe_GetSummaryAndContentCallForExam (char SummaryStr[Ntf_MAX_BYTES_SUMMARY
char **ContentStr,
long ExaCod,bool GetContent);
void Cfe_DB_MarkCallForExamsInCrsAsDeleted (long CrsCod);
#endif

View File

@ -0,0 +1,236 @@
// swad_exam_announcement_database.c: calls for exams operations with database
/*
SWAD (Shared Workspace At a Distance),
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-2021 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 3 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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
// #define _GNU_SOURCE // For asprintf
// #include <stddef.h> // For NULL
// #include <stdio.h> // For sscanf, asprintf, etc.
// #include <stdlib.h> // For exit, system, malloc, calloc, free, etc.
// #include <string.h> // For string functions
// #include "swad_box.h"
#include "swad_call_for_exam.h"
#include "swad_call_for_exam_database.h"
// #include "swad_config.h"
#include "swad_database.h"
// #include "swad_degree_database.h"
// #include "swad_error.h"
// #include "swad_form.h"
#include "swad_global.h"
// #include "swad_hierarchy.h"
// #include "swad_hierarchy_level.h"
// #include "swad_HTML.h"
// #include "swad_logo.h"
// #include "swad_notification.h"
// #include "swad_parameter.h"
// #include "swad_QR.h"
// #include "swad_RSS.h"
// #include "swad_string.h"
// #include "swad_timeline.h"
// #include "swad_timeline_database.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/
/*****************************************************************************/
extern struct Globals Gbl;
/*****************************************************************************/
/***************************** Private constants *****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private variables *****************************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
/*****************************************************************************/
/******************** Add a call for exam to the database ********************/
/*****************************************************************************/
// Return the code of the call for exam just added
long Cfe_DB_CreateCallForExam (const struct Cfe_CallForExam *CallForExam)
{
return
DB_QueryINSERTandReturnCode ("can not create a new call for exam",
"INSERT INTO cfe_exams "
"(CrsCod,Status,NumNotif,CrsFullName,Year,ExamSession,"
"CallDate,ExamDate,Duration,"
"Place,ExamMode,Structure,"
"DocRequired,MatRequired,MatAllowed,OtherInfo)"
" VALUES "
"(%ld,%u,0,'%s',%u,'%s',"
"NOW(),'%04u-%02u-%02u %02u:%02u:00','%02u:%02u:00',"
"'%s','%s','%s',"
"'%s','%s','%s','%s')",
Gbl.Hierarchy.Crs.CrsCod,
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM,
CallForExam->CrsFullName,
CallForExam->Year,
CallForExam->Session,
CallForExam->ExamDate.Year,
CallForExam->ExamDate.Month,
CallForExam->ExamDate.Day,
CallForExam->StartTime.Hour,
CallForExam->StartTime.Minute,
CallForExam->Duration.Hour,
CallForExam->Duration.Minute,
CallForExam->Place,
CallForExam->Mode,
CallForExam->Structure,
CallForExam->DocRequired,
CallForExam->MatRequired,
CallForExam->MatAllowed,
CallForExam->OtherInfo);
}
/*****************************************************************************/
/***************** Modify a call for exam in the database ********************/
/*****************************************************************************/
void Cfe_DB_ModifyCallForExam (const struct Cfe_CallForExam *CallForExam,
long ExaCod)
{
/***** Modify call for exam *****/
DB_QueryUPDATE ("can not update a call for exam",
"UPDATE cfe_exams"
" SET CrsFullName='%s',"
"Year=%u,"
"ExamSession='%s',"
"ExamDate='%04u-%02u-%02u %02u:%02u:00',"
"Duration='%02u:%02u:00',"
"Place='%s',"
"ExamMode='%s',"
"Structure='%s',"
"DocRequired='%s',"
"MatRequired='%s',"
"MatAllowed='%s',"
"OtherInfo='%s'"
" WHERE ExaCod=%ld",
CallForExam->CrsFullName,
CallForExam->Year,
CallForExam->Session,
CallForExam->ExamDate.Year,
CallForExam->ExamDate.Month,
CallForExam->ExamDate.Day,
CallForExam->StartTime.Hour,
CallForExam->StartTime.Minute,
CallForExam->Duration.Hour,
CallForExam->Duration.Minute,
CallForExam->Place,
CallForExam->Mode,
CallForExam->Structure,
CallForExam->DocRequired,
CallForExam->MatRequired,
CallForExam->MatAllowed,
CallForExam->OtherInfo,
ExaCod);
}
/*****************************************************************************/
/******* Update number of users notified in table of calls for exams *********/
/*****************************************************************************/
void Cfe_DB_UpdateNumUsrsNotifiedByEMailAboutCallForExam (long ExaCod,
unsigned NumUsrsToBeNotifiedByEMail)
{
DB_QueryUPDATE ("can not update the number of notifications"
" of a call for exam",
"UPDATE cfe_exams"
" SET NumNotif=NumNotif+%u"
" WHERE ExaCod=%ld",
NumUsrsToBeNotifiedByEMail,
ExaCod);
}
/*****************************************************************************/
/************* Mark the call for exam as hidden in the database **************/
/*****************************************************************************/
void Cfe_DB_HideCallForExam (long ExaCod)
{
DB_QueryUPDATE ("can not hide call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld", // Extra check
(unsigned) Cfe_HIDDEN_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/************* Mark the call for exam as visible in the database *************/
/*****************************************************************************/
void Cfe_DB_UnhideCallForExam (long ExaCod)
{
DB_QueryUPDATE ("can not unhide call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld", // Extra check
(unsigned) Cfe_VISIBLE_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/***** Mark a call for exam as deleted in the database *****/
/*****************************************************************************/
void Cfe_DB_MarkACallForExamAsDeleted (long ExaCod)
{
DB_QueryUPDATE ("can not remove call for exam",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE ExaCod=%ld"
" AND CrsCod=%ld", // Extra check
(unsigned) Cfe_DELETED_CALL_FOR_EXAM,
ExaCod,
Gbl.Hierarchy.Crs.CrsCod);
}
/*****************************************************************************/
/*********** Mark all exam announcements in the course as deleted ************/
/*****************************************************************************/
void Cfe_DB_MarkCallForExamsInCrsAsDeleted (long CrsCod)
{
DB_QueryUPDATE ("can not remove calls for exams of a course",
"UPDATE cfe_exams"
" SET Status=%u"
" WHERE CrsCod=%ld",
(unsigned) Cfe_DELETED_CALL_FOR_EXAM,
CrsCod);
}

View File

@ -0,0 +1,59 @@
// swad_call_for_exam_database.h: calls for exams operations with database
#ifndef _SWAD_CFE_DB
#define _SWAD_CFE_DB
/*
SWAD (Shared Workspace At a Distance),
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-2021 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 3 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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
// #include <stdbool.h> // For boolean type
#include "swad_call_for_exam.h"
// #include "swad_constant.h"
// #include "swad_course.h"
// #include "swad_date.h"
// #include "swad_notification.h"
/*****************************************************************************/
/************************** Public types and constants ***********************/
/*****************************************************************************/
/*****************************************************************************/
/***************************** Public prototypes *****************************/
/*****************************************************************************/
long Cfe_DB_CreateCallForExam (const struct Cfe_CallForExam *CallForExam);
void Cfe_DB_ModifyCallForExam (const struct Cfe_CallForExam *CallForExam,
long ExaCod);
void Cfe_DB_UpdateNumUsrsNotifiedByEMailAboutCallForExam (long ExaCod,
unsigned NumUsrsToBeNotifiedByEMail);
void Cfe_DB_HideCallForExam (long ExaCod);
void Cfe_DB_UnhideCallForExam (long ExaCod);
void Cfe_DB_MarkACallForExamAsDeleted (long ExaCod);
void Cfe_DB_MarkCallForExamsInCrsAsDeleted (long CrsCod);
#endif

View File

@ -602,13 +602,14 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/
#define Log_PLATFORM_VERSION "SWAD 20.85 (2021-05-28)"
#define Log_PLATFORM_VERSION "SWAD 20.86 (2021-05-31)"
#define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js"
/*
TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.86: May 31, 2021 New module swad_call_for_exam_database for database queries related to calls for exams. (? lines)
Version 20.85: May 28, 2021 Queries moved to module swad_degree_database. (312319 lines)
Version 20.84: May 27, 2021 New module swad_degree_database for database queries related to degrees. (312216 lines)
Version 20.83.1: May 27, 2021 Database function moved from swad_date to swad_setting. (311993 lines)

View File

@ -25,26 +25,10 @@
/********************************* Headers ***********************************/
/*****************************************************************************/
// #include <stdbool.h> // For boolean type
// #include <stddef.h> // For NULL
// #include <stdlib.h> // For free
// #include <string.h> // For string functions
#include "swad_database.h"
// #include "swad_degree.h"
// #include "swad_degree_config.h"
#include "swad_degree_database.h"
#include "swad_error.h"
// #include "swad_figure.h"
// #include "swad_figure_cache.h"
// #include "swad_form.h"
// #include "swad_forum.h"
#include "swad_global.h"
// #include "swad_hierarchy.h"
// #include "swad_HTML.h"
// #include "swad_logo.h"
// #include "swad_message.h"
// #include "swad_survey.h"
/*****************************************************************************/
/************** External global variables from others modules ****************/

View File

@ -29,13 +29,8 @@
#include <mysql/mysql.h> // To access MySQL databases
// #include "swad_action.h"
// #include "swad_constant.h"
#include "swad_degree.h"
#include "swad_degree_type.h"
// #include "swad_hierarchy_level.h"
// #include "swad_role_type.h"
// #include "swad_string.h"
/*****************************************************************************/
/***************************** Public constants ******************************/