def run_on_row(self, obj, ar): if ar is not None: pre_add_child.send( sender=obj, request=ar.request, child=self.child_model) mti.insert_child(obj, self.child_model, full_clean=True) ar.set_response(refresh=True)
def run_on_row(self, obj, ar): if ar is not None: pre_add_child.send(sender=obj, request=ar.request, child=self.child_model) mti.insert_child(obj, self.child_model, full_clean=True) ar.set_response(refresh=True)
def customer_supplier(name, place, email=""): m = Member(name=name, email=email, place=findbyname(Place, place)) m.save() mti.insert_child(m, Customer) mti.insert_child(m, Supplier) # return (m, c, s) return m
def test_02(self): """Was written for :ticket:`488` (Kann Person nicht mehr von Organisation entfernen (delete mti child with siblings)). """ Person = rt.modules.contacts.Person Company = rt.modules.contacts.Company Partner = rt.modules.contacts.Partner # 1 : does delete_child work in normal situation? john = create(Person, first_name="John", last_name="Doe") as_partner = Partner.objects.get(pk=john.pk) delete_child(as_partner, Person) self.assertEqual(Person.objects.count(), 0) self.assertEqual(Partner.objects.count(), 1) as_partner.delete() # 2 : delete_child with an mti sibling john = create(Person, first_name="John", last_name="Doe") as_partner = Partner.objects.get(pk=john.pk) insert_child(as_partner, Company, full_clean=True) # this is the sitation: self.assertEqual(Person.objects.count(), 1) self.assertEqual(Partner.objects.count(), 1) self.assertEqual(Company.objects.count(), 1) # the following failed before #488 was fixed: delete_child(as_partner, Company)
def customer_supplier(name, place, email=''): m = Member(name=name, email=email, place=findbyname(Place, place)) m.save() mti.insert_child(m, Customer) mti.insert_child(m, Supplier) # return (m, c, s) return m
def test_02(self): """Was written for :ticket:`488` (Kann Person nicht mehr von Organisation entfernen (delete mti child with siblings)). """ Person = rt.models.contacts.Person Company = rt.models.contacts.Company Partner = rt.models.contacts.Partner # 1 : does delete_child work in normal situation? john = create(Person, first_name="John", last_name="Doe") as_partner = Partner.objects.get(pk=john.pk) delete_child(as_partner, Person) self.assertEqual(Person.objects.count(), 0) self.assertEqual(Partner.objects.count(), 1) as_partner.delete() # 2 : delete_child with an mti sibling john = create(Person, first_name="John", last_name="Doe") as_partner = Partner.objects.get(pk=john.pk) insert_child(as_partner, Company, full_clean=True) # this is the sitation: self.assertEqual(Person.objects.count(), 1) self.assertEqual(Partner.objects.count(), 1) self.assertEqual(Company.objects.count(), 1) # the following failed before #488 was fixed: delete_child(as_partner, Company)
def objects(): #~ yield courses.Room(name="A") #~ yield cal.Place(name="A") #~ yield cal.Place(name="B") #~ yield cal.Place(name="C") #~ yield cal.Place(name="D") #~ yield cal.Place(name="E") #~ yield cal.Place(name="F") PTYPES = Cycler(courses.PupilType.objects.all()) TTYPES = Cycler(courses.TeacherType.objects.all()) n = 0 for p in Person.objects.all(): if n % 2 == 0: yield mti.insert_child(p,courses.Pupil,pupil_type=PTYPES.pop()) if n % 9 == 0: yield mti.insert_child(p,courses.Teacher,teacher_type=TTYPES.pop()) n += 1 if False: #~ PS = Cycler(courses.PresenceStatus.objects.all()) CONTENTS = Cycler(courses.Line.objects.all()) USERS = Cycler(users.User.objects.all()) PLACES = Cycler(cal.Room.objects.all()) TEACHERS = Cycler(courses.Teacher.objects.all()) SLOTS = Cycler(courses.Slot.objects.all()) #~ SLOTS = Cycler(1,2,3,4) PUPILS = Cycler(courses.Pupil.objects.all()) #~ Event = settings.SITE.modules.cal.Event #~ from lino.modlib.cal.utils import DurationUnit year = settings.SITE.demo_date().year if settings.SITE.demo_date().month < 7: year -= 1 for i in range(10): c = courses.Course( user=USERS.pop(), teacher=TEACHERS.pop(), line=CONTENTS.pop(),room=PLACES.pop(), start_date=datetime.date(year,9,1+i), end_date=datetime.date(year+1,6,30), every=1, every_unit=cal.DurationUnits.weeks, slot=SLOTS.pop(), ) yield c for j in range(5): yield courses.Enrolment(pupil=PUPILS.pop(),course=c) c.save() # fill presences
def swapclass(self, watcher, new_class, data): """ Convert the watched object to a new_class instance and apply data accordingly. Caution: Here be dragons! See also :mod:`lino_welfare.tests.watchtim_tests`. """ obj = watcher.watched old_class = obj.__class__ assert old_class is not new_class newobj = None # ~ print 20130222, old_class, new_class if old_class is Partner: partner = obj else: partner = obj.partner_ptr if old_class is Client: # convert Client to Person, then continue as if old_class had been # Person dd.pre_remove_child.send(sender=obj, request=REQUEST, child=old_class) mti.delete_child(obj, old_class) newobj = obj = obj.person_ptr old_class = Person if old_class is new_class: return # ~ if new_class is not old_class and not issubclass(new_class,old_class): if not issubclass(new_class, old_class): dd.pre_remove_child.send(sender=obj, request=REQUEST, child=old_class) mti.delete_child(obj, old_class) newobj = obj = partner if new_class is Client: # create the Person if necessary: # ~ partner = obj.partner_ptr try: person = Person.objects.get(pk=partner.id) except Person.DoesNotExist: dd.pre_add_child.send(sender=partner, request=REQUEST, child=Person) person = mti.insert_child(partner, Person) self.applydata(person, data) self.validate_and_save(person) # create the Client newobj = obj = person if new_class is not Partner: dd.pre_add_child.send(sender=obj, request=REQUEST, child=new_class) newobj = mti.insert_child(obj, new_class) if newobj is not None: self.applydata(newobj, data) self.validate_and_save(newobj)
def person2client(p, **kw): c = mti.insert_child(p, Client) for k, v in kw.items(): setattr(c, k, v) c.client_state = pcsw.ClientStates.coached c.save() return Client.objects.get(pk=p.pk)
def objects(): bd = i2d(19500203) for p in contacts.Person.objects.filter(country__isocode="BE"): yield mti.insert_child(p,Employee,birth_date=bd) bd += datetime.timedelta(days=234) # experimental value for i,e in enumerate(Employee.objects.all()): if i % 4: e.is_chef = True e.is_member = False yield e yield Area(name="North") yield Area(name="East") yield Area(name="South") yield Area(name="West") CHEFS = Cycler(Employee.objects.filter(is_chef=True)) MEMBERS = Cycler(Employee.objects.filter(is_member=True)) AREAS = Cycler(patrols.Area.objects.all()) MEMBERS_PER_TEAM = 2 le = list(Employee.objects.filter(is_member=True)) while len(le) > MEMBERS_PER_TEAM: name = '-'.join([o.last_name for o in le[:MEMBERS_PER_TEAM]]) t = Team(chef=CHEFS.pop(),name=name) yield t for e in le[:MEMBERS_PER_TEAM]: yield Member(team=t,employee=e) le = le[MEMBERS_PER_TEAM:] #~ yield Team(name="One",chef=CHEFS.pop()) #~ yield Team(name="Two",chef=CHEFS.pop()) #~ yield Team(name="Three",chef=CHEFS.pop()) TEAMS = Cycler(patrols.Team.objects.all()) d = settings.SITE.demo_date(-20) for i in range(50): yield patrols.Patrol(date=d,team=TEAMS.pop(),area=AREAS.pop()) d += ONE_DAY for p in patrols.Patrol.objects.all(): yield patrols.WorkDay(date=p.date,employee=p.team.chef,type=WDT.pop()) for m in p.team.member_set.all(): yield patrols.WorkDay(date=p.date,employee=m.employee,type=WDT.pop())
def objects(): ClientContactType = rt.modules.pcsw.ClientContactType Person = resolve_model('contacts.Person') Company = resolve_model('contacts.Company') #~ Contact = resolve_model('contacts.Contact') Role = resolve_model('contacts.Role') RoleType = resolve_model('contacts.RoleType') Authority = resolve_model('users.Authority') #~ Country = resolve_model('countries.Country') Client = resolve_model('pcsw.Client') person = Instantiator(Person).build client = Instantiator(Client).build company = Instantiator(Company).build #~ contact = Instantiator(Contact).build role = Instantiator(Role).build #~ link = Instantiator(Link).build #~ exam_policy = Instantiator('isip.ExamPolicy').build Place = resolve_model('countries.Place') #~ Job = resolve_model('jobs.Job') #~ Place = settings.SITE.modules.countries.Place StudyType = resolve_model('cv.StudyType') #~ Country = resolve_model('countries.Country') Property = resolve_model('properties.Property') eupen = Place.objects.get(name__exact='Eupen') #~ stvith = Place.objects.get(zip_code__exact='4780') stvith = Place.objects.get(name__in=('Sankt Vith', 'Saint-Vith')) kettenis = Place.objects.get(name__exact='Kettenis') vigala = Place.objects.get(name__exact='Vigala') ee = countries.Country.objects.get(pk='EE') be = belgium = countries.Country.objects.get(isocode__exact='BE') andreas = Person.objects.get(name__exact="Arens Andreas") annette = Person.objects.get(name__exact="Arens Annette") hans = Person.objects.get(name__exact="Altenberg Hans") ulrike = Person.objects.get(name__exact="Charlier Ulrike") erna = Person.objects.get(name__exact=u"Ärgerlich Erna") ## Coaching types # We use only abbreviated names in `CoachingType.name` because the # users usually know these abbrevs. kw = dd.str2kw('name', _("Colleague")) COLLEAGUE = cal.GuestRole(**kw) yield COLLEAGUE # id must match `isip.ContactBase.person_changed` ASD = pcsw.CoachingType( id=isip.COACHINGTYPE_ASD, does_integ=False, does_gss=True, eval_guestrole=COLLEAGUE, **dd.babelkw( 'name', de="ASD", # (Allgemeiner Sozialdienst) nl="ASD", # (Algemene Sociale Dienst) fr="SSG", # (Service social général) en="General", # (General Social Service) )) yield ASD DSBE = pcsw.CoachingType( id=isip.COACHINGTYPE_DSBE, does_gss=False, does_integ=True, eval_guestrole=COLLEAGUE, **dd.babelkw( 'name', de="DSBE", # (Dienst für Sozial-Berufliche Eingliederung) fr="SI", # Service intégration en="Integ", # Integration service )) yield DSBE DEBTS = pcsw.CoachingType( does_gss=False, does_integ=False, **dd.babelkw( 'name', de="Schuldnerberatung", fr="Médiation de dettes", en="Debts mediation", )) yield DEBTS melanie = person(first_name="Mélanie", last_name="Mélard", email=settings.SITE.demo_email, city=eupen, country='BE', gender=dd.Genders.female, language='fr') ## newcomers : Melanie does not work with newcomers because she is ## the boss. Hubert does live consultations (no appointments). And ## Alicia does only appointments but no life ## consultations. Caroline and Judith do both. yield melanie melanie = users.User( username="******", partner=melanie, profile='110', coaching_type=DSBE, newcomer_consultations=False, newcomer_appointments=False) yield melanie hubert = person(first_name=u"Hubert", last_name=u"Huppertz", email=settings.SITE.demo_email, city=kettenis, country='BE', gender=dd.Genders.male) yield hubert hubert = users.User( username="******", partner=hubert, profile='100', coaching_type=DSBE, newcomer_consultations=True, newcomer_appointments=False) yield hubert alicia = person( first_name=u"Alicia", last_name=u"Allmanns", email=settings.SITE.demo_email, city=kettenis, country='BE', # gender=dd.Genders.female, # don't set gender language='fr') yield alicia alicia = users.User( username="******", partner=alicia, profile='100', coaching_type=DSBE, newcomer_consultations=True, newcomer_appointments=True) yield alicia theresia = person(first_name="Theresia", last_name="Thelen", email=settings.SITE.demo_email, city=eupen, country='BE', gender=dd.Genders.female) yield theresia theresia = users.User(username="******", partner=theresia, profile='210') yield theresia nicolas = users.User(username="******", profile='') yield nicolas # yield Authority(user=alicia, authorized=hubert) # yield Authority(user=alicia, authorized=melanie) # yield Authority(user=hubert, authorized=melanie) yield Authority(user=hubert, authorized=theresia) yield Authority(user=alicia, authorized=theresia) yield Authority(user=melanie, authorized=theresia) caroline = users.User( username="******", first_name="Caroline", last_name="Carnol", profile='200', coaching_type=ASD, newcomer_consultations=True, newcomer_appointments=True) yield caroline obj = person(first_name="Judith", last_name="Jousten", email=settings.SITE.demo_email, city=eupen, country='BE', gender=dd.Genders.female) yield obj judith = users.User( username="******", partner=obj, profile='400', coaching_type=ASD, newcomer_consultations=True, newcomer_appointments=True) yield judith yield users.User( username="******", first_name="Patrick", last_name="Paraneau", profile='910', email=settings.SITE.demo_email) # for obj in pcsw.CoachingType.objects.all(): # yield users.Team(**dd.babelkw('name', **field2kw(obj, 'name'))) obj = cal.GuestRole( # email_template="Visitor.eml.html", **dd.babelkw( 'name', de="Besucher", fr="Visiteur", en="Visitor", et="Külaline", )) yield obj settings.SITE.site_config.update(client_guestrole=obj) yield cal.GuestRole(**dd.babelkw('name', de=u"Vorsitzender", fr=u"Président", en=u"Chairman", et=u"Eesistuja", )) yield cal.GuestRole(**dd.babelkw('name', de=u"Schriftführer", fr=u"Greffier", en=u"Reporter", et=u"Sekretär", )) calendar = Instantiator('cal.EventType').build kw = dict(invite_client=False, is_appointment=False) kw.update(dd.str2kw('name', _("Consultations with client"))) kw.update(dd.str2kw('event_label', _("Consultation"))) # kw.update(dd.babelkw( # 'name', # de="Visiten (ohne Verabredung)", # fr="Consultations sans rendez-vous", # en="Prompt consultation", # et="Külaline", # )) obj = calendar(**kw) yield obj settings.SITE.site_config.update(prompt_calendar=obj) kw = dict(invite_client=True) kw.update(dd.str2kw("name", _("External meetings with client"))) kw.update(dd.str2kw("event_label", _("External meeting"))) yield calendar(**kw) kw = dict(invite_client=True) kw.update(dd.str2kw("name", _("Informational meetings"))) kw.update(dd.str2kw("event_label", _("Informational meeting"))) yield calendar(**kw) kw = dict(invite_client=False) kw.update(dd.str2kw("name", _("Internal meetings"))) kw.update(dd.str2kw("event_label", _("Internal meeting"))) yield calendar(**kw) # yield calendar(**dd.babelkw('name', # de=u"Versammlung intern", # fr=u"Réunions internes", # en=u"Internal meetings")) kw = dict(invite_client=False) kw.update(dd.str2kw("name", _("External meetings"))) kw.update(dd.str2kw("event_label", _("External meeting"))) yield calendar(**kw) # yield calendar(**dd.babelkw('name', # de=u"Versammlung extern", # fr=u"Réunions externes", # en=u"External meetings")) kw = dict(invite_client=False) kw.update(dd.str2kw("name", _("Private"))) yield calendar(**kw) # yield calendar(**dd.babelkw('name', # de="Privat", # fr="Privé", # en="Private")) sector = Instantiator(cv.Sector).build for ln in SECTORS_LIST.splitlines(): if ln: a = ln.split('|') if len(a) == 3: kw = dict(en=a[0], fr=a[1], de=a[2]) yield sector(**dd.babelkw('name', **kw)) horeca = cv.Sector.objects.get(pk=5) function = Instantiator(cv.Function, sector=horeca).build yield function(**dd.babelkw('name', de=u"Kellner", fr=u'Serveur', en=u'Waiter', )) yield function(**dd.babelkw('name', de=u"Koch", fr=u'Cuisinier', en=u'Cook', )) yield function(**dd.babelkw('name', de=u"Küchenassistent", fr=u'Aide Cuisinier', en=u'Cook assistant', )) yield function(**dd.babelkw('name', de=u"Tellerwäscher", fr=u'Plongeur', en=u'Dishwasher', )) contractType = Instantiator(jobs.ContractType, "ref", exam_policy=3).build yield contractType('art60-7a', **dd.babelkw('name', de=u"Sozialökonomie", fr=u'économie sociale', en=u'social economy', )) yield contractType('art60-7b', **dd.babelkw('name', de=u"Sozialökonomie - majoré", fr=u'économie sociale - majoré', en=u'social economy - increased', )) yield contractType('art60-7c', **dd.babelkw('name', de=u"mit Rückerstattung", fr=u'avec remboursement', en=u'social economy with refund', )) yield contractType('art60-7d', **dd.babelkw('name', de=u"mit Rückerstattung Schule", fr=u'avec remboursement école', en=u'social economy school', )) yield contractType('art60-7e', **dd.babelkw('name', de=u"Stadt Eupen", fr=u"ville d'Eupen", en=u'town', )) contractType = Instantiator(isip.ContractType, "ref", exam_policy=1).build yield contractType("vsea", needs_study_type=True, **dd.babelkw( 'name', de=u"VSE Ausbildung", fr=u"VSE Ausbildung", en=u"VSE Ausbildung", )) yield contractType("vseb", **dd.babelkw('name', de=u"VSE Arbeitssuche", fr=u"VSE Arbeitssuche", en=u"VSE Arbeitssuche", )) yield contractType("vsec", **dd.babelkw('name', de=u"VSE Lehre", fr=u"VSE Lehre", en=u"VSE Lehre", )) yield contractType("vsed", needs_study_type=True, **dd.babelkw('name', de=u"VSE Vollzeitstudium", fr=u"VSE Vollzeitstudium", en=u"VSE Vollzeitstudium", )) yield contractType("vsee", **dd.babelkw('name', de=u"VSE Sprachkurs", fr=u"VSE Sprachkurs", en=u"VSE Sprachkurs", )) t = RoleType.objects.get(pk=4) # It manager t.use_in_contracts = False t.save() #~ country = Instantiator('countries.Country',"isocode name").build #~ yield country('SUHH',"Soviet Union") #~ cpas = company(name=u"ÖSHZ Eupen",city=eupen,country=belgium) cpas = company(name=u"ÖSHZ Kettenis", city=kettenis, country=belgium) yield cpas bisa = company(name=u"BISA", city=eupen, country=belgium) yield bisa bisa_dir = role(company=bisa, person=annette, type=1) yield bisa_dir rcycle = company(name=u"R-Cycle Sperrgutsortierzentrum", city=eupen, country=belgium) yield rcycle rcycle_dir = role(company=rcycle, person=andreas, type=1) yield rcycle_dir yield role(company=rcycle, person=erna, type=2) # IT manager : no contracts yield role(company=rcycle, person=ulrike, type=4) yield company(name=u"Die neue Alternative V.o.G.", city=eupen, country=belgium) proaktiv = company(name=u"Pro Aktiv V.o.G.", city=eupen, country=belgium) yield proaktiv proaktiv_dir = role(company=proaktiv, person=hans, type=1) # IT manager : no contracts yield role(company=proaktiv, person=ulrike, type=4) yield proaktiv_dir yield company(name=u"Werkstatt Cardijn V.o.G.", city=eupen, country=belgium) yield company(name=u"Behindertenstätten Eupen", city=eupen, country=belgium) yield company(name=u"Beschützende Werkstätte Eupen", city=eupen, country=belgium) kw = dd.str2kw('name', _("Health insurance")) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium) #~ kw = dict(is_health_insurance=True,country=belgium) yield company(name="Alliance Nationale des Mutualités Chrétiennes", **kw) yield company(name="Mutualité Chrétienne de Verviers - Eupen", **kw) yield company(name="Union Nationale des Mutualités Neutres", **kw) yield company(name="Mutualia - Mutualité Neutre", **kw) yield company(name="Solidaris - Mutualité socialiste et syndicale de la province de Liège", **kw) fkw = dd.str2kw('name', _("Pharmacy")) # Apotheke cct = rt.modules.pcsw.ClientContactType.objects.get(**fkw) kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield company( name="Apotheke Reul", street='Klosterstraße', street_no=20, **kw) yield company( name="Apotheke Schunck", street='Bergstraße', street_no=59, **kw) yield company( name="Pharmacies Populaires de Verviers", street='Aachener Straße', street_no=258, **kw) yield company( name="Bosten-Bocken A", street='Haasstraße', street_no=6, **kw) kw = dd.str2kw('name', _("Advocate")) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield company(name=u"Brüll Christine", street=u'Schilsweg', street_no=4, **kw) yield company(name=u"Brocal Catherine", street=u'Neustraße', street_no=115, **kw) yield company(name=u"Bourseaux Alexandre", street=u'Aachener Straße', street_no=21, **kw) yield company(name=u"Baguette Stéphanie", street=u'Gospertstraße', street_no=24, **kw) # Bailiff = Gerichtsvollzieher = Huissier de justice kw = dd.str2kw('name', _("Bailiff")) if dd.is_installed('debts'): kw.update(is_bailiff=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield company(name="Demarteau Bernadette", street='Aachener Straße', street_no=25, **kw) kw.update(city=stvith) yield company(name="Schmitz Marc", street='Rodter Straße', street_no=43, street_box="B", **kw) # Inkasso-Unternehmen kw = dd.str2kw('name', _("Debt collecting company")) if dd.is_installed('debts'): kw.update(is_bailiff=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield company(name="Cashback sprl", street='Vervierser Straße', street_no=1, **kw) yield company(name="Money Wizard AS", street='Neustraße', street_no=1, **kw) # settings.SITE.site_config.debts_bailiff_type = cct # yield settings.SITE.site_config def person2client(p, **kw): c = mti.insert_child(p, Client) for k, v in kw.items(): setattr(c, k, v) c.client_state = pcsw.ClientStates.coached c.save() return Client.objects.get(pk=p.pk) #~ luc = Person.objects.get(name__exact="Saffre Luc") #~ luc = person2client(luc,national_id = '680601 053-29') #~ luc.birth_place = 'Eupen' #~ luc.birth_date = '1968-06-01' #~ luc.birth_country = be #~ luc.full_clean() #~ luc.save() #~ #~ ly = person(first_name="Ly",last_name="Rumma", #~ city=vigala,country='EE', #~ gender=dd.Genders.female) #~ yield ly #~ mari = person(first_name="Mari",last_name="Saffre", #~ city=vigala,country='EE', #~ gender=dd.Genders.female) #~ yield mari #~ iiris = person(first_name="Iiris",last_name="Saffre", #~ city=vigala,country='EE', #~ gender=dd.Genders.female) #~ yield iiris gerd = person(first_name="Gerd", last_name="Gerkens", city=kettenis, email=settings.SITE.demo_email, # '*****@*****.**' country='BE', gender=dd.Genders.male) yield gerd yield role(company=cpas, person=gerd, type=4) # see :blogentry:`20111007` tatjana = client( first_name=u"Tatjana", last_name=u"Kasennova", #~ first_name=u"Татьяна",last_name=u"Казеннова", city=kettenis, country='BE', #~ national_id='1237', birth_place="Moskau", # birth_country='SUHH', client_state=pcsw.ClientStates.newcomer, #~ newcomer=True, gender=dd.Genders.female) yield tatjana michael = Person.objects.get(name__exact="Mießen Michael") jean = Person.objects.get(name__exact="Radermacher Jean") #~ yield cpas sc = settings.SITE.site_config sc.site_company = cpas sc.signer1 = michael sc.signer2 = jean yield sc yield role(company=cpas, person=michael, type=sc.signer1_function) yield role(company=cpas, person=jean, type=sc.signer2_function) bernard = Person.objects.get(name__exact="Bodard Bernard") kw = dd.str2kw('name', _("Employment office")) # Arbeitsvermittler cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) adg = company(name=u"Arbeitsamt der D.G.", **kw) adg.save() yield adg settings.SITE.site_config.job_office = adg yield settings.SITE.site_config adg_dir = role(company=adg, person=bernard, type=1) yield adg_dir kw = dd.str2kw('name', _("Physician")) # Arzt if dd.is_installed('aids'): kw.update(can_refund=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield person(first_name="Waltraud", last_name="Waldmann", **kw) kw = dd.str2kw('name', _("Family doctor")) # Hausarzt if dd.is_installed('aids'): kw.update(can_refund=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen) yield person(first_name="Werner", last_name="Wehnicht", **kw) kw = dd.str2kw('name', _("Dentist")) if dd.is_installed('aids'): kw.update(can_refund=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen, title="Dr.") yield person(first_name="Carmen", last_name="Castou", **kw) yield person(first_name="Walter", last_name="Waldmann", **kw) kw = dd.str2kw('name', _("Pediatrician")) if dd.is_installed('aids'): kw.update(can_refund=True) cct = ClientContactType(**kw) yield cct kw = dict(client_contact_type=cct, country=belgium, city=eupen, title="Dr.") yield person(first_name="Killian", last_name="Kimmel", **kw) # kw = dd.str2kw('name', _("Landlord")) # Vermieter # if dd.is_installed('aids'): # kw.update(can_refund=True) # cct = ClientContactType(**kw) # yield cct # kw = dict(client_contact_type=cct, country=belgium, city=eupen) # yield person(first_name="Vera", last_name="Veltz", **kw) # yield person(first_name="Vanessa", last_name="Veithen", **kw) #~ from django.core.exceptions import ValidationError # ~ # a circular reference: bernard is contact for company adg and also has himself as `job_office_contact` #~ try: #~ bernard.job_office_contact = adg_dir #~ bernard.clean() #~ bernard.save() #~ except ValidationError: #~ pass #~ else: #~ raise Exception("Expected ValidationError") DIRECTORS = (annette, hans, andreas, bernard) #~ USERS = Cycler(root,melanie,hubert,alicia) AGENTS = Cycler(melanie, hubert, alicia, judith) COACHINGTYPES = Cycler(pcsw.CoachingType.objects.filter( does_gss=False, does_integ=False)) #~ CLIENTS = Cycler(andreas,annette,hans,ulrike,erna,tatjana) count = 0 #~ for person in Person.objects.filter(gender__isnull=False): for person in Person.objects.exclude(gender=''): if not person.birth_date: # not those from humanlinks if users.User.objects.filter(partner=person).count() == 0: if contacts.Role.objects.filter(person=person).count() == 0: birth_date = settings.SITE.demo_date(-170 * count - 16 * 365) national_id = generate_ssin(birth_date, person.gender) client = person2client(person, national_id=national_id, birth_date=birth_date) # youngest client is 16; 170 days between each client count += 1 if count % 2: client.client_state = pcsw.ClientStates.coached elif count % 5: client.client_state = pcsw.ClientStates.newcomer else: client.client_state = pcsw.ClientStates.former # Dorothée is three times in our database if client.first_name == "Dorothée": client.national_id = None client.birth_date = '' client.full_clean() client.save() #~ CLIENTS = Cycler(Client.objects.filter(is_active=True,newcomer=False)) CLIENTS = Cycler( Client.objects.filter(client_state=pcsw.ClientStates.coached)) #~ oshz = Company.objects.get(name=u"ÖSHZ Eupen") #~ project = Instantiator('projects.Project').build #~ note = Instantiator('notes.Note').build langk = Instantiator('cv.LanguageKnowledge').build #~ prj = project(name="Testprojekt",company=oshz) #~ yield prj #~ yield note(user=user,project=prj,date=i2d(20091006),subject="Programmierung",company=oshz) #~ prj = project(name="Testprojekt",company=oshz) #~ yield prj #~ yield note(user=user,project=prj,date=i2d(20091007),subject="Anschauen",company=oshz) Note = resolve_model('notes.Note') USERS = Cycler(users.User.objects.all()) SUBJECTS = Cycler(u""" Erstgespräch Versammlung beim AG Zwischenbericht Krisensitzung """.splitlines()) for i in range(10): yield Note(user=USERS.pop(), date=settings.SITE.demo_date(days=i), subject=SUBJECTS.pop()) schule = StudyType.objects.get(pk=1) # uni = StudyType.objects.get(pk=4) abi = u"Abitur" study = Instantiator('cv.Study').build gerd = CLIENTS.pop() luc = CLIENTS.pop() ly = CLIENTS.pop() mari = CLIENTS.pop() iiris = CLIENTS.pop() luc.card_number = '591413288107' luc.card_valid_from = i2d(20110819) luc.card_valid_until = i2d(20160819) luc.card_issuer = "Eupen" luc.card_type = BeIdCardTypes.belgian_citizen luc.save() luc.make_demo_picture() gerd.card_number = '123456789012' gerd.card_valid_from = i2d(20120819) gerd.card_valid_until = i2d(20130818) gerd.card_issuer = "Eupen" gerd.card_type = BeIdCardTypes.foreigner_c gerd.save() gerd.make_demo_picture() yield study(person=luc, type=schule, content=abi, start_date='19740901', end_date='19860630') yield study(person=gerd, type=schule, content=abi, start_date='19740901', end_date='19860630') yield langk(person=luc, language='ger', written='4', spoken='4') yield langk(person=gerd, language='ger', written='4', spoken='4') yield langk(person=mari, language='ger', written='2', spoken='4') yield langk(person=iiris, language='ger', written='0', spoken='4') yield langk(person=ly, language='ger', written='2', spoken='1') yield langk(person=luc, language='fre', written='4', spoken='3') yield langk(person=gerd, language='fre', written='4', spoken='3') yield langk(person=luc, language='eng', written='4', spoken='3') yield langk(person=gerd, language='eng', written='4', spoken='3') yield langk(person=ly, language='eng', written='3', spoken='3') yield langk(person=gerd, language='dut', written='3', spoken='3') yield langk(person=luc, language='est', written='3', spoken='3') yield langk(person=ly, language='est', written='4', spoken='4') yield langk(person=mari, language='est', written='3', spoken='4') yield langk(person=iiris, language='est', written='0', spoken='3') jobtype = Instantiator(jobs.JobType, 'name').build art607 = jobtype(u'Sozialwirtschaft = "majorés"') yield art607 yield jobtype(u'Intern') yield jobtype(u'Extern (Öffentl. VoE mit Kostenrückerstattung)') yield jobtype(u'Extern (Privat Kostenrückerstattung)') #~ yield jobtype(u'VSE') yield jobtype(u'Sonstige') rcycle = mti.insert_child(rcycle, jobs.JobProvider) yield rcycle bisa = mti.insert_child(bisa, jobs.JobProvider) yield bisa proaktiv = mti.insert_child(proaktiv, jobs.JobProvider) yield proaktiv # jobs (Art.60-7) CSTATES = Cycler(jobs.CandidatureStates.objects()) JOBS_CONTRACT_TYPES = Cycler(jobs.ContractType.objects.all()) JTYPES = Cycler(jobs.JobType.objects.all()) PROVIDERS = Cycler(jobs.JobProvider.objects.all()) SECTORS = Cycler(cv.Sector.objects.all()) FUNCTIONS = Cycler(cv.Function.objects.all()) REMARKS = Cycler( _("A very hard job."), '', _("No supervisor. Only for independent people."), '', '', '') for i in range(8): f = FUNCTIONS.pop() yield jobs.Job(provider=PROVIDERS.pop(), type=JTYPES.pop(), contract_type=JOBS_CONTRACT_TYPES.pop(), name=unicode(f), remark=REMARKS.pop(), sector=SECTORS.pop(), function=f) JOBS = Cycler(jobs.Job.objects.all()) for i in range(40): yield jobs.Candidature(job=JOBS.pop(), person=CLIENTS.pop(), state=CSTATES.pop(), date_submitted=settings.SITE.demo_date(-40 + i)) # reset SECTORS and FUNCTIONS SECTORS = Cycler(cv.Sector.objects.all()) FUNCTIONS = Cycler(cv.Function.objects.all()) obj = jobs.Offer( name="Übersetzer DE-FR (m/w)", remark="""\ Wir sind auf der Suche nach einem Deutsch-Französich Übersetzer (M/F) um einen Selbständigenr zu Geschäftsessen und kommerziellen Termine zu begleiten. Sie übernehmen die Übersetzung von Gespräche während kommerziellen Kontakte mit deutschen Kunden. Es ist spontane und pünktliche Aufträge, den ganzen Tag, in Eupen und/oder Deutschland. Regelmäßigkeit: 1-2 Mal pro Monat, je nach Bedarf. Flexibilität: die Termine sind je nach Kandidat anpassbar.""", provider=PROVIDERS.pop(), selection_from=settings.SITE.demo_date(-120), selection_until=settings.SITE.demo_date(-20), start_date=settings.SITE.demo_date(10), sector=SECTORS.pop(), function=FUNCTIONS.pop()) yield obj # reset SECTORS and FUNCTIONS SECTORS = Cycler(cv.Sector.objects.all()) FUNCTIONS = Cycler(cv.Function.objects.all()) for i in range(30): yield jobs.Candidature( person=CLIENTS.pop(), state=CSTATES.pop(), date_submitted=settings.SITE.demo_date(-20 + i * 2), sector=SECTORS.pop(), function=FUNCTIONS.pop(), ) COUNTRIES = Cycler(countries.Country.objects.all()) COMPANIES = Cycler(Company.objects.all()) # reset SECTORS and FUNCTIONS SECTORS = Cycler(cv.Sector.objects.all()) FUNCTIONS = Cycler(cv.Function.objects.all()) DURATIONS = Cycler([1, 2, 3, 6, 6, 9, 12, 12, 24, 24]) # months STATES = Cycler(cv.EducationEntryStates.items()) for i in range(30): start_date = settings.SITE.demo_date(-1200 + i * 2) d = DURATIONS.pop() end_date = DurationUnits.months.add_duration(start_date, d) yield cv.Experience( person=CLIENTS.pop(), company=COMPANIES.pop(), country=COUNTRIES.pop(), start_date=start_date, end_date=end_date, sector=SECTORS.pop(), function=FUNCTIONS.pop(), ) TRAINING_TYPES = Cycler(cv.StudyType.objects.filter(is_training=True)) for i in range(20): start_date = settings.SITE.demo_date(-1200 + i * 2) d = DURATIONS.pop() end_date = DurationUnits.months.add_duration(start_date, d) yield cv.Training( person=CLIENTS.pop(), type=TRAINING_TYPES.pop(), school=SCHOOLS.pop(), country=COUNTRIES.pop(), start_date=start_date, end_date=end_date, sector=SECTORS.pop(), function=FUNCTIONS.pop(), state=STATES.pop(), ) STUDY_TYPES = Cycler(cv.StudyType.objects.filter(is_study=True)) EDULEVELS = Cycler(cv.EducationLevel.objects.all()) for i in range(20): start_date = settings.SITE.demo_date(-1200 + i * 2) d = DURATIONS.pop() end_date = DurationUnits.months.add_duration(start_date, d) yield cv.Study( person=CLIENTS.pop(), type=STUDY_TYPES.pop(), school=SCHOOLS.pop(), country=COUNTRIES.pop(), start_date=start_date, end_date=end_date, state=STATES.pop(), education_level=EDULEVELS.pop(), ) #~ baker = Properties.objects.get(pk=1) #~ baker.save() #~ yield baker """ Distribute properties to persons. The distribution should be "randomly", but independant of site's language setting. """ for i, p in enumerate(Client.objects.all()): if i % 2: country = belgium else: country = COUNTRIES.pop() p.birth_country_id = country p.nationality_id = country if i % 3: p.languageknowledge_set.create( language_id='eng', written='3', spoken='3') elif i % 5: p.languageknowledge_set.create( language_id='eng', written='4', spoken='4') if p.zip_code == '4700': p.languageknowledge_set.create(language_id='ger', native=True) if i % 2: p.languageknowledge_set.create( language_id='fre', written='2', spoken='2') p.is_cpas = True #~ p.is_active = True #~ p.client_state = pcsw.ClientStates.coached #~ p.native_language_id = 'ger' p.save() for short_code, isocode in ( ('B', 'BE'), ('D', 'DE'), ('F', 'FR'), ): c = countries.Country.objects.get(pk=isocode) c.short_code = short_code c.save() i = pcsw.Client.objects.order_by('name').__iter__() p = i.next() offset = 0 for f in cv.Function.objects.all(): yield jobs.Candidature(person=p, function=f, sector=f.sector, #~ date_submitted=i2d(20111019)) date_submitted=settings.SITE.demo_date(offset)) p = i.next() offset -= 1 PERSONGROUPS = Cycler(pcsw.PersonGroup.objects.all()) AGENTS_SCATTERED = Cycler( alicia, hubert, melanie, caroline, hubert, melanie, hubert, melanie) ENDINGS = Cycler(pcsw.CoachingEnding.objects.all()) for client in pcsw.Client.objects.all(): story = COACHING_STORIES.get(client.client_state) if story: if not client.group: client.group = PERSONGROUPS.pop() PERSONGROUPS.pop() # ~ for i in range(5-client.group.id): PERSONGROUPS.pop() # client.save() periods = story.pop() type = COACHINGTYPES.pop() for a, b, primary, ct in periods: if ct == CT_OTHER: type = COACHINGTYPES.pop() elif ct == CT_GSS: type = ASD elif ct == CT_INTEG: type = DSBE kw = dict(client=client, user=AGENTS_SCATTERED.pop(), type=type, primary=primary) if a is not None: kw.update(start_date=settings.SITE.demo_date(a)) if b is not None: kw.update(end_date=settings.SITE.demo_date(b)) kw.update(ending=ENDINGS.pop()) yield pcsw.Coaching(**kw) # every 10th partner is obsolete for i, p in enumerate(contacts.Partner.objects.all()): if i % 10 == 0: p.is_obsolete = True p.save() # The reception desk opens at 8am. 20 visitors have checked in, # half of which RECEPTION_CLIENTS = Cycler(reception.Clients.request(user=theresia)) REASONS = Cycler(_("Urgent problem"), '', _("Complain"), _("Information")) today = settings.SITE.demo_date() now = datetime.datetime(today.year, today.month, today.day, 8, 0) for i in range(1, 20): obj = RECEPTION_CLIENTS.pop() now += datetime.timedelta(minutes=3 * i, seconds=3 * i) obj = reception.create_prompt_event( obj, obj, AGENTS.pop(), REASONS.pop(), settings.SITE.site_config.client_guestrole, now) yield obj # TODO: the following possibly causes more than one busy guest per # agent. qs = cal.Guest.objects.filter(waiting_since__isnull=False) busy_agents = set() for i, obj in enumerate(qs): busy_since = obj.waiting_since + \ datetime.timedelta(minutes=2 * i, seconds=2 * i) if i % 3 == 0: obj.gone_since = busy_since + \ datetime.timedelta(minutes=2 * i, seconds=3 * i) obj.state = cal.GuestStates.gone elif not obj.event.user in busy_agents: obj.busy_since = busy_since obj.state = cal.GuestStates.busy busy_agents.add(obj.event.user) yield obj Calendar = dd.resolve_model('cal.Calendar') COLORS = Cycler(Calendar.COLOR_CHOICES) for u in settings.SITE.user_model.objects.exclude(profile=None): obj = Calendar(name=u.username, color=COLORS.pop()) yield obj u.calendar = obj u.save() # create a primary ClientAddress for each Client. # no longer needed. done by plausibility.fixtures.demo2 # for obj in settings.SITE.modules.contacts.Partner.objects.all(): # obj.repairdata() # have partners speak different languages # most partners speak first language if len(settings.SITE.languages): ld = [] # language distribution ld = [settings.SITE.languages[0].django_code] * 10 if len(settings.SITE.languages) > 1: ld += [settings.SITE.languages[1].django_code] * 3 if len(settings.SITE.languages) > 2: ld += [settings.SITE.languages[2].django_code] LANGS = Cycler(ld) for obj in settings.SITE.modules.contacts.Partner.objects.all(): obj.language = LANGS.pop() obj.save()
def load_par(self, row): # Every PAR potentially yields a partner, a course and an # enrolment. we re-create all courses and enrolments from # scratch but don't modify existing partners a therapeutic # group (IdPrt=="T") generates only a course (no partner and # no enrolment). Enrolments for T and G are added later from # PLP. # kw = dict() pk = self.par_pk(row.idpar) if pk is None: return name = row.firme.strip() if row.name2.strip(): name += "-" + row.name2.strip() name += ' ' + row.vorname.strip() prt = row.idprt ref = row.idpar.strip() cl = self.par_class(row) if cl is None: partner = None else: try: partner = cl.objects.get(pk=pk) dd.logger.debug( "Update existing %s %s from %s", cl.__name__, pk, row) except cl.DoesNotExist: try: partner = Partner.objects.get(pk=pk) except Partner.DoesNotExist: dd.logger.debug("Create new %s %s from %s", cl.__name__, pk, row) partner = timloader1.TimLoader.load_par(self, row).next() else: dd.logger.debug( "Specialize partner %s to %s (from %s)", pk, cl.__name__, row) if cl is Client: # A Partner cannot be parent for a Client insert_child(partner, Person, True) partner = Person.objects.get(pk=pk) insert_child(partner, cl, True) partner = cl.objects.get(pk=pk) # PAR->Name2 was not imported in spzloader1 partner.name = name yield partner # yield a first time to get the pk if prt == "T": kw = dict(name=name, line=self.other_groups, id=pk) kw.update(ref=ref) course = Course(**kw) yield course elif prt == "G": if not isinstance(partner, Household): msg = "Partner of life group {} is not a household!?" dd.logger.warning(msg.format(pk)) kw = par2dates(row) kw.update( name=name, line=self.life_groups, id=partner.id, partner_id=partner.id) kw.update(ref=ref) course = Course(**kw) yield course elif prt == "P": # if Course.objects.filter(id=obj.id).exists(): # return # if Course.objects.filter(ref=row.idpar.strip()).exists(): # return kw = par2dates(row) kw.update( line=self.therapies, partner_id=partner.id, name=name, id=partner.id, ref=ref) course = Course(**kw) yield course kw = par2dates(row) kw.update( state=EnrolmentStates.get_by_value(row.stand) \ or EnrolmentStates.inactive) yield Enrolment(pupil=partner, course=course, **kw) dd.logger.debug("Created enrolment for therapy %s", partner) else: course = None if course is not None: v = row.stand if v: course.state = CourseStates.get_by_value(v) \ or CourseStates.inactive u1, u2, u3 = self.get_users(row) course.user = course.teacher = u2 or u1 if row.idpar.startswith('E'): course.team = self.eupen elif row.idpar.startswith('S'): course.team = self.stvith if isinstance(partner, Partner): if row.gsm: partner.gsm = row.gsm # if row.idpar.startswith('E'): # partner.team = self.eupen # elif row.idpar.startswith('S'): # partner.team = self.stvith idpar2 = row.idpar2.strip() if idpar2 and (row.idpar.strip() != idpar2): idpar2 = self.par_pk(idpar2) if idpar2 is not None: self.obsolete_list.append((partner, idpar2)) ga = self.get_account(row.idgen) if ga is not None: partner.purchase_account = ga if isinstance(partner, Person): v = row.gebdat if isinstance(v, basestring): v = dateparser.parse(v.strip()) if v: partner.birth_date = v v = row.sexe if v: partner.gender = convert_gender(v) # if isinstance(partner, (Client, Household)): if course is not None: v = row.attrib if v: if "D" in v: course.translator_type = TranslatorTypes.interpreter v = row.tarif if v: t = rt.models.courses.PartnerTariffs.get_by_value(v) if t is None: dd.logger.warning( "Cannot handle tariff {}".format(v)) else: course.partner_tariff = t v = row.bereich if v: t = rt.models.courses.TherapyDomains.get_by_value(v) if t is None: dd.logger.warning( "Cannot handle domain {}".format(v)) else: course.therapy_domain = t course.procurer = fld2fk(row.vermitt, Procurer) if row.vpfl == "X": course.mandatory = True v = self.get_partner(Company, row.kkasse) if v: qs = hc_Plan.objects.filter(provider=v).order_by('id') if qs.exists(): hcp = qs.first() else: hcp = hc_Plan(provider=v, designation=str(v)) yield hcp partner.healthcare_plan = hcp if isinstance(partner, Client): # ClientStates = rt.models.clients.ClientStates # v = row.stand # if v: # v = ClientStates.get_by_value(v) # if v: # partner.client_state = v # else: # partner.client_state = ClientStates.cancelled # # dd.logger.info( # # "%s : invalid PAR->Stand %s", row, row.stand) v = row.idnat if v: try: obj = Country.objects.get(isocode=v) except Country.DoesNotExist: obj = create(Country, name=v, isocode=v) yield obj dd.logger.info("Inserted new country %s ", v) return partner.nationality = obj # 1 ledig # 2 verheiratet # 3 verwitwet # 4 getrennt # 5 geschieden v = self.civil_states.get(row.zivilst) if v: partner.civil_state = CivilStates.get_by_value(v) v = row.beruf if v == '10': v = '11' elif v == '20': v = '11' elif v == '30': v = '31' elif v == '40': v = '31' partner.professional_state = ProfessionalStates.get_by_value(v) partner.life_mode = fld2fk(row.lebensw, LifeMode) # partner.propagate_contact_details() if row.zahler.strip(): v = self.get_partner(Partner, row.zahler) if v: if isinstance(partner, Partner): yield SalesRule(partner=partner, invoice_recipient=v) if course is not None: course.partner = v else: dd.logger.info( "Could not import zahler %s", row.zahler) if isinstance(partner, Client): v = self.get_partner(Company, row.kkasse) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=1) yield rt.models.clients.ClientContact( type=cct, client=partner, company=v) v = self.get_partner(Person, row.hausarzt) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=2) yield rt.models.clients.ClientContact( type=cct, client=partner, contact_person=v) yield partner yield course
def load_par(self, row): # Every PAR potentially yields a partner, a course and an # enrolment. we re-create all courses and enrolments from # scratch but don't modify existing partners a therapeutic # group (IdPrt=="T") generates only a course (no partner and # no enrolment). Enrolments for T and G are added later from # PLP. # kw = dict() pk = self.par_pk(row.idpar) if pk is None: return name = row.firme.strip() + ' ' + row.vorname.strip() prt = row.idprt ref = row.idpar.strip() if prt == "T": kw = dict(name=name, line=self.other_groups, id=pk) kw.update(ref=ref) for user in self.get_users(row): kw.update(teacher=user) break yield Course(**kw) return cl = self.par_class(row) if cl is None: return partner = None try: partner = cl.objects.get(pk=pk) dd.logger.info( "Update existing %s %s from %s", cl.__name__, pk, row) except cl.DoesNotExist: try: partner = Partner.objects.get(pk=pk) except Partner.DoesNotExist: dd.logger.info("Create new %s %s from %s", cl.__name__, pk, row) partner = timloader1.TimLoader.load_par(self, row).next() else: dd.logger.info( "Specialize partner %s to %s (from %s)", pk, cl.__name__, row) if cl is Client: # A Partner cannot be parent for a Client insert_child(partner, Person, True) partner = Person.objects.get(pk=pk) insert_child(partner, cl, True) partner = cl.objects.get(pk=pk) if isinstance(partner, Partner): if row.gsm: partner.gsm = row.gsm if row.idpar.startswith('E'): partner.team = self.eupen elif row.idpar.startswith('S'): partner.team = self.stvith idpar2 = row.idpar2.strip() if idpar2 and (row.idpar.strip() != idpar2): idpar2 = self.par_pk(idpar2) if idpar2 is not None: self.obsolete_list.append((partner, idpar2)) ga = self.get_account(row.idgen) if ga is not None: partner.purchase_account = ga if issubclass(cl, Person): v = row.gebdat if isinstance(v, basestring): partner.birth_date = dateparser.parse(v.strip()) v = row.sexe if v: partner.gender = convert_gender(v) v = row.beruf if v: v = rt.models.tera.ProfessionalStates.get_by_value(v) partner.professional_state = v if issubclass(cl, (Client, Household)): v = row.tarif if v: t = rt.models.tera.PartnerTariffs.get_by_value(v) if t is None: dd.logger.warning( "Cannot handle tariff {}".format(v)) else: partner.tariff = t ClientStates = rt.models.clients.ClientStates v = row.stand if v: v = ClientStates.get_by_value(v) if v: partner.client_state = v else: partner.client_state = ClientStates.auto_closed # dd.logger.info( # "%s : invalid PAR->Stand %s", row, row.stand) if isinstance(partner, Client): v = row.idnat if v: try: obj = Country.objects.get(isocode=v) except Country.DoesNotExist: obj = create(Country, name=v, isocode=v) yield obj dd.logger.info("Inserted new country %s ", v) return partner.nationality = obj yield partner partner.propagate_contact_details() if isinstance(partner, Partner): if row.zahler.strip(): v = self.get_partner(Partner, row.zahler) if v: yield SalesRule(partner=partner, invoice_recipient=v) else: dd.logger.info( "Could not import zahler %s", row.zahler) if isinstance(partner, Client): v = self.get_partner(Company, row.kkasse) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=1) yield rt.models.clients.ClientContact( type=cct, client=partner, company=v) v = self.get_partner(Person, row.hausarzt) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=2) yield rt.models.clients.ClientContact( type=cct, client=partner, contact_person=v) if prt == "G": if not isinstance(partner, Household): msg = "Partner of life group {} is not a household!?" dd.logger.warning(msg.format(pk)) kw = dict( name=name, line=self.life_groups, id=partner.id, partner_id=partner.id) kw.update(ref=ref) for user in self.get_users(row): kw.update(teacher=user) break yield Course(**kw) if prt == "P": # if Course.objects.filter(id=obj.id).exists(): # return # if Course.objects.filter(ref=row.idpar.strip()).exists(): # return kw = dict( line=self.therapies, partner_id=partner.id, name=name, id=partner.id, ref=ref) for user in self.get_users(row): kw.update(teacher=user) break therapy = Course(**kw) yield therapy kw = dict() if row.date1: kw.update(start_date=row.date1) if row.date2 and row.date2 > row.date1: # avoid "Date period ends before it started." kw.update(end_date=row.date2) kw.update( state=EnrolmentStates.get_by_value(row.stand) \ or EnrolmentStates.confirmed) yield Enrolment(pupil=partner, course=therapy, **kw) dd.logger.info("Created enrolment for therapy %s", partner)
def person2client(f, l): obj = Person.objects.get(first_name=f, last_name=l) mti.insert_child(obj, Client)
def load_par(self, row): # Every PAR potentially yields a partner, a course and an # enrolment. we re-create all courses and enrolments from # scratch but don't modify existing partners a therapeutic # group (IdPrt=="T") generates only a course (no partner and # no enrolment). Enrolments for T and G are added later from # PLP. # kw = dict() pk = self.par_pk(row.idpar) if pk is None: return name = row.firme.strip() if row.name2.strip(): name += "-" + row.name2.strip() name += ' ' + row.vorname.strip() prt = row.idprt ref = row.idpar.strip() cl = self.par_class(row) if cl is None: partner = None else: try: partner = cl.objects.get(pk=pk) dd.logger.debug("Update existing %s %s from %s", cl.__name__, pk, row) except cl.DoesNotExist: try: partner = Partner.objects.get(pk=pk) except Partner.DoesNotExist: dd.logger.debug("Create new %s %s from %s", cl.__name__, pk, row) partner = timloader1.TimLoader.load_par(self, row).next() else: dd.logger.debug("Specialize partner %s to %s (from %s)", pk, cl.__name__, row) if cl is Client: # A Partner cannot be parent for a Client insert_child(partner, Person, True) partner = Person.objects.get(pk=pk) insert_child(partner, cl, True) partner = cl.objects.get(pk=pk) # PAR->Name2 was not imported in spzloader1 partner.name = name yield partner # yield a first time to get the pk if prt == "T": kw = dict(name=name, line=self.other_groups, id=pk) kw.update(ref=ref) course = Course(**kw) yield course elif prt == "G": if not isinstance(partner, Household): msg = "Partner of life group {} is not a household!?" dd.logger.warning(msg.format(pk)) kw = par2dates(row) kw.update(name=name, line=self.life_groups, id=partner.id, partner_id=partner.id) kw.update(ref=ref) course = Course(**kw) yield course elif prt == "P": # if Course.objects.filter(id=obj.id).exists(): # return # if Course.objects.filter(ref=row.idpar.strip()).exists(): # return kw = par2dates(row) kw.update(line=self.therapies, partner_id=partner.id, name=name, id=partner.id, ref=ref) course = Course(**kw) yield course kw = par2dates(row) kw.update( state=EnrolmentStates.get_by_value(row.stand) \ or EnrolmentStates.inactive) yield Enrolment(pupil=partner, course=course, **kw) dd.logger.debug("Created enrolment for therapy %s", partner) else: course = None if course is not None: v = row.stand if v: course.state = CourseStates.get_by_value(v) \ or CourseStates.inactive u1, u2, u3 = self.get_users(row) course.user = course.teacher = u2 or u1 if row.idpar.startswith('E'): course.team = self.eupen elif row.idpar.startswith('S'): course.team = self.stvith if isinstance(partner, Partner): if row.gsm: partner.gsm = row.gsm # if row.idpar.startswith('E'): # partner.team = self.eupen # elif row.idpar.startswith('S'): # partner.team = self.stvith idpar2 = row.idpar2.strip() if idpar2 and (row.idpar.strip() != idpar2): idpar2 = self.par_pk(idpar2) if idpar2 is not None: self.obsolete_list.append((partner, idpar2)) ga = self.get_account(row.idgen) if ga is not None: partner.purchase_account = ga if isinstance(partner, Person): v = row.gebdat if isinstance(v, basestring): v = dateparser.parse(v.strip()) if v: partner.birth_date = v v = row.sexe if v: partner.gender = convert_gender(v) # if isinstance(partner, (Client, Household)): if course is not None: v = row.attrib if v: if "D" in v: course.translator_type = TranslatorTypes.interpreter v = row.tarif if v: t = rt.models.courses.PartnerTariffs.get_by_value(v) if t is None: dd.logger.warning("Cannot handle tariff {}".format(v)) else: course.partner_tariff = t v = row.bereich if v: t = rt.models.courses.TherapyDomains.get_by_value(v) if t is None: dd.logger.warning("Cannot handle domain {}".format(v)) else: course.therapy_domain = t course.procurer = fld2fk(row.vermitt, Procurer) if row.vpfl == "X": course.mandatory = True v = self.get_partner(Company, row.kkasse) if v: qs = hc_Plan.objects.filter(provider=v).order_by('id') if qs.exists(): hcp = qs.first() else: hcp = hc_Plan(provider=v, designation=str(v)) yield hcp partner.healthcare_plan = hcp if isinstance(partner, Client): # ClientStates = rt.models.clients.ClientStates # v = row.stand # if v: # v = ClientStates.get_by_value(v) # if v: # partner.client_state = v # else: # partner.client_state = ClientStates.cancelled # # dd.logger.info( # # "%s : invalid PAR->Stand %s", row, row.stand) v = row.idnat if v: try: obj = Country.objects.get(isocode=v) except Country.DoesNotExist: obj = create(Country, name=v, isocode=v) yield obj dd.logger.info("Inserted new country %s ", v) return partner.nationality = obj # 1 ledig # 2 verheiratet # 3 verwitwet # 4 getrennt # 5 geschieden v = self.civil_states.get(row.zivilst) if v: partner.civil_state = CivilStates.get_by_value(v) v = row.beruf if v == '10': v = '11' elif v == '20': v = '11' elif v == '30': v = '31' elif v == '40': v = '31' partner.professional_state = ProfessionalStates.get_by_value(v) partner.life_mode = fld2fk(row.lebensw, LifeMode) # partner.propagate_contact_details() if row.zahler.strip(): v = self.get_partner(Partner, row.zahler) if v: if isinstance(partner, Partner): yield SalesRule(partner=partner, invoice_recipient=v) if course is not None: course.partner = v else: dd.logger.info("Could not import zahler %s", row.zahler) if isinstance(partner, Client): v = self.get_partner(Company, row.kkasse) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=1) yield rt.models.clients.ClientContact(type=cct, client=partner, company=v) v = self.get_partner(Person, row.hausarzt) if v: cct = rt.models.clients.ClientContactType.objects.get(pk=2) yield rt.models.clients.ClientContact(type=cct, client=partner, contact_person=v) yield partner yield course
def test_create_entry(self): ses = rt.login() Person = rt.models.app.Person Restaurant = rt.models.app.Restaurant Place = rt.models.app.Place Visit = rt.models.app.Visit Meal = rt.models.app.Meal # Create some initial data: Person(name="Alfred").save() Person(name="Bert").save() Person(name="Claude").save() Person(name="Dirk").save() r = Restaurant(id=1, name="First") r.save() for i in 1, 2: r.owners.add(Person.objects.get(pk=i)) for i in 3, 4: r.cooks.add(Person.objects.get(pk=i)) # Here is our data: lst = list(Person.objects.all()) self.assertEqual(str(lst), "[<Person: Alfred>, <Person: Bert>, <Person: Claude>, <Person: Dirk>]") lst = list(Restaurant.objects.all()) self.assertEqual( str(lst), "[Restaurant #1 ('First (owners=Alfred, Bert, cooks=Claude, Dirk)')]") x = list(Place.objects.all()) self.assertEqual( str(x), "[Place #1 ('First (owners=Alfred, Bert)')]") """ The :func:`delete_child` function --------------------------------- Imagine that a user of our application discovers that Restaurant #1 isn't actually a `Restaurant`, it's just a `Place`. They would like to "remove it's Restaurant data" from the database, but keep the `Place` data. Especially the primary key (#1) and the related objects (the owners) should remain unchanged. But the cooks must be deleted since they exist only for restaurants. It seems that this is not trivial in Django (`How do you delete child class object without deleting parent class object? <http://stackoverflow.com/questions/9439730>`__). That's why we wrote the :func:`delete_child` function. Here is how to "reduce" a Restaurant to a `Place` by calling the :func:`delete_child` function: """ from lino.utils.mti import delete_child p = Place.objects.get(id=1) delete_child(p, Restaurant) # The Place still exists, but no longer as a Restaurant: x = Place.objects.get(pk=1) self.assertEqual( str(x), "First (owners=Alfred, Bert)") try: list(Restaurant.objects.get(pk=1)) self.fail("Expected DoesNotExist") except Restaurant.DoesNotExist: pass # Traceback (most recent call last): # ... # DoesNotExist: Restaurant matching query does not exist. """ The :func:`insert_child` function ---------------------------------- The opposite operation, "promoting a simple Place to a Restaurant", is done using :func:`insert_child`. from lino.utils.mti import insert_child Let's first create a simple Place #2 with a single owner. """ obj = Place(id=2, name="Second") obj.save() obj.owners.add(Person.objects.get(pk=2)) obj.save() self.assertEqual( str(obj), "Second (owners=Bert)") # Now this Place becomes a Restaurant and hires 2 cooks: obj = insert_child(obj, Restaurant) for i in 3, 4: obj.cooks.add(Person.objects.get(pk=i)) self.assertEqual( str(obj), "Second (owners=Bert, cooks=Claude, Dirk)") # If you try to promote a Person to a Restaurant, you'll get an exception: person = Person.objects.get(pk=2) try: insert_child(person, Restaurant).save() self.fail("Expected ValidationError") except ValidationError as e: self.assertEqual( str(e), "['A Person cannot be parent for a Restaurant']") """ The :class:`EnableChild` virtual field -------------------------------------- This section shows how the :class:`EnableChild` virtual field is being used by Lino, and thus is Lino-specific. After the above examples our database looks like this: """ x = list(Person.objects.all()) self.assertEqual( str(x), "[<Person: Alfred>, <Person: Bert>, <Person: Claude>, <Person: Dirk>]") x = list(Place.objects.all()) self.assertEqual( str(x), "[Place #1 ('First (owners=Alfred, Bert)'), Place #2 ('Second (owners=Bert)')]") x = list(Restaurant.objects.all()) self.assertEqual( str(x), "[Restaurant #2 ('Second (owners=Bert, cooks=Claude, Dirk)')]") # Let's take Place #1 and look at it. obj = Place.objects.get(pk=1) self.assertEqual( str(obj), "First (owners=Alfred, Bert)") # How to see whether a given Place is a Restaurant? x = "" for i in Place.objects.all(): x += "{0} -> {1}\n".format(i, i.get_mti_child('restaurant')) self.assertEqual( x, """\ First (owners=Alfred, Bert) -> None Second (owners=Bert) -> Second (owners=Bert, cooks=Claude, Dirk) """) # Let's promote First (currently a simple Place) to a Restaurant: x = insert_child(obj, Restaurant) # Restaurant #1 ('#1 (name=First, owners=Alfred, Bert, cooks=)') # And Second stops being a Restaurant: second = Place.objects.get(pk=2) delete_child(second, Restaurant) # This operation has removed the related Restaurant instance: try: Restaurant.objects.get(pk=2) self.fail("Expected DoesNotExist") except Restaurant.DoesNotExist: pass # And finally, rather to explain why Restaurants sometimes # close and later reopen: bert = Person.objects.get(pk=2) second = Place.objects.get(pk=2) insert_child(second, Restaurant) # Restaurant #2 ('#2 (name=Second, owners=Bert, cooks=)') # Now we can see this place again as a Restaurant second = Restaurant.objects.get(pk=2) # And engage for example a new cook: second.cooks.add(bert) # second # Restaurant #2 ('#2 (name=Second, owners=Bert, cooks=Bert)') # Related objects # --------------- # Now let's have a more detailed look at what happens to the related # objects (Person, Visit and Meal). # Bert, the owner of Restaurant #2 does two visits: second = Restaurant.objects.get(pk=2) Visit(purpose="Say hello", person=bert, place=second).save() Visit(purpose="Hang around", person=bert, place=second).save() x = list(second.visit_set.all()) self.assertEqual( str(x), "[<Visit: Say hello visit by Bert at Second>, <Visit: Hang around visit by Bert at Second>]") # Claude and Dirk, now workless, still go to eat in restaurants: Meal(what="Fish",person=Person.objects.get(pk=3),restaurant=second).save() Meal(what="Meat",person=Person.objects.get(pk=4),restaurant=second).save() x = list(second.meal_set.all()) self.assertEqual( str(x), "[<Meal: Claude eats Fish at Second>, <Meal: Dirk eats Meat at Second>]") # Now we reduce Second to a Place: second = Place.objects.get(pk=2) delete_child(second, Restaurant) # Restaurant #2 no longer exists: try: Restaurant.objects.get(pk=2) self.fail("Expected DoesNotExist") except Restaurant.DoesNotExist: pass # Note that `Meal` has :attr:`allow_cascaded_delete # <lino.core.model.Model.allow_cascaded_delete>` set to # `['restaurant']`, otherwise the above code would have raised a # ValidationError :message:`Cannot delete #2 # (name=Second,owners=Bert,cooks=Bert) because 2 meals refer to it.` But # the meals have been deleted: self.assertEqual(Meal.objects.count(), 0) # Of course, #2 remains as a Place # The owner and visits have been taken over: second = Place.objects.get(pk=2) x = list(second.visit_set.all()) self.assertEqual( str(x), "[<Visit: Say hello visit by Bert at Second>, <Visit: Hang around visit by Bert at Second>]") # The :func:`create_mti_child` function # ------------------------------------- # This function is for rather internal use. :ref:`Python dumps <dpy>` # generated by :class:`lino.utils.dpy.Serializer` use this function for # creating MTI children instances without having to lookup their parent. # .. currentmodule:: lino.utils.dpy # In a Python dump we are in a special situation: All Place instances # are being generated first, and in another step we are going to create # all the Restaurant instances. So how can we create a Restaurant whose # Place already exists *without first having to do a lookup of the Place # record*? That's why :func:`create_mti_child` was written for. obj = Place(id=3, name="Third") obj.save() obj.owners.add(Person.objects.get(pk=2)) obj.save() self.assertEqual( str(obj), "Third (owners=Bert)") from lino.utils.dpy import create_mti_child obj = create_mti_child(Place, 3, Restaurant) # The return value is technically a normal model instance, # but whose `save` and `full_clean` methods have been # patched: `full_clean` is overridden to do nothing, # and `save` will call a "raw" save to avoid the # need of a proper Place instance for that Restaurant. # The only thing you can do with it is to save it: obj.save() # The `save` and `full_clean` methods are the only methods that # will be called by # :class:`lino.utils.dpy.Deserializer`. # To test whether :func:`create_mti_child` did her job, # we must re-read an instance: obj = Restaurant.objects.get(pk=3) self.assertEqual( str(obj), "Third (owners=Bert, cooks=)") # Note that :func:`create_mti_child` supports changing the # `name` although that field is defined in the Place model, # not in Restaurant. This feature was added 20170626 (#1926, # #1923). Before that date Lino raised an exception when you # specified a field of the parent model. And before *that* # (until 20120930) this case was silently ignored for # backwards compatibility (`/blog/2011/1210`). obj = Place(id=4, name="Fourth") obj.save() ow = create_mti_child(Place, 4, Restaurant, name="A new name") ow.full_clean() ow.save() obj = Restaurant.objects.get(id=4) self.assertEqual(obj.name, "A new name")
def objects(): Person = rt.models.contacts.Person PupilType = rt.models.courses.PupilType TeacherType = rt.models.courses.TeacherType Pupil = rt.models.courses.Pupil Teacher = rt.models.courses.Teacher yield PupilType(ref="M", **dd.str2kw('name', _("Member"))) yield PupilType(ref="H", **dd.str2kw('name', _("Helper"))) yield PupilType(ref="N", **dd.str2kw('name', _("Non-member"))) #~ yield courses.Room(name="A") #~ yield cal.Place(name="A") #~ yield cal.Place(name="B") #~ yield cal.Place(name="C") #~ yield cal.Place(name="D") #~ yield cal.Place(name="E") #~ yield cal.Place(name="F") PTYPES = Cycler(PupilType.objects.all()) TTYPES = Cycler(TeacherType.objects.all()) n = 0 for p in Person.objects.all(): if n % 2 == 0: yield mti.insert_child(p, Pupil, pupil_type=PTYPES.pop()) if n % 9 == 0: yield mti.insert_child(p, Teacher, teacher_type=TTYPES.pop()) n += 1 invoice_recipient = None for n, p in enumerate(Pupil.objects.all()): if n % 10 == 0: p.invoice_recipient = invoice_recipient yield p else: invoice_recipient = p if False: #~ PS = Cycler(courses.PresenceStatus.objects.all()) CONTENTS = Cycler(rt.models.courses.Line.objects.all()) USERS = Cycler(rt.models.users.User.objects.all()) PLACES = Cycler(rt.models.cal.Room.objects.all()) TEACHERS = Cycler(Teacher.objects.all()) SLOTS = Cycler(rt.models.courses.Slot.objects.all()) #~ SLOTS = Cycler(1,2,3,4) PUPILS = Cycler(courses.Pupil.objects.all()) #~ Event = settings.SITE.modules.cal.Event #~ from lino_xl.lib.cal.utils import DurationUnit year = settings.SITE.demo_date().year if settings.SITE.demo_date().month < 7: year -= 1 for i in range(10): c = courses.Course( user=USERS.pop(), teacher=TEACHERS.pop(), line=CONTENTS.pop(), room=PLACES.pop(), start_date=datetime.date(year, 9, 1 + i), end_date=datetime.date(year + 1, 6, 30), every=1, every_unit=cal.DurationUnits.weeks, slot=SLOTS.pop(), ) yield c for j in range(5): yield courses.Enrolment(pupil=PUPILS.pop(), course=c) c.save() # fill presences