Exemple #1
0
    def post(self, residence, member_uid, mac):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        if member is None:
            raise Exception('membre inconnu')
        #end if

        machine = Machine.get_dhcp_by_mac(self.user, member.dn, mac)
        if machine is None:
            raise Exception('machine inconnue')
        #end if

        machine_membre_tag = "machine_membre"  # FIXME move to config
        machine_membre_disabled = machine_membre_tag + "_disabled"  # FIXME move to config

        if machine.uid.first() == machine_membre_disabled:
            machine.uid.replace(machine_membre_disabled, machine_membre_tag)
            self.user.ldap_bind.save(machine)
        #end if

        BrieLogging.get().info("enable member " + member_uid + " machine " +
                               mac + " by " + self.user.attrs.dn)

        # On redirige sur la page d'édition du membre
        redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #2
0
    def post(self, residence, member_uid):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        self.machine.delete.user = self.user
        self.room.move.user = self.user
        self.cotisation.delete.user = self.user

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        if member is None:
            raise Exception("membre inconnu")
        # end if

        # on vide la chambre du membre
        self.room.move.post(residence, member_uid, "", False, False)

        # on supprime les machines du membre
        for name, mac, dns, disable in Machine.get_machine_tuples_of_member(self.user, member.dn):
            self.machine.delete.post(residence, member_uid, name, False)
        # end if

        # on supprime sa cotisation histoire de laisser une trace dans les logs...
        year = CotisationComputes.current_year()
        cotisations = Cotisation.cotisations_of_member(self.user, member.dn, year)
        for cotisation in cotisations:
            self.cotisation.delete.post(residence, member_uid, cotisation.get("cn").first(), False)
        # end for

        # on supprime le membre
        self.user.ldap_bind.delete_entry_subtree(member.dn)

        BrieLogging.get().info("suppression du membre " + member_uid + " by " + self.user.attrs.dn)

        # On redirige sur la page de la residence
        redirect("/rooms/index/" + residence)
    def get_available_months(start, end, paid_months = []):
        next_months_available = []

        if start > 12 or end > 12:
            raise Exception("invalid start or end")

        if start > 8 and end > 8:
            next_months_available = range(start, end + 1)
        elif start <= 8 and end < 9:
            next_months_available = range(start, end + 1)
        elif start > 8:
            next_months_available =  range(start, 13) + range(1, end + 1 )
        else:
            raise Exception("invalid start and end")
        #end if

        if paid_months == []:
            return next_months_available

        BrieLogging.get().debug(next_months_available)
        available_months = [
            month
            for month in next_months_available
            if month not in paid_months
        ]

        return available_months
