Exemple #1
0
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
Exemple #2
0
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)
Exemple #3
0
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
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #6
0
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)
Exemple #7
0
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)
Exemple #8
0
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
Exemple #9
0
def basic_remove_mark_bucket_to_sync(namespace, bucket):
    if not bucket:
        return
    if not namespace.startswith('_'):
        namespace = '_' + namespace
    hdel(namespace, bucket)
Exemple #10
0
def del_ssl_cert_for_domain(domain):
    domain = domain.strip().lower()
    hdel('_domain_ssl', domain)