From 8efe6eb55e83c77b6ee33faf3bf437792c8d2b3c Mon Sep 17 00:00:00 2001 From: Ismael Carnales Date: Wed, 26 Aug 2009 11:38:49 -0300 Subject: [PATCH] made DjangoItem a descendant of Item and its metaclass --- scrapy/contrib_exp/djangoitem.py | 13 +++++-------- scrapy/item.py | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/scrapy/contrib_exp/djangoitem.py b/scrapy/contrib_exp/djangoitem.py index 22a23af14..2749c9685 100644 --- a/scrapy/contrib_exp/djangoitem.py +++ b/scrapy/contrib_exp/djangoitem.py @@ -1,7 +1,7 @@ -from scrapy.item import DictItem, Field +from scrapy.item import Field, Item, ItemMeta -class DjangoItemMeta(type): +class DjangoItemMeta(ItemMeta): def __new__(mcs, class_name, bases, attrs): cls = super(DjangoItemMeta, mcs).__new__(mcs, class_name, bases, attrs) @@ -12,17 +12,14 @@ class DjangoItemMeta(type): cls._model_meta = cls.django_model._meta for model_field in cls._model_meta.fields: # XXX: for now we're treating each PK as autogenerated field - if model_field != cls._model_meta.pk: + if model_field != cls._model_meta.pk and \ + model_field.name not in cls.fields: cls.fields[model_field.name] = Field() cls._model_fields.append(model_field.name) - # add declared fields - for n, v in attrs.iteritems(): - if isinstance(v, Field): - cls.fields[n] = v return cls -class DjangoItem(DictItem): +class DjangoItem(Item): __metaclass__ = DjangoItemMeta diff --git a/scrapy/item.py b/scrapy/item.py index f51ac35db..d34c8ea03 100644 --- a/scrapy/item.py +++ b/scrapy/item.py @@ -17,7 +17,7 @@ class Field(dict): """Container of field metadata""" -class _ItemMeta(type): +class ItemMeta(type): def __new__(mcs, class_name, bases, attrs): fields = {} @@ -81,7 +81,7 @@ class DictItem(DictMixin, BaseItem): class Item(DictItem): - __metaclass__ = _ItemMeta + __metaclass__ = ItemMeta class ScrapedItem(BaseItem):