class TSValidationError(Exception):
    pass def validate_request(collection, json_in):
    validator(requests_schema[collection], format_checker=jsonschema.FormatChecker()).validate(json_in) def update_password_salt_user_list(collection, list_in):
    
    if collection == 'user':
        for json_in in list_in:
            update_password_salt_user_json(json_in)
        
    return list_in def validate_json_list(collection, list_in):
    
    for json_in in list_in:    
        # Validate json schema
        validator(schema[collection], format_checker=jsonschema.FormatChecker()).validate(json_in) def sanitize_objectify_json(json_in):
    """Sanitize string and convert _ids to ObjectId in JSON"""
    return recursive_replace(json_in, _replace_function_sanitize_objectify_json) def stringify_objectid_cursor(cursor_in):
    """Convert ObjectId to string in JSON"""
    
    stringified = []
    for json_in in cursor_in:
        stringified.append(recursive_replace(json_in, _replace_function_stringify_objectid_json))
    return stringified def stringify_objectid_list(list_in):
    """Convert an ObjectId list to string list"""
    return recursive_replace(list_in, _replace_function_stringify_objectid_list) def check_datamine_permissions(action, document):
    # Get datamine permissions
    
    try:
        restrictions = cherrypy.session['_ts_user']['restrictions'][action]
    except (KeyError, TypeError):
        restrictions = None
        
    if not restrictions:
        raise TSValidationError("Access to '%s' is restricted for current user" % (action))
    elif restrictions != True:
        validator(restrictions, format_checker=jsonschema.FormatChecker()).validate(document) def get(collection, criteria_projection_order):
def remove(collection, criterias = []):
def add(collection, documents_list):
def update(collection, document):
from core.validation.validation import TSValidationError, validate_request, update_password_salt_user_list, validate_json_list, sanitize_objectify_json, stringify_objectid_cursor, stringify_objectid_list
from core.validation.permissions import check_datamine_permissions
from core.config import conf_reports, conf_approved
from bson.objectid import ObjectId
from core.api.crud import db
import cherrypy, logging


def report_users_hours(criteria):
    
    """
    Get report grouped by users
    
    POST /data/report_users_hours/
    
    Expects a  { 'start' : '', 'end' : '', 'users' : [], 'projects' : [], hours_standard : bool, hours_extra : bool, tasks : [] } 
    Returns { 'error' : string, 'records' : [ { }, { }, .. ]  } 
    """
    
    validate_request('report_users_hours', criteria)

    sanified_criteria = sanitize_objectify_json(criteria)