async def prepare(self): self.session = await self.update_session() if 'domain_id' in self.request.match_info: self.domain_id = self.request.match_info.pop('domain_id') if 'uid' in self.session: uid = self.session['uid'] self.user, self.domain, self.domain_user, bdoc = await asyncio.gather( user.get_by_uid(uid), domain.get(self.domain_id), domain.get_user(self.domain_id, uid), blacklist.get(self.remote_ip)) if not self.user: raise error.UserNotFoundError(uid) if not self.domain_user: self.domain_user = {} else: self.domain, bdoc = await asyncio.gather( domain.get(self.domain_id), blacklist.get(self.remote_ip)) self.view_lang = self.get_setting('view_lang') try: self.timezone = pytz.timezone(self.get_setting('timezone')) except pytz.UnknownTimeZoneError: pass self.locale = locale.get(self.view_lang) self.datetime_stamp = _datetime_stamp if bdoc: raise error.BlacklistedError(self.remote_ip) if not self.GLOBAL and not self.has_priv(builtin.PRIV_VIEW_ALL_DOMAIN): self.check_perm(builtin.PERM_VIEW)
async def prepare(self): self.session = await self.update_session() if 'domain_id' in self.request.match_info: self.domain_id = self.request.match_info.pop('domain_id') if 'uid' in self.session: uid = self.session['uid'] self.user, self.domain, self.domain_user, bdoc = await asyncio.gather( user.get_by_uid(uid), domain.get(self.domain_id), domain.get_user(self.domain_id, uid), blacklist.get(self.remote_ip)) if not self.user: raise error.UserNotFoundError(uid) if not self.domain_user: self.domain_user = {} else: self.domain, bdoc = await asyncio.gather( domain.get(self.domain_id), blacklist.get(self.remote_ip)) self.view_lang = self.get_setting('view_lang') try: self.timezone = pytz.timezone(self.get_setting('timezone')) except pytz.UnknownTimeZoneError: pass self.locale = locale.get(self.view_lang) self.datetime_stamp = _datetime_stamp if bdoc: raise error.BlacklistedError(self.remote_ip) if not self.GLOBAL and not self.has_priv(builtin.PRIV_VIEW_ALL_DOMAIN): self.check_perm(builtin.PERM_VIEW)
async def prepare(self): self.translate = locale.get_translate( options.default_locale) # Default translate for errors. self.session = await self.update_session() self.domain_id = self.request.match_info.pop('domain_id', builtin.DOMAIN_ID_SYSTEM) if 'uid' in self.session: uid = self.session['uid'] self.user, self.domain, self.domain_user, bdoc = await asyncio.gather( user.get_by_uid(uid), domain.get(self.domain_id), domain.get_user(self.domain_id, uid), blacklist.get(self.remote_ip)) if not self.user: raise error.UserNotFoundError(uid) if not self.domain_user: self.domain_user = {} else: self.user = builtin.USER_GUEST self.domain, bdoc = await asyncio.gather( domain.get(self.domain_id), blacklist.get(self.remote_ip)) self.domain_user = builtin.DOMAIN_USER_GUEST self.view_lang = self.get_setting('view_lang') # TODO(iceboy): UnknownTimeZoneError self.timezone = pytz.timezone(self.get_setting('timezone')) self.translate = locale.get_translate(self.view_lang) self.datetime_span = functools.partial(_datetime_span, timezone=self.timezone) self.datetime_stamp = _datetime_stamp if not self.domain: not_found_domain_id = self.domain_id self.domain_id = builtin.DOMAIN_ID_SYSTEM self.domain = builtin.DOMAIN_SYSTEM self.reverse_url = functools.partial(_reverse_url, domain_id=self.domain_id) self.build_path = functools.partial( _build_path, domain_id=self.domain_id, domain_name=self.domain['name']) raise error.DomainNotFoundError(not_found_domain_id) self.reverse_url = functools.partial(_reverse_url, domain_id=self.domain_id) self.build_path = functools.partial(_build_path, domain_id=self.domain_id, domain_name=self.domain['name']) if bdoc: raise error.BlacklistedError(self.remote_ip) if not self.GLOBAL and not self.has_priv(builtin.PRIV_VIEW_ALL_DOMAIN): self.check_perm(builtin.PERM_VIEW)
async def post_copy_to_domain(self, *, pid: document.convert_doc_id, dest_domain_id: str, numeric_pid: bool = False, hidden: bool = False): uid = self.user['_id'] pdoc = await problem.get(self.domain_id, pid, uid) if pdoc.get('hidden', False): self.check_perm(builtin.PERM_VIEW_PROBLEM_HIDDEN) ddoc, dudoc = await asyncio.gather( domain.get(dest_domain_id), domain.get_user(dest_domain_id, uid)) if not dudoc: dudoc = {} if not self.dudoc_has_perm(dudoc=dudoc, perm=builtin.PERM_CREATE_PROBLEM, ddoc=ddoc, udoc=self.user): # TODO: This is the destination domain's PermissionError. raise error.PermissionError(builtin.PERM_CREATE_PROBLEM) pid = None if numeric_pid: pid = await domain.inc_pid_counter(dest_domain_id) pid = await problem.copy(pdoc, dest_domain_id, uid, pid, hidden) new_url = self.reverse_url('problem_settings', pid=pid, domain_id=dest_domain_id) self.json_or_redirect(new_url, new_problem_url=new_url)
async def post(self, *, src_domain_id: str, src_pids: str, numeric_pid: bool = False, hidden: bool = False): src_ddoc, src_dudoc = await asyncio.gather( domain.get(src_domain_id), domain.get_user(src_domain_id, self.user['_id'])) if not src_dudoc: src_dudoc = {} if not self.dudoc_has_perm(ddoc=src_ddoc, dudoc=src_dudoc, udoc=self.user, perm=builtin.PERM_VIEW_PROBLEM): # TODO: This is the source domain's PermissionError. raise error.PermissionError(builtin.PERM_VIEW_PROBLEM) src_pids = misc.dedupe( map(document.convert_doc_id, src_pids.replace('\r\n', '\n').split('\n'))) if len(src_pids) > self.MAX_PROBLEMS_PER_REQUEST: raise error.BatchCopyLimitExceededError( self.MAX_PROBLEMS_PER_REQUEST, len(src_pids)) pdocs = await problem.get_multi(domain_id=src_domain_id, doc_id={'$in': src_pids}) \ .sort('doc_id', 1) \ .to_list() exist_pids = [pdoc['doc_id'] for pdoc in pdocs] if len(src_pids) != len(exist_pids): for pid in src_pids: if pid not in exist_pids: raise error.ProblemNotFoundError(src_domain_id, pid) for pdoc in pdocs: if pdoc.get('hidden', False): if not self.dudoc_has_perm( ddoc=src_ddoc, dudoc=src_dudoc, udoc=self.user, perm=builtin.PERM_VIEW_PROBLEM_HIDDEN): # TODO: This is the source domain's PermissionError. raise error.PermissionError( builtin.PERM_VIEW_PROBLEM_HIDDEN) for pdoc in pdocs: pid = None if numeric_pid: pid = await domain.inc_pid_counter(self.domain_id) await problem.copy(pdoc, self.domain_id, self.user['_id'], pid, hidden) self.redirect(self.reverse_url('problem_main'))