пятница, 12 июля 2013 г.

Рекурсия с помощью рекурсивного цикла в jinja2.

Код выводит "дерево-лесенку" в виде списка, каждая "ступенька" которой находится в списке parents.

{#
{% for parent in (0,) recursive %} это "def func():", а
{{ loop((0,)) }} - это func().
#}
{% for parent in (0,) recursive %}
  • {{ parents.pop() }}
    {% if parents %}
      {{ loop((0,)) }}

    {%- endif %}

  • {% endfor %}

    Cоздание собственных операторов в sqlalchemy

    В postgresql есть такие типы данных как INET, CIDR, но полноценно в sqlalchemy они не поддерживаются. То есть, например, запрос для поиска подсетей
    SELECT * FROM nets WHERE ip >> '10.10.10.10' так просто сформулировать на sqlalchemy не получится. Для этого нужно переопределить оператор >> у типа данных CIDR и создавать запросы с его помощью:

    class Cidr(postgresql.CIDR):
    '''
    Делаем свой тип колонки для того, чтобы была возможность использовать
    операторы >> и <<
    '''

    class comparator_factory(postgresql.CIDR.Comparator):
    def __lshift__(self, other):
    return self.op("<<")(other)

    def __rshift__(self, other):
    return self.op(">>")(other)

    class Net(Base):
    __tablename__ = 'nets'
    id = Column(Integer, primary_key=True)
    ip = Column(Cidr)

    db.session.query(Net).filter(Net.ip>>'10.10.10.10')