From 789773b05f53360a21e51520247c2da5a22e38d8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Vil=C3=A9m=20Duha?= <vilda.novak@gmail.com>
Date: Tue, 19 Jan 2021 18:32:26 +0100
Subject: [PATCH] BlenderKit: fix category upload for 3 level categories

If the subcategory1 enum was empty but the enum value would be higher than 0 from previous attempts, the metadata upload would fail.
---
 blenderkit/__init__.py   |  6 ++++--
 blenderkit/categories.py | 17 ++++++++++++++++-
 blenderkit/search.py     |  5 ++++-
 blenderkit/ui_panels.py  |  6 +++---
 blenderkit/upload.py     | 14 ++++++++++----
 5 files changed, 37 insertions(+), 11 deletions(-)

diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py
index d3cd5a724..494b530e7 100644
--- a/blenderkit/__init__.py
+++ b/blenderkit/__init__.py
@@ -696,12 +696,14 @@ class BlenderKitCommonUploadProps(object):
     category: EnumProperty(
         name="Category",
         description="main category to put into",
-        items=categories.get_category_enums
+        items=categories.get_category_enums,
+        update=categories.update_category_enums
     )
     subcategory: EnumProperty(
         name="Subcategory",
         description="Subcategory to put into",
-        items=categories.get_subcategory_enums
+        items=categories.get_subcategory_enums,
+        update=categories.update_subcategory_enums
     )
     subcategory1: EnumProperty(
         name="Subcategory lvl2",
diff --git a/blenderkit/categories.py b/blenderkit/categories.py
index 71e14f64c..8408f16f2 100644
--- a/blenderkit/categories.py
+++ b/blenderkit/categories.py
@@ -106,6 +106,18 @@ def get_category(categories, cat_path=()):
 #     asset_type = typemapper[type(self)]
 #     return asset_type
 
+def update_category_enums(self,context):
+    '''Fixes if lower level is empty - sets it to None, because enum value can be higher.'''
+    enums = get_subcategory_enums(self,context)
+    if enums[0][0] == 'NONE' and self.subcategory != 'NONE':
+        self.subcategory = 'NONE'
+
+def update_subcategory_enums(self,context):
+    '''Fixes if lower level is empty - sets it to None, because enum value can be higher.'''
+    enums = get_subcategory1_enums(self,context)
+    if enums[0][0] == 'NONE' and self.subcategory1 != 'NONE':
+        self.subcategory1 = 'NONE'
+
 
 def get_category_enums(self, context):
     wm = bpy.context.window_manager
@@ -192,7 +204,10 @@ def fetch_categories(API_key, force = False):
 
     tempdir = paths.get_temp_dir()
     categories_filepath = os.path.join(tempdir, 'categories.json')
-    catfile_age = time.time() - os.path.getmtime(categories_filepath)
+    if os.path.exists(categories_filepath):
+        catfile_age = time.time() - os.path.getmtime(categories_filepath)
+    else:
+        catfile_age = 10000000
 
     # global catfetch_counter
     # catfetch_counter += 1
diff --git a/blenderkit/search.py b/blenderkit/search.py
index 484830e0f..00f8eda00 100644
--- a/blenderkit/search.py
+++ b/blenderkit/search.py
@@ -1368,7 +1368,10 @@ def search(category='', get_next=False, author_id=''):
         return;
 
     if category != '':
-        query['category_subtree'] = category
+        if utils.profile_is_validator():
+            query['category'] = category
+        else:
+            query['category_subtree'] = category
 
     if author_id != '':
         query['author_id'] = author_id
diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py
index 4948b6516..40be08005 100644
--- a/blenderkit/ui_panels.py
+++ b/blenderkit/ui_panels.py
@@ -1592,9 +1592,9 @@ def draw_panel_categories(self, context):
     #     op.free_only = True
 
     for c in cats['children']:
-        if c['assetCount'] > 0:
+        if c['assetCount'] > 0 or utils.profile_is_validator():
             row = col.row(align=True)
-            if len(c['children']) > 0 and c['assetCount'] > 15:
+            if len(c['children']) > 0 and c['assetCount'] > 15 or utils.profile_is_validator():
                 row = row.split(factor=.8, align=True)
             # row = split.split()
             ctext = '%s (%i)' % (c['name'], c['assetCount'])
@@ -1608,7 +1608,7 @@ def draw_panel_categories(self, context):
                 op.keep_running = True
                 op.category = c['slug']
             # TODO enable subcategories, now not working due to some bug on server probably
-            if len(c['children']) > 0 and c['assetCount'] > 15:
+            if len(c['children']) > 0 and c['assetCount'] > 15 or utils.profile_is_validator():
                 # row = row.split()
                 op = row.operator('view3d.blenderkit_set_category', text='>>')
                 op.asset_type = ui_props.asset_type
diff --git a/blenderkit/upload.py b/blenderkit/upload.py
index 691502304..2cd23f727 100644
--- a/blenderkit/upload.py
+++ b/blenderkit/upload.py
@@ -564,12 +564,14 @@ class FastMetadata(bpy.types.Operator):
     category: EnumProperty(
         name="Category",
         description="main category to put into",
-        items=categories.get_category_enums
+        items=categories.get_category_enums,
+        update=categories.update_category_enums
     )
     subcategory: EnumProperty(
         name="Subcategory",
         description="main category to put into",
-        items=categories.get_subcategory_enums
+        items=categories.get_subcategory_enums,
+        update = categories.update_subcategory_enums
     )
     subcategory1: EnumProperty(
         name="Subcategory",
@@ -608,7 +610,9 @@ class FastMetadata(bpy.types.Operator):
         if self.category != 'NONE' and self.subcategory != 'NONE':
             layout.prop(self, 'subcategory')
         if self.subcategory != 'NONE' and self.subcategory1 != 'NONE':
-            layout.prop(self, 'subcategory1')
+            enums = categories.get_subcategory1_enums(self, context)
+            if enums[0][0]!='NONE':
+                layout.prop(self, 'subcategory1')
         layout.prop(self, 'name')
         layout.prop(self, 'description')
         layout.prop(self, 'tags')
@@ -668,7 +672,8 @@ class FastMetadata(bpy.types.Operator):
                 self.subcategory = cat_path[2]
         except Exception as e:
             print(e)
-        self.message = f"Recategorize asset {asset_data['name']}"
+        self.message = f"Fast edit metadata of {asset_data['name']}"
+        self.message = str(cat_path)
         self.name = asset_data['displayName']
         self.description = asset_data['description']
         self.tags = ','.join(asset_data['tags'])
@@ -679,6 +684,7 @@ class FastMetadata(bpy.types.Operator):
         self.license = asset_data['license']
 
         wm = context.window_manager
+
         return wm.invoke_props_dialog(self, width = 600)
 
 
-- 
GitLab