def handle_field(self, field, model_name, app_name, **options): include_keys = options.get('include_keys') force = options.get('force') include_non_editable = options.get('include_non_editable') prepend_model_name = options.get('prepend_model_name') create_concepts = options.get('concepts') auto_publish = options.get('publish') create_categories = options.get('categories') # M2Ms do not make any sense here.. if isinstance(field, ManyToManyField): return if dep_supported('objectset'): from objectset.models import ObjectSet objectset = issubclass(field.model, ObjectSet) else: objectset = False lexicon = issubclass(field.model, Lexicon) # Lexicons and ObjectSets are represented via their primary key, so # these may pass if not objectset and not lexicon: # Check for primary key, and foreign key fields if isinstance(field, self.key_field_types) and not include_keys: print(u'({0}) {1}.{2} is a primary or foreign key. Skipping...' .format(app_name, model_name, field.name)) return # Ignore non-editable fields since in most cases they are for # managment purposes if not field.editable and not include_non_editable: print(u'({0}) {1}.{2} is not editable. Skipping...' .format(app_name, model_name, field.name)) return # All but the field name is case-insensitive, do initial lookup # to see if it already exists, skip if it does lookup = { 'app_name__iexact': app_name, 'model_name__iexact': model_name, 'field_name': field.name, } # Note, `name` is set below kwargs = { 'description': field.help_text or None, 'app_name': app_name, 'model_name': model_name.lower(), 'field_name': field.name, } if lexicon: kwargs.update({ 'label_field_name': 'label', 'order_field_name': 'order', 'code_field_name': 'code', }) elif objectset and hasattr(field.model, 'label_field'): kwargs.update({ 'label_field_name': field.model.label_field }) try: f = DataField.objects.get(**lookup) except DataField.DoesNotExist: f = DataField(published=options.get('publish'), **kwargs) if f.pk: created = False if not force: print(u'({0}) {1}.{2} already exists. Skipping...' .format(app_name, model_name, field.name)) return # Only overwrite if the source value is not falsy f.__dict__.update([(k, v) for k, v in kwargs.items()]) else: created = True if not f.name: # Use the default unicode representation of the datafield if prepend_model_name: f.name = unicode(f) else: f.name = field.verbose_name.title() # Update fields with flags f.__dict__.update(utils.get_heuristic_flags(field)) # Create category based on the model name and associate # it to the field. if create_categories: category, _ = DataCategory.objects\ .get_or_create(name=f.model._meta.verbose_name.title(), published=auto_publish) f.category = category else: category = None f.save() # Create a concept if one does not already exist for this field if create_concepts and not DataConcept.objects\ .filter(fields=f).exists(): kwargs = { 'published': auto_publish, 'category': category, } DataConcept.objects.create_from_field(f, **kwargs) return created
def handle_field(self, field, model_name, app_name, **options): include_keys = options.get('include_keys') force = options.get('force') include_non_editable = options.get('include_non_editable') prepend_model_name = options.get('prepend_model_name') create_concepts = options.get('concepts') auto_publish = options.get('publish') create_categories = options.get('categories') # M2Ms do not make any sense here.. if isinstance(field, ManyToManyField): return # Check for primary key, and foreign key fields if isinstance(field, self.key_field_types) and not include_keys: print(u'({0}) {1}.{2} is a primary or foreign key. Skipping...'. format(app_name, model_name, field.name)) return # Ignore non-editable fields since in most cases they are for # managment purposes if not field.editable and not include_non_editable: print(u'({0}) {1}.{2} is not editable. Skipping...'.format( app_name, model_name, field.name)) return # All but the field name is case-insensitive, do initial lookup # to see if it already exists, skip if it does lookup = { 'app_name__iexact': app_name, 'model_name__iexact': model_name, 'field_name': field.name, } # Note, `name` is set below kwargs = { 'description': field.help_text or None, 'app_name': app_name, 'model_name': model_name.lower(), 'field_name': field.name, } try: f = DataField.objects.get(**lookup) except DataField.DoesNotExist: f = DataField(published=options.get('publish'), **kwargs) if f.pk: created = False if not force: print(u'({0}) {1}.{2} already exists. Skipping...'.format( app_name, model_name, field.name)) return # Only overwrite if the source value is not falsy f.__dict__.update([(k, v) for k, v in kwargs.items()]) else: created = True if not f.name: # Use the default unicode representation of the datafield if prepend_model_name: f.name = unicode(f) else: f.name = field.verbose_name.title() # Update fields with flags f.__dict__.update(utils.get_heuristic_flags(field)) # Create category based on the model name and associate # it to the field. if create_categories: category, _ = DataCategory.objects\ .get_or_create(name=f.model._meta.verbose_name.title(), published=auto_publish) f.category = category else: category = None f.save() # Create a concept if one does not already exist for this field if create_concepts and not DataConcept.objects\ .filter(fields=f).exists(): kwargs = { 'published': auto_publish, 'category': category, } DataConcept.objects.create_from_field(f, **kwargs) return created