def _insert (self, other) : key = self.key (other) try : larger = TFL.first (it for it in self if it.key > key) except IndexError : prev = self.tail else : prev = larger.prev self.__super.insert (prev, other) if self.mark.key > key : self.rotate_prev (1)
def _insert(self, other): key = self.key(other) try: larger = TFL.first(it for it in self if it.key > key) except IndexError: prev = self.tail else: prev = larger.prev self.__super.insert(prev, other) if self.mark.key > key: self.rotate_prev(1)
def first (self) : try : ### cache ??? `self.limit` creates a new Q_Result return TFL.first (self.limit (1)) except IndexError : return None
def _response_body (self, resource, request, response) : Bad_Req = resource.Status.Bad_Request req_data = request.req_data result = {} user = resource.user_restriction scope = resource.scope CNDB = scope.CNDB ipid = req_data.get ("interface") ppid = req_data.get ("pool") if ipid is None : raise Bad_Req (_T ("Request must include interface pid")) try : iface = scope.pid_query (ipid) except LookupError as exc : raise (Bad_Req (str (exc))) node = iface.my_node if ppid is not None : try : pool = scope.pid_query (ppid) except LookupError as exc : raise (Bad_Req (str (exc))) else : pools = [pool] else : def _query (ETM, node, user) : bitlen = ETM.left.net_address.P_Type.bitlen return ETM.query \ ( Q.OR ( Q.right.node == node , Q.AND ( ~ Q.right.node , Q.right.group_links.right.member_links .left == user # possibly, # a Q-expression checking various quotas ) ) & Q.OR ( ~ Q.right.netmask_interval.upper , Q.right.netmask_interval.upper == bitlen ) ).attr (Q.right).distinct () pools = list \ ( p for p in ichain ( _query (CNDB.IP4_Network_in_IP4_Pool, node, user) , _query (CNDB.IP6_Network_in_IP6_Pool, node, user) ) if p.can_allocate () ) n_pools = len (pools) ### XXX ### filter pools by quota ### if none remain ### --> send feedback about the full pools available template = resource.top.Templateer.get_template \ ("html/dashboard/app.m.jnj") if not n_pools : result ["feedback"] = _T \ ( "No pools available that allow allocation " "by user %(user)s and node %(node)s" % dict (user = user, node = node) ) elif n_pools == 1 : pool = TFL.first (pools) nw0 = TFL.first (pool.ip_networks) try : ipa = pool.allocate (nw0.net_address.bitlen, user) except Exception as exc : result ["feedback"] = str (exc) else : iii = scope.CNDB.Net_Interface_in_IP_Network \ (iface, ipa, mask_len = ipa.pool.net_address.mask) result ["row"] = template.call_macro \ ("e_type_object", resource, iii) else : result ["menu"] = template.call_macro \ ("action_button_allocate_ip_pool_menu", resource, pools) return result