def parse_dept(self, part, company=None, optional=False, with_aka=False): r'''Parse a department and connect it to its parent organisation. ''' if optional and 'de' not in part and 'de-' not in part: return None if 'de' in part: name = multilang.optparse(part.getvalue('de')) is_head = True else: name = multilang.optparse(part.getvalue('de-')) is_head = False aka = [] if with_aka: aka = list(map(multilang.optparse, part.mgetvalue('aka', []))) prefer = sorted([name] + aka, key=lambda s: s.loc())[0] dept = self.model.register(Department(name=name, aka=aka, prefer=prefer)) dept.place = part.place if not company: company = yield from self.find(Company, part.getvalue('of')) try: Has_department(company, dept, is_head=is_head) except ValueError as e: raise InputError(e, line=name) return dept
def parse_company_or_dept(self, part, optional=False): r'''Parse a company and/or any department thereof. ''' company = None if 'co' in part: name = multilang.optparse(part.getvalue('co')) aka = list(map(multilang.optparse, part.mgetvalue('aka', []))) # The preferred name is the one that appears first in the input. prefer = sorted([name] + aka, key=lambda s: s.loc())[0] company = self.model.register(Company(name=name, aka=aka, prefer=prefer)) company.place = part.place dept = yield from self.parse_dept(part, company, optional=company or optional, with_aka=not company) org = dept or company if not org and not optional: raise InputError('missing company or department', line=part) return org
def make_assoc(self, part, who, oth, ltype, timestamp=None, is_head=None): r'''Create an Associate_with link (or subtype) between two nodes, with suitable constructor data. ''' assert issubclass(ltype, Association) # Here we introspect the keyword args accepted by ltype's constructor # and adapt accordingly. kw = {'timestamp': timestamp} if is_head is not None: kw['is_head'] = is_head if part: import inspect kwa = dict.fromkeys(inspect.getargspec(ltype.__init__)[0]) if ('is_head' in kwa and hasattr(part, 'delim') and 'is_head' not in kw): kw['is_head'] = part.delim != '-' if 'sequence' in kwa and hasattr(part, 'sequence'): kw['sequence'] = part.sequence if 'position' in kwa and 'pos' in part: kw['position'] = multilang.optparse(part.getvalue('pos')) return ltype(who, oth, **kw)