Example #1
0
    def load_plz(self, row):
        pk = row.pays.strip()
        if not pk:
            return
        name = row.nom.strip() or row.cp.strip()
        if not name:
            return

        if False:  # severe
            country = Country.objects.get(isocode=self.short2iso(pk))
            # country = Country.objects.get(short_code=pk)
        else:
            try:
                country = Country.objects.get(isocode=self.short2iso(pk))
                # country = Country.objects.get(short_code=pk)
            except Country.DoesNotExist:
                dblogger.warning("Ignored PLZ %s (with invalid country %s)",
                                 row, pk)
                return
        zip_code = row['cp'].strip()
        if Place.objects.filter(zip_code=zip_code, country=country).exists():
            dblogger.warning("Ignored PLZ %s (duplicate zip code %s-%s)", row,
                             country.isocode, zip_code)
            return

        kw = dict(
            zip_code=zip_code,
            name=name,
            country=country,
        )
        return Place(**kw)
Example #2
0
    def load_plz(self, row):
        pk = row.pays.strip()
        if not pk:
            return
        name = row.nom.strip() or row.cp.strip()
        if not name:
            return

        if False:  # severe
            country = Country.objects.get(isocode=self.short2iso(pk))
            # country = Country.objects.get(short_code=pk)
        else:
            try:
                country = Country.objects.get(isocode=self.short2iso(pk))
                # country = Country.objects.get(short_code=pk)
            except Country.DoesNotExist:
                dblogger.warning(
                    "Ignored PLZ %s (with invalid country %s)", row, pk)
                return
        zip_code = row['cp'].strip()
        if Place.objects.filter(zip_code=zip_code, country=country).exists():
            dblogger.warning(
                "Ignored PLZ %s (duplicate zip code %s-%s)",
                row, country.isocode, zip_code)
            return

        kw = dict(
            zip_code=zip_code,
            name=name,
            country=country,
        )
        return Place(**kw)
Example #3
0
def watch():
    """
    Loops through all remote calendars,
    synchronizing them with their calendar server.
    We first send local changes to the server,
    then retrieve remote changes into our database.

    Deserves more documentation.
    """
    for dbcal in Calendar.objects.filter(url_template__isnull=False):
        #~ if not dbcal.url_template:
            #~ continue
        url = dbcal.get_url()
        #~ dblogger.info("Synchronize calendar %s using %s",dbcal.name, url)
        dblogger.info("Synchronize calendar %s...", dbcal.name)

        client = caldav.DAVClient(url)
        principal = caldav.Principal(client, url)
        #~ print "url.username:"******"url.hostname:", principal.url.hostname

        calendars = principal.calendars()
        if len(calendars) == 0:
            dblogger.info("--> Sorry, no calendar")
        elif len(calendars) > 1:
            #~ print "WARNING: more than 1 calendar"
            dblogger.warning("--> More than 1 calendar")
        else:
            send(dbcal, calendars[0], client)
            receive(dbcal, calendars[0])
Example #4
0
def pxs2person(row, person):

    kw = {}
    store(
        kw,
        card_number=row['CARDNUMBER'],
        card_type=row.get('CARDTYPE', ''),  # 20110110
        card_issuer=row.get('CARDISSUER', ''),  # 20110110
        noble_condition=row.get('NOBLEECOND', ''),  # 20110110
        birth_place=row.get('BIRTHPLACE', ''),
        remarks2=row.get('MEMO', ''),
        gender=convert_sex(row['SEXE']))
    for k, v in kw.items():
        setattr(person, k, v)

    par2person(row, person)

    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])
Example #5
0
def watch():
    """
    Loops through all remote calendars, 
    synchronizing them with their calendar server.
    We first send local changes to the server, 
    then retrieve remote changes into our database.
    
    Deserves more documentation.
    """
    for dbcal in Calendar.objects.filter(url_template__isnull=False):
        #~ if not dbcal.url_template:
            #~ continue
        url = dbcal.get_url()
        #~ dblogger.info("Synchronize calendar %s using %s",dbcal.name, url)
        dblogger.info("Synchronize calendar %s...", dbcal.name)

        client = caldav.DAVClient(url)
        principal = caldav.Principal(client, url)
        #~ print "url.username:"******"url.hostname:", principal.url.hostname

        calendars = principal.calendars()
        if len(calendars) == 0:
            dblogger.info("--> Sorry, no calendar")
        elif len(calendars) > 1:
            #~ print "WARNING: more than 1 calendar"
            dblogger.warning("--> More than 1 calendar")
        else:
            send(dbcal, calendars[0], client)
            receive(dbcal, calendars[0])
Example #6
0
def pxs2person(row, person):

    kw = {}
    store(kw,
          card_number=row['CARDNUMBER'],
          card_issuer=row.get('CARDISSUER', ''),      # 20110110
          noble_condition=row.get('NOBLEECOND', ''),      # 20110110
          birth_place=row.get('BIRTHPLACE', ''),
          remarks2=row.get('MEMO', ''),
          gender=convert_sex(row['SEXE'])
          )
    for k, v in kw.items():
        setattr(person, k, v)

    par2person(row, person)

    if row.has_key('CARDTYPE'):
        #~ row.card_type = BeIdCardTypes.items_dict.get(row['CARDTYPE'].strip(),'')
        from lino_welfare.modlib.pcsw import models as pcsw
        if row['CARDTYPE'] == 0:
            person.card_type = BeIdCardTypes.blank_item
        else:
            person.card_type = BeIdCardTypes.get_by_value(str(row['CARDTYPE']))
    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])
Example #7
0
def pxs2person(row, person):

    kw = {}
    store(kw,
          card_number=row['CARDNUMBER'],
          card_type=row.get('CARDTYPE', ''),      # 20110110
          card_issuer=row.get('CARDISSUER', ''),      # 20110110
          noble_condition=row.get('NOBLEECOND', ''),      # 20110110
          birth_place=row.get('BIRTHPLACE', ''),
          remarks2=row.get('MEMO', ''),
          gender=convert_sex(row['SEXE'])
          )
    for k, v in kw.items():
        setattr(person, k, v)

    par2person(row, person)

    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])
Example #8
0
def code2user(pk, offset=0):
    if not pk:
        return None
    pk = int(pk) + offset
    try:
        return User.objects.get(id=pk)
    except User.DoesNotExist:
        dblogger.warning("Unkown user %r", pk)
Example #9
0
def country2kw(row, kw):
    # for both PAR and ADR

    if row.has_key('PROF'):
        activity = row['PROF']
        if activity:
            try:
                activity = int(activity)
            except ValueError:
                dblogger.debug("Ignored invalid value PROF = %r", activity)
            else:
                if activity:
                    try:
                        activity = Activity.objects.get(pk=activity)
                    except Activity.DoesNotExist:
                        activity = Activity(id=activity,
                                            name=unicode(activity))
                        activity.save(force_insert=True)
                    kw.update(activity=activity)

    country = row['PAYS']
    if country:
        try:
            country = Country.objects.get(short_code__exact=country)
        except Country.DoesNotExist:
            country = Country(isocode=country,
                              name=country,
                              short_code=country)
            country.save()
        kw.update(country=country)

    store(
        kw,
        phone=row['TEL'],
        fax=row['FAX'],
        email=row['EMAIL'],
    )

    kw.update(street2kw(join_words(row['RUE'], row['RUENUM'], row['RUEBTE'])))

    zip_code = row['CP']
    if zip_code:
        kw.update(zip_code=zip_code)
        try:
            city = Place.objects.get(
                country=country,
                zip_code__exact=zip_code,
            )
            kw.update(city=city)
        except Place.DoesNotExist, e:
            city = Place(zip_code=zip_code, name=zip_code, country=country)
            city.save()
            kw.update(city=city)
            #~ logger.warning("%s-%s : %s",row['PAYS'],row['CP'],e)
        except Place.MultipleObjectsReturned, e:
            dblogger.warning("%s-%s : %s", row['PAYS'], row['CP'], e)
