コード例 #1
0
def create_database(request):
    user = request.user
    name = get_or_error(request.POST, 'name')
    if not re.match('^[a-zA-Z0-9_-]+$', name):
        raise CustomAssertionError(
            'Name can only contain alphabets, numbers, dashes and underscores')

    if Database.objects.filter(name__iexact=name).exists():
        raise CustomAssertionError(
            'Database with name {} already exists.'.format(name))

    database = Database(name=name)
    database.save()

    media_dir = settings.MEDIA_URL[1:]
    new_wav_dir = os.path.join(settings.BASE_DIR, media_dir, 'audio', 'wav',
                               str(database.id))
    new_compressed_dir = os.path.join(settings.BASE_DIR, media_dir, 'audio',
                                      settings.AUDIO_COMPRESSED_FORMAT,
                                      str(database.id))

    os.mkdir(new_wav_dir)
    os.mkdir(new_compressed_dir)

    # Now assign this database to this user, and switch the working database to this new one
    da = DatabaseAssignment(user=user,
                            database=database,
                            permission=DatabasePermission.ASSIGN_USER)
    da.save()

    permission_str = DatabasePermission.get_name(
        DatabasePermission.ASSIGN_USER)
    return dict(id=database.id, name=name, permission=permission_str)
コード例 #2
0
def bulk_get_database(databases, extras):
    user = extras.user
    idx = []
    rows = []

    db_assignments = DatabaseAssignment.objects.filter(user=user)\
        .values_list('database__id', 'database__name', 'permission', 'database__nfft', 'database__noverlap',
                     'database__hpf', 'database__lpf')

    for id, dbname, permission, nfft, noverlap, hpf, lpf in db_assignments:
        idx.append(id)
        permission_str = DatabasePermission.get_name(permission)
        if lpf is None:
            lpf = "No limit"
        hpf = '{} Hz'.format(hpf)
        row = dict(id=id,
                   name=dbname,
                   permission=permission_str,
                   nfft=nfft,
                   overlap=noverlap,
                   hpf=hpf,
                   lpf=lpf)
        rows.append(row)

    return idx, rows
コード例 #3
0
def bulk_get_database(databases, extras):
    user = extras.user
    idx = []
    rows = []

    db_assignments = DatabaseAssignment.objects.filter(user=user)\
        .values_list('database__id', 'database__name', 'permission')

    for id, dbname, permission in db_assignments:
        idx.append(id)
        permission_str = DatabasePermission.get_name(permission)
        row = dict(id=id, name=dbname, permission=permission_str)
        rows.append(row)

    return idx, rows
コード例 #4
0
def assert_permission(user, database, required_level):
    """
    Assert that user has enough permission
    :param user:
    :param database:
    :param required_level:
    :return: if user does have permission, return the database assignment
    """
    if database is None:
        return None

    db_assignment = DatabaseAssignment.objects \
        .filter(user=user, database=database, permission__gte=required_level).first()
    if db_assignment is None or db_assignment.permission < required_level:
        raise CustomAssertionError(
            'On database {} you ({}) don\'t have permission to {}'.format(
                database.name, user.username,
                DatabasePermission.get_name(required_level).lower()))

    return db_assignment
コード例 #5
0
def redeem_invitation_code(request):
    user = request.user
    code = get_or_error(request.POST, 'code')

    now = timezone.now()
    invitation_code = InvitationCode.objects.filter(code=code,
                                                    expiry__gt=now).first()
    if invitation_code is None:
        raise CustomAssertionError('This code does not exist or has expired')

    database = invitation_code.database
    expiry = invitation_code.expiry
    permission = invitation_code.permission

    da = DatabaseAssignment.objects.filter(user=user,
                                           database=database).first()
    if da is not None:
        if da.permission >= permission:
            raise CustomAssertionError(
                'You have already been granted access to database {} with equal or greater permission'
                .format(database.name))
        else:
            da.permission = permission
            da.expiry = expiry
            da.save()
    else:
        DatabaseAssignment.objects.create(user=user,
                                          database=database,
                                          permission=permission,
                                          expiry=expiry)

    editable = permission == DatabasePermission.ASSIGN_USER
    permission_str = DatabasePermission.get_name(permission)
    retval = dict(id=database.id,
                  name=database.name,
                  permission=permission_str,
                  __editable=editable)
    return dict(origin='redeem_invitation_code',
                success=True,
                warning=None,
                payload=retval)
コード例 #6
0
def create_database(request):
    user = request.user
    name = get_or_error(request.POST, 'new-database-name')
    nfft = int(get_or_error(request.POST, 'new-database-fft'))
    noverlap = int(get_or_error(request.POST, 'new-database-overlap'))
    hpf = int(get_or_error(request.POST, 'new-database-hpf'))
    lpf = request.POST.get('new-database-lpf')

    errors = {}

    if not re.match('^[a-zA-Z0-9_-]+$', name):
        errors[
            'new-database-name-error'] = 'Name can only contain alphabets, numbers, dashes and underscores'

    if Database.objects.filter(name__iexact=name).exists():
        errors[
            'new-database-name-error'] = 'Database with name {} already exists.'.format(
                name)

    if lpf:
        lpf = int(lpf)
        if lpf <= hpf:
            errors[
                'new-database-lpf-error'] = 'Low pass filter value must be > high pass value'
    else:
        lpf = None

    has_errors = len(errors) > 0

    if not has_errors:

        database = Database(name=name,
                            nfft=nfft,
                            noverlap=noverlap,
                            hpf=hpf,
                            lpf=lpf)
        database.save()
        dbid = database.id

        media_dir = settings.MEDIA_URL[1:]
        new_wav_dir = os.path.join(settings.BASE_DIR, media_dir, 'audio',
                                   'wav', str(dbid))
        new_compressed_dir = os.path.join(settings.BASE_DIR, media_dir,
                                          'audio',
                                          settings.AUDIO_COMPRESSED_FORMAT,
                                          str(database.id))

        ensure_parent_folder_exists(new_wav_dir)
        ensure_parent_folder_exists(new_compressed_dir)
        os.mkdir(new_wav_dir)
        os.mkdir(new_compressed_dir)

        # Now assign this database to this user, and switch the working database to this new one
        da = DatabaseAssignment(user=user,
                                database=database,
                                permission=DatabasePermission.ASSIGN_USER)
        da.save()

        permission_str = DatabasePermission.get_name(
            DatabasePermission.ASSIGN_USER)

        noverlap = nfft * noverlap // 100
        payload = dict(id=dbid,
                       name=name,
                       permission=permission_str,
                       nfft=nfft,
                       overlap=noverlap,
                       hpf=hpf,
                       lpf=lpf)

    else:
        payload = errors

    return dict(origin='create_database',
                success=not has_errors,
                warning=None,
                payload=payload)