diff --git a/docs/_static/img/graphs/activity.svg b/docs/_static/img/graphs/activity.svg new file mode 100644 index 00000000..22971f1e --- /dev/null +++ b/docs/_static/img/graphs/activity.svg @@ -0,0 +1,344 @@ + + + + + + +model_graph + + + +activity_models_ActivityType + + +     +    ActivityType     +     +id +     +     +AutoField +     +     +can_invite +     +     +BooleanField +     +     +guest_entry_fee +     +     +PositiveIntegerField +     +     +manage_entries +     +     +BooleanField +     +     +name +     +     +CharField +     + + + + +activity_models_Activity + + +     +    Activity     +     +id +     +     +AutoField +     +     +activity_type +     +     +ForeignKey (id) +     +     +attendees_club +     +     +ForeignKey (id) +     +     +creater +     +     +ForeignKey (id) +     +     +organizer +     +     +ForeignKey (id) +     +     +date_end +     +     +DateTimeField +     +     +date_start +     +     +DateTimeField +     +     +description +     +     +TextField +     +     +location +     +     +CharField +     +     +name +     +     +CharField +     +     +open +     +     +BooleanField +     +     +valid +     +     +BooleanField +     + + + + +activity_models_Activity->activity_models_ActivityType + + + activity_type (+) + + + +django_contrib_auth_models_User + + +   +User +   + + + +activity_models_Activity->django_contrib_auth_models_User + + + creater (activity) + + + +member_models_Club + + +   +Club +   + + + +activity_models_Activity->member_models_Club + + + organizer (+) + + + +activity_models_Activity->member_models_Club + + + attendees_club (+) + + + +activity_models_Entry + + +     +    Entry     +     +id +     +     +AutoField +     +     +activity +     +     +ForeignKey (id) +     +     +guest +     +     +OneToOneField (id) +     +     +note +     +     +ForeignKey (note_ptr) +     +     +time +     +     +DateTimeField +     + + + + +activity_models_Entry->activity_models_Activity + + + activity (entries) + + + +activity_models_Guest + + +     +    Guest     +     +id +     +     +AutoField +     +     +activity +     +     +ForeignKey (id) +     +     +inviter +     +     +ForeignKey (note_ptr) +     +     +first_name +     +     +CharField +     +     +last_name +     +     +CharField +     + + + + +activity_models_Entry->activity_models_Guest + + guest (entry) + + + +note_models_notes_NoteUser + + +   +NoteUser +   + + + +activity_models_Entry->note_models_notes_NoteUser + + + note (entry) + + + +activity_models_Guest->activity_models_Activity + + + activity (+) + + + +activity_models_Guest->note_models_notes_NoteUser + + + inviter (guests) + + + +activity_models_GuestTransaction + + +     +    GuestTransaction     +     +transaction_ptr +     +     +OneToOneField (id) +     +     +entry +     +     +OneToOneField (id) +     + + + + +activity_models_GuestTransaction->activity_models_Entry + + entry (guesttransaction) + + + +note_models_transactions_Transaction + + +   +Transaction +   + + + +activity_models_GuestTransaction->note_models_transactions_Transaction + + + multi-table +inheritance + + + diff --git a/docs/_static/img/graphs/logs.svg b/docs/_static/img/graphs/logs.svg new file mode 100644 index 00000000..e451eda4 --- /dev/null +++ b/docs/_static/img/graphs/logs.svg @@ -0,0 +1,108 @@ + + + + + + +model_graph + + + +logs_models_Changelog + + +     +    Changelog     +     +id +     +     +AutoField +     +     +model +     +     +ForeignKey (id) +     +     +user +     +     +ForeignKey (id) +     +     +action +     +     +CharField +     +     +data +     +     +TextField +     +     +instance_pk +     +     +CharField +     +     +ip +     +     +GenericIPAddressField +     +     +previous +     +     +TextField +     +     +timestamp +     +     +DateTimeField +     + + + + +django_contrib_auth_models_User + + +   +User +   + + + +logs_models_Changelog->django_contrib_auth_models_User + + + user (changelog) + + + +django_contrib_contenttypes_models_ContentType + + +   +ContentType +   + + + +logs_models_Changelog->django_contrib_contenttypes_models_ContentType + + + model (changelog) + + + diff --git a/docs/_static/img/graphs/member.svg b/docs/_static/img/graphs/member.svg new file mode 100644 index 00000000..9057b40c --- /dev/null +++ b/docs/_static/img/graphs/member.svg @@ -0,0 +1,279 @@ + + + + + + +model_graph + + + +member_models_Profile + + +     +    Profile     +     +id +     +     +AutoField +     +     +user +     +     +OneToOneField (id) +     +     +address +     +     +CharField +     +     +department +     +     +CharField +     +     +email_confirmed +     +     +BooleanField +     +     +last_report +     +     +DateTimeField +     +     +ml_art_registration +     +     +BooleanField +     +     +ml_events_registration +     +     +CharField +     +     +ml_sport_registration +     +     +BooleanField +     +     +paid +     +     +BooleanField +     +     +phone_number +     +     +PhoneNumberField +     +     +promotion +     +     +PositiveSmallIntegerField +     +     +registration_valid +     +     +BooleanField +     +     +report_frequency +     +     +PositiveSmallIntegerField +     +     +section +     +     +CharField +     + + + + +django_contrib_auth_models_User + + +   +User +   + + + +member_models_Profile->django_contrib_auth_models_User + + user (profile) + + + +member_models_Club + + +     +    Club     +     +id +     +     +AutoField +     +     +parent_club +     +     +ForeignKey (id) +     +     +email +     +     +EmailField +     +     +membership_duration +     +     +PositiveIntegerField +     +     +membership_end +     +     +DateField +     +     +membership_fee_paid +     +     +PositiveIntegerField +     +     +membership_fee_unpaid +     +     +PositiveIntegerField +     +     +membership_start +     +     +DateField +     +     +name +     +     +CharField +     +     +require_memberships +     +     +BooleanField +     + + + + +member_models_Club->member_models_Club + + + parent_club (club) + + + +member_models_Membership + + +     +    Membership     +     +id +     +     +AutoField +     +     +club +     +     +ForeignKey (id) +     +     +user +     +     +ForeignKey (id) +     +     +date_end +     +     +DateField +     +     +date_start +     +     +DateField +     +     +fee +     +     +PositiveIntegerField +     + + + + +member_models_Membership->member_models_Club + + + club (membership) + + + +member_models_Membership->django_contrib_auth_models_User + + + user (memberships) + + + +permission_models_Role + + +   +Role +   + + + +member_models_Membership->permission_models_Role + + + + roles (membership) + + + diff --git a/docs/_static/img/graphs/note.svg b/docs/_static/img/graphs/note.svg new file mode 100644 index 00000000..ac066243 --- /dev/null +++ b/docs/_static/img/graphs/note.svg @@ -0,0 +1,588 @@ + + + + + + +model_graph + + + +polymorphic_models_PolymorphicModel + + +     +    PolymorphicModel     +     +polymorphic_ctype +     +     +ForeignKey (id) +     + + + + +django_contrib_contenttypes_models_ContentType + + +   +ContentType +   + + + +polymorphic_models_PolymorphicModel->django_contrib_contenttypes_models_ContentType + + + polymorphic_ctype (polymorphic_%(app_label)s.%(class)s_set+) + + + +note_models_notes_Note + + +     +    Note +< +PolymorphicModel +>     +     +id +     +     +AutoField +     +     +polymorphic_ctype +     +     +ForeignKey (id) +     +     +balance +     +     +BigIntegerField +     +     +created_at +     +     +DateTimeField +     +     +display_image +     +     +ImageField +     +     +inactivity_reason +     +     +CharField +     +     +is_active +     +     +BooleanField +     +     +last_negative +     +     +DateTimeField +     + + + + +note_models_notes_Note->polymorphic_models_PolymorphicModel + + + abstract +inheritance + + + +note_models_notes_NoteUser + + +     +    NoteUser     +     +note_ptr +     +     +OneToOneField (id) +     +     +user +     +     +OneToOneField (id) +     + + + + +note_models_notes_NoteUser->note_models_notes_Note + + + multi-table +inheritance + + + +django_contrib_auth_models_User + + +   +User +   + + + +note_models_notes_NoteUser->django_contrib_auth_models_User + + user (note) + + + +note_models_notes_NoteClub + + +     +    NoteClub     +     +note_ptr +     +     +OneToOneField (id) +     +     +club +     +     +OneToOneField (id) +     + + + + +note_models_notes_NoteClub->note_models_notes_Note + + + multi-table +inheritance + + + +member_models_Club + + +   +Club +   + + + +note_models_notes_NoteClub->member_models_Club + + club (note) + + + +note_models_notes_NoteSpecial + + +     +    NoteSpecial     +     +note_ptr +     +     +OneToOneField (id) +     +     +special_type +     +     +CharField +     + + + + +note_models_notes_NoteSpecial->note_models_notes_Note + + + multi-table +inheritance + + + +note_models_notes_Alias + + +     +    Alias     +     +id +     +     +AutoField +     +     +note +     +     +ForeignKey (id) +     +     +name +     +     +CharField +     +     +normalized_name +     +     +CharField +     + + + + +note_models_notes_Alias->note_models_notes_Note + + + note (alias) + + + +note_models_transactions_TemplateCategory + + +     +    TemplateCategory     +     +id +     +     +AutoField +     +     +name +     +     +CharField +     + + + + +note_models_transactions_TransactionTemplate + + +     +    TransactionTemplate     +     +id +     +     +AutoField +     +     +category +     +     +ForeignKey (id) +     +     +destination +     +     +ForeignKey (note_ptr) +     +     +amount +     +     +PositiveIntegerField +     +     +description +     +     +CharField +     +     +display +     +     +BooleanField +     +     +highlighted +     +     +BooleanField +     +     +name +     +     +CharField +     + + + + +note_models_transactions_TransactionTemplate->note_models_notes_NoteClub + + + destination (+) + + + +note_models_transactions_TransactionTemplate->note_models_transactions_TemplateCategory + + + category (templates) + + + +note_models_transactions_Transaction + + +     +    Transaction +< +PolymorphicModel +>     +     +id +     +     +AutoField +     +     +destination +     +     +ForeignKey (id) +     +     +polymorphic_ctype +     +     +ForeignKey (id) +     +     +source +     +     +ForeignKey (id) +     +     +amount +     +     +PositiveIntegerField +     +     +created_at +     +     +DateTimeField +     +     +destination_alias +     +     +CharField +     +     +invalidity_reason +     +     +CharField +     +     +quantity +     +     +PositiveIntegerField +     +     +reason +     +     +CharField +     +     +source_alias +     +     +CharField +     +     +valid +     +     +BooleanField +     + + + + +note_models_transactions_Transaction->polymorphic_models_PolymorphicModel + + + abstract +inheritance + + + +note_models_transactions_Transaction->note_models_notes_Note + + + source (+) + + + +note_models_transactions_Transaction->note_models_notes_Note + + + destination (+) + + + +note_models_transactions_RecurrentTransaction + + +     +    RecurrentTransaction     +     +transaction_ptr +     +     +OneToOneField (id) +     +     +template +     +     +ForeignKey (id) +     + + + + +note_models_transactions_RecurrentTransaction->note_models_transactions_TransactionTemplate + + + template (recurrenttransaction) + + + +note_models_transactions_RecurrentTransaction->note_models_transactions_Transaction + + + multi-table +inheritance + + + +note_models_transactions_SpecialTransaction + + +     +    SpecialTransaction     +     +transaction_ptr +     +     +OneToOneField (id) +     +     +bank +     +     +CharField +     +     +first_name +     +     +CharField +     +     +last_name +     +     +CharField +     + + + + +note_models_transactions_SpecialTransaction->note_models_transactions_Transaction + + + multi-table +inheritance + + + +note_models_transactions_MembershipTransaction + + +     +    MembershipTransaction     +     +transaction_ptr +     +     +OneToOneField (id) +     +     +membership +     +     +OneToOneField (id) +     + + + + +note_models_transactions_MembershipTransaction->note_models_transactions_Transaction + + + multi-table +inheritance + + + +member_models_Membership + + +   +Membership +   + + + +note_models_transactions_MembershipTransaction->member_models_Membership + + membership (transaction) + + + diff --git a/docs/_static/img/graphs/permission.svg b/docs/_static/img/graphs/permission.svg new file mode 100644 index 00000000..e7fd7350 --- /dev/null +++ b/docs/_static/img/graphs/permission.svg @@ -0,0 +1,171 @@ + + + + + + +model_graph + + + +permission_models_PermissionMask + + +     +    PermissionMask     +     +id +     +     +AutoField +     +     +description +     +     +CharField +     +     +rank +     +     +PositiveSmallIntegerField +     + + + + +permission_models_Permission + + +     +    Permission     +     +id +     +     +AutoField +     +     +mask +     +     +ForeignKey (id) +     +     +model +     +     +ForeignKey (id) +     +     +description +     +     +CharField +     +     +field +     +     +CharField +     +     +permanent +     +     +BooleanField +     +     +query +     +     +TextField +     +     +type +     +     +CharField +     + + + + +permission_models_Permission->permission_models_PermissionMask + + + mask (permissions) + + + +django_contrib_contenttypes_models_ContentType + + +   +ContentType +   + + + +permission_models_Permission->django_contrib_contenttypes_models_ContentType + + + model (+) + + + +permission_models_Role + + +     +    Role     +     +id +     +     +AutoField +     +     +for_club +     +     +ForeignKey (id) +     +     +name +     +     +CharField +     + + + + +permission_models_Role->permission_models_Permission + + + + permissions (role) + + + +member_models_Club + + +   +Club +   + + + +permission_models_Role->member_models_Club + + + for_club (role) + + + diff --git a/docs/_static/img/graphs/treasury.svg b/docs/_static/img/graphs/treasury.svg new file mode 100644 index 00000000..c2fca750 --- /dev/null +++ b/docs/_static/img/graphs/treasury.svg @@ -0,0 +1,324 @@ + + + + + + +model_graph + + + +treasury_models_Invoice + + +     +    Invoice     +     +id +     +     +PositiveIntegerField +     +     +acquitted +     +     +BooleanField +     +     +address +     +     +TextField +     +     +bde +     +     +CharField +     +     +date +     +     +DateField +     +     +description +     +     +TextField +     +     +locked +     +     +BooleanField +     +     +name +     +     +CharField +     +     +object +     +     +CharField +     +     +tex +     +     +TextField +     + + + + +treasury_models_Product + + +     +    Product     +     +id +     +     +AutoField +     +     +invoice +     +     +ForeignKey (id) +     +     +amount +     +     +IntegerField +     +     +designation +     +     +CharField +     +     +quantity +     +     +PositiveIntegerField +     + + + + +treasury_models_Product->treasury_models_Invoice + + + invoice (products) + + + +treasury_models_RemittanceType + + +     +    RemittanceType     +     +id +     +     +AutoField +     +     +note +     +     +OneToOneField (note_ptr) +     + + + + +note_models_notes_NoteSpecial + + +   +NoteSpecial +   + + + +treasury_models_RemittanceType->note_models_notes_NoteSpecial + + note (remittancetype) + + + +treasury_models_Remittance + + +     +    Remittance     +     +id +     +     +AutoField +     +     +remittance_type +     +     +ForeignKey (id) +     +     +closed +     +     +BooleanField +     +     +comment +     +     +CharField +     +     +date +     +     +DateTimeField +     + + + + +treasury_models_Remittance->treasury_models_RemittanceType + + + remittance_type (remittance) + + + +treasury_models_SpecialTransactionProxy + + +     +    SpecialTransactionProxy     +     +id +     +     +AutoField +     +     +remittance +     +     +ForeignKey (id) +     +     +transaction +     +     +OneToOneField (transaction_ptr) +     + + + + +treasury_models_SpecialTransactionProxy->treasury_models_Remittance + + + remittance (specialtransactionproxy) + + + +note_models_transactions_SpecialTransaction + + +   +SpecialTransaction +   + + + +treasury_models_SpecialTransactionProxy->note_models_transactions_SpecialTransaction + + transaction (specialtransactionproxy) + + + +treasury_models_SogeCredit + + +     +    SogeCredit     +     +id +     +     +AutoField +     +     +credit_transaction +     +     +OneToOneField (transaction_ptr) +     +     +user +     +     +OneToOneField (id) +     + + + + +treasury_models_SogeCredit->note_models_transactions_SpecialTransaction + + credit_transaction (sogecredit) + + + +django_contrib_auth_models_User + + +   +User +   + + + +treasury_models_SogeCredit->django_contrib_auth_models_User + + user (sogecredit) + + + +note_models_transactions_MembershipTransaction + + +   +MembershipTransaction +   + + + +treasury_models_SogeCredit->note_models_transactions_MembershipTransaction + + + + transactions (_sogecredit_transactions_+) + + + diff --git a/docs/_static/img/graphs/wei.svg b/docs/_static/img/graphs/wei.svg new file mode 100644 index 00000000..8167b426 --- /dev/null +++ b/docs/_static/img/graphs/wei.svg @@ -0,0 +1,603 @@ + + + + + + +model_graph + + + +wei_models_WEIClub + + +     +    WEIClub     +     +club_ptr +     +     +OneToOneField (id) +     +     +date_end +     +     +DateField +     +     +date_start +     +     +DateField +     +     +year +     +     +PositiveIntegerField +     + + + + +member_models_Club + + +     +    Club     +     +id +     +     +AutoField +     +     +parent_club +     +     +ForeignKey (id) +     +     +email +     +     +EmailField +     +     +membership_duration +     +     +PositiveIntegerField +     +     +membership_end +     +     +DateField +     +     +membership_fee_paid +     +     +PositiveIntegerField +     +     +membership_fee_unpaid +     +     +PositiveIntegerField +     +     +membership_start +     +     +DateField +     +     +name +     +     +CharField +     +     +require_memberships +     +     +BooleanField +     + + + + +wei_models_WEIClub->member_models_Club + + + multi-table +inheritance + + + +wei_models_Bus + + +     +    Bus     +     +id +     +     +AutoField +     +     +wei +     +     +ForeignKey (club_ptr) +     +     +description +     +     +TextField +     +     +information_json +     +     +TextField +     +     +name +     +     +CharField +     + + + + +wei_models_Bus->wei_models_WEIClub + + + wei (buses) + + + +wei_models_BusTeam + + +     +    BusTeam     +     +id +     +     +AutoField +     +     +bus +     +     +ForeignKey (id) +     +     +color +     +     +PositiveIntegerField +     +     +description +     +     +TextField +     +     +name +     +     +CharField +     + + + + +wei_models_BusTeam->wei_models_Bus + + + bus (teams) + + + +wei_models_WEIRole + + +     +    WEIRole     +     +role_ptr +     +     +OneToOneField (id) +     + + + + +permission_models_Role + + +   +Role +   + + + +wei_models_WEIRole->permission_models_Role + + + multi-table +inheritance + + + +wei_models_WEIRegistration + + +     +    WEIRegistration     +     +id +     +     +AutoField +     +     +user +     +     +ForeignKey (id) +     +     +wei +     +     +ForeignKey (club_ptr) +     +     +birth_date +     +     +DateField +     +     +caution_check +     +     +BooleanField +     +     +clothing_cut +     +     +CharField +     +     +clothing_size +     +     +CharField +     +     +emergency_contact_name +     +     +CharField +     +     +emergency_contact_phone +     +     +PhoneNumberField +     +     +first_year +     +     +BooleanField +     +     +gender +     +     +CharField +     +     +health_issues +     +     +TextField +     +     +information_json +     +     +TextField +     +     +soge_credit +     +     +BooleanField +     + + + + +wei_models_WEIRegistration->wei_models_WEIClub + + + wei (users) + + + +django_contrib_auth_models_User + + +   +User +   + + + +wei_models_WEIRegistration->django_contrib_auth_models_User + + + user (wei) + + + +wei_models_WEIMembership + + +     +    WEIMembership     +     +membership_ptr +     +     +OneToOneField (id) +     +     +bus +     +     +ForeignKey (id) +     +     +registration +     +     +OneToOneField (id) +     +     +team +     +     +ForeignKey (id) +     + + + + +wei_models_WEIMembership->wei_models_Bus + + + bus (memberships) + + + +wei_models_WEIMembership->wei_models_BusTeam + + + team (memberships) + + + +wei_models_WEIMembership->wei_models_WEIRegistration + + registration (membership) + + + +member_models_Membership + + +     +    Membership     +     +id +     +     +AutoField +     +     +club +     +     +ForeignKey (id) +     +     +user +     +     +ForeignKey (id) +     +     +date_end +     +     +DateField +     +     +date_start +     +     +DateField +     +     +fee +     +     +PositiveIntegerField +     + + + + +wei_models_WEIMembership->member_models_Membership + + + multi-table +inheritance + + + +member_models_Profile + + +     +    Profile     +     +id +     +     +AutoField +     +     +user +     +     +OneToOneField (id) +     +     +address +     +     +CharField +     +     +department +     +     +CharField +     +     +email_confirmed +     +     +BooleanField +     +     +last_report +     +     +DateTimeField +     +     +ml_art_registration +     +     +BooleanField +     +     +ml_events_registration +     +     +CharField +     +     +ml_sport_registration +     +     +BooleanField +     +     +paid +     +     +BooleanField +     +     +phone_number +     +     +PhoneNumberField +     +     +promotion +     +     +PositiveSmallIntegerField +     +     +registration_valid +     +     +BooleanField +     +     +report_frequency +     +     +PositiveSmallIntegerField +     +     +section +     +     +CharField +     + + + + +member_models_Profile->django_contrib_auth_models_User + + user (profile) + + + +member_models_Club->member_models_Club + + + parent_club (club) + + + +member_models_Membership->member_models_Club + + + club (membership) + + + +member_models_Membership->permission_models_Role + + + + roles (membership) + + + +member_models_Membership->django_contrib_auth_models_User + + + user (memberships) + + + diff --git a/docs/_static/img/treasury_validate_sogecredit.png b/docs/_static/img/treasury_validate_sogecredit.png new file mode 100644 index 00000000..2902c870 Binary files /dev/null and b/docs/_static/img/treasury_validate_sogecredit.png differ diff --git a/docs/apps/activity.rst b/docs/apps/activity.rst new file mode 100644 index 00000000..52f51cbb --- /dev/null +++ b/docs/apps/activity.rst @@ -0,0 +1,110 @@ +Application Activités +===================== + +L'application activités gère les différentes activités liées au BDE. Elle permet entre autres de créer des activités qui +peuvent être diffusées via des calendriers ou la mailing list d'événements. Elle permet aussi de réguler l'accès aux +événements, en s'assurant que leur note est positive. Elle permet enfin de gérer les invités. + +Modèles +------- + +L'application comporte 5 modèles : activités, types d'activité, invités, entrées et transactions d'invitation. + +Types d'activité +~~~~~~~~~~~~~~~~ + +Les activités sont triées par type (pots, soirées de club, ...), et chaque type regroupe diverses informations : + +* Nom du type +* Possibilité d'inviter des non-adhérents (booléen) +* Prix d'invitation (entier, centimes à débiter sur la note de l'hôte) + +Activités +~~~~~~~~~ + +Le modèle d'activité regroupe les informations liées à l'activité même : + +* Nom de l'activité +* Description de l'activité +* Créateur, personne qui a proposé l'activité +* Club ayant organisé l'activité +* Note sur laquelle verser les crédits d'invitation (peut être nul si non concerné) +* Club invité (généralement le club Kfet) +* Date et heure de début +* Date et heure de fin +* Activité valide (booléen) +* Activité ouverte (booléen) + +Entrées +~~~~~~~ + +Une instance de ce modèle est créé dès que quelqu'un est inscrit à l'activité. Sont stockées les informations suivantes : + +* Activité concernée (clé étrangère) +* Heure d'entrée +* Note de la personne entrée, ou hôte s'il s'agit d'un invité (clé étrangère vers ``NoteUser``) +* Invité (``OneToOneField`` vers ``Guest``, ``None`` si c'est la personne elle-même qui rentre et non son invité) + +Il n'est pas possible de créer une entrée si la note est en négatif. + +Invités +~~~~~~~ + +Les adhérents ont la possibilité d'inviter des amis. Pour cela, les différentes informations sont enregistrées : + +* Activité concernée (clé étrangère) +* Nom de famille +* Prénom +* Note de la personne ayant invité + +Certaines contraintes s'appliquent : + +* Une personne ne peut pas être invitée plus de 5 fois par an (coupe nom/prénom) +* Un adhérent ne peut pas inviter plus de 3 personnes par activité. + +Transactions d'invitation +~~~~~~~~~~~~~~~~~~~~~~~~~ + +On étend le modèle ``Transaction`` de l'application note afin de supporter les transactions d'invitation. Elles ne +comportent qu'un champ supplémentaire, de type ``OneToOneField`` vers ``Guest``. + +Ce modèle aurait pu appartenir à l'application ``note``, mais afin de rester modulaire et que l'application ``note`` +ne dépende pas de cette application, on procède de cette manière. + +Graphe +~~~~~~ + +.. image:: /_static/img/graphs/activity.svg + :alt: Graphe de l'application activités + +UI +-- + +Création d'activités +~~~~~~~~~~~~~~~~~~~~ + +N'importe quel adhérent Kfet peut suggérer l'ajout d'une activité via un formulaire. + +Gestion des activités +~~~~~~~~~~~~~~~~~~~~~ + +Les ayant-droit (Res[pot] et respos infos) peuvent valider les activités proposées. Ils peuvent également la modifier +si besoin. Ils peuvent enfin la déclarer ouvertes pour lancer l'accès aux entrées. + +N'importe qui peut inviter des amis non adhérents, tant que les contraintes de nombre (un adhérent n'invite pas plus de +trois personnes par activité et une personne ne peut pas être invitée plus de 5 fois par an). L'invitation est +facturée à l'entrée. + +Entrées aux soirées +~~~~~~~~~~~~~~~~~~~ + +L'interface d'entrées est simple et ergonomique. Elle contient un champ de texte. À chaque fois que le champ est +modifié, un tableau est affiché comprenant la liste des invités et des adhérents dont le prénom, le nom ou un alias +de la note est acceptée par le texte entré. + +En cliquant sur la ligne de la personne qui souhaite rentrée, s'il s'agit d'un adhérent, alors la personne est comptée +comme entrée à l'activité, sous réserve que sa note soit positive. S'il s'agit d'un invité, alors 3 boutons +apparaîssent, afin de régler la taxe d'invitation : l'un prélève directement depuis la note de l'hôte, les deux autres +permettent un paiement par espèces ou par carte bancaire. En réalité, les deux derniers boutons enregistrent +automatiquement un crédit sur la note de l'hôte, puis une transaction (de type ``GuestTransaction``) est faite depuis +la note de l'hôte vers la note de l'organisateur de l'événement. diff --git a/docs/apps/api.rst b/docs/apps/api.rst new file mode 100644 index 00000000..56d6b5df --- /dev/null +++ b/docs/apps/api.rst @@ -0,0 +1,170 @@ +API +=== + +La NoteKfet2020 dispose d'une API REST. Elle est accessible sur `/api/ `_. +Elle supporte les requêtes GET, POST, HEAD, PUT, PATCH et DELETE (peut varier selon les pages). + +Pages de l'API +-------------- + +Il suffit d'ajouter le préfixe ``/api/`` pour arriver sur ces pages. + +* ``models`` (liste des différents modèles enregistrés en base de données) +* ``user`` (liste des différents utilisateurs enregistrés) +* ``members/profile`` (liste des différents profils associés à des utilisateurs) +* ``members/club`` (liste des différents clubs enregistrés) +* ``members/role`` (liste des différents rôles au sein des clubs existant) +* ``members/membership`` (liste des adhésions enregistrées) +* ``activity/activity`` (liste des activités recensées) +* ``activity/type`` (liste des différents types d'activités : pots, soirées de club, ...) +* ``activity/guest`` (liste des personnes invitées lors d'une activité) +* ``activity/entry`` (liste des entrées effectuées lors des activités) +* ``note/note`` (liste des notes enregistrées) +* ``note/alias`` (liste des alias enregistrés) +* ``note/transaction/category`` (liste des différentes catégories de boutons : soft, alcool, ...) +* ``note/transaction/transaction`` (liste des transactions effectuées) +* ``note/transaction/template`` (liste des boutons enregistrés) +* ``treasury/invoice`` (liste des factures générées) +* ``treasury/product`` (liste des produits associés à des factures) +* ``treasury/remittance_type`` (liste des types de remises supportés : chèque) +* ``treasury/remittance`` (liste des différentes remises enregistrées) +* ``permission/permission`` (liste de toutes les permissions enregistrées) +* ``permission/roles`` (liste des permissions octroyées pour chacun des rôles) +* ``logs`` (liste des modifications enregistrées en base de données) + +Utilisation de l'API +-------------------- + +La page ``/api//`` affiche la liste de tous les éléments enregistrés. La page ``/api///`` affiche +les attributs d'un objet uniquement. + +L'affichage des données peut se faire sous deux formes : via une interface HTML propre ou directement en affichant +le JSON brut. Le changement peut se faire en ajoutant en paramètre de l'URL ``format=json`` ou ``format=api`, ou bien +en plaçant en en-tête de la requête ``Accept: application/json`` ou ``text/html``. + +L'API Web propose des formulaires facilitant l'ajout et la modification d'éléments. + +GET +~~~ + +Une requête GET affiche un ou des éléments. Si on veut la liste de tous les éléments d'un modèle, la réponse +est de cette forme : + +.. code:: json + + { + "count": "", + "next": "/api//?page=", + "previous": "/api//?page=", + "results": [ ] + } + +Où ```` est le nombre d'éléments trouvés. La page n'affiche les informations que 20 par 20 pour ne pas +augmenter inutilement la taille de la réponse. Les champs ``next`` et ``previous`` contiennent les URL des pages +suivantes et précédentes (``null`` si première ou dernière page). Le champ ``results`` contient enfin l'ensemble des +objets trouvés, au format JSON. + +Certaines pages disposent de filtres, permettant de sélectionner les objets recherchés. Par exemple, il est possible +de chercher une note d'un certain type matchant avec un certain alias. + +Le résultat est déjà par défaut filtré : seuls les éléments que l'utilisateur à le droit de voir sont affichés. +Cela est possible grâce à la structure des permissions, générant justement des filtres de requêtes de base de données. + +Une requête à l'adresse ``/api//pk/`` affiche directement les informations du modèle demandé au format JSON. + +POST +~~~~ + +Une requête POST permet d'ajouter des éléments. Cette requête n'est possible que sur la page ``/api//``, +la requête POST n'est pas supportée sur les pages de détails (car cette requête permet ... l'ajout). + +Des exceptions sont faites sur certaines pages : les pages de logs et de contenttypes sont en lecture uniquement. + +Les formats supportés sont multiples : ``application/json``, ``application/x-www-url-encoded``, ``multipart/form-data``. +Cela facilite l'envoi de requêtes. Le module construit ensuite l'instance du modèle et le sauvegarde dans la base de +données. L'application ``permission`` s'assure que l'utilisateur à le droit de faire ce type de modification. La réponse +renvoyée est l'objet enregistré au format JSON si l'ajout s'est bien déroulé, sinon un message d'erreur au format JSON. + +PATCH +~~~~~ + +Une requête PATCH permet de modifier un élément. Ce type de requête n'est disponible que sur la page de détails d'un +élément : ``/api//pk/``. + +Comme pour la requête POST, les formats supportés sont multiples : ``application/json``, +``application/x-www-url-encoded``, ``multipart/form-data``. + +Il n'est pas utile d'indiquer tous les champs du modèle : seuls ceux qui sont à modifier suffisent. + +Attention : pour les modèles polymorphiques (``Note``, ``Transaction``), il faut toujours spécifier le type de modèle +pour que l'API arrive à s'y retrouver. Par exemple, si on veut rendre la transaction n°42 non valide, on effectue une +requête ``PATCH`` sur ``/api/note/transaction/transaction/42/`` avec les données suivantes : + +.. code:: json + + { + "valid": false, + "resourcetype": "RecurrentTransaction" + } + +PUT +~~~ + +Une requête PUT permet de remplacer un élément. Ce type de requête n'est disponible que sur la page de détails d'un +élément : ``/api//pk/``. + +Comme pour les requêtes POST ou PATCH, les formats supportés sont multiples : ``application/json``, +``application/x-www-url-encoded``, ``multipart/form-data``. + +Contrairement à la requête PATCH, l'intégralité du modèle est remplacé. L'ancien modèle est détruit, on en recrée un +nouveau avec la même clé primaire. Le fonctionnement est similaire à une requête POST. + +DELETE +~~~~~~ + +Une requête de type DELETE permet de supprimer un élément. Ce type de requête n'est disponible que sur la page de +détails d'un élément : ``/api//pk/``. + +Aucune donnée n'est nécessaire. Le module de permissions vérifiera que la suppression est possible. Une erreur +est sinon renvoyée. + +OPTIONS +~~~~~~~ + +Une reqête OPTIONS affiche l'ensemble des opérations possibles sur un modèle ou une instance. Prototype d'une réponse : + +.. code:: json + + { + "name": "", + "description": "", + "renders": [ + "application/json", + "text/html" + ], + "parses": [ + "application/json", + "application/x-www-form-urlencoded", + "multipart/form-data" + ], + "actions": { + "": { + "": { + "type": "", + "required": "", + "read_only": "", + "label": "