Skip to content
Snippets Groups Projects
Select Git revision
  • 85fd48c32cbdb42f81b26bfb81d411d83e0898b0
  • master default protected
  • blender-v3.6-release
  • main
  • blender-v4.1-release
  • blender-v4.0-release
  • blender-v3.3-release
  • asset-shelf
  • blender-v3.5-release
  • brush-assets-project
  • blender-v2.93-release
  • blender-v3.4-release
  • xr-dev
  • bholodeck-v3.3
  • blender-v3.2-release
  • temp-xr-tracker
  • blender-v3.1-release
  • screenshots-manual
  • gltf_vtree
  • blender-v2.83-release
  • blender-v3.0-release
  • v3.6.18
  • v3.6.19
  • v3.6.20
  • v3.6.21
  • v3.6.22
  • v3.6.23
  • v4.1.1
  • v4.1.0
  • v3.6.10
  • v3.6.11
  • v3.6.12
  • v3.6.13
  • v3.6.14
  • v3.6.15
  • v3.6.16
  • v3.6.17
  • v3.6.9
  • v3.3.16
  • v3.6.8
  • v3.3.15
41 results

categories.py

Blame
  • user avatar
    Vilem Duha authored
    + new Oauth script version (finished in next commit)
    +split login/signup buttons
    85fd48c3
    History
    categories.py 4.08 KiB
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    if "bpy" in locals():
        from importlib import reload
    
        paths = reload(paths)
        utils = reload(utils)
        tasks_queue = reload(tasks_queue)
    else:
        from blenderkit import paths, utils, tasks_queue
    
    import requests
    import json
    import os
    import bpy
    
    import shutil
    import threading
    
    
    def count_to_parent(parent):
        for c in parent['children']:
            count_to_parent(c)
            parent['assetCount'] += c['assetCount']
    
    
    def fix_category_counts(categories):
        for c in categories:
            count_to_parent(c)
    
    
    def filter_category(category):
        ''' filter categories with no assets, so they aren't shown in search panel'''
        if category['assetCount'] < 1:
            return True
        else:
            to_remove = []
            for c in category['children']:
                if filter_category(c):
                    to_remove.append(c)
            for c in to_remove:
                category['children'].remove(c)
    
    
    def filter_categories(categories):
        for category in categories:
            filter_category(category)
    
    
    def get_category(categories, cat_path=()):
        for category in cat_path:
            for c in categories:
                if c['slug'] == category:
                    categories = c['children']
                    if category == cat_path[-1]:
                        return (c)
                    break;
    
    
    def copy_categories():
        # this creates the categories system on only
        tempdir = paths.get_temp_dir()
        categories_filepath = os.path.join(tempdir, 'categories.json')
        if not os.path.exists(categories_filepath):
            source_path = paths.get_addon_file(subpath='data' + os.sep + 'categories.json')
            # print('attempt to copy categories from: %s to %s' % (categories_filepath, source_path))
            try:
                shutil.copy(source_path, categories_filepath)
            except:
                print("couldn't copy categories file")
    
    
    def load_categories():
        copy_categories()
        tempdir = paths.get_temp_dir()
        categories_filepath = os.path.join(tempdir, 'categories.json')
    
        wm = bpy.context.window_manager
        with open(categories_filepath, 'r') as catfile:
            wm['bkit_categories'] = json.load(catfile)
    
        wm['active_category'] = {
            'MODEL': ['model'],
            'SCENE': ['scene'],
            'MATERIAL': ['material'],
            'BRUSH': ['brush'],
        }
    
    
    def fetch_categories(API_key):
        url = paths.get_api_url() + 'categories/'
    
        headers = utils.get_headers(API_key)
    
        tempdir = paths.get_temp_dir()
        categories_filepath = os.path.join(tempdir, 'categories.json')
    
        try:
            r = requests.get(url, headers=headers)
            rdata = r.json()
            categories = rdata['results']
            fix_category_counts(categories)
            # filter_categories(categories) #TODO this should filter categories for search, but not for upload. by now off.
            with open(categories_filepath, 'w') as s:
                json.dump(categories, s, indent=4)
            tasks_queue.add_task((load_categories, ()))
        except Exception as e:
            utils.p('category fetching failed')
            utils.p(e)
            if not os.path.exists(categories_filepath):
                source_path = paths.get_addon_file(subpath='data' + os.sep + 'categories.json')
                shutil.copy(source_path, categories_filepath)
    
    
    def fetch_categories_thread(API_key):
        cat_thread = threading.Thread(target=fetch_categories, args=([API_key]), daemon=True)
        cat_thread.start()