def send(dbcal, calendar, client): n = 0 for obj in dbcal.event_set.filter(user_modified=True): dblogger.info("Gonna send %s", obj) n += 1 mycal = vobject.iCalendar() #~ mycal.add('vevent') #~ mycal = vobject.iCalendar() #~ vevent = vobject.newFromBehavior('vevent', '2.0') vevent = mycal.add('vevent') vevent.add('uid').value = obj.uid vevent.add('dtstamp').value = obj.modified if obj.start_time: vevent.add('dtstart').value = datetime.datetime.combine( obj.start_date, obj.start_time) else: vevent.add('dtstart').value = obj.start_date if obj.end_time: vevent.add('dtend').value = datetime.datetime.combine( obj.end_date, obj.end_time) else: vevent.add('dtend').value = obj.end_date vevent.add('transp').value = iif( obj.transparent, 'TRANSPARENT', 'OPAQUE') vevent.add('summary').value = obj.summary if obj.place: vevent.add('location').value = obj.place.name vevent.add('description').value = obj.description event = caldav.Event( client, data=mycal.serialize(), parent=calendar).save() dblogger.info("--> Sent %d events to calendar server.", n)
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 process_message(self, peer, mailfrom, rcpttos, data): rv = mail_received.send(self, peer=peer, mailfrom=mailfrom, rcpttos=rcpttos, data=data) dblogger.info("20140703 process_message %s", rv)
def main(): fn = sys.argv[1] f = dbfreader.DBFFile(fn, codepage="cp850") dblogger.info("Loading %d records from %s...", len(f), fn) f.open() for dbfrow in f: if dbfrow.deleted(): continue c = get_or_warn(dbfrow.idpar1) p = get_or_warn(dbfrow.idpar2) if not c or not p: continue # invalid idpar t = tim2lino(dbfrow.type) if t is not None: # 10 and 11 are symmetric: don't duplicate them. if the # opposite record exists, ignore the other one. if dbfrow.type in ('10', '11'): qs = Link.objects.filter(parent=c, child=p, type=t) if qs.count() > 0: continue obj = Link(parent=p, child=c, type=t) obj.full_clean() obj.save() # plp2lino(dbfrow.type, p, c) f.close()
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 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 PUT_special(self, watcher, **kw): obj = watcher.watched model = PAR_model(kw["data"]) if obj.__class__ != model: dblogger.info( "%s:%s (%s) : %s becomes %s", kw["alias"], kw["id"], dd.obj2str(obj), obj.__class__.__name__, model.__name__, ) self.swapclass(watcher, model, kw["data"]) return True
def process_line(ln): d = json.loads(ln, object_hook=json2py) kw = {} for k, v in d.items(): kw[str(k)] = v ctrl = controllers.get(kw["alias"], None) if ctrl is None: # ~ raise Exception("%(alias)s : no such controller." % kw) # ~ logger.debug("Ignoring change %(time)s for %(alias)s:%(id)s",kw['time'],kw['alias'],kw['id']) dblogger.info("Ignoring change %(time)s for %(alias)s:%(id)s", kw) return # ~ kw['data'] = ctrl.prepare_data(kw['data']) m = getattr(ctrl, kw["method"]) m(**kw)
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 load_ven(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: dblogger.info("Ignore %s %s because year %s <%s", row.idjnl, number, year, START_YEAR) return kw.update(year=year) kw.update(number=number) kw.update(vat_regime=vat_regime(row.idreg.strip())) # kw.update(id=pk) partner = self.get_customer(row.idpar) if partner is None: raise Exception("No partner id {0} in {1}".format(row.idpar, row)) else: kw.update(partner=partner) if jnl.trade_type.name == 'sales': # kw.update(imode=self.DIM) if row.idprj.strip(): kw.update(project_id=int(row.idprj.strip())) kw.update(discount=mton(row.remise)) elif jnl.trade_type.name == 'purchases': pass # kw.update(partner=contacts.Partner.objects.get( # pk=self.par_pk(row.idpar))) # partner=contacts.Partner.objects.get(pk=self.par_pk(row.idpar)) else: raise Exception("Unknown TradeType %r" % jnl.trade_type) kw.update(entry_date=row.date) kw.update(voucher_date=row.date) kw.update(user=self.get_user(row.auteur)) kw.update(total_excl=mton(row.montr)) kw.update(total_vat=mton(row.montt)) kw.update(match=row.match.strip()) doc = jnl.create_voucher(**kw) # doc.partner = partner # doc.full_clean() # doc.save() self.VENDICT[(jnl, year, number)] = doc if row.etat == self.etat_registered: self.must_register.append(doc) # match = row.match.strip() # if match: # lst = self.must_match.setdefault(match, []) # lst.append((doc, doc)) # # self.must_match.append((doc, doc, match)) return doc
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 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_fin(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 kw.update(year=year) kw.update(number=number) # kw.update(id=pk) kw.update(voucher_date=row.date) kw.update(entry_date=row.date) kw.update(user=self.get_user()) kw.update(balance1=mton(row.mont1, ZERO)) kw.update(balance2=mton(row.mont2, ZERO)) doc = jnl.create_voucher(**kw) self.FINDICT[(jnl, year, number)] = doc # print row.etat if row.etat == self.etat_registered: self.must_register.append(doc) return doc
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 main(*args, **options): if len(args) == 0: addr, port = '127.0.0.1', DEFAULT_PORT elif len(args) != 1: raise CommandError('Must specify ADDR or ADDR:PORT as argument') else: a = args[0].split(':') if len(a) == 2: addr, port = a port = int(port) elif len(a) == 1: addr = a[0] port = DEFAULT_PORT else: raise CommandError("Invalid ADDR, must be something " "like 127.0.0.1 or 127.0.0.1:1025") settings.SITE.startup() MySMTPServer((addr, port), None) dblogger.info("20140703 start listening on %s:%d", addr, port) asyncore.loop() dblogger.info("20140703 stopped listening on %s:%d", addr, port)
def handle(self, *args, **options): if len(args) != 1: raise CommandError( 'Please specify the path to your TIM data directory') dbname = settings.DATABASES['default']['NAME'] if not confirm("Gonna reset your database (%s).\nAre you sure (y/n) ?" % dbname): raise CommandError("User abort.") options.update(interactive=False) dblogger.info("Lino initdb_tim started on database %s." % dbname) dblogger.info(lino.welcome_text()) apps = app_labels() call_command('reset', *apps, **options) #~ call_command('reset', #~ 'contacts','pcsw','countries','auth','notes', #~ 'countries','links','uploads', #~ interactive=False) call_command('syncdb', **options) #~ NoteType = resolve_model('notes.NoteType') #~ n = NoteType.objects.all().count() #~ assert n == 21, 'NoteType.objects.all().count() == %d (expected 21)' % n #~ lino_site.initdb() #~ for o in tim_fixture_objects(): #~ o.save() #~ logger.info('lino_site.fill() done. Starting load_tim_data()...') load_tim_data(args[0]) dblogger.info("Lino initdb_tim done on database %s." % dbname)
def main(*args, **options): if len(args) == 0: addr, port = '127.0.0.1', DEFAULT_PORT elif len(args) != 1: raise CommandError( 'Must specify ADDR or ADDR:PORT as argument') else: a = args[0].split(':') if len(a) == 2: addr, port = a port = int(port) elif len(a) == 1: addr = a[0] port = DEFAULT_PORT else: raise CommandError("Invalid ADDR, must be something " "like 127.0.0.1 or 127.0.0.1:1025") settings.SITE.startup() MySMTPServer((addr, port), None) dblogger.info("20140703 start listening on %s:%d", addr, port) asyncore.loop() dblogger.info("20140703 stopped listening on %s:%d", addr, port)
def handle(self, *args, **options): dbname = settings.DATABASES['default']['NAME'] if options.get('interactive'): if not confirm("This is going to GARBLE your database (%s).\n" "Are you sure (y/n) ?" % dbname): raise CommandError("User abort.") def build_dist(k): k = k.upper() if k == 'BE': return BelgianDistribution() if k == 'EE': return EstonianDistribution() raise CommandError("Invalid distribution key %r." % k) dist = build_dist(options.get('distribution')) User = dd.resolve_model(settings.SITE.user_model) Person = rt.models.contacts.Person for p in Person.objects.order_by('id'): if User.objects.filter(partner=p).count() > 0: # users keep their original name pass else: p.last_name = dist.LAST_NAMES.pop() if p.gender == dd.Genders.male: p.first_name = dist.MALES.pop() dist.FEMALES.pop() else: p.first_name = dist.FEMALES.pop() dist.MALES.pop() p.name = join_words(p.last_name, p.first_name) dist.before_save(p) p.save() dblogger.info(p.get_address(', '))
def handle(self, *args, **options): dbname = settings.DATABASES['default']['NAME'] if options.get('interactive'): if not confirm("This is going to GARBLE your database (%s).\nAre you sure (y/n) ?" % dbname): raise CommandError("User abort.") contacts = dd.resolve_app('contacts') User = dd.resolve_model(settings.SITE.user_model) Person = dd.resolve_model('contacts.Person') Household = dd.resolve_model('households.Household') Member = dd.resolve_model('households.Member') Role = dd.resolve_model('households.Role') Country = dd.resolve_model('countries.Country') for p in Person.objects.order_by('id'): if User.objects.filter(partner=p).count() > 0: # users keep their original name pass else: p.nationality = Country.objects.get( isocode=NATIONALITIES.pop()) p.last_name = LAST_NAMES.pop() if p.gender == dd.Genders.male: p.first_name = MALES.pop() FEMALES.pop() else: p.first_name = FEMALES.pop() MALES.pop() #~ dblogger.log_changes(REQUEST,p) p.name = join_words(p.last_name, p.first_name) p.save() dblogger.info("%s from %s", unicode(p), unicode(p.nationality)) MEN = Cycler(Person.objects.filter(gender=dd.Genders.male) .order_by('id')) WOMEN = Cycler( Person.objects.filter(gender=dd.Genders.female).order_by('id')) for h in Household.objects.all(): if h.member_set.all().count() == 0: he = MEN.pop() she = WOMEN.pop() h.name = he.last_name + "-" + she.last_name Member(household=h, person=he, role=Role.objects.get(pk=1)).save() Member(household=h, person=she, role=Role.objects.get(pk=2)).save() else: h.name = '' h.full_clean() h.save() dblogger.info(unicode(h)) dblogger.info("GARBLE done on database %s." % dbname)
def load_dbf(self, tableName, row2obj=None): if row2obj is None: row2obj = getattr(self, 'load_' + tableName[-3:].lower()) fn = self.dbpath if self.archive_name is not None: if tableName in self.archived_tables: fn = os.path.join(fn, self.archive_name) fn = os.path.join(fn, tableName) fn += self.table_ext if self.use_dbf_py: dblogger.info("Loading %s...", fn) import dbf # http://pypi.python.org/pypi/dbf/ #~ table = dbf.Table(fn) table = dbf.Table(fn, codepage=self.codepage) #~ table.use_deleted = False table.open() #~ print table.structure() dblogger.info("Loading %d records from %s (%s)...", len(table), fn, table.codepage) for record in table: if not dbf.is_deleted(record): yield row2obj(record) # i = row2obj(record) # if i is not None: # yield settings.TIM2LINO_LOCAL(tableName, i) table.close() else: f = dbfreader.DBFFile(fn, codepage="cp850") dblogger.info("Loading %d records from %s...", len(f), fn) f.open() for dbfrow in f: i = row2obj(dbfrow) if i is not None: yield settings.TIM2LINO_LOCAL(tableName, i) f.close() self.after_load(tableName)
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 process_message(self, peer, mailfrom, rcpttos, data): rv = mail_received.send( self, peer=peer, mailfrom=mailfrom, rcpttos=rcpttos, data=data) dblogger.info("20140703 process_message %s", rv)
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())
from django.db import models from django.conf import settings from django.utils.translation import ugettext as _ from lino.core.utils import resolve_model from lino.utils.instantiator import Instantiator from lino.api import dd from lino.utils import dblogger from lino.utils import Cycler from lino.sandbox.contacts import models as contacts #~ print 20120225, 'settings.FIXTURE_DIRS is', settings.FIXTURE_DIRS dblogger.info("Imported contacts demo fixture") COUNT = 0 #~ addresstype= Instantiator('contacts.AddressType',"name").build role = Instantiator('contacts.Role', "name").build #~ person = Instantiator('contacts.Person',"first_name last_name").build #~ company = Instantiator('contacts.Company',"name").build #~ contact = Instantiator('contacts.Contact').build Company = contacts.Company Person = contacts.Person User = contacts.User City = resolve_model('countries.City') if not settings.SITE.abstract_address:
"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 send(dbcal, calendar, client): n = 0 for obj in dbcal.event_set.filter(user_modified=True): dblogger.info("Gonna send %s", obj) n += 1 mycal = vobject.iCalendar() #~ mycal.add('vevent')
def objects(): global COUNT COUNT += 1 dblogger.info("Started contacts demo fixture %d", COUNT) #~ yield addresstype(**dd.babel_values('name',en="Default",fr=u'Gérant',de=u"Geschäftsführer",et=u"Manager")) yield role(**dd.babel_values('name', en="Manager", fr=u'Gérant', de=u"Geschäftsführer", et=u"Manager")) yield role(**dd.babel_values( 'name', en="Director", fr=u'Directeur', de=u"Direktor", et=u"Direktor")) yield role(**dd.babel_values('name', en="Secretary", fr=u'Sécrétaire', de=u"Sekretär", et=u"Sekretär")) yield role(**dd.babel_values('name', en="IT Manager", fr=u'Gérant informatique', de=u"EDV-Manager", et=u"IT manager")) yield company(u"Rumma & Ko OÜ", 'EE', '10115', 'Tallinn', u'Tartu mnt', '71') yield company(u'Bäckerei Ausdemwald', 'BE', '4700', 'Eupen', u'Vervierser Straße', '45') yield company(u'Bäckerei Mießen', 'BE', '4700', 'Eupen', u'Gospert', '103') yield company(u'Bäckerei Schmitz', 'BE', '4700', 'Eupen', u'Aachener Straße', '53') yield company(u'Garage Mergelsberg', 'BE', '4720', 'Kelmis', u'Kasinostraße', '13') yield company(u'Donderweer BV', 'NL', '4816 AR', 'Breda', 'Edisonstraat', '12') yield company(u'Van Achter NV', 'NL', '4836 LG', 'Breda', 'Hazeldonk', '2') yield company(u'Hans Flott & Co', 'DE', '22453', 'Hamburg', u'Niendorfer Weg', '532') yield company(u'Bernd Brechts Bücherladen', 'DE', '80333', u'München', u'Brienner Straße', '18') yield company(u'Reinhards Baumschule', 'DE', '12487 ', u'Berlin', u'Segelfliegerdamm', '123') yield company(u'Moulin Rouge', 'FR', '75018', 'Paris', u'Boulevard de Clichy', '82') yield company(u'Auto École Verte', 'FR', '54000 ', 'Nancy', u'rue de Mon Désert', '12') #~ yield person(u'Luc', u'Saffre', gender=Gender.male) yield person(u'Andreas', u'Arens', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Annette', u'Arens', 'BE', '4700', 'Eupen', gender=dd.Genders.female) yield person(u'Hans', u'Altenberg', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Alfons', u'Ausdemwald', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Laurent', u'Bastiaensen', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Charlotte', u'Collard', 'BE', '4700', 'Eupen', gender=dd.Genders.female) yield person(u'Ulrike', u'Charlier', 'BE', '4700', 'Eupen', gender=dd.Genders.female) yield person(u'Marc', u'Chantraine', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Daniel', u'Dericum', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Dorothée', u'Demeulenaere', 'BE', '4700', 'Eupen', gender=dd.Genders.female) yield person(u'Berta', u'Ernst', 'BE', '4700', 'Eupen', gender=dd.Genders.female) yield person(u'Bernd', u'Evertz', 'BE', '4700', 'Eupen', gender=dd.Genders.male) yield person(u'Eberhart', u'Evers', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Daniel', u'Emonts', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Edgar', u'Engels', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Luc', u'Faymonville', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Gérard', u'Gernegroß', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Werner', u'Groteclaes', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Grete', u'Hilgers', 'BE', '4700', 'Eupen', gender=Gender.female) yield person(u'Hans', u'Hilgers', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Irene', u'Ingels', 'BE', '4700', 'Eupen', gender=Gender.female) yield person(u'Jérémy', u'Jansen', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Jean-Pierre', u'Jacob', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Herbert', u'Johnen', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Johannes', u'Jonas', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Jan', u'Jousten', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Karl', u'Kaivers', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Guido', u'Lambertz', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Luc', u'Laschet', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Line', u'Lazarus', 'BE', '4700', 'Eupen', gender=Gender.female) yield person(u'Josefine', u'Leffin', 'BE', '4700', 'Eupen', gender=Gender.female) yield person(u'Marc', u'Malmendier', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Leo', u'Meessen', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Franz', u'Mießen', 'BE', '4700', 'Eupen', gender=Gender.male) yield person(u'Marie-Louise', u'Meier', 'BE', '4700', 'Eupen', gender=Gender.female) yield person(u'Erich', u'Emonts', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Erwin', u'Emontspool', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Erna', u'Emonts-Gast', 'BE', '4730', 'Raeren', gender=Gender.female) yield person(u'Alfons', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Berta', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.female) yield person(u'Christian', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Daniela', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.female) yield person(u'Edgard', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Fritz', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Guido', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Hans', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) yield person(u'Hedi', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.female) yield person(u'Inge', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.female) yield person(u'Jean', u'Radermacher', 'BE', '4730', 'Raeren', gender=Gender.male) # special challenges for alphabetic ordering yield person(u'Elio', u'di Rupo') yield person(u'Leonardo', u'da Vinci') yield person(u'Herman', u'van Veen') yield person(u'Rein', u'Õunapuu') yield person(u'Otto', u'Östges') yield person(u'Erna', u'Ärgerlich') yield person(u'Bernard', u'Bodard', title='Dr.') yield person(u'Jean', u'Dupont') yield person(u'Mark', u'Martelaer') yield person(u'Rik', u'Radermecker') yield person(u'Marie-Louise', u'Vandenmeulenbos') yield person(u'Emil', u'Eierschal') yield person(u'Lisa', u'Lahm') yield person(u'Bernd', u'Brecht') yield person(u'Karl', u'Keller') yield person(u'Robin', u'Dubois') yield person(u'Denis', u'Denon') yield person(u'Jérôme', u'Jeanémart') s = u"""\ Aachener Straße Akazienweg Alter Malmedyer Weg Am Bahndamm Am Berg Am Waisenbüschchen Auenweg Auf dem Spitzberg Auf'm Rain August-Thonnar-Str. Bahnhofsgasse Bahnhofstraße Bellmerin Bennetsborn Bergkapellstraße Bergstraße Binsterweg Brabantstraße Buchenweg Edelstraße Euregiostraße Favrunpark Feldstraße Fränzel Gewerbestraße Gospert Gülcherstraße Haagenstraße Haasberg Haasstraße Habsburgerweg Heidberg Heidgasse Heidhöhe Herbesthaler Straße Hisselsgasse Hochstraße Hook Hostert Hufengasse Hugo-Zimmermann-Str. Hütte Hütterprivatweg Im Peschgen In den Siepen Industriestraße Johannesstraße Judenstraße Kaperberg Kaplan-Arnolds-Str. Karl-Weiß-Str. Kehrweg Kirchgasse Kirchstraße Klinkeshöfchen Kügelgasse Langesthal Lascheterweg Limburgerweg Lindenweg Lothringerweg Malmedyer Straße Maria-Theresia-Straße Marktplatz Monschauer Straße Mühlenweg Neustraße Nikolausfeld Nispert Noereth Obere Ibern Obere Rottergasse Oestraße Olengraben Panorama Paveestraße Peter-Becker-Str. Rosenweg Rot-Kreuz-Str. Rotenberg Rotenbergplatz Schilsweg Schlüsselhof Schnellewindgasse Schönefeld Schorberg Schulstraße Selterschlag Simarstraße Steinroth Stendrich Stockbergerweg Stockem Theodor-Mooren-Str. Untere Ibern Vervierser Straße Vossengasse Voulfeld Werthplatz Weserstraße """ streets_of_eupen = [ line.strip() for line in s.splitlines() if len(line.strip()) > 0 ] if settings.SITE.abstract_address: nr = 1 #~ CITIES = Cycler(City.objects.all()) eupen = City.objects.get(name="Eupen") STREETS = Cycler(streets_of_eupen) for p in Person.objects.filter(city=eupen): p.street = STREETS.pop() p.street_no = str(nr) p.save() nr += 1 else: nr = 1 for street in streets_of_eupen: for i in range(3): yield address('BE', '4700', 'Eupen', street, str(nr)) nr += 1 ADDRESSES = Cycler(Address.objects.all()) for p in Person.objects.all(): p.address = ADDRESSES.pop() p.save() PERSONS = Cycler(contacts.Person.objects.all()) COMPANIES = Cycler(contacts.Company.objects.all()) ROLES = Cycler(contacts.Role.objects.all()) for i in range(100): com = COMPANIES.pop() yield contact(com, PERSONS.pop(), role=ROLES.pop()) yield contact(com, PERSONS.pop(), role=ROLES.pop()) rumma = contacts.Company.objects.get(name=u"Rumma & Ko OÜ") def user(first_name, last_name, **kw): p = Person(first_name=first_name, last_name=last_name) p.save() return User(person=p, company=rumma, **kw) #~ yield user("Alice","Imedemaal",is_superuser=True) yield user("Alice", "Imedemaal", user_type=UserTypes.admin) yield user("Bert", "Sesamestreet") yield user("Charles", "Braun") dblogger.info("Done contacts demo fixture")
def objects(): global COUNT COUNT += 1 dblogger.info("Started contacts demo fixture %d",COUNT) #~ yield addresstype(**babel_values('name',en="Default",fr=u'Gérant',de=u"Geschäftsführer",et=u"Manager")) yield role(**babel_values('name',en="Manager",fr=u'Gérant',de=u"Geschäftsführer",et=u"Manager")) yield role(**babel_values('name',en="Director",fr=u'Directeur',de=u"Direktor",et=u"Direktor")) yield role(**babel_values('name',en="Secretary",fr=u'Sécrétaire',de=u"Sekretär",et=u"Sekretär")) yield role(**babel_values('name',en="IT Manager",fr=u'Gérant informatique',de=u"EDV-Manager",et=u"IT manager")) yield company(u"Rumma & Ko OÜ", 'EE','10115','Tallinn',u'Tartu mnt','71') yield company(u'Bäckerei Ausdemwald', 'BE', '4700', 'Eupen', u'Vervierser Straße','45') yield company(u'Bäckerei Mießen', 'BE', '4700', 'Eupen', u'Gospert','103') yield company(u'Bäckerei Schmitz', 'BE', '4700', 'Eupen', u'Aachener Straße','53') yield company(u'Garage Mergelsberg', 'BE', '4720', 'Kelmis', u'Kasinostraße','13') yield company(u'Donderweer BV', 'NL', '4816 AR','Breda', 'Edisonstraat','12') yield company(u'Van Achter NV', 'NL', '4836 LG','Breda', 'Hazeldonk','2') yield company(u'Hans Flott & Co', 'DE', '22453','Hamburg',u'Niendorfer Weg','532') yield company(u'Bernd Brechts Bücherladen','DE', '80333',u'München',u'Brienner Straße','18') yield company(u'Reinhards Baumschule','DE', '12487 ',u'Berlin',u'Segelfliegerdamm','123') yield company(u'Moulin Rouge', 'FR', '75018','Paris',u'Boulevard de Clichy','82') yield company(u'Auto École Verte','FR', '54000 ','Nancy',u'rue de Mon Désert','12') #~ yield person(u'Luc', u'Saffre', gender=Gender.male) yield person(u'Andreas', u'Arens', 'BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Annette', u'Arens','BE','4700','Eupen', gender=mixins.Genders.female) yield person(u'Hans', u'Altenberg','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Alfons', u'Ausdemwald','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Laurent', u'Bastiaensen','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Charlotte', u'Collard','BE','4700','Eupen', gender=mixins.Genders.female) yield person(u'Ulrike', u'Charlier','BE','4700','Eupen', gender=mixins.Genders.female) yield person(u'Marc', u'Chantraine','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Daniel', u'Dericum','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Dorothée', u'Demeulenaere','BE','4700','Eupen', gender=mixins.Genders.female) yield person(u'Berta', u'Ernst','BE','4700','Eupen', gender=mixins.Genders.female) yield person(u'Bernd', u'Evertz','BE','4700','Eupen', gender=mixins.Genders.male) yield person(u'Eberhart', u'Evers','BE','4700','Eupen', gender=Gender.male) yield person(u'Daniel', u'Emonts','BE','4700','Eupen', gender=Gender.male) yield person(u'Edgar', u'Engels','BE','4700','Eupen', gender=Gender.male) yield person(u'Luc', u'Faymonville','BE','4700','Eupen', gender=Gender.male) yield person(u'Gérard', u'Gernegroß','BE','4700','Eupen', gender=Gender.male) yield person(u'Werner', u'Groteclaes','BE','4700','Eupen', gender=Gender.male) yield person(u'Grete', u'Hilgers','BE','4700','Eupen', gender=Gender.female) yield person(u'Hans', u'Hilgers','BE','4700','Eupen', gender=Gender.male) yield person(u'Irene', u'Ingels','BE','4700','Eupen', gender=Gender.female) yield person(u'Jérémy', u'Jansen','BE','4700','Eupen', gender=Gender.male) yield person(u'Jean-Pierre', u'Jacob','BE','4700','Eupen', gender=Gender.male) yield person(u'Herbert', u'Johnen','BE','4700','Eupen', gender=Gender.male) yield person(u'Johannes', u'Jonas','BE','4700','Eupen', gender=Gender.male) yield person(u'Jan', u'Jousten','BE','4700','Eupen', gender=Gender.male) yield person(u'Karl', u'Kaivers','BE','4700','Eupen', gender=Gender.male) yield person(u'Guido', u'Lambertz','BE','4700','Eupen', gender=Gender.male) yield person(u'Luc', u'Laschet','BE','4700','Eupen', gender=Gender.male) yield person(u'Line', u'Lazarus','BE','4700','Eupen', gender=Gender.female) yield person(u'Josefine', u'Leffin','BE','4700','Eupen', gender=Gender.female) yield person(u'Marc', u'Malmendier','BE','4700','Eupen', gender=Gender.male) yield person(u'Leo', u'Meessen','BE','4700','Eupen', gender=Gender.male) yield person(u'Franz', u'Mießen','BE','4700','Eupen', gender=Gender.male) yield person(u'Marie-Louise', u'Meier','BE','4700','Eupen', gender=Gender.female) yield person(u'Erich', u'Emonts', 'BE','4730','Raeren', gender=Gender.male) yield person(u'Erwin', u'Emontspool', 'BE','4730','Raeren', gender=Gender.male) yield person(u'Erna', u'Emonts-Gast', 'BE','4730','Raeren', gender=Gender.female) yield person(u'Alfons', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Berta', u'Radermacher','BE','4730','Raeren', gender=Gender.female) yield person(u'Christian', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Daniela', u'Radermacher','BE','4730','Raeren', gender=Gender.female) yield person(u'Edgard', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Fritz', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Guido', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Hans', u'Radermacher','BE','4730','Raeren', gender=Gender.male) yield person(u'Hedi', u'Radermacher','BE','4730','Raeren', gender=Gender.female) yield person(u'Inge', u'Radermacher','BE','4730','Raeren', gender=Gender.female) yield person(u'Jean', u'Radermacher','BE','4730','Raeren', gender=Gender.male) # special challenges for alphabetic ordering yield person(u'Elio', u'di Rupo') yield person(u'Leonardo', u'da Vinci') yield person(u'Herman', u'van Veen') yield person(u'Rein', u'Õunapuu') yield person(u'Otto', u'Östges') yield person(u'Erna', u'Ärgerlich') yield person(u'Bernard',u'Bodard',title='Dr.') yield person(u'Jean',u'Dupont') yield person(u'Mark',u'Martelaer') yield person(u'Rik',u'Radermecker') yield person(u'Marie-Louise',u'Vandenmeulenbos') yield person(u'Emil',u'Eierschal') yield person(u'Lisa',u'Lahm') yield person(u'Bernd',u'Brecht') yield person(u'Karl',u'Keller') yield person(u'Robin',u'Dubois') yield person(u'Denis',u'Denon') yield person(u'Jérôme',u'Jeanémart') s = u"""\ Aachener Straße Akazienweg Alter Malmedyer Weg Am Bahndamm Am Berg Am Waisenbüschchen Auenweg Auf dem Spitzberg Auf'm Rain August-Thonnar-Str. Bahnhofsgasse Bahnhofstraße Bellmerin Bennetsborn Bergkapellstraße Bergstraße Binsterweg Brabantstraße Buchenweg Edelstraße Euregiostraße Favrunpark Feldstraße Fränzel Gewerbestraße Gospert Gülcherstraße Haagenstraße Haasberg Haasstraße Habsburgerweg Heidberg Heidgasse Heidhöhe Herbesthaler Straße Hisselsgasse Hochstraße Hook Hostert Hufengasse Hugo-Zimmermann-Str. Hütte Hütterprivatweg Im Peschgen In den Siepen Industriestraße Johannesstraße Judenstraße Kaperberg Kaplan-Arnolds-Str. Karl-Weiß-Str. Kehrweg Kirchgasse Kirchstraße Klinkeshöfchen Kügelgasse Langesthal Lascheterweg Limburgerweg Lindenweg Lothringerweg Malmedyer Straße Maria-Theresia-Straße Marktplatz Monschauer Straße Mühlenweg Neustraße Nikolausfeld Nispert Noereth Obere Ibern Obere Rottergasse Oestraße Olengraben Panorama Paveestraße Peter-Becker-Str. Rosenweg Rot-Kreuz-Str. Rotenberg Rotenbergplatz Schilsweg Schlüsselhof Schnellewindgasse Schönefeld Schorberg Schulstraße Selterschlag Simarstraße Steinroth Stendrich Stockbergerweg Stockem Theodor-Mooren-Str. Untere Ibern Vervierser Straße Vossengasse Voulfeld Werthplatz Weserstraße """ streets_of_eupen = [ line.strip() for line in s.splitlines() if len(line.strip()) > 0 ] if settings.SITE.abstract_address: nr = 1 #~ CITIES = Cycler(City.objects.all()) eupen = City.objects.get(name="Eupen") STREETS = Cycler(streets_of_eupen) for p in Person.objects.filter(city=eupen): p.street = STREETS.pop() p.street_no = str(nr) p.save() nr += 1 else: nr = 1 for street in streets_of_eupen: for i in range(3): yield address('BE','4700','Eupen',street,str(nr)) nr += 1 ADDRESSES = Cycler(Address.objects.all()) for p in Person.objects.all(): p.address = ADDRESSES.pop() p.save() PERSONS = Cycler(contacts.Person.objects.all()) COMPANIES = Cycler(contacts.Company.objects.all()) ROLES = Cycler(contacts.Role.objects.all()) for i in range(100): com = COMPANIES.pop() yield contact(com,PERSONS.pop(),role=ROLES.pop()) yield contact(com,PERSONS.pop(),role=ROLES.pop()) rumma = contacts.Company.objects.get(name=u"Rumma & Ko OÜ") def user(first_name,last_name,**kw): p = Person(first_name=first_name,last_name=last_name) p.save() return User(person=p,company=rumma,**kw) #~ yield user("Alice","Imedemaal",is_superuser=True) yield user("Alice","Imedemaal",profile=UserProfiles.admin) yield user("Bert","Sesamestreet") yield user("Charles","Braun") dblogger.info("Done contacts demo fixture")
from django.utils.translation import ugettext as _ from lino.core.dbutils import resolve_model from lino.utils.instantiator import Instantiator from north.dbutils import babel_values #~ from lino.utils.choicelists import Gender #~ from lino.utils.perms import UserLevels #~ from lino.core.perms import UserProfiles from lino.utils import dblogger from lino.utils import Cycler from lino.sandbox.contacts import models as contacts #~ print 20120225, 'settings.FIXTURE_DIRS is', settings.FIXTURE_DIRS dblogger.info("Imported contacts demo fixture") COUNT = 0 #~ addresstype= Instantiator('contacts.AddressType',"name").build role = Instantiator('contacts.Role',"name").build #~ person = Instantiator('contacts.Person',"first_name last_name").build #~ company = Instantiator('contacts.Company',"name").build #~ contact = Instantiator('contacts.Contact').build Company = contacts.Company Person = contacts.Person User = contacts.User City = resolve_model('countries.City') if not settings.SITE.abstract_address:
def watch(data_dir): "Deserves more documentation." infile = os.path.join(data_dir, "changelog.json") if not os.path.exists(infile): # ~ print "Nothing to do." return watching = os.path.join(data_dir, "changelog.watching.json") if not os.path.exists(watching): try: os.rename(infile, watching) except Exception, e: dblogger.debug("Could not rename %s to %s: %s", infile, watching, e) return dblogger.info("Processing file %s", watching) fd_watching = codecs.open(watching, "r", encoding="cp850") failed = os.path.join(data_dir, "changelog.failed.json") fd_failed = codecs.open(failed, "a", encoding="cp850") # ~ log = open(os.path.join(data_dir,'changelog.done.log'),'a') i = 0 for ln in fd_watching.readlines(): i += 1 dblogger.debug("process_line(%r,%r)", i, ln) try: process_line(ln) except Exception, e: # ~ raise fd_failed.write("// %s %r\n%s\n\n" % (time.strftime("%Y-%m-%d %H:%M:%S"), e, ln)) # ~ fd_failed.write(ln+'\n')
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)