def add_alternate_domains(cls, session, msite, domains): """Add Alternate domains for a site.""" owned_domains = [md.name for md in msite.alternate_domains] for d in domains: md = session.query(AlternateDomain).filter_by(name=d).one_or_none() if md is not None: logger.error('AlternateDomain %r is already owned by site %r', d, md.site.name) return elif d in owned_domains: logger.warning('Site %r already contains the domain %r!', msite.name, d) else: msite.alternate_domains.append(AlternateDomain(name=d)) logger.info('Added %r to site %r as alternate domain', d, msite.name) session.commit()
def replace_alternate_domains(cls, session, msite, domains): """Replace alternate domains with new ones.""" owned_domains = [md.name for md in msite.alternate_domains] for d in domains: if d not in owned_domains: md = session.query(AlternateDomain).filter_by( name=d).one_or_none() if md is not None: logger.error( 'AlternateDomain %r is already owned by site %r', d, md.site.name) return else: msite.alternate_domains.append(AlternateDomain(name=d)) session.commit() for md in msite.alternate_domains: if md.name not in domains: session.delete(md) session.commit() logger.info('Replaced alternate domains of Site %r from %r to %r', msite.name, owned_domains, domains)
def get_or_create_msite(session, site, alternate_domains=[], site_tags=[], onduplicate='update'): """Get a site from table, if not exist, insert into table. This function take cares of the alternate_domains relationi (1:M) and site_tags relation (M:N). Parameters ---------- session : object An instance of SQLAlchemy Session. site : dict The site data. alternate_domains : list A list of alternate domain dict with keys 'name' and 'is_alive'. site_tags : list A list of site tag dict with keys 'name' and 'source' onduplicate : {'ignore', 'update'} How to handle duplication. """ # FIRST, check whether this site exist q = session.query(Site).filter( or_(Site.domain.like(site['domain']), Site.name.like(site['name']))).options( joinedload(Site.alternate_domains), joinedload(Site.site_tags)) msite = q.one_or_none() if msite is None: msite = Site(**site) for d in alternate_domains: mad = get_or_create_m(session, AlternateDomain, d, fb_uk='name') msite.alternate_domains.append(mad) for t in site_tags: mtag = get_or_create_m(session, SiteTag, t, fb_uk=['name', 'source']) msite.site_tags.append(mtag) session.add(msite) elif onduplicate == 'update': # UPDATE site session.query(Site).filter_by(id=msite.id).update(site) adding_domains = [d['name'] for d in alternate_domains] owned_domains = [mad.name for mad in msite.alternate_domains] # HANDLE ALTERNATE DOMAINS # delete non-need ones for mad in msite.alternate_domains: if mad.name not in adding_domains: session.delete(mad) # add new ones for d in alternate_domains: if d['name'] not in owned_domains: session.add(AlternateDomain(site_id=msite.id, **d)) # HANDLE SITE TAGS adding_tags = [(t['name'], t['source']) for t in site_tags] owned_tags = [(mt.name, mt.source) for mt in msite.site_tags] # delete non-need ones for mt in msite.site_tags: if (mt.name, mt.source) not in adding_tags: session.delete(mt) # add new ones for t in site_tags: if (t['name'], t['source']) not in owned_tags: mtag = get_or_create_m(session, SiteTag, t, fb_uk=['name', 'source']) msite.site_tags.append(mtag) try: session.commit() except IntegrityError as e: logger.exception(e) session.rollback()