Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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
Пример #4
0
    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)
Пример #5
0
 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
Пример #6
0
    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)
Пример #7
0
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
Пример #8
0
    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)
Пример #9
0
 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)
Пример #10
0
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())
Пример #11
0
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()
Пример #12
0
    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
Пример #13
0
    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)
Пример #14
0
 def person2client(f, l):
     obj = Person.objects.get(first_name=f, last_name=l)
     mti.insert_child(obj, Client)
Пример #15
0
    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
Пример #16
0
    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")
Пример #17
0
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