def objects(): last_names = demonames.LAST_NAMES_BELGIUM male_first_names = demonames.MALE_FIRST_NAMES_FRANCE female_first_names = demonames.FEMALE_FIRST_NAMES_FRANCE Person = dd.resolve_model("contacts.Person") Place = dd.resolve_model('countries.Place') CITIES = Cycler( Place.objects.filter(country_id='BE', zip_code__startswith='40')) STREETS = demonames.streets_of_liege() common = dict(language='fr', country_id='BE') for i in range(100): yield Person( first_name=male_first_names.pop(), last_name=last_names.pop(), gender=mixins.Genders.male, city=CITIES.pop(), street=STREETS.pop(), **common ) yield Person( first_name=female_first_names.pop(), last_name=last_names.pop(), gender=mixins.Genders.female, city=CITIES.pop(), street=STREETS.pop(), **common )
def objects(): yield sales.InvoicingMode(**babel_values('name',en='Default',de=u"Standard",fr=u"Standard")) if ledger: Invoice = dd.resolve_model('sales.Invoice') InvoiceItem = dd.resolve_model('sales.InvoiceItem') vt = ledger.VoucherTypes.get_for_model(Invoice) JOURNALS = Cycler(vt.get_journals()) PARTNERS = Cycler(Partner.objects.all()) USERS = Cycler(settings.SITE.user_model.objects.all()) PRODUCTS = Cycler(products.Product.objects.all()) ITEMCOUNT = Cycler(1,2,3) for i in range(20): jnl = JOURNALS.pop() invoice = Invoice(journal=jnl, partner=PARTNERS.pop(), user=USERS.pop(), date=settings.SITE.demo_date(-30+2*i)) yield invoice for j in range(ITEMCOUNT.pop()): item = InvoiceItem(voucher=invoice, #~ account=jnl.get_allowed_accounts()[0], product=PRODUCTS.pop(), ) item.product_changed(REQUEST) item.before_ui_save(REQUEST) #~ if item.total_incl: #~ print "20121208 ok", item #~ else: #~ if item.product.price: #~ raise Exception("20121208") yield item invoice.register(REQUEST) invoice.save()
def __init__(self,model,table_class): self.table_class = table_class model = dd.resolve_model(model) self.model = model value = dd.full_model_name(model) text = model._meta.verbose_name + ' (%s)' % dd.full_model_name(model) #~ text = model._meta.verbose_name + ' (%s.%s)' % (model.__module__,model.__name__) name = None super(VoucherType,self).__init__(value,text,name)
def objects(): if False and notes: NoteType = dd.resolve_model('notes.NoteType') yield NoteType( template="Letter.odt", build_method="appyodt", body_template="payment_reminder.body.html", **babel_values('name', en="Payment reminder", fr="Rappel de paiement", de="Zahlungserinnerung"))
def objects(): ExcerptType = dd.resolve_model('excerpts.ExcerptType') for cls in dd.models_by_base(Certifiable): kw = dd.str2kw(cls._meta.verbose_name, 'name') if False: kw.update(backward_compat=True) yield ExcerptType( template='Default.odt', primary=True, certifying=True, content_type=ContentType.objects.get_for_model(cls), **kw)
def create_pupil_choice(self, text): """ Called when an unknown pupil name was given. Try to auto-create it. """ Pupil = dd.resolve_model(config.pupil_model) kw = parse_name(text) if len(kw) != 2: raise ValidationError( "Cannot find first and last names in %r to \ auto-create pupil", text) p = Pupil(**kw) p.full_clean() p.save() return p
def my_pre_ui_build(sender, **kw): self = settings.SITE if self.is_installed('contenttypes'): from django.db.utils import DatabaseError from django.db.models import FieldDoesNotExist try: HelpText = dd.resolve_model('system.HelpText') for ht in HelpText.objects.filter(help_text__isnull=False): #~ logger.info("20120629 %s.help_text", ht) try: resolve_field(unicode(ht)).help_text = ht.help_text except FieldDoesNotExist as e: #~ logger.debug("No help texts : %s",e) pass except DatabaseError, e: logger.debug("No help texts : %s", e) pass
def get_slave_summary(self, obj, ar): sar = self.request(master_instance=obj) elems = [] # n = sar.get_total_count() # if n == 0: # elems += [_("Not member of any household."), E.br()] # else: items = [] for m in sar.data_iterator: args = (unicode(m.role), _(" in "), ar.obj2html(m.household)) if m.primary: items.append(E.li(E.b("\u2611 ", *args))) else: btn = m.set_primary.as_button_elem( ar, "\u2610 ", style="text-decoration:none;") items.append(E.li(btn, *args)) if len(items) > 0: elems += [_("%s is") % obj] elems.append(E.ul(*items)) if False: elems += [ E.br(), ar.instance_action_button(obj.create_household)] else: elems += [E.br(), _("Create a household"), ' : '] Type = rt.modules.households.Type Person = dd.resolve_model(config.person_model) T = Person.get_default_table() ba = T.get_action_by_name('create_household') buttons = [] for t in Type.objects.all(): apv = dict(type=t, head=obj) sar = ar.spawn(ba, # master_instance=obj, action_param_values=apv) buttons.append(ar.href_to_request(sar, unicode(t))) elems += join_elems(buttons, sep=' / ') return E.div(*elems)
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.modules.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 == mixins.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 objects(): """ This will be called by the :term:`north` deserializer and must yield a list of object instances to be saved. """ Place = resolve_model('lets.Place') Provider = resolve_model('lets.Provider') Customer = resolve_model('lets.Customer') Product = resolve_model('lets.Product') Offer = resolve_model('lets.Offer') Demand = resolve_model('lets.Demand') yield Place(name="Tallinn") yield Place(name="Tartu") yield Place(name="Vigala") yield Place(name="Haapsalu") yield Provider(name="Priit", place=findbyname(Place, "Tallinn")) yield Provider(name="Argo", place=findbyname(Place, "Haapsalu")) yield Provider(name=u"Tõnis", place=findbyname(Place, "Vigala")) yield Provider(name="Anne", place=findbyname(Place, "Tallinn")) yield Provider(name="Jaanika", place=findbyname(Place, "Tallinn")) yield Customer(name="Henri", place=findbyname(Place, "Tallinn")) yield Customer(name="Mare", place=findbyname(Place, "Tartu")) yield Customer(name=u"Külliki", place=findbyname(Place, "Vigala")) yield Product(name="Leib") yield Product(name="Tatar") yield Product(name="Kanamunad") yield Offer(product=findbyname(Product, "Leib"), provider=findbyname(Provider, "Priit")) yield Offer(product=findbyname(Product, "Tatar"), provider=findbyname(Provider, "Priit")) yield Offer(product=findbyname(Product, "Tatar"), provider=findbyname(Provider, "Anne")) yield Demand(product=findbyname(Product, "Tatar"), customer=findbyname(Customer, "Henri")) yield Demand(product=findbyname(Product, "Kanamunad"), customer=findbyname(Customer, "Henri")) yield Demand(product=findbyname(Product, "Kanamunad"), customer=findbyname(Customer, "Mare"))
#import time #from datetime import date #from dateutil import parser as dateparser #from lino.projects.finan import models as finan #~ import decimal from decimal import Decimal from django.conf import settings from lino import dd from lino.utils import Cycler from lino.utils.instantiator import Instantiator, i2d from lino.core.dbutils import resolve_model partner_model = settings.SITE.partners_app_label + '.Partner' Partner = dd.resolve_model(partner_model) REQUEST = None def objects(): ledger = dd.resolve_app('ledger') finan = dd.resolve_app('finan') #~ partners = dd.resolve_app('partners') #~ contacts = dd.resolve_app('contacts') MODEL = finan.BankStatement
not complete enough to be of real benefit, but publicly available at http://belref.lino-framework.org/ """ from __future__ import unicode_literals import re abbrRE = re.compile("^(.*)\s*\((.*)\)\s*", re.DOTALL) from north import dbutils from lino import dd, rt Concept = dd.resolve_model('concepts.Concept') Link = dd.resolve_model('concepts.Link') from lino.modlib.concepts.models import LinkTypes def C(en, de, fr='', nl='', jargon=None, obsoletes=None, **kw): texts = dict(en=en, de=de, fr=fr, nl=nl) name = dict() abbr = dict() for lang in 'en', 'de', 'fr', 'nl': t = texts.get(lang) if t: mo = abbrRE.match(t) if mo: abbr[lang] = mo.group(1).strip()
def objects(): if settings.SITE.get_language_info('de'): munich = 'München' else: munich = 'Munich' # en, fr if settings.SITE.get_language_info('fr'): kelmis = 'La Calamine' else: kelmis = 'Kelmis' # en, de company = Instantiator( 'contacts.Company', "name zip_code city:name street street_no", country='EE').build yield company('Rumma & Ko OÜ', '10115', 'Tallinn', 'Tartu mnt', '71') company = Instantiator( 'contacts.Company', "name zip_code city:name street street_no", country='BE').build yield company('Bäckerei Ausdemwald', '4700', 'Eupen', 'Vervierser Straße', '45') yield company('Bäckerei Mießen', '4700', 'Eupen', 'Gospert', '103') yield company('Bäckerei Schmitz', '4700', 'Eupen', 'Aachener Straße', '53') yield company('Garage Mergelsberg', '4720', kelmis, 'Kasinostraße', '13') company = Instantiator( 'contacts.Company', "name zip_code city:name street street_no", country='NL').build yield company('Donderweer BV', '4816 AR', 'Breda', 'Edisonstraat', '12') yield company('Van Achter NV', '4836 LG', 'Breda', 'Hazeldonk', '2') company = Instantiator( 'contacts.Company', "name zip_code city:name street street_no", country='DE').build yield company('Hans Flott & Co', '22453', 'Hamburg', 'Niendorfer Weg', '532') yield company('Bernd Brechts Bücherladen', '80333', munich, 'Brienner Straße', '18') yield company('Reinhards Baumschule', '12487 ', 'Berlin', 'Segelfliegerdamm', '123') company = Instantiator( 'contacts.Company', "name zip_code city:name street street_no", country='FR').build yield company('Moulin Rouge', '75018', 'Paris', 'Boulevard de Clichy', '82') yield company('Auto École Verte', '54000 ', 'Nancy', 'rue de Mon Désert', '12') Place = dd.resolve_model('countries.Place') eupen = Place.objects.get(name__exact='Eupen') person = Instantiator("contacts.Person", "first_name last_name", country='BE', city=eupen, zip_code='4700').build yield person('Andreas', 'Arens', gender=mixins.Genders.male) yield person('Annette', 'Arens', gender=mixins.Genders.female) yield person('Hans', 'Altenberg', gender=mixins.Genders.male) yield person('Alfons', 'Ausdemwald', gender=mixins.Genders.male) yield person('Laurent', 'Bastiaensen', gender=mixins.Genders.male) yield person('Charlotte', 'Collard', gender=mixins.Genders.female) yield person('Ulrike', 'Charlier', gender=mixins.Genders.female) yield person('Marc', 'Chantraine', gender=mixins.Genders.male) yield person('Daniel', 'Dericum', gender=mixins.Genders.male) yield person('Dorothée', 'Demeulenaere', gender=mixins.Genders.female) yield person('Dorothée', 'Dobbelstein-Demeulenaere', gender=mixins.Genders.female) yield person('Dorothée', 'Dobbelstein', gender=mixins.Genders.female) yield person('Berta', 'Ernst', gender=mixins.Genders.female) yield person('Bernd', 'Evertz', gender=mixins.Genders.male) yield person('Eberhart', 'Evers', gender=mixins.Genders.male) yield person('Daniel', 'Emonts', gender=mixins.Genders.male) yield person('Edgar', 'Engels', gender=mixins.Genders.male) yield person('Luc', 'Faymonville', gender=mixins.Genders.male) yield person('Germaine', 'Gernegroß', gender=mixins.Genders.female) yield person('Gregory', 'Groteclaes', gender=mixins.Genders.male) yield person('Hildegard', 'Hilgers', gender=mixins.Genders.female) yield person('Henri', 'Hilgers', gender=mixins.Genders.male) yield person('Irene', 'Ingels', gender=mixins.Genders.female) yield person('Jérémy', 'Jansen', gender=mixins.Genders.male) yield person('Jacqueline', 'Jacobs', gender=mixins.Genders.female) yield person('Johann', 'Johnen', gender=mixins.Genders.male) yield person('Josef', 'Jonas', gender=mixins.Genders.male) yield person('Jan', 'Jousten', gender=mixins.Genders.male) yield person('Karl', 'Kaivers', gender=mixins.Genders.male) yield person('Guido', 'Lambertz', gender=mixins.Genders.male) yield person('Laura', 'Laschet', gender=mixins.Genders.female) yield person('Line', 'Lazarus', gender=mixins.Genders.female) yield person('Josefine', 'Leffin', gender=mixins.Genders.female) yield person('Marc', 'Malmendier', gender=mixins.Genders.male) yield person('Melissa', 'Meessen', gender=mixins.Genders.female) yield person('Michael', 'Mießen', gender=mixins.Genders.male) yield person('Marie-Louise', 'Meier', gender=mixins.Genders.female) raeren = Place.objects.get(name__exact='Raeren') person = Instantiator( "contacts.Person", "first_name last_name", country='BE', language=settings.SITE.DEFAULT_LANGUAGE.django_code, city=raeren, zip_code='4730').build yield person('Erich', 'Emonts', gender=mixins.Genders.male) yield person('Erwin', 'Emontspool', gender=mixins.Genders.male) yield person('Erna', 'Emonts-Gast', gender=mixins.Genders.female) yield person('Alfons', 'Radermacher', gender=mixins.Genders.male) yield person('Berta', 'Radermacher', gender=mixins.Genders.female) yield person('Christian', 'Radermacher', gender=mixins.Genders.male) yield person('Daniela', 'Radermacher', gender=mixins.Genders.female) yield person('Edgard', 'Radermacher', gender=mixins.Genders.male) yield person('Fritz', 'Radermacher', gender=mixins.Genders.male) yield person('Guido', 'Radermacher', gender=mixins.Genders.male) yield person('Hans', 'Radermacher', gender=mixins.Genders.male) yield person('Hedi', 'Radermacher', gender=mixins.Genders.female) yield person('Inge', 'Radermacher', gender=mixins.Genders.female) yield person('Jean', 'Radermacher', gender=mixins.Genders.male) # special challenges for alphabetic ordering yield person('Didier', 'di Rupo', gender=mixins.Genders.male) yield person('David', 'da Vinci', gender=mixins.Genders.male) yield person('Vincent', 'van Veen', gender=mixins.Genders.male) yield person('Õie', 'Õunapuu', gender=mixins.Genders.female) yield person('Otto', 'Östges', gender=mixins.Genders.male) yield person('Erna', 'Ärgerlich', gender=mixins.Genders.female) person = Instantiator("contacts.Person", country='BE', city=Place.objects.get(name__exact='Angleur')).build yield person(first_name='Bernard', last_name='Bodard', title='Dr.') yield person(first_name='Jean', last_name='Dupont') person = Instantiator("contacts.Person", country='NL', city=Place.objects.get( name__exact='Amsterdam')).build yield person(first_name='Mark', last_name='Martelaer', gender=mixins.Genders.male) yield person(first_name='Rik', last_name='Radermecker', gender=mixins.Genders.male) yield person(first_name='Marie-Louise', last_name='Vandenmeulenbos', gender=mixins.Genders.female) person = Instantiator("contacts.Person", country='DE').build yield person(first_name='Emil', last_name='Eierschal', gender=mixins.Genders.male) yield person(first_name='Lisa', last_name='Lahm', gender=mixins.Genders.female) yield person(first_name='Bernd', last_name='Brecht', gender=mixins.Genders.male) yield person(first_name='Karl', last_name='Keller', gender=mixins.Genders.male) person = Instantiator("contacts.Person", country='FR').build yield person(first_name='Robin', last_name='Dubois', gender=mixins.Genders.male) yield person(first_name='Denis', last_name='Denon', gender=mixins.Genders.male) yield person(first_name='Jérôme', last_name='Jeanémart', gender=mixins.Genders.male) 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] i = 0 nr = 1 for p in dd.resolve_model("contacts.Person").objects.filter(city=eupen): p.street = streets_of_eupen[i] p.stret_no = str(nr) p.save() nr += 1 if i < len(streets_of_eupen): i += 1 else: i = 0
def objects(): Company = dd.resolve_model('contacts.Company') Person = dd.resolve_model('contacts.Person') Product = dd.resolve_model('products.Product') if False: # old system MODEL = ledger.AccountInvoice vt = ledger.VoucherTypes.get_for_model(MODEL) JOURNALS = Cycler(vt.get_journals()) Partner = dd.resolve_model(partner_model) #~ logger.info("20130105 mini Partners %s",Partner.objects.all().count()) #~ PARTNERS = Cycler(Partner.objects.order_by('name')) PARTNERS = Cycler(Company.objects.order_by('id')) USERS = Cycler(settings.SITE.user_model.objects.all()) AMOUNTS = Cycler([Decimal(x) for x in "2.50 6.80 9.95 14.50 20 29.90 39.90 39.90 99.95 199.95 599.95 1599.99".split()]) ITEMCOUNT = Cycler(1, 2, 3) for i in range(10): u = USERS.pop() jnl = JOURNALS.pop() invoice = MODEL(journal=jnl, partner=PARTNERS.pop(), user=u, date=settings.SITE.demo_date(-30 + i)) yield invoice ar = MODEL.request(user=u) for j in range(ITEMCOUNT.pop()): item = ledger.InvoiceItem(voucher=invoice, account=jnl.get_allowed_accounts()[ 0], #~ product=PRODUCTS.pop(), total_incl=AMOUNTS.pop() ) item.total_incl_changed(ar) item.before_ui_save(ar) #~ if item.total_incl: #~ print "20121208 ok", item #~ else: #~ if item.product.price: #~ raise Exception("20121208") yield item invoice.register(ar) invoice.save() USERS = Cycler(settings.SITE.user_model.objects.all()) if sales: yield Product(name="Foo", sales_price='399.90') yield Product(name="Bar", sales_price='599.90') yield Product(name="Baz", sales_price='990.00') PRODUCTS = Cycler(Product.objects.order_by('id')) JOURNAL_S = ledger.Journal.objects.get(ref="S") #~ assert JOURNAL_S.dc == accounts.DEBIT CUSTOMERS = Cycler(Person.objects.order_by('id')) ITEMCOUNT = Cycler(1, 2, 3) QUANTITIES = Cycler(5, 1, 2, 3) SALES_PER_MONTH = Cycler(2, 1, 3, 2, 0) PROVIDERS = Cycler(Company.objects.order_by('id')) JOURNAL_P = ledger.Journal.objects.get(ref="P") #~ assert JOURNAL_P.dc == accounts.CREDIT ACCOUNTS = Cycler(JOURNAL_P.get_allowed_accounts()) AMOUNTS = Cycler([Decimal(x) for x in "20 29.90 39.90 99.95 199.95 599.95 1599.99".split()]) AMOUNT_DELTAS = Cycler([Decimal(x) for x in "0 0.60 1.10 1.30 2.50".split()]) DATE_DELTAS = Cycler((1, 2, 3, 4, 5, 6, 7)) INFLATION_RATE = Decimal("0.02") """ 5 "purchase stories" : each story represents a provider who sends monthly invoices. """ PURCHASE_STORIES = [] for i in range(5): # provider, (account,amount) story = (PROVIDERS.pop(), []) story[1].append((ACCOUNTS.pop(), AMOUNTS.pop())) if i % 3: story[1].append((ACCOUNTS.pop(), AMOUNTS.pop())) PURCHASE_STORIES.append(story) #~ date = settings.SITE.demo_date() + delta(years=-2) START_YEAR = settings.SITE.start_year # 2011 date = datetime.date(START_YEAR, 1, 1) end_date = datetime.date(2013, 5, 1) while date < end_date: if sales: for i in range(SALES_PER_MONTH.pop()): #~ print __file__, date invoice = sales.Invoice(journal=JOURNAL_S, partner=CUSTOMERS.pop(), user=USERS.pop(), date=date + delta(days=10 + DATE_DELTAS.pop())) yield invoice for j in range(ITEMCOUNT.pop()): item = sales.InvoiceItem(voucher=invoice, product=PRODUCTS.pop(), qty=QUANTITIES.pop() ) item.product_changed(REQUEST) item.before_ui_save(REQUEST) #~ if item.total_incl: #~ print "20121208 ok", item #~ else: #~ if item.product.price: #~ raise Exception("20121208") yield item #~ invoice.set_workflow_state('registered') # ~ invoice.state = 'registered' # automatically call invoice.register(REQUEST) invoice.save() for story in PURCHASE_STORIES: invoice = ledger.AccountInvoice(journal=JOURNAL_P, partner=story[0], user=USERS.pop(), date=date + delta(days=DATE_DELTAS.pop())) yield invoice for account, amount in story[1]: amount += amount + \ (amount * INFLATION_RATE * (date.year - START_YEAR)) item = ledger.InvoiceItem(voucher=invoice, account=account, total_incl=amount + AMOUNT_DELTAS.pop() ) item.total_incl_changed(REQUEST) item.before_ui_save(REQUEST) #~ if item.total_incl: #~ print "20121208 ok", item #~ else: #~ if item.product.price: #~ raise Exception("20121208") yield item invoice.register(REQUEST) invoice.save() # last month not yet done if finan and (end_date - date) > MORE_THAN_A_MONTH: #~ po = finan.PaymentOrder(journal=JOURNAL_PO, JOURNAL_PO = ledger.Journal.objects.get(ref="PO") po = JOURNAL_PO.create_voucher( user=USERS.pop(), date=date + delta(days=20)) yield po suggestions = finan.SuggestionsByPaymentOrder.request(po) ba = finan.SuggestionsByPaymentOrder.get_action_by_name('do_fill') ar = ba.request(master_instance=po) ar.selected_rows = [x for x in suggestions] ar.run() po.register(REQUEST) po.save() #~ bs = finan.BankStatement(journal=JOURNAL_BANK, JOURNAL_BANK = ledger.Journal.objects.get(ref="B") bs = JOURNAL_BANK.create_voucher( user=USERS.pop(), date=date + delta(days=28)) yield bs suggestions = finan.SuggestionsByBankStatement.request(bs) ba = suggestions.actor.get_action_by_name('do_fill') ar = ba.request(master_instance=bs) ar.selected_rows = [x for x in suggestions] ar.run() bs.register(REQUEST) bs.save() date += delta(months=1)
""" Run using:: python manage.py run 0914.py """ if False: # TIMTOWTDI: the following is equivalent from django.conf import settings settings.LINO.startup() root = settings.LINO.user_model.objects.get(username="******") ar = settings.LINO.modules.pcsw.UsersWithClients.request(user=root) print ar.to_rst() else: from lino import dd pcsw = dd.resolve_app("pcsw") User = dd.resolve_model("users.User") root = User.objects.get(username="******") print pcsw.UsersWithClients.request(user=root).to_rst()
def kernel_startup(kernel, self): """This is a part of a Lino site setup. The Django Model definitions are done, now Lino analyzes them and does certain actions: - Verify that there are no more pending injects - Install a DisableDeleteHandler for each Model into `_lino_ddh` - Install :class:`lino.dd.Model` attributes and methods into Models that don't inherit from it. """ if len(sys.argv) == 0: process_name = 'WSGI' else: process_name = ' '.join(sys.argv) #~ logger.info("Started %s on %r (PID %s).", process_name,self.title,os.getpid()) logger.info("Started %s (using %s) --> PID %s", process_name, settings.SETTINGS_MODULE, os.getpid()) logger.info(self.welcome_text()) def goodbye(): logger.info("Done %s (PID %s)", process_name, os.getpid()) atexit.register(goodbye) models_list = models.get_models(include_auto_created=True) # this also triggers django.db.models.loading.cache._populate() if self.user_model: self.user_model = dd.resolve_model(self.user_model, strict="Unresolved model '%s' in user_model.") if self.project_model: self.project_model = dd.resolve_model( self.project_model, strict="Unresolved model '%s' in project_model.") for app_name_model, p in self.override_modlib_models.items(): # app_name_model is the full installed app module name + # the model name. It certainly contains at least one dot. m = '.'.join(app_name_model.split('.')[-2:]) dd.resolve_model( m, strict="%s plugin tries to extend unresolved model '%%s'" % p.__class__.__module__) for model in models_list: #~ print 20130216, model #~ fix_field_cache(model) model._lino_ddh = DisableDeleteHandler(model) dd.Model.django2lino(model) if isinstance(model.hidden_columns, basestring): model.hidden_columns = frozenset( dd.fields_list(model, model.hidden_columns)) if isinstance(model.active_fields, basestring): model.active_fields = frozenset( dd.fields_list(model, model.active_fields)) if isinstance(model.allow_cascaded_delete, basestring): model.allow_cascaded_delete = tuple( dd.fields_list(model, model.allow_cascaded_delete)) if model._meta.abstract: raise Exception("Tiens?") # self.modules.define(model._meta.app_label, model.__name__, model) for f in model._meta.virtual_fields: if isinstance(f, generic.GenericForeignKey): settings.SITE.GFK_LIST.append(f) # vip_classes = (layouts.BaseLayout, fields.Dummy) # for a in models.get_apps(): # app_label = a.__name__.split('.')[-2] # for k, v in a.__dict__.items(): # if isinstance(v, type) and issubclass(v, vip_classes): # self.modules.define(app_label, k, v) # if k.startswith('setup_'): # self.modules.define(app_label, k, v) self.setup_choicelists() self.setup_workflows() for model in models_list: for f, m in model._meta.get_fields_with_model(): # Refuse nullable CharFields, but don't trigger on # NullableCharField (which is a subclass of CharField). if f.__class__ is models.CharField and f.null: msg = "Nullable CharField %s in %s" % (f.name, model) raise Exception(msg) #~ if f.__class__ is models.CharField: #~ raise Exception(msg) #~ else: #~ logger.info(msg) elif isinstance(f, models.ForeignKey): #~ f.rel.to = dd.resolve_model(f.rel.to,strict=True) if isinstance(f.rel.to, basestring): raise Exception("%s %s relates to %r (models are %s)" % (model, f.name, f.rel.to, models_list)) set_default_verbose_name(f) """ If JobProvider is an MTI child of Company, then mti.delete_child(JobProvider) must not fail on a JobProvider being refered only by objects that can refer to a Company as well. """ if hasattr(f.rel.to, '_lino_ddh'): f.rel.to._lino_ddh.add_fk(m or model, f) for p in self.installed_plugins: if isinstance(p, LinoPlugin): p.before_analyze(self) dd.pre_analyze.send(self, models_list=models_list) # MergeActions are defined in pre_analyze. # And MergeAction needs the info in _lino_ddh to correctly find # keep_volatiles for model in models_list: """ Virtual fields declared on the model must have been attached before calling Model.site_setup(), e.g. because pcsw.Person.site_setup() declares `is_client` as imported field. """ model.on_analyze(self) for k, v in class_dict_items(model): if isinstance(v, dd.VirtualField): v.attach_to_model(model, k) #~ logger.info("20130817 attached model vfs") actors.discover() logger.debug("actors.initialize()") for a in actors.actors_list: a.class_init() dbtables.discover() #~ choosers.discover() actions.discover_choosers() #~ from lino.core import ui #~ ui.site_setup(self) for a in actors.actors_list: a.on_analyze(self) #~ logger.info("20130121 GFK_LIST is %s",['%s.%s'%(full_model_name(f.model),f.name) for f in settings.SITE.GFK_LIST]) dd.post_analyze.send(self, models_list=models_list) logger.info("Languages: %s. %d apps, %d models, %s actors.", ', '.join([li.django_code for li in self.languages]), len(self.modules), len(models_list), len(actors.actors_list)) #~ logger.info(settings.INSTALLED_APPS) self.on_each_app('site_setup') # Actor.after_site_setup() is called after the apps' # site_setup(). Example: pcsw.site_setup() adds a detail to # properties.Properties, the base class for # properties.PropsByGroup. The latter would not install a # `detail_action` during her after_site_setup() and also would # never get it later. for a in actors.actors_list: a.after_site_setup(self) #~ self.on_site_startup() self.resolve_virtual_fields()
def pupil_choices(cls, course): Pupil = dd.resolve_model(config.pupil_model) return Pupil.objects.all()
def startup_site(self): """ This is the code that runs when you call :meth:`lino.site.Site.startup`. This is a part of a Lino site setup. The Django Model definitions are done, now Lino analyzes them and does certain actions. - Verify that there are no more pending injects - Install a DisableDeleteHandler for each Model into `_lino_ddh` - Install :class:`lino.dd.Model` attributes and methods into Models that don't inherit from it. """ if len(sys.argv) == 0: process_name = 'WSGI' else: process_name = ' '.join(sys.argv) #~ logger.info("Started %s on %r (PID %s).", process_name,self.title,os.getpid()) logger.info("Started %s (using %s) --> PID %s", process_name,settings.SETTINGS_MODULE,os.getpid()) logger.info(self.welcome_text()) def goodbye(): logger.info("Done %s (PID %s)",process_name,os.getpid()) atexit.register(goodbye) #~ analyze_models(self) #~ print 20130219, __file__, "setup_choicelists 1" #~ logger.info("Analyzing models...") #~ self = settings.SITE #~ logger.info(self.welcome_text()) #~ """ #~ Activate the site's default language #~ """ #~ dd.set_language(None) #~ logger.info(lino.welcome_text()) #~ raise Exception("20111229") models_list = models.get_models(include_auto_created=True) # this also triggers django.db.models.loading.cache._populate() if self.user_model: self.user_model = dd.resolve_model(self.user_model, strict="Unresolved model '%s' in user_model.") #~ if self.person_model: #~ self.person_model = dd.resolve_model(self.person_model,strict="Unresolved model '%s' in person_model.") #~ print 20130219, __file__, "setup_choicelists 2" if self.project_model: self.project_model = dd.resolve_model(self.project_model, strict="Unresolved model '%s' in project_model.") #~ print 20130219, __file__, "setup_choicelists 3" for m in self.override_modlib_models: dd.resolve_model(m, strict="Unresolved model '%s' in override_modlib_models.") for model in models_list: #~ print 20130216, model #~ fix_field_cache(model) model._lino_ddh = DisableDeleteHandler(model) for k in dd.Model.LINO_MODEL_ATTRIBS: if not hasattr(model,k): #~ setattr(model,k,getattr(dd.Model,k)) setattr(model,k,dd.Model.__dict__[k]) #~ model.__dict__[k] = getattr(dd.Model,k) #~ logger.info("20121127 Install default %s for %s",k,model) if isinstance(model.hidden_columns,basestring): model.hidden_columns = frozenset(dd.fields_list(model,model.hidden_columns)) if model._meta.abstract: raise Exception("Tiens?") self.modules.define(model._meta.app_label,model.__name__,model) for f in model._meta.virtual_fields: if isinstance(f,generic.GenericForeignKey): settings.SITE.GFK_LIST.append(f) for a in models.get_apps(): #~ for app_label,a in loading.cache.app_store.items(): app_label = a.__name__.split('.')[-2] #~ logger.info("Installing %s = %s" ,app_label,a) for k,v in a.__dict__.items(): if isinstance(v,type) and issubclass(v,layouts.BaseLayout): #~ print "%s.%s = %r" % (app_label,k,v) self.modules.define(app_label,k,v) #~ if isinstance(v,type) and issubclass(v,dd.Plugin): #~ self.plugins.append(v) #~ if isinstance(v,type) and issubclass(v,dd.Module): #~ logger.info("20120128 Found module %s",v) if k.startswith('setup_'): self.modules.define(app_label,k,v) self.setup_choicelists() self.setup_workflows() for model in models_list: for f, m in model._meta.get_fields_with_model(): #~ if isinstance(f,models.CharField) and f.null: if f.__class__ is models.CharField and f.null: msg = "Nullable CharField %s in %s" % (f.name,model) raise Exception(msg) #~ if f.__class__ is models.CharField: #~ raise Exception(msg) #~ else: #~ logger.info(msg) elif isinstance(f,models.ForeignKey): #~ f.rel.to = dd.resolve_model(f.rel.to,strict=True) if isinstance(f.rel.to,basestring): raise Exception("%s %s relates to %r (models are %s)" % (model,f.name,f.rel.to,models_list)) set_default_verbose_name(f) """ If JobProvider is an MTI child of Company, then mti.delete_child(JobProvider) must not fail on a JobProvider being refered only by objects that can refer to a Company as well. """ if hasattr(f.rel.to,'_lino_ddh'): #~ f.rel.to._lino_ddh.add_fk(model,f) # 20120728 f.rel.to._lino_ddh.add_fk(m or model,f) dd.pre_analyze.send(self,models_list=models_list) # MergeActions are defined in pre_analyze. # And MergeAction needs the info in _lino_ddh to correctly find keep_volatiles for model in models_list: """ Virtual fields declared on the model must have been attached before calling Model.site_setup(), e.g. because pcsw.Person.site_setup() declares `is_client` as imported field. """ model.on_analyze(self) for k,v in class_dict_items(model): if isinstance(v,dd.VirtualField): v.attach_to_model(model,k) #~ logger.info("20130817 attached model vfs") actors.discover() actors.initialize() dbtables.discover() #~ choosers.discover() actions.discover_choosers() #~ from lino.core import ui #~ ui.site_setup(self) for a in actors.actors_list: a.on_analyze(self) #~ logger.info("20130121 GFK_LIST is %s",['%s.%s'%(full_model_name(f.model),f.name) for f in settings.SITE.GFK_LIST]) dd.post_analyze.send(self,models_list=models_list) logger.info("Languages: %s. %d apps, %d models, %s actors.", ', '.join([li.django_code for li in self.languages]), len(self.modules), len(models_list), len(actors.actors_list)) #~ logger.info(settings.INSTALLED_APPS) self.on_each_app('site_setup') """ Actor.after_site_setup() is called after the apps' site_setup(). Example: pcsw.site_setup() adds a detail to properties.Properties, the base class for properties.PropsByGroup. The latter would not install a `detail_action` during her after_site_setup() and also would never get it later. """ for a in actors.actors_list: a.after_site_setup(self) #~ self.on_site_startup() self.resolve_virtual_fields()
def objects(): # ~ add = Instantiator('cal.EventStatus','ref').build # ~ yield add('0',**babel_values('name',en=u"tentative",de=u"Vorschlag", fr=u"proposition")) # ~ yield add('1',**babel_values('name',en=u"confirmed",de=u"bestätigt", fr=u"confirmé")) # ~ yield add('2',**babel_values('name',en=u"cancelled",de=u"storniert", fr=u"annulé")) # ~ yield add('3',**babel_values('name',en=u"rescheduled",de=u"verschoben", fr=u"reporté")) # ~ yield add('4',**babel_values('name',en=u"absent",de=u"abwesend", fr=u"absent")) # ~ add = Instantiator('cal.TaskStatus','ref').build # ~ yield add('0',**babel_values('name',en=u"needs action",de=u"zu erledigen", fr=u"à traîter")) # ~ yield add('1',**babel_values('name',en=u"in process",de=u"begonnen", fr=u"commencée")) # ~ yield add('2',**babel_values('name',en=u"completed",de=u"erledigt", fr=u"complétée")) # ~ yield add('3',**babel_values('name',en=u"cancelled",de=u"storniert", fr=u"annulée")) # ~ add = Instantiator('cal.AccessClass','ref').build # ~ yield add('0',**babel_values('name',en=u"Public",de=u"Öffentlich", fr=u"Public")) # ~ yield add('1',**babel_values('name',en=u"Private",de=u"Privat", fr=u"Privé")) # ~ yield add('2',**babel_values('name',en=u"Confidential",de=u"Vertraulich", fr=u"Confidentiel")) add = Instantiator("cal.Priority", "ref").build yield add("1", **babel_values("name", en="very urgent", de="sehr dringend", fr="très urgent")) yield add("2", **babel_values("name", en="quite urgent", de="recht dringend", fr="relativement urgent")) yield add("3", **babel_values("name", en="relatively urgent", de="ziemlich dringend", fr="relativement urgent")) yield add("4", **babel_values("name", en="relatively urgent", de="ziemlich dringend", fr="relativement urgent")) yield add("5", **babel_values("name", en="normal", de="normal", fr="normal")) yield add("6", **babel_values("name", en="not very urgent", de="nicht sehr niedrig", fr="pas très urgent")) yield add("7", **babel_values("name", en="not urgent", de="nicht dringend", fr="pas urgent")) yield add("8", **babel_values("name", en="not urgent", de="nicht dringend", fr="pas urgent")) yield add( "9", **babel_values("name", en="not urgent at all", de="überhaupt nicht dringend", fr="pas urgent du tout") ) calendar = Instantiator("cal.Calendar").build general = calendar(**dd.babelkw("name", de="Allgemein", fr="Général", en="General")) yield general settings.SITE.site_config.site_calendar = general # ~ settings.SITE.site_config.holiday_event_type = holidays yield settings.SITE.site_config event_type = Instantiator("cal.EventType").build holidays = event_type(all_rooms=True, **dd.babelkw("name", de="Feiertage", fr="Jours fériés", en="Holidays")) yield holidays RecurrentEvent = dd.resolve_model("cal.RecurrentEvent") add = Instantiator(RecurrentEvent, event_type=holidays).build def holiday(month, day, en, de, fr): return add( every_unit=cal.Recurrencies.yearly, monday=True, tuesday=True, wednesday=True, thursday=True, friday=True, saturday=True, sunday=True, every=1, start_date=datetime.date(year=cal.DEMO_START_YEAR, month=month, day=day), **dd.babelkw("name", en=en, de=de, fr=fr) ) yield holiday(1, 1, "New Year's Day", "Neujahr", "Jour de l'an") yield holiday(5, 1, "International Workers' Day", "Tag der Arbeit", "Premier Mai") yield holiday(7, 21, "National Day", "Nationalfeiertag", "Fête nationale") yield holiday(8, 15, "Assumption of Mary", "Mariä Himmelfahrt", "Assomption de Marie") yield holiday(10, 31, "All Souls' Day", "Allerseelen", "Commémoration des fidèles défunts") yield holiday(11, 1, "All Saints' Day", "Allerheiligen", "Toussaint") yield holiday(11, 11, "Armistice with Germany", "Waffenstillstand", "Armistice") yield holiday(12, 25, "Christmas", "Weihnachten", "Noël") summer = holiday(07, 01, "Summer holidays", "Sommerferien", "Vacances d'été") summer.end_date = summer.start_date.replace(month=8, day=31) yield summer ar = settings.SITE.login() for obj in RecurrentEvent.objects.all(): if not obj.update_reminders(ar): raise Exception("Oops, %s generated no events" % obj)
def new_content_type_id(m): if m is None: return m # if not fmn: return None # m = resolve_model(fmn) ct = ContentType.objects.get_for_model(m) if ct is None: return None return ct.pk def bv2kw(fieldname,values): """ Needed if `lino.Lino.languages` changed between dumpdata and loaddata """ return babel.babel_values(fieldname,en=values[0]) admin_LogEntry = resolve_model("admin.LogEntry") auth_Group = resolve_model("auth.Group") auth_Permission = resolve_model("auth.Permission") auth_User = resolve_model("auth.User") contenttypes_ContentType = resolve_model("contenttypes.ContentType") polls_Choice = resolve_model("polls.Choice") polls_Poll = resolve_model("polls.Poll") sessions_Session = resolve_model("sessions.Session") sites_Site = resolve_model("sites.Site") def create_django_admin_log(id, action_time, user_id, content_type_id, object_id, object_repr, action_flag, change_message): kw = dict() kw.update(id=id) kw.update(action_time=action_time) kw.update(user_id=user_id) content_type_id = new_content_type_id(content_type_id)
but publicly available at http://belref.lino-framework.org/ """ from __future__ import unicode_literals import re abbrRE = re.compile("^(.*)\s*\((.*)\)\s*",re.DOTALL) from north import dbutils from lino import dd Concept = dd.resolve_model('concepts.Concept') from lino.modlib.concepts.models import LinkTypes def C(en,de,fr='',nl='',jargon=None,obsoletes=None,**kw): texts = dict(en=en,de=de,fr=fr,nl=nl) name = dict() abbr = dict() for lang in 'en','de','fr','nl': t = texts.get(lang) if t: mo = abbrRE.match(t) if mo: abbr[lang] = mo.group(1).strip() name[lang] = mo.group(2).strip() #~ kw['abbr_'+lang] = mo.group(1).strip()
from django.db.utils import DatabaseError from django.db import models import lino from lino import dd, rt from lino.utils import confirm, iif from lino.utils import dblogger from lino.utils.daemoncommand import DaemonCommand from ...utils import aware, dt2kw, setkw Place = dd.resolve_model('cal.Place') Calendar = dd.resolve_model('cal.Calendar') Event = dd.resolve_model('cal.Event') RecurrenceSet = dd.resolve_model('cal.RecurrenceSet') #~ REQUEST = dblogger.PseudoRequest('watch_calendars') # dblogger.log_changes(REQUEST,obj) def prettyPrint(obj): s = StringIO() out = sys.stdout sys.stdout = s obj.prettyPrint() sys.stdout = out
def tasks_summary(ui,user,days_back=None,days_forward=None,**kw): """ Return a HTML summary of all open reminders for this user. May be called from :xfile:`welcome.html`. """ Task = dd.resolve_model('cal.Task') Event = dd.resolve_model('cal.Event') today = datetime.date.today() past = {} future = {} def add(cmp): if cmp.start_date < today: #~ if task.dt_alarm < today: lookup = past else: lookup = future day = lookup.get(cmp.start_date,None) if day is None: day = [cmp] lookup[cmp.start_date] = day else: day.append(cmp) #~ filterkw = { 'due_date__lte' : today } filterkw = {} if days_back is not None: filterkw.update({ 'start_date__gte' : today - datetime.timedelta(days=days_back) #~ 'dt_alarm__gte' : today - datetime.timedelta(days=days_back) }) if days_forward is not None: filterkw.update({ 'start_date__lte' : today + datetime.timedelta(days=days_forward) #~ 'dt_alarm__lte' : today + datetime.timedelta(days=days_forward) }) #~ filterkw.update(dt_alarm__isnull=False) filterkw.update(user=user) for o in Event.objects.filter( #~ models.Q(status=None) | models.Q(status__reminder=True), models.Q(state=None) | models.Q(state__lte=EventStates.published), **filterkw).order_by('start_date'): add(o) #~ filterkw.update(done=False) #~ filterkw.update(state__in=[TaskState.blank_item,TaskState.todo]) 20120829 filterkw.update(state__in=[None,TaskStates.todo]) for task in Task.objects.filter(**filterkw).order_by('start_date'): add(task) def loop(lookup,reverse): sorted_days = lookup.keys() sorted_days.sort() if reverse: sorted_days.reverse() for day in sorted_days: yield '<h3>'+dtosl(day) + '</h3>' yield dd.summary(ui,lookup[day],**kw) #~ cells = ['Ausblick'+':<br>',cgi.escape(u'Rückblick')+':<br>'] cells = [ cgi.escape(_('Upcoming reminders')) + ':<br>', cgi.escape(_('Past reminders')) + ':<br>' ] for s in loop(future,False): cells[0] += s for s in loop(past,True): cells[1] += s s = ''.join(['<td valign="top" bgcolor="#eeeeee" width="30%%">%s</td>' % s for s in cells]) s = '<table cellspacing="3px" bgcolor="#ffffff"><tr>%s</tr></table>' % s s = '<div class="htmlText">%s</div>' % s return s
import decimal from dateutil.relativedelta import relativedelta ONE_DAY = relativedelta(days=1) DEMO_DURATION = relativedelta(hours=1, minutes=30) from django.db import models from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.utils.translation import ugettext as _ from lino.utils import Cycler from lino import dd, rt cal = dd.resolve_app('cal') Event = dd.resolve_model('cal.Event') EventType = dd.resolve_model('cal.EventType') # Subscription = rt.modules.cal.Subscription Calendar = dd.resolve_model('cal.Calendar') # def subscribe_all(): # for u in settings.SITE.user_model.objects.exclude(profile=''): # for obj in Calendar.objects.all(): # obj = Subscription(user=u, calendar=obj) # yield obj def objects():
from lino import dd User = dd.resolve_model('users.User') def objects(): yield User(username='******', first_name='Piet',last_name='Bommel', email='*****@*****.**', is_staff=True) yield User(username='******', first_name='Jean',last_name='Dupond', email='*****@*****.**', is_staff=True)
# -*- coding: UTF-8 -*- from __future__ import unicode_literals from lino import dd Product = dd.resolve_model('babel_tutorial.Product') from north.dbutils import babel_values def P(en, de, fr, cat): return Product(category=cat, **babel_values('name', en=en, de=de, fr=fr)) def objects(): yield P("Chair", "Stuhl", "Chaise", '03') yield P("Table", "Tisch", "Table", '03') yield P("Monitor", "Bildschirm", "Écran", '01') yield P("Mouse", "Maus", "Souris", '03') yield P("Keyboard", "Tastatur", "Clavier", '03') yield P("Consultation", "Beratung", "Consultation", '02')
def type_choices(self, upload_area): M = dd.resolve_model('uploads.UploadType') logger.info("20140430 type_choices %s", upload_area) if upload_area is None: return M.objects.all() return M.objects.filter(upload_area=upload_area)
config = settings.SITE.plugins.courses users = dd.resolve_app('users') cal = dd.resolve_app('cal') sales = dd.resolve_app('sales') contacts = dd.resolve_app('contacts') """ Here we must use `resolve_model` with `strict=True` because we want the concrete model and we don't know whether it is overridden by this application. """ Person = dd.resolve_model('contacts.Person', strict=True) # equivalent alternative : #~ Person = settings.SITE.modules.contacts.Person class CourseAreas(dd.ChoiceList): verbose_name = _("Course area") verbose_name_plural = _("Course areas") add = CourseAreas.add_item add('C', _("Courses"), 'default') # add('J', _("Journeys"), 'journeys') class StartEndTime(dd.Model): class Meta:
# along with Lino; if not, see <http://www.gnu.org/licenses/>. """ Adds an arbitrary selection of a few demo countries. """ from __future__ import unicode_literals from django.db import models #countries = models.get_app('countries') from lino import dd from lino.utils.instantiator import Instantiator from north.dbutils import babel_values Country = dd.resolve_model('countries.Country') build_country = Instantiator('countries.Country', "isocode").build def objects(): def country(isocode, **kw): try: return Country.objects.get(isocode=isocode) except Country.DoesNotExist: # return build_country(isocode, **kw) return Country(isocode=isocode, **kw) yield country('EE', **babel_values('name', de=u"Estland", fr=u'Estonie',
def objects(): Person = dd.resolve_model(dd.apps.humanlinks.person_model) Link = rt.modules.humanlinks.Link LinkTypes = rt.modules.humanlinks.LinkTypes ar = rt.login() households = dd.resolve_app('households') if households: married = households.Type.objects.get( **dd.str2kw('name', _("Married"))) divorced = households.Type.objects.get( **dd.str2kw('name', _("Divorced"))) ig = InstanceGenerator() ig.add_instantiator( 'person', Person, 'first_name last_name gender birth_date') ig.add_instantiator( 'link', Link, 'parent child type') NAME1 = "Frisch" opa = ig.person("Hubert", NAME1, 'M', '1933-07-21') oma = ig.person("Gaby", "Frogemuth", 'F', '1934-08-04') P = ig.person("Paul", NAME1, 'M', '1967-06-19') L = ig.person("Ludwig", NAME1, 'M', '1968-06-01') A = ig.person("Alice", NAME1, 'F', '1969-12-19') B = ig.person("Bernd", NAME1, 'M', '1971-09-10') P1 = ig.person("Paula", "Einzig", 'F', '1968-12-19') P1A = ig.person("Peter", NAME1, 'M', '1987-06-19') P2 = ig.person("Petra", "Zweith", 'F', '1968-12-19') P2A = ig.person("Philippe", NAME1, 'M', '1997-06-19') P2B = ig.person("Clara", NAME1, 'F', '1999-06-19') P3 = ig.person("Dora", "Drosson", 'F', '1971-12-19') P3A = ig.person("Dennis", NAME1, 'M', '2001-06-19') L1 = ig.person("Laura", "Loslever", 'F', '1968-04-27') L1A = ig.person("Melba", NAME1, 'F', '2002-04-05') L1B = ig.person("Irma", NAME1, 'F', '2008-03-24') yield ig.flush() ig.link(opa, oma, LinkTypes.spouse) for i in (P, L, A, B): ig.link(opa, i, LinkTypes.parent) ig.link(oma, i, LinkTypes.parent) ig.link(P, P1A, LinkTypes.parent) ig.link(P1, P1A, LinkTypes.parent) ig.link(P, P2A, LinkTypes.parent) ig.link(P2, P2A, LinkTypes.parent) ig.link(P, P2B, LinkTypes.parent) ig.link(P2, P2B, LinkTypes.parent) ig.link(P, P3A, LinkTypes.parent) ig.link(P3, P3A, LinkTypes.parent) ig.link(P, P2, LinkTypes.spouse) ig.link(L, L1, LinkTypes.spouse) for i in (L1A, L1B): ig.link(L, i, LinkTypes.parent) ig.link(L1, i, LinkTypes.parent) yield ig.flush() if households: households.Household.create_household(ar, opa, oma, married) households.Household.create_household(ar, P, P1, divorced) hh = households.Household.create_household(ar, P, P2, married) hh.members_by_role('head')[0].set_primary(ar) hh.members_by_role('partner')[0].set_primary(ar) households.Household.create_household(ar, L, L1, married) A = ig.person("Albert", "Adam", 'M', '1973-07-21') B = ig.person("Bruno", "Braun", 'M', '1973-07-22') E = ig.person("Eveline", "Evrard", 'F', '1974-08-21') F = ig.person("Françoise", "Freisen", 'F', '1974-08-22') I = ig.person("Ilja", "Adam", 'M', '1994-08-22') J = ig.person("Jan", "Braun", 'M', '1996-08-22') K = ig.person("Kevin", "Braun", 'M', '1998-08-22') L = ig.person("Lars", "Braun", 'M', '1998-08-22') M = ig.person("Monique", "Braun", 'F', '2000-08-22') N = ig.person("Noémie", "Adam", 'F', '2002-08-22') O = ig.person("Odette", "Adam", 'F', '2004-08-22') P = ig.person("Pascale", "Adam", 'F', '2004-08-22') yield ig.flush() ig.link(A, I, LinkTypes.parent) ig.link(A, N, LinkTypes.parent) ig.link(A, O, LinkTypes.parent) ig.link(A, P, LinkTypes.parent) ig.link(B, J, LinkTypes.parent) ig.link(B, K, LinkTypes.parent) ig.link(B, L, LinkTypes.parent) ig.link(B, M, LinkTypes.parent) ig.link(E, I, LinkTypes.parent) ig.link(E, J, LinkTypes.parent) ig.link(E, K, LinkTypes.parent) ig.link(E, L, LinkTypes.parent) ig.link(F, M, LinkTypes.parent) ig.link(F, N, LinkTypes.parent) ig.link(F, O, LinkTypes.parent) ig.link(F, P, LinkTypes.parent) ig.link(A, F, LinkTypes.spouse) ig.link(B, E, LinkTypes.spouse) yield ig.flush() if households: households.Household.create_household(ar, A, E, married) households.Household.create_household(ar, A, F, divorced) households.Household.create_household(ar, B, E, divorced) households.Household.create_household(ar, B, F, married)