Example #10
0
def country2kw(row, kw):
    # for both PAR and ADR

    if row.has_key('PROF'):
        activity = row['PROF']
        if activity:
            try:
                activity = int(activity)
            except ValueError:
                dblogger.debug("Ignored invalid value PROF = %r", activity)
            else:
                if activity:
                    try:
                        activity = Activity.objects.get(pk=activity)
                    except Activity.DoesNotExist:
                        activity = Activity(
                            id=activity, name=unicode(activity))
                        activity.save(force_insert=True)
                    kw.update(activity=activity)

    country = row['PAYS']
    if country:
        try:
            country = Country.objects.get(short_code__exact=country)
        except Country.DoesNotExist:
            country = Country(isocode=country, name=country,
                              short_code=country)
            country.save()
        kw.update(country=country)

    email = row['EMAIL']
    if email and is_valid_email(email):
        kw.update(email=email)
    store(kw,
          phone=row['TEL'],
          fax=row['FAX'],
          )

    kw.update(street2kw(join_words(row['RUE'], row['RUENUM'], row['RUEBTE'])))

    zip_code = row['CP']
    if zip_code:
        kw.update(zip_code=zip_code)
        try:
            city = Place.objects.get(
                country=country,
                zip_code__exact=zip_code,
            )
            kw.update(city=city)
        except Place.DoesNotExist, e:
            city = Place(zip_code=zip_code, name=zip_code, country=country)
            city.save()
            kw.update(city=city)
            #~ dblogger.warning("%s-%s : %s",row['PAYS'],row['CP'],e)
        except Place.MultipleObjectsReturned, e:
            dblogger.warning("%s-%s : %s", row['PAYS'], row['CP'], e)
Example #11
0
 def load_fnl(self, row, **kw):
     jnl, year, number = row2jnl(row)
     if jnl is None:
         dblogger.info("No journal %s (%s)", row.idjnl, row)
         return
     if year < START_YEAR:
         return
     doc = self.FINDICT.get((jnl, year, number))
     if doc is None:
         raise Exception("FNL %r without document" %
                         list(jnl, year, number))
     try:
         kw.update(seqno=int(row.line.strip()))
     except ValueError:
         pass  # some lines contain "***"
     if row.date:
         kw.update(date=row.date)
     try:
         if row.idctr == ('V'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.sales.get_main_account())
         elif row.idctr == ('E'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.purchases.get_main_account())
         elif row.idctr == ('G'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.wages.get_main_account())
         elif row.idctr == ('S'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.clearings.get_main_account())
         else:
             a = Account.objects.get(ref=row.idcpt.strip())
             kw.update(account=a)
         kw.update(amount=mton(row.mont, ZERO))
         kw.update(dc=self.dc2lino(row.dc))
     except Exception as e:
         dblogger.warning(
             "Failed to load FNL line %s from %s : %s", row, kw, e)
         raise
     try:
         kw.update(match=row.match.strip())
         item = doc.add_voucher_item(**kw)
         # match = row.match.strip()
         # if match:
         #     lst = self.must_match.setdefault(match, [])
         #     lst.append((doc, item))
         #     # self.must_match.append((doc, item, match))
         return item
     except Exception as e:
         dblogger.warning(
             "Failed to load FNL line %s from %s : %s", row, kw, e)
Example #12
0
 def load_fnl(self, row, **kw):
     jnl, year, number = row2jnl(row)
     if jnl is None:
         dblogger.info("No journal %s (%s)", row.idjnl, row)
         return
     if year < START_YEAR:
         return
     doc = self.FINDICT.get((jnl, year, number))
     if doc is None:
         raise Exception("FNL %r without document" %
                         list(jnl, year, number))
     try:
         kw.update(seqno=int(row.line.strip()))
     except ValueError:
         pass  # some lines contain "***"
     if row.date:
         kw.update(date=row.date)
     try:
         if row.idctr == ('V'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.sales.get_partner_account())
         elif row.idctr == ('E'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.purchases.get_partner_account())
         elif row.idctr == ('G'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.wages.get_partner_account())
         elif row.idctr == ('S'):
             kw.update(partner_id=self.par_pk(row.idcpt.strip()))
             kw.update(
                 account=vat.TradeTypes.clearings.get_partner_account())
         else:
             a = Account.objects.get(ref=row.idcpt.strip())
             kw.update(account=a)
         kw.update(amount=mton(row.mont, ZERO))
         kw.update(dc=self.dc2lino(row.dc))
     except Exception as e:
         dblogger.warning(
             "Failed to load FNL line %s from %s : %s", row, kw, e)
         raise
     try:
         kw.update(match=row.match.strip())
         item = doc.add_voucher_item(**kw)
         # match = row.match.strip()
         # if match:
         #     lst = self.must_match.setdefault(match, [])
         #     lst.append((doc, item))
         #     # self.must_match.append((doc, item, match))
         return item
     except Exception as e:
         dblogger.warning(
             "Failed to load FNL line %s from %s : %s", row, kw, e)
Example #13
0
 def old_validate_and_save(self, obj):
     "Deserves more documentation."
     try:
         obj.full_clean()
         # ~ 20120921 dblogger.log_changes(REQUEST,obj)
         obj.save()
     except ValidationError, e:
         # here we only log an dd.obj2str() of the object
         # full traceback will be logged in watch() after process_line()
         dblogger.warning("Validation failed for %s : %s", dd.obj2str(obj), e)
         raise  # re-raise (propagate) exception with original traceback
Example #14
0
def load_P_(row):
    kw = {}
    #~ kw.update(street2kw(join_words(row['RUE'],row['RUENUM'],row['RUEBTE'])))
    store(kw, last_name=row['AN'])
    store(kw, first_name=row['AP'])
    store(kw, crl=CRL(row['P'].encode('cp437')))
    #~ store(kw,crl=crl2hex(row['P']))
    OU = row['OU']
    if OU:
        kw.update(street2kw(OU))
    title = row['PQ']
    if title:
        if title == 'Mme':
            kw.update(language='fr', gender=dd.Genders.female)
        elif title == 'Mlle':
            kw.update(language='fr', gender=dd.Genders.female)
        elif title == 'M.':
            kw.update(language='fr', gender=dd.Genders.male)
        elif title == 'dHr':
            kw.update(language='nl', gender=dd.Genders.male)
        elif title == 'Mvw':
            kw.update(language='nl', gender=dd.Genders.female)
        elif title == 'Mr':
            kw.update(language='en', gender=dd.Genders.male)
        elif title == 'Mrs':
            kw.update(language='en', gender=dd.Genders.female)
        elif title == 'Hrrn':
            kw.update(language='de', gender=dd.Genders.male)
        elif title == 'Fr':
            kw.update(language='de', gender=dd.Genders.female)
        elif title == 'Fr.':
            kw.update(language='fr', gender=dd.Genders.male, title=u"Frère")
        elif title == 'Frl':
            kw.update(language='de', gender=dd.Genders.female)
        elif title == 'Bx':
            kw.update(gender=dd.Genders.male, title="Bx")
        elif title == 'Bse':
            kw.update(gender=dd.Genders.female, title="Bse")
        elif title == 'St':
            kw.update(gender=dd.Genders.male, title="St")
        elif title == 'Ste':
            kw.update(gender=dd.Genders.female, title="Ste")
        else:
            dblogger.warning("Ignored PQ value %r" % title)

    a = parsedate(row['T'])
    if a:
        kw.update(birth_date=a[0], birth_date_circa=a[1])
    a = parsedate(row['T'])
    if a:
        kw.update(died_date=a[0])
        if a[1]:
            logger.warning("Ignored 'circa' flag for died_date")
    return Person(**kw)
