Пример #1
0
def get_form_submissions_grouped_by_field(xform, field, name=None):
    """Number of submissions grouped by field"""
    query = {}
    mongo_field = _encode_for_mongo(field)
    query[ParsedInstance.USERFORM_ID] =\
        u'%s_%s' % (xform.user.username, xform.id_string)
    query[mongo_field] = {"$exists": True}

    # check if requested field a datetime str
    record = xform_instances.find_one(query, {mongo_field: 1})

    if not record:
        raise ValueError(_(u"Field '%s' does not exist." % field))

    group = {"count": {"$sum": 1}}
    group["_id"] = _get_id_for_type(record, mongo_field)
    field_name = field if name is None else name
    pipeline = [
        {
            "$group": group
        },
        {
            "$sort": {"_id": 1}
        },
        {
            "$project": {
                field_name: "$_id",
                "count": 1
            }
        }
    ]
    kargs = {
        'query': query,
        'pipeline': pipeline
    }
    records = ParsedInstance.mongo_aggregate(**kargs)
    # delete mongodb's _id field from records
    # TODO: is there an elegant way to do this? should we remove the field?
    for record in records:
        del record['_id']
    return records