Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 def first (self) :
     try :
         ### cache ??? `self.limit` creates a new Q_Result
         return TFL.first (self.limit (1))
     except IndexError :
         return None
Esempio n. 4
0
 def first (self) :
     try :
         ### cache ??? `self.limit` creates a new Q_Result
         return TFL.first (self.limit (1))
     except IndexError :
         return None
Esempio n. 5
0
 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