Example #15
0
def load_P_(row):
    kw = {}
    #~ kw.update(street2kw(join_words(row['RUE'],row['RUENUM'],row['RUEBTE'])))
    store(kw, last_name=row['AN'])
    store(kw, first_name=row['AP'])
    store(kw, crl=CRL(row['P'].encode('cp437')))
    #~ store(kw,crl=crl2hex(row['P']))
    OU = row['OU']
    if OU:
        kw.update(street2kw(OU))
    title = row['PQ']
    if title:
        if title == 'Mme':
            kw.update(language='fr', gender=dd.Genders.female)
        elif title == 'Mlle':
            kw.update(language='fr', gender=dd.Genders.female)
        elif title == 'M.':
            kw.update(language='fr', gender=dd.Genders.male)
        elif title == 'dHr':
            kw.update(language='nl', gender=dd.Genders.male)
        elif title == 'Mvw':
            kw.update(language='nl', gender=dd.Genders.female)
        elif title == 'Mr':
            kw.update(language='en', gender=dd.Genders.male)
        elif title == 'Mrs':
            kw.update(language='en', gender=dd.Genders.female)
        elif title == 'Hrrn':
            kw.update(language='de', gender=dd.Genders.male)
        elif title == 'Fr':
            kw.update(language='de', gender=dd.Genders.female)
        elif title == 'Fr.':
            kw.update(language='fr', gender=dd.Genders.male, title=u"Frère")
        elif title == 'Frl':
            kw.update(language='de', gender=dd.Genders.female)
        elif title == 'Bx':
            kw.update(gender=dd.Genders.male, title="Bx")
        elif title == 'Bse':
            kw.update(gender=dd.Genders.female, title="Bse")
        elif title == 'St':
            kw.update(gender=dd.Genders.male, title="St")
        elif title == 'Ste':
            kw.update(gender=dd.Genders.female, title="Ste")
        else:
            dblogger.warning("Ignored PQ value %r" % title)

    a = parsedate(row['T'])
    if a:
        kw.update(birth_date=a[0], birth_date_circa=a[1])
    a = parsedate(row['T'])
    if a:
        kw.update(died_date=a[0])
        if a[1]:
            logger.warning("Ignored 'circa' flag for died_date")
    return Person(**kw)
Example #16
0
def try_full_clean(i):
    while True:
        try:
            i.full_clean()
        except ValidationError as e:
            if not hasattr(e, "message_dict"):
                raise
            for k in e.message_dict.keys():
                fld = i._meta.get_field(k)
                v = getattr(i, k)
                setattr(i, k, fld.default)
                dblogger.warning("%s : ignoring value %r for %s : %s", obj2str(i), v, k, e)
        return
Example #17
0
def get_by_id(model, pk, offset=0, warn=True):
    if not pk:
        return None
    pk = int(pk)
    if pk == 0:
        return None
    try:
        return model.objects.get(pk=pk + offset)
    except model.DoesNotExist:
        if warn:
            dblogger.warning("%s %r does not exist?!",
                             full_model_name(model), pk)
        return None
Example #18
0
def parsedate(T):
    if not T: return
    T = T.replace('.','')
    try:
        if len(T) == 4:
            return (datetime.date(int(T),6,30),True)
        elif len(T) == 6:
            return (datetime.date(int(T[:4]),int(T[4:6]),15),True)
        elif len(T) == 8:
            return (datetime.date(int(T[:4]),int(T[4:6]),int(T[6:])),False)
    except ValueError:
        pass
    dblogger.warning("Ignored invalid date value %r" % T)
Example #19
0
def parsedate(T):
    if not T:
        return
    T = T.replace('.', '')
    try:
        if len(T) == 4:
            return (datetime.date(int(T), 6, 30), True)
        elif len(T) == 6:
            return (datetime.date(int(T[:4]), int(T[4:6]), 15), True)
        elif len(T) == 8:
            return (datetime.date(int(T[:4]), int(T[4:6]), int(T[6:])), False)
    except ValueError:
        pass
    dblogger.warning("Ignored invalid date value %r" % T)
Example #20
0
def try_full_clean(i):
    while True:
        try:
            i.full_clean()
        except ValidationError, e:
            if not hasattr(e, 'message_dict'):
                raise
            for k in e.message_dict.keys():
                fld = i._meta.get_field(k)
                v = getattr(i, k)
                setattr(i, k, fld.default)
                dblogger.warning("%s : ignoring value %r for %s : %s",
                                 obj2str(i), v, k, e)
        return
Example #21
0
    def DELETE(self, **kw):
        obj = self.get_object(kw)
        if obj is None:
            dblogger.warning("%s:%s : DELETE failed (does not exist)", kw["alias"], kw["id"])
            return
        msg = obj.disable_delete(REQUEST)
        if msg:
            dblogger.warning("%s:%s : DELETE failed: %s", kw["alias"], kw["id"], msg)
            return

        # ~ 20120921 dblogger.log_deleted(REQUEST,obj)
        dd.pre_ui_delete.send(sender=obj, request=REQUEST)
        # ~ changes.log_delete(REQUEST,obj)
        obj.delete()
        dblogger.info("%s:%s (%s) : DELETE ok", kw["alias"], kw["id"], dd.obj2str(obj))
Example #22
0
def k2iso(dd, k, ddname):
    if not k:
        return None
    k = int(k)
    if k == 0:
        return None
    country_id = dd.get(k)
    if country_id is None:
        dblogger.warning("Unknown %s id %s", ddname, k)
        return None
    if len(country_id) == 2:
        return country_id
    if len(country_id) == 4 and country_id == country_id.upper():
        return country_id
    dblogger.warning("Invalid %s code %s -> %r", ddname, k, country_id)
Example #23
0
    def row2obj(self, row):
        kw = {}
        kw.update(id=int(row['IDTypeDeContratCPAS']))
        #~ ctype = int(row['IDTypeContrat'])
        #~ if ctype:
            #~ kw.update(type=ContractType.objects.get(pk=ctype+ OFFSET_CONTRACT_TYPE_CPAS))
        kw.update(applies_from=self.parsedate(row[u'DateDebut']))
        kw.update(applies_until=self.parsedate(row[u'DateFin']))
        kw.update(person=get_by_id(Person, row[u'IDClient'], OFFSET_PERSON))

        ct = get_by_id(isip.ContractType, row['IDTypeContrat'])
        kw.update(type=ct)
        if not ct:
            dblogger.warning(
                "Ignored TBTypeDeContratCPAS %s : no contract type", row)
        else:
            yield self.model(**kw)
Example #24
0
 def load_art(self, row, **kw):
     # try:
     #     pk = int(row.idart)
     # except ValueError as e:
     #     dblogger.warning("Ignored %s: %s", row, e)
     #     # return
     idart = row.idart.strip()
     if not idart:
         dblogger.warning("Ignored %s: ART->IdArt is empty", row)
         return
     kw.update(ref=idart)
     # if pk == 0:
     #     pk = 1000  # mysql doesn't accept value 0
     # kw.update(id=pk)
     self.babel2kw('name', 'name', row, kw)
     # dblogger.info("20140823 product %s", kw)
     kw.setdefault('name', idart)
     return products.Product(**kw)
Example #25
0
 def load_art(self, row, **kw):
     # try:
     #     pk = int(row.idart)
     # except ValueError as e:
     #     dblogger.warning("Ignored %s: %s", row, e)
     #     # return
     idart = row.idart.strip()
     if not idart:
         dblogger.warning("Ignored %s: ART->IdArt is empty", row)
         return
     kw.update(ref=idart)
     # if pk == 0:
     #     pk = 1000  # mysql doesn't accept value 0
     # kw.update(id=pk)
     self.babel2kw('name', 'name', row, kw)
     # dblogger.info("20140823 product %s", kw)
     kw.setdefault('name', idart)
     return products.Product(**kw)
