예제 #1
0
def users_dt_json():
    """JSON call to fill a DataTable.

    Needs some refactoring.
    """
    args = request.args

    length = int(args.get("iDisplayLength", 0))
    start = int(args.get("iDisplayStart", 0))
    sort_col = int(args.get("iSortCol_0", 1))
    sort_dir = args.get("sSortDir_0", "asc")
    echo = int(args.get("sEcho", 0))
    search = args.get("sSearch", "").replace("%", "").lower()

    end = start + length

    query = User.query
    total_count = query.count()

    if search:
        # TODO: gérer les accents
        filter = or_(
            func.lower(User.first_name).like("%" + search + "%"),
            func.lower(User.last_name).like("%" + search + "%"),
        )
        query = query.filter(filter).reset_joinpoint()

    count = query.count()
    SORT_COLS = {
        1: [],  # will be set to [User.last_name, User.first_name]
        2: [User.created_at],
        3: [User.last_active],
    }
    columns = list(SORT_COLS.get(sort_col, []))
    columns.extend([func.lower(User.last_name), func.lower(User.first_name)])

    direction = asc if sort_dir == "asc" else desc
    order_by = [direction(column) for column in columns]

    # sqlite does not support 'NULLS FIRST|LAST' in ORDER BY clauses
    engine = query.session.get_bind(User.__mapper__)
    if engine.name != "sqlite":
        order_by[0] = nullslast(order_by[0])

    query = query.order_by(*order_by)

    users = query.slice(start, end).all()

    data = []
    MUGSHOT_SIZE = 45
    for user in users:
        # TODO: this should be done on the browser.
        user_url = url_for(".user", user_id=user.id)
        mugshot = user_photo_url(user, size=MUGSHOT_SIZE)
        name = escape(getattr(user, "name") or "")

        cell0 = (
            '<a href="{url}"><img src="{src}" width="{size}" height="{size}">'
            "</a>".format(url=user_url, src=mugshot, size=MUGSHOT_SIZE))
        cell1 = '<div class="info"><a href="{user_url}">{name}</a> ' "</div>".format(
            **locals())
        cell2 = age(user.created_at)
        cell3 = age(user.last_active)

        cell4 = ""  # TODO: follow / unfollow?
        data.append([cell0, cell1, cell2, cell3])

    result = {
        "sEcho": echo,
        "iTotalRecords": total_count,
        "iTotalDisplayRecords": count,
        "aaData": data,
    }
    return jsonify(result)
예제 #2
0
    def data(self, *args, **kw) -> Dict:
        security = cast(SecurityService, get_service("security"))
        length = int(kw.get("iDisplayLength", 0))
        start = int(kw.get("iDisplayStart", 0))
        sort_col = int(kw.get("iSortCol_0", 1))
        sort_dir = kw.get("sSortDir_0", "asc")
        echo = int(kw.get("sEcho", 0))
        search = kw.get("sSearch", "").replace("%", "").strip().lower()

        end = start + length
        query = User.query.options(
            sa.orm.subqueryload("groups"),
            sa.orm.undefer("photo")).filter(User.id != 0)
        total_count = query.count()

        if search:
            # TODO: gérer les accents
            filter = or_(
                func.lower(User.first_name).like("%" + search + "%"),
                func.lower(User.last_name).like("%" + search + "%"),
                func.lower(User.email).like("%" + search + "%"),
            )
            query = query.filter(filter)

        count = query.count()
        SORT_COLS = {
            1: [],  # [User.last_name, User.first_name] will be added anyway
            2: [func.lower(User.email)],
            5: [User.last_active],
        }
        columns = list(SORT_COLS.get(sort_col, []))
        columns.extend(
            [func.lower(User.last_name),
             func.lower(User.first_name)])

        direction = asc if sort_dir == "asc" else desc
        order_by = list(map(direction, columns))

        # sqlite does not support 'NULLS FIRST|LAST' in ORDER BY clauses
        engine = query.session.get_bind(User.__mapper__)
        if engine.name != "sqlite":
            order_by[0] = nullslast(order_by[0])

        query = query.order_by(*order_by)

        users = query.slice(start, end).all()

        data = []
        for user in users:
            # TODO: this should be done on the browser.
            user_url = url_for(".users_user", user_id=user.id)
            mugshot = user_photo_url(user, size=MUGSHOT_SIZE)
            name = html.escape(user.name or "")
            email = html.escape(user.email or "")
            roles = [
                r for r in security.get_roles(user, no_group_roles=True)
                if r.assignable
            ]
            columns = [
                '<a href="{url}"><img src="{src}" width="{size}" height="{size}">'
                "</a>".format(url=user_url, src=mugshot, size=MUGSHOT_SIZE),
                f'<a href="{user_url}">{name}</a>',
                f'<a href="{user_url}"><em>{email}</em></a>',
                "\u2713" if user.can_login else "",
                render_template_string(
                    """{%- for g in groups %}
                        <span class="badge badge-default">{{ g.name }}</span>
                    {%- endfor %}""",
                    groups=sorted(user.groups),
                ),
                render_template_string(
                    """{%- for role in roles %}
                       <span class="badge badge-default">{{ role }}</span>
                    {%- endfor %}""",
                    roles=roles,
                ),
            ]

            if user.last_active:
                last_active = format_datetime(user.last_active)
            else:
                last_active = _("Never logged in")
            columns.append(last_active)

            data.append(columns)

        return {
            "sEcho": echo,
            "iTotalRecords": total_count,
            "iTotalDisplayRecords": count,
            "aaData": data,
        }
