787 entity, rels = self.metagen.base_etype_dicts(etype) |
787 entity, rels = self.metagen.base_etype_dicts(etype) |
788 # make a copy to keep cached entity pristine |
788 # make a copy to keep cached entity pristine |
789 entity = copy(entity) |
789 entity = copy(entity) |
790 entity.cw_edited = copy(entity.cw_edited) |
790 entity.cw_edited = copy(entity.cw_edited) |
791 entity.cw_clear_relation_cache() |
791 entity.cw_clear_relation_cache() |
792 self.metagen.init_entity(entity) |
|
793 entity.cw_edited.update(kwargs, skipsec=False) |
792 entity.cw_edited.update(kwargs, skipsec=False) |
|
793 entity_source, extid = self.metagen.init_entity(entity) |
794 cnx = self._cnx |
794 cnx = self._cnx |
795 self.source.add_entity(cnx, entity) |
795 self.source.add_entity(cnx, entity) |
796 self.source.add_info(cnx, entity, self.source, None) |
796 self.source.add_info(cnx, entity, entity_source, extid) |
797 kwargs = dict() |
797 kwargs = dict() |
798 if inspect.getargspec(self.add_relation).keywords: |
798 if inspect.getargspec(self.add_relation).keywords: |
799 kwargs['subjtype'] = entity.cw_etype |
799 kwargs['subjtype'] = entity.cw_etype |
800 for rtype, targeteids in rels.iteritems(): |
800 for rtype, targeteids in rels.iteritems(): |
801 # targeteids may be a single eid or a list of eids |
801 # targeteids may be a single eid or a list of eids |
834 META_RELATIONS = (META_RTYPES |
834 META_RELATIONS = (META_RTYPES |
835 - VIRTUAL_RTYPES |
835 - VIRTUAL_RTYPES |
836 - set(('eid', 'cwuri', |
836 - set(('eid', 'cwuri', |
837 'is', 'is_instance_of', 'cw_source'))) |
837 'is', 'is_instance_of', 'cw_source'))) |
838 |
838 |
839 def __init__(self, cnx, baseurl=None): |
839 def __init__(self, cnx, baseurl=None, source=None): |
840 self._cnx = cnx |
840 self._cnx = cnx |
841 self.source = cnx.repo.system_source |
|
842 self.time = datetime.now() |
|
843 if baseurl is None: |
841 if baseurl is None: |
844 config = cnx.vreg.config |
842 config = cnx.vreg.config |
845 baseurl = config['base-url'] or config.default_base_url() |
843 baseurl = config['base-url'] or config.default_base_url() |
846 if not baseurl[-1] == '/': |
844 if not baseurl[-1] == '/': |
847 baseurl += '/' |
845 baseurl += '/' |
848 self.baseurl = baseurl |
846 self.baseurl = baseurl |
|
847 if source is None: |
|
848 source = cnx.repo.system_source |
|
849 self.source = source |
|
850 self.create_eid = cnx.repo.system_source.create_eid |
|
851 self.time = datetime.now() |
849 # attributes/relations shared by all entities of the same type |
852 # attributes/relations shared by all entities of the same type |
850 self.etype_attrs = [] |
853 self.etype_attrs = [] |
851 self.etype_rels = [] |
854 self.etype_rels = [] |
852 # attributes/relations specific to each entity |
855 # attributes/relations specific to each entity |
853 self.entity_attrs = ['cwuri'] |
856 self.entity_attrs = ['cwuri'] |
879 if genfunc: |
882 if genfunc: |
880 rels[rel] = genfunc(entity) |
883 rels[rel] = genfunc(entity) |
881 return entity, rels |
884 return entity, rels |
882 |
885 |
883 def init_entity(self, entity): |
886 def init_entity(self, entity): |
884 entity.eid = self.source.create_eid(self._cnx) |
887 entity.eid = self.create_eid(self._cnx) |
|
888 extid = entity.cw_edited.get('cwuri') |
885 for attr in self.entity_attrs: |
889 for attr in self.entity_attrs: |
886 if attr in entity.cw_edited: |
890 if attr in entity.cw_edited: |
887 # already set, skip this attribute |
891 # already set, skip this attribute |
888 continue |
892 continue |
889 genfunc = self.generate(attr) |
893 genfunc = self.generate(attr) |
890 if genfunc: |
894 if genfunc: |
891 entity.cw_edited.edited_attribute(attr, genfunc(entity)) |
895 entity.cw_edited.edited_attribute(attr, genfunc(entity)) |
|
896 if isinstance(extid, unicode): |
|
897 extid = extid.encode('utf-8') |
|
898 return self.source, extid |
892 |
899 |
893 def generate(self, rtype): |
900 def generate(self, rtype): |
894 return getattr(self, 'gen_%s' % rtype, None) |
901 return getattr(self, 'gen_%s' % rtype, None) |
895 |
902 |
896 def gen_cwuri(self, entity): |
903 def gen_cwuri(self, entity): |