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)
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)
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])
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'])
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'])
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'])
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)
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)
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)
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)
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)
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
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)
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
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
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)
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)
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
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))
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)
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)
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)
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
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)
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)
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)
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)
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)
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')
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)
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)
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)
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')
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) """
def load_art(self,row,**kw): try: pk = int(row.idart) except ValueError,e: dblogger.warning("Ignored %s: %s",row,e) return
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)
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)
def get_or_warn(idpar): try: return contacts.Person.objects.get(pk=int(idpar)) except contacts.Person.DoesNotExist: dblogger.warning("No client %s", idpar)
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)
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():
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)
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())