Example #26
0
 def load_plz(self, row):
     pk = row.pays.strip()
     if not pk:
         return
     name = row.nom.strip() or row.cp.strip()
     if not name:
         return
     
     if False: # severe
         country = Country.objects.get(isocode=self.short2iso(pk))
         #~ country = Country.objects.get(short_code=pk)
     else:
         try:
             country = Country.objects.get(isocode=self.short2iso(pk))
             #~ country = Country.objects.get(short_code=pk)
         except Country.DoesNotExist,e:
             dblogger.warning("Ignored PLZ record %s" % row)
             return
Example #27
0
def plp2lino(plptype, p, c):
    if plptype.endswith('R'):
        return
    if plptype == '01':
        role = R_CHILD
    elif plptype == '02':
        role = R_COHABITANT
    elif plptype == '03':
        role = R_ADOPTED
    elif plptype == '04':
        role = R_RELATIVE
    elif plptype == '10':
        role = R_MARRIED
    elif plptype == '11':
        role = R_PARTNER
    else:
        raise Exception("Invalid link type %r" % plptype)
    
    # Is there a household where the parent of this relation is no a
    # child?
    members = Member.objects.filter(
        person=p.person).exclude(role__in=child_roles)
    if members.count() == 0:
        hh = Household(type=T_FAMILY, name=p.person.last_name)
        hh.full_clean()
        hh.save()
        dblogger.debug(
            "Created household %s from PLP `%s is %s of %s`",
            hh, p, role, c)
        obj = Member(household=hh, role=R_CHEF, person=p.person)
        obj.full_clean()
        obj.save()
    elif members.count() == 1:
        hh = members[0].household
    else:
        msg = "Found more than 1 household for parent %r" % p
        # raise Exception(msg)
        dblogger.warning(msg)
        return
        
    obj = Member(household=hh, role=role, person=c.person)
    obj.full_clean()
    obj.save()
    dblogger.info("Created %s as %s", obj.person, obj.role)
Example #28
0
    def row2obj(self, row):
        #~ dblogger.info("statut = %s",row['Statut'])

        kw = {}
        kw.update(id=int(row['IDMiseEmplois']))

        job = None

        function = get_by_id(jobs.Function, row['IDDetailFonction'])
        sector = get_by_id(jobs.Sector, row['IdQualification'])
        person = get_by_id(Person, row[u'IDClient'], OFFSET_PERSON)
        provider = get_by_id(jobs.JobProvider,
                             row[u'IDEndroitMiseAuTravail'], OFFSET_JOBPROVIDER)
        ct = get_by_id(jobs.ContractType, row['IDTypeMiseEmplois'])
        jt = get_by_id(jobs.JobType, row['IDSubside'])
        #~ job = get_or_create_job(provider,ct,jt,sector,function)

        statut = row['Statut']
        if statut == "Fiche Candidature" or ct is None:
            if ct is not None:
                dblogger.warning(
                    "TBMiseEmplois %s : ignored contract type", row)
            kw.update(person=person)
            kw.update(function=function)
            kw.update(sector=sector)
            #~ kw.update(job=job)
            yield jobs.Wish(**kw)
        elif statut in (u'En Attente', u'En Cours', u'Terminé'):
            kw.update(applies_from=self.parsedate(row[u'DebutContrat']))
            kw.update(applies_until=self.parsedate(row[u'FinContrat']))
            kw.update(type=ct)
            #~ kw.update(job=job)
            kw.update(user=get_by_id(User, row[u'IDASISP'], OFFSET_USER_ISP))
            kw.update(user_asd=get_by_id(User, row[u'IDASSSG']))
            kw.update(provider=provider)
            kw.update(person=person)
            kw.update(remark=u"""
            Bareme: %(Bareme)s
            ArticleBudgetaireSPPPSalaire: %(ArticleBudgetaireSPPPSalaire)s
            """ % row)
            yield jobs.Contract(**kw)
        else:
            dblogger.warning(
                "Ignored TBMiseEmplois %s : unknown statut %r", row, statut)
Example #29
0
 def PUT(self, **kw):
     # ~ dblogger.info("%s.PUT(%s)",self.__class__.__name__,kw)
     obj = self.get_object(kw)
     if obj is None:
         if self.allow_put2post:
             dblogger.info("%s:%s : PUT becomes POST", kw["alias"], kw["id"])
             kw["method"] = "POST"
             return self.POST(**kw)
         else:
             dblogger.warning("%s:%s : PUT ignored (row does not exist)", kw["alias"], kw["id"])
             return
     watcher = ChangeWatcher(obj)
     if self.PUT_special(watcher, **kw):
         return
     self.set_timestamp(kw["time"])
     self.applydata(obj, kw["data"])
     dblogger.info("%s:%s (%s) : PUT %s", kw["alias"], kw["id"], dd.obj2str(obj), kw["data"])
     self.validate_and_save(obj)
     watcher.send_update(REQUEST)
Example #30
0
def country2kw(row, kw):
    # for both PAR and ADR

    if row.has_key("PROF"):
        activity = row["PROF"]
        if activity:
            try:
                activity = int(activity)
            except ValueError:
                dblogger.info("Ignored invalid value PROF = %r", activity)
            else:
                if activity:
                    try:
                        activity = pcsw.Activity.objects.get(pk=activity)
                    except pcsw.Activity.DoesNotExist:
                        activity = pcsw.Activity(id=activity, name=unicode(activity))
                        activity.save(force_insert=True)
                    kw.update(activity=activity)

    country = row["PAYS"]
    if country:
        try:
            country = Country.objects.get(short_code__exact=country)
        except Country.DoesNotExist:
            country = Country(isocode=country, name=country, short_code=country)
            country.save()
        kw.update(country=country)

        zip_code = row["CP"]
        if zip_code:
            kw.update(zip_code=zip_code)
            try:
                city = Place.objects.get(country=country, zip_code__exact=zip_code)
                kw.update(city=city)
            except Place.DoesNotExist, e:
                city = Place(zip_code=zip_code, name=zip_code, country=country)
                city.save()
                kw.update(city=city)
                # ~ dblogger.warning("%s-%s : %s",row['PAYS'],row['CP'],e)
            except Place.MultipleObjectsReturned, e:
                dblogger.warning("%s-%s : %s", row["PAYS"], row["CP"], e)
Example #31
0
def load_dbf(dbpath, tableName, load):
    fn = os.path.join(dbpath, '%s.DBF' % tableName)
    f = dbfreader.DBFFile(fn, codepage="cp850")
    dblogger.info("Loading %d records from %s...", len(f), fn)
    f.open()
    for dbfrow in f:
        i = load(dbfrow)
        if i is not None:
            i = settings.TIM2LINO_LOCAL(tableName, i)
            if i is not None:

                try_full_clean(i)

                try:
                    i.save()
                    #~ dblogger.debug("%s has been saved",i)
                except Exception, e:
                #~ except IntegrityError,e:
                    dblogger.warning(
                        "Failed to save %s from %s : %s", obj2str(i), dbfrow, e)
                    dblogger.exception(e)