예제 #3
0
파일: views.py 프로젝트: debon/abilian-core
  def data(self, *args, **kw):
    security = current_app.services['security']
    length = int(kw.get("iDisplayLength", 0))
    start = int(kw.get("iDisplayStart", 0))
    sort_col = int(kw.get("iSortCol_0", 1))
    sort_dir = kw.get("sSortDir_0", "asc")
    echo = int(kw.get("sEcho", 0))
    search = kw.get("sSearch", "").replace("%", "").strip().lower()

    end = start + length
    q = User.query \
      .options(sa.orm.subqueryload('groups'),
               sa.orm.undefer('photo'), ) \
      .filter(User.id != 0)
    total_count = q.count()

    if search:
      # TODO: gérer les accents
      filter = or_(func.lower(User.first_name).like("%" + search + "%"),
                   func.lower(User.last_name).like("%" + search + "%"),
                   func.lower(User.email).like("%" + search + "%"))
      q = q.filter(filter)

    count = q.count()
    SORT_COLS = {
      1: [],  # [User.last_name, User.first_name] will be added anyway
      2: [func.lower(User.email)],
      5: [User.last_active],
    }
    columns = list(SORT_COLS.get(sort_col, []))
    columns.extend([func.lower(User.last_name), func.lower(User.first_name)])

    direction = asc if sort_dir == 'asc' else desc
    order_by = map(direction, columns)

    # sqlite does not support 'NULLS FIRST|LAST' in ORDER BY clauses
    engine = q.session.get_bind(User.__mapper__)
    if engine.name != 'sqlite':
      order_by[0] = nullslast(order_by[0])

    q = q.order_by(*order_by)

    users = q.slice(start, end).all()

    data = []
    MUGSHOT_SIZE = 45
    for user in users:
      # TODO: this should be done on the browser.
      user_url = url_for(".users_user", user_id=user.id)
      mugshot = user_photo_url(user, size=MUGSHOT_SIZE)
      name = escape(getattr(user, "name") or "")
      email = escape(getattr(user, "email") or "")
      roles = [r for r in security.get_roles(user, no_group_roles=True)
               if r.assignable]
      columns = []
      columns.append(
        u'<a href="{url}"><img src="{src}" width="{size}" height="{size}">'
        u'</a>'.format(url=user_url, src=mugshot, size=MUGSHOT_SIZE)
      )
      columns.append(
        u'<a href="{url}">{name}</a>'.format(url=user_url, name=name))
      columns.append(
        u'<a href="{url}"><em>{email}</em></a>'.format(url=user_url,
                                                       email=email))
      columns.append(u'\u2713' if user.can_login else u'')
      columns.append(render_template_string(
        u'''{%- for g in groups %}
            <span class="badge badge-default">{{ g.name }}</span>
            {%- endfor %}''',
        groups=sorted(user.groups)))
      columns.append(render_template_string(
        u'''{%- for role in roles %}
            <span class="badge badge-default">{{ role }}</span>
            {%- endfor %}''',
        roles=roles))

      if user.last_active:
        last_active = format_datetime(user.last_active)
      else:
        last_active = _(u'Never logged in')
      columns.append(last_active)

      data.append(columns)

    return {
      "sEcho": echo,
      "iTotalRecords": total_count,
      "iTotalDisplayRecords": count,
      "aaData": data,
    }