Exemple #4
0
    def post(self, residence, member_uid, cotisation_cn, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        if member is None:
            raise Exception("membre inconnu")
        # end if

        current_year = CotisationComputes.current_year()

        cotisation = Cotisation.get_payment_by_name(self.user, member.dn, cotisation_cn, current_year)

        if cotisation.has("x-paymentCashed") and cotisation.get("x-paymentCashed").first() == "TRUE":
            raise Exception("Impossible de supprimer une cotisation encaissée")
        # end if

        self.user.ldap_bind.delete_entry_subtree(cotisation.dn)

        BrieLogging.get().info(
            "suppression cotisation ("
            + cotisation.get("x-amountPaid").first()
            + "EUR) pour l'utilisateur "
            + member.dn
            + " par l'admin "
            + self.user.attrs.dn
        )

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #5
0
    def post(self, residence, member_uid, mac):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        if member is None:
            raise Exception("membre inconnu")
        # end if

        machine = Machine.get_dhcp_by_mac(self.user, member.dn, mac)
        if machine is None:
            raise Exception("machine inconnue")
        # end if

        machine_membre_tag = "machine_membre"  # FIXME move to config
        machine_membre_disabled = machine_membre_tag + "_disabled"  # FIXME move to config

        if machine.uid.first() == machine_membre_disabled:
            machine.uid.replace(machine_membre_disabled, machine_membre_tag)
            self.user.ldap_bind.save(machine)
        # end if

        BrieLogging.get().info("enable member " + member_uid + " machine " + mac + " by " + self.user.attrs.dn)

        # On redirige sur la page d'édition du membre
        redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #6
0
 def year_directory_exists(year):
     search = self.user.ldap_bind.search(ldap_config.username_base_dn + residence_dn, "(ou=" + str(year) + ")")
     if len(search) == 0:
         BrieLogging.get().info("Year " + str(year) + " directory does not exist. Creating.")
         directory_attrs = {"objectClass": ["top", "organizationalUnit"], "ou": str(year).encode("utf-8")}
         directory_dn = "ou=" + str(year) + "," + ldap_config.username_base_dn + residence_dn
         self.user.ldap_bind.add_entry(directory_dn, directory_attrs)
Exemple #7
0
    def post(self, residence, member_uid, cotisation_cn):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        if member is None:
            raise Exception('membre inconnu')
        #end if

        current_year = CotisationComputes.current_year()

        cotisation = Cotisation.get_payment_by_name(self.user, member.dn,
                                                    cotisation_cn,
                                                    current_year)

        if cotisation.has('x-paymentCashed') and cotisation.get(
                'x-paymentCashed').first() == 'TRUE':
            raise Exception('Impossible de gracier une cotisation encaissée')
        #end if

        old_montant = cotisation.get("x-amountPaid").first()
        cotisation.get("x-amountPaid").replace(
            cotisation.get("x-amountPaid").first(), 0)
        self.user.ldap_bind.save(cotisation)

        BrieLogging.get().info("cotisation graciee (" + old_montant +
                               "EUR) pour l'utilisateur " + member.dn +
                               " par l'admin " + self.user.attrs.dn)

        redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #8
0
    def post(self, residence, member_uid, cotisation_cn, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        if member is None:
            raise Exception('membre inconnu')
        #end if

        current_year = CotisationComputes.current_year()

        cotisation = Cotisation.get_payment_by_name(self.user, member.dn,
                                                    cotisation_cn,
                                                    current_year)

        if cotisation.has('x-paymentCashed') and cotisation.get(
                'x-paymentCashed').first() == 'TRUE':
            raise Exception('Impossible de supprimer une cotisation encaissée')
        #end if

        self.user.ldap_bind.delete_entry_subtree(cotisation.dn)

        BrieLogging.get().info("suppression cotisation (" +
                               cotisation.get('x-amountPaid').first() +
                               "EUR) pour l'utilisateur " + member.dn +
                               " par l'admin " + self.user.attrs.dn)

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #9
0
    def post(self, residence, member_uid, cotisation_cn):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        if member is None:
            raise Exception("membre inconnu")
        # end if

        current_year = CotisationComputes.current_year()

        cotisation = Cotisation.get_payment_by_name(self.user, member.dn, cotisation_cn, current_year)

        if cotisation.has("x-paymentCashed") and cotisation.get("x-paymentCashed").first() == "TRUE":
            raise Exception("Impossible de gracier une cotisation encaissée")
        # end if

        old_montant = cotisation.get("x-amountPaid").first()
        cotisation.get("x-amountPaid").replace(cotisation.get("x-amountPaid").first(), 0)
        self.user.ldap_bind.save(cotisation)

        BrieLogging.get().info(
            "cotisation graciee ("
            + old_montant
            + "EUR) pour l'utilisateur "
            + member.dn
            + " par l'admin "
            + self.user.attrs.dn
        )

        redirect("/edit/member/" + residence + "/" + member_uid)
    def members_status_from_residence(user_session, residence_dn):
        members =  Member.get_all(user_session, residence_dn)

        old_members = []
        cotisation_paid_members = []
        cotisation_late_members = []
        no_cotisation_members = []
        for member in members:
            current_year = CotisationComputes.current_year()
            cotisations = Cotisation.cotisations_of_member(user_session, member.dn, current_year)
            if CotisationComputes.is_old_member(member.dn, user_session, residence_dn, cotisations):
                old_members.append(member)
            elif CotisationComputes.is_cotisation_paid(member.dn, user_session, residence_dn, cotisations):
                cotisation_paid_members.append(member)
            elif CotisationComputes.is_cotisation_late(member.dn, user_session, residence_dn, cotisations):
                cotisation_late_members.append(member)
                #print("[DEBUG] cotisation en retard pour l'utilisateur "+ member.dn)
            elif CotisationComputes.is_no_cotisation(member.dn, user_session, residence_dn, cotisations):
                no_cotisation_members.append(member)
            else:
                BrieLogging.get().warn("aurore_helper:336 member with weird status !")
            #end if

        #end for
        return dict(old_members=old_members, cotisation_paid_members=cotisation_paid_members, cotisation_late_members=cotisation_late_members, no_cotisation_members=no_cotisation_members)
    def price_to_pay(year_price, month_price, already_paid, number_months_to_pay):
        
        months_price = number_months_to_pay * month_price
        BrieLogging.get().debug("already paid : " + str(already_paid))
        BrieLogging.get().debug("months price : " + str(months_price))
        if already_paid + months_price > year_price:
            months_price = max(0, year_price - already_paid)

        return months_price
    def members_status_from_list_cotisations(user_session, residence_dn, cotisations):
        members_dict = dict()
        for cotisation in cotisations:
            cotisation_dn = cotisation.dn.split(",")
            member_dn = ""
            for i in range(3, len(cotisation_dn)):
                if i != 3:
                    member_dn += ","
                #end if
                member_dn += cotisation_dn[i]
            #end for
            if not member_dn in members_dict:
                members_dict[member_dn] = [cotisation]
            else:
                members_dict[member_dn].append(cotisation)
            #end if
        #end for

        BrieLogging.get().debug(str(datetime.datetime.now()) + "members_status_from_list_cotisations:" + str(len(members_dict)))

        old_members = []
        cotisation_paid_members = []
        cotisation_late_members = []
        no_cotisation_members = []

        #on va verifier en un block quels sont les old_members
        for member_dn, cotisations in members_dict.iteritems():
            old_members.append(member_dn)
        #end for
        rooms = Room.get_rooms(user_session, residence_dn)
        for room in rooms:
            #pour chaque chambre, on check si il a un proprietaire, et si ce dernier a des cotisations
            if room.has("x-memberIn") and room.get("x-memberIn").first() in members_dict and room.get("x-memberIn").first() in old_members:
                #si oui, bah on le retire des old_members
                old_members.remove(room.get("x-memberIn").first())
            #endif
        #endfor


        for member_dn, cotisations in members_dict.iteritems():
            anniversary = CotisationComputes.anniversary_from_ldap_items(cotisations)
            if CotisationComputes.is_cotisation_paid(member_dn, user_session, residence_dn, cotisations, anniversary, False):
                cotisation_paid_members.append(member_dn)
            elif CotisationComputes.is_cotisation_late(member_dn, user_session, residence_dn, cotisations, anniversary, False):
                cotisation_late_members.append(member_dn)
                #print("[DEBUG] cotisation en retard pour l'utilisateur "+ member.dn)
            elif CotisationComputes.is_no_cotisation(member_dn, user_session, residence_dn, cotisations, anniversary, False):
                no_cotisation_members.append(member_dn)
            else:
                BrieLogging.get().debug("aurore_helper:393 : member with weird status !")
            #end if

        #end for
        return dict(old_members=old_members, cotisation_paid_members=cotisation_paid_members, cotisation_late_members=cotisation_late_members, no_cotisation_members=no_cotisation_members)
Exemple #13
0
 def year_directory_exists(year):
     search = self.user.ldap_bind.search(
         ldap_config.username_base_dn + residence_dn,
         "(ou=" + str(year) + ")")
     if len(search) == 0:
         BrieLogging.get().info("Year " + str(year) +
                                " directory does not exist. Creating.")
         directory_attrs = {
             "objectClass": ["top", "organizationalUnit"],
             "ou": str(year).encode("utf-8")
         }
         directory_dn = "ou=" + str(
             year) + "," + ldap_config.username_base_dn + residence_dn
         self.user.ldap_bind.add_entry(directory_dn, directory_attrs)
Exemple #14
0
    def grace_cotisation(self, group_cn):
        group = Groupes.get_by_cn(self.user, self.user.residence_dn, group_cn)

        BrieLogging.get().info("start grace du groupe " + group.dn +
                               " par l'admin " + self.user.attrs.dn)

        for user_dn in group.get('uniqueMember').all():
            current_year = CotisationComputes.current_year()
            cotisations = Cotisation.cotisations_of_member(
                self.user, user_dn, current_year)
            for cotisation in cotisations:
                if cotisation.has('x-paymentCashed') and cotisation.get(
                        'x-paymentCashed').first() == 'TRUE':
                    BrieLogging.get().warn(
                        "impossible de gracier une cotisation encaissee pour l'utilisateur "
                        + user_dn + " par l'admin " + self.user.attrs.dn)
                else:
                    old_montant = cotisation.get("x-amountPaid").first()
                    cotisation.get("x-amountPaid").replace(
                        cotisation.get("x-amountPaid").first(), 0)
                    self.user.ldap_bind.save(cotisation)
                    BrieLogging.get().info("cotisation graciee (" +
                                           old_montant +
                                           "EUR) pour l'utilisateur " +
                                           user_dn + " par l'admin " +
                                           self.user.attrs.dn)
                #end if
            #end for(cotisation)
        #end for(users)

        BrieLogging.get().info("fin du grace_bulk_action du groupe " +
                               group.dn + " par l'admin " + self.user.attrs.dn)

        redirect("/administration/")
Exemple #15
0
def disconnect_members_from_residence(admin_user, residence_dn):
    members =  Member.get_all_non_admin(admin_user, residence_dn)
    BrieLogging.get().debug(CotisationComputes.current_year())
    date_actuelle = datetime.datetime.now()

    for member in members:
        
        machines_tuples = Machine.get_machine_tuples_of_member(admin_user, member.dn)
        if machines_tuples != []:
            
            if not CotisationComputes.is_cotisation_paid(member.dn, admin_user, residence_dn):
                dhcps = Machine.get_dhcps(admin_user, member.dn)
                machine_membre_tag = "machine_membre" # FIXME move to config

                for dhcp_item in dhcps:
                    if dhcp_item.uid.first() == machine_membre_tag:
                        BrieLogging.get().info("scheduler disable machine " + dhcp_item.get("dhcpHWAddress").values[0] + " pour l'utilisateur "+ member.dn + " -- "+ dhcp_item.dn)
                        dhcp_item.uid.replace(machine_membre_tag, machine_membre_tag + "_disabled")
                        admin_user.ldap_bind.save(dhcp_item)
                    #end if
                #end for
            #end if
            
        #end if

        # FIXME on retire la suppression pendant quelques jours le temps que les anciens mauvais payeurs soient pas supprimes
        if False and CotisationComputes.is_member_to_delete(member, admin_user, residence_dn):
            # supprime les machines mais pas le membre (il pourrait avoir besoin du compte ex : Yohan, le LDAP d'Aurores, etc)
            # alors test a ajouter pour ne supprimer que si membre d'aucun groupe
            # duplication de code avec class MachineDeleteController
            machine_dn = ldap_config.machine_base_dn + member.dn
            machines = admin_user.ldap_bind.search(machine_dn, "(objectClass=organizationalRole)", scope = ldap.SCOPE_ONELEVEL)
            for machine in machines:
                    dns = Machine.get_dns_by_id(admin_user, machine.dn)
                    if dns is None:
                        BrieLogging.get().info("Suppression machine erreur (dns is None): " + machine.dn)
                        continue
                    #end if
                    ip = IpReservation.get_ip(admin_user, residence_dn, dns.dlzData.first())
                    BrieLogging.get().info("suppression machine " + Machine.get_dhcps(admin_user, machine.dn)[0].get("dhcpHWAddress").values[0] + " pour l'utilisateur "+ member.dn + " par le scheduler")
                    #sys.stdout.flush()
                    admin_user.ldap_bind.delete_entry_subtree(machine.dn)
                    if ip is not None:
                        taken_attribute = ip.get("x-taken").first()
                        if taken_attribute is not None:
                            BrieLogging.get().debug("deleting taken_attribute for this IP address")
                            admin_user.ldap_bind.delete_attr(ip.dn, IpReservation.taken_attr(taken_attribute))
Exemple #16
0
    def post(self, residence, member_uid, room_uid):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        room = Room.get_by_uid(self.user, residence_dn, room_uid)

        if member is None and member_uid != "":
            raise Exception("member not found")
        # end if

        if member is not None:
            old_room_member = Room.get_by_member_dn(self.user, residence_dn, member.dn)

            # Si la machine existe effectivement, on la supprime
            if old_room_member is not None:
                raise Exception("le nouveau membre possèdait déjà une chambre. conflit")
            # end if
        # end if

        if room is None:
            raise Exception("room inconnue")

        if room.get("x-memberIn") is not None and room.get("x-memberIn").first() is not None:
            memberIn_attribute = Room.memberIn_attr(str(room.get("x-memberIn").first()))
            self.user.ldap_bind.delete_attr(room.dn, memberIn_attribute)
            BrieLogging.get().info(
                "retrait de chambre pour le member "
                + room.get("x-memberIn").first()
                + " from "
                + room_uid
                + " by "
                + self.user.attrs.dn
            )
        # end if

        if member is not None:
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            self.user.ldap_bind.add_attr(room.dn, memberIn_attribute)
            BrieLogging.get().info(
                "ajout de chambre pour le member " + member_uid + " to " + room_uid + " by " + self.user.attrs.dn
            )
        # end if

        # On redirige sur la page d'édition du membre
        redirect("/edit/room/index/" + residence + "/" + room_uid)
Exemple #17
0
    def post(self, residence, member_uid, room_uid):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        room = Room.get_by_uid(self.user, residence_dn, room_uid)

        if member is None and member_uid != "":
            raise Exception("member not found")
        #end if

        if member is not None:
            old_room_member = Room.get_by_member_dn(self.user, residence_dn,
                                                    member.dn)

            # Si la machine existe effectivement, on la supprime
            if old_room_member is not None:
                raise Exception(
                    "le nouveau membre possèdait déjà une chambre. conflit")
            #end if
        #end if

        if room is None:
            raise Exception("room inconnue")

        if room.get("x-memberIn") is not None and room.get(
                "x-memberIn").first() is not None:
            memberIn_attribute = Room.memberIn_attr(
                str(room.get("x-memberIn").first()))
            self.user.ldap_bind.delete_attr(room.dn, memberIn_attribute)
            BrieLogging.get().info("retrait de chambre pour le member " +
                                   room.get("x-memberIn").first() + " from " +
                                   room_uid + " by " + self.user.attrs.dn)
        #end if

        if member is not None:
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            self.user.ldap_bind.add_attr(room.dn, memberIn_attribute)
            BrieLogging.get().info("ajout de chambre pour le member " +
                                   member_uid + " to " + room_uid + " by " +
                                   self.user.attrs.dn)
        #end if

        # On redirige sur la page d'édition du membre
        redirect("/edit/room/index/" + residence + "/" + room_uid)
Exemple #18
0
    def post(self, residence, member_uid, machine_id, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        machine = Machine.get_machine_by_id(self.user, member.dn, machine_id)
        dns = Machine.get_dns_by_id(self.user, machine.dn)
        ip = IpReservation.get_ip(self.user, residence_dn, dns.dlzData.first())
        ip_machines = []
        # on vérifie si l'IP est bien dans le pool, et qu'elle n'est pas utilisée par plusieurs machines
        if ip is not None:
            ip_machines = Machine.get_dns_by_ip(self.user, residence_dn, ip.cn.first())
        # end if

        # Si la machine existe effectivement, on la supprime
        if machine is not None:
            # Ajout de l'entrée dans les logs
            BrieLogging.get().info(
                "suppression machine "
                + Machine.get_dhcps(self.user, machine.dn)[0].get("dhcpHWAddress").values[0]
                + " ("
                + dns.dlzData.first()
                + ") pour l'utilisateur "
                + member.dn
                + " par l'admin "
                + self.user.attrs.dn
            )

            self.user.ldap_bind.delete_entry_subtree(machine.dn)

            # si l'IP n'est pas null et qu'on a qu'une seule machine sur cette IP (la notre), alors on delete dans le pool
            if ip is not None and len(ip_machines) == 1:
                taken_attribute = IpReservation.taken_attr(ip.get("x-taken").first())
                self.user.ldap_bind.delete_attr(ip.dn, taken_attribute)
            # end if
        # end if

        # On redirige sur la page d'édition du membre
        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #19
0
    def post(self, residence, member_uid):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        self.machine.delete.user = self.user
        self.room.move.user = self.user
        self.cotisation.delete.user = self.user

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        if member is None:
            raise Exception('membre inconnu')
        #end if

        #on vide la chambre du membre
        self.room.move.post(residence, member_uid, "", False, False)

        #on supprime les machines du membre
        for name, mac, dns, disable in Machine.get_machine_tuples_of_member(
                self.user, member.dn):
            self.machine.delete.post(residence, member_uid, name, False)
        #end if

        #on supprime sa cotisation histoire de laisser une trace dans les logs...
        year = CotisationComputes.current_year()
        cotisations = Cotisation.cotisations_of_member(self.user, member.dn,
                                                       year)
        for cotisation in cotisations:
            self.cotisation.delete.post(residence, member_uid,
                                        cotisation.get('cn').first(), False)
        #end for

        #on supprime le membre
        self.user.ldap_bind.delete_entry_subtree(member.dn)

        BrieLogging.get().info("suppression du membre " + member_uid + " by " +
                               self.user.attrs.dn)

        # On redirige sur la page de la residence
        redirect("/rooms/index/" + residence)
Exemple #20
0
    def post(self, residence, member_uid, machine_id, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        machine = Machine.get_machine_by_id(self.user, member.dn, machine_id)
        dns = Machine.get_dns_by_id(self.user, machine.dn)
        ip = IpReservation.get_ip(self.user, residence_dn, dns.dlzData.first())
        ip_machines = []
        #on vérifie si l'IP est bien dans le pool, et qu'elle n'est pas utilisée par plusieurs machines
        if ip is not None:
            ip_machines = Machine.get_dns_by_ip(self.user, residence_dn,
                                                ip.cn.first())
        #end if

        # Si la machine existe effectivement, on la supprime
        if machine is not None:
            # Ajout de l'entrée dans les logs
            BrieLogging.get().info("suppression machine " + Machine.get_dhcps(
                self.user, machine.dn)[0].get("dhcpHWAddress").values[0] +
                                   " (" + dns.dlzData.first() +
                                   ") pour l'utilisateur " + member.dn +
                                   " par l'admin " + self.user.attrs.dn)

            self.user.ldap_bind.delete_entry_subtree(machine.dn)

            #si l'IP n'est pas null et qu'on a qu'une seule machine sur cette IP (la notre), alors on delete dans le pool
            if ip is not None and len(ip_machines) == 1:
                taken_attribute = IpReservation.taken_attr(
                    ip.get("x-taken").first())
                self.user.ldap_bind.delete_attr(ip.dn, taken_attribute)
            #end if
        #end if

        # On redirige sur la page d'édition du membre
        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #21
0
def disconnect_members_job():
    user = admin_user()
     
    residences = Residences.get_residences(user)

    for residence in residences:
        BrieLogging.get().info("Disconnect job on : " + residence.uniqueMember.first())
        try:
            disconnect_members_from_residence(user, residence.uniqueMember.first())
        except Exception as inst:
            BrieLogging.get().info("Exception sur le scheduler ("+ residence.uniqueMember.first() +")")
            BrieLogging.get().debug(type(inst))
    def grace_cotisation(self, group_cn):
        group = Groupes.get_by_cn(self.user, self.user.residence_dn, group_cn)

        BrieLogging.get().info("start grace du groupe "+ group.dn + " par l'admin "+ self.user.attrs.dn)

        for user_dn in group.get('uniqueMember').all():
            current_year = CotisationComputes.current_year()
            cotisations = Cotisation.cotisations_of_member(self.user, user_dn, current_year)
            for cotisation in cotisations:
                if cotisation.has('x-paymentCashed') and cotisation.get('x-paymentCashed').first() == 'TRUE':
                    BrieLogging.get().warn("impossible de gracier une cotisation encaissee pour l'utilisateur "+ user_dn + " par l'admin "+ self.user.attrs.dn)
                else:
                    old_montant = cotisation.get("x-amountPaid").first()
                    cotisation.get("x-amountPaid").replace(cotisation.get("x-amountPaid").first(), 0)
                    self.user.ldap_bind.save(cotisation)
                    BrieLogging.get().info("cotisation graciee (" + old_montant + "EUR) pour l'utilisateur "+ user_dn + " par l'admin "+ self.user.attrs.dn)
                #end if
            #end for(cotisation)
        #end for(users)

        BrieLogging.get().info("fin du grace_bulk_action du groupe "+ group.dn + " par l'admin "+ self.user.attrs.dn)

        redirect("/administration/")
Exemple #23
0
    def index(self, year=None):
        residence_dn = self.user.residence_dn
        residence = Residences.get_name_by_dn(self.user,
                                              self.user.residence_dn)

        if year is None:
            year = CotisationComputes.current_year()
        #end if
        all_payments = Cotisation.get_all_payment_by_year(
            self.user, residence_dn, year)
        all_payments_cashed = Cotisation.get_all_cashed_payments_by_year(
            self.user, residence_dn, year)
        total_earned = 0
        total_earned_cashed = 0
        for onepayment in all_payments:
            total_earned += float(onepayment.get('x-amountPaid').first())
        #end for
        for onepayment in all_payments_cashed:
            total_earned_cashed += float(
                onepayment.get('x-amountPaid').first())
        #end for

        pending_payments = Cotisation.get_all_pending_payments(
            self.user, residence_dn, year)

        admin_totals = dict()
        admin_payments_received = dict()
        for pending_payment in pending_payments:
            admin_member = Member.get_by_dn(
                self.user,
                pending_payment.get("x-action-user").first())
            admin_name = pending_payment.get("x-action-user-info").first()
            if admin_member is not None:
                admin_name = admin_member.cn.first()

            dn_prefix = "cn=" + pending_payment.cn.first() + ",cn=" + str(
                year) + ",cn=cotisations,"

            BrieLogging.get().debug(dn_prefix)
            member_dn = pending_payment.dn[len(dn_prefix):]
            BrieLogging.get().debug(member_dn)
            member = Member.get_by_dn(self.user, member_dn)

            amount_paid = int(pending_payment.get("x-amountPaid").first())

            if admin_name in admin_totals:
                admin_totals[admin_name] += amount_paid
            else:
                admin_totals[admin_name] = amount_paid
            #end if

            if admin_name in admin_payments_received:
                admin_payments_received[admin_name].append(
                    (member, pending_payment))
            else:
                admin_payments_received[admin_name] = [(member,
                                                        pending_payment)]
            #end if
        #end for

        admin_payments_received_ordered = sorted(
            admin_payments_received.iteritems(), key=lambda t: t[0])

        return {
            "residence": residence,
            "user": self.user,
            "admin_totals": admin_totals,
            "admin_payments_received": admin_payments_received_ordered,
            "total_earned": total_earned,
            "total_earned_cashed": total_earned_cashed,
            "year": int(year)
        }
Exemple #24
0
    def index(self, year = None):
        residence_dn = self.user.residence_dn
        residence = Residences.get_name_by_dn(self.user, self.user.residence_dn)

        if year is None:
            year = CotisationComputes.current_year()
        #end if
        all_payments = Cotisation.get_all_payment_by_year(self.user, residence_dn, year)
        all_payments_cashed = Cotisation.get_all_cashed_payments_by_year(self.user, residence_dn, year)
        total_earned = 0
        total_earned_cashed = 0
        for onepayment in all_payments:
            total_earned += float(onepayment.get('x-amountPaid').first())
        #end for
        for onepayment in all_payments_cashed:
            total_earned_cashed += float(onepayment.get('x-amountPaid').first())
        #end for

        pending_payments = Cotisation.get_all_pending_payments(self.user, residence_dn, year)

        admin_totals = dict()
        admin_payments_received = dict()
        for pending_payment in pending_payments:
            admin_member = Member.get_by_dn(self.user, pending_payment.get("x-action-user").first())
            admin_name = pending_payment.get("x-action-user-info").first()
            if admin_member is not None:
                admin_name = admin_member.cn.first()
                        

            dn_prefix = "cn=" + pending_payment.cn.first() + ",cn=" + str(year) + ",cn=cotisations,"

            BrieLogging.get().debug(dn_prefix)
            member_dn = pending_payment.dn[len(dn_prefix):]
            BrieLogging.get().debug(member_dn)
            member = Member.get_by_dn(self.user, member_dn)
    
            amount_paid = int(pending_payment.get("x-amountPaid").first())

            if admin_name in admin_totals:
                admin_totals[admin_name] += amount_paid
            else:
                admin_totals[admin_name] = amount_paid
            #end if

            if admin_name in admin_payments_received:
                admin_payments_received[admin_name].append((member, pending_payment))
            else:
                admin_payments_received[admin_name] = [(member, pending_payment)]
            #end if            
        #end for

        admin_payments_received_ordered = sorted(admin_payments_received.iteritems(), key=lambda t:t[0])

        return { 
            "residence" : residence, 
            "user" : self.user,  
            "admin_totals" : admin_totals,
            "admin_payments_received" : admin_payments_received_ordered,
            "total_earned" : total_earned,
            "total_earned_cashed" : total_earned_cashed,
            "year" : int(year)
        }
Exemple #25
0
    def post(self,
             residence,
             member_uid,
             name,
             mac,
             go_redirect=True,
             plugin_action=None):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member_base_dn = ldap_config.username_base_dn + residence_dn
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        mac = mac.strip()
        name = name.strip().replace(" ", "-").replace("_", "-")
        name = Translations.formatName(name)
        #name = Translations.strip_accents(name)

        #Vérification que l'adresse mac soit correcte
        mac_match = re.match('^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$', mac)
        if mac_match is None:
            #TODO : changer l'exception en une page d'erreur
            raise Exception("mac non valide")
        #endif

        #Remplacement de l'adresse mac non séparée
        mac_match = re.match(
            '^([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$',
            mac)
        if mac_match is not None:
            mac = mac_match.group(1) + ":" + mac_match.group(
                2) + ":" + mac_match.group(3) + ":" + mac_match.group(
                    4) + ":" + mac_match.group(5) + ":" + mac_match.group(6)
        #endif

        #Remplacement de l'adresse mac séparée par des tirets
        mac_match = re.match(
            '^([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})$',
            mac)
        if mac_match is not None:
            mac = mac_match.group(1) + ":" + mac_match.group(
                2) + ":" + mac_match.group(3) + ":" + mac_match.group(
                    4) + ":" + mac_match.group(5) + ":" + mac_match.group(6)
        #endif

        #Passage au format lowercase
        mac = mac.lower()

        # Vérification que le membre existe
        if member is None:
            #TODO : membre inexistant
            pass
        #endif

        # Vérification que l'adresse mac de la machine n'existe pas déjà
        # Note : on cherche sur toute la résidence (residence_dn)
        machine = Machine.get_dhcp_by_mac(self.user, member_base_dn, mac)
        if machine is not None:
            #TODO : gérer l'exception
            raise Exception("mac address already exist")
        #endif

        # Nettoyage des erreurs communes

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + "-" + str(number)
            #end if

            machine = Machine.get_dns_by_name(self.user, member_base_dn,
                                              actual_name)
            if machine is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            #end if

        #endif

        #On retire les underscore interdits
        name = re.sub('_', '-', name)

        name = try_name(name, 0)

        # Génération de l'id de la machine et recherche d'une ip libre
        ip = IpReservation.get_first_free(self.user, residence_dn)

        if ip is None:
            raise Exception(
                "le pool d'adresse IP est vide. aucune adresse IP disponible pour ajouter une machine"
            )
        #end if

        # Indique que l'ip est prise
        taken_attribute = IpReservation.taken_attr(str(datetime.today()))
        self.user.ldap_bind.add_attr(ip.dn, taken_attribute)

        machine_folder = Machine.folder_attr()
        machine_folder_dn = ldap_config.machine_base_dn + member.dn
        try:
            self.user.ldap_bind.add_entry(machine_folder_dn, machine_folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        #end try

        # Attributs ldap de l'objet machine (regroupant dns et dhcp)
        machine_top = Machine.entry_attr(name)

        # Attributs ldap des objets dhcp et dns, fils de l'objet machine
        machine_dhcp = Machine.dhcp_attr(name, mac)
        machine_dns = Machine.dns_attr(name, ip.cn.first())

        # Construction du dn et ajout de l'objet machine
        # en fils du membre (membre.dn)
        machine_dn = "cn=" + name + "," + ldap_config.machine_base_dn + member.dn
        self.user.ldap_bind.add_entry(machine_dn, machine_top)

        # Construction du dn et ajout de l'objet dhcp
        # en fils de la machine (machine_dn)
        dhcp_dn = "cn=dhcp," + machine_dn
        self.user.ldap_bind.add_entry(dhcp_dn, machine_dhcp)

        # Construction du dn et ajout de l'objet dns
        dns_dn = "cn=dns," + machine_dn
        self.user.ldap_bind.add_entry(dns_dn, machine_dns)

        # Ajout de l'entrée dans les logs
        BrieLogging.get().info("ajout machine " + mac +
                               " pour l'utilisateur " + member.dn +
                               " par l'admin " + self.user.attrs.dn)

        plugin_vars = {
            "machine_dn": machine_dn,
            "name": name,
            "ip": ip,
            "mac": mac
        }

        plugin_action(self.user, residence, plugin_vars)

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #26
0
    def index(self, residence_name):
        status = dict()
        areas = dict()
        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex0")
        residence_dn = Residences.get_dn_by_name(self.user, residence_name)
        if residence_dn is None:
            raise Exception("unknown residence")
        #end if

        current_year = CotisationComputes.current_year()
        cotisations_year = Cotisation.get_all_cotisation_by_year(
            self.user, residence_dn, current_year)
        BrieLogging.get().debug(
            str(datetime.datetime.now()) + "RoomsIndex1 - cotis")
        stats = CotisationComputes.members_status_from_list_cotisations(
            self.user, residence_dn, cotisations_year)
        BrieLogging.get().debug(
            str(datetime.datetime.now()) + "RoomsIndex2 - cotisComput")
        members = dict()
        members_entries = Member.get_all(self.user, residence_dn)
        BrieLogging.get().debug(
            str(datetime.datetime.now()) + "RoomsIndex3 - members")
        members_entries_dict = dict()
        for member in members_entries:
            members_entries_dict[member.dn] = member
        #end for
        for label in stats:
            liste = []
            for member_dn in stats[label]:
                members[member_dn] = label
                liste.append(member_dn)
            #end for member
            for item in liste:
                stats[label].remove(item)
                stats[label].append(members_entries_dict[item])
            #end for item liste
        #end for stats

        stats['number_of_rooms'] = Room.get_number_of_rooms(
            self.user, residence_dn)
        stats['empty_rooms'] = []

        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex4")

        myResidence = self.user.ldap_bind.get_childs(ldap_config.room_base_dn +
                                                     residence_dn)
        for batKey, bat in myResidence.childs.iteritems():
            if 'pacateriearea' in bat.objectClass.all(
            ) or 'pacaterieArea' in bat.objectClass.all():
                areas[bat.value] = dict()

                for floorKey, floor in bat.childs.iteritems():
                    if 'pacateriefloor' in floor.objectClass.all(
                    ) or 'pacaterieFloor' in floor.objectClass.all():
                        areas[bat.value][floor.value] = list()

                        for roomKey, room in floor.childs.iteritems():
                            if 'pacaterieroom' in room.objectClass.all(
                            ) or 'pacaterieRoom' in room.objectClass.all():
                                if not room.has("x-memberIn"):
                                    stats['empty_rooms'].append(room)
                                    room.add('status', "empty_room")
                                elif room.get("x-memberIn").first() in members:
                                    room.add(
                                        'status', members[room.get(
                                            "x-memberIn").first()])
                                #endif

                                areas[bat.value][floor.value].append(room)

                                color = self.color_picker("foobar")
                                if color in status:
                                    status[color] = status[color] + 1
                                else:
                                    status[color] = 0
                                #end if
                            #end if room
                        #end for room
                    #end if floor
                #end for floor
            #end if area
        #end for area

        return {
            "user": self.user,
            "areas": areas,
            "color_picker": self.color_picker,
            "reverse_sorted_name": self.reverse_sort_name,
            "sorted_name": self.sort_name,
            "stats": stats,
            "status": status,
            "residence": residence_name
        }
Exemple #27
0
    def post(self,
             residence,
             member_uid,
             next_end,
             extra_name,
             go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        time = str(datetime.now())
        current_year = CotisationComputes.current_year()
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        cotisation = None
        extra = None

        if next_end != "":
            cotisation = self.create_cotisation(member, time, current_year,
                                                residence, residence_dn,
                                                member_uid, next_end)

        if extra_name != "":
            extra = self.create_extra(time, current_year, residence,
                                      residence_dn, member_uid, extra_name)
        #end if

        if cotisation is None and extra is None:
            if go_redirect:
                redirect("/edit/member/" + residence + "/" + member_uid)
            else:
                return
            #end if
        #end if

        folder_dn = ldap_config.cotisation_member_base_dn + member.dn
        year_dn = "cn=" + str(current_year) + "," + folder_dn

        try:
            folder = Cotisation.folder_attr()
            self.user.ldap_bind.add_entry(folder_dn, folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        #end try

        try:
            year = Cotisation.year_attr(current_year)
            self.user.ldap_bind.add_entry(year_dn, year)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        #end try

        if cotisation is not None:
            cotisation_dn = "cn=cotisation-" + time + "," + year_dn
            BrieLogging.get().info("cotisation ajoutee pour " + member.dn +
                                   "(" + str(cotisation.get("x-amountPaid")) +
                                   "EUR) by " + self.user.attrs.dn)
            self.user.ldap_bind.add_entry(cotisation_dn, cotisation)
        #end if

        if extra is not None:
            extra_dn = "cn=extra-" + time + "," + year_dn
            BrieLogging.get().info("extra ajoute pour " + member.dn + "(" +
                                   str(extra.get("x-amountPaid")) +
                                   "EUR) by " + self.user.attrs.dn)
            self.user.ldap_bind.add_entry(extra_dn, extra)
        #end if

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
        else:
            return
Exemple #28
0
    def post(self, residence, member_uid, next_end, extra_name, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        time = str(datetime.now())
        current_year = CotisationComputes.current_year()
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        cotisation = None
        extra = None

        if next_end != "":
            cotisation = self.create_cotisation(
                member, time, current_year, residence, residence_dn, member_uid, next_end
            )

        if extra_name != "":
            extra = self.create_extra(time, current_year, residence, residence_dn, member_uid, extra_name)
        # end if

        if cotisation is None and extra is None:
            if go_redirect:
                redirect("/edit/member/" + residence + "/" + member_uid)
            else:
                return
            # end if
        # end if

        folder_dn = ldap_config.cotisation_member_base_dn + member.dn
        year_dn = "cn=" + str(current_year) + "," + folder_dn

        try:
            folder = Cotisation.folder_attr()
            self.user.ldap_bind.add_entry(folder_dn, folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        # end try

        try:
            year = Cotisation.year_attr(current_year)
            self.user.ldap_bind.add_entry(year_dn, year)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        # end try

        if cotisation is not None:
            cotisation_dn = "cn=cotisation-" + time + "," + year_dn
            BrieLogging.get().info(
                "cotisation ajoutee pour "
                + member.dn
                + "("
                + str(cotisation.get("x-amountPaid"))
                + "EUR) by "
                + self.user.attrs.dn
            )
            self.user.ldap_bind.add_entry(cotisation_dn, cotisation)
        # end if

        if extra is not None:
            extra_dn = "cn=extra-" + time + "," + year_dn
            BrieLogging.get().info(
                "extra ajoute pour "
                + member.dn
                + "("
                + str(extra.get("x-amountPaid"))
                + "EUR) by "
                + self.user.attrs.dn
            )
            self.user.ldap_bind.add_entry(extra_dn, extra)
        # end if

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
        else:
            return
Exemple #29
0
    def post(self,
             residence,
             member_uid,
             room_uid,
             erase=True,
             go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        room = Room.get_by_uid(self.user, residence_dn, room_uid)

        if room is not None:
            member_in = room.get('x-memberIn').first()
            if member_in is not None:
                if erase:
                    BrieLogging.get().info(
                        "ecrasement de chambre - passage en sdf pour " +
                        member_in + " chambre " + room_uid + " by" +
                        self.user.attrs.dn)
                    self.user.ldap_bind.delete_attr(room.dn,
                                                    {"x-memberIn": member_in})
                else:
                    raise Exception("chambre de destination non vide")
                #end if
            #end if
            old_room = Room.get_by_member_dn(self.user, residence_dn,
                                             member.dn)
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            if old_room is not None:
                self.user.ldap_bind.delete_attr(old_room.dn,
                                                memberIn_attribute)
            #end if
            self.user.ldap_bind.add_attr(room.dn, memberIn_attribute)
            if old_room is not None:
                BrieLogging.get().info("demenagement member " + member_uid +
                                       " from " + old_room.uid.first() +
                                       " to " + room_uid + " by " +
                                       self.user.attrs.dn)
            else:
                BrieLogging.get().info("demenagement member " + member_uid +
                                       " to " + room_uid + " by " +
                                       self.user.attrs.dn)
            #end if
        else:
            old_room = Room.get_by_member_dn(self.user, residence_dn,
                                             member.dn)
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            if old_room is not None:
                self.user.ldap_bind.delete_attr(old_room.dn,
                                                memberIn_attribute)
                BrieLogging.get().info("retrait de chambre pour le member " +
                                       member_uid + " from " +
                                       old_room.uid.first() + " by " +
                                       self.user.attrs.dn)
            #end if
        #end if

        #self.user.ldap_bind.delete_entry_subtree(machine.dn)

        #taken_attribute = IpReservation.taken_attr(ip.get("x-taken").first())
        #self.user.ldap_bind.delete_attr(ip.dn, taken_attribute)
        #end if

        if go_redirect:
            # On redirige sur la page d'édition du membre
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #30
0
    def save(self, ldap_entry):
        modlist = []

        for global_deletion in ldap_entry._deletions:
            modlist.append((ldap.MOD_DELETE, global_deletion, None))
        #end for
        ldap_entry._deletions = []

        ldap_attributes = (
            attribute 
            for attribute in ldap_entry.__dict__.itervalues()
            if isinstance(attribute, LdapAttribute)
        )

        for ldap_attribute in ldap_attributes:
            BrieLogging.get().debug("name : " + ldap_attribute.name)
            BrieLogging.get().debug("values : " + str(ldap_attribute.values))
            BrieLogging.get().debug("deletions : " + str(ldap_attribute._deletions))
            BrieLogging.get().debug("additions : " + str(ldap_attribute._additions))
            BrieLogging.get().debug("modified : " + str(ldap_attribute._modified))
            
            if ldap_attribute._deletions != []:
                str_values = [str(value) for value in ldap_attribute._deletions]
                modlist.append((ldap.MOD_DELETE, ldap_attribute.name, str_values))
                ldap_attribute._deletions = []
            #end if

            if ldap_attribute._additions != []:
                str_values = [str(value) for value in ldap_attribute._additions]
                modlist.append((ldap.MOD_ADD, ldap_attribute.name, str_values))
                ldap_attribute._additions = []
            #end if

            if ldap_attribute._modified:
                str_values = [str(value) for value in ldap_attribute.values]
                modlist.append((ldap.MOD_REPLACE, ldap_attribute.name, str_values))
                ldap_attribute._modified = False
            #end for


        #end for

        BrieLogging.get().debug("dn : " +  ldap_entry.dn)
        BrieLogging.get().debug("modlist : " + str(modlist))
        if modlist != []:
            self.__connection.modify_s(ldap_entry.dn, modlist)

        # On recharge l'entrée après la sauvegarde
        entry_reloaded = self.search_dn(ldap_entry.dn)
        ldap_entry.__dict__ = entry_reloaded.__dict__
Exemple #31
0
    def post(self, residence, member_uid, name, mac, go_redirect=True, plugin_action=None):
        residence_dn = Residences.get_dn_by_name(self.user, residence)
        member_base_dn = ldap_config.username_base_dn + residence_dn
        member = Member.get_by_uid(self.user, residence_dn, member_uid)

        mac = mac.strip()
        name = name.strip().replace(" ", "-").replace("_", "-")
        name = Translations.formatName(name)
        # name = Translations.strip_accents(name)

        # Vérification que l'adresse mac soit correcte
        mac_match = re.match("^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$", mac)
        if mac_match is None:
            # TODO : changer l'exception en une page d'erreur
            raise Exception("mac non valide")
        # endif

        # Remplacement de l'adresse mac non séparée
        mac_match = re.match(
            "^([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$", mac
        )
        if mac_match is not None:
            mac = (
                mac_match.group(1)
                + ":"
                + mac_match.group(2)
                + ":"
                + mac_match.group(3)
                + ":"
                + mac_match.group(4)
                + ":"
                + mac_match.group(5)
                + ":"
                + mac_match.group(6)
            )
        # endif

        # Remplacement de l'adresse mac séparée par des tirets
        mac_match = re.match(
            "^([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})-([0-9A-Fa-f]{2})$",
            mac,
        )
        if mac_match is not None:
            mac = (
                mac_match.group(1)
                + ":"
                + mac_match.group(2)
                + ":"
                + mac_match.group(3)
                + ":"
                + mac_match.group(4)
                + ":"
                + mac_match.group(5)
                + ":"
                + mac_match.group(6)
            )
        # endif

        # Passage au format lowercase
        mac = mac.lower()

        # Vérification que le membre existe
        if member is None:
            # TODO : membre inexistant
            pass
        # endif

        # Vérification que l'adresse mac de la machine n'existe pas déjà
        # Note : on cherche sur toute la résidence (residence_dn)
        machine = Machine.get_dhcp_by_mac(self.user, member_base_dn, mac)
        if machine is not None:
            # TODO : gérer l'exception
            raise Exception("mac address already exist")
        # endif

        # Nettoyage des erreurs communes

        # On modifie silencieusement le nom de la machine si il existe déjà
        def try_name(name, number):
            actual_name = name
            if number > 0:
                actual_name = name + "-" + str(number)
            # end if

            machine = Machine.get_dns_by_name(self.user, member_base_dn, actual_name)
            if machine is not None:
                return try_name(name, number + 1)
            else:
                return actual_name
            # end if

        # endif

        # On retire les underscore interdits
        name = re.sub("_", "-", name)

        name = try_name(name, 0)

        # Génération de l'id de la machine et recherche d'une ip libre
        ip = IpReservation.get_first_free(self.user, residence_dn)

        if ip is None:
            raise Exception("le pool d'adresse IP est vide. aucune adresse IP disponible pour ajouter une machine")
        # end if

        # Indique que l'ip est prise
        taken_attribute = IpReservation.taken_attr(str(datetime.today()))
        self.user.ldap_bind.add_attr(ip.dn, taken_attribute)

        machine_folder = Machine.folder_attr()
        machine_folder_dn = ldap_config.machine_base_dn + member.dn
        try:
            self.user.ldap_bind.add_entry(machine_folder_dn, machine_folder)
        except ldap.ALREADY_EXISTS:
            pass  # OKAY
        # end try

        # Attributs ldap de l'objet machine (regroupant dns et dhcp)
        machine_top = Machine.entry_attr(name)

        # Attributs ldap des objets dhcp et dns, fils de l'objet machine
        machine_dhcp = Machine.dhcp_attr(name, mac)
        machine_dns = Machine.dns_attr(name, ip.cn.first())

        # Construction du dn et ajout de l'objet machine
        # en fils du membre (membre.dn)
        machine_dn = "cn=" + name + "," + ldap_config.machine_base_dn + member.dn
        self.user.ldap_bind.add_entry(machine_dn, machine_top)

        # Construction du dn et ajout de l'objet dhcp
        # en fils de la machine (machine_dn)
        dhcp_dn = "cn=dhcp," + machine_dn
        self.user.ldap_bind.add_entry(dhcp_dn, machine_dhcp)

        # Construction du dn et ajout de l'objet dns
        dns_dn = "cn=dns," + machine_dn
        self.user.ldap_bind.add_entry(dns_dn, machine_dns)

        # Ajout de l'entrée dans les logs
        BrieLogging.get().info(
            "ajout machine " + mac + " pour l'utilisateur " + member.dn + " par l'admin " + self.user.attrs.dn
        )

        plugin_vars = {"machine_dn": machine_dn, "name": name, "ip": ip, "mac": mac}

        plugin_action(self.user, residence, plugin_vars)

        if go_redirect:
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #32
0
    def post(self, residence, member_uid, room_uid, erase=True, go_redirect=True):
        residence_dn = Residences.get_dn_by_name(self.user, residence)

        # Récupération du membre et de la machine
        # Note : on cherche la machine seulement sur le membre (member.dn)
        member = Member.get_by_uid(self.user, residence_dn, member_uid)
        room = Room.get_by_uid(self.user, residence_dn, room_uid)

        if room is not None:
            member_in = room.get("x-memberIn").first()
            if member_in is not None:
                if erase:
                    BrieLogging.get().info(
                        "ecrasement de chambre - passage en sdf pour "
                        + member_in
                        + " chambre "
                        + room_uid
                        + " by"
                        + self.user.attrs.dn
                    )
                    self.user.ldap_bind.delete_attr(room.dn, {"x-memberIn": member_in})
                else:
                    raise Exception("chambre de destination non vide")
                # end if
            # end if
            old_room = Room.get_by_member_dn(self.user, residence_dn, member.dn)
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            if old_room is not None:
                self.user.ldap_bind.delete_attr(old_room.dn, memberIn_attribute)
            # end if
            self.user.ldap_bind.add_attr(room.dn, memberIn_attribute)
            if old_room is not None:
                BrieLogging.get().info(
                    "demenagement member "
                    + member_uid
                    + " from "
                    + old_room.uid.first()
                    + " to "
                    + room_uid
                    + " by "
                    + self.user.attrs.dn
                )
            else:
                BrieLogging.get().info(
                    "demenagement member " + member_uid + " to " + room_uid + " by " + self.user.attrs.dn
                )
            # end if
        else:
            old_room = Room.get_by_member_dn(self.user, residence_dn, member.dn)
            memberIn_attribute = Room.memberIn_attr(str(member.dn))
            if old_room is not None:
                self.user.ldap_bind.delete_attr(old_room.dn, memberIn_attribute)
                BrieLogging.get().info(
                    "retrait de chambre pour le member "
                    + member_uid
                    + " from "
                    + old_room.uid.first()
                    + " by "
                    + self.user.attrs.dn
                )
            # end if
        # end if

        # self.user.ldap_bind.delete_entry_subtree(machine.dn)

        # taken_attribute = IpReservation.taken_attr(ip.get("x-taken").first())
        # self.user.ldap_bind.delete_attr(ip.dn, taken_attribute)
        # end if

        if go_redirect:
            # On redirige sur la page d'édition du membre
            redirect("/edit/member/" + residence + "/" + member_uid)
Exemple #33
0
    def save(self, ldap_entry):
        modlist = []

        for global_deletion in ldap_entry._deletions:
            modlist.append((ldap.MOD_DELETE, global_deletion, None))
        #end for
        ldap_entry._deletions = []

        ldap_attributes = (attribute
                           for attribute in ldap_entry.__dict__.itervalues()
                           if isinstance(attribute, LdapAttribute))

        for ldap_attribute in ldap_attributes:
            BrieLogging.get().debug("name : " + ldap_attribute.name)
            BrieLogging.get().debug("values : " + str(ldap_attribute.values))
            BrieLogging.get().debug("deletions : " +
                                    str(ldap_attribute._deletions))
            BrieLogging.get().debug("additions : " +
                                    str(ldap_attribute._additions))
            BrieLogging.get().debug("modified : " +
                                    str(ldap_attribute._modified))

            if ldap_attribute._deletions != []:
                str_values = [
                    str(value) for value in ldap_attribute._deletions
                ]
                modlist.append(
                    (ldap.MOD_DELETE, ldap_attribute.name, str_values))
                ldap_attribute._deletions = []
            #end if

            if ldap_attribute._additions != []:
                str_values = [
                    str(value) for value in ldap_attribute._additions
                ]
                modlist.append((ldap.MOD_ADD, ldap_attribute.name, str_values))
                ldap_attribute._additions = []
            #end if

            if ldap_attribute._modified:
                str_values = [str(value) for value in ldap_attribute.values]
                modlist.append(
                    (ldap.MOD_REPLACE, ldap_attribute.name, str_values))
                ldap_attribute._modified = False
            #end for

        #end for

        BrieLogging.get().debug("dn : " + ldap_entry.dn)
        BrieLogging.get().debug("modlist : " + str(modlist))
        if modlist != []:
            self.__connection.modify_s(ldap_entry.dn, modlist)

        # On recharge l'entrée après la sauvegarde
        entry_reloaded = self.search_dn(ldap_entry.dn)
        ldap_entry.__dict__ = entry_reloaded.__dict__
Exemple #34
0
    def index(self, residence_name):
        status = dict()
        areas = dict()
        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex0")
        residence_dn = Residences.get_dn_by_name(self.user, residence_name)
        if residence_dn is None:
            raise Exception("unknown residence")
        #end if

        current_year = CotisationComputes.current_year()
        cotisations_year = Cotisation.get_all_cotisation_by_year(self.user, residence_dn, current_year)
        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex1 - cotis")
        stats = CotisationComputes.members_status_from_list_cotisations(self.user, residence_dn, cotisations_year)
        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex2 - cotisComput")
        members = dict()
        members_entries = Member.get_all(self.user, residence_dn)
        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex3 - members")
        members_entries_dict = dict()
        for member in members_entries:
            members_entries_dict[member.dn] = member
        #end for
        for label in stats:
            liste = []
            for member_dn in stats[label]:
                members[member_dn] = label
                liste.append(member_dn)
            #end for member
            for item in liste:
                stats[label].remove(item)
                stats[label].append(members_entries_dict[item])
            #end for item liste
        #end for stats
            

        stats['number_of_rooms'] = Room.get_number_of_rooms(self.user, residence_dn)
        stats['empty_rooms'] = []

        BrieLogging.get().debug(str(datetime.datetime.now()) + "RoomsIndex4")

        myResidence = self.user.ldap_bind.get_childs(ldap_config.room_base_dn + residence_dn);
        for batKey, bat in myResidence.childs.iteritems():
            if 'pacateriearea' in bat.objectClass.all() or 'pacaterieArea' in bat.objectClass.all():
                areas[bat.value] = dict()

                for floorKey, floor in bat.childs.iteritems():
                    if 'pacateriefloor' in floor.objectClass.all() or 'pacaterieFloor' in floor.objectClass.all():
                        areas[bat.value][floor.value] = list()

                        for roomKey, room in floor.childs.iteritems():
                            if 'pacaterieroom' in room.objectClass.all() or 'pacaterieRoom' in room.objectClass.all():
                                if not room.has("x-memberIn"):
                                    stats['empty_rooms'].append(room)
                                    room.add('status', "empty_room")
                                elif room.get("x-memberIn").first() in members:
                                    room.add('status', members[room.get("x-memberIn").first()])
                                #endif

                                areas[bat.value][floor.value].append(room)

                                color = self.color_picker("foobar")
                                if color in status:
                                    status[color] = status[color] + 1
                                else:
                                    status[color] = 0
                                #end if
                            #end if room
                        #end for room
                    #end if floor
                #end for floor
            #end if area
        #end for area

        return {
            "user" : self.user,
            "areas" : areas, 
            "color_picker" : self.color_picker, 
            "reverse_sorted_name" : self.reverse_sort_name, 
            "sorted_name" : self.sort_name, 
            "stats" : stats, 
            "status" : status, 
            "residence" : residence_name
        }