Example #32
0
def pxs2person(row, person):

    kw = {}
    store(
        kw,
        card_number=row['CARDNUMBER'],
        card_type=row.get('CARDTYPE', ''),  # 20110110
        card_issuer=row.get('CARDISSUER', ''),  # 20110110
        noble_condition=row.get('NOBLEECOND', ''),  # 20110110
        birth_place=row.get('BIRTHPLACE', ''),
        remarks2=row.get('MEMO', ''),
        gender=convert_sex(row['SEXE']))
    for k, v in kw.items():
        setattr(person, k, v)

    par2person(row, person)

    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError as e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist as e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])

    if row['APOTHEKE']:
        try:
            person.pharmacy = Company.objects.get(pk=int(row['APOTHEKE']))
        except ValueError as e:
            dblogger.warning(u"%s : invalid pharmacy %r", obj2str(person),
                             row['APOTHEKE'])
        except Company.DoesNotExist as e:
            dblogger.warning(u"%s : pharmacy %s not found", obj2str(person),
                             row['APOTHEKE'])

    nat = row['NATIONALIT']
    if nat:
        try:
            country = Country.objects.get(short_code__exact=nat)
        except Country.DoesNotExist:
            country = Country(isocode=nat, name=nat, short_code=nat)
            country.save()
        person.nationality = country

    store_date(row, person, 'GEBDAT', 'birth_date')
    store_date(row, person, 'VALID1', 'card_valid_from')
    store_date(row, person, 'VALID2', 'card_valid_until')
Example #33
0
    def load(row):
        kw = {}
        #~ kw.update(street2kw(join_words(row['RUE'],row['RUENUM'],row['RUEBTE'])))
        store(kw, id=int(row['IDPAR']))

        if is_company(row):
            cl = Company
            store(kw,
                  vat_id=row['NOTVA'],
                  prefix=row['ALLO'],
                  name=row['FIRME'],
                  )
        else:
            cl = Person
            if row['IDPRT'] == 'S':
                kw.update(is_cpas=True)
            elif row['IDPRT'] == 'A':
                kw.update(is_senior=True)
            elif row['IDPRT'] == 'I':
                kw.update(is_active=False)
            kw.update(**name2kw(row['FIRME']))
            store(kw,
                  national_id=row['NB2'],
                  gesdos_id=row['NB1'],
                  bank_account1=row['COMPTE1'],
                  bank_account2=row['COMPTE2'],
                  title=row['ALLO'],
                  )
            if row['IDUSR']:
                username = settings.TIM2LINO_USERNAME(row['IDUSR'])
                if username is not None:
                    try:
                        kw.update(
                            coach1=auth.User.objects.get(username=username))
                        #~ kw.update(user=auth.User.objects.get(username=username))
                    except auth.User.DoesNotExist, e:
                        dblogger.warning(
                            "PAR:%s PAR->IdUsr %r (converted to %r) doesn't exist!", row['IDPAR'], row['IDUSR'], username)
Example #34
0
 def POST(self, **kw):
     # ~ dblogger.info("%s.POST(%s)",self.__class__.__name__,kw)
     # ~ self.prepare_data(kw['data'])
     obj = self.get_object(kw)
     if obj is None:
         obj = self.create_object(kw)
         if obj is None:
             dblogger.warning("%s:%s (%s) : ignored POST %s", kw["alias"], kw["id"], obj, kw["data"])
             return
         # ~ watcher = changes.Watcher(obj,True)
         self.set_timestamp(kw["time"])
         self.applydata(obj, kw["data"])
         dblogger.info("%s:%s (%s) : POST %s", kw["alias"], kw["id"], dd.obj2str(obj), kw["data"])
         self.validate_and_save(obj)
         dd.on_ui_created.send(sender=obj, request=REQUEST)
         # ~ changes.log_create(REQUEST,obj)
     else:
         watcher = ChangeWatcher(obj)
         dblogger.info("%s:%s : POST becomes PUT", kw["alias"], kw["id"])
         self.set_timestamp(kw["time"])
         self.applydata(obj, kw["data"])
         dblogger.info("%s:%s (%s) : POST %s", kw["alias"], kw["id"], dd.obj2str(obj), kw["data"])
         self.validate_and_save(obj)
         watcher.send_update(REQUEST)
Example #35
0
    def load_par(self, row):
        kw = {}
        # kw.update(
        #     street2kw(join_words(
        #         row['RUE'],
        #         row['RUENUM'],
        #         row['RUEBTE'])))

        # the following code needs the top-level (possibly abstract)
        # models:
        from lino_xl.lib.contacts.models import Person, Company
        partner_models = (Person, Company)
        if dd.is_installed('households'):
            from lino_xl.lib.households.models import Household
            partner_models = (Person, Company, Household)

        self.store(kw, id=self.par_pk(row.idpar))

        cl = self.par_class(row)
        
        if cl is None:
            dblogger.warning(
                "Ignored PAR record %s (IdPrt %r)" % (
                    row.idpar, row.idprt))
            return
        
        if issubclass(cl, partner_models):
            email = row.email.strip()
            if email and is_valid_email(email):
                self.store(kw, email=email)

        # if 'idreg' in row:
        if row.idreg:
            self.store(kw, vat_regime=vat_regime(row.idreg.strip()))
            
        # if 'idgen' in row:
        if row.idgen:
            self.store(kw, purchase_account=self.get_account(row.idgen))
            
        if issubclass(cl, Company):
            # cl = Company
            self.store(
                kw,
                prefix=row['allo'].strip(),
                name=row.firme.strip() + ' ' + row.vorname,
            )
            if dd.is_installed('vat'):
                self.store(
                    kw, vat_id=row['notva'].strip())
                
        if issubclass(cl, Person):
            # self.store(kw, prefix=row.allo)
            # kw.update(**name2kw(self.decode_string(row.firme)))
            last_name = row.firme.strip()
            if row.name2.strip():
                last_name += '-' + row.name2.strip()
            self.store(
                kw,
                first_name=row['vorname'].strip(),
                last_name=last_name,
                # birth_date=row['gebdat'],
                title=row['allo'].strip(),
            )
            assert kw['first_name'] or kw['last_name']
            # depends on which dbf module is being used:
            # if 'sex' in row:
            if hasattr(row, 'sex'):
                # sex = row.get('sex', None)
                sex = row.sex
                self.store(
                    kw, gender=convert_gender(sex))
        if dd.is_installed('households'):
            if issubclass(cl, Household):
                self.store(
                    kw,name=row.firme.strip() + ' ' + row.vorname.strip())
        if dd.is_installed('lists') and issubclass(cl, List):
            self.store(kw, designation=row.firme)
        
        if issubclass(cl, Created):
            if 'datcrea' in row:
                created = row.get('datcrea', None)
                if created:
                    created = datetime.datetime.combine(
                        created, datetime.time(0, 0, 0))
                    if settings.USE_TZ:
                        created = make_aware(created)
                    kw.update(created=created)

        # if cl is not List:
        if issubclass(cl, rt.models.contacts.Partner):
            language = isolang(row['langue'])
            
            if settings.SITE.get_language_info(language):
                self.store(kw, language=language)

            # if 'memo' in row:
            if row.memo:
                self.store(
                    kw, remarks=self.dbfmemo(row.get('memo') or ''))

            isocode = self.short2iso(row.pays.strip())
            if isocode:
                try:
                    country = Country.objects.get(
                        isocode=isocode)
                except Country.DoesNotExist:
                    country = Country(isocode=isocode,
                                      name=isocode)
                    country.save()
                kw.update(country=country)

                zip_code = row['cp'].strip()
                if zip_code:
                    kw.update(zip_code=zip_code)
                    qs = Place.objects.filter(
                        country=country,
                        zip_code__exact=zip_code,
                    )
                    if qs.count() == 0:
                        city = Place(zip_code=zip_code,
                                     name=zip_code,
                                     country=country)
                        city.save()
                        kw.update(city=city)
                    else:
                        kw.update(city=qs[0])
                        s = self.duplicate_zip_codes.get(country, set([]))
                        s.add(zip_code)
                    
            self.store(
                kw,
                phone=row['tel'].strip(),
                fax=row['fax'].strip(),
                street=row['rue'].strip(),
                street_no=row['ruenum'],
                street_box=row['ruebte'].strip(),
            )

            # kw.update(street2kw(join_words(row['RUE'],
            # row['RUENUM'],row['RUEBTE'])))

        try:
            obj = cl(**kw)
        except Exception:
            dblogger.warning("Failed to instantiate %s from %s",
                             cl, kw)
            raise
        yield obj

        def compte2iban(s, **kw):
            a = s.split(':')
            if len(a) == 1:
                kw.update(iban=s)
            elif len(a) == 2:
                kw.update(bic=a[0])
                kw.update(iban=a[1])
            else:
                kw.update(iban=s)
            return kw

        if not dd.is_installed('sepa'):
            return
        
        compte1 = row['compte1'].strip()
        if compte1:
            obj.full_clean()
            obj.save()
            kw = compte2iban(compte1, partner=obj, primary=True)
            if kw['iban']:
                obj = sepa.Account(**kw)
                try:
                    obj.full_clean()
                    yield obj
                except ValidationError:
                    dblogger.warning(
                        "Ignored invalid PAR->Compte1 %r", compte1)