예제 #4
0
파일: views.py 프로젝트: debon/abilian-core
    def data(self, *args, **kw):
        security = current_app.services['security']
        length = int(kw.get("iDisplayLength", 0))
        start = int(kw.get("iDisplayStart", 0))
        sort_col = int(kw.get("iSortCol_0", 1))
        sort_dir = kw.get("sSortDir_0", "asc")
        echo = int(kw.get("sEcho", 0))
        search = kw.get("sSearch", "").replace("%", "").strip().lower()

        end = start + length
        q = User.query \
          .options(sa.orm.subqueryload('groups'),
                   sa.orm.undefer('photo'), ) \
          .filter(User.id != 0)
        total_count = q.count()

        if search:
            # TODO: gérer les accents
            filter = or_(
                func.lower(User.first_name).like("%" + search + "%"),
                func.lower(User.last_name).like("%" + search + "%"),
                func.lower(User.email).like("%" + search + "%"))
            q = q.filter(filter)

        count = q.count()
        SORT_COLS = {
            1: [],  # [User.last_name, User.first_name] will be added anyway
            2: [func.lower(User.email)],
            5: [User.last_active],
        }
        columns = list(SORT_COLS.get(sort_col, []))
        columns.extend(
            [func.lower(User.last_name),
             func.lower(User.first_name)])

        direction = asc if sort_dir == 'asc' else desc
        order_by = map(direction, columns)

        # sqlite does not support 'NULLS FIRST|LAST' in ORDER BY clauses
        engine = q.session.get_bind(User.__mapper__)
        if engine.name != 'sqlite':
            order_by[0] = nullslast(order_by[0])

        q = q.order_by(*order_by)

        users = q.slice(start, end).all()

        data = []
        MUGSHOT_SIZE = 45
        for user in users:
            # TODO: this should be done on the browser.
            user_url = url_for(".users_user", user_id=user.id)
            mugshot = user_photo_url(user, size=MUGSHOT_SIZE)
            name = escape(getattr(user, "name") or "")
            email = escape(getattr(user, "email") or "")
            roles = [
                r for r in security.get_roles(user, no_group_roles=True)
                if r.assignable
            ]
            columns = []
            columns.append(
                u'<a href="{url}"><img src="{src}" width="{size}" height="{size}">'
                u'</a>'.format(url=user_url, src=mugshot, size=MUGSHOT_SIZE))
            columns.append(u'<a href="{url}">{name}</a>'.format(url=user_url,
                                                                name=name))
            columns.append(u'<a href="{url}"><em>{email}</em></a>'.format(
                url=user_url, email=email))
            columns.append(u'\u2713' if user.can_login else u'')
            columns.append(
                render_template_string(u'''{%- for g in groups %}
            <span class="badge badge-default">{{ g.name }}</span>
            {%- endfor %}''',
                                       groups=sorted(user.groups)))
            columns.append(
                render_template_string(u'''{%- for role in roles %}
            <span class="badge badge-default">{{ role }}</span>
            {%- endfor %}''',
                                       roles=roles))

            if user.last_active:
                last_active = format_datetime(user.last_active)
            else:
                last_active = _(u'Never logged in')
            columns.append(last_active)

            data.append(columns)

        return {
            "sEcho": echo,
            "iTotalRecords": total_count,
            "iTotalDisplayRecords": count,
            "aaData": data,
        }