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)
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
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
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
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)
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)