def delete_path_related_record_by_path(bucket, path, record_data=None, continue_to_create_record=False): record_id = None record_data_in_db = get_record_by_path(bucket, path) or {} if record_data_in_db and isinstance(record_data_in_db, dict): record_data_in_db["is_deleted"] = True if record_data is None: record_data = record_data_in_db record_id = record_data.get('_id') if not record_id: record_id = get_record_id_by_path(bucket, path) if record_id: hdel(bucket, record_id) if not record_data: return after_path_related_record_deleted(bucket, record_data_in_db or record_data) # 关联的数据删除 if not continue_to_create_record: # 后面如果是继续创建 record,还是会调用到 update_files_and_tags 的逻辑 update_tags_info_for_posts( bucket=bucket, record_data=record_data) # files and posts info
def remove_wechat_accounts_for_bucket(bucket): wechat_user_docs = get_wechat_user_docs_by_bucket(bucket) for doc in wechat_user_docs: wechat_user_id = doc.get("uid") if not wechat_user_id: continue hdel("wechat_accounts", wechat_user_id) hdel(get_bucket_namespace_for_wechat(bucket), wechat_user_id)
def unbind_wechat_account(wechat_user_id): bucket = get_bucket_by_wechat_user_id(wechat_user_id) if bucket: hdel("wechat_accounts", wechat_user_id) hdel(get_bucket_namespace_for_wechat(bucket), wechat_user_id) return True else: return False
def delete_bucket(bucket, delete_files=True): if not bucket: return # 清空一个 bucket 的相关逻辑,但是要慎重使用,一般除了 本地Debug 之外,不进行这个操作 clear_related_buckets(bucket) # after_record_created 中的一些数据统计清理 hdel('_bucket_usage', bucket) hdel('_records_count', bucket) if delete_files: # 删除对应的文件 loop_records_for_bucket(bucket, storage.when_record_deleted) # at last hclear(bucket) remove_bucket_from_buckets(bucket)
def show_avatar(avatar_id): avatar_id = get_avatar_id(avatar_id) avatar_doc = hget('_avatar', avatar_id) now = time.time() if avatar_doc: avatar_date = avatar_doc.get('date') avatar_image_content = avatar_doc.get('content') to_clear = False if not avatar_date: to_clear = True elif (now - avatar_date) > 5 * 24 * 60 * 60: # 5days to_clear = True elif ( now - avatar_date ) > 1 * 24 * 60 * 60 and not avatar_image_content: # 1day for empty avatar image to_clear = True if to_clear: # avatar_doc 缓存 5 天 hdel('_avatar', avatar_id) avatar_doc = None if not avatar_doc: avatar_image_content = get_gavatar_image_content(avatar_id) or '' if avatar_image_content: avatar_image_content = base64.b64encode(avatar_image_content) avatar_doc = dict(date=now, content=avatar_image_content) hset('_avatar', avatar_id, avatar_doc) if not is_doc_modified(avatar_doc, date_field='date'): return get_304_response() else: avatar_image_content = avatar_doc.get('content') or '' if avatar_image_content: avatar_image_content = base64.b64decode(avatar_image_content) response = Response(avatar_image_content, mimetype='image/png') set_304_response_for_doc(avatar_doc, response, date_field='date') return response else: # 默认的 url r_response = send_static_file('defaults/avatar.png') if r_response: return r_response # at last abort(404)
def after_path_related_record_deleted(bucket, record_data): path = get_path_from_record(record_data) if not path: return bucket_name_for_id = get_bucket_name_for_path(bucket) bucket_name_for_url = get_bucket_name_for_url(bucket) bucket_name_for_slash = get_bucket_name_for_slash(bucket) bucket_name_for_order = get_bucket_name_for_order_by_record( bucket, record_data) #bucket_name_for_order_file_type = "%s_file_order" % bucket # path 上清掉 hdel(bucket_name_for_id, path) # 数据类型,对应的排序 if bucket_name_for_order: zdel(bucket_name_for_order, path) #if bucket_name_for_order != bucket_name_for_order_file_type: # zdel(bucket_name_for_order_file_type, path) # slash 上清掉 zdel(bucket_name_for_slash, path) # url 上两个进行删除 url_path = get_url_path(record_data) or hget(bucket_name_for_url, path) if url_path: hdel(bucket_name_for_url, url_path) hdel(bucket_name_for_url, path) # 删除文件, 使用 storage 来处理这里的逻辑 storage.when_record_deleted(bucket, record_data)
def register_bucket_domain_from_system(bucket, domain, is_admin=False): # 注册系统提供的二级域名 # 一个 bucket 只允许注册一个系统提供的二级域名 # 返回 None or 错误信息 domain = domain.strip().lower() if not is_valid_bucket_name(bucket): return 'invalid bucket' domain_info = get_domain_basic_info(domain, is_admin=is_admin) is_system_domain = domain_info.get('is_system_domain', False) is_allowed = domain_info.get('allowed', False) if is_system_domain and is_allowed: r_domain_info = hget('_rdomain', bucket) # 当前 bucket 是否已经域名绑定了 parked_domain_info = hget('_domain', domain) # 这个域名是否已经被其它 bucket 绑定了 if parked_domain_info: # domain 已经注册过了 if parked_domain_info.get('bucket') == bucket: return None return '%s is used by other bucket' % domain if r_domain_info: # bucket 已经绑定过 domain 了 master_old_domain = r_domain_info.get('domain') if master_old_domain == domain: return None else: # 一个 bucket 只能绑定一个系统的二级域名,就会删除之前的一个 hdel('_rdomain', bucket) hdel('_domain', master_old_domain) pull_domain_from_bucket(bucket, master_old_domain) # 汇总 domains # 一个 _rdomain, 作为一个反向的对应, 一个 bucket 只能有一个系统级的域名 ? domain_doc = dict(bucket=bucket, domain=domain, created_at=time.time()) hset('_domain', domain, domain_doc) hset('_rdomain', bucket, domain_doc) push_domain_to_bucket(bucket, domain) # 汇总 domains return None else: return '%s is not allowed for bucket:%s' % (domain, bucket)
def delete_bucket_domain(domain, bucket=None): # 删除 bucket 上的 domain, 支持独立域名以及系统二级域名 # 这里未做是否有权限 unregister 的校验, 需要前置校验 # 未指定 bucket,就会删除 domain 对应的唯一 bucket;指定了,则进行 bucket 一致性校验 # 返回 None or 错误信息 domain = domain.strip().lower() if bucket and not is_valid_bucket_name(bucket): return 'invalid bucket' domain_record = hget('_domain', domain) if domain_record: to_delete = False bucket_in_db = domain_record.get('bucket') if bucket and bucket_in_db == bucket: to_delete = True elif not bucket and bucket_in_db: to_delete = True if to_delete: hdel('_domain', domain) hdel('_rdomain', bucket_in_db) # 尝试删除 rdomain 上的信息, 这样下次 bucket 还能再注册一个系统二级域名 pull_domain_from_bucket(bucket_in_db, domain) # 汇总 domains return None return 'can not find the matched domain record to remove for %s' % domain
def basic_remove_mark_bucket_to_sync(namespace, bucket): if not bucket: return if not namespace.startswith('_'): namespace = '_' + namespace hdel(namespace, bucket)
def del_ssl_cert_for_domain(domain): domain = domain.strip().lower() hdel('_domain_ssl', domain)