Beispiel #1
0
 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()
Beispiel #2
0
 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)
Beispiel #3
0
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()