def create_account(request): # TODO: docstring # lock account creation for up to 5 minutes r = redis.from_url(credentials.redis_uri) lock = r.lock('ocflib.account.submission.create_account', timeout=60 * 5) try: if not lock.acquire(blocking=True, blocking_timeout=60 * 5): raise RuntimeError('Couldn\'t lock account creation, abandoning.') # status reporting status = [] class report_status: def __init__(self, *args): if len(args) == 1: self(*args) else: self.start, self.stop, self.task = args def __call__(self, line): status.append(line) create_account.update_state(meta={'status': status}) def __enter__(self, *args): self(self.start + ' ' + self.task) def __exit__(self, *args): self(self.stop + ' ' + self.task) with report_status('Validating', 'Validated', 'request'), \ get_session() as session: errors, warnings = validate_request(request, credentials, session) if errors: send_rejected_mail(request, str(errors)) return NewAccountResponse( status=NewAccountResponse.REJECTED, errors=(errors + warnings), ) # actual account creation kwargs = {} known_uid = r.get('known_uid') if known_uid: kwargs['known_uid'] = int(known_uid) new_uid = real_create_account(request, credentials, report_status, **kwargs) r.set('known_uid', new_uid) dispatch_event('ocflib.account_created', request=request.to_dict()) return NewAccountResponse( status=NewAccountResponse.CREATED, errors=[], ) finally: try: lock.release() except LockError: pass
def create_account(request): # TODO: docstring # lock account creation for up to 5 minutes r = redis.from_url(credentials.redis_uri) lock = r.lock('ocflib.account.submission.create_account', timeout=60 * 5) try: if not lock.acquire(blocking=True, blocking_timeout=60 * 5): raise RuntimeError('Couldn\'t lock account creation, abandoning.') # status reporting status = [] def _report_status(line): """Update task status by adding the given line.""" status.append(line) create_account.update_state(meta={'status': status}) @contextmanager def report_status(start, stop, task): _report_status(start + ' ' + task) yield _report_status(stop + ' ' + task) with report_status('Validating', 'Validated', 'request'), \ get_session() as session: errors, warnings = validate_request(request, credentials, session) if errors: send_rejected_mail(request, str(errors)) return NewAccountResponse( status=NewAccountResponse.REJECTED, errors=(errors + warnings), ) # actual account creation real_create_account(request, credentials, report_status) dispatch_event('ocflib.account_created', request=request.to_dict()) return NewAccountResponse( status=NewAccountResponse.CREATED, errors=[], ) finally: try: lock.release() except LockError: pass