Beispiel #1
0
 def target(self, before_filter):
     from bpmappers.fields import DelegateField
     return DelegateField(DummyMapper, before_filter=before_filter)
Beispiel #2
0
 def target(self):
     from bpmappers.fields import DelegateField
     return DelegateField(DummyMapper, required=False)
Beispiel #3
0
 def __new__(cls, name, bases, attrs):
     if '_meta' not in attrs:
         opt = Options()
         attrs['_meta'] = opt
     else:
         opt = attrs['_meta']
     # BaseMapperの処理が後に来るので
     # ここで先にoptを拡張する
     mapper_meta = attrs.get('Meta')
     if mapper_meta is not None:
         model = getattr(mapper_meta, 'model', None)
         # Meta.mapper_fields
         mapper_fields = getattr(mapper_meta, 'mapper_fields', None)
         defined_fields = DEFINED_MODEL_MAPPER_FIELDS.copy()
         if mapper_fields:
             defined_fields.update(mapper_fields)
         # Meta.modelが無い場合はエラー
         if model is None:
             raise MetaModelError
         for model_field in model._meta.fields + model._meta.many_to_many:
             # Meta.fields
             if hasattr(mapper_meta, 'fields'):
                 if mapper_meta.fields is not None \
                         and model_field.name not in mapper_meta.fields:
                     continue
             # Meta.exclude
             if hasattr(mapper_meta, 'exclude'):
                 if mapper_meta.exclude is not None \
                         and model_field.name in mapper_meta.exclude:
                     continue
             # モデルのフィールドに対応したField追加
             if model_field.remote_field:
                 # 同じモデルを参照しようとした場合はスキップする
                 if model == model_field.remote_field.model:
                     continue
                 if isinstance(model_field, models.ForeignKey):
                     # ForeignKey
                     related_model_mapper = create_model_mapper(
                         model_field.remote_field.model,
                         model_mapper_fields=mapper_fields)
                     opt.add_field(
                         model_field.name,
                         DelegateField(related_model_mapper,
                                       key=model_field.name,
                                       required=not model_field.null))
                 elif isinstance(model_field, models.ManyToManyField):
                     # ManyToManyField
                     related_model_mapper = create_model_mapper(
                         model_field.remote_field.model,
                         model_mapper_fields=mapper_fields)
                     opt.add_field(
                         model_field.name,
                         ListDelegateField(
                             related_model_mapper,
                             key=model_field.name,
                             filter=lambda manager: manager.all()))
             else:
                 for defined_field in defined_fields:
                     if isinstance(model_field, defined_field):
                         mapper_field = defined_fields[defined_field]
                         opt.add_field(model_field.name,
                                       mapper_field(key=model_field.name))
                         break
                 else:
                     # If there is no match field, use default.
                     opt.add_field(
                         model_field.name,
                         DEFAULT_MAPPER_FIELD(key=model_field.name))
     attrs['_meta'] = opt
     return BaseMapper.__new__(cls, name, bases, attrs)