swad-core/swad_group.h

244 lines
8.9 KiB
C

// swad_group.h: types of groups and groups
#ifndef _SWAD_GRP
#define _SWAD_GRP
/*
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-2024 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 <http://www.gnu.org/licenses/>.
*/
/*****************************************************************************/
/********************************* Headers ***********************************/
/*****************************************************************************/
#include "swad_info.h"
#include "swad_room.h"
#include "swad_user.h"
/*****************************************************************************/
/***************************** Public constants ******************************/
/*****************************************************************************/
#define Grp_MAX_CHARS_GROUP_TYPE_NAME (128 - 1) // 127
#define Grp_MAX_BYTES_GROUP_TYPE_NAME ((Grp_MAX_CHARS_GROUP_TYPE_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Grp_MAX_CHARS_GROUP_NAME (128 - 1) // 127
#define Grp_MAX_BYTES_GROUP_NAME ((Grp_MAX_CHARS_GROUP_NAME + 1) * Str_MAX_BYTES_PER_CHAR - 1) // 2047
#define Grp_MAX_STUDENTS_IN_A_GROUP 10000 // If max of students in a group is greater than this, it is considered infinite
#define Grp_NUM_STUDENTS_NOT_LIMITED INT_MAX // This number can be stored in database as an integer...
// ...and means that a group has no limit of students
/*****************************************************************************/
/******************************* Public types ********************************/
/*****************************************************************************/
#define Grp_NUM_WHICH_GROUP_TYPES 2
typedef enum
{
Grp_ONLY_GROUP_TYPES_WITH_GROUPS,
Grp_ALL_GROUP_TYPES,
} Grp_WhichGroupTypes_t;
// Related with groups
struct GroupData
{
long GrpCod; // Group code
long GrpTypCod; // Group type code
long CrsCod; // Course code
char GrpTypName[Grp_MAX_BYTES_GROUP_TYPE_NAME + 1];
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1];
struct
{
long RooCod; // Room code
char ShrtName[Nam_MAX_BYTES_SHRT_NAME + 1]; // Room short name
} Room;
unsigned MaxStudents;
int Vacant;
CloOpe_ClosedOrOpen_t ClosedOrOpen; // Group is closed or open?
bool FileZones; // Group has file zones?
bool MultipleEnrolment;
};
struct Group
{
long GrpCod; // Code of group
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1]; // Name of group
struct
{
long RooCod; // Room code
char ShrtName[Nam_MAX_BYTES_SHRT_NAME + 1]; // Room short name
} Room;
unsigned NumUsrs[Rol_NUM_ROLES]; // Number of users in the group
unsigned MaxStudents; // Maximum number of students in the group
CloOpe_ClosedOrOpen_t ClosedOrOpen; // Group is closed or open?
bool FileZones; // Group has file zones?
bool ShowFileZone; // Show file zone of this group?
};
struct GroupType
{
long GrpTypCod; // Code of type of group
char GrpTypName[Grp_MAX_BYTES_GROUP_TYPE_NAME + 1]; // Name of type of group
bool MandatoryEnrolment; // Enrolment is mandatory?
bool MultipleEnrolment; // Enrolment is multiple?
bool MustBeOpened; // Groups must be opened?
time_t OpenTimeUTC; // Open groups automatically in this date-time. If == 0, don't open.
unsigned NumGrps; // Number of groups of this type
struct Group *LstGrps; // List of groups of this type
};
struct GroupTypes
{
struct GroupType *LstGrpTypes; // List of types of group
unsigned NumGrpTypes; // Number of types of group
unsigned NumGrpsTotal; // Number of groups of any type
int NestedCalls; // Number of nested calls to the function that allocates memory for this list
};
struct ListCodGrps
{
long *GrpCods;
unsigned NumGrps;
int NestedCalls; // Number of nested calls to the function that allocates memory for this list
};
struct ListGrpsAlreadySelec
{
long GrpTypCod;
bool AlreadySelected;
};
#define Grp_NUM_WHICH_GROUPS 2
typedef enum
{
Grp_MY_GROUPS,
Grp_ALL_GROUPS,
} Grp_WhichGroups_t;
#define Grp_WHICH_GROUPS_DEFAULT Grp_ALL_GROUPS
#define Grp_NUM_ASSOCIATIONS_TO_GROUPS 5
typedef enum
{
Grp_ASSIGNMENT,
Grp_ATT_EVENT,
Grp_SURVEY,
Grp_EXA_EVENT,
Grp_MATCH,
} Grp_WhichIsAssociatedToGrp_t;
struct Grp_Groups
{
unsigned NumGrps;
struct GroupTypes GrpTypes;
struct GroupType GrpTyp;
long GrpCod; // Group to be edited, removed...
char GrpName[Grp_MAX_BYTES_GROUP_NAME + 1];
long RooCod;
unsigned MaxStudents;
CloOpe_ClosedOrOpen_t ClosedOrOpen;
bool FileZones;
bool AllGrps; // All groups selected?
struct ListCodGrps LstGrpsSel;
Grp_WhichGroups_t WhichGrps; // Show my groups or all groups
};
/*****************************************************************************/
/****************************** Public prototypes ****************************/
/*****************************************************************************/
void Grp_WriteNamesOfSelectedGrps (void);
void Grp_ReqEditGroups (void);
void Grp_ShowFormToSelectSeveralGroups (Act_Action_t NextAction,
void (*FuncPars) (void *Args),void *Args,
const char *OnSubmit);
void Grp_PutParsCodGrps (void);
void Grp_GetParCodsSeveralGrpsToShowUsrs (void);
void Grp_GetParCodsSeveralGrps (void);
void Grp_FreeListCodSelectedGrps (void);
void Grp_ChangeMyGrpsAndShowChanges (void);
void Grp_ChangeMyGrps (Cns_QuietOrVerbose_t QuietOrVerbose);
void Grp_ChangeOtherUsrGrps (void);
bool Grp_ChangeMyGrpsAtomically (struct ListCodGrps *LstGrpsIWant);
void Grp_ChangeGrpsOtherUsrAtomically (struct ListCodGrps *LstGrpsUsrWants);
bool Grp_CheckIfSelectionGrpsSingleEnrolmentIsValid (Rol_Role_t Role,struct ListCodGrps *LstGrps);
void Grp_RegisterUsrIntoGroups (struct Usr_Data *UsrDat,struct ListCodGrps *LstGrps);
unsigned Grp_RemoveUsrFromGroups (struct Usr_Data *UsrDat,struct ListCodGrps *LstGrps);
void Grp_RemUsrFromAllGrpsInCrs (long UsrCod,long CrsCod);
void Grp_RemUsrFromAllGrps (long UsrCod);
void Grp_WriteTheWholeCourse (void);
void Grp_ListGrpsToEditAsgAttSvyEvtMch (struct GroupType *GrpTyp,
Grp_WhichIsAssociatedToGrp_t WhichIsAssociatedToGrp,
long Cod);
void Grp_ReqRegisterInGrps (void);
void Grp_ShowLstGrpsToChgMyGrps (void);
void Grp_ShowLstGrpsToChgOtherUsrsGrps (long UsrCod);
void Grp_GetListGrpTypesInCurrentCrs (Grp_WhichGroupTypes_t WhichGroupTypes);
void Grp_FreeListGrpTypesAndGrps (void);
void Grp_OpenGroupsAutomatically (void);
void Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_WhichGroupTypes_t WhichGroupTypes);
void Grp_GetGroupDataByCod (struct GroupData *GrpDat);
void Grp_FlushCacheIBelongToGrp (void);
bool Grp_GetIfIBelongToGrp (long GrpCod);
void Grp_FlushCacheUsrSharesAnyOfMyGrpsInCurrentCrs (void);
bool Grp_CheckIfUsrSharesAnyOfMyGrpsInCurrentCrs (const struct Usr_Data *UsrDat);
void Grp_GetLstCodGrpsWithFileZonesIBelong (struct ListCodGrps *LstGrps);
void Grp_GetNamesGrpsUsrBelongsTo (long UsrCod,long GrpTypCod,char *GroupNames);
void Grp_ReceiveNewGrpTyp (void);
void Grp_ReceiveNewGrp (void);
void Grp_ReqRemGroupType (void);
void Grp_ReqRemGroup (void);
void Grp_RemoveGroupType (void);
void Grp_RemoveGroup (void);
void Grp_OpenGroup (void);
void Grp_CloseGroup (void);
void Grp_EnableFileZonesGrp (void);
void Grp_DisableFileZonesGrp (void);
void Grp_ChangeGroupType (void);
void Grp_ChangeGroupRoom (void);
void Grp_ChangeMandatGrpTyp (void);
void Grp_ChangeMultiGrpTyp (void);
void Grp_ChangeOpenTimeGrpTyp (void);
void Grp_ChangeMaxStdsGrp (void);
unsigned Grp_ConvertToNumMaxStdsGrp (const char *StrMaxStudents);
void Grp_RenameGroupType (void);
void Grp_RenameGroup (void);
void Grp_GetLstCodsGrpWanted (struct ListCodGrps *LstGrpsWanted);
void Grp_FreeListCodGrp (struct ListCodGrps *LstGrps);
void Grp_PutParAllGroups (void);
void Grp_PutParWhichGroups (void *WhichGrps);
void Grp_PutParWhichGrpsOnlyMyGrps (void);
void Grp_PutParWhichGrpsAllGrps (void);
void Grp_ShowFormToSelWhichGrps (Act_Action_t Action,
void (*FuncPars) (void *Args),void *Args);
Grp_WhichGroups_t Grp_GetParWhichGroups (void);
void Grp_DB_RemoveCrsGrps (long HieCod);
#endif