Example #36
0
    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])

    if row['APOTHEKE']:
        try:
            person.pharmacy = Company.objects.get(pk=int(row['APOTHEKE']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid pharmacy %r", obj2str(person),
                             row['APOTHEKE'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : pharmacy %s not found", obj2str(person),
                             row['APOTHEKE'])

    nat = row['NATIONALIT']
    if nat:
        try:
            country = Country.objects.get(short_code__exact=nat)
        except Country.DoesNotExist:
            country = Country(isocode=nat, name=nat, short_code=nat)
            country.save()
        person.nationality = country

    store_date(row, person, 'GEBDAT', 'birth_date')
    store_date(row, person, 'VALID1', 'card_valid_from')
Example #37
0
from lino.api import dd
from lino.modlib.languages.models import Language

LANGUAGES = {}
"""
"""
fn = os.path.join(os.path.dirname(__file__), 'iso-639-3_20100707.tab')
n = 0
#~ for ln in file(fn).readlines():
for ln in codecs.open(fn, encoding="UTF-8").readlines():
    n += 1
    if ln:
        rec = ln.split('\t')
        if len(rec) != 8:
            logger.warning("Ignored line %d (len(rec) is %d)", n, len(rec))
        elif len(rec[0]) != 3:
            logger.warning("Ignored line %d", n)
        else:
            language_type = rec[5]
            if language_type == 'L':
                ref_name = rec[6]
                if ref_name:
                    code = rec[0]
                    if len(rec[1]) == 3:
                        code = rec[1]
                    LANGUAGES[code] = dict(en=ref_name, iso2=rec[3])
            else:
                logger.debug("Ignored line %d : language type is %r", n,
                             language_type)
"""
Example #38
0
 def load_art(self,row,**kw):
     try:
         pk = int(row.idart)
     except ValueError,e:
         dblogger.warning("Ignored %s: %s",row,e)
         return
Example #39
0
    def load_vnl(self, row, **kw):
        jnl, year, number = row2jnl(row)
        if jnl is None:
            return
        if year < START_YEAR:
            return
        doc = self.VENDICT.get((jnl, year, number))
        if doc is None:
            msg = "VNL {0} without document".format([jnl.ref, year, number])
            dblogger.warning(msg)
            return
            # raise Exception(msg)
        # dblogger.info("20131116 %s %s",row.idjnl,row.iddoc)
        # doc = jnl.get_document(year,number)
        # try:
        # doc = jnl.get_document(year,number)
        # except Exception,e:
        # dblogger.warning(str(e))
        # return
        # kw.update(document=doc)
        kw.update(seqno=int(row.line.strip()))
        idart = row.idart.strip()
        if isinstance(doc, sales.VatProductInvoice):
            if row.code in ('A', 'F'):
                kw.update(product=products.Product.get_by_ref(idart))
            elif row.code == 'G':
                a = self.vnlg2product(row)
                if a is not None:
                    kw.update(product=a)
            kw.update(unit_price=mton(row.prixu))
            kw.update(qty=qton(row.qte))
        elif isinstance(doc, vat.VatAccountInvoice):
            if row.code == 'G':
                kw.update(account=idart)
        kw.update(title=row.desig.strip())
        vc = tax2vat(row.idtax)
        kw.update(vat_class=vc)
        mb = mton(row.cmont)
        mv = mton(row.montt)
        kw.update(total_base=mb)
        kw.update(total_vat=mv)
        if mb is not None and mv is not None:
            kw.update(total_incl=mb + mv)
        # kw.update(qty=row.idtax.strip())
        # kw.update(qty=row.montt.strip())
        # kw.update(qty=row.attrib.strip())
        # kw.update(date=row.date)

        # check whether we need a vat rule
        if mv and mb:
            vatrule = dict(vat_class=vc, vat_regime=doc.vat_regime)
            vatrule.update(country=doc.partner.country
                           or dd.plugins.countries.get_my_country())
            try:
                VatRule.objects.get(**vatrule)
            except VatRule.DoesNotExist:
                vatrule.update(rate=myround(mv / mb))
                yield VatRule(**vatrule)
        try:
            yield doc.add_voucher_item(**kw)
        except Exception as e:
            dblogger.warning("Failed to load VNL line %s from %s : %s", row,
                             kw, e)
Example #40
0
from lino.modlib.languages.models import Language


LANGUAGES = {}

"""
"""
fn = os.path.join(os.path.dirname(__file__), 'iso-639-3_20100707.tab')
n = 0
#~ for ln in file(fn).readlines():
for ln in codecs.open(fn, encoding="UTF-8").readlines():
    n += 1
    if ln:
        rec = ln.split('\t')
        if len(rec) != 8:
            logger.warning("Ignored line %d (len(rec) is %d)", n, len(rec))
        elif len(rec[0]) != 3:
            logger.warning("Ignored line %d", n)
        else:
            language_type = rec[5]
            if language_type == 'L':
                ref_name = rec[6]
                if ref_name:
                    code = rec[0]
                    if len(rec[1]) == 3:
                        code = rec[1]
                    LANGUAGES[code] = dict(en=ref_name, iso2=rec[3])
            else:
                logger.debug("Ignored line %d : language type is %r",
                             n, language_type)
Example #41
0
def get_or_warn(idpar):
    try:
        return contacts.Person.objects.get(pk=int(idpar))
    except contacts.Person.DoesNotExist:
        dblogger.warning("No client %s", idpar)
Example #42
0
    def load_par(self, row):
        kw = {}
        # kw.update(
        #     street2kw(join_words(
        #         row['RUE'],
        #         row['RUENUM'],
        #         row['RUEBTE'])))

        self.store(kw, id=self.par_pk(row.idpar))

        email = row.email.strip()
        if email and is_valid_email(email):
            self.store(kw, email=email)

        if 'idreg' in row:
            self.store(kw, vat_regime=vat_regime(row.idreg.strip()))
        cl = self.par_class(row)
        if cl is Company:
            cl = Company
            self.store(
                kw,
                vat_id=row['notva'].strip(),
                prefix=row['allo'].strip(),
                name=row.firme,
            )
        elif cl is Person:
            # self.store(kw, prefix=row.allo)
            # kw.update(**name2kw(self.decode_string(row.firme)))
            self.store(
                kw,
                first_name=row['vorname'].strip(),
                last_name=row.firme,
                # birth_date=row['gebdat'],
                title=row['allo'].strip(),
            )
            if 'sex' in row:
                sex = row.get('sex', None)
                self.store(kw, gender=convert_gender(sex))
        elif cl is Household:
            self.store(
                kw,
                name=row.firme.strip() + ' ' + row.vorname.strip(),
            )
        elif cl is List:
            self.store(
                kw,
                name=row.firme,
            )
        else:
            dblogger.warning("Ignored PAR record %s (IdPrt %r)" %
                             (row.idpar, row.idprt))
            return
        if cl is not List:
            if 'datcrea' in row:
                created = row.get('datcrea', None)
                if created:
                    kw.update(created=created)

            language = isolang(row['langue'])

            if settings.SITE.get_language_info(language):
                self.store(kw, language=language)

            if 'memo' in row:
                self.store(kw, remarks=self.dbfmemo(row.get('memo') or ''))

            isocode = self.short2iso(row.pays.strip())
            if isocode:
                try:
                    country = Country.objects.get(isocode=isocode)
                except Country.DoesNotExist:
                    country = Country(isocode=isocode, name=isocode)
                    country.save()
                kw.update(country=country)

                zip_code = row['cp'].strip()
                if zip_code:
                    kw.update(zip_code=zip_code)
                    qs = Place.objects.filter(
                        country=country,
                        zip_code__exact=zip_code,
                    )
                    if qs.count() == 0:
                        city = Place(zip_code=zip_code,
                                     name=zip_code,
                                     country=country)
                        city.save()
                        kw.update(city=city)
                    else:
                        kw.update(city=qs[0])
                        s = self.duplicate_zip_codes.get(country, set([]))
                        s.add(zip_code)

            self.store(
                kw,
                phone=row['tel'].strip(),
                fax=row['fax'].strip(),
                street=row['rue'].strip(),
                street_no=row['ruenum'],
                street_box=row['ruebte'].strip(),
            )

            # kw.update(street2kw(join_words(row['RUE'],
            # row['RUENUM'],row['RUEBTE'])))

        try:
            obj = cl(**kw)
        except Exception:
            dblogger.warning("Failed to instantiate %s from %s", cl, kw)
            raise
        yield obj

        def compte2iban(s, **kw):
            a = s.split(':')
            if len(a) == 1:
                kw.update(iban=s)
            elif len(a) == 2:
                kw.update(bic=a[0])
                kw.update(iban=a[1])
            else:
                kw.update(iban=s)
            return kw

        compte1 = row['compte1'].strip()
        if compte1:
            obj.full_clean()
            obj.save()
            kw = compte2iban(compte1, partner=obj, primary=True)
            if kw['iban']:
                obj = sepa.Account(**kw)
                try:
                    obj.full_clean()
                    yield obj
                except ValidationError:
                    dblogger.warning("Ignored invalid PAR->Compte1 %r",
                                     compte1)
Example #43
0
    qs = pcsw.ClientContact.objects.filter(client=person, type__id=nType)
    if qs.count() == 0:
        cc = pcsw.ClientContact(client=person, company_id=pk, type=pcsw.ClientContactType.objects.get(id=nType))
        cc.save()
        dd.on_ui_created.send(sender=cc, request=REQUEST)
        # ~ changes.log_create(REQUEST,cc)
    elif qs.count() == 1:
        cc = qs[0]
        if cc.company_id != pk:
            watcher = ChangeWatcher(cc)
            cc.company_id = pk
            cc.save()
            watcher.send_update(REQUEST)
            # ~ watcher.log_diff(REQUEST)
    else:
        dblogger.warning(u"%s : more than 1 ClientContact (type=%r)", dd.obj2str(person), nType)


def pxs2client(row, person):

    kw = {}
    store(
        kw,
        card_number=row["CARDNUMBER"],
        card_issuer=row.get("CARDISSUER", ""),  # 20110110
        noble_condition=row.get("NOBLEECOND", ""),  # 20110110
        birth_place=row.get("BIRTHPLACE", ""),
        remarks2=row.get("MEMO", ""),
        gender=convert_sex(row["SEXE"]),
    )
    for k, v in kw.items():
Example #44
0
def receive(dbcal, calendar):

    rs_touched = set()
    ev_touched = set()
    rs_updated = rs_created = rs_deleted = 0
    count_update = 0
    count_new = 0
    count_deleted = 0
    #~ print "Using calendar", calendar

    props = calendar.get_properties([dav.DisplayName()])
    dbcal.name = props[dav.DisplayName().tag]
    dbcal.save()

    from_date = dbcal.start_date
    if not from_date:
        from_date = datetime.datetime.now() - datetime.timedelta(days=365)
    until_date = datetime.datetime.now() + datetime.timedelta(days=365)

    #~ from_date = aware(from_date)
    #~ until_date = aware(until_date)

    #~ print from_date.tzinfo, until_date.tzinfo
    #~ raise Exception("20110823")

    results = calendar.date_search(from_date, until_date)
    if results:
        for comp in results:
            #~ if len(list(comp.instance.getChildren())) != 1:
                #~ raise Exception("comp.instance.getChildren() is %s" % list(comp.instance.getChildren()))
            dblogger.info(
                "Got calendar component <<<\n%s\n>>>",
                prettyPrint(comp.instance))

            if comp.instance.vevent:
                event = comp.instance.vevent
                if isinstance(event, RecurringComponent):
                    """
                    in a google calendar, all events are parsed to a
                    RecurringComponent. if event.rruleset is None
                    we consider them non recurrent.
                    """

                    uid = event.uid.value
                    dtstart = event.dtstart.value

                    get_kw = {}
                    set_kw = {}
                    get_kw.update(uid=uid)
                    set_kw.update(summary=event.summary.value)
                    #~ dblogger.info("TRANSPARENCE IS %r", event.transp.value)
                    location_name = event.location.value
                    if location_name:
                        qs = Place.objects.filter(name__iexact=location_name)
                        if qs.count() == 0:
                            pl = Place(name=location_name)
                            pl.full_clean()
                            pl.save()
                            dblogger.info("Auto-created location %s", pl)
                        else:
                            pl = qs[0]
                            if qs.count() > 1:
                                dblogger.warning(
                                    "Found more than 1 Place for location %r", location_name)
                        set_kw.update(place=pl)
                    else:
                        set_kw.update(place=None)
                    if event.transp.value == 'TRANSPARENT':
                        set_kw.update(transparent=True)
                    else:
                        set_kw.update(transparent=False)
                    set_kw.update(description=event.description.value)
                    set_kw.update(calendar=dbcal)
                    #~ set_kw.update(location=event.location.value)
                    #~ kw.update(dtend=event.dtend.value)

                    dblogger.info("It's a RecurringComponent")
                    if event.rruleset:
                        try:
                            obj = RecurrenceSet.objects.get(uid=uid)
                            assert obj.calendar == dbcal
                            rs_updated += 1
                        except RecurrenceSet.DoesNotExist as e:
                        #~ except Exception, e:
                            obj = RecurrenceSet(uid=uid)
                            obj.calendar = dbcal
                            obj.user = dbcal.user
                            rs_created += 1
                        #~ raise Exception("20110823 must save rrule, rdate etc... %s" % type(event.rrule_list))
                        obj.rrules = '\n'.join(
                            [r.value for r in event.rrule_list])
                        #~ obj.exrules = '\n'.join([r.value for r in event.exrule_list])
                        #~ obj.rdates = '\n'.join([r.value for r in event.rdate_list])
                        #~ obj.exdates = '\n'.join([r.value for r in event.exdate_list])
                        obj.summary = event.summary.value
                        obj.description = event.description.value
                        setkw(obj, **dt2kw(dtstart, 'start'))
                        obj.full_clean()
                        obj.save()
                        dblogger.info("Saved %s", obj)
                        rs_touched.add(obj.pk)

                        set_kw.update(rset=obj)
                        if getattr(dtstart, 'tzinfo', False):
                            dtlist = event.rruleset.between(
                                aware(from_date), aware(until_date))
                        else:
                            dtlist = event.rruleset.between(
                                from_date, until_date)
                        dblogger.info("rrulset.between() --> %s", dtlist)
                    else:
                        dtlist = [dtstart]
                        dblogger.info("No rruleset")
                    duration = event.dtend.value - dtstart
                    for dtstart in dtlist:
                        dtend = dtstart + duration
                        get_kw = dt2kw(dtstart, 'start', **get_kw)
                        set_kw = dt2kw(dtend, 'end', **set_kw)
                        try:
                            obj = Event.objects.get(**get_kw)
                            count_update += 1
                        except Event.DoesNotExist as e:
                        #~ except Exception, e:
                            obj = Event(**get_kw)
                            obj.user = dbcal.user
                            count_new += 1
                        setkw(obj, **set_kw)
                        obj.full_clean()
                        obj.save()
                        dblogger.info("Saved %s", obj)
                        ev_touched.add(obj.pk)

                else:
                    raise Exception(
                        "comp.instance.vevent is a %s (expected VEvent)" % type(event))
            else:
                raise Exception(
                    "Got unhandled component %s"
                    % comp.instance.prettyPrint())
                #~ print "children:", [c for c in comp.instance.getChildren()]

            #~ raise StopIteration
    qs = dbcal.event_set.exclude(id__in=ev_touched)
    count_deleted = qs.count()
    qs.delete()  # note: doesn't call delete methods of individual objects
    qs = dbcal.recurrenceset_set.exclude(id__in=rs_touched)
    rs_deleted = qs.count()
    qs.delete()  # note: doesn't call delete methods of individual objects
    dblogger.info(
        "--> Created %d, updated %d, deleted %s Events",
        count_new, count_update, count_deleted)
    dblogger.info(
        "--> Created %d, updated %d, deleted %s RecurrenceSets",
        rs_created, rs_updated, rs_deleted)
Example #45
0
def receive(dbcal, calendar):

    rs_touched = set()
    ev_touched = set()
    rs_updated = rs_created = rs_deleted = 0
    count_update = 0
    count_new = 0
    count_deleted = 0
    #~ print "Using calendar", calendar

    props = calendar.get_properties([dav.DisplayName()])
    dbcal.name = props[dav.DisplayName().tag]
    dbcal.save()

    from_date = dbcal.start_date
    if not from_date:
        from_date = datetime.datetime.now() - datetime.timedelta(days=365)
    until_date = datetime.datetime.now() + datetime.timedelta(days=365)

    #~ from_date = aware(from_date)
    #~ until_date = aware(until_date)

    #~ print from_date.tzinfo, until_date.tzinfo
    #~ raise Exception("20110823")

    results = calendar.date_search(from_date, until_date)
    if results:
        for comp in results:
            #~ if len(list(comp.instance.getChildren())) != 1:
                #~ raise Exception("comp.instance.getChildren() is %s" % list(comp.instance.getChildren()))
            dblogger.info(
                "Got calendar component <<<\n%s\n>>>",
                prettyPrint(comp.instance))

            if comp.instance.vevent:
                event = comp.instance.vevent
                if isinstance(event, RecurringComponent):
                    """
                    in a google calendar, all events are parsed to a 
                    RecurringComponent. if event.rruleset is None 
                    we consider them non recurrent.
                    """

                    uid = event.uid.value
                    dtstart = event.dtstart.value

                    get_kw = {}
                    set_kw = {}
                    get_kw.update(uid=uid)
                    set_kw.update(summary=event.summary.value)
                    #~ dblogger.info("TRANSPARENCE IS %r", event.transp.value)
                    location_name = event.location.value
                    if location_name:
                        qs = Place.objects.filter(name__iexact=location_name)
                        if qs.count() == 0:
                            pl = Place(name=location_name)
                            pl.full_clean()
                            pl.save()
                            dblogger.info("Auto-created location %s", pl)
                        else:
                            pl = qs[0]
                            if qs.count() > 1:
                                dblogger.warning(
                                    "Found more than 1 Place for location %r", location_name)
                        set_kw.update(place=pl)
                    else:
                        set_kw.update(place=None)
                    if event.transp.value == 'TRANSPARENT':
                        set_kw.update(transparent=True)
                    else:
                        set_kw.update(transparent=False)
                    set_kw.update(description=event.description.value)
                    set_kw.update(calendar=dbcal)
                    #~ set_kw.update(location=event.location.value)
                    #~ kw.update(dtend=event.dtend.value)

                    dblogger.info("It's a RecurringComponent")
                    if event.rruleset:
                        try:
                            obj = RecurrenceSet.objects.get(uid=uid)
                            assert obj.calendar == dbcal
                            rs_updated += 1
                        except RecurrenceSet.DoesNotExist, e:
                        #~ except Exception, e:
                            obj = RecurrenceSet(uid=uid)
                            obj.calendar = dbcal
                            obj.user = dbcal.user
                            rs_created += 1
                        #~ raise Exception("20110823 must save rrule, rdate etc... %s" % type(event.rrule_list))
                        obj.rrules = '\n'.join(
                            [r.value for r in event.rrule_list])
                        #~ obj.exrules = '\n'.join([r.value for r in event.exrule_list])
                        #~ obj.rdates = '\n'.join([r.value for r in event.rdate_list])
                        #~ obj.exdates = '\n'.join([r.value for r in event.exdate_list])
                        obj.summary = event.summary.value
                        obj.description = event.description.value
                        setkw(obj, **dt2kw(dtstart, 'start'))
                        obj.full_clean()
                        obj.save()
                        dblogger.info("Saved %s", obj)
                        rs_touched.add(obj.pk)

                        set_kw.update(rset=obj)
                        if getattr(dtstart, 'tzinfo', False):
                            dtlist = event.rruleset.between(
                                aware(from_date), aware(until_date))
                        else:
                            dtlist = event.rruleset.between(
                                from_date, until_date)
                        dblogger.info("rrulset.between() --> %s", dtlist)
                    else:
                        dtlist = [dtstart]
                        dblogger.info("No rruleset")
                    duration = event.dtend.value - dtstart
                    for dtstart in dtlist:
                        dtend = dtstart + duration
                        get_kw = dt2kw(dtstart, 'start', **get_kw)
                        set_kw = dt2kw(dtend, 'end', **set_kw)
                        try:
                            obj = Event.objects.get(**get_kw)
                            count_update += 1
                        except Event.DoesNotExist, e:
                        #~ except Exception, e:
                            obj = Event(**get_kw)
                            obj.user = dbcal.user
                            count_new += 1
                        setkw(obj, **set_kw)
                        obj.full_clean()
                        obj.save()
                        dblogger.info("Saved %s", obj)
                        ev_touched.add(obj.pk)

                else:
                    raise Exception(
                        "comp.instance.vevent is a %s (expected VEvent)" % type(event))
            else:
                raise Exception(
                    "Got unhandled component %s"
                    % comp.instance.prettyPrint())
Example #46
0
    if row['IDMUT']:
        try:
            person.health_insurance = Company.objects.get(
                pk=ADR_id(row['IDMUT']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid health_insurance %r",
                             obj2str(person), row['IDMUT'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : health_insurance %s not found",
                             obj2str(person), row['IDMUT'])

    if row['APOTHEKE']:
        try:
            person.pharmacy = Company.objects.get(pk=int(row['APOTHEKE']))
        except ValueError, e:
            dblogger.warning(u"%s : invalid pharmacy %r",
                             obj2str(person), row['APOTHEKE'])
        except Company.DoesNotExist, e:
            dblogger.warning(u"%s : pharmacy %s not found",
                             obj2str(person), row['APOTHEKE'])

    nat = row['NATIONALIT']
    if nat:
        try:
            country = Country.objects.get(short_code__exact=nat)
        except Country.DoesNotExist:
            country = Country(isocode=nat, name=nat, short_code=nat)
            country.save()
        person.nationality = country

    store_date(row, person, 'GEBDAT', 'birth_date')
    store_date(row, person, 'VALID1', 'card_valid_from')