def __init__(cls, class_name, bases, class_dict): type.__init__(cls, class_name, bases, class_dict) # Assign a label for the class. if '_label' not in class_dict: cls._label = label_from_name(class_name) # Only if this global schema definition variable exists. if (schevo.namespace.SCHEMADEF is not None and hasattr(cls, '_field_spec') ): # Create an initial field spec odict, which will get # updated by the EntityMeta class. cls._field_spec = field_spec_from_class(cls, class_dict) # Add this class to the namespace. ns = getattr( schevo.namespace.SCHEMADEF, namespace_name) try: ns._set(class_name, cls) except KeyError: # Skip private classes. pass
def __init__(cls, class_name, bases, class_dict): # Only do something if creating a subclass of Entity. type.__init__(cls, class_name, bases, class_dict) if class_name == 'Entity': return # If the class specifies an actual name, use that instead. if '_actual_name' in class_dict: class_name = cls._actual_name cls.__name__ = class_name # Create the field spec. field_spec = cls._field_spec = field_spec_from_class( cls, class_dict, slots=True) field_spec.reorder_all() # Setup fields, keeping track of calculated (fget) fields. cls.setup_fields() # Get slotless specs for queries, transactions and views. spec = field_spec_from_class(cls, class_dict) q_spec = spec.copy() t_spec = spec.copy() v_spec = spec.copy() # Transactions and the default query don't normally need fget # fields, so hide them by default in those contexts. for field_name in cls._fget_fields: q_spec[field_name].hidden = True t_spec[field_name].hidden = True # Generic Update (for use by cascading delete). Assigned in # this metaclass to prevent subclasses from overriding. class _GenericUpdate(transaction.Update): _call_change_handlers_on_init = False _EntityClass = cls _extent_name = class_name _fget_fields = cls._fget_fields _field_spec = t_spec.copy() cls._GenericUpdate = _GenericUpdate if not class_name.startswith('_'): # Setup standard transaction classes (Create, Delete, Update). cls.setup_transactions(class_name, class_dict, t_spec) # Setup view classes. cls.setup_views(class_name, bases, class_dict, v_spec) # Normalize hidden information. cls._hidden_actions = set(cls._hidden_actions) cls._hidden_queries = set(cls._hidden_queries) cls._hidden_views = set(cls._hidden_views) # Setup key spec. cls.setup_key_spec() # Setup index spec. cls.setup_index_spec() # Keep them from clashing. cls.validate_key_and_index_specs() if not class_name.startswith('_'): # Assign labels if class name is "public". cls.assign_labels(class_name, class_dict) # Remember queries for the EntityQueries namespace. prefix = 'q_' cls._q_instancemethod_names = cls.get_method_names( prefix, isinstancemethod) cls._q_selectionmethod_names = cls.get_method_names( prefix, isselectionmethod) # Remember transactions for the EntityTransactions namespace. prefix = 't_' cls._t_instancemethod_names = cls.get_method_names( prefix, isinstancemethod) cls._t_selectionmethod_names = cls.get_method_names( prefix, isselectionmethod) # Remember views for the EntityViews namespace. prefix = 'v_' cls._v_instancemethod_names = cls.get_method_names( prefix, isinstancemethod) cls._v_selectionmethod_names = cls.get_method_names( prefix, isselectionmethod) # Remember x_methods for the EntityExtenders namespace. prefix = 'x_' cls._x_instancemethod_names = cls.get_method_names( prefix, isinstancemethod) cls._x_selectionmethod_names = cls.get_method_names( prefix, isselectionmethod) # Add this class to the schema. cls.update_schema(class_name)