def validate_or_raise(att):

    start = att['attached']
    if 'removed' in att and att['removed']:
        end = att['removed']
    else:
        end = model_utils.current_time_as_lajistore_timestamp()

    if model_utils.timestamp_to_datetime(end) < model_utils.timestamp_to_datetime(start):
        raise ValueError

    ind_atts = get_attachments_of_individual_during_time(att['individualID'],
            start, end)
    if 'id' in att and att['id']:
        ind_atts = [a for a in ind_atts if a['id'] != att['id']]
    if len(ind_atts) != 0:
        raise AlreadyHasDevice([a['deviceID'] for a in ind_atts])

    dev_atts = get_attachments_of_device_during_time(att['deviceID'],
            start, end)
    if 'id' in att and att['id']:
        dev_atts = [a for a in dev_atts if a['id'] != att['id']]
    if len(dev_atts) != 0:
        raise DeviceAlreadyAttached([a['individualID'] for a in dev_atts])

    return True
def _filter_attachments_by_timerange(attachments, start, end):
    ret = []
    for att in attachments:
        att_start = att['attached'] 
        if 'removed' in att and att['removed']:
            att_end = att['removed']
        else:
            att_end = model_utils.current_time_as_lajistore_timestamp()
        if model_utils.timestamp_timeranges_overlap((start, end), (att_start, att_end)):
            ret.append(att)
    return ret