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)
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
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)
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)
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)
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 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)
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)
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)
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/")
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))
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)
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)
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)
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 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)
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/")
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) }
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) }
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)
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 }
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
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
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)
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__
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)
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)
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__
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 }