mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import os
|
|
import logging
|
|
|
|
from django.db.utils import OperationalError, ProgrammingError
|
|
from django.apps import AppConfig
|
|
from django.conf import settings
|
|
|
|
from PIL import UnidentifiedImageError
|
|
|
|
from InvenTree.ready import canAppAccessDatabase
|
|
|
|
|
|
logger = logging.getLogger("inventree")
|
|
|
|
|
|
class PartConfig(AppConfig):
|
|
name = 'part'
|
|
|
|
def ready(self):
|
|
"""
|
|
This function is called whenever the Part app is loaded.
|
|
"""
|
|
|
|
if canAppAccessDatabase():
|
|
self.generate_part_thumbnails()
|
|
self.update_trackable_status()
|
|
|
|
def generate_part_thumbnails(self):
|
|
"""
|
|
Generate thumbnail images for any Part that does not have one.
|
|
This function exists mainly for legacy support,
|
|
as any *new* image uploaded will have a thumbnail generated automatically.
|
|
"""
|
|
|
|
from .models import Part
|
|
|
|
logger.debug("InvenTree: Checking Part image thumbnails")
|
|
|
|
try:
|
|
for part in Part.objects.all():
|
|
if part.image:
|
|
url = part.image.thumbnail.name
|
|
loc = os.path.join(settings.MEDIA_ROOT, url)
|
|
|
|
if not os.path.exists(loc):
|
|
logger.info("InvenTree: Generating thumbnail for Part '{p}'".format(p=part.name))
|
|
try:
|
|
part.image.render_variations(replace=False)
|
|
except FileNotFoundError:
|
|
logger.warning(f"Image file '{part.image}' missing")
|
|
part.image = None
|
|
part.save()
|
|
except UnidentifiedImageError:
|
|
logger.warning(f"Image file '{part.image}' is invalid")
|
|
except (OperationalError, ProgrammingError):
|
|
# Exception if the database has not been migrated yet
|
|
pass
|
|
|
|
def update_trackable_status(self):
|
|
"""
|
|
Check for any instances where a trackable part is used in the BOM
|
|
for a non-trackable part.
|
|
|
|
In such a case, force the top-level part to be trackable too.
|
|
"""
|
|
|
|
from .models import BomItem
|
|
|
|
try:
|
|
items = BomItem.objects.filter(part__trackable=False, sub_part__trackable=True)
|
|
|
|
for item in items:
|
|
print(f"Marking part '{item.part.name}' as trackable")
|
|
item.part.trackable = True
|
|
item.part.clean()
|
|
item.part.save()
|
|
except (OperationalError, ProgrammingError):
|
|
# Exception if the database has not been migrated yet
|
|
pass
|