import abc from inkycal.custom import * class inkycal_module(metaclass=abc.ABCMeta): """Generic base class for inkycal modules""" @classmethod def __subclasshook__(cls, subclass): return (hasattr(subclass, 'generate_image') and callable(subclass.generate_image) or NotImplemented) def __init__(self, config): """Initialize module with given config""" # Initializes base module # sets properties shared amongst all sections self.config = conf = config['config'] self.width, self.height = conf['size'] self.padding_left = self.padding_right = conf["padding_x"] self.padding_top = self.padding_bottom = conf['padding_y'] self.fontsize = conf["fontsize"] self.font = ImageFont.truetype( fonts['NotoSansUI-Regular'], size = self.fontsize) def set(self, help=False, **kwargs): """Set attributes of class, e.g. class.set(key=value) see that can be changed by setting help to True """ lst = dir(self).copy() options = [_ for _ in lst if not _.startswith('_')] if 'logger' in options: options.remove('logger') if help == True: print('The following can be configured:') print(options) for key, value in kwargs.items(): if key in options: if key == 'fontsize': self.font = ImageFont.truetype(self.font.path, value) self.fontsize = value else: setattr(self, key, value) print(f"set '{key}' to '{value}'") else: print(f'{key} does not exist') pass # Check if validation has been implemented try: self._validate() except AttributeError: print('no validation implemented') @abc.abstractmethod def generate_image(self): # Generate image for this module with specified parameters raise NotImplementedError( 'The developers were too lazy to implement this function') @classmethod def get_config(cls): # Do not change # Get the config of this module for the web-ui try: if hasattr(cls, 'requires'): for each in cls.requires: if not "label" in cls.requires[each]: raise Exception(f"no label found for {each}") if hasattr(cls, 'optional'): for each in cls.optional: if not "label" in cls.optional[each]: raise Exception(f"no label found for {each}") conf = { "name": cls.__name__, "name_str": cls.name, "requires": cls.requires if hasattr(cls, 'requires') else {}, "optional": cls.optional if hasattr(cls, 'optional') else {}, } return conf except: raise Exception( 'Ohoh, something went wrong while trying to get the